001: /*
002: * ClassMemberPanelUi.java
003: *
004: * Created on November 8, 2006, 4:03 PM
005: */
006:
007: package org.netbeans.modules.beans;
008:
009: import java.awt.BorderLayout;
010: import java.awt.Image;
011: import java.awt.Rectangle;
012: import javax.swing.Action;
013: import javax.swing.KeyStroke;
014: import java.beans.PropertyVetoException;
015: import javax.lang.model.element.Element;
016: import javax.swing.JLabel;
017: import javax.swing.SwingUtilities;
018: import javax.swing.event.ChangeEvent;
019: import org.netbeans.api.java.source.ElementHandle;
020: import org.openide.nodes.Node;
021: import org.openide.util.NbBundle;
022: import org.openide.util.Utilities;
023: import org.openide.explorer.ExplorerManager;
024: import org.openide.explorer.view.BeanTreeView;
025: import org.openide.filesystems.FileObject;
026: import org.openide.nodes.AbstractNode;
027: import org.openide.nodes.Children;
028: import org.openide.util.Exceptions;
029: import org.openide.util.Lookup;
030:
031: /**
032: *
033: * @author phrebejk
034: */
035: public class BeanPanelUI extends javax.swing.JPanel implements
036: ExplorerManager.Provider/* ,FiltersManager.FilterChangeListener */{
037:
038: private static WaitNode WAIT_NODE;
039:
040: private ExplorerManager manager = new ExplorerManager();
041: private MyBeanTreeView elementView;
042: // private TapPanel filtersPanel;
043: private JLabel filtersLbl;
044: private Lookup lookup = null; // XXX may need better lookup
045: // private ClassMemberFilters filters;
046:
047: private Action[] actions; // General actions for the panel
048:
049: private static final Rectangle ZERO = new Rectangle(0, 0, 1, 1);
050:
051: /** Creates new form ClassMemberPanelUi */
052: public BeanPanelUI() {
053:
054: initComponents();
055:
056: // Tree view of the elements
057: elementView = createBeanTreeView();
058: add(elementView, BorderLayout.CENTER);
059:
060: // filters
061: // filtersPanel = new TapPanel();
062: // filtersLbl = new JLabel(NbBundle.getMessage(ClassMemberPanelUI.class, "LBL_Filter")); //NOI18N
063: // filtersLbl.setBorder(new EmptyBorder(0, 5, 5, 0));
064: // filtersPanel.add(filtersLbl);
065: // filtersPanel.setOrientation(TapPanel.DOWN);
066: // // tooltip
067: // KeyStroke toggleKey = KeyStroke.getKeyStroke(KeyEvent.VK_T,
068: // Toolkit.getDefaultToolkit().getMenuShortcutKeyMask());
069: // String keyText = Utilities.keyToString(toggleKey);
070: // filtersPanel.setToolTipText(NbBundle.getMessage(ClassMemberPanelUI.class, "TIP_TapPanel", keyText));
071: //
072: // filters = new ClassMemberFilters( this );
073: // filters.getInstance().hookChangeListener(this);
074: // filtersPanel.add(filters.getComponent());
075: //
076: // actions = new Action[] {
077: // new SortByNameAction( filters ),
078: // new SortBySourceAction( filters ),
079: // null,
080: // new FilterSubmenuAction(filters.getInstance())
081: // };
082: //
083: // add(filtersPanel, BorderLayout.SOUTH);
084: //
085: manager.setRootContext(getWaitNode());
086:
087: }
088:
089: @Override
090: public boolean requestFocusInWindow() {
091: boolean result = super .requestFocusInWindow();
092: elementView.requestFocusInWindow();
093: return result;
094: }
095:
096: public org.openide.util.Lookup getLookup() {
097: // XXX Check for chenge of FileObject
098: return lookup;
099: }
100:
101: static synchronized Node getWaitNode() {
102: if (WAIT_NODE == null) {
103: WAIT_NODE = new WaitNode();
104: }
105: return WAIT_NODE;
106: }
107:
108: public BeanScanningTask getTask() {
109: return new BeanScanningTask(this );
110: }
111:
112: public void showWaitNode() {
113: SwingUtilities.invokeLater(new Runnable() {
114: public void run() {
115: elementView.setRootVisible(true);
116: manager.setRootContext(getWaitNode());
117: }
118: });
119: }
120:
121: public void selectElementNode(ElementHandle<Element> eh) {
122: // PatternNode root = getRootNode();
123: // if ( root == null ) {
124: // return;
125: // }
126: // PatternNode node = root.getNodeForElement(eh);
127: // try {
128: // manager.setSelectedNodes(new Node[]{ node == null ? getRootNode() : node });
129: // } catch (PropertyVetoException propertyVetoException) {
130: // Exceptions.printStackTrace(propertyVetoException);
131: // }
132: }
133:
134: public void refresh(final ClassPattern pa) {
135:
136: final PatternNode rootNode = getRootNode();
137:
138: if (rootNode != null
139: && rootNode
140: .getPattern()
141: .getPatternAnalyser()
142: .getFileObject()
143: .equals(pa.getPatternAnalyser().getFileObject())) {
144: // update
145: //System.out.println("UPDATE ======" + description.fileObject.getName() );
146: SwingUtilities.invokeLater(new Runnable() {
147: public void run() {
148: rootNode.updateRecursively(pa);
149: }
150: });
151: } else {
152: //System.out.println("REFRES =====" + description.fileObject.getName() );
153: // New fileobject => refresh completely
154: SwingUtilities.invokeLater(new Runnable() {
155:
156: public void run() {
157: elementView.setRootVisible(false);
158: manager.setRootContext(new PatternNode(pa, true));
159: boolean scrollOnExpand = elementView
160: .getScrollOnExpand();
161: elementView.setScrollOnExpand(false);
162: elementView.expandAll();
163: elementView.setScrollOnExpand(scrollOnExpand);
164: }
165: });
166:
167: }
168: }
169:
170: public void sort() {
171: // getRootNode().refreshRecursively();
172: throw new UnsupportedOperationException();
173: }
174:
175: // public ClassMemberFilters getFilters() {
176: // return filters;
177: // }
178:
179: public void expandNode(Node n) {
180: elementView.expandNode(n);
181: }
182:
183: public Action[] getActions() {
184: return actions;
185: }
186:
187: public FileObject getFileObject() {
188: return getRootNode().getPattern().getPatternAnalyser()
189: .getFileObject();
190: }
191:
192: // FilterChangeListener ----------------------------------------------------
193:
194: public void filterStateChanged(ChangeEvent e) {
195: // ElementNode root = getRootNode();
196: //
197: // if ( root != null ) {
198: // root.refreshRecursively();
199: // }
200: }
201:
202: /** This method is called from within the constructor to
203: * initialize the form.
204: * WARNING: Do NOT modify this code. The content of this method is
205: * always regenerated by the Form Editor.
206: */
207: // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
208: private void initComponents() {
209:
210: setLayout(new java.awt.BorderLayout());
211: }// </editor-fold>//GEN-END:initComponents
212:
213: // Variables declaration - do not modify//GEN-BEGIN:variables
214: // End of variables declaration//GEN-END:variables
215:
216: // Private methods ---------------------------------------------------------
217:
218: private PatternNode getRootNode() {
219:
220: Node n = manager.getRootContext();
221: if (n instanceof PatternNode) {
222: return (PatternNode) n;
223: } else {
224: return null;
225: }
226: }
227:
228: private MyBeanTreeView createBeanTreeView() {
229: // ActionMap map = getActionMap();
230: // map.put(DefaultEditorKit.copyAction, ExplorerUtils.actionCopy(manager));
231: // map.put(DefaultEditorKit.cutAction, ExplorerUtils.actionCut(manager));
232: // map.put(DefaultEditorKit.pasteAction, ExplorerUtils.actionPaste(manager));
233: // map.put("delete", new DelegatingAction(ActionProvider.COMMAND_DELETE, ExplorerUtils.actionDelete(manager, true)));
234: //
235:
236: MyBeanTreeView btv = new MyBeanTreeView(); // Add the BeanTreeView
237: // btv.setDragSource (true);
238: // btv.setRootVisible(false);
239: // associateLookup( ExplorerUtils.createLookup(manager, map) );
240: return btv;
241:
242: }
243:
244: // ExplorerManager.Provider imlementation ----------------------------------
245:
246: public ExplorerManager getExplorerManager() {
247: return manager;
248: }
249:
250: private static class MyBeanTreeView extends BeanTreeView {
251: public boolean getScrollOnExpand() {
252: return tree.getScrollsOnExpand();
253: }
254:
255: public void setScrollOnExpand(boolean scroll) {
256: this .tree.setScrollsOnExpand(scroll);
257: }
258: }
259:
260: private static class WaitNode extends AbstractNode {
261:
262: private Image waitIcon = Utilities
263: .loadImage("org/netbeans/modules/beans/resources/wait.gif"); // NOI18N
264:
265: WaitNode() {
266: super (Children.LEAF);
267: }
268:
269: @Override
270: public Image getIcon(int type) {
271: return waitIcon;
272: }
273:
274: @Override
275: public Image getOpenedIcon(int type) {
276: return getIcon(type);
277: }
278:
279: @java.lang.Override
280: public java.lang.String getDisplayName() {
281: return NbBundle.getMessage(BeanPanel.class, "LBL_WaitNode"); // NOI18N
282: }
283:
284: }
285: }
|