|
What this is
Other links
The source code/* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License * Version 1.0 (the "License"). You may not use this file except in * compliance with the License. A copy of the License is available at * http://www.sun.com/ * * The Original Code is NetBeans. The Initial Developer of the Original * Code is Sun Microsystems, Inc. Portions Copyright 1997-2004 Sun * Microsystems, Inc. All Rights Reserved. */ package org.netbeans.modules.java.ui; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyVetoException; import java.lang.ref.WeakReference; import java.lang.reflect.InvocationTargetException; import java.awt.*; import javax.jmi.reflect.InvalidObjectException; import javax.swing.*; import javax.swing.event.ListDataEvent; import javax.jmi.reflect.JmiException; import org.netbeans.api.mdr.MDRepository; import org.netbeans.api.mdr.events.ExtentEvent; import org.netbeans.api.mdr.events.MDRChangeEvent; import org.netbeans.api.mdr.events.MDRChangeListener; import org.netbeans.api.mdr.events.MDRChangeSource; import org.openide.cookies.OpenCookie; import org.openide.cookies.EditorCookie; import org.openide.explorer.ExplorerManager; import org.openide.explorer.view.ChoiceView; import org.openide.explorer.view.Visualizer; import org.openide.explorer.view.NodeListModel; import org.openide.nodes.AbstractNode; import org.openide.nodes.*; import org.openide.util.Utilities; import org.openide.windows.TopComponent; import org.openide.loaders.DataObject; import org.openide.util.RequestProcessor; import org.openide.ErrorManager; import org.netbeans.modules.java.ui.nodes.elements.SourceChildren; import org.netbeans.modules.java.ui.nodes.elements.SourceElementFilter; import org.netbeans.modules.java.ui.nodes.SourceNodeFactory; import org.netbeans.modules.java.ui.nodes.SourceNodes; import org.netbeans.modules.java.ui.nodes.BridgeUtils; import org.netbeans.modules.javacore.internalapi.JMIElementCookie; import org.netbeans.modules.javacore.internalapi.JavaMetamodel; import org.netbeans.jmi.javamodel.*; /** * * @author sdedic * @version */ public final class NavigationView extends ChoiceView { /** * Selection manager for keyboard events. */ SelectionManager selManager; /** * Listener that binds the View to the explorer manager and to the * TopComponent or whatever. */ RootL rootChangeListener; /** * Cookie that provides data about the active source. */ EditorCookie sourceCookie; /** * Active Children object. */ SourceChildren sourceChildren; /** * Last observed root node - if changes, contents are reloaded completely. */ Node rootNode; /** * Node factory specific for the data source. */ SourceNodeFactory nodeFactory; /** * Associated ExplorerManager. */ ExplorerManager manager; /** * TopComponent to listen to, or null if we should listen to * TopComponent.Registry. */ TopComponent topComponent; /** * Makes the Navigator ignore events from the combobox. This is used * during sync of the combo from the activated nodes. */ boolean ignoreComboSelect; /** * Makes the Navigator ignore events from the activated nodes. This is * mainly used when the node is being "opened". */ boolean ignoreActivatedNodes; boolean contentsChanging; DataObject dataObject; private static final int MAX_NAVIGATOR_DEPTH = 4; static java.util.ResourceBundle bundle; /** * processor computing the navigation view content to not block * the awt event queue */ private static final RequestProcessor RP = new RequestProcessor("Navigation View Queue"); // NOI18N /** * the last scheduled task * @see #RP */ private WeakReference queuedTask; public NavigationView() { initComponents(); MDRepository repo = JavaMetamodel.getDefaultRepository(); ((MDRChangeSource)repo).addListener(new ExtentListener(this, repo)); } static String getString(String key) { if (bundle == null) bundle = org.openide.util.NbBundle.getBundle(NavigationView.class); return bundle.getString(key); } private void initComponents() { nodeFactory = SourceNodes.getBrowserFactory(); ((NodeListModel)getModel()).setDepth(MAX_NAVIGATOR_DEPTH); setKeySelectionManager(selManager = new SelectionManager()); rootNode = new AbstractNode(Children.LEAF); this.getAccessibleContext().setAccessibleDescription(getString("ACSD_NavigationView")); // Anyone ever heard of this property ? Me not... until I looked through Swing sources. this.putClientProperty("JComboBox.lightweightKeyboardNavigation", "Lightweight"); // NOI18N // sets renderer that adds tooltip for nav view items that are too long // to fit in popup window (#33949) final ListCellRenderer renderer = this.getRenderer(); this.setRenderer(new ListCellRenderer() { public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Component comp = renderer.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus); if (comp instanceof JLabel) { JLabel jcomp = (JLabel) comp; double listW = NavigationView.this.getWidth(); String txt = null; if (listW > 0) { double txtW = jcomp.getPreferredSize().getWidth(); if (txtW >= listW) { txt = jcomp.getText(); } } jcomp.setToolTipText(txt); } return comp; } }); } SourceChildren createSourceChildren(Resource el) { dataObject = JavaMetamodel.getManager().getDataObject(el); SourceChildren c = new SourceChildren(nodeFactory, el); SourceElementFilter f = new SourceElementFilter(); f.setAllClasses(true); c.setFilter(f); return c; } protected NodeListModel createModel () { return rootChangeListener = new RootL(); } /** * Finds the context where the view is actually used. */ public void addNotify() { super.addNotify(); if (rootChangeListener == null) rootChangeListener = new RootL(); topComponent = findParentTopComponent(); getExplorerManager().setRootContext(rootNode); try { getExplorerManager().setSelectedNodes(new Node[] {}); } catch (PropertyVetoException e) { } activatedNodeChanged(getActivatedNode()); if (topComponent == null) { TopComponent.getRegistry().addPropertyChangeListener( rootChangeListener); } else { topComponent.addPropertyChangeListener(rootChangeListener); } getExplorerManager().addPropertyChangeListener(rootChangeListener); } public void removeNotify() { if (topComponent != null) topComponent.removePropertyChangeListener(rootChangeListener); else TopComponent.getRegistry().removePropertyChangeListener(rootChangeListener); if (manager != null) { manager.removePropertyChangeListener(rootChangeListener); } super.removeNotify(); } private ExplorerManager getExplorerManager() { if (manager == null) { manager = ExplorerManager.find(this); } return manager; } private TopComponent findParentTopComponent() { java.awt.Component p; for (p = getParent(); p != null && !(p instanceof TopComponent); p = p.getParent()) ; return (TopComponent)p; } public void setPopupVisible(boolean show) { boolean wasVisible = isPopupVisible() && isVisible(); super.setPopupVisible(show); if (!ignoreComboSelect && !show && wasVisible) { boolean saveActivatedNodes = ignoreActivatedNodes; try { ignoreActivatedNodes = true; choiceItemSelected(getExplorerManager().getSelectedNodes()); } finally { ignoreActivatedNodes = saveActivatedNodes; } } } private Node getActivatedNode() { Node[] actNodes; if (topComponent == null) { actNodes = TopComponent.getRegistry().getActivatedNodes(); } else { actNodes = topComponent.getActivatedNodes(); } if (actNodes == null || actNodes.length == 0) return null; else return actNodes[0]; } private void activatedNodeChanged(Node newNode) { if (newNode == null) { return; } Node curNode = null; Node[] curNodes = getExplorerManager().getSelectedNodes(); curNode = curNodes.length == 0 ? null : curNodes[0]; if (curNode != null && curNode.equals(newNode)) { return; } selectNode(newNode, curNode); } private void selectNode(final Node newNode, final Node curNode) { // it is invoked just from the awt event thread so no special sync is necessary assert EventQueue.isDispatchThread(); RequestProcessor.Task task = queuedTask == null ? null : (RequestProcessor.Task) queuedTask.get(); if (task != null) { task.cancel(); } task = RP.post(new Runnable() { public void run() { selectNodeImpl(newNode, curNode); } }); queuedTask = new WeakReference(task); } private void selectNodeImpl(Node newNode, Node curNode) { Element el = null; ClassDefinition outer = null; Resource res = null; EditorCookie srcEditor = null; try { JavaMetamodel.getDefaultRepository().beginTrans(false); try { el = findElement(newNode); res = el != null? el.getResource(): null; DataObject d = res != null? JavaMetamodel.getManager().getDataObject(res): null; srcEditor = d!= null? (EditorCookie) d.getCookie(EditorCookie.class): null; if (el instanceof ClassMember) { outer = ((ClassMember) el).getDeclaringClass(); } } finally { JavaMetamodel.getDefaultRepository().endTrans(); } } catch (InvalidObjectException e) { //do nothing - no need to select invalid objects } catch (JmiException e) { ErrorManager.getDefault().notify(ErrorManager.WARNING, e); } if (srcEditor == null) { return; } if (srcEditor != sourceCookie) { changeRootContext(srcEditor, res); } // select the appropriate element from the list. ExplorerManager m = getExplorerManager(); Node toSelect = findNode(m.getRootContext(), outer, el); if (toSelect == curNode || (curNode != null && curNode.equals(toSelect))) return; setSelectedNode(toSelect, m); } /** * finds node of |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.