This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

View | Details | Raw Unified | Return to bug 182427
Collapse All | Expand All

(-)a/openide.explorer/apichanges.xml (+14 lines)
Lines 47-52 Link Here
47
<apidef name="explorer">Explorer API</apidef>
47
<apidef name="explorer">Explorer API</apidef>
48
</apidefs>
48
</apidefs>
49
<changes>
49
<changes>
50
    <change id="TreeView.editNode">
51
        <api name="explorer"/>
52
        <summary><code>TreeView.editNode</code> added</summary>
53
        <version major="6" minor="27"/>
54
        <date day="27" month="3" year="2010"/>
55
        <author login="tboudreau"/>
56
        <compatibility binary="compatible" source="incompatible" deprecation="no" deletion="no" addition="yes"/>
57
        <description>
58
            Added <code>TreeView.editNode(Node)</code> to programmatically
59
            enter inline-edit mode on a TreeView.  Method is thread-safe.
60
        </description>
61
        <class package="org.openide.explorer.view" name="TreeView"/>
62
        <issue number="182427"/>
63
    </change>
50
    <change id="OutlineView.setPropertyColumns">
64
    <change id="OutlineView.setPropertyColumns">
51
        <api name="explorer"/>
65
        <api name="explorer"/>
52
        <summary><code>OutlineView.setPropertyColumns</code>,
66
        <summary><code>OutlineView.setPropertyColumns</code>,
(-)a/openide.explorer/manifest.mf (-1 / +1 lines)
Lines 2-6 Link Here
2
OpenIDE-Module: org.openide.explorer
2
OpenIDE-Module: org.openide.explorer
3
OpenIDE-Module-Localizing-Bundle: org/openide/explorer/Bundle.properties
3
OpenIDE-Module-Localizing-Bundle: org/openide/explorer/Bundle.properties
4
AutoUpdate-Essential-Module: true
4
AutoUpdate-Essential-Module: true
5
OpenIDE-Module-Specification-Version: 6.26
5
OpenIDE-Module-Specification-Version: 6.27
6
6
(-)a/openide.explorer/src/org/openide/explorer/view/TreeView.java (+48 lines)
Lines 135-140 Link Here
135
import javax.swing.tree.TreeNode;
135
import javax.swing.tree.TreeNode;
136
import javax.swing.tree.TreePath;
136
import javax.swing.tree.TreePath;
137
import javax.swing.tree.TreeSelectionModel;
137
import javax.swing.tree.TreeSelectionModel;
138
import org.openide.util.Parameters;
138
139
139
140
140
/**
141
/**
Lines 583-588 Link Here
583
        });
584
        });
584
    }
585
    }
585
586
587
    /**
588
     * Initiate inline-edit mode for a Node, expanding its parent
589
     * and selecting it if necessary.  This method is thread-safe.
590
     * <p/>
591
     * If this TreeView is not actually on-screen when the edit is
592
     * initiated (for example, a call after the call to editNode() removes
593
     * it from the AWT hierarchy) then this method logs and error and does
594
     * nothing.
595
     *
596
     * @param node A node whose name should be edited visually by the user
597
     * @throws IllegalArgumentException if the node is not actually part of the
598
     * hierarchy
599
     */
600
    public void editNode(final Node node) {
601
        Parameters.notNull("node", node); //NOI18N
602
        //Do not use VisualizerNode.runSafe(), which will call
603
        //EQ.invokeAndWait()
604
        Mutex.EVENT.readAccess(new EditInitiator(node));
605
    }
606
607
    private class EditInitiator implements Runnable {
608
        private final Node node;
609
        EditInitiator (Node target) {
610
            this.node = target;
611
        }
612
613
        @Override
614
        public void run() {
615
            if (!isDisplayable()) {
616
                Logger.getLogger(TreeView.class.getName()).log(
617
                        Level.SEVERE, "Attempt to edit node {0} but " + //NOI18N
618
                        "component not on screen", node); //NOI18N
619
                return;
620
            }
621
            lookupExplorerManager();
622
            TreePath path = getTreePath(node);
623
            if (path == null) {
624
                throw new IllegalArgumentException ("Unknown node " + node); //NOI18N
625
            }
626
            if (!tree.isExpanded(path)) {
627
                tree.expandPath(path);
628
            }
629
            tree.setSelectionPath(path);
630
            tree.startEditingAtPath(path);
631
        }
632
    }
633
586
    /** Test whether a node is expanded in the tree or not
634
    /** Test whether a node is expanded in the tree or not
587
    * @param n the node to test
635
    * @param n the node to test
588
    * @return true if the node is expanded
636
    * @return true if the node is expanded
(-)a/openide.explorer/src/org/openide/explorer/view/TreeViewCellEditor.java (+8 lines)
Lines 190-195 Link Here
190
    public void focusGained(FocusEvent evt) {
190
    public void focusGained(FocusEvent evt) {
191
    }
191
    }
192
192
193
    Ed ed() { //editNodeTest
194
        return (Ed) realEditor;
195
    }
196
193
    /**
197
    /**
194
     * This is invoked if a TreeCellEditor is not supplied in the constructor.
198
     * This is invoked if a TreeCellEditor is not supplied in the constructor.
195
     * It returns a TextField editor.
199
     * It returns a TextField editor.
Lines 384-389 Link Here
384
            super(tf);
388
            super(tf);
385
        }
389
        }
386
390
391
        JTextField comp() {  //editNodeTest
392
            return (JTextField) super.getComponent();
393
        }
394
387
        /** Main method of the editor.
395
        /** Main method of the editor.
388
        * @return component of editor
396
        * @return component of editor
389
        */
