|
|||||||||||||||||||
Source file | Conditionals | Statements | Methods | TOTAL | |||||||||||||||
AWTContainerNavigatorFactory.java | - | 100% | 100% | 100% |
|
1 | /*BEGIN_COPYRIGHT_BLOCK | |
2 | * | |
3 | * Copyright (c) 2001-2010, JavaPLT group at Rice University (drjava@rice.edu) | |
4 | * All rights reserved. | |
5 | * | |
6 | * Redistribution and use in source and binary forms, with or without | |
7 | * modification, are permitted provided that the following conditions are met: | |
8 | * * Redistributions of source code must retain the above copyright | |
9 | * notice, this list of conditions and the following disclaimer. | |
10 | * * Redistributions in binary form must reproduce the above copyright | |
11 | * notice, this list of conditions and the following disclaimer in the | |
12 | * documentation and/or other materials provided with the distribution. | |
13 | * * Neither the names of DrJava, the JavaPLT group, Rice University, nor the | |
14 | * names of its contributors may be used to endorse or promote products | |
15 | * derived from this software without specific prior written permission. | |
16 | * | |
17 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
18 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
19 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
20 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR | |
21 | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
22 | * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
23 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
24 | * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |
25 | * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |
26 | * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
27 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
28 | * | |
29 | * This software is Open Source Initiative approved Open Source Software. | |
30 | * Open Source Initative Approved is a trademark of the Open Source Initiative. | |
31 | * | |
32 | * This file is part of DrJava. Download the current version of this project | |
33 | * from http://www.drjava.org/ or http://sourceforge.net/projects/drjava/ | |
34 | * | |
35 | * END_COPYRIGHT_BLOCK*/ | |
36 | ||
37 | package edu.rice.cs.util.docnavigation; | |
38 | ||
39 | import edu.rice.cs.plt.tuple.Pair; | |
40 | import edu.rice.cs.util.swing.Utilities; | |
41 | ||
42 | import java.util.List; | |
43 | import java.util.*; | |
44 | import java.awt.event.FocusListener; | |
45 | ||
46 | public class AWTContainerNavigatorFactory<ItemT extends INavigatorItem> implements IDocumentNavigatorFactory<ItemT> { | |
47 | ||
48 | 164 | public AWTContainerNavigatorFactory() { } |
49 | ||
50 | /** Creates a new List Navigator | |
51 | * @return a list navigator | |
52 | */ | |
53 | 161 | public IDocumentNavigator<ItemT> makeListNavigator() { return new JListSortNavigator<ItemT>(); } |
54 | ||
55 | /** Returns a new tree Navigator with the specified root | |
56 | * @param path the path name of the root node | |
57 | * @return a tree navigator | |
58 | */ | |
59 | 3 | public IDocumentNavigator<ItemT> makeTreeNavigator(String path) { return new JTreeSortNavigator<ItemT>(path); } |
60 | ||
61 | /** Creates a list navigator and migrates the navigator items from parent to the new navigator. The migration | |
62 | * is asynchronous but it completes before any subsequent computation in the event thread. | |
63 | * @param parent the navigator to migrate from | |
64 | * @return the new list navigator | |
65 | */ | |
66 | 2 | public IDocumentNavigator<ItemT> makeListNavigator(final IDocumentNavigator<ItemT> parent) { |
67 | 2 | final IDocumentNavigator<ItemT> child = makeListNavigator(); |
68 | 2 | Utilities.invokeLater(new Runnable() { |
69 | 2 | public void run() { |
70 | // synchronized(child.getModelLock()) { // dropped because of cost; each atomic action is still synchronized | |
71 | 2 | migrateNavigatorItems(child, parent); |
72 | 2 | migrateListeners(child, parent); |
73 | } | |
74 | // } | |
75 | }); | |
76 | 2 | return child; |
77 | } | |
78 | ||
79 | /** Creates a tree navigator and migrates the navigator items from the parent to the new navigator. The migration | |
80 | * is asynchronous but it completes before any subsequent computation in the event thread. | |
81 | * @param name the name of the root node | |
82 | * @param parent the navigator to migrate from | |
83 | * @return the new tree navigator | |
84 | */ | |
85 | 3 | public IDocumentNavigator<ItemT> makeTreeNavigator(String name, final IDocumentNavigator<ItemT> parent, |
86 | final List<Pair<String, INavigatorItemFilter<ItemT>>> l) { | |
87 | ||
88 | 3 | final IDocumentNavigator<ItemT> child = makeTreeNavigator(name); |
89 | 3 | Utilities.invokeLater(new Runnable() { |
90 | 3 | public void run() { |
91 | // synchronized(child.getModelLock()) { // dropped because of cost; each atomic action is still synchronized | |
92 | 9 | for(Pair<String, INavigatorItemFilter<ItemT>> p: l) { child.addTopLevelGroup(p.first(), p.second()); } |
93 | 3 | migrateNavigatorItems(child, parent); |
94 | 3 | migrateListeners(child, parent); |
95 | } | |
96 | // } | |
97 | }); | |
98 | 3 | return child; |
99 | } | |
100 | ||
101 | /** Migrates all the navigator items from parent to child | |
102 | * @param child the navigator to migrate to | |
103 | * @param parent the navigator to migrate from | |
104 | */ | |
105 | // As a first step to weakening the restriction on parent's type, this allows parent to be based on an arbitrary item type, as | |
106 | // long as it extends ItemT. | |
107 | 5 | private void migrateNavigatorItems(IDocumentNavigator<ItemT> child, IDocumentNavigator<ItemT> parent) { |
108 | 5 | ArrayList<ItemT> docs = parent.getDocuments(); |
109 | 5 | for (ItemT item: docs) child.addDocument(item); |
110 | ||
111 | 5 | parent.clear(); // Remove documents from old navigator (parent) |
112 | } | |
113 | ||
114 | /** Migrates all the listeners from parent to child | |
115 | * @param child the navigator to migrate to | |
116 | * @param parent the navigator to migrate from | |
117 | */ | |
118 | // As a first step to weakening the restriction on parent's type, this allows parent to be based on an arbitrary item type, as | |
119 | // long as it extends ItemT. | |
120 | 5 | private void migrateListeners(IDocumentNavigator<ItemT> child, IDocumentNavigator<ItemT> parent) { |
121 | 5 | for (INavigationListener<? super ItemT> nl: parent.getNavigatorListeners()) child.addNavigationListener(nl); |
122 | 20 | for (FocusListener fl: parent.getFocusListeners()) child.addFocusListener(fl); |
123 | } | |
124 | } |
|