Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.swing / org.gvsig.fmap.dal.swing.impl / src / main / java / org / gvsig / fmap / dal / swing / impl / storesrepository / StoresRepositoryControllerImpl.java @ 47562

History | View | Annotate | Download (11.7 KB)

1
package org.gvsig.fmap.dal.swing.impl.storesrepository;
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
import java.util.ArrayList;
8
import java.util.Arrays;
9
import java.util.Collections;
10
import java.util.List;
11
import java.util.Objects;
12
import javax.swing.Icon;
13
import javax.swing.JLabel;
14
import javax.swing.JTree;
15
import javax.swing.ToolTipManager;
16
import javax.swing.event.TreeSelectionListener;
17
import javax.swing.text.Position;
18
import javax.swing.tree.DefaultTreeCellRenderer;
19
import javax.swing.tree.TreeModel;
20
import javax.swing.tree.TreePath;
21
import org.apache.commons.lang3.StringUtils;
22
import org.gvsig.fmap.dal.DALLocator;
23
import org.gvsig.fmap.dal.DataManager;
24
import org.gvsig.fmap.dal.DataStore;
25
import org.gvsig.fmap.dal.DataStoreParameters;
26
import org.gvsig.fmap.dal.StoresRepository;
27
import org.gvsig.fmap.dal.feature.FeatureStore;
28
import static org.gvsig.fmap.dal.resource.db.DBParameters.PASSWORD_PARAMTER_NAME;
29
import org.gvsig.fmap.dal.swing.DALSwingLocator;
30
import org.gvsig.fmap.dal.swing.DataSwingManager;
31
import org.gvsig.fmap.dal.swing.storesrepository.StoresRepositoryController;
32
import org.gvsig.fmap.dal.swing.storesrepository.StoresRepositoryTreeModel.StoresRepositoryElement;
33
import org.gvsig.tools.dispose.DisposeUtils;
34
import org.gvsig.tools.dynobject.DynField;
35

    
36
/**
37
 *
38
 * @author jjdelcerro
39
 */
40
@SuppressWarnings("UseSpecificCatch")
41
public class StoresRepositoryControllerImpl implements StoresRepositoryController {
42
    
43
    private JTree tree;
44
    private final StoresRepository rootRepository;
45
    private boolean useGeometryIcons;
46
    
47
    public StoresRepositoryControllerImpl(JTree tree) {
48
        this(tree, DALLocator.getDataManager().getStoresRepository());
49
    }
50
    
51
    public StoresRepositoryControllerImpl(JTree tree, StoresRepository rootRepository) {
52
        this.tree = tree;
53
        this.tree.setExpandsSelectedPaths(true);
54
        this.useGeometryIcons = false;
55

    
56
        this.rootRepository = rootRepository;
57

    
58
        DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager();
59
        this.tree.setModel(dataSwingManager.createTreeModel(rootRepository));
60
        this.configureToolTip(this.tree);
61
        this.tree.setCellRenderer(new DefaultTreeCellRenderer() {
62
            @Override
63
            public java.awt.Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
64
                JLabel label = (JLabel) super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); //To change body of generated methods, choose Tools | Templates.
65
                if( useGeometryIcons ) {
66
                    Icon icon = getIconForItem(value);
67
                    setIcon(icon);
68
                }
69
                return label;
70
            }
71

    
72
        });        
73
        
74
    }
75
    
76
    @Override
77
    public void setUseGeometryIcons(boolean useGeometryIcons) {
78
        this.useGeometryIcons = useGeometryIcons;
79
    }
80
    
81
    @Override
82
    public boolean getUseGeometryIcons() {
83
        return this.useGeometryIcons;
84
    }
85
    
86
    public void addTreeSelectionListener(TreeSelectionListener tsl) {
87
        this.tree.addTreeSelectionListener(tsl);
88
    }
89

    
90
    @Override
91
    public DataStore getSelectedStore() {
92
        TreePath path = this.tree.getSelectionPath();
93
        if( path == null ) {
94
            return null;
95
        }
96
        StoresRepositoryElement element = (StoresRepositoryElement) path.getLastPathComponent();
97
        if( element == null ) {
98
            return null;
99
        }
100
        TreePath parentPath = path.getParentPath();
101
        if( parentPath == null ) {
102
            return null;
103
        }
104
        
105
        StoresRepositoryElement parentElement = (StoresRepositoryElement) parentPath.getLastPathComponent();
106
        if( !element.isStore() ) {
107
            return null;
108
        }
109
        if( !parentElement.isRepository() ) {
110
            return null;
111
        }
112
        StoresRepository repository = parentElement.getRepository();
113
//        DataStoreParameters storeParams = repository.get(element.getLabel());
114
        DataStore store;
115
        try {
116
//            store = DALLocator.getManager().openStore(storeParams.getProviderName(), storeParams);
117
            store = (DataStore) repository.getStore(element.getStoreName());
118
        } catch (Exception ex) {
119
            //FIXME
120
            store = null;
121
        }
122
        return store;
123
    }
124
    
125
    @Override
126
    public boolean setSelectedStore(FeatureStore store) {
127

    
128
        TreeModel model = this.tree.getModel();
129
        StoresRepositoryElement root = (StoresRepositoryElement) model.getRoot();
130
        List path = new ArrayList();
131
        if(!setSelectedStore(model, path, root, store.getParameters())) {
132
            return false;
133
        }
134

    
135
        int currentRow = 0;
136
        TreePath elementPath = null;
137
        for (int i = 0; i< path.size(); i++){
138
            StoresRepositoryElement element = (StoresRepositoryElement)path.get(i);
139
            elementPath = this.tree.getNextMatch(element.getLabel(), currentRow, Position.Bias.Forward);
140
            if(elementPath == null) {
141
                break;
142
            }
143
            this.tree.expandPath(elementPath);
144
            currentRow = this.tree.getRowForPath(elementPath);
145
            if(currentRow < 0){
146
                break;
147
            }
148
        }
149
        if(elementPath == null) {
150
            return false;
151
        }
152
//        this.tree.expandPath(elementPath.getParentPath());
153
        this.tree.setSelectionPath(elementPath);
154
        this.tree.scrollPathToVisible(elementPath);
155
        return true;
156
    }
157

    
158
    @Override
159
    public boolean setSelectedStore(String storeName) {
160
        if( StringUtils.isBlank(storeName) ) {
161
            this.tree.clearSelection();
162
            return true;
163
        }
164
        DataStoreParameters params = this.rootRepository.get(storeName);
165
        
166
        TreeModel model = this.tree.getModel();
167
        StoresRepositoryElement root = (StoresRepositoryElement) model.getRoot();
168
        List path = new ArrayList();
169
        if(!setSelectedStore(model, path, root, params)) {
170
            return false;
171
        }
172

    
173
        int currentRow = 0;
174
        TreePath elementPath = null;
175
        for (int i = 0; i< path.size(); i++){
176
            StoresRepositoryElement element = (StoresRepositoryElement)path.get(i);
177
            elementPath = this.tree.getNextMatch(element.getLabel(), currentRow, Position.Bias.Forward);
178
            if(elementPath == null) {
179
                break;
180
            }
181
            this.tree.expandPath(elementPath);
182
            currentRow = this.tree.getRowForPath(elementPath);
183
            if(currentRow < 0){
184
                break;
185
            }
186
        }
187
        if(elementPath == null) {
188
            return false;
189
        }
190
//        this.tree.expandPath(elementPath.getParentPath());
191
        this.tree.setSelectionPath(elementPath);
192
        this.tree.scrollPathToVisible(elementPath);
193
        return true;
194
    }
195

    
196
    private boolean setSelectedStore(TreeModel model, List path, StoresRepositoryElement node, DataStoreParameters storeParams) {
197
        if(node == null){
198
            return false;
199
        }
200
        if( node.isStore()) {
201
            if(node.getStoreParameters().isTheSameStore(storeParams)){
202
                return true;
203
            }
204
        }
205
        for (int i = 0; i < model.getChildCount(node); i++) {
206
            StoresRepositoryElement child = (StoresRepositoryElement) model.getChild(node, i);
207
            path.add(child);
208
            if(setSelectedStore(model, path, child, storeParams)){
209
                return true;
210
            }
211
            path.remove(path.size()-1);
212
        }
213
        return false;
214
    }
215
    
216
    @Override
217
    public FeatureStore getSelectedFeatureStore() {
218
        DataStore store = this.getSelectedStore();
219
        if( store instanceof FeatureStore ) {
220
            return (FeatureStore) store;
221
        }
222
        DisposeUtils.dispose(store);
223
        return null;
224
    }
225
    
226
    private void configureToolTip(JTree repositoryTree) {
227
        repositoryTree.addMouseMotionListener(new MouseMotionAdapter() {
228
            @Override
229
            public void mouseMoved(MouseEvent e) {
230
                super.mouseMoved(e); 
231
                TreePath path = repositoryTree.getPathForLocation(e.getX(), e.getY());
232
                updateToolTip(repositoryTree, path);
233
            }
234
        });
235
        repositoryTree.addFocusListener(new FocusAdapter() {
236
            @Override
237
            public void focusLost(FocusEvent e) {
238
                // Tratamos de forzar que se oculte el tooltip si estuvise
239
                // mostrado o a punto de mostrarse.
240
                ToolTipManager toolTipManager = ToolTipManager.sharedInstance();    
241
                toolTipManager.mouseExited(new MouseEvent(repositoryTree, 0, 0, 0, 0, 0, 0, true));
242
            }
243
        });
244
    }
245

    
246
    private void updateToolTip(JTree repositoryTree, TreePath path) {
247
        if(path == null){
248
            repositoryTree.setToolTipText("");
249
            return;
250
        }
251
        Object x = path.getLastPathComponent();
252
        if(!(x instanceof StoresRepositoryElement)){
253
            repositoryTree.setToolTipText("");
254
            return;
255
        }
256
        StoresRepositoryElement element = (StoresRepositoryElement) x;
257
        if ( element.isRepository() ) {
258
            StoresRepository repository = (StoresRepository) element.getValue();            
259
            String s = "<html>\n<b>"+repository.getLabel()+"</b><br>\nID: "+repository.getID()+"\n</html>";
260
            repositoryTree.setToolTipText(s);
261
            
262
        } else if ( element.isStore() ) {
263
//            DataStoreParameters paramsters = (DataStoreParameters) element.getValue();
264
            List<DynField> fields = Arrays.asList(element.getStoreParameters().getDynClass().getDynFields());
265
            Collections.sort(fields, (DynField o1, DynField o2) -> StringUtils.compareIgnoreCase(o1.getName(),o2.getName()));
266
            StringBuilder s = new StringBuilder();
267
            s.append("<html>\n<b>");
268
            s.append(element.getLabel());
269
            s.append("</b><br>\n");
270
            for (DynField field : fields) {
271
                String value = Objects.toString(element.getStoreParameters().getDynValue(field.getName()),null);
272
                if( StringUtils.isNoneBlank(value)) {
273
                    s.append(field.getName());
274
                    s.append(": ");
275
                    if( StringUtils.equalsIgnoreCase(field.getName(),PASSWORD_PARAMTER_NAME) ) {
276
                        s.append("********");
277
                    } else {
278
                        s.append(value);
279
                    }
280
                    s.append("<br>\n");
281
                }
282
            }
283
            s.append("</html>");
284
            repositoryTree.setToolTipText(s.toString());
285
            
286
        } else {
287
            repositoryTree.setToolTipText("");
288
        }
289
    }
290
    
291
    @Override
292
    public void setEnabled(boolean enabled) {
293
        this.tree.setEnabled(enabled);
294
    }
295
    
296
    private Icon getIconForItem(Object item0) {
297
        StoresRepositoryElement item = (StoresRepositoryElement) item0;
298
        if ( item.isStore()) {
299
            FeatureStore store = null;
300
            try {
301
                DataManager dataManager = DALLocator.getDataManager();
302
                DataSwingManager dataSwingManager = DALSwingLocator.getDataSwingManager();
303
                store = (FeatureStore) dataManager.openStore(item.getStoreParameters().getProviderName(), item.getStoreParameters());
304
                Icon icon = dataSwingManager.getStoreGeometryIcon(store);
305
                return icon;
306
            } catch(Exception ex) {
307
//                LOGGER.trace("Can't get geometry type from store.", ex);
308
            } finally {
309
                DisposeUtils.disposeQuietly(store);
310
            }
311
        } 
312
        return null;
313
    }
314

    
315
}