1 19 package org.netbeans.bluej.ui.window; 20 21 import java.awt.BorderLayout ; 22 import java.awt.Dimension ; 23 import java.awt.event.ActionEvent ; 24 import java.awt.event.ActionListener ; 25 import java.awt.event.ItemEvent ; 26 import java.awt.event.ItemListener ; 27 import java.beans.PropertyChangeEvent ; 28 import java.beans.PropertyChangeListener ; 29 import java.io.Serializable ; 30 import java.util.Arrays ; 31 import javax.swing.ActionMap ; 32 import javax.swing.BorderFactory ; 33 import javax.swing.DefaultComboBoxModel ; 34 import javax.swing.JButton ; 35 import javax.swing.JComboBox ; 36 import javax.swing.JList ; 37 import javax.swing.JPanel ; 38 import javax.swing.text.DefaultEditorKit ; 39 import org.netbeans.api.project.Project; 40 import org.netbeans.api.project.ui.OpenProjects; 41 import org.netbeans.bluej.api.BluejLogicalViewProvider; 42 import org.openide.ErrorManager; 43 import org.openide.explorer.ExplorerManager; 44 import org.openide.explorer.ExplorerUtils; 45 import org.openide.explorer.view.ListView; 46 import org.openide.nodes.AbstractNode; 47 import org.openide.nodes.Children; 48 import org.openide.nodes.Node; 49 import org.openide.util.Lookup; 50 import org.openide.util.NbBundle; 51 import org.openide.util.Utilities; 52 import org.openide.util.lookup.Lookups; 53 import org.openide.util.lookup.ProxyLookup; 54 import org.openide.windows.TopComponent; 55 import org.openide.windows.WindowManager; 56 57 60 public final class BluejViewTopComponent extends TopComponent implements ExplorerManager.Provider { 61 62 private static final long serialVersionUID = 1L; 63 64 private static BluejViewTopComponent instance; 65 66 static final String ICON_PATH = "org/netbeans/bluej/ui/window/bluejview.png"; 68 private static final String PREFERRED_ID = "BluejViewTopComponent"; private ListView view; 70 private ExplorerManager manager; 71 72 private ItemListener itemListener; 73 private LookupProvider lookProvider; 74 75 private BluejViewTopComponent() { 76 manager = new ExplorerManager(); 77 ActionMap map = getActionMap(); 78 map.put(DefaultEditorKit.copyAction, ExplorerUtils.actionCopy(manager)); 79 map.put(DefaultEditorKit.cutAction, ExplorerUtils.actionCut(manager)); 80 map.put(DefaultEditorKit.pasteAction, ExplorerUtils.actionPaste(manager)); 81 map.put("delete", ExplorerUtils.actionDelete(manager, true)); 83 initComponents(); 84 setName(NbBundle.getMessage(BluejViewTopComponent.class, "CTL_BluejViewTopComponent")); 85 setToolTipText(NbBundle.getMessage(BluejViewTopComponent.class, "HINT_BluejViewTopComponent")); 86 setIcon(Utilities.loadImage(ICON_PATH, true)); 87 view = new ListView() { 88 protected JList createList() { 89 JList list = super.createList(); 90 list.setCellRenderer(new HackedNodeRenderer()); 91 return list; 92 } 93 }; 94 add(view, BorderLayout.CENTER); 95 lookProvider = new LookupProvider(); 96 associateLookup( new ProxyLookup(new Lookup[] { 97 ExplorerUtils.createLookup(manager, map), 98 Lookups.proxy(lookProvider) 99 })); 100 btnUp.addActionListener(new ActionListener () { 101 public void actionPerformed(ActionEvent e) { 102 Node nd = manager.getExploredContext(); 103 if (nd.getParentNode() != null) { 104 manager.setExploredContext(nd.getParentNode()); 105 } 106 } 107 }); 108 manager.addPropertyChangeListener(new PropertyChangeListener () { 109 public void propertyChange(PropertyChangeEvent evt) { 110 if (ExplorerManager.PROP_EXPLORED_CONTEXT.equals(evt.getPropertyName())) { 111 Node cont = manager.getExploredContext(); 112 btnUp.setEnabled(cont != null && cont.getParentNode() != null); 113 } 114 } 115 }); 116 117 118 comProject.setEditable(false); 119 comProject.setMinimumSize(new Dimension (150, 22)); 120 comProject.setPreferredSize(new Dimension (150, 22)); 121 itemListener = new ItemListener () { 122 public void itemStateChanged(ItemEvent e) { 123 if (e.getStateChange() == ItemEvent.SELECTED || 125 (e.getStateChange() == ItemEvent.DESELECTED && 126 e.getItemSelectable().getSelectedObjects() == null || 127 e.getItemSelectable().getSelectedObjects().length == 0)) { 128 updateContent(); 129 } 130 } 131 }; 132 } 133 134 public ExplorerManager getExplorerManager() { 135 return manager; 136 } 137 138 private void updateContent() { 139 Project project = OpenedBluejProjects.getInstance().getSelectedProject(); 140 if ( project != null && Arrays.asList(OpenProjects.getDefault().getOpenProjects()).contains(project)) { 141 lookProvider.setLookup(Lookups.singleton(project)); 143 OpenProjects.getDefault().setMainProject(project); 144 BluejLogicalViewProvider provider = (BluejLogicalViewProvider) project.getLookup().lookup(BluejLogicalViewProvider.class); 145 manager.setRootContext(provider.getBigIconRootNode()); 146 Project np = (Project)getLookup().lookup(Project.class); 147 } else { 148 lookProvider.setLookup(Lookup.EMPTY); 149 manager.setRootContext(new AbstractNode(Children.LEAF)); 150 getLookup().lookup(Project.class); 151 } 152 } 153 154 159 private void initComponents() { 161 pnlToolbar = new javax.swing.JPanel (); 162 lblProject = new javax.swing.JLabel (); 163 comProject = new javax.swing.JComboBox (); 164 btnUp = new javax.swing.JButton (); 165 166 setLayout(new java.awt.BorderLayout ()); 167 168 pnlToolbar.setMinimumSize(new java.awt.Dimension (200, 10)); 169 lblProject.setLabelFor(comProject); 170 org.openide.awt.Mnemonics.setLocalizedText(lblProject, org.openide.util.NbBundle.getMessage(BluejViewTopComponent.class, "lblProject.text")); 171 172 org.openide.awt.Mnemonics.setLocalizedText(btnUp, org.openide.util.NbBundle.getMessage(BluejViewTopComponent.class, "btnUp.label")); 173 174 org.jdesktop.layout.GroupLayout pnlToolbarLayout = new org.jdesktop.layout.GroupLayout(pnlToolbar); 175 pnlToolbar.setLayout(pnlToolbarLayout); 176 pnlToolbarLayout.setHorizontalGroup( 177 pnlToolbarLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 178 .add(pnlToolbarLayout.createSequentialGroup() 179 .addContainerGap() 180 .add(lblProject) 181 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) 182 .add(comProject, 0, 219, Short.MAX_VALUE) 183 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) 184 .add(btnUp) 185 .addContainerGap()) 186 ); 187 pnlToolbarLayout.setVerticalGroup( 188 pnlToolbarLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 189 .add(pnlToolbarLayout.createSequentialGroup() 190 .add(6, 6, 6) 191 .add(pnlToolbarLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) 192 .add(lblProject) 193 .add(btnUp) 194 .add(comProject, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))) 195 ); 196 add(pnlToolbar, java.awt.BorderLayout.NORTH); 197 198 } 200 201 private javax.swing.JButton btnUp; 203 private javax.swing.JComboBox comProject; 204 private javax.swing.JLabel lblProject; 205 private javax.swing.JPanel pnlToolbar; 206 208 213 public static synchronized BluejViewTopComponent getDefault() { 214 if (instance == null) { 215 instance = new BluejViewTopComponent(); 216 } 217 return instance; 218 } 219 220 223 public static synchronized BluejViewTopComponent findInstance() { 224 TopComponent win = WindowManager.getDefault().findTopComponent(PREFERRED_ID); 225 if (win == null) { 226 ErrorManager.getDefault().log(ErrorManager.WARNING, "Cannot find BluejView component. It will not be located properly in the window system."); return getDefault(); 228 } 229 if (win instanceof BluejViewTopComponent) { 230 return (BluejViewTopComponent)win; 231 } 232 ErrorManager.getDefault().log(ErrorManager.WARNING, "There seem to be multiple components with the '" + PREFERRED_ID + "' ID. That is a potential source of errors and unexpected behavior."); return getDefault(); 234 } 235 236 public int getPersistenceType() { 237 return TopComponent.PERSISTENCE_ALWAYS; 238 } 239 240 public void componentOpened() { 241 comProject.setModel(OpenedBluejProjects.getInstance().getComboModel()); 242 updateContent(); 243 comProject.addItemListener(itemListener); 244 } 245 246 public void componentClosed() { 247 comProject.removeItemListener(itemListener); 248 comProject.setModel(new DefaultComboBoxModel ()); 249 } 250 251 252 public Object writeReplace() { 253 return new ResolvableHelper(); 254 } 255 256 protected String preferredID() { 257 return PREFERRED_ID; 258 } 259 260 final static class ResolvableHelper implements Serializable { 261 private static final long serialVersionUID = 1L; 262 public Object readResolve() { 263 return BluejViewTopComponent.getDefault(); 264 } 265 } 266 267 final static class LookupProvider implements Lookup.Provider { 268 269 private Lookup lookup; 270 271 public void setLookup(Lookup lkp) { 272 lookup = lkp; 273 } 274 public Lookup getLookup() { 275 return lookup == null ? Lookup.EMPTY : lookup; 276 } 277 278 } 279 } 280 | Popular Tags |