Lines 42-96
Link Here
|
42 |
|
42 |
|
43 |
package org.netbeans.modules.db.explorer.node; |
43 |
package org.netbeans.modules.db.explorer.node; |
44 |
|
44 |
|
45 |
import org.netbeans.api.db.explorer.node.BaseNode; |
45 |
import java.beans.PropertyChangeEvent; |
|
|
46 |
import java.beans.PropertyChangeListener; |
47 |
import java.util.ArrayList; |
48 |
import java.util.Comparator; |
49 |
import java.util.List; |
50 |
import org.netbeans.api.db.explorer.node.NodeProvider; |
46 |
import org.netbeans.api.db.explorer.node.NodeProviderFactory; |
51 |
import org.netbeans.api.db.explorer.node.NodeProviderFactory; |
|
|
52 |
import org.netbeans.modules.db.explorer.DatabaseConnection; |
53 |
import org.netbeans.modules.db.explorer.node.TableListNode.Type; |
54 |
import org.netbeans.modules.db.metadata.model.api.MetadataElementHandle; |
55 |
import org.netbeans.modules.db.metadata.model.api.Schema; |
56 |
import org.openide.nodes.Node; |
47 |
import org.openide.util.Lookup; |
57 |
import org.openide.util.Lookup; |
|
|
58 |
import org.openide.util.WeakListeners; |
48 |
|
59 |
|
49 |
/** |
60 |
/** |
50 |
* |
61 |
* |
51 |
* @author Rob Englander |
62 |
* @author Rob Englander |
52 |
*/ |
63 |
*/ |
53 |
public class TableListNodeProvider extends ConnectedNodeProvider { |
64 |
public class TableListNodeProvider extends NodeProvider { |
54 |
|
65 |
|
|
|
66 |
private final DatabaseConnection connection; |
67 |
private PropertyChangeListener propertyChangeListener; |
68 |
private boolean setup = false; |
69 |
|
55 |
// lazy initialization holder class idiom for static fields is used |
70 |
// lazy initialization holder class idiom for static fields is used |
56 |
// for retrieving the factory |
71 |
// for retrieving the factory |
57 |
public static NodeProviderFactory getFactory() { |
72 |
public static NodeProviderFactory getFactory() { |
58 |
return FactoryHolder.FACTORY; |
73 |
return FactoryHolder.FACTORY; |
59 |
} |
74 |
} |
60 |
|
75 |
|
|
|
76 |
@Override |
77 |
protected void initialize() { |
78 |
if (connection.getConnector().isDisconnected()) { |
79 |
removeAllNodes(); |
80 |
setup = false; |
81 |
} else { |
82 |
if (!setup) { |
83 |
setNodesForCurrentSettings(); |
84 |
setup = true; |
85 |
} |
86 |
} |
87 |
if (propertyChangeListener == null) { |
88 |
propertyChangeListener = new PropertyChangeListener() { |
89 |
|
90 |
@Override |
91 |
public void propertyChange(PropertyChangeEvent evt) { |
92 |
if (evt.getPropertyName().equals("separateSystemTables")) { //NOI18N |
93 |
setNodesForCurrentSettings(); |
94 |
} |
95 |
} |
96 |
}; |
97 |
connection.addPropertyChangeListener(WeakListeners.propertyChange( |
98 |
propertyChangeListener, connection)); |
99 |
} |
100 |
} |
101 |
|
102 |
private void setNodesForCurrentSettings() { |
103 |
List<Node> newList = new ArrayList<>(); |
104 |
if (connection.isSeparateSystemTables()) { |
105 |
newList.add(TableListNode.create(createLookup(), this, Type.STANDARD)); |
106 |
newList.add(TableListNode.create(createLookup(), this, Type.SYSTEM)); |
107 |
} else { |
108 |
newList.add(TableListNode.create(createLookup(), this, Type.ALL)); |
109 |
} |
110 |
setNodes(newList); |
111 |
} |
112 |
|
113 |
/** |
114 |
* Create a lookup for TableListNode. Each TableListNode needs a unique |
115 |
* lookup, because it will be used as key for the node. |
116 |
*/ |
117 |
private NodeDataLookup createLookup() { |
118 |
NodeDataLookup lookup = new NodeDataLookup(); |
119 |
lookup.add(connection); |
120 |
|
121 |
MetadataElementHandle<Schema> schemaHandle = getLookup().lookup(MetadataElementHandle.class); |
122 |
if (schemaHandle != null) { |
123 |
lookup.add(schemaHandle); |
124 |
} |
125 |
return lookup; |
126 |
} |
127 |
|
61 |
private static class FactoryHolder { |
128 |
private static class FactoryHolder { |
62 |
static final NodeProviderFactory FACTORY = new NodeProviderFactory() { |
129 |
static final NodeProviderFactory FACTORY = new NodeProviderFactory() { |
|
|
130 |
@Override |
63 |
public TableListNodeProvider createInstance(Lookup lookup) { |
131 |
public TableListNodeProvider createInstance(Lookup lookup) { |
64 |
TableListNodeProvider provider = new TableListNodeProvider(lookup, false); |
132 |
TableListNodeProvider provider = new TableListNodeProvider(lookup); |
65 |
return provider; |
133 |
return provider; |
66 |
} |
134 |
} |
67 |
}; |
135 |
}; |
68 |
} |
136 |
} |
69 |
|
137 |
|
70 |
// lazy initialization holder class idiom for static fields is used |
138 |
private TableListNodeProvider(Lookup lookup) { |
71 |
// for retrieving the factory |
139 |
super(lookup, new TableListNodeComparator()); |
72 |
public static NodeProviderFactory getSystemFactory() { |
140 |
connection = getLookup().lookup(DatabaseConnection.class); |
73 |
return SystamFactoryHolder.FACTORY; |
|
|
74 |
} |
141 |
} |
75 |
|
142 |
|
76 |
private static class SystamFactoryHolder { |
143 |
private static class TableListNodeComparator implements Comparator<Node> { |
77 |
static final NodeProviderFactory FACTORY = new NodeProviderFactory() { |
144 |
|
78 |
public TableListNodeProvider createInstance(Lookup lookup) { |
145 |
@Override |
79 |
TableListNodeProvider provider = new TableListNodeProvider(lookup, true); |
146 |
public int compare(Node o1, Node o2) { |
80 |
return provider; |
147 |
if (o1 instanceof TableListNode && o2 instanceof TableListNode) { |
|
|
148 |
return (((TableListNode) o1).getType().equals(Type.SYSTEM)) |
149 |
? 1 : -1; |
150 |
} else { |
151 |
return o1.getDisplayName().compareToIgnoreCase(o2.getDisplayName()); |
81 |
} |
152 |
} |
82 |
}; |
153 |
} |
83 |
} |
|
|
84 |
|
85 |
private final boolean system; |
86 |
|
87 |
private TableListNodeProvider(Lookup lookup, boolean system) { |
88 |
super(lookup); |
89 |
this.system = system; |
90 |
} |
91 |
|
92 |
@Override |
93 |
protected BaseNode createNode(NodeDataLookup lookup) { |
94 |
return TableListNode.create(lookup, this, system); |
95 |
} |
154 |
} |
96 |
} |
155 |
} |