397
        */
(-)a/openide.explorer/test/unit/src/org/openide/explorer/view/BeanTreeViewTest.java (+99 lines)
Lines 42-58 Link Here
42
package org.openide.explorer.view;
42
package org.openide.explorer.view;
43
43
44
import java.awt.BorderLayout;
44
import java.awt.BorderLayout;
45
import java.awt.EventQueue;
46
import java.awt.event.HierarchyEvent;
47
import java.awt.event.HierarchyListener;
48
import java.awt.event.WindowAdapter;
49
import java.awt.event.WindowEvent;
45
import java.beans.PropertyVetoException;
50
import java.beans.PropertyVetoException;
46
import java.lang.ref.WeakReference;
51
import java.lang.ref.WeakReference;
47
import java.lang.reflect.InvocationTargetException;
52
import java.lang.reflect.InvocationTargetException;
53
import java.util.concurrent.CountDownLatch;
48
import javax.swing.JFrame;
54
import javax.swing.JFrame;
49
import javax.swing.JPanel;
55
import javax.swing.JPanel;
56
import javax.swing.JTextField;
50
import javax.swing.JTree;
57
import javax.swing.JTree;
51
import javax.swing.SwingUtilities;
58
import javax.swing.SwingUtilities;
52
import javax.swing.tree.TreePath;
59
import javax.swing.tree.TreePath;
53
import junit.framework.AssertionFailedError;
60
import junit.framework.AssertionFailedError;
54
import org.netbeans.junit.NbTestCase;
61
import org.netbeans.junit.NbTestCase;
55
import org.openide.explorer.ExplorerManager;
62
import org.openide.explorer.ExplorerManager;
63
import org.openide.explorer.view.TreeViewCellEditor.Ed;
56
import org.openide.nodes.AbstractNode;
64
import org.openide.nodes.AbstractNode;
57
import org.openide.nodes.Children;
65
import org.openide.nodes.Children;
58
import org.openide.nodes.Node;
66
import org.openide.nodes.Node;
Lines 317-320 Link Here
317
            return em;
325
            return em;
318
        }
326
        }
319
    }
327
    }
328
329
    public void testEditNode() throws Exception {
330
        Children.Array kids = new Children.Array();
331
        Node[] n = new Node[20];
332
        Node node = null;
333
        for (int i=0; i < n.length; i++) {
334
            n[i] = new RenamableNode ("" + i);
335
            if (i == 5) node = n[i]; //pick one to edit
336
        }
337
        kids.add(n);
338
        final Node root = new AbstractNode (kids);
339
        root.setDisplayName("Root");
340
        final WL wl = new WL();
341
        final F[] ff = new F[1];
342
        EventQueue.invokeLater(new Runnable() {
343
344
            @Override
345
            public void run() {
346
                ff[0] = new F(root);
347
                ff[0].addWindowListener(wl);
348
                ff[0].pack();
349
                ff[0].setVisible(true);
350
            }
351
352
        });
353
        wl.latch.await();
354
        F f = ff[0];
355
        //sanity check
356
        assertTrue (f.isDisplayable());
357
        assertTrue (f.isShowing());
358
        assertTrue (f.view.isShowing());
359
        JTree tree = f.view.tree;
360
        TreeViewCellEditor ce = (TreeViewCellEditor) tree.getCellEditor();
361
        Ed ed = ce.ed();
362
        final JTextField comp = ed.comp();
363
        final CountDownLatch latch = new CountDownLatch(1);
364
        comp.addHierarchyListener(new HierarchyListener() {
365
366
            @Override
367
            public void hierarchyChanged(HierarchyEvent e) {
368
                if (comp.isDisplayable()) {
369
                    latch.countDown();
370
                }
371
            }
372
373
        });
374
        f.view.editNode(node);
375
        latch.await();
376
        assertTrue (tree.isEditing());
377
        assertTrue (comp.isDisplayable());
378
        f.setVisible(false);
379
        f.dispose();
380
    }
381
382
    private static final class RenamableNode extends AbstractNode {
383
        RenamableNode (String name) {
384
            super (Children.LEAF);
385
            setDisplayName(name);
386
            setName (name);
387
        }
388
389
        @Override
390
        public boolean canRename() {
391
            return true;
392
        }
393
    }
394
395
    private static final class F extends JFrame implements ExplorerManager.Provider {
396
        private final ExplorerManager mgr = new ExplorerManager();
397
        private final BeanTreeView view = new BeanTreeView();
398
        F(Node root) {
399
            setContentPane(view);
400
            mgr.setRootContext(root);
401
        }
402
403
        @Override
404
        public ExplorerManager getExplorerManager() {
405
            return mgr;
406
        }
407
408
    }
409
410
    private static final class WL extends WindowAdapter {
411
        CountDownLatch latch = new CountDownLatch(1);
412
413
        @Override
414
        public void windowOpened(WindowEvent e) {
415
            super.windowOpened(e);
416
            latch.countDown();
417
        }
418
    }
320
}
419
}

Return to bug 182427