Statistics
| Revision:

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
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
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.JTree;
13
import javax.swing.ToolTipManager;
14
import javax.swing.event.TreeSelectionListener;
15
import javax.swing.text.Position;
16
import javax.swing.tree.TreeModel;
17
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
        this.tree.setExpandsSelectedPaths(true);
47

    
48
        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
//        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
        return store;
92
    }
93
    
94
    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
    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
}