KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > netbeans > modules > web > monitor > client > TransactionView


1 /*
2  * The contents of this file are subject to the terms of the Common Development
3  * and Distribution License (the License). You may not use this file except in
4  * compliance with the License.
5  *
6  * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
7  * or http://www.netbeans.org/cddl.txt.
8  *
9  * When distributing Covered Code, include this CDDL Header Notice in each file
10  * and include the License file at http://www.netbeans.org/cddl.txt.
11  * If applicable, add the following below the CDDL Header, with the fields
12  * enclosed by brackets [] replaced by your own identifying information:
13  * "Portions Copyrighted [year] [name of copyright owner]"
14  *
15  * The Original Software is NetBeans. The Initial Developer of the Original
16  * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
17  * Microsystems, Inc. All Rights Reserved.
18  */

19
20 /**
21  * @author Ana von Klopp
22  */

23
24 package org.netbeans.modules.web.monitor.client;
25
26 import java.awt.BorderLayout JavaDoc;
27 import java.awt.Container JavaDoc;
28 import java.awt.Dimension JavaDoc;
29 import java.awt.FontMetrics JavaDoc;
30 import java.awt.Graphics JavaDoc;
31 import java.awt.event.ActionListener JavaDoc;
32 import java.awt.event.ActionEvent JavaDoc;
33 import java.beans.PropertyChangeListener JavaDoc;
34 import java.beans.PropertyChangeEvent JavaDoc;
35 import java.io.ObjectStreamException JavaDoc;
36 import java.io.Serializable JavaDoc;
37 import java.util.logging.Level JavaDoc;
38 import java.util.logging.Logger JavaDoc;
39 import javax.swing.ImageIcon JavaDoc;
40 import javax.swing.JButton JavaDoc;
41 import javax.swing.JFrame JavaDoc;
42 import javax.swing.JPanel JavaDoc;
43 import javax.swing.JScrollPane JavaDoc;
44 import javax.swing.JSplitPane JavaDoc;
45 import javax.swing.JTabbedPane JavaDoc;
46 import javax.swing.JToggleButton JavaDoc;
47 import javax.swing.JToolBar JavaDoc;
48 import javax.swing.border.CompoundBorder JavaDoc;
49 import javax.swing.border.EmptyBorder JavaDoc;
50 import javax.swing.border.EtchedBorder JavaDoc;
51 import javax.swing.event.ChangeListener JavaDoc;
52 import javax.swing.event.ChangeEvent JavaDoc;
53 import org.openide.explorer.ExplorerManager;
54 import org.openide.explorer.ExplorerUtils;
55 import org.openide.explorer.view.BeanTreeView;
56 import org.openide.nodes.Node;
57 import org.openide.nodes.Children;
58 import org.openide.nodes.AbstractNode;
59 import org.openide.windows.TopComponent;
60 import org.openide.util.HelpCtx;
61 import org.openide.util.NbBundle;
62 import org.openide.util.RequestProcessor;
63 import org.netbeans.modules.web.monitor.data.DataRecord;
64
65 /**
66  * Update title does not work like it should. Maybe there is a getName
67  * method for this that I can override.
68  */

