svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.geodb.app / org.gvsig.geodb.app.mainplugin / src / main / java / org / gvsig / geodb / AbstractWizardDB.java @ 45672
History | View | Annotate | Download (10.8 KB)
1 | 44533 | jjdelcerro | package org.gvsig.geodb; |
---|---|---|---|
2 | |||
3 | import java.awt.BorderLayout; |
||
4 | import java.awt.Dimension; |
||
5 | import java.util.ArrayList; |
||
6 | import java.util.Collection; |
||
7 | import java.util.HashMap; |
||
8 | import java.util.List; |
||
9 | import java.util.Map; |
||
10 | import javax.swing.DefaultListModel; |
||
11 | import javax.swing.ListSelectionModel; |
||
12 | import javax.swing.event.ChangeEvent; |
||
13 | 45670 | fdiaz | import javax.swing.event.ChangeListener; |
14 | 44533 | jjdelcerro | import javax.swing.event.ListSelectionEvent; |
15 | import org.gvsig.app.gui.WizardPanel; |
||
16 | import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingLocator; |
||
17 | import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager; |
||
18 | import org.gvsig.fmap.dal.DALLocator; |
||
19 | import org.gvsig.fmap.dal.DataManager; |
||
20 | 45627 | fdiaz | import static org.gvsig.fmap.dal.DataServerExplorer.MODE_ALL; |
21 | 44533 | jjdelcerro | import org.gvsig.fmap.dal.DataStoreParameters; |
22 | import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters; |
||
23 | import org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters; |
||
24 | 45627 | fdiaz | import org.gvsig.fmap.dal.store.jdbc2.JDBCServerExplorer; |
25 | import static org.gvsig.fmap.dal.store.jdbc2.JDBCServerExplorer.SHOW_TABLES; |
||
26 | import static org.gvsig.fmap.dal.store.jdbc2.JDBCServerExplorer.SHOW_VIEWS; |
||
27 | 44533 | jjdelcerro | import org.gvsig.fmap.dal.swing.DALSwingLocator; |
28 | import org.gvsig.fmap.dal.swing.DataSwingManager; |
||
29 | import org.gvsig.tools.ToolsLocator; |
||
30 | 45440 | fdiaz | import org.gvsig.tools.dispose.DisposeUtils; |
31 | 44533 | jjdelcerro | import org.gvsig.tools.i18n.I18nManager; |
32 | 45062 | jjdelcerro | import org.gvsig.tools.swing.api.FilteredListController; |
33 | 44533 | jjdelcerro | import org.gvsig.tools.swing.api.JListWithCheckbox; |
34 | import org.gvsig.tools.swing.api.ToolsSwingLocator; |
||
35 | import org.gvsig.tools.swing.api.ToolsSwingManager; |
||
36 | 45672 | jjdelcerro | import org.gvsig.tools.swing.api.ToolsSwingUtils; |
37 | 44533 | jjdelcerro | import org.gvsig.tools.swing.api.pickercontroller.PickerController; |
38 | import org.slf4j.Logger; |
||
39 | import org.slf4j.LoggerFactory; |
||
40 | |||
41 | /**
|
||
42 | *
|
||
43 | * @author jjdelcerro
|
||
44 | */
|
||
45 | 45062 | jjdelcerro | @SuppressWarnings("UseSpecificCatch") |
46 | 44533 | jjdelcerro | public abstract class AbstractWizardDB extends WizardPanel { |
47 | |||
48 | protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractWizardDB.class); |
||
49 | |||
50 | 45059 | jjdelcerro | |
51 | 45634 | fdiaz | protected AbstractWizardDBView view;
|
52 | 44533 | jjdelcerro | private PickerController<JDBCServerExplorerParameters> pickerConnection;
|
53 | 45634 | fdiaz | protected JListWithCheckbox lwcTables;
|
54 | protected Map<String, TableInfo> tablesInfo = null; |
||
55 | protected FilteredListController tablesFilterController;
|
||
56 | protected TableInfoController tableInfoController;
|
||
57 | 45062 | jjdelcerro | |
58 | 45634 | fdiaz | |
59 | 44533 | jjdelcerro | public AbstractWizardDB() {
|
60 | initComponents(); |
||
61 | } |
||
62 | |||
63 | private void initComponents() { |
||
64 | DataSwingManager dataSwingManager = DALSwingLocator.getDataSwingManager(); |
||
65 | ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager(); |
||
66 | ExpressionEvaluatorSwingManager expressionSwingManager = ExpressionEvaluatorSwingLocator.getManager(); |
||
67 | |||
68 | this.view = new AbstractWizardDBView(); |
||
69 | |||
70 | toolsSwingManager.translate(this.view.lblColumns);
|
||
71 | toolsSwingManager.translate(this.view.lblConnection);
|
||
72 | toolsSwingManager.translate(this.view.lblFilter);
|
||
73 | toolsSwingManager.translate(this.view.lblGeometryField);
|
||
74 | toolsSwingManager.translate(this.view.lblIdField);
|
||
75 | toolsSwingManager.translate(this.view.lblName);
|
||
76 | toolsSwingManager.translate(this.view.lblProjection);
|
||
77 | toolsSwingManager.translate(this.view.lblTable);
|
||
78 | |||
79 | toolsSwingManager.addClearButton(this.view.txtName);
|
||
80 | toolsSwingManager.setDefaultPopupMenu(this.view.txtName);
|
||
81 | |||
82 | this.lwcTables = toolsSwingManager.createJListWithCheckbox(
|
||
83 | this.view.lstTables
|
||
84 | ); |
||
85 | |||
86 | 45062 | jjdelcerro | this.lwcTables.addListSelectionListener((ListSelectionEvent e) -> { |
87 | doChangeTableSelected(); |
||
88 | 44533 | jjdelcerro | }); |
89 | 45634 | fdiaz | |
90 | this.initializePickerConnection();
|
||
91 | |||
92 | 45062 | jjdelcerro | this.lwcTables.addChecksListener((ListSelectionEvent e) -> { |
93 | 45634 | fdiaz | doChangeTableChecked(e.getFirstIndex(), e.getLastIndex()); |
94 | 44533 | jjdelcerro | }); |
95 | 45634 | fdiaz | |
96 | 45062 | jjdelcerro | this.tablesFilterController = toolsSwingManager.createFilteredListController(
|
97 | this.view.lstTables,
|
||
98 | this.view.txtTablesFilter,
|
||
99 | this.view.btnTablesFilter
|
||
100 | ); |
||
101 | 45634 | fdiaz | |
102 | this.tableInfoController = new TableInfoController( |
||
103 | this.view.btnDeselectAllColumns,
|
||
104 | this.view.btnSelectAllColumns,
|
||
105 | this.view.lstColumns,
|
||
106 | this.view.txtName,
|
||
107 | this.view.cboIdField,
|
||
108 | this.view.cboGeometryField,
|
||
109 | this.view.txtProjection,
|
||
110 | this.view.btnProjection,
|
||
111 | this.view.txtFilter,
|
||
112 | this.view.btnFilter,
|
||
113 | this.view.btnFilterBookmarks,
|
||
114 | this.view.btnFilterHistory,
|
||
115 | this.view.btnAdvancedProperties,
|
||
116 | 45650 | jjdelcerro | this.view.lblReadOnlyNotification,
|
117 | this.view.pnlCfgActions
|
||
118 | 45634 | fdiaz | ); |
119 | 45670 | fdiaz | |
120 | this.tableInfoController.addChangeListener(new ChangeListener() { |
||
121 | @Override
|
||
122 | public void stateChanged(ChangeEvent e) { |
||
123 | checkFinishable(); |
||
124 | } |
||
125 | }); |
||
126 | 44533 | jjdelcerro | |
127 | this.clearTables();
|
||
128 | this.setEditableTables(false); |
||
129 | |||
130 | this.setLayout(new BorderLayout()); |
||
131 | this.add(this.view, BorderLayout.CENTER); |
||
132 | 45672 | jjdelcerro | // this.setPreferredSize(new Dimension(500, 400));
|
133 | this.setPreferredSize(ToolsSwingUtils.ensureRowsCols(this, 30, 80)); |
||
134 | 44533 | jjdelcerro | } |
135 | 45634 | fdiaz | |
136 | private void initializePickerConnection() { |
||
137 | DataSwingManager dataSwingManager = DALSwingLocator.getDataSwingManager(); |
||
138 | this.pickerConnection = dataSwingManager.createJDBCConnectionPickerController(
|
||
139 | this.view.cboConnection,
|
||
140 | this.view.btnConnection
|
||
141 | ); |
||
142 | this.pickerConnection.addChangeListener((ChangeEvent e) -> { |
||
143 | doUpdateTables(); |
||
144 | setEditableTables(true);
|
||
145 | }); |
||
146 | } |
||
147 | 44533 | jjdelcerro | |
148 | protected abstract boolean requireGeometry(); |
||
149 | |||
150 | protected Collection<TableInfo> getTablesInformation() { |
||
151 | 45008 | omartinez | this.updateTableInfoFromUI();
|
152 | 44533 | jjdelcerro | if( this.tablesInfo == null ) { |
153 | this.tablesInfo = new HashMap<>(); |
||
154 | } |
||
155 | return this.tablesInfo.values(); |
||
156 | } |
||
157 | |||
158 | private void clearTables() { |
||
159 | this.lwcTables.setModel(new DefaultListModel()); |
||
160 | this.lwcTables.getCheckedModel().clearSelection();
|
||
161 | this.clearTableConfig();
|
||
162 | } |
||
163 | |||
164 | private void clearTableConfig() { |
||
165 | 45634 | fdiaz | this.tableInfoController.put(null); |
166 | 44533 | jjdelcerro | } |
167 | |||
168 | private void setEditableTables(boolean enable) { |
||
169 | this.view.lstTables.setEnabled(enable);
|
||
170 | 45634 | fdiaz | this.tableInfoController.setEditable(enable);
|
171 | 44533 | jjdelcerro | } |
172 | |||
173 | private void doUpdateTables() { |
||
174 | JDBCServerExplorerParameters connection = this.pickerConnection.get();
|
||
175 | if (connection == null) { |
||
176 | this.clearTables();
|
||
177 | return;
|
||
178 | } |
||
179 | DataManager dataManager = DALLocator.getDataManager(); |
||
180 | 45627 | fdiaz | JDBCServerExplorer explorer = null;
|
181 | 44533 | jjdelcerro | try {
|
182 | 45627 | fdiaz | explorer = (JDBCServerExplorer) dataManager.openServerExplorer( |
183 | 44533 | jjdelcerro | connection.getDataStoreName(), |
184 | connection |
||
185 | ); |
||
186 | List<TableInfo> parameters = new ArrayList<>(); |
||
187 | 45627 | fdiaz | for (DataStoreParameters params : explorer.list(MODE_ALL, SHOW_TABLES)) {
|
188 | 45634 | fdiaz | JDBCStoreParameters jdbcParams = (JDBCStoreParameters) params; |
189 | parameters.add(new TableInfo(jdbcParams.getTable(), jdbcParams, requireGeometry(), false)); |
||
190 | 44533 | jjdelcerro | } |
191 | 45627 | fdiaz | for (DataStoreParameters params : explorer.list(MODE_ALL, SHOW_VIEWS)) {
|
192 | 45634 | fdiaz | JDBCStoreParameters jdbcParams = (JDBCStoreParameters) params; |
193 | parameters.add(new TableInfo(jdbcParams.getTable(), jdbcParams, requireGeometry(), true)); |
||
194 | 45627 | fdiaz | } |
195 | 45062 | jjdelcerro | parameters.sort((TableInfo o1, TableInfo o2) -> |
196 | o1.getLabel().compareTo(o2.getLabel()) |
||
197 | ); |
||
198 | 44533 | jjdelcerro | this.tablesInfo = new HashMap<>(); |
199 | DefaultListModel<TableInfo> model = new DefaultListModel<>(); |
||
200 | for (TableInfo x : parameters) {
|
||
201 | model.addElement(x); |
||
202 | this.tablesInfo.put(x.getDocumentName(), x);
|
||
203 | } |
||
204 | this.lwcTables.setModel(model);
|
||
205 | this.lwcTables.getCheckedModel().clearSelection();
|
||
206 | } catch (Exception ex) { |
||
207 | 45440 | fdiaz | } finally {
|
208 | DisposeUtils.disposeQuietly(explorer); |
||
209 | 44533 | jjdelcerro | } |
210 | } |
||
211 | |||
212 | private void doChangeTableSelected() { |
||
213 | TableInfo tableInfo = (TableInfo) this.lwcTables.getSelectedValue();
|
||
214 | if (tableInfo == null) { |
||
215 | this.clearTableConfig();
|
||
216 | 45634 | fdiaz | this.tableInfoController.setEditable(false); |
217 | 44533 | jjdelcerro | return;
|
218 | } |
||
219 | 45008 | omartinez | this.updateTableInfoFromUI();
|
220 | 45634 | fdiaz | this.tableInfoController.put(tableInfo);
|
221 | } |
||
222 | |||
223 | private void doChangeTableChecked(int firstIndex, int lastIndex) { |
||
224 | ListSelectionModel checkedModel = this.lwcTables.getCheckedModel(); |
||
225 | for (int i = firstIndex; i <= lastIndex; i++) { |
||
226 | TableInfo tableInfo = (TableInfo) this.lwcTables.getModel().getElementAt(i);
|
||
227 | tableInfo.setSelected(checkedModel.isSelectedIndex(i)); |
||
228 | } |
||
229 | 44533 | jjdelcerro | this.checkFinishable();
|
230 | } |
||
231 | 45008 | omartinez | |
232 | private void updateTableInfoFromUI() { |
||
233 | 45634 | fdiaz | String previousId = this.tableInfoController.getId(); |
234 | if (previousId == null) { |
||
235 | return;
|
||
236 | 45008 | omartinez | } |
237 | 44533 | jjdelcerro | |
238 | 45634 | fdiaz | if (this.tablesInfo != null && !this.tablesInfo.isEmpty()) { |
239 | TableInfo previousInfo = this.tablesInfo.get(previousId);
|
||
240 | if (previousInfo != null) { |
||
241 | this.tableInfoController.fetch(previousInfo);
|
||
242 | } |
||
243 | 45627 | fdiaz | } |
244 | 44533 | jjdelcerro | } |
245 | |||
246 | |||
247 | @Override
|
||
248 | public void initWizard() { |
||
249 | I18nManager i18n = ToolsLocator.getI18nManager(); |
||
250 | setTabName(i18n.getTranslation("_Database"));
|
||
251 | } |
||
252 | |||
253 | @Override
|
||
254 | public boolean areSettingsValid() { |
||
255 | boolean hasInvalidValues = false; |
||
256 | boolean hasSelectedTables = false; |
||
257 | for (TableInfo tableInfo : this.getTablesInformation() ) { |
||
258 | if (tableInfo.isSelected()) {
|
||
259 | hasSelectedTables = true;
|
||
260 | if (!tableInfo.hasValidValues()) {
|
||
261 | hasInvalidValues = true;
|
||
262 | } |
||
263 | } |
||
264 | } |
||
265 | return hasSelectedTables && !hasInvalidValues;
|
||
266 | } |
||
267 | |||
268 | @Override
|
||
269 | public DataStoreParameters[] getParameters() { |
||
270 | int sz = 0; |
||
271 | for (TableInfo tableInfo : this.getTablesInformation() ) { |
||
272 | if( tableInfo.isSelected() ) {
|
||
273 | sz++; |
||
274 | } |
||
275 | } |
||
276 | if( sz == 0 ) { |
||
277 | return null; |
||
278 | } |
||
279 | DataStoreParameters[] dbParameters = new DataStoreParameters[sz]; |
||
280 | int n = 0; |
||
281 | for (TableInfo tableInfo : this.getTablesInformation() ) { |
||
282 | if( tableInfo.isSelected() ) {
|
||
283 | dbParameters[n++] = tableInfo.getParameters(); |
||
284 | } |
||
285 | } |
||
286 | return dbParameters;
|
||
287 | } |
||
288 | |||
289 | @Override
|
||
290 | public void execute() { |
||
291 | executeWizard(); |
||
292 | } |
||
293 | |||
294 | @Override
|
||
295 | public void close() { |
||
296 | |||
297 | } |
||
298 | |||
299 | protected void checkFinishable() { |
||
300 | boolean finishable = areSettingsValid();
|
||
301 | callStateChanged(finishable); |
||
302 | } |
||
303 | |||
304 | } |