svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.app / org.gvsig.app.mainplugin / src / main / java / org / gvsig / app / extension / copytable / StoresRepositoryController.java @ 46629
History | View | Annotate | Download (8.11 KB)
1 | 46575 | jjdelcerro | package org.gvsig.app.extension.copytable; |
---|---|---|---|
2 | |||
3 | import java.awt.event.FocusAdapter; |
||
4 | import java.awt.event.FocusEvent; |
||
5 | import java.awt.event.MouseEvent; |
||
6 | import java.awt.event.MouseMotionAdapter; |
||
7 | 46629 | fdiaz | import java.util.ArrayList; |
8 | 46575 | jjdelcerro | import java.util.Arrays; |
9 | import java.util.Collections; |
||
10 | import java.util.List; |
||
11 | import java.util.Objects; |
||
12 | import javax.swing.JTree; |
||
13 | import javax.swing.ToolTipManager; |
||
14 | import javax.swing.event.TreeSelectionListener; |
||
15 | 46629 | fdiaz | import javax.swing.text.Position; |
16 | import javax.swing.tree.TreeModel; |
||
17 | 46575 | jjdelcerro | import javax.swing.tree.TreePath; |
18 | import org.apache.commons.lang3.StringUtils; |
||
19 | import org.gvsig.fmap.dal.DALLocator; |
||
20 | import org.gvsig.fmap.dal.DataStore; |
||
21 | import org.gvsig.fmap.dal.DataStoreParameters; |
||
22 | import org.gvsig.fmap.dal.StoresRepository; |
||
23 | import org.gvsig.fmap.dal.feature.FeatureStore; |
||
24 | import static org.gvsig.fmap.dal.resource.db.DBParameters.PASSWORD_PARAMTER_NAME; |
||
25 | import org.gvsig.fmap.dal.swing.DALSwingLocator; |
||
26 | import org.gvsig.fmap.dal.swing.DataSwingManager; |
||
27 | import org.gvsig.tools.dispose.DisposeUtils; |
||
28 | import org.gvsig.tools.dynobject.DynField; |
||
29 | import org.gvsig.tools.util.LabeledValue; |
||
30 | |||
31 | /**
|
||
32 | *
|
||
33 | * @author jjdelcerro
|
||
34 | */
|
||
35 | public class StoresRepositoryController { |
||
36 | |||
37 | private JTree tree; |
||
38 | private final StoresRepository rootRepository; |
||
39 | |||
40 | public StoresRepositoryController(JTree tree) { |
||
41 | this(tree, DALLocator.getDataManager().getStoresRepository());
|
||
42 | } |
||
43 | |||
44 | public StoresRepositoryController(JTree tree, StoresRepository rootRepository) { |
||
45 | this.tree = tree;
|
||
46 | 46629 | fdiaz | this.tree.setExpandsSelectedPaths(true); |
47 | |||
48 | 46575 | jjdelcerro | this.rootRepository = rootRepository;
|
49 | |||
50 | DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager(); |
||
51 | this.tree.setModel(dataSwingManager.createTreeModel(rootRepository));
|
||
52 | this.configureToolTip(this.tree); |
||
53 | |||
54 | } |
||
55 | |||
56 | public void addTreeSelectionListener(TreeSelectionListener tsl) { |
||
57 | this.tree.addTreeSelectionListener(tsl);
|
||
58 | } |
||
59 | |||
60 | public DataStore getSelectedStore() {
|
||
61 | TreePath path = this.tree.getSelectionPath(); |
||
62 | if( path == null ) { |
||
63 | return null; |
||
64 | } |
||
65 | LabeledValue element = (LabeledValue) path.getLastPathComponent(); |
||
66 | if( element == null ) { |
||
67 | return null; |
||
68 | } |
||
69 | TreePath parentPath = path.getParentPath();
|
||
70 | if( parentPath == null ) { |
||
71 | return null; |
||
72 | } |
||
73 | |||
74 | LabeledValue parentElement = (LabeledValue) parentPath.getLastPathComponent(); |
||
75 | if( !(element.getValue() instanceof DataStoreParameters) ) { |
||
76 | return null; |
||
77 | } |
||
78 | if( !(parentElement.getValue() instanceof StoresRepository) ) { |
||
79 | return null; |
||
80 | } |
||
81 | StoresRepository repository = (StoresRepository) parentElement.getValue(); |
||
82 | 46621 | fdiaz | // DataStore store = (DataStore) repository.getStore(element.getLabel());
|
83 | DataStoreParameters storeParams = repository.get(element.getLabel()); |
||
84 | DataStore store = null;
|
||
85 | try {
|
||
86 | store = DALLocator.getManager().openStore(storeParams.getProviderName(), storeParams); |
||
87 | } catch (Exception ex) { |
||
88 | //FIXME
|
||
89 | store = null;
|
||
90 | } |
||
91 | 46575 | jjdelcerro | return store;
|
92 | } |
||
93 | |||
94 | 46629 | fdiaz | public boolean setSelectedStore(FeatureStore store) { |
95 | |||
96 | TreeModel model = this.tree.getModel(); |
||
97 | LabeledValue root = (LabeledValue) model.getRoot(); |
||
98 | List path = new ArrayList(); |
||
99 | if(!setSelectedStore(model, path, root, store.getParameters())) {
|
||
100 | return false; |
||
101 | }; |
||
102 | |||
103 | int currentRow = 0; |
||
104 | TreePath elementPath = null; |
||
105 | for (int i = 0; i< path.size(); i++){ |
||
106 | LabeledValue element = (LabeledValue)path.get(i); |
||
107 | elementPath = this.tree.getNextMatch(element.getLabel(), currentRow, Position.Bias.Forward); |
||
108 | if(elementPath == null) { |
||
109 | break;
|
||
110 | } |
||
111 | this.tree.expandPath(elementPath);
|
||
112 | currentRow = this.tree.getRowForPath(elementPath);
|
||
113 | if(currentRow < 0){ |
||
114 | break;
|
||
115 | } |
||
116 | } |
||
117 | if(elementPath == null) { |
||
118 | return false; |
||
119 | } |
||
120 | // this.tree.expandPath(elementPath.getParentPath());
|
||
121 | this.tree.setSelectionPath(elementPath);
|
||
122 | this.tree.scrollPathToVisible(elementPath);
|
||
123 | return true; |
||
124 | } |
||
125 | |||
126 | private boolean setSelectedStore(TreeModel model, List path, LabeledValue node, DataStoreParameters storeParams) { |
||
127 | if(node == null){ |
||
128 | return false; |
||
129 | } |
||
130 | Object value = node.getValue();
|
||
131 | if(value instanceof DataStoreParameters) { |
||
132 | DataStoreParameters nodeParams = (DataStoreParameters)value; |
||
133 | if(nodeParams.isTheSameStore(storeParams)){
|
||
134 | return true; |
||
135 | } |
||
136 | } |
||
137 | for (int i = 0; i < model.getChildCount(node); i++) { |
||
138 | LabeledValue child = (LabeledValue) model.getChild(node, i); |
||
139 | path.add(child); |
||
140 | if(setSelectedStore(model, path, child, storeParams)){
|
||
141 | return true; |
||
142 | } |
||
143 | path.remove(path.size()-1);
|
||
144 | } |
||
145 | return false; |
||
146 | } |
||
147 | |||
148 | 46575 | jjdelcerro | public FeatureStore getSelectedFeatureStore() {
|
149 | DataStore store = this.getSelectedStore();
|
||
150 | if( store instanceof FeatureStore ) { |
||
151 | return (FeatureStore) store;
|
||
152 | } |
||
153 | DisposeUtils.dispose(store); |
||
154 | return null; |
||
155 | } |
||
156 | |||
157 | private void configureToolTip(JTree repositoryTree) { |
||
158 | repositoryTree.addMouseMotionListener(new MouseMotionAdapter() { |
||
159 | @Override
|
||
160 | public void mouseMoved(MouseEvent e) { |
||
161 | super.mouseMoved(e);
|
||
162 | TreePath path = repositoryTree.getPathForLocation(e.getX(), e.getY());
|
||
163 | updateToolTip(repositoryTree, path); |
||
164 | } |
||
165 | }); |
||
166 | repositoryTree.addFocusListener(new FocusAdapter() { |
||
167 | @Override
|
||
168 | public void focusLost(FocusEvent e) { |
||
169 | // Tratamos de forzar que se oculte el tooltip si estuvise
|
||
170 | // mostrado o a punto de mostrarse.
|
||
171 | ToolTipManager toolTipManager = ToolTipManager.sharedInstance(); |
||
172 | toolTipManager.mouseExited(new MouseEvent(repositoryTree, 0, 0, 0, 0, 0, 0, true)); |
||
173 | } |
||
174 | }); |
||
175 | } |
||
176 | |||
177 | private void updateToolTip(JTree repositoryTree, TreePath path) { |
||
178 | if(path == null){ |
||
179 | repositoryTree.setToolTipText("");
|
||
180 | return;
|
||
181 | } |
||
182 | Object x = path.getLastPathComponent();
|
||
183 | if(!(x instanceof LabeledValue)){ |
||
184 | repositoryTree.setToolTipText("");
|
||
185 | return;
|
||
186 | } |
||
187 | LabeledValue element = (LabeledValue)x; |
||
188 | if (element.getValue() instanceof StoresRepository ) { |
||
189 | StoresRepository repository = (StoresRepository) element.getValue(); |
||
190 | String s = "<html>\n<b>"+repository.getLabel()+"</b><br>\nID: "+repository.getID()+"\n</html>"; |
||
191 | repositoryTree.setToolTipText(s); |
||
192 | |||
193 | } else if (element.getValue() instanceof DataStoreParameters ) { |
||
194 | DataStoreParameters paramsters = (DataStoreParameters) element.getValue(); |
||
195 | List<DynField> fields = Arrays.asList(paramsters.getDynClass().getDynFields()); |
||
196 | Collections.sort(fields, (DynField o1, DynField o2) -> StringUtils.compareIgnoreCase(o1.getName(),o2.getName()));
|
||
197 | StringBuilder s = new StringBuilder(); |
||
198 | s.append("<html>\n<b>");
|
||
199 | s.append(element.getLabel()); |
||
200 | s.append("</b><br>\n");
|
||
201 | for (DynField field : fields) {
|
||
202 | String value = Objects.toString(paramsters.getDynValue(field.getName()),null); |
||
203 | if( StringUtils.isNoneBlank(value)) {
|
||
204 | s.append(field.getName()); |
||
205 | s.append(": ");
|
||
206 | if( StringUtils.equalsIgnoreCase(field.getName(),PASSWORD_PARAMTER_NAME) ) {
|
||
207 | s.append("********");
|
||
208 | } else {
|
||
209 | s.append(value); |
||
210 | } |
||
211 | s.append("<br>\n");
|
||
212 | } |
||
213 | } |
||
214 | s.append("</html>");
|
||
215 | repositoryTree.setToolTipText(s.toString()); |
||
216 | |||
217 | } else {
|
||
218 | repositoryTree.setToolTipText("");
|
||
219 | } |
||
220 | } |
||
221 | |||
222 | } |