69 class TransactionView extends TopComponent implements ExplorerManager.Provider,
70                      PropertyChangeListener JavaDoc, ChangeListener JavaDoc {
71
72     // Handles all the files etc.
73
private transient static TransactionView instance = null;
74     private transient static Controller controller = null;
75
76     // Misc
77
private transient JToggleButton JavaDoc timeAButton, timeDButton,
78     alphaButton;
79     
80     private transient JToggleButton JavaDoc timestampButton;
81
82     // Sizing and stuff...
83
private transient Dimension JavaDoc logD = new Dimension JavaDoc(250, 400);
84     private transient Dimension JavaDoc dataD = new Dimension JavaDoc(500, 400);
85     private transient Dimension JavaDoc tabD = new Dimension JavaDoc(500,472);
86     
87     // Display stuff
88
private transient static ExplorerManager mgr = null;
89     private transient JPanel JavaDoc logPanel = null;
90     private transient JPanel JavaDoc dataPanel = null;
91     private transient JSplitPane JavaDoc splitPanel = null;
92     private transient double dividerRatio = .35;
93     private transient BeanTreeView tree = null;
94     private transient AbstractNode selected = null;
95
96     private transient RequestDisplay requestDisplay = null;
97     private transient CookieDisplay cookieDisplay = null;
98     private transient SessionDisplay sessionDisplay = null;
99     private transient ContextDisplay contextDisplay = null;
100     private transient ClientDisplay clientDisplay = null;
101     private transient HeaderDisplay headerDisplay = null;
102
103     // Handle resizing for larger fonts
104
boolean fontChanged = true;
105
106     // Data display tables
107
private int displayType = 0;
108
109     // Need to override requestFocusInWindow to call requestFocusInWindow
110
// on some internal component for F1 help to work correctly
111
public boolean requestFocusInWindow() {
112         if (tree != null) {
113             return tree.requestFocusInWindow();
114         } else {
115             return false;
116         }
117     }
118     
119     public HelpCtx getHelpCtx() {
120     String JavaDoc helpID = NbBundle.getBundle(TransactionView.class).getString("MON_Transaction_View_F1_Help_ID"); // NOI18N
121
return new HelpCtx( helpID );
122     }
123
124     /**
125      * Creates the display and the nodes that are present all the
126      * time. Because all this is done at startup, we don't actually
127      * retrieve any data until the Monitor is opened.
128      */

129     private TransactionView() {
130         setIcon(new ImageIcon JavaDoc(TransactionView.class.getResource
131         ("/org/netbeans/modules/web/monitor/client/icons/menuitem.gif")).getImage());
132         setToolTipText(NbBundle.getMessage(TransactionView.class, "MON_Window_Tooltip"));
133     controller = Controller.getInstance();
134     initialize();
135     this.getAccessibleContext().setAccessibleDescription(NbBundle.getBundle(TransactionView.class).getString("ACS_MON_monitorDesc"));
136     this.getAccessibleContext().setAccessibleName(NbBundle.getBundle(TransactionView.class).getString("ACS_MON_monitorName"));
137
138     }
139
140     static synchronized TransactionView getInstance() {
141     if(instance == null)
142         instance = new TransactionView();
143     return instance;
144     }
145
146     private void initialize() {
147
148     mgr = new ExplorerManager();
149     mgr.addPropertyChangeListener(this);
150     mgr.setRootContext(controller.getRoot());
151
152         // following line tells the top component which lookup should be associated with it
153
associateLookup (ExplorerUtils.createLookup (mgr, getActionMap ()));
154
155         setLayout(new java.awt.BorderLayout JavaDoc());
156     tree = new BeanTreeView();
157     tree.setDefaultActionAllowed(true);
158     tree.getAccessibleContext().setAccessibleDescription(NbBundle.getBundle(TransactionView.class).getString("ACS_MON_treeName"));
159     tree.getAccessibleContext().setAccessibleName(NbBundle.getBundle(TransactionView.class).getString("ACS_MON_treeDesc"));
160
161     createLogPanel();
162     createDataPanel();
163     splitPanel =
164         new JSplitPane JavaDoc(JSplitPane.HORIZONTAL_SPLIT, logPanel, dataPanel);
165     splitPanel.setDividerLocation((int)(logD.getWidth()));
166     splitPanel.setResizeWeight(dividerRatio);
167     splitPanel.setDividerSize(1);
168     splitPanel.setOneTouchExpandable(true);
169     this.add(splitPanel);
170     setName(NbBundle.getBundle(TransactionView.class).getString("MON_Title"));
171     }
172     
173     /**
174      * Open the transaction nodes (i.e. first level children of the root).
175      */

176     void openTransactionNodes() {
177
178     // Post the request for later in case there are timing issues
179
// going on here.
180

181     OpenTransactionNodesRequest req = new
182         OpenTransactionNodesRequest();
183     
184     RequestProcessor.Task t =
185         RequestProcessor.postRequest(req, 500); // wait a sec...
186
}
187
188     public int getPersistenceType() {
189     return TopComponent.PERSISTENCE_ONLY_OPENED;
190     }
191
192     class OpenTransactionNodesRequest implements Runnable JavaDoc {
193     
194     public void run() {
195         openTransactionNodes();
196     }
197
198     void openTransactionNodes() {
199         NavigateNode root = controller.getRoot();
200         Children ch = root.getChildren();
201         Node [] nodes = ch.getNodes();
202         CurrNode cn = (CurrNode)nodes[0];
203         SavedNode sn = (SavedNode)nodes[1];
204         
205         
206         // If there are any current nodes, then select the most
207
// recent (i.e. the last?) one.
208

209         Children currCh = cn.getChildren();
210         Node [] currChNodes = currCh.getNodes();
211         int numCN = currChNodes.length;
212         if (numCN > 0) {
213         int selectThisOne = 0;
214         if (timeAButton.isSelected()) {
215             selectThisOne = numCN - 1;
216         }
217         selectNode(currChNodes[selectThisOne]);
218         } else {
219         Children savedCh = sn.getChildren();
220         Node [] savedChNodes = savedCh.getNodes();
221         int numSN = savedChNodes.length;
222         if (numSN > 0) {
223             selectNode(savedChNodes[0]);
224         }
225         }
226     }
227     }
228
229     void selectNode(Node n) {
230
231     try {
232         mgr.setSelectedNodes(new Node[] {n});
233         
234     } catch (Exception JavaDoc exc) {
235             Logger.getLogger(TransactionView.class.getName()).log(Level.INFO, "selectNode", exc);
236     } // safely ignored
237
}
238     
239     /**
240      * Loads the transactions into the monitor on opening. */

241     private boolean openedOnceAlready = false;
242     public void open() {
243     super.open();
244     //setName(NbBundle.getBundle(TransactionView.class).getString("MON_Title"));
245
if (!openedOnceAlready) {
246         openedOnceAlready = true;
247         controller.getTransactions();
248         openTransactionNodes();
249         //this.revalidate();
250
//this.repaint();
251
}
252     //PENDING ...
253
controller.checkServer(false);
254     }
255     
256     /**
257      * Returns true if the monitor is already initialized - the old transactions
258      * were loaded from disk, false otherwise.
259      */

260     public boolean isInitialized() {
261         return openedOnceAlready;
262     }
263
264     protected void updateTitle() {
265     setName(NbBundle.getBundle(TransactionView.class).getString("MON_Title"));
266     }
267     
268     /**
269      * Do not serialize this component, substitute null instead.
270      */

271     public Object JavaDoc writeReplace() throws ObjectStreamException JavaDoc {
272         return new ResolvableHelper();
273     }
274
275
276     /**
277      * Invoked at startup, creates the display GUI.
278      */

279     private void createLogPanel() {
280
281     JToolBar JavaDoc buttonPanel = new JToolBar JavaDoc();
282     buttonPanel.setBorder
283         (new CompoundBorder JavaDoc(new EtchedBorder JavaDoc(EtchedBorder.LOWERED),
284                 new EmptyBorder JavaDoc (4, 4, 4, 4)
285                     ));
286     buttonPanel.setFloatable (false);
287
288     JButton JavaDoc updateButton = new JButton JavaDoc(new ImageIcon JavaDoc(TransactionView.class.getResource
289         ("/org/netbeans/modules/web/monitor/client/icons/update.gif")));; // NOI18N
290
updateButton.setToolTipText(NbBundle.getBundle(TransactionView.class).getString("MON_Reload_all_17"));
291     updateButton.addActionListener(new ActionListener JavaDoc() {
292         public void actionPerformed(ActionEvent JavaDoc e) {
293             controller.getTransactions();
294         }});
295
296     timeAButton = new JToggleButton JavaDoc(new ImageIcon JavaDoc(
297                 TransactionView.class.getResource("/org/netbeans/modules/web/monitor/client/icons/timesortA.gif")), false);
298     timeAButton.setToolTipText(NbBundle.getBundle(TransactionView.class).getString("MON_Order_transactions_15"));
299
300     timeAButton.addActionListener(new ActionListener JavaDoc() {
301         public void actionPerformed(ActionEvent JavaDoc e) {
302
303             if(!((JToggleButton JavaDoc)e.getSource()).isSelected())
304             return;
305             else {
306             timeDButton.setSelected(false);
307             alphaButton.setSelected(false);
308             controller.setComparator
309                 (controller.new CompTime(false));
310             }
311         }});
312
313     timeDButton = new JToggleButton JavaDoc(new ImageIcon JavaDoc(
314                 TransactionView.class.getResource("/org/netbeans/modules/web/monitor/client/icons/timesortB.gif")), true);
315     timeDButton.setToolTipText(NbBundle.getBundle(TransactionView.class).getString("MON_Order_transactions_16"));
316     timeDButton.addActionListener(new ActionListener JavaDoc() {
317         public void actionPerformed(ActionEvent JavaDoc e) {
318
319             if(!((JToggleButton JavaDoc)e.getSource()).isSelected())
320             return;
321             else {
322             timeAButton.setSelected(false);
323             alphaButton.setSelected(false);
324             controller.setComparator
325                 (controller.new CompTime(true));
326             }
327
328         }});
329
330     alphaButton = new JToggleButton JavaDoc(new ImageIcon JavaDoc(
331                 TransactionView.class.getResource("/org/netbeans/modules/web/monitor/client/icons/a2z.gif")), false);
332     alphaButton.setToolTipText(NbBundle.getBundle(TransactionView.class).getString("MON_Order_transactions_14"));
333     alphaButton.addActionListener(new ActionListener JavaDoc() {
334         public void actionPerformed(ActionEvent JavaDoc e) {
335
336             if(!((JToggleButton JavaDoc)e.getSource()).isSelected())
337             return;
338             else {
339             timeAButton.setSelected(false);
340             timeDButton.setSelected(false);
341             controller.setComparator
342                 (controller.new CompAlpha());
343             }
344
345         }});
346
347
348     timestampButton = new
349         JToggleButton JavaDoc(new ImageIcon JavaDoc(
350             TransactionView.class.getResource("/org/netbeans/modules/web/monitor/client/icons/timestamp.gif")),
351                 TransactionNode.showTimeStamp());
352     timestampButton.setToolTipText(NbBundle.getBundle(TransactionView.class).getString("MON_Show_time_25"));
353     timestampButton.addActionListener(new ActionListener JavaDoc() {
354         public void actionPerformed(ActionEvent JavaDoc e) {
355             TransactionNode.toggleTimeStamp();
356             // PENDING - should find a way to repaint
357
// the tree. tree.repaint() does not work.
358
controller.updateNodeNames();
359         }});
360
361     buttonPanel.add(updateButton);
362     buttonPanel.add(timeDButton);
363     buttonPanel.add(timeAButton);
364     buttonPanel.add(alphaButton);
365     JPanel JavaDoc sep = new JPanel JavaDoc() { // PENDING proper insets should do the same spacing job
366
public float getAlignmentX() {
367             return 0;
368         }
369         public float getAlignmentY() {
370             return 0;
371         }
372         };
373     sep.setMaximumSize(new Dimension JavaDoc(10, 10));
374     buttonPanel.add(sep);
375     buttonPanel.add(timestampButton);
376
377     logPanel = new JPanel JavaDoc();
378     logPanel.setLayout(new BorderLayout JavaDoc());
379
380     JPanel JavaDoc p = new JPanel JavaDoc (new BorderLayout JavaDoc ());
381     //p.setBorder (new EtchedBorder (EtchedBorder.LOWERED));
382
p.add(BorderLayout.NORTH, buttonPanel);
383     p.add(BorderLayout.CENTER, tree);
384     logPanel.add(BorderLayout.CENTER, p);
385     logPanel.setPreferredSize(logD);
386     }
387
388
389     /**
390      * Invoked at startup, creates the display GUI.
391      */

392     private void createDataPanel() {
393
394     JTabbedPane JavaDoc jtp = new JTabbedPane JavaDoc();
395         jtp.getAccessibleContext().setAccessibleName(NbBundle.getBundle(TransactionView.class).getString("ACS_MON_Transaction_dataName"));
396         jtp.getAccessibleContext().setAccessibleDescription(NbBundle.getBundle(TransactionView.class).getString("ACS_MON_Transaction_dataDesc"));
397
398     jtp.setPreferredSize(tabD);
399     jtp.setMaximumSize(tabD);
400
401         // compute scrolling unit increment
402
FontMetrics JavaDoc metrics = getFontMetrics(jtp.getFont());
403         int scrollingUnitIncrement = metrics.getHeight();
404         
405     requestDisplay = new RequestDisplay();
406     JScrollPane JavaDoc p = new JScrollPane JavaDoc(requestDisplay);
407         p.getVerticalScrollBar().setUnitIncrement(scrollingUnitIncrement);
408     jtp.addTab(NbBundle.getBundle(TransactionView.class).getString("MON_Request_19"), p);
409
410     cookieDisplay = new CookieDisplay();
411     p = new JScrollPane JavaDoc(cookieDisplay);
412         p.getVerticalScrollBar().setUnitIncrement(scrollingUnitIncrement);
413     jtp.addTab(NbBundle.getBundle(TransactionView.class).getString("MON_Cookies_4"), p);
414
415     sessionDisplay = new SessionDisplay();
416     p = new JScrollPane JavaDoc(sessionDisplay);
417         p.getVerticalScrollBar().setUnitIncrement(scrollingUnitIncrement);
418     jtp.addTab(NbBundle.getBundle(TransactionView.class).getString("MON_Session_24"), p);
419
420     contextDisplay = new ContextDisplay();
421     p = new JScrollPane JavaDoc(contextDisplay);
422         p.getVerticalScrollBar().setUnitIncrement(scrollingUnitIncrement);
423     jtp.addTab(NbBundle.getBundle(TransactionView.class).getString("MON_Context_23"), p);
424
425     clientDisplay = new ClientDisplay();
426     p = new JScrollPane JavaDoc(clientDisplay);
427         p.getVerticalScrollBar().setUnitIncrement(scrollingUnitIncrement);
428     jtp.addTab(NbBundle.getBundle(TransactionView.class).getString("MON_Client_Server"), p);
429
430     headerDisplay = new HeaderDisplay();
431     p = new JScrollPane JavaDoc(headerDisplay);
432         p.getVerticalScrollBar().setUnitIncrement(scrollingUnitIncrement);
433     jtp.addTab(NbBundle.getBundle(TransactionView.class).getString("MON_Header_19"), p);
434
435     jtp.addChangeListener(this);
436
437     dataPanel = new JPanel JavaDoc();
438     dataPanel.setLayout(new BorderLayout JavaDoc());
439     dataPanel.add(BorderLayout.CENTER, jtp);
440     dataPanel.setPreferredSize(dataD);
441     }
442
443
444     /**
445      * Invoked by DisplayAction. Displays monitor data for the selected
446      * node.
447      * PENDING - register this as a listener for the display action
448      */

449     void displayTransaction(Node node) {
450     if (node == null)
451         return;
452
453     if(node instanceof TransactionNode ||
454        node instanceof NestedNode) {
455         try {
456         selected = (AbstractNode)node;
457         }
458         catch (ClassCastException JavaDoc ex) {
459         selected = null;
460         selectNode(null);
461         }
462     }
463     else {
464         selected = null;
465         selectNode(null);
466     }
467     
468     showData();
469     }
470
471     void saveTransaction(Node[] nodes) {
472     if((nodes == null) || (nodes.length == 0)) return;
473     controller.saveTransaction(nodes);
474     selected = null;
475     selectNode(null);
476     showData();
477     }
478     
479     /**
480      * Listens to events from the tab pane, displays different
481      * categories of data accordingly.
482      */

483     public void stateChanged(ChangeEvent JavaDoc e) {
484
485     setName(NbBundle.getBundle(TransactionView.class).getString("MON_Title"));
486
487     JTabbedPane JavaDoc p = (JTabbedPane JavaDoc)e.getSource();
488     displayType = p.getSelectedIndex();
489     showData();
490     }
491     
492
493     void showData() {
494      
495     DataRecord dr = null;
496     try {
497         if (selected != null) {
498         dr = controller.getDataRecord(selected);
499         }
500     }
501     catch(Exception JavaDoc ex) {
502         ex.printStackTrace();
503     }
504     
505     if (displayType == 0)
506         requestDisplay.setData(dr);
507     else if (displayType == 1)
508         cookieDisplay.setData(dr);
509     else if (displayType == 2)
510         sessionDisplay.setData(dr);
511     else if (displayType == 3)
512         contextDisplay.setData(dr);
513     else if (displayType == 4)
514         clientDisplay.setData(dr);
515     else if (displayType == 5)
516         headerDisplay.setData(dr);
517
518     this.repaint();
519     
520     }
521
522     /**
523      * Display the data for a node if it's selected. This should
524      * probably be done by checking if you can get the DisplayAction
525      * from the Node, and then calling it if it's enabled.
526      */

527     public void propertyChange(PropertyChangeEvent JavaDoc evt) {
528
529     setName(NbBundle.getBundle(TransactionView.class).getString("MON_Title"));
530     //updateTitle();
531

532     if(evt.getPropertyName().equals(ExplorerManager.PROP_SELECTED_NODES)) {
533
534         if(evt.getNewValue() instanceof Node[]) {
535         try {
536             Node[] ns = (Node[])evt.getNewValue();
537             if(ns.length == 1) {
538             displayTransaction(ns[0]);
539             }
540         }
541         // Do nothing, this was not a proper node
542
catch(Exception JavaDoc e) {
543                     Logger.getLogger(TransactionView.class.getName()).log(Level.INFO, "", e);
544             selected = null;
545             showData();
546             return;
547         }
548         }
549     }
550     }
551
552     /**
553      * Blanks out the displays - this is used by the delete actions
554      */

555     void blank() {
556     selected = null;
557     selectNode(null);
558     showData();
559     }
560
561     /**
562      * When paint is first invoked, we set the rowheight based on the
563      * size of the font. */

564     public void paint(Graphics JavaDoc g) {
565     if(fontChanged) {
566         super.paint(g);
567         return;
568     }
569
570     FontMetrics JavaDoc fm = g.getFontMetrics(getFont());
571     fontChanged = false;
572     
573     double logWidth = fm.stringWidth(NbBundle.getBundle(TransactionView.class).getString("MON_Transactions_27")) * 1.1;
574
575     if(logWidth > logD.getWidth()) {
576         double factor = logWidth/logD.getWidth();
577         logD.setSize(logWidth, factor * logD.getHeight());
578
579
580         dataD.setSize(factor * dataD.getWidth(),
581               factor * dataD.getHeight());
582     }
583
584     logPanel.setPreferredSize(logD);
585     dataPanel.setPreferredSize(dataD);
586     splitPanel.resetToPreferredSizes();
587     splitPanel.setDividerLocation((int)(logD.getWidth()));
588
589     try {
590         Container JavaDoc o = (Container JavaDoc)this.getParent();
591         while(true) {
592         if(o instanceof JFrame JavaDoc) {
593             JFrame JavaDoc parent = (JFrame JavaDoc)o;
594             parent.pack();
595             break;
596         }
597         o = o.getParent();
598         }
599     }
600     catch(Throwable JavaDoc t) {
601         // Do nothing, we can't resize the component
602
// invalidate on this component does not work.
603
}
604     //super.paint(g);
605
return;
606     }
607
608     public static final class ResolvableHelper implements Serializable JavaDoc {
609         static final long serialVersionUID = 1234546018839457544L;
610         Object JavaDoc readResolve() {
611         Controller.getInstance().getTransactions();
612             return TransactionView.getInstance();
613         }
614     }
615     
616     protected String JavaDoc preferredID() {
617         return "TransactionView"; //NOI18N
618
}
619     
620     // methods needed for binding with context menu ------
621
void setTimestampButtonSelected(boolean state) {
622         timestampButton.setSelected(state);
623     }
624     
625     boolean isTimestampButtonSelected() {
626         return timestampButton.isSelected();
627     }
628     
629     void addTimestampButtonActionListener(ActionListener JavaDoc l) {
630         timestampButton.addActionListener(l);
631     }
632     
633     boolean isAscButtonSelected() {
634         return timeAButton.isSelected();
635     }
636
637     boolean isDescButtonSelected() {
638         return timeDButton.isSelected();
639     }
640
641     boolean isAlphButtonSelected() {
642         return alphaButton.isSelected();
643     }
644
645     void toggleTaskbarButtons(boolean asc, boolean desc, boolean alph) {
646         timeAButton.setSelected(asc);
647         timeDButton.setSelected(desc);
648         alphaButton.setSelected(alph);
649     }
650     
651     // EOF: methods needed for binding with context menu ------
652

653     public ExplorerManager getExplorerManager() {
654         return mgr;
655     }
656     
657     protected void componentActivated() {
658         ExplorerUtils.activateActions(mgr, true);
659     }
660     
661     protected void componentDeactivated() {
662         ExplorerUtils.activateActions(mgr, false);
663     }
664 }
665
Popular Tags