1 /*
2 / Wfs.cpp
3 / WFS load data
4 /
5 / version 1.7, 2013 May 8
6 /
7 / Author: Sandro Furieri a-furieri@lqt.it
8 /
9 / Copyright (C) 2008-2013 Alessandro Furieri
10 /
11 / This program is free software: you can redistribute it and/or modify
12 / it under the terms of the GNU General Public License as published by
13 / the Free Software Foundation, either version 3 of the License, or
14 / (at your option) any later version.
15 /
16 / This program is distributed in the hope that it will be useful,
17 / but WITHOUT ANY WARRANTY; without even the implied warranty of
18 / MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 / GNU General Public License for more details.
20 /
21 / You should have received a copy of the GNU General Public License
22 / along with this program. If not, see <http://www.gnu.org/licenses/>.
23 /
24 */
25
26 #include "Classdef.h"
27
28 #include "wx/clipbrd.h"
29
Create(MyFrame * parent)30 bool WfsDialog::Create(MyFrame * parent)
31 {
32 //
33 // creating the dialog
34 //
35 MainFrame = parent;
36 if (wxDialog::Create(parent, wxID_ANY, wxT("Load data from WFS datasource"))
37 == false)
38 return false;
39 CurrentEvtRow = -1;
40 CurrentEvtColumn = -1;
41 // populates individual controls
42 CreateControls();
43 // sets dialog sizer
44 GetSizer()->Fit(this);
45 GetSizer()->SetSizeHints(this);
46 // centers the dialog window
47 Centre();
48 ProgressTimer = new wxTimer(this, ID_WFS_TIMER);
49 ProgressTimer->Stop();
50 return true;
51 }
52
CreateControls()53 void WfsDialog::CreateControls()
54 {
55 //
56 // creating individual control and setting initial values
57 //
58 wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
59 this->SetSizer(topSizer);
60 wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
61 topSizer->Add(boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
62 // URL group box
63 wxStaticBox *urlBox = new wxStaticBox(this, wxID_STATIC,
64 wxT("WFS URL - GetCapabilities"),
65 wxDefaultPosition,
66 wxDefaultSize);
67 wxBoxSizer *urlBoxSizer = new wxStaticBoxSizer(urlBox, wxVERTICAL);
68 boxSizer->Add(urlBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
69 // First row: GetCapabilities URL
70 wxBoxSizer *urlSizer = new wxBoxSizer(wxVERTICAL);
71 urlBoxSizer->Add(urlSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
72 wxTextCtrl *urlCtrl = new wxTextCtrl(this, ID_WFS_URL, wxT("http://"),
73 wxDefaultPosition, wxSize(680, 22));
74 urlSizer->Add(urlCtrl, 0, wxALIGN_RIGHT | wxALL, 5);
75 // command buttons
76 wxBoxSizer *url2Sizer = new wxBoxSizer(wxHORIZONTAL);
77 urlSizer->Add(url2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
78 wxStaticBox *catBox = new wxStaticBox(this, wxID_STATIC,
79 wxT("WFS Catalog"),
80 wxDefaultPosition,
81 wxDefaultSize);
82 wxBoxSizer *catBoxSizer = new wxStaticBoxSizer(catBox, wxVERTICAL);
83 url2Sizer->Add(catBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
84 wxBoxSizer *okCancelBox = new wxBoxSizer(wxHORIZONTAL);
85 catBoxSizer->Add(okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
86 wxButton *query = new wxButton(this, ID_WFS_CATALOG, wxT("&Load"));
87 okCancelBox->Add(query, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
88 wxButton *reset = new wxButton(this, ID_WFS_RESET, wxT("&Reset"));
89 reset->Enable(false);
90 okCancelBox->Add(reset, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
91 wxButton *quit = new wxButton(this, wxID_CANCEL, wxT("&Quit"));
92 okCancelBox->Add(quit, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
93 // Keywords group box
94 wxStaticBox *keyBox = new wxStaticBox(this, wxID_STATIC,
95 wxT("Filter WFS Layers by Keyword"),
96 wxDefaultPosition,
97 wxDefaultSize);
98 wxBoxSizer *keyBoxSizer = new wxStaticBoxSizer(keyBox, wxVERTICAL);
99 url2Sizer->Add(keyBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
100 wxBoxSizer *keySizer = new wxBoxSizer(wxHORIZONTAL);
101 keyBoxSizer->Add(keySizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
102 wxComboBox *keyList =
103 new wxComboBox(this, ID_WFS_KEYWORD, wxT(""), wxDefaultPosition,
104 wxSize(200, 21), 0, NULL,
105 wxCB_DROPDOWN);
106 keyList->Enable(false);
107 keySizer->Add(keyList, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
108 wxButton *filter = new wxButton(this, ID_WFS_KEYFILTER, wxT("&Apply"));
109 filter->Enable(false);
110 keySizer->Add(filter, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
111 wxButton *keyReset = new wxButton(this, ID_WFS_KEYRESET, wxT("&Reset"));
112 keyReset->Enable(false);
113 keySizer->Add(keyReset, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
114 // the Catalog Grid
115 wxBoxSizer *gridSizer = new wxBoxSizer(wxHORIZONTAL);
116 boxSizer->Add(gridSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
117 WfsView = new wxGrid(this, wxID_ANY, wxPoint(5, 5), wxSize(700, 250));
118 WfsView->CreateGrid(1, 3);
119 WfsView->EnableEditing(false);
120 WfsView->SetColLabelValue(0, wxT("Name"));
121 WfsView->SetColLabelValue(1, wxT("Title"));
122 WfsView->SetColLabelValue(2, wxT("Abstract"));
123 gridSizer->Add(WfsView, 0, wxALIGN_RIGHT | wxALL, 5);
124 // seleted Layer group box
125 wxStaticBox *lyrBox = new wxStaticBox(this, wxID_STATIC,
126 wxT("Selected WFS Layer"),
127 wxDefaultPosition,
128 wxDefaultSize);
129 wxBoxSizer *lyrBoxSizer = new wxStaticBoxSizer(lyrBox, wxVERTICAL);
130 boxSizer->Add(lyrBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
131 // First row: WFS options
132 wxBoxSizer *wfsSizer = new wxBoxSizer(wxHORIZONTAL);
133 lyrBoxSizer->Add(wfsSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
134 wxString ver[2];
135 ver[0] = wxT("WFS &1.0.0");
136 ver[1] = wxT("WFS &1.1.0");
137 wxRadioBox *versionBox = new wxRadioBox(this, ID_WFS_VERSION,
138 wxT("WFS &Version"),
139 wxDefaultPosition,
140 wxDefaultSize, 2,
141 ver, 2,
142 wxRA_SPECIFY_ROWS);
143 versionBox->Enable(false);
144 versionBox->SetSelection(1);
145 wfsSizer->Add(versionBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
146 wxString mode[2];
147 mode[0] = wxT("&single WFS request");
148 mode[1] = wxT("&using WFS paging");
149 wxRadioBox *pagingBox = new wxRadioBox(this, ID_WFS_PAGING,
150 wxT("WFS &request"),
151 wxDefaultPosition,
152 wxDefaultSize, 2,
153 mode, 2,
154 wxRA_SPECIFY_ROWS);
155 pagingBox->Enable(false);
156 pagingBox->SetSelection(0);
157 wfsSizer->Add(pagingBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
158 wxStaticBox *pageBox = new wxStaticBox(this, ID_WFS_PAGE,
159 wxT("Monolithic WFS Request"),
160 wxDefaultPosition,
161 wxDefaultSize);
162 wxBoxSizer *pageBoxSizer = new wxStaticBoxSizer(pageBox, wxHORIZONTAL);
163 wfsSizer->Add(pageBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
164 wxStaticText *maxLabel =
165 new wxStaticText(this, ID_WFS_LABEL, wxT("Max &Features limit:"),
166 wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);
167 pageBoxSizer->Add(maxLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
168 wxTextCtrl *maxCtrl = new wxTextCtrl(this, ID_WFS_MAX, wxT("-1"),
169 wxDefaultPosition, wxSize(60, 22),
170 wxTE_RIGHT);
171 maxCtrl->Enable(false);
172 pageBoxSizer->Add(maxCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
173 wxStaticBox *swapBox = new wxStaticBox(this, wxID_ANY,
174 wxT("Swap Axes"),
175 wxDefaultPosition,
176 wxDefaultSize);
177 wxBoxSizer *swapBoxSizer = new wxStaticBoxSizer(swapBox, wxHORIZONTAL);
178 wfsSizer->Add(swapBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
179 wxCheckBox *swapCtrl = new wxCheckBox(this, ID_WFS_SWAP,
180 wxT("Swap Y,X"),
181 wxDefaultPosition, wxDefaultSize);
182 swapCtrl->SetValue(false);
183 swapCtrl->Enable(false);
184 swapBoxSizer->Add(swapCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
185 // Second row: Layer and Srid
186 wxBoxSizer *nameSizer = new wxBoxSizer(wxHORIZONTAL);
187 lyrBoxSizer->Add(nameSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
188 wxStaticText *nameLabel =
189 new wxStaticText(this, wxID_STATIC, wxT("WFS &Name:"));
190 nameSizer->Add(nameLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
191 wxTextCtrl *nameCtrl = new wxTextCtrl(this, ID_WFS_NAME, wxT(""),
192 wxDefaultPosition, wxSize(400, 22),
193 wxTE_READONLY);
194 nameSizer->Add(nameCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
195 wxStaticText *sridLabel = new wxStaticText(this, wxID_STATIC, wxT("&SRID:"));
196 nameSizer->Add(sridLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
197 wxComboBox *sridList =
198 new wxComboBox(this, ID_WFS_SRID, wxT(""), wxDefaultPosition,
199 wxSize(100, 21), 0, NULL, wxCB_DROPDOWN | wxCB_READONLY);
200 sridList->Enable(false);
201 nameSizer->Add(sridList, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
202 // third row: extra URL args
203 wxBoxSizer *extraSizer = new wxBoxSizer(wxHORIZONTAL);
204 lyrBoxSizer->Add(extraSizer, 0, wxALIGN_LEFT | wxALL, 0);
205 wxStaticText *extraLabel =
206 new wxStaticText(this, wxID_STATIC, wxT("&URL extra options:"));
207 extraSizer->Add(extraLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
208 wxTextCtrl *extraCtrl = new wxTextCtrl(this, ID_WFS_EXTRA, wxT(""),
209 wxDefaultPosition, wxSize(550, 22));
210 extraCtrl->Enable(false);
211 extraSizer->Add(extraCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
212 // fourth row: DB Table [target]
213 wxBoxSizer *dbSizer = new wxBoxSizer(wxHORIZONTAL);
214 lyrBoxSizer->Add(dbSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
215 wxStaticText *tableLabel =
216 new wxStaticText(this, wxID_STATIC, wxT("&Table:"));
217 dbSizer->Add(tableLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
218 wxTextCtrl *tableCtrl = new wxTextCtrl(this, ID_WFS_TABLE, wxT(""),
219 wxDefaultPosition, wxSize(150, 22));
220 tableCtrl->Enable(false);
221 dbSizer->Add(tableCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
222 wxStaticText *pkLabel =
223 new wxStaticText(this, wxID_STATIC, wxT("Primary &Key:"));
224 dbSizer->Add(pkLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
225 wxComboBox *pkList =
226 new wxComboBox(this, ID_WFS_PK, wxT(""), wxDefaultPosition,
227 wxSize(250, 21), 0, NULL, wxCB_DROPDOWN);
228 pkList->Enable(false);
229 dbSizer->Add(pkList, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
230 wxCheckBox *rtreeCtrl = new wxCheckBox(this, ID_WFS_RTREE,
231 wxT("Spatial Index"),
232 wxDefaultPosition, wxDefaultSize);
233 rtreeCtrl->SetValue(false);
234 rtreeCtrl->Enable(false);
235 dbSizer->Add(rtreeCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
236 // fifth row: status and start button
237 wxBoxSizer *statusSizer = new wxBoxSizer(wxHORIZONTAL);
238 lyrBoxSizer->Add(statusSizer, 0, wxALIGN_LEFT | wxALL, 0);
239 wxButton *load = new wxButton(this, ID_WFS_LOAD, wxT("&Load data"));
240 load->Enable(false);
241 statusSizer->Add(load, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
242 Progress =
243 new wxGauge(this, wxID_ANY, 20, wxDefaultPosition, wxSize(200, 21));
244 statusSizer->Add(Progress, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
245 wxStaticText *statusLabel = new wxStaticText(this, ID_WFS_STATUS, wxT(""),
246 wxDefaultPosition, wxSize(300,
247 21));
248 statusSizer->Add(statusLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
249 // appends event handlers
250 Connect(wxID_ANY, wxEVT_GRID_CELL_LEFT_CLICK,
251 (wxObjectEventFunction) & WfsDialog::OnLeftClick);
252 Connect(wxID_ANY, wxEVT_GRID_CELL_RIGHT_CLICK,
253 (wxObjectEventFunction) & WfsDialog::OnRightClick);
254 Connect(ID_WFS_PAGING, wxEVT_COMMAND_RADIOBOX_SELECTED,
255 (wxObjectEventFunction) & WfsDialog::OnPagingChanged);
256 Connect(ID_WFS_CATALOG, wxEVT_COMMAND_BUTTON_CLICKED,
257 (wxObjectEventFunction) & WfsDialog::OnCatalog);
258 Connect(ID_WFS_RESET, wxEVT_COMMAND_BUTTON_CLICKED,
259 (wxObjectEventFunction) & WfsDialog::OnReset);
260 Connect(ID_WFS_KEYFILTER, wxEVT_COMMAND_BUTTON_CLICKED,
261 (wxObjectEventFunction) & WfsDialog::OnKeyFilter);
262 Connect(ID_WFS_KEYRESET, wxEVT_COMMAND_BUTTON_CLICKED,
263 (wxObjectEventFunction) & WfsDialog::OnKeyReset);
264 Connect(ID_WFS_LOAD, wxEVT_COMMAND_BUTTON_CLICKED,
265 (wxObjectEventFunction) & WfsDialog::OnLoadFromWfs);
266 Connect(wxID_CANCEL, wxEVT_COMMAND_BUTTON_CLICKED,
267 (wxObjectEventFunction) & WfsDialog::OnQuit);
268 Connect(Wfs_Copy, wxEVT_COMMAND_MENU_SELECTED,
269 (wxObjectEventFunction) & WfsDialog::OnCmdCopy);
270 Connect(Wfs_Layer, wxEVT_COMMAND_MENU_SELECTED,
271 (wxObjectEventFunction) & WfsDialog::OnCmdSelectLayer);
272 Connect(ID_WFS_THREAD_FINISHED, wxEVT_COMMAND_BUTTON_CLICKED,
273 (wxObjectEventFunction) & WfsDialog::OnThreadFinished);
274 //
275 // setting up a Timer event handler for Refresh
276 //
277 Connect(ID_WFS_TIMER, wxEVT_TIMER,
278 wxTimerEventHandler(WfsDialog::OnRefreshTimer), NULL, this);
279 }
280
OnRefreshTimer(wxTimerEvent & WXUNUSED (event))281 void WfsDialog::OnRefreshTimer(wxTimerEvent & WXUNUSED(event))
282 {
283 //
284 // Refreshing the Progress status
285 //
286 if (Params.GetProgressCount() > Params.GetLastProgressCount())
287 {
288 Params.SetLastProgressCount(Params.GetProgressCount());
289 ProgressUpdate(Params.GetProgressCount());
290 }
291 Progress->Show(true);
292 Progress->Pulse();
293
294 //
295 // restarting the timer
296 //
297 ProgressTimer->Start(500, wxTIMER_ONE_SHOT);
298 }
299
OnCmdCopy(wxCommandEvent & WXUNUSED (event))300 void WfsDialog::OnCmdCopy(wxCommandEvent & WXUNUSED(event))
301 {
302 //
303 // copying all WFS Layer definitions into the clipboard
304 //
305 wxString copyData;
306 int row;
307 int col;
308 for (row = 0; row < WfsView->GetNumberRows(); row++)
309 {
310 for (col = 0; col < WfsView->GetNumberCols(); col++)
311 {
312 if (col != 0)
313 copyData += wxT("\t");
314 copyData += WfsView->GetCellValue(row, col);
315 }
316 copyData += wxT("\n");
317 }
318 if (wxTheClipboard->Open())
319 {
320 wxTheClipboard->SetData(new wxTextDataObject(copyData));
321 wxTheClipboard->Close();
322 }
323 }
324
OnCmdSelectLayer(wxCommandEvent & WXUNUSED (event))325 void WfsDialog::OnCmdSelectLayer(wxCommandEvent & WXUNUSED(event))
326 {
327 //
328 // setting the currently selected WFS Layer
329 //
330 SelectLayer();
331 }
332
SelectLayer()333 void WfsDialog::SelectLayer()
334 {
335 //
336 // setting the currently selected WFS Layer
337 //
338 WfsView->Show(false);
339 WfsView->ClearSelection();
340 WfsView->SelectRow(CurrentEvtRow);
341 WfsView->Show(true);
342 wxString name = WfsView->GetCellValue(CurrentEvtRow, 0);
343 gaiaWFSitemPtr layer = FindLayerByName(name);
344 if (layer == NULL)
345 return;
346 wxTextCtrl *nameCtrl = (wxTextCtrl *) FindWindow(ID_WFS_NAME);
347 wxString lyr_name;
348 const char *x_name = get_wfs_item_name(layer);
349 lyr_name = wxString::FromUTF8(x_name);
350 nameCtrl->SetValue(lyr_name);
351 wxComboBox *comboCtrl = (wxComboBox *) FindWindow(ID_WFS_SRID);
352 comboCtrl->Clear();
353 int maxSrid = get_wfs_layer_srid_count(layer);
354 for (int s = 0; s < maxSrid; s++)
355 {
356 wxString str;
357 str.Printf(wxT("%d"), get_wfs_layer_srid(layer, s));
358 comboCtrl->Append(str);
359 }
360 comboCtrl->SetSelection(0);
361 comboCtrl->Enable(true);
362 wxRadioBox *versionBox = (wxRadioBox *) FindWindow(ID_WFS_VERSION);
363 versionBox->Enable(true);
364 versionBox->SetSelection(1);
365 wxTextCtrl *maxCtrl = (wxTextCtrl *) FindWindow(ID_WFS_MAX);
366 maxCtrl->SetValue(wxT("100"));
367 maxCtrl->Enable(true);
368 wxStaticText *maxLabel = (wxStaticText *) FindWindow(ID_WFS_LABEL);
369 maxLabel->SetLabel(wxT("FeaturesPerPage"));
370 wxStaticBox *pageBox = (wxStaticBox *) FindWindow(ID_WFS_PAGE);
371 pageBox->SetLabel(wxT("Multiple WFS Paged Requests"));
372 wxRadioBox *pagingCtrl = (wxRadioBox *) FindWindow(ID_WFS_PAGING);
373 pagingCtrl->SetSelection(1);
374 pagingCtrl->Enable(true);
375 wxTextCtrl *tableCtrl = (wxTextCtrl *) FindWindow(ID_WFS_TABLE);
376 tableCtrl->SetValue(wxT(""));
377 tableCtrl->Enable(true);
378 wxTextCtrl *extraCtrl = (wxTextCtrl *) FindWindow(ID_WFS_EXTRA);
379 extraCtrl->SetValue(wxT(""));
380 extraCtrl->Enable(true);
381 wxComboBox *pkList = (wxComboBox *) FindWindow(ID_WFS_PK);
382 pkList->Clear();
383 pkList->Append(wxT(""));
384 char *url = get_wfs_describe_url(Catalog, x_name, NULL);
385 if (url != NULL)
386 {
387 gaiaWFSschemaPtr schema = create_wfs_schema(url, (char *) x_name, NULL);
388 if (schema != NULL)
389 {
390 int maxCol = get_wfs_schema_column_count(schema);
391 for (int c = 0; c < maxCol; c++)
392 {
393 gaiaWFScolumnPtr column = get_wfs_schema_column(schema, c);
394 if (column != NULL)
395 {
396 const char *name;
397 int type;
398 int nillable;
399 if (get_wfs_schema_column_info
400 (column, &name, &type, &nillable) != 0)
401 {
402 wxString str = wxString::FromUTF8(name);
403 pkList->Append(str);
404 }
405 }
406 }
407 destroy_wfs_schema(schema);
408 }
409 free(url);
410 }
411 pkList->SetSelection(0);
412 pkList->Enable(true);
413 wxCheckBox *rtreeCtrl = (wxCheckBox *) FindWindow(ID_WFS_RTREE);
414 rtreeCtrl->SetValue(true);
415 rtreeCtrl->Enable(true);
416 wxCheckBox *swapCtrl = (wxCheckBox *) FindWindow(ID_WFS_SWAP);
417 swapCtrl->SetValue(false);
418 swapCtrl->Enable(true);
419 wxButton *load = (wxButton *) FindWindow(ID_WFS_LOAD);
420 load->Enable(true);
421 }
422
FindLayerByName(wxString & name)423 gaiaWFSitemPtr WfsDialog::FindLayerByName(wxString & name)
424 {
425 //
426 // retrieving a WFS Layer from the Catalog by its name
427 //
428 int nLayers = get_wfs_catalog_count(Catalog);
429 for (int i = 0; i < nLayers; i++)
430 {
431 gaiaWFSitemPtr layer = get_wfs_catalog_item(Catalog, i);
432 wxString lyr_name;
433 const char *x_name = get_wfs_item_name(layer);
434 lyr_name = wxString::FromUTF8(x_name);
435 if (name.Cmp(lyr_name) == 0)
436 return layer;
437 }
438 return NULL;
439 }
440
OnLeftClick(wxGridEvent & event)441 void WfsDialog::OnLeftClick(wxGridEvent & event)
442 {
443 //
444 // left click on some cell [mouse action]
445 //
446 int previous = CurrentEvtRow;
447 CurrentEvtRow = event.GetRow();
448 CurrentEvtColumn = event.GetCol();
449 if (CurrentEvtRow != previous)
450 SelectLayer();
451 }
452
OnRightClick(wxGridEvent & event)453 void WfsDialog::OnRightClick(wxGridEvent & event)
454 {
455 //
456 // right click on some cell [mouse action]
457 //
458 wxMenu *menu = new wxMenu();
459 wxMenuItem *menuItem;
460 wxPoint pt = event.GetPosition();
461 CurrentEvtRow = event.GetRow();
462 CurrentEvtColumn = event.GetCol();
463 menuItem =
464 new wxMenuItem(menu, Wfs_Layer, wxT("Select as the current WFS &Layer"));
465 menu->Append(menuItem);
466 menu->AppendSeparator();
467 menuItem = new wxMenuItem(menu, Wfs_Copy, wxT("&Copy the whole WFS Catalog"));
468 menu->Append(menuItem);
469 WfsView->PopupMenu(menu, pt);
470 }
471
OnPagingChanged(wxCommandEvent & WXUNUSED (event))472 void WfsDialog::OnPagingChanged(wxCommandEvent & WXUNUSED(event))
473 {
474 //
475 // Monolithic / Paged selection changed
476 //
477 wxRadioBox *pagingCtrl = (wxRadioBox *) FindWindow(ID_WFS_PAGING);
478 wxTextCtrl *maxCtrl = (wxTextCtrl *) FindWindow(ID_WFS_MAX);
479 wxStaticText *maxLabel = (wxStaticText *) FindWindow(ID_WFS_LABEL);
480 wxStaticBox *pageBox = (wxStaticBox *) FindWindow(ID_WFS_PAGE);
481 switch (pagingCtrl->GetSelection())
482 {
483 case 0:
484 maxCtrl->SetValue(wxT("-1"));
485 maxLabel->SetLabel(wxT("Max &Features limit:"));
486 pageBox->SetLabel(wxT("Monolithic WFS Request"));
487 break;
488 case 1:
489 maxCtrl->SetValue(wxT("100"));
490 maxLabel->SetLabel(wxT("FeaturesPerPage:"));
491 pageBox->SetLabel(wxT("Multiple WFS Paged Requests"));
492 break;
493 };
494 }
495
ResetProgress()496 void WfsDialog::ResetProgress()
497 {
498 // resetting the Progress label
499 wxStaticText *status = (wxStaticText *) FindWindow(ID_WFS_STATUS);
500 status->SetLabel(wxT(""));
501 status->Refresh();
502 status->Update();
503 }
504
ProgressWait()505 void WfsDialog::ProgressWait()
506 {
507 // monolithic download
508 wxStaticText *status = (wxStaticText *) FindWindow(ID_WFS_STATUS);
509 status->SetLabel(wxT(" Please wait ... WFS download in progress"));
510 status->Refresh();
511 status->Update();
512 }
513
ProgressUpdate(int rows)514 void WfsDialog::ProgressUpdate(int rows)
515 {
516 // updating the current status (WFS paging)
517 wxStaticText *status = (wxStaticText *) FindWindow(ID_WFS_STATUS);
518 wxString msg;
519 msg.Printf(wxT(" WFS Features loaded since now: %d"), rows);
520 status->SetLabel(msg);
521 status->Refresh();
522 status->Update();
523 }
524
WfsCallback(int rows,void * ptr)525 void WfsCallback(int rows, void *ptr)
526 {
527 // progress callback supporting WFS Paging
528 int *p = (int *) ptr;
529 *p = rows;
530 }
531
532 #ifdef _WIN32
DoExecuteWfs(void * arg)533 DWORD WINAPI DoExecuteWfs(void *arg)
534 #else
535 void *DoExecuteWfs(void *arg)
536 #endif
537 {
538 //
539 // threaded function: processing a WFS download
540 //
541 WfsParams *params = (WfsParams *) arg;
542 char *err_msg = NULL;
543 int rows;
544 char url[8196];
545 char alt_describe[4192];
546 char layer_name[1024];
547 char table[1024];
548 char pk[1024];
549 char *pk_ref = pk;
550 wxString wUrl = params->GetUrl();
551 wxString altDescribe = params->GetAltDescribeUri();
552
553 if (params->GetExtra().Len() > 0)
554 {
555 // appending extra arguments to URL */
556 if (wUrl.EndsWith(wxT("&")) == true
557 || params->GetExtra().StartsWith(wxT("&")) == true)
558 wUrl += params->GetExtra();
559 else
560 wUrl += wxT("&") + params->GetExtra();
561 }
562
563 strcpy(url, wUrl.ToUTF8());
564 strcpy(alt_describe, altDescribe.ToUTF8());
565 strcpy(layer_name, params->GetLayerName().ToUTF8());
566 strcpy(table, params->GetTable().ToUTF8());
567 wxString pkey = params->GetPrimaryKey();
568 if (pkey.Len() == 0)
569 pk_ref = NULL;
570 else
571 strcpy(pk, pkey.ToUTF8());
572 int ret =
573 load_from_wfs_paged(params->GetSqlite(), url, alt_describe, layer_name,
574 params->GetSwapAxes(), table,
575 pk_ref, params->GetSpatialIndex(),
576 params->GetPageSize(), &rows, &err_msg,
577 params->GetCallback(),
578 params->GetProgressCountPtr());
579 params->SetRet(ret);
580 params->SetErrMsg(err_msg);
581 params->SetRows(rows);
582 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, ID_WFS_THREAD_FINISHED);
583 params->GetMother()->GetEventHandler()->AddPendingEvent(event);
584 #ifdef _WIN32
585 return 0;
586 #else
587 pthread_exit(NULL);
588 #endif
589 }
590
OnLoadFromWfs(wxCommandEvent & WXUNUSED (event))591 void WfsDialog::OnLoadFromWfs(wxCommandEvent & WXUNUSED(event))
592 {
593 //
594 // attempting to load data from WFS
595 //
596 #ifdef _WIN32
597 HANDLE thread_handle;
598 DWORD dwThreadId;
599 #else
600 pthread_t thread_id;
601 #endif
602 wxTextCtrl *nameCtrl = (wxTextCtrl *) FindWindow(ID_WFS_NAME);
603 wxTextCtrl *maxCtrl = (wxTextCtrl *) FindWindow(ID_WFS_MAX);
604 wxTextCtrl *tableCtrl = (wxTextCtrl *) FindWindow(ID_WFS_TABLE);
605 wxString name = nameCtrl->GetValue();
606 wxTextCtrl *extraCtrl = (wxTextCtrl *) FindWindow(ID_WFS_EXTRA);
607 wxString extra = extraCtrl->GetValue();
608 wxRadioBox *pagingCtrl = (wxRadioBox *) FindWindow(ID_WFS_PAGING);
609 long max = -1;
610 long page = 100;
611 if (pagingCtrl->GetSelection() == 1)
612 {
613 max = -1;
614 if (maxCtrl->GetValue().ToLong(&page) == false)
615 page = 100;
616 } else
617 {
618 page = -1;
619 if (maxCtrl->GetValue().ToLong(&max) == false)
620 max = -1;
621 }
622 long srid = -1;
623 wxComboBox *comboCtrl = (wxComboBox *) FindWindow(ID_WFS_SRID);
624 int idSel = comboCtrl->GetSelection();
625 if (idSel != wxNOT_FOUND)
626 {
627 if (comboCtrl->GetString(idSel).ToLong(&srid) == false)
628 srid = -1;
629 }
630 wxRadioBox *versionCtrl = (wxRadioBox *) FindWindow(ID_WFS_VERSION);
631 const char *version = "1.1.0";
632 if (versionCtrl->GetSelection() == 0)
633 version = "1.0.0";
634 wxString table = tableCtrl->GetValue();
635 if (table.Len() < 1)
636 {
637 wxMessageBox(wxT
638 ("You must specify some DB Table name [destination target] !!!"),
639 wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
640 return;
641 }
642 wxComboBox *pkList = (wxComboBox *) FindWindow(ID_WFS_PK);
643 wxString pk = pkList->GetValue();
644 char xname[1024];
645 strcpy(xname, name.ToUTF8());
646 int rtree = 0;
647 wxCheckBox *rtreeCtrl = (wxCheckBox *) FindWindow(ID_WFS_RTREE);
648 if (rtreeCtrl->GetValue())
649 rtree = 1;
650 int swap_axes = 0;
651 wxCheckBox *swapCtrl = (wxCheckBox *) FindWindow(ID_WFS_SWAP);
652 if (swapCtrl->GetValue())
653 swap_axes = 1;
654 char *xurl = get_wfs_request_url(Catalog, xname, version, srid, max);
655 wxString url = wxString::FromUTF8(xurl);
656 free(xurl);
657 char *xalt_describe = get_wfs_describe_url(Catalog, xname, version);
658 wxString alt_describe = wxString::FromUTF8(xalt_describe);
659 free(xalt_describe);
660 char *err_msg = NULL;
661 int rows;
662 ::wxBeginBusyCursor();
663 ProgressWait();
664 Params.Initialize(this, MainFrame->GetSqlite(), url, alt_describe, name,
665 swap_axes, table, pk, rtree, page, extra, WfsCallback);
666 ProgressTimer->Start(500, wxTIMER_ONE_SHOT);
667 Enable(false);
668
669 #ifdef _WIN32
670 thread_handle = CreateThread(NULL, 0, DoExecuteWfs, &Params, 0, &dwThreadId);
671 SetThreadPriority(thread_handle, THREAD_PRIORITY_IDLE);
672 #else
673 int ok_prior = 0;
674 int policy;
675 int min_prio;
676 pthread_attr_t attr;
677 struct sched_param sp;
678 pthread_attr_init(&attr);
679 if (pthread_attr_setschedpolicy(&attr, SCHED_RR) == 0)
680 {
681 // attempting to set the lowest priority
682 if (pthread_attr_getschedpolicy(&attr, &policy) == 0)
683 {
684 min_prio = sched_get_priority_min(policy);
685 sp.sched_priority = min_prio;
686 if (pthread_attr_setschedparam(&attr, &sp) == 0)
687 {
688 // ok, setting the lowest priority
689 ok_prior = 1;
690 pthread_create(&thread_id, &attr, DoExecuteWfs, &Params);
691 }
692 }
693 }
694 if (!ok_prior)
695 {
696 // failure: using standard priority
697 pthread_create(&thread_id, NULL, DoExecuteWfs, &Params);
698 }
699 #endif
700 }
701
OnThreadFinished(wxCommandEvent & WXUNUSED (event))702 void WfsDialog::OnThreadFinished(wxCommandEvent & WXUNUSED(event))
703 {
704 // resuming execution when WFS thread quits
705 char url[1024];
706 char xtable[1024];
707 int ret = Params.GetRet();
708 char *err_msg = Params.GetErrMsg();
709 int rows = Params.GetRows();
710 strcpy(url, Params.GetUrl().ToUTF8());
711 strcpy(xtable, Params.GetTable().ToUTF8());
712
713 Enable(true);
714 ProgressTimer->Stop();
715 Progress->SetValue(0);
716 Progress->Hide();
717 ResetProgress();
718 ::wxEndBusyCursor();
719 if (ret == 0)
720 {
721 char *xmsg;
722 if (err_msg == NULL)
723 xmsg = sqlite3_mprintf("Unable to load data from WFS:\nUnkwnon cause");
724 else
725 xmsg = sqlite3_mprintf("Unable to load data from WFS:\n%s", err_msg);
726 wxString msg = wxString::FromUTF8(xmsg);
727 sqlite3_free(xmsg);
728 wxMessageBox(msg, wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
729 } else
730 {
731 MainFrame->InitTableTree();
732 char *xmsg =
733 sqlite3_mprintf("inserted %d rows from WFS into table \"%s\"", rows,
734 xtable);
735 wxString msg = wxString::FromUTF8(xmsg);
736 sqlite3_free(xmsg);
737 wxMessageBox(msg, wxT("spatialite_gui"), wxOK | wxICON_INFORMATION, this);
738 }
739 if (err_msg)
740 free(err_msg);
741 }
742
OnCatalog(wxCommandEvent & WXUNUSED (event))743 void WfsDialog::OnCatalog(wxCommandEvent & WXUNUSED(event))
744 {
745 //
746 // attempting to create a WFS Catalog from GetCapabilities
747 //
748 wxTextCtrl *urlCtrl = (wxTextCtrl *) FindWindow(ID_WFS_URL);
749 wxButton *catalogBtn = (wxButton *) FindWindow(ID_WFS_CATALOG);
750 wxButton *resetBtn = (wxButton *) FindWindow(ID_WFS_RESET);
751 wxString url = urlCtrl->GetValue();
752 if (url.Len() < 1)
753 {
754 wxMessageBox(wxT("You must specify some WFS GetCapabilities URL !!!"),
755 wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
756 return;
757 }
758 char xurl[1024];
759 char *err_msg;
760 strcpy(xurl, url.ToUTF8());
761 Catalog = create_wfs_catalog(xurl, &err_msg);
762 if (Catalog == NULL)
763 {
764 wxString msg = wxString::FromUTF8(err_msg);
765 wxMessageBox(wxT("unable to get a WFS Catalog\n\n") + msg,
766 wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
767 } else
768 {
769 int nLayers = get_wfs_catalog_count(Catalog);
770 WfsView->Show(false);
771 WfsView->ClearSelection();
772 CurrentEvtRow = -1;
773 CurrentEvtColumn = -1;
774 if (nLayers > 1)
775 WfsView->AppendRows(nLayers - 1);
776 for (int i = 0; i < nLayers; i++)
777 {
778 // populating the WFS Catalog
779 gaiaWFSitemPtr layer = get_wfs_catalog_item(Catalog, i);
780 wxString name;
781 wxString title;
782 wxString abstract;
783 const char *x_name = get_wfs_item_name(layer);
784 const char *x_title = get_wfs_item_title(layer);
785 const char *x_abstract = get_wfs_item_abstract(layer);
786 name = wxString::FromUTF8(x_name);
787 if (x_title != NULL)
788 title = wxString::FromUTF8(x_title);
789 if (x_abstract != NULL)
790 abstract = wxString::FromUTF8(x_abstract);
791 WfsView->SetCellValue(i, 0, name);
792 WfsView->SetCellValue(i, 1, title);
793 WfsView->SetCellValue(i, 2, abstract);
794 }
795 WfsView->SetRowLabelSize(wxGRID_AUTOSIZE);
796 WfsView->AutoSize();
797 WfsView->SetSize(690, 240);
798 WfsView->Show(true);
799 urlCtrl->Enable(false);
800 catalogBtn->Enable(false);
801 resetBtn->Enable(true);
802 Keywords = new WfsKeywords();
803 for (int i = 0; i < nLayers; i++)
804 {
805 // populating the Keywords dictionary
806 gaiaWFSitemPtr layer = get_wfs_catalog_item(Catalog, i);
807 int kw = get_wfs_keyword_count(layer);
808 for (int k = 0; k < kw; k++)
809 Keywords->Add(get_wfs_keyword(layer, k));
810 }
811 Keywords->Sort();
812 wxComboBox *comboCtrl = (wxComboBox *) FindWindow(ID_WFS_KEYWORD);
813 comboCtrl->Clear();
814 comboCtrl->Append(wxT(""));
815 int maxKey = Keywords->GetMaxSorted();
816 for (int i = 0; i < maxKey; i++)
817 {
818 WfsKey *key = Keywords->GetKey(i);
819 if (key != NULL)
820 {
821 // populating the Keywords ComboBox
822 comboCtrl->Append(key->GetKeyword());
823 }
824 }
825 comboCtrl->Enable(true);
826 wxButton *filterBtn = (wxButton *) FindWindow(ID_WFS_KEYFILTER);
827 filterBtn->Enable(true);
828 wxButton *keyResetBtn = (wxButton *) FindWindow(ID_WFS_KEYRESET);
829 keyResetBtn->Enable(true);
830 }
831 if (err_msg != NULL)
832 free(err_msg);
833 }
834
OnReset(wxCommandEvent & WXUNUSED (event))835 void WfsDialog::OnReset(wxCommandEvent & WXUNUSED(event))
836 {
837 //
838 // resetting to initial empty state
839 //
840 wxTextCtrl *urlCtrl = (wxTextCtrl *) FindWindow(ID_WFS_URL);
841 wxButton *catalogBtn = (wxButton *) FindWindow(ID_WFS_CATALOG);
842 wxButton *resetBtn = (wxButton *) FindWindow(ID_WFS_RESET);
843 if (Catalog != NULL)
844 destroy_wfs_catalog(Catalog);
845 Catalog = NULL;
846 urlCtrl->Enable(true);
847 catalogBtn->Enable(true);
848 resetBtn->Enable(false);
849 WfsView->DeleteRows(1, WfsView->GetNumberRows() - 1);
850 WfsView->Show(false);
851 WfsView->ClearSelection();
852 WfsView->SetCellValue(0, 0, wxT(""));
853 WfsView->SetCellValue(0, 1, wxT(""));
854 WfsView->SetCellValue(0, 2, wxT(""));
855 WfsView->SetRowLabelSize(wxGRID_AUTOSIZE);
856 WfsView->AutoSize();
857 WfsView->SetSize(690, 240);
858 WfsView->Show(true);
859 CurrentEvtRow = -1;
860 CurrentEvtColumn = -1;
861 if (Keywords != NULL)
862 delete Keywords;
863 Keywords = NULL;
864 wxComboBox *comboCtrl = (wxComboBox *) FindWindow(ID_WFS_KEYWORD);
865 comboCtrl->Enable(false);
866 wxButton *filterBtn = (wxButton *) FindWindow(ID_WFS_KEYFILTER);
867 filterBtn->Enable(false);
868 wxButton *keyResetBtn = (wxButton *) FindWindow(ID_WFS_KEYRESET);
869 keyResetBtn->Enable(false);
870 wxTextCtrl *nameCtrl = (wxTextCtrl *) FindWindow(ID_WFS_NAME);
871 nameCtrl->SetValue(wxT(""));
872 comboCtrl = (wxComboBox *) FindWindow(ID_WFS_SRID);
873 comboCtrl->Clear();
874 comboCtrl->SetSelection(wxNOT_FOUND);
875 comboCtrl->Enable(false);
876 wxRadioBox *versionBox = (wxRadioBox *) FindWindow(ID_WFS_VERSION);
877 versionBox->Enable(false);
878 wxTextCtrl *maxCtrl = (wxTextCtrl *) FindWindow(ID_WFS_MAX);
879 maxCtrl->SetValue(wxT("-1"));
880 maxCtrl->Enable(false);
881 wxStaticText *maxLabel = (wxStaticText *) FindWindow(ID_WFS_LABEL);
882 maxLabel->SetLabel(wxT("Max &Features limit:"));
883 wxStaticBox *pageBox = (wxStaticBox *) FindWindow(ID_WFS_PAGE);
884 pageBox->SetLabel(wxT("Monolithic WFS Request"));
885 wxRadioBox *pagingCtrl = (wxRadioBox *) FindWindow(ID_WFS_PAGING);
886 pagingCtrl->SetSelection(0);
887 pagingCtrl->Enable(false);
888 wxTextCtrl *tableCtrl = (wxTextCtrl *) FindWindow(ID_WFS_TABLE);
889 tableCtrl->SetValue(wxT(""));
890 tableCtrl->Enable(false);
891 comboCtrl = (wxComboBox *) FindWindow(ID_WFS_PK);
892 comboCtrl->Clear();
893 comboCtrl->SetSelection(wxNOT_FOUND);
894 comboCtrl->Enable(false);
895 wxCheckBox *rtreeCtrl = (wxCheckBox *) FindWindow(ID_WFS_RTREE);
896 rtreeCtrl->SetValue(false);
897 rtreeCtrl->Enable(false);
898 wxCheckBox *swapCtrl = (wxCheckBox *) FindWindow(ID_WFS_SWAP);
899 swapCtrl->SetValue(false);
900 swapCtrl->Enable(false);
901 wxButton *load = (wxButton *) FindWindow(ID_WFS_LOAD);
902 load->Enable(false);
903 ResetProgress();
904 }
905
OnKeyFilter(wxCommandEvent & WXUNUSED (event))906 void WfsDialog::OnKeyFilter(wxCommandEvent & WXUNUSED(event))
907 {
908 //
909 // filtering by Keywords
910 //
911 wxString key;
912 wxComboBox *comboCtrl = (wxComboBox *) FindWindow(ID_WFS_KEYWORD);
913 key = comboCtrl->GetValue();
914 if (key.Len() == 0)
915 {
916 wxMessageBox(wxT("You must specify some Keyword to be searched !!!"),
917 wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
918 return;
919 }
920 // resetting the Grid
921 WfsView->Show(false);
922 WfsView->ClearSelection();
923 WfsView->DeleteRows(1, WfsView->GetNumberRows() - 1);
924 WfsView->SetCellValue(0, 0, wxT(""));
925 WfsView->SetCellValue(0, 1, wxT(""));
926 WfsView->SetCellValue(0, 2, wxT(""));
927 WfsView->Show(true);
928 CurrentEvtRow = -1;
929 CurrentEvtColumn = -1;
930 int filtered_rows = 0;
931 int nLayers = get_wfs_catalog_count(Catalog);
932 for (int i = 0; i < nLayers; i++)
933 {
934 // searching matching Keywords - pass #1
935 gaiaWFSitemPtr layer = get_wfs_catalog_item(Catalog, i);
936 bool match = false;
937 int kw = get_wfs_keyword_count(layer);
938 for (int k = 0; k < kw; k++)
939 {
940 wxString str = wxString::FromUTF8(get_wfs_keyword(layer, k));
941 if (key.Len() > 0 && str.Cmp(key) == 0)
942 match = true;
943 }
944 if (match)
945 filtered_rows++;
946 }
947 if (filtered_rows > 1)
948 WfsView->AppendRows(filtered_rows - 1);
949 int irow = 0;
950 for (int i = 0; i < nLayers; i++)
951 {
952 // searching matching Keywords - pass #2
953 gaiaWFSitemPtr layer = get_wfs_catalog_item(Catalog, i);
954 bool match = false;
955 int kw = get_wfs_keyword_count(layer);
956 for (int k = 0; k < kw; k++)
957 {
958 wxString str = wxString::FromUTF8(get_wfs_keyword(layer, k));
959 if (key.Len() > 0 && str.Cmp(key) == 0)
960 match = true;
961 }
962 if (match)
963 {
964 // inserting a filterd layer
965 wxString name;
966 wxString title;
967 wxString abstract;
968 const char *x_name = get_wfs_item_name(layer);
969 const char *x_title = get_wfs_item_title(layer);
970 const char *x_abstract = get_wfs_item_abstract(layer);
971 name = wxString::FromUTF8(x_name);
972 if (x_title != NULL)
973 title = wxString::FromUTF8(x_title);
974 if (x_abstract != NULL)
975 abstract = wxString::FromUTF8(x_abstract);
976 WfsView->SetCellValue(irow, 0, name);
977 WfsView->SetCellValue(irow, 1, title);
978 WfsView->SetCellValue(irow, 2, abstract);
979 irow++;
980 }
981 }
982 WfsView->SetRowLabelSize(wxGRID_AUTOSIZE);
983 WfsView->AutoSize();
984 WfsView->SetSize(690, 240);
985 WfsView->Show(true);
986 }
987
OnKeyReset(wxCommandEvent & WXUNUSED (event))988 void WfsDialog::OnKeyReset(wxCommandEvent & WXUNUSED(event))
989 {
990 //
991 // resetting any filter by Keywords
992 //
993 WfsView->Show(false);
994 WfsView->DeleteRows(1, WfsView->GetNumberRows() - 1);
995 WfsView->SetCellValue(0, 0, wxT(""));
996 WfsView->SetCellValue(0, 1, wxT(""));
997 WfsView->SetCellValue(0, 2, wxT(""));
998 int nLayers = get_wfs_catalog_count(Catalog);
999 WfsView->Show(false);
1000 CurrentEvtRow = -1;
1001 CurrentEvtColumn = -1;
1002 if (nLayers > 1)
1003 WfsView->AppendRows(nLayers - 1);
1004 for (int i = 0; i < nLayers; i++)
1005 {
1006 // populating the WFS Catalog
1007 gaiaWFSitemPtr layer = get_wfs_catalog_item(Catalog, i);
1008 wxString name;
1009 wxString title;
1010 wxString abstract;
1011 const char *x_name = get_wfs_item_name(layer);
1012 const char *x_title = get_wfs_item_title(layer);
1013 const char *x_abstract = get_wfs_item_abstract(layer);
1014 name = wxString::FromUTF8(x_name);
1015 if (x_title != NULL)
1016 title = wxString::FromUTF8(x_title);
1017 if (x_abstract != NULL)
1018 abstract = wxString::FromUTF8(x_abstract);
1019 WfsView->SetCellValue(i, 0, name);
1020 WfsView->SetCellValue(i, 1, title);
1021 WfsView->SetCellValue(i, 2, abstract);
1022 }
1023 WfsView->SetRowLabelSize(wxGRID_AUTOSIZE);
1024 WfsView->AutoSize();
1025 WfsView->SetSize(690, 240);
1026 WfsView->Show(true);
1027 wxComboBox *comboCtrl = (wxComboBox *) FindWindow(ID_WFS_KEYWORD);
1028 comboCtrl->SetSelection(wxNOT_FOUND);
1029 wxTextCtrl *nameCtrl = (wxTextCtrl *) FindWindow(ID_WFS_NAME);
1030 nameCtrl->SetValue(wxT(""));
1031 comboCtrl = (wxComboBox *) FindWindow(ID_WFS_SRID);
1032 comboCtrl->Clear();
1033 comboCtrl->SetSelection(wxNOT_FOUND);
1034 comboCtrl->Enable(false);
1035 wxRadioBox *versionBox = (wxRadioBox *) FindWindow(ID_WFS_VERSION);
1036 versionBox->Enable(false);
1037 wxTextCtrl *maxCtrl = (wxTextCtrl *) FindWindow(ID_WFS_MAX);
1038 maxCtrl->SetValue(wxT("-1"));
1039 maxCtrl->Enable(false);
1040 wxStaticText *maxLabel = (wxStaticText *) FindWindow(ID_WFS_LABEL);
1041 maxLabel->SetLabel(wxT("Max &Features limit:"));
1042 wxStaticBox *pageBox = (wxStaticBox *) FindWindow(ID_WFS_PAGE);
1043 pageBox->SetLabel(wxT("Monolithic WFS Request"));
1044 wxRadioBox *pagingCtrl = (wxRadioBox *) FindWindow(ID_WFS_PAGING);
1045 pagingCtrl->SetSelection(0);
1046 pagingCtrl->Enable(false);
1047 wxTextCtrl *tableCtrl = (wxTextCtrl *) FindWindow(ID_WFS_TABLE);
1048 tableCtrl->SetValue(wxT(""));
1049 tableCtrl->Enable(false);
1050 comboCtrl = (wxComboBox *) FindWindow(ID_WFS_PK);
1051 comboCtrl->Clear();
1052 comboCtrl->SetSelection(wxNOT_FOUND);
1053 comboCtrl->Enable(false);
1054 wxCheckBox *rtreeCtrl = (wxCheckBox *) FindWindow(ID_WFS_RTREE);
1055 rtreeCtrl->SetValue(false);
1056 rtreeCtrl->Enable(false);
1057 wxCheckBox *swapCtrl = (wxCheckBox *) FindWindow(ID_WFS_SWAP);
1058 swapCtrl->SetValue(false);
1059 swapCtrl->Enable(false);
1060 wxButton *load = (wxButton *) FindWindow(ID_WFS_LOAD);
1061 load->Enable(false);
1062 ResetProgress();
1063 }
1064
OnQuit(wxCommandEvent & WXUNUSED (event))1065 void WfsDialog::OnQuit(wxCommandEvent & WXUNUSED(event))
1066 {
1067 //
1068 // all done:
1069 //
1070 wxDialog::EndModal(wxID_CANCEL);
1071 }
1072
~WfsKeywords()1073 WfsKeywords::~WfsKeywords()
1074 {
1075 // destructor
1076 WfsKey *key;
1077 WfsKey *n_key;
1078 if (SortedArray != NULL)
1079 delete[]SortedArray;
1080 key = First;
1081 while (key != NULL)
1082 {
1083 n_key = key->GetNext();
1084 delete key;
1085 key = n_key;
1086 }
1087 }
1088
Add(const char * key)1089 void WfsKeywords::Add(const char *key)
1090 {
1091 // adding a new Keyword into the dictionary (if not already defined)
1092 if (key == NULL)
1093 return;
1094 wxString keyword = wxString::FromUTF8(key);
1095 WfsKey *pKey = First;
1096 while (pKey != NULL)
1097 {
1098 if (keyword.CmpNoCase(pKey->GetKeyword()) == 0)
1099 return;
1100 pKey = pKey->GetNext();
1101 }
1102 // inserting a new Keyword
1103 pKey = new WfsKey(keyword);
1104 if (First == NULL)
1105 First = pKey;
1106 if (Last != NULL)
1107 Last->SetNext(pKey);
1108 Last = pKey;
1109 }
1110
Sort()1111 void WfsKeywords::Sort()
1112 {
1113 // creating the sorted array of Keywords
1114 int count = 0;
1115 WfsKey *key;
1116 WfsKey *key_prev;
1117 bool ok = true;
1118 if (SortedArray != NULL)
1119 delete[]SortedArray;
1120 SortedArray = NULL;
1121 key = First;
1122 while (key != NULL)
1123 {
1124 // counting how many Keywords are there
1125 count++;
1126 key = key->GetNext();
1127 }
1128 MaxSorted = count;
1129 if (MaxSorted == 0)
1130 return;
1131 SortedArray = new WfsKey *[MaxSorted];
1132 count = 0;
1133 key = First;
1134 while (key != NULL)
1135 {
1136 // inserting pointers into the Array
1137 *(SortedArray + count++) = key;
1138 key = key->GetNext();
1139 }
1140 while (ok)
1141 {
1142 // bubble sorting
1143 ok = false;
1144 for (count = 1; count < MaxSorted; count++)
1145 {
1146 key_prev = *(SortedArray + count - 1);
1147 key = *(SortedArray + count);
1148 if (key_prev->GetKeyword().CmpNoCase(key->GetKeyword()) > 0)
1149 {
1150 // swapping pointers
1151 *(SortedArray + count) = key_prev;
1152 *(SortedArray + count - 1) = key;
1153 ok = true;
1154 }
1155 }
1156 }
1157 }
1158
GetKey(int index)1159 WfsKey *WfsKeywords::GetKey(int index)
1160 {
1161 // returning the Nth sorted Keyword
1162 if (SortedArray == NULL)
1163 return NULL;
1164 if (index >= 0 && index < MaxSorted)
1165 return *(SortedArray + index);
1166 return NULL;
1167 }
1168