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