Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Difference From 80a1ab14a287da4c To 360acb727dbc921e
|
2011-11-10
| ||
| 17:01 | switching to version 1.2.1 check-in: 740a9a5992 user: sandro tags: trunk | |
| 16:52 | switching to version 2.3.0 check-in: 80a1ab14a2 user: sandro tags: trunk | |
| 16:37 | switching to version 1.1 check-in: 360acb727d user: sandro tags: trunk | |
| 16:29 | initial repository set up check-in: 1cd01d9029 user: sandro tags: trunk | |
Changes to BlobExplorer.cpp.
1 1 /* 2 2 / BlobExplorer.cpp 3 3 / a dialog to explore a BLOB value 4 4 / 5 -/ version 1.2, 2008 October 9 5 +/ version 1.1, 2008 September 13 6 6 / 7 7 / Author: Sandro Furieri a-furieri@lqt.it 8 8 / 9 9 / Copyright (C) 2008 Alessandro Furieri 10 10 / 11 11 / This program is free software: you can redistribute it and/or modify 12 12 / it under the terms of the GNU General Public License as published by ................................................................................ 24 24 */ 25 25 26 26 #include "Classdef.h" 27 27 28 28 #include "wx/mstream.h" 29 29 #include "wx/clipbrd.h" 30 30 31 -BlobExplorerDialog::BlobExplorerDialog(MyFrame * parent, int blob_size, 32 - unsigned char *blob) 31 +BlobExplorerDialog::BlobExplorerDialog (MyFrame * parent, int blob_size, 32 + unsigned char *blob) 33 33 { 34 34 // 35 35 // constructor; just calls Create() 36 36 // 37 - Create(parent, blob_size, blob); 37 + Create (parent, blob_size, blob); 38 38 } 39 39 40 -bool BlobExplorerDialog::Create(MyFrame * parent, int blob_size, 41 - unsigned char *blob) 40 +bool 41 +BlobExplorerDialog::Create (MyFrame * parent, int blob_size, 42 + unsigned char *blob) 42 43 { 43 44 // 44 45 // creating the dialog 45 46 // 46 - MainFrame = parent; 47 - BlobSize = blob_size; 48 - Blob = blob; 49 - BlobType = gaiaGuessBlobType(Blob, BlobSize); 50 - Geometry = NULL; 51 - Image = NULL; 52 - if (BlobType == GAIA_GEOMETRY_BLOB) 53 - Geometry = gaiaFromSpatiaLiteBlobWkb(Blob, BlobSize); 54 - if (BlobType == GAIA_JPEG_BLOB || BlobType == GAIA_EXIF_BLOB 55 - || BlobType == GAIA_EXIF_GPS_BLOB || BlobType == GAIA_PNG_BLOB 56 - || BlobType == GAIA_GIF_BLOB) 57 - { 58 - ::wxInitAllImageHandlers(); 59 - wxMemoryInputStream reader(Blob, BlobSize); 60 - Image = new wxImage(reader); 61 - } 62 - if (wxPropertySheetDialog::Create(parent, wxID_ANY, wxT("BLOB explorer")) == 63 - false) 64 - return false; 65 - wxBookCtrlBase *book = GetBookCtrl(); 47 + MainFrame = parent; 48 + BlobSize = blob_size; 49 + Blob = blob; 50 + BlobType = MainFrame->GuessBlobType (BlobSize, Blob); 51 + Geometry = NULL; 52 + Image = NULL; 53 + if (BlobType == MyFrame::BLOB_GEOMETRY) 54 + Geometry = gaiaFromSpatiaLiteBlobWkb (Blob, BlobSize); 55 + if (BlobType == MyFrame::BLOB_JPEG || BlobType == MyFrame::BLOB_PNG 56 + || BlobType == MyFrame::BLOB_GIF) 57 + { 58 + ::wxInitAllImageHandlers (); 59 + wxMemoryInputStream reader (Blob, BlobSize); 60 + Image = new wxImage (reader); 61 + } 62 + if (wxPropertySheetDialog::Create 63 + (parent, wxID_ANY, wxT ("BLOB explorer"), wxDefaultPosition, 64 + wxDefaultSize, 65 + wxDEFAULT_DIALOG_STYLE | (int) wxPlatform::IfNot (wxOS_WINDOWS_CE, 66 + wxRESIZE_BORDER)) 67 + == false) 68 + return false; 69 + wxBookCtrlBase *book = GetBookCtrl (); 66 70 // creates individual panels 67 - wxPanel *hexadecimal = CreateHexadecimalPage(book); 68 - book->AddPage(hexadecimal, wxT("Hexadecimal dump"), true); 69 - if (BlobType == GAIA_GEOMETRY_BLOB) 70 - { 71 - wxPanel *geometry = CreateGeometryPage(book); 72 - book->AddPage(geometry, wxT("Geometry explorer"), false); 73 - } 74 - if (BlobType == GAIA_JPEG_BLOB || BlobType == GAIA_EXIF_BLOB 75 - || BlobType == GAIA_EXIF_GPS_BLOB || BlobType == GAIA_PNG_BLOB 76 - || BlobType == GAIA_GIF_BLOB) 77 - { 78 - wxPanel *image = CreateImagePage(book); 79 - book->AddPage(image, wxT("Image"), false); 80 - } 81 - CreateButtons(wxOK); 82 - LayoutDialog(); 71 + wxPanel *hexadecimal = CreateHexadecimalPage (book); 72 + book->AddPage (hexadecimal, wxT ("Hexadecimal dump"), true); 73 + if (BlobType == MyFrame::BLOB_GEOMETRY) 74 + { 75 + wxPanel *geometry = CreateGeometryPage (book); 76 + book->AddPage (geometry, wxT ("Geometry explorer"), false); 77 + } 78 + if (BlobType == MyFrame::BLOB_JPEG || BlobType == MyFrame::BLOB_PNG 79 + || BlobType == MyFrame::BLOB_GIF) 80 + { 81 + wxPanel *image = CreateImagePage (book); 82 + book->AddPage (image, wxT ("Image"), false); 83 + } 84 + CreateButtons (wxOK); 85 + LayoutDialog (); 83 86 // appends event handler for TAB/PAGE changing 84 - Connect(wxID_ANY, wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, 85 - (wxObjectEventFunction) & BlobExplorerDialog::OnPageChanged); 87 + Connect (wxID_ANY, wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, 88 + (wxObjectEventFunction) & BlobExplorerDialog::OnPageChanged); 86 89 // appends event handler for OK button 87 - Connect(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 88 - (wxObjectEventFunction) & BlobExplorerDialog::OnOk); 90 + Connect (wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 91 + (wxObjectEventFunction) & BlobExplorerDialog::OnOk); 89 92 // centers the dialog window 90 - Centre(); 91 - UpdateHexadecimalPage(); 92 - return true; 93 + Centre (); 94 + UpdateHexadecimalPage (); 95 + return true; 93 96 } 94 97 95 -wxPanel *BlobExplorerDialog::CreateHexadecimalPage(wxWindow * parent) 98 +wxPanel * 99 +BlobExplorerDialog::CreateHexadecimalPage (wxWindow * parent) 96 100 { 97 101 // 98 102 // creating the HEXADECIMAL page 99 103 // 100 - wxPanel *panel = new wxPanel(parent, ID_PANE_HEXADECIMAL); 101 - wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); 102 - panel->SetSizer(topSizer); 103 - wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL); 104 - topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5); 104 + wxPanel *panel = new wxPanel (parent, ID_PANE_HEXADECIMAL); 105 + wxBoxSizer *topSizer = new wxBoxSizer (wxVERTICAL); 106 + panel->SetSizer (topSizer); 107 + wxBoxSizer *boxSizer = new wxBoxSizer (wxVERTICAL); 108 + topSizer->Add (boxSizer, 0, wxALIGN_CENTER | wxALL, 5); 105 109 // creating a control to show the hexadecimal dump 106 - wxBoxSizer *hexSizer = new wxBoxSizer(wxHORIZONTAL); 107 - boxSizer->Add(hexSizer, 0, wxALIGN_LEFT | wxALL, 0); 108 - MyHexList *hexCtrl = new MyHexList(this, Blob, BlobSize, panel, 109 - ID_HEX, wxDefaultPosition, 110 - wxSize(620, 320), 111 - wxLC_REPORT | wxLC_VIRTUAL); 112 - wxFont font(9, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL); 113 - hexCtrl->SetFont(font); 114 - wxListItem column0; 115 - hexCtrl->InsertColumn(0, wxT("Address")); 116 - hexCtrl->SetColumnWidth(0, 90); 117 - hexCtrl->InsertColumn(1, wxT("Hexadecimal")); 118 - hexCtrl->SetColumnWidth(1, 370); 119 - hexCtrl->InsertColumn(2, wxT("ASCII")); 120 - hexCtrl->SetColumnWidth(2, 130); 121 - hexSizer->Add(hexCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 122 - panel->SetSizer(topSizer); 123 - topSizer->Fit(panel); 124 - return panel; 125 -} 126 - 127 -wxPanel *BlobExplorerDialog::CreateGeometryPage(wxWindow * parent) 110 + wxBoxSizer *hexSizer = new wxBoxSizer (wxHORIZONTAL); 111 + boxSizer->Add (hexSizer, 0, wxALIGN_LEFT | wxALL, 0); 112 + MyHexList *hexCtrl = new MyHexList (this, Blob, BlobSize, panel, 113 + ID_HEX, wxDefaultPosition, 114 + wxSize (560, 115 + 320), 116 + wxLC_REPORT | wxLC_VIRTUAL); 117 + wxFont font (9, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, 118 + wxFONTWEIGHT_NORMAL); 119 + hexCtrl->SetFont (font); 120 + wxListItem column0; 121 + hexCtrl->InsertColumn (0, wxT ("Address")); 122 + hexCtrl->SetColumnWidth (0, 90); 123 + hexCtrl->InsertColumn (1, wxT ("Hexadecimal")); 124 + hexCtrl->SetColumnWidth (1, 340); 125 + hexCtrl->InsertColumn (2, wxT ("ASCII")); 126 + hexCtrl->SetColumnWidth (2, 90); 127 + hexSizer->Add (hexCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 128 + panel->SetSizer (topSizer); 129 + topSizer->Fit (panel); 130 + return panel; 131 +} 132 + 133 +wxPanel * 134 +BlobExplorerDialog::CreateGeometryPage (wxWindow * parent) 128 135 { 129 136 // 130 137 // creating the GEOMETRY page 131 138 // 132 - wxPanel *panel = new wxPanel(parent, ID_PANE_HEXADECIMAL); 133 - wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); 134 - panel->SetSizer(topSizer); 135 - wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL); 136 - topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5); 139 + wxPanel *panel = new wxPanel (parent, ID_PANE_HEXADECIMAL); 140 + wxBoxSizer *topSizer = new wxBoxSizer (wxVERTICAL); 141 + panel->SetSizer (topSizer); 142 + wxBoxSizer *boxSizer = new wxBoxSizer (wxVERTICAL); 143 + topSizer->Add (boxSizer, 0, wxALIGN_CENTER | wxALL, 5); 137 144 // creating a control to show the geometry as a text table 138 - wxBoxSizer *geomSizer = new wxBoxSizer(wxHORIZONTAL); 139 - boxSizer->Add(geomSizer, 0, wxALIGN_LEFT | wxALL, 0); 140 - wxTextCtrl *geomCtrl = new wxTextCtrl(panel, ID_GEOM_TABLE, wxT(""), 141 - wxDefaultPosition, wxSize(270, 142 - 320), 143 - wxTE_MULTILINE | wxTE_RICH | 144 - wxTE_READONLY | wxHSCROLL); 145 - geomSizer->Add(geomCtrl, 0, wxALIGN_LEFT | wxALL, 5); 145 + wxBoxSizer *geomSizer = new wxBoxSizer (wxHORIZONTAL); 146 + boxSizer->Add (geomSizer, 0, wxALIGN_LEFT | wxALL, 0); 147 + wxTextCtrl *geomCtrl = new wxTextCtrl (panel, ID_GEOM_TABLE, wxT (""), 148 + wxDefaultPosition, wxSize (270, 149 + 320), 150 + wxTE_MULTILINE | wxTE_RICH | 151 + wxTE_READONLY | wxHSCROLL); 152 + geomSizer->Add (geomCtrl, 0, wxALIGN_LEFT | wxALL, 5); 146 153 // creating a control to show the geometry in a graphical fashion 147 - wxStaticBox *exBox = new wxStaticBox(panel, wxID_STATIC, 148 - wxT("Geometry preview"), 149 - wxDefaultPosition, wxDefaultSize); 150 - wxBoxSizer *exampleSizer = new wxStaticBoxSizer(exBox, wxHORIZONTAL); 151 - geomSizer->Add(exampleSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 152 - DrawGeometry(300, 300); 153 - GraphicsGeometry *geomGraph = new GraphicsGeometry(this, panel, ID_GEOM_GRAPH, 154 - GeomPreview, wxSize(300, 155 - 300)); 156 - exampleSizer->Add(geomGraph, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 157 - panel->SetSizer(topSizer); 158 - topSizer->Fit(panel); 159 - return panel; 154 + wxStaticBox *exBox = new wxStaticBox (panel, wxID_STATIC, 155 + wxT ("Geometry preview"), 156 + wxDefaultPosition, wxDefaultSize); 157 + wxBoxSizer *exampleSizer = new wxStaticBoxSizer (exBox, wxHORIZONTAL); 158 + geomSizer->Add (exampleSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 159 + DrawGeometry (270, 270); 160 + GraphicsGeometry *geomGraph = 161 + new GraphicsGeometry (this, panel, ID_GEOM_GRAPH, 162 + GeomPreview, wxSize (270, 270)); 163 + exampleSizer->Add (geomGraph, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 164 + panel->SetSizer (topSizer); 165 + topSizer->Fit (panel); 166 + return panel; 160 167 } 161 168 162 -wxPanel *BlobExplorerDialog::CreateImagePage(wxWindow * parent) 169 +wxPanel * 170 +BlobExplorerDialog::CreateImagePage (wxWindow * parent) 163 171 { 164 172 // 165 173 // creating the IMAGE page 166 174 // 167 - wxPanel *panel = new wxPanel(parent, ID_PANE_IMAGE); 168 - wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); 169 - panel->SetSizer(topSizer); 170 - wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL); 171 - topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5); 175 + wxPanel *panel = new wxPanel (parent, ID_PANE_IMAGE); 176 + wxBoxSizer *topSizer = new wxBoxSizer (wxVERTICAL); 177 + panel->SetSizer (topSizer); 178 + wxBoxSizer *boxSizer = new wxBoxSizer (wxVERTICAL); 179 + topSizer->Add (boxSizer, 0, wxALIGN_CENTER | wxALL, 5); 172 180 // creating a control to show the image title 173 - wxBoxSizer *imgSizer = new wxBoxSizer(wxVERTICAL); 174 - boxSizer->Add(imgSizer, 0, wxALIGN_TOP | wxALL, 0); 175 - wxStaticText *imageTitle = new wxStaticText(panel, ID_IMAGE_TITLE, 176 - wxT("Image"), 177 - wxDefaultPosition, 178 - wxSize(560, 179 - 10)); 180 - imgSizer->Add(imageTitle, 0, wxALIGN_LEFT | wxALL, 5); 181 + wxBoxSizer *imgSizer = new wxBoxSizer (wxVERTICAL); 182 + boxSizer->Add (imgSizer, 0, wxALIGN_TOP | wxALL, 0); 183 + wxStaticText *imageTitle = new wxStaticText (panel, ID_IMAGE_TITLE, 184 + wxT ("Image"), 185 + wxDefaultPosition, 186 + wxSize (560, 187 + 10)); 188 + imgSizer->Add (imageTitle, 0, wxALIGN_LEFT | wxALL, 5); 181 189 // creating a control to show the image 182 - wxStaticBox *exBox = new wxStaticBox(panel, ID_IMG_BOX, 183 - wxT("Image preview"), 184 - wxDefaultPosition, wxDefaultSize); 185 - wxBoxSizer *exampleSizer = new wxStaticBoxSizer(exBox, wxHORIZONTAL); 186 - imgSizer->Add(exampleSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 187 - ImageShow *imgShow = new ImageShow(this, panel, ID_IMAGE, 188 - wxBitmap(), wxSize(560, 300)); 189 - exampleSizer->Add(imgShow, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 190 - panel->SetSizer(topSizer); 191 - topSizer->Fit(panel); 192 - return panel; 190 + wxStaticBox *exBox = new wxStaticBox (panel, ID_IMG_BOX, 191 + wxT ("Image preview"), 192 + wxDefaultPosition, wxDefaultSize); 193 + wxBoxSizer *exampleSizer = new wxStaticBoxSizer (exBox, wxHORIZONTAL); 194 + imgSizer->Add (exampleSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 195 + ImageShow *imgShow = new ImageShow (this, panel, ID_IMAGE, 196 + wxBitmap (), wxSize (560, 300)); 197 + exampleSizer->Add (imgShow, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 198 + panel->SetSizer (topSizer); 199 + topSizer->Fit (panel); 200 + return panel; 193 201 } 194 202 195 -void BlobExplorerDialog::OnPageChanged(wxNotebookEvent & event) 203 +void 204 +BlobExplorerDialog::OnPageChanged (wxNotebookEvent & event) 196 205 { 197 206 // 198 207 // TAB/PAGE selection changed 199 208 // 200 - switch (event.GetSelection()) 201 - { 209 + switch (event.GetSelection ()) 210 + { 202 211 case 0: 203 - UpdateHexadecimalPage(); 204 - break; 212 + UpdateHexadecimalPage (); 213 + break; 205 214 case 1: 206 - if (BlobType == GAIA_GEOMETRY_BLOB) 207 - UpdateGeometryPage(); 208 - else 209 - UpdateImagePage(); 210 - break; 211 - }; 215 + if (BlobType == MyFrame::BLOB_GEOMETRY) 216 + UpdateGeometryPage (); 217 + else 218 + UpdateImagePage (); 219 + break; 220 + }; 212 221 } 213 222 214 -void BlobExplorerDialog::UpdateHexadecimalPage() 223 +void 224 +BlobExplorerDialog::UpdateHexadecimalPage () 215 225 { 216 226 // 217 227 // updating the HEXADECIMAL page 218 228 // 219 - MyHexList *hexCtrl = (MyHexList *) FindWindow(ID_HEX); 220 - hexCtrl->EnsureVisible(0); 229 + MyHexList *hexCtrl = (MyHexList *) FindWindow (ID_HEX); 230 + hexCtrl->EnsureVisible (0); 221 231 } 222 232 223 -void BlobExplorerDialog::UpdateGeometryPage() 233 +void 234 +BlobExplorerDialog::UpdateGeometryPage () 224 235 { 225 236 // 226 237 // updating the GEOMETRY page 227 238 // 228 - gaiaPointPtr pt; 229 - gaiaLinestringPtr ln; 230 - gaiaPolygonPtr pg; 231 - gaiaRingPtr rng; 232 - int points = 0; 233 - int linestrings = 0; 234 - int polygons = 0; 235 - int ib; 236 - wxString strValue; 237 - char dummy[1024]; 238 - wxTextAttr attrBold(wxColour(0, 0, 0), wxColour(255, 255, 255), 239 - wxFont(9, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, 240 - wxFONTWEIGHT_BOLD)); 241 - wxTextAttr attrNorm(wxColour(0, 0, 0), wxColour(255, 255, 255), 242 - wxFont(9, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, 243 - wxFONTWEIGHT_NORMAL)); 244 - wxTextCtrl *geomCtrl = (wxTextCtrl *) FindWindow(ID_GEOM_TABLE); 245 - if (geomCtrl->GetValue().Len() < 1) 246 - { 247 - ::wxBeginBusyCursor(); 248 - pt = Geometry->FirstPoint; 249 - while (pt) 250 - { 251 - // counting how many points are into this Geometry 252 - points++; 253 - pt = pt->Next; 254 - } 255 - ln = Geometry->FirstLinestring; 256 - while (ln) 257 - { 258 - // counting how many linestrings are into this Geometry 259 - linestrings++; 260 - ln = ln->Next; 261 - } 262 - pg = Geometry->FirstPolygon; 263 - while (pg) 264 - { 265 - // counting how many polygons are into this Geometry 266 - polygons++; 267 - pg = pg->Next; 268 - } 269 - // determining the Geometry type 270 - geomCtrl->SetDefaultStyle(attrNorm); 271 - geomCtrl->AppendText(wxT("SRID: ")); 272 - geomCtrl->SetDefaultStyle(attrBold); 273 - sprintf(dummy, "%d", Geometry->Srid); 274 - strValue = wxString::FromUTF8(dummy); 275 - geomCtrl->AppendText(strValue); 276 - geomCtrl->SetDefaultStyle(attrNorm); 277 - geomCtrl->AppendText(wxT("\n\n")); 278 - strValue = wxT("UNKNOWN GEOMETRY TYPE"); 279 - if (points == 1 && linestrings == 0 && polygons == 0) 280 - { 281 - if (Geometry->DeclaredType == GAIA_MULTIPOINT) 282 - strValue = wxT("MULTIPOINT"); 283 - else if (Geometry->DeclaredType == GAIA_GEOMETRYCOLLECTION) 284 - strValue = wxT("GEOMETRYCOLLECTION"); 285 - else 286 - strValue = wxT("POINT"); 287 - } else if (points == 0 && linestrings == 1 && polygons == 0) 288 - { 289 - if (Geometry->DeclaredType == GAIA_MULTILINESTRING) 290 - strValue = wxT("MULTILINESTRING"); 291 - else if (Geometry->DeclaredType == GAIA_GEOMETRYCOLLECTION) 292 - strValue = wxT("GEOMETRYCOLLECTION"); 293 - else 294 - strValue = wxT("LINESTRING"); 295 - } else if (points == 0 && linestrings == 0 && polygons == 1) 296 - { 297 - if (Geometry->DeclaredType == GAIA_MULTIPOLYGON) 298 - strValue = wxT("MULTIPOLYGON"); 299 - else if (Geometry->DeclaredType == GAIA_GEOMETRYCOLLECTION) 300 - strValue = wxT("GEOMETRYCOLLECTION"); 301 - else 302 - strValue = wxT("POLYGON"); 303 - } else if (points > 1 && linestrings == 0 && polygons == 0) 304 - { 305 - if (Geometry->DeclaredType == GAIA_GEOMETRYCOLLECTION) 306 - strValue = wxT("GEOMETRYCOLLECTION"); 307 - else 308 - strValue = wxT("MULTIPOINT"); 309 - } else if (points == 0 && linestrings > 1 && polygons == 0) 310 - { 311 - if (Geometry->DeclaredType == GAIA_GEOMETRYCOLLECTION) 312 - strValue = wxT("GEOMETRYCOLLECTION"); 313 - else 314 - strValue = wxT("MULTILINESTRING"); 315 - } else if (points == 0 && linestrings == 0 && polygons > 1) 316 - { 317 - if (Geometry->DeclaredType == GAIA_GEOMETRYCOLLECTION) 318 - strValue = wxT("GEOMETRYCOLLECTION"); 319 - else 320 - strValue = wxT("MULTIPOLYGON"); 321 - } else 322 - strValue = wxT("GEOMETRYCOLLECTION"); 323 - geomCtrl->SetDefaultStyle(attrNorm); 324 - geomCtrl->AppendText(wxT("Geometry type: ")); 325 - geomCtrl->SetDefaultStyle(attrBold); 326 - geomCtrl->AppendText(strValue); 327 - geomCtrl->SetDefaultStyle(attrNorm); 328 - geomCtrl->AppendText(wxT("\n\n")); 329 - if (points) 330 - { 331 - // printing the Points list 332 - sprintf(dummy, "#%d POINT", points); 333 - strValue = wxString::FromUTF8(dummy); 334 - if (points > 1) 335 - strValue += wxT("s:"); 336 - else 337 - strValue += wxT(":"); 338 - geomCtrl->SetDefaultStyle(attrBold); 339 - geomCtrl->AppendText(strValue); 340 - geomCtrl->SetDefaultStyle(attrNorm); 341 - pt = Geometry->FirstPoint; 342 - points = 0; 343 - while (pt) 344 - { 345 - // printing each Point 346 - points++; 347 - sprintf(dummy, "\n %d) ", points); 348 - strValue = wxString::FromUTF8(dummy); 349 - geomCtrl->SetDefaultStyle(attrBold); 350 - geomCtrl->AppendText(strValue); 351 - geomCtrl->SetDefaultStyle(attrNorm); 352 - sprintf(dummy, "%1.4lf %1.4lf", pt->X, pt->Y); 353 - strValue = wxString::FromUTF8(dummy); 354 - geomCtrl->AppendText(strValue); 355 - pt = pt->Next; 356 - } 357 - geomCtrl->AppendText(wxT("\n\n\n")); 358 - } 359 - if (linestrings) 360 - { 361 - // printing the Linestrings list 362 - sprintf(dummy, "#%d LINESTRING", linestrings); 363 - strValue = wxString::FromUTF8(dummy); 364 - if (linestrings > 1) 365 - strValue += wxT("s:"); 366 - else 367 - strValue += wxT(":"); 368 - geomCtrl->SetDefaultStyle(attrBold); 369 - geomCtrl->AppendText(strValue); 370 - geomCtrl->SetDefaultStyle(attrNorm); 371 - ln = Geometry->FirstLinestring; 372 - linestrings = 0; 373 - while (ln) 374 - { 375 - // printing each Linestring 376 - linestrings++; 377 - sprintf(dummy, "\n %d) ", linestrings); 378 - strValue = wxString::FromUTF8(dummy); 379 - geomCtrl->SetDefaultStyle(attrBold); 380 - geomCtrl->AppendText(strValue); 381 - geomCtrl->SetDefaultStyle(attrNorm); 382 - sprintf(dummy, "%d vertices", ln->Points); 383 - strValue = wxString::FromUTF8(dummy); 384 - geomCtrl->AppendText(strValue); 385 - ln = ln->Next; 386 - } 387 - geomCtrl->AppendText(wxT("\n\n\n")); 388 - } 389 - if (polygons) 390 - { 391 - // printing the Polygons list 392 - sprintf(dummy, "#%d POLYGON", polygons); 393 - strValue = wxString::FromUTF8(dummy); 394 - if (polygons > 1) 395 - strValue += wxT("s:"); 396 - else 397 - strValue += wxT(":"); 398 - geomCtrl->SetDefaultStyle(attrBold); 399 - geomCtrl->AppendText(strValue); 400 - geomCtrl->SetDefaultStyle(attrNorm); 401 - pg = Geometry->FirstPolygon; 402 - polygons = 0; 403 - while (pg) 404 - { 405 - // printing each Polygon 406 - polygons++; 407 - sprintf(dummy, "\n %d) exterior ring", polygons); 408 - strValue = wxString::FromUTF8(dummy); 409 - geomCtrl->SetDefaultStyle(attrBold); 410 - geomCtrl->AppendText(strValue); 411 - geomCtrl->SetDefaultStyle(attrNorm); 412 - rng = pg->Exterior; 413 - sprintf(dummy, ": %d vertices", rng->Points); 414 - strValue = wxString::FromUTF8(dummy); 415 - geomCtrl->AppendText(strValue); 416 - for (ib = 0; ib < pg->NumInteriors; ib++) 417 - { 418 - // printing each interior ring 419 - sprintf(dummy, "\n %d.%d) ", polygons, ib + 1); 420 - strValue = wxString::FromUTF8(dummy); 421 - geomCtrl->SetDefaultStyle(attrBold); 422 - geomCtrl->AppendText(strValue); 423 - geomCtrl->SetDefaultStyle(attrNorm); 424 - rng = pg->Interiors + ib; 425 - sprintf(dummy, " interior ring: %d vertices", rng->Points); 426 - strValue = wxString::FromUTF8(dummy); 427 - geomCtrl->AppendText(strValue); 428 - } 429 - pg = pg->Next; 430 - } 431 - geomCtrl->AppendText(wxT("\n\n\n")); 432 - } 433 - ::wxEndBusyCursor(); 434 - } 435 - GraphicsGeometry *geomGraph = (GraphicsGeometry *) FindWindow(ID_GEOM_GRAPH); 436 - geomGraph->SetBitmap(GeomPreview); 239 + gaiaPointPtr pt; 240 + gaiaLinestringPtr ln; 241 + gaiaPolygonPtr pg; 242 + gaiaRingPtr rng; 243 + int points = 0; 244 + int linestrings = 0; 245 + int polygons = 0; 246 + int ib; 247 + wxString strValue; 248 + wxTextAttr attrBold (wxColour (0, 0, 0), wxColour (255, 255, 255), 249 + wxFont (9, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, 250 + wxFONTWEIGHT_BOLD)); 251 + wxTextAttr attrNorm (wxColour (0, 0, 0), wxColour (255, 255, 255), 252 + wxFont (9, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, 253 + wxFONTWEIGHT_NORMAL)); 254 + wxTextCtrl *geomCtrl = (wxTextCtrl *) FindWindow (ID_GEOM_TABLE); 255 + if (geomCtrl->GetValue ().Len () < 1) 256 + { 257 + ::wxBeginBusyCursor (); 258 + pt = Geometry->FirstPoint; 259 + while (pt) 260 + { 261 + // counting how many points are into this Geometry 262 + points++; 263 + pt = pt->Next; 264 + } 265 + ln = Geometry->FirstLinestring; 266 + while (ln) 267 + { 268 + // counting how many linestrings are into this Geometry 269 + linestrings++; 270 + ln = ln->Next; 271 + } 272 + pg = Geometry->FirstPolygon; 273 + while (pg) 274 + { 275 + // counting how many polygons are into this Geometry 276 + polygons++; 277 + pg = pg->Next; 278 + } 279 + // determining the Geometry type 280 + geomCtrl->SetDefaultStyle (attrNorm); 281 + geomCtrl->AppendText (wxT ("SRID: ")); 282 + geomCtrl->SetDefaultStyle (attrBold); 283 + strValue.Printf (wxT ("%d"), Geometry->Srid); 284 + geomCtrl->AppendText (strValue); 285 + geomCtrl->SetDefaultStyle (attrNorm); 286 + geomCtrl->AppendText (wxT ("\n\n")); 287 + strValue = wxT ("UNKNOWN GEOMETRY TYPE"); 288 + if (points == 1 && linestrings == 0 && polygons == 0) 289 + strValue = wxT ("POINT"); 290 + else if (points == 0 && linestrings == 1 && polygons == 0) 291 + strValue = wxT ("LINESTRING"); 292 + else if (points == 0 && linestrings == 0 && polygons == 1) 293 + strValue = wxT ("POLYGON"); 294 + else if (points > 1 && linestrings == 0 && polygons == 0) 295 + strValue = wxT ("MULTIPOINT"); 296 + else if (points == 0 && linestrings > 1 && polygons == 0) 297 + strValue = wxT ("MULTILINESTRING"); 298 + else if (points == 0 && linestrings == 0 && polygons > 1) 299 + strValue = wxT ("MULTIPOLYGON"); 300 + else 301 + strValue = wxT ("GEOMETRYCOLLECTION"); 302 + geomCtrl->SetDefaultStyle (attrNorm); 303 + geomCtrl->AppendText (wxT ("Geometry type: ")); 304 + geomCtrl->SetDefaultStyle (attrBold); 305 + geomCtrl->AppendText (strValue); 306 + geomCtrl->SetDefaultStyle (attrNorm); 307 + geomCtrl->AppendText (wxT ("\n\n")); 308 + if (points) 309 + { 310 + // printing the Points list 311 + strValue.Printf (wxT ("#%d POINT"), points); 312 + if (points > 1) 313 + strValue += wxT ("s:"); 314 + else 315 + strValue += wxT (":"); 316 + geomCtrl->SetDefaultStyle (attrBold); 317 + geomCtrl->AppendText (strValue); 318 + geomCtrl->SetDefaultStyle (attrNorm); 319 + pt = Geometry->FirstPoint; 320 + points = 0; 321 + while (pt) 322 + { 323 + // printing each Point 324 + points++; 325 + strValue.Printf (wxT ("\n %d) "), points); 326 + geomCtrl->SetDefaultStyle (attrBold); 327 + geomCtrl->AppendText (strValue); 328 + geomCtrl->SetDefaultStyle (attrNorm); 329 + strValue.Printf (wxT ("%1.4lf %1.4lf"), pt->X, pt->Y); 330 + geomCtrl->AppendText (strValue); 331 + pt = pt->Next; 332 + } 333 + geomCtrl->AppendText (wxT ("\n\n\n")); 334 + } 335 + if (linestrings) 336 + { 337 + // printing the Linestrings list 338 + strValue.Printf (wxT ("#%d LINESTRING"), linestrings); 339 + if (linestrings > 1) 340 + strValue += wxT ("s:"); 341 + else 342 + strValue += wxT (":"); 343 + geomCtrl->SetDefaultStyle (attrBold); 344 + geomCtrl->AppendText (strValue); 345 + geomCtrl->SetDefaultStyle (attrNorm); 346 + ln = Geometry->FirstLinestring; 347 + linestrings = 0; 348 + while (ln) 349 + { 350 + // printing each Linestring 351 + linestrings++; 352 + strValue.Printf (wxT ("\n %d) "), linestrings); 353 + geomCtrl->SetDefaultStyle (attrBold); 354 + geomCtrl->AppendText (strValue); 355 + geomCtrl->SetDefaultStyle (attrNorm); 356 + strValue.Printf (wxT ("%d vertices"), ln->Points); 357 + geomCtrl->AppendText (strValue); 358 + ln = ln->Next; 359 + } 360 + geomCtrl->AppendText (wxT ("\n\n\n")); 361 + } 362 + if (polygons) 363 + { 364 + // printing the Polygons list 365 + strValue.Printf (wxT ("#%d POLYGON"), polygons); 366 + if (polygons > 1) 367 + strValue += wxT ("s:"); 368 + else 369 + strValue += wxT (":"); 370 + geomCtrl->SetDefaultStyle (attrBold); 371 + geomCtrl->AppendText (strValue); 372 + geomCtrl->SetDefaultStyle (attrNorm); 373 + pg = Geometry->FirstPolygon; 374 + polygons = 0; 375 + while (pg) 376 + { 377 + // printing each Polygon 378 + polygons++; 379 + strValue.Printf (wxT ("\n %d) exterior ring"), 380 + polygons); 381 + geomCtrl->SetDefaultStyle (attrBold); 382 + geomCtrl->AppendText (strValue); 383 + geomCtrl->SetDefaultStyle (attrNorm); 384 + rng = pg->Exterior; 385 + strValue.Printf (wxT (": %d vertices"), rng->Points); 386 + geomCtrl->AppendText (strValue); 387 + for (ib = 0; ib < pg->NumInteriors; ib++) 388 + { 389 + // printing each interior ring 390 + strValue.Printf (wxT ("\n %d.%d) "), polygons, 391 + ib + 1); 392 + geomCtrl->SetDefaultStyle (attrBold); 393 + geomCtrl->AppendText (strValue); 394 + geomCtrl->SetDefaultStyle (attrNorm); 395 + rng = pg->Interiors + ib; 396 + strValue.Printf (wxT 397 + (" interior ring: %d vertices"), 398 + rng->Points); 399 + geomCtrl->AppendText (strValue); 400 + } 401 + pg = pg->Next; 402 + } 403 + geomCtrl->AppendText (wxT ("\n\n\n")); 404 + } 405 + ::wxEndBusyCursor (); 406 + } 407 + GraphicsGeometry *geomGraph = 408 + (GraphicsGeometry *) FindWindow (ID_GEOM_GRAPH); 409 + geomGraph->SetBitmap (GeomPreview); 437 410 } 438 411 439 -void BlobExplorerDialog::UpdateImagePage() 412 +void 413 +BlobExplorerDialog::UpdateImagePage () 440 414 { 441 415 // 442 416 // updating the IMAGE page 443 417 // 444 - double horz; 445 - double vert; 446 - wxImage scaledImg; 447 - wxSize sz; 448 - wxSize box; 449 - int boxX; 450 - int boxY; 451 - int posX; 452 - int posY; 453 - char latlong[1024]; 454 - char dummy[1024]; 455 - wxString ll; 456 - wxString title = wxT("Invalid Image"); 457 - wxStaticBox *imgBox = (wxStaticBox *) FindWindow(ID_IMG_BOX); 458 - ImageShow *imgShow = (ImageShow *) FindWindow(ID_IMAGE); 459 - wxStaticText *imageTitle = (wxStaticText *) FindWindow(ID_IMAGE_TITLE); 460 - if (Image) 461 - { 462 - ::wxBeginBusyCursor(); 463 - if (Image->IsOk() == true) 464 - { 465 - horz = Image->GetWidth(); 466 - vert = Image->GetHeight(); 467 - sz = imgShow->GetSize(); 468 - box = imgBox->GetSize(); 469 - while (horz > sz.GetWidth() || vert > sz.GetHeight()) 470 - { 471 - horz *= 0.9; 472 - vert *= 0.9; 473 - } 474 - if (horz == Image->GetWidth() && vert == Image->GetHeight()) 475 - scaledImg = Image->Copy(); 476 - else 477 - scaledImg = 478 - Image->Scale((int) horz, (int) vert, wxIMAGE_QUALITY_HIGH); 479 - wxBitmap bmp(scaledImg); 480 - imgBox->GetPosition(&boxX, &boxY); 481 - posX = (box.GetWidth() - (int) horz) / 2; 482 - posY = (box.GetHeight() - (int) vert) / 2; 483 - imgShow->SetSize(boxX + posX, boxY + posY, (int) horz, (int) vert); 484 - imgShow->SetBitmap(bmp); 485 - imgShow->Show(true); 486 - switch (BlobType) 487 - { 488 - case GAIA_JPEG_BLOB: 489 - sprintf(dummy, 490 - "JPEG image resolution: %d x %d %d bytes", 491 - Image->GetWidth(), Image->GetHeight(), BlobSize); 492 - title = wxString::FromUTF8(dummy); 493 - break; 494 - case GAIA_EXIF_BLOB: 495 - sprintf(dummy, 496 - "EXIF image resolution: %d x %d %d bytes", 497 - Image->GetWidth(), Image->GetHeight(), BlobSize); 498 - title = wxString::FromUTF8(dummy); 499 - break; 500 - case GAIA_EXIF_GPS_BLOB: 501 - if (gaiaGetGpsLatLong(Blob, BlobSize, latlong, 1024)) 502 - ll = wxString::FromUTF8(latlong); 503 - else 504 - ll = wxT("NOT AVAILABLE"); 505 - sprintf(dummy, 506 - "EXIF-GPS image resolution: %d x %d %d bytes GPS: ", 507 - Image->GetWidth(), Image->GetHeight(), BlobSize); 508 - title = wxString::FromUTF8(dummy); 509 - title += ll; 510 - break; 511 - case GAIA_PNG_BLOB: 512 - sprintf(dummy, 513 - "PNG image resolution: %d x %d %d bytes", 514 - Image->GetWidth(), Image->GetHeight(), BlobSize); 515 - title = wxString::FromUTF8(dummy); 516 - break; 517 - case GAIA_GIF_BLOB: 518 - sprintf(dummy, 519 - "GIF image resolution: %d x %d %d bytes", 520 - Image->GetWidth(), Image->GetHeight(), BlobSize); 521 - title = wxString::FromUTF8(dummy); 522 - break; 523 - } 524 - } 525 - ::wxEndBusyCursor(); 526 - } 527 - imageTitle->SetLabel(title); 418 + double horz; 419 + double vert; 420 + wxImage scaledImg; 421 + wxSize sz; 422 + wxSize box; 423 + int boxX; 424 + int boxY; 425 + int posX; 426 + int posY; 427 + wxString title = wxT ("Invalid Image"); 428 + wxStaticBox *imgBox = (wxStaticBox *) FindWindow (ID_IMG_BOX); 429 + ImageShow *imgShow = (ImageShow *) FindWindow (ID_IMAGE); 430 + wxStaticText *imageTitle = (wxStaticText *) FindWindow (ID_IMAGE_TITLE); 431 + if (Image) 432 + { 433 + ::wxBeginBusyCursor (); 434 + if (Image->IsOk () == true) 435 + { 436 + horz = Image->GetWidth (); 437 + vert = Image->GetHeight (); 438 + sz = imgShow->GetSize (); 439 + box = imgBox->GetSize (); 440 + while (horz > sz.GetWidth () || vert > sz.GetHeight ()) 441 + { 442 + horz *= 0.9; 443 + vert *= 0.9; 444 + } 445 + if (horz == Image->GetWidth () && vert == Image->GetHeight ()) 446 + scaledImg = Image->Copy (); 447 + else 448 + scaledImg = 449 + Image->Scale ((int) horz, (int) vert, 450 + wxIMAGE_QUALITY_HIGH); 451 + wxBitmap bmp (scaledImg); 452 + imgBox->GetPosition (&boxX, &boxY); 453 + posX = (box.GetWidth () - (int) horz) / 2; 454 + posY = (box.GetHeight () - (int) vert) / 2; 455 + imgShow->SetSize (boxX + posX, boxY + posY, (int) horz, 456 + (int) vert); 457 + imgShow->SetBitmap (bmp); 458 + imgShow->Show (true); 459 + switch (BlobType) 460 + { 461 + case MyFrame::BLOB_JPEG: 462 + title.Printf (wxT 463 + ("JPEG image resolution: %d x %d %d bytes"), 464 + Image->GetWidth (), Image->GetHeight (), 465 + BlobSize); 466 + break; 467 + case MyFrame::BLOB_PNG: 468 + title.Printf (wxT 469 + ("PNG image resolution: %d x %d %d bytes"), 470 + Image->GetWidth (), Image->GetHeight (), 471 + BlobSize); 472 + break; 473 + case MyFrame::BLOB_GIF: 474 + title.Printf (wxT 475 + ("GIF image resolution: %d x %d %d bytes"), 476 + Image->GetWidth (), Image->GetHeight (), 477 + BlobSize); 478 + break; 479 + } 480 + } 481 + ::wxEndBusyCursor (); 482 + } 483 + imageTitle->SetLabel (title); 528 484 } 529 485 530 -void BlobExplorerDialog::OnOk(wxCommandEvent & event) 486 +void 487 +BlobExplorerDialog::OnOk (wxCommandEvent & event) 531 488 { 532 489 // 533 490 // all done: exiting 534 491 // 535 - wxDialog::EndModal(wxID_OK); 492 + wxDialog::EndModal (wxID_OK); 536 493 } 537 494 538 -void BlobExplorerDialog::DrawGeometry(int horz, int vert) 495 +void 496 +BlobExplorerDialog::DrawGeometry (int horz, int vert) 539 497 { 540 498 // 541 499 // drawing graphic representation for current Geometry 542 500 // 543 - gaiaPointPtr pt; 544 - gaiaLinestringPtr ln; 545 - gaiaPolygonPtr pg; 546 - gaiaRingPtr rng; 547 - double minx; 548 - double miny; 549 - double maxx; 550 - double maxy; 551 - double ext_x; 552 - double ext_y; 553 - double cx; 554 - double cy; 555 - double pixelRatioX; 556 - double pixelRatioY; 557 - double pixelRatio; 558 - double span_x; 559 - double span_y; 560 - double baseX; 561 - double baseY; 562 - double x; 563 - double y; 564 - double xx; 565 - double yy; 566 - int iv; 567 - int ib; 568 - int pts; 569 - int *borders; 570 - wxPoint *points; 571 - GeomPreview.Create(horz, vert); 572 - wxMemoryDC dc(GeomPreview); 501 + gaiaPointPtr pt; 502 + gaiaLinestringPtr ln; 503 + gaiaPolygonPtr pg; 504 + gaiaRingPtr rng; 505 + double minx; 506 + double miny; 507 + double maxx; 508 + double maxy; 509 + double ext_x; 510 + double ext_y; 511 + double cx; 512 + double cy; 513 + double pixelRatioX; 514 + double pixelRatioY; 515 + double pixelRatio; 516 + double span_x; 517 + double span_y; 518 + double baseX; 519 + double baseY; 520 + double x; 521 + double y; 522 + double xx; 523 + double yy; 524 + int iv; 525 + int ib; 526 + int pts; 527 + int *borders; 528 + wxPoint *points; 529 + GeomPreview.Create (horz, vert); 530 + wxMemoryDC dc (GeomPreview); 573 531 // 574 532 // background filling 575 533 // 576 - dc.SetBrush(wxBrush(wxColour(255, 255, 255))); 577 - dc.DrawRectangle(0, 0, horz, vert); 534 + dc.SetBrush (wxBrush (wxColour (255, 255, 255))); 535 + dc.DrawRectangle (0, 0, horz, vert); 578 536 // 579 537 // prepearing the drawing pen and brush 580 538 // 581 - dc.SetBrush(wxBrush(wxColour(240, 240, 192))); 582 - dc.SetPen(wxPen(wxColour(64, 64, 192), 1)); 539 + dc.SetBrush (wxBrush (wxColour (240, 240, 192))); 540 + dc.SetPen (wxPen (wxColour (64, 64, 192), 1)); 583 541 // 584 542 // computing the pixel ratio, center position and so on 585 543 // 586 - minx = Geometry->MinX; 587 - miny = Geometry->MinY; 588 - maxx = Geometry->MaxX; 589 - maxy = Geometry->MaxY; 590 - ext_x = maxx - minx; 591 - ext_y = maxy - miny; 592 - if (ext_x < 1.0) 593 - ext_x = 1.0; 594 - if (ext_y < 1.0) 595 - ext_y = 1.0; 596 - minx = Geometry->MinX - (ext_x / 20.0); 597 - miny = Geometry->MinY - (ext_y / 20.0); 598 - maxx = Geometry->MaxX + (ext_x / 20.0); 599 - maxy = Geometry->MaxY + (ext_y / 20.0); 600 - ext_x = maxx - minx; 601 - ext_y = maxy - miny; 602 - cx = minx + (ext_x / 2.0); 603 - cy = miny + (ext_y / 2.0); 604 - pixelRatioX = ext_x / horz; 605 - pixelRatioY = ext_y / vert; 606 - if (pixelRatioX > pixelRatioY) 607 - pixelRatio = pixelRatioX; 608 - else 609 - pixelRatio = pixelRatioY; 544 + minx = Geometry->MinX; 545 + miny = Geometry->MinY; 546 + maxx = Geometry->MaxX; 547 + maxy = Geometry->MaxY; 548 + ext_x = maxx - minx; 549 + ext_y = maxy - miny; 550 + if (ext_x < 1.0) 551 + ext_x = 1.0; 552 + if (ext_y < 1.0) 553 + ext_y = 1.0; 554 + minx = Geometry->MinX - (ext_x / 20.0); 555 + miny = Geometry->MinY - (ext_y / 20.0); 556 + maxx = Geometry->MaxX + (ext_x / 20.0); 557 + maxy = Geometry->MaxY + (ext_y / 20.0); 558 + ext_x = maxx - minx; 559 + ext_y = maxy - miny; 560 + cx = minx + (ext_x / 2.0); 561 + cy = miny + (ext_y / 2.0); 562 + pixelRatioX = ext_x / horz; 563 + pixelRatioY = ext_y / vert; 564 + if (pixelRatioX > pixelRatioY) 565 + pixelRatio = pixelRatioX; 566 + else 567 + pixelRatio = pixelRatioY; 610 568 // 611 569 // centering the Y axis 612 570 // 613 - span_y = vert * pixelRatio; 614 - baseY = cy - (span_y / 2.0); 571 + span_y = vert * pixelRatio; 572 + baseY = cy - (span_y / 2.0); 615 573 // 616 574 // centering the X axis 617 575 // 618 - span_x = horz * pixelRatio; 619 - baseX = cx - (span_x / 2.0); 620 - pg = Geometry->FirstPolygon; 621 - while (pg) 622 - { 623 - // 624 - // drawing polygons 625 - // 626 - pts = pg->Exterior->Points; 627 - for (ib = 0; ib < pg->NumInteriors; ib++) 628 - { 629 - rng = pg->Interiors + ib; 630 - pts += rng->Points; 631 - } 632 - borders = new int[pg->NumInteriors + 1]; 633 - points = new wxPoint[pts]; 634 - pts = 0; 635 - rng = pg->Exterior; 636 - borders[0] = rng->Points; 637 - for (iv = 0; iv < rng->Points; iv++) 638 - { 639 - gaiaGetPoint(rng->Coords, iv, &x, &y); 640 - xx = (x - baseX) / pixelRatio; 641 - yy = (y - baseY) / pixelRatio; 642 - yy = vert - yy; 643 - points[pts].x = (int) xx; 644 - points[pts].y = (int) yy; 645 - pts++; 646 - } 647 - for (ib = 0; ib < pg->NumInteriors; ib++) 648 - { 649 - rng = pg->Interiors + ib; 650 - borders[1 + ib] = rng->Points; 651 - for (iv = 0; iv < rng->Points; iv++) 652 - { 653 - gaiaGetPoint(rng->Coords, iv, &x, &y); 654 - xx = (x - baseX) / pixelRatio; 655 - yy = (y - baseY) / pixelRatio; 656 - yy = vert - yy; 657 - points[pts].x = (int) xx; 658 - points[pts].y = (int) yy; 659 - pts++; 660 - } 661 - } 662 - dc.DrawPolyPolygon(pg->NumInteriors + 1, borders, points); 663 - delete[]points; 664 - delete[]borders; 665 - pg = pg->Next; 666 - } 667 - ln = Geometry->FirstLinestring; 668 - while (ln) 669 - { 670 - // 671 - // drawing linestrings 672 - // 673 - points = new wxPoint[ln->Points]; 674 - for (iv = 0; iv < ln->Points; iv++) 675 - { 676 - gaiaGetPoint(ln->Coords, iv, &x, &y); 677 - xx = (x - baseX) / pixelRatio; 678 - yy = (y - baseY) / pixelRatio; 679 - yy = vert - yy; 680 - points[iv].x = (int) xx; 681 - points[iv].y = (int) yy; 682 - } 683 - dc.DrawLines(ln->Points, points); 684 - delete[]points; 685 - ln = ln->Next; 686 - } 687 - pt = Geometry->FirstPoint; 688 - while (pt) 689 - { 690 - // 691 - // drawing points 692 - // 693 - xx = (pt->X - baseX) / pixelRatio; 694 - yy = (pt->Y - baseY) / pixelRatio; 695 - yy = vert - yy; 696 - dc.DrawCircle((int) xx, (int) yy, 2); 697 - pt = pt->Next; 698 - } 576 + span_x = horz * pixelRatio; 577 + baseX = cx - (span_x / 2.0); 578 + pg = Geometry->FirstPolygon; 579 + while (pg) 580 + { 581 + // 582 + // drawing polygons 583 + // 584 + pts = pg->Exterior->Points; 585 + for (ib = 0; ib < pg->NumInteriors; ib++) 586 + { 587 + rng = pg->Interiors + ib; 588 + pts += rng->Points; 589 + } 590 + borders = new int[pg->NumInteriors + 1]; 591 + points = new wxPoint[pts]; 592 + pts = 0; 593 + rng = pg->Exterior; 594 + borders[0] = rng->Points; 595 + for (iv = 0; iv < rng->Points; iv++) 596 + { 597 + gaiaGetPoint (rng->Coords, iv, &x, &y); 598 + xx = (x - baseX) / pixelRatio; 599 + yy = (y - baseY) / pixelRatio; 600 + yy = vert - yy; 601 + points[pts].x = (int) xx; 602 + points[pts].y = (int) yy; 603 + pts++; 604 + } 605 + for (ib = 0; ib < pg->NumInteriors; ib++) 606 + { 607 + rng = pg->Interiors + ib; 608 + borders[1 + ib] = rng->Points; 609 + for (iv = 0; iv < rng->Points; iv++) 610 + { 611 + gaiaGetPoint (rng->Coords, iv, &x, &y); 612 + xx = (x - baseX) / pixelRatio; 613 + yy = (y - baseY) / pixelRatio; 614 + yy = vert - yy; 615 + points[pts].x = (int) xx; 616 + points[pts].y = (int) yy; 617 + pts++; 618 + } 619 + } 620 + dc.DrawPolyPolygon (pg->NumInteriors + 1, borders, points); 621 + delete[]points; 622 + delete[]borders; 623 + pg = pg->Next; 624 + } 625 + ln = Geometry->FirstLinestring; 626 + while (ln) 627 + { 628 + // 629 + // drawing linestrings 630 + // 631 + points = new wxPoint[ln->Points]; 632 + for (iv = 0; iv < ln->Points; iv++) 633 + { 634 + gaiaGetPoint (ln->Coords, iv, &x, &y); 635 + xx = (x - baseX) / pixelRatio; 636 + yy = (y - baseY) / pixelRatio; 637 + yy = vert - yy; 638 + points[iv].x = (int) xx; 639 + points[iv].y = (int) yy; 640 + } 641 + dc.DrawLines (ln->Points, points); 642 + delete[]points; 643 + ln = ln->Next; 644 + } 645 + pt = Geometry->FirstPoint; 646 + while (pt) 647 + { 648 + // 649 + // drawing points 650 + // 651 + xx = (pt->X - baseX) / pixelRatio; 652 + yy = (pt->Y - baseY) / pixelRatio; 653 + yy = vert - yy; 654 + dc.DrawCircle ((int) xx, (int) yy, 2); 655 + pt = pt->Next; 656 + } 657 +} 658 + 659 +GraphicsGeometry::GraphicsGeometry (BlobExplorerDialog * parent, 660 + wxWindow * panel, wxWindowID id, 661 + const wxBitmap & bmp, const wxSize & size): 662 +wxStaticBitmap (panel, id, bmp, wxDefaultPosition, size) 663 +{ 664 + Parent = parent; 665 +} 666 + 667 +ImageShow::ImageShow (BlobExplorerDialog * parent, wxWindow * panel, 668 + wxWindowID id, const wxBitmap & bmp, const wxSize & size): 669 +wxStaticBitmap (panel, id, bmp, wxDefaultPosition, size) 670 +{ 671 + Parent = parent; 672 +// appends event handler 673 + Connect (ID_IMAGE, wxEVT_RIGHT_DOWN, 674 + (wxObjectEventFunction) & ImageShow::OnRightClick); 675 + Connect (Image_Copy, wxEVT_COMMAND_MENU_SELECTED, 676 + (wxObjectEventFunction) & ImageShow::OnCmdCopy); 699 677 } 700 678 701 -GraphicsGeometry::GraphicsGeometry(BlobExplorerDialog * parent, 702 - wxWindow * panel, wxWindowID id, 703 - const wxBitmap & bmp, 704 - const wxSize & size):wxStaticBitmap(panel, 705 - id, bmp, 706 - wxDefaultPosition, 707 - size) 708 -{ 709 - Parent = parent; 710 -} 711 - 712 -ImageShow::ImageShow(BlobExplorerDialog * parent, wxWindow * panel, 713 - wxWindowID id, const wxBitmap & bmp, 714 - const wxSize & size):wxStaticBitmap(panel, id, bmp, 715 - wxDefaultPosition, 716 - size) 717 -{ 718 - Parent = parent; 719 -// appends event handler 720 - Connect(ID_IMAGE, wxEVT_RIGHT_DOWN, 721 - (wxObjectEventFunction) & ImageShow::OnRightClick); 722 - Connect(Image_Copy, wxEVT_COMMAND_MENU_SELECTED, 723 - (wxObjectEventFunction) & ImageShow::OnCmdCopy); 724 -} 725 - 726 -void ImageShow::OnRightClick(wxMouseEvent & event) 679 +void 680 +ImageShow::OnRightClick (wxMouseEvent & event) 727 681 { 728 682 // 729 683 // right click on the Image 730 684 // 731 - wxMenu *menu = new wxMenu(); 732 - wxMenuItem *menuItem; 733 - wxImage *Image = Parent->GetImage(); 734 - if (Image) 735 - { 736 - if (Image->IsOk() == true) 737 - { 738 - wxPoint pt = event.GetPosition(); 739 - menuItem = new wxMenuItem(menu, Image_Copy, wxT("&Copy")); 740 - menu->Append(menuItem); 741 - PopupMenu(menu, pt); 742 - } 743 - } 685 + wxMenu menu; 686 + wxMenuItem *menuItem; 687 + wxImage *Image = Parent->GetImage (); 688 + if (Image) 689 + { 690 + if (Image->IsOk () == true) 691 + { 692 + wxPoint pt = event.GetPosition (); 693 + menuItem = new wxMenuItem (&menu, Image_Copy, wxT ("&Copy")); 694 + menu.Append (menuItem); 695 + PopupMenu (&menu, pt); 696 + } 697 + } 744 698 } 745 699 746 -void ImageShow::OnCmdCopy(wxCommandEvent & event) 700 +void 701 +ImageShow::OnCmdCopy (wxCommandEvent & event) 747 702 { 748 703 // 749 704 // copying the Image into the clipboard 750 705 // 751 - wxImage *Image = Parent->GetImage(); 752 - if (wxTheClipboard->Open()) 753 - { 754 - wxTheClipboard->SetData(new wxBitmapDataObject(*Image)); 755 - wxTheClipboard->Close(); 756 - } 706 + wxImage *Image = Parent->GetImage (); 707 + if (wxTheClipboard->Open ()) 708 + { 709 + wxTheClipboard->SetData (new wxBitmapDataObject (*Image)); 710 + wxTheClipboard->Close (); 711 + } 757 712 } 758 713 759 -MyHexList::MyHexList(BlobExplorerDialog * parent, unsigned char *blob, 760 - int blob_size, wxWindow * panel, wxWindowID id, 761 - const wxPoint & pos, const wxSize & size, 762 - long style):wxListCtrl(panel, id, pos, size, style) 714 +MyHexList::MyHexList (BlobExplorerDialog * parent, unsigned char *blob, 715 + int blob_size, wxWindow * panel, wxWindowID id, 716 + const wxPoint & pos, const wxSize & size, long style): 717 +wxListCtrl (panel, id, pos, size, style) 763 718 { 764 719 // constructor - the blob hexadecimal dump 765 - int i = 0; 766 - int rows = 0; 767 - Parent = parent; 768 - Blob = blob; 769 - BlobSize = blob_size; 770 - while (i < BlobSize) 771 - { 772 - // counting how many rows are there 773 - rows++; 774 - i += 16; 775 - } 776 - SetItemCount(rows); 720 + int i = 0; 721 + int rows = 0; 722 + Parent = parent; 723 + Blob = blob; 724 + BlobSize = blob_size; 725 + while (i < BlobSize) 726 + { 727 + // counting how many rows are there 728 + rows++; 729 + i += 16; 730 + } 731 + SetItemCount (rows); 777 732 } 778 733 779 -MyHexList::~MyHexList() 734 +MyHexList::~MyHexList () 780 735 { 781 736 // does nothing 782 737 } 783 738 784 -wxString MyHexList::OnGetItemText(long item, long column) const 739 +wxString MyHexList::OnGetItemText (long item, long column) const 785 740 { 786 741 // return a column value 787 - int i; 788 - int c; 789 - int base = item * 16; 790 - wxString value; 791 - char dummy[64]; 792 - wxString hex; 793 - if (column == 0) 794 - { 795 - sprintf(dummy, "%08xd", base); 796 - value = wxString::FromUTF8(dummy); 797 - } else if (column == 1) 798 - { 799 - // prepearing the hex-dump 800 - c = 0; 801 - for (i = base; i < BlobSize; i++) 802 - { 803 - if (c >= 16) 804 - break; 805 - sprintf(dummy, "%02x", *(Blob + i)); 806 - hex = wxString::FromUTF8(dummy); 807 - if (c == 8) 808 - value += wxT(" "); 809 - else 810 - value += wxT(" "); 811 - value += hex; 812 - c++; 813 - } 814 - } else 815 - { 816 - // prepearing the ascii dump 817 - c = 0; 818 - for (i = base; i < BlobSize; i++) 819 - { 820 - if (c >= 16) 821 - break; 822 - if (isprint(*(Blob + i))) 823 - { 824 - sprintf(dummy, "%c", *(Blob + i)); 825 - hex = wxString::FromUTF8(dummy); 826 - } else 827 - hex = wxT("."); 828 - value += hex; 829 - c++; 830 - } 831 - } 832 - return value; 742 + int 743 + i; 744 + int 745 + c; 746 + int 747 + base = item * 16; 748 + wxString 749 + value; 750 + wxString 751 + hex; 752 + if (column == 0) 753 + value.Printf (wxT ("%08xd"), base); 754 + else if (column == 1) 755 + { 756 + // prepearing the hex-dump 757 + c = 0; 758 + for (i = base; i < BlobSize; i++) 759 + { 760 + if (c >= 16) 761 + break; 762 + hex.Printf (wxT ("%02x"), *(Blob + i)); 763 + if (c == 8) 764 + value += wxT (" "); 765 + else 766 + value += wxT (" "); 767 + value += hex; 768 + c++; 769 + } 770 + } 771 + else 772 + { 773 + // prepearing the ascii dump 774 + c = 0; 775 + for (i = base; i < BlobSize; i++) 776 + { 777 + if (c >= 16) 778 + break; 779 + if (isprint (*(Blob + i))) 780 + hex.Printf (wxT ("%c"), *(Blob + i)); 781 + else 782 + hex = wxT ("."); 783 + value += hex; 784 + c++; 785 + } 786 + } 787 + return value; 833 788 }
Deleted COPYING.
1 - GNU GENERAL PUBLIC LICENSE 2 - Version 3, 29 June 2007 3 - 4 - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> 5 - Everyone is permitted to copy and distribute verbatim copies 6 - of this license document, but changing it is not allowed. 7 - 8 - Preamble 9 - 10 - The GNU General Public License is a free, copyleft license for 11 -software and other kinds of works. 12 - 13 - The licenses for most software and other practical works are designed 14 -to take away your freedom to share and change the works. By contrast, 15 -the GNU General Public License is intended to guarantee your freedom to 16 -share and change all versions of a program--to make sure it remains free 17 -software for all its users. We, the Free Software Foundation, use the 18 -GNU General Public License for most of our software; it applies also to 19 -any other work released this way by its authors. You can apply it to 20 -your programs, too. 21 - 22 - When we speak of free software, we are referring to freedom, not 23 -price. Our General Public Licenses are designed to make sure that you 24 -have the freedom to distribute copies of free software (and charge for 25 -them if you wish), that you receive source code or can get it if you 26 -want it, that you can change the software or use pieces of it in new 27 -free programs, and that you know you can do these things. 28 - 29 - To protect your rights, we need to prevent others from denying you 30 -these rights or asking you to surrender the rights. Therefore, you have 31 -certain responsibilities if you distribute copies of the software, or if 32 -you modify it: responsibilities to respect the freedom of others. 33 - 34 - For example, if you distribute copies of such a program, whether 35 -gratis or for a fee, you must pass on to the recipients the same 36 -freedoms that you received. You must make sure that they, too, receive 37 -or can get the source code. And you must show them these terms so they 38 -know their rights. 39 - 40 - Developers that use the GNU GPL protect your rights with two steps: 41 -(1) assert copyright on the software, and (2) offer you this License 42 -giving you legal permission to copy, distribute and/or modify it. 43 - 44 - For the developers' and authors' protection, the GPL clearly explains 45 -that there is no warranty for this free software. For both users' and 46 -authors' sake, the GPL requires that modified versions be marked as 47 -changed, so that their problems will not be attributed erroneously to 48 -authors of previous versions. 49 - 50 - Some devices are designed to deny users access to install or run 51 -modified versions of the software inside them, although the manufacturer 52 -can do so. This is fundamentally incompatible with the aim of 53 -protecting users' freedom to change the software. The systematic 54 -pattern of such abuse occurs in the area of products for individuals to 55 -use, which is precisely where it is most unacceptable. Therefore, we 56 -have designed this version of the GPL to prohibit the practice for those 57 -products. If such problems arise substantially in other domains, we 58 -stand ready to extend this provision to those domains in future versions 59 -of the GPL, as needed to protect the freedom of users. 60 - 61 - Finally, every program is threatened constantly by software patents. 62 -States should not allow patents to restrict development and use of 63 -software on general-purpose computers, but in those that do, we wish to 64 -avoid the special danger that patents applied to a free program could 65 -make it effectively proprietary. To prevent this, the GPL assures that 66 -patents cannot be used to render the program non-free. 67 - 68 - The precise terms and conditions for copying, distribution and 69 -modification follow. 70 - 71 - TERMS AND CONDITIONS 72 - 73 - 0. Definitions. 74 - 75 - "This License" refers to version 3 of the GNU General Public License. 76 - 77 - "Copyright" also means copyright-like laws that apply to other kinds of 78 -works, such as semiconductor masks. 79 - 80 - "The Program" refers to any copyrightable work licensed under this 81 -License. Each licensee is addressed as "you". "Licensees" and 82 -"recipients" may be individuals or organizations. 83 - 84 - To "modify" a work means to copy from or adapt all or part of the work 85 -in a fashion requiring copyright permission, other than the making of an 86 -exact copy. The resulting work is called a "modified version" of the 87 -earlier work or a work "based on" the earlier work. 88 - 89 - A "covered work" means either the unmodified Program or a work based 90 -on the Program. 91 - 92 - To "propagate" a work means to do anything with it that, without 93 -permission, would make you directly or secondarily liable for 94 -infringement under applicable copyright law, except executing it on a 95 -computer or modifying a private copy. Propagation includes copying, 96 -distribution (with or without modification), making available to the 97 -public, and in some countries other activities as well. 98 - 99 - To "convey" a work means any kind of propagation that enables other 100 -parties to make or receive copies. Mere interaction with a user through 101 -a computer network, with no transfer of a copy, is not conveying. 102 - 103 - An interactive user interface displays "Appropriate Legal Notices" 104 -to the extent that it includes a convenient and prominently visible 105 -feature that (1) displays an appropriate copyright notice, and (2) 106 -tells the user that there is no warranty for the work (except to the 107 -extent that warranties are provided), that licensees may convey the 108 -work under this License, and how to view a copy of this License. If 109 -the interface presents a list of user commands or options, such as a 110 -menu, a prominent item in the list meets this criterion. 111 - 112 - 1. Source Code. 113 - 114 - The "source code" for a work means the preferred form of the work 115 -for making modifications to it. "Object code" means any non-source 116 -form of a work. 117 - 118 - A "Standard Interface" means an interface that either is an official 119 -standard defined by a recognized standards body, or, in the case of 120 -interfaces specified for a particular programming language, one that 121 -is widely used among developers working in that language. 122 - 123 - The "System Libraries" of an executable work include anything, other 124 -than the work as a whole, that (a) is included in the normal form of 125 -packaging a Major Component, but which is not part of that Major 126 -Component, and (b) serves only to enable use of the work with that 127 -Major Component, or to implement a Standard Interface for which an 128 -implementation is available to the public in source code form. A 129 -"Major Component", in this context, means a major essential component 130 -(kernel, window system, and so on) of the specific operating system 131 -(if any) on which the executable work runs, or a compiler used to 132 -produce the work, or an object code interpreter used to run it. 133 - 134 - The "Corresponding Source" for a work in object code form means all 135 -the source code needed to generate, install, and (for an executable 136 -work) run the object code and to modify the work, including scripts to 137 -control those activities. However, it does not include the work's 138 -System Libraries, or general-purpose tools or generally available free 139 -programs which are used unmodified in performing those activities but 140 -which are not part of the work. For example, Corresponding Source 141 -includes interface definition files associated with source files for 142 -the work, and the source code for shared libraries and dynamically 143 -linked subprograms that the work is specifically designed to require, 144 -such as by intimate data communication or control flow between those 145 -subprograms and other parts of the work. 146 - 147 - The Corresponding Source need not include anything that users 148 -can regenerate automatically from other parts of the Corresponding 149 -Source. 150 - 151 - The Corresponding Source for a work in source code form is that 152 -same work. 153 - 154 - 2. Basic Permissions. 155 - 156 - All rights granted under this License are granted for the term of 157 -copyright on the Program, and are irrevocable provided the stated 158 -conditions are met. This License explicitly affirms your unlimited 159 -permission to run the unmodified Program. The output from running a 160 -covered work is covered by this License only if the output, given its 161 -content, constitutes a covered work. This License acknowledges your 162 -rights of fair use or other equivalent, as provided by copyright law. 163 - 164 - You may make, run and propagate covered works that you do not 165 -convey, without conditions so long as your license otherwise remains 166 -in force. You may convey covered works to others for the sole purpose 167 -of having them make modifications exclusively for you, or provide you 168 -with facilities for running those works, provided that you comply with 169 -the terms of this License in conveying all material for which you do 170 -not control copyright. Those thus making or running the covered works 171 -for you must do so exclusively on your behalf, under your direction 172 -and control, on terms that prohibit them from making any copies of 173 -your copyrighted material outside their relationship with you. 174 - 175 - Conveying under any other circumstances is permitted solely under 176 -the conditions stated below. Sublicensing is not allowed; section 10 177 -makes it unnecessary. 178 - 179 - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 - 181 - No covered work shall be deemed part of an effective technological 182 -measure under any applicable law fulfilling obligations under article 183 -11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 -similar laws prohibiting or restricting circumvention of such 185 -measures. 186 - 187 - When you convey a covered work, you waive any legal power to forbid 188 -circumvention of technological measures to the extent such circumvention 189 -is effected by exercising rights under this License with respect to 190 -the covered work, and you disclaim any intention to limit operation or 191 -modification of the work as a means of enforcing, against the work's 192 -users, your or third parties' legal rights to forbid circumvention of 193 -technological measures. 194 - 195 - 4. Conveying Verbatim Copies. 196 - 197 - You may convey verbatim copies of the Program's source code as you 198 -receive it, in any medium, provided that you conspicuously and 199 -appropriately publish on each copy an appropriate copyright notice; 200 -keep intact all notices stating that this License and any 201 -non-permissive terms added in accord with section 7 apply to the code; 202 -keep intact all notices of the absence of any warranty; and give all 203 -recipients a copy of this License along with the Program. 204 - 205 - You may charge any price or no price for each copy that you convey, 206 -and you may offer support or warranty protection for a fee. 207 - 208 - 5. Conveying Modified Source Versions. 209 - 210 - You may convey a work based on the Program, or the modifications to 211 -produce it from the Program, in the form of source code under the 212 -terms of section 4, provided that you also meet all of these conditions: 213 - 214 - a) The work must carry prominent notices stating that you modified 215 - it, and giving a relevant date. 216 - 217 - b) The work must carry prominent notices stating that it is 218 - released under this License and any conditions added under section 219 - 7. This requirement modifies the requirement in section 4 to 220 - "keep intact all notices". 221 - 222 - c) You must license the entire work, as a whole, under this 223 - License to anyone who comes into possession of a copy. This 224 - License will therefore apply, along with any applicable section 7 225 - additional terms, to the whole of the work, and all its parts, 226 - regardless of how they are packaged. This License gives no 227 - permission to license the work in any other way, but it does not 228 - invalidate such permission if you have separately received it. 229 - 230 - d) If the work has interactive user interfaces, each must display 231 - Appropriate Legal Notices; however, if the Program has interactive 232 - interfaces that do not display Appropriate Legal Notices, your 233 - work need not make them do so. 234 - 235 - A compilation of a covered work with other separate and independent 236 -works, which are not by their nature extensions of the covered work, 237 -and which are not combined with it such as to form a larger program, 238 -in or on a volume of a storage or distribution medium, is called an 239 -"aggregate" if the compilation and its resulting copyright are not 240 -used to limit the access or legal rights of the compilation's users 241 -beyond what the individual works permit. Inclusion of a covered work 242 -in an aggregate does not cause this License to apply to the other 243 -parts of the aggregate. 244 - 245 - 6. Conveying Non-Source Forms. 246 - 247 - You may convey a covered work in object code form under the terms 248 -of sections 4 and 5, provided that you also convey the 249 -machine-readable Corresponding Source under the terms of this License, 250 -in one of these ways: 251 - 252 - a) Convey the object code in, or embodied in, a physical product 253 - (including a physical distribution medium), accompanied by the 254 - Corresponding Source fixed on a durable physical medium 255 - customarily used for software interchange. 256 - 257 - b) Convey the object code in, or embodied in, a physical product 258 - (including a physical distribution medium), accompanied by a 259 - written offer, valid for at least three years and valid for as 260 - long as you offer spare parts or customer support for that product 261 - model, to give anyone who possesses the object code either (1) a 262 - copy of the Corresponding Source for all the software in the 263 - product that is covered by this License, on a durable physical 264 - medium customarily used for software interchange, for a price no 265 - more than your reasonable cost of physically performing this 266 - conveying of source, or (2) access to copy the 267 - Corresponding Source from a network server at no charge. 268 - 269 - c) Convey individual copies of the object code with a copy of the 270 - written offer to provide the Corresponding Source. This 271 - alternative is allowed only occasionally and noncommercially, and 272 - only if you received the object code with such an offer, in accord 273 - with subsection 6b. 274 - 275 - d) Convey the object code by offering access from a designated 276 - place (gratis or for a charge), and offer equivalent access to the 277 - Corresponding Source in the same way through the same place at no 278 - further charge. You need not require recipients to copy the 279 - Corresponding Source along with the object code. If the place to 280 - copy the object code is a network server, the Corresponding Source 281 - may be on a different server (operated by you or a third party) 282 - that supports equivalent copying facilities, provided you maintain 283 - clear directions next to the object code saying where to find the 284 - Corresponding Source. Regardless of what server hosts the 285 - Corresponding Source, you remain obligated to ensure that it is 286 - available for as long as needed to satisfy these requirements. 287 - 288 - e) Convey the object code using peer-to-peer transmission, provided 289 - you inform other peers where the object code and Corresponding 290 - Source of the work are being offered to the general public at no 291 - charge under subsection 6d. 292 - 293 - A separable portion of the object code, whose source code is excluded 294 -from the Corresponding Source as a System Library, need not be 295 -included in conveying the object code work. 296 - 297 - A "User Product" is either (1) a "consumer product", which means any 298 -tangible personal property which is normally used for personal, family, 299 -or household purposes, or (2) anything designed or sold for incorporation 300 -into a dwelling. In determining whether a product is a consumer product, 301 -doubtful cases shall be resolved in favor of coverage. For a particular 302 -product received by a particular user, "normally used" refers to a 303 -typical or common use of that class of product, regardless of the status 304 -of the particular user or of the way in which the particular user 305 -actually uses, or expects or is expected to use, the product. A product 306 -is a consumer product regardless of whether the product has substantial 307 -commercial, industrial or non-consumer uses, unless such uses represent 308 -the only significant mode of use of the product. 309 - 310 - "Installation Information" for a User Product means any methods, 311 -procedures, authorization keys, or other information required to install 312 -and execute modified versions of a covered work in that User Product from 313 -a modified version of its Corresponding Source. The information must 314 -suffice to ensure that the continued functioning of the modified object 315 -code is in no case prevented or interfered with solely because 316 -modification has been made. 317 - 318 - If you convey an object code work under this section in, or with, or 319 -specifically for use in, a User Product, and the conveying occurs as 320 -part of a transaction in which the right of possession and use of the 321 -User Product is transferred to the recipient in perpetuity or for a 322 -fixed term (regardless of how the transaction is characterized), the 323 -Corresponding Source conveyed under this section must be accompanied 324 -by the Installation Information. But this requirement does not apply 325 -if neither you nor any third party retains the ability to install 326 -modified object code on the User Product (for example, the work has 327 -been installed in ROM). 328 - 329 - The requirement to provide Installation Information does not include a 330 -requirement to continue to provide support service, warranty, or updates 331 -for a work that has been modified or installed by the recipient, or for 332 -the User Product in which it has been modified or installed. Access to a 333 -network may be denied when the modification itself materially and 334 -adversely affects the operation of the network or violates the rules and 335 -protocols for communication across the network. 336 - 337 - Corresponding Source conveyed, and Installation Information provided, 338 -in accord with this section must be in a format that is publicly 339 -documented (and with an implementation available to the public in 340 -source code form), and must require no special password or key for 341 -unpacking, reading or copying. 342 - 343 - 7. Additional Terms. 344 - 345 - "Additional permissions" are terms that supplement the terms of this 346 -License by making exceptions from one or more of its conditions. 347 -Additional permissions that are applicable to the entire Program shall 348 -be treated as though they were included in this License, to the extent 349 -that they are valid under applicable law. If additional permissions 350 -apply only to part of the Program, that part may be used separately 351 -under those permissions, but the entire Program remains governed by 352 -this License without regard to the additional permissions. 353 - 354 - When you convey a copy of a covered work, you may at your option 355 -remove any additional permissions from that copy, or from any part of 356 -it. (Additional permissions may be written to require their own 357 -removal in certain cases when you modify the work.) You may place 358 -additional permissions on material, added by you to a covered work, 359 -for which you have or can give appropriate copyright permission. 360 - 361 - Notwithstanding any other provision of this License, for material you 362 -add to a covered work, you may (if authorized by the copyright holders of 363 -that material) supplement the terms of this License with terms: 364 - 365 - a) Disclaiming warranty or limiting liability differently from the 366 - terms of sections 15 and 16 of this License; or 367 - 368 - b) Requiring preservation of specified reasonable legal notices or 369 - author attributions in that material or in the Appropriate Legal 370 - Notices displayed by works containing it; or 371 - 372 - c) Prohibiting misrepresentation of the origin of that material, or 373 - requiring that modified versions of such material be marked in 374 - reasonable ways as different from the original version; or 375 - 376 - d) Limiting the use for publicity purposes of names of licensors or 377 - authors of the material; or 378 - 379 - e) Declining to grant rights under trademark law for use of some 380 - trade names, trademarks, or service marks; or 381 - 382 - f) Requiring indemnification of licensors and authors of that 383 - material by anyone who conveys the material (or modified versions of 384 - it) with contractual assumptions of liability to the recipient, for 385 - any liability that these contractual assumptions directly impose on 386 - those licensors and authors. 387 - 388 - All other non-permissive additional terms are considered "further 389 -restrictions" within the meaning of section 10. If the Program as you 390 -received it, or any part of it, contains a notice stating that it is 391 -governed by this License along with a term that is a further 392 -restriction, you may remove that term. If a license document contains 393 -a further restriction but permits relicensing or conveying under this 394 -License, you may add to a covered work material governed by the terms 395 -of that license document, provided that the further restriction does 396 -not survive such relicensing or conveying. 397 - 398 - If you add terms to a covered work in accord with this section, you 399 -must place, in the relevant source files, a statement of the 400 -additional terms that apply to those files, or a notice indicating 401 -where to find the applicable terms. 402 - 403 - Additional terms, permissive or non-permissive, may be stated in the 404 -form of a separately written license, or stated as exceptions; 405 -the above requirements apply either way. 406 - 407 - 8. Termination. 408 - 409 - You may not propagate or modify a covered work except as expressly 410 -provided under this License. Any attempt otherwise to propagate or 411 -modify it is void, and will automatically terminate your rights under 412 -this License (including any patent licenses granted under the third 413 -paragraph of section 11). 414 - 415 - However, if you cease all violation of this License, then your 416 -license from a particular copyright holder is reinstated (a) 417 -provisionally, unless and until the copyright holder explicitly and 418 -finally terminates your license, and (b) permanently, if the copyright 419 -holder fails to notify you of the violation by some reasonable means 420 -prior to 60 days after the cessation. 421 - 422 - Moreover, your license from a particular copyright holder is 423 -reinstated permanently if the copyright holder notifies you of the 424 -violation by some reasonable means, this is the first time you have 425 -received notice of violation of this License (for any work) from that 426 -copyright holder, and you cure the violation prior to 30 days after 427 -your receipt of the notice. 428 - 429 - Termination of your rights under this section does not terminate the 430 -licenses of parties who have received copies or rights from you under 431 -this License. If your rights have been terminated and not permanently 432 -reinstated, you do not qualify to receive new licenses for the same 433 -material under section 10. 434 - 435 - 9. Acceptance Not Required for Having Copies. 436 - 437 - You are not required to accept this License in order to receive or 438 -run a copy of the Program. Ancillary propagation of a covered work 439 -occurring solely as a consequence of using peer-to-peer transmission 440 -to receive a copy likewise does not require acceptance. However, 441 -nothing other than this License grants you permission to propagate or 442 -modify any covered work. These actions infringe copyright if you do 443 -not accept this License. Therefore, by modifying or propagating a 444 -covered work, you indicate your acceptance of this License to do so. 445 - 446 - 10. Automatic Licensing of Downstream Recipients. 447 - 448 - Each time you convey a covered work, the recipient automatically 449 -receives a license from the original licensors, to run, modify and 450 -propagate that work, subject to this License. You are not responsible 451 -for enforcing compliance by third parties with this License. 452 - 453 - An "entity transaction" is a transaction transferring control of an 454 -organization, or substantially all assets of one, or subdividing an 455 -organization, or merging organizations. If propagation of a covered 456 -work results from an entity transaction, each party to that 457 -transaction who receives a copy of the work also receives whatever 458 -licenses to the work the party's predecessor in interest had or could 459 -give under the previous paragraph, plus a right to possession of the 460 -Corresponding Source of the work from the predecessor in interest, if 461 -the predecessor has it or can get it with reasonable efforts. 462 - 463 - You may not impose any further restrictions on the exercise of the 464 -rights granted or affirmed under this License. For example, you may 465 -not impose a license fee, royalty, or other charge for exercise of 466 -rights granted under this License, and you may not initiate litigation 467 -(including a cross-claim or counterclaim in a lawsuit) alleging that 468 -any patent claim is infringed by making, using, selling, offering for 469 -sale, or importing the Program or any portion of it. 470 - 471 - 11. Patents. 472 - 473 - A "contributor" is a copyright holder who authorizes use under this 474 -License of the Program or a work on which the Program is based. The 475 -work thus licensed is called the contributor's "contributor version". 476 - 477 - A contributor's "essential patent claims" are all patent claims 478 -owned or controlled by the contributor, whether already acquired or 479 -hereafter acquired, that would be infringed by some manner, permitted 480 -by this License, of making, using, or selling its contributor version, 481 -but do not include claims that would be infringed only as a 482 -consequence of further modification of the contributor version. For 483 -purposes of this definition, "control" includes the right to grant 484 -patent sublicenses in a manner consistent with the requirements of 485 -this License. 486 - 487 - Each contributor grants you a non-exclusive, worldwide, royalty-free 488 -patent license under the contributor's essential patent claims, to 489 -make, use, sell, offer for sale, import and otherwise run, modify and 490 -propagate the contents of its contributor version. 491 - 492 - In the following three paragraphs, a "patent license" is any express 493 -agreement or commitment, however denominated, not to enforce a patent 494 -(such as an express permission to practice a patent or covenant not to 495 -sue for patent infringement). To "grant" such a patent license to a 496 -party means to make such an agreement or commitment not to enforce a 497 -patent against the party. 498 - 499 - If you convey a covered work, knowingly relying on a patent license, 500 -and the Corresponding Source of the work is not available for anyone 501 -to copy, free of charge and under the terms of this License, through a 502 -publicly available network server or other readily accessible means, 503 -then you must either (1) cause the Corresponding Source to be so 504 -available, or (2) arrange to deprive yourself of the benefit of the 505 -patent license for this particular work, or (3) arrange, in a manner 506 -consistent with the requirements of this License, to extend the patent 507 -license to downstream recipients. "Knowingly relying" means you have 508 -actual knowledge that, but for the patent license, your conveying the 509 -covered work in a country, or your recipient's use of the covered work 510 -in a country, would infringe one or more identifiable patents in that 511 -country that you have reason to believe are valid. 512 - 513 - If, pursuant to or in connection with a single transaction or 514 -arrangement, you convey, or propagate by procuring conveyance of, a 515 -covered work, and grant a patent license to some of the parties 516 -receiving the covered work authorizing them to use, propagate, modify 517 -or convey a specific copy of the covered work, then the patent license 518 -you grant is automatically extended to all recipients of the covered 519 -work and works based on it. 520 - 521 - A patent license is "discriminatory" if it does not include within 522 -the scope of its coverage, prohibits the exercise of, or is 523 -conditioned on the non-exercise of one or more of the rights that are 524 -specifically granted under this License. You may not convey a covered 525 -work if you are a party to an arrangement with a third party that is 526 -in the business of distributing software, under which you make payment 527 -to the third party based on the extent of your activity of conveying 528 -the work, and under which the third party grants, to any of the 529 -parties who would receive the covered work from you, a discriminatory 530 -patent license (a) in connection with copies of the covered work 531 -conveyed by you (or copies made from those copies), or (b) primarily 532 -for and in connection with specific products or compilations that 533 -contain the covered work, unless you entered into that arrangement, 534 -or that patent license was granted, prior to 28 March 2007. 535 - 536 - Nothing in this License shall be construed as excluding or limiting 537 -any implied license or other defenses to infringement that may 538 -otherwise be available to you under applicable patent law. 539 - 540 - 12. No Surrender of Others' Freedom. 541 - 542 - If conditions are imposed on you (whether by court order, agreement or 543 -otherwise) that contradict the conditions of this License, they do not 544 -excuse you from the conditions of this License. If you cannot convey a 545 -covered work so as to satisfy simultaneously your obligations under this 546 -License and any other pertinent obligations, then as a consequence you may 547 -not convey it at all. For example, if you agree to terms that obligate you 548 -to collect a royalty for further conveying from those to whom you convey 549 -the Program, the only way you could satisfy both those terms and this 550 -License would be to refrain entirely from conveying the Program. 551 - 552 - 13. Use with the GNU Affero General Public License. 553 - 554 - Notwithstanding any other provision of this License, you have 555 -permission to link or combine any covered work with a work licensed 556 -under version 3 of the GNU Affero General Public License into a single 557 -combined work, and to convey the resulting work. The terms of this 558 -License will continue to apply to the part which is the covered work, 559 -but the special requirements of the GNU Affero General Public License, 560 -section 13, concerning interaction through a network will apply to the 561 -combination as such. 562 - 563 - 14. Revised Versions of this License. 564 - 565 - The Free Software Foundation may publish revised and/or new versions of 566 -the GNU General Public License from time to time. Such new versions will 567 -be similar in spirit to the present version, but may differ in detail to 568 -address new problems or concerns. 569 - 570 - Each version is given a distinguishing version number. If the 571 -Program specifies that a certain numbered version of the GNU General 572 -Public License "or any later version" applies to it, you have the 573 -option of following the terms and conditions either of that numbered 574 -version or of any later version published by the Free Software 575 -Foundation. If the Program does not specify a version number of the 576 -GNU General Public License, you may choose any version ever published 577 -by the Free Software Foundation. 578 - 579 - If the Program specifies that a proxy can decide which future 580 -versions of the GNU General Public License can be used, that proxy's 581 -public statement of acceptance of a version permanently authorizes you 582 -to choose that version for the Program. 583 - 584 - Later license versions may give you additional or different 585 -permissions. However, no additional obligations are imposed on any 586 -author or copyright holder as a result of your choosing to follow a 587 -later version. 588 - 589 - 15. Disclaimer of Warranty. 590 - 591 - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 - 600 - 16. Limitation of Liability. 601 - 602 - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 -SUCH DAMAGES. 611 - 612 - 17. Interpretation of Sections 15 and 16. 613 - 614 - If the disclaimer of warranty and limitation of liability provided 615 -above cannot be given local legal effect according to their terms, 616 -reviewing courts shall apply local law that most closely approximates 617 -an absolute waiver of all civil liability in connection with the 618 -Program, unless a warranty or assumption of liability accompanies a 619 -copy of the Program in return for a fee. 620 - 621 - END OF TERMS AND CONDITIONS 622 - 623 - How to Apply These Terms to Your New Programs 624 - 625 - If you develop a new program, and you want it to be of the greatest 626 -possible use to the public, the best way to achieve this is to make it 627 -free software which everyone can redistribute and change under these terms. 628 - 629 - To do so, attach the following notices to the program. It is safest 630 -to attach them to the start of each source file to most effectively 631 -state the exclusion of warranty; and each file should have at least 632 -the "copyright" line and a pointer to where the full notice is found. 633 - 634 - <one line to give the program's name and a brief idea of what it does.> 635 - Copyright (C) <year> <name of author> 636 - 637 - This program is free software: you can redistribute it and/or modify 638 - it under the terms of the GNU General Public License as published by 639 - the Free Software Foundation, either version 3 of the License, or 640 - (at your option) any later version. 641 - 642 - This program is distributed in the hope that it will be useful, 643 - but WITHOUT ANY WARRANTY; without even the implied warranty of 644 - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 - GNU General Public License for more details. 646 - 647 - You should have received a copy of the GNU General Public License 648 - along with this program. If not, see <http://www.gnu.org/licenses/>. 649 - 650 -Also add information on how to contact you by electronic and paper mail. 651 - 652 - If the program does terminal interaction, make it output a short 653 -notice like this when it starts in an interactive mode: 654 - 655 - <program> Copyright (C) <year> <name of author> 656 - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 - This is free software, and you are welcome to redistribute it 658 - under certain conditions; type `show c' for details. 659 - 660 -The hypothetical commands `show w' and `show c' should show the appropriate 661 -parts of the General Public License. Of course, your program's commands 662 -might be different; for a GUI interface, you would use an "about box". 663 - 664 - You should also get your employer (if you work as a programmer) or school, 665 -if any, to sign a "copyright disclaimer" for the program, if necessary. 666 -For more information on this, and how to apply and follow the GNU GPL, see 667 -<http://www.gnu.org/licenses/>. 668 - 669 - The GNU General Public License does not permit incorporating your program 670 -into proprietary programs. If your program is a subroutine library, you 671 -may consider it more useful to permit linking proprietary applications with 672 -the library. If this is what you want to do, use the GNU Lesser General 673 -Public License instead of this License. But first, please read 674 -<http://www.gnu.org/philosophy/why-not-lgpl.html>.
Changes to Classdef.h.
24 24 */ 25 25 26 26 #include "wx/wx.h" 27 27 #include "wx/aui/aui.h" 28 28 #include "wx/treectrl.h" 29 29 #include "wx/grid.h" 30 30 #include "wx/listctrl.h" 31 -#include "wx/textctrl.h" 32 31 #include "wx/propdlg.h" 33 32 #include "wx/generic/propdlg.h" 34 -#include "wx/timer.h" 35 33 36 34 #include <spatialite/sqlite3.h> 37 35 38 36 #define OMIT_GEOS 0 39 37 #define OMIT_PROJ 0 40 -#include <spatialite/gaiaaux.h> 41 -#include <spatialite/gaiaexif.h> 42 38 #include <spatialite/gaiageo.h> 43 -#include <spatialite.h> 44 - 45 -// 46 -// functions for QSORT / BSEARCH 47 -// 48 -int cmp_prenodes_code(const void *p1, const void *p2); 49 -int cmp_prenodes_id(const void *p1, const void *p2); 50 -int cmp_nodes2_code(const void *p1, const void *p2); 51 -int cmp_nodes2_id(const void *p1, const void *p2); 52 -int cmp_nodes1_code(const void *p1, const void *p2); 53 -int cmp_nodes1_id(const void *p1, const void *p2); 54 39 55 40 enum 56 41 { 57 42 // control IDs for main window and tree list control 58 - ID_Connect = 1, 59 - ID_CreateNew, 60 - ID_Disconnect, 61 - ID_MemoryDbLoad, 62 - ID_MemoryDbNew, 63 - ID_MemoryDbClock, 64 - ID_MemoryDbSave, 65 - ID_Vacuum, 66 - ID_SqlScript, 67 - ID_LoadShp, 68 - ID_LoadTxt, 69 - ID_VirtualShp, 70 - ID_VirtualTxt, 71 - ID_Network, 72 - ID_Exif, 73 - ID_Srids, 74 - ID_Charset, 75 - ID_Help, 76 - Tree_NewTable, 77 - Tree_NewView, 78 - Tree_NewIndex, 79 - Tree_NewTrigger, 80 - Tree_NewColumn, 81 - Tree_Show, 82 - Tree_Drop, 83 - Tree_Rename, 84 - Tree_Select, 85 - Tree_Refresh, 86 - Tree_SpatialIndex, 87 - Tree_MbrCache, 88 - Tree_RebuildTriggers, 89 - Tree_ShowSql, 90 - Tree_Recover, 91 - Tree_CheckGeometry, 92 - Tree_SetSrid, 93 - Tree_DumpShp, 94 - Tree_DumpTxtTab, 95 - Tree_DumpCsv, 96 - Tree_DumpHtml, 97 - Tree_Edit, 98 - Grid_Clear, 99 - Grid_All, 100 - Grid_Column, 101 - Grid_Row, 102 - Grid_Copy, 103 - Grid_Blob, 104 - Grid_Delete, 105 - Grid_Insert, 106 - Grid_Abort, 107 - Grid_BlobIn, 108 - Grid_BlobOut, 109 - Grid_BlobNull, 110 - Image_Copy, 43 + ID_Connect = 1, 44 + ID_CreateNew, 45 + ID_Disconnect, 46 + ID_Vacuum, 47 + ID_SqlScript, 48 + ID_LoadShp, 49 + ID_LoadTxt, 50 + ID_VirtualShp, 51 + ID_VirtualTxt, 52 + ID_Srids, 53 + ID_Charset, 54 + ID_Help, 55 + Tree_NewTable, 56 + Tree_NewView, 57 + Tree_NewIndex, 58 + Tree_NewTrigger, 59 + Tree_NewColumn, 60 + Tree_Show, 61 + Tree_Drop, 62 + Tree_Rename, 63 + Tree_Select, 64 + Tree_Refresh, 65 + Tree_SpatialIndex, 66 + Tree_MbrCache, 67 + Tree_ShowSql, 68 + Tree_Recover, 69 + Tree_CheckGeometry, 70 + Tree_SetSrid, 71 + Tree_DumpShp, 72 + Tree_DumpTxtTab, 73 + Tree_DumpCsv, 74 + Tree_DumpHtml, 75 + Tree_Edit, 76 + Grid_Clear, 77 + Grid_All, 78 + Grid_Column, 79 + Grid_Row, 80 + Grid_Copy, 81 + Grid_Blob, 82 + Grid_Delete, 83 + Grid_Insert, 84 + Grid_Abort, 85 + Grid_BlobIn, 86 + Grid_BlobOut, 87 + Grid_BlobNull, 88 + Image_Copy, 111 89 }; 112 90 113 91 enum 114 92 { 115 93 // control IDs for dialogs 116 - ID_SQL = 10000, 117 - ID_SQL_GO, 118 - ID_HISTORY_BACK, 119 - ID_HISTORY_FORWARD, 120 - ID_RS_FIRST, 121 - ID_RS_LAST, 122 - ID_RS_NEXT, 123 - ID_RS_PREVIOUS, 124 - ID_REFRESH, 125 - ID_RS_BLOCK, 126 - ID_PANE_HEXADECIMAL, 127 - ID_PANE_GEOMETRY, 128 - ID_PANE_IMAGE, 129 - ID_HEX, 130 - ID_GEOM_TABLE, 131 - ID_GEOM_GRAPH, 132 - ID_GEOM_BOX, 133 - ID_IMAGE_TITLE, 134 - ID_IMG_BOX, 135 - ID_IMAGE, 136 - ID_VIRTSHP_TABLE, 137 - ID_VIRTSHP_SRID, 138 - ID_VIRTSHP_CHARSET, 139 - ID_VIRTTXT_TABLE, 140 - ID_VIRTTXT_CHARSET, 141 - ID_VIRTTXT_TITLES, 142 - ID_VIRTTXT_SEPARATOR, 143 - ID_VIRTTXT_CHARSEPARATOR, 144 - ID_VIRTTXT_QUOTE, 145 - ID_VIRTTXT_POINT, 146 - ID_LDSHP_TABLE, 147 - ID_LDSHP_COLUMN, 148 - ID_LDSHP_SRID, 149 - ID_LDSHP_CHARSET, 150 - ID_LDTXT_TABLE, 151 - ID_LDTXT_CHARSET, 152 - ID_LDTXT_TITLES, 153 - ID_LDTXT_SEPARATOR, 154 - ID_LDTXT_CHARSEPARATOR, 155 - ID_LDTXT_QUOTE, 156 - ID_LDTXT_POINT, 157 - ID_DMPSHP_CHARSET, 158 - ID_DMPTXT_CHARSET, 159 - ID_NET_TABLE, 160 - ID_NET_FROM, 161 - ID_NET_TO, 162 - ID_NET_GEOM, 163 - ID_NET_LENGTH, 164 - ID_NET_COST, 165 - ID_NET_BIDIR, 166 - ID_NET_ONEWAY, 167 - ID_NET_FROM_TO, 168 - ID_NET_TO_FROM, 169 - ID_EXIF_PATH, 170 - ID_EXIF_FOLDER, 171 - ID_EXIF_SINGLE, 172 - ID_EXIF_METADATA, 173 - ID_EXIF_GPS_ONLY, 174 - ID_DFLT_CHARSET, 175 - ID_DFLT_ASK, 176 - ID_SCRIPT_CHARSET, 177 - ID_RCVR_SRID, 178 - ID_RCVR_TYPE, 179 - ID_SRID_OLD, 180 - ID_SRID_SRID, 181 - ID_SEARCH, 182 - ID_HELP_HTML, 183 - ID_AUTO_SAVE_PATH, 184 - ID_AUTO_SAVE_INTERVAL, 185 - ID_AUTO_SAVE_CHANGE_PATH, 94 + ID_SQL = 10000, 95 + ID_SQL_GO, 96 + ID_HISTORY_BACK, 97 + ID_HISTORY_FORWARD, 98 + ID_RS_FIRST, 99 + ID_RS_LAST, 100 + ID_RS_NEXT, 101 + ID_RS_PREVIOUS, 102 + ID_REFRESH, 103 + ID_RS_BLOCK, 104 + ID_PANE_HEXADECIMAL, 105 + ID_PANE_GEOMETRY, 106 + ID_PANE_IMAGE, 107 + ID_HEX, 108 + ID_GEOM_TABLE, 109 + ID_GEOM_GRAPH, 110 + ID_GEOM_BOX, 111 + ID_IMAGE_TITLE, 112 + ID_IMG_BOX, 113 + ID_IMAGE, 114 + ID_VIRTSHP_TABLE, 115 + ID_VIRTSHP_SRID, 116 + ID_VIRTSHP_CHARSET, 117 + ID_VIRTTXT_TABLE, 118 + ID_VIRTTXT_CHARSET, 119 + ID_VIRTTXT_TITLES, 120 + ID_VIRTTXT_SEPARATOR, 121 + ID_VIRTTXT_CHARSEPARATOR, 122 + ID_VIRTTXT_QUOTE, 123 + ID_VIRTTXT_POINT, 124 + ID_LDSHP_TABLE, 125 + ID_LDSHP_COLUMN, 126 + ID_LDSHP_SRID, 127 + ID_LDSHP_CHARSET, 128 + ID_LDTXT_TABLE, 129 + ID_LDTXT_CHARSET, 130 + ID_LDTXT_TITLES, 131 + ID_LDTXT_SEPARATOR, 132 + ID_LDTXT_CHARSEPARATOR, 133 + ID_LDTXT_QUOTE, 134 + ID_LDTXT_POINT, 135 + ID_DMPSHP_CHARSET, 136 + ID_DMPTXT_CHARSET, 137 + ID_DFLT_CHARSET, 138 + ID_DFLT_ASK, 139 + ID_SCRIPT_CHARSET, 140 + ID_RCVR_SRID, 141 + ID_RCVR_TYPE, 142 + ID_SRID_OLD, 143 + ID_SRID_SRID, 144 + ID_SEARCH, 186 145 }; 187 146 188 147 enum 189 148 { 190 149 // tree item data types 191 - MY_TABLE = 0, 192 - MY_VTABLE, 193 - MY_VIEW, 194 - MY_COLUMN, 195 - MY_GEOMETRY, 196 - MY_GEOMETRY_INDEX, 197 - MY_GEOMETRY_CACHED, 198 - MY_INDEX, 199 - MY_TRIGGER, 200 - MY_INT_VARIANT, 201 - MY_DBL_VARIANT, 202 - MY_TXT_VARIANT, 203 - MY_BLOB_VARIANT, 204 - MY_NULL_VARIANT, 205 -}; 206 - 207 -enum 208 -{ 209 -// control IDs for timers 210 - ID_AUTO_SAVE_TIMER = 20000, 150 + MY_TABLE = 0, 151 + MY_VTABLE, 152 + MY_VIEW, 153 + MY_COLUMN, 154 + MY_GEOMETRY, 155 + MY_GEOMETRY_INDEX, 156 + MY_GEOMETRY_CACHED, 157 + MY_INDEX, 158 + MY_TRIGGER, 159 + MY_INT_VARIANT, 160 + MY_DBL_VARIANT, 161 + MY_TXT_VARIANT, 162 + MY_BLOB_VARIANT, 163 + MY_NULL_VARIANT, 211 164 }; 212 165 213 166 class MyObject:public wxTreeItemData 214 167 { 215 168 // 216 169 // a class to store TreeItemData 217 170 // 218 -private: 219 - int Type; // the object type 220 - wxString Name; // the object name 221 - wxString Column; // the column name [optional] 222 -public: 223 - MyObject(int type, wxString & name); 224 - MyObject(int type, wxString & name, wxString & column); 225 - virtual ~ MyObject() 226 - {; 227 - } 228 - int GetType() 229 - { 230 - return Type; 231 - } 232 - wxString & GetName() 233 - { 234 - return Name; 235 - } 236 - wxString & GetColumn() 237 - { 238 - return Column; 239 - } 171 + private: 172 + int Type; // the object type 173 + wxString Name; // the object name 174 + wxString Column; // the column name [optional] 175 + public: 176 + MyObject (int type, wxString & name); 177 + MyObject (int type, wxString & name, wxString & column); 178 + virtual ~ MyObject () { ; } 179 + int GetType () { return Type; } 180 + wxString & GetName () { return Name; } 181 + wxString & GetColumn () { return Column; } 240 182 }; 241 183 242 184 class MyColumnInfo 243 185 { 244 186 // 245 187 // a class to store a DB column 246 188 // 247 -private: 248 - wxString Name; // the column name 249 - bool PrimaryKey; // Primary Key column 250 - bool Geometry; // Geometry column 251 - bool GeometryIndex; // Geometry column + SpatialIndex 252 - bool MbrCache; // Geometry column + MbrCache 253 - MyColumnInfo *Next; // pointer to next element into the linked list 254 -public: 255 - MyColumnInfo(wxString & name, bool pkey); 256 - ~MyColumnInfo() 257 - {; 258 - } 259 - wxString & GetName() 260 - { 261 - return Name; 262 - } 263 - bool IsPrimaryKey() 264 - { 265 - return PrimaryKey; 266 - } 267 - void SetGeometry() 268 - { 269 - Geometry = true; 270 - } 271 - bool IsGeometry() 272 - { 273 - return Geometry; 274 - } 275 - void SetGeometryIndex() 276 - { 277 - GeometryIndex = true; 278 - } 279 - bool IsGeometryIndex() 280 - { 281 - return GeometryIndex; 282 - } 283 - void SetMbrCache() 284 - { 285 - MbrCache = true; 286 - } 287 - bool IsMbrCache() 288 - { 289 - return MbrCache; 290 - } 291 - void SetNext(MyColumnInfo * next) 292 - { 293 - Next = next; 294 - } 295 - MyColumnInfo *GetNext() 296 - { 297 - return Next; 298 - } 189 + private: 190 + wxString Name; // the column name 191 + bool PrimaryKey; // Primary Key column 192 + bool Geometry; // Geometry column 193 + bool GeometryIndex; // Geometry column + SpatialIndex 194 + bool MbrCache; // Geometry column + MbrCache 195 + MyColumnInfo *Next; // pointer to next element into the linked list 196 + public: 197 + MyColumnInfo (wxString & name, bool pkey); 198 + ~MyColumnInfo () { ; } 199 + wxString & GetName () { return Name; } 200 + bool IsPrimaryKey () { return PrimaryKey; } 201 + void SetGeometry () { Geometry = true; } 202 + bool IsGeometry () { return Geometry; } 203 + void SetGeometryIndex () { GeometryIndex = true; } 204 + bool IsGeometryIndex () { return GeometryIndex; } 205 + void SetMbrCache () { MbrCache = true; } 206 + bool IsMbrCache () { return MbrCache; } 207 + void SetNext (MyColumnInfo * next) { Next = next; } 208 + MyColumnInfo *GetNext () { return Next; } 299 209 }; 300 210 301 211 class MyIndexInfo 302 212 { 303 213 // 304 214 // a class to store a DB index 305 215 // 306 -private: 307 - wxString Name; // the index name 308 - MyIndexInfo *Next; // pointer to next element into the linked list 309 -public: 310 - MyIndexInfo(wxString & name); 311 - MyIndexInfo() 312 - {; 313 - } 314 - wxString & GetName() 315 - { 316 - return Name; 317 - } 318 - void SetNext(MyIndexInfo * next) 319 - { 320 - Next = next; 321 - } 322 - MyIndexInfo *GetNext() 323 - { 324 - return Next; 325 - } 216 + private: 217 + wxString Name; // the index name 218 + MyIndexInfo *Next; // pointer to next element into the linked list 219 + public: 220 + MyIndexInfo (wxString & name); 221 + ~MyIndexInfo () { ; } 222 + wxString & GetName () { return Name; } 223 + void SetNext (MyIndexInfo * next) { Next = next; } 224 + MyIndexInfo *GetNext () { return Next; } 326 225 }; 327 226 328 227 class MyTriggerInfo 329 228 { 330 229 // 331 230 // a class to store a DB trigger 332 231 // 333 -private: 334 - wxString Name; // the trigger name 335 - MyTriggerInfo *Next; // pointer to next element into the linked list 336 -public: 337 - MyTriggerInfo(wxString & name); 338 - ~MyTriggerInfo() 339 - {; 340 - } 341 - wxString & GetName() 342 - { 343 - return Name; 344 - } 345 - void SetNext(MyTriggerInfo * next) 346 - { 347 - Next = next; 348 - } 349 - MyTriggerInfo *GetNext() 350 - { 351 - return Next; 352 - } 232 + private: 233 + wxString Name; // the trigger name 234 + MyTriggerInfo *Next; // pointer to next element into the linked list 235 + public: 236 + MyTriggerInfo (wxString & name); 237 + ~MyTriggerInfo () { ; } 238 + wxString & GetName () { return Name; } 239 + void SetNext (MyTriggerInfo * next) { Next = next; } 240 + MyTriggerInfo *GetNext () { return Next; } 353 241 }; 354 242 355 243 class MyTableInfo 356 244 { 357 245 // 358 246 // a class to store DB table columns 359 247 // 360 -private: 361 - MyColumnInfo * FirstColumn; // first element into the columns linked list 362 - MyColumnInfo *LastColumn; // last element into the columns linked list 363 - MyIndexInfo *FirstIndex; // first element into the indices linked list 364 - MyIndexInfo *LastIndex; // last element into the indices linked list 365 - MyTriggerInfo *FirstTrigger; // first element into the triggers linked list 366 - MyTriggerInfo *LastTrigger; // last element into the triggers linked list 367 -public: 368 - MyTableInfo() 369 - { 370 - FirstColumn = NULL; 371 - LastColumn = NULL; 372 - FirstIndex = NULL; 373 - LastIndex = NULL; 374 - FirstTrigger = NULL; 375 - LastTrigger = NULL; 376 - } 377 - ~MyTableInfo(); 378 - void AddColumn(wxString & name, bool pkey); 379 - void SetGeometry(wxString & name, bool index, bool cached); 380 - void AddIndex(wxString & name); 381 - void AddTrigger(wxString & name); 382 - MyColumnInfo *GetFirstColumn() 383 - { 384 - return FirstColumn; 385 - } 386 - MyIndexInfo *GetFirstIndex() 387 - { 388 - return FirstIndex; 389 - } 390 - MyTriggerInfo *GetFirstTrigger() 391 - { 392 - return FirstTrigger; 393 - } 248 + private: 249 + MyColumnInfo * FirstColumn; // first element into the columns linked list 250 + MyColumnInfo *LastColumn; // last element into the columns linked list 251 + MyIndexInfo *FirstIndex; // first element into the indices linked list 252 + MyIndexInfo *LastIndex; // last element into the indices linked list 253 + MyTriggerInfo *FirstTrigger; // first element into the triggers linked list 254 + MyTriggerInfo *LastTrigger; // last element into the triggers linked list 255 + public: 256 + MyTableInfo () { FirstColumn = NULL; LastColumn = NULL; 257 + FirstIndex = NULL; LastIndex = NULL; FirstTrigger = NULL; 258 + LastTrigger = NULL; } 259 + ~MyTableInfo (); 260 + void AddColumn (wxString & name, bool pkey); 261 + void SetGeometry (wxString & name, bool index, bool cached); 262 + void AddIndex (wxString & name); 263 + void AddTrigger (wxString & name); 264 + MyColumnInfo *GetFirstColumn () { return FirstColumn; } 265 + MyIndexInfo *GetFirstIndex () { return FirstIndex; } 266 + MyTriggerInfo *GetFirstTrigger () { return FirstTrigger; } 394 267 }; 395 268 396 269 class MyViewInfo 397 270 { 398 271 // 399 272 // a class to store DB view columns 400 273 // 401 -private: 402 - MyColumnInfo * First; // first element into the columns linked list 403 - MyColumnInfo *Last; // last element into the columns linked list 404 -public: 405 - MyViewInfo() 406 - { 407 - First = NULL; 408 - Last = NULL; 409 - } 410 - ~MyViewInfo(); 411 - void AddColumn(wxString & name); 412 - MyColumnInfo *GetFirst() 413 - { 414 - return First; 415 - } 274 + private: 275 + MyColumnInfo * First; // first element into the columns linked list 276 + MyColumnInfo *Last; // last element into the columns linked list 277 + public: 278 + MyViewInfo () { First = NULL; Last = NULL; } 279 + ~MyViewInfo (); 280 + void AddColumn (wxString & name); 281 + MyColumnInfo *GetFirst () { return First; } 416 282 }; 417 283 418 284 class MyVariant 419 285 { 420 286 // 421 287 // a class to store Variant-Type values 422 288 // 423 -private: 424 - int Type; // the Variant-Type 425 - sqlite3_int64 IntValue; // the Integer value 426 - double DblValue; // the Double value 427 - wxString TxtValue; // the Text value 428 - unsigned char *Blob; // the BLOB value 429 - int BlobSize; // the BLOB size 430 -public: 431 - MyVariant() 432 - { 433 - Type = MY_NULL_VARIANT; 434 - Blob = NULL; 435 - } 436 - ~MyVariant() 437 - { 438 - if (Blob) 439 - delete Blob; 440 - } 441 - void Clear() 442 - { 443 - if (Blob) 444 - delete Blob; 445 - Blob = NULL; 446 - Type = MY_NULL_VARIANT; 447 - } 448 - void Set(sqlite3_int64 value) 449 - { 450 - Type = MY_INT_VARIANT; 451 - IntValue = value; 452 - } 453 - void Set(double value) 454 - { 455 - Type = MY_DBL_VARIANT; 456 - DblValue = value; 457 - } 458 - void Set(const unsigned char *text); 459 - void Set(wxString & string) 460 - { 461 - Type = MY_TXT_VARIANT; 462 - TxtValue = string; 463 - } 464 - void Set(const void *blob, int size); 465 - void Copy(MyVariant * other); 466 - int GetType() 467 - { 468 - return Type; 469 - } 470 - sqlite3_int64 GetIntValue() 471 - { 472 - return IntValue; 473 - } 474 - double GetDblValue() 475 - { 476 - return DblValue; 477 - } 478 - wxString & GetTxtValue() 479 - { 480 - return TxtValue; 481 - } 482 - int GetBlobSize() 483 - { 484 - return BlobSize; 485 - } 486 - unsigned char *GetBlob() 487 - { 488 - return Blob; 489 - } 289 + private: 290 + int Type; // the Variant-Type 291 + int IntValue; // the Integer value 292 + double DblValue; // the Double value 293 + wxString TxtValue; // the Text value 294 + unsigned char *Blob; // the BLOB value 295 + int BlobSize; // the BLOB size 296 + public: 297 + MyVariant () { Type = MY_NULL_VARIANT; Blob = NULL; } 298 + ~MyVariant () { if (Blob) delete Blob; } 299 + void Clear () { if (Blob) delete Blob; Blob = NULL; 300 + Type = MY_NULL_VARIANT; } 301 + void Set (int value) { Type = MY_INT_VARIANT; 302 + IntValue = value; } 303 + void Set (double value) { Type = MY_DBL_VARIANT; 304 + DblValue = value; } 305 + void Set (const unsigned char *text); 306 + void Set (wxString & string) { Type = MY_TXT_VARIANT; 307 + TxtValue = string; } 308 + void Set (const void *blob, int size); 309 + void Copy (MyVariant * other); 310 + int GetType () { return Type; } 311 + int GetIntValue () { return IntValue; } 312 + double GetDblValue () { return DblValue; } 313 + wxString & GetTxtValue () { return TxtValue; } 314 + int GetBlobSize () { return BlobSize; } 315 + unsigned char *GetBlob () { return Blob; } 490 316 }; 491 317 492 318 class MyRowVariant 493 319 { 494 320 // 495 321 // a class to store a row composed of Variant-Type values 496 322 // 497 -private: 498 - int NumCols; // number of columns 499 - MyVariant *ColumnArray; // the column as an array 500 - bool Deleted; // switch to mark row deletion 501 - MyRowVariant *Next; // pointer to next element into the linked list 502 -public: 503 - MyRowVariant() 504 - { 505 - NumCols = 0; 506 - ColumnArray = NULL; 507 - Deleted = false; 508 - Next = NULL; 509 - } 510 - MyRowVariant(int cols) 511 - { 512 - NumCols = cols; 513 - ColumnArray = new MyVariant[cols]; 514 - Next = NULL; 515 - } 516 - ~MyRowVariant() 517 - { 518 - if (ColumnArray) 519 - delete[]ColumnArray; 520 - } 521 - void Create(int cols); 522 - int GetNumCols() 523 - { 524 - return NumCols; 525 - } 526 - void Set(int col, sqlite3_int64 value); 527 - void Set(int col, double value); 528 - void Set(int col, const unsigned char *text); 529 - void Set(int col, const void *blob, int size); 530 - MyVariant *GetColumn(int col); 531 - void SetDeleted() 532 - { 533 - Deleted = true; 534 - } 535 - bool IsDeleted() 536 - { 537 - return Deleted; 538 - } 539 - void SetNext(MyRowVariant * next) 540 - { 541 - Next = next; 542 - } 543 - MyRowVariant *GetNext() 544 - { 545 - return Next; 546 - } 323 + private: 324 + int NumCols; // number of columns 325 + MyVariant *ColumnArray; // the column as an array 326 + bool Deleted; // switch to mark row deletion 327 + MyRowVariant *Next; // pointer to next element into the linked list 328 + public: 329 + MyRowVariant () { NumCols = 0; ColumnArray = NULL; 330 + Deleted = false; Next = NULL; } 331 + MyRowVariant (int cols) { NumCols = cols; 332 + ColumnArray = new MyVariant[cols]; Next = NULL; } 333 + ~MyRowVariant () { if (ColumnArray) delete[]ColumnArray; } 334 + void Create (int cols); 335 + int GetNumCols () { return NumCols; } 336 + void Set (int col, int value); 337 + void Set (int col, double value); 338 + void Set (int col, const unsigned char *text); 339 + void Set (int col, const void *blob, int size); 340 + MyVariant *GetColumn (int col); 341 + void SetDeleted () { Deleted = true; } 342 + bool IsDeleted () { return Deleted; } 343 + void SetNext (MyRowVariant * next) { Next = next; } 344 + MyRowVariant *GetNext () { return Next; } 547 345 }; 548 346 549 347 class MyVariantList 550 348 { 551 349 // 552 350 // a class to store a whole result set 553 351 // 554 -private: 555 - int NumCols; // number of columns 556 - wxString *ColumnName; // the column names 557 - MyRowVariant *First; // first element into the linked list 558 - MyRowVariant *Last; // last element into the linked list 559 -public: 560 - MyVariantList(); 561 - ~MyVariantList(); 562 - MyRowVariant *Add(int columns); 563 - void SetColumnName(int col, const char *colName); 564 - MyRowVariant *GetFirst() 565 - { 566 - return First; 567 - } 568 - int GetRows(); 569 - int GetColumns() 570 - { 571 - return NumCols; 572 - } 573 - wxString & GetColumnName(int col); 352 + private: 353 + int NumCols; // number of columns 354 + wxString *ColumnName; // the column names 355 + MyRowVariant *First; // first element into the linked list 356 + MyRowVariant *Last; // last element into the linked list 357 + public: 358 + MyVariantList (); 359 + ~MyVariantList (); 360 + MyRowVariant *Add (int columns); 361 + void SetColumnName (int col, const char *colName); 362 + MyRowVariant *GetFirst () { return First; } 363 + int GetRows (); 364 + int GetColumns () { return NumCols; } 365 + wxString & GetColumnName (int col); 574 366 }; 575 367 576 368 class MyBlobs 577 369 { 578 370 // 579 371 // a class to store BLOBs 580 372 // 581 -private: 582 - int NumRows; // the number of rows 583 - int NumCols; // the number of columns 584 - MyRowVariant *Rows; // pointer to an array of rows 585 -public: 586 - MyBlobs(int rows, int cols); 587 - ~MyBlobs(); 588 - void SetBlob(int row, int col, MyVariant * blobVar); 589 - MyVariant *GetBlob(int row, int col); 373 + private: 374 + int NumRows; // the number of rows 375 + int NumCols; // the number of columns 376 + MyRowVariant *Rows; // pointer to an array of rows 377 + public: 378 + MyBlobs (int rows, int cols); 379 + ~MyBlobs (); 380 + void SetBlob (int row, int col, MyVariant * blobVar); 381 + MyVariant *GetBlob (int row, int col); 590 382 }; 591 383 592 384 class MyValues 593 385 { 594 386 // 595 387 // a class to store column values for editing 596 388 // 597 -private: 598 - int NumRows; // the number of rows 599 - int NumCols; // the number of columns 600 - MyRowVariant *Rows; // pointer to an array of rows 601 -public: 602 - MyValues(int rows, int cols); 603 - ~MyValues(); 604 - void SetValue(int row, int col, sqlite3_int64 value); 605 - void SetValue(int row, int col, double value); 606 - void SetValue(int row, int col, wxString & string); 607 - MyRowVariant *GetRow(int row); 608 - MyVariant *GetValue(int row, int col); 389 + private: 390 + int NumRows; // the number of rows 391 + int NumCols; // the number of columns 392 + MyRowVariant *Rows; // pointer to an array of rows 393 + public: 394 + MyValues (int rows, int cols); 395 + ~MyValues (); 396 + void SetValue (int row, int col, int value); 397 + void SetValue (int row, int col, double value); 398 + void SetValue (int row, int col, wxString & string); 399 + MyRowVariant *GetRow (int row); 400 + MyVariant *GetValue (int row, int col); 609 401 }; 610 402 611 403 class MySqlQuery 612 404 { 613 405 // 614 406 // a class to store an SQL query - history 615 407 // 616 -private: 617 - wxString Sql; 618 - MySqlQuery *Prev; 619 - MySqlQuery *Next; 620 -public: 621 - MySqlQuery(wxString & sql) 622 - { 623 - Sql = sql; 624 - Prev = NULL; 625 - Next = NULL; 626 - } 627 - ~MySqlQuery() 628 - {; 629 - } 630 - wxString & GetSql() 631 - { 632 - return Sql; 633 - } 634 - void SetPrev(MySqlQuery * prev) 635 - { 636 - Prev = prev; 637 - } 638 - MySqlQuery *GetPrev() 639 - { 640 - return Prev; 641 - } 642 - void SetNext(MySqlQuery * next) 643 - { 644 - Next = next; 645 - } 646 - MySqlQuery *GetNext() 647 - { 648 - return Next; 649 - } 408 + private: 409 + wxString Sql; 410 + MySqlQuery *Prev; 411 + MySqlQuery *Next; 412 + public: 413 + MySqlQuery (wxString & sql) { Sql = sql; Prev = NULL; 414 + Next = NULL; } 415 + ~MySqlQuery () { ; } 416 + wxString & GetSql () { return Sql; } 417 + void SetPrev (MySqlQuery * prev) { Prev = prev; } 418 + MySqlQuery *GetPrev () { return Prev; } 419 + void SetNext (MySqlQuery * next) { Next = next; } 420 + MySqlQuery *GetNext () { return Next; } 650 421 }; 651 422 652 423 class MySqlHistory 653 424 { 654 425 // 655 426 // a class supporting SQL queries history 656 427 // 657 -private: 658 - MySqlQuery * First; 659 - MySqlQuery *Last; 660 - MySqlQuery *Current; 661 -public: 662 - MySqlHistory() 663 - { 664 - First = NULL; 665 - Last = NULL; 666 - Current = NULL; 667 - } 668 - ~MySqlHistory(); 669 - void Add(wxString & sql); 670 - MySqlQuery *GetCurrent() 671 - { 672 - return Current; 673 - } 674 - MySqlQuery *GetNext(); 675 - MySqlQuery *GetPrev(); 676 - bool TestNext(); 677 - bool TestPrev(); 428 + private: 429 + MySqlQuery * First; 430 + MySqlQuery *Last; 431 + MySqlQuery *Current; 432 + public: 433 + MySqlHistory () { First = NULL; Last = NULL; 434 + Current = NULL; } 435 + ~MySqlHistory (); 436 + void Add (wxString & sql); 437 + MySqlQuery *GetCurrent () { return Current; } 438 + MySqlQuery *GetNext (); 439 + MySqlQuery *GetPrev (); 440 + bool TestNext (); 441 + bool TestPrev (); 678 442 }; 679 443 680 444 class MyApp:public wxApp 681 445 { 682 446 // 683 447 // the main APP 684 448 // 685 - virtual bool OnInit(); 449 + virtual bool OnInit (); 686 450 }; 687 451 688 452 class MyTableTree:public wxTreeCtrl 689 453 { 690 454 // 691 455 // a tree-control used for SQLite DB tables 692 456 // 693 -private: 694 - class MyFrame * MainFrame; 695 - wxTreeItemId Root; // the root node 696 - wxImageList *Images; // the images list 697 - wxTreeItemId CurrentItem; // the tree item holding the current context menu 698 -public: 699 - MyTableTree() 700 - {; 701 - } 702 - MyTableTree(class MyFrame * parent, wxWindowID id = wxID_ANY); 703 - virtual ~ MyTableTree() 704 - {; 705 - } 706 - void SetPath(wxString & path) 707 - { 708 - SetItemText(Root, path); 709 - } 710 - void FlushAll() 711 - { 712 - DeleteChildren(Root); 713 - } 714 - void AddTable(wxString & tableName, bool virtualTable); 715 - void AddView(wxString & viewName); 716 - void ExpandRoot() 717 - { 718 - Expand(Root); 719 - } 720 - void ShowMenu(wxTreeItemId & item, wxPoint & pt); 721 - void OnSelChanged(wxTreeEvent & event); 722 - void OnRightClick(wxTreeEvent & event); 723 - void OnCmdNewTable(wxCommandEvent & event); 724 - void OnCmdNewView(wxCommandEvent & event); 725 - void OnCmdNewIndex(wxCommandEvent & event); 726 - void OnCmdNewTrigger(wxCommandEvent & event); 727 - void OnCmdNewColumn(wxCommandEvent & event); 728 - void OnCmdShow(wxCommandEvent & event); 729 - void OnCmdDrop(wxCommandEvent & event); 730 - void OnCmdRename(wxCommandEvent & event); 731 - void OnCmdSelect(wxCommandEvent & event); 732 - void OnCmdRefresh(wxCommandEvent & event); 733 - void OnCmdRecover(wxCommandEvent & event); 734 - void OnCmdShowSql(wxCommandEvent & event); 735 - void OnCmdSpatialIndex(wxCommandEvent & event); 736 - void OnCmdMbrCache(wxCommandEvent & event); 737 - void OnCmdRebuildTriggers(wxCommandEvent & event); 738 - void OnCmdCheckGeometry(wxCommandEvent & event); 739 - void OnCmdSetSrid(wxCommandEvent & event); 740 - void OnCmdDumpShp(wxCommandEvent & event); 741 - void OnCmdDumpTxtTab(wxCommandEvent & event); 742 - void OnCmdDumpCsv(wxCommandEvent & event); 743 - void OnCmdDumpHtml(wxCommandEvent & event); 744 - void OnCmdEdit(wxCommandEvent & event); 745 -}; 746 - 747 -class MyResultSetView:public wxPanel 748 -{ 749 -// 750 -// a panel to be used for SQL Queries 751 -// 752 -private: 753 - class MyFrame * MainFrame; 754 - wxBitmapButton *BtnRsFirst; 755 - wxBitmapButton *BtnRsLast; 756 - wxBitmapButton *BtnRsNext; 757 - wxBitmapButton *BtnRsPrevious; 758 - wxBitmapButton *BtnRefresh; 759 - wxStaticText *RsCurrentBlock; 760 - int RsBlock; 761 - int RsBeginRow; 762 - int RsEndRow; 763 - int RsMaxRow; 764 - int CurrentEvtRow; 765 - int CurrentEvtColumn; 766 - MyVariant *CurrentBlob; 767 - wxGrid *TableView; 768 - MyBlobs *TableBlobs; 769 - MyValues *TableValues; 770 - bool ReadOnly; 771 - sqlite3_int64 *RowIds; 772 - int PrimaryKeys[1024]; 773 - int BlobColumns[1024]; 774 - wxString TableName; 775 - bool InsertPending; 776 - MyRowVariant *InsertRow; 777 - wxString SqlErrorMsg; 778 -public: 779 - MyResultSetView() 780 - {; 781 - } 782 - MyResultSetView(MyFrame * parent, wxWindowID id = wxID_ANY); 783 - virtual ~ MyResultSetView(); 784 - void HideControls(); 785 - void ShowControls(); 786 - wxString & GetSqlErrorMsg() 787 - { 788 - return SqlErrorMsg; 789 - } 790 - bool IsPrimaryKey(int column); 791 - bool IsBlobColumn(int column); 792 - void EditTable(wxString & sql, int *primaryKeys, int *blobCols, 793 - wxString & tableName); 794 - void CreateGrid(int rows, int cols); 795 - bool ExecuteSql(wxString & sql, int from, bool read_only); 796 - void ResizeView(); 797 - void DoInsert(bool confirmed); 798 - void HexBlobValue(unsigned char *blob, int size, wxString & hex); 799 - void OnSize(wxSizeEvent & event); 800 - void OnRsFirst(wxCommandEvent & event); 801 - void OnRsLast(wxCommandEvent & event); 802 - void OnRsNext(wxCommandEvent & event); 803 - void OnRsPrevious(wxCommandEvent & event); 804 - void OnRefresh(wxCommandEvent & event); 805 - void OnCellSelected(wxGridEvent & event); 806 - void OnRightClick(wxGridEvent & event); 807 - void OnCellChanged(wxGridEvent & event); 808 - void OnCmdDelete(wxCommandEvent & event); 809 - void OnCmdInsert(wxCommandEvent & event); 810 - void OnCmdAbort(wxCommandEvent & event); 811 - void OnCmdClearSelection(wxCommandEvent & event); 812 - void OnCmdSelectAll(wxCommandEvent & event); 813 - void OnCmdSelectRow(wxCommandEvent & event); 814 - void OnCmdSelectColumn(wxCommandEvent & event); 815 - void OnCmdCopy(wxCommandEvent & event); 816 - void OnCmdBlob(wxCommandEvent & event); 817 - void OnCmdBlobIn(wxCommandEvent & event); 818 - void OnCmdBlobOut(wxCommandEvent & event); 819 - void OnCmdBlobNull(wxCommandEvent & event); 820 -}; 821 - 822 -class MySqlControl:public wxTextCtrl 823 -{ 824 -// 825 -// the SQL text control 826 -// 827 -private: 828 - class MyQueryView * Parent; 829 -public: 830 - MySqlControl(MyQueryView * parent, wxWindowID id, const wxString & value, 831 - const wxPoint & pos, const wxSize & size, long style); 832 - virtual ~ MySqlControl() 833 - {; 834 - } 835 - void OnSqlMousePosition(wxMouseEvent & event); 836 - void OnSqlArrowPosition(wxKeyEvent & event); 837 -}; 838 - 839 -class SqlTokenizer 840 -{ 841 -// 842 -// a class used for tokenizing SQL statements 843 -// 844 -private: 845 - wxString ** TokenList; 846 - int Block; 847 - int Max; 848 - int Index; 849 - void Expand(); 850 - void Insert(wxString * token); 851 - wxString CurrentToken; 852 -public: 853 - SqlTokenizer(wxString & sql); 854 - ~SqlTokenizer(); 855 - bool HasMoreTokens(); 856 - wxString & GetNextToken(); 457 + private: 458 + class MyFrame * MainFrame; 459 + wxTreeItemId Root; // the root node 460 + wxImageList *Images; // the images list 461 + wxTreeItemId CurrentItem; // the tree item holding the current context menu 462 + public: 463 + MyTableTree () { ; } 464 + MyTableTree (MyFrame * parent, wxWindowID id = wxID_ANY); 465 + virtual ~ MyTableTree () { ; } 466 + void SetPath (wxString & path) { SetItemText (Root, path); } 467 + void FlushAll () { DeleteChildren (Root); } 468 + void AddTable (wxString & tableName, bool virtualTable); 469 + void AddView (wxString & viewName); 470 + void ExpandRoot () { Expand (Root); } 471 + void ShowMenu (wxTreeItemId & item, wxPoint & pt); 472 + void OnSelChanged (wxTreeEvent & event); 473 + void OnRightClick (wxTreeEvent & event); 474 + void OnCmdNewTable (wxCommandEvent & event); 475 + void OnCmdNewView (wxCommandEvent & event); 476 + void OnCmdNewIndex (wxCommandEvent & event); 477 + void OnCmdNewTrigger (wxCommandEvent & event); 478 + void OnCmdNewColumn (wxCommandEvent & event); 479 + void OnCmdShow (wxCommandEvent & event); 480 + void OnCmdDrop (wxCommandEvent & event); 481 + void OnCmdRename (wxCommandEvent & event); 482 + void OnCmdSelect (wxCommandEvent & event); 483 + void OnCmdRefresh (wxCommandEvent & event); 484 + void OnCmdRecover (wxCommandEvent & event); 485 + void OnCmdShowSql (wxCommandEvent & event); 486 + void OnCmdSpatialIndex (wxCommandEvent & event); 487 + void OnCmdMbrCache (wxCommandEvent & event); 488 + void OnCmdCheckGeometry (wxCommandEvent & event); 489 + void OnCmdSetSrid (wxCommandEvent & event); 490 + void OnCmdDumpShp (wxCommandEvent & event); 491 + void OnCmdDumpTxtTab (wxCommandEvent & event); 492 + void OnCmdDumpCsv (wxCommandEvent & event); 493 + void OnCmdDumpHtml (wxCommandEvent & event); 494 + void OnCmdEdit (wxCommandEvent & event); 857 495 }; 858 496 859 497 class MyQueryView:public wxPanel 860 498 { 861 499 // 862 500 // a panel to be used for SQL Queries 863 501 // 864 -private: 865 - class MyFrame * MainFrame; 866 - MySqlHistory History; 867 - MySqlControl *SqlCtrl; 868 - wxBitmapButton *BtnSqlGo; 869 - wxBitmapButton *BtnHistoryBack; 870 - wxBitmapButton *BtnHistoryForward; 871 - int BracketStart; 872 - int BracketEnd; 873 - bool IgnoreEvent; 874 -public: 875 - MyQueryView() 876 - {; 877 - } 878 - MyQueryView(MyFrame * parent, wxWindowID id = wxID_ANY); 879 - virtual ~ MyQueryView() 880 - {; 881 - } 882 - void HideControls(); 883 - void ShowControls(); 884 - bool IsSqliteExtra(wxString & str); 885 - bool IsSqlString(wxString & str); 886 - bool IsSqlNumber(wxString & str); 887 - bool IsSqlFunction(wxString & str, char next_c); 888 - bool IsSqlGeoFunction(wxString & str, char next_c); 889 - bool IsIgnoreEvent() 890 - { 891 - return IgnoreEvent; 892 - } 893 - void EventBrackets(); 894 - bool CheckBrackets(int pos, bool reverse_direction, int *on, int *off); 895 - void EvidBrackets(int on, int off); 896 - void DoSqlSyntaxColor(); 897 - wxTextCtrl *GetSqlCtrl() 898 - { 899 - return SqlCtrl; 900 - } 901 - void SetSql(wxString & sql, bool execute); 902 - void SetHistoryStates(); 903 - void OnSize(wxSizeEvent & event); 904 - void OnSqlGo(wxCommandEvent & event); 905 - void OnHistoryBack(wxCommandEvent & event); 906 - void OnHistoryForward(wxCommandEvent & event); 907 - void OnSqlSyntaxColor(wxCommandEvent & event); 908 - void AddToHistory(wxString & sql); 502 + private: 503 + class MyFrame * MainFrame; 504 + MySqlHistory History; 505 + wxTextCtrl *SqlCtrl; 506 + wxBitmapButton *BtnSqlGo; 507 + wxBitmapButton *BtnHistoryBack; 508 + wxBitmapButton *BtnHistoryForward; 509 + wxBitmapButton *BtnRsFirst; 510 + wxBitmapButton *BtnRsLast; 511 + wxBitmapButton *BtnRsNext; 512 + wxBitmapButton *BtnRsPrevious; 513 + wxBitmapButton *BtnRefresh; 514 + wxStaticText *RsCurrentBlock; 515 + int RsBlock; 516 + int RsBeginRow; 517 + int RsEndRow; 518 + int RsMaxRow; 519 + int CurrentEvtRow; 520 + int CurrentEvtColumn; 521 + MyVariant *CurrentBlob; 522 + wxString SqlErrorMsg; 523 + wxGrid *TableView; 524 + MyBlobs *TableBlobs; 525 + MyValues *TableValues; 526 + bool ReadOnly; 527 + int *RowIds; 528 + int PrimaryKeys[1024]; 529 + int BlobColumns[1024]; 530 + wxString TableName; 531 + bool InsertPending; 532 + MyRowVariant *InsertRow; 533 + public: 534 + MyQueryView () { ; } 535 + MyQueryView (MyFrame * parent, wxWindowID id = wxID_ANY); 536 + virtual ~ MyQueryView () { if (RowIds) delete[]RowIds; 537 + if (InsertRow) delete InsertRow; } 538 + void HideControls (); 539 + void HideRsControls (); 540 + void ShowSqlControls (); 541 + void ShowRsControls (); 542 + bool IsPrimaryKey (int column); 543 + bool IsBlobColumn (int column); 544 + void EditTable (wxString & sql, int *primaryKeys, int *blobCols, 545 + wxString & tableName); 546 + void SetSql (wxString & sql, bool execute); 547 + bool ExecuteSql (wxString & sql, int from); 548 + void CreateGrid (int rows, int cols); 549 + void ResizeTableView (); 550 + void SetHistoryStates (); 551 + void DoInsert (bool confirmed); 552 + void HexBlobValue (unsigned char *blob, int size, wxString & hex); 553 + void OnSize (wxSizeEvent & event); 554 + void OnSqlGo (wxCommandEvent & event); 555 + void OnHistoryBack (wxCommandEvent & event); 556 + void OnHistoryForward (wxCommandEvent & event); 557 + void OnRsFirst (wxCommandEvent & event); 558 + void OnRsLast (wxCommandEvent & event); 559 + void OnRsNext (wxCommandEvent & event); 560 + void OnRsPrevious (wxCommandEvent & event); 561 + void OnRefresh (wxCommandEvent & event); 562 + void OnCellSelected (wxGridEvent & event); 563 + void OnRightClick (wxGridEvent & event); 564 + void OnCellChanged (wxGridEvent & event); 565 + void OnCmdDelete (wxCommandEvent & event); 566 + void OnCmdInsert (wxCommandEvent & event); 567 + void OnCmdAbort (wxCommandEvent & event); 568 + void OnCmdClearSelection (wxCommandEvent & event); 569 + void OnCmdSelectAll (wxCommandEvent & event); 570 + void OnCmdSelectRow (wxCommandEvent & event); 571 + void OnCmdSelectColumn (wxCommandEvent & event); 572 + void OnCmdCopy (wxCommandEvent & event); 573 + void OnCmdBlob (wxCommandEvent & event); 574 + void OnCmdBlobIn (wxCommandEvent & event); 575 + void OnCmdBlobOut (wxCommandEvent & event); 576 + void OnCmdBlobNull (wxCommandEvent & event); 909 577 }; 910 578 911 579 class MyFrame:public wxFrame 912 580 { 913 581 // 914 582 // the main GUI frame 915 583 // 916 -private: 917 - wxString AutoFDOmsg; 918 - bool SpatiaLiteMetadata; 919 - wxAuiManager Manager; // the GUI manager 920 - wxString ConfigLayout; // PERSISTENCY - the layout configuration 921 - int ConfigPaneX; // PERSISTENCY - the main pane screen origin X 922 - int ConfigPaneY; // PERSISTENCY - the main pane screen origin Y 923 - int ConfigPaneWidth; // PERSISTENCY - the main pane screen width 924 - int ConfigPaneHeight; // PERSISTENCY - the main pane screen height 925 - wxString ConfigDbPath; // PERSISTENCY - the last opend DB path 926 - wxString ConfigDir; //PERSISTENCY - the last used directory 927 - MyTableTree *TableTree; // the tables tree list 928 - MyQueryView *QueryView; // the QueryResult panel 929 - MyResultSetView *RsView; // the QueryResult panel 930 - bool HelpPane; // is the HELP pane already opened ? 931 - sqlite3 *SqliteHandle; // handle for SQLite DB 932 - wxString SqlitePath; // path of SQLite DB 933 - wxString ExternalSqlitePath; // path of external SQLite DB [LOAD/SAVE MEMORY database] 934 - bool MemoryDatabase; // TRUE if we are currently working on the MEMORY database 935 - wxString LastDirectory; // path of directory used 936 - int CharsetsLen; // # charsets defined 937 - wxString *Charsets; // table of charsets [code only] 938 - wxString *CharsetsNames; // table of charsets [with description] 939 - wxString LocaleCharset; // locale charset 940 - wxString DefaultCharset; // default charset 941 - bool AskCharset; // switch to set default charset for every output 942 - int TablesLen; // # tables defined 943 - wxString *TableNames; // array of tables 944 - wxBitmap *BtnCreateNew; // button icon for DB CREATE&CONNECT 945 - wxBitmap *BtnConnect; // button icon for DB CONNECT 946 - wxBitmap *BtnDisconnect; // button icon for DB DISCONNECT 947 - wxBitmap *BtnMemDbLoad; // button icon for MEMORY DB LOAD 948 - wxBitmap *BtnMemDbNew; // button icon for MEMORY DB NEW 949 - wxBitmap *BtnMemDbClock; // button icon for MEMORY DB CLOCK 950 - wxBitmap *BtnMemDbSave; // button icon for MEMORY DB SAVE 951 - wxBitmap *BtnVacuum; // button icon for DB VACUUM 952 - wxBitmap *BtnSqlScript; // button icon for Execute SQL SCRIPT 953 - wxBitmap *BtnCharset; // button icon for Default CHARSET 954 - wxBitmap *BtnLoadShp; // button icon for LOAD SHP 955 - wxBitmap *BtnLoadTxt; // button icon for LOAD TXT/CSV 956 - wxBitmap *BtnVirtualShp; // button icon for VIRTUAL SHP 957 - wxBitmap *BtnVirtualTxt; // button icon for VIRTUAL TXT/CSV 958 - wxBitmap *BtnNetwork; // button icon for BUILD NETWORK 959 - wxBitmap *BtnExif; // button icon for EXIF LOAD 960 - wxBitmap *BtnSrids; // button icon for SEARCH SRIDs 961 - wxBitmap *BtnHelp; // button icon for HELP 962 - wxBitmap *BtnAbout; // button icon for ABOUT 963 - wxBitmap *BtnExit; // button icon for EXIT 964 -// AutoSave timer 965 - int AutoSaveInterval; 966 - int LastTotalChanges; 967 - wxTimer *TimerAutoSave; 968 -public: 969 - MyFrame(const wxString & title, const wxPoint & pos, const wxSize & size, 970 - wxString & path); 971 - virtual ~ MyFrame(); 972 - 973 - void UpdateStatusBar(); 974 - bool IsConnected() 975 - { 976 - if (SqliteHandle) 977 - return true; 978 - else 979 - return false; 980 - } 981 - static void CleanSql(char *str); 982 - void CleanTxtTab(char *str); 983 - void CleanCsv(char *str); 984 - void CleanHtml(char *str); 985 - wxString & GetExternalSqlitePath() 986 - { 987 - return ExternalSqlitePath; 988 - } 989 - void SetExternalSqlitePath(wxString & path) 990 - { 991 - ExternalSqlitePath = path; 992 - } 993 - sqlite3 *GetSqlite() 994 - { 995 - return SqliteHandle; 996 - } 997 - void CloseHelpPane() 998 - { 999 - HelpPane = false; 1000 - } 1001 - void OpenHelpPane() 1002 - { 1003 - HelpPane = true; 1004 - } 1005 - 1006 - bool OpenDB(); 1007 - bool CreateDB(); 1008 - void CloseDB(); 1009 - bool CreateSpatialMetaData(); 1010 - void AutoFDOStart(); 1011 - void AutoFDOStop(); 1012 - void InitTableTree(); 1013 - void ClearTableTree(); 1014 - void GetTableColumns(wxString & tableName, MyTableInfo * list); 1015 - void GetTableIndices(wxString & tableName, MyTableInfo * list); 1016 - void GetTableTriggers(wxString & tableName, MyTableInfo * list); 1017 - void GetViewColumns(wxString & viewName, MyViewInfo * list); 1018 - void EditTable(wxString & sql, int *primaryKeys, int *blobCols, 1019 - wxString & table) 1020 - { 1021 - RsView->EditTable(sql, primaryKeys, blobCols, table); 1022 - } 1023 - void SetSql(wxString & sql, bool execute) 1024 - { 1025 - QueryView->SetSql(sql, execute); 1026 - } 1027 - bool ExecuteSql(const char *sql, int rowNo); 1028 - void Rollback(); 1029 - bool TableAlreadyExists(wxString & name); 1030 - bool SridNotExists(int srid); 1031 - bool CheckMetadata(); 1032 - void CleanSqlString(char *sql); 1033 - void SaveConfig(); 1034 - void LoadConfig(); 1035 - wxString *GetCharsets() 1036 - { 1037 - return Charsets; 1038 - } 1039 - wxString *GetCharsetsNames() 1040 - { 1041 - return CharsetsNames; 1042 - } 1043 - int GetCharsetsLen() 1044 - { 1045 - return CharsetsLen; 1046 - } 1047 - gaiaDbfFieldPtr GetDbfField(gaiaDbfListPtr list, char *name); 1048 - void LoadShapefile(wxString & path, wxString & table, int srid, 1049 - wxString & column, wxString & charset); 1050 - void DumpShapefile(wxString & path, wxString & table, wxString & column, 1051 - wxString & charset); 1052 - void LoadText(wxString & path, wxString & table, wxString & charset, 1053 - bool first_titles, char decimal_separator, char separator, 1054 - char text_separator); 1055 - void DumpTxtTab(wxString & path, wxString & table, wxString & charset); 1056 - void DumpCsv(wxString & path, wxString & table, wxString & charset); 1057 - void DumpHtml(wxString & path, wxString & table, wxString & charset); 1058 - void GetHelp(wxString & html); 1059 - wxString *GetColumnNames(wxString & table, int *columns); 1060 - void SetLastDirectory(wxString & path) 1061 - { 1062 - LastDirectory = path; 1063 - } 1064 - wxString & GetLastDirectory() 1065 - { 1066 - return LastDirectory; 1067 - } 1068 - wxString & GetLocaleCharset() 1069 - { 1070 - return LocaleCharset; 1071 - } 1072 - wxString & GetDefaultCharset() 1073 - { 1074 - return DefaultCharset; 1075 - } 1076 - wxString & GetCharsetName(wxString & charset); 1077 - int GetCharsetIndex(wxString & charset); 1078 - bool IsSetAskCharset() 1079 - { 1080 - return AskCharset; 1081 - } 1082 - char *ReadSqlLine(FILE * fl, int *len, int *eof); 1083 - MyQueryView *GetQueryView() 1084 - { 1085 - return QueryView; 1086 - } 1087 - MyResultSetView *GetRsView() 1088 - { 1089 - return RsView; 1090 - } 1091 - wxString *GetTables(int *cnt); 1092 - void BuildNetwork(wxString & table, wxString & from, wxString & to, 1093 - wxString & geometry, bool cost_length, wxString & cost, 1094 - bool bidirectional, bool one_way, 1095 - wxString & one_way_from_to, wxString & one_way_to_from); 1096 - bool CreateNetwork(class Network * net, wxString & table, wxString & from, 1097 - wxString & to, wxString & geometry); 1098 - void ImportExifPhotos(wxString & path, bool folder, bool metadata, 1099 - bool gps_only); 1100 - void OutputNetNode(unsigned char *auxbuf, int *size, int ind, bool node_code, 1101 - int max_node_length, class NetNode * pN, int endian_arch); 1102 - bool CheckExifTables(); 1103 - int ExifLoadDir(wxString & path, bool gps_only, bool metadata); 1104 - int ExifLoadFile(wxString & path, bool gps_only, bool metadata); 1105 - bool UpdateExifTables(unsigned char *blob, int sz, 1106 - gaiaExifTagListPtr tag_list, bool metadata, 1107 - wxString & path); 1108 - bool IsExifGps(gaiaExifTagListPtr tag_list); 1109 - void GetMake(gaiaExifTagListPtr tag_list, wxString & str, bool * ok); 1110 - void GetModel(gaiaExifTagListPtr tag_list, wxString & str, bool * ok); 1111 - void GetGpsTimestamp(gaiaExifTagListPtr tag_list, wxString & str, bool * ok); 1112 - void GetDate(gaiaExifTagListPtr tag_list, wxString & str, bool * ok); 1113 - double GetGpsDirection(gaiaExifTagListPtr tag_list, bool * ok); 1114 - void GetGpsSatellites(gaiaExifTagListPtr tag_list, wxString & str, bool * ok); 1115 - void GetGpsCoords(gaiaExifTagListPtr tag_list, double *longitude, 1116 - double *latitude, bool * ok); 1117 - sqlite3_int64 GetPixelX(gaiaExifTagListPtr tag_list, bool * ok); 1118 - sqlite3_int64 GetPixelY(gaiaExifTagListPtr tag_list, bool * ok); 1119 - 1120 - bool MemoryDbSave(); 1121 - void LastDitchMemoryDbSave(); 1122 - 1123 - void OnQuit(wxCommandEvent & event); 1124 - void OnAbout(wxCommandEvent & event); 1125 - void OnConnect(wxCommandEvent & event); 1126 - void OnCreateNew(wxCommandEvent & event); 1127 - void OnDisconnect(wxCommandEvent & event); 1128 - void OnMemoryDbLoad(wxCommandEvent & event); 1129 - void OnMemoryDbNew(wxCommandEvent & event); 1130 - void OnMemoryDbClock(wxCommandEvent & event); 1131 - void OnMemoryDbSave(wxCommandEvent & event); 1132 - void OnVacuum(wxCommandEvent & event); 1133 - void OnSqlScript(wxCommandEvent & event); 1134 - void OnCharset(wxCommandEvent & event); 1135 - void OnLoadShp(wxCommandEvent & event); 1136 - void OnLoadTxt(wxCommandEvent & event); 1137 - void OnVirtualShp(wxCommandEvent & event); 1138 - void OnVirtualTxt(wxCommandEvent & event); 1139 - void OnNetwork(wxCommandEvent & event); 1140 - void OnImportExifPhotos(wxCommandEvent & event); 1141 - void OnSrids(wxCommandEvent & event); 1142 - void OnHelp(wxCommandEvent & event); 1143 - void OnMouseMove(wxMouseEvent & event); 1144 - void OnTimerAutoSave(wxTimerEvent & event); 584 + private: 585 + unsigned char Jpeg1Signature[2]; 586 + unsigned char Jpeg2Signature[2]; 587 + unsigned char Jpeg3Signature[4]; 588 + unsigned char JfifSignature[4]; 589 + unsigned char ExifSignature[4]; 590 + unsigned char PngSignature[8]; 591 + unsigned char ZipSignature[4]; 592 + wxAuiManager Manager; // the GUI manager 593 + MyTableTree *TableTree; // the tables tree list 594 + MyQueryView *QueryView; // the QueryResult panel 595 + bool HelpPane; // is the HELP pane already opened ? 596 + sqlite3 *SqliteHandle; // handle for SQLite DB 597 + wxString SqlitePath; // path of SQLite DB 598 + wxString LastDirectory; // path of directory used 599 + int CharsetsLen; // # charsets defined 600 + wxString *Charsets; // table of charsets [code only] 601 + wxString *CharsetsNames; // table of charsets [whith description] 602 + wxString LocaleCharset; // locale charset 603 + wxString DefaultCharset; // default charset 604 + bool AskCharset; // switch to set default charset for every output 605 + wxBitmap *BtnCreateNew; // button icon for DB CREATE&CONNECT 606 + wxBitmap *BtnConnect; // button icon for DB CONNECT 607 + wxBitmap *BtnDisconnect; // button icon for DB DISCONNECT 608 + wxBitmap *BtnVacuum; // button icon for DB VACUUM 609 + wxBitmap *BtnSqlScript; // button icon for Execute SQL SCRIPT 610 + wxBitmap *BtnCharset; // button icon for Default CHARSET 611 + wxBitmap *BtnLoadShp; // button icon for LOAD SHP 612 + wxBitmap *BtnLoadTxt; // button icon for LOAD TXT/CSV 613 + wxBitmap *BtnVirtualShp; // button icon for VIRTUAL SHP 614 + wxBitmap *BtnVirtualTxt; // button icon for VIRTUAL TXT/CSV 615 + wxBitmap *BtnSrids; // button icon for SEARCH SRIDs 616 + wxBitmap *BtnHelp; // button icon for HELP 617 + wxBitmap *BtnAbout; // button icon for ABOUT 618 + wxBitmap *BtnExit; // button icon for EXIT 619 + public: 620 + enum 621 + { 622 + BLOB_NULL = 0, 623 + BLOB_HEX, 624 + BLOB_GEOMETRY, 625 + BLOB_JPEG, 626 + BLOB_JFIF, 627 + BLOB_EXIF, 628 + BLOB_PNG, 629 + BLOB_GIF, 630 + BLOB_PDF, 631 + BLOB_ZIP, 632 + }; 633 + MyFrame (const wxString & title, const wxPoint & pos, const wxSize & size, 634 + wxString & path); 635 + virtual ~ MyFrame (); 636 + 637 + void UpdateStatusBar (); 638 + bool IsConnected () { if (SqliteHandle) return true; 639 + else return false; 640 + } 641 + static void CleanSql (char *str); 642 + void CleanTxtTab (char *str); 643 + void CleanCsv (char *str); 644 + void CleanHtml (char *str); 645 + sqlite3 *GetSqlite () { return SqliteHandle; } 646 + void CloseHelpPane () { HelpPane = false; } 647 + void OpenHelpPane () { HelpPane = true; } 648 + 649 + bool OpenDB (); 650 + bool CreateDB (); 651 + void CloseDB (); 652 + void InitTableTree (); 653 + void ClearTableTree (); 654 + void GetTableColumns (wxString & tableName, MyTableInfo * list); 655 + void GetTableIndices (wxString & tableName, MyTableInfo * list); 656 + void GetTableTriggers (wxString & tableName, MyTableInfo * list); 657 + void GetViewColumns (wxString & viewName, MyViewInfo * list); 658 + void EditTable (wxString & sql, int *primaryKeys, int *blobCols, 659 + wxString & table) 660 + { QueryView->EditTable (sql, primaryKeys, blobCols, table); } 661 + void SetSql (wxString & sql, bool execute) 662 + { QueryView->SetSql (sql, execute); } 663 + int GuessBlobType (int blob_size, unsigned char *blob); 664 + bool ExecuteSql (const char *sql, int rowNo); 665 + void Rollback (); 666 + bool TableAlreadyExists (wxString & name); 667 + bool SridNotExists (int srid); 668 + bool CheckMetadata (); 669 + void CleanSqlString (char *sql); 670 + wxString *GetCharsets () { return Charsets; } 671 + wxString *GetCharsetsNames () { return CharsetsNames; } 672 + int GetCharsetsLen () { return CharsetsLen; } 673 + gaiaDbfFieldPtr GetDbfField (gaiaDbfListPtr list, char *name); 674 + void LoadShapefile (wxString & path, wxString & table, int srid, 675 + wxString & column, wxString & charset); 676 + void DumpShapefile (wxString & path, wxString & table, wxString & column, 677 + wxString & charset); 678 + void LoadText (wxString & path, wxString & table, wxString & charset, bool first_titles, char decimal_separator, 679 + char separator, char text_separator); 680 + void DumpTxtTab (wxString & path, wxString & table, wxString & charset); 681 + void DumpCsv (wxString & path, wxString & table, wxString & charset); 682 + void DumpHtml (wxString & path, wxString & table, wxString & charset); 683 + void GetHelp (wxString & html); 684 + wxString *GetColumnNames (wxString & table, int *columns); 685 + void SetLastDirectory (wxString & path) { LastDirectory = path; } 686 + wxString & GetLastDirectory () { return LastDirectory; } 687 + wxString & GetLocaleCharset () { return LocaleCharset; } 688 + wxString & GetDefaultCharset () { return DefaultCharset; } 689 + wxString & GetCharsetName (wxString & charset); 690 + int GetCharsetIndex (wxString & charset); 691 + bool IsSetAskCharset () { return AskCharset; } 692 + char * ReadSqlLine(FILE *fl, int *len, int *eof); 693 + 694 + void OnQuit (wxCommandEvent & event); 695 + void OnAbout (wxCommandEvent & event); 696 + void OnConnect (wxCommandEvent & event); 697 + void OnCreateNew (wxCommandEvent & event); 698 + void OnDisconnect (wxCommandEvent & event); 699 + void OnVacuum (wxCommandEvent & event); 700 + void OnSqlScript (wxCommandEvent & event); 701 + void OnCharset (wxCommandEvent & event); 702 + void OnLoadShp (wxCommandEvent & event); 703 + void OnLoadTxt (wxCommandEvent & event); 704 + void OnVirtualShp (wxCommandEvent & event); 705 + void OnVirtualTxt (wxCommandEvent & event); 706 + void OnSrids (wxCommandEvent & event); 707 + void OnHelp (wxCommandEvent & event); 708 + void OnMouseMove (wxMouseEvent & event); 1145 709 }; 1146 710 1147 711 class HelpDialog:public wxDialog 1148 712 { 1149 713 // 1150 714 // the help dialog 1151 715 // 1152 -private: 1153 - MyFrame * MainFrame; 1154 -public: 1155 - HelpDialog() 1156 - { 1157 - MainFrame = NULL; 1158 - } 1159 - HelpDialog(MyFrame * parent) 1160 - { 1161 - Create(parent); 1162 - } 1163 - bool Create(MyFrame * parent); 1164 - virtual ~ HelpDialog() 1165 - {; 1166 - } 1167 - void CreateControls(); 1168 - void OnClose(wxCloseEvent & event); 1169 - void OnSize(wxSizeEvent & event); 716 + private: 717 + MyFrame * MainFrame; 718 + public: 719 + HelpDialog () { MainFrame = NULL; } 720 + HelpDialog (MyFrame * parent) { Create (parent); } 721 + bool Create (MyFrame * parent); 722 + virtual ~ HelpDialog () { ; } 723 + void CreateControls (); 724 + void OnClose (wxCloseEvent & event); 1170 725 }; 1171 726 1172 727 class SearchSridDialog:public wxDialog 1173 728 { 1174 729 // 1175 730 // a dialog preparing a Search SRID by name 1176 731 // 1177 -private: 1178 - MyFrame * MainFrame; 1179 - wxString String; // required search string 1180 -public: 1181 - SearchSridDialog() 1182 - {; 1183 - } 1184 - SearchSridDialog(MyFrame * parent); 1185 - bool Create(MyFrame * parent); 1186 - virtual ~ SearchSridDialog() 1187 - {; 1188 - } 1189 - void CreateControls(); 1190 - wxString & GetString() 1191 - { 1192 - return String; 1193 - } 1194 - void OnOk(wxCommandEvent & event); 732 + private: 733 + MyFrame * MainFrame; 734 + wxString String; // required search string 735 + public: 736 + SearchSridDialog () { ; } 737 + SearchSridDialog (MyFrame * parent); 738 + bool Create (MyFrame * parent); 739 + virtual ~ SearchSridDialog () { ; } 740 + void CreateControls (); 741 + wxString & GetString () { return String; } 742 + void OnOk (wxCommandEvent & event); 1195 743 }; 1196 744 1197 745 class SetSridDialog:public wxDialog 1198 746 { 1199 747 // 1200 748 // a dialog preparing a SET SRID 1201 749 // 1202 -private: 1203 - MyFrame * MainFrame; 1204 - wxString Table; // the table's name 1205 - wxString Column; // the column's name to be recovered 1206 - int OldSrid; // SRID to substitute 1207 - int Srid; // required SRID 1208 -public: 1209 - SetSridDialog() 1210 - {; 1211 - } 1212 - SetSridDialog(MyFrame * parent, wxString & table, wxString & column); 1213 - bool Create(MyFrame * parent, wxString & table, wxString & column); 1214 - virtual ~ SetSridDialog() 1215 - {; 1216 - } 1217 - void CreateControls(); 1218 - int GetOldSrid() 1219 - { 1220 - return OldSrid; 1221 - } 1222 - int GetSrid() 1223 - { 1224 - return Srid; 1225 - } 1226 - void OnOk(wxCommandEvent & event); 750 + private: 751 + MyFrame * MainFrame; 752 + wxString Table; // the table's name 753 + wxString Column; // the column's name to be recovered 754 + int OldSrid; // SRID to substitute 755 + int Srid; // required SRID 756 + public: 757 + SetSridDialog () { ; } 758 + SetSridDialog (MyFrame * parent, wxString & table, wxString & column); 759 + bool Create (MyFrame * parent, wxString & table, wxString & column); 760 + virtual ~ SetSridDialog () { ; } 761 + void CreateControls (); 762 + int GetOldSrid () { return OldSrid; } 763 + int GetSrid () { return Srid; } 764 + void OnOk (wxCommandEvent & event); 1227 765 }; 1228 766 1229 767 class RecoverDialog:public wxDialog 1230 768 { 1231 769 // 1232 770 // a dialog preparing a RECOVER GEOMETRY 1233 771 // 1234 -private: 1235 - MyFrame * MainFrame; 1236 - wxString Table; // the table's name 1237 - wxString Column; // the column's name to be recovered 1238 - int Srid; // required SRID 1239 - wxString Type; // required Geometry Type 1240 -public: 1241 - RecoverDialog() 1242 - {; 1243 - } 1244 - RecoverDialog(MyFrame * parent, wxString & table, wxString & column); 1245 - bool Create(MyFrame * parent, wxString & table, wxString & column); 1246 - virtual ~ RecoverDialog() 1247 - {; 1248 - } 1249 - void CreateControls(); 1250 - wxString & GetType() 1251 - { 1252 - return Type; 1253 - } 1254 - int GetSrid() 1255 - { 1256 - return Srid; 1257 - } 1258 - void OnOk(wxCommandEvent & event); 772 + private: 773 + MyFrame * MainFrame; 774 + wxString Table; // the table's name 775 + wxString Column; // the column's name to be recovered 776 + int Srid; // required SRID 777 + wxString Type; // required Geometry Type 778 + public: 779 + RecoverDialog () { ; } 780 + RecoverDialog (MyFrame * parent, wxString & table, wxString & column); 781 + bool Create (MyFrame * parent, wxString & table, wxString & column); 782 + virtual ~ RecoverDialog () { ; } 783 + void CreateControls (); 784 + wxString & GetType () { return Type; } 785 + int GetSrid () { return Srid; } 786 + void OnOk (wxCommandEvent & event); 1259 787 }; 1260 788 1261 789 class VirtualShpDialog:public wxDialog 1262 790 { 1263 791 // 1264 792 // a dialog preparing a CREATE VIRTUAL SHAPE 1265 793 // 1266 -private: 1267 - MyFrame * MainFrame; 1268 - wxString Path; // the SHP base path 1269 - wxString Table; // the table name 1270 - wxString Default; // the default charset 1271 - wxString Charset; // the SHP charset 1272 - int Srid; // the SRID 1273 -public: 1274 - VirtualShpDialog() 1275 - {; 1276 - } 1277 - VirtualShpDialog(MyFrame * parent, wxString & path, wxString & table, 1278 - wxString & defCs); 1279 - bool Create(MyFrame * parent, wxString & path, wxString & table, 1280 - wxString & defCs); 1281 - virtual ~ VirtualShpDialog() 1282 - {; 1283 - } 1284 - void CreateControls(); 1285 - wxString & GetTable() 1286 - { 1287 - return Table; 1288 - } 1289 - wxString & GetCharset() 1290 - { 1291 - return Charset; 1292 - } 1293 - int GetSrid() 1294 - { 1295 - return Srid; 1296 - } 1297 - void OnOk(wxCommandEvent & event); 794 + private: 795 + MyFrame * MainFrame; 796 + wxString Path; // the SHP base path 797 + wxString Table; // the table name 798 + wxString Default; // the default charset 799 + wxString Charset; // the SHP charset 800 + int Srid; // the SRID 801 + public: 802 + VirtualShpDialog () { ; } 803 + VirtualShpDialog (MyFrame * parent, wxString & path, wxString & table, wxString & defCs); 804 + bool Create (MyFrame * parent, wxString & path, wxString & table, wxString & defCs); 805 + virtual ~ VirtualShpDialog () { ; } 806 + void CreateControls (); 807 + wxString & GetTable() { return Table; } 808 + wxString & GetCharset () { return Charset; } 809 + int GetSrid () { return Srid; } 810 + void OnOk (wxCommandEvent & event); 1298 811 }; 1299 812 1300 813 class VirtualTxtDialog:public wxDialog 1301 814 { 1302 815 // 1303 816 // a dialog preparing a CREATE VIRTUAL TEXT 1304 817 // 1305 -private: 1306 - MyFrame * MainFrame; 1307 - wxString Path; // the CSV/TXT base path 1308 - wxString Table; // the table name 1309 - wxString Default; // the default charset 1310 - wxString Charset; // the CSV/TXT charset 1311 - bool FirstLineTitles; // TRUE if first line stores column titles 1312 - char Separator; // the character to be used as field separator 1313 - char TextSeparator; // the character to be used as text separator 1314 - bool DecimalPointIsComma; // TRUE if decimal separator is COMMA 1315 -public: 1316 - VirtualTxtDialog() 1317 - {; 1318 - } 1319 - VirtualTxtDialog(MyFrame * parent, wxString & path, wxString & table, 1320 - wxString & defCs); 1321 - bool Create(MyFrame * parent, wxString & path, wxString & table, 1322 - wxString & defCs); 1323 - virtual ~ VirtualTxtDialog() 1324 - {; 1325 - } 1326 - void CreateControls(); 1327 - wxString & GetTable() 1328 - { 1329 - return Table; 1330 - } 1331 - wxString & GetCharset() 1332 - { 1333 - return Charset; 1334 - } 1335 - bool IsFirstLineTitles() 1336 - { 1337 - return FirstLineTitles; 1338 - } 1339 - char GetSeparator() 1340 - { 1341 - return Separator; 1342 - } 1343 - char GetTextSeparator() 1344 - { 1345 - return TextSeparator; 1346 - } 1347 - bool IsDecimalPointComma() 1348 - { 1349 - return DecimalPointIsComma; 1350 - } 1351 - void OnSeparator(wxCommandEvent & event); 1352 - void OnDecimalSeparator(wxCommandEvent & event); 1353 - void OnQuote(wxCommandEvent & event); 1354 - void OnOk(wxCommandEvent & event); 818 + private: 819 + MyFrame * MainFrame; 820 + wxString Path; // the CSV/TXT base path 821 + wxString Table; // the table name 822 + wxString Default; // the default charset 823 + wxString Charset; // the CSV/TXT charset 824 + bool FirstLineTitles; // TRUE if first line stores column titles 825 + char Separator; // the character to be used as field separator 826 + char TextSeparator; // the character to be used as text separator 827 + bool DecimalPointIsComma; // TRUE if decimal separator is COMMA 828 + public: 829 + VirtualTxtDialog () { ; } 830 + VirtualTxtDialog (MyFrame * parent, wxString & path, wxString & table, wxString & defCs); 831 + bool Create (MyFrame * parent, wxString & path, wxString & table, wxString & defCs); 832 + virtual ~ VirtualTxtDialog () { ; } 833 + void CreateControls (); 834 + wxString & GetTable() { return Table; } 835 + wxString & GetCharset () { return Charset; } 836 + bool IsFirstLineTitles() { return FirstLineTitles; } 837 + char GetSeparator() { return Separator; } 838 + char GetTextSeparator() { return TextSeparator; } 839 + bool IsDecimalPointComma() { return DecimalPointIsComma; } 840 + void OnSeparator (wxCommandEvent & event); 841 + void OnDecimalSeparator (wxCommandEvent & event); 842 + void OnQuote (wxCommandEvent & event); 843 + void OnOk (wxCommandEvent & event); 1355 844 }; 1356 845 1357 846 class LoadShpDialog:public wxDialog 1358 847 { 1359 848 // 1360 849 // a dialog preparing a LOAD SHAPE 1361 850 // 1362 -private: 1363 - MyFrame * MainFrame; 1364 - wxString Path; // the SHP base path 1365 - wxString Table; // the table's name to be created 1366 - wxString Column; // the column's name for Geometry 1367 - wxString Default; // the default charset 1368 - wxString Charset; // the SHP charset 1369 - int Srid; // the SRID 1370 -public: 1371 - LoadShpDialog() 1372 - {; 1373 - } 1374 - LoadShpDialog(MyFrame * parent, wxString & path, wxString & table, int srid, 1375 - wxString & column, wxString & defCs); 1376 - bool Create(MyFrame * parent, wxString & path, wxString & table, int srid, 1377 - wxString & column, wxString & defCs); 1378 - virtual ~ LoadShpDialog() 1379 - {; 1380 - } 1381 - void CreateControls(); 1382 - wxString & GetTable() 1383 - { 1384 - return Table; 1385 - } 1386 - wxString & GetColumn() 1387 - { 1388 - return Column; 1389 - } 1390 - wxString & GetCharset() 1391 - { 1392 - return Charset; 1393 - } 1394 - int GetSrid() 1395 - { 1396 - return Srid; 1397 - } 1398 - void OnOk(wxCommandEvent & event); 851 + private: 852 + MyFrame * MainFrame; 853 + wxString Path; // the SHP base path 854 + wxString Table; // the table's name to be created 855 + wxString Column; // the column's name for Geometry 856 + wxString Default; // the default charset 857 + wxString Charset; // the SHP charset 858 + int Srid; // the SRID 859 + public: 860 + LoadShpDialog () { ; } 861 + LoadShpDialog (MyFrame * parent, wxString & path, wxString & table, 862 + int srid, wxString & column, wxString & defCs); 863 + bool Create (MyFrame * parent, wxString & path, wxString & table, int srid, 864 + wxString & column, wxString & defCs); 865 + virtual ~ LoadShpDialog () { ; } 866 + void CreateControls (); 867 + wxString & GetTable () { return Table; } 868 + wxString & GetColumn () { return Column; } 869 + wxString & GetCharset () { return Charset; } 870 + int GetSrid () { return Srid; } 871 + void OnOk (wxCommandEvent & event); 1399 872 }; 1400 873 1401 874 class DumpShpDialog:public wxDialog 1402 875 { 1403 876 // 1404 877 // a dialog preparing a DUMP SHAPE 1405 878 // 1406 -private: 1407 - MyFrame * MainFrame; 1408 - wxString Path; // the SHP base path 1409 - wxString Table; // the table's name to be created 1410 - wxString Column; // the column's name for Geometry 1411 - wxString Default; // the default charset 1412 - wxString Charset; // the SHP charset 1413 -public: 1414 - DumpShpDialog() 1415 - {; 1416 - } 1417 - DumpShpDialog(MyFrame * parent, wxString & path, wxString & table, 1418 - wxString & column, wxString & defCs); 1419 - bool Create(MyFrame * parent, wxString & path, wxString & table, 1420 - wxString & column, wxString & defCs); 1421 - virtual ~ DumpShpDialog() 1422 - {; 1423 - } 1424 - void CreateControls(); 1425 - wxString & GetCharset() 1426 - { 1427 - return Charset; 1428 - } 1429 - void OnOk(wxCommandEvent & event); 879 + private: 880 + MyFrame * MainFrame; 881 + wxString Path; // the SHP base path 882 + wxString Table; // the table's name to be created 883 + wxString Column; // the column's name for Geometry 884 + wxString Default; // the default charset 885 + wxString Charset; // the SHP charset 886 + public: 887 + DumpShpDialog () { ; } 888 + DumpShpDialog (MyFrame * parent, wxString & path, wxString & table, 889 + wxString & column, wxString & defCs); 890 + bool Create (MyFrame * parent, wxString & path, wxString & table, 891 + wxString & column, wxString & defCs); 892 + virtual ~ DumpShpDialog () { ; } 893 + void CreateControls (); 894 + wxString & GetCharset () { return Charset; } 895 + void OnOk (wxCommandEvent & event); 1430 896 }; 1431 897 1432 898 class LoadTxtDialog:public wxDialog 1433 899 { 1434 900 // 1435 901 // a dialog preparing a LOAD TXT/CSV 1436 902 // 1437 -private: 1438 - MyFrame * MainFrame; 1439 - wxString Path; // the CSV/TXT base path 1440 - wxString Table; // the table name 1441 - wxString Default; // the default charset 1442 - wxString Charset; // the CSV/TXT charset 1443 - bool FirstLineTitles; // TRUE if first line stores column titles 1444 - char Separator; // the character to be used as field separator 1445 - char TextSeparator; // the character to be used as text separator 1446 - bool DecimalPointIsComma; // TRUE if decimal separator is COMMA 1447 -public: 1448 - LoadTxtDialog() 1449 - {; 1450 - } 1451 - LoadTxtDialog(MyFrame * parent, wxString & path, wxString & table, 1452 - wxString & defCs); 1453 - bool Create(MyFrame * parent, wxString & path, wxString & table, 1454 - wxString & defCs); 1455 - virtual ~ LoadTxtDialog() 1456 - {; 1457 - } 1458 - void CreateControls(); 1459 - wxString & GetTable() 1460 - { 1461 - return Table; 1462 - } 1463 - wxString & GetCharset() 1464 - { 1465 - return Charset; 1466 - } 1467 - bool IsFirstLineTitles() 1468 - { 1469 - return FirstLineTitles; 1470 - } 1471 - char GetSeparator() 1472 - { 1473 - return Separator; 1474 - } 1475 - char GetTextSeparator() 1476 - { 1477 - return TextSeparator; 1478 - } 1479 - bool IsDecimalPointComma() 1480 - { 1481 - return DecimalPointIsComma; 1482 - } 1483 - void OnSeparator(wxCommandEvent & event); 1484 - void OnDecimalSeparator(wxCommandEvent & event); 1485 - void OnQuote(wxCommandEvent & event); 1486 - void OnOk(wxCommandEvent & event); 903 + private: 904 + MyFrame * MainFrame; 905 + wxString Path; // the CSV/TXT base path 906 + wxString Table; // the table name 907 + wxString Default; // the default charset 908 + wxString Charset; // the CSV/TXT charset 909 + bool FirstLineTitles; // TRUE if first line stores column titles 910 + char Separator; // the character to be used as field separator 911 + char TextSeparator; // the character to be used as text separator 912 + bool DecimalPointIsComma; // TRUE if decimal separator is COMMA 913 + public: 914 + LoadTxtDialog () { ; } 915 + LoadTxtDialog (MyFrame * parent, wxString & path, wxString & table, wxString & defCs); 916 + bool Create (MyFrame * parent, wxString & path, wxString & table, wxString & defCs); 917 + virtual ~ LoadTxtDialog () { ; } 918 + void CreateControls (); 919 + wxString & GetTable() { return Table; } 920 + wxString & GetCharset () { return Charset; } 921 + bool IsFirstLineTitles() { return FirstLineTitles; } 922 + char GetSeparator() { return Separator; } 923 + char GetTextSeparator() { return TextSeparator; } 924 + bool IsDecimalPointComma() { return DecimalPointIsComma; } 925 + void OnSeparator (wxCommandEvent & event); 926 + void OnDecimalSeparator (wxCommandEvent & event); 927 + void OnQuote (wxCommandEvent & event); 928 + void OnOk (wxCommandEvent & event); 1487 929 }; 1488 930 1489 931 class DumpTxtDialog:public wxDialog 1490 932 { 1491 933 // 1492 934 // a dialog preparing a DUMP generic text 1493 935 // 1494 -private: 1495 - MyFrame * MainFrame; 1496 - wxString Path; // the SHP base path 1497 - wxString Default; // the default charset 1498 - wxString Charset; // the target charset 1499 -public: 1500 - DumpTxtDialog() 1501 - {; 1502 - } 1503 - DumpTxtDialog(MyFrame * parent, wxString & path, wxString & target, 1504 - wxString & defCs); 1505 - bool Create(MyFrame * parent, wxString & path, wxString & target, 1506 - wxString & defCs); 1507 - virtual ~ DumpTxtDialog() 1508 - {; 1509 - } 1510 - void CreateControls(); 1511 - wxString & GetCharset() 1512 - { 1513 - return Charset; 1514 - } 1515 - void OnOk(wxCommandEvent & event); 1516 -}; 1517 - 1518 -class NetworkDialog:public wxDialog 1519 -{ 1520 -// 1521 -// a dialog preparing a BUILD NETWORK 1522 -// 1523 -private: 1524 - MyFrame * MainFrame; 1525 - wxString TableName; // the table name 1526 - wxString FromColumn; // the NodeFrom column name 1527 - wxString ToColumn; // the NodeTo column name 1528 - wxString GeomColumn; // the Geometry column name 1529 - bool GeomLength; // Cost is Geometry Length 1530 - wxString CostColumn; // the Cost column name 1531 - bool Bidirectional; // Bidirectional arcs 1532 - bool OneWays; // OneWays columns supported 1533 - wxString OneWayToFrom; // the OneWay To-From column 1534 - wxString OneWayFromTo; // the OneWay From-To column 1535 -public: 1536 - NetworkDialog() 1537 - {; 1538 - } 1539 - NetworkDialog(MyFrame * parent); 1540 - bool Create(MyFrame * parent); 1541 - virtual ~ NetworkDialog() 1542 - {; 1543 - } 1544 - void CreateControls(); 1545 - wxString & GetTableName() 1546 - { 1547 - return TableName; 1548 - } 1549 - wxString & GetFromColumn() 1550 - { 1551 - return FromColumn; 1552 - } 1553 - wxString & GetToColumn() 1554 - { 1555 - return ToColumn; 1556 - } 1557 - wxString & GetGeomColumn() 1558 - { 1559 - return GeomColumn; 1560 - } 1561 - bool IsGeomLength() 1562 - { 1563 - return GeomLength; 1564 - } 1565 - wxString & GetCostColumn() 1566 - { 1567 - return CostColumn; 1568 - } 1569 - bool IsBidirectional() 1570 - { 1571 - return Bidirectional; 1572 - } 1573 - bool IsOneWays() 1574 - { 1575 - return OneWays; 1576 - } 1577 - wxString & GetOneWayFromTo() 1578 - { 1579 - return OneWayFromTo; 1580 - } 1581 - wxString & GetOneWayToFrom() 1582 - { 1583 - return OneWayToFrom; 1584 - } 1585 - void OnTable(wxCommandEvent & event); 1586 - void OnDirection(wxCommandEvent & event); 1587 - void OnCost(wxCommandEvent & event); 1588 - void OnOneWay(wxCommandEvent & event); 1589 - void OnOk(wxCommandEvent & event); 1590 -}; 1591 - 1592 -class ExifDialog:public wxDialog 1593 -{ 1594 -// 1595 -// a dialog preparing an IMPORT EXIF PHOTOS 1596 -// 1597 -private: 1598 - MyFrame * MainFrame; 1599 - wxString ImgPath; // the file name 1600 - wxString DirPath; // the folder path 1601 - bool Folder; // import a whole folder 1602 - bool Metadata; // feed Metadata tables 1603 - bool GpsOnly; // import only if GpsExif present 1604 -public: 1605 - ExifDialog() 1606 - {; 1607 - } 1608 - ExifDialog(MyFrame * parent, wxString & dir_path, wxString & img_path); 1609 - bool Create(MyFrame * parent, wxString & dir_path, wxString & img_path); 1610 - virtual ~ ExifDialog() 1611 - {; 1612 - } 1613 - void CreateControls(); 1614 - wxString & GetImgPath() 1615 - { 1616 - return ImgPath; 1617 - } 1618 - wxString & GetDirPath() 1619 - { 1620 - return DirPath; 1621 - } 1622 - bool IsFolder() 1623 - { 1624 - return Folder; 1625 - } 1626 - bool IsMetadata() 1627 - { 1628 - return Metadata; 1629 - } 1630 - bool IsGpsOnly() 1631 - { 1632 - return GpsOnly; 1633 - } 1634 - void OnFolder(wxCommandEvent & event); 1635 - void OnMetadata(wxCommandEvent & event); 1636 - void OnGpsOnly(wxCommandEvent & event); 1637 - void OnOk(wxCommandEvent & event); 936 + private: 937 + MyFrame * MainFrame; 938 + wxString Path; // the SHP base path 939 + wxString Default; // the default charset 940 + wxString Charset; // the target charset 941 + public: 942 + DumpTxtDialog () { ; } 943 + DumpTxtDialog (MyFrame * parent, wxString & path, wxString & target, 944 + wxString & defCs); 945 + bool Create (MyFrame * parent, wxString & path, wxString & target, 946 + wxString & defCs); 947 + virtual ~ DumpTxtDialog () { ; } 948 + void CreateControls (); 949 + wxString & GetCharset () { return Charset; } 950 + void OnOk (wxCommandEvent & event); 1638 951 }; 1639 952 1640 953 class SqlScriptDialog:public wxDialog 1641 954 { 1642 955 // 1643 956 // a dialog preparing an SQL SCRIPT execute 1644 957 // 1645 -private: 1646 - MyFrame * MainFrame; 1647 - wxString Path; // the SHP base path 1648 - wxString Default; // the default charset 1649 - wxString Charset; // the target charset 1650 -public: 1651 - SqlScriptDialog() 1652 - {; 1653 - } 1654 - SqlScriptDialog(MyFrame * parent, wxString & path, wxString & defCs); 1655 - bool Create(MyFrame * parent, wxString & path, wxString & defCs); 1656 - virtual ~ SqlScriptDialog() 1657 - {; 1658 - } 1659 - void CreateControls(); 1660 - wxString & GetCharset() 1661 - { 1662 - return Charset; 1663 - } 1664 - void OnOk(wxCommandEvent & event); 958 + private: 959 + MyFrame * MainFrame; 960 + wxString Path; // the SHP base path 961 + wxString Default; // the default charset 962 + wxString Charset; // the target charset 963 + public: 964 + SqlScriptDialog () { ; } 965 + SqlScriptDialog (MyFrame * parent, wxString & path, wxString & defCs); 966 + bool Create (MyFrame * parent, wxString & path, wxString & defCs); 967 + virtual ~ SqlScriptDialog () { ; } 968 + void CreateControls (); 969 + wxString & GetCharset () { return Charset; } 970 + void OnOk (wxCommandEvent & event); 1665 971 }; 1666 972 1667 973 class DefaultCharsetDialog:public wxDialog 1668 974 { 1669 975 // 1670 976 // a dialog for selecting DEFAULT CHARSET 1671 977 // 1672 -private: 1673 - MyFrame * MainFrame; 1674 - wxString Charset; // the default charset 1675 - bool AskCharset; // true / false 1676 -public: 1677 - DefaultCharsetDialog() 1678 - {; 1679 - } 1680 - DefaultCharsetDialog(MyFrame * parent, wxString & charset, bool ask); 1681 - bool Create(MyFrame * parent, wxString & charset, bool ask); 1682 - virtual ~ DefaultCharsetDialog() 1683 - {; 1684 - } 1685 - void CreateControls(); 1686 - wxString & GetCharset() 1687 - { 1688 - return Charset; 1689 - } 1690 - bool IsSetAskCharset() 1691 - { 1692 - return AskCharset; 1693 - } 1694 - void OnOk(wxCommandEvent & event); 978 + private: 979 + MyFrame * MainFrame; 980 + wxString Charset; // the default charset 981 + bool AskCharset; // true / false 982 + public: 983 + DefaultCharsetDialog () { ; } 984 + DefaultCharsetDialog (MyFrame * parent, wxString & charset, bool ask); 985 + bool Create (MyFrame * parent, wxString & charset, bool ask); 986 + virtual ~ DefaultCharsetDialog () { ; } 987 + void CreateControls (); 988 + wxString & GetCharset () { return Charset; } 989 + bool IsSetAskCharset () { return AskCharset; } 990 + void OnOk (wxCommandEvent & event); 1695 991 }; 992 + 1696 993 1697 994 class BlobExplorerDialog:public wxPropertySheetDialog 1698 995 { 1699 996 // 1700 997 // a dialog to explore a BLOB value 1701 998 // 1702 -private: 1703 - MyFrame * MainFrame; 1704 - int BlobSize; // the BLOB size 1705 - unsigned char *Blob; // the BLOB value 1706 - int BlobType; // the BLOB type 1707 - gaiaGeomCollPtr Geometry; // the geometry [optional] 1708 - wxImage *Image; // the image [optional] 1709 - wxBitmap GeomPreview; // the geometry preview 1710 -public: 1711 - BlobExplorerDialog() 1712 - {; 1713 - } 1714 - BlobExplorerDialog(MyFrame * parent, int blob_size, unsigned char *blob); 1715 - bool Create(MyFrame * parent, int blob_size, unsigned char *blob); 1716 - virtual ~ BlobExplorerDialog() 1717 - { 1718 - if (Geometry) 1719 - gaiaFreeGeomColl(Geometry); 1720 - if (Image) 1721 - delete Image; 1722 - } 1723 - void DrawGeometry(int horz, int vert); 1724 - wxPanel *CreateHexadecimalPage(wxWindow * book); 1725 - wxPanel *CreateGeometryPage(wxWindow * book); 1726 - wxPanel *CreateImagePage(wxWindow * book); 1727 - void UpdateHexadecimalPage(); 1728 - void UpdateGeometryPage(); 1729 - void UpdateImagePage(); 1730 - gaiaGeomCollPtr GetGeometry() 1731 - { 1732 - return Geometry; 1733 - } 1734 - wxImage *GetImage() 1735 - { 1736 - return Image; 1737 - } 1738 - int GetBlobType() 1739 - { 1740 - return BlobType; 1741 - } 1742 - void OnOk(wxCommandEvent & event); 1743 - void OnPageChanged(wxNotebookEvent & event); 999 + private: 1000 + MyFrame * MainFrame; 1001 + int BlobSize; // the BLOB size 1002 + unsigned char *Blob; // the BLOB value 1003 + int BlobType; // the BLOB type 1004 + gaiaGeomCollPtr Geometry; // the geometry [optional] 1005 + wxImage *Image; // the image [optional] 1006 + wxBitmap GeomPreview; // the geometry preview 1007 + public: 1008 + BlobExplorerDialog () 1009 + {; 1010 + } 1011 + BlobExplorerDialog (MyFrame * parent, int blob_size, unsigned char *blob); 1012 + bool Create (MyFrame * parent, int blob_size, unsigned char *blob); 1013 + virtual ~ BlobExplorerDialog () { if (Geometry) gaiaFreeGeomColl (Geometry); 1014 + if (Image) delete Image; } 1015 + void DrawGeometry (int horz, int vert); 1016 + wxPanel *CreateHexadecimalPage (wxWindow * book); 1017 + wxPanel *CreateGeometryPage (wxWindow * book); 1018 + wxPanel *CreateImagePage (wxWindow * book); 1019 + void UpdateHexadecimalPage (); 1020 + void UpdateGeometryPage (); 1021 + void UpdateImagePage (); 1022 + gaiaGeomCollPtr GetGeometry () { return Geometry; } 1023 + wxImage *GetImage () { return Image; } 1024 + int GetBlobType () { return BlobType; } 1025 + void OnOk (wxCommandEvent & event); 1026 + void OnPageChanged (wxNotebookEvent & event); 1744 1027 }; 1745 1028 1746 1029 class GraphicsGeometry:public wxStaticBitmap 1747 1030 { 1748 1031 // 1749 1032 // a window to show some Geometry in a graphical fashion 1750 1033 // 1751 -private: 1752 - BlobExplorerDialog * Parent; 1753 -public: 1754 - GraphicsGeometry(BlobExplorerDialog * parent, wxWindow * panel, wxWindowID id, 1755 - const wxBitmap & bmp, wxSize const &size); 1756 - virtual ~ GraphicsGeometry() 1757 - {; 1758 - } 1034 + private: 1035 + BlobExplorerDialog * Parent; 1036 + public: 1037 + GraphicsGeometry (BlobExplorerDialog * parent, wxWindow * panel, 1038 + wxWindowID id, const wxBitmap & bmp, wxSize const &size); 1039 + virtual ~ GraphicsGeometry () { ; } 1759 1040 }; 1760 1041 1761 1042 class ImageShow:public wxStaticBitmap 1762 1043 { 1763 1044 // 1764 1045 // a window to show some Image [Jpeg-Png-Gif] 1765 1046 // 1766 -private: 1767 - BlobExplorerDialog * Parent; 1768 -public: 1769 - ImageShow(BlobExplorerDialog * parent, wxWindow * panel, wxWindowID id, 1770 - const wxBitmap & bmp, const wxSize & size); 1771 - virtual ~ ImageShow() 1772 - {; 1773 - } 1774 - void OnRightClick(wxMouseEvent & event); 1775 - void OnCmdCopy(wxCommandEvent & event); 1047 + private: 1048 + BlobExplorerDialog * Parent; 1049 + public: 1050 + ImageShow (BlobExplorerDialog * parent, wxWindow * panel, wxWindowID id, 1051 + const wxBitmap & bmp, const wxSize & size); 1052 + virtual ~ ImageShow () { ; } 1053 + void OnRightClick (wxMouseEvent & event); 1054 + void OnCmdCopy (wxCommandEvent & event); 1776 1055 }; 1777 1056 1778 1057 class MyHexList:public wxListCtrl 1779 1058 { 1780 1059 // 1781 1060 // a class for Hexdecimal dumps 1782 1061 // 1783 -private: 1784 - BlobExplorerDialog * Parent; 1785 - int BlobSize; // the BLOB size 1786 - unsigned char *Blob; // the BLOB value 1787 -public: 1788 - MyHexList(BlobExplorerDialog * parent, unsigned char *blob, 1789 - int blob_size, wxWindow * panel, wxWindowID id, 1790 - const wxPoint & pos = wxDefaultPosition, const wxSize & size = 1791 - wxDefaultSize, long style = 0); 1792 - virtual ~ MyHexList(); 1793 - virtual wxString OnGetItemText(long item, long column) const; 1794 -}; 1795 - 1796 -class NetNodePre 1797 -{ 1798 -// 1799 -// a class to store a temporary node for Network 1800 -// 1801 -private: 1802 - int Id; 1803 - wxString Code; 1804 - NetNodePre *Next; 1805 -public: 1806 - NetNodePre(int id); 1807 - NetNodePre(const char *code); 1808 - ~NetNodePre() 1809 - {; 1810 - } 1811 - int GetId() 1812 - { 1813 - return Id; 1814 - } 1815 - wxString & GetCode() 1816 - { 1817 - return Code; 1818 - } 1819 - void SetNext(NetNodePre * next) 1820 - { 1821 - Next = next; 1822 - } 1823 - NetNodePre *GetNext() 1824 - { 1825 - return Next; 1826 - } 1827 -}; 1828 - 1829 -class NetNode 1830 -{ 1831 -// 1832 -// a class to store a final node for Network 1833 -// 1834 -private: 1835 - int InternalIndex; 1836 - int Id; 1837 - wxString Code; 1838 - double X; 1839 - double Y; 1840 - class NetArcRef *First; 1841 - class NetArcRef *Last; 1842 - NetNode *Next; 1843 -public: 1844 - NetNode(int id); 1845 - NetNode(wxString & code); 1846 - ~NetNode(); 1847 - int GetInternalIndex() 1848 - { 1849 - return InternalIndex; 1850 - } 1851 - void SetInternalIndex(int idx) 1852 - { 1853 - InternalIndex = idx; 1854 - } 1855 - int GetId() 1856 - { 1857 - return Id; 1858 - } 1859 - wxString & GetCode() 1860 - { 1861 - return Code; 1862 - } 1863 - double GetX() 1864 - { 1865 - return X; 1866 - } 1867 - void SetX(double x) 1868 - { 1869 - X = x; 1870 - } 1871 - double GetY() 1872 - { 1873 - return Y; 1874 - } 1875 - void SetY(double y) 1876 - { 1877 - Y = y; 1878 - } 1879 - void AddOutcoming(class NetArc * pA); 1880 - NetArcRef *GetFirst() 1881 - { 1882 - return First; 1883 - } 1884 - NetArc **PrepareOutcomings(int *count); 1885 - void SetNext(NetNode * next) 1886 - { 1887 - Next = next; 1888 - } 1889 - NetNode *GetNext() 1890 - { 1891 - return Next; 1892 - } 1893 -}; 1894 - 1895 -class NetArc 1896 -{ 1897 -// 1898 -// a class to store an arc for Network 1899 -// 1900 -private: 1901 - int RowId; 1902 - NetNode *From; 1903 - NetNode *To; 1904 - double Cost; 1905 - NetArc *Next; 1906 -public: 1907 - NetArc(int rowid, NetNode * from, NetNode * to, double cost); 1908 - ~NetArc() 1909 - {; 1910 - } 1911 - int GetRowId() 1912 - { 1913 - return RowId; 1914 - } 1915 - NetNode *GetFrom() 1916 - { 1917 - return From; 1918 - } 1919 - NetNode *GetTo() 1920 - { 1921 - return To; 1922 - } 1923 - double GetCost() 1924 - { 1925 - return Cost; 1926 - } 1927 - void SetNext(NetArc * next) 1928 - { 1929 - Next = next; 1930 - } 1931 - NetArc *GetNext() 1932 - { 1933 - return Next; 1934 - } 1935 -}; 1936 - 1937 -class NetArcRef 1938 -{ 1939 -// 1940 -// a class to store a reference to an arc for Network 1941 -// 1942 -private: 1943 - NetArc * Reference; 1944 - NetArcRef *Next; 1945 -public: 1946 - NetArcRef(NetArc * arc) 1947 - { 1948 - Reference = arc; 1949 - Next = NULL; 1950 - } 1951 - ~NetArcRef() 1952 - {; 1953 - } 1954 - NetArc *GetReference() 1955 - { 1956 - return Reference; 1957 - } 1958 - void SetNext(NetArcRef * next) 1959 - { 1960 - Next = next; 1961 - } 1962 - NetArcRef *GetNext() 1963 - { 1964 - return Next; 1965 - } 1966 -}; 1967 - 1968 -class Network 1969 -{ 1970 -// 1971 -// a class representing a Network 1972 -// 1973 -private: 1974 - NetNodePre * FirstPre; 1975 - NetNodePre *LastPre; 1976 - int NumPreNodes; 1977 - NetNodePre **SortedPreNodes; 1978 - NetArc *FirstArc; 1979 - NetArc *LastArc; 1980 - NetNode *FirstNode; 1981 - NetNode *LastNode; 1982 - int NumNodes; 1983 - NetNode **SortedNodes; 1984 - bool Error; 1985 - bool NodeCode; 1986 - int MaxCodeLength; 1987 -public: 1988 - Network(); 1989 - ~Network(); 1990 - void CleanPreNodes(); 1991 - void InsertNode(int id); 1992 - void InsertNode(const char *code); 1993 - void AddNode(int id); 1994 - void AddNode(wxString & code); 1995 - NetNode *ProcessNode(int id, double x, double y, NetNode ** pOther); 1996 - NetNode *ProcessNode(wxString & code, double x, double y, NetNode ** pOther); 1997 - void Sort(); 1998 - NetNode *Find(int id); 1999 - NetNode *Find(wxString & code); 2000 - NetNode *GetSortedNode(int x); 2001 - void AddArc(int rowid, int id_from, int id_to, double node_from_x, 2002 - double node_from_y, double node_to_x, double node_to_y, 2003 - double cost); 2004 - void AddArc(int rowid, const char *code_from, const char *code_to, 2005 - double node_from_x, double node_from_y, double node_to_x, 2006 - double node_to_y, double cost); 2007 - void InitNodes(); 2008 - void SetError() 2009 - { 2010 - Error = true; 2011 - } 2012 - bool IsError() 2013 - { 2014 - return Error; 2015 - } 2016 - void SetNodeCode(bool mode) 2017 - { 2018 - NodeCode = mode; 2019 - } 2020 - bool IsNodeCode() 2021 - { 2022 - return NodeCode; 2023 - } 2024 - int GetNumNodes() 2025 - { 2026 - return NumNodes; 2027 - } 2028 - int GetMaxCodeLength() 2029 - { 2030 - return MaxCodeLength; 2031 - } 2032 -}; 2033 - 2034 -class AutoFDOTable 2035 -{ 2036 -private: 2037 - char *Name; 2038 - AutoFDOTable *Next; 2039 -public: 2040 - AutoFDOTable(const char *name, const int len) 2041 - { 2042 - Name = new char[len]; 2043 - strcpy(Name, name); 2044 - Next = NULL; 2045 - } 2046 - ~AutoFDOTable() 2047 - { 2048 - if (Name) 2049 - delete[]Name; 2050 - } 2051 - char *GetName() 2052 - { 2053 - return Name; 2054 - } 2055 - void SetNext(AutoFDOTable * next) 2056 - { 2057 - Next = next; 2058 - } 2059 - AutoFDOTable *GetNext() 2060 - { 2061 - return Next; 2062 - } 2063 -}; 2064 - 2065 -class AutoFDOTables 2066 -{ 2067 -private: 2068 - AutoFDOTable * First; 2069 - AutoFDOTable *Last; 2070 -public: 2071 - AutoFDOTables() 2072 - { 2073 - First = NULL; 2074 - Last = NULL; 2075 - } 2076 - ~AutoFDOTables(); 2077 - void Add(const char *name, const int len); 2078 - AutoFDOTable *GetFirst() 2079 - { 2080 - return First; 2081 - } 2082 -}; 2083 - 2084 -class AutoSaveDialog:public wxDialog 2085 -{ 2086 -// 2087 -// a dialog to manage AutoSave 2088 -// 2089 -private: 2090 - MyFrame * MainFrame; 2091 - wxString Path; // the path to save 2092 - int Seconds; // interval 2093 - wxRadioBox *IntervalCtrl; 2094 - wxTextCtrl *PathCtrl; 2095 -public: 2096 - AutoSaveDialog() 2097 - {; 2098 - } 2099 - AutoSaveDialog(MyFrame * parent, wxString & path, int secs); 2100 - bool Create(MyFrame * parent, wxString & path, int secs); 2101 - virtual ~ AutoSaveDialog() 2102 - {; 2103 - } 2104 - void CreateControls(); 2105 - int GetSeconds() 2106 - { 2107 - return Seconds; 2108 - } 2109 - void OnOk(wxCommandEvent & event); 2110 - wxString & GetPath() 2111 - { 2112 - return Path; 2113 - } 2114 - void OnIntervalChanged(wxCommandEvent & event); 2115 - void OnChangePath(wxCommandEvent & event); 1062 + private: 1063 + BlobExplorerDialog * Parent; 1064 + int BlobSize; // the BLOB size 1065 + unsigned char *Blob; // the BLOB value 1066 + public: 1067 + MyHexList (BlobExplorerDialog * parent, unsigned char *blob, 1068 + int blob_size, wxWindow * panel, wxWindowID id, 1069 + const wxPoint & pos = wxDefaultPosition, const wxSize & size = 1070 + wxDefaultSize, long style = 0); 1071 + virtual ~ MyHexList (); 1072 + virtual wxString OnGetItemText (long item, long column) const; 2116 1073 };
Changes to Dialogs.cpp.
1 1 /* 2 2 / Dialogs.cpp 3 3 / various dialog classes 4 4 / 5 -/ version 1.2, 2008 October 9 5 +/ version 1.1, 2008 September 13 6 6 / 7 7 / Author: Sandro Furieri a-furieri@lqt.it 8 8 / 9 9 / Copyright (C) 2008 Alessandro Furieri 10 10 / 11 11 / This program is free software: you can redistribute it and/or modify 12 12 / it under the terms of the GNU General Public License as published by ................................................................................ 25 25 26 26 #include "Classdef.h" 27 27 28 28 #include "wx/spinctrl.h" 29 29 #include "wx/listctrl.h" 30 30 #include "wx/html/htmlwin.h" 31 31 32 -bool VirtualShpDialog::Create(MyFrame * parent, wxString & path, 33 - wxString & table, wxString & defCs) 32 +bool 33 +VirtualShpDialog::Create (MyFrame * parent, wxString & path, wxString & table, 34 + wxString & defCs) 34 35 { 35 36 // 36 37 // creating the dialog 37 38 // 38 - MainFrame = parent; 39 - Path = path; 40 - Table = table; 41 - Default = defCs; 42 - if (wxDialog::Create(parent, wxID_ANY, wxT("Creating Virtual Shapefile")) == 43 - false) 44 - return false; 39 + MainFrame = parent; 40 + Path = path; 41 + Table = table; 42 + Default = defCs; 43 + if (wxDialog::Create (parent, wxID_ANY, wxT ("Creating Virtual Shapefile")) 44 + == false) 45 + return false; 45 46 // populates individual controls 46 - CreateControls(); 47 + CreateControls (); 47 48 // sets dialog sizer 48 - GetSizer()->Fit(this); 49 - GetSizer()->SetSizeHints(this); 49 + GetSizer ()->Fit (this); 50 + GetSizer ()->SetSizeHints (this); 50 51 // centers the dialog window 51 - Centre(); 52 - return true; 52 + Centre (); 53 + return true; 53 54 } 54 55 55 -void VirtualShpDialog::CreateControls() 56 +void 57 +VirtualShpDialog::CreateControls () 56 58 { 57 59 // 58 60 // creating individual control and setting initial values 59 61 // 60 - wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); 61 - this->SetSizer(topSizer); 62 - wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL); 63 - topSizer->Add(boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 62 + wxBoxSizer *topSizer = new wxBoxSizer (wxVERTICAL); 63 + this->SetSizer (topSizer); 64 + wxBoxSizer *boxSizer = new wxBoxSizer (wxVERTICAL); 65 + topSizer->Add (boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 64 66 // first row: the Shapefile path 65 - wxBoxSizer *pathSizer = new wxBoxSizer(wxHORIZONTAL); 66 - boxSizer->Add(pathSizer, 0, wxALIGN_RIGHT | wxALL, 0); 67 - wxStaticText *pathLabel = new wxStaticText(this, wxID_STATIC, wxT("&Path:")); 68 - pathSizer->Add(pathLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 69 - wxTextCtrl *pathValue = new wxTextCtrl(this, wxID_STATIC, 70 - Path, wxDefaultPosition, 71 - wxSize(350, 22), wxTE_READONLY); 72 - pathSizer->Add(pathValue, 0, wxALIGN_RIGHT | wxALL, 5); 67 + wxBoxSizer *pathSizer = new wxBoxSizer (wxHORIZONTAL); 68 + boxSizer->Add (pathSizer, 0, wxALIGN_RIGHT | wxALL, 0); 69 + wxStaticText *pathLabel = 70 + new wxStaticText (this, wxID_STATIC, wxT ("&Path:")); 71 + pathSizer->Add (pathLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 72 + wxTextCtrl *pathValue = new wxTextCtrl (this, wxID_STATIC, 73 + Path, wxDefaultPosition, 74 + wxSize (350, 22), wxTE_READONLY); 75 + pathSizer->Add (pathValue, 0, wxALIGN_RIGHT | wxALL, 5); 73 76 // second row: TABLE name 74 - wxBoxSizer *tableSizer = new wxBoxSizer(wxHORIZONTAL); 75 - boxSizer->Add(tableSizer, 0, wxALIGN_RIGHT | wxALL, 0); 76 - wxStaticText *tableLabel = 77 - new wxStaticText(this, wxID_STATIC, wxT("&Table name:")); 78 - tableSizer->Add(tableLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 79 - wxTextCtrl *tableCtrl = new wxTextCtrl(this, ID_VIRTSHP_TABLE, Table, 80 - wxDefaultPosition, wxSize(350, 81 - 22)); 82 - tableSizer->Add(tableCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 77 + wxBoxSizer *tableSizer = new wxBoxSizer (wxHORIZONTAL); 78 + boxSizer->Add (tableSizer, 0, wxALIGN_RIGHT | wxALL, 0); 79 + wxStaticText *tableLabel = 80 + new wxStaticText (this, wxID_STATIC, wxT ("&Table name:")); 81 + tableSizer->Add (tableLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 82 + wxTextCtrl *tableCtrl = new wxTextCtrl (this, ID_VIRTSHP_TABLE, Table, 83 + wxDefaultPosition, wxSize (350, 84 + 22)); 85 + tableSizer->Add (tableCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 83 86 // second row: SRID 84 - wxBoxSizer *sridSizer = new wxBoxSizer(wxHORIZONTAL); 85 - boxSizer->Add(sridSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 86 - wxStaticText *sridLabel = new wxStaticText(this, wxID_STATIC, wxT("&SRID:")); 87 - sridSizer->Add(sridLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 88 - wxSpinCtrl *sridCtrl = new wxSpinCtrl(this, ID_VIRTSHP_SRID, wxEmptyString, 89 - wxDefaultPosition, wxSize(80, 20), 90 - wxSP_ARROW_KEYS, 91 - -1, 40000, -1); 92 - sridSizer->Add(sridCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 87 + wxBoxSizer *sridSizer = new wxBoxSizer (wxHORIZONTAL); 88 + boxSizer->Add (sridSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 89 + wxStaticText *sridLabel = 90 + new wxStaticText (this, wxID_STATIC, wxT ("&SRID:")); 91 + sridSizer->Add (sridLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 92 + wxSpinCtrl *sridCtrl = new wxSpinCtrl (this, ID_VIRTSHP_SRID, wxEmptyString, 93 + wxDefaultPosition, wxSize (80, 20), 94 + wxSP_ARROW_KEYS, 95 + -1, 40000, -1); 96 + sridSizer->Add (sridCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 93 97 // third row: CHARSET 94 - wxStaticBox *charsetBox = new wxStaticBox(this, wxID_STATIC, 95 - wxT("Charset Encoding"), 96 - wxDefaultPosition, 97 - wxDefaultSize); 98 - wxBoxSizer *charsetSizer = new wxStaticBoxSizer(charsetBox, wxHORIZONTAL); 99 - sridSizer->Add(charsetSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 100 - wxListBox *charsetCtrl = new wxListBox(this, ID_VIRTSHP_CHARSET, 101 - wxDefaultPosition, wxDefaultSize, 102 - MainFrame->GetCharsetsLen(), 103 - MainFrame->GetCharsetsNames(), 104 - wxLB_SINGLE); 105 - charsetCtrl-> 106 - SetFont(wxFont 107 - (8, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL)); 108 - int idSel = MainFrame->GetCharsetIndex(Default); 109 - if (idSel != wxNOT_FOUND) 110 - charsetCtrl->SetSelection(idSel); 111 - charsetSizer->Add(charsetCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 98 + wxStaticBox *charsetBox = new wxStaticBox (this, wxID_STATIC, 99 + wxT ("Charset Encoding"), 100 + wxDefaultPosition, 101 + wxDefaultSize); 102 + wxBoxSizer *charsetSizer = new wxStaticBoxSizer (charsetBox, wxHORIZONTAL); 103 + sridSizer->Add (charsetSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 104 + wxListBox *charsetCtrl = new wxListBox (this, ID_VIRTSHP_CHARSET, 105 + wxDefaultPosition, wxDefaultSize, 106 + MainFrame->GetCharsetsLen (), 107 + MainFrame->GetCharsetsNames (), 108 + wxLB_SINGLE); 109 + charsetCtrl->SetFont (wxFont 110 + (8, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, 111 + wxFONTWEIGHT_NORMAL)); 112 + int idSel = MainFrame->GetCharsetIndex (Default); 113 + if (idSel != wxNOT_FOUND) 114 + charsetCtrl->SetSelection (idSel); 115 + charsetSizer->Add (charsetCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 112 116 // OK - CANCEL buttons 113 - wxBoxSizer *okCancelBox = new wxBoxSizer(wxHORIZONTAL); 114 - boxSizer->Add(okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 115 - wxButton *ok = new wxButton(this, wxID_OK, wxT("&OK")); 116 - okCancelBox->Add(ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 117 - wxButton *cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel")); 118 - okCancelBox->Add(cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 117 + wxBoxSizer *okCancelBox = new wxBoxSizer (wxHORIZONTAL); 118 + boxSizer->Add (okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 119 + wxButton *ok = new wxButton (this, wxID_OK, wxT ("&OK")); 120 + okCancelBox->Add (ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 121 + wxButton *cancel = new wxButton (this, wxID_CANCEL, wxT ("&Cancel")); 122 + okCancelBox->Add (cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 119 123 // appends event handler for OK button 120 - Connect(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 121 - (wxObjectEventFunction) & VirtualShpDialog::OnOk); 124 + Connect (wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 125 + (wxObjectEventFunction) & VirtualShpDialog::OnOk); 122 126 } 123 127 124 -void VirtualShpDialog::OnOk(wxCommandEvent & event) 128 +void 129 +VirtualShpDialog::OnOk (wxCommandEvent & event) 125 130 { 126 131 // 127 132 // all done: 128 133 // 129 - wxTextCtrl *tableCtrl = (wxTextCtrl *) FindWindow(ID_VIRTSHP_TABLE); 130 - Table = tableCtrl->GetValue(); 131 - if (Table.Len() < 1) 132 - { 133 - wxMessageBox(wxT("You must specify the TABLE NAME !!!"), 134 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 135 - return; 136 - } 137 - if (MainFrame->TableAlreadyExists(Table) == true) 138 - { 139 - wxMessageBox(wxT("a table name '") + Table + wxT("' already exists"), 140 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 141 - return; 142 - } 143 - wxSpinCtrl *sridCtrl = (wxSpinCtrl *) FindWindow(ID_VIRTSHP_SRID); 144 - Srid = sridCtrl->GetValue(); 145 - if (Srid == -1) 146 - ; 147 - else if (MainFrame->SridNotExists(Srid) == true) 148 - { 149 - wxMessageBox(wxT("invalid SRID value"), wxT("spatialite-gui"), 150 - wxOK | wxICON_WARNING, this); 151 - return; 152 - } 153 - wxListBox *charsetCtrl = (wxListBox *) FindWindow(ID_VIRTSHP_CHARSET); 154 - int idSel = charsetCtrl->GetSelection(); 155 - if (idSel == wxNOT_FOUND) 156 - { 157 - wxMessageBox(wxT("you must select some Charset Encoding from the list"), 158 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 159 - return; 160 - } 161 - wxString *charsets = MainFrame->GetCharsets(); 162 - Charset = *(charsets + idSel); 163 - wxDialog::EndModal(wxID_OK); 164 -} 165 - 166 -bool VirtualTxtDialog::Create(MyFrame * parent, wxString & path, 167 - wxString & table, wxString & defCs) 168 -{ 169 -// 170 -// creating the dialog 171 -// 172 - MainFrame = parent; 173 - Path = path; 174 - Table = table; 175 - Default = defCs; 176 - if (wxDialog::Create(parent, wxID_ANY, wxT("Creating Virtual CSV/TXT")) == 177 - false) 178 - return false; 134 + wxTextCtrl *tableCtrl = (wxTextCtrl *) FindWindow (ID_VIRTSHP_TABLE); 135 + Table = tableCtrl->GetValue (); 136 + if (Table.Len () < 1) 137 + { 138 + wxMessageBox (wxT ("You must specify the TABLE NAME !!!"), 139 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 140 + return; 141 + } 142 + if (MainFrame->TableAlreadyExists (Table) == true) 143 + { 144 + wxMessageBox (wxT ("a table name '") + Table + 145 + wxT ("' already exists"), wxT ("spatialite-gui"), 146 + wxOK | wxICON_WARNING, this); 147 + return; 148 + } 149 + if (gaiaIllegalSqlName (Table.ToUTF8 ()) == 1 150 + || gaiaIsReservedSqlName (Table.ToUTF8 ()) == 1 151 + || gaiaIsReservedSqliteName (Table.ToUTF8 ()) == 1) 152 + { 153 + wxMessageBox (wxT ("'") + Table + 154 + wxT 155 + ("' is an invalid TABLE NAME\n\nillegal name or reserved keyword"), 156 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 157 + return; 158 + } 159 + wxSpinCtrl *sridCtrl = (wxSpinCtrl *) FindWindow (ID_VIRTSHP_SRID); 160 + Srid = sridCtrl->GetValue (); 161 + if (Srid == -1) 162 + ; 163 + else if (MainFrame->SridNotExists (Srid) == true) 164 + { 165 + wxMessageBox (wxT ("invalid SRID value"), 166 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 167 + return; 168 + } 169 + wxListBox *charsetCtrl = (wxListBox *) FindWindow (ID_VIRTSHP_CHARSET); 170 + int idSel = charsetCtrl->GetSelection (); 171 + if (idSel == wxNOT_FOUND) 172 + { 173 + wxMessageBox (wxT 174 + ("you must select some Charset Encoding from the list"), 175 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 176 + return; 177 + } 178 + wxString *charsets = MainFrame->GetCharsets (); 179 + Charset = *(charsets + idSel); 180 + wxDialog::EndModal (wxID_OK); 181 +} 182 + 183 +bool 184 +VirtualTxtDialog::Create (MyFrame * parent, wxString & path, wxString & table, 185 + wxString & defCs) 186 +{ 187 +// 188 +// creating the dialog 189 +// 190 + MainFrame = parent; 191 + Path = path; 192 + Table = table; 193 + Default = defCs; 194 + if (wxDialog::Create (parent, wxID_ANY, wxT ("Creating Virtual CSV/TXT")) 195 + == false) 196 + return false; 179 197 // populates individual controls 180 - CreateControls(); 198 + CreateControls (); 181 199 // sets dialog sizer 182 - GetSizer()->Fit(this); 183 - GetSizer()->SetSizeHints(this); 184 -// centers the dialog window 185 - Centre(); 186 - return true; 187 -} 188 - 189 -void VirtualTxtDialog::CreateControls() 190 -{ 191 -// 192 -// creating individual control and setting initial values 193 -// 194 - FirstLineTitles = true; 195 - Separator = '\t'; 196 - TextSeparator = '"'; 197 - DecimalPointIsComma = false; 198 - wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); 199 - this->SetSizer(topSizer); 200 - wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL); 201 - topSizer->Add(boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 200 + GetSizer ()->Fit (this); 201 + GetSizer ()->SetSizeHints (this); 202 +// centers the dialog window 203 + Centre (); 204 + return true; 205 +} 206 + 207 +void 208 +VirtualTxtDialog::CreateControls () 209 +{ 210 +// 211 +// creating individual control and setting initial values 212 +// 213 + FirstLineTitles = true; 214 + Separator = '\t'; 215 + TextSeparator = '"'; 216 + DecimalPointIsComma = false; 217 + wxBoxSizer *topSizer = new wxBoxSizer (wxVERTICAL); 218 + this->SetSizer (topSizer); 219 + wxBoxSizer *boxSizer = new wxBoxSizer (wxVERTICAL); 220 + topSizer->Add (boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 202 221 // first row: the CSV/TXT path 203 - wxBoxSizer *pathSizer = new wxBoxSizer(wxHORIZONTAL); 204 - boxSizer->Add(pathSizer, 0, wxALIGN_RIGHT | wxALL, 0); 205 - wxStaticText *pathLabel = new wxStaticText(this, wxID_STATIC, wxT("&Path:")); 206 - pathSizer->Add(pathLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 207 - wxTextCtrl *pathValue = new wxTextCtrl(this, wxID_STATIC, 208 - Path, wxDefaultPosition, 209 - wxSize(350, 22), wxTE_READONLY); 210 - pathSizer->Add(pathValue, 0, wxALIGN_RIGHT | wxALL, 5); 222 + wxBoxSizer *pathSizer = new wxBoxSizer (wxHORIZONTAL); 223 + boxSizer->Add (pathSizer, 0, wxALIGN_RIGHT | wxALL, 0); 224 + wxStaticText *pathLabel = 225 + new wxStaticText (this, wxID_STATIC, wxT ("&Path:")); 226 + pathSizer->Add (pathLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 227 + wxTextCtrl *pathValue = new wxTextCtrl (this, wxID_STATIC, 228 + Path, wxDefaultPosition, 229 + wxSize (350, 22), wxTE_READONLY); 230 + pathSizer->Add (pathValue, 0, wxALIGN_RIGHT | wxALL, 5); 211 231 // second row: TABLE name 212 - wxBoxSizer *tableSizer = new wxBoxSizer(wxHORIZONTAL); 213 - boxSizer->Add(tableSizer, 0, wxALIGN_RIGHT | wxALL, 0); 214 - wxStaticText *tableLabel = 215 - new wxStaticText(this, wxID_STATIC, wxT("&Table name:")); 216 - tableSizer->Add(tableLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 217 - wxTextCtrl *tableCtrl = new wxTextCtrl(this, ID_VIRTTXT_TABLE, Table, 218 - wxDefaultPosition, wxSize(350, 219 - 22)); 220 - tableSizer->Add(tableCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 232 + wxBoxSizer *tableSizer = new wxBoxSizer (wxHORIZONTAL); 233 + boxSizer->Add (tableSizer, 0, wxALIGN_RIGHT | wxALL, 0); 234 + wxStaticText *tableLabel = 235 + new wxStaticText (this, wxID_STATIC, wxT ("&Table name:")); 236 + tableSizer->Add (tableLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 237 + wxTextCtrl *tableCtrl = new wxTextCtrl (this, ID_VIRTTXT_TABLE, Table, 238 + wxDefaultPosition, wxSize (350, 239 + 22)); 240 + tableSizer->Add (tableCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 221 241 // second row: OPTIONS 222 - wxBoxSizer *optSizer = new wxBoxSizer(wxHORIZONTAL); 223 - boxSizer->Add(optSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 224 - wxBoxSizer *modeSizer = new wxBoxSizer(wxVERTICAL); 225 - optSizer->Add(modeSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 226 - wxBoxSizer *mode1Sizer = new wxBoxSizer(wxHORIZONTAL); 227 - modeSizer->Add(mode1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 228 - wxCheckBox *titleCtrl = new wxCheckBox(this, ID_VIRTTXT_TITLES, 229 - wxT 230 - ("First line contains column names"), 231 - wxDefaultPosition, wxDefaultSize); 232 - titleCtrl->SetValue(true); 233 - mode1Sizer->Add(titleCtrl, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 234 - wxStaticBox *sepBox = new wxStaticBox(this, wxID_STATIC, 235 - wxT("Separators"), 236 - wxDefaultPosition, wxDefaultSize); 237 - wxBoxSizer *sepSizer = new wxStaticBoxSizer(sepBox, wxVERTICAL); 238 - modeSizer->Add(sepSizer, 0, wxALIGN_LEFT | wxALL, 0); 239 - wxBoxSizer *mode2Sizer = new wxBoxSizer(wxHORIZONTAL); 240 - sepSizer->Add(mode2Sizer, 0, wxALIGN_LEFT | wxALL, 0); 241 - wxString quotes[2]; 242 - quotes[0] = wxT("&Double \""); 243 - quotes[1] = wxT("&Single '"); 244 - wxRadioBox *textSeparatorBox = new wxRadioBox(this, ID_VIRTTXT_QUOTE, 245 - wxT("&Text separator: quotes"), 246 - wxDefaultPosition, 247 - wxDefaultSize, 2, 248 - quotes, 2, 249 - wxRA_SPECIFY_COLS); 250 - mode2Sizer->Add(textSeparatorBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 251 - wxBoxSizer *mode3Sizer = new wxBoxSizer(wxHORIZONTAL); 252 - sepSizer->Add(mode3Sizer, 0, wxALIGN_LEFT | wxALL, 0); 253 - wxString separators[6]; 254 - separators[0] = wxT("&Tab"); 255 - separators[1] = wxT("&Space"); 256 - separators[2] = wxT("Co&mma ,"); 257 - separators[3] = wxT("&Colon :"); 258 - separators[4] = wxT("S&emicolon ;"); 259 - separators[5] = wxT("&Other"); 260 - wxRadioBox *separatorBox = new wxRadioBox(this, ID_VIRTTXT_SEPARATOR, 261 - wxT("&Column separator"), 262 - wxDefaultPosition, wxDefaultSize, 263 - 6, 264 - separators, 2, 265 - wxRA_SPECIFY_COLS); 266 - mode3Sizer->Add(separatorBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 267 - wxBoxSizer *mode4Sizer = new wxBoxSizer(wxHORIZONTAL); 268 - sepSizer->Add(mode4Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 269 - wxStaticText *charSeparatorLabel = new wxStaticText(this, wxID_STATIC, 270 - wxT("&Custom separator:"), 271 - wxDefaultPosition, 272 - wxDefaultSize, 0); 273 - mode4Sizer->Add(charSeparatorLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 274 - wxTextCtrl *dummy = 275 - new wxTextCtrl(this, ID_VIRTTXT_CHARSEPARATOR, wxT("Dummy Text pq"), 276 - wxDefaultPosition, 277 - wxDefaultSize, 0); 278 - wxSize sz = dummy->GetSize(); 279 - delete dummy; 280 - sz.SetWidth(40); 281 - wxTextCtrl *charSeparatorCtrl = 282 - new wxTextCtrl(this, ID_VIRTTXT_CHARSEPARATOR, wxT("TAB"), 283 - wxDefaultPosition, sz, 0); 284 - charSeparatorCtrl->SetMaxLength(1); 285 - charSeparatorCtrl->Enable(false); 286 - mode4Sizer->Add(charSeparatorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 287 - wxBoxSizer *mode5Sizer = new wxBoxSizer(wxHORIZONTAL); 288 - sepSizer->Add(mode5Sizer, 0, wxALIGN_LEFT | wxALL, 0); 289 - wxString points[2]; 290 - points[0] = wxT("&Point ."); 291 - points[1] = wxT("&Comma ,"); 292 - wxRadioBox *decimalSeparatorBox = new wxRadioBox(this, ID_VIRTTXT_POINT, 293 - wxT("&Decimal separator"), 294 - wxDefaultPosition, 295 - wxDefaultSize, 2, 296 - points, 2, 297 - wxRA_SPECIFY_COLS); 298 - mode5Sizer->Add(decimalSeparatorBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 242 + wxBoxSizer *optSizer = new wxBoxSizer (wxHORIZONTAL); 243 + boxSizer->Add (optSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 244 + wxBoxSizer *modeSizer = new wxBoxSizer (wxVERTICAL); 245 + optSizer->Add (modeSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 246 + wxBoxSizer *mode1Sizer = new wxBoxSizer (wxHORIZONTAL); 247 + modeSizer->Add (mode1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 248 + wxCheckBox *titleCtrl = new wxCheckBox (this, ID_VIRTTXT_TITLES, 249 + wxT 250 + ("First line contains column names"), 251 + wxDefaultPosition, wxDefaultSize); 252 + titleCtrl->SetValue (true); 253 + mode1Sizer->Add (titleCtrl, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 254 + wxStaticBox *sepBox = new wxStaticBox (this, wxID_STATIC, 255 + wxT ("Separators"), 256 + wxDefaultPosition, wxDefaultSize); 257 + wxBoxSizer *sepSizer = new wxStaticBoxSizer (sepBox, wxVERTICAL); 258 + modeSizer->Add (sepSizer, 0, wxALIGN_LEFT | wxALL, 0); 259 + wxBoxSizer *mode2Sizer = new wxBoxSizer (wxHORIZONTAL); 260 + sepSizer->Add (mode2Sizer, 0, wxALIGN_LEFT | wxALL, 0); 261 + wxString quotes[2]; 262 + quotes[0] = wxT ("&Double \""); 263 + quotes[1] = wxT ("&Single '"); 264 + wxRadioBox *textSeparatorBox = new wxRadioBox (this, ID_VIRTTXT_QUOTE, 265 + wxT 266 + ("&Text separator: quotes"), 267 + wxDefaultPosition, 268 + wxDefaultSize, 2, 269 + quotes, 2, 270 + wxRA_SPECIFY_COLS); 271 + mode2Sizer->Add (textSeparatorBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 272 + wxBoxSizer *mode3Sizer = new wxBoxSizer (wxHORIZONTAL); 273 + sepSizer->Add (mode3Sizer, 0, wxALIGN_LEFT | wxALL, 0); 274 + wxString separators[6]; 275 + separators[0] = wxT ("&Tab"); 276 + separators[1] = wxT ("&Space"); 277 + separators[2] = wxT ("Co&mma ,"); 278 + separators[3] = wxT ("&Colon :"); 279 + separators[4] = wxT ("S&emicolon ;"); 280 + separators[5] = wxT ("&Other"); 281 + wxRadioBox *separatorBox = new wxRadioBox (this, ID_VIRTTXT_SEPARATOR, 282 + wxT ("&Column separator"), 283 + wxDefaultPosition, wxDefaultSize, 284 + 6, 285 + separators, 2, 286 + wxRA_SPECIFY_COLS); 287 + mode3Sizer->Add (separatorBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 288 + wxBoxSizer *mode4Sizer = new wxBoxSizer (wxHORIZONTAL); 289 + sepSizer->Add (mode4Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 290 + wxStaticText *charSeparatorLabel = new wxStaticText (this, wxID_STATIC, 291 + wxT 292 + ("&Custom separator:"), 293 + wxDefaultPosition, 294 + wxDefaultSize, 0); 295 + mode4Sizer->Add (charSeparatorLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 296 + wxTextCtrl *dummy = 297 + new wxTextCtrl (this, ID_VIRTTXT_CHARSEPARATOR, wxT ("Dummy Text pq"), 298 + wxDefaultPosition, 299 + wxDefaultSize, 0); 300 + wxSize sz = dummy->GetSize (); 301 + delete dummy; 302 + sz.SetWidth (40); 303 + wxTextCtrl *charSeparatorCtrl = 304 + new wxTextCtrl (this, ID_VIRTTXT_CHARSEPARATOR, wxT ("TAB"), 305 + wxDefaultPosition, sz, 0); 306 + charSeparatorCtrl->SetMaxLength (1); 307 + charSeparatorCtrl->Enable (false); 308 + mode4Sizer->Add (charSeparatorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 309 + wxBoxSizer *mode5Sizer = new wxBoxSizer (wxHORIZONTAL); 310 + sepSizer->Add (mode5Sizer, 0, wxALIGN_LEFT | wxALL, 0); 311 + wxString points[2]; 312 + points[0] = wxT ("&Point ."); 313 + points[1] = wxT ("&Comma ,"); 314 + wxRadioBox *decimalSeparatorBox = new wxRadioBox (this, ID_VIRTTXT_POINT, 315 + wxT 316 + ("&Decimal separator"), 317 + wxDefaultPosition, 318 + wxDefaultSize, 2, 319 + points, 2, 320 + wxRA_SPECIFY_COLS); 321 + mode5Sizer->Add (decimalSeparatorBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 322 + 5); 299 323 // third row: CHARSET 300 - wxStaticBox *charsetBox = new wxStaticBox(this, wxID_STATIC, 301 - wxT("Charset Encoding"), 302 - wxDefaultPosition, 303 - wxDefaultSize); 304 - wxBoxSizer *charsetSizer = new wxStaticBoxSizer(charsetBox, wxHORIZONTAL); 305 - optSizer->Add(charsetSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 306 - wxListBox *charsetCtrl = new wxListBox(this, ID_VIRTTXT_CHARSET, 307 - wxDefaultPosition, wxDefaultSize, 308 - MainFrame->GetCharsetsLen(), 309 - MainFrame->GetCharsetsNames(), 310 - wxLB_SINGLE); 311 - charsetCtrl-> 312 - SetFont(wxFont 313 - (8, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL)); 314 - int idSel = MainFrame->GetCharsetIndex(Default); 315 - if (idSel != wxNOT_FOUND) 316 - charsetCtrl->SetSelection(idSel); 317 - charsetSizer->Add(charsetCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 324 + wxStaticBox *charsetBox = new wxStaticBox (this, wxID_STATIC, 325 + wxT ("Charset Encoding"), 326 + wxDefaultPosition, 327 + wxDefaultSize); 328 + wxBoxSizer *charsetSizer = new wxStaticBoxSizer (charsetBox, wxHORIZONTAL); 329 + optSizer->Add (charsetSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 330 + wxListBox *charsetCtrl = new wxListBox (this, ID_VIRTTXT_CHARSET, 331 + wxDefaultPosition, wxDefaultSize, 332 + MainFrame->GetCharsetsLen (), 333 + MainFrame->GetCharsetsNames (), 334 + wxLB_SINGLE); 335 + charsetCtrl->SetFont (wxFont 336 + (8, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, 337 + wxFONTWEIGHT_NORMAL)); 338 + int idSel = MainFrame->GetCharsetIndex (Default); 339 + if (idSel != wxNOT_FOUND) 340 + charsetCtrl->SetSelection (idSel); 341 + charsetSizer->Add (charsetCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 318 342 // OK - CANCEL buttons 319 - wxBoxSizer *okCancelBox = new wxBoxSizer(wxHORIZONTAL); 320 - boxSizer->Add(okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 321 - wxButton *ok = new wxButton(this, wxID_OK, wxT("&OK")); 322 - okCancelBox->Add(ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 323 - wxButton *cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel")); 324 - okCancelBox->Add(cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 343 + wxBoxSizer *okCancelBox = new wxBoxSizer (wxHORIZONTAL); 344 + boxSizer->Add (okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 345 + wxButton *ok = new wxButton (this, wxID_OK, wxT ("&OK")); 346 + okCancelBox->Add (ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 347 + wxButton *cancel = new wxButton (this, wxID_CANCEL, wxT ("&Cancel")); 348 + okCancelBox->Add (cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 325 349 // appends event handler for OK button 326 - Connect(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 327 - (wxObjectEventFunction) & VirtualTxtDialog::OnOk); 350 + Connect (wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 351 + (wxObjectEventFunction) & VirtualTxtDialog::OnOk); 328 352 // appends event handler for radioboxes 329 - Connect(ID_VIRTTXT_QUOTE, wxEVT_COMMAND_RADIOBOX_SELECTED, 330 - (wxObjectEventFunction) & VirtualTxtDialog::OnQuote); 331 - Connect(ID_VIRTTXT_SEPARATOR, wxEVT_COMMAND_RADIOBOX_SELECTED, 332 - (wxObjectEventFunction) & VirtualTxtDialog::OnSeparator); 333 - Connect(ID_VIRTTXT_POINT, wxEVT_COMMAND_RADIOBOX_SELECTED, 334 - (wxObjectEventFunction) & VirtualTxtDialog::OnDecimalSeparator); 353 + Connect (ID_VIRTTXT_QUOTE, wxEVT_COMMAND_RADIOBOX_SELECTED, 354 + (wxObjectEventFunction) & VirtualTxtDialog::OnQuote); 355 + Connect (ID_VIRTTXT_SEPARATOR, wxEVT_COMMAND_RADIOBOX_SELECTED, 356 + (wxObjectEventFunction) & VirtualTxtDialog::OnSeparator); 357 + Connect (ID_VIRTTXT_POINT, wxEVT_COMMAND_RADIOBOX_SELECTED, 358 + (wxObjectEventFunction) & VirtualTxtDialog::OnDecimalSeparator); 335 359 } 336 360 337 -void VirtualTxtDialog::OnDecimalSeparator(wxCommandEvent & event) 361 +void 362 +VirtualTxtDialog::OnDecimalSeparator (wxCommandEvent & event) 338 363 { 339 364 // 340 365 // POINT selection changed 341 366 // 342 - wxRadioBox *decimalSeparatorCtrl = 343 - (wxRadioBox *) FindWindow(ID_VIRTTXT_POINT); 344 - switch (decimalSeparatorCtrl->GetSelection()) 345 - { 367 + wxRadioBox *decimalSeparatorCtrl = 368 + (wxRadioBox *) FindWindow (ID_VIRTTXT_POINT); 369 + switch (decimalSeparatorCtrl->GetSelection ()) 370 + { 346 371 case 0: 347 - DecimalPointIsComma = false; 348 - break; 372 + DecimalPointIsComma = false; 373 + break; 349 374 case 1: 350 - DecimalPointIsComma = true; 351 - break; 352 - }; 375 + DecimalPointIsComma = true; 376 + break; 377 + }; 353 378 } 354 379 355 -void VirtualTxtDialog::OnQuote(wxCommandEvent & event) 380 +void 381 +VirtualTxtDialog::OnQuote (wxCommandEvent & event) 356 382 { 357 383 // 358 384 // QUOTE selection changed 359 385 // 360 - wxRadioBox *separatorCtrl = (wxRadioBox *) FindWindow(ID_VIRTTXT_QUOTE); 361 - switch (separatorCtrl->GetSelection()) 362 - { 386 + wxRadioBox *separatorCtrl = (wxRadioBox *) FindWindow (ID_VIRTTXT_QUOTE); 387 + switch (separatorCtrl->GetSelection ()) 388 + { 363 389 case 0: 364 - TextSeparator = '"'; 365 - break; 390 + TextSeparator = '"'; 391 + break; 366 392 case 1: 367 - TextSeparator = '\''; 368 - break; 369 - }; 393 + TextSeparator = '\''; 394 + break; 395 + }; 370 396 } 371 397 372 -void VirtualTxtDialog::OnSeparator(wxCommandEvent & event) 398 +void 399 +VirtualTxtDialog::OnSeparator (wxCommandEvent & event) 373 400 { 374 401 // 375 402 // SEPARATOR selection changed 376 403 // 377 - wxTextCtrl *charSeparatorCtrl = 378 - (wxTextCtrl *) FindWindow(ID_VIRTTXT_CHARSEPARATOR); 379 - wxRadioBox *separatorCtrl = (wxRadioBox *) FindWindow(ID_VIRTTXT_SEPARATOR); 380 - switch (separatorCtrl->GetSelection()) 381 - { 404 + wxTextCtrl *charSeparatorCtrl = 405 + (wxTextCtrl *) FindWindow (ID_VIRTTXT_CHARSEPARATOR); 406 + wxRadioBox *separatorCtrl = 407 + (wxRadioBox *) FindWindow (ID_VIRTTXT_SEPARATOR); 408 + switch (separatorCtrl->GetSelection ()) 409 + { 382 410 case 0: 383 - Separator = '\t'; 384 - charSeparatorCtrl->SetValue(wxT("TAB")); 385 - break; 411 + Separator = '\t'; 412 + charSeparatorCtrl->SetValue (wxT ("TAB")); 413 + break; 386 414 case 1: 387 - Separator = ' '; 388 - charSeparatorCtrl->SetValue(wxT("SP")); 389 - break; 415 + Separator = ' '; 416 + charSeparatorCtrl->SetValue (wxT ("SP")); 417 + break; 390 418 case 2: 391 - Separator = ','; 392 - charSeparatorCtrl->SetValue(wxT(",")); 393 - break; 419 + Separator = ','; 420 + charSeparatorCtrl->SetValue (wxT (",")); 421 + break; 394 422 case 3: 395 - Separator = ':'; 396 - charSeparatorCtrl->SetValue(wxT(":")); 397 - break; 423 + Separator = ':'; 424 + charSeparatorCtrl->SetValue (wxT (":")); 425 + break; 398 426 case 4: 399 - Separator = ';'; 400 - charSeparatorCtrl->SetValue(wxT(";")); 401 - break; 427 + Separator = ';'; 428 + charSeparatorCtrl->SetValue (wxT (";")); 429 + break; 402 430 case 5: 403 - Separator = '|'; 404 - charSeparatorCtrl->SetValue(wxT("|")); 405 - break; 406 - }; 407 - if (separatorCtrl->GetSelection() == 5) 408 - charSeparatorCtrl->Enable(true); 409 - else 410 - charSeparatorCtrl->Enable(false); 431 + Separator = '|'; 432 + charSeparatorCtrl->SetValue (wxT ("|")); 433 + break; 434 + }; 435 + if (separatorCtrl->GetSelection () == 5) 436 + charSeparatorCtrl->Enable (true); 437 + else 438 + charSeparatorCtrl->Enable (false); 411 439 } 412 440 413 -void VirtualTxtDialog::OnOk(wxCommandEvent & event) 441 +void 442 +VirtualTxtDialog::OnOk (wxCommandEvent & event) 414 443 { 415 444 // 416 445 // all done: 417 446 // 418 - wxTextCtrl *tableCtrl = (wxTextCtrl *) FindWindow(ID_VIRTTXT_TABLE); 419 - Table = tableCtrl->GetValue(); 420 - if (Table.Len() < 1) 421 - { 422 - wxMessageBox(wxT("You must specify the TABLE NAME !!!"), 423 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 424 - return; 425 - } 426 - if (MainFrame->TableAlreadyExists(Table) == true) 427 - { 428 - wxMessageBox(wxT("a table name '") + Table + wxT("' already exists"), 429 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 430 - return; 431 - } 432 - wxListBox *charsetCtrl = (wxListBox *) FindWindow(ID_VIRTTXT_CHARSET); 433 - int idSel = charsetCtrl->GetSelection(); 434 - if (idSel == wxNOT_FOUND) 435 - { 436 - wxMessageBox(wxT("you must select some Charset Encoding from the list"), 437 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 438 - return; 439 - } 440 - wxString *charsets = MainFrame->GetCharsets(); 441 - Charset = *(charsets + idSel); 442 - wxRadioBox *separatorCtrl = (wxRadioBox *) FindWindow(ID_VIRTTXT_SEPARATOR); 443 - if (separatorCtrl->GetSelection() == 5) 444 - { 445 - wxTextCtrl *charSeparatorCtrl = 446 - (wxTextCtrl *) FindWindow(ID_VIRTTXT_CHARSEPARATOR); 447 - wxString separator = charSeparatorCtrl->GetValue(); 448 - if (separator.Len() != 1) 449 - { 450 - wxMessageBox(wxT 451 - ("you must specificy a single char as Custom Column Separator"), 452 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 453 - return; 454 - } 455 - char dummy[64]; 456 - strcpy(dummy, separator.ToUTF8()); 457 - Separator = *dummy; 458 - } 459 - wxDialog::EndModal(wxID_OK); 460 -} 461 - 462 -bool LoadTxtDialog::Create(MyFrame * parent, wxString & path, wxString & table, 463 - wxString & defCs) 464 -{ 465 -// 466 -// creating the dialog 467 -// 468 - MainFrame = parent; 469 - Path = path; 470 - Table = table; 471 - Default = defCs; 472 - if (wxDialog::Create(parent, wxID_ANY, wxT("Load CSV/TXT")) == false) 473 - return false; 447 + wxTextCtrl *tableCtrl = (wxTextCtrl *) FindWindow (ID_VIRTTXT_TABLE); 448 + Table = tableCtrl->GetValue (); 449 + if (Table.Len () < 1) 450 + { 451 + wxMessageBox (wxT ("You must specify the TABLE NAME !!!"), 452 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 453 + return; 454 + } 455 + if (MainFrame->TableAlreadyExists (Table) == true) 456 + { 457 + wxMessageBox (wxT ("a table name '") + Table + 458 + wxT ("' already exists"), wxT ("spatialite-gui"), 459 + wxOK | wxICON_WARNING, this); 460 + return; 461 + } 462 + if (gaiaIllegalSqlName (Table.ToUTF8 ()) == 1 463 + || gaiaIsReservedSqlName (Table.ToUTF8 ()) == 1 464 + || gaiaIsReservedSqliteName (Table.ToUTF8 ()) == 1) 465 + { 466 + wxMessageBox (wxT ("'") + Table + 467 + wxT 468 + ("' is an invalid TABLE NAME\n\nillegal name or reserved keyword"), 469 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 470 + return; 471 + } 472 + wxListBox *charsetCtrl = (wxListBox *) FindWindow (ID_VIRTTXT_CHARSET); 473 + int idSel = charsetCtrl->GetSelection (); 474 + if (idSel == wxNOT_FOUND) 475 + { 476 + wxMessageBox (wxT 477 + ("you must select some Charset Encoding from the list"), 478 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 479 + return; 480 + } 481 + wxString *charsets = MainFrame->GetCharsets (); 482 + Charset = *(charsets + idSel); 483 + wxRadioBox *separatorCtrl = 484 + (wxRadioBox *) FindWindow (ID_VIRTTXT_SEPARATOR); 485 + if (separatorCtrl->GetSelection () == 5) 486 + { 487 + wxTextCtrl *charSeparatorCtrl = 488 + (wxTextCtrl *) FindWindow (ID_VIRTTXT_CHARSEPARATOR); 489 + wxString separator = charSeparatorCtrl->GetValue (); 490 + if (separator.Len () != 1) 491 + { 492 + wxMessageBox (wxT 493 + ("you must specificy a single char as Custom Column Separator"), 494 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, 495 + this); 496 + return; 497 + } 498 + char dummy[64]; 499 + strcpy (dummy, separator.ToUTF8 ()); 500 + Separator = *dummy; 501 + } 502 + wxDialog::EndModal (wxID_OK); 503 +} 504 + 505 +bool 506 +LoadTxtDialog::Create (MyFrame * parent, wxString & path, wxString & table, 507 + wxString & defCs) 508 +{ 509 +// 510 +// creating the dialog 511 +// 512 + MainFrame = parent; 513 + Path = path; 514 + Table = table; 515 + Default = defCs; 516 + if (wxDialog::Create (parent, wxID_ANY, wxT ("Load CSV/TXT")) == false) 517 + return false; 474 518 // populates individual controls 475 - CreateControls(); 519 + CreateControls (); 476 520 // sets dialog sizer 477 - GetSizer()->Fit(this); 478 - GetSizer()->SetSizeHints(this); 479 -// centers the dialog window 480 - Centre(); 481 - return true; 482 -} 483 - 484 -void LoadTxtDialog::CreateControls() 485 -{ 486 -// 487 -// creating individual control and setting initial values 488 -// 489 - FirstLineTitles = true; 490 - Separator = '\t'; 491 - TextSeparator = '"'; 492 - DecimalPointIsComma = false; 493 - wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); 494 - this->SetSizer(topSizer); 495 - wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL); 496 - topSizer->Add(boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 521 + GetSizer ()->Fit (this); 522 + GetSizer ()->SetSizeHints (this); 523 +// centers the dialog window 524 + Centre (); 525 + return true; 526 +} 527 + 528 +void 529 +LoadTxtDialog::CreateControls () 530 +{ 531 +// 532 +// creating individual control and setting initial values 533 +// 534 + FirstLineTitles = true; 535 + Separator = '\t'; 536 + TextSeparator = '"'; 537 + DecimalPointIsComma = false; 538 + wxBoxSizer *topSizer = new wxBoxSizer (wxVERTICAL); 539 + this->SetSizer (topSizer); 540 + wxBoxSizer *boxSizer = new wxBoxSizer (wxVERTICAL); 541 + topSizer->Add (boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 497 542 // first row: the CSV/TXT path 498 - wxBoxSizer *pathSizer = new wxBoxSizer(wxHORIZONTAL); 499 - boxSizer->Add(pathSizer, 0, wxALIGN_RIGHT | wxALL, 0); 500 - wxStaticText *pathLabel = new wxStaticText(this, wxID_STATIC, wxT("&Path:")); 501 - pathSizer->Add(pathLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 502 - wxTextCtrl *pathValue = new wxTextCtrl(this, wxID_STATIC, 503 - Path, wxDefaultPosition, 504 - wxSize(350, 22), wxTE_READONLY); 505 - pathSizer->Add(pathValue, 0, wxALIGN_RIGHT | wxALL, 5); 543 + wxBoxSizer *pathSizer = new wxBoxSizer (wxHORIZONTAL); 544 + boxSizer->Add (pathSizer, 0, wxALIGN_RIGHT | wxALL, 0); 545 + wxStaticText *pathLabel = 546 + new wxStaticText (this, wxID_STATIC, wxT ("&Path:")); 547 + pathSizer->Add (pathLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 548 + wxTextCtrl *pathValue = new wxTextCtrl (this, wxID_STATIC, 549 + Path, wxDefaultPosition, 550 + wxSize (350, 22), wxTE_READONLY); 551 + pathSizer->Add (pathValue, 0, wxALIGN_RIGHT | wxALL, 5); 506 552 // second row: TABLE name 507 - wxBoxSizer *tableSizer = new wxBoxSizer(wxHORIZONTAL); 508 - boxSizer->Add(tableSizer, 0, wxALIGN_RIGHT | wxALL, 0); 509 - wxStaticText *tableLabel = 510 - new wxStaticText(this, wxID_STATIC, wxT("&Table name:")); 511 - tableSizer->Add(tableLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 512 - wxTextCtrl *tableCtrl = new wxTextCtrl(this, ID_LDTXT_TABLE, Table, 513 - wxDefaultPosition, wxSize(350, 514 - 22)); 515 - tableSizer->Add(tableCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 553 + wxBoxSizer *tableSizer = new wxBoxSizer (wxHORIZONTAL); 554 + boxSizer->Add (tableSizer, 0, wxALIGN_RIGHT | wxALL, 0); 555 + wxStaticText *tableLabel = 556 + new wxStaticText (this, wxID_STATIC, wxT ("&Table name:")); 557 + tableSizer->Add (tableLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 558 + wxTextCtrl *tableCtrl = new wxTextCtrl (this, ID_LDTXT_TABLE, Table, 559 + wxDefaultPosition, wxSize (350, 560 + 22)); 561 + tableSizer->Add (tableCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 516 562 // second row: OPTIONS 517 - wxBoxSizer *optSizer = new wxBoxSizer(wxHORIZONTAL); 518 - boxSizer->Add(optSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 519 - wxBoxSizer *modeSizer = new wxBoxSizer(wxVERTICAL); 520 - optSizer->Add(modeSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 521 - wxBoxSizer *mode1Sizer = new wxBoxSizer(wxHORIZONTAL); 522 - modeSizer->Add(mode1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 523 - wxCheckBox *titleCtrl = new wxCheckBox(this, ID_LDTXT_TITLES, 524 - wxT 525 - ("First line contains column names"), 526 - wxDefaultPosition, wxDefaultSize); 527 - titleCtrl->SetValue(true); 528 - mode1Sizer->Add(titleCtrl, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 529 - wxStaticBox *sepBox = new wxStaticBox(this, wxID_STATIC, 530 - wxT("Separators"), 531 - wxDefaultPosition, wxDefaultSize); 532 - wxBoxSizer *sepSizer = new wxStaticBoxSizer(sepBox, wxVERTICAL); 533 - modeSizer->Add(sepSizer, 0, wxALIGN_LEFT | wxALL, 0); 534 - wxBoxSizer *mode2Sizer = new wxBoxSizer(wxHORIZONTAL); 535 - sepSizer->Add(mode2Sizer, 0, wxALIGN_LEFT | wxALL, 0); 536 - wxString quotes[2]; 537 - quotes[0] = wxT("&Double \""); 538 - quotes[1] = wxT("&Single '"); 539 - wxRadioBox *textSeparatorBox = new wxRadioBox(this, ID_LDTXT_QUOTE, 540 - wxT("&Text separator: quotes"), 541 - wxDefaultPosition, 542 - wxDefaultSize, 2, 543 - quotes, 2, 544 - wxRA_SPECIFY_COLS); 545 - mode2Sizer->Add(textSeparatorBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 546 - wxBoxSizer *mode3Sizer = new wxBoxSizer(wxHORIZONTAL); 547 - sepSizer->Add(mode3Sizer, 0, wxALIGN_LEFT | wxALL, 0); 548 - wxString separators[6]; 549 - separators[0] = wxT("&Tab"); 550 - separators[1] = wxT("&Space"); 551 - separators[2] = wxT("Co&mma ,"); 552 - separators[3] = wxT("&Colon :"); 553 - separators[4] = wxT("S&emicolon ;"); 554 - separators[5] = wxT("&Other"); 555 - wxRadioBox *separatorBox = new wxRadioBox(this, ID_LDTXT_SEPARATOR, 556 - wxT("&Column separator"), 557 - wxDefaultPosition, wxDefaultSize, 558 - 6, 559 - separators, 2, 560 - wxRA_SPECIFY_COLS); 561 - mode3Sizer->Add(separatorBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 562 - wxBoxSizer *mode4Sizer = new wxBoxSizer(wxHORIZONTAL); 563 - sepSizer->Add(mode4Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 564 - wxStaticText *charSeparatorLabel = new wxStaticText(this, wxID_STATIC, 565 - wxT("&Custom separator:"), 566 - wxDefaultPosition, 567 - wxDefaultSize, 0); 568 - mode4Sizer->Add(charSeparatorLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 569 - wxTextCtrl *dummy = 570 - new wxTextCtrl(this, ID_LDTXT_CHARSEPARATOR, wxT("Dummy Text pq"), 571 - wxDefaultPosition, 572 - wxDefaultSize, 0); 573 - wxSize sz = dummy->GetSize(); 574 - delete dummy; 575 - sz.SetWidth(40); 576 - wxTextCtrl *charSeparatorCtrl = 577 - new wxTextCtrl(this, ID_LDTXT_CHARSEPARATOR, wxT("TAB"), 578 - wxDefaultPosition, sz, 0); 579 - charSeparatorCtrl->SetMaxLength(1); 580 - charSeparatorCtrl->Enable(false); 581 - mode4Sizer->Add(charSeparatorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 582 - wxBoxSizer *mode5Sizer = new wxBoxSizer(wxHORIZONTAL); 583 - sepSizer->Add(mode5Sizer, 0, wxALIGN_LEFT | wxALL, 0); 584 - wxString points[2]; 585 - points[0] = wxT("&Point ."); 586 - points[1] = wxT("&Comma ,"); 587 - wxRadioBox *decimalSeparatorBox = new wxRadioBox(this, ID_LDTXT_POINT, 588 - wxT("&Decimal separator"), 589 - wxDefaultPosition, 590 - wxDefaultSize, 2, 591 - points, 2, 592 - wxRA_SPECIFY_COLS); 593 - mode5Sizer->Add(decimalSeparatorBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 563 + wxBoxSizer *optSizer = new wxBoxSizer (wxHORIZONTAL); 564 + boxSizer->Add (optSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 565 + wxBoxSizer *modeSizer = new wxBoxSizer (wxVERTICAL); 566 + optSizer->Add (modeSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 567 + wxBoxSizer *mode1Sizer = new wxBoxSizer (wxHORIZONTAL); 568 + modeSizer->Add (mode1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 569 + wxCheckBox *titleCtrl = new wxCheckBox (this, ID_LDTXT_TITLES, 570 + wxT 571 + ("First line contains column names"), 572 + wxDefaultPosition, wxDefaultSize); 573 + titleCtrl->SetValue (true); 574 + mode1Sizer->Add (titleCtrl, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 575 + wxStaticBox *sepBox = new wxStaticBox (this, wxID_STATIC, 576 + wxT ("Separators"), 577 + wxDefaultPosition, wxDefaultSize); 578 + wxBoxSizer *sepSizer = new wxStaticBoxSizer (sepBox, wxVERTICAL); 579 + modeSizer->Add (sepSizer, 0, wxALIGN_LEFT | wxALL, 0); 580 + wxBoxSizer *mode2Sizer = new wxBoxSizer (wxHORIZONTAL); 581 + sepSizer->Add (mode2Sizer, 0, wxALIGN_LEFT | wxALL, 0); 582 + wxString quotes[2]; 583 + quotes[0] = wxT ("&Double \""); 584 + quotes[1] = wxT ("&Single '"); 585 + wxRadioBox *textSeparatorBox = new wxRadioBox (this, ID_LDTXT_QUOTE, 586 + wxT 587 + ("&Text separator: quotes"), 588 + wxDefaultPosition, 589 + wxDefaultSize, 2, 590 + quotes, 2, 591 + wxRA_SPECIFY_COLS); 592 + mode2Sizer->Add (textSeparatorBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 593 + wxBoxSizer *mode3Sizer = new wxBoxSizer (wxHORIZONTAL); 594 + sepSizer->Add (mode3Sizer, 0, wxALIGN_LEFT | wxALL, 0); 595 + wxString separators[6]; 596 + separators[0] = wxT ("&Tab"); 597 + separators[1] = wxT ("&Space"); 598 + separators[2] = wxT ("Co&mma ,"); 599 + separators[3] = wxT ("&Colon :"); 600 + separators[4] = wxT ("S&emicolon ;"); 601 + separators[5] = wxT ("&Other"); 602 + wxRadioBox *separatorBox = new wxRadioBox (this, ID_LDTXT_SEPARATOR, 603 + wxT ("&Column separator"), 604 + wxDefaultPosition, wxDefaultSize, 605 + 6, 606 + separators, 2, 607 + wxRA_SPECIFY_COLS); 608 + mode3Sizer->Add (separatorBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 609 + wxBoxSizer *mode4Sizer = new wxBoxSizer (wxHORIZONTAL); 610 + sepSizer->Add (mode4Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 611 + wxStaticText *charSeparatorLabel = new wxStaticText (this, wxID_STATIC, 612 + wxT 613 + ("&Custom separator:"), 614 + wxDefaultPosition, 615 + wxDefaultSize, 0); 616 + mode4Sizer->Add (charSeparatorLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 617 + wxTextCtrl *dummy = 618 + new wxTextCtrl (this, ID_LDTXT_CHARSEPARATOR, wxT ("Dummy Text pq"), 619 + wxDefaultPosition, 620 + wxDefaultSize, 0); 621 + wxSize sz = dummy->GetSize (); 622 + delete dummy; 623 + sz.SetWidth (40); 624 + wxTextCtrl *charSeparatorCtrl = 625 + new wxTextCtrl (this, ID_LDTXT_CHARSEPARATOR, wxT ("TAB"), 626 + wxDefaultPosition, sz, 0); 627 + charSeparatorCtrl->SetMaxLength (1); 628 + charSeparatorCtrl->Enable (false); 629 + mode4Sizer->Add (charSeparatorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 630 + wxBoxSizer *mode5Sizer = new wxBoxSizer (wxHORIZONTAL); 631 + sepSizer->Add (mode5Sizer, 0, wxALIGN_LEFT | wxALL, 0); 632 + wxString points[2]; 633 + points[0] = wxT ("&Point ."); 634 + points[1] = wxT ("&Comma ,"); 635 + wxRadioBox *decimalSeparatorBox = new wxRadioBox (this, ID_LDTXT_POINT, 636 + wxT 637 + ("&Decimal separator"), 638 + wxDefaultPosition, 639 + wxDefaultSize, 2, 640 + points, 2, 641 + wxRA_SPECIFY_COLS); 642 + mode5Sizer->Add (decimalSeparatorBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 643 + 5); 594 644 // third row: CHARSET 595 - wxStaticBox *charsetBox = new wxStaticBox(this, wxID_STATIC, 596 - wxT("Charset Encoding"), 597 - wxDefaultPosition, 598 - wxDefaultSize); 599 - wxBoxSizer *charsetSizer = new wxStaticBoxSizer(charsetBox, wxHORIZONTAL); 600 - optSizer->Add(charsetSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 601 - wxListBox *charsetCtrl = new wxListBox(this, ID_LDTXT_CHARSET, 602 - wxDefaultPosition, wxDefaultSize, 603 - MainFrame->GetCharsetsLen(), 604 - MainFrame->GetCharsetsNames(), 605 - wxLB_SINGLE); 606 - charsetCtrl-> 607 - SetFont(wxFont 608 - (8, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL)); 609 - int idSel = MainFrame->GetCharsetIndex(Default); 610 - if (idSel != wxNOT_FOUND) 611 - charsetCtrl->SetSelection(idSel); 612 - charsetSizer->Add(charsetCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 645 + wxStaticBox *charsetBox = new wxStaticBox (this, wxID_STATIC, 646 + wxT ("Charset Encoding"), 647 + wxDefaultPosition, 648 + wxDefaultSize); 649 + wxBoxSizer *charsetSizer = new wxStaticBoxSizer (charsetBox, wxHORIZONTAL); 650 + optSizer->Add (charsetSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 651 + wxListBox *charsetCtrl = new wxListBox (this, ID_LDTXT_CHARSET, 652 + wxDefaultPosition, wxDefaultSize, 653 + MainFrame->GetCharsetsLen (), 654 + MainFrame->GetCharsetsNames (), 655 + wxLB_SINGLE); 656 + charsetCtrl->SetFont (wxFont 657 + (8, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, 658 + wxFONTWEIGHT_NORMAL)); 659 + int idSel = MainFrame->GetCharsetIndex (Default); 660 + if (idSel != wxNOT_FOUND) 661 + charsetCtrl->SetSelection (idSel); 662 + charsetSizer->Add (charsetCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 613 663 // OK - CANCEL buttons 614 - wxBoxSizer *okCancelBox = new wxBoxSizer(wxHORIZONTAL); 615 - boxSizer->Add(okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 616 - wxButton *ok = new wxButton(this, wxID_OK, wxT("&OK")); 617 - okCancelBox->Add(ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 618 - wxButton *cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel")); 619 - okCancelBox->Add(cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 664 + wxBoxSizer *okCancelBox = new wxBoxSizer (wxHORIZONTAL); 665 + boxSizer->Add (okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 666 + wxButton *ok = new wxButton (this, wxID_OK, wxT ("&OK")); 667 + okCancelBox->Add (ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 668 + wxButton *cancel = new wxButton (this, wxID_CANCEL, wxT ("&Cancel")); 669 + okCancelBox->Add (cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 620 670 // appends event handler for OK button 621 - Connect(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 622 - (wxObjectEventFunction) & LoadTxtDialog::OnOk); 671 + Connect (wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 672 + (wxObjectEventFunction) & LoadTxtDialog::OnOk); 623 673 // appends event handler for radioboxes 624 - Connect(ID_LDTXT_QUOTE, wxEVT_COMMAND_RADIOBOX_SELECTED, 625 - (wxObjectEventFunction) & LoadTxtDialog::OnQuote); 626 - Connect(ID_LDTXT_SEPARATOR, wxEVT_COMMAND_RADIOBOX_SELECTED, 627 - (wxObjectEventFunction) & LoadTxtDialog::OnSeparator); 628 - Connect(ID_LDTXT_POINT, wxEVT_COMMAND_RADIOBOX_SELECTED, 629 - (wxObjectEventFunction) & LoadTxtDialog::OnDecimalSeparator); 674 + Connect (ID_LDTXT_QUOTE, wxEVT_COMMAND_RADIOBOX_SELECTED, 675 + (wxObjectEventFunction) & LoadTxtDialog::OnQuote); 676 + Connect (ID_LDTXT_SEPARATOR, wxEVT_COMMAND_RADIOBOX_SELECTED, 677 + (wxObjectEventFunction) & LoadTxtDialog::OnSeparator); 678 + Connect (ID_LDTXT_POINT, wxEVT_COMMAND_RADIOBOX_SELECTED, 679 + (wxObjectEventFunction) & LoadTxtDialog::OnDecimalSeparator); 630 680 } 631 681 632 -void LoadTxtDialog::OnDecimalSeparator(wxCommandEvent & event) 682 +void 683 +LoadTxtDialog::OnDecimalSeparator (wxCommandEvent & event) 633 684 { 634 685 // 635 686 // POINT selection changed 636 687 // 637 - wxRadioBox *decimalSeparatorCtrl = (wxRadioBox *) FindWindow(ID_LDTXT_POINT); 638 - switch (decimalSeparatorCtrl->GetSelection()) 639 - { 688 + wxRadioBox *decimalSeparatorCtrl = 689 + (wxRadioBox *) FindWindow (ID_LDTXT_POINT); 690 + switch (decimalSeparatorCtrl->GetSelection ()) 691 + { 640 692 case 0: 641 - DecimalPointIsComma = false; 642 - break; 693 + DecimalPointIsComma = false; 694 + break; 643 695 case 1: 644 - DecimalPointIsComma = true; 645 - break; 646 - }; 696 + DecimalPointIsComma = true; 697 + break; 698 + }; 647 699 } 648 700 649 -void LoadTxtDialog::OnQuote(wxCommandEvent & event) 701 +void 702 +LoadTxtDialog::OnQuote (wxCommandEvent & event) 650 703 { 651 704 // 652 705 // QUOTE selection changed 653 706 // 654 - wxRadioBox *separatorCtrl = (wxRadioBox *) FindWindow(ID_LDTXT_QUOTE); 655 - switch (separatorCtrl->GetSelection()) 656 - { 707 + wxRadioBox *separatorCtrl = (wxRadioBox *) FindWindow (ID_LDTXT_QUOTE); 708 + switch (separatorCtrl->GetSelection ()) 709 + { 657 710 case 0: 658 - TextSeparator = '"'; 659 - break; 711 + TextSeparator = '"'; 712 + break; 660 713 case 1: 661 - TextSeparator = '\''; 662 - break; 663 - }; 714 + TextSeparator = '\''; 715 + break; 716 + }; 664 717 } 665 718 666 -void LoadTxtDialog::OnSeparator(wxCommandEvent & event) 719 +void 720 +LoadTxtDialog::OnSeparator (wxCommandEvent & event) 667 721 { 668 722 // 669 723 // SEPARATOR selection changed 670 724 // 671 - wxTextCtrl *charSeparatorCtrl = 672 - (wxTextCtrl *) FindWindow(ID_LDTXT_CHARSEPARATOR); 673 - wxRadioBox *separatorCtrl = (wxRadioBox *) FindWindow(ID_LDTXT_SEPARATOR); 674 - switch (separatorCtrl->GetSelection()) 675 - { 725 + wxTextCtrl *charSeparatorCtrl = 726 + (wxTextCtrl *) FindWindow (ID_LDTXT_CHARSEPARATOR); 727 + wxRadioBox *separatorCtrl = (wxRadioBox *) FindWindow (ID_LDTXT_SEPARATOR); 728 + switch (separatorCtrl->GetSelection ()) 729 + { 676 730 case 0: 677 - Separator = '\t'; 678 - charSeparatorCtrl->SetValue(wxT("TAB")); 679 - break; 731 + Separator = '\t'; 732 + charSeparatorCtrl->SetValue (wxT ("TAB")); 733 + break; 680 734 case 1: 681 - Separator = ' '; 682 - charSeparatorCtrl->SetValue(wxT("SP")); 683 - break; 735 + Separator = ' '; 736 + charSeparatorCtrl->SetValue (wxT ("SP")); 737 + break; 684 738 case 2: 685 - Separator = ','; 686 - charSeparatorCtrl->SetValue(wxT(",")); 687 - break; 739 + Separator = ','; 740 + charSeparatorCtrl->SetValue (wxT (",")); 741 + break; 688 742 case 3: 689 - Separator = ':'; 690 - charSeparatorCtrl->SetValue(wxT(":")); 691 - break; 743 + Separator = ':'; 744 + charSeparatorCtrl->SetValue (wxT (":")); 745 + break; 692 746 case 4: 693 - Separator = ';'; 694 - charSeparatorCtrl->SetValue(wxT(";")); 695 - break; 747 + Separator = ';'; 748 + charSeparatorCtrl->SetValue (wxT (";")); 749 + break; 696 750 case 5: 697 - Separator = '|'; 698 - charSeparatorCtrl->SetValue(wxT("|")); 699 - break; 700 - }; 701 - if (separatorCtrl->GetSelection() == 5) 702 - charSeparatorCtrl->Enable(true); 703 - else 704 - charSeparatorCtrl->Enable(false); 705 -} 706 - 707 -void LoadTxtDialog::OnOk(wxCommandEvent & event) 751 + Separator = '|'; 752 + charSeparatorCtrl->SetValue (wxT ("|")); 753 + break; 754 + }; 755 + if (separatorCtrl->GetSelection () == 5) 756 + charSeparatorCtrl->Enable (true); 757 + else 758 + charSeparatorCtrl->Enable (false); 759 +} 760 + 761 +void 762 +LoadTxtDialog::OnOk (wxCommandEvent & event) 763 +{ 764 +// 765 +// all done: 766 +// 767 + wxTextCtrl *tableCtrl = (wxTextCtrl *) FindWindow (ID_LDTXT_TABLE); 768 + Table = tableCtrl->GetValue (); 769 + if (Table.Len () < 1) 770 + { 771 + wxMessageBox (wxT ("You must specify the TABLE NAME !!!"), 772 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 773 + return; 774 + } 775 + if (MainFrame->TableAlreadyExists (Table) == true) 776 + { 777 + wxMessageBox (wxT ("a table name '") + Table + 778 + wxT ("' already exists"), wxT ("spatialite-gui"), 779 + wxOK | wxICON_WARNING, this); 780 + return; 781 + } 782 + if (gaiaIllegalSqlName (Table.ToUTF8 ()) == 1 783 + || gaiaIsReservedSqlName (Table.ToUTF8 ()) == 1 784 + || gaiaIsReservedSqliteName (Table.ToUTF8 ()) == 1) 785 + { 786 + wxMessageBox (wxT ("'") + Table + 787 + wxT 788 + ("' is an invalid TABLE NAME\n\nillegal name or reserved keyword"), 789 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 790 + return; 791 + } 792 + wxListBox *charsetCtrl = (wxListBox *) FindWindow (ID_LDTXT_CHARSET); 793 + int idSel = charsetCtrl->GetSelection (); 794 + if (idSel == wxNOT_FOUND) 795 + { 796 + wxMessageBox (wxT 797 + ("you must select some Charset Encoding from the list"), 798 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 799 + return; 800 + } 801 + wxString *charsets = MainFrame->GetCharsets (); 802 + Charset = *(charsets + idSel); 803 + wxRadioBox *separatorCtrl = (wxRadioBox *) FindWindow (ID_LDTXT_SEPARATOR); 804 + if (separatorCtrl->GetSelection () == 5) 805 + { 806 + wxTextCtrl *charSeparatorCtrl = 807 + (wxTextCtrl *) FindWindow (ID_LDTXT_CHARSEPARATOR); 808 + wxString separator = charSeparatorCtrl->GetValue (); 809 + if (separator.Len () != 1) 810 + { 811 + wxMessageBox (wxT 812 + ("you must specificy a single char as Custom Column Separator"), 813 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, 814 + this); 815 + return; 816 + } 817 + char dummy[64]; 818 + strcpy (dummy, separator.ToUTF8 ()); 819 + Separator = *dummy; 820 + } 821 + wxDialog::EndModal (wxID_OK); 822 +} 823 + 824 +bool 825 +LoadShpDialog::Create (MyFrame * parent, wxString & path, wxString & table, 826 + int srid, wxString & column, wxString & defCs) 827 +{ 828 +// 829 +// creating the dialog 830 +// 831 + MainFrame = parent; 832 + Path = path; 833 + Table = table; 834 + Srid = srid; 835 + Column = column; 836 + Default = defCs; 837 + if (wxDialog::Create (parent, wxID_ANY, wxT ("Load Shapefile")) == false) 838 + return false; 839 +// populates individual controls 840 + CreateControls (); 841 +// sets dialog sizer 842 + GetSizer ()->Fit (this); 843 + GetSizer ()->SetSizeHints (this); 844 +// centers the dialog window 845 + Centre (); 846 + return true; 847 +} 848 + 849 +void 850 +LoadShpDialog::CreateControls () 851 +{ 852 +// 853 +// creating individual control and setting initial values 854 +// 855 + wxBoxSizer *topSizer = new wxBoxSizer (wxVERTICAL); 856 + this->SetSizer (topSizer); 857 + wxBoxSizer *boxSizer = new wxBoxSizer (wxVERTICAL); 858 + topSizer->Add (boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 859 +// first row: the Shapefile path 860 + wxBoxSizer *pathSizer = new wxBoxSizer (wxHORIZONTAL); 861 + boxSizer->Add (pathSizer, 0, wxALIGN_RIGHT | wxALL, 0); 862 + wxStaticText *pathLabel = 863 + new wxStaticText (this, wxID_STATIC, wxT ("&Path:")); 864 + pathSizer->Add (pathLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 865 + wxTextCtrl *pathValue = new wxTextCtrl (this, wxID_STATIC, 866 + Path, wxDefaultPosition, 867 + wxSize (350, 22), wxTE_READONLY); 868 + pathSizer->Add (pathValue, 0, wxALIGN_RIGHT | wxALL, 5); 869 +// second row: TABLE name 870 + wxBoxSizer *tableSizer = new wxBoxSizer (wxHORIZONTAL); 871 + boxSizer->Add (tableSizer, 0, wxALIGN_RIGHT | wxALL, 0); 872 + wxStaticText *tableLabel = 873 + new wxStaticText (this, wxID_STATIC, wxT ("&Table name:")); 874 + tableSizer->Add (tableLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 875 + wxTextCtrl *tableCtrl = new wxTextCtrl (this, ID_LDSHP_TABLE, Table, 876 + wxDefaultPosition, wxSize (350, 877 + 22)); 878 + tableSizer->Add (tableCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 879 +// third row: GEOMETRY COLUMN name 880 + wxBoxSizer *colSizer = new wxBoxSizer (wxHORIZONTAL); 881 + boxSizer->Add (colSizer, 0, wxALIGN_RIGHT | wxALL, 0); 882 + wxStaticText *colLabel = 883 + new wxStaticText (this, wxID_STATIC, wxT ("&GeomColumn name:")); 884 + colSizer->Add (colLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 885 + wxTextCtrl *colCtrl = new wxTextCtrl (this, ID_LDSHP_COLUMN, Column, 886 + wxDefaultPosition, wxSize (350, 22)); 887 + colSizer->Add (colCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 888 +// fourth row: SRID 889 + wxBoxSizer *sridSizer = new wxBoxSizer (wxHORIZONTAL); 890 + boxSizer->Add (sridSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 891 + wxStaticText *sridLabel = 892 + new wxStaticText (this, wxID_STATIC, wxT ("&SRID:")); 893 + sridSizer->Add (sridLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 894 + wxSpinCtrl *sridCtrl = new wxSpinCtrl (this, ID_LDSHP_SRID, wxEmptyString, 895 + wxDefaultPosition, wxSize (80, 20), 896 + wxSP_ARROW_KEYS, 897 + -1, 40000, Srid); 898 + sridSizer->Add (sridCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 899 +// fifth row: CHARSET 900 + wxStaticBox *charsetBox = new wxStaticBox (this, wxID_STATIC, 901 + wxT ("Charset Encoding"), 902 + wxDefaultPosition, 903 + wxDefaultSize); 904 + wxBoxSizer *charsetSizer = new wxStaticBoxSizer (charsetBox, wxHORIZONTAL); 905 + sridSizer->Add (charsetSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 906 + wxListBox *charsetCtrl = new wxListBox (this, ID_LDSHP_CHARSET, 907 + wxDefaultPosition, wxDefaultSize, 908 + MainFrame->GetCharsetsLen (), 909 + MainFrame->GetCharsetsNames (), 910 + wxLB_SINGLE); 911 + charsetCtrl->SetFont (wxFont 912 + (8, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, 913 + wxFONTWEIGHT_NORMAL)); 914 + int idSel = MainFrame->GetCharsetIndex (Default); 915 + if (idSel != wxNOT_FOUND) 916 + charsetCtrl->SetSelection (idSel); 917 + charsetSizer->Add (charsetCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 918 +// OK - CANCEL buttons 919 + wxBoxSizer *okCancelBox = new wxBoxSizer (wxHORIZONTAL); 920 + boxSizer->Add (okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 921 + wxButton *ok = new wxButton (this, wxID_OK, wxT ("&OK")); 922 + okCancelBox->Add (ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 923 + wxButton *cancel = new wxButton (this, wxID_CANCEL, wxT ("&Cancel")); 924 + okCancelBox->Add (cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 925 +// appends event handler for OK button 926 + Connect (wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 927 + (wxObjectEventFunction) & LoadShpDialog::OnOk); 928 +} 929 + 930 +void 931 +LoadShpDialog::OnOk (wxCommandEvent & event) 932 +{ 933 +// 934 +// all done: 935 +// 936 + wxTextCtrl *tableCtrl = (wxTextCtrl *) FindWindow (ID_LDSHP_TABLE); 937 + Table = tableCtrl->GetValue (); 938 + if (Table.Len () < 1) 939 + { 940 + wxMessageBox (wxT ("You must specify the TABLE NAME !!!"), 941 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 942 + return; 943 + } 944 + if (MainFrame->TableAlreadyExists (Table) == true) 945 + { 946 + wxMessageBox (wxT ("a table name '") + Table + 947 + wxT ("' already exists"), wxT ("spatialite-gui"), 948 + wxOK | wxICON_WARNING, this); 949 + return; 950 + } 951 + if (gaiaIllegalSqlName (Table.ToUTF8 ()) == 1 952 + || gaiaIsReservedSqlName (Table.ToUTF8 ()) == 1 953 + || gaiaIsReservedSqliteName (Table.ToUTF8 ()) == 1) 954 + { 955 + wxMessageBox (wxT ("'") + Table + 956 + wxT 957 + ("' is an invalid TABLE NAME\n\nillegal name or reserved keyword"), 958 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 959 + return; 960 + } 961 + wxTextCtrl *columnCtrl = (wxTextCtrl *) FindWindow (ID_LDSHP_COLUMN); 962 + Column = columnCtrl->GetValue (); 963 + if (Column.Len () < 1) 964 + { 965 + wxMessageBox (wxT ("You must specify the GEOMETRY COLUMN NAME !!!"), 966 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 967 + return; 968 + } 969 + if (gaiaIllegalSqlName (Column.ToUTF8 ()) == 1 970 + || gaiaIsReservedSqlName (Column.ToUTF8 ()) == 1 971 + || gaiaIsReservedSqliteName (Column.ToUTF8 ()) == 1) 972 + { 973 + wxMessageBox (wxT ("'") + Column + 974 + wxT 975 + ("' is an invalid COLUMN NAME\n\nsame as SQL reserved keyword"), 976 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 977 + return; 978 + } 979 + wxSpinCtrl *sridCtrl = (wxSpinCtrl *) FindWindow (ID_LDSHP_SRID); 980 + Srid = sridCtrl->GetValue (); 981 + if (MainFrame->SridNotExists (Srid) == true) 982 + { 983 + wxMessageBox (wxT ("invalid SRID value"), 984 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 985 + return; 986 + } 987 + wxListBox *charsetCtrl = (wxListBox *) FindWindow (ID_LDSHP_CHARSET); 988 + int idSel = charsetCtrl->GetSelection (); 989 + if (idSel == wxNOT_FOUND) 990 + { 991 + wxMessageBox (wxT 992 + ("you must select some Charset Encoding from the list"), 993 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 994 + return; 995 + } 996 + wxString *charsets = MainFrame->GetCharsets (); 997 + Charset = *(charsets + idSel); 998 + wxDialog::EndModal (wxID_OK); 999 +} 1000 + 1001 +bool 1002 +DumpShpDialog::Create (MyFrame * parent, wxString & path, wxString & table, 1003 + wxString & column, wxString & defCs) 1004 +{ 1005 +// 1006 +// creating the dialog 1007 +// 1008 + MainFrame = parent; 1009 + Path = path; 1010 + Table = table; 1011 + Column = column; 1012 + Default = defCs; 1013 + if (wxDialog::Create (parent, wxID_ANY, wxT ("Dump Shapefile")) == false) 1014 + return false; 1015 +// populates individual controls 1016 + CreateControls (); 1017 +// sets dialog sizer 1018 + GetSizer ()->Fit (this); 1019 + GetSizer ()->SetSizeHints (this); 1020 +// centers the dialog window 1021 + Centre (); 1022 + return true; 1023 +} 1024 + 1025 +void 1026 +DumpShpDialog::CreateControls () 1027 +{ 1028 +// 1029 +// creating individual control and setting initial values 1030 +// 1031 + wxBoxSizer *topSizer = new wxBoxSizer (wxVERTICAL); 1032 + this->SetSizer (topSizer); 1033 + wxBoxSizer *boxSizer = new wxBoxSizer (wxVERTICAL); 1034 + topSizer->Add (boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1035 +// first row: the Shapefile path 1036 + wxBoxSizer *pathSizer = new wxBoxSizer (wxHORIZONTAL); 1037 + boxSizer->Add (pathSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1038 + wxStaticText *pathLabel = 1039 + new wxStaticText (this, wxID_STATIC, wxT ("&Path:")); 1040 + pathSizer->Add (pathLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1041 + wxTextCtrl *pathValue = new wxTextCtrl (this, wxID_STATIC, 1042 + Path, wxDefaultPosition, 1043 + wxSize (350, 22), wxTE_READONLY); 1044 + pathSizer->Add (pathValue, 0, wxALIGN_RIGHT | wxALL, 5); 1045 +// second row: TABLE name 1046 + wxBoxSizer *tableSizer = new wxBoxSizer (wxHORIZONTAL); 1047 + boxSizer->Add (tableSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1048 + wxStaticText *tableLabel = 1049 + new wxStaticText (this, wxID_STATIC, wxT ("&Table name:")); 1050 + tableSizer->Add (tableLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1051 + wxTextCtrl *tableCtrl = new wxTextCtrl (this, wxID_STATIC, Table, 1052 + wxDefaultPosition, wxSize (350, 1053 + 22)); 1054 + tableCtrl->Enable (false); 1055 + tableSizer->Add (tableCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 1056 +// third row: GEOMETRY COLUMN name 1057 + wxBoxSizer *colSizer = new wxBoxSizer (wxHORIZONTAL); 1058 + boxSizer->Add (colSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1059 + wxStaticText *colLabel = 1060 + new wxStaticText (this, wxID_STATIC, wxT ("&GeomColumn name:")); 1061 + colSizer->Add (colLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1062 + wxTextCtrl *colCtrl = new wxTextCtrl (this, wxID_STATIC, Column, 1063 + wxDefaultPosition, wxSize (350, 22)); 1064 + colCtrl->Enable (false); 1065 + colSizer->Add (colCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 1066 +// fourth row: CHARSET 1067 + wxBoxSizer *csSizer = new wxBoxSizer (wxHORIZONTAL); 1068 + boxSizer->Add (csSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 1069 + wxStaticBox *charsetBox = new wxStaticBox (this, wxID_STATIC, 1070 + wxT ("Charset Encoding"), 1071 + wxDefaultPosition, 1072 + wxDefaultSize); 1073 + wxBoxSizer *charsetSizer = new wxStaticBoxSizer (charsetBox, wxHORIZONTAL); 1074 + csSizer->Add (charsetSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1075 + wxListBox *charsetCtrl = new wxListBox (this, ID_DMPSHP_CHARSET, 1076 + wxDefaultPosition, wxDefaultSize, 1077 + MainFrame->GetCharsetsLen (), 1078 + MainFrame->GetCharsetsNames (), 1079 + wxLB_SINGLE); 1080 + charsetCtrl->SetFont (wxFont 1081 + (8, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, 1082 + wxFONTWEIGHT_NORMAL)); 1083 + int idSel = MainFrame->GetCharsetIndex (Default); 1084 + if (idSel != wxNOT_FOUND) 1085 + charsetCtrl->SetSelection (idSel); 1086 + charsetSizer->Add (charsetCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 1087 +// OK - CANCEL buttons 1088 + wxBoxSizer *okCancelBox = new wxBoxSizer (wxHORIZONTAL); 1089 + boxSizer->Add (okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 1090 + wxButton *ok = new wxButton (this, wxID_OK, wxT ("&OK")); 1091 + okCancelBox->Add (ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1092 + wxButton *cancel = new wxButton (this, wxID_CANCEL, wxT ("&Cancel")); 1093 + okCancelBox->Add (cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1094 +// appends event handler for OK button 1095 + Connect (wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 1096 + (wxObjectEventFunction) & DumpShpDialog::OnOk); 1097 +} 1098 + 1099 +void 1100 +DumpShpDialog::OnOk (wxCommandEvent & event) 1101 +{ 1102 +// 1103 +// all done: 1104 +// 1105 + wxListBox *charsetCtrl = (wxListBox *) FindWindow (ID_DMPSHP_CHARSET); 1106 + int idSel = charsetCtrl->GetSelection (); 1107 + if (idSel == wxNOT_FOUND) 1108 + { 1109 + wxMessageBox (wxT 1110 + ("you must select some Charset Encoding from the list"), 1111 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 1112 + return; 1113 + } 1114 + wxString *charsets = MainFrame->GetCharsets (); 1115 + Charset = *(charsets + idSel); 1116 + wxDialog::EndModal (wxID_OK); 1117 +} 1118 + 1119 +bool 1120 +DumpTxtDialog::Create (MyFrame * parent, wxString & path, 1121 + wxString & target, wxString & defCs) 1122 +{ 1123 +// 1124 +// creating the dialog 1125 +// 1126 + MainFrame = parent; 1127 + Path = path; 1128 + Default = defCs; 1129 + if (wxDialog::Create (parent, wxID_ANY, wxT ("Dump ") + target) == false) 1130 + return false; 1131 +// populates individual controls 1132 + CreateControls (); 1133 +// sets dialog sizer 1134 + GetSizer ()->Fit (this); 1135 + GetSizer ()->SetSizeHints (this); 1136 +// centers the dialog window 1137 + Centre (); 1138 + return true; 1139 +} 1140 + 1141 +void 1142 +DumpTxtDialog::CreateControls () 1143 +{ 1144 +// 1145 +// creating individual control and setting initial values 1146 +// 1147 + wxBoxSizer *topSizer = new wxBoxSizer (wxVERTICAL); 1148 + this->SetSizer (topSizer); 1149 + wxBoxSizer *boxSizer = new wxBoxSizer (wxVERTICAL); 1150 + topSizer->Add (boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1151 +// first row: the Shapefile path 1152 + wxBoxSizer *pathSizer = new wxBoxSizer (wxHORIZONTAL); 1153 + boxSizer->Add (pathSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1154 + wxStaticText *pathLabel = 1155 + new wxStaticText (this, wxID_STATIC, wxT ("&Path:")); 1156 + pathSizer->Add (pathLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1157 + wxTextCtrl *pathValue = new wxTextCtrl (this, wxID_STATIC, 1158 + Path, wxDefaultPosition, 1159 + wxSize (350, 22), wxTE_READONLY); 1160 + pathSizer->Add (pathValue, 0, wxALIGN_RIGHT | wxALL, 5); 1161 +// second row: CHARSET 1162 + wxBoxSizer *csSizer = new wxBoxSizer (wxHORIZONTAL); 1163 + boxSizer->Add (csSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 1164 + wxStaticBox *charsetBox = new wxStaticBox (this, wxID_STATIC, 1165 + wxT ("Charset Encoding"), 1166 + wxDefaultPosition, 1167 + wxDefaultSize); 1168 + wxBoxSizer *charsetSizer = new wxStaticBoxSizer (charsetBox, wxHORIZONTAL); 1169 + csSizer->Add (charsetSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1170 + wxListBox *charsetCtrl = new wxListBox (this, ID_DMPTXT_CHARSET, 1171 + wxDefaultPosition, wxDefaultSize, 1172 + MainFrame->GetCharsetsLen (), 1173 + MainFrame->GetCharsetsNames (), 1174 + wxLB_SINGLE); 1175 + charsetCtrl->SetFont (wxFont 1176 + (8, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, 1177 + wxFONTWEIGHT_NORMAL)); 1178 + int idSel = MainFrame->GetCharsetIndex (Default); 1179 + if (idSel != wxNOT_FOUND) 1180 + charsetCtrl->SetSelection (idSel); 1181 + charsetSizer->Add (charsetCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 1182 +// OK - CANCEL buttons 1183 + wxBoxSizer *okCancelBox = new wxBoxSizer (wxHORIZONTAL); 1184 + boxSizer->Add (okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 1185 + wxButton *ok = new wxButton (this, wxID_OK, wxT ("&OK")); 1186 + okCancelBox->Add (ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1187 + wxButton *cancel = new wxButton (this, wxID_CANCEL, wxT ("&Cancel")); 1188 + okCancelBox->Add (cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1189 +// appends event handler for OK button 1190 + Connect (wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 1191 + (wxObjectEventFunction) & DumpTxtDialog::OnOk); 1192 +} 1193 + 1194 +void 1195 +DumpTxtDialog::OnOk (wxCommandEvent & event) 1196 +{ 1197 +// 1198 +// all done: 1199 +// 1200 + wxListBox *charsetCtrl = (wxListBox *) FindWindow (ID_DMPTXT_CHARSET); 1201 + int idSel = charsetCtrl->GetSelection (); 1202 + if (idSel == wxNOT_FOUND) 1203 + { 1204 + wxMessageBox (wxT 1205 + ("you must select some Charset Encoding from the list"), 1206 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 1207 + return; 1208 + } 1209 + wxString *charsets = MainFrame->GetCharsets (); 1210 + Charset = *(charsets + idSel); 1211 + wxDialog::EndModal (wxID_OK); 1212 +} 1213 + 1214 +bool 1215 +SqlScriptDialog::Create (MyFrame * parent, wxString & path, wxString & defCs) 1216 +{ 1217 +// 1218 +// creating the dialog 1219 +// 1220 + MainFrame = parent; 1221 + Path = path; 1222 + Default = defCs; 1223 + if (wxDialog::Create (parent, wxID_ANY, wxT ("SQL script execute")) == 1224 + false) 1225 + return false; 1226 +// populates individual controls 1227 + CreateControls (); 1228 +// sets dialog sizer 1229 + GetSizer ()->Fit (this); 1230 + GetSizer ()->SetSizeHints (this); 1231 +// centers the dialog window 1232 + Centre (); 1233 + return true; 1234 +} 1235 + 1236 +void 1237 +SqlScriptDialog::CreateControls () 1238 +{ 1239 +// 1240 +// creating individual control and setting initial values 1241 +// 1242 + wxBoxSizer *topSizer = new wxBoxSizer (wxVERTICAL); 1243 + this->SetSizer (topSizer); 1244 + wxBoxSizer *boxSizer = new wxBoxSizer (wxVERTICAL); 1245 + topSizer->Add (boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1246 +// first row: the SQL script path 1247 + wxBoxSizer *pathSizer = new wxBoxSizer (wxHORIZONTAL); 1248 + boxSizer->Add (pathSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1249 + wxStaticText *pathLabel = 1250 + new wxStaticText (this, wxID_STATIC, wxT ("&Path:")); 1251 + pathSizer->Add (pathLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1252 + wxTextCtrl *pathValue = new wxTextCtrl (this, wxID_STATIC, 1253 + Path, wxDefaultPosition, 1254 + wxSize (350, 22), wxTE_READONLY); 1255 + pathSizer->Add (pathValue, 0, wxALIGN_RIGHT | wxALL, 5); 1256 +// second row: CHARSET 1257 + wxBoxSizer *csSizer = new wxBoxSizer (wxHORIZONTAL); 1258 + boxSizer->Add (csSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 1259 + wxStaticBox *charsetBox = new wxStaticBox (this, wxID_STATIC, 1260 + wxT ("Charset Encoding"), 1261 + wxDefaultPosition, 1262 + wxDefaultSize); 1263 + wxBoxSizer *charsetSizer = new wxStaticBoxSizer (charsetBox, wxHORIZONTAL); 1264 + csSizer->Add (charsetSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1265 + wxListBox *charsetCtrl = new wxListBox (this, ID_SCRIPT_CHARSET, 1266 + wxDefaultPosition, wxDefaultSize, 1267 + MainFrame->GetCharsetsLen (), 1268 + MainFrame->GetCharsetsNames (), 1269 + wxLB_SINGLE); 1270 + charsetCtrl->SetFont (wxFont 1271 + (8, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, 1272 + wxFONTWEIGHT_NORMAL)); 1273 + int idSel = MainFrame->GetCharsetIndex (Default); 1274 + if (idSel != wxNOT_FOUND) 1275 + charsetCtrl->SetSelection (idSel); 1276 + charsetSizer->Add (charsetCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 1277 +// OK - CANCEL buttons 1278 + wxBoxSizer *okCancelBox = new wxBoxSizer (wxHORIZONTAL); 1279 + boxSizer->Add (okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 1280 + wxButton *ok = new wxButton (this, wxID_OK, wxT ("&OK")); 1281 + okCancelBox->Add (ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1282 + wxButton *cancel = new wxButton (this, wxID_CANCEL, wxT ("&Cancel")); 1283 + okCancelBox->Add (cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1284 +// appends event handler for OK button 1285 + Connect (wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 1286 + (wxObjectEventFunction) & SqlScriptDialog::OnOk); 1287 +} 1288 + 1289 +void 1290 +SqlScriptDialog::OnOk (wxCommandEvent & event) 1291 +{ 1292 +// 1293 +// all done: 1294 +// 1295 + wxListBox *charsetCtrl = (wxListBox *) FindWindow (ID_SCRIPT_CHARSET); 1296 + int idSel = charsetCtrl->GetSelection (); 1297 + if (idSel == wxNOT_FOUND) 1298 + { 1299 + wxMessageBox (wxT 1300 + ("you must select some Charset Encoding from the list"), 1301 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 1302 + return; 1303 + } 1304 + wxString *charsets = MainFrame->GetCharsets (); 1305 + Charset = *(charsets + idSel); 1306 + wxDialog::EndModal (wxID_OK); 1307 +} 1308 + 1309 +bool 1310 +DefaultCharsetDialog::Create (MyFrame * parent, wxString & charset, bool ask) 1311 +{ 1312 +// 1313 +// creating the dialog 1314 +// 1315 + MainFrame = parent; 1316 + Charset = charset; 1317 + AskCharset = ask; 1318 + if (wxDialog::Create (parent, wxID_ANY, wxT ("Charset settings")) == false) 1319 + return false; 1320 +// populates individual controls 1321 + CreateControls (); 1322 +// sets dialog sizer 1323 + GetSizer ()->Fit (this); 1324 + GetSizer ()->SetSizeHints (this); 1325 +// centers the dialog window 1326 + Centre (); 1327 + return true; 1328 +} 1329 + 1330 +void 1331 +DefaultCharsetDialog::CreateControls () 1332 +{ 1333 +// 1334 +// creating individual control and setting initial values 1335 +// 1336 + wxBoxSizer *topSizer = new wxBoxSizer (wxVERTICAL); 1337 + this->SetSizer (topSizer); 1338 + wxBoxSizer *boxSizer = new wxBoxSizer (wxVERTICAL); 1339 + topSizer->Add (boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1340 +// first row: the DEFAULT CHARSET 1341 + wxBoxSizer *csSizer = new wxBoxSizer (wxHORIZONTAL); 1342 + boxSizer->Add (csSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1343 + wxStaticBox *charsetBox = new wxStaticBox (this, wxID_STATIC, 1344 + wxT ("Default Output Charset"), 1345 + wxDefaultPosition, 1346 + wxDefaultSize); 1347 + wxBoxSizer *charsetSizer = new wxStaticBoxSizer (charsetBox, wxVERTICAL); 1348 + csSizer->Add (charsetSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1349 + wxListBox *charsetCtrl = new wxListBox (this, ID_DFLT_CHARSET, 1350 + wxDefaultPosition, wxDefaultSize, 1351 + MainFrame->GetCharsetsLen (), 1352 + MainFrame->GetCharsetsNames (), 1353 + wxLB_SINGLE); 1354 + charsetCtrl->SetFont (wxFont 1355 + (8, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, 1356 + wxFONTWEIGHT_NORMAL)); 1357 + int idSel = MainFrame->GetCharsetIndex (Charset); 1358 + if (idSel != wxNOT_FOUND) 1359 + charsetCtrl->SetSelection (idSel); 1360 + charsetSizer->Add (charsetCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 1361 +// second row: the ASK CHARSET 1362 + wxBoxSizer *askSizer = new wxBoxSizer (wxHORIZONTAL); 1363 + charsetSizer->Add (askSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 1364 + wxCheckBox *askCtrl = new wxCheckBox (this, ID_DFLT_ASK, 1365 + wxT ("Ask output charset every time"), 1366 + wxDefaultPosition, wxDefaultSize); 1367 + askCtrl->SetValue (AskCharset); 1368 + askSizer->Add (askCtrl, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1369 +// OK - CANCEL buttons 1370 + wxBoxSizer *okCancelBox = new wxBoxSizer (wxHORIZONTAL); 1371 + boxSizer->Add (okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 1372 + wxButton *ok = new wxButton (this, wxID_OK, wxT ("&OK")); 1373 + okCancelBox->Add (ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1374 + wxButton *cancel = new wxButton (this, wxID_CANCEL, wxT ("&Cancel")); 1375 + okCancelBox->Add (cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1376 +// appends event handler for OK button 1377 + Connect (wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 1378 + (wxObjectEventFunction) & DefaultCharsetDialog::OnOk); 1379 +} 1380 + 1381 +void 1382 +DefaultCharsetDialog::OnOk (wxCommandEvent & event) 708 1383 { 709 1384 // 710 1385 // all done: 711 1386 // 712 - wxTextCtrl *tableCtrl = (wxTextCtrl *) FindWindow(ID_LDTXT_TABLE); 713 - Table = tableCtrl->GetValue(); 714 - if (Table.Len() < 1) 715 - { 716 - wxMessageBox(wxT("You must specify the TABLE NAME !!!"), 717 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 718 - return; 719 - } 720 - if (MainFrame->TableAlreadyExists(Table) == true) 721 - { 722 - wxMessageBox(wxT("a table name '") + Table + wxT("' already exists"), 723 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 724 - return; 725 - } 726 - wxListBox *charsetCtrl = (wxListBox *) FindWindow(ID_LDTXT_CHARSET); 727 - int idSel = charsetCtrl->GetSelection(); 728 - if (idSel == wxNOT_FOUND) 729 - { 730 - wxMessageBox(wxT("you must select some Charset Encoding from the list"), 731 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 732 - return; 733 - } 734 - wxString *charsets = MainFrame->GetCharsets(); 735 - Charset = *(charsets + idSel); 736 - wxRadioBox *separatorCtrl = (wxRadioBox *) FindWindow(ID_LDTXT_SEPARATOR); 737 - if (separatorCtrl->GetSelection() == 5) 738 - { 739 - wxTextCtrl *charSeparatorCtrl = 740 - (wxTextCtrl *) FindWindow(ID_LDTXT_CHARSEPARATOR); 741 - wxString separator = charSeparatorCtrl->GetValue(); 742 - if (separator.Len() != 1) 743 - { 744 - wxMessageBox(wxT 745 - ("you must specificy a single char as Custom Column Separator"), 746 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 747 - return; 748 - } 749 - char dummy[64]; 750 - strcpy(dummy, separator.ToUTF8()); 751 - Separator = *dummy; 752 - } 753 - wxDialog::EndModal(wxID_OK); 1387 + wxListBox *charsetCtrl = (wxListBox *) FindWindow (ID_DFLT_CHARSET); 1388 + int idSel = charsetCtrl->GetSelection (); 1389 + if (idSel == wxNOT_FOUND) 1390 + { 1391 + wxMessageBox (wxT 1392 + ("you must select some Default Charset Encoding from the list"), 1393 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 1394 + return; 1395 + } 1396 + wxString *charsets = MainFrame->GetCharsets (); 1397 + Charset = *(charsets + idSel); 1398 + wxCheckBox *askCtrl = (wxCheckBox *) FindWindow (ID_DFLT_ASK); 1399 + AskCharset = askCtrl->GetValue (); 1400 + wxDialog::EndModal (wxID_OK); 754 1401 } 755 1402 756 -bool LoadShpDialog::Create(MyFrame * parent, wxString & path, wxString & table, 757 - int srid, wxString & column, wxString & defCs) 1403 +bool 1404 +RecoverDialog::Create (MyFrame * parent, wxString & table, wxString & column) 758 1405 { 759 1406 // 760 1407 // creating the dialog 761 1408 // 762 - MainFrame = parent; 763 - Path = path; 764 - Table = table; 765 - Srid = srid; 766 - Column = column; 767 - Default = defCs; 768 - if (wxDialog::Create(parent, wxID_ANY, wxT("Load Shapefile")) == false) 769 - return false; 1409 + MainFrame = parent; 1410 + Table = table; 1411 + Column = column; 1412 + Srid = -1; 1413 + if (wxDialog::Create (parent, wxID_ANY, wxT ("Recover Geometry Column")) == 1414 + false) 1415 + return false; 770 1416 // populates individual controls 771 - CreateControls(); 1417 + CreateControls (); 772 1418 // sets dialog sizer 773 - GetSizer()->Fit(this); 774 - GetSizer()->SetSizeHints(this); 1419 + GetSizer ()->Fit (this); 1420 + GetSizer ()->SetSizeHints (this); 775 1421 // centers the dialog window 776 - Centre(); 777 - return true; 1422 + Centre (); 1423 + return true; 778 1424 } 779 1425 780 -void LoadShpDialog::CreateControls() 1426 +void 1427 +RecoverDialog::CreateControls () 781 1428 { 782 1429 // 783 1430 // creating individual control and setting initial values 784 1431 // 785 - wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); 786 - this->SetSizer(topSizer); 787 - wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL); 788 - topSizer->Add(boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 789 -// first row: the Shapefile path 790 - wxBoxSizer *pathSizer = new wxBoxSizer(wxHORIZONTAL); 791 - boxSizer->Add(pathSizer, 0, wxALIGN_RIGHT | wxALL, 0); 792 - wxStaticText *pathLabel = new wxStaticText(this, wxID_STATIC, wxT("&Path:")); 793 - pathSizer->Add(pathLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 794 - wxTextCtrl *pathValue = new wxTextCtrl(this, wxID_STATIC, 795 - Path, wxDefaultPosition, 796 - wxSize(350, 22), wxTE_READONLY); 797 - pathSizer->Add(pathValue, 0, wxALIGN_RIGHT | wxALL, 5); 798 -// second row: TABLE name 799 - wxBoxSizer *tableSizer = new wxBoxSizer(wxHORIZONTAL); 800 - boxSizer->Add(tableSizer, 0, wxALIGN_RIGHT | wxALL, 0); 801 - wxStaticText *tableLabel = 802 - new wxStaticText(this, wxID_STATIC, wxT("&Table name:")); 803 - tableSizer->Add(tableLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 804 - wxTextCtrl *tableCtrl = new wxTextCtrl(this, ID_LDSHP_TABLE, Table, 805 - wxDefaultPosition, wxSize(350, 806 - 22)); 807 - tableSizer->Add(tableCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 808 -// third row: GEOMETRY COLUMN name 809 - wxBoxSizer *colSizer = new wxBoxSizer(wxHORIZONTAL); 810 - boxSizer->Add(colSizer, 0, wxALIGN_RIGHT | wxALL, 0); 811 - wxStaticText *colLabel = 812 - new wxStaticText(this, wxID_STATIC, wxT("&GeomColumn name:")); 813 - colSizer->Add(colLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 814 - wxTextCtrl *colCtrl = new wxTextCtrl(this, ID_LDSHP_COLUMN, Column, 815 - wxDefaultPosition, wxSize(350, 22)); 816 - colSizer->Add(colCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 817 -// fourth row: SRID 818 - wxBoxSizer *sridSizer = new wxBoxSizer(wxHORIZONTAL); 819 - boxSizer->Add(sridSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 820 - wxStaticText *sridLabel = new wxStaticText(this, wxID_STATIC, wxT("&SRID:")); 821 - sridSizer->Add(sridLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 822 - wxSpinCtrl *sridCtrl = new wxSpinCtrl(this, ID_LDSHP_SRID, wxEmptyString, 823 - wxDefaultPosition, wxSize(80, 20), 824 - wxSP_ARROW_KEYS, 825 - -1, 40000, Srid); 826 - sridSizer->Add(sridCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 827 -// fifth row: CHARSET 828 - wxStaticBox *charsetBox = new wxStaticBox(this, wxID_STATIC, 829 - wxT("Charset Encoding"), 830 - wxDefaultPosition, 831 - wxDefaultSize); 832 - wxBoxSizer *charsetSizer = new wxStaticBoxSizer(charsetBox, wxHORIZONTAL); 833 - sridSizer->Add(charsetSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 834 - wxListBox *charsetCtrl = new wxListBox(this, ID_LDSHP_CHARSET, 835 - wxDefaultPosition, wxDefaultSize, 836 - MainFrame->GetCharsetsLen(), 837 - MainFrame->GetCharsetsNames(), 838 - wxLB_SINGLE); 839 - charsetCtrl-> 840 - SetFont(wxFont 841 - (8, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL)); 842 - int idSel = MainFrame->GetCharsetIndex(Default); 843 - if (idSel != wxNOT_FOUND) 844 - charsetCtrl->SetSelection(idSel); 845 - charsetSizer->Add(charsetCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 1432 + wxBoxSizer *topSizer = new wxBoxSizer (wxVERTICAL); 1433 + this->SetSizer (topSizer); 1434 + wxBoxSizer *boxSizer = new wxBoxSizer (wxVERTICAL); 1435 + topSizer->Add (boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1436 +// First row: TABLE name 1437 + wxBoxSizer *tableSizer = new wxBoxSizer (wxHORIZONTAL); 1438 + boxSizer->Add (tableSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1439 + wxStaticText *tableLabel = 1440 + new wxStaticText (this, wxID_STATIC, wxT ("&Table name:")); 1441 + tableSizer->Add (tableLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1442 + wxTextCtrl *tableCtrl = new wxTextCtrl (this, wxID_ANY, Table, 1443 + wxDefaultPosition, wxSize (350, 22), 1444 + wxTE_READONLY); 1445 + tableCtrl->Enable (false); 1446 + tableSizer->Add (tableCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 1447 +// second row: GEOMETRY COLUMN name 1448 + wxBoxSizer *colSizer = new wxBoxSizer (wxHORIZONTAL); 1449 + boxSizer->Add (colSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1450 + wxStaticText *colLabel = 1451 + new wxStaticText (this, wxID_STATIC, wxT ("&Column name:")); 1452 + colSizer->Add (colLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1453 + wxTextCtrl *colCtrl = new wxTextCtrl (this, wxID_ANY, Column, 1454 + wxDefaultPosition, wxSize (350, 22), 1455 + wxTE_READONLY); 1456 + colCtrl->Enable (false); 1457 + colSizer->Add (colCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 1458 +// third row: SRID 1459 + wxBoxSizer *sridSizer = new wxBoxSizer (wxHORIZONTAL); 1460 + boxSizer->Add (sridSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 1461 + wxStaticText *sridLabel = 1462 + new wxStaticText (this, wxID_STATIC, wxT ("&SRID:")); 1463 + sridSizer->Add (sridLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1464 + wxSpinCtrl *sridCtrl = new wxSpinCtrl (this, ID_RCVR_SRID, wxEmptyString, 1465 + wxDefaultPosition, wxSize (80, 20), 1466 + wxSP_ARROW_KEYS, 1467 + -1, 40000, Srid); 1468 + sridSizer->Add (sridCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1469 +// fourth row: GEOMETRY TYPE 1470 + wxStaticBox *typeBox = new wxStaticBox (this, wxID_STATIC, 1471 + wxT ("Geometry Type"), 1472 + wxDefaultPosition, wxDefaultSize); 1473 + wxBoxSizer *typeSizer = new wxStaticBoxSizer (typeBox, wxHORIZONTAL); 1474 + sridSizer->Add (typeSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1475 + wxString types[7]; 1476 + types[0] = wxT ("POINT"); 1477 + types[1] = wxT ("MULTIPOINT"); 1478 + types[2] = wxT ("LINESTRING"); 1479 + types[3] = wxT ("MULTILINESTRING"); 1480 + types[4] = wxT ("POLYGON"); 1481 + types[5] = wxT ("MULTIPOLYGON"); 1482 + types[6] = wxT ("GEOMETRYCOLLECTION"); 1483 + wxListBox *geomType = new wxListBox (this, ID_RCVR_TYPE, 1484 + wxDefaultPosition, wxDefaultSize, 7, 1485 + types, wxLB_SINGLE); 1486 + typeSizer->Add (geomType, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 846 1487 // OK - CANCEL buttons 847 - wxBoxSizer *okCancelBox = new wxBoxSizer(wxHORIZONTAL); 848 - boxSizer->Add(okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 849 - wxButton *ok = new wxButton(this, wxID_OK, wxT("&OK")); 850 - okCancelBox->Add(ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 851 - wxButton *cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel")); 852 - okCancelBox->Add(cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1488 + wxBoxSizer *okCancelBox = new wxBoxSizer (wxHORIZONTAL); 1489 + boxSizer->Add (okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 1490 + wxButton *ok = new wxButton (this, wxID_OK, wxT ("&OK")); 1491 + okCancelBox->Add (ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1492 + wxButton *cancel = new wxButton (this, wxID_CANCEL, wxT ("&Cancel")); 1493 + okCancelBox->Add (cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 853 1494 // appends event handler for OK button 854 - Connect(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 855 - (wxObjectEventFunction) & LoadShpDialog::OnOk); 1495 + Connect (wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 1496 + (wxObjectEventFunction) & RecoverDialog::OnOk); 856 1497 } 857 1498 858 -void LoadShpDialog::OnOk(wxCommandEvent & event) 1499 +void 1500 +RecoverDialog::OnOk (wxCommandEvent & event) 859 1501 { 860 1502 // 861 1503 // all done: 862 1504 // 863 - wxTextCtrl *tableCtrl = (wxTextCtrl *) FindWindow(ID_LDSHP_TABLE); 864 - Table = tableCtrl->GetValue(); 865 - if (Table.Len() < 1) 866 - { 867 - wxMessageBox(wxT("You must specify the TABLE NAME !!!"), 868 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 869 - return; 870 - } 871 - if (MainFrame->TableAlreadyExists(Table) == true) 872 - { 873 - wxMessageBox(wxT("a table name '") + Table + wxT("' already exists"), 874 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 875 - return; 876 - } 877 - wxTextCtrl *columnCtrl = (wxTextCtrl *) FindWindow(ID_LDSHP_COLUMN); 878 - Column = columnCtrl->GetValue(); 879 - if (Column.Len() < 1) 880 - { 881 - wxMessageBox(wxT("You must specify the GEOMETRY COLUMN NAME !!!"), 882 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 883 - return; 884 - } 885 - wxSpinCtrl *sridCtrl = (wxSpinCtrl *) FindWindow(ID_LDSHP_SRID); 886 - Srid = sridCtrl->GetValue(); 887 - if (MainFrame->SridNotExists(Srid) == true) 888 - { 889 - wxMessageBox(wxT("invalid SRID value"), wxT("spatialite-gui"), 890 - wxOK | wxICON_WARNING, this); 891 - return; 892 - } 893 - wxListBox *charsetCtrl = (wxListBox *) FindWindow(ID_LDSHP_CHARSET); 894 - int idSel = charsetCtrl->GetSelection(); 895 - if (idSel == wxNOT_FOUND) 896 - { 897 - wxMessageBox(wxT("you must select some Charset Encoding from the list"), 898 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 899 - return; 900 - } 901 - wxString *charsets = MainFrame->GetCharsets(); 902 - Charset = *(charsets + idSel); 903 - wxDialog::EndModal(wxID_OK); 1505 + wxSpinCtrl *sridCtrl = (wxSpinCtrl *) FindWindow (ID_RCVR_SRID); 1506 + wxListBox *geomType = (wxListBox *) FindWindow (ID_RCVR_TYPE); 1507 + Srid = sridCtrl->GetValue (); 1508 + if (MainFrame->SridNotExists (Srid) == true) 1509 + { 1510 + wxMessageBox (wxT ("invalid SRID value"), 1511 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 1512 + return; 1513 + } 1514 + Type = geomType->GetStringSelection (); 1515 + if (Type.Len () < 1) 1516 + { 1517 + wxMessageBox (wxT 1518 + ("you must select some Geometry Type from the list"), 1519 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 1520 + return; 1521 + } 1522 + wxDialog::EndModal (wxID_OK); 904 1523 } 905 1524 906 -bool DumpShpDialog::Create(MyFrame * parent, wxString & path, wxString & table, 907 - wxString & column, wxString & defCs) 1525 +bool 1526 +SetSridDialog::Create (MyFrame * parent, wxString & table, wxString & column) 908 1527 { 909 1528 // 910 1529 // creating the dialog 911 1530 // 912 - MainFrame = parent; 913 - Path = path; 914 - Table = table; 915 - Column = column; 916 - Default = defCs; 917 - if (wxDialog::Create(parent, wxID_ANY, wxT("Dump Shapefile")) == false) 918 - return false; 1531 + MainFrame = parent; 1532 + Table = table; 1533 + Column = column; 1534 + OldSrid = -1; 1535 + Srid = -1; 1536 + if (wxDialog::Create (parent, wxID_ANY, wxT ("Changing SRID")) == false) 1537 + return false; 919 1538 // populates individual controls 920 - CreateControls(); 1539 + CreateControls (); 921 1540 // sets dialog sizer 922 - GetSizer()->Fit(this); 923 - GetSizer()->SetSizeHints(this); 1541 + GetSizer ()->Fit (this); 1542 + GetSizer ()->SetSizeHints (this); 924 1543 // centers the dialog window 925 - Centre(); 926 - return true; 1544 + Centre (); 1545 + return true; 927 1546 } 928 1547 929 -void DumpShpDialog::CreateControls() 1548 +void 1549 +SetSridDialog::CreateControls () 930 1550 { 931 1551 // 932 1552 // creating individual control and setting initial values 933 1553 // 934 - wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); 935 - this->SetSizer(topSizer); 936 - wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL); 937 - topSizer->Add(boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 938 -// first row: the Shapefile path 939 - wxBoxSizer *pathSizer = new wxBoxSizer(wxHORIZONTAL); 940 - boxSizer->Add(pathSizer, 0, wxALIGN_RIGHT | wxALL, 0); 941 - wxStaticText *pathLabel = new wxStaticText(this, wxID_STATIC, wxT("&Path:")); 942 - pathSizer->Add(pathLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 943 - wxTextCtrl *pathValue = new wxTextCtrl(this, wxID_STATIC, 944 - Path, wxDefaultPosition, 945 - wxSize(350, 22), wxTE_READONLY); 946 - pathSizer->Add(pathValue, 0, wxALIGN_RIGHT | wxALL, 5); 947 -// second row: TABLE name 948 - wxBoxSizer *tableSizer = new wxBoxSizer(wxHORIZONTAL); 949 - boxSizer->Add(tableSizer, 0, wxALIGN_RIGHT | wxALL, 0); 950 - wxStaticText *tableLabel = 951 - new wxStaticText(this, wxID_STATIC, wxT("&Table name:")); 952 - tableSizer->Add(tableLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 953 - wxTextCtrl *tableCtrl = new wxTextCtrl(this, wxID_STATIC, Table, 954 - wxDefaultPosition, wxSize(350, 955 - 22)); 956 - tableCtrl->Enable(false); 957 - tableSizer->Add(tableCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 958 -// third row: GEOMETRY COLUMN name 959 - wxBoxSizer *colSizer = new wxBoxSizer(wxHORIZONTAL); 960 - boxSizer->Add(colSizer, 0, wxALIGN_RIGHT | wxALL, 0); 961 - wxStaticText *colLabel = 962 - new wxStaticText(this, wxID_STATIC, wxT("&GeomColumn name:")); 963 - colSizer->Add(colLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 964 - wxTextCtrl *colCtrl = new wxTextCtrl(this, wxID_STATIC, Column, 965 - wxDefaultPosition, wxSize(350, 22)); 966 - colCtrl->Enable(false); 967 - colSizer->Add(colCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 968 -// fourth row: CHARSET 969 - wxBoxSizer *csSizer = new wxBoxSizer(wxHORIZONTAL); 970 - boxSizer->Add(csSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 971 - wxStaticBox *charsetBox = new wxStaticBox(this, wxID_STATIC, 972 - wxT("Charset Encoding"), 973 - wxDefaultPosition, 974 - wxDefaultSize); 975 - wxBoxSizer *charsetSizer = new wxStaticBoxSizer(charsetBox, wxHORIZONTAL); 976 - csSizer->Add(charsetSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 977 - wxListBox *charsetCtrl = new wxListBox(this, ID_DMPSHP_CHARSET, 978 - wxDefaultPosition, wxDefaultSize, 979 - MainFrame->GetCharsetsLen(), 980 - MainFrame->GetCharsetsNames(), 981 - wxLB_SINGLE); 982 - charsetCtrl-> 983 - SetFont(wxFont 984 - (8, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL)); 985 - int idSel = MainFrame->GetCharsetIndex(Default); 986 - if (idSel != wxNOT_FOUND) 987 - charsetCtrl->SetSelection(idSel); 988 - charsetSizer->Add(charsetCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 1554 + wxBoxSizer *topSizer = new wxBoxSizer (wxVERTICAL); 1555 + this->SetSizer (topSizer); 1556 + wxBoxSizer *boxSizer = new wxBoxSizer (wxVERTICAL); 1557 + topSizer->Add (boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1558 +// First row: TABLE name 1559 + wxBoxSizer *tableSizer = new wxBoxSizer (wxHORIZONTAL); 1560 + boxSizer->Add (tableSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1561 + wxStaticText *tableLabel = 1562 + new wxStaticText (this, wxID_STATIC, wxT ("&Table name:")); 1563 + tableSizer->Add (tableLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1564 + wxTextCtrl *tableCtrl = new wxTextCtrl (this, wxID_ANY, Table, 1565 + wxDefaultPosition, wxSize (350, 22), 1566 + wxTE_READONLY); 1567 + tableCtrl->Enable (false); 1568 + tableSizer->Add (tableCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 1569 +// second row: GEOMETRY COLUMN name 1570 + wxBoxSizer *colSizer = new wxBoxSizer (wxHORIZONTAL); 1571 + boxSizer->Add (colSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1572 + wxStaticText *colLabel = 1573 + new wxStaticText (this, wxID_STATIC, wxT ("&Column name:")); 1574 + colSizer->Add (colLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1575 + wxTextCtrl *colCtrl = new wxTextCtrl (this, wxID_ANY, Column, 1576 + wxDefaultPosition, wxSize (350, 22), 1577 + wxTE_READONLY); 1578 + colCtrl->Enable (false); 1579 + colSizer->Add (colCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 1580 +// third row: SRID 1581 + wxBoxSizer *mySizer = new wxBoxSizer (wxHORIZONTAL); 1582 + boxSizer->Add (mySizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 1583 + wxBoxSizer *oldSridSizer = new wxBoxSizer (wxHORIZONTAL); 1584 + mySizer->Add (oldSridSizer, 0, wxALIGN_LEFT | wxALL, 0); 1585 + wxStaticText *oldSridLabel = 1586 + new wxStaticText (this, wxID_STATIC, wxT ("&old SRID:")); 1587 + oldSridSizer->Add (oldSridLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1588 + wxSpinCtrl *oldSridCtrl = new wxSpinCtrl (this, ID_SRID_OLD, wxEmptyString, 1589 + wxDefaultPosition, wxSize (80, 1590 + 20), 1591 + wxSP_ARROW_KEYS, 1592 + -1, 40000, OldSrid); 1593 + oldSridSizer->Add (oldSridCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1594 +// fourth row: SRID 1595 + wxBoxSizer *sridSizer = new wxBoxSizer (wxHORIZONTAL); 1596 + mySizer->Add (sridSizer, 0, wxALIGN_RIGHT | wxLEFT, 20); 1597 + wxStaticText *sridLabel = 1598 + new wxStaticText (this, wxID_STATIC, wxT ("&new SRID:")); 1599 + sridSizer->Add (sridLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1600 + wxSpinCtrl *sridCtrl = new wxSpinCtrl (this, ID_SRID_SRID, wxEmptyString, 1601 + wxDefaultPosition, wxSize (80, 20), 1602 + wxSP_ARROW_KEYS, 1603 + -1, 40000, Srid); 1604 + sridSizer->Add (sridCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 989 1605 // OK - CANCEL buttons 990 - wxBoxSizer *okCancelBox = new wxBoxSizer(wxHORIZONTAL); 991 - boxSizer->Add(okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 992 - wxButton *ok = new wxButton(this, wxID_OK, wxT("&OK")); 993 - okCancelBox->Add(ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 994 - wxButton *cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel")); 995 - okCancelBox->Add(cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1606 + wxBoxSizer *okCancelBox = new wxBoxSizer (wxHORIZONTAL); 1607 + boxSizer->Add (okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 1608 + wxButton *ok = new wxButton (this, wxID_OK, wxT ("&OK")); 1609 + okCancelBox->Add (ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1610 + wxButton *cancel = new wxButton (this, wxID_CANCEL, wxT ("&Cancel")); 1611 + okCancelBox->Add (cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 996 1612 // appends event handler for OK button 997 - Connect(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 998 - (wxObjectEventFunction) & DumpShpDialog::OnOk); 1613 + Connect (wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 1614 + (wxObjectEventFunction) & SetSridDialog::OnOk); 999 1615 } 1000 1616 1001 -void DumpShpDialog::OnOk(wxCommandEvent & event) 1617 +void 1618 +SetSridDialog::OnOk (wxCommandEvent & event) 1002 1619 { 1003 1620 // 1004 1621 // all done: 1005 1622 // 1006 - wxListBox *charsetCtrl = (wxListBox *) FindWindow(ID_DMPSHP_CHARSET); 1007 - int idSel = charsetCtrl->GetSelection(); 1008 - if (idSel == wxNOT_FOUND) 1009 - { 1010 - wxMessageBox(wxT("you must select some Charset Encoding from the list"), 1011 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 1012 - return; 1013 - } 1014 - wxString *charsets = MainFrame->GetCharsets(); 1015 - Charset = *(charsets + idSel); 1016 - wxDialog::EndModal(wxID_OK); 1623 + wxSpinCtrl *oldSridCtrl = (wxSpinCtrl *) FindWindow (ID_SRID_OLD); 1624 + wxSpinCtrl *sridCtrl = (wxSpinCtrl *) FindWindow (ID_SRID_SRID); 1625 + OldSrid = oldSridCtrl->GetValue (); 1626 + Srid = sridCtrl->GetValue (); 1627 + wxDialog::EndModal (wxID_OK); 1017 1628 } 1018 1629 1019 -bool DumpTxtDialog::Create(MyFrame * parent, wxString & path, wxString & target, 1020 - wxString & defCs) 1630 +bool 1631 +SearchSridDialog::Create (MyFrame * parent) 1021 1632 { 1022 1633 // 1023 1634 // creating the dialog 1024 1635 // 1025 - MainFrame = parent; 1026 - Path = path; 1027 - Default = defCs; 1028 - if (wxDialog::Create(parent, wxID_ANY, wxT("Dump ") + target) == false) 1029 - return false; 1636 + MainFrame = parent; 1637 + if (wxDialog::Create (parent, wxID_ANY, 1638 + wxT ("Searching a SRID by its name")) == false) 1639 + return false; 1030 1640 // populates individual controls 1031 - CreateControls(); 1641 + CreateControls (); 1032 1642 // sets dialog sizer 1033 - GetSizer()->Fit(this); 1034 - GetSizer()->SetSizeHints(this); 1643 + GetSizer ()->Fit (this); 1644 + GetSizer ()->SetSizeHints (this); 1035 1645 // centers the dialog window 1036 - Centre(); 1037 - return true; 1646 + Centre (); 1647 + return true; 1038 1648 } 1039 1649 1040 -void DumpTxtDialog::CreateControls() 1650 +void 1651 +SearchSridDialog::CreateControls () 1041 1652 { 1042 1653 // 1043 1654 // creating individual control and setting initial values 1044 1655 // 1045 - wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); 1046 - this->SetSizer(topSizer); 1047 - wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL); 1048 - topSizer->Add(boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1049 -// first row: the Shapefile path 1050 - wxBoxSizer *pathSizer = new wxBoxSizer(wxHORIZONTAL); 1051 - boxSizer->Add(pathSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1052 - wxStaticText *pathLabel = new wxStaticText(this, wxID_STATIC, wxT("&Path:")); 1053 - pathSizer->Add(pathLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1054 - wxTextCtrl *pathValue = new wxTextCtrl(this, wxID_STATIC, 1055 - Path, wxDefaultPosition, 1056 - wxSize(350, 22), wxTE_READONLY); 1057 - pathSizer->Add(pathValue, 0, wxALIGN_RIGHT | wxALL, 5); 1058 -// second row: CHARSET 1059 - wxBoxSizer *csSizer = new wxBoxSizer(wxHORIZONTAL); 1060 - boxSizer->Add(csSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 1061 - wxStaticBox *charsetBox = new wxStaticBox(this, wxID_STATIC, 1062 - wxT("Charset Encoding"), 1063 - wxDefaultPosition, 1064 - wxDefaultSize); 1065 - wxBoxSizer *charsetSizer = new wxStaticBoxSizer(charsetBox, wxHORIZONTAL); 1066 - csSizer->Add(charsetSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1067 - wxListBox *charsetCtrl = new wxListBox(this, ID_DMPTXT_CHARSET, 1068 - wxDefaultPosition, wxDefaultSize, 1069 - MainFrame->GetCharsetsLen(), 1070 - MainFrame->GetCharsetsNames(), 1071 - wxLB_SINGLE); 1072 - charsetCtrl-> 1073 - SetFont(wxFont 1074 - (8, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL)); 1075 - int idSel = MainFrame->GetCharsetIndex(Default); 1076 - if (idSel != wxNOT_FOUND) 1077 - charsetCtrl->SetSelection(idSel); 1078 - charsetSizer->Add(charsetCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 1656 + wxBoxSizer *topSizer = new wxBoxSizer (wxVERTICAL); 1657 + this->SetSizer (topSizer); 1658 + wxBoxSizer *boxSizer = new wxBoxSizer (wxVERTICAL); 1659 + topSizer->Add (boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1660 +// First row: SEARCH string 1661 + wxBoxSizer *searchSizer = new wxBoxSizer (wxHORIZONTAL); 1662 + boxSizer->Add (searchSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1663 + wxStaticText *searchLabel = 1664 + new wxStaticText (this, wxID_STATIC, wxT ("&Search:")); 1665 + searchSizer->Add (searchLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1666 + wxTextCtrl *searchCtrl = new wxTextCtrl (this, ID_SEARCH, wxT (""), 1667 + wxDefaultPosition, wxSize (150, 1668 + 22)); 1669 + searchSizer->Add (searchCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 1079 1670 // OK - CANCEL buttons 1080 - wxBoxSizer *okCancelBox = new wxBoxSizer(wxHORIZONTAL); 1081 - boxSizer->Add(okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 1082 - wxButton *ok = new wxButton(this, wxID_OK, wxT("&OK")); 1083 - okCancelBox->Add(ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1084 - wxButton *cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel")); 1085 - okCancelBox->Add(cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1671 + wxBoxSizer *okCancelBox = new wxBoxSizer (wxHORIZONTAL); 1672 + boxSizer->Add (okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 1673 + wxButton *ok = new wxButton (this, wxID_OK, wxT ("&OK")); 1674 + okCancelBox->Add (ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1675 + wxButton *cancel = new wxButton (this, wxID_CANCEL, wxT ("&Cancel")); 1676 + okCancelBox->Add (cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1086 1677 // appends event handler for OK button 1087 - Connect(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 1088 - (wxObjectEventFunction) & DumpTxtDialog::OnOk); 1678 + Connect (wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 1679 + (wxObjectEventFunction) & SearchSridDialog::OnOk); 1089 1680 } 1090 1681 1091 -void DumpTxtDialog::OnOk(wxCommandEvent & event) 1092 -{ 1093 -// 1094 -// all done: 1095 -// 1096 - wxListBox *charsetCtrl = (wxListBox *) FindWindow(ID_DMPTXT_CHARSET); 1097 - int idSel = charsetCtrl->GetSelection(); 1098 - if (idSel == wxNOT_FOUND) 1099 - { 1100 - wxMessageBox(wxT("you must select some Charset Encoding from the list"), 1101 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 1102 - return; 1103 - } 1104 - wxString *charsets = MainFrame->GetCharsets(); 1105 - Charset = *(charsets + idSel); 1106 - wxDialog::EndModal(wxID_OK); 1107 -} 1108 - 1109 -bool SqlScriptDialog::Create(MyFrame * parent, wxString & path, 1110 - wxString & defCs) 1111 -{ 1112 -// 1113 -// creating the dialog 1114 -// 1115 - MainFrame = parent; 1116 - Path = path; 1117 - Default = defCs; 1118 - if (wxDialog::Create(parent, wxID_ANY, wxT("SQL script execute")) == false) 1119 - return false; 1120 -// populates individual controls 1121 - CreateControls(); 1122 -// sets dialog sizer 1123 - GetSizer()->Fit(this); 1124 - GetSizer()->SetSizeHints(this); 1125 -// centers the dialog window 1126 - Centre(); 1127 - return true; 1128 -} 1129 - 1130 -void SqlScriptDialog::CreateControls() 1131 -{ 1132 -// 1133 -// creating individual control and setting initial values 1134 -// 1135 - wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); 1136 - this->SetSizer(topSizer); 1137 - wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL); 1138 - topSizer->Add(boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1139 -// first row: the SQL script path 1140 - wxBoxSizer *pathSizer = new wxBoxSizer(wxHORIZONTAL); 1141 - boxSizer->Add(pathSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1142 - wxStaticText *pathLabel = new wxStaticText(this, wxID_STATIC, wxT("&Path:")); 1143 - pathSizer->Add(pathLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1144 - wxTextCtrl *pathValue = new wxTextCtrl(this, wxID_STATIC, 1145 - Path, wxDefaultPosition, 1146 - wxSize(350, 22), wxTE_READONLY); 1147 - pathSizer->Add(pathValue, 0, wxALIGN_RIGHT | wxALL, 5); 1148 -// second row: CHARSET 1149 - wxBoxSizer *csSizer = new wxBoxSizer(wxHORIZONTAL); 1150 - boxSizer->Add(csSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 1151 - wxStaticBox *charsetBox = new wxStaticBox(this, wxID_STATIC, 1152 - wxT("Charset Encoding"), 1153 - wxDefaultPosition, 1154 - wxDefaultSize); 1155 - wxBoxSizer *charsetSizer = new wxStaticBoxSizer(charsetBox, wxHORIZONTAL); 1156 - csSizer->Add(charsetSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1157 - wxListBox *charsetCtrl = new wxListBox(this, ID_SCRIPT_CHARSET, 1158 - wxDefaultPosition, wxDefaultSize, 1159 - MainFrame->GetCharsetsLen(), 1160 - MainFrame->GetCharsetsNames(), 1161 - wxLB_SINGLE); 1162 - charsetCtrl-> 1163 - SetFont(wxFont 1164 - (8, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL)); 1165 - int idSel = MainFrame->GetCharsetIndex(Default); 1166 - if (idSel != wxNOT_FOUND) 1167 - charsetCtrl->SetSelection(idSel); 1168 - charsetSizer->Add(charsetCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 1169 -// OK - CANCEL buttons 1170 - wxBoxSizer *okCancelBox = new wxBoxSizer(wxHORIZONTAL); 1171 - boxSizer->Add(okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 1172 - wxButton *ok = new wxButton(this, wxID_OK, wxT("&OK")); 1173 - okCancelBox->Add(ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1174 - wxButton *cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel")); 1175 - okCancelBox->Add(cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1176 -// appends event handler for OK button 1177 - Connect(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 1178 - (wxObjectEventFunction) & SqlScriptDialog::OnOk); 1179 -} 1180 - 1181 -void SqlScriptDialog::OnOk(wxCommandEvent & event) 1182 -{ 1183 -// 1184 -// all done: 1185 -// 1186 - wxListBox *charsetCtrl = (wxListBox *) FindWindow(ID_SCRIPT_CHARSET); 1187 - int idSel = charsetCtrl->GetSelection(); 1188 - if (idSel == wxNOT_FOUND) 1189 - { 1190 - wxMessageBox(wxT("you must select some Charset Encoding from the list"), 1191 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 1192 - return; 1193 - } 1194 - wxString *charsets = MainFrame->GetCharsets(); 1195 - Charset = *(charsets + idSel); 1196 - wxDialog::EndModal(wxID_OK); 1197 -} 1198 - 1199 -bool DefaultCharsetDialog::Create(MyFrame * parent, wxString & charset, 1200 - bool ask) 1201 -{ 1202 -// 1203 -// creating the dialog 1204 -// 1205 - MainFrame = parent; 1206 - Charset = charset; 1207 - AskCharset = ask; 1208 - if (wxDialog::Create(parent, wxID_ANY, wxT("Charset settings")) == false) 1209 - return false; 1210 -// populates individual controls 1211 - CreateControls(); 1212 -// sets dialog sizer 1213 - GetSizer()->Fit(this); 1214 - GetSizer()->SetSizeHints(this); 1215 -// centers the dialog window 1216 - Centre(); 1217 - return true; 1218 -} 1219 - 1220 -void DefaultCharsetDialog::CreateControls() 1221 -{ 1222 -// 1223 -// creating individual control and setting initial values 1224 -// 1225 - wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); 1226 - this->SetSizer(topSizer); 1227 - wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL); 1228 - topSizer->Add(boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1229 -// first row: the DEFAULT CHARSET 1230 - wxBoxSizer *csSizer = new wxBoxSizer(wxHORIZONTAL); 1231 - boxSizer->Add(csSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1232 - wxStaticBox *charsetBox = new wxStaticBox(this, wxID_STATIC, 1233 - wxT("Default Output Charset"), 1234 - wxDefaultPosition, 1235 - wxDefaultSize); 1236 - wxBoxSizer *charsetSizer = new wxStaticBoxSizer(charsetBox, wxVERTICAL); 1237 - csSizer->Add(charsetSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1238 - wxListBox *charsetCtrl = new wxListBox(this, ID_DFLT_CHARSET, 1239 - wxDefaultPosition, wxDefaultSize, 1240 - MainFrame->GetCharsetsLen(), 1241 - MainFrame->GetCharsetsNames(), 1242 - wxLB_SINGLE); 1243 - charsetCtrl-> 1244 - SetFont(wxFont 1245 - (8, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL)); 1246 - int idSel = MainFrame->GetCharsetIndex(Charset); 1247 - if (idSel != wxNOT_FOUND) 1248 - charsetCtrl->SetSelection(idSel); 1249 - charsetSizer->Add(charsetCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 1250 -// second row: the ASK CHARSET 1251 - wxBoxSizer *askSizer = new wxBoxSizer(wxHORIZONTAL); 1252 - charsetSizer->Add(askSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 1253 - wxCheckBox *askCtrl = new wxCheckBox(this, ID_DFLT_ASK, 1254 - wxT("Ask output charset every time"), 1255 - wxDefaultPosition, wxDefaultSize); 1256 - askCtrl->SetValue(AskCharset); 1257 - askSizer->Add(askCtrl, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1258 -// OK - CANCEL buttons 1259 - wxBoxSizer *okCancelBox = new wxBoxSizer(wxHORIZONTAL); 1260 - boxSizer->Add(okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 1261 - wxButton *ok = new wxButton(this, wxID_OK, wxT("&OK")); 1262 - okCancelBox->Add(ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1263 - wxButton *cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel")); 1264 - okCancelBox->Add(cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1265 -// appends event handler for OK button 1266 - Connect(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 1267 - (wxObjectEventFunction) & DefaultCharsetDialog::OnOk); 1268 -} 1269 - 1270 -void DefaultCharsetDialog::OnOk(wxCommandEvent & event) 1682 +void 1683 +SearchSridDialog::OnOk (wxCommandEvent & event) 1271 1684 { 1272 1685 // 1273 1686 // all done: 1274 1687 // 1275 - wxListBox *charsetCtrl = (wxListBox *) FindWindow(ID_DFLT_CHARSET); 1276 - int idSel = charsetCtrl->GetSelection(); 1277 - if (idSel == wxNOT_FOUND) 1278 - { 1279 - wxMessageBox(wxT 1280 - ("you must select some Default Charset Encoding from the list"), 1281 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 1282 - return; 1283 - } 1284 - wxString *charsets = MainFrame->GetCharsets(); 1285 - Charset = *(charsets + idSel); 1286 - wxCheckBox *askCtrl = (wxCheckBox *) FindWindow(ID_DFLT_ASK); 1287 - AskCharset = askCtrl->GetValue(); 1288 - wxDialog::EndModal(wxID_OK); 1688 + wxTextCtrl *searchCtrl = (wxTextCtrl *) FindWindow (ID_SEARCH); 1689 + String = searchCtrl->GetValue (); 1690 + if (String.Len () < 1) 1691 + { 1692 + wxMessageBox (wxT ("You must specify a string to search for !!!"), 1693 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 1694 + return; 1695 + } 1696 + wxDialog::EndModal (wxID_OK); 1289 1697 } 1290 1698 1291 -bool RecoverDialog::Create(MyFrame * parent, wxString & table, 1292 - wxString & column) 1699 +bool 1700 +HelpDialog::Create (MyFrame * parent) 1293 1701 { 1294 1702 // 1295 1703 // creating the dialog 1296 1704 // 1297 - MainFrame = parent; 1298 - Table = table; 1299 - Column = column; 1300 - Srid = -1; 1301 - if (wxDialog::Create(parent, wxID_ANY, wxT("Recover Geometry Column")) == 1302 - false) 1303 - return false; 1705 + MainFrame = parent; 1706 + if (wxDialog::Create (parent, wxID_ANY, wxT ("SQLite + SpatiaLite help")) == 1707 + false) 1708 + return false; 1304 1709 // populates individual controls 1305 - CreateControls(); 1710 + CreateControls (); 1306 1711 // sets dialog sizer 1307 - GetSizer()->Fit(this); 1308 - GetSizer()->SetSizeHints(this); 1712 + GetSizer ()->Fit (this); 1713 + GetSizer ()->SetSizeHints (this); 1309 1714 // centers the dialog window 1310 - Centre(); 1311 - return true; 1715 + MainFrame->OpenHelpPane (); 1716 + Centre (); 1717 +// setting up an event handler [dialog closing] 1718 + Connect (wxID_ANY, wxEVT_CLOSE_WINDOW, 1719 + (wxObjectEventFunction) & HelpDialog::OnClose); 1720 + return true; 1312 1721 } 1313 1722 1314 -void RecoverDialog::CreateControls() 1723 +void 1724 +HelpDialog::OnClose (wxCloseEvent & event) 1315 1725 { 1316 1726 // 1317 -// creating individual control and setting initial values 1727 +// this window has been closed 1318 1728 // 1319 - wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); 1320 - this->SetSizer(topSizer); 1321 - wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL); 1322 - topSizer->Add(boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1323 -// First row: TABLE name 1324 - wxBoxSizer *tableSizer = new wxBoxSizer(wxHORIZONTAL); 1325 - boxSizer->Add(tableSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1326 - wxStaticText *tableLabel = 1327 - new wxStaticText(this, wxID_STATIC, wxT("&Table name:")); 1328 - tableSizer->Add(tableLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1329 - wxTextCtrl *tableCtrl = new wxTextCtrl(this, wxID_ANY, Table, 1330 - wxDefaultPosition, wxSize(350, 22), 1331 - wxTE_READONLY); 1332 - tableCtrl->Enable(false); 1333 - tableSizer->Add(tableCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 1334 -// second row: GEOMETRY COLUMN name 1335 - wxBoxSizer *colSizer = new wxBoxSizer(wxHORIZONTAL); 1336 - boxSizer->Add(colSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1337 - wxStaticText *colLabel = 1338 - new wxStaticText(this, wxID_STATIC, wxT("&Column name:")); 1339 - colSizer->Add(colLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1340 - wxTextCtrl *colCtrl = new wxTextCtrl(this, wxID_ANY, Column, 1341 - wxDefaultPosition, wxSize(350, 22), 1342 - wxTE_READONLY); 1343 - colCtrl->Enable(false); 1344 - colSizer->Add(colCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 1345 -// third row: SRID 1346 - wxBoxSizer *sridSizer = new wxBoxSizer(wxHORIZONTAL); 1347 - boxSizer->Add(sridSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 1348 - wxStaticText *sridLabel = new wxStaticText(this, wxID_STATIC, wxT("&SRID:")); 1349 - sridSizer->Add(sridLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1350 - wxSpinCtrl *sridCtrl = new wxSpinCtrl(this, ID_RCVR_SRID, wxEmptyString, 1351 - wxDefaultPosition, wxSize(80, 20), 1352 - wxSP_ARROW_KEYS, 1353 - -1, 40000, Srid); 1354 - sridSizer->Add(sridCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1355 -// fourth row: GEOMETRY TYPE 1356 - wxStaticBox *typeBox = new wxStaticBox(this, wxID_STATIC, 1357 - wxT("Geometry Type"), 1358 - wxDefaultPosition, wxDefaultSize); 1359 - wxBoxSizer *typeSizer = new wxStaticBoxSizer(typeBox, wxHORIZONTAL); 1360 - sridSizer->Add(typeSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1361 - wxString types[7]; 1362 - types[0] = wxT("POINT"); 1363 - types[1] = wxT("MULTIPOINT"); 1364 - types[2] = wxT("LINESTRING"); 1365 - types[3] = wxT("MULTILINESTRING"); 1366 - types[4] = wxT("POLYGON"); 1367 - types[5] = wxT("MULTIPOLYGON"); 1368 - types[6] = wxT("GEOMETRYCOLLECTION"); 1369 - wxListBox *geomType = new wxListBox(this, ID_RCVR_TYPE, 1370 - wxDefaultPosition, wxDefaultSize, 7, 1371 - types, wxLB_SINGLE); 1372 - typeSizer->Add(geomType, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 1373 -// OK - CANCEL buttons 1374 - wxBoxSizer *okCancelBox = new wxBoxSizer(wxHORIZONTAL); 1375 - boxSizer->Add(okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 1376 - wxButton *ok = new wxButton(this, wxID_OK, wxT("&OK")); 1377 - okCancelBox->Add(ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1378 - wxButton *cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel")); 1379 - okCancelBox->Add(cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1380 -// appends event handler for OK button 1381 - Connect(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 1382 - (wxObjectEventFunction) & RecoverDialog::OnOk); 1729 + MainFrame->CloseHelpPane (); 1730 + Destroy (); 1383 1731 } 1384 1732 1385 -void RecoverDialog::OnOk(wxCommandEvent & event) 1386 -{ 1387 -// 1388 -// all done: 1389 -// 1390 - wxSpinCtrl *sridCtrl = (wxSpinCtrl *) FindWindow(ID_RCVR_SRID); 1391 - wxListBox *geomType = (wxListBox *) FindWindow(ID_RCVR_TYPE); 1392 - Srid = sridCtrl->GetValue(); 1393 - if (MainFrame->SridNotExists(Srid) == true) 1394 - { 1395 - wxMessageBox(wxT("invalid SRID value"), wxT("spatialite-gui"), 1396 - wxOK | wxICON_WARNING, this); 1397 - return; 1398 - } 1399 - Type = geomType->GetStringSelection(); 1400 - if (Type.Len() < 1) 1401 - { 1402 - wxMessageBox(wxT("you must select some Geometry Type from the list"), 1403 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 1404 - return; 1405 - } 1406 - wxDialog::EndModal(wxID_OK); 1407 -} 1408 - 1409 -bool SetSridDialog::Create(MyFrame * parent, wxString & table, 1410 - wxString & column) 1411 -{ 1412 -// 1413 -// creating the dialog 1414 -// 1415 - MainFrame = parent; 1416 - Table = table; 1417 - Column = column; 1418 - OldSrid = -1; 1419 - Srid = -1; 1420 - if (wxDialog::Create(parent, wxID_ANY, wxT("Changing SRID")) == false) 1421 - return false; 1422 -// populates individual controls 1423 - CreateControls(); 1424 -// sets dialog sizer 1425 - GetSizer()->Fit(this); 1426 - GetSizer()->SetSizeHints(this); 1427 -// centers the dialog window 1428 - Centre(); 1429 - return true; 1430 -} 1431 - 1432 -void SetSridDialog::CreateControls() 1733 +void 1734 +HelpDialog::CreateControls () 1433 1735 { 1434 1736 // 1435 1737 // creating individual control and setting initial values 1436 1738 // 1437 - wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); 1438 - this->SetSizer(topSizer); 1439 - wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL); 1440 - topSizer->Add(boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1441 -// First row: TABLE name 1442 - wxBoxSizer *tableSizer = new wxBoxSizer(wxHORIZONTAL); 1443 - boxSizer->Add(tableSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1444 - wxStaticText *tableLabel = 1445 - new wxStaticText(this, wxID_STATIC, wxT("&Table name:")); 1446 - tableSizer->Add(tableLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1447 - wxTextCtrl *tableCtrl = new wxTextCtrl(this, wxID_ANY, Table, 1448 - wxDefaultPosition, wxSize(350, 22), 1449 - wxTE_READONLY); 1450 - tableCtrl->Enable(false); 1451 - tableSizer->Add(tableCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 1452 -// second row: GEOMETRY COLUMN name 1453 - wxBoxSizer *colSizer = new wxBoxSizer(wxHORIZONTAL); 1454 - boxSizer->Add(colSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1455 - wxStaticText *colLabel = 1456 - new wxStaticText(this, wxID_STATIC, wxT("&Column name:")); 1457 - colSizer->Add(colLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1458 - wxTextCtrl *colCtrl = new wxTextCtrl(this, wxID_ANY, Column, 1459 - wxDefaultPosition, wxSize(350, 22), 1460 - wxTE_READONLY); 1461 - colCtrl->Enable(false); 1462 - colSizer->Add(colCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 1463 -// third row: SRID 1464 - wxBoxSizer *mySizer = new wxBoxSizer(wxHORIZONTAL); 1465 - boxSizer->Add(mySizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 1466 - wxBoxSizer *oldSridSizer = new wxBoxSizer(wxHORIZONTAL); 1467 - mySizer->Add(oldSridSizer, 0, wxALIGN_LEFT | wxALL, 0); 1468 - wxStaticText *oldSridLabel = 1469 - new wxStaticText(this, wxID_STATIC, wxT("&old SRID:")); 1470 - oldSridSizer->Add(oldSridLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1471 - wxSpinCtrl *oldSridCtrl = new wxSpinCtrl(this, ID_SRID_OLD, wxEmptyString, 1472 - wxDefaultPosition, wxSize(80, 1473 - 20), 1474 - wxSP_ARROW_KEYS, 1475 - -1, 40000, OldSrid); 1476 - oldSridSizer->Add(oldSridCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1477 -// fourth row: SRID 1478 - wxBoxSizer *sridSizer = new wxBoxSizer(wxHORIZONTAL); 1479 - mySizer->Add(sridSizer, 0, wxALIGN_RIGHT | wxLEFT, 20); 1480 - wxStaticText *sridLabel = 1481 - new wxStaticText(this, wxID_STATIC, wxT("&new SRID:")); 1482 - sridSizer->Add(sridLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1483 - wxSpinCtrl *sridCtrl = new wxSpinCtrl(this, ID_SRID_SRID, wxEmptyString, 1484 - wxDefaultPosition, wxSize(80, 20), 1485 - wxSP_ARROW_KEYS, 1486 - -1, 40000, Srid); 1487 - sridSizer->Add(sridCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1488 -// OK - CANCEL buttons 1489 - wxBoxSizer *okCancelBox = new wxBoxSizer(wxHORIZONTAL); 1490 - boxSizer->Add(okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 1491 - wxButton *ok = new wxButton(this, wxID_OK, wxT("&OK")); 1492 - okCancelBox->Add(ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1493 - wxButton *cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel")); 1494 - okCancelBox->Add(cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1495 -// appends event handler for OK button 1496 - Connect(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 1497 - (wxObjectEventFunction) & SetSridDialog::OnOk); 1498 -} 1499 - 1500 -void SetSridDialog::OnOk(wxCommandEvent & event) 1501 -{ 1502 -// 1503 -// all done: 1504 -// 1505 - wxSpinCtrl *oldSridCtrl = (wxSpinCtrl *) FindWindow(ID_SRID_OLD); 1506 - wxSpinCtrl *sridCtrl = (wxSpinCtrl *) FindWindow(ID_SRID_SRID); 1507 - OldSrid = oldSridCtrl->GetValue(); 1508 - Srid = sridCtrl->GetValue(); 1509 - wxDialog::EndModal(wxID_OK); 1510 -} 1511 - 1512 -bool SearchSridDialog::Create(MyFrame * parent) 1513 -{ 1514 -// 1515 -// creating the dialog 1516 -// 1517 - MainFrame = parent; 1518 - if (wxDialog::Create(parent, wxID_ANY, wxT("Searching a SRID by its name")) == 1519 - false) 1520 - return false; 1521 -// populates individual controls 1522 - CreateControls(); 1523 -// sets dialog sizer 1524 - GetSizer()->Fit(this); 1525 - GetSizer()->SetSizeHints(this); 1526 -// centers the dialog window 1527 - Centre(); 1528 - return true; 1529 -} 1530 - 1531 -void SearchSridDialog::CreateControls() 1532 -{ 1533 -// 1534 -// creating individual control and setting initial values 1535 -// 1536 - wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); 1537 - this->SetSizer(topSizer); 1538 - wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL); 1539 - topSizer->Add(boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1540 -// First row: SEARCH string 1541 - wxBoxSizer *searchSizer = new wxBoxSizer(wxHORIZONTAL); 1542 - boxSizer->Add(searchSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1543 - wxStaticText *searchLabel = 1544 - new wxStaticText(this, wxID_STATIC, wxT("&Search:")); 1545 - searchSizer->Add(searchLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1546 - wxTextCtrl *searchCtrl = new wxTextCtrl(this, ID_SEARCH, wxT(""), 1547 - wxDefaultPosition, wxSize(150, 1548 - 22)); 1549 - searchSizer->Add(searchCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 1550 -// OK - CANCEL buttons 1551 - wxBoxSizer *okCancelBox = new wxBoxSizer(wxHORIZONTAL); 1552 - boxSizer->Add(okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 1553 - wxButton *ok = new wxButton(this, wxID_OK, wxT("&OK")); 1554 - okCancelBox->Add(ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1555 - wxButton *cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel")); 1556 - okCancelBox->Add(cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1557 -// appends event handler for OK button 1558 - Connect(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 1559 - (wxObjectEventFunction) & SearchSridDialog::OnOk); 1560 -} 1561 - 1562 -void SearchSridDialog::OnOk(wxCommandEvent & event) 1563 -{ 1564 -// 1565 -// all done: 1566 -// 1567 - wxTextCtrl *searchCtrl = (wxTextCtrl *) FindWindow(ID_SEARCH); 1568 - String = searchCtrl->GetValue(); 1569 - if (String.Len() < 1) 1570 - { 1571 - wxMessageBox(wxT("You must specify a string to search for !!!"), 1572 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 1573 - return; 1574 - } 1575 - wxDialog::EndModal(wxID_OK); 1576 -} 1577 - 1578 -bool HelpDialog::Create(MyFrame * parent) 1579 -{ 1580 -// 1581 -// creating the dialog 1582 -// 1583 - MainFrame = parent; 1584 - if (wxDialog::Create(parent, wxID_ANY, wxT("SQLite + SpatiaLite help"), 1585 - wxDefaultPosition, wxDefaultSize, 1586 - wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) == false) 1587 - return false; 1588 -// populates individual controls 1589 - CreateControls(); 1590 -// sets dialog sizer 1591 - GetSizer()->Fit(this); 1592 - GetSizer()->SetSizeHints(this); 1593 -// centers the dialog window 1594 - MainFrame->OpenHelpPane(); 1595 - Centre(); 1596 -// setting up an event handler [dialog closing] 1597 - Connect(wxID_ANY, wxEVT_CLOSE_WINDOW, 1598 - (wxObjectEventFunction) & HelpDialog::OnClose); 1599 - return true; 1600 -} 1601 - 1602 -void HelpDialog::OnClose(wxCloseEvent & event) 1603 -{ 1604 -// 1605 -// this window has been closed 1606 -// 1607 - MainFrame->CloseHelpPane(); 1608 - Destroy(); 1609 -} 1610 - 1611 -void HelpDialog::CreateControls() 1612 -{ 1613 -// 1614 -// creating individual control and setting initial values 1615 -// 1616 - wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); 1617 - this->SetSizer(topSizer); 1618 - wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL); 1619 - topSizer->Add(boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1620 - wxHtmlWindow *helpWin = new wxHtmlWindow(this, ID_HELP_HTML, 1621 - wxDefaultPosition, wxSize(400, 1622 - 200)); 1623 - wxString html; 1624 - MainFrame->GetHelp(html); 1625 - helpWin->SetPage(html); 1626 - topSizer->Add(helpWin, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1627 - Connect(wxID_ANY, wxEVT_SIZE, (wxObjectEventFunction) & HelpDialog::OnSize); 1628 -} 1629 - 1630 -void HelpDialog::OnSize(wxSizeEvent & event) 1631 -{ 1632 -// 1633 -// this window has changed its size 1634 -// 1635 - wxSize sz = GetClientSize(); 1636 - wxHtmlWindow *helpWin = (wxHtmlWindow *) FindWindow(ID_HELP_HTML); 1637 - helpWin->SetSize(sz.GetWidth() - 6, sz.GetHeight() - 6); 1638 -} 1639 - 1640 -bool NetworkDialog::Create(MyFrame * parent) 1641 -{ 1642 -// 1643 -// creating the dialog 1644 -// 1645 - MainFrame = parent; 1646 - FromColumn = wxT(""); 1647 - ToColumn = wxT(""); 1648 - GeomColumn = wxT(""); 1649 - GeomLength = true; 1650 - CostColumn = wxT(""); 1651 - Bidirectional = true; 1652 - OneWays = false; 1653 - OneWayFromTo = wxT(""); 1654 - OneWayToFrom = wxT(""); 1655 - if (wxDialog::Create(parent, wxID_ANY, wxT("Build Network")) == false) 1656 - return false; 1657 -// populates individual controls 1658 - CreateControls(); 1659 -// sets dialog sizer 1660 - GetSizer()->Fit(this); 1661 - GetSizer()->SetSizeHints(this); 1662 -// centers the dialog window 1663 - Centre(); 1664 - return true; 1665 -} 1666 - 1667 -void NetworkDialog::CreateControls() 1668 -{ 1669 -// 1670 -// creating individual control and setting initial values 1671 -// 1672 - wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); 1673 - this->SetSizer(topSizer); 1674 - wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL); 1675 - topSizer->Add(boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1676 - wxBoxSizer *row0Sizer = new wxBoxSizer(wxHORIZONTAL); 1677 - boxSizer->Add(row0Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1678 -// first row: first column: the Main TABLE 1679 - wxBoxSizer *tableSizer = new wxBoxSizer(wxHORIZONTAL); 1680 - row0Sizer->Add(tableSizer, 0, wxALIGN_CENTRE_VERTICAL | wxALL, 0); 1681 - wxStaticBox *tableBox = new wxStaticBox(this, wxID_STATIC, 1682 - wxT("Base Table [graph]"), 1683 - wxDefaultPosition, 1684 - wxDefaultSize); 1685 - wxBoxSizer *tableNameSizer = new wxStaticBoxSizer(tableBox, wxVERTICAL); 1686 - tableSizer->Add(tableNameSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1687 - int nTables; 1688 - wxString *tables = MainFrame->GetTables(&nTables); 1689 - wxListBox *tableCtrl = new wxListBox(this, ID_NET_TABLE, 1690 - wxDefaultPosition, wxDefaultSize, 1691 - nTables, tables, wxLB_SINGLE); 1692 - delete[]tables; 1693 - tableNameSizer->Add(tableCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 1694 - wxSize size = tableCtrl->GetSize(); 1695 - size.SetHeight(size.GetHeight() / 2); 1696 -// first row: second column: the NodeFrom COLUMN 1697 - wxBoxSizer *netSizer = new wxBoxSizer(wxHORIZONTAL); 1698 - row0Sizer->Add(netSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1699 - wxStaticBox *netBox = new wxStaticBox(this, wxID_STATIC, 1700 - wxT("Network configuration"), 1701 - wxDefaultPosition, 1702 - wxDefaultSize); 1703 - wxBoxSizer *colSizer = new wxStaticBoxSizer(netBox, wxVERTICAL); 1704 - netSizer->Add(colSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1705 - wxBoxSizer *row1Sizer = new wxBoxSizer(wxHORIZONTAL); 1706 - colSizer->Add(row1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1707 - wxBoxSizer *fromSizer = new wxBoxSizer(wxHORIZONTAL); 1708 - row1Sizer->Add(fromSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1709 - wxStaticBox *fromBox = new wxStaticBox(this, wxID_STATIC, 1710 - wxT("NodeFrom Column"), 1711 - wxDefaultPosition, 1712 - wxDefaultSize); 1713 - wxBoxSizer *fromColSizer = new wxStaticBoxSizer(fromBox, wxVERTICAL); 1714 - fromSizer->Add(fromColSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1715 - wxListBox *fromCtrl = new wxListBox(this, ID_NET_FROM, 1716 - wxDefaultPosition, size, 1717 - 0, NULL, wxLB_SINGLE); 1718 - fromCtrl->Enable(false); 1719 - fromColSizer->Add(fromCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 1720 -// first row: third column: the NodeTo COLUMN 1721 - wxBoxSizer *toSizer = new wxBoxSizer(wxHORIZONTAL); 1722 - row1Sizer->Add(toSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1723 - wxStaticBox *toBox = new wxStaticBox(this, wxID_STATIC, 1724 - wxT("NodeTo Column"), 1725 - wxDefaultPosition, 1726 - wxDefaultSize); 1727 - wxBoxSizer *toColSizer = new wxStaticBoxSizer(toBox, wxVERTICAL); 1728 - toSizer->Add(toColSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1729 - wxListBox *toCtrl = new wxListBox(this, ID_NET_TO, 1730 - wxDefaultPosition, size, 1731 - 0, NULL, wxLB_SINGLE); 1732 - toCtrl->Enable(false); 1733 - toColSizer->Add(toCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 1734 -// first row: fourth column: the Geometry COLUMN 1735 - wxBoxSizer *geoSizer = new wxBoxSizer(wxHORIZONTAL); 1736 - row1Sizer->Add(geoSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1737 - wxStaticBox *geoBox = new wxStaticBox(this, wxID_STATIC, 1738 - wxT("Geometry Column"), 1739 - wxDefaultPosition, 1740 - wxDefaultSize); 1741 - wxBoxSizer *geoColSizer = new wxStaticBoxSizer(geoBox, wxVERTICAL); 1742 - toSizer->Add(geoColSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1743 - wxListBox *geoCtrl = new wxListBox(this, ID_NET_GEOM, 1744 - wxDefaultPosition, size, 1745 - 0, NULL, wxLB_SINGLE); 1746 - geoCtrl->Enable(false); 1747 - geoColSizer->Add(geoCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 1748 -// second row: first column: UNIDIRECTIONAL / BIDIRECTIONAL 1749 - wxBoxSizer *row2Sizer = new wxBoxSizer(wxHORIZONTAL); 1750 - colSizer->Add(row2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1751 - wxString dirs[2]; 1752 - dirs[0] = wxT("&Uni-Directional"); 1753 - dirs[1] = wxT("&Bi-Directional"); 1754 - wxRadioBox *dirSel = new wxRadioBox(this, ID_NET_BIDIR, 1755 - wxT("&Arc connections"), 1756 - wxDefaultPosition, 1757 - wxDefaultSize, 2, 1758 - dirs, 2, 1759 - wxRA_SPECIFY_ROWS); 1760 - dirSel->SetSelection(1); 1761 - dirSel->Enable(false); 1762 - row2Sizer->Add(dirSel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 1763 -// second row: second column: the COST is GLenth selection 1764 - wxString costs[2]; 1765 - costs[0] = wxT("&Using GLength(Geometry) as Cost"); 1766 - costs[1] = wxT("&Using Cost Column"); 1767 - wxRadioBox *costSel = new wxRadioBox(this, ID_NET_LENGTH, 1768 - wxT("&Cost type"), 1769 - wxDefaultPosition, 1770 - wxDefaultSize, 2, 1771 - costs, 2, 1772 - wxRA_SPECIFY_ROWS); 1773 - costSel->SetSelection(0); 1774 - costSel->Enable(false); 1775 - row2Sizer->Add(costSel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1776 -// second row: third column: the COST COLUMN 1777 - wxBoxSizer *costSizer = new wxBoxSizer(wxHORIZONTAL); 1778 - row2Sizer->Add(costSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1779 - wxStaticBox *costBox = new wxStaticBox(this, wxID_STATIC, 1780 - wxT("Cost Column"), 1781 - wxDefaultPosition, 1782 - wxDefaultSize); 1783 - wxBoxSizer *costColSizer = new wxStaticBoxSizer(costBox, wxVERTICAL); 1784 - costSizer->Add(costColSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1785 - wxListBox *costCtrl = new wxListBox(this, ID_NET_COST, 1786 - wxDefaultPosition, size, 1787 - 0, NULL, wxLB_SINGLE); 1788 - costCtrl->Enable(false); 1789 - costColSizer->Add(costCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1790 -// third row: second column: the OneWay Selection 1791 - wxBoxSizer *row3Sizer = new wxBoxSizer(wxHORIZONTAL); 1792 - colSizer->Add(row3Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1793 - wxString oneWays[2]; 1794 - oneWays[0] = wxT("&Not using OneWay Columns"); 1795 - oneWays[1] = wxT("&Using OneWay Columns"); 1796 - wxRadioBox *oneWaySel = new wxRadioBox(this, ID_NET_ONEWAY, 1797 - wxT("&OneWays"), 1798 - wxDefaultPosition, 1799 - wxDefaultSize, 2, 1800 - oneWays, 2, 1801 - wxRA_SPECIFY_ROWS); 1802 - oneWaySel->SetSelection(0); 1803 - oneWaySel->Enable(false); 1804 - row3Sizer->Add(oneWaySel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1805 -// third row: second column: the OneWay FromTo COLUMN 1806 - wxBoxSizer *fromToSizer = new wxBoxSizer(wxHORIZONTAL); 1807 - row3Sizer->Add(fromToSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1808 - wxStaticBox *fromToBox = new wxStaticBox(this, wxID_STATIC, 1809 - wxT("From -> To Column"), 1810 - wxDefaultPosition, 1811 - wxDefaultSize); 1812 - wxBoxSizer *fromToColSizer = new wxStaticBoxSizer(fromToBox, wxVERTICAL); 1813 - fromToSizer->Add(fromToColSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1814 - wxListBox *fromToCtrl = new wxListBox(this, ID_NET_FROM_TO, 1815 - wxDefaultPosition, size, 1816 - 0, NULL, wxLB_SINGLE); 1817 - fromToCtrl->Enable(false); 1818 - fromToColSizer->Add(fromToCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 1819 -// fourth row: second column: the OneWay To From COLUMN 1820 - wxBoxSizer *toFromSizer = new wxBoxSizer(wxHORIZONTAL); 1821 - row3Sizer->Add(toFromSizer, 0, wxALIGN_RIGHT | wxALL, 0); 1822 - wxStaticBox *toFromBox = new wxStaticBox(this, wxID_STATIC, 1823 - wxT("To -> From Column"), 1824 - wxDefaultPosition, 1825 - wxDefaultSize); 1826 - wxBoxSizer *toFromColSizer = new wxStaticBoxSizer(toFromBox, wxVERTICAL); 1827 - toFromSizer->Add(toFromColSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1828 - wxListBox *toFromCtrl = new wxListBox(this, ID_NET_TO_FROM, 1829 - wxDefaultPosition, size, 1830 - 0, NULL, wxLB_SINGLE); 1831 - toFromCtrl->Enable(false); 1832 - toFromColSizer->Add(toFromCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 1833 -// OK - CANCEL buttons 1834 - wxBoxSizer *okCancelBox = new wxBoxSizer(wxHORIZONTAL); 1835 - boxSizer->Add(okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 1836 - wxButton *ok = new wxButton(this, wxID_OK, wxT("&OK")); 1837 - okCancelBox->Add(ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1838 - wxButton *cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel")); 1839 - okCancelBox->Add(cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 1840 -// appends event handler for OK button 1841 - Connect(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 1842 - (wxObjectEventFunction) & NetworkDialog::OnOk); 1843 -// appends event handlers for radio buttons etc 1844 - Connect(ID_NET_TABLE, wxEVT_COMMAND_LISTBOX_SELECTED, 1845 - (wxObjectEventFunction) & NetworkDialog::OnTable); 1846 - Connect(ID_NET_BIDIR, wxEVT_COMMAND_RADIOBOX_SELECTED, 1847 - (wxObjectEventFunction) & NetworkDialog::OnDirection); 1848 - Connect(ID_NET_LENGTH, wxEVT_COMMAND_RADIOBOX_SELECTED, 1849 - (wxObjectEventFunction) & NetworkDialog::OnCost); 1850 - Connect(ID_NET_ONEWAY, wxEVT_COMMAND_RADIOBOX_SELECTED, 1851 - (wxObjectEventFunction) & NetworkDialog::OnOneWay); 1852 -} 1853 - 1854 -void NetworkDialog::OnTable(wxCommandEvent & event) 1855 -{ 1856 -// 1857 -// TABLE selection changed 1858 -// 1859 - wxListBox *tableCtrl = (wxListBox *) FindWindow(ID_NET_TABLE); 1860 - TableName = tableCtrl->GetStringSelection(); 1861 - int n_cols; 1862 - wxString *columns = MainFrame->GetColumnNames(TableName, &n_cols); 1863 - wxListBox *fromCtrl = (wxListBox *) FindWindow(ID_NET_FROM); 1864 - fromCtrl->Clear(); 1865 - fromCtrl->InsertItems(n_cols, columns, 0); 1866 - fromCtrl->Enable(true); 1867 - wxListBox *toCtrl = (wxListBox *) FindWindow(ID_NET_TO); 1868 - toCtrl->Clear(); 1869 - toCtrl->InsertItems(n_cols, columns, 0); 1870 - toCtrl->Enable(true); 1871 - wxListBox *geomCtrl = (wxListBox *) FindWindow(ID_NET_GEOM); 1872 - geomCtrl->Clear(); 1873 - geomCtrl->InsertItems(n_cols, columns, 0); 1874 - geomCtrl->Enable(true); 1875 - wxListBox *costCtrl = (wxListBox *) FindWindow(ID_NET_COST); 1876 - costCtrl->Clear(); 1877 - costCtrl->InsertItems(n_cols, columns, 0); 1878 - costCtrl->Enable(false); 1879 - wxListBox *fromToCtrl = (wxListBox *) FindWindow(ID_NET_FROM_TO); 1880 - fromToCtrl->Clear(); 1881 - fromToCtrl->InsertItems(n_cols, columns, 0); 1882 - fromToCtrl->Enable(false); 1883 - wxListBox *toFromCtrl = (wxListBox *) FindWindow(ID_NET_TO_FROM); 1884 - toFromCtrl->Clear(); 1885 - toFromCtrl->InsertItems(n_cols, columns, 0); 1886 - toFromCtrl->Enable(false); 1887 - wxRadioBox *dirSel = (wxRadioBox *) FindWindow(ID_NET_BIDIR); 1888 - Bidirectional = true; 1889 - dirSel->SetSelection(1); 1890 - dirSel->Enable(true); 1891 - wxRadioBox *costSel = (wxRadioBox *) FindWindow(ID_NET_LENGTH); 1892 - GeomLength = true; 1893 - costSel->SetSelection(0); 1894 - costSel->Enable(true); 1895 - wxRadioBox *oneWaySel = (wxRadioBox *) FindWindow(ID_NET_ONEWAY); 1896 - OneWays = false; 1897 - oneWaySel->SetSelection(0); 1898 - oneWaySel->Enable(true); 1899 -} 1900 - 1901 -void NetworkDialog::OnDirection(wxCommandEvent & event) 1902 -{ 1903 -// 1904 -// BIDIRECTIONAL radio box 1905 -// 1906 - wxRadioBox *oneWaySel = (wxRadioBox *) FindWindow(ID_NET_ONEWAY); 1907 - wxRadioBox *dirSel = (wxRadioBox *) FindWindow(ID_NET_BIDIR); 1908 - wxListBox *fromToCtrl = (wxListBox *) FindWindow(ID_NET_FROM_TO); 1909 - wxListBox *toFromCtrl = (wxListBox *) FindWindow(ID_NET_TO_FROM); 1910 - if (Bidirectional == true) 1911 - { 1912 - Bidirectional = false; 1913 - dirSel->SetSelection(0); 1914 - OneWays = false; 1915 - oneWaySel->SetSelection(0); 1916 - oneWaySel->Enable(false); 1917 - fromToCtrl->Enable(false); 1918 - toFromCtrl->Enable(false); 1919 - } else 1920 - { 1921 - Bidirectional = true; 1922 - dirSel->SetSelection(1); 1923 - OneWays = false; 1924 - oneWaySel->SetSelection(0); 1925 - oneWaySel->Enable(true); 1926 - fromToCtrl->Enable(false); 1927 - toFromCtrl->Enable(false); 1928 - } 1929 -} 1930 - 1931 -void NetworkDialog::OnCost(wxCommandEvent & event) 1932 -{ 1933 -// 1934 -// COST radio box 1935 -// 1936 - wxRadioBox *costSel = (wxRadioBox *) FindWindow(ID_NET_LENGTH); 1937 - wxListBox *costCtrl = (wxListBox *) FindWindow(ID_NET_COST); 1938 - if (GeomLength == true) 1939 - { 1940 - GeomLength = false; 1941 - costSel->SetSelection(1); 1942 - costCtrl->Enable(true); 1943 - } else 1944 - { 1945 - GeomLength = true; 1946 - costSel->SetSelection(0); 1947 - costCtrl->Enable(false); 1948 - } 1949 -} 1950 - 1951 -void NetworkDialog::OnOneWay(wxCommandEvent & event) 1952 -{ 1953 -// 1954 -// OneWay radio box 1955 -// 1956 - wxRadioBox *oneWaySel = (wxRadioBox *) FindWindow(ID_NET_ONEWAY); 1957 - wxListBox *fromToCtrl = (wxListBox *) FindWindow(ID_NET_FROM_TO); 1958 - wxListBox *toFromCtrl = (wxListBox *) FindWindow(ID_NET_TO_FROM); 1959 - if (OneWays == true) 1960 - { 1961 - OneWays = false; 1962 - oneWaySel->SetSelection(0); 1963 - fromToCtrl->Enable(false); 1964 - toFromCtrl->Enable(false); 1965 - } else 1966 - { 1967 - OneWays = true; 1968 - oneWaySel->SetSelection(1); 1969 - fromToCtrl->Enable(true); 1970 - toFromCtrl->Enable(true); 1971 - } 1972 -} 1973 - 1974 -void NetworkDialog::OnOk(wxCommandEvent & event) 1975 -{ 1976 -// 1977 -// all done: 1978 -// 1979 - wxListBox *tableCtrl = (wxListBox *) FindWindow(ID_NET_TABLE); 1980 - TableName = tableCtrl->GetStringSelection(); 1981 - if (TableName.Len() < 1) 1982 - { 1983 - wxMessageBox(wxT("You must select some TABLE NAME !!!"), 1984 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 1985 - return; 1986 - } 1987 - wxListBox *fromCtrl = (wxListBox *) FindWindow(ID_NET_FROM); 1988 - FromColumn = fromCtrl->GetStringSelection(); 1989 - if (FromColumn.Len() < 1) 1990 - { 1991 - wxMessageBox(wxT("You must select some 'NodeFrom' COLUMN !!!"), 1992 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 1993 - return; 1994 - } 1995 - wxListBox *toCtrl = (wxListBox *) FindWindow(ID_NET_TO); 1996 - ToColumn = toCtrl->GetStringSelection(); 1997 - if (ToColumn.Len() < 1) 1998 - { 1999 - wxMessageBox(wxT("You must select some 'NodeTo' COLUMN !!!"), 2000 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 2001 - return; 2002 - } 2003 - wxListBox *geomCtrl = (wxListBox *) FindWindow(ID_NET_GEOM); 2004 - GeomColumn = geomCtrl->GetStringSelection(); 2005 - if (GeomColumn.Len() < 1) 2006 - { 2007 - wxMessageBox(wxT("You must select some 'Geometry' COLUMN !!!"), 2008 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 2009 - return; 2010 - } 2011 - if (GeomLength == true) 2012 - CostColumn = wxT(""); 2013 - else 2014 - { 2015 - wxListBox *costCtrl = (wxListBox *) FindWindow(ID_NET_COST); 2016 - CostColumn = costCtrl->GetStringSelection(); 2017 - if (CostColumn.Len() < 1) 2018 - { 2019 - wxMessageBox(wxT("You must select some 'Cost' COLUMN !!!"), 2020 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 2021 - return; 2022 - } 2023 - } 2024 - if (Bidirectional == true && OneWays == true) 2025 - { 2026 - wxListBox *fromToCtrl = (wxListBox *) FindWindow(ID_NET_FROM_TO); 2027 - OneWayFromTo = fromToCtrl->GetStringSelection(); 2028 - if (OneWayFromTo.Len() < 1) 2029 - { 2030 - wxMessageBox(wxT("You must select some 'OneWay From->To' COLUMN !!!"), 2031 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 2032 - return; 2033 - } 2034 - wxListBox *toFromCtrl = (wxListBox *) FindWindow(ID_NET_TO_FROM); 2035 - OneWayToFrom = toFromCtrl->GetStringSelection(); 2036 - if (OneWayToFrom.Len() < 1) 2037 - { 2038 - wxMessageBox(wxT("You must select some 'OneWay To->From' COLUMN !!!"), 2039 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 2040 - return; 2041 - } 2042 - } else 2043 - { 2044 - OneWayFromTo = wxT(""); 2045 - OneWayToFrom = wxT(""); 2046 - } 2047 - wxDialog::EndModal(wxID_OK); 2048 -} 2049 - 2050 -bool ExifDialog::Create(MyFrame * parent, wxString & dir_path, 2051 - wxString & img_path) 2052 -{ 2053 -// 2054 -// creating the dialog 2055 -// 2056 - MainFrame = parent; 2057 - DirPath = dir_path; 2058 - ImgPath = img_path; 2059 - Folder = false; 2060 - Metadata = true; 2061 - GpsOnly = false; 2062 - if (wxDialog::Create(parent, wxID_ANY, wxT("Import EXIF Photos")) == false) 2063 - return false; 2064 -// populates individual controls 2065 - CreateControls(); 2066 -// sets dialog sizer 2067 - GetSizer()->Fit(this); 2068 - GetSizer()->SetSizeHints(this); 2069 -// centers the dialog window 2070 - Centre(); 2071 - return true; 2072 -} 2073 - 2074 -void ExifDialog::CreateControls() 2075 -{ 2076 -// 2077 -// creating individual control and setting initial values 2078 -// 2079 - wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); 2080 - this->SetSizer(topSizer); 2081 - wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL); 2082 - topSizer->Add(boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 2083 - wxBoxSizer *row0Sizer = new wxBoxSizer(wxVERTICAL); 2084 - boxSizer->Add(row0Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 2085 -// first row: the path and file/folder selection 2086 - wxBoxSizer *pathSizer = new wxBoxSizer(wxHORIZONTAL); 2087 - row0Sizer->Add(pathSizer, 0, wxALIGN_CENTRE_VERTICAL | wxALL, 0); 2088 - wxStaticBox *pathBox = new wxStaticBox(this, wxID_STATIC, 2089 - wxT("Import from source"), 2090 - wxDefaultPosition, 2091 - wxDefaultSize); 2092 - wxBoxSizer *pthSizer = new wxStaticBoxSizer(pathBox, wxVERTICAL); 2093 - pathSizer->Add(pthSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 2094 - wxStaticText *pathLabel = new wxStaticText(this, ID_EXIF_PATH, ImgPath); 2095 - pthSizer->Add(pathLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); 2096 - wxString imgFolder[2]; 2097 - imgFolder[0] = wxT("Import &selected image only"); 2098 - imgFolder[1] = wxT("Import &any EXIF from selected folder"); 2099 - wxRadioBox *imgFolderSel = new wxRadioBox(this, ID_EXIF_FOLDER, 2100 - wxT("&Source selection"), 2101 - wxDefaultPosition, 2102 - wxDefaultSize, 2, 2103 - imgFolder, 2, 2104 - wxRA_SPECIFY_ROWS); 2105 - imgFolderSel->SetSelection(0); 2106 - pthSizer->Add(imgFolderSel, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 2107 -// second row: the metadata and gps-only selection 2108 - wxBoxSizer *modeSizer = new wxBoxSizer(wxHORIZONTAL); 2109 - boxSizer->Add(modeSizer, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 0); 2110 - wxString metadata[2]; 2111 - metadata[0] = wxT("Feed full EXIF &Metadata"); 2112 - metadata[1] = wxT("&Skip EXIF Metadata"); 2113 - wxRadioBox *metadataSel = new wxRadioBox(this, ID_EXIF_METADATA, 2114 - wxT("&EXIF Metadata tables"), 2115 - wxDefaultPosition, 2116 - wxDefaultSize, 2, 2117 - metadata, 2, 2118 - wxRA_SPECIFY_ROWS); 2119 - metadataSel->SetSelection(0); 2120 - modeSizer->Add(metadataSel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 2121 - wxString gpsOnly[2]; 2122 - gpsOnly[0] = wxT("Import any EXIF file"); 2123 - gpsOnly[1] = wxT("Import EXIF only if containing &GPS tags"); 2124 - wxRadioBox *gpsOnlySel = new wxRadioBox(this, ID_EXIF_GPS_ONLY, 2125 - wxT("&GPS position"), 2126 - wxDefaultPosition, 2127 - wxDefaultSize, 2, 2128 - gpsOnly, 2, 2129 - wxRA_SPECIFY_ROWS); 2130 - gpsOnlySel->SetSelection(0); 2131 - modeSizer->Add(gpsOnlySel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 2132 -// OK - CANCEL buttons 2133 - wxBoxSizer *okCancelBox = new wxBoxSizer(wxHORIZONTAL); 2134 - boxSizer->Add(okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 2135 - wxButton *ok = new wxButton(this, wxID_OK, wxT("&OK")); 2136 - okCancelBox->Add(ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 2137 - wxButton *cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel")); 2138 - okCancelBox->Add(cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 2139 -// appends event handler for OK button 2140 - Connect(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 2141 - (wxObjectEventFunction) & ExifDialog::OnOk); 2142 -// appends event handlers for radio buttons etc 2143 - Connect(ID_EXIF_FOLDER, wxEVT_COMMAND_RADIOBOX_SELECTED, 2144 - (wxObjectEventFunction) & ExifDialog::OnFolder); 2145 - Connect(ID_EXIF_METADATA, wxEVT_COMMAND_RADIOBOX_SELECTED, 2146 - (wxObjectEventFunction) & ExifDialog::OnMetadata); 2147 - Connect(ID_EXIF_GPS_ONLY, wxEVT_COMMAND_RADIOBOX_SELECTED, 2148 - (wxObjectEventFunction) & ExifDialog::OnGpsOnly); 2149 -} 2150 - 2151 -void ExifDialog::OnFolder(wxCommandEvent & event) 2152 -{ 2153 -// 2154 -// File/Folder radio box 2155 -// 2156 - wxRadioBox *folderSel = (wxRadioBox *) FindWindow(ID_EXIF_FOLDER); 2157 - wxStaticText *pathLabel = (wxStaticText *) FindWindow(ID_EXIF_PATH); 2158 - if (Folder == true) 2159 - { 2160 - Folder = false; 2161 - folderSel->SetSelection(0); 2162 - pathLabel->SetLabel(ImgPath); 2163 - } else 2164 - { 2165 - Folder = true; 2166 - folderSel->SetSelection(1); 2167 - pathLabel->SetLabel(DirPath); 2168 - } 2169 -} 2170 - 2171 -void ExifDialog::OnMetadata(wxCommandEvent & event) 2172 -{ 2173 -// 2174 -// Metadata radio box 2175 -// 2176 - wxRadioBox *metadataSel = (wxRadioBox *) FindWindow(ID_EXIF_METADATA); 2177 - if (Metadata == true) 2178 - { 2179 - Metadata = false; 2180 - metadataSel->SetSelection(1); 2181 - } else 2182 - { 2183 - Metadata = true; 2184 - metadataSel->SetSelection(0); 2185 - } 2186 -} 2187 - 2188 -void ExifDialog::OnGpsOnly(wxCommandEvent & event) 2189 -{ 2190 -// 2191 -// GpsOnly radio box 2192 -// 2193 - wxRadioBox *gpsOnlySel = (wxRadioBox *) FindWindow(ID_EXIF_GPS_ONLY); 2194 - if (GpsOnly == true) 2195 - { 2196 - GpsOnly = false; 2197 - gpsOnlySel->SetSelection(0); 2198 - } else 2199 - { 2200 - GpsOnly = true; 2201 - gpsOnlySel->SetSelection(1); 2202 - } 2203 -} 2204 - 2205 -void ExifDialog::OnOk(wxCommandEvent & event) 2206 -{ 2207 -// 2208 -// all done: 2209 -// 2210 - wxDialog::EndModal(wxID_OK); 2211 -} 2212 - 2213 -bool AutoSaveDialog::Create(MyFrame * parent, wxString & path, int secs) 2214 -{ 2215 -// 2216 -// creating the dialog 2217 -// 2218 - MainFrame = parent; 2219 - Path = path; 2220 - Seconds = secs; 2221 - if (wxDialog::Create(parent, wxID_ANY, wxT("MEMORY-DB AutoSave settings")) == 2222 - false) 2223 - return false; 2224 -// populates individual controls 2225 - CreateControls(); 2226 -// sets dialog sizer 2227 - GetSizer()->Fit(this); 2228 - GetSizer()->SetSizeHints(this); 2229 -// centers the dialog window 2230 - Centre(); 2231 - return true; 2232 -} 2233 - 2234 -void AutoSaveDialog::CreateControls() 2235 -{ 2236 -// 2237 -// creating individual controls and setting initial values 2238 -// 2239 - wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); 2240 - this->SetSizer(topSizer); 2241 - wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL); 2242 - topSizer->Add(boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 2243 -// first row: export path 2244 - wxBoxSizer *pathSizer = new wxBoxSizer(wxHORIZONTAL); 2245 - boxSizer->Add(pathSizer, 0, wxALIGN_RIGHT | wxALL, 0); 2246 - wxStaticText *pathLabel = 2247 - new wxStaticText(this, wxID_STATIC, wxT("&Save as:")); 2248 - pathSizer->Add(pathLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 2249 - wxString pth = Path; 2250 - if (pth.Len() == 0) 2251 - pth = wxT("*** not set: AutoSave IS DISABLED ***"); 2252 - PathCtrl = new wxTextCtrl(this, ID_AUTO_SAVE_PATH, pth, wxDefaultPosition, 2253 - wxSize(350, 22), wxTE_READONLY); 2254 - pathSizer->Add(PathCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 2255 -// second row: CHANGE PATH button 2256 - wxBoxSizer *changeBox = new wxBoxSizer(wxHORIZONTAL); 2257 - boxSizer->Add(changeBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 2258 - wxButton *change = 2259 - new wxButton(this, ID_AUTO_SAVE_CHANGE_PATH, wxT("&Set the export path")); 2260 - changeBox->Add(change, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 2261 -// third row: INTERVAL 2262 - wxBoxSizer *modeSizer = new wxBoxSizer(wxHORIZONTAL); 2263 - boxSizer->Add(modeSizer, 0, wxALIGN_LEFT | wxALL, 0); 2264 - wxString modes[6]; 2265 - modes[0] = wxT("&Disable AutoSaving"); 2266 - modes[1] = wxT("Every &30 seconds"); 2267 - modes[2] = wxT("Every &minute"); 2268 - modes[3] = wxT("Every &2 minutes"); 2269 - modes[4] = wxT("Every &5 minutes"); 2270 - modes[5] = wxT("Every &10 minutes"); 2271 - IntervalCtrl = new wxRadioBox(this, ID_AUTO_SAVE_INTERVAL, 2272 - wxT("&AutoSave interval"), 2273 - wxDefaultPosition, wxDefaultSize, 6, modes, 6, 2274 - wxRA_SPECIFY_ROWS); 2275 - if (Seconds <= 0) 2276 - IntervalCtrl->SetSelection(0); 2277 - else if (Seconds <= 30) 2278 - IntervalCtrl->SetSelection(1); 2279 - else if (Seconds <= 60) 2280 - IntervalCtrl->SetSelection(2); 2281 - else if (Seconds <= 120) 2282 - IntervalCtrl->SetSelection(3); 2283 - else if (Seconds <= 300) 2284 - IntervalCtrl->SetSelection(4); 2285 - else 2286 - IntervalCtrl->SetSelection(5); 2287 - modeSizer->Add(IntervalCtrl, 0, wxALIGN_RIGHT | wxALL, 5); 2288 - 2289 -// OK - CANCEL buttons 2290 - wxBoxSizer *okCancelBox = new wxBoxSizer(wxHORIZONTAL); 2291 - boxSizer->Add(okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0); 2292 - wxButton *ok = new wxButton(this, wxID_OK, wxT("&OK")); 2293 - okCancelBox->Add(ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 2294 - wxButton *cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel")); 2295 - okCancelBox->Add(cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5); 2296 -// appends event handler for OK button 2297 - Connect(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, 2298 - (wxObjectEventFunction) & AutoSaveDialog::OnOk); 2299 - Connect(ID_AUTO_SAVE_CHANGE_PATH, wxEVT_COMMAND_BUTTON_CLICKED, 2300 - (wxObjectEventFunction) & AutoSaveDialog::OnChangePath); 2301 - Connect(ID_AUTO_SAVE_INTERVAL, wxEVT_COMMAND_RADIOBOX_SELECTED, 2302 - (wxObjectEventFunction) & AutoSaveDialog::OnIntervalChanged); 2303 -} 2304 - 2305 -void AutoSaveDialog::OnChangePath(wxCommandEvent & WXUNUSED(event)) 2306 -{ 2307 -// 2308 -// exporting the MEMORY-DB into an external DB 2309 -// 2310 - int retdlg; 2311 - wxString lastDir; 2312 - wxFileDialog *fileDialog = new wxFileDialog(this, wxT("Saving the MEMORY-DB"), 2313 - wxT(""), wxT("db.sqlite"), 2314 - wxT 2315 - ("SQLite DB (*.sqlite)|*.sqlite|All files (*.*)|*.*"), 2316 - wxFD_SAVE | wxFD_OVERWRITE_PROMPT, 2317 - wxDefaultPosition, 2318 - wxDefaultSize, 2319 - wxT("filedlg")); 2320 - lastDir = MainFrame->GetLastDirectory(); 2321 - if (lastDir.Len() >= 1) 2322 - fileDialog->SetDirectory(lastDir); 2323 - retdlg = fileDialog->ShowModal(); 2324 - if (retdlg == wxID_OK) 2325 - { 2326 - // exporting the external DB 2327 - wxString pth = fileDialog->GetPath(); 2328 - wxString extPth = wxT("*** not set: AutoSave IS DISABLED ***"); 2329 - MainFrame->SetExternalSqlitePath(pth); 2330 - if (MainFrame->MemoryDbSave() == true) 2331 - { 2332 - wxMessageBox(wxT("Ok, MEMORY-DB was succesfully saved"), 2333 - wxT("spatialite-gui"), wxOK | wxICON_INFORMATION, this); 2334 - wxFileName file(fileDialog->GetPath()); 2335 - lastDir = file.GetPath(); 2336 - MainFrame->SetLastDirectory(lastDir); 2337 - extPth = MainFrame->GetExternalSqlitePath(); 2338 - PathCtrl->SetValue(extPth); 2339 - } else 2340 - PathCtrl->SetValue(extPth); 2341 - } 2342 -} 2343 - 2344 -void AutoSaveDialog::OnIntervalChanged(wxCommandEvent & event) 2345 -{ 2346 -// 2347 -// Interval selection changed 2348 -// 2349 - if (IntervalCtrl->GetSelection() == 0) 2350 - Seconds = 0; 2351 - else if (IntervalCtrl->GetSelection() == 1) 2352 - Seconds = 30; 2353 - else if (IntervalCtrl->GetSelection() == 2) 2354 - Seconds = 60; 2355 - else if (IntervalCtrl->GetSelection() == 3) 2356 - Seconds = 120; 2357 - else if (IntervalCtrl->GetSelection() == 4) 2358 - Seconds = 300; 2359 - else 2360 - Seconds = 600; 2361 -} 2362 - 2363 -void AutoSaveDialog::OnOk(wxCommandEvent & event) 2364 -{ 2365 -// 2366 -// all done: 2367 -// 2368 - wxDialog::EndModal(wxID_OK); 1739 + wxBoxSizer *topSizer = new wxBoxSizer (wxVERTICAL); 1740 + this->SetSizer (topSizer); 1741 + wxBoxSizer *boxSizer = new wxBoxSizer (wxVERTICAL); 1742 + topSizer->Add (boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 1743 + wxHtmlWindow *helpWin = new wxHtmlWindow (this, wxID_ANY, 1744 + wxDefaultPosition, wxSize (620, 1745 + 420)); 1746 + wxString html; 1747 + MainFrame->GetHelp (html); 1748 + helpWin->SetPage (html); 1749 + topSizer->Add (helpWin, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); 2369 1750 }
Deleted Exif.cpp.
1 -/* 2 -/ Exif.cpp 3 -/ methods related to EXIF import 4 -/ 5 -/ version 1.2, 2008 October 9 6 -/ 7 -/ Author: Sandro Furieri a-furieri@lqt.it 8 -/ 9 -/ Copyright (C) 2008 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 <sys/types.h> 29 -#include <dirent.h> 30 -#include <float.h> 31 - 32 -void MyFrame::ImportExifPhotos(wxString & path, bool folder, bool metadata, 33 - bool gps_only) 34 -{ 35 -// 36 -// trying to import EXIF photos 37 -// 38 - int cnt; 39 - char msg[256]; 40 - ::wxBeginBusyCursor(); 41 - if (CheckExifTables() == false) 42 - { 43 - ::wxEndBusyCursor(); 44 - wxMessageBox(wxT 45 - ("An EXIF table is already defined, but has incompatibles columns"), 46 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 47 - return; 48 - } 49 - if (folder == true) 50 - cnt = ExifLoadDir(path, gps_only, metadata); 51 - else 52 - cnt = ExifLoadFile(path, gps_only, metadata); 53 - ::wxEndBusyCursor(); 54 - sprintf(msg, "%d EXIF photo%s succesfully inserted into the DB\n", cnt, 55 - (cnt > 1) ? "s where" : " was"); 56 - wxMessageBox(wxString::FromUTF8(msg), wxT("spatialite-gui"), 57 - wxOK | wxICON_INFORMATION, this); 58 - InitTableTree(); 59 -} 60 - 61 -bool MyFrame::CheckExifTables() 62 -{ 63 -// 64 -// creates the EXIF DB tables / or checks existing ones for validity 65 -// 66 - int ret; 67 - wxString sql; 68 - char xsql[1024]; 69 - char *errMsg; 70 - bool ok_photoId; 71 - bool ok_photo; 72 - bool ok_pixelX; 73 - bool ok_pixelY; 74 - bool ok_cameraMake; 75 - bool ok_cameraModel; 76 - bool ok_shotDateTime; 77 - bool ok_gpsGeometry; 78 - bool ok_gpsDirection; 79 - bool ok_gpsSatellites; 80 - bool ok_gpsTimestamp; 81 - bool ok_fromPath; 82 - bool ok_tagId; 83 - bool ok_tagName; 84 - bool ok_gpsTag; 85 - bool ok_valueType; 86 - bool ok_typeName; 87 - bool ok_countValues; 88 - bool ok_valueIndex; 89 - bool ok_byteValue; 90 - bool ok_stringValue; 91 - bool ok_numValue; 92 - bool ok_numValueBis; 93 - bool ok_doubleValue; 94 - bool ok_humanReadable; 95 - bool err_pk; 96 - bool ok_photoIdPk; 97 - bool ok_tagIdPk; 98 - bool ok_valueIndexPk; 99 - bool pKey; 100 - const char *name; 101 - int i; 102 - char **results; 103 - int rows; 104 - int columns; 105 -// creating the ExifPhoto table 106 - sql = wxT("CREATE TABLE IF NOT EXISTS ExifPhoto (\n"); 107 - sql += wxT("PhotoId INTEGER PRIMARY KEY AUTOINCREMENT,\n"); 108 - sql += wxT("Photo BLOB NOT NULL,\n"); 109 - sql += wxT("PixelX INTEGER,\n"); 110 - sql += wxT("PixelY INTEGER,\n"); 111 - sql += wxT("CameraMake TEXT,\n"); 112 - sql += wxT("CameraModel TEXT,\n"); 113 - sql += wxT("ShotDateTime DOUBLE,\n"); 114 - sql += wxT("GpsGeometry BLOB,\n"); 115 - sql += wxT("GpsDirection DOUBLE, "); 116 - sql += wxT("GpsSatellites TEXT,\n"); 117 - sql += wxT("GpsTimestamp DOUBLE,\n"); 118 - sql += wxT("FromPath TEXT"); 119 - sql += wxT(")"); 120 - strcpy(xsql, sql.ToUTF8()); 121 - ret = sqlite3_exec(SqliteHandle, xsql, NULL, NULL, &errMsg); 122 - if (ret != SQLITE_OK) 123 - { 124 - wxMessageBox(wxT("CREATE TABLE ExifPhoto error: ") + 125 - wxString::FromUTF8(errMsg), wxT("spatialite-gui"), 126 - wxOK | wxICON_ERROR, this); 127 - sqlite3_free(errMsg); 128 - goto abort; 129 - } 130 -// checking the ExifPhoto table for sanity 131 - ok_photoId = false; 132 - ok_photo = false; 133 - ok_pixelX = false; 134 - ok_pixelY = false; 135 - ok_cameraMake = false; 136 - ok_cameraModel = false; 137 - ok_shotDateTime = false; 138 - ok_gpsGeometry = false; 139 - ok_gpsDirection = false; 140 - ok_gpsSatellites = false; 141 - ok_gpsTimestamp = false; 142 - ok_fromPath = false; 143 - ok_photoIdPk = false; 144 - err_pk = false; 145 - strcpy(xsql, "PRAGMA table_info(ExifPhoto)"); 146 - ret = 147 - sqlite3_get_table(SqliteHandle, xsql, &results, &rows, &columns, &errMsg); 148 - if (ret != SQLITE_OK) 149 - { 150 - wxMessageBox(wxT("PRAGMA table_info(ExifPhoto) error: ") + 151 - wxString::FromUTF8(errMsg), wxT("spatialite-gui"), 152 - wxOK | wxICON_ERROR, this); 153 - sqlite3_free(errMsg); 154 - goto abort; 155 - } 156 - if (rows < 1) 157 - ; 158 - else 159 - { 160 - for (i = 1; i <= rows; i++) 161 - { 162 - name = results[(i * columns) + 1]; 163 - if (atoi(results[(i * columns) + 5]) == 0) 164 - pKey = false; 165 - else 166 - pKey = true; 167 - if (strcasecmp(name, "PhotoId") == 0) 168 - ok_photoId = true; 169 - if (strcasecmp(name, "Photo") == 0) 170 - ok_photo = true; 171 - if (strcasecmp(name, "PixelX") == 0) 172 - ok_pixelX = true; 173 - if (strcasecmp(name, "PixelY") == 0) 174 - ok_pixelY = true; 175 - if (strcasecmp(name, "CameraMake") == 0) 176 - ok_cameraMake = true; 177 - if (strcasecmp(name, "CameraModel") == 0) 178 - ok_cameraModel = true; 179 - if (strcasecmp(name, "ShotDateTime") == 0) 180 - ok_shotDateTime = true; 181 - if (strcasecmp(name, "GpsGeometry") == 0) 182 - ok_gpsGeometry = true; 183 - if (strcasecmp(name, "GpsDirection") == 0) 184 - ok_gpsDirection = true; 185 - if (strcasecmp(name, "GpsTimestamp") == 0) 186 - ok_gpsTimestamp = true; 187 - if (strcasecmp(name, "FromPath") == 0) 188 - ok_fromPath = true; 189 - if (pKey == true) 190 - { 191 - if (strcasecmp(name, "PhotoId") == 0) 192 - ok_photoIdPk = true; 193 - else 194 - err_pk = true; 195 - } 196 - } 197 - } 198 - sqlite3_free_table(results); 199 - if (ok_photoId == true && ok_photo == true && ok_pixelX == true 200 - && ok_pixelY == true && ok_cameraMake == true && ok_cameraModel == true 201 - && ok_shotDateTime == true && ok_gpsGeometry == true 202 - && ok_gpsDirection == true && ok_gpsTimestamp == true 203 - && ok_fromPath == true && ok_photoIdPk == true && err_pk == false) 204 - ; 205 - else 206 - { 207 - wxMessageBox(wxT 208 - ("ERROR: table ExifPhoto already exists, but has incompatible columns"), 209 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 210 - sqlite3_free(errMsg); 211 - goto abort; 212 - } 213 -// creating the ExifTags table 214 - sql = wxT("CREATE TABLE IF NOT EXISTS ExifTags (\n"); 215 - sql += wxT("PhotoId INTEGER NOT NULL,\n"); 216 - sql += wxT("TagId INTEGER NOT NULL,\n"); 217 - sql += wxT("TagName TEXT NOT NULL,\n"); 218 - sql += wxT("GpsTag INTEGER NOT NULL CHECK (GpsTag IN (0, 1)),\n"); 219 - sql += 220 - wxT 221 - ("ValueType INTEGER NOT NULL CHECK (ValueType IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)),\n"); 222 - sql += wxT("TypeName TEXT NOT NULL,\n"); 223 - sql += wxT("CountValues INTEGER NOT NULL,\n"); 224 - sql += wxT("PRIMARY KEY (PhotoId, TagId)"); 225 - sql += wxT(")"); 226 - strcpy(xsql, sql.ToUTF8()); 227 - ret = sqlite3_exec(SqliteHandle, xsql, NULL, NULL, &errMsg); 228 - if (ret != SQLITE_OK) 229 - { 230 - wxMessageBox(wxT("CREATE TABLE ExifTags error: ") + 231 - wxString::FromUTF8(errMsg), wxT("spatialite-gui"), 232 - wxOK | wxICON_ERROR, this); 233 - sqlite3_free(errMsg); 234 - goto abort; 235 - } 236 -// checking the ExifTags table for sanity 237 - ok_photoId = false; 238 - ok_tagId = false; 239 - ok_tagName = false; 240 - ok_gpsTag = false; 241 - ok_valueType = false; 242 - ok_typeName = false; 243 - ok_countValues = false; 244 - ok_photoIdPk = false; 245 - ok_tagIdPk = false; 246 - err_pk = false; 247 - strcpy(xsql, "PRAGMA table_info(ExifTags)"); 248 - ret = 249 - sqlite3_get_table(SqliteHandle, xsql, &results, &rows, &columns, &errMsg); 250 - if (ret != SQLITE_OK) 251 - { 252 - wxMessageBox(wxT("PRAGMA table_info(ExifTags) error: ") + 253 - wxString::FromUTF8(errMsg), wxT("spatialite-gui"), 254 - wxOK | wxICON_ERROR, this); 255 - sqlite3_free(errMsg); 256 - goto abort; 257 - } 258 - if (rows < 1) 259 - ; 260 - else 261 - { 262 - for (i = 1; i <= rows; i++) 263 - { 264 - name = results[(i * columns) + 1]; 265 - if (atoi(results[(i * columns) + 5]) == 0) 266 - pKey = false; 267 - else 268 - pKey = true; 269 - if (strcasecmp(name, "PhotoId") == 0) 270 - ok_photoId = true; 271 - if (strcasecmp(name, "TagId") == 0) 272 - ok_tagId = true; 273 - if (strcasecmp(name, "TagName") == 0) 274 - ok_tagName = true; 275 - if (strcasecmp(name, "GpsTag") == 0) 276 - ok_gpsTag = true; 277 - if (strcasecmp(name, "ValueType") == 0) 278 - ok_valueType = true; 279 - if (strcasecmp(name, "TypeName") == 0) 280 - ok_typeName = true; 281 - if (strcasecmp(name, "CountValues") == 0) 282 - ok_countValues = true; 283 - if (pKey == true) 284 - { 285 - if (strcasecmp(name, "PhotoId") == 0) 286 - ok_photoIdPk = true; 287 - else if (strcasecmp(name, "TagId") == 0) 288 - ok_tagIdPk = true; 289 - else 290 - err_pk = true; 291 - } 292 - } 293 - } 294 - sqlite3_free_table(results); 295 - if (ok_photoId == true && ok_tagId == true && ok_tagName == true 296 - && ok_gpsTag == true && ok_valueType == true && ok_typeName == true 297 - && ok_countValues == true && ok_photoIdPk == true && ok_tagIdPk == true 298 - && err_pk == false) 299 - ; 300 - else 301 - { 302 - wxMessageBox(wxT 303 - ("ERROR: table ExifTags already exists, but has incompatible columns"), 304 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 305 - sqlite3_free(errMsg); 306 - goto abort; 307 - } 308 -// creating the ExifValues table 309 - sql = wxT("CREATE TABLE IF NOT EXISTS ExifValues (\n"); 310 - sql += wxT("PhotoId INTEGER NOT NULL,\n"); 311 - sql += wxT("TagId INTEGER NOT NULL,\n"); 312 - sql += wxT("ValueIndex INTEGER NOT NULL,\n"); 313 - sql += wxT("ByteValue BLOB,\n"); 314 - sql += wxT("StringValue TEXT,\n"); 315 - sql += wxT("NumValue INTEGER,\n"); 316 - sql += wxT("NumValueBis INTEGER,\n"); 317 - sql += wxT("DoubleValue DOUBLE,\n"); 318 - sql += wxT("HumanReadable TEXT,\n"); 319 - sql += wxT("PRIMARY KEY (PhotoId, TagId, ValueIndex)"); 320 - sql += wxT(")"); 321 - strcpy(xsql, sql.ToUTF8()); 322 - ret = sqlite3_exec(SqliteHandle, xsql, NULL, NULL, &errMsg); 323 - if (ret != SQLITE_OK) 324 - { 325 - wxMessageBox(wxT("CREATE TABLE ExifValues error: ") + 326 - wxString::FromUTF8(errMsg), wxT("spatialite-gui"), 327 - wxOK | wxICON_ERROR, this); 328 - sqlite3_free(errMsg); 329 - goto abort; 330 - } 331 -// checking the ExifValues table for sanity 332 - ok_photoId = false; 333 - ok_tagId = false; 334 - ok_valueIndex = false; 335 - ok_byteValue = false; 336 - ok_stringValue = false; 337 - ok_numValue = false; 338 - ok_numValueBis = false; 339 - ok_doubleValue = false; 340 - ok_humanReadable = false; 341 - ok_photoIdPk = false; 342 - ok_tagIdPk = false; 343 - ok_valueIndexPk = false; 344 - err_pk = false; 345 - strcpy(xsql, "PRAGMA table_info(ExifValues)"); 346 - ret = 347 - sqlite3_get_table(SqliteHandle, xsql, &results, &rows, &columns, &errMsg); 348 - if (ret != SQLITE_OK) 349 - { 350 - wxMessageBox(wxT("PRAGMA table_info(ExifValues) error: ") + 351 - wxString::FromUTF8(errMsg), wxT("spatialite-gui"), 352 - wxOK | wxICON_ERROR, this); 353 - sqlite3_free(errMsg); 354 - goto abort; 355 - } 356 - if (rows < 1) 357 - ; 358 - else 359 - { 360 - for (i = 1; i <= rows; i++) 361 - { 362 - name = results[(i * columns) + 1]; 363 - if (atoi(results[(i * columns) + 5]) == 0) 364 - pKey = false; 365 - else 366 - pKey = true; 367 - if (strcasecmp(name, "PhotoId") == 0) 368 - ok_photoId = true; 369 - if (strcasecmp(name, "TagId") == 0) 370 - ok_tagId = true; 371 - if (strcasecmp(name, "ValueIndex") == 0) 372 - ok_valueIndex = true; 373 - if (strcasecmp(name, "ByteValue") == 0) 374 - ok_byteValue = true; 375 - if (strcasecmp(name, "StringValue") == 0) 376 - ok_stringValue = true; 377 - if (strcasecmp(name, "NumValue") == 0) 378 - ok_numValue = true; 379 - if (strcasecmp(name, "NumValueBis") == 0) 380 - ok_numValueBis = true; 381 - if (strcasecmp(name, "DoubleValue") == 0) 382 - ok_doubleValue = true; 383 - if (strcasecmp(name, "HumanReadable") == 0) 384 - ok_humanReadable = true; 385 - if (pKey == true) 386 - { 387 - if (strcasecmp(name, "PhotoId") == 0) 388 - ok_photoIdPk = true; 389 - else if (strcasecmp(name, "TagId") == 0) 390 - ok_tagIdPk = true; 391 - else if (strcasecmp(name, "ValueIndex") == 0) 392 - ok_valueIndexPk = true; 393 - else 394 - err_pk = true; 395 - } 396 - } 397 - } 398 - sqlite3_free_table(results); 399 - if (ok_photoId == true && ok_tagId == true && ok_valueIndex == true 400 - && ok_byteValue == true && ok_stringValue == true && ok_numValue == true 401 - && ok_numValueBis == true && ok_doubleValue == true 402 - && ok_humanReadable == true && ok_photoIdPk == true && ok_tagIdPk == true 403 - && ok_valueIndexPk == true && err_pk == false) 404 - ; 405 - else 406 - { 407 - wxMessageBox(wxT 408 - ("ERROR: table ExifValues already exists, but has incompatible columns"), 409 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 410 - sqlite3_free(errMsg); 411 - goto abort; 412 - } 413 -// creating the ExifView view 414 - sql = wxT("CREATE VIEW IF NOT EXISTS ExifMetadata AS\n"); 415 - sql += wxT("SELECT p.PhotoId AS PhotoId, "); 416 - sql += wxT("t.TagId AS TagId, "); 417 - sql += wxT("t.TagName AS TagName,"); 418 - sql += wxT("t.GpsTag AS GpsTag,\n"); 419 - sql += wxT("t.ValueType AS ValueType,"); 420 - sql += wxT("t.TypeName AS TypeName, "); 421 - sql += wxT("t.CountValues AS CountValues, "); 422 - sql += wxT("v.ValueIndex AS ValueIndex,\n"); 423 - sql += wxT("v.ByteValue AS ByteValue, "); 424 - sql += wxT("v.StringValue AS StringValue, "); 425 - sql += wxT("v.NumValue AS NumValue, "); 426 - sql += wxT("v.NumValueBis AS NumValueBis,\n"); 427 - sql += wxT("v.DoubleValue AS DoubleValue, "); 428 - sql += wxT("v.HumanReadable AS HumanReadable\n"); 429 - sql += wxT("FROM ExifPhoto AS p, ExifTags AS t, ExifValues AS v\n"); 430 - sql += 431 - wxT 432 - ("WHERE t.PhotoId = p.PhotoId AND v.PhotoId = t.PhotoId AND v.TagId = t.TagId"); 433 - strcpy(xsql, sql.ToUTF8()); 434 - ret = sqlite3_exec(SqliteHandle, xsql, NULL, NULL, &errMsg); 435 - if (ret != SQLITE_OK) 436 - { 437 - wxMessageBox(wxT("CREATE VIEW ExifMetadata error: ") + 438 - wxString::FromUTF8(errMsg), wxT("spatialite-gui"), 439 - wxOK | wxICON_ERROR, this); 440 - sqlite3_free(errMsg); 441 - goto abort; 442 - } 443 - return true; 444 -abort: 445 - return false; 446 -} 447 - 448 -int MyFrame::ExifLoadDir(wxString & path, bool gps_only, bool metadata) 449 -{ 450 -// 451 -// importing EXIF files from a whole DIRECTORY 452 -// 453 - int cnt = 0; 454 - wxString filePath; 455 - struct dirent *entry; 456 - DIR *dir = opendir(path.ToUTF8()); 457 - if (!dir) 458 - return 0; 459 - while (1) 460 - { 461 - // scanning dir-entries 462 - entry = readdir(dir); 463 - if (!entry) 464 - break; 465 - filePath = path; 466 - filePath += wxT("/") + wxString::FromUTF8(entry->d_name); 467 - cnt += ExifLoadFile(filePath, gps_only, metadata); 468 - } 469 - closedir(dir); 470 - return cnt; 471 -} 472 - 473 -int MyFrame::ExifLoadFile(wxString & path, bool gps_only, bool metadata) 474 -{ 475 -// 476 -// importing a single EXIF file 477 -// 478 - FILE *fl; 479 - int sz = 0; 480 - int rd; 481 - int loaded = 0; 482 - unsigned char *blob = NULL; 483 - gaiaExifTagListPtr tag_list = NULL; 484 - fl = fopen(path.ToUTF8(), "rb"); 485 - if (!fl) 486 - return 0; 487 - if (fseek(fl, 0, SEEK_END) == 0) 488 - sz = ftell(fl); 489 - if (sz > 14) 490 - { 491 - blob = (unsigned char *) malloc(sz); 492 - rewind(fl); 493 - rd = fread(blob, 1, sz, fl); 494 - if (rd == sz) 495 - { 496 - tag_list = gaiaGetExifTags(blob, sz); 497 - if (tag_list) 498 - { 499 - if (gps_only && IsExifGps(tag_list) == false) 500 - goto stop; 501 - if (UpdateExifTables(blob, sz, tag_list, metadata, path) == false) 502 - goto stop; 503 - loaded = 1; 504 - } 505 - } 506 - } 507 -stop: 508 - if (blob) 509 - free(blob); 510 - if (tag_list) 511 - gaiaExifTagsFree(tag_list); 512 - fclose(fl); 513 - return loaded; 514 -} 515 - 516 -bool MyFrame::IsExifGps(gaiaExifTagListPtr tag_list) 517 -{ 518 -// 519 -// checks if this one is a GPS-tagged EXIF 520 -// 521 - bool gps_lat = false; 522 - bool gps_long = false; 523 - gaiaExifTagPtr pT = tag_list->First; 524 - while (pT) 525 - { 526 - if (pT->Gps && pT->TagId == 0x04) 527 - gps_long = true; 528 - if (pT->Gps && pT->TagId == 0x02) 529 - gps_lat = true; 530 - if (gps_long == true && gps_lat == true) 531 - return true; 532 - pT = pT->Next; 533 - } 534 - return false; 535 -} 536 - 537 -bool MyFrame::UpdateExifTables(unsigned char *blob, int sz, 538 - gaiaExifTagListPtr tag_list, bool metadata, 539 - wxString & path) 540 -{ 541 -// 542 -// inserting an EXIF photo into the DB 543 -// 544 - int i; 545 - int iv; 546 - bool ok; 547 - int xok; 548 - int ok_human; 549 - char tag_name[128]; 550 - gaiaExifTagPtr pT; 551 - int ret; 552 - char sql[1024]; 553 - char human[1024]; 554 - wxString make; 555 - wxString model; 556 - wxString satellites; 557 - wxString date; 558 - wxString timestamp; 559 - char *errMsg = NULL; 560 - sqlite3_stmt *stmt; 561 - sqlite3_int64 pk = 0; 562 - sqlite3_int64 val64; 563 - double dblval; 564 - const char *type_desc; 565 - double longitude; 566 - double latitude; 567 - gaiaGeomCollPtr geom; 568 - unsigned char *geoblob; 569 - int geosize; 570 -// starts a transaction 571 - strcpy(sql, "BEGIN"); 572 - ret = sqlite3_exec(SqliteHandle, sql, NULL, NULL, &errMsg); 573 - if (ret != SQLITE_OK) 574 - { 575 - wxMessageBox(wxT("BEGIN error: ") + wxString::FromUTF8(errMsg), 576 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 577 - sqlite3_free(errMsg); 578 - goto abort; 579 - } 580 -// feeding the ExifPhoto table; preparing the SQL statement 581 - strcpy(sql, 582 - "INSERT INTO ExifPhoto (PhotoId, Photo, PixelX, PixelY, CameraMake, CameraModel, "); 583 - strcat(sql, 584 - "ShotDateTime, GpsGeometry, GpsDirection, GpsSatellites, GpsTimestamp, FromPath) "); 585 - strcat(sql, 586 - "VALUES (NULL, ?, ?, ?, ?, ?, JulianDay(?), ?, ?, ?, JulianDay(?), ?)"); 587 - ret = sqlite3_prepare_v2(SqliteHandle, sql, strlen(sql), &stmt, NULL); 588 - if (ret != SQLITE_OK) 589 - { 590 - wxMessageBox(wxT("INSERT INTO ExifPhoto error: ") + 591 - wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)), 592 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 593 - goto abort; 594 - } 595 - sqlite3_bind_blob(stmt, 1, blob, sz, SQLITE_STATIC); 596 - val64 = GetPixelX(tag_list, &ok); 597 - if (ok == true) 598 - sqlite3_bind_int64(stmt, 2, val64); 599 - else 600 - sqlite3_bind_null(stmt, 2); 601 - val64 = GetPixelY(tag_list, &ok); 602 - if (ok == true) 603 - sqlite3_bind_int64(stmt, 3, val64); 604 - else 605 - sqlite3_bind_null(stmt, 3); 606 - GetMake(tag_list, make, &ok); 607 - if (ok == true) 608 - sqlite3_bind_text(stmt, 4, make.ToUTF8(), make.Len(), SQLITE_TRANSIENT); 609 - else 610 - sqlite3_bind_null(stmt, 4); 611 - GetModel(tag_list, model, &ok); 612 - if (ok == true) 613 - sqlite3_bind_text(stmt, 5, model.ToUTF8(), model.Len(), SQLITE_TRANSIENT); 614 - else 615 - sqlite3_bind_null(stmt, 5); 616 - GetDate(tag_list, date, &ok); 617 - if (ok == true) 618 - sqlite3_bind_text(stmt, 6, date.ToUTF8(), date.Len(), SQLITE_TRANSIENT); 619 - else 620 - sqlite3_bind_text(stmt, 6, "0000-00-00 00:00:00", 19, SQLITE_TRANSIENT); 621 - GetGpsCoords(tag_list, &longitude, &latitude, &ok); 622 - if (ok == true) 623 - { 624 - geom = gaiaAllocGeomColl(); 625 - geom->Srid = 4326; 626 - gaiaAddPointToGeomColl(geom, longitude, latitude); 627 - gaiaToSpatiaLiteBlobWkb(geom, &geoblob, &geosize); 628 - gaiaFreeGeomColl(geom); 629 - sqlite3_bind_blob(stmt, 7, geoblob, geosize, SQLITE_TRANSIENT); 630 - free(geoblob); 631 - } else 632 - sqlite3_bind_null(stmt, 7); 633 - dblval = GetGpsDirection(tag_list, &ok); 634 - if (ok == true) 635 - sqlite3_bind_double(stmt, 8, dblval); 636 - else 637 - sqlite3_bind_null(stmt, 8); 638 - GetGpsSatellites(tag_list, satellites, &ok); 639 - if (ok == true) 640 - sqlite3_bind_text(stmt, 9, satellites.ToUTF8(), satellites.Len(), 641 - SQLITE_TRANSIENT); 642 - else 643 - sqlite3_bind_null(stmt, 9); 644 - GetGpsTimestamp(tag_list, timestamp, &ok); 645 - if (ok == true) 646 - sqlite3_bind_text(stmt, 10, timestamp.ToUTF8(), timestamp.Len(), 647 - SQLITE_TRANSIENT); 648 - else 649 - sqlite3_bind_text(stmt, 10, "0000-00-00 00:00:00", 19, SQLITE_TRANSIENT); 650 - sqlite3_bind_text(stmt, 11, path.ToUTF8(), path.Len(), SQLITE_TRANSIENT); 651 - ret = sqlite3_step(stmt); 652 - if (ret == SQLITE_DONE || ret == SQLITE_ROW) 653 - ; 654 - else 655 - { 656 - wxMessageBox(wxT("sqlite3_step() error: ") + 657 - wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)), 658 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 659 - sqlite3_finalize(stmt); 660 - goto abort; 661 - } 662 - sqlite3_finalize(stmt); 663 - pk = sqlite3_last_insert_rowid(SqliteHandle); 664 - if (metadata) 665 - { 666 - // feeding the ExifTags table; preparing the SQL statement 667 - strcpy(sql, 668 - "INSERT OR IGNORE INTO ExifTags (PhotoId, TagId, TagName, GpsTag, ValueType, "); 669 - strcat(sql, "TypeName, CountValues) VALUES (?, ?, ?, ?, ?, ?, ?)"); 670 - ret = sqlite3_prepare_v2(SqliteHandle, sql, strlen(sql), &stmt, NULL); 671 - if (ret != SQLITE_OK) 672 - { 673 - wxMessageBox(wxT("INSERT INTO ExifTags error: ") + 674 - wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)), 675 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 676 - goto abort; 677 - } 678 - for (i = 0; i < gaiaGetExifTagsCount(tag_list); i++) 679 - { 680 - pT = gaiaGetExifTagByPos(tag_list, i); 681 - if (pT) 682 - { 683 - gaiaExifTagGetName(pT, tag_name, 128); 684 - switch (gaiaExifTagGetValueType(pT)) 685 - { 686 - case 1: 687 - type_desc = "BYTE"; 688 - break; 689 - case 2: 690 - type_desc = "STRING"; 691 - break; 692 - case 3: 693 - type_desc = "SHORT"; 694 - break; 695 - case 4: 696 - type_desc = "LONG"; 697 - break; 698 - case 5: 699 - type_desc = "RATIONAL"; 700 - break; 701 - case 6: 702 - type_desc = "SBYTE"; 703 - break; 704 - case 7: 705 - type_desc = "UNDEFINED"; 706 - break; 707 - case 8: 708 - type_desc = "SSHORT"; 709 - break; 710 - case 9: 711 - type_desc = "SLONG"; 712 - break; 713 - case 10: 714 - type_desc = "SRATIONAL"; 715 - break; 716 - case 11: 717 - type_desc = "FLOAT"; 718 - break; 719 - case 12: 720 - type_desc = "DOUBLE"; 721 - break; 722 - default: 723 - type_desc = "UNKNOWN"; 724 - break; 725 - }; 726 - // INSERTing an Exif Tag 727 - sqlite3_reset(stmt); 728 - sqlite3_clear_bindings(stmt); 729 - sqlite3_bind_int64(stmt, 1, pk); 730 - sqlite3_bind_int(stmt, 2, gaiaExifTagGetId(pT)); 731 - sqlite3_bind_text(stmt, 3, tag_name, strlen(tag_name), 732 - SQLITE_STATIC); 733 - sqlite3_bind_int(stmt, 4, gaiaIsExifGpsTag(pT)); 734 - sqlite3_bind_int(stmt, 5, gaiaExifTagGetValueType(pT)); 735 - sqlite3_bind_text(stmt, 6, type_desc, strlen(type_desc), 736 - SQLITE_STATIC); 737 - sqlite3_bind_int(stmt, 7, gaiaExifTagGetNumValues(pT)); 738 - ret = sqlite3_step(stmt); 739 - if (ret == SQLITE_DONE || ret == SQLITE_ROW) 740 - ; 741 - else 742 - { 743 - wxMessageBox(wxT("sqlite3_step() error: ") + 744 - wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)), 745 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, 746 - this); 747 - sqlite3_finalize(stmt); 748 - goto abort; 749 - } 750 - } 751 - } 752 - sqlite3_finalize(stmt); 753 - // feeding the ExifValues table; preparing the SQL statement 754 - strcpy(sql, 755 - "INSERT OR IGNORE INTO ExifValues (PhotoId, TagId, ValueIndex, ByteValue, "); 756 - strcat(sql, 757 - "StringValue, NumValue, NumValueBis, DoubleValue, HumanReadable) VALUES "); 758 - strcat(sql, "(?, ?, ?, ?, ?, ?, ?, ?, ?)"); 759 - ret = sqlite3_prepare_v2(SqliteHandle, sql, strlen(sql), &stmt, NULL); 760 - if (ret != SQLITE_OK) 761 - { 762 - wxMessageBox(wxT("NSERT INTO ExifValues error: ") + 763 - wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)), 764 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 765 - goto abort; 766 - } 767 - for (i = 0; i < gaiaGetExifTagsCount(tag_list); i++) 768 - { 769 - pT = gaiaGetExifTagByPos(tag_list, i); 770 - if (pT) 771 - { 772 - gaiaExifTagGetHumanReadable(pT, human, 1024, &ok_human); 773 - for (iv = 0; iv < gaiaExifTagGetNumValues(pT); iv++) 774 - { 775 - // INSERTing an Exif Tag 776 - sqlite3_reset(stmt); 777 - sqlite3_clear_bindings(stmt); 778 - sqlite3_bind_int64(stmt, 1, pk); 779 - sqlite3_bind_int(stmt, 2, gaiaExifTagGetId(pT)); 780 - sqlite3_bind_int(stmt, 3, iv); 781 - if (gaiaExifTagGetValueType(pT) == 1 782 - || gaiaExifTagGetValueType(pT) == 6 783 - || gaiaExifTagGetValueType(pT) == 7) 784 - { 785 - sqlite3_bind_blob(stmt, 4, pT->ByteValue, pT->Count, 786 - SQLITE_STATIC); 787 - sqlite3_bind_null(stmt, 5); 788 - sqlite3_bind_null(stmt, 6); 789 - sqlite3_bind_null(stmt, 7); 790 - sqlite3_bind_null(stmt, 8); 791 - } 792 - if (gaiaExifTagGetValueType(pT) == 2) 793 - { 794 - sqlite3_bind_null(stmt, 4); 795 - sqlite3_bind_text(stmt, 5, pT->StringValue, 796 - strlen(pT->StringValue), SQLITE_STATIC); 797 - sqlite3_bind_null(stmt, 6); 798 - sqlite3_bind_null(stmt, 7); 799 - sqlite3_bind_null(stmt, 8); 800 - } 801 - if (gaiaExifTagGetValueType(pT) == 3) 802 - { 803 - sqlite3_bind_null(stmt, 4); 804 - sqlite3_bind_null(stmt, 5); 805 - val64 = gaiaExifTagGetShortValue(pT, iv, &xok); 806 - if (!ok) 807 - sqlite3_bind_null(stmt, 6); 808 - else 809 - sqlite3_bind_int64(stmt, 6, val64); 810 - sqlite3_bind_null(stmt, 7); 811 - sqlite3_bind_null(stmt, 8); 812 - } 813 - if (gaiaExifTagGetValueType(pT) == 4) 814 - { 815 - sqlite3_bind_null(stmt, 4); 816 - sqlite3_bind_null(stmt, 5); 817 - val64 = gaiaExifTagGetLongValue(pT, iv, &xok); 818 - if (!ok) 819 - sqlite3_bind_null(stmt, 6); 820 - else 821 - sqlite3_bind_int64(stmt, 6, val64); 822 - sqlite3_bind_null(stmt, 7); 823 - sqlite3_bind_null(stmt, 8); 824 - } 825 - if (gaiaExifTagGetValueType(pT) == 5) 826 - { 827 - sqlite3_bind_null(stmt, 4); 828 - sqlite3_bind_null(stmt, 5); 829 - val64 = gaiaExifTagGetRational1Value(pT, iv, &xok); 830 - if (!ok) 831 - sqlite3_bind_null(stmt, 6); 832 - else 833 - sqlite3_bind_int64(stmt, 6, val64); 834 - val64 = gaiaExifTagGetRational2Value(pT, iv, &xok); 835 - if (!ok) 836 - sqlite3_bind_null(stmt, 7); 837 - else 838 - sqlite3_bind_int64(stmt, 7, val64); 839 - dblval = gaiaExifTagGetRationalValue(pT, iv, &xok); 840 - if (!ok) 841 - sqlite3_bind_null(stmt, 8); 842 - else 843 - sqlite3_bind_double(stmt, 8, dblval); 844 - } 845 - if (gaiaExifTagGetValueType(pT) == 9) 846 - { 847 - sqlite3_bind_null(stmt, 4); 848 - sqlite3_bind_null(stmt, 5); 849 - val64 = gaiaExifTagGetSignedLongValue(pT, iv, &xok); 850 - if (!ok) 851 - sqlite3_bind_null(stmt, 6); 852 - else 853 - sqlite3_bind_int64(stmt, 6, val64); 854 - sqlite3_bind_null(stmt, 7); 855 - sqlite3_bind_null(stmt, 8); 856 - } 857 - if (gaiaExifTagGetValueType(pT) == 10) 858 - { 859 - sqlite3_bind_null(stmt, 4); 860 - sqlite3_bind_null(stmt, 5); 861 - val64 = gaiaExifTagGetSignedRational1Value(pT, iv, &xok); 862 - if (!ok) 863 - sqlite3_bind_null(stmt, 6); 864 - else 865 - sqlite3_bind_int64(stmt, 6, val64); 866 - val64 = gaiaExifTagGetSignedRational2Value(pT, iv, &xok); 867 - if (!ok) 868 - sqlite3_bind_null(stmt, 7); 869 - else 870 - sqlite3_bind_int64(stmt, 7, val64); 871 - dblval = gaiaExifTagGetSignedRationalValue(pT, iv, &xok); 872 - if (!ok) 873 - sqlite3_bind_null(stmt, 8); 874 - else 875 - sqlite3_bind_double(stmt, 8, dblval); 876 - } 877 - if (gaiaExifTagGetValueType(pT) == 11) 878 - { 879 - sqlite3_bind_null(stmt, 4); 880 - sqlite3_bind_null(stmt, 5); 881 - sqlite3_bind_null(stmt, 6); 882 - sqlite3_bind_null(stmt, 7); 883 - dblval = gaiaExifTagGetFloatValue(pT, iv, &xok); 884 - if (!ok) 885 - sqlite3_bind_null(stmt, 8); 886 - else 887 - sqlite3_bind_double(stmt, 8, dblval); 888 - } 889 - if (gaiaExifTagGetValueType(pT) == 12) 890 - { 891 - sqlite3_bind_null(stmt, 4); 892 - sqlite3_bind_null(stmt, 5); 893 - sqlite3_bind_null(stmt, 6); 894 - sqlite3_bind_null(stmt, 7); 895 - dblval = gaiaExifTagGetDoubleValue(pT, iv, &xok); 896 - if (!ok) 897 - sqlite3_bind_null(stmt, 8); 898 - else 899 - sqlite3_bind_double(stmt, 8, dblval); 900 - } 901 - if (!ok_human) 902 - sqlite3_bind_null(stmt, 9); 903 - else 904 - sqlite3_bind_text(stmt, 9, human, strlen(human), 905 - SQLITE_STATIC); 906 - ret = sqlite3_step(stmt); 907 - if (ret == SQLITE_DONE || ret == SQLITE_ROW) 908 - ; 909 - else 910 - { 911 - wxMessageBox(wxT("sqlite3_step() error: ") + 912 - wxString:: 913 - FromUTF8(sqlite3_errmsg(SqliteHandle)), 914 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, 915 - this); 916 - sqlite3_finalize(stmt); 917 - goto abort; 918 - } 919 - if (gaiaExifTagGetValueType(pT) == 1 920 - || gaiaExifTagGetValueType(pT) == 2 921 - || gaiaExifTagGetValueType(pT) == 6 922 - || gaiaExifTagGetValueType(pT) == 7) 923 - break; 924 - ok_human = 0; 925 - } 926 - } 927 - } 928 - sqlite3_finalize(stmt); 929 - } 930 -// commits the transaction 931 - strcpy(sql, "COMMIT"); 932 - ret = sqlite3_exec(SqliteHandle, sql, NULL, NULL, &errMsg); 933 - if (ret != SQLITE_OK) 934 - { 935 - wxMessageBox(wxT("COMMIT error: ") + wxString::FromUTF8(errMsg), 936 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 937 - sqlite3_free(errMsg); 938 - } 939 - return true; 940 -abort: 941 -// rolling back the transaction 942 - strcpy(sql, "ROLLBACK"); 943 - ret = sqlite3_exec(SqliteHandle, sql, NULL, NULL, &errMsg); 944 - if (ret != SQLITE_OK) 945 - { 946 - wxMessageBox(wxT("ROLLBACK error: ") + wxString::FromUTF8(errMsg), 947 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 948 - sqlite3_free(errMsg); 949 - } 950 - return false; 951 -} 952 - 953 -sqlite3_int64 MyFrame::GetPixelX(gaiaExifTagListPtr tag_list, bool * ok) 954 -{ 955 -// 956 -// trying to retrieve the ExifImageWidth 957 -// 958 - *ok = false; 959 - if (!tag_list) 960 - return 0; 961 - gaiaExifTagPtr tag = tag_list->First; 962 - while (tag) 963 - { 964 - if (tag->TagId == 0xA002) 965 - { 966 - // ok, this one is the ExifImageWidth tag 967 - if (tag->Type == 3 && tag->Count == 1) 968 - { 969 - *ok = true; 970 - return *(tag->ShortValues + 0); 971 - } else if (tag->Type == 4 && tag->Count == 1) 972 - { 973 - *ok = true; 974 - return *(tag->LongValues + 0); 975 - } 976 - } 977 - tag = tag->Next; 978 - } 979 - return false; 980 -} 981 - 982 -sqlite3_int64 MyFrame::GetPixelY(gaiaExifTagListPtr tag_list, bool * ok) 983 -{ 984 -// 985 -// trying to retrieve the ExifImageLength 986 -// 987 - *ok = false; 988 - if (!tag_list) 989 - return 0; 990 - gaiaExifTagPtr tag = tag_list->First; 991 - while (tag) 992 - { 993 - if (tag->TagId == 0xA003) 994 - { 995 - // ok, this one is the ExifImageLength tag 996 - if (tag->Type == 3 && tag->Count == 1) 997 - { 998 - *ok = true; 999 - return *(tag->ShortValues + 0); 1000 - } else if (tag->Type == 4 && tag->Count == 1) 1001 - { 1002 - *ok = true; 1003 - return *(tag->LongValues + 0); 1004 - } 1005 - } 1006 - tag = tag->Next; 1007 - } 1008 - return false; 1009 -} 1010 - 1011 -void MyFrame::GetMake(gaiaExifTagListPtr tag_list, wxString & str, bool * ok) 1012 -{ 1013 -// 1014 -// trying to retrieve the Make 1015 -// 1016 - *ok = false; 1017 - if (!tag_list) 1018 - return; 1019 - gaiaExifTagPtr tag = tag_list->First; 1020 - while (tag) 1021 - { 1022 - if (tag->TagId == 0x010F) 1023 - { 1024 - // ok, this one is the Make tag 1025 - if (tag->Type == 2) 1026 - { 1027 - *ok = true; 1028 - str = wxString::FromUTF8(tag->StringValue); 1029 - return; 1030 - } 1031 - } 1032 - tag = tag->Next; 1033 - } 1034 - return; 1035 -} 1036 - 1037 -void MyFrame::GetModel(gaiaExifTagListPtr tag_list, wxString & str, bool * ok) 1038 -{ 1039 -// 1040 -// trying to retrieve the Model 1041 -// 1042 - *ok = false; 1043 - if (!tag_list) 1044 - return; 1045 - gaiaExifTagPtr tag = tag_list->First; 1046 - while (tag) 1047 - { 1048 - if (tag->TagId == 0x0110) 1049 - { 1050 - // ok, this one is the Model tag 1051 - if (tag->Type == 2) 1052 - { 1053 - *ok = true; 1054 - str = wxString::FromUTF8(tag->StringValue); 1055 - return; 1056 - } 1057 - } 1058 - tag = tag->Next; 1059 - } 1060 - return; 1061 -} 1062 - 1063 -void MyFrame::GetDate(gaiaExifTagListPtr tag_list, wxString & str, bool * ok) 1064 -{ 1065 -// 1066 -// trying to retrieve the Date 1067 -// 1068 - *ok = false; 1069 - if (!tag_list) 1070 - return; 1071 - gaiaExifTagPtr tag = tag_list->First; 1072 - while (tag) 1073 - { 1074 - if (tag->TagId == 0x9003) 1075 - { 1076 - // ok, this one is the DateTimeOriginal tag 1077 - if (tag->Type == 2) 1078 - { 1079 - *ok = true; 1080 - str = wxString::FromUTF8(tag->StringValue); 1081 - if (str.Len() >= 19) 1082 - { 1083 - str.SetChar(4, '-'); 1084 - str.SetChar(7, '-'); 1085 - } 1086 - return; 1087 - } 1088 - } 1089 - tag = tag->Next; 1090 - } 1091 - return; 1092 -} 1093 - 1094 -void MyFrame::GetGpsCoords(gaiaExifTagListPtr tag_list, double *longitude, 1095 - double *latitude, bool * ok) 1096 -{ 1097 -// 1098 -// trying to retrieve the GPS coordinates 1099 -// 1100 - char lat_ref = '\0'; 1101 - char long_ref = '\0'; 1102 - double lat_degs = DBL_MIN; 1103 - double lat_mins = DBL_MIN; 1104 - double lat_secs = DBL_MIN; 1105 - double long_degs = DBL_MIN; 1106 - double long_mins = DBL_MIN; 1107 - double long_secs = DBL_MIN; 1108 - double dblval; 1109 - double sign; 1110 - int xok; 1111 - *ok = false; 1112 - if (!tag_list) 1113 - return; 1114 - gaiaExifTagPtr tag = tag_list->First; 1115 - while (tag) 1116 - { 1117 - if (tag->Gps && tag->TagId == 0x01) 1118 - { 1119 - // ok, this one is the GPSLatitudeRef tag 1120 - if (tag->Type == 2) 1121 - lat_ref = *(tag->StringValue); 1122 - } 1123 - if (tag->Gps && tag->TagId == 0x03) 1124 - { 1125 - // ok, this one is the GPSLongitudeRef tag 1126 - if (tag->Type == 2) 1127 - long_ref = *(tag->StringValue); 1128 - } 1129 - if (tag->Gps && tag->TagId == 0x02) 1130 - { 1131 - // ok, this one is the GPSLatitude tag 1132 - if (tag->Type == 5 && tag->Count == 3) 1133 - { 1134 - dblval = gaiaExifTagGetRationalValue(tag, 0, &xok); 1135 - if (xok) 1136 - lat_degs = dblval; 1137 - dblval = gaiaExifTagGetRationalValue(tag, 1, &xok); 1138 - if (xok) 1139 - lat_mins = dblval; 1140 - dblval = gaiaExifTagGetRationalValue(tag, 2, &xok); 1141 - if (xok) 1142 - lat_secs = dblval; 1143 - } 1144 - } 1145 - if (tag->Gps && tag->TagId == 0x04) 1146 - { 1147 - // ok, this one is the GPSLongitude tag 1148 - if (tag->Type == 5 && tag->Count == 3) 1149 - { 1150 - dblval = gaiaExifTagGetRationalValue(tag, 0, &xok); 1151 - if (xok) 1152 - long_degs = dblval; 1153 - dblval = gaiaExifTagGetRationalValue(tag, 1, &xok); 1154 - if (xok) 1155 - long_mins = dblval; 1156 - dblval = gaiaExifTagGetRationalValue(tag, 2, &xok); 1157 - if (xok) 1158 - long_secs = dblval; 1159 - } 1160 - } 1161 - tag = tag->Next; 1162 - } 1163 - if ((lat_ref == 'N' || lat_ref == 'S' || long_ref == 'E' || long_ref == 'W') 1164 - && lat_degs != DBL_MIN && lat_mins != DBL_MIN && lat_secs != DBL_MIN 1165 - && long_degs != DBL_MIN && long_mins != DBL_MIN && long_secs != DBL_MIN) 1166 - { 1167 - *ok = true; 1168 - if (lat_ref == 'S') 1169 - sign = -1.0; 1170 - else 1171 - sign = 1.0; 1172 - lat_degs = math_round(lat_degs * 1000000.0); 1173 - lat_mins = math_round(lat_mins * 1000000.0); 1174 - lat_secs = math_round(lat_secs * 1000000.0); 1175 - dblval = 1176 - math_round(lat_degs + (lat_mins / 60.0) + 1177 - (lat_secs / 3600.0)) * (sign / 1000000.0); 1178 - *latitude = dblval; 1179 - if (long_ref == 'W') 1180 - sign = -1.0; 1181 - else 1182 - sign = 1.0; 1183 - long_degs = math_round(long_degs * 1000000.0); 1184 - long_mins = math_round(long_mins * 1000000.0); 1185 - long_secs = math_round(long_secs * 1000000.0); 1186 - dblval = 1187 - math_round(long_degs + (long_mins / 60.0) + 1188 - (long_secs / 3600.0)) * (sign / 1000000.0); 1189 - *longitude = dblval; 1190 - } 1191 - return; 1192 -} 1193 - 1194 -void MyFrame::GetGpsSatellites(gaiaExifTagListPtr tag_list, wxString & str, 1195 - bool * ok) 1196 -{ 1197 -// 1198 -// trying to retrieve the GPSSatellites 1199 -// 1200 - *ok = false; 1201 - if (!tag_list) 1202 - return; 1203 - gaiaExifTagPtr tag = tag_list->First; 1204 - while (tag) 1205 - { 1206 - if (tag->Gps && tag->TagId == 0x08) 1207 - { 1208 - // ok, this one is the GPSSatellites tag 1209 - if (tag->Type == 2) 1210 - { 1211 - *ok = true; 1212 - str = wxString::FromUTF8(tag->StringValue); 1213 - return; 1214 - } 1215 - } 1216 - tag = tag->Next; 1217 - } 1218 - return; 1219 -} 1220 - 1221 -double MyFrame::GetGpsDirection(gaiaExifTagListPtr tag_list, bool * ok) 1222 -{ 1223 -// 1224 -// trying to retrieve the GPS direction 1225 -// 1226 - char dir_ref = '\0'; 1227 - double direction = DBL_MIN; 1228 - double dblval; 1229 - int xok; 1230 - *ok = false; 1231 - if (!tag_list) 1232 - return direction; 1233 - gaiaExifTagPtr tag = tag_list->First; 1234 - while (tag) 1235 - { 1236 - if (tag->Gps && tag->TagId == 0x10) 1237 - { 1238 - // ok, this one is the GPSDirectionRef tag 1239 - if (tag->Type == 2) 1240 - dir_ref = *(tag->StringValue); 1241 - } 1242 - if (tag->Gps && tag->TagId == 0x11) 1243 - { 1244 - // ok, this one is the GPSDirection tag 1245 - if (tag->Type == 5 && tag->Count == 1) 1246 - { 1247 - dblval = gaiaExifTagGetRationalValue(tag, 0, &xok); 1248 - if (xok) 1249 - direction = dblval; 1250 - } 1251 - } 1252 - tag = tag->Next; 1253 - } 1254 - if ((dir_ref == 'T' || dir_ref == 'M') && direction != DBL_MIN) 1255 - *ok = true; 1256 - return direction; 1257 -} 1258 - 1259 -void MyFrame::GetGpsTimestamp(gaiaExifTagListPtr tag_list, wxString & str, 1260 - bool * ok) 1261 -{ 1262 -// 1263 -// trying to retrieve the GPS Timestamp 1264 -// 1265 - char date[16]; 1266 - char timestamp[32]; 1267 - double hours = DBL_MIN; 1268 - double mins = DBL_MIN; 1269 - double secs = DBL_MIN; 1270 - double dblval; 1271 - int xok; 1272 - int hh; 1273 - int mm; 1274 - int ss; 1275 - int millis; 1276 - *ok = false; 1277 - if (!tag_list) 1278 - return; 1279 - strcpy(date, "0000-00-00"); 1280 - gaiaExifTagPtr tag = tag_list->First; 1281 - while (tag) 1282 - { 1283 - if (tag->Gps && tag->TagId == 0x1D) 1284 - { 1285 - // ok, this one is the GPSDateStamp tag 1286 - if (tag->Type == 2) 1287 - { 1288 - strcpy(date, tag->StringValue); 1289 - date[4] = '-'; 1290 - date[7] = '-'; 1291 - } 1292 - } 1293 - if (tag->Gps && tag->TagId == 0x07) 1294 - { 1295 - // ok, this one is the GPSTimeStamp tag 1296 - if (tag->Type == 5 && tag->Count == 3) 1297 - { 1298 - dblval = gaiaExifTagGetRationalValue(tag, 0, &xok); 1299 - if (xok) 1300 - hours = dblval; 1301 - dblval = gaiaExifTagGetRationalValue(tag, 1, &xok); 1302 - if (xok) 1303 - mins = dblval; 1304 - dblval = gaiaExifTagGetRationalValue(tag, 2, &xok); 1305 - if (xok) 1306 - secs = dblval; 1307 - } 1308 - } 1309 - tag = tag->Next; 1310 - } 1311 - if (hours != DBL_MIN && mins != DBL_MIN && secs != DBL_MIN) 1312 - { 1313 - *ok = true; 1314 - hh = (int) floor(hours); 1315 - mm = (int) floor(mins); 1316 - ss = (int) floor(secs); 1317 - millis = (int) ((secs - ss) * 1000); 1318 - sprintf(timestamp, "%s %02d:%02d:%02d.%03d", date, hh, mm, ss, millis); 1319 - str = wxString::FromUTF8(timestamp); 1320 - } 1321 - return; 1322 -}
Changes to Main.cpp.
1 1 /* 2 2 / Main.cpp 3 3 / the main core of spatialite-gui - a SQLite /SpatiaLite GUI tool 4 4 / 5 -/ version 1.2, 2008 October 9 5 +/ version 1.1, 2008 September 13 6 6 / 7 7 / Author: Sandro Furieri a-furieri@lqt.it 8 8 / 9 9 / Copyright (C) 2008 Alessandro Furieri 10 10 / 11 11 / This program is free software: you can redistribute it and/or modify 12 12 / it under the terms of the GNU General Public License as published by ................................................................................ 24 24 */ 25 25 26 26 #include "Classdef.h" 27 27 28 28 #include "wx/menu.h" 29 29 #include "wx/aboutdlg.h" 30 30 #include "wx/filename.h" 31 -#include "wx/config.h" 32 31 33 32 #include <spatialite.h> 34 33 #include <proj_api.h> 35 34 #include <geos_c.h> 36 35 37 36 // 38 37 // ICONs in XPM format [universally portable] 39 38 // 40 39 #include "icons/icon.xpm" 41 -#include "icons/icon_info.xpm" 42 40 #include "icons/create_new.xpm" 43 41 #include "icons/connect.xpm" 44 42 #include "icons/disconnect.xpm" 45 -#include "icons/memdb_load.xpm" 46 -#include "icons/memdb_new.xpm" 47 -#include "icons/memdb_clock.xpm" 48 -#include "icons/memdb_save.xpm" 49 43 #include "icons/vacuum.xpm" 50 44 #include "icons/sql_script.xpm" 51 45 #include "icons/loadshp.xpm" 52 46 #include "icons/virtshp.xpm" 53 47 #include "icons/loadtxt.xpm" 54 48 #include "icons/virttxt.xpm" 55 -#include "icons/network.xpm" 56 -#include "icons/exif.xpm" 57 49 #include "icons/srids.xpm" 58 50 #include "icons/charset.xpm" 59 51 #include "icons/help.xpm" 60 52 #include "icons/about.xpm" 61 53 #include "icons/exit.xpm" 62 54 63 -IMPLEMENT_APP(MyApp) 64 - bool MyApp::OnInit() 55 +IMPLEMENT_APP (MyApp) 56 + bool MyApp::OnInit () 65 57 { 66 58 // 67 59 // main APP implementation 68 60 // 69 - wxString path; 70 - if (argc > 1) 71 - path = argv[1]; 72 - MyFrame *frame = 73 - new MyFrame(wxT("spatialite-gui [a GUI tool for SQLite/SpatiaLite]"), 74 - wxPoint(0, 0), wxSize(640, 480), path); 75 - frame->Show(true); 76 - SetTopWindow(frame); 77 - frame->LoadConfig(); 78 - return true; 61 + wxString path; 62 + if (argc > 1) 63 + path = argv[1]; 64 + MyFrame *frame = 65 + new 66 + MyFrame (wxT ("spatialite-gui [a GUI tool for SQLite/SpatiaLite]"), 67 + wxPoint (0, 0), wxSize (640, 480), path); 68 + frame->Show (true); 69 + SetTopWindow (frame); 70 + return true; 79 71 } 80 72 81 -MyFrame::MyFrame(const wxString & title, const wxPoint & pos, const wxSize & size, wxString & path): 82 -wxFrame((wxFrame *) NULL, -1, title, pos, size) 73 +MyFrame::MyFrame (const wxString & title, const wxPoint & pos, const wxSize & size, wxString & path): 74 +wxFrame ((wxFrame *) NULL, -1, title, pos, 75 + size) 83 76 { 84 77 // 85 78 // main GUI frame constructor 86 79 // 87 - MemoryDatabase = false; 88 - AutoSaveInterval = 0; 89 - LastTotalChanges = 0; 90 - TimerAutoSave = NULL; 80 + 81 +// 82 +// setting up the BLOB signatures 83 +// 84 + Jpeg1Signature[0] = 0xff; 85 + Jpeg1Signature[1] = 0xd8; 86 + Jpeg2Signature[0] = 0xff; 87 + Jpeg2Signature[1] = 0xd9; 88 + Jpeg3Signature[0] = 0xff; 89 + Jpeg3Signature[1] = 0xd8; 90 + Jpeg3Signature[2] = 0xff; 91 + Jpeg3Signature[3] = 0xe0; 92 + JfifSignature[0] = 0x4a; 93 + JfifSignature[1] = 0x46; 94 + JfifSignature[2] = 0x49; 95 + JfifSignature[3] = 0x46; 96 + ExifSignature[0] = 0x45; 97 + ExifSignature[1] = 0x78; 98 + ExifSignature[2] = 0x69; 99 + ExifSignature[3] = 0x66; 100 + PngSignature[0] = 0x89; 101 + PngSignature[1] = 0x50; 102 + PngSignature[2] = 0x4e; 103 + PngSignature[3] = 0x47; 104 + PngSignature[4] = 0x0d; 105 + PngSignature[5] = 0x0a; 106 + PngSignature[6] = 0x1a; 107 + PngSignature[7] = 0x0a; 108 + ZipSignature[0] = 0x50; 109 + ZipSignature[1] = 0x4b; 110 + ZipSignature[2] = 0x03; 111 + ZipSignature[3] = 0x04; 112 + 91 113 // 92 114 // initializing CHARSET lists 93 115 // 94 - CharsetsLen = 79; 95 - Charsets = new wxString[CharsetsLen]; 96 - CharsetsNames = new wxString[CharsetsLen]; 97 - *(CharsetsNames + 0) = wxT("ARMSCII-8 Armenian"); 98 - *(CharsetsNames + 1) = wxT("ASCII US-ASCII"); 99 - *(CharsetsNames + 2) = wxT("BIG5 Chinese/Traditional"); 100 - *(CharsetsNames + 3) = wxT("BIG5-HKSCS Chinese/Hong Kong"); 101 - *(CharsetsNames + 4) = wxT("BIG5-HKSCS:1999"); 102 - *(CharsetsNames + 5) = wxT("BIG5-HKSCS:2001"); 103 - *(CharsetsNames + 6) = wxT("CP850 DOS/OEM Western Europe"); 104 - *(CharsetsNames + 7) = wxT("CP862 DOS/OEM Hebrew"); 105 - *(CharsetsNames + 8) = wxT("CP866 DOS/OEM Cyrillic"); 106 - *(CharsetsNames + 9) = wxT("CP874 DOS/OEM Thai"); 107 - *(CharsetsNames + 10) = wxT("CP932 DOS/OEM Japanese"); 108 - *(CharsetsNames + 11) = wxT("CP936 DOS/OEM Chinese"); 109 - *(CharsetsNames + 12) = wxT("CP949 DOS/OEM Korean"); 110 - *(CharsetsNames + 13) = wxT("CP950 DOS/OEM Chinese/Big5"); 111 - *(CharsetsNames + 14) = wxT("CP1133 Laotian"); 112 - *(CharsetsNames + 15) = wxT("CP1250 Windows Central Europe"); 113 - *(CharsetsNames + 16) = wxT("CP1251 Windows Cyrillic"); 114 - *(CharsetsNames + 17) = wxT("CP1252 Windows Latin 1"); 115 - *(CharsetsNames + 18) = wxT("CP1253 Windows Greek"); 116 - *(CharsetsNames + 19) = wxT("CP1254 Windows Turkish"); 117 - *(CharsetsNames + 20) = wxT("CP1255 Windows Hebrew"); 118 - *(CharsetsNames + 21) = wxT("CP1256 Windows Arabic"); 119 - *(CharsetsNames + 22) = wxT("CP1257 Windows Baltic"); 120 - *(CharsetsNames + 23) = wxT("CP1258 Windows Vietnamese"); 121 - *(CharsetsNames + 24) = wxT("EUC-CN Chinese"); 122 - *(CharsetsNames + 25) = wxT("EUC-JP Japanese"); 123 - *(CharsetsNames + 26) = wxT("EUC-KR Korean"); 124 - *(CharsetsNames + 27) = wxT("EUC-TW Taiwan"); 125 - *(CharsetsNames + 28) = wxT("GB18030 Chinese/National Standard"); 126 - *(CharsetsNames + 29) = wxT("GBK Chinese/Simplified"); 127 - *(CharsetsNames + 30) = wxT("Georgian-Academy"); 128 - *(CharsetsNames + 31) = wxT("Georgian-PS"); 129 - *(CharsetsNames + 32) = wxT("HZ Chinese"); 130 - *(CharsetsNames + 33) = wxT("ISO-2022-CN Chinese"); 131 - *(CharsetsNames + 34) = wxT("ISO-2022-CN-EXT"); 132 - *(CharsetsNames + 35) = wxT("ISO-2022-JP Japanese"); 133 - *(CharsetsNames + 36) = wxT("ISO-2022-JP-1"); 134 - *(CharsetsNames + 37) = wxT("ISO-2022-JP-2"); 135 - *(CharsetsNames + 38) = wxT("ISO-2022-KR Korean"); 136 - *(CharsetsNames + 39) = wxT("ISO-8859-1 Latin-1 Western European"); 137 - *(CharsetsNames + 40) = wxT("ISO-8859-2 Latin-2 Central European"); 138 - *(CharsetsNames + 41) = wxT("ISO-8859-3 Latin-3 South European"); 139 - *(CharsetsNames + 42) = wxT("ISO-8859-4 Latin-4 North European"); 140 - *(CharsetsNames + 43) = wxT("ISO-8859-5 Latin/Cyrillic"); 141 - *(CharsetsNames + 44) = wxT("ISO-8859-6 Latin/Arabic"); 142 - *(CharsetsNames + 45) = wxT("ISO-8859-7 Latin/Greek"); 143 - *(CharsetsNames + 46) = wxT("ISO-8859-8 Latin/Hebrew"); 144 - *(CharsetsNames + 47) = wxT("ISO-8859-9 Latin-5 Turkish"); 145 - *(CharsetsNames + 48) = wxT("ISO-8859-10 Latin-6 Nordic"); 146 - *(CharsetsNames + 49) = wxT("ISO-8859-11 Latin/Thai"); 147 - *(CharsetsNames + 50) = wxT("ISO-8859-13 Latin-7 Baltic Rim"); 148 - *(CharsetsNames + 51) = wxT("ISO-8859-14 Latin-8 Celtic"); 149 - *(CharsetsNames + 52) = wxT("ISO-8859-15 Latin-9"); 150 - *(CharsetsNames + 53) = wxT("ISO-8859-16 Latin-10 South-Eastern European"); 151 - *(CharsetsNames + 54) = wxT("JOHAB Korean"); 152 - *(CharsetsNames + 55) = wxT("KOI8-R Russian"); 153 - *(CharsetsNames + 56) = wxT("KOI8-U Ukrainian"); 154 - *(CharsetsNames + 57) = wxT("KOI8-RU Belarusian"); 155 - *(CharsetsNames + 58) = wxT("KOI8-T Tajik"); 156 - *(CharsetsNames + 59) = wxT("MacArabic MAC Arabic"); 157 - *(CharsetsNames + 60) = wxT("MacCentralEurope"); 158 - *(CharsetsNames + 61) = wxT("MacCroatian MAC Croatian"); 159 - *(CharsetsNames + 62) = wxT("MacCyrillic MAC Cyrillic"); 160 - *(CharsetsNames + 63) = wxT("MacGreek MAC Greek"); 161 - *(CharsetsNames + 64) = wxT("MacHebrew MAC Hebrew"); 162 - *(CharsetsNames + 65) = wxT("MacIceland MAC Iceland"); 163 - *(CharsetsNames + 66) = wxT("Macintosh"); 164 - *(CharsetsNames + 67) = wxT("MacRoman MAC European/Western languages"); 165 - *(CharsetsNames + 68) = wxT("MacRomania MAC Romania"); 166 - *(CharsetsNames + 69) = wxT("MacThai MAC Thai"); 167 - *(CharsetsNames + 70) = wxT("MacTurkish MAC Turkish"); 168 - *(CharsetsNames + 71) = wxT("MacUkraine MAC Ukraine"); 169 - *(CharsetsNames + 72) = wxT("MuleLao-1 Laotian"); 170 - *(CharsetsNames + 73) = wxT("PT154 Kazakh"); 171 - *(CharsetsNames + 74) = wxT("RK1048 Kazakh"); 172 - *(CharsetsNames + 75) = wxT("SHIFT_JIS Japanese"); 173 - *(CharsetsNames + 76) = wxT("TCVN Vietnamese"); 174 - *(CharsetsNames + 77) = wxT("TIS-620 Thai"); 175 - *(CharsetsNames + 77) = wxT("UTF-8 UNICODE/Universal"); 176 - *(CharsetsNames + 78) = wxT("VISCII Vietnamese"); 177 - *(Charsets + 0) = wxT("ARMSCII-8"); 178 - *(Charsets + 1) = wxT("ASCII"); 179 - *(Charsets + 2) = wxT("BIG5"); 180 - *(Charsets + 3) = wxT("BIG5-HKSCS"); 181 - *(Charsets + 4) = wxT("BIG5-HKSCS:1999"); 182 - *(Charsets + 5) = wxT("BIG5-HKSCS:2001"); 183 - *(Charsets + 6) = wxT("CP850"); 184 - *(Charsets + 7) = wxT("CP862"); 185 - *(Charsets + 8) = wxT("CP866"); 186 - *(Charsets + 9) = wxT("CP874"); 187 - *(Charsets + 10) = wxT("CP932"); 188 - *(Charsets + 11) = wxT("CP936"); 189 - *(Charsets + 12) = wxT("CP949"); 190 - *(Charsets + 13) = wxT("CP950"); 191 - *(Charsets + 14) = wxT("CP1133"); 192 - *(Charsets + 15) = wxT("CP1250"); 193 - *(Charsets + 16) = wxT("CP1251"); 194 - *(Charsets + 17) = wxT("CP1252"); 195 - *(Charsets + 18) = wxT("CP1253"); 196 - *(Charsets + 19) = wxT("CP1254"); 197 - *(Charsets + 20) = wxT("CP1255"); 198 - *(Charsets + 21) = wxT("CP1256"); 199 - *(Charsets + 22) = wxT("CP1257"); 200 - *(Charsets + 23) = wxT("CP1258"); 201 - *(Charsets + 24) = wxT("EUC-CN"); 202 - *(Charsets + 25) = wxT("EUC-JP"); 203 - *(Charsets + 26) = wxT("EUC-KR"); 204 - *(Charsets + 27) = wxT("EUC-TW"); 205 - *(Charsets + 28) = wxT("GB18030"); 206 - *(Charsets + 29) = wxT("GBK"); 207 - *(Charsets + 30) = wxT("Georgian-Academy"); 208 - *(Charsets + 31) = wxT("Georgian-PS"); 209 - *(Charsets + 32) = wxT("HZ"); 210 - *(Charsets + 33) = wxT("ISO-2022-CN"); 211 - *(Charsets + 34) = wxT("ISO-2022-CN-EXT"); 212 - *(Charsets + 35) = wxT("ISO-2022-JP"); 213 - *(Charsets + 36) = wxT("ISO-2022-JP-1"); 214 - *(Charsets + 37) = wxT("ISO-2022-JP-2"); 215 - *(Charsets + 38) = wxT("ISO-2022-KR"); 216 - *(Charsets + 39) = wxT("ISO-8859-1"); 217 - *(Charsets + 40) = wxT("ISO-8859-2"); 218 - *(Charsets + 41) = wxT("ISO-8859-3"); 219 - *(Charsets + 42) = wxT("ISO-8859-4"); 220 - *(Charsets + 43) = wxT("ISO-8859-5"); 221 - *(Charsets + 44) = wxT("ISO-8859-6"); 222 - *(Charsets + 45) = wxT("ISO-8859-7"); 223 - *(Charsets + 46) = wxT("ISO-8859-8"); 224 - *(Charsets + 47) = wxT("ISO-8859-9"); 225 - *(Charsets + 48) = wxT("ISO-8859-10"); 226 - *(Charsets + 49) = wxT("ISO-8859-11"); 227 - *(Charsets + 50) = wxT("ISO-8859-13"); 228 - *(Charsets + 51) = wxT("ISO-8859-14"); 229 - *(Charsets + 52) = wxT("ISO-8859-15"); 230 - *(Charsets + 53) = wxT("ISO-8859-16"); 231 - *(Charsets + 54) = wxT("JOHAB"); 232 - *(Charsets + 55) = wxT("KOI8-R"); 233 - *(Charsets + 56) = wxT("KOI8-U"); 234 - *(Charsets + 57) = wxT("KOI8-RU"); 235 - *(Charsets + 58) = wxT("KOI8-T"); 236 - *(Charsets + 59) = wxT("MacArabic"); 237 - *(Charsets + 60) = wxT("MacCentralEurope"); 238 - *(Charsets + 61) = wxT("MacCroatian"); 239 - *(Charsets + 62) = wxT("MacCyrillic"); 240 - *(Charsets + 63) = wxT("MacGreek"); 241 - *(Charsets + 64) = wxT("MacHebrew"); 242 - *(Charsets + 65) = wxT("MacIceland"); 243 - *(Charsets + 66) = wxT("Macintosh"); 244 - *(Charsets + 67) = wxT("MacRoman"); 245 - *(Charsets + 68) = wxT("MacRomania"); 246 - *(Charsets + 69) = wxT("MacThai"); 247 - *(Charsets + 70) = wxT("MacTurkish"); 248 - *(Charsets + 71) = wxT("MacUkraine"); 249 - *(Charsets + 72) = wxT("MuleLao-1"); 250 - *(Charsets + 73) = wxT("PT154"); 251 - *(Charsets + 74) = wxT("RK1048"); 252 - *(Charsets + 75) = wxT("SHIFT_JIS"); 253 - *(Charsets + 76) = wxT("TCVN"); 254 - *(Charsets + 77) = wxT("TIS-620"); 255 - *(Charsets + 77) = wxT("UTF-8"); 256 - *(Charsets + 78) = wxT("VISCII"); 257 - LocaleCharset = wxString::FromUTF8(gaiaGetLocaleCharset()); 258 - DefaultCharset = LocaleCharset; 259 - AskCharset = false; 260 - 261 - spatialite_init(0); // loading the SpatiaLite extension 262 - 263 - HelpPane = false; 264 - SqliteHandle = NULL; 265 - SqlitePath = wxT(""); 266 - BtnConnect = new wxBitmap(connect_xpm); 267 - BtnCreateNew = new wxBitmap(create_new_xpm); 268 - BtnDisconnect = new wxBitmap(disconnect_xpm); 269 - BtnMemDbLoad = new wxBitmap(memdb_load_xpm); 270 - BtnMemDbNew = new wxBitmap(memdb_new_xpm); 271 - BtnMemDbClock = new wxBitmap(memdb_clock_xpm); 272 - BtnMemDbSave = new wxBitmap(memdb_save_xpm); 273 - BtnVacuum = new wxBitmap(vacuum_xpm); 274 - BtnSqlScript = new wxBitmap(sql_script_xpm); 275 - BtnLoadShp = new wxBitmap(loadshp_xpm); 276 - BtnVirtualShp = new wxBitmap(virtshp_xpm); 277 - BtnLoadTxt = new wxBitmap(loadtxt_xpm); 278 - BtnVirtualTxt = new wxBitmap(virttxt_xpm); 279 - BtnNetwork = new wxBitmap(network_xpm); 280 - BtnExif = new wxBitmap(exif_xpm); 281 - BtnSrids = new wxBitmap(srids_xpm); 282 - BtnCharset = new wxBitmap(charset_xpm); 283 - BtnHelp = new wxBitmap(help_xpm); 284 - BtnAbout = new wxBitmap(about_xpm); 285 - BtnExit = new wxBitmap(exit_xpm); 116 + CharsetsLen = 79; 117 + Charsets = new wxString[CharsetsLen]; 118 + CharsetsNames = new wxString[CharsetsLen]; 119 + *(CharsetsNames + 0) = wxT ("ARMSCII-8 Armenian"); 120 + *(CharsetsNames + 1) = wxT ("ASCII US-ASCII"); 121 + *(CharsetsNames + 2) = wxT ("BIG5 Chinese/Traditional"); 122 + *(CharsetsNames + 3) = wxT ("BIG5-HKSCS Chinese/Hong Kong"); 123 + *(CharsetsNames + 4) = wxT ("BIG5-HKSCS:1999"); 124 + *(CharsetsNames + 5) = wxT ("BIG5-HKSCS:2001"); 125 + *(CharsetsNames + 6) = wxT ("CP850 DOS/OEM Western Europe"); 126 + *(CharsetsNames + 7) = wxT ("CP862 DOS/OEM Hebrew"); 127 + *(CharsetsNames + 8) = wxT ("CP866 DOS/OEM Cyrillic"); 128 + *(CharsetsNames + 9) = wxT ("CP874 DOS/OEM Thai"); 129 + *(CharsetsNames + 10) = wxT ("CP932 DOS/OEM Japanese"); 130 + *(CharsetsNames + 11) = wxT ("CP936 DOS/OEM Chinese"); 131 + *(CharsetsNames + 12) = wxT ("CP949 DOS/OEM Korean"); 132 + *(CharsetsNames + 13) = wxT ("CP950 DOS/OEM Chinese/Big5"); 133 + *(CharsetsNames + 14) = wxT ("CP1133 Laotian"); 134 + *(CharsetsNames + 15) = wxT ("CP1250 Windows Central Europe"); 135 + *(CharsetsNames + 16) = wxT ("CP1251 Windows Cyrillic"); 136 + *(CharsetsNames + 17) = wxT ("CP1252 Windows Latin 1"); 137 + *(CharsetsNames + 18) = wxT ("CP1253 Windows Greek"); 138 + *(CharsetsNames + 19) = wxT ("CP1254 Windows Turkish"); 139 + *(CharsetsNames + 20) = wxT ("CP1255 Windows Hebrew"); 140 + *(CharsetsNames + 21) = wxT ("CP1256 Windows Arabic"); 141 + *(CharsetsNames + 22) = wxT ("CP1257 Windows Baltic"); 142 + *(CharsetsNames + 23) = wxT ("CP1258 Windows Vietnamese"); 143 + *(CharsetsNames + 24) = wxT ("EUC-CN Chinese"); 144 + *(CharsetsNames + 25) = wxT ("EUC-JP Japanese"); 145 + *(CharsetsNames + 26) = wxT ("EUC-KR Korean"); 146 + *(CharsetsNames + 27) = wxT ("EUC-TW Taiwan"); 147 + *(CharsetsNames + 28) = wxT ("GB18030 Chinese/National Standard"); 148 + *(CharsetsNames + 29) = wxT ("GBK Chinese/Simplified"); 149 + *(CharsetsNames + 30) = wxT ("Georgian-Academy"); 150 + *(CharsetsNames + 31) = wxT ("Georgian-PS"); 151 + *(CharsetsNames + 32) = wxT ("HZ Chinese"); 152 + *(CharsetsNames + 33) = wxT ("ISO-2022-CN Chinese"); 153 + *(CharsetsNames + 34) = wxT ("ISO-2022-CN-EXT"); 154 + *(CharsetsNames + 35) = wxT ("ISO-2022-JP Japanese"); 155 + *(CharsetsNames + 36) = wxT ("ISO-2022-JP-1"); 156 + *(CharsetsNames + 37) = wxT ("ISO-2022-JP-2"); 157 + *(CharsetsNames + 38) = wxT ("ISO-2022-KR Korean"); 158 + *(CharsetsNames + 39) = wxT ("ISO-8859-1 Latin-1 Western European"); 159 + *(CharsetsNames + 40) = wxT ("ISO-8859-2 Latin-2 Central European"); 160 + *(CharsetsNames + 41) = wxT ("ISO-8859-3 Latin-3 South European"); 161 + *(CharsetsNames + 42) = wxT ("ISO-8859-4 Latin-4 North European"); 162 + *(CharsetsNames + 43) = wxT ("ISO-8859-5 Latin/Cyrillic"); 163 + *(CharsetsNames + 44) = wxT ("ISO-8859-6 Latin/Arabic"); 164 + *(CharsetsNames + 45) = wxT ("ISO-8859-7 Latin/Greek"); 165 + *(CharsetsNames + 46) = wxT ("ISO-8859-8 Latin/Hebrew"); 166 + *(CharsetsNames + 47) = wxT ("ISO-8859-9 Latin-5 Turkish"); 167 + *(CharsetsNames + 48) = wxT ("ISO-8859-10 Latin-6 Nordic"); 168 + *(CharsetsNames + 49) = wxT ("ISO-8859-11 Latin/Thai"); 169 + *(CharsetsNames + 50) = wxT ("ISO-8859-13 Latin-7 Baltic Rim"); 170 + *(CharsetsNames + 51) = wxT ("ISO-8859-14 Latin-8 Celtic"); 171 + *(CharsetsNames + 52) = wxT ("ISO-8859-15 Latin-9"); 172 + *(CharsetsNames + 53) = 173 + wxT ("ISO-8859-16 Latin-10 South-Eastern European"); 174 + *(CharsetsNames + 54) = wxT ("JOHAB Korean"); 175 + *(CharsetsNames + 55) = wxT ("KOI8-R Russian"); 176 + *(CharsetsNames + 56) = wxT ("KOI8-U Ukrainian"); 177 + *(CharsetsNames + 57) = wxT ("KOI8-RU Belarusian"); 178 + *(CharsetsNames + 58) = wxT ("KOI8-T Tajik"); 179 + *(CharsetsNames + 59) = wxT ("MacArabic MAC Arabic"); 180 + *(CharsetsNames + 60) = wxT ("MacCentralEurope"); 181 + *(CharsetsNames + 61) = wxT ("MacCroatian MAC Croatian"); 182 + *(CharsetsNames + 62) = wxT ("MacCyrillic MAC Cyrillic"); 183 + *(CharsetsNames + 63) = wxT ("MacGreek MAC Greek"); 184 + *(CharsetsNames + 64) = wxT ("MacHebrew MAC Hebrew"); 185 + *(CharsetsNames + 65) = wxT ("MacIceland MAC Iceland"); 186 + *(CharsetsNames + 66) = wxT ("Macintosh"); 187 + *(CharsetsNames + 67) = wxT ("MacRoman MAC European/Western languages"); 188 + *(CharsetsNames + 68) = wxT ("MacRomania MAC Romania"); 189 + *(CharsetsNames + 69) = wxT ("MacThai MAC Thai"); 190 + *(CharsetsNames + 70) = wxT ("MacTurkish MAC Turkish"); 191 + *(CharsetsNames + 71) = wxT ("MacUkraine MAC Ukraine"); 192 + *(CharsetsNames + 72) = wxT ("MuleLao-1 Laotian"); 193 + *(CharsetsNames + 73) = wxT ("PT154 Kazakh"); 194 + *(CharsetsNames + 74) = wxT ("RK1048 Kazakh"); 195 + *(CharsetsNames + 75) = wxT ("SHIFT_JIS Japanese"); 196 + *(CharsetsNames + 76) = wxT ("TCVN Vietnamese"); 197 + *(CharsetsNames + 77) = wxT ("TIS-620 Thai"); 198 + *(CharsetsNames + 77) = wxT ("UTF-8 UNICODE/Universal"); 199 + *(CharsetsNames + 78) = wxT ("VISCII Vietnamese"); 200 + *(Charsets + 0) = wxT ("ARMSCII-8"); 201 + *(Charsets + 1) = wxT ("ASCII"); 202 + *(Charsets + 2) = wxT ("BIG5"); 203 + *(Charsets + 3) = wxT ("BIG5-HKSCS"); 204 + *(Charsets + 4) = wxT ("BIG5-HKSCS:1999"); 205 + *(Charsets + 5) = wxT ("BIG5-HKSCS:2001"); 206 + *(Charsets + 6) = wxT ("CP850"); 207 + *(Charsets + 7) = wxT ("CP862"); 208 + *(Charsets + 8) = wxT ("CP866"); 209 + *(Charsets + 9) = wxT ("CP874"); 210 + *(Charsets + 10) = wxT ("CP932"); 211 + *(Charsets + 11) = wxT ("CP936"); 212 + *(Charsets + 12) = wxT ("CP949"); 213 + *(Charsets + 13) = wxT ("CP950"); 214 + *(Charsets + 14) = wxT ("CP1133"); 215 + *(Charsets + 15) = wxT ("CP1250"); 216 + *(Charsets + 16) = wxT ("CP1251"); 217 + *(Charsets + 17) = wxT ("CP1252"); 218 + *(Charsets + 18) = wxT ("CP1253"); 219 + *(Charsets + 19) = wxT ("CP1254"); 220 + *(Charsets + 20) = wxT ("CP1255"); 221 + *(Charsets + 21) = wxT ("CP1256"); 222 + *(Charsets + 22) = wxT ("CP1257"); 223 + *(Charsets + 23) = wxT ("CP1258"); 224 + *(Charsets + 24) = wxT ("EUC-CN"); 225 + *(Charsets + 25) = wxT ("EUC-JP"); 226 + *(Charsets + 26) = wxT ("EUC-KR"); 227 + *(Charsets + 27) = wxT ("EUC-TW"); 228 + *(Charsets + 28) = wxT ("GB18030"); 229 + *(Charsets + 29) = wxT ("GBK"); 230 + *(Charsets + 30) = wxT ("Georgian-Academy"); 231 + *(Charsets + 31) = wxT ("Georgian-PS"); 232 + *(Charsets + 32) = wxT ("HZ"); 233 + *(Charsets + 33) = wxT ("ISO-2022-CN"); 234 + *(Charsets + 34) = wxT ("ISO-2022-CN-EXT"); 235 + *(Charsets + 35) = wxT ("ISO-2022-JP"); 236 + *(Charsets + 36) = wxT ("ISO-2022-JP-1"); 237 + *(Charsets + 37) = wxT ("ISO-2022-JP-2"); 238 + *(Charsets + 38) = wxT ("ISO-2022-KR"); 239 + *(Charsets + 39) = wxT ("ISO-8859-1"); 240 + *(Charsets + 40) = wxT ("ISO-8859-2"); 241 + *(Charsets + 41) = wxT ("ISO-8859-3"); 242 + *(Charsets + 42) = wxT ("ISO-8859-4"); 243 + *(Charsets + 43) = wxT ("ISO-8859-5"); 244 + *(Charsets + 44) = wxT ("ISO-8859-6"); 245 + *(Charsets + 45) = wxT ("ISO-8859-7"); 246 + *(Charsets + 46) = wxT ("ISO-8859-8"); 247 + *(Charsets + 47) = wxT ("ISO-8859-9"); 248 + *(Charsets + 48) = wxT ("ISO-8859-10"); 249 + *(Charsets + 49) = wxT ("ISO-8859-11"); 250 + *(Charsets + 50) = wxT ("ISO-8859-13"); 251 + *(Charsets + 51) = wxT ("ISO-8859-14"); 252 + *(Charsets + 52) = wxT ("ISO-8859-15"); 253 + *(Charsets + 53) = wxT ("ISO-8859-16"); 254 + *(Charsets + 54) = wxT ("JOHAB"); 255 + *(Charsets + 55) = wxT ("KOI8-R"); 256 + *(Charsets + 56) = wxT ("KOI8-U"); 257 + *(Charsets + 57) = wxT ("KOI8-RU"); 258 + *(Charsets + 58) = wxT ("KOI8-T"); 259 + *(Charsets + 59) = wxT ("MacArabic"); 260 + *(Charsets + 60) = wxT ("MacCentralEurope"); 261 + *(Charsets + 61) = wxT ("MacCroatian"); 262 + *(Charsets + 62) = wxT ("MacCyrillic"); 263 + *(Charsets + 63) = wxT ("MacGreek"); 264 + *(Charsets + 64) = wxT ("MacHebrew"); 265 + *(Charsets + 65) = wxT ("MacIceland"); 266 + *(Charsets + 66) = wxT ("Macintosh"); 267 + *(Charsets + 67) = wxT ("MacRoman"); 268 + *(Charsets + 68) = wxT ("MacRomania"); 269 + *(Charsets + 69) = wxT ("MacThai"); 270 + *(Charsets + 70) = wxT ("MacTurkish"); 271 + *(Charsets + 71) = wxT ("MacUkraine"); 272 + *(Charsets + 72) = wxT ("MuleLao-1"); 273 + *(Charsets + 73) = wxT ("PT154"); 274 + *(Charsets + 74) = wxT ("RK1048"); 275 + *(Charsets + 75) = wxT ("SHIFT_JIS"); 276 + *(Charsets + 76) = wxT ("TCVN"); 277 + *(Charsets + 77) = wxT ("TIS-620"); 278 + *(Charsets + 77) = wxT ("UTF-8"); 279 + *(Charsets + 78) = wxT ("VISCII"); 280 + LocaleCharset = wxString::FromUTF8 (gaiaGetLocaleCharset ()); 281 + DefaultCharset = LocaleCharset; 282 + AskCharset = false; 283 + 284 + spatialite_init (0); // loading the SpatiaLite extension 285 + 286 + HelpPane = false; 287 + SqliteHandle = NULL; 288 + SqlitePath = wxT (""); 289 + BtnConnect = new wxBitmap (connect_xpm); 290 + BtnCreateNew = new wxBitmap (create_new_xpm); 291 + BtnDisconnect = new wxBitmap (disconnect_xpm); 292 + BtnVacuum = new wxBitmap (vacuum_xpm); 293 + BtnSqlScript = new wxBitmap (sql_script_xpm); 294 + BtnLoadShp = new wxBitmap (loadshp_xpm); 295 + BtnVirtualShp = new wxBitmap (virtshp_xpm); 296 + BtnLoadTxt = new wxBitmap (loadtxt_xpm); 297 + BtnVirtualTxt = new wxBitmap (virttxt_xpm); 298 + BtnSrids = new wxBitmap (srids_xpm); 299 + BtnCharset = new wxBitmap (charset_xpm); 300 + BtnHelp = new wxBitmap (help_xpm); 301 + BtnAbout = new wxBitmap (about_xpm); 302 + BtnExit = new wxBitmap (exit_xpm); 286 303 287 304 // 288 305 // setting up the application icon 289 306 // 290 - wxIcon MyIcon(icon_xpm); 291 - SetIcon(MyIcon); 307 + wxIcon MyIcon (icon_xpm); 308 + SetIcon (MyIcon); 292 309 293 310 // 294 311 // setting up panes 295 312 // 296 - TableTree = new MyTableTree(this); 297 - QueryView = new MyQueryView(this); 298 - RsView = new MyResultSetView(this); 299 - Manager.SetManagedWindow(this); 300 - wxAuiPaneInfo paneSql = wxAuiPaneInfo().Top(); 301 - paneSql.Name(wxT("sql_stmt")); 302 - paneSql.CaptionVisible(false); 303 - paneSql.Floatable(true); 304 - paneSql.Dockable(true); 305 - paneSql.Movable(true); 306 - paneSql.Gripper(true); 307 - paneSql.CloseButton(false); 308 - paneSql.BestSize(wxSize(200, 120)); 309 - Manager.AddPane(QueryView, paneSql); 310 - wxAuiPaneInfo paneView = wxAuiPaneInfo().Centre(); 311 - paneView.Name(wxT("result_set")); 312 - paneView.CaptionVisible(false); 313 - paneView.Floatable(true); 314 - paneView.Dockable(true); 315 - paneView.Movable(true); 316 - paneView.Gripper(false); 317 - paneView.CloseButton(false); 318 - Manager.AddPane(RsView, paneView); 319 - wxAuiPaneInfo paneTree = wxAuiPaneInfo().Left(); 320 - paneTree.Name(wxT("tree_view")); 321 - paneTree.CaptionVisible(false); 322 - paneTree.Floatable(true); 323 - paneTree.Dockable(true); 324 - paneTree.Movable(true); 325 - paneTree.Gripper(true); 326 - paneTree.CloseButton(false); 327 - paneTree.BestSize(wxSize(200, 480)); 328 - Manager.AddPane(TableTree, paneTree, wxPoint(0, 10)); 329 - Manager.Update(); 330 - Centre(); 313 + TableTree = new MyTableTree (this); 314 + QueryView = new MyQueryView (this); 315 + Manager.SetManagedWindow (this); 316 + wxAuiPaneInfo paneView = wxAuiPaneInfo ().CenterPane (); 317 + paneView.Caption (wxT ("SQL Query")); 318 + paneView.Floatable (false); 319 + paneView.CloseButton (false); 320 + Manager.AddPane (QueryView, paneView); 321 + wxAuiPaneInfo paneTree = wxAuiPaneInfo ().Left (); 322 + paneTree.Caption (wxT ("DB Tables")); 323 + paneTree.Floatable (false); 324 + paneTree.CloseButton (false); 325 + paneTree.BestSize (wxSize (200, 480)); 326 + Manager.AddPane (TableTree, paneTree); 327 + Manager.Update (); 328 + Centre (); 331 329 332 330 // 333 331 // setting up the status bar 334 332 // 335 - wxStatusBar *statusBar = new wxStatusBar(this); 336 - SetStatusBar(statusBar); 333 + wxStatusBar *statusBar = new wxStatusBar (this); 334 + SetStatusBar (statusBar); 337 335 338 336 // 339 337 // setting up the menu bar 340 338 // 341 - wxMenu *menuFile = new wxMenu; 342 - wxMenuItem *menuItem; 343 - menuItem = 344 - new wxMenuItem(menuFile, ID_Connect, 345 - wxT("&Connecting an existing SQLite DB")); 346 - menuItem->SetBitmap(*BtnConnect); 347 - menuFile->Append(menuItem); 348 - menuItem = 349 - new wxMenuItem(menuFile, ID_CreateNew, 350 - wxT("Creating a &New (empty) SQLite DB")); 351 - menuItem->SetBitmap(*BtnCreateNew); 352 - menuFile->Append(menuItem); 353 - wxMenu *memoryMenu = new wxMenu(); 354 - menuItem = 355 - new wxMenuItem(memoryMenu, ID_MemoryDbLoad, 356 - wxT("&Loading an existing DB into the MEMORY-DB")); 357 - menuItem->SetBitmap(*BtnMemDbLoad); 358 - memoryMenu->Append(menuItem); 359 - menuItem = 360 - new wxMenuItem(memoryMenu, ID_MemoryDbNew, 361 - wxT("Creating a &New (empty) MEMORY-DB")); 362 - menuItem->SetBitmap(*BtnMemDbNew); 363 - memoryMenu->Append(menuItem); 364 - menuItem = 365 - new wxMenuItem(memoryMenu, ID_MemoryDbClock, 366 - wxT("&AutoSaving the current MEMORY-DB")); 367 - menuItem->SetBitmap(*BtnMemDbClock); 368 - memoryMenu->Append(menuItem); 369 - menuItem = 370 - new wxMenuItem(memoryMenu, ID_MemoryDbSave, 371 - wxT("&Saving the current MEMORY-DB")); 372 - menuItem->SetBitmap(*BtnMemDbSave); 373 - memoryMenu->Append(menuItem); 374 - menuFile->AppendSubMenu(memoryMenu, wxT("&MEMORY-DB")); 375 - menuItem = 376 - new wxMenuItem(menuFile, ID_Disconnect, 377 - wxT("&Disconnecting current SQLite DB")); 378 - menuItem->SetBitmap(*BtnDisconnect); 379 - menuFile->Append(menuItem); 380 - menuItem = 381 - new wxMenuItem(menuFile, ID_Disconnect, 382 - wxT("&Disconnecting current SQLite DB")); 383 - menuItem->SetBitmap(*BtnDisconnect); 384 - menuFile->Append(menuItem); 385 - menuItem = 386 - new wxMenuItem(menuFile, ID_Vacuum, 387 - wxT("&Optimizing current SQLite DB [VACUUM]")); 388 - menuItem->SetBitmap(*BtnVacuum); 389 - menuFile->Append(menuItem); 390 - menuFile->AppendSeparator(); 391 - menuItem = new wxMenuItem(menuFile, ID_SqlScript, wxT("&Execute SQL script")); 392 - menuItem->SetBitmap(*BtnSqlScript); 393 - menuFile->Append(menuItem); 394 - menuFile->AppendSeparator(); 395 - menuItem = new wxMenuItem(menuFile, ID_LoadShp, wxT("&Load Shapefile")); 396 - menuItem->SetBitmap(*BtnLoadShp); 397 - menuFile->Append(menuItem); 398 - menuItem = new wxMenuItem(menuFile, ID_VirtualShp, wxT("&Virtual Shapefile")); 399 - menuItem->SetBitmap(*BtnVirtualShp); 400 - menuFile->Append(menuItem); 401 - menuFile->AppendSeparator(); 402 - menuItem = new wxMenuItem(menuFile, ID_LoadTxt, wxT("Load CSV/&TXT")); 403 - menuItem->SetBitmap(*BtnLoadTxt); 404 - menuFile->Append(menuItem); 405 - menuItem = new wxMenuItem(menuFile, ID_VirtualTxt, wxT("Virtual &CSV/TXT")); 406 - menuItem->SetBitmap(*BtnVirtualTxt); 407 - menuFile->Append(menuItem); 408 - menuFile->AppendSeparator(); 409 - menuItem = new wxMenuItem(menuFile, ID_Network, wxT("Build &Network")); 410 - menuItem->SetBitmap(*BtnNetwork); 411 - menuFile->Append(menuItem); 412 - menuFile->AppendSeparator(); 413 - menuItem = new wxMenuItem(menuFile, ID_Exif, wxT("Import &EXIF photos")); 414 - menuItem->SetBitmap(*BtnExif); 415 - menuFile->Append(menuItem); 416 - menuFile->AppendSeparator(); 417 - menuItem = new wxMenuItem(menuFile, ID_Srids, wxT("&Search SRID by name")); 418 - menuItem->SetBitmap(*BtnSrids); 419 - menuFile->Append(menuItem); 420 - menuItem = 421 - new wxMenuItem(menuFile, ID_Charset, wxT("&Default Output Charset")); 422 - menuItem->SetBitmap(*BtnCharset); 423 - menuFile->Append(menuItem); 424 - menuFile->AppendSeparator(); 425 - menuItem = new wxMenuItem(menuFile, ID_Help, wxT("&Help")); 426 - menuItem->SetBitmap(*BtnHelp); 427 - menuItem = new wxMenuItem(menuFile, wxID_ABOUT, wxT("&About ...")); 428 - menuItem->SetBitmap(*BtnAbout); 429 - menuFile->Append(menuItem); 430 - menuFile->AppendSeparator(); 431 - menuItem = new wxMenuItem(menuFile, wxID_EXIT, wxT("&Quit")); 432 - menuItem->SetBitmap(*BtnExit); 433 - menuFile->Append(menuItem); 434 - wxMenuBar *menuBar = new wxMenuBar; 435 - menuBar->Append(menuFile, wxT("&Files")); 436 - SetMenuBar(menuBar); 339 + wxMenu *menuFile = new wxMenu; 340 + wxMenuItem *menuItem; 341 + menuItem = new wxMenuItem (menuFile, ID_Connect, 342 + wxT ("&Connecting an existing SQLite DB")); 343 + menuItem->SetBitmap (*BtnConnect); 344 + menuFile->Append (menuItem); 345 + menuItem = new wxMenuItem (menuFile, ID_CreateNew, 346 + wxT ("Creating a &New (empty) SQLite DB")); 347 + menuItem->SetBitmap (*BtnCreateNew); 348 + menuFile->Append (menuItem); 349 + menuItem = new wxMenuItem (menuFile, ID_Disconnect, 350 + wxT ("&Disconnecting current SQLite DB")); 351 + menuItem->SetBitmap (*BtnDisconnect); 352 + menuFile->Append (menuItem); 353 + menuItem = new wxMenuItem (menuFile, ID_Vacuum, 354 + wxT ("&Optimizing current SQLite DB [VACUUM]")); 355 + menuItem->SetBitmap (*BtnVacuum); 356 + menuFile->Append (menuItem); 357 + menuFile->AppendSeparator (); 358 + menuItem = new wxMenuItem (menuFile, ID_SqlScript, 359 + wxT ("&Execute SQL script")); 360 + menuItem->SetBitmap (*BtnSqlScript); 361 + menuFile->Append (menuItem); 362 + menuFile->AppendSeparator (); 363 + menuItem = new wxMenuItem (menuFile, ID_LoadShp, wxT ("&Load Shapefile")); 364 + menuItem->SetBitmap (*BtnLoadShp); 365 + menuFile->Append (menuItem); 366 + menuItem = new wxMenuItem (menuFile, ID_VirtualShp, 367 + wxT ("&Virtual Shapefile")); 368 + menuItem->SetBitmap (*BtnVirtualShp); 369 + menuFile->Append (menuItem); 370 + menuFile->AppendSeparator (); 371 + menuItem = new wxMenuItem (menuFile, ID_LoadTxt, wxT ("Load CSV/&TXT")); 372 + menuItem->SetBitmap (*BtnLoadTxt); 373 + menuFile->Append (menuItem); 374 + menuItem = new wxMenuItem (menuFile, ID_VirtualTxt, 375 + wxT ("Virtual &CSV/TXT")); 376 + menuItem->SetBitmap (*BtnVirtualTxt); 377 + menuFile->Append (menuItem); 378 + menuFile->AppendSeparator (); 379 + menuItem = new wxMenuItem (menuFile, ID_Srids, 380 + wxT ("&Search SRID by name")); 381 + menuItem->SetBitmap (*BtnSrids); 382 + menuFile->Append (menuItem); 383 + menuItem = new wxMenuItem (menuFile, ID_Charset, 384 + wxT ("&Default Output Charset")); 385 + menuItem->SetBitmap (*BtnCharset); 386 + menuFile->Append (menuItem); 387 + menuFile->AppendSeparator (); 388 + menuItem = new wxMenuItem (menuFile, ID_Help, wxT ("&Help")); 389 + menuItem->SetBitmap (*BtnHelp); 390 + menuItem = new wxMenuItem (menuFile, wxID_ABOUT, wxT ("&About ...")); 391 + menuItem->SetBitmap (*BtnAbout); 392 + menuFile->Append (menuItem); 393 + menuFile->AppendSeparator (); 394 + menuItem = new wxMenuItem (menuFile, wxID_EXIT, wxT ("&Quit")); 395 + menuItem->SetBitmap (*BtnExit); 396 + menuFile->Append (menuItem); 397 + wxMenuBar *menuBar = new wxMenuBar; 398 + menuBar->Append (menuFile, wxT ("&Files")); 399 + SetMenuBar (menuBar); 437 400 438 401 // 439 402 // setting up menu initial state 440 403 // 441 - menuBar->Enable(ID_Disconnect, false); 442 - menuBar->Enable(ID_MemoryDbClock, false); 443 - menuBar->Enable(ID_MemoryDbSave, false); 444 - menuBar->Enable(ID_Vacuum, false); 445 - menuBar->Enable(ID_SqlScript, false); 446 - menuBar->Enable(ID_LoadShp, false); 447 - menuBar->Enable(ID_VirtualShp, false); 448 - menuBar->Enable(ID_LoadTxt, false); 449 - menuBar->Enable(ID_VirtualTxt, false); 450 - menuBar->Enable(ID_Network, false); 451 - menuBar->Enable(ID_Exif, false); 452 - menuBar->Enable(ID_Srids, false); 404 + menuBar->Enable (ID_Disconnect, false); 405 + menuBar->Enable (ID_Vacuum, false); 406 + menuBar->Enable (ID_SqlScript, false); 407 + menuBar->Enable (ID_LoadShp, false); 408 + menuBar->Enable (ID_VirtualShp, false); 409 + menuBar->Enable (ID_LoadTxt, false); 410 + menuBar->Enable (ID_VirtualTxt, false); 411 + menuBar->Enable (ID_Srids, false); 453 412 454 413 // 455 414 // setting up the toolbar 456 415 // 457 - wxToolBar *toolBar = CreateToolBar(); 458 - toolBar->AddTool(ID_Connect, wxT("Connecting an existing SQLite DB"), 459 - *BtnConnect, wxNullBitmap, wxITEM_NORMAL, 460 - wxT("Connecting an existing SQLite DB")); 461 - toolBar->AddTool(ID_CreateNew, wxT("Creating a &New (empty) SQLite DB"), 462 - *BtnCreateNew, wxNullBitmap, wxITEM_NORMAL, 463 - wxT("Creating a &New (empty) SQLite DB")); 464 - toolBar->AddTool(ID_MemoryDbLoad, 465 - wxT("Loading an existing DB into the MEMORY-DB"), 466 - *BtnMemDbLoad, wxNullBitmap, wxITEM_NORMAL, 467 - wxT("Loading an existing DB into the MEMORY-DB")); 468 - toolBar->AddTool(ID_MemoryDbNew, wxT("Creating a New (empty) MEMORY-DB"), 469 - *BtnMemDbNew, wxNullBitmap, wxITEM_NORMAL, 470 - wxT("Creating a New (empty) MEMORY-DB")); 471 - toolBar->AddTool(ID_MemoryDbClock, wxT("AutoSaving the current MEMORY-DB"), 472 - *BtnMemDbClock, wxNullBitmap, wxITEM_NORMAL, 473 - wxT("AutoSaving the current MEMORY-DB")); 474 - toolBar->AddTool(ID_MemoryDbSave, wxT("Saving the current MEMORY-DB"), 475 - *BtnMemDbSave, wxNullBitmap, wxITEM_NORMAL, 476 - wxT("Saving the current MEMORY-DB")); 477 - toolBar->AddTool(ID_Disconnect, wxT("Disconnecting current SQLite DB"), 478 - *BtnDisconnect, wxNullBitmap, wxITEM_NORMAL, 479 - wxT("Disconnecting current SQLite DB")); 480 - toolBar->AddTool(ID_Vacuum, wxT("Optimizing current SQLite DB [VACUUM]"), 481 - *BtnVacuum, wxNullBitmap, wxITEM_NORMAL, 482 - wxT("Optimizing current SQLite DB [VACUUM]")); 483 - toolBar->AddSeparator(); 484 - toolBar->AddTool(ID_SqlScript, wxT("Execute SQL script"), *BtnSqlScript, 485 - wxNullBitmap, wxITEM_NORMAL, wxT("Execute SQL script")); 486 - toolBar->AddSeparator(); 487 - toolBar->AddTool(ID_LoadShp, wxT("Load Shapefile"), *BtnLoadShp, wxNullBitmap, 488 - wxITEM_NORMAL, wxT("Load Shapefile")); 489 - toolBar->AddTool(ID_VirtualShp, wxT("Virtual Shapefile"), *BtnVirtualShp, 490 - wxNullBitmap, wxITEM_NORMAL, wxT("Virtual Shapefile")); 491 - toolBar->AddSeparator(); 492 - toolBar->AddTool(ID_LoadTxt, wxT("Load CSV/TXT"), *BtnLoadTxt, wxNullBitmap, 493 - wxITEM_NORMAL, wxT("Load CSV/TXT")); 494 - toolBar->AddTool(ID_VirtualTxt, wxT("Virtual CSV/TXT"), *BtnVirtualTxt, 495 - wxNullBitmap, wxITEM_NORMAL, wxT("Virtual CSV/TXT")); 496 - toolBar->AddSeparator(); 497 - toolBar->AddTool(ID_Network, wxT("Build Network"), *BtnNetwork, wxNullBitmap, 498 - wxITEM_NORMAL, wxT("Build Network")); 499 - toolBar->AddSeparator(); 500 - toolBar->AddTool(ID_Exif, wxT("Import EXIF photos"), *BtnExif, wxNullBitmap, 501 - wxITEM_NORMAL, wxT("Import EXIF photos")); 502 - toolBar->AddSeparator(); 503 - toolBar->AddTool(ID_Srids, wxT("Search SRID by name"), *BtnSrids, 504 - wxNullBitmap, wxITEM_NORMAL, wxT("Search SRID by name")); 505 - toolBar->AddSeparator(); 506 - toolBar->AddTool(ID_Charset, wxT("Default Output Charset"), *BtnCharset, 507 - wxNullBitmap, wxITEM_NORMAL, wxT("Default Output Charset")); 508 - toolBar->AddSeparator(); 509 - toolBar->AddTool(ID_Help, wxT("Help"), *BtnHelp, wxNullBitmap, wxITEM_NORMAL, 510 - wxT("Help")); 511 - toolBar->AddTool(wxID_ABOUT, wxT("About ..."), *BtnAbout, wxNullBitmap, 512 - wxITEM_NORMAL, wxT("About ...")); 513 - toolBar->AddSeparator(); 514 - toolBar->AddTool(wxID_EXIT, wxT("Quit"), *BtnExit, wxNullBitmap, 515 - wxITEM_NORMAL, wxT("Quit")); 516 - toolBar->Realize(); 517 - SetToolBar(toolBar); 416 + wxToolBar *toolBar = CreateToolBar (); 417 + toolBar->AddTool (ID_Connect, wxT ("Connecting an existing SQLite DB"), 418 + *BtnConnect, wxNullBitmap, 419 + wxITEM_NORMAL, wxT ("Connecting an existing SQLite DB")); 420 + toolBar->AddTool (ID_CreateNew, wxT ("Creating a &New (empty) SQLite DB"), 421 + *BtnCreateNew, wxNullBitmap, 422 + wxITEM_NORMAL, wxT ("Creating a &New (empty) SQLite DB")); 423 + toolBar->AddTool (ID_Disconnect, wxT ("Disconnecting current SQLite DB"), 424 + *BtnDisconnect, wxNullBitmap, 425 + wxITEM_NORMAL, wxT ("Disconnecting current SQLite DB")); 426 + toolBar->AddTool (ID_Vacuum, wxT ("Optimizing current SQLite DB [VACUUM]"), 427 + *BtnVacuum, wxNullBitmap, 428 + wxITEM_NORMAL, 429 + wxT ("Optimizing current SQLite DB [VACUUM]")); 430 + toolBar->AddSeparator (); 431 + toolBar->AddTool (ID_SqlScript, wxT ("Execute SQL script"), 432 + *BtnSqlScript, wxNullBitmap, 433 + wxITEM_NORMAL, wxT ("Execute SQL script")); 434 + toolBar->AddSeparator (); 435 + toolBar->AddTool (ID_LoadShp, wxT ("Load Shapefile"), 436 + *BtnLoadShp, wxNullBitmap, 437 + wxITEM_NORMAL, wxT ("Load Shapefile")); 438 + toolBar->AddTool (ID_VirtualShp, wxT ("Virtual Shapefile"), 439 + *BtnVirtualShp, wxNullBitmap, 440 + wxITEM_NORMAL, wxT ("Virtual Shapefile")); 441 + toolBar->AddSeparator (); 442 + toolBar->AddTool (ID_LoadTxt, wxT ("Load CSV/TXT"), 443 + *BtnLoadTxt, wxNullBitmap, 444 + wxITEM_NORMAL, wxT ("Load CSV/TXT")); 445 + toolBar->AddTool (ID_VirtualTxt, wxT ("Virtual CSV/TXT"), 446 + *BtnVirtualTxt, wxNullBitmap, 447 + wxITEM_NORMAL, wxT ("Virtual CSV/TXT")); 448 + toolBar->AddSeparator (); 449 + toolBar->AddTool (ID_Srids, wxT ("Search SRID by name"), 450 + *BtnSrids, wxNullBitmap, 451 + wxITEM_NORMAL, wxT ("Search SRID by name")); 452 + toolBar->AddSeparator (); 453 + toolBar->AddTool (ID_Charset, wxT ("Default Output Charset"), 454 + *BtnCharset, wxNullBitmap, 455 + wxITEM_NORMAL, wxT ("Default Output Charset")); 456 + toolBar->AddSeparator (); 457 + toolBar->AddTool (ID_Help, wxT ("Help"), *BtnHelp, wxNullBitmap, 458 + wxITEM_NORMAL, wxT ("Help")); 459 + toolBar->AddTool (wxID_ABOUT, wxT ("About ..."), *BtnAbout, wxNullBitmap, 460 + wxITEM_NORMAL, wxT ("About ...")); 461 + toolBar->AddSeparator (); 462 + toolBar->AddTool (wxID_EXIT, wxT ("Quit"), *BtnExit, wxNullBitmap, 463 + wxITEM_NORMAL, wxT ("Quit")); 464 + toolBar->Realize (); 465 + SetToolBar (toolBar); 518 466 519 467 // 520 468 // setting up the toolbar initial state 521 469 // 522 - toolBar->EnableTool(ID_Disconnect, false); 523 - toolBar->EnableTool(ID_MemoryDbClock, false); 524 - toolBar->EnableTool(ID_MemoryDbSave, false); 525 - toolBar->EnableTool(ID_Vacuum, false); 526 - toolBar->EnableTool(ID_SqlScript, false); 527 - toolBar->EnableTool(ID_LoadShp, false); 528 - toolBar->EnableTool(ID_VirtualShp, false); 529 - toolBar->EnableTool(ID_LoadTxt, false); 530 - toolBar->EnableTool(ID_VirtualTxt, false); 531 - toolBar->EnableTool(ID_Network, false); 532 - toolBar->EnableTool(ID_Exif, false); 533 - toolBar->EnableTool(ID_Srids, false); 470 + toolBar->EnableTool (ID_Disconnect, false); 471 + toolBar->EnableTool (ID_Vacuum, false); 472 + toolBar->EnableTool (ID_SqlScript, false); 473 + toolBar->EnableTool (ID_LoadShp, false); 474 + toolBar->EnableTool (ID_VirtualShp, false); 475 + toolBar->EnableTool (ID_LoadTxt, false); 476 + toolBar->EnableTool (ID_VirtualTxt, false); 477 + toolBar->EnableTool (ID_Srids, false); 534 478 535 479 // updating the status bar 536 - UpdateStatusBar(); 480 + UpdateStatusBar (); 537 481 538 482 // 539 483 // setting up event handlers for menu and toolbar 540 484 // 541 - Connect(ID_Connect, wxEVT_COMMAND_MENU_SELECTED, 542 - (wxObjectEventFunction) & MyFrame::OnConnect); 543 - Connect(ID_CreateNew, wxEVT_COMMAND_MENU_SELECTED, 544 - (wxObjectEventFunction) & MyFrame::OnCreateNew); 545 - Connect(ID_Disconnect, wxEVT_COMMAND_MENU_SELECTED, 546 - (wxObjectEventFunction) & MyFrame::OnDisconnect); 547 - Connect(ID_MemoryDbLoad, wxEVT_COMMAND_MENU_SELECTED, 548 - (wxObjectEventFunction) & MyFrame::OnMemoryDbLoad); 549 - Connect(ID_MemoryDbNew, wxEVT_COMMAND_MENU_SELECTED, 550 - (wxObjectEventFunction) & MyFrame::OnMemoryDbNew); 551 - Connect(ID_MemoryDbClock, wxEVT_COMMAND_MENU_SELECTED, 552 - (wxObjectEventFunction) & MyFrame::OnMemoryDbClock); 553 - Connect(ID_MemoryDbSave, wxEVT_COMMAND_MENU_SELECTED, 554 - (wxObjectEventFunction) & MyFrame::OnMemoryDbSave); 555 - Connect(ID_Vacuum, wxEVT_COMMAND_MENU_SELECTED, 556 - (wxObjectEventFunction) & MyFrame::OnVacuum); 557 - Connect(ID_SqlScript, wxEVT_COMMAND_MENU_SELECTED, 558 - (wxObjectEventFunction) & MyFrame::OnSqlScript); 559 - Connect(ID_LoadShp, wxEVT_COMMAND_MENU_SELECTED, 560 - (wxObjectEventFunction) & MyFrame::OnLoadShp); 561 - Connect(ID_VirtualShp, wxEVT_COMMAND_MENU_SELECTED, 562 - (wxObjectEventFunction) & MyFrame::OnVirtualShp); 563 - Connect(ID_LoadTxt, wxEVT_COMMAND_MENU_SELECTED, 564 - (wxObjectEventFunction) & MyFrame::OnLoadTxt); 565 - Connect(ID_VirtualTxt, wxEVT_COMMAND_MENU_SELECTED, 566 - (wxObjectEventFunction) & MyFrame::OnVirtualTxt); 567 - Connect(ID_Network, wxEVT_COMMAND_MENU_SELECTED, 568 - (wxObjectEventFunction) & MyFrame::OnNetwork); 569 - Connect(ID_Exif, wxEVT_COMMAND_MENU_SELECTED, 570 - (wxObjectEventFunction) & MyFrame::OnImportExifPhotos); 571 - Connect(ID_Srids, wxEVT_COMMAND_MENU_SELECTED, 572 - (wxObjectEventFunction) & MyFrame::OnSrids); 573 - Connect(ID_Charset, wxEVT_COMMAND_MENU_SELECTED, 574 - (wxObjectEventFunction) & MyFrame::OnCharset); 575 - Connect(ID_Help, wxEVT_COMMAND_MENU_SELECTED, 576 - (wxObjectEventFunction) & MyFrame::OnHelp); 577 - Connect(wxID_ABOUT, wxEVT_COMMAND_MENU_SELECTED, 578 - (wxObjectEventFunction) & MyFrame::OnAbout); 579 - Connect(wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, 580 - (wxObjectEventFunction) & MyFrame::OnQuit); 581 - Connect(wxID_ANY, wxEVT_MOTION, wxMouseEventHandler(MyFrame::OnMouseMove), 582 - NULL, this); 485 + Connect (ID_Connect, wxEVT_COMMAND_MENU_SELECTED, 486 + (wxObjectEventFunction) & MyFrame::OnConnect); 487 + Connect (ID_CreateNew, wxEVT_COMMAND_MENU_SELECTED, 488 + (wxObjectEventFunction) & MyFrame::OnCreateNew); 489 + Connect (ID_Disconnect, wxEVT_COMMAND_MENU_SELECTED, 490 + (wxObjectEventFunction) & MyFrame::OnDisconnect); 491 + Connect (ID_Vacuum, wxEVT_COMMAND_MENU_SELECTED, 492 + (wxObjectEventFunction) & MyFrame::OnVacuum); 493 + Connect (ID_SqlScript, wxEVT_COMMAND_MENU_SELECTED, 494 + (wxObjectEventFunction) & MyFrame::OnSqlScript); 495 + Connect (ID_LoadShp, wxEVT_COMMAND_MENU_SELECTED, 496 + (wxObjectEventFunction) & MyFrame::OnLoadShp); 497 + Connect (ID_VirtualShp, wxEVT_COMMAND_MENU_SELECTED, 498 + (wxObjectEventFunction) & MyFrame::OnVirtualShp); 499 + Connect (ID_LoadTxt, wxEVT_COMMAND_MENU_SELECTED, 500 + (wxObjectEventFunction) & MyFrame::OnLoadTxt); 501 + Connect (ID_VirtualTxt, wxEVT_COMMAND_MENU_SELECTED, 502 + (wxObjectEventFunction) & MyFrame::OnVirtualTxt); 503 + Connect (ID_Srids, wxEVT_COMMAND_MENU_SELECTED, 504 + (wxObjectEventFunction) & MyFrame::OnSrids); 505 + Connect (ID_Charset, wxEVT_COMMAND_MENU_SELECTED, 506 + (wxObjectEventFunction) & MyFrame::OnCharset); 507 + Connect (ID_Help, wxEVT_COMMAND_MENU_SELECTED, 508 + (wxObjectEventFunction) & MyFrame::OnHelp); 509 + Connect (wxID_ABOUT, wxEVT_COMMAND_MENU_SELECTED, 510 + (wxObjectEventFunction) & MyFrame::OnAbout); 511 + Connect (wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, 512 + (wxObjectEventFunction) & MyFrame::OnQuit); 513 + Connect (wxID_ANY, wxEVT_MOTION, 514 + wxMouseEventHandler (MyFrame::OnMouseMove), NULL, this); 583 515 584 516 // 585 517 // setting up event handlers for mouse 586 518 // 587 - TableTree->Connect(wxID_ANY, wxEVT_MOTION, 588 - wxMouseEventHandler(MyFrame::OnMouseMove), NULL, this); 589 - GetMenuBar()->Connect(wxID_ANY, wxEVT_MOTION, 590 - wxMouseEventHandler(MyFrame::OnMouseMove), NULL, this); 591 - GetStatusBar()->Connect(wxID_ANY, wxEVT_MOTION, 592 - wxMouseEventHandler(MyFrame::OnMouseMove), NULL, 593 - this); 594 -// 595 -// setting up a Timer event handler for AutoSave 596 -// 597 - Connect(ID_AUTO_SAVE_TIMER, wxEVT_TIMER, 598 - wxTimerEventHandler(MyFrame::OnTimerAutoSave), NULL, this); 519 + TableTree->Connect (wxID_ANY, wxEVT_MOTION, 520 + wxMouseEventHandler (MyFrame::OnMouseMove), NULL, this); 521 + GetMenuBar ()->Connect (wxID_ANY, wxEVT_MOTION, 522 + wxMouseEventHandler (MyFrame::OnMouseMove), NULL, 523 + this); 524 + GetStatusBar ()->Connect (wxID_ANY, wxEVT_MOTION, 525 + wxMouseEventHandler (MyFrame::OnMouseMove), NULL, 526 + this); 599 527 } 600 528 601 -MyFrame::~MyFrame() 529 +MyFrame::~MyFrame () 602 530 { 603 531 // 604 532 // main GUI frame destructor 605 533 // 606 - if (TimerAutoSave) 607 - { 608 - TimerAutoSave->Stop(); 609 - delete TimerAutoSave; 610 - } 611 - LastDitchMemoryDbSave(); 612 - ConfigLayout = Manager.SavePerspective(); 613 - GetPosition(&ConfigPaneX, &ConfigPaneY); 614 - GetSize(&ConfigPaneWidth, &ConfigPaneHeight); 615 - SaveConfig(); 616 - Manager.UnInit(); 617 - if (SqliteHandle) 618 - sqlite3_close(SqliteHandle); 619 - if (BtnConnect != NULL) 620 - delete BtnConnect; 621 - if (BtnCreateNew != NULL) 622 - delete BtnCreateNew; 623 - if (BtnDisconnect != NULL) 624 - delete BtnDisconnect; 625 - if (BtnMemDbLoad != NULL) 626 - delete BtnMemDbLoad; 627 - if (BtnMemDbNew != NULL) 628 - delete BtnMemDbNew; 629 - if (BtnMemDbClock != NULL) 630 - delete BtnMemDbClock; 631 - if (BtnMemDbSave != NULL) 632 - delete BtnMemDbSave; 633 - if (BtnVacuum != NULL) 634 - delete BtnVacuum; 635 - if (BtnSqlScript != NULL) 636 - delete BtnSqlScript; 637 - if (BtnLoadShp != NULL) 638 - delete BtnLoadShp; 639 - if (BtnVirtualShp != NULL) 640 - delete BtnVirtualShp; 641 - if (BtnLoadTxt != NULL) 642 - delete BtnLoadTxt; 643 - if (BtnVirtualTxt != NULL) 644 - delete BtnVirtualTxt; 645 - if (BtnNetwork != NULL) 646 - delete BtnNetwork; 647 - if (BtnExif != NULL) 648 - delete BtnExif; 649 - if (BtnSrids != NULL) 650 - delete BtnSrids; 651 - if (BtnHelp != NULL) 652 - delete BtnHelp; 653 - if (BtnAbout != NULL) 654 - delete BtnAbout; 655 - if (BtnExit != NULL) 656 - delete BtnExit; 657 - if (Charsets) 658 - delete[]Charsets; 659 - if (CharsetsNames) 660 - delete[]CharsetsNames; 661 -} 662 - 663 -void MyFrame::SaveConfig() 664 -{ 665 -// 666 -// saves layout configuration 667 -// 668 - 669 - wxConfig *config = new wxConfig(wxT("SpatialiteGui")); 670 - config->Write(wxT("Layout"), ConfigLayout); 671 - config->Write(wxT("PaneX"), ConfigPaneX); 672 - config->Write(wxT("PaneY"), ConfigPaneY); 673 - config->Write(wxT("PaneWidth"), ConfigPaneWidth); 674 - config->Write(wxT("PaneHeight"), ConfigPaneHeight); 675 - config->Write(wxT("SqlitePath"), SqlitePath); 676 - config->Write(wxT("LastDirectory"), LastDirectory); 677 - delete config; 678 -} 679 - 680 -void MyFrame::LoadConfig() 681 -{ 682 -// 683 -// loads layout configuration 684 -// 685 - ConfigLayout = wxT(""); 686 - ConfigDbPath = wxT(""); 687 - ConfigDir = wxT(""); 688 - wxConfig *config = new wxConfig(wxT("SpatialiteGui")); 689 - config->Read(wxT("Layout"), &ConfigLayout); 690 - config->Read(wxT("PaneX"), &ConfigPaneX, -1); 691 - config->Read(wxT("PaneY"), &ConfigPaneY, -1); 692 - config->Read(wxT("PaneWidth"), &ConfigPaneWidth, -1); 693 - config->Read(wxT("PaneHeight"), &ConfigPaneHeight, -1); 694 - config->Read(wxT("SqlitePath"), &ConfigDbPath); 695 - config->Read(wxT("LastDirectory"), &ConfigDir); 696 - delete config; 697 - Hide(); 698 - if (ConfigLayout.Len() > 0) 699 - Manager.LoadPerspective(ConfigLayout, true); 700 - if (ConfigPaneX >= 0 && ConfigPaneY >= 0 && ConfigPaneWidth > 0 701 - && ConfigPaneHeight > 0) 702 - SetSize(ConfigPaneX, ConfigPaneY, ConfigPaneWidth, ConfigPaneHeight); 703 - if (ConfigDir.Len() > 0) 704 - LastDirectory = ConfigDir; 705 - if (ConfigDbPath.Len() > 0) 706 - { 707 - SqlitePath = ConfigDbPath; 708 - if (OpenDB() == false) 709 - SqlitePath = wxT(""); 710 - else 711 - { 712 - bool metadata = CheckMetadata(); 713 - wxMenuBar *menuBar = GetMenuBar(); 714 - menuBar->Enable(ID_Connect, false); 715 - menuBar->Enable(ID_MemoryDbLoad, false); 716 - menuBar->Enable(ID_MemoryDbNew, false); 717 - if (MemoryDatabase == true) 718 - { 719 - menuBar->Enable(ID_MemoryDbSave, true); 720 - menuBar->Enable(ID_MemoryDbClock, true); 721 - } else 722 - { 723 - menuBar->Enable(ID_MemoryDbSave, false); 724 - menuBar->Enable(ID_MemoryDbClock, false); 725 - } 726 - menuBar->Enable(ID_CreateNew, false); 727 - menuBar->Enable(ID_Disconnect, true); 728 - menuBar->Enable(ID_Vacuum, true); 729 - menuBar->Enable(ID_SqlScript, true); 730 - menuBar->Enable(ID_LoadShp, true); 731 - menuBar->Enable(ID_VirtualShp, true); 732 - menuBar->Enable(ID_LoadTxt, true); 733 - menuBar->Enable(ID_VirtualTxt, true); 734 - menuBar->Enable(ID_Network, true); 735 - menuBar->Enable(ID_Exif, true); 736 - menuBar->Enable(ID_Srids, metadata); 737 - wxToolBar *toolBar = GetToolBar(); 738 - toolBar->EnableTool(ID_Connect, false); 739 - toolBar->EnableTool(ID_MemoryDbLoad, false); 740 - toolBar->EnableTool(ID_MemoryDbNew, false); 741 - if (MemoryDatabase == true) 742 - { 743 - toolBar->EnableTool(ID_MemoryDbSave, true); 744 - toolBar->EnableTool(ID_MemoryDbClock, true); 745 - } else 746 - { 747 - toolBar->EnableTool(ID_MemoryDbSave, false); 748 - toolBar->EnableTool(ID_MemoryDbClock, false); 749 - } 750 - toolBar->EnableTool(ID_CreateNew, false); 751 - toolBar->EnableTool(ID_Disconnect, true); 752 - toolBar->EnableTool(ID_Vacuum, true); 753 - toolBar->EnableTool(ID_SqlScript, true); 754 - toolBar->EnableTool(ID_LoadShp, true); 755 - toolBar->EnableTool(ID_VirtualShp, true); 756 - toolBar->EnableTool(ID_LoadTxt, true); 757 - toolBar->EnableTool(ID_VirtualTxt, true); 758 - toolBar->EnableTool(ID_Network, true); 759 - toolBar->EnableTool(ID_Exif, true); 760 - toolBar->EnableTool(ID_Srids, metadata); 761 - UpdateStatusBar(); 762 - } 763 - } 764 - Show(); 765 - if (AutoFDOmsg.Len() > 0) 766 - { 767 - wxMessageBox(AutoFDOmsg, wxT("spatialite-gui"), wxOK | wxICON_INFORMATION, 768 - this); 769 - AutoFDOmsg = wxT(""); 770 - } 771 -} 772 - 773 -void MyFrame::OnQuit(wxCommandEvent & WXUNUSED(event)) 534 + Manager.UnInit (); 535 + if (SqliteHandle) 536 + sqlite3_close (SqliteHandle); 537 + if (BtnConnect != NULL) 538 + delete BtnConnect; 539 + if (BtnCreateNew != NULL) 540 + delete BtnCreateNew; 541 + if (BtnDisconnect != NULL) 542 + delete BtnDisconnect; 543 + if (BtnVacuum != NULL) 544 + delete BtnVacuum; 545 + if (BtnSqlScript != NULL) 546 + delete BtnSqlScript; 547 + if (BtnLoadShp != NULL) 548 + delete BtnLoadShp; 549 + if (BtnVirtualShp != NULL) 550 + delete BtnVirtualShp; 551 + if (BtnLoadTxt != NULL) 552 + delete BtnLoadTxt; 553 + if (BtnVirtualTxt != NULL) 554 + delete BtnVirtualTxt; 555 + if (BtnSrids != NULL) 556 + delete BtnSrids; 557 + if (BtnHelp != NULL) 558 + delete BtnHelp; 559 + if (BtnAbout != NULL) 560 + delete BtnAbout; 561 + if (BtnExit != NULL) 562 + delete BtnExit; 563 + if (Charsets) 564 + delete[]Charsets; 565 + if (CharsetsNames) 566 + delete[]CharsetsNames; 567 +} 568 + 569 +void 570 +MyFrame::OnQuit (wxCommandEvent & WXUNUSED (event)) 774 571 { 775 572 // 776 573 // EXIT - event handler 777 574 // 778 - CloseDB(); 779 - Close(true); 575 + CloseDB (); 576 + Close (TRUE); 780 577 } 781 578 782 -void MyFrame::OnHelp(wxCommandEvent & WXUNUSED(event)) 579 +void 580 +MyFrame::OnHelp (wxCommandEvent & WXUNUSED (event)) 783 581 { 784 582 // 785 583 // HELP - event handler 786 584 // 787 - if (HelpPane == true) 788 - return; 789 - HelpDialog *help = new HelpDialog(this); 790 - help->Show(); 585 + if (HelpPane == true) 586 + return; 587 + HelpDialog *help = new HelpDialog (this); 588 + help->Show (); 791 589 } 792 590 793 -void MyFrame::OnAbout(wxCommandEvent & WXUNUSED(event)) 591 +void 592 +MyFrame::OnAbout (wxCommandEvent & WXUNUSED (event)) 794 593 { 795 594 // 796 595 // ABOUT dialog - event handler 797 596 // 798 - char ver[128]; 799 - wxAboutDialogInfo dlg; 800 - dlg.SetIcon(wxIcon(icon_info_xpm)); 801 - dlg.SetName(wxT("spatialite-gui")); 802 - dlg.SetVersion(wxT("v1.2")); 803 - wxString str = wxT("a GUI-tool for SQLite / SpatiaLite\n\n"); 804 - sprintf(ver, "%d.%d.%d", wxMAJOR_VERSION, wxMINOR_VERSION, wxRELEASE_NUMBER); 805 - str += wxT("wxWidgets version ") + wxString::FromUTF8(ver) + wxT("\n"); 806 - strcpy(ver, spatialite_version()); 807 - str += wxT("SpatiaLite version ") + wxString::FromUTF8(ver) + wxT("\n"); 808 - strcpy(ver, sqlite3_libversion()); 809 - str += wxT("SQLite version ") + wxString::FromUTF8(ver) + wxT("\n"); 810 - strcpy(ver, GEOSversion()); 811 - str += wxT("GEOS version ") + wxString::FromUTF8(ver) + wxT("\n"); 812 - strcpy(ver, pj_get_release()); 813 - str += wxT("PROJ.4 version ") + wxString::FromUTF8(ver) + wxT("\n\n"); 814 - str += wxT("SQLite's extension 'SpatiaLite' enabled\n"); 815 - str += wxT("SQLite's extension 'VirtualShape' enabled\n"); 816 - str += wxT("SQLite's extension 'VirtualText' enabled\n"); 817 - str += wxT("SQLite's extension 'VirtualNetwork' enabled\n"); 818 - str += wxT("SQLite's extension 'RTree' enabled\n"); 819 - str += wxT("SQLite's extension 'MbrCache' enabled\n"); 820 - str += wxT("SQLite's extension 'VirtualFDO' enabled\n\n"); 821 - dlg.SetDescription(str); 822 - dlg.SetCopyright(wxT("by Alessandro Furieri - 2008")); 823 - dlg.SetWebSite(wxT("http://www.gaia-gis.it")); 824 - wxString license = 825 - wxT("This program is free software; you can redistribute it\n"); 826 - license += 827 - wxT("and/or modify it under the terms of the GNU General Public License\n"); 828 - license += wxT("(GPL) as published by the Free Software Foundation\n\n"); 829 - license += 830 - wxT 831 - ("A copy of the GPL can be found at\nhttp://www.gnu.org/licenses/gpl.txt"); 832 - dlg.SetLicense(license); 833 - ::wxAboutBox(dlg); 834 -} 835 - 836 -void MyFrame::OnMouseMove(wxMouseEvent & event) 597 + char ver[128]; 598 + wxAboutDialogInfo dlg; 599 + dlg.SetName (wxT ("spatialite-gui")); 600 + dlg.SetVersion (wxT ("v1.1")); 601 + wxString str = wxT ("a GUI-tool for SQLite / SpatiaLite\n\n"); 602 + strcpy (ver, spatialite_version ()); 603 + str += wxT ("SpatiaLite version ") + wxString::FromUTF8 (ver) + wxT ("\n"); 604 + strcpy (ver, sqlite3_libversion ()); 605 + str += wxT ("SQLite version ") + wxString::FromUTF8 (ver) + wxT ("\n"); 606 + strcpy (ver, GEOSversion ()); 607 + str += wxT ("GEOS version ") + wxString::FromUTF8 (ver) + wxT ("\n"); 608 + strcpy (ver, pj_get_release ()); 609 + str += wxT ("PROJ.4 version ") + wxString::FromUTF8 (ver) + wxT ("\n\n"); 610 + str += wxT ("SQLite's extension 'SpatiaLite' enabled\n"); 611 + str += wxT ("SQLite's extension 'VirtualShape' enabled\n"); 612 + str += wxT ("SQLite's extension 'VirtualText' enabled\n"); 613 + str += wxT ("SQLite's extension 'RTree' enabled\n"); 614 + str += wxT ("SQLite's extension 'MbrCache' enabled\n\n"); 615 + dlg.SetDescription (str); 616 + dlg.SetCopyright (wxT ("by Alessandro Furieri - 2008")); 617 + dlg.SetWebSite (wxT ("http://www.gaia-gis.it")); 618 + wxString license = 619 + wxT ("This program is free software; you can redistribute it\n"); 620 + license += 621 + wxT 622 + ("and/or modify it under the terms of the GNU General Public License\n"); 623 + license += wxT ("(GPL) as published by the Free Software Foundation\n\n"); 624 + license += 625 + wxT 626 + ("A copy of the GPL can be found at\nhttp://www.gnu.org/licenses/gpl.txt"); 627 + dlg.SetLicense (license); 628 + ::wxAboutBox (dlg); 629 +} 630 + 631 +void 632 +MyFrame::OnMouseMove (wxMouseEvent & event) 837 633 { 838 634 // 839 635 // MOUSE motion - event handler 840 636 // 841 - UpdateStatusBar(); 637 + UpdateStatusBar (); 842 638 } 843 639 844 -void MyFrame::UpdateStatusBar() 640 +void 641 +MyFrame::UpdateStatusBar () 845 642 { 846 643 // 847 644 // updating the status bar 848 645 // 849 - if (GetStatusBar() == NULL) 850 - return; 851 - if (MemoryDatabase == true) 852 - { 853 - GetStatusBar()->SetStatusText(wxT("Current SQLite DB: MEMORY-DB"), 0); 854 - QueryView->ShowControls(); 855 - } else 856 - { 857 - if (SqlitePath.Len() < 1) 858 - GetStatusBar()->SetStatusText(wxT("not connected"), 0); 859 - else 860 - GetStatusBar()->SetStatusText(wxT("Current SQLite DB: ") + SqlitePath, 861 - 0); 862 - if (SqlitePath.Len() < 1) 863 - { 864 - QueryView->HideControls(); 865 - RsView->HideControls(); 866 - } else 867 - QueryView->ShowControls(); 868 - } 646 + if (GetStatusBar () == NULL) 647 + return; 648 + if (SqlitePath.Len () < 1) 649 + GetStatusBar ()->SetStatusText (wxT ("not connected"), 0); 650 + else 651 + GetStatusBar ()->SetStatusText (wxT ("Current SQLite DB: ") + 652 + SqlitePath, 0); 653 + if (SqlitePath.Len () < 1) 654 + QueryView->HideControls (); 655 + else 656 + QueryView->ShowSqlControls (); 869 657 } 870 658 871 -void MyFrame::OnConnect(wxCommandEvent & WXUNUSED(event)) 659 +void 660 +MyFrame::OnConnect (wxCommandEvent & WXUNUSED (event)) 872 661 { 873 662 // 874 663 // connecting to an existent SQLite DB 875 664 // 876 - int ret; 877 - wxString lastDir; 878 - wxFileDialog *fileDialog = new wxFileDialog(this, wxT("DB connection"), 879 - wxT(""), wxT("db.sqlite"), 880 - wxT 881 - ("SQLite DB (*.sqlite)|*.sqlite|All files (*.*)|*.*"), 882 - wxFD_OPEN | wxFD_FILE_MUST_EXIST, 883 - wxDefaultPosition, 884 - wxDefaultSize, 885 - wxT("filedlg")); 886 - lastDir = GetLastDirectory(); 887 - if (lastDir.Len() >= 1) 888 - fileDialog->SetDirectory(lastDir); 889 - ret = fileDialog->ShowModal(); 890 - if (ret == wxID_OK) 891 - { 892 - SqlitePath = fileDialog->GetPath(); 893 - if (OpenDB() == false) 894 - SqlitePath = wxT(""); 895 - else 896 - { 897 - wxFileName file(fileDialog->GetPath()); 898 - lastDir = file.GetPath(); 899 - SetLastDirectory(lastDir); 900 - bool metadata = CheckMetadata(); 901 - wxMenuBar *menuBar = GetMenuBar(); 902 - menuBar->Enable(ID_Connect, false); 903 - menuBar->Enable(ID_CreateNew, false); 904 - menuBar->Enable(ID_Disconnect, true); 905 - menuBar->Enable(ID_MemoryDbLoad, false); 906 - menuBar->Enable(ID_MemoryDbNew, false); 907 - if (MemoryDatabase == true) 908 - { 909 - menuBar->Enable(ID_MemoryDbSave, true); 910 - menuBar->Enable(ID_MemoryDbClock, true); 911 - } else 912 - { 913 - menuBar->Enable(ID_MemoryDbSave, false); 914 - menuBar->Enable(ID_MemoryDbClock, false); 915 - } 916 - menuBar->Enable(ID_Vacuum, true); 917 - menuBar->Enable(ID_SqlScript, true); 918 - menuBar->Enable(ID_LoadShp, true); 919 - menuBar->Enable(ID_VirtualShp, true); 920 - menuBar->Enable(ID_LoadTxt, true); 921 - menuBar->Enable(ID_VirtualTxt, true); 922 - menuBar->Enable(ID_Network, true); 923 - menuBar->Enable(ID_Exif, true); 924 - menuBar->Enable(ID_Srids, metadata); 925 - wxToolBar *toolBar = GetToolBar(); 926 - toolBar->EnableTool(ID_Connect, false); 927 - toolBar->EnableTool(ID_CreateNew, false); 928 - toolBar->EnableTool(ID_Disconnect, true); 929 - toolBar->EnableTool(ID_MemoryDbLoad, false); 930 - toolBar->EnableTool(ID_MemoryDbNew, false); 931 - if (MemoryDatabase == true) 932 - { 933 - toolBar->EnableTool(ID_MemoryDbSave, true); 934 - toolBar->EnableTool(ID_MemoryDbClock, true); 935 - } else 936 - { 937 - toolBar->EnableTool(ID_MemoryDbSave, false); 938 - toolBar->EnableTool(ID_MemoryDbClock, false); 939 - } 940 - toolBar->EnableTool(ID_Vacuum, true); 941 - toolBar->EnableTool(ID_SqlScript, true); 942 - toolBar->EnableTool(ID_LoadShp, true); 943 - toolBar->EnableTool(ID_VirtualShp, true); 944 - toolBar->EnableTool(ID_LoadTxt, true); 945 - toolBar->EnableTool(ID_VirtualTxt, true); 946 - toolBar->EnableTool(ID_Network, true); 947 - toolBar->EnableTool(ID_Exif, true); 948 - toolBar->EnableTool(ID_Srids, metadata); 949 - UpdateStatusBar(); 950 - } 951 - } 952 - if (AutoFDOmsg.Len() > 0) 953 - { 954 - wxMessageBox(AutoFDOmsg, wxT("spatialite-gui"), wxOK | wxICON_INFORMATION, 955 - this); 956 - AutoFDOmsg = wxT(""); 957 - } 958 -} 959 - 960 -void MyFrame::OnDisconnect(wxCommandEvent & WXUNUSED(event)) 665 + int ret; 666 + wxString lastDir; 667 + wxFileDialog *fileDialog = new wxFileDialog (this, wxT ("DB connection"), 668 + wxT (""), wxT ("db.sqlite"), 669 + wxT 670 + ("SQLite DB (*.sqlite)|*.sqlite|All files (*.*)|*.*"), 671 + wxFD_OPEN | 672 + wxFD_FILE_MUST_EXIST, 673 + wxDefaultPosition, 674 + wxDefaultSize, 675 + wxT ("filedlg")); 676 + lastDir = GetLastDirectory (); 677 + if (lastDir.Len () >= 1) 678 + fileDialog->SetDirectory (lastDir); 679 + ret = fileDialog->ShowModal (); 680 + if (ret == wxID_OK) 681 + { 682 + SqlitePath = fileDialog->GetPath (); 683 + if (OpenDB () == false) 684 + SqlitePath = wxT (""); 685 + else 686 + { 687 + wxFileName file (fileDialog->GetPath ()); 688 + lastDir = file.GetPath (); 689 + SetLastDirectory (lastDir); 690 + bool metadata = CheckMetadata (); 691 + wxMenuBar *menuBar = GetMenuBar (); 692 + menuBar->Enable (ID_Connect, false); 693 + menuBar->Enable (ID_CreateNew, false); 694 + menuBar->Enable (ID_Disconnect, true); 695 + menuBar->Enable (ID_Vacuum, true); 696 + menuBar->Enable (ID_SqlScript, true); 697 + menuBar->Enable (ID_LoadShp, true); 698 + menuBar->Enable (ID_VirtualShp, true); 699 + menuBar->Enable (ID_LoadTxt, true); 700 + menuBar->Enable (ID_VirtualTxt, true); 701 + menuBar->Enable (ID_Srids, metadata); 702 + wxToolBar *toolBar = GetToolBar (); 703 + toolBar->EnableTool (ID_Connect, false); 704 + toolBar->EnableTool (ID_CreateNew, false); 705 + toolBar->EnableTool (ID_Disconnect, true); 706 + toolBar->EnableTool (ID_Vacuum, true); 707 + toolBar->EnableTool (ID_SqlScript, true); 708 + toolBar->EnableTool (ID_LoadShp, true); 709 + toolBar->EnableTool (ID_VirtualShp, true); 710 + toolBar->EnableTool (ID_LoadTxt, true); 711 + toolBar->EnableTool (ID_VirtualTxt, true); 712 + toolBar->EnableTool (ID_Srids, metadata); 713 + UpdateStatusBar (); 714 + } 715 + } 716 +} 717 + 718 +void 719 +MyFrame::OnDisconnect (wxCommandEvent & WXUNUSED (event)) 961 720 { 962 721 // 963 722 // disconnecting current SQLite DB 964 723 // 965 - if (TimerAutoSave) 966 - { 967 - TimerAutoSave->Stop(); 968 - delete TimerAutoSave; 969 - TimerAutoSave = NULL; 970 - } 971 - CloseDB(); 972 - ExternalSqlitePath = wxT(""); 973 - wxMenuBar *menuBar = GetMenuBar(); 974 - menuBar->Enable(ID_Connect, true); 975 - menuBar->Enable(ID_CreateNew, true); 976 - menuBar->Enable(ID_Disconnect, false); 977 - menuBar->Enable(ID_MemoryDbLoad, true); 978 - menuBar->Enable(ID_MemoryDbNew, true); 979 - menuBar->Enable(ID_MemoryDbSave, false); 980 - menuBar->Enable(ID_MemoryDbClock, false); 981 - menuBar->Enable(ID_Vacuum, false); 982 - menuBar->Enable(ID_SqlScript, false); 983 - menuBar->Enable(ID_LoadShp, false); 984 - menuBar->Enable(ID_VirtualShp, false); 985 - menuBar->Enable(ID_LoadTxt, false); 986 - menuBar->Enable(ID_VirtualTxt, false); 987 - menuBar->Enable(ID_Network, false); 988 - menuBar->Enable(ID_Exif, false); 989 - menuBar->Enable(ID_Srids, false); 990 - wxToolBar *toolBar = GetToolBar(); 991 - toolBar->EnableTool(ID_Connect, true); 992 - toolBar->EnableTool(ID_CreateNew, true); 993 - toolBar->EnableTool(ID_Disconnect, false); 994 - toolBar->EnableTool(ID_MemoryDbLoad, true); 995 - toolBar->EnableTool(ID_MemoryDbNew, true); 996 - toolBar->EnableTool(ID_MemoryDbSave, false); 997 - toolBar->EnableTool(ID_MemoryDbClock, false); 998 - toolBar->EnableTool(ID_Vacuum, false); 999 - toolBar->EnableTool(ID_SqlScript, false); 1000 - toolBar->EnableTool(ID_LoadShp, false); 1001 - toolBar->EnableTool(ID_VirtualShp, false); 1002 - toolBar->EnableTool(ID_LoadTxt, false); 1003 - toolBar->EnableTool(ID_VirtualTxt, false); 1004 - toolBar->EnableTool(ID_Network, false); 1005 - toolBar->EnableTool(ID_Exif, false); 1006 - toolBar->EnableTool(ID_Srids, false); 1007 - UpdateStatusBar(); 1008 -} 1009 - 1010 -void MyFrame::OnCreateNew(wxCommandEvent & WXUNUSED(event)) 724 + CloseDB (); 725 + wxMenuBar *menuBar = GetMenuBar (); 726 + menuBar->Enable (ID_Connect, true); 727 + menuBar->Enable (ID_CreateNew, true); 728 + menuBar->Enable (ID_Disconnect, false); 729 + menuBar->Enable (ID_Vacuum, false); 730 + menuBar->Enable (ID_SqlScript, false); 731 + menuBar->Enable (ID_LoadShp, false); 732 + menuBar->Enable (ID_VirtualShp, false); 733 + menuBar->Enable (ID_LoadTxt, false); 734 + menuBar->Enable (ID_VirtualTxt, false); 735 + menuBar->Enable (ID_Srids, false); 736 + wxToolBar *toolBar = GetToolBar (); 737 + toolBar->EnableTool (ID_Connect, true); 738 + toolBar->EnableTool (ID_CreateNew, true); 739 + toolBar->EnableTool (ID_Disconnect, false); 740 + toolBar->EnableTool (ID_Vacuum, false); 741 + toolBar->EnableTool (ID_SqlScript, false); 742 + toolBar->EnableTool (ID_LoadShp, false); 743 + toolBar->EnableTool (ID_VirtualShp, false); 744 + toolBar->EnableTool (ID_LoadTxt, false); 745 + toolBar->EnableTool (ID_VirtualTxt, false); 746 + toolBar->EnableTool (ID_Srids, false); 747 + UpdateStatusBar (); 748 +} 749 + 750 +void 751 +MyFrame::OnCreateNew (wxCommandEvent & WXUNUSED (event)) 1011 752 { 1012 753 // 1013 754 // creating a new, empty SQLite DB 1014 755 // 1015 - int retdlg; 1016 - int ret; 1017 - wxString lastDir; 1018 - wxFileDialog *fileDialog = 1019 - new wxFileDialog(this, wxT("Creating a new, empty DB"), 1020 - wxT(""), wxT("db.sqlite"), 1021 - wxT("SQLite DB (*.sqlite)|*.sqlite|All files (*.*)|*.*"), 1022 - wxFD_SAVE | wxFD_OVERWRITE_PROMPT, wxDefaultPosition, 1023 - wxDefaultSize, 1024 - wxT("filedlg")); 1025 - lastDir = GetLastDirectory(); 1026 - if (lastDir.Len() >= 1) 1027 - fileDialog->SetDirectory(lastDir); 1028 - retdlg = fileDialog->ShowModal(); 1029 - if (retdlg == wxID_OK) 1030 - { 1031 - // creating the new DB 1032 - SqlitePath = fileDialog->GetPath(); 1033 - ret = CreateDB(); 1034 - if (ret == false) 1035 - goto error; 1036 - wxFileName file(fileDialog->GetPath()); 1037 - lastDir = file.GetPath(); 1038 - SetLastDirectory(lastDir); 1039 - wxMenuBar *menuBar = GetMenuBar(); 1040 - menuBar->Enable(ID_Connect, false); 1041 - menuBar->Enable(ID_CreateNew, false); 1042 - menuBar->Enable(ID_Disconnect, true); 1043 - menuBar->Enable(ID_MemoryDbLoad, false); 1044 - menuBar->Enable(ID_MemoryDbNew, false); 1045 - menuBar->Enable(ID_MemoryDbSave, false); 1046 - menuBar->Enable(ID_MemoryDbClock, false); 1047 - menuBar->Enable(ID_Vacuum, true); 1048 - menuBar->Enable(ID_SqlScript, true); 1049 - menuBar->Enable(ID_LoadShp, true); 1050 - menuBar->Enable(ID_VirtualShp, true); 1051 - menuBar->Enable(ID_LoadTxt, true); 1052 - menuBar->Enable(ID_VirtualTxt, true); 1053 - menuBar->Enable(ID_Network, true); 1054 - menuBar->Enable(ID_Exif, true); 1055 - menuBar->Enable(ID_Srids, false); 1056 - wxToolBar *toolBar = GetToolBar(); 1057 - toolBar->EnableTool(ID_Connect, false); 1058 - toolBar->EnableTool(ID_CreateNew, false); 1059 - toolBar->EnableTool(ID_Disconnect, true); 1060 - toolBar->EnableTool(ID_MemoryDbLoad, false); 1061 - toolBar->EnableTool(ID_MemoryDbNew, false); 1062 - toolBar->EnableTool(ID_MemoryDbSave, false); 1063 - toolBar->EnableTool(ID_MemoryDbClock, false); 1064 - toolBar->EnableTool(ID_Vacuum, true); 1065 - toolBar->EnableTool(ID_SqlScript, true); 1066 - toolBar->EnableTool(ID_LoadShp, true); 1067 - toolBar->EnableTool(ID_VirtualShp, true); 1068 - toolBar->EnableTool(ID_LoadTxt, true); 1069 - toolBar->EnableTool(ID_VirtualTxt, true); 1070 - toolBar->EnableTool(ID_Network, true); 1071 - toolBar->EnableTool(ID_Exif, true); 1072 - toolBar->EnableTool(ID_Srids, false); 1073 - UpdateStatusBar(); 1074 - return; 1075 - } else 756 + int retdlg; 757 + int ret; 758 + wxString lastDir; 759 + wxFileDialog *fileDialog = 760 + new wxFileDialog (this, wxT ("Creating a new, empty DB"), 761 + wxT (""), wxT ("db.sqlite"), 762 + wxT 763 + ("SQLite DB (*.sqlite)|*.sqlite|All files (*.*)|*.*"), 764 + wxFD_SAVE | wxFD_OVERWRITE_PROMPT, wxDefaultPosition, 765 + wxDefaultSize, 766 + wxT ("filedlg")); 767 + lastDir = GetLastDirectory (); 768 + if (lastDir.Len () >= 1) 769 + fileDialog->SetDirectory (lastDir); 770 + retdlg = fileDialog->ShowModal (); 771 + if (retdlg == wxID_OK) 772 + { 773 + // creating the new DB 774 + SqlitePath = fileDialog->GetPath (); 775 + ret = CreateDB (); 776 + if (ret == false) 777 + goto error; 778 + wxFileName file (fileDialog->GetPath ()); 779 + lastDir = file.GetPath (); 780 + SetLastDirectory (lastDir); 781 + wxMenuBar *menuBar = GetMenuBar (); 782 + menuBar->Enable (ID_Connect, false); 783 + menuBar->Enable (ID_CreateNew, false); 784 + menuBar->Enable (ID_Disconnect, true); 785 + menuBar->Enable (ID_Vacuum, true); 786 + menuBar->Enable (ID_SqlScript, true); 787 + menuBar->Enable (ID_LoadShp, true); 788 + menuBar->Enable (ID_VirtualShp, true); 789 + menuBar->Enable (ID_LoadTxt, true); 790 + menuBar->Enable (ID_VirtualTxt, true); 791 + menuBar->Enable (ID_Srids, false); 792 + wxToolBar *toolBar = GetToolBar (); 793 + toolBar->EnableTool (ID_Connect, false); 794 + toolBar->EnableTool (ID_CreateNew, false); 795 + toolBar->EnableTool (ID_Disconnect, true); 796 + toolBar->EnableTool (ID_Vacuum, true); 797 + toolBar->EnableTool (ID_SqlScript, true); 798 + toolBar->EnableTool (ID_LoadShp, true); 799 + toolBar->EnableTool (ID_VirtualShp, true); 800 + toolBar->EnableTool (ID_LoadTxt, true); 801 + toolBar->EnableTool (ID_VirtualTxt, true); 802 + toolBar->EnableTool (ID_Srids, false); 803 + UpdateStatusBar (); 804 + return; 805 + } 806 + else 807 + return; 808 + error: 809 + unlink (SqlitePath.ToUTF8 ()); 810 + wxString msg = wxT ("An error occurred\nno DB was created"); 811 + wxMessageBox (msg, wxT ("spatialite-gui"), wxOK | wxICON_ERROR, this); 1076 812 return; 1077 -error: 1078 - unlink(SqlitePath.ToUTF8()); 1079 - wxString msg = wxT("An error occurred\nno DB was created"); 1080 - wxMessageBox(msg, wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1081 - return; 1082 -} 1083 - 1084 -void MyFrame::OnMemoryDbLoad(wxCommandEvent & WXUNUSED(event)) 1085 -{ 1086 -// 1087 -// loading an external DB into the MEMORY-DB 1088 -// 1089 - sqlite3 *extSqlite = NULL; 1090 - sqlite3_backup *backup; 1091 - int retdlg; 1092 - int ret; 1093 - wxString lastDir; 1094 - char path[1024]; 1095 - wxString error; 1096 - wxFileDialog *fileDialog = 1097 - new wxFileDialog(this, wxT("Loading an existing DB into the MEMORY-DB"), 1098 - wxT(""), wxT("db.sqlite"), 1099 - wxT("SQLite DB (*.sqlite)|*.sqlite|All files (*.*)|*.*"), 1100 - wxFD_OPEN | wxFD_FILE_MUST_EXIST, 1101 - wxDefaultPosition, 1102 - wxDefaultSize, 1103 - wxT("filedlg")); 1104 - lastDir = GetLastDirectory(); 1105 - if (lastDir.Len() >= 1) 1106 - fileDialog->SetDirectory(lastDir); 1107 - retdlg = fileDialog->ShowModal(); 1108 - if (retdlg == wxID_OK) 1109 - { 1110 - // opening the external DB 1111 - ExternalSqlitePath = fileDialog->GetPath(); 1112 - strcpy(path, ExternalSqlitePath.ToUTF8()); 1113 - ret = sqlite3_open_v2(path, &extSqlite, SQLITE_OPEN_READWRITE, NULL); 1114 - if (ret) 1115 - { 1116 - // an error occurred 1117 - wxString errCause = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)); 1118 - error = wxT("Failure while connecting to DB\n\n"); 1119 - error += errCause; 1120 - error += wxT("\n"); 1121 - goto stop; 1122 - } 1123 - ret = 1124 - sqlite3_open_v2(":memory:", &SqliteHandle, 1125 - SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); 1126 - if (ret) 1127 - { 1128 - // an error occurred 1129 - wxString errCause = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)); 1130 - error = wxT("MEMORY-DB: an error occurred \n\n"); 1131 - error += errCause; 1132 - error += +wxT("\n"); 1133 - goto stop; 1134 - } 1135 - wxFileName file(fileDialog->GetPath()); 1136 - lastDir = file.GetPath(); 1137 - SetLastDirectory(lastDir); 1138 - backup = sqlite3_backup_init(SqliteHandle, "main", extSqlite, "main"); 1139 - if (!backup) 1140 - goto stop; 1141 - while (1) 1142 - { 1143 - ret = sqlite3_backup_step(backup, 1024); 1144 - if (ret == SQLITE_DONE) 1145 - break; 1146 - } 1147 - ret = sqlite3_backup_finish(backup); 1148 - sqlite3_close(extSqlite); 1149 - MemoryDatabase = true; 1150 - AutoSaveInterval = 120; 1151 - AutoFDOStart(); 1152 - InitTableTree(); 1153 - bool metadata = CheckMetadata(); 1154 - wxMenuBar *menuBar = GetMenuBar(); 1155 - menuBar->Enable(ID_Connect, false); 1156 - menuBar->Enable(ID_CreateNew, false); 1157 - menuBar->Enable(ID_Disconnect, true); 1158 - menuBar->Enable(ID_MemoryDbLoad, false); 1159 - menuBar->Enable(ID_MemoryDbNew, false); 1160 - if (MemoryDatabase == true) 1161 - { 1162 - menuBar->Enable(ID_MemoryDbSave, true); 1163 - menuBar->Enable(ID_MemoryDbClock, true); 1164 - } else 1165 - { 1166 - menuBar->Enable(ID_MemoryDbSave, false); 1167 - menuBar->Enable(ID_MemoryDbClock, false); 1168 - } 1169 - menuBar->Enable(ID_Vacuum, true); 1170 - menuBar->Enable(ID_SqlScript, true); 1171 - menuBar->Enable(ID_LoadShp, true); 1172 - menuBar->Enable(ID_VirtualShp, true); 1173 - menuBar->Enable(ID_LoadTxt, true); 1174 - menuBar->Enable(ID_VirtualTxt, true); 1175 - menuBar->Enable(ID_Network, true); 1176 - menuBar->Enable(ID_Exif, true); 1177 - menuBar->Enable(ID_Srids, metadata); 1178 - wxToolBar *toolBar = GetToolBar(); 1179 - toolBar->EnableTool(ID_Connect, false); 1180 - toolBar->EnableTool(ID_CreateNew, false); 1181 - toolBar->EnableTool(ID_Disconnect, true); 1182 - toolBar->EnableTool(ID_MemoryDbLoad, false); 1183 - toolBar->EnableTool(ID_MemoryDbNew, false); 1184 - if (MemoryDatabase == true) 1185 - { 1186 - toolBar->EnableTool(ID_MemoryDbSave, true); 1187 - toolBar->EnableTool(ID_MemoryDbClock, true); 1188 - } else 1189 - { 1190 - toolBar->EnableTool(ID_MemoryDbSave, false); 1191 - toolBar->EnableTool(ID_MemoryDbClock, false); 1192 - } 1193 - toolBar->EnableTool(ID_Vacuum, true); 1194 - toolBar->EnableTool(ID_SqlScript, true); 1195 - toolBar->EnableTool(ID_LoadShp, true); 1196 - toolBar->EnableTool(ID_VirtualShp, true); 1197 - toolBar->EnableTool(ID_LoadTxt, true); 1198 - toolBar->EnableTool(ID_VirtualTxt, true); 1199 - toolBar->EnableTool(ID_Network, true); 1200 - toolBar->EnableTool(ID_Exif, true); 1201 - toolBar->EnableTool(ID_Srids, metadata); 1202 - UpdateStatusBar(); 1203 - if (AutoSaveInterval <= 0) 1204 - { 1205 - if (TimerAutoSave) 1206 - { 1207 - TimerAutoSave->Stop(); 1208 - delete TimerAutoSave; 1209 - TimerAutoSave = NULL; 1210 - } 1211 - } else 1212 - { 1213 - // 1214 - // starting the AutoSave timer 1215 - // 1216 - if (!TimerAutoSave) 1217 - TimerAutoSave = new wxTimer(this, ID_AUTO_SAVE_TIMER); 1218 - else 1219 - TimerAutoSave->Stop(); 1220 - LastTotalChanges = 0; 1221 - TimerAutoSave->Start(AutoSaveInterval * 1000, wxTIMER_ONE_SHOT); 1222 - } 1223 - } 1224 - if (AutoFDOmsg.Len() > 0) 1225 - { 1226 - wxMessageBox(AutoFDOmsg, wxT("spatialite-gui"), wxOK | wxICON_INFORMATION, 1227 - this); 1228 - AutoFDOmsg = wxT(""); 1229 - } 1230 - return; 1231 -stop: 1232 - MemoryDatabase = false; 1233 - if (SqliteHandle) 1234 - sqlite3_close(SqliteHandle); 1235 - if (extSqlite) 1236 - sqlite3_close(extSqlite); 1237 - wxString msg = wxT("MEMORY-DB wasn't loaded\n\n"); 1238 - msg += error; 1239 - wxMessageBox(msg, wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1240 - SqliteHandle = NULL; 1241 -} 1242 - 1243 -void MyFrame::OnMemoryDbNew(wxCommandEvent & WXUNUSED(event)) 1244 -{ 1245 -// 1246 -//creating a new MEMORY-DB 1247 -// 1248 - int ret; 1249 - wxToolBar *toolBar; 1250 - wxMenuBar *menuBar; 1251 - bool metadata; 1252 - MemoryDatabase = true; 1253 - AutoSaveInterval = 120; 1254 - ExternalSqlitePath = wxT(""); 1255 -// creating the new MEMORY-DB 1256 - ret = CreateDB(); 1257 - if (ret == false) 1258 - goto error; 1259 - metadata = CheckMetadata(); 1260 - menuBar = GetMenuBar(); 1261 - menuBar->Enable(ID_Connect, false); 1262 - menuBar->Enable(ID_CreateNew, false); 1263 - menuBar->Enable(ID_Disconnect, true); 1264 - menuBar->Enable(ID_MemoryDbLoad, false); 1265 - menuBar->Enable(ID_MemoryDbNew, false); 1266 - menuBar->Enable(ID_MemoryDbSave, true); 1267 - menuBar->Enable(ID_MemoryDbClock, true); 1268 - menuBar->Enable(ID_Vacuum, true); 1269 - menuBar->Enable(ID_SqlScript, true); 1270 - menuBar->Enable(ID_LoadShp, true); 1271 - menuBar->Enable(ID_VirtualShp, true); 1272 - menuBar->Enable(ID_LoadTxt, true); 1273 - menuBar->Enable(ID_VirtualTxt, true); 1274 - menuBar->Enable(ID_Network, true); 1275 - menuBar->Enable(ID_Exif, true); 1276 - menuBar->Enable(ID_Srids, metadata); 1277 - toolBar = GetToolBar(); 1278 - toolBar->EnableTool(ID_Connect, false); 1279 - toolBar->EnableTool(ID_CreateNew, false); 1280 - toolBar->EnableTool(ID_Disconnect, true); 1281 - toolBar->EnableTool(ID_MemoryDbLoad, false); 1282 - toolBar->EnableTool(ID_MemoryDbNew, false); 1283 - toolBar->EnableTool(ID_MemoryDbSave, true); 1284 - toolBar->EnableTool(ID_MemoryDbClock, true); 1285 - toolBar->EnableTool(ID_Vacuum, true); 1286 - toolBar->EnableTool(ID_SqlScript, true); 1287 - toolBar->EnableTool(ID_LoadShp, true); 1288 - toolBar->EnableTool(ID_VirtualShp, true); 1289 - toolBar->EnableTool(ID_LoadTxt, true); 1290 - toolBar->EnableTool(ID_VirtualTxt, true); 1291 - toolBar->EnableTool(ID_Network, true); 1292 - toolBar->EnableTool(ID_Exif, true); 1293 - toolBar->EnableTool(ID_Srids, metadata); 1294 - UpdateStatusBar(); 1295 - if (AutoSaveInterval <= 0) 1296 - { 1297 - if (TimerAutoSave) 1298 - { 1299 - TimerAutoSave->Stop(); 1300 - delete TimerAutoSave; 1301 - TimerAutoSave = NULL; 1302 - } 1303 - } else 1304 - { 1305 - // 1306 - // starting the AutoSave timer 1307 - // 1308 - if (!TimerAutoSave) 1309 - TimerAutoSave = new wxTimer(this, ID_AUTO_SAVE_TIMER); 1310 - else 1311 - TimerAutoSave->Stop(); 1312 - LastTotalChanges = 0; 1313 - TimerAutoSave->Start(AutoSaveInterval * 1000, wxTIMER_ONE_SHOT); 1314 - } 1315 - return; 1316 -error: 1317 - wxString msg = wxT("An error occurred\nno MEMORY-DB was created"); 1318 - wxMessageBox(msg, wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1319 - return; 1320 -} 1321 - 1322 -bool MyFrame::MemoryDbSave() 1323 -{ 1324 -// 1325 -// trying to export the MEMORY-DB into an external DB 1326 -// 1327 - sqlite3 *extSqlite = NULL; 1328 - sqlite3_backup *backup; 1329 - char path[1024]; 1330 - char bak_path[1024]; 1331 - int ret; 1332 - wxString error; 1333 - if (ExternalSqlitePath.Len() == 0) 1334 - return false; 1335 - ::wxBeginBusyCursor(); 1336 - strcpy(path, ExternalSqlitePath.ToUTF8()); 1337 - strcpy(bak_path, path); 1338 - strcat(bak_path, ".bak"); 1339 - unlink(bak_path); 1340 - rename(path, bak_path); 1341 - ret = 1342 - sqlite3_open_v2(path, &extSqlite, 1343 - SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); 1344 - if (ret) 1345 - { 1346 - // an error occurred 1347 - wxString errCause = wxString::FromUTF8(sqlite3_errmsg(extSqlite)); 1348 - error = wxT("An error occurred\n\n"); 1349 - error += errCause; 1350 - error += +wxT("\n"); 1351 - error += ExternalSqlitePath; 1352 - goto stop; 1353 - } 1354 - backup = sqlite3_backup_init(extSqlite, "main", SqliteHandle, "main"); 1355 - if (!backup) 1356 - goto stop; 1357 - while (1) 1358 - { 1359 - ret = sqlite3_backup_step(backup, 1024); 1360 - if (ret == SQLITE_DONE) 1361 - break; 1362 - } 1363 - ret = sqlite3_backup_finish(backup); 1364 - sqlite3_close(extSqlite); 1365 - unlink(bak_path); 1366 - ::wxEndBusyCursor(); 1367 - LastTotalChanges = sqlite3_total_changes(SqliteHandle); 1368 - return true; 1369 -stop: 1370 - if (extSqlite) 1371 - sqlite3_close(extSqlite); 1372 - wxString msg = wxT("Backup failure: MEMORY-DB wasn't saved\n\n"); 1373 - msg += error; 1374 - wxMessageBox(msg, wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1375 - ExternalSqlitePath = wxT(""); 1376 - ::wxEndBusyCursor(); 1377 - return false; 1378 -} 1379 - 1380 -void MyFrame::OnMemoryDbSave(wxCommandEvent & WXUNUSED(event)) 1381 -{ 1382 -// 1383 -// exporting the MEMORY-DB into an external DB 1384 -// 1385 - int retdlg; 1386 - wxString lastDir; 1387 - if (ExternalSqlitePath.Len() > 0) 1388 - { 1389 - if (MemoryDbSave() == true) 1390 - { 1391 - wxMessageBox(wxT("Ok, MEMORY-DB was succesfully saved"), 1392 - wxT("spatialite-gui"), wxOK | wxICON_INFORMATION, this); 1393 - if (AutoSaveInterval <= 0) 1394 - { 1395 - if (TimerAutoSave) 1396 - { 1397 - TimerAutoSave->Stop(); 1398 - delete TimerAutoSave; 1399 - TimerAutoSave = NULL; 1400 - } 1401 - } else 1402 - { 1403 - // 1404 - // restarting the AutoSave timer 1405 - // 1406 - if (!TimerAutoSave) 1407 - TimerAutoSave = new wxTimer(this, ID_AUTO_SAVE_TIMER); 1408 - else 1409 - TimerAutoSave->Stop(); 1410 - TimerAutoSave->Start(AutoSaveInterval * 1000, wxTIMER_ONE_SHOT); 1411 - } 1412 - return; 1413 - } 1414 - } 1415 - wxFileDialog *fileDialog = new wxFileDialog(this, wxT("Saving the MEMORY-DB"), 1416 - wxT(""), wxT("db.sqlite"), 1417 - wxT 1418 - ("SQLite DB (*.sqlite)|*.sqlite|All files (*.*)|*.*"), 1419 - wxFD_SAVE | wxFD_OVERWRITE_PROMPT, 1420 - wxDefaultPosition, 1421 - wxDefaultSize, 1422 - wxT("filedlg")); 1423 - lastDir = GetLastDirectory(); 1424 - if (lastDir.Len() >= 1) 1425 - fileDialog->SetDirectory(lastDir); 1426 - retdlg = fileDialog->ShowModal(); 1427 - if (retdlg == wxID_OK) 1428 - { 1429 - // exporting the external DB 1430 - ExternalSqlitePath = fileDialog->GetPath(); 1431 - if (MemoryDbSave() == true) 1432 - { 1433 - wxMessageBox(wxT("Ok, MEMORY-DB was succesfully saved"), 1434 - wxT("spatialite-gui"), wxOK | wxICON_INFORMATION, this); 1435 - wxFileName file(fileDialog->GetPath()); 1436 - lastDir = file.GetPath(); 1437 - SetLastDirectory(lastDir); 1438 - if (AutoSaveInterval <= 0) 1439 - { 1440 - if (TimerAutoSave) 1441 - { 1442 - TimerAutoSave->Stop(); 1443 - delete TimerAutoSave; 1444 - TimerAutoSave = NULL; 1445 - } 1446 - } else 1447 - { 1448 - // 1449 - // restarting the AutoSave timer 1450 - // 1451 - if (!TimerAutoSave) 1452 - TimerAutoSave = new wxTimer(this, ID_AUTO_SAVE_TIMER); 1453 - else 1454 - TimerAutoSave->Stop(); 1455 - TimerAutoSave->Start(AutoSaveInterval * 1000, wxTIMER_ONE_SHOT); 1456 - } 1457 - } 1458 - } 1459 -} 1460 - 1461 -void MyFrame::OnMemoryDbClock(wxCommandEvent & WXUNUSED(event)) 1462 -{ 1463 -// 1464 -// setting up AutoSave for MEMORY-DB 1465 -// 1466 - AutoSaveDialog dlg; 1467 - dlg.Create(this, ExternalSqlitePath, AutoSaveInterval); 1468 - int ret = dlg.ShowModal(); 1469 - if (ret == wxID_OK) 1470 - { 1471 - AutoSaveInterval = dlg.GetSeconds(); 1472 - if (AutoSaveInterval <= 0) 1473 - { 1474 - // 1475 - // stopping the AutoSave timer 1476 - // 1477 - if (TimerAutoSave) 1478 - { 1479 - TimerAutoSave->Stop(); 1480 - delete TimerAutoSave; 1481 - TimerAutoSave = NULL; 1482 - } 1483 - } else 1484 - { 1485 - // 1486 - // restarting the AutoSave timer 1487 - // 1488 - if (!TimerAutoSave) 1489 - TimerAutoSave = new wxTimer(this, ID_AUTO_SAVE_TIMER); 1490 - else 1491 - TimerAutoSave->Stop(); 1492 - TimerAutoSave->Start(AutoSaveInterval * 1000, wxTIMER_ONE_SHOT); 1493 - } 1494 - } 1495 -} 1496 - 1497 -void MyFrame::OnVacuum(wxCommandEvent & WXUNUSED(event)) 813 +} 814 + 815 +void 816 +MyFrame::OnVacuum (wxCommandEvent & WXUNUSED (event)) 1498 817 { 1499 818 // 1500 819 // performing a VACUUM in order to reorganize the current DB 1501 820 // 1502 - char *errMsg = NULL; 1503 - ::wxBeginBusyCursor(); 1504 - int ret = sqlite3_exec(SqliteHandle, "ANALYZE; VACUUM;", NULL, NULL, &errMsg); 1505 - if (ret != SQLITE_OK) 1506 - { 1507 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 1508 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1509 - sqlite3_free(errMsg); 1510 - } else 1511 - { 1512 - wxMessageBox(wxT("Current DB was succesfully optimized"), 1513 - wxT("spatialite-gui"), wxOK | wxICON_INFORMATION, this); 1514 - } 1515 - ::wxEndBusyCursor(); 821 + char *errMsg = NULL; 822 + ::wxBeginBusyCursor (); 823 + int ret = 824 + sqlite3_exec (SqliteHandle, "ANALYZE; VACUUM;", NULL, NULL, &errMsg); 825 + if (ret != SQLITE_OK) 826 + { 827 + wxMessageBox (wxT ("SQLite SQL error: ") + 828 + wxString::FromUTF8 (errMsg), wxT ("spatialite-gui"), 829 + wxOK | wxICON_ERROR, this); 830 + sqlite3_free (errMsg); 831 + } 832 + else 833 + { 834 + wxMessageBox (wxT ("Current DB was succesfully optimized"), 835 + wxT ("spatialite-gui"), wxOK | wxICON_INFORMATION, 836 + this); 837 + } 838 + ::wxEndBusyCursor (); 1516 839 } 1517 840 1518 -char *MyFrame::ReadSqlLine(FILE * in, int *len, int *eof) 841 +char * 842 +MyFrame::ReadSqlLine (FILE * in, int *len, int *eof) 1519 843 { 1520 844 // 1521 845 // reading an SQL script line 1522 846 // 1523 - int c; 1524 - *eof = 0; 1525 - int size = 4096; 1526 - char *line = (char *) malloc(size); 1527 - int off = 0; 1528 - while ((c = getc(in)) != EOF) 1529 - { 1530 - // consuming input one chat at each time 1531 - if (off == size) 1532 - { 1533 - // buffer overflow; reallocating a bigger one 1534 - // presumably this is because there is some BLOB, so we'll grow by 1MB at each time 1535 - size += 1024 * 1024; 1536 - line = (char *) realloc(line, size); 1537 - } 1538 - *(line + off) = c; 1539 - off++; 1540 - if (c == '\n') 1541 - { 1542 - // end of line marker 1543 - *(line + off) = '\0'; 1544 - *len = off; 1545 - return line; 1546 - } 1547 - if (c == ';') 1548 - { 1549 - // end of SQL statement marker 1550 - *(line + off) = '\0'; 1551 - *len = off; 1552 - return line; 1553 - } 1554 - } 847 + int c; 848 + *eof = 0; 849 + int size = 4096; 850 + char *line = (char *) malloc (size); 851 + int off = 0; 852 + while ((c = getc (in)) != EOF) 853 + { 854 + // consuming input one chat at each time 855 + if (off == size) 856 + { 857 + // buffer overflow; reallocating a bigger one 858 + // presumably this is because there is some BLOB, so we'll grow by 1MB at each time 859 + size += 1024 * 1024; 860 + line = (char *) realloc (line, size); 861 + } 862 + *(line + off) = c; 863 + off++; 864 + if (c == '\n') 865 + { 866 + // end of line marker 867 + *(line + off) = '\0'; 868 + *len = off; 869 + return line; 870 + } 871 + if (c == ';') 872 + { 873 + // end of SQL statement marker 874 + *(line + off) = '\0'; 875 + *len = off; 876 + return line; 877 + } 878 + } 1555 879 // EOF reached 1556 - *len = off; 1557 - *eof = 1; 1558 - return line; 880 + *len = off; 881 + *eof = 1; 882 + return line; 1559 883 } 1560 884 1561 -void MyFrame::OnSqlScript(wxCommandEvent & WXUNUSED(event)) 885 +void 886 +MyFrame::OnSqlScript (wxCommandEvent & WXUNUSED (event)) 1562 887 { 1563 888 // 1564 889 // executing an SQL Script 1565 890 // 1566 - int ret; 1567 - wxString lastDir; 1568 - wxString path; 1569 - wxString charset; 1570 - FILE *sql; 1571 - char *line = NULL; 1572 - char *statement = NULL; 1573 - int stmt_len = 0; 1574 - char *prev_stmt; 1575 - int prev_len; 1576 - int eof; 1577 - int rowNo = 1; 1578 - int stmt = 0; 1579 - int len; 1580 - wxString msg; 1581 - char dummy[128]; 1582 - void *cvtCS = NULL; 1583 - char *utf8stmt = NULL; 1584 - int cvtErr; 1585 - wxFileDialog *fileDialog = new wxFileDialog(this, wxT("SQL Script"), 1586 - wxT(""), 1587 - wxT("init_spatialite.sql"), 1588 - wxT 1589 - ("SQL script (*.sql)|*.sql|All files (*.*)|*.*"), 1590 - wxFD_OPEN | wxFD_FILE_MUST_EXIST, 1591 - wxDefaultPosition, 1592 - wxDefaultSize, 1593 - wxT("filedlg")); 1594 - lastDir = GetLastDirectory(); 1595 - if (lastDir.Len() >= 1) 1596 - fileDialog->SetDirectory(lastDir); 1597 - ret = fileDialog->ShowModal(); 1598 - if (ret == wxID_OK) 1599 - { 1600 - path = fileDialog->GetPath(); 1601 - SqlScriptDialog dlg; 1602 - dlg.Create(this, path, LocaleCharset); 1603 - ret = dlg.ShowModal(); 1604 - if (ret == wxID_OK) 1605 - charset = dlg.GetCharset(); 1606 - else 1607 - return; 1608 - // opening the SQL script 1609 - sql = fopen(path.ToUTF8(), "r"); 1610 - if (sql == NULL) 1611 - { 1612 - wxMessageBox(wxT("can't open: ") + fileDialog->GetPath(), 1613 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1614 - } else 1615 - { 1616 - wxFileName file(fileDialog->GetPath()); 1617 - lastDir = file.GetPath(); 1618 - SetLastDirectory(lastDir); 1619 - cvtCS = gaiaCreateUTF8Converter(charset.ToUTF8()); 1620 - if (!cvtCS) 1621 - { 1622 - msg = charset + wxT(": unsupported CharacterSet"); 1623 - wxMessageBox(msg, wxT("spatialite-gui"), wxOK | wxICON_WARNING, 1624 - this); 1625 - goto stop; 1626 - } 1627 - ::wxBeginBusyCursor(); 1628 - while (1) 1629 - { 1630 - // reading the SQL script lines 1631 - line = ReadSqlLine(sql, &len, &eof); 1632 - if (len > 0) 1633 - { 1634 - if (statement == NULL) 1635 - { 1636 - statement = line; 1637 - stmt_len = len; 1638 - } else 1639 - { 1640 - // appending line to SQL statement 1641 - prev_stmt = statement; 1642 - prev_len = stmt_len; 1643 - stmt_len = prev_len + len; 1644 - statement = (char *) malloc(stmt_len + 1); 1645 - memcpy(statement, prev_stmt, prev_len); 1646 - memcpy(statement + prev_len, line, len); 1647 - *(statement + stmt_len) = '\0'; 1648 - free(prev_stmt); 1649 - free(line); 1650 - line = NULL; 1651 - } 1652 - } else 1653 - { 1654 - free(line); 1655 - line = NULL; 1656 - } 1657 - if (statement) 1658 - { 1659 - if (sqlite3_complete(statement)) 1660 - { 1661 - // executing the SQL statement 1662 - utf8stmt = 1663 - gaiaConvertToUTF8(cvtCS, statement, stmt_len, &cvtErr); 1664 - free(statement); 1665 - statement = NULL; 1666 - stmt_len = 0; 1667 - if (cvtErr || !utf8stmt) 1668 - { 1669 - Rollback(); 1670 - msg = 1671 - wxT 1672 - ("SQL Script abnormal termination\nillegal character sequence"); 1673 - msg += 1674 - wxT("\n\nROLLBACK was automatically performed"); 1675 - wxMessageBox(msg, wxT("spatialite-gui"), 1676 - wxOK | wxICON_WARNING, this); 1677 - goto stop; 1678 - } 1679 - if (ExecuteSql(utf8stmt, rowNo) == false) 1680 - { 1681 - Rollback(); 1682 - msg = 1683 - wxT 1684 - ("SQL Script abnormal termination\nan error occurred"); 1685 - msg += 1686 - wxT("\n\nROLLBACK was automatically performed"); 1687 - wxMessageBox(msg, wxT("spatialite-gui"), 1688 - wxOK | wxICON_WARNING, this); 1689 - goto stop; 1690 - } else 1691 - { 1692 - stmt++; 1693 - free(utf8stmt); 1694 - utf8stmt = NULL; 1695 - } 1696 - } 1697 - } 1698 - rowNo++; 1699 - if (eof) 1700 - break; 1701 - } 1702 - sprintf(dummy, 1703 - "SQL Script normal termination\n\n%d SQL statements where performed", 1704 - stmt); 1705 - msg = wxString::FromUTF8(dummy); 1706 - wxMessageBox(msg, wxT("spatialite-gui"), wxOK | wxICON_INFORMATION, 1707 - this); 1708 - stop: 1709 - if (cvtCS) 1710 - gaiaFreeUTF8Converter(cvtCS); 1711 - if (utf8stmt) 1712 - free(utf8stmt); 1713 - if (statement) 1714 - free(statement); 1715 - if (line) 1716 - free(line); 1717 - fclose(sql); 1718 - ::wxEndBusyCursor(); 1719 - } 1720 - } 1721 -} 1722 - 1723 -void MyFrame::OnLoadShp(wxCommandEvent & WXUNUSED(event)) 891 + int ret; 892 + wxString lastDir; 893 + wxString path; 894 + wxString charset; 895 + FILE *sql; 896 + char *line = NULL; 897 + char *statement = NULL; 898 + int stmt_len = 0; 899 + char *prev_stmt; 900 + int prev_len; 901 + int eof; 902 + int rowNo = 1; 903 + int stmt = 0; 904 + int len; 905 + wxString msg; 906 + void *cvtCS = NULL; 907 + char *utf8stmt = NULL; 908 + int cvtErr; 909 + wxFileDialog *fileDialog = new wxFileDialog (this, wxT ("SQL Script"), 910 + wxT (""), 911 + wxT ("init_spatialite.sql"), 912 + wxT 913 + ("SQL script (*.sql)|*.sql|All files (*.*)|*.*"), 914 + wxFD_OPEN | 915 + wxFD_FILE_MUST_EXIST, 916 + wxDefaultPosition, 917 + wxDefaultSize, 918 + wxT ("filedlg")); 919 + lastDir = GetLastDirectory (); 920 + if (lastDir.Len () >= 1) 921 + fileDialog->SetDirectory (lastDir); 922 + ret = fileDialog->ShowModal (); 923 + if (ret == wxID_OK) 924 + { 925 + path = fileDialog->GetPath (); 926 + SqlScriptDialog dlg; 927 + dlg.Create (this, path, LocaleCharset); 928 + ret = dlg.ShowModal (); 929 + if (ret == wxID_OK) 930 + charset = dlg.GetCharset (); 931 + else 932 + return; 933 + // opening the SQL script 934 + sql = fopen (path.ToUTF8 (), "r"); 935 + if (sql == NULL) 936 + { 937 + wxMessageBox (wxT ("can't open: ") + fileDialog->GetPath (), 938 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 939 + this); 940 + } 941 + else 942 + { 943 + wxFileName file (fileDialog->GetPath ()); 944 + lastDir = file.GetPath (); 945 + SetLastDirectory (lastDir); 946 + cvtCS = gaiaCreateUTF8Converter (charset.ToUTF8 ()); 947 + if (!cvtCS) 948 + { 949 + msg = charset + wxT (": unsupported CharacterSet"); 950 + wxMessageBox (msg, wxT ("spatialite-gui"), 951 + wxOK | wxICON_WARNING, this); 952 + goto stop; 953 + } 954 + ::wxBeginBusyCursor (); 955 + while (1) 956 + { 957 + // reading the SQL script lines 958 + line = ReadSqlLine (sql, &len, &eof); 959 + if (len > 0) 960 + { 961 + if (statement == NULL) 962 + { 963 + statement = line; 964 + stmt_len = len; 965 + } 966 + else 967 + { 968 + // appending line to SQL statement 969 + prev_stmt = statement; 970 + prev_len = stmt_len; 971 + stmt_len = prev_len + len; 972 + statement = (char *) malloc (stmt_len + 1); 973 + memcpy (statement, prev_stmt, prev_len); 974 + memcpy (statement + prev_len, line, len); 975 + *(statement + stmt_len) = '\0'; 976 + free (prev_stmt); 977 + free (line); 978 + line = NULL; 979 + } 980 + } 981 + else 982 + { 983 + free (line); 984 + line = NULL; 985 + } 986 + if (statement) 987 + { 988 + if (sqlite3_complete (statement)) 989 + { 990 + // executing the SQL statement 991 + utf8stmt = 992 + gaiaConvertToUTF8 (cvtCS, statement, 993 + stmt_len, &cvtErr); 994 + free (statement); 995 + statement = NULL; 996 + stmt_len = 0; 997 + if (cvtErr || !utf8stmt) 998 + { 999 + Rollback (); 1000 + msg = 1001 + wxT 1002 + ("SQL Script abnormal termination\nillegal character sequence"); 1003 + msg += 1004 + wxT 1005 + ("\n\nROLLBACK was automatically performed"); 1006 + wxMessageBox (msg, 1007 + wxT ("spatialite-gui"), 1008 + wxOK | wxICON_WARNING, 1009 + this); 1010 + goto stop; 1011 + } 1012 + if (ExecuteSql (utf8stmt, rowNo) == false) 1013 + { 1014 + Rollback (); 1015 + msg = 1016 + wxT 1017 + ("SQL Script abnormal termination\nan error occurred"); 1018 + msg += 1019 + wxT 1020 + ("\n\nROLLBACK was automatically performed"); 1021 + wxMessageBox (msg, 1022 + wxT ("spatialite-gui"), 1023 + wxOK | wxICON_WARNING, 1024 + this); 1025 + goto stop; 1026 + } 1027 + else 1028 + { 1029 + stmt++; 1030 + free (utf8stmt); 1031 + utf8stmt = NULL; 1032 + } 1033 + } 1034 + } 1035 + rowNo++; 1036 + if (eof) 1037 + break; 1038 + } 1039 + msg.Printf (wxT 1040 + ("SQL Script normal termination\n\n%d SQL statements where performed"), 1041 + stmt); 1042 + wxMessageBox (msg, wxT ("spatialite-gui"), 1043 + wxOK | wxICON_INFORMATION, this); 1044 + stop: 1045 + if (cvtCS) 1046 + gaiaFreeUTF8Converter (cvtCS); 1047 + if (utf8stmt) 1048 + free (utf8stmt); 1049 + if (statement) 1050 + free (statement); 1051 + if (line) 1052 + free (line); 1053 + fclose (sql); 1054 + ::wxEndBusyCursor (); 1055 + } 1056 + } 1057 +} 1058 + 1059 +void 1060 +MyFrame::OnLoadShp (wxCommandEvent & WXUNUSED (event)) 1724 1061 { 1725 1062 // 1726 1063 // loading a shapefile 1727 1064 // 1728 - int ret; 1729 - wxString table; 1730 - wxString column = wxT("Geometry"); 1731 - wxString charset; 1732 - int srid = -1; 1733 - wxString path; 1734 - wxString lastDir; 1735 - wxFileDialog *fileDialog = new wxFileDialog(this, wxT("Load Shapefile"), 1736 - wxT(""), 1737 - wxT("shapefile.shp"), 1738 - wxT 1739 - ("Shapefile (*.shp)|*.shp|All files (*.*)|*.*"), 1740 - wxFD_OPEN | wxFD_FILE_MUST_EXIST, 1741 - wxDefaultPosition, 1742 - wxDefaultSize, 1743 - wxT("filedlg")); 1744 - lastDir = GetLastDirectory(); 1745 - if (lastDir.Len() >= 1) 1746 - fileDialog->SetDirectory(lastDir); 1747 - ret = fileDialog->ShowModal(); 1748 - if (ret == wxID_OK) 1749 - { 1750 - wxFileName file(fileDialog->GetPath()); 1751 - lastDir = file.GetPath(); 1752 - table = file.GetName(); 1753 - path = file.GetPath(); 1754 - path += file.GetPathSeparator(); 1755 - path += file.GetName(); 1756 - LoadShpDialog dlg; 1757 - dlg.Create(this, path, table, srid, column, LocaleCharset); 1758 - ret = dlg.ShowModal(); 1759 - if (ret == wxID_OK) 1760 - { 1761 - SetLastDirectory(lastDir); 1762 - table = dlg.GetTable(); 1763 - srid = dlg.GetSrid(); 1764 - column = dlg.GetColumn(); 1765 - charset = dlg.GetCharset(); 1766 - LoadShapefile(path, table, srid, column, charset); 1767 - } 1768 - } 1769 -} 1770 - 1771 -void MyFrame::OnVirtualShp(wxCommandEvent & WXUNUSED(event)) 1065 + int ret; 1066 + wxString table; 1067 + wxString column = wxT ("Geometry"); 1068 + wxString charset; 1069 + int srid = -1; 1070 + wxString path; 1071 + wxString lastDir; 1072 + wxFileDialog *fileDialog = new wxFileDialog (this, wxT ("Load Shapefile"), 1073 + wxT (""), 1074 + wxT ("shapefile.shp"), 1075 + wxT 1076 + ("Shapefile (*.shp)|*.shp|All files (*.*)|*.*"), 1077 + wxFD_OPEN | 1078 + wxFD_FILE_MUST_EXIST, 1079 + wxDefaultPosition, 1080 + wxDefaultSize, 1081 + wxT ("filedlg")); 1082 + lastDir = GetLastDirectory (); 1083 + if (lastDir.Len () >= 1) 1084 + fileDialog->SetDirectory (lastDir); 1085 + ret = fileDialog->ShowModal (); 1086 + if (ret == wxID_OK) 1087 + { 1088 + wxFileName file (fileDialog->GetPath ()); 1089 + lastDir = file.GetPath (); 1090 + table = file.GetName (); 1091 + path = file.GetPath (); 1092 + path += file.GetPathSeparator (); 1093 + path += file.GetName (); 1094 + LoadShpDialog dlg; 1095 + dlg.Create (this, path, table, srid, column, LocaleCharset); 1096 + ret = dlg.ShowModal (); 1097 + if (ret == wxID_OK) 1098 + { 1099 + SetLastDirectory (lastDir); 1100 + table = dlg.GetTable (); 1101 + srid = dlg.GetSrid (); 1102 + column = dlg.GetColumn (); 1103 + charset = dlg.GetCharset (); 1104 + LoadShapefile (path, table, srid, column, charset); 1105 + } 1106 + } 1107 +} 1108 + 1109 +void 1110 +MyFrame::OnVirtualShp (wxCommandEvent & WXUNUSED (event)) 1772 1111 { 1773 1112 // 1774 1113 // creating a VirtualShape 1775 1114 // 1776 - int ret; 1777 - wxString charset; 1778 - int srid; 1779 - char dummy[128]; 1780 - wxString sql; 1781 - wxString path; 1782 - wxString table; 1783 - wxString lastDir; 1784 - char *errMsg = NULL; 1785 - sqlite3 *sqlite = GetSqlite(); 1786 - wxFileDialog *fileDialog = new wxFileDialog(this, wxT("VirtualShape"), 1787 - wxT(""), 1788 - wxT("shapefile.shp"), 1789 - wxT 1790 - ("Shapefile (*.shp)|*.shp|All files (*.*)|*.*"), 1791 - wxFD_OPEN | wxFD_FILE_MUST_EXIST, 1792 - wxDefaultPosition, 1793 - wxDefaultSize, 1794 - wxT("filedlg")); 1795 - lastDir = GetLastDirectory(); 1796 - if (lastDir.Len() >= 1) 1797 - fileDialog->SetDirectory(lastDir); 1798 - ret = fileDialog->ShowModal(); 1799 - if (ret == wxID_OK) 1800 - { 1801 - path = fileDialog->GetPath(); 1802 - wxFileName file(path); 1803 - table = file.GetName(); 1804 - VirtualShpDialog dlg; 1805 - dlg.Create(this, path, table, LocaleCharset); 1806 - ret = dlg.ShowModal(); 1807 - if (ret == wxID_OK) 1808 - { 1809 - table = dlg.GetTable(); 1810 - srid = dlg.GetSrid(); 1811 - charset = dlg.GetCharset(); 1812 - } else 1813 - return; 1814 - lastDir = file.GetPath(); 1815 - SetLastDirectory(lastDir); 1816 - sql = wxT("CREATE VIRTUAL TABLE \""); 1817 - sql += table; 1818 - sql += wxT("\"\nUSING VirtualShape('"); 1819 - sql += file.GetPath(); 1820 - sql += file.GetPathSeparator(); 1821 - sql += file.GetName(); 1822 - sql += wxT("',\n'"); 1823 - sql += charset; 1824 - sprintf(dummy, "', %d", srid); 1825 - sql += wxString::FromUTF8(dummy); 1826 - sql += wxT(")"); 1827 - ret = sqlite3_exec(sqlite, sql.ToUTF8(), NULL, NULL, &errMsg); 1828 - if (ret != SQLITE_OK) 1829 - { 1830 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 1831 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1832 - sqlite3_free(errMsg); 1833 - return; 1834 - } 1835 - wxMessageBox(wxT("Virtual Table \"") + table + 1836 - wxT("\" was successfully created"), wxT("spatialite-gui"), 1837 - wxOK | wxICON_INFORMATION, this); 1838 - InitTableTree(); 1839 - } 1840 -} 1841 - 1842 -void MyFrame::OnLoadTxt(wxCommandEvent & WXUNUSED(event)) 1115 + int ret; 1116 + wxString charset; 1117 + int srid; 1118 + wxString xSrid; 1119 + wxString sql; 1120 + wxString path; 1121 + wxString table; 1122 + wxString lastDir; 1123 + char *errMsg = NULL; 1124 + sqlite3 *sqlite = GetSqlite (); 1125 + wxFileDialog *fileDialog = new wxFileDialog (this, wxT ("VirtualShape"), 1126 + wxT (""), 1127 + wxT ("shapefile.shp"), 1128 + wxT 1129 + ("Shapefile (*.shp)|*.shp|All files (*.*)|*.*"), 1130 + wxFD_OPEN | 1131 + wxFD_FILE_MUST_EXIST, 1132 + wxDefaultPosition, 1133 + wxDefaultSize, 1134 + wxT ("filedlg")); 1135 + lastDir = GetLastDirectory (); 1136 + if (lastDir.Len () >= 1) 1137 + fileDialog->SetDirectory (lastDir); 1138 + ret = fileDialog->ShowModal (); 1139 + if (ret == wxID_OK) 1140 + { 1141 + path = fileDialog->GetPath (); 1142 + wxFileName file (path); 1143 + table = file.GetName (); 1144 + VirtualShpDialog dlg; 1145 + dlg.Create (this, path, table, LocaleCharset); 1146 + ret = dlg.ShowModal (); 1147 + if (ret == wxID_OK) 1148 + { 1149 + table = dlg.GetTable (); 1150 + srid = dlg.GetSrid (); 1151 + charset = dlg.GetCharset (); 1152 + } 1153 + else 1154 + return; 1155 + lastDir = file.GetPath (); 1156 + SetLastDirectory (lastDir); 1157 + sql = wxT ("CREATE VIRTUAL TABLE "); 1158 + sql += table; 1159 + sql += wxT ("\nUSING VirtualShape('"); 1160 + sql += file.GetPath (); 1161 + sql += file.GetPathSeparator (); 1162 + sql += file.GetName (); 1163 + sql += wxT ("',\n'"); 1164 + sql += charset; 1165 + xSrid.Printf (wxT ("', %d"), srid); 1166 + sql += xSrid; 1167 + sql += wxT (")"); 1168 + ret = sqlite3_exec (sqlite, sql.ToUTF8 (), NULL, NULL, &errMsg); 1169 + if (ret != SQLITE_OK) 1170 + { 1171 + wxMessageBox (wxT ("SQLite SQL error: ") + 1172 + wxString::FromUTF8 (errMsg), 1173 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 1174 + this); 1175 + sqlite3_free (errMsg); 1176 + return; 1177 + } 1178 + wxMessageBox (wxT ("Virtual Table '") + table + 1179 + wxT ("' was successfully created"), 1180 + wxT ("spatialite-gui"), wxOK | wxICON_INFORMATION, 1181 + this); 1182 + ClearTableTree (); 1183 + InitTableTree (); 1184 + } 1185 +} 1186 + 1187 +void 1188 +MyFrame::OnLoadTxt (wxCommandEvent & WXUNUSED (event)) 1843 1189 { 1844 1190 // 1845 1191 // loading a CSV/TXT 1846 1192 // 1847 - int ret; 1848 - wxString charset; 1849 - wxString sql; 1850 - wxString path; 1851 - wxString table; 1852 - wxString lastDir; 1853 - bool first_titles; 1854 - bool decimal_comma; 1855 - char separator; 1856 - char text_separator; 1857 - wxString filelist = wxT("TXT and CSV files (*.txt;*.csv)|*.txt;*.csv"); 1858 - filelist += 1859 - wxT("|Text file (*.txt)|*.txt|CSV file (*.csv)|*.csv|All files (*.*)|*.*"); 1860 - wxFileDialog *fileDialog = new wxFileDialog(this, wxT("Load CSV/TXT"), 1861 - wxT(""), 1862 - wxT("textfile.txt"), 1863 - filelist, 1864 - wxFD_OPEN | wxFD_FILE_MUST_EXIST, 1865 - wxDefaultPosition, 1866 - wxDefaultSize, 1867 - wxT("filedlg")); 1868 - lastDir = GetLastDirectory(); 1869 - if (lastDir.Len() >= 1) 1870 - fileDialog->SetDirectory(lastDir); 1871 - ret = fileDialog->ShowModal(); 1872 - if (ret == wxID_OK) 1873 - { 1874 - path = fileDialog->GetPath(); 1875 - wxFileName file(path); 1876 - table = file.GetName(); 1877 - LoadTxtDialog dlg; 1878 - dlg.Create(this, path, table, LocaleCharset); 1879 - ret = dlg.ShowModal(); 1880 - if (ret == wxID_OK) 1881 - { 1882 - SetLastDirectory(lastDir); 1883 - table = dlg.GetTable(); 1884 - charset = dlg.GetCharset(); 1885 - first_titles = dlg.IsFirstLineTitles(); 1886 - decimal_comma = dlg.IsDecimalPointComma(); 1887 - separator = dlg.GetSeparator(); 1888 - text_separator = dlg.GetTextSeparator(); 1889 - char decimal_separator = '.'; 1890 - if (decimal_comma == true) 1891 - decimal_separator = ','; 1892 - LoadText(path, table, charset, first_titles, decimal_separator, 1893 - separator, text_separator); 1894 - } 1895 - } 1896 -} 1897 - 1898 -void MyFrame::OnVirtualTxt(wxCommandEvent & WXUNUSED(event)) 1193 + int ret; 1194 + wxString charset; 1195 + wxString sql; 1196 + wxString path; 1197 + wxString table; 1198 + wxString lastDir; 1199 + bool first_titles; 1200 + bool decimal_comma; 1201 + char separator; 1202 + char text_separator; 1203 + wxString filelist = wxT ("TXT and CSV files (*.txt;*.csv)|*.txt;*.csv"); 1204 + filelist += 1205 + wxT 1206 + ("|Text file (*.txt)|*.txt|CSV file (*.csv)|*.csv|All files (*.*)|*.*"); 1207 + wxFileDialog *fileDialog = new wxFileDialog (this, wxT ("Load CSV/TXT"), 1208 + wxT (""), 1209 + wxT ("textfile.txt"), 1210 + filelist, 1211 + wxFD_OPEN | 1212 + wxFD_FILE_MUST_EXIST, 1213 + wxDefaultPosition, 1214 + wxDefaultSize, 1215 + wxT ("filedlg")); 1216 + lastDir = GetLastDirectory (); 1217 + if (lastDir.Len () >= 1) 1218 + fileDialog->SetDirectory (lastDir); 1219 + ret = fileDialog->ShowModal (); 1220 + if (ret == wxID_OK) 1221 + { 1222 + path = fileDialog->GetPath (); 1223 + wxFileName file (path); 1224 + table = file.GetName (); 1225 + LoadTxtDialog dlg; 1226 + dlg.Create (this, path, table, LocaleCharset); 1227 + ret = dlg.ShowModal (); 1228 + if (ret == wxID_OK) 1229 + { 1230 + SetLastDirectory (lastDir); 1231 + table = dlg.GetTable (); 1232 + charset = dlg.GetCharset (); 1233 + first_titles = dlg.IsFirstLineTitles (); 1234 + decimal_comma = dlg.IsDecimalPointComma (); 1235 + separator = dlg.GetSeparator (); 1236 + text_separator = dlg.GetTextSeparator (); 1237 + char decimal_separator = '.'; 1238 + if (decimal_comma == true) 1239 + decimal_separator = ','; 1240 + LoadText (path, table, charset, first_titles, decimal_separator, 1241 + separator, text_separator); 1242 + } 1243 + } 1244 +} 1245 + 1246 +void 1247 +MyFrame::OnVirtualTxt (wxCommandEvent & WXUNUSED (event)) 1899 1248 { 1900 1249 // 1901 1250 // creating a VirtualText 1902 1251 // 1903 - int ret; 1904 - wxString charset; 1905 - wxString sql; 1906 - wxString path; 1907 - wxString table; 1908 - wxString lastDir; 1909 - bool first_titles; 1910 - bool decimal_comma; 1911 - char separator; 1912 - char text_separator; 1913 - char dummy[16]; 1914 - char *errMsg = NULL; 1915 - sqlite3 *sqlite = GetSqlite(); 1916 - wxString filelist = wxT("TXT and CSV files (*.txt;*.csv)|*.txt;*.csv"); 1917 - filelist += 1918 - wxT("|Text file (*.txt)|*.txt|CSV file (*.csv)|*.csv|All files (*.*)|*.*"); 1919 - wxFileDialog *fileDialog = new wxFileDialog(this, wxT("VirtualText"), 1920 - wxT(""), 1921 - wxT("textfile.txt"), 1922 - filelist, 1923 - wxFD_OPEN | wxFD_FILE_MUST_EXIST, 1924 - wxDefaultPosition, 1925 - wxDefaultSize, 1926 - wxT("filedlg")); 1927 - lastDir = GetLastDirectory(); 1928 - if (lastDir.Len() >= 1) 1929 - fileDialog->SetDirectory(lastDir); 1930 - ret = fileDialog->ShowModal(); 1931 - if (ret == wxID_OK) 1932 - { 1933 - path = fileDialog->GetPath(); 1934 - wxFileName file(path); 1935 - table = file.GetName(); 1936 - VirtualTxtDialog dlg; 1937 - dlg.Create(this, path, table, LocaleCharset); 1938 - ret = dlg.ShowModal(); 1939 - if (ret == wxID_OK) 1940 - { 1941 - table = dlg.GetTable(); 1942 - charset = dlg.GetCharset(); 1943 - first_titles = dlg.IsFirstLineTitles(); 1944 - decimal_comma = dlg.IsDecimalPointComma(); 1945 - separator = dlg.GetSeparator(); 1946 - text_separator = dlg.GetTextSeparator(); 1947 - } else 1948 - return; 1949 - lastDir = file.GetPath(); 1950 - SetLastDirectory(lastDir); 1951 - sql = wxT("CREATE VIRTUAL TABLE \""); 1952 - sql += table; 1953 - sql += wxT("\"\nUSING VirtualText('"); 1954 - sql += path; 1955 - sql += wxT("',\n'"); 1956 - sql += charset; 1957 - if (first_titles == true) 1958 - sql += wxT("', 1"); 1959 - else 1960 - sql += wxT("', 0"); 1961 - if (decimal_comma == true) 1962 - sql += wxT(", COMMA"); 1963 - else 1964 - sql += wxT(", POINT"); 1965 - if (text_separator == '\'') 1966 - sql += wxT(", SINGLEQUOTE"); 1967 - else 1968 - sql += wxT(", DOUBLEQUOTE"); 1969 - if (separator == '\t') 1970 - sql += wxT(", TAB"); 1971 - else 1972 - { 1973 - sprintf(dummy, ", '%c'", separator); 1974 - sql += wxString::FromUTF8(dummy); 1975 - } 1976 - sql += wxT(")"); 1977 - ret = sqlite3_exec(sqlite, sql.ToUTF8(), NULL, NULL, &errMsg); 1978 - if (ret != SQLITE_OK) 1979 - { 1980 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 1981 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1982 - sqlite3_free(errMsg); 1983 - return; 1984 - } 1985 - wxMessageBox(wxT("Virtual Table \"") + table + 1986 - wxT("\" was successfully created"), wxT("spatialite-gui"), 1987 - wxOK | wxICON_INFORMATION, this); 1988 - InitTableTree(); 1989 - } 1990 -} 1991 - 1992 -void MyFrame::OnNetwork(wxCommandEvent & WXUNUSED(event)) 1993 -{ 1994 -// 1995 -// building a Network 1996 -// 1997 - NetworkDialog dlg; 1998 - int ret; 1999 - wxString table; 2000 - wxString from; 2001 - wxString to; 2002 - wxString geom; 2003 - bool isGeomLength; 2004 - wxString cost; 2005 - bool isBidirectional; 2006 - bool isOneWays; 2007 - wxString oneWayToFrom; 2008 - wxString oneWayFromTo; 2009 - dlg.Create(this); 2010 - ret = dlg.ShowModal(); 2011 - if (ret == wxID_OK) 2012 - { 2013 - table = dlg.GetTableName(); 2014 - from = dlg.GetFromColumn(); 2015 - to = dlg.GetToColumn(); 2016 - geom = dlg.GetGeomColumn(); 2017 - isGeomLength = dlg.IsGeomLength(); 2018 - cost = dlg.GetCostColumn(); 2019 - isBidirectional = dlg.IsBidirectional(); 2020 - isOneWays = dlg.IsOneWays(); 2021 - oneWayToFrom = dlg.GetOneWayToFrom(); 2022 - oneWayFromTo = dlg.GetOneWayFromTo(); 2023 - BuildNetwork(table, from, to, geom, isGeomLength, cost, isBidirectional, 2024 - isOneWays, oneWayFromTo, oneWayToFrom); 2025 - } 2026 -} 2027 - 2028 -void MyFrame::OnImportExifPhotos(wxCommandEvent & WXUNUSED(event)) 2029 -{ 2030 -// 2031 -// importing EXIF Photos 2032 -// 2033 - ExifDialog dlg; 2034 - int ret; 2035 - wxString path; 2036 - bool isFolder; 2037 - bool isMetadata; 2038 - bool isGpsOnly; 2039 - wxString lastDir; 2040 - wxString dir_path; 2041 - wxString img_path; 2042 - wxString filelist = wxT("JPEG files (*.jpg;*.jpeg)|*.jpg;*.jpeg|"); 2043 - filelist += wxT("All files (*.*)|*.*"); 2044 - wxFileDialog *fileDialog = 2045 - new wxFileDialog(this, wxT("EXIF File/Folder selection"), 2046 - wxT(""), 2047 - wxT(""), 2048 - filelist, 2049 - wxFD_OPEN | wxFD_FILE_MUST_EXIST, 2050 - wxDefaultPosition, 2051 - wxDefaultSize, 2052 - wxT("filedlg")); 2053 - lastDir = GetLastDirectory(); 2054 - if (lastDir.Len() >= 1) 2055 - fileDialog->SetDirectory(lastDir); 2056 - ret = fileDialog->ShowModal(); 2057 - if (ret == wxID_OK) 2058 - { 2059 - img_path = fileDialog->GetPath(); 2060 - wxFileName file(img_path); 2061 - dir_path = file.GetPath(); 2062 - } else 2063 - return; 2064 - dlg.Create(this, dir_path, img_path); 2065 - ret = dlg.ShowModal(); 2066 - if (ret == wxID_OK) 2067 - { 2068 - SetLastDirectory(dir_path); 2069 - isFolder = dlg.IsFolder(); 2070 - if (isFolder == true) 2071 - path = dlg.GetDirPath(); 2072 - else 2073 - path = dlg.GetImgPath(); 2074 - isMetadata = dlg.IsMetadata(); 2075 - isGpsOnly = dlg.IsGpsOnly(); 2076 - ImportExifPhotos(path, isFolder, isMetadata, isGpsOnly); 2077 - } 2078 -} 2079 - 2080 -void MyFrame::OnSrids(wxCommandEvent & WXUNUSED(event)) 1252 + int ret; 1253 + wxString charset; 1254 + wxString sql; 1255 + wxString path; 1256 + wxString table; 1257 + wxString lastDir; 1258 + bool first_titles; 1259 + bool decimal_comma; 1260 + char separator; 1261 + char text_separator; 1262 + char dummy[16]; 1263 + char *errMsg = NULL; 1264 + sqlite3 *sqlite = GetSqlite (); 1265 + wxString filelist = wxT ("TXT and CSV files (*.txt;*.csv)|*.txt;*.csv"); 1266 + filelist += 1267 + wxT 1268 + ("|Text file (*.txt)|*.txt|CSV file (*.csv)|*.csv|All files (*.*)|*.*"); 1269 + wxFileDialog *fileDialog = new wxFileDialog (this, wxT ("VirtualText"), 1270 + wxT (""), 1271 + wxT ("textfile.txt"), 1272 + filelist, 1273 + wxFD_OPEN | 1274 + wxFD_FILE_MUST_EXIST, 1275 + wxDefaultPosition, 1276 + wxDefaultSize, 1277 + wxT ("filedlg")); 1278 + lastDir = GetLastDirectory (); 1279 + if (lastDir.Len () >= 1) 1280 + fileDialog->SetDirectory (lastDir); 1281 + ret = fileDialog->ShowModal (); 1282 + if (ret == wxID_OK) 1283 + { 1284 + path = fileDialog->GetPath (); 1285 + wxFileName file (path); 1286 + table = file.GetName (); 1287 + VirtualTxtDialog dlg; 1288 + dlg.Create (this, path, table, LocaleCharset); 1289 + ret = dlg.ShowModal (); 1290 + if (ret == wxID_OK) 1291 + { 1292 + table = dlg.GetTable (); 1293 + charset = dlg.GetCharset (); 1294 + first_titles = dlg.IsFirstLineTitles (); 1295 + decimal_comma = dlg.IsDecimalPointComma (); 1296 + separator = dlg.GetSeparator (); 1297 + text_separator = dlg.GetTextSeparator (); 1298 + } 1299 + else 1300 + return; 1301 + lastDir = file.GetPath (); 1302 + SetLastDirectory (lastDir); 1303 + sql = wxT ("CREATE VIRTUAL TABLE "); 1304 + sql += table; 1305 + sql += wxT ("\nUSING VirtualText('"); 1306 + sql += path; 1307 + sql += wxT ("',\n'"); 1308 + sql += charset; 1309 + if (first_titles == true) 1310 + sql += wxT ("', 1"); 1311 + else 1312 + sql += wxT ("', 0"); 1313 + if (decimal_comma == true) 1314 + sql += wxT (", COMMA"); 1315 + else 1316 + sql += wxT (", POINT"); 1317 + if (text_separator == '\'') 1318 + sql += wxT (", SINGLEQUOTE"); 1319 + else 1320 + sql += wxT (", DOUBLEQUOTE"); 1321 + if (separator == '\t') 1322 + sql += wxT (", TAB"); 1323 + else 1324 + { 1325 + sprintf (dummy, ", '%c'", separator); 1326 + sql += wxString::FromUTF8 (dummy); 1327 + } 1328 + sql += wxT (")"); 1329 + ret = sqlite3_exec (sqlite, sql.ToUTF8 (), NULL, NULL, &errMsg); 1330 + if (ret != SQLITE_OK) 1331 + { 1332 + wxMessageBox (wxT ("SQLite SQL error: ") + 1333 + wxString::FromUTF8 (errMsg), 1334 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 1335 + this); 1336 + sqlite3_free (errMsg); 1337 + return; 1338 + } 1339 + wxMessageBox (wxT ("Virtual Table '") + table + 1340 + wxT ("' was successfully created"), 1341 + wxT ("spatialite-gui"), wxOK | wxICON_INFORMATION, 1342 + this); 1343 + ClearTableTree (); 1344 + InitTableTree (); 1345 + } 1346 +} 1347 + 1348 +void 1349 +MyFrame::OnSrids (wxCommandEvent & WXUNUSED (event)) 2081 1350 { 2082 1351 // 2083 1352 // searching a SRID by name 2084 1353 // 2085 - SearchSridDialog dlg; 2086 - int ret; 2087 - wxString string; 2088 - wxString sql; 2089 - dlg.Create(this); 2090 - ret = dlg.ShowModal(); 2091 - if (ret == wxID_OK) 2092 - { 2093 - string = dlg.GetString(); 2094 - sql = wxT("SELECT * FROM spatial_ref_sys\n"); 2095 - sql += wxT("WHERE ref_sys_name LIKE '%"); 2096 - sql += string; 2097 - sql += wxT("%'\nORDER BY srid"); 2098 - QueryView->SetSql(sql, true); 2099 - } 1354 + SearchSridDialog dlg; 1355 + int ret; 1356 + wxString string; 1357 + wxString sql; 1358 + dlg.Create (this); 1359 + ret = dlg.ShowModal (); 1360 + if (ret == wxID_OK) 1361 + { 1362 + string = dlg.GetString (); 1363 + sql = wxT ("SELECT * FROM spatial_ref_sys\n"); 1364 + sql += wxT ("WHERE ref_sys_name LIKE '%"); 1365 + sql += string; 1366 + sql += wxT ("%'\nORDER BY srid"); 1367 + QueryView->SetSql (sql, true); 1368 + } 2100 1369 } 2101 1370 2102 -void MyFrame::OnCharset(wxCommandEvent & WXUNUSED(event)) 1371 +void 1372 +MyFrame::OnCharset (wxCommandEvent & WXUNUSED (event)) 2103 1373 { 2104 1374 // 2105 1375 // setting the default CHARSET 2106 1376 // 2107 - DefaultCharsetDialog dlg; 2108 - int ret; 2109 - dlg.Create(this, DefaultCharset, AskCharset); 2110 - ret = dlg.ShowModal(); 2111 - if (ret == wxID_OK) 2112 - { 2113 - DefaultCharset = dlg.GetCharset(); 2114 - AskCharset = dlg.IsSetAskCharset(); 2115 - } 1377 + DefaultCharsetDialog dlg; 1378 + int ret; 1379 + dlg.Create (this, DefaultCharset, AskCharset); 1380 + ret = dlg.ShowModal (); 1381 + if (ret == wxID_OK) 1382 + { 1383 + DefaultCharset = dlg.GetCharset (); 1384 + AskCharset = dlg.IsSetAskCharset (); 1385 + } 2116 1386 } 2117 1387 2118 -void MyFrame::OnTimerAutoSave(wxTimerEvent & event) 2119 -{ 2120 -// 2121 -// AutoSave - Timer event handler 2122 -// 2123 - int tc = sqlite3_total_changes(SqliteHandle); 2124 - if (tc != LastTotalChanges) 2125 - MemoryDbSave(); 2126 - if (AutoSaveInterval <= 0) 2127 - { 2128 - delete TimerAutoSave; 2129 - TimerAutoSave = NULL; 2130 - } else 2131 - TimerAutoSave->Start(AutoSaveInterval * 1000, wxTIMER_ONE_SHOT); 2132 -} 2133 - 2134 -bool MyFrame::ExecuteSql(const char *sql, int rowNo) 1388 +bool 1389 +MyFrame::ExecuteSql (const char *sql, int rowNo) 2135 1390 { 2136 1391 // 2137 1392 // executes an SQL statement from the SQL script 2138 1393 // 2139 - int ret; 2140 - char *errMsg = NULL; 2141 - wxString msg; 2142 - char dummy[128]; 2143 - ret = sqlite3_exec(SqliteHandle, sql, NULL, NULL, &errMsg); 2144 - if (ret != SQLITE_OK) 2145 - { 2146 - sprintf(dummy, "row %d\n\nSQLite SQL error: ", rowNo); 2147 - msg = wxString::FromUTF8(dummy); 2148 - wxMessageBox(msg + wxString::FromUTF8(errMsg), wxT("spatialite-gui"), 2149 - wxOK | wxICON_ERROR, this); 2150 - sqlite3_free(errMsg); 2151 - return false; 2152 - } 2153 - return true; 1394 + int ret; 1395 + char *errMsg = NULL; 1396 + wxString msg; 1397 + ret = sqlite3_exec (SqliteHandle, sql, NULL, NULL, &errMsg); 1398 + if (ret != SQLITE_OK) 1399 + { 1400 + msg.Printf (wxT ("row %d\n\nSQLite SQL error: "), rowNo); 1401 + wxMessageBox (msg + wxString::FromUTF8 (errMsg), 1402 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, this); 1403 + sqlite3_free (errMsg); 1404 + return false; 1405 + } 1406 + return true; 2154 1407 } 2155 1408 2156 -void MyFrame::Rollback() 1409 +void 1410 +MyFrame::Rollback () 2157 1411 { 2158 1412 // 2159 1413 // performing a ROLLBACK 2160 1414 // 2161 - sqlite3_exec(SqliteHandle, "ROLLBACK", NULL, NULL, NULL); 1415 + sqlite3_exec (SqliteHandle, "ROLLBACK", NULL, NULL, NULL); 2162 1416 } 2163 1417 2164 -bool MyFrame::OpenDB() 1418 +bool 1419 +MyFrame::OpenDB () 2165 1420 { 2166 1421 // 2167 1422 // establishing a physical connetion to some DB SQLite 2168 1423 // 2169 - int ret; 2170 - ret = 2171 - sqlite3_open_v2(SqlitePath.ToUTF8(), &SqliteHandle, SQLITE_OPEN_READWRITE, 2172 - NULL); 2173 - if (ret) 2174 - { 2175 - // an error occurred 2176 - wxString errCause; 2177 - errCause = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)); 2178 - sqlite3_close(SqliteHandle); 2179 - wxMessageBox(wxT("Failure while connecting to DB\n\n") + errCause + 2180 - wxT("\n") + SqlitePath, wxT("spatialite-gui"), 2181 - wxOK | wxICON_ERROR, this); 2182 - SqliteHandle = NULL; 2183 - ClearTableTree(); 2184 - MemoryDatabase = false; 2185 - return false; 2186 - } 2187 - AutoFDOStart(); 2188 - InitTableTree(); 2189 - return true; 2190 -} 2191 - 2192 -void MyFrame::LastDitchMemoryDbSave() 2193 -{ 2194 -// 2195 -// performing the last desperate attempt to save a MEMORY-DB 2196 -// 2197 - int tc; 2198 - int ret; 2199 - wxString lastDir; 2200 - if (MemoryDatabase == false) 2201 - return; 2202 - if (!SqliteHandle) 2203 - return; 2204 - tc = sqlite3_total_changes(SqliteHandle); 2205 - if (tc == LastTotalChanges) 2206 - return; 2207 - while (1) 2208 - { 2209 - // OK, this MEMORY-DB needs to be saved 2210 - if (MemoryDbSave() == true) 2211 - break; 2212 - // we must ask the user 2213 - wxString msg = 2214 - wxT("WARNING: the MEMORY-DB contains uncommitted changes\n\n"); 2215 - msg += wxT("The MEMORY_DB is intrinsecally volatile, so these changes\n"); 2216 - msg += 2217 - wxT("will be irremediably lost if you don't export them to some\n"); 2218 - msg += wxT("persistent storage [i.e. on the file-system]\n\n"); 2219 - msg += 2220 - wxT 2221 - ("Do you want to export [SAVE] the MEMORY-DB to some external database ?"); 2222 - ret = 2223 - wxMessageBox(msg, wxT("spatialite-gui"), wxYES_NO | wxICON_QUESTION, 2224 - this); 2225 - if (ret != wxYES) 2226 - break; 2227 - // asking a PATHNAME to the user 2228 - wxFileDialog *fileDialog = 2229 - new wxFileDialog(this, wxT("Saving the MEMORY-DB"), 2230 - wxT(""), wxT("db.sqlite"), 2231 - wxT 2232 - ("SQLite DB (*.sqlite)|*.sqlite|All files (*.*)|*.*"), 2233 - wxFD_SAVE | wxFD_OVERWRITE_PROMPT, 2234 - wxDefaultPosition, 2235 - wxDefaultSize, 2236 - wxT("filedlg")); 2237 - lastDir = GetLastDirectory(); 2238 - if (lastDir.Len() >= 1) 2239 - fileDialog->SetDirectory(lastDir); 2240 - ret = fileDialog->ShowModal(); 2241 - if (ret == wxID_OK) 2242 - { 2243 - // exporting the external DB 2244 - ExternalSqlitePath = fileDialog->GetPath(); 2245 - if (MemoryDbSave() == true) 2246 - { 2247 - wxMessageBox(wxT("Ok, MEMORY-DB was succesfully saved"), 2248 - wxT("spatialite-gui"), wxOK | wxICON_INFORMATION, 2249 - this); 2250 - break; 2251 - } 2252 - } 2253 - } 2254 -} 2255 - 2256 -void MyFrame::CloseDB() 1424 + int ret; 1425 + ret = 1426 + sqlite3_open_v2 (SqlitePath.ToUTF8 (), &SqliteHandle, 1427 + SQLITE_OPEN_READWRITE, NULL); 1428 + if (ret) 1429 + { 1430 + // impossibile aprire il DB SQLite 1431 + wxString errCause; 1432 + errCause = wxString::FromUTF8 (sqlite3_errmsg (SqliteHandle)); 1433 + sqlite3_close (SqliteHandle); 1434 + wxMessageBox (wxT ("Failure while connecting to DB\n\n") + errCause + 1435 + wxT ("\n") + SqlitePath, wxT ("spatialite-gui"), 1436 + wxOK | wxICON_ERROR, this); 1437 + SqliteHandle = NULL; 1438 + ClearTableTree (); 1439 + return false; 1440 + } 1441 + InitTableTree (); 1442 + return true; 1443 +} 1444 + 1445 +void 1446 +MyFrame::CloseDB () 2257 1447 { 2258 1448 // 2259 1449 // disconnecting current SQLite DB 2260 1450 // 2261 - if (!SqliteHandle) 2262 - return; 2263 - AutoFDOStop(); 2264 - if (AutoFDOmsg.Len() > 0) 2265 - wxMessageBox(AutoFDOmsg, wxT("spatialite-gui"), wxOK | wxICON_INFORMATION, 2266 - this); 2267 - LastDitchMemoryDbSave(); 2268 - sqlite3_close(SqliteHandle); 2269 - SqliteHandle = NULL; 2270 - SqlitePath = wxT(""); 2271 - MemoryDatabase = false; 2272 - ClearTableTree(); 1451 + if (!SqliteHandle) 1452 + return; 1453 + sqlite3_close (SqliteHandle); 1454 + SqliteHandle = NULL; 1455 + SqlitePath = wxT (""); 1456 + ClearTableTree (); 2273 1457 } 2274 1458 2275 -bool MyFrame::CreateDB() 1459 +bool 1460 +MyFrame::CreateDB () 2276 1461 { 2277 1462 // creating a new, empty SQLite DB 2278 - int ret; 2279 - char path[1024]; 2280 - if (MemoryDatabase == true) 2281 - strcpy(path, ":memory:"); 2282 - else 2283 - { 2284 - strcpy(path, SqlitePath.ToUTF8()); 2285 - unlink(path); 2286 - } 2287 - ret = 2288 - sqlite3_open_v2(path, &SqliteHandle, 2289 - SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); 2290 - if (ret) 2291 - { 2292 - // an error occurred 2293 - wxString errCause; 2294 - errCause = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)); 2295 - sqlite3_close(SqliteHandle); 2296 - wxMessageBox(wxT("An error occurred\n\n") + errCause + wxT("\n") + 2297 - SqlitePath, wxT("spatialite-gui"), wxOK | wxICON_ERROR, 2298 - this); 2299 - SqliteHandle = NULL; 2300 - ClearTableTree(); 2301 - MemoryDatabase = false; 2302 - return false; 2303 - } 2304 - if (CreateSpatialMetaData() == false) 2305 - wxMessageBox(wxT("Spatial Metadata tables creation error\n") + 2306 - SqlitePath, wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 2307 - AutoFDOStart(); 2308 - InitTableTree(); 2309 - return true; 1463 + unlink (SqlitePath.ToUTF8 ()); 1464 + int ret; 1465 + ret = sqlite3_open_v2 (SqlitePath.ToUTF8 (), &SqliteHandle, 1466 + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); 1467 + if (ret) 1468 + { 1469 + // an error occurred 1470 + wxString errCause; 1471 + errCause = wxString::FromUTF8 (sqlite3_errmsg (SqliteHandle)); 1472 + sqlite3_close (SqliteHandle); 1473 + wxMessageBox (wxT ("An error occurred\n\n") + errCause + wxT ("\n") + 1474 + SqlitePath, wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 1475 + this); 1476 + SqliteHandle = NULL; 1477 + ClearTableTree (); 1478 + return false; 1479 + } 1480 + InitTableTree (); 1481 + return true; 1482 +} 1483 + 1484 +void 1485 +MyFrame::CleanSql (char *buf) 1486 +{ 1487 +// well-formatting a string to be used as an SQL string 1488 + char tmp[1024]; 1489 + char *in = tmp; 1490 + char *out = buf; 1491 + strcpy (tmp, buf); 1492 + while (*in != '\0') 1493 + { 1494 + if (*in == '\'') 1495 + *out++ = '\''; 1496 + *out++ = *in++; 1497 + } 1498 + *out = '\0'; 2310 1499 } 2311 1500 2312 -void MyFrame::CleanSql(char *buf) 2313 -{ 2314 -// well-formatting a string to be used as an SQL string 2315 - char tmp[1024]; 2316 - char *in = tmp; 2317 - char *out = buf; 2318 - strcpy(tmp, buf); 2319 - while (*in != '\0') 2320 - { 2321 - if (*in == '\'') 2322 - *out++ = '\''; 2323 - *out++ = *in++; 2324 - } 2325 - *out = '\0'; 2326 -} 2327 - 2328 -void MyFrame::InitTableTree() 1501 +void 1502 +MyFrame::InitTableTree () 2329 1503 { 2330 1504 // loads the table TREE list 2331 - int i; 2332 - char **results; 2333 - int rows; 2334 - int columns; 2335 - char *errMsg = NULL; 2336 - char *name; 2337 - char *createSql; 2338 - char *type; 2339 - wxString tblName; 2340 - wxString sql; 2341 - bool virtualTable = false; 2342 - TableTree->Show(false); 2343 - if (MemoryDatabase == true) 2344 - { 2345 - wxString memory = wxT("MEMORY-DB"); 2346 - TableTree->SetPath(memory); 2347 - } else 2348 - TableTree->SetPath(SqlitePath); 2349 - TableTree->FlushAll(); 2350 - sql = 2351 - wxT 2352 - ("SELECT name, sql, type FROM sqlite_master WHERE (type = 'table' OR type = 'view') ORDER BY name"); 2353 - int ret = sqlite3_get_table(SqliteHandle, sql.ToUTF8(), &results, 2354 - &rows, &columns, &errMsg); 2355 - if (ret != SQLITE_OK) 2356 - { 2357 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 2358 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 2359 - sqlite3_free(errMsg); 2360 - return; 2361 - } 2362 - if (rows < 1) 2363 - ; 2364 - else 2365 - { 2366 - for (i = 1; i <= rows; i++) 2367 - { 2368 - name = results[(i * columns) + 0]; 2369 - createSql = results[(i * columns) + 1]; 2370 - type = results[(i * columns) + 2]; 2371 - if (strstr(createSql, "VIRTUAL") || strstr(createSql, "virtual")) 2372 - virtualTable = true; 2373 - else 2374 - virtualTable = false; 2375 - tblName = wxString::FromUTF8(name); 2376 - if (strcmp(type, "view") == 0) 2377 - TableTree->AddView(tblName); 2378 - else 2379 - TableTree->AddTable(tblName, virtualTable); 2380 - } 2381 - } 2382 - sqlite3_free_table(results); 2383 - TableTree->ExpandRoot(); 2384 - TableTree->Show(true); 1505 + int i; 1506 + char **results; 1507 + int rows; 1508 + int columns; 1509 + char *errMsg = NULL; 1510 + char *name; 1511 + char *createSql; 1512 + char *type; 1513 + wxString tblName; 1514 + wxString sql; 1515 + bool virtualTable = false; 1516 + TableTree->SetPath (SqlitePath); 1517 + TableTree->FlushAll (); 1518 + sql = 1519 + wxT 1520 + ("SELECT name, sql, type FROM sqlite_master WHERE (type = 'table' OR type = 'view') ORDER BY name"); 1521 + int ret = sqlite3_get_table (SqliteHandle, sql.ToUTF8 (), &results, 1522 + &rows, &columns, &errMsg); 1523 + if (ret != SQLITE_OK) 1524 + { 1525 + wxMessageBox (wxT ("SQLite SQL error: ") + 1526 + wxString::FromUTF8 (errMsg), wxT ("spatialite-gui"), 1527 + wxOK | wxICON_ERROR, this); 1528 + sqlite3_free (errMsg); 1529 + return; 1530 + } 1531 + if (rows < 1) 1532 + ; 1533 + else 1534 + { 1535 + for (i = 1; i <= rows; i++) 1536 + { 1537 + name = results[(i * columns) + 0]; 1538 + createSql = results[(i * columns) + 1]; 1539 + type = results[(i * columns) + 2]; 1540 + if (strstr (createSql, "VIRTUAL") 1541 + || strstr (createSql, "virtual")) 1542 + virtualTable = true; 1543 + else 1544 + virtualTable = false; 1545 + tblName = wxString::FromUTF8 (name); 1546 + if (strcmp (type, "view") == 0) 1547 + TableTree->AddView (tblName); 1548 + else 1549 + TableTree->AddTable (tblName, virtualTable); 1550 + } 1551 + } 1552 + sqlite3_free_table (results); 1553 + TableTree->ExpandRoot (); 2385 1554 } 2386 1555 2387 -wxString *MyFrame::GetTables(int *n) 2388 -{ 2389 -// loads the table list 2390 - int i; 2391 - char **results; 2392 - int rows; 2393 - int columns; 2394 - char *errMsg = NULL; 2395 - char *name; 2396 - wxString *tables = NULL; 2397 - wxString sql; 2398 - *n = 0; 2399 - sql = 2400 - wxT("SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name"); 2401 - int ret = sqlite3_get_table(SqliteHandle, sql.ToUTF8(), &results, 2402 - &rows, &columns, &errMsg); 2403 - if (ret != SQLITE_OK) 2404 - { 2405 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 2406 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 2407 - sqlite3_free(errMsg); 2408 - return tables; 2409 - } 2410 - if (rows < 1) 2411 - ; 2412 - else 2413 - { 2414 - tables = new wxString[rows]; 2415 - *n = rows; 2416 - for (i = 1; i <= rows; i++) 2417 - { 2418 - name = results[(i * columns) + 0]; 2419 - tables[i - 1] = wxString::FromUTF8(name); 2420 - } 2421 - } 2422 - sqlite3_free_table(results); 2423 - return tables; 2424 -} 2425 - 2426 -void MyFrame::GetTableColumns(wxString & tableName, MyTableInfo * list) 1556 +void 1557 +MyFrame::GetTableColumns (wxString & tableName, MyTableInfo * list) 2427 1558 { 2428 1559 // loads the table's column list 2429 - int i; 2430 - char **results; 2431 - int rows; 2432 - int columns; 2433 - char *errMsg = NULL; 2434 - char *name; 2435 - char *column; 2436 - wxString Name; 2437 - wxString Column; 2438 - bool pKey; 2439 - bool index; 2440 - bool cached; 2441 - wxString sql; 2442 - sql = wxT("PRAGMA table_info(\""); 2443 - sql += tableName; 2444 - sql += wxT("\")"); 2445 - int ret = sqlite3_get_table(SqliteHandle, sql.ToUTF8(), &results, 2446 - &rows, &columns, &errMsg); 2447 - if (ret != SQLITE_OK) 2448 - { 2449 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 2450 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 2451 - sqlite3_free(errMsg); 2452 - return; 2453 - } 2454 - if (rows < 1) 2455 - ; 2456 - else 2457 - { 2458 - for (i = 1; i <= rows; i++) 2459 - { 2460 - name = results[(i * columns) + 1]; 2461 - if (atoi(results[(i * columns) + 5]) == 0) 2462 - pKey = false; 2463 - else 2464 - pKey = true; 2465 - Name = wxString::FromUTF8(name); 2466 - list->AddColumn(Name, pKey); 2467 - } 2468 - } 2469 - sqlite3_free_table(results); 2470 - if (CheckMetadata() == true) 2471 - { 2472 - // ok, Spatial MetaData exists; retrieving Geometries and Spatial Indices 2473 - sql = 2474 - wxT 2475 - ("SELECT f_geometry_column, spatial_index_enabled FROM geometry_columns "); 2476 - sql += wxT("WHERE f_table_name = '"); 2477 - sql += tableName; 2478 - sql += wxT("'"); 2479 - ret = 2480 - sqlite3_get_table(SqliteHandle, sql.ToUTF8(), &results, &rows, &columns, 2481 - &errMsg); 2482 - if (ret != SQLITE_OK) 2483 - { 2484 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 2485 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 2486 - sqlite3_free(errMsg); 2487 - return; 2488 - } 2489 - if (rows < 1) 2490 - ; 2491 - else 2492 - { 2493 - for (i = 1; i <= rows; i++) 2494 - { 2495 - column = results[(i * columns) + 0]; 2496 - if (atoi(results[(i * columns) + 1]) == 1) 2497 - index = true; 2498 - else 2499 - index = false; 2500 - if (atoi(results[(i * columns) + 1]) == 2) 2501 - cached = true; 2502 - else 2503 - cached = false; 2504 - Column = wxString::FromUTF8(column); 2505 - list->SetGeometry(Column, index, cached); 2506 - } 2507 - } 2508 - sqlite3_free_table(results); 2509 - } 1560 + int i; 1561 + char **results; 1562 + int rows; 1563 + int columns; 1564 + char *errMsg = NULL; 1565 + char *name; 1566 + char *column; 1567 + wxString Name; 1568 + wxString Column; 1569 + bool pKey; 1570 + bool index; 1571 + bool cached; 1572 + wxString sql; 1573 + sql = wxT ("PRAGMA table_info("); 1574 + sql += tableName; 1575 + sql += wxT (")"); 1576 + int ret = sqlite3_get_table (SqliteHandle, sql.ToUTF8 (), &results, 1577 + &rows, &columns, &errMsg); 1578 + if (ret != SQLITE_OK) 1579 + { 1580 + wxMessageBox (wxT ("SQLite SQL error: ") + 1581 + wxString::FromUTF8 (errMsg), wxT ("spatialite-gui"), 1582 + wxOK | wxICON_ERROR, this); 1583 + sqlite3_free (errMsg); 1584 + return; 1585 + } 1586 + if (rows < 1) 1587 + ; 1588 + else 1589 + { 1590 + for (i = 1; i <= rows; i++) 1591 + { 1592 + name = results[(i * columns) + 1]; 1593 + if (atoi (results[(i * columns) + 5]) == 0) 1594 + pKey = false; 1595 + else 1596 + pKey = true; 1597 + Name = wxString::FromUTF8 (name); 1598 + list->AddColumn (Name, pKey); 1599 + } 1600 + } 1601 + sqlite3_free_table (results); 1602 + if (CheckMetadata () == true) 1603 + { 1604 + // ok, Spatial MetaData exists; retrieving Geometries and Spatial Indices 1605 + sql = 1606 + wxT 1607 + ("SELECT f_geometry_column, spatial_index_enabled FROM geometry_columns "); 1608 + sql += wxT ("WHERE f_table_name = '"); 1609 + sql += tableName; 1610 + sql += wxT ("'"); 1611 + ret = sqlite3_get_table (SqliteHandle, sql.ToUTF8 (), &results, 1612 + &rows, &columns, &errMsg); 1613 + if (ret != SQLITE_OK) 1614 + { 1615 + wxMessageBox (wxT ("SQLite SQL error: ") + 1616 + wxString::FromUTF8 (errMsg), 1617 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 1618 + this); 1619 + sqlite3_free (errMsg); 1620 + return; 1621 + } 1622 + if (rows < 1) 1623 + ; 1624 + else 1625 + { 1626 + for (i = 1; i <= rows; i++) 1627 + { 1628 + column = results[(i * columns) + 0]; 1629 + if (atoi (results[(i * columns) + 1]) == 1) 1630 + index = true; 1631 + else 1632 + index = false; 1633 + if (atoi (results[(i * columns) + 1]) == 2) 1634 + cached = true; 1635 + else 1636 + cached = false; 1637 + Column = wxString::FromUTF8 (column); 1638 + list->SetGeometry (Column, index, cached); 1639 + } 1640 + } 1641 + sqlite3_free_table (results); 1642 + } 2510 1643 } 2511 1644 2512 -void MyFrame::GetViewColumns(wxString & tableName, MyViewInfo * list) 1645 +void 1646 +MyFrame::GetViewColumns (wxString & tableName, MyViewInfo * list) 2513 1647 { 2514 1648 // loads the view's column list 2515 - int i; 2516 - char **results; 2517 - int rows; 2518 - int columns; 2519 - char *errMsg = NULL; 2520 - char *name; 2521 - wxString Name; 2522 - wxString sql; 2523 - sql = wxT("PRAGMA table_info(\""); 2524 - sql += tableName; 2525 - sql += wxT("\")"); 2526 - int ret = sqlite3_get_table(SqliteHandle, sql.ToUTF8(), &results, 2527 - &rows, &columns, &errMsg); 2528 - if (ret != SQLITE_OK) 2529 - { 2530 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 2531 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 2532 - sqlite3_free(errMsg); 2533 - return; 2534 - } 2535 - if (rows < 1) 2536 - ; 2537 - else 2538 - { 2539 - for (i = 1; i <= rows; i++) 2540 - { 2541 - name = results[(i * columns) + 1]; 2542 - Name = wxString::FromUTF8(name); 2543 - list->AddColumn(Name); 2544 - } 2545 - } 2546 - sqlite3_free_table(results); 1649 + int i; 1650 + char **results; 1651 + int rows; 1652 + int columns; 1653 + char *errMsg = NULL; 1654 + char *name; 1655 + wxString Name; 1656 + wxString sql; 1657 + sql = wxT ("PRAGMA table_info("); 1658 + sql += tableName; 1659 + sql += wxT (")"); 1660 + int ret = sqlite3_get_table (SqliteHandle, sql.ToUTF8 (), &results, 1661 + &rows, &columns, &errMsg); 1662 + if (ret != SQLITE_OK) 1663 + { 1664 + wxMessageBox (wxT ("SQLite SQL error: ") + 1665 + wxString::FromUTF8 (errMsg), wxT ("spatialite-gui"), 1666 + wxOK | wxICON_ERROR, this); 1667 + sqlite3_free (errMsg); 1668 + return; 1669 + } 1670 + if (rows < 1) 1671 + ; 1672 + else 1673 + { 1674 + for (i = 1; i <= rows; i++) 1675 + { 1676 + name = results[(i * columns) + 1]; 1677 + Name = wxString::FromUTF8 (name); 1678 + list->AddColumn (Name); 1679 + } 1680 + } 1681 + sqlite3_free_table (results); 1682 +} 1683 + 1684 +void 1685 +MyFrame::GetTableIndices (wxString & tableName, MyTableInfo * list) 1686 +{ 1687 +// loads the table's indices list 1688 + int i; 1689 + char **results; 1690 + int rows; 1691 + int columns; 1692 + char *errMsg = NULL; 1693 + char *name; 1694 + wxString Name; 1695 + wxString sql; 1696 + sql = wxT ("PRAGMA index_list("); 1697 + sql += tableName; 1698 + sql += wxT (")"); 1699 + int ret = sqlite3_get_table (SqliteHandle, sql.ToUTF8 (), &results, 1700 + &rows, &columns, &errMsg); 1701 + if (ret != SQLITE_OK) 1702 + { 1703 + wxMessageBox (wxT ("SQLite SQL error: ") + 1704 + wxString::FromUTF8 (errMsg), wxT ("spatialite-gui"), 1705 + wxOK | wxICON_ERROR, this); 1706 + sqlite3_free (errMsg); 1707 + return; 1708 + } 1709 + if (rows < 1) 1710 + ; 1711 + else 1712 + { 1713 + for (i = 1; i <= rows; i++) 1714 + { 1715 + name = results[(i * columns) + 1]; 1716 + Name = wxString::FromUTF8 (name); 1717 + list->AddIndex (Name); 1718 + } 1719 + } 1720 + sqlite3_free_table (results); 2547 1721 } 2548 1722 2549 -void MyFrame::GetTableIndices(wxString & tableName, MyTableInfo * list) 1723 +void 1724 +MyFrame::GetTableTriggers (wxString & tableName, MyTableInfo * list) 2550 1725 { 2551 1726 // loads the table's indices list 2552 - int i; 2553 - char **results; 2554 - int rows; 2555 - int columns; 2556 - char *errMsg = NULL; 2557 - char *name; 2558 - wxString Name; 2559 - wxString sql; 2560 - sql = wxT("PRAGMA index_list(\""); 2561 - sql += tableName; 2562 - sql += wxT("\")"); 2563 - int ret = sqlite3_get_table(SqliteHandle, sql.ToUTF8(), &results, 2564 - &rows, &columns, &errMsg); 2565 - if (ret != SQLITE_OK) 2566 - { 2567 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 2568 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 2569 - sqlite3_free(errMsg); 2570 - return; 2571 - } 2572 - if (rows < 1) 2573 - ; 2574 - else 2575 - { 2576 - for (i = 1; i <= rows; i++) 2577 - { 2578 - name = results[(i * columns) + 1]; 2579 - Name = wxString::FromUTF8(name); 2580 - list->AddIndex(Name); 2581 - } 2582 - } 2583 - sqlite3_free_table(results); 1727 + int i; 1728 + char **results; 1729 + int rows; 1730 + int columns; 1731 + char *errMsg = NULL; 1732 + char *name; 1733 + wxString Name; 1734 + wxString sql; 1735 + sql = 1736 + wxT 1737 + ("SELECT name FROM sqlite_master WHERE type = 'trigger' AND tbl_name = '"); 1738 + sql += tableName; 1739 + sql += wxT ("' ORDER BY name"); 1740 + int ret = sqlite3_get_table (SqliteHandle, sql.ToUTF8 (), &results, 1741 + &rows, &columns, &errMsg); 1742 + if (ret != SQLITE_OK) 1743 + { 1744 + wxMessageBox (wxT ("SQLite SQL error: ") + 1745 + wxString::FromUTF8 (errMsg), wxT ("spatialite-gui"), 1746 + wxOK | wxICON_ERROR, this); 1747 + sqlite3_free (errMsg); 1748 + return; 1749 + } 1750 + if (rows < 1) 1751 + ; 1752 + else 1753 + { 1754 + for (i = 1; i <= rows; i++) 1755 + { 1756 + name = results[(i * columns) + 0]; 1757 + Name = wxString::FromUTF8 (name); 1758 + list->AddTrigger (Name); 1759 + } 1760 + } 1761 + sqlite3_free_table (results); 1762 + TableTree->ExpandRoot (); 2584 1763 } 2585 1764 2586 -void MyFrame::GetTableTriggers(wxString & tableName, MyTableInfo * list) 2587 -{ 2588 -// loads the table's indices list 2589 - int i; 2590 - char **results; 2591 - int rows; 2592 - int columns; 2593 - char *errMsg = NULL; 2594 - char *name; 2595 - wxString Name; 2596 - wxString sql; 2597 - sql = 2598 - wxT 2599 - ("SELECT name FROM sqlite_master WHERE type = 'trigger' AND tbl_name = '"); 2600 - sql += tableName; 2601 - sql += wxT("' ORDER BY \"name\""); 2602 - int ret = sqlite3_get_table(SqliteHandle, sql.ToUTF8(), &results, 2603 - &rows, &columns, &errMsg); 2604 - if (ret != SQLITE_OK) 2605 - { 2606 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 2607 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 2608 - sqlite3_free(errMsg); 2609 - return; 2610 - } 2611 - if (rows < 1) 2612 - ; 2613 - else 2614 - { 2615 - for (i = 1; i <= rows; i++) 2616 - { 2617 - name = results[(i * columns) + 0]; 2618 - Name = wxString::FromUTF8(name); 2619 - list->AddTrigger(Name); 2620 - } 2621 - } 2622 - sqlite3_free_table(results); 2623 - TableTree->ExpandRoot(); 2624 -} 2625 - 2626 -wxString *MyFrame::GetColumnNames(wxString & tableName, int *n_cols) 1765 +wxString * 1766 +MyFrame::GetColumnNames (wxString & tableName, int *n_cols) 2627 1767 { 2628 1768 // loads the table's column names list 2629 - wxString *cols = NULL; 2630 - int nCols = 0; 2631 - char **results; 2632 - int rows; 2633 - int columns; 2634 - int i; 2635 - char *errMsg = NULL; 2636 - wxString sql; 2637 - char *column; 2638 - sql = wxT("PRAGMA table_info(\""); 2639 - sql += tableName; 2640 - sql += wxT("\")"); 2641 - int ret = sqlite3_get_table(SqliteHandle, sql.ToUTF8(), &results, 2642 - &rows, &columns, &errMsg); 2643 - if (ret != SQLITE_OK) 2644 - { 2645 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 2646 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 2647 - sqlite3_free(errMsg); 2648 - return NULL; 2649 - } 2650 - sql = wxT(""); 2651 - if (rows < 1) 2652 - ; 2653 - else 2654 - { 2655 - nCols = rows; 2656 - cols = new wxString[rows]; 2657 - for (i = 1; i <= rows; i++) 2658 - { 2659 - column = results[(i * columns) + 1]; 2660 - *(cols + i - 1) += wxString::FromUTF8(column); 2661 - } 2662 - } 2663 - sqlite3_free_table(results); 2664 - *n_cols = nCols; 2665 - return cols; 1769 + wxString *cols = NULL; 1770 + int nCols = 0; 1771 + char **results; 1772 + int rows; 1773 + int columns; 1774 + int i; 1775 + char *errMsg = NULL; 1776 + wxString sql; 1777 + char *column; 1778 + sql = wxT ("PRAGMA table_info("); 1779 + sql += tableName; 1780 + sql += wxT (")"); 1781 + int ret = sqlite3_get_table (SqliteHandle, sql.ToUTF8 (), &results, 1782 + &rows, &columns, &errMsg); 1783 + if (ret != SQLITE_OK) 1784 + { 1785 + wxMessageBox (wxT ("SQLite SQL error: ") + 1786 + wxString::FromUTF8 (errMsg), wxT ("spatialite-gui"), 1787 + wxOK | wxICON_ERROR, this); 1788 + sqlite3_free (errMsg); 1789 + return NULL; 1790 + } 1791 + sql = wxT (""); 1792 + if (rows < 1) 1793 + ; 1794 + else 1795 + { 1796 + nCols = rows; 1797 + cols = new wxString[rows]; 1798 + for (i = 1; i <= rows; i++) 1799 + { 1800 + column = results[(i * columns) + 1]; 1801 + *(cols + i - 1) += wxString::FromUTF8 (column); 1802 + } 1803 + } 1804 + sqlite3_free_table (results); 1805 + *n_cols = nCols; 1806 + return cols; 2666 1807 } 2667 1808 2668 -int MyFrame::GetCharsetIndex(wxString & charset) 1809 +int 1810 +MyFrame::GetCharsetIndex (wxString & charset) 2669 1811 { 2670 1812 // identifies the INDEX for a given charset 2671 - int i; 2672 - for (i = 0; i < CharsetsLen; i++) 2673 - { 2674 - if (*(Charsets + i) == charset) 2675 - return i; 2676 - } 2677 - return wxNOT_FOUND; 1813 + int i; 1814 + for (i = 0; i < CharsetsLen; i++) 1815 + { 1816 + if (*(Charsets + i) == charset) 1817 + return i; 1818 + } 1819 + return wxNOT_FOUND; 2678 1820 } 2679 1821 2680 -wxString & MyFrame::GetCharsetName(wxString & charset) 1822 +wxString & MyFrame::GetCharsetName (wxString & charset) 2681 1823 { 2682 1824 // identifies the full name for a given charset code 2683 - int i; 2684 - for (i = 0; i < CharsetsLen; i++) 2685 - { 2686 - if (*(Charsets + i) == charset) 2687 - return *(CharsetsNames + i); 2688 - } 2689 - return charset; 1825 + int 1826 + i; 1827 + for (i = 0; i < CharsetsLen; i++) 1828 + { 1829 + if (*(Charsets + i) == charset) 1830 + return *(CharsetsNames + i); 1831 + } 1832 + return charset; 2690 1833 } 2691 1834 2692 -void MyFrame::ClearTableTree() 1835 +void 1836 +MyFrame::ClearTableTree () 2693 1837 { 2694 1838 // resets the table TREE list to the empty state 2695 - wxString path = wxT("no current DB"); 2696 - TableTree->SetPath(path); 2697 - TableTree->FlushAll(); 1839 + wxString path = wxT ("no current DB"); 1840 + TableTree->SetPath (path); 1841 + TableTree->FlushAll (); 2698 1842 } 2699 1843 2700 -void MyFrame::AutoFDOStart() 1844 +int 1845 +MyFrame::GuessBlobType (int size, unsigned char *blob) 2701 1846 { 2702 1847 // 2703 -// trying to start the FDO-OGR auto-wrapper 1848 +// trying to check the content-type for a BLOB value [using signatures] 2704 1849 // 2705 - int ret; 2706 - const char *name; 2707 - int i; 2708 - char **results; 2709 - int rows; 2710 - int columns; 2711 - char sql[1024]; 2712 - int count = 0; 2713 - int len; 2714 - int spatial_type = 0; 2715 - AutoFDOTables tables; 2716 - AutoFDOTable *p; 2717 - wxString fdoNames[5]; 2718 - SpatiaLiteMetadata = false; 2719 - AutoFDOmsg = wxT(""); 2720 - strcpy(sql, "SELECT CheckSpatialMetadata()"); 2721 - ret = sqlite3_get_table(SqliteHandle, sql, &results, &rows, &columns, NULL); 2722 - if (ret != SQLITE_OK) 2723 - goto error1; 2724 - if (rows < 1) 2725 - ; 2726 - else 2727 - { 2728 - for (i = 1; i <= rows; i++) 2729 - spatial_type = atoi(results[(i * columns) + 0]); 2730 - } 2731 - sqlite3_free_table(results); 2732 -error1: 2733 - if (spatial_type == 1) 2734 - SpatiaLiteMetadata = true; 2735 - if (spatial_type == 2) 2736 - { 2737 - // 2738 - // ok, creating VirtualFDO tables 2739 - // 2740 - strcpy(sql, "SELECT DISTINCT f_table_name FROM geometry_columns"); 2741 - ret = 2742 - sqlite3_get_table(SqliteHandle, sql, &results, &rows, &columns, NULL); 2743 - if (ret != SQLITE_OK) 2744 - goto error; 2745 - if (rows < 1) 2746 - ; 2747 - else 2748 - { 2749 - for (i = 1; i <= rows; i++) 2750 - { 2751 - name = results[(i * columns) + 0]; 2752 - if (name) 2753 - { 2754 - len = strlen(name); 2755 - tables.Add(name, len); 2756 - } 2757 - } 2758 - } 2759 - sqlite3_free_table(results); 2760 - p = tables.GetFirst(); 2761 - while (p) 2762 - { 2763 - // 2764 - // destroying the VirtualFDO table [if existing] 2765 - // 2766 - sprintf(sql, "DROP TABLE IF EXISTS \"fdo_%s\"", p->GetName()); 2767 - ret = sqlite3_exec(SqliteHandle, sql, NULL, 0, NULL); 2768 - if (ret != SQLITE_OK) 2769 - goto error; 2770 - // 2771 - // creating the VirtualFDO table 2772 - // 2773 - sprintf(sql, "CREATE VIRTUAL TABLE \"fdo_%s\" USING VirtualFDO(%s)", 2774 - p->GetName(), p->GetName()); 2775 - ret = sqlite3_exec(SqliteHandle, sql, NULL, 0, NULL); 2776 - if (ret != SQLITE_OK) 2777 - goto error; 2778 - if (count < 5) 2779 - fdoNames[count] = 2780 - wxT("- VirtualTable: \"fdo_") + wxString::FromUTF8(p->GetName()) + 2781 - wxT("\""); 2782 - else 2783 - fdoNames[4] = wxT("- ... and others ..."); 2784 - count++; 2785 - p = p->GetNext(); 2786 - } 2787 - error: 2788 - if (count++) 2789 - { 2790 - AutoFDOmsg = 2791 - wxT("FDO-OGR detected; activating FDO-OGR auto-wrapping ...\n\n"); 2792 - if (fdoNames[0].Len() > 0) 2793 - AutoFDOmsg += fdoNames[0] + wxT("\n"); 2794 - if (fdoNames[1].Len() > 0) 2795 - AutoFDOmsg += fdoNames[1] + wxT("\n"); 2796 - if (fdoNames[2].Len() > 0) 2797 - AutoFDOmsg += fdoNames[2] + wxT("\n"); 2798 - if (fdoNames[3].Len() > 0) 2799 - AutoFDOmsg += fdoNames[3] + wxT("\n"); 2800 - if (fdoNames[4].Len() > 0) 2801 - AutoFDOmsg += fdoNames[4] + wxT("\n"); 2802 - AutoFDOmsg += 2803 - wxT 2804 - ("\nAccessing these fdo_XX tables you can take full advantage of\n"); 2805 - AutoFDOmsg += wxT("FDO-OGR auto-wrapping facility\n"); 2806 - AutoFDOmsg += 2807 - wxT 2808 - ("This allows you to access any specific FDO-OGR Geometry as if it\n"); 2809 - AutoFDOmsg += 2810 - wxT 2811 - ("where native SpatiaLite ones in a completely transparent way.\n"); 2812 - } 2813 - return; 2814 - } 1850 + bool geom; 1851 + if (size < 1 || !blob) 1852 + return BLOB_NULL; 1853 + if (size > 5) 1854 + { 1855 + if (strncmp ((char *) blob, "%PDF-", 5) == 0) 1856 + return BLOB_PDF; 1857 + } 1858 + if (size > 6) 1859 + { 1860 + if (strncmp ((char *) blob, "GIF87a", 6) == 0 1861 + || strncmp ((char *) blob, "GIF89a", 6) == 0) 1862 + return BLOB_GIF; 1863 + } 1864 + if (size > 4) 1865 + { 1866 + if (memcmp (blob, ZipSignature, 4) == 0) 1867 + return BLOB_ZIP; 1868 + if (memcmp (blob, Jpeg1Signature, 2) == 0 1869 + && memcmp (blob + size - 2, Jpeg2Signature, 2) == 0) 1870 + return BLOB_JPEG; // this one is the standard JPEG signature 1871 + if (memcmp (blob, Jpeg3Signature, 4) == 0) 1872 + return BLOB_JPEG; // another common JPEG signature 1873 + } 1874 + if (size > 8) 1875 + { 1876 + if (memcmp (blob, PngSignature, 8) == 0) 1877 + return BLOB_PNG; 1878 + } 1879 + if (size > 10) 1880 + { 1881 + if (memcmp (blob + 6, JfifSignature, 4) == 0) 1882 + return BLOB_JFIF; // standard JFIF signature 1883 + if (memcmp (blob + 6, ExifSignature, 4) == 0) 1884 + return BLOB_EXIF; // standard EXIF signature 1885 + } 1886 +// testing for GEOMETRY 1887 + geom = true; 1888 + if (size < 45) 1889 + geom = false; 1890 + else 1891 + { 1892 + if (*(blob + 0) != 0x00) 1893 + geom = false; 1894 + if (*(blob + (size - 1)) != 0xFE) 1895 + geom = false; 1896 + if (*(blob + 38) != 0x7C) 1897 + geom = false; 1898 + if (*(blob + 1) == 0 || *(blob + 1) == 1) 1899 + ; 1900 + else 1901 + geom = false; 1902 + } 1903 + if (geom == true) 1904 + return BLOB_GEOMETRY; 1905 + return BLOB_HEX; 2815 1906 } 2816 1907 2817 -void MyFrame::AutoFDOStop() 2818 -{ 2819 -// 2820 -// trying to stop the FDO-OGR auto-wrapper 2821 -// 2822 - int ret; 2823 - const char *name; 2824 - int i; 2825 - char **results; 2826 - int rows; 2827 - int columns; 2828 - char sql[1024]; 2829 - int count = 0; 2830 - int len; 2831 - int spatial_type = 0; 2832 - AutoFDOTables tables; 2833 - AutoFDOTable *p; 2834 - AutoFDOmsg = wxT(""); 2835 - strcpy(sql, "SELECT CheckSpatialMetadata()"); 2836 - ret = sqlite3_get_table(SqliteHandle, sql, &results, &rows, &columns, NULL); 2837 - if (ret != SQLITE_OK) 2838 - goto error1; 2839 - if (rows < 1) 2840 - ; 2841 - else 2842 - { 2843 - for (i = 1; i <= rows; i++) 2844 - spatial_type = atoi(results[(i * columns) + 0]); 2845 - } 2846 - sqlite3_free_table(results); 2847 -error1: 2848 - if (spatial_type == 2) 2849 - { 2850 - // 2851 - // ok, destroying VirtualFDO tables 2852 - // 2853 - strcpy(sql, "SELECT DISTINCT f_table_name FROM geometry_columns"); 2854 - ret = 2855 - sqlite3_get_table(SqliteHandle, sql, &results, &rows, &columns, NULL); 2856 - if (ret != SQLITE_OK) 2857 - goto error; 2858 - if (rows < 1) 2859 - ; 2860 - else 2861 - { 2862 - for (i = 1; i <= rows; i++) 2863 - { 2864 - name = results[(i * columns) + 0]; 2865 - if (name) 2866 - { 2867 - len = strlen(name); 2868 - tables.Add(name, len); 2869 - } 2870 - } 2871 - } 2872 - sqlite3_free_table(results); 2873 - p = tables.GetFirst(); 2874 - while (p) 2875 - { 2876 - // 2877 - // destroying the VirtualFDO table [if existing] 2878 - // 2879 - sprintf(sql, "DROP TABLE IF EXISTS \"fdo_%s\"", p->GetName()); 2880 - ret = sqlite3_exec(SqliteHandle, sql, NULL, 0, NULL); 2881 - if (ret != SQLITE_OK) 2882 - goto error; 2883 - count++; 2884 - p = p->GetNext(); 2885 - } 2886 - error: 2887 - if (count++) 2888 - AutoFDOmsg = wxT("FDO-OGR auto-wrapping shutdown done"); 2889 - return; 2890 - } 2891 -} 2892 - 2893 -void MyFrame::GetHelp(wxString & html) 1908 +void 1909 +MyFrame::GetHelp (wxString & html) 2894 1910 { 2895 1911 // 2896 1912 // return the HTML Help 2897 1913 // 2898 - html = 2899 - wxT("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); 2900 - html += wxT("<html>"); 2901 - html += wxT("<head>"); 2902 - html += 2903 - wxT 2904 - ("<meta content=\"text/html; charset=UTF-8\" http-equiv=\"content-type\">"); 2905 - html += wxT("<title>SQLite + SpatiaLite quick Help</title>"); 2906 - html += wxT("</head>"); 2907 - html += wxT("<body bgcolor=\"#e8e8e8\">"); 2908 - html += wxT("<h1><a name=\"index\">SQLite + SpatiaLite quick Help</a></h1>"); 2909 - html += wxT("<table cellspacing=\"2\" cellpadding=\"2\">"); 2910 - html += 2911 - wxT 2912 - ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\">Index of contents</td></tr>"); 2913 - html += 2914 - wxT 2915 - ("<tr><td bgcolor=\"#fffff0\">1.</td><td bgcolor=\"#f0fff0\"><a href=\"#c1\">SQLite SQL syntax</a></td></tr>"); 2916 - html += 2917 - wxT 2918 - ("<tr><td bgcolor=\"#fffff0\">2.</td><td bgcolor=\"#f0fff0\"><a href=\"#c2\">SQLite SQL functions</a><ul>"); 2919 - html += wxT("<li><a href=\"#c21\">ordinary functions</a></li>"); 2920 - html += wxT("<li><a href=\"#c22\">aggregate functions</a></li>"); 2921 - html += wxT("</ul></td></tr>"); 2922 - html += 2923 - wxT 2924 - ("<tr><td bgcolor=\"#fffff0\">3.</td><td bgcolor=\"#f0fff0\"><a href=\"#c3\">SpatiaLite SQL Spatial functions</a><ul>"); 2925 - html += wxT("<li><a href=\"#math\">math functions</a></li>"); 2926 - html += 2927 - wxT("<li><a href=\"#blob\">utility functions for BLOB objects</a></li>"); 2928 - html += 2929 - wxT 2930 - ("<li><a href=\"#c30\">utility functions [non-standard] for geometric objects</a></li>"); 2931 - html += 2932 - wxT 2933 - ("<li><a href=\"#c31\">functions for constructing a geometric object given its Well-known Text Representation</a></li>"); 2934 - html += 2935 - wxT 2936 - ("<li><a href=\"#c32\">functions for constructing a geometric object given its Well-known Binary Representation</a></li>"); 2937 - html += 2938 - wxT 2939 - ("<li><a href=\"#c33\">functions for obtaining the Well-known Text / Well-known Binary Representation of a geometric object</a></li>"); 2940 - html += 2941 - wxT 2942 - ("<li><a href=\"#c33misc\">functions supporting exotic geometric formats</a></li>"); 2943 - html += wxT("<li><a href=\"#c34\">functions on type Geometry</a></li>"); 2944 - html += wxT("<li><a href=\"#c35\">functions on type Point</a></li>"); 2945 - html += 2946 - wxT 2947 - ("<li><a href=\"#c36\">functions on type Surface [Polygon or Ring]</a></li>"); 2948 - html += wxT("<li><a href=\"#c37\">functions on type Polygon</a></li>"); 2949 - html += wxT("<li><a href=\"#c38\">functions on type GeomCollection</a></li>"); 2950 - html += 2951 - wxT 2952 - ("<li><a href=\"#c39\">functions testing approximative spatial relationships via MBRs</a></li>"); 2953 - html += 2954 - wxT 2955 - ("<li><a href=\"#c40\">functions testing spatial relationships</a></li>"); 2956 - html += 2957 - wxT 2958 - ("<li><a href=\"#c41\">functions implementing spatial operators</a></li>"); 2959 - html += 2960 - wxT 2961 - ("<li><a href=\"#c42\">functions for coordinate transformations</a></li>"); 2962 - html += 2963 - wxT 2964 - ("<li><a href=\"#c43\">functions for Spatial-MetaData and Spatial-Index handling</a></li>"); 2965 - html += 2966 - wxT 2967 - ("<li><a href=\"#c43fdo\">functions implementing FDO/OGR compatibily</a></li>"); 2968 - html += 2969 - wxT("<li><a href=\"#c44\">functions for MbrCache-based queries</a></li>"); 2970 - html += wxT("</ul></td></tr>"); 2971 - html += wxT("</table>"); 2972 - html += wxT("<h3><a name=\"c1\">SQLite SQL syntax</a></h3>"); 2973 - html += wxT("<table cellspacing=\"4\" cellpadding=\"2\"width=\"100%\">"); 2974 - html += 2975 - wxT 2976 - ("<tr><td bgcolor=\"#fffff0\">ALTER TABLE</td><td bgcolor=\"#f0fff0\">sql-statement ::= ALTER TABLE [database-name .] table-name alteration<br>"); 2977 - html += wxT("alteration ::= RENAME TO new-table-name<br>"); 2978 - html += wxT("alteration ::= ADD [COLUMN] column-def<br></td></tr>"); 2979 - html += 2980 - wxT 2981 - ("<tr><td bgcolor=\"#fffff0\">ANALYZE</td><td bgcolor=\"#f0fff0\">sql-statement ::= ANALYZE<br>"); 2982 - html += wxT("sql-statement ::= ANALYZE database-name<br>"); 2983 - html += 2984 - wxT("sql-statement ::= ANALYZE [database-name .] table-name<br></td></tr>"); 2985 - html += 2986 - wxT 2987 - ("<tr><td bgcolor=\"#fffff0\">ATTACH DATABASE</td><td bgcolor=\"#f0fff0\">sql-statement ::= ATTACH [DATABASE] database-filename AS database-name</td></tr>"); 2988 - html += 2989 - wxT 2990 - ("<tr><td bgcolor=\"#fffff0\">BEGIN TRANSACTION</td><td bgcolor=\"#f0fff0\">sql-statement ::= BEGIN [ DEFERRED | IMMEDIATE | EXCLUSIVE ] [TRANSACTION [name]]<br>"); 2991 - html += wxT("sql-statement ::= END [TRANSACTION [name]]<br>"); 2992 - html += wxT("sql-statement ::= COMMIT [TRANSACTION [name]]<br>"); 2993 - html += wxT("sql-statement ::= ROLLBACK [TRANSACTION [name]]<br></td></tr>"); 2994 - html += 2995 - wxT 2996 - ("<tr><td bgcolor=\"#fffff0\">COMMIT TRANSACTION</td><td bgcolor=\"#f0fff0\">sql-statement ::= BEGIN [ DEFERRED | IMMEDIATE | EXCLUSIVE ] [TRANSACTION [name]]<br>"); 2997 - html += wxT("sql-statement ::= END [TRANSACTION [name]]<br>"); 2998 - html += wxT("sql-statement ::= COMMIT [TRANSACTION [name]]<br>"); 2999 - html += wxT("sql-statement ::= ROLLBACK [TRANSACTION [name]]<br></td></tr>"); 3000 - html += 3001 - wxT 3002 - ("<tr><td bgcolor=\"#fffff0\">CREATE INDEX</td><td bgcolor=\"#f0fff0\">sql-statement ::= CREATE [UNIQUE] INDEX [IF NOT EXISTS] [database-name .] index-name<br>"); 3003 - html += wxT("ON table-name ( column-name [, column-name]* )<br>"); 3004 - html += 3005 - wxT 3006 - ("column-name ::= name [ COLLATE collation-name] [ ASC | DESC ]</td></tr>"); 3007 - html += 3008 - wxT 3009 - ("<tr><td bgcolor=\"#fffff0\">CREATE TABLE</td><td bgcolor=\"#f0fff0\">sql-command ::= CREATE [TEMP | TEMPORARY] TABLE [IF NOT EXISTS] [database-name .] table-name (<br>"); 3010 - html += wxT("column-def [, column-def]*<br>"); 3011 - html += wxT("[, constraint]*<br>"); 3012 - html += wxT(")<br>"); 3013 - html += 3014 - wxT 3015 - ("sql-command ::= CREATE [TEMP | TEMPORARY] TABLE [database-name.] table-name AS select-statement<br>"); 3016 - html += 3017 - wxT 3018 - ("column-def ::= name [type] [[CONSTRAINT name] column-constraint]*<br>"); 3019 - html += wxT("type ::= typename |<br>"); 3020 - html += wxT("typename ( number ) |<br>"); 3021 - html += wxT("typename ( number , number )<br>"); 3022 - html += wxT("column-constraint ::= NOT NULL [ conflict-clause ] |<br>"); 3023 - html += 3024 - wxT("PRIMARY KEY [sort-order] [ conflict-clause ] [AUTOINCREMENT] |<br>"); 3025 - html += wxT("UNIQUE [ conflict-clause ] |<br>"); 3026 - html += wxT("CHECK ( expr ) |<br>"); 3027 - html += wxT("DEFAULT value |<br>"); 3028 - html += wxT("COLLATE collation-name<br>"); 3029 - html += 3030 - wxT("constraint ::= PRIMARY KEY ( column-list ) [ conflict-clause ] |<br>"); 3031 - html += wxT("UNIQUE ( column-list ) [ conflict-clause ] |<br>"); 3032 - html += wxT("CHECK ( expr )<br>"); 3033 - html += wxT("conflict-clause ::= ON CONFLICT conflict-algorithm</td></tr>"); 3034 - html += 3035 - wxT 3036 - ("<tr><td bgcolor=\"#fffff0\">CREATE TRIGGER</td><td bgcolor=\"#f0fff0\">sql-statement ::= CREATE [TEMP | TEMPORARY] TRIGGER [IF NOT EXISTS] trigger-name [ BEFORE | AFTER ]<br>"); 3037 - html += wxT("database-event ON [database-name .] table-name<br>"); 3038 - html += wxT("trigger-action<br>"); 3039 - html += 3040 - wxT 3041 - ("sql-statement ::= CREATE [TEMP | TEMPORARY] TRIGGER [IF NOT EXISTS] trigger-name INSTEAD OF<br>"); 3042 - html += wxT("database-event ON [database-name .] view-name<br>"); 3043 - html += wxT("trigger-action<br>"); 3044 - html += wxT("database-event ::= DELETE |<br>"); 3045 - html += wxT("INSERT |<br>"); 3046 - html += wxT("UPDATE |<br>"); 3047 - html += wxT("UPDATE OF column-list<br>"); 3048 - html += wxT("trigger-action ::= [ FOR EACH ROW ] [ WHEN expression ]<br>"); 3049 - html += wxT("BEGIN<br>"); 3050 - html += wxT("trigger-step ; [ trigger-step ; ]*<br>"); 3051 - html += wxT("END<br>"); 3052 - html += wxT("trigger-step ::= update-statement | insert-statement |<br>"); 3053 - html += wxT("delete-statement | select-statement</td></tr>"); 3054 - html += 3055 - wxT 3056 - ("<tr><td bgcolor=\"#fffff0\">CREATE VIEW</td><td bgcolor=\"#f0fff0\">sql-command ::= CREATE [TEMP | TEMPORARY] VIEW [IF NOT EXISTS] [database-name.] view-name AS select-statement</td></tr>"); 3057 - html += 3058 - wxT 3059 - ("<tr><td bgcolor=\"#fffff0\">CREATE VIRTUAL TABLE</td><td bgcolor=\"#f0fff0\">sql-command ::= CREATE VIRTUAL TABLE [database-name .] table-name USING module-name [( arguments )]</td></tr>"); 3060 - html += 3061 - wxT 3062 - ("<tr><td bgcolor=\"#fffff0\">DELETE</td><td bgcolor=\"#f0fff0\">sql-statement ::= DELETE FROM [database-name .] table-name [WHERE expr]</td></tr>"); 3063 - html += 3064 - wxT 3065 - ("<tr><td bgcolor=\"#fffff0\">DETACH DATABASE</td><td bgcolor=\"#f0fff0\">sql-command ::= DETACH [DATABASE] database-name</td></tr>"); 3066 - html += 3067 - wxT 3068 - ("<tr><td bgcolor=\"#fffff0\">DROP INDEX</td><td bgcolor=\"#f0fff0\">sql-command ::= DROP INDEX [IF EXISTS] [database-name .] index-name</td></tr>"); 3069 - html += 3070 - wxT 3071 - ("<tr><td bgcolor=\"#fffff0\">DROP TABLE</td><td bgcolor=\"#f0fff0\">sql-command ::= DROP TABLE [IF EXISTS] [database-name.] table-name</td></tr>"); 3072 - html += 3073 - wxT 3074 - ("<tr><td bgcolor=\"#fffff0\">DROP TRIGGER</td><td bgcolor=\"#f0fff0\">sql-statement ::= DROP TRIGGER [IF EXISTS] [database-name .] trigger-name</td></tr>"); 3075 - html += 3076 - wxT 3077 - ("<tr><td bgcolor=\"#fffff0\">DROP VIEW</td><td bgcolor=\"#f0fff0\">sql-command ::= DROP VIEW [IF EXISTS] view-name</td></tr>"); 3078 - html += 3079 - wxT 3080 - ("<tr><td bgcolor=\"#fffff0\">END TRANSACTION</td><td bgcolor=\"#f0fff0\">sql-statement ::= BEGIN [ DEFERRED | IMMEDIATE | EXCLUSIVE ] [TRANSACTION [name]]<br>"); 3081 - html += wxT("sql-statement ::= END [TRANSACTION [name]]<br>"); 3082 - html += wxT("sql-statement ::= COMMIT [TRANSACTION [name]]<br>"); 3083 - html += wxT("sql-statement ::= ROLLBACK [TRANSACTION [name]]<br></td></tr>"); 3084 - html += 3085 - wxT 3086 - ("<tr><td bgcolor=\"#fffff0\">EXPLAIN</td><td bgcolor=\"#f0fff0\">sql-statement ::= EXPLAIN sql-statement</td></tr>"); 3087 - html += 3088 - wxT 3089 - ("<tr><td bgcolor=\"#fffff0\">INSERT</td><td bgcolor=\"#f0fff0\">sql-statement ::= INSERT [OR conflict-algorithm] INTO [database-name .] table-name [(column-list)] VALUES(value-list) |<br>"); 3090 - html += 3091 - wxT 3092 - ("INSERT [OR conflict-algorithm] INTO [database-name .] table-name [(column-list)] select-statement</td></tr>"); 3093 - html += 3094 - wxT 3095 - ("<tr><td bgcolor=\"#fffff0\">ON CONFLICT clause</td><td bgcolor=\"#f0fff0\">conflict-clause ::= ON CONFLICT conflict-algorithm<br>"); 3096 - html += 3097 - wxT 3098 - ("conflict-algorithm ::= ROLLBACK | ABORT | FAIL | IGNORE | REPLACE</td></tr>"); 3099 - html += 3100 - wxT 3101 - ("<tr><td bgcolor=\"#fffff0\">PRAGMA</td><td bgcolor=\"#f0fff0\">sql-statement ::= PRAGMA name [= value] |<br>"); 3102 - html += wxT("PRAGMA function(arg)<hr>"); 3103 - html += wxT("PRAGMA auto_vacuum;<br>"); 3104 - html += 3105 - wxT("PRAGMA auto_vacuum = 0 | none | 1 | full | 2 | incremental;<hr>"); 3106 - html += wxT("PRAGMA cache_size;<br>"); 3107 - html += wxT("PRAGMA cache_size = Number-of-pages;<hr>"); 3108 - html += wxT("PRAGMA case_sensitive_like;<br>"); 3109 - html += wxT("PRAGMA case_sensitive_like = 0 | 1;<hr>"); 3110 - html += wxT("PRAGMA count_changes;<br>"); 3111 - html += wxT("PRAGMA count_changes = 0 | 1;<hr>"); 3112 - html += wxT("PRAGMA default_cache_size;<br>"); 3113 - html += wxT("PRAGMA default_cache_size = Number-of-pages;<hr>"); 3114 - html += wxT("PRAGMA empty_result_callbacks;<br>"); 3115 - html += wxT("PRAGMA empty_result_callbacks = 0 | 1;<hr>"); 3116 - html += wxT("PRAGMA encoding;<br>"); 3117 - html += wxT("PRAGMA encoding = \"UTF-8\";<br>"); 3118 - html += wxT("PRAGMA encoding = \"UTF-16\";<br>"); 3119 - html += wxT("PRAGMA encoding = \"UTF-16le\";<br>"); 3120 - html += wxT("PRAGMA encoding = \"UTF-16be\";<hr>"); 3121 - html += wxT("PRAGMA full_column_names;<br>"); 3122 - html += wxT("PRAGMA full_column_names = 0 | 1;<hr>"); 3123 - html += wxT("PRAGMA fullfsync;<br>"); 3124 - html += wxT("PRAGMA fullfsync = 0 | 1;<hr>"); 3125 - html += wxT("PRAGMA journal_mode;<br>"); 3126 - html += wxT("PRAGMA database.journal_mode;<br>"); 3127 - html += wxT("PRAGMA journal_mode = DELETE | PERSIST | OFF<br>"); 3128 - html += wxT("PRAGMA database.journal_mode = DELETE | PERSIST | OFF<hr>"); 3129 - html += wxT("PRAGMA legacy_file_format;<br>"); 3130 - html += wxT("PRAGMA legacy_file_format = ON | OFF<hr>"); 3131 - html += wxT("PRAGMA locking_mode;<br>"); 3132 - html += wxT("PRAGMA locking_mode = NORMAL | EXCLUSIVE<hr>"); 3133 - html += wxT("PRAGMA page_size;<br>"); 3134 - html += wxT("PRAGMA page_size = bytes;<hr>"); 3135 - html += wxT("PRAGMA max_page_count;<br>"); 3136 - html += wxT("PRAGMA max_page_count = N;<hr>"); 3137 - html += wxT("PRAGMA read_uncommitted;<br>"); 3138 - html += wxT("PRAGMA read_uncommitted = 0 | 1;<hr>"); 3139 - html += wxT("PRAGMA short_column_names;<br>"); 3140 - html += wxT("PRAGMA short_column_names = 0 | 1;<hr>"); 3141 - html += wxT("PRAGMA synchronous;<br>"); 3142 - html += wxT("PRAGMA synchronous = FULL; (2)<br>"); 3143 - html += wxT("PRAGMA synchronous = NORMAL; (1)<br>"); 3144 - html += wxT("PRAGMA synchronous = OFF; (0)<hr>"); 3145 - html += wxT("PRAGMA temp_store;<br>"); 3146 - html += wxT("PRAGMA temp_store = DEFAULT; (0)<br>"); 3147 - html += wxT("PRAGMA temp_store = FILE; (1)<br>"); 3148 - html += wxT("PRAGMA temp_store = MEMORY; (2)<hr>"); 3149 - html += wxT("PRAGMA temp_store_directory;<br>"); 3150 - html += wxT("PRAGMA temp_store_directory = 'directory-name';<hr>"); 3151 - html += wxT("PRAGMA database_list;<hr>"); 3152 - html += wxT("PRAGMA foreign_key_list(table-name);<hr>"); 3153 - html += wxT("PRAGMA [database].freelist_count;<hr>"); 3154 - html += wxT("PRAGMA index_info(index-name);<hr>"); 3155 - html += wxT("PRAGMA index_list(table-name);<hr>"); 3156 - html += wxT("PRAGMA table_info(table-name);<hr>"); 3157 - html += wxT("PRAGMA [database.]schema_version;<br>"); 3158 - html += wxT("PRAGMA [database.]schema_version = integer ;<br>"); 3159 - html += wxT("PRAGMA [database.]user_version;<br>"); 3160 - html += wxT("PRAGMA [database.]user_version = integer ;<hr>"); 3161 - html += wxT("PRAGMA integrity_check;<br>"); 3162 - html += wxT("PRAGMA integrity_check(integer)<hr>"); 3163 - html += wxT("PRAGMA parser_trace = ON; (1)<br>"); 3164 - html += wxT("PRAGMA parser_trace = OFF; (0)<hr>"); 3165 - html += wxT("PRAGMA vdbe_trace = ON; (1)<br>"); 3166 - html += wxT("PRAGMA vdbe_trace = OFF; (0)<hr>"); 3167 - html += wxT("PRAGMA vdbe_listing = ON; (1)<br>"); 3168 - html += wxT("PRAGMA vdbe_listing = OFF; (0)</td></tr>"); 3169 - html += 3170 - wxT 3171 - ("<tr><td bgcolor=\"#fffff0\">REINDEX</td><td bgcolor=\"#f0fff0\">sql-statement ::= REINDEX collation name<br>"); 3172 - html += 3173 - wxT 3174 - ("sql-statement ::= REINDEX [database-name .] table/index-name</td></tr>"); 3175 - html += 3176 - wxT 3177 - ("<tr><td bgcolor=\"#fffff0\">REPLACE</td><td bgcolor=\"#f0fff0\">sql-statement ::= REPLACE INTO [database-name .] table-name [( column-list )] VALUES ( value-list ) |<br>"); 3178 - html += 3179 - wxT 3180 - ("REPLACE INTO [database-name .] table-name [( column-list )] select-statement</td></tr>"); 3181 - html += 3182 - wxT 3183 - ("<tr><td bgcolor=\"#fffff0\">ROLLBACK TRANSACTION</td><td bgcolor=\"#f0fff0\">sql-statement ::= BEGIN [ DEFERRED | IMMEDIATE | EXCLUSIVE ] [TRANSACTION [name]]<br>"); 3184 - html += wxT("sql-statement ::= END [TRANSACTION [name]]<br>"); 3185 - html += wxT("sql-statement ::= COMMIT [TRANSACTION [name]]<br>"); 3186 - html += wxT("sql-statement ::= ROLLBACK [TRANSACTION [name]]<br></td></tr>"); 3187 - html += 3188 - wxT 3189 - ("<tr><td bgcolor=\"#fffff0\">SELECT</td><td bgcolor=\"#f0fff0\">sql-statement ::= SELECT [ALL | DISTINCT] result [FROM table-list]<br>"); 3190 - html += wxT("[WHERE expr]<br>"); 3191 - html += wxT("[GROUP BY expr-list]<br>"); 3192 - html += wxT("[HAVING expr]<br>"); 3193 - html += wxT("[compound-op select]*<br>"); 3194 - html += wxT("[ORDER BY sort-expr-list]<br>"); 3195 - html += wxT("[LIMIT integer [( OFFSET | , ) integer]]<br>"); 3196 - html += wxT("result ::= result-column [, result-column]*<br>"); 3197 - html += 3198 - wxT("result-column ::= * | table-name . * | expr [ [AS] string ]<br>"); 3199 - html += wxT("table-list ::= table [join-op table join-args]*<br>"); 3200 - html += wxT("table ::= table-name [AS alias] |<br>"); 3201 - html += wxT("( select ) [AS alias]<br>"); 3202 - html += 3203 - wxT 3204 - ("join-op ::= , | [NATURAL] [LEFT | RIGHT | FULL] [OUTER | INNER | CROSS] JOIN<br>"); 3205 - html += wxT("join-args ::= [ON expr] [USING ( id-list )]<br>"); 3206 - html += 3207 - wxT("sort-expr-list ::= expr [sort-order] [, expr [sort-order]]*<br>"); 3208 - html += wxT("sort-order ::= [ COLLATE collation-name ] [ ASC | DESC ]<br>"); 3209 - html += 3210 - wxT("compound_op ::= UNION | UNION ALL | INTERSECT | EXCEPT</td></tr>"); 3211 - html += 3212 - wxT 3213 - ("<tr><td bgcolor=\"#fffff0\">UPDATE</td><td bgcolor=\"#f0fff0\">sql-statement ::= UPDATE [ OR conflict-algorithm ] [database-name .] table-name<br>"); 3214 - html += wxT("SET assignment [, assignment]*<br>"); 3215 - html += wxT("[WHERE expr]<br>"); 3216 - html += wxT("assignment ::= column-name = expr</td></tr>"); 3217 - html += 3218 - wxT 3219 - ("<tr><td bgcolor=\"#fffff0\">VACUUM</td><td bgcolor=\"#f0fff0\">sql-statement ::= VACUUM</td></tr>"); 3220 - html += wxT("</table>"); 3221 - html += wxT("<a href=\"#index\">back to index</a>"); 3222 - html += 3223 - wxT 3224 - ("<h3><a align=\"center\" bgcolor=\"#e0ffe0\" name=\"c2\">SQLite SQL functions</a></h3>"); 3225 - html += wxT("<table cellspacing=\"4\" cellpadding=\"2\" width=\"100%\">"); 3226 - html += 3227 - wxT 3228 - ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c21\">ordinary functions</a><br><a href=\"#index\">back to index</a></td></tr>"); 3229 - html += 3230 - wxT 3231 - ("<tr><td bgcolor=\"#fffff0\">abs(X)</td><td bgcolor=\"#f0fff0\">Return the absolute value of the numeric argument X. "); 3232 - html += 3233 - wxT 3234 - ("Return NULL if X is NULL. Return 0.0 if X is not a numeric value.</td></tr>"); 3235 - html += 3236 - wxT 3237 - ("<tr><td bgcolor=\"#fffff0\">coalesce(X,Y,...)</td><td bgcolor=\"#f0fff0\">Return a copy of the first non-NULL argument. "); 3238 - html += 3239 - wxT 3240 - ("If all arguments are NULL then NULL is returned. There must be at least 2 arguments.</td></tr>"); 3241 - html += 3242 - wxT 3243 - ("<tr><td bgcolor=\"#fffff0\">glob(X,Y)</td><td bgcolor=\"#f0fff0\">This function is used to implement the \"X GLOB Y\" syntax of SQLite. "); 3244 - html += 3245 - wxT 3246 - ("The sqlite3_create_function() interface can be used to override this function and thereby change the operation of the GLOB operator.</td></tr>"); 3247 - html += 3248 - wxT 3249 - ("<tr><td bgcolor=\"#fffff0\">ifnull(X,Y)</td><td bgcolor=\"#f0fff0\">Return a copy of the first non-NULL argument. "); 3250 - html += 3251 - wxT 3252 - ("If both arguments are NULL then NULL is returned. This behaves the same as coalesce().</td></tr>"); 3253 - html += 3254 - wxT 3255 - ("<tr><td bgcolor=\"#fffff0\">hex(X)</td><td bgcolor=\"#f0fff0\">The argument is interpreted as a BLOB. "); 3256 - html += 3257 - wxT 3258 - ("The result is a hexadecimal rendering of the content of that blob.</td></tr>"); 3259 - html += 3260 - wxT 3261 - ("<tr><td bgcolor=\"#fffff0\">last_insert_rowid()</td><td bgcolor=\"#f0fff0\">Return the ROWID of the last row insert from this connection to the database. "); 3262 - html += 3263 - wxT 3264 - ("This is the same value that would be returned from the sqlite3_last_insert_rowid() API function.</td></tr>"); 3265 - html += 3266 - wxT 3267 - ("<tr><td bgcolor=\"#fffff0\">length(X)</td><td bgcolor=\"#f0fff0\">Return the string length of X in characters. "); 3268 - html += 3269 - wxT 3270 - ("If SQLite is configured to support UTF-8, then the number of UTF-8 characters is returned, not the number of bytes.</td></tr>"); 3271 - html += 3272 - wxT 3273 - ("<tr><td bgcolor=\"#fffff0\">like(X,Y)<br>like(X,Y,Z)</td><td bgcolor=\"#f0fff0\">This function is used to implement the \"X LIKE Y [ESCAPE Z]\" syntax of SQL."); 3274 - html += 3275 - wxT 3276 - ("If the optional ESCAPE clause is present, then the user-function is invoked with three arguments. "); 3277 - html += wxT("Otherwise, it is invoked with two arguments only. "); 3278 - html += 3279 - wxT 3280 - ("The sqlite3_create_function() interface can be used to override this function and thereby change the operation of the LIKE operator. "); 3281 - html += 3282 - wxT 3283 - ("When doing this, it may be important to override both the two and three argument versions of the like() function. "); 3284 - html += 3285 - wxT 3286 - ("Otherwise, different code may be called to implement the LIKE operator depending on whether or not an ESCAPE clause was specified.</td></tr>"); 3287 - html += 3288 - wxT 3289 - ("<tr><td bgcolor=\"#fffff0\">load_extension(X)</br>load_extension(X,Y)</td><td bgcolor=\"#f0fff0\">Load SQLite extensions "); 3290 - html += 3291 - wxT("out of the shared library file named X using the entry point Y. "); 3292 - html += 3293 - wxT 3294 - ("The result is a NULL. If Y is omitted then the default entry point of sqlite3_extension_init is used. "); 3295 - html += 3296 - wxT 3297 - ("This function raises an exception if the extension fails to load or initialize correctly.</td></tr>"); 3298 - html += 3299 - wxT 3300 - ("<tr><td bgcolor=\"#fffff0\">lower(X)</td><td bgcolor=\"#f0fff0\">Return a copy of string X will all ASCII characters converted to lower case. "); 3301 - html += 3302 - wxT 3303 - ("The C library tolower() routine is used for the conversion, which means that this function might not work correctly on non-ASCII UTF-8 characters.</td></tr>"); 3304 - html += 3305 - wxT 3306 - ("<tr><td bgcolor=\"#fffff0\">ltrim(X)<br>ltrim(X,Y)</td><td bgcolor=\"#f0fff0\">Return a string formed by removing any and all characters "); 3307 - html += 3308 - wxT 3309 - ("that appear in Y from the left side of X. If the Y argument is omitted, spaces are removed.</td></tr>"); 3310 - html += 3311 - wxT 3312 - ("<tr><td bgcolor=\"#fffff0\">max(X,Y,...)</td><td bgcolor=\"#f0fff0\">Return the argument with the maximum value. "); 3313 - html += wxT("Arguments may be strings in addition to numbers. "); 3314 - html += wxT("The maximum value is determined by the usual sort order. "); 3315 - html += 3316 - wxT 3317 - ("Note that max() is a simple function when it has 2 or more arguments but converts to an aggregate function if given only a single argument.</td></tr>"); 3318 - html += 3319 - wxT 3320 - ("<tr><td bgcolor=\"#fffff0\">min(X,Y,...)</td><td bgcolor=\"#f0fff0\">Return the argument with the minimum value. "); 3321 - html += wxT("Arguments may be strings in addition to numbers. "); 3322 - html += wxT("The minimum value is determined by the usual sort order. "); 3323 - html += 3324 - wxT 3325 - ("Note that min() is a simple function when it has 2 or more arguments but converts to an aggregate function if given only a single argument.</td></tr>"); 3326 - html += 3327 - wxT 3328 - ("<tr><td bgcolor=\"#fffff0\">nullif(X,Y)</td><td bgcolor=\"#f0fff0\">Return the first argument if the arguments are different, otherwise return NULL.</td></tr>"); 3329 - html += 3330 - wxT 3331 - ("<tr><td bgcolor=\"#fffff0\">quote(X)</td><td bgcolor=\"#f0fff0\">This routine return a string which is the value of its argument suitable for inclusion "); 3332 - html += 3333 - wxT 3334 - ("into another SQL statement. Strings are surrounded by single-quotes with escapes on interior quotes as needed. "); 3335 - html += 3336 - wxT 3337 - ("BLOBs are encoded as hexadecimal literals. The implementation of VACUUM uses this function. "); 3338 - html += 3339 - wxT 3340 - ("The function is also useful when writing triggers to implement undo/redo functionality.</td></tr>"); 3341 - html += 3342 - wxT 3343 - ("<tr><td bgcolor=\"#fffff0\">random()</td><td bgcolor=\"#f0fff0\">Return a pseudo-random integer between -9223372036854775808 and +9223372036854775807.</td></tr>"); 3344 - html += 3345 - wxT 3346 - ("<tr><td bgcolor=\"#fffff0\">randomblob(N)</td><td bgcolor=\"#f0fff0\">Return an N-byte blob containing pseudo-random bytes. N should be a postive integer.</td></tr>"); 3347 - html += 3348 - wxT 3349 - ("<tr><td bgcolor=\"#fffff0\">replace(X,Y,Z)</td><td bgcolor=\"#f0fff0\">Return a string formed by substituting string Z for every occurrance of string Y in string X. "); 3350 - html += 3351 - wxT("The BINARY collating sequence is used for comparisons.</td></tr>"); 3352 - html += 3353 - wxT 3354 - ("<tr><td bgcolor=\"#fffff0\">round(X)<br>round(X,Y)</td><td bgcolor=\"#f0fff0\">Round off the number X to Y digits to the right of the decimal point. "); 3355 - html += wxT("If the Y argument is omitted, 0 is assumed.</td></tr>"); 3356 - html += 3357 - wxT 3358 - ("<tr><td bgcolor=\"#fffff0\">rtrim(X)<br>rtrim(X,Y)</td><td bgcolor=\"#f0fff0\">Return a string formed by removing any and all characters "); 3359 - html += 3360 - wxT 3361 - ("that appear in Y from the right side of X. If the Y argument is omitted, spaces are removed.</td></tr>"); 3362 - html += 3363 - wxT 3364 - ("<tr><td bgcolor=\"#fffff0\">sqlite_version(X)</td><td bgcolor=\"#f0fff0\">Return the version string for the SQLite library that is running. Example: \"3.5.9\"</td></tr>"); 3365 - html += 3366 - wxT 3367 - ("<tr><td bgcolor=\"#fffff0\">substr(X,Y,Z)<br>substr(X,Y)</td><td bgcolor=\"#f0fff0\">Return a substring of input string X that begins with the Y-th character "); 3368 - html += 3369 - wxT 3370 - ("and which is Z characters long. If Z is omitted then all character through the end of the string are returned. "); 3371 - html += wxT("The left-most character of X is number 1. "); 3372 - html += 3373 - wxT 3374 - ("If Y is negative the the first character of the substring is found by counting from the right rather than the left. "); 3375 - html += 3376 - wxT 3377 - ("If X is string then characters indices refer to actual UTF-8 characters. If X is a BLOB then the indices refer to bytes.</td></tr>"); 3378 - html += 3379 - wxT 3380 - ("<tr><td bgcolor=\"#fffff0\">trim(X)<br>trim(X,Y)</td><td bgcolor=\"#f0fff0\">Return a string formed by removing any and all characters that appear in Y from both ends of X. "); 3381 - html += wxT("If the Y argument is omitted, spaces are removed.</td></tr>"); 3382 - html += 3383 - wxT 3384 - ("<tr><td bgcolor=\"#fffff0\">typeof(X)</td><td bgcolor=\"#f0fff0\">Return the type of the expression X. "); 3385 - html += 3386 - wxT 3387 - ("The only return values are \"null\", \"integer\", \"real\", \"text\", and \"blob\".</td></tr>"); 3388 - html += 3389 - wxT 3390 - ("<tr><td bgcolor=\"#fffff0\">upper(X)</td><td bgcolor=\"#f0fff0\">Return a copy of input string X converted to all upper-case letters. "); 3391 - html += 3392 - wxT 3393 - ("The implementation of this function uses the C library routine toupper() which means it may not work correctly on non-ASCII UTF-8 strings.</td></tr>"); 3394 - html += 3395 - wxT 3396 - ("<tr><td bgcolor=\"#fffff0\">zeroblob(N)</td><td bgcolor=\"#f0fff0\">Return a BLOB consisting of N bytes of 0x00. "); 3397 - html += wxT("SQLite manages these zeroblobs very efficiently. "); 3398 - html += 3399 - wxT 3400 - ("Zeroblobs can be used to reserve space for a BLOB that is later written using incremental BLOB I/O.</td></tr> "); 3401 - html += 3402 - wxT 3403 - ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c22\">aggregate functions</a><br><a href=\"#index\">back to index</a></td></tr>"); 3404 - html += 3405 - wxT 3406 - ("<tr><td bgcolor=\"#fffff0\">avg(X)</td><td bgcolor=\"#f0fff0\">Return the average value of all non-NULL X within a group. "); 3407 - html += 3408 - wxT 3409 - ("String and BLOB values that do not look like numbers are interpreted as 0. "); 3410 - html += 3411 - wxT 3412 - ("The result of avg() is always a floating point value even if all inputs are integers.</td></tr>"); 3413 - html += 3414 - wxT 3415 - ("<tr><td bgcolor=\"#fffff0\">count(X)<br>count(*)</td><td bgcolor=\"#f0fff0\">The first form return a count of the number of times that X is not NULL in a group. "); 3416 - html += 3417 - wxT 3418 - ("The second form (with no argument) return the total number of rows in the group.</td></tr>"); 3419 - html += 3420 - wxT 3421 - ("<tr><td bgcolor=\"#fffff0\">group_concat(X)<br>group_concat(X,Y)</td><td bgcolor=\"#f0fff0\">The result is a string which is the concatenation of all non-NULL values of X. "); 3422 - html += 3423 - wxT 3424 - ("If parameter Y is the separator between instances of X. A comma (\",\") is used as the separator if Y is omitted.</td></tr>"); 3425 - html += 3426 - wxT 3427 - ("<tr><td bgcolor=\"#fffff0\">max(X)</td><td bgcolor=\"#f0fff0\">Return the maximum value of all values in the group. "); 3428 - html += 3429 - wxT("The usual sort order is used to determine the maximum.</td></tr>"); 3430 - html += 3431 - wxT 3432 - ("<tr><td bgcolor=\"#fffff0\">min(X)</td><td bgcolor=\"#f0fff0\">Return the minimum non-NULL value of all values in the group. "); 3433 - html += 3434 - wxT 3435 - ("The usual sort order is used to determine the minimum. NULL is only returned if all values in the group are NULL.</td></tr>"); 3436 - html += 3437 - wxT 3438 - ("<tr><td bgcolor=\"#fffff0\">sum(X)<br>total(X)</td><td bgcolor=\"#f0fff0\">Return the numeric sum of all non-NULL values in the group. "); 3439 - html += 3440 - wxT 3441 - ("If there are no non-NULL input rows then sum() return NULL but total() return 0.0. "); 3442 - html += 3443 - wxT 3444 - ("NULL is not normally a helpful result for the sum of no rows but the SQL standard requires it and most other SQL "); 3445 - html += 3446 - wxT 3447 - ("database engines implement sum() that way so SQLite does it in the same way in order to be compatible. "); 3448 - html += 3449 - wxT 3450 - ("The non-standard total() function is provided as a convenient way to work around this design problem in the SQL language.<br>"); 3451 - html += 3452 - wxT 3453 - ("The result of total() is always a floating point value. The result of sum() is an integer value if all non-NULL inputs are integers. "); 3454 - html += 3455 - wxT 3456 - ("If any input to sum() is neither an integer or a NULL then sum() return a floating point value which might be an approximation to the true sum.<br>"); 3457 - html += 3458 - wxT 3459 - ("Sum() will throw an \"integer overflow\" exception if all inputs are integers or NULL and an integer overflow occurs at any point during the computation."); 3460 - html += wxT("Total() never throws an exception.</td></tr> "); 3461 - html += wxT("</table>"); 3462 - html += wxT("<a href=\"#index\">back to index</a>"); 3463 - html += wxT("<h3><a name=\"c3\">SpatiaLite SQL Spatial functions</a></h3>"); 3464 - html += wxT("<table cellspacing=\"4\" cellpadding=\"2\" width=\"100%\">"); 3465 - html += 3466 - wxT 3467 - ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"math\">SQL math functions</a></a>"); 3468 - html += wxT("<br><a href=\"#index\">back to index</a></td></tr>"); 3469 - html += 3470 - wxT 3471 - ("<tr><td bgcolor=\"#fffff0\">Abs( x Double precision ) : Double precision</td>"); 3472 - html += 3473 - wxT 3474 - ("<td bgcolor=\"#f0fff0\">returns the absolute value of <i>x</i></td></tr>"); 3475 - html += 3476 - wxT 3477 - ("<tr><td bgcolor=\"#fffff0\">Acos( x Double precision ) : Double precision</td>"); 3478 - html += 3479 - wxT 3480 - ("<td bgcolor=\"#f0fff0\">returns the arc cosine of <i>x</i>, that is, the value whose cosine is <i>x</i><br>"); 3481 - html += wxT("returns NULL if <i>x</i> is not in the range -1 to 1</td></tr>"); 3482 - html += 3483 - wxT 3484 - ("<tr><td bgcolor=\"#fffff0\">Asin( x Double precision ) : Double precision</td>"); 3485 - html += 3486 - wxT 3487 - ("<td bgcolor=\"#f0fff0\">returns the arc sine of <i>x</i>, that is, the value whose sine is <i>x</i><br>"); 3488 - html += wxT("returns NULL if <i>x</i> is not in the range -1 to 1</td></tr>"); 3489 - html += 3490 - wxT 3491 - ("<tr><td bgcolor=\"#fffff0\">Atan( x Double precision ) : Double precision</td>"); 3492 - html += 3493 - wxT 3494 - ("<td bgcolor=\"#f0fff0\">returns the arc tangent of <i>x</i>, that is, the value whose tangent is <i>x</i></td></tr>"); 3495 - html += 3496 - wxT 3497 - ("<tr><td bgcolor=\"#fffff0\">Ceil( x Double precision ) : Double precision<hr>"); 3498 - html += wxT("Ceiling( x Double precision ) : Double precision</td>"); 3499 - html += 3500 - wxT 3501 - ("<td bgcolor=\"#f0fff0\">returns the smallest integer value not less than <i>x</i></td></tr>"); 3502 - html += 3503 - wxT 3504 - ("<tr><td bgcolor=\"#fffff0\">Cos( x Double precision ) : Double precision</td>"); 3505 - html += 3506 - wxT 3507 - ("<td bgcolor=\"#f0fff0\">returns the cosine of <i>x</i>, where <i>x</i> is given in <u>radians</u></td></tr>"); 3508 - html += 3509 - wxT 3510 - ("<tr><td bgcolor=\"#fffff0\">Cot( x Double precision ) : Double precision</td>"); 3511 - html += 3512 - wxT 3513 - ("<td bgcolor=\"#f0fff0\">returns the cotangent of <i>x</i>, where <i>x</i> is given in <u>radians</u></td></tr>"); 3514 - html += 3515 - wxT 3516 - ("<tr><td bgcolor=\"#fffff0\">Degrees( x Double precision ) : Double precision</td>"); 3517 - html += 3518 - wxT 3519 - ("<td bgcolor=\"#f0fff0\">returns the argument <i>x</i>, converted from radians to degrees</td></tr>"); 3520 - html += 3521 - wxT 3522 - ("<tr><td bgcolor=\"#fffff0\">Exp( x Double precision ) : Double precision</td>"); 3523 - html += 3524 - wxT 3525 - ("<td bgcolor=\"#f0fff0\">returns the value of <b><i>e</i></b> (the base of natural logarithms) raised to the power of <i>x</i><hr>"); 3526 - html += 3527 - wxT 3528 - ("the inverse of this function is <i>Log()</i> (using a single argument only) or <i>Ln()</i></td></tr>"); 3529 - html += 3530 - wxT 3531 - ("<tr><td bgcolor=\"#fffff0\">Floor( x Double precision ) : Double precision</td>"); 3532 - html += 3533 - wxT 3534 - ("<td bgcolor=\"#f0fff0\">returns the largest integer value not greater than <i>x</i></td></tr>"); 3535 - html += 3536 - wxT 3537 - ("<tr><td bgcolor=\"#fffff0\">Ln( x Double precision ) : Double precision<hr>"); 3538 - html += wxT("Log( x Double precision ) : Double precision</td>"); 3539 - html += 3540 - wxT 3541 - ("<td bgcolor=\"#f0fff0\">returns the natural logarithm of <i>x</i>; that is, the base-<b><i>e</i></b> logarithm of <i>x</i><br>"); 3542 - html += 3543 - wxT 3544 - ("If <i>x</i> is less than or equal to 0, then NULL is returned</td></tr>"); 3545 - html += 3546 - wxT 3547 - ("<tr><td bgcolor=\"#fffff0\">Log( b Double precision, x Double precision ) : Double precision</td>"); 3548 - html += 3549 - wxT 3550 - ("<td bgcolor=\"#f0fff0\">returns the logarithm of <i>x</i> to the base <i>b</i><br>"); 3551 - html += 3552 - wxT 3553 - ("If <i>x</i> is less than or equal to 0, or if <i>b</i> is less than or equal to 1, then NULL is returned<hr>"); 3554 - html += 3555 - wxT 3556 - ("<i>Log(b, x)</i> is equivalent to <i>Log(x)</i> / <i>Log(b)</i></td></tr>"); 3557 - html += 3558 - wxT 3559 - ("<tr><td bgcolor=\"#fffff0\">Log2( x Double precision ) : Double precision</td>"); 3560 - html += 3561 - wxT("<td bgcolor=\"#f0fff0\">returns the base-2 logarithm of <i>x</i><hr>"); 3562 - html += 3563 - wxT 3564 - ("<i>Log2(x)</i> is equivalent to <i>Log(x)</i> / <i>Log(2)</i></td></tr>"); 3565 - html += 3566 - wxT 3567 - ("<tr><td bgcolor=\"#fffff0\">Log10( x Double precision ) : Double precision</td>"); 3568 - html += 3569 - wxT 3570 - ("<td bgcolor=\"#f0fff0\">returns the base-10 logarithm of <i>x</i><hr>"); 3571 - html += 3572 - wxT 3573 - ("<i>Log10(x)</i> is equivalent to <i>Log(x)</i> / <i>Log(10)</i></td></tr>"); 3574 - html += wxT("<tr><td bgcolor=\"#fffff0\">PI( void ) : Double precision</td>"); 3575 - html += 3576 - wxT("<td bgcolor=\"#f0fff0\">returns the value of <i>PI</i></td></tr>"); 3577 - html += 3578 - wxT 3579 - ("<tr><td bgcolor=\"#fffff0\">Pow( x Double precision, y Double precision ) : Double precision<hr>"); 3580 - html += 3581 - wxT 3582 - ("Power( x Double precision, y Double precision ) : Double precision</td>"); 3583 - html += 3584 - wxT 3585 - ("<td bgcolor=\"#f0fff0\">returns the value of <i>x</i> raised to the power of <i>y</i></td></tr>"); 3586 - html += 3587 - wxT 3588 - ("<tr><td bgcolor=\"#fffff0\">Radians( x Double precision ) : Double precision</td>"); 3589 - html += 3590 - wxT 3591 - ("<td bgcolor=\"#f0fff0\">returns the argument <i>x</i>, converted from degrees to radians</td></tr>"); 3592 - html += 3593 - wxT 3594 - ("<tr><td bgcolor=\"#fffff0\">Round( x Double precision ) : Double precision</td>"); 3595 - html += 3596 - wxT 3597 - ("<td bgcolor=\"#f0fff0\">returns the integer value nearest to <i>x</i></td></tr>"); 3598 - html += 3599 - wxT 3600 - ("<tr><td bgcolor=\"#fffff0\">Sign( x Double precision ) : Double precision</td>"); 3601 - html += 3602 - wxT 3603 - ("<td bgcolor=\"#f0fff0\">returns the sign of the argument as -1, 0, or 1, "); 3604 - html += 3605 - wxT 3606 - ("depending on whether <i>x</i> is negative, zero, or positive.</td></tr>"); 3607 - html += 3608 - wxT 3609 - ("<tr><td bgcolor=\"#fffff0\">Sin( x Double precision ) : Double precision</td>"); 3610 - html += 3611 - wxT 3612 - ("<td bgcolor=\"#f0fff0\">returns the sine of <i>x</i>, where <i>x</i> is given in <u>radians</u></td></tr>"); 3613 - html += 3614 - wxT 3615 - ("<tr><td bgcolor=\"#fffff0\">Sqrt( x Double precision ) : Double precision</td>"); 3616 - html += 3617 - wxT 3618 - ("<td bgcolor=\"#f0fff0\">returns the square root of a non-negative number <i>x</i></td></tr>"); 3619 - html += 3620 - wxT 3621 - ("<tr><td bgcolor=\"#fffff0\">Stddev_pop( x Double precision ) : Double precision</td>"); 3622 - html += 3623 - wxT 3624 - ("<td bgcolor=\"#f0fff0\">returns the population standard deviation of the input values<br>"); 3625 - html += wxT("<b><u>aggregate function</u></b></u></td></tr>"); 3626 - html += 3627 - wxT 3628 - ("<tr><td bgcolor=\"#fffff0\">Stddev_samp( x Double precision ) : Double precision</td>"); 3629 - html += 3630 - wxT 3631 - ("<td bgcolor=\"#f0fff0\">returns the sample standard deviation of the input values<br>"); 3632 - html += wxT("<b><u>aggregate function</u></b></u></td></tr>"); 3633 - html += 3634 - wxT 3635 - ("<tr><td bgcolor=\"#fffff0\">Tan( x Double precision ) : Double precision</td>"); 3636 - html += 3637 - wxT 3638 - ("<td bgcolor=\"#f0fff0\">returns the tangent of <i>x</i>, where <i>x</i> is given in <u>radians</u></td></tr>"); 3639 - html += 3640 - wxT 3641 - ("<tr><td bgcolor=\"#fffff0\">Var_pop( x Double precision ) : Double precision</td>"); 3642 - html += 3643 - wxT 3644 - ("<td bgcolor=\"#f0fff0\">returns the population variance of the input values (<i>square of the population standard deviation</i>)<br>"); 3645 - html += wxT("<b><u>aggregate function</u></b></u></td></tr>"); 3646 - html += 3647 - wxT 3648 - ("<tr><td bgcolor=\"#fffff0\">Var_samp( x Double precision ) : Double precision</td>"); 3649 - html += 3650 - wxT 3651 - ("<td bgcolor=\"#f0fff0\">returns the sample variance of the input values (<i>square of the sample standard deviation</i>)<br>"); 3652 - html += wxT("<b><u>aggregate function</u></b></u></td></tr>"); 3653 - html += 3654 - wxT 3655 - ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"blob\">SQL utility functions for BLOB objects</a></a>"); 3656 - html += wxT("<br><a href=\"#index\">back to index</a></td></tr>"); 3657 - html += 3658 - wxT("<tr><td bgcolor=\"#fffff0\">IsZipBlob( content Blob ) : Integer</td>"); 3659 - html += 3660 - wxT 3661 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 3662 - html += 3663 - wxT 3664 - ("TRUE if this BLOB object corresponds to a valid ZIP-compressed file</td></tr>"); 3665 - html += 3666 - wxT("<tr><td bgcolor=\"#fffff0\">IsPdfBlob( content Blob ) : Integer</td>"); 3667 - html += 3668 - wxT 3669 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 3670 - html += 3671 - wxT 3672 - ("TRUE if this BLOB object corresponds to a valid PDF document</td></tr>"); 3673 - html += 3674 - wxT("<tr><td bgcolor=\"#fffff0\">IsGifBlob( image Blob ) : Integer</td>"); 3675 - html += 3676 - wxT 3677 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 3678 - html += 3679 - wxT("TRUE if this BLOB object corresponds to a valid GIF image</td></tr>"); 3680 - html += 3681 - wxT("<tr><td bgcolor=\"#fffff0\">IsPngBlob( image Blob ) : Integer</td>"); 3682 - html += 3683 - wxT 3684 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 3685 - html += 3686 - wxT("TRUE if this BLOB object corresponds to a valid PNG image</td></tr>"); 3687 - html += 3688 - wxT("<tr><td bgcolor=\"#fffff0\">IsJpegBlob( image Blob ) : Integer</td>"); 3689 - html += 3690 - wxT 3691 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 3692 - html += 3693 - wxT("TRUE if this BLOB object corresponds to a valid JPEG image</td></tr>"); 3694 - html += 3695 - wxT("<tr><td bgcolor=\"#fffff0\">IsExifBlob( image Blob ) : Integer</td>"); 3696 - html += 3697 - wxT 3698 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 3699 - html += wxT("TRUE if this BLOB object corresponds to a valid EXIF image<br>"); 3700 - html += 3701 - wxT 3702 - ("<u>Please note:</u> any valid EXIF image is a valid JPEG as well</td></tr>"); 3703 - html += 3704 - wxT 3705 - ("<tr><td bgcolor=\"#fffff0\">IsExifGpsBlob( image Blob ) : Integer</td>"); 3706 - html += 3707 - wxT 3708 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 3709 - html += 3710 - wxT("TRUE if this BLOB object corresponds to a valid EXIF-GPS image<br>"); 3711 - html += 3712 - wxT 3713 - ("<u>Please note:</u> any valid EXIF-GPS image is a valid EXIF and JPEG as well</td></tr>"); 3714 - html += 3715 - wxT 3716 - ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c30\">SQL utility functions [<i>non-standard</i>] for geometric objects</a></a>"); 3717 - html += wxT("<br><a href=\"#index\">back to index</a></td></tr>"); 3718 - html += 3719 - wxT 3720 - ("<tr><td bgcolor=\"#fffff0\">GeomFromExifGpsBlob( image Blob ) : Geometry</td>"); 3721 - html += 3722 - wxT 3723 - ("<td bgcolor=\"#f0fff0\">a POINT Geometry will be returned representing the GPS long/lat contained within EXIF-GPS <i>metadata</i> for the BLOB image<hr>"); 3724 - html += 3725 - wxT 3726 - ("NULL will be returned if for any reason it's not possible to build such a POINT</td></tr>"); 3727 - html += 3728 - wxT 3729 - ("<tr><td bgcolor=\"#fffff0\">MakePoint( x Double precision , y Double precision [ , SRID Integer] ) : Geometry</td>"); 3730 - html += 3731 - wxT 3732 - ("<td bgcolor=\"#f0fff0\">a Geometry will be returned representing the POINT defined by [x y] coordinates</td></tr>"); 3733 - html += 3734 - wxT 3735 - ("<tr><td bgcolor=\"#fffff0\">BuildMbr( x1 Double precision , y1 Double precision , x2 Double precision , y2 Double precision, [ , SRID Integer] ) : Geometry</td>"); 3736 - html += 3737 - wxT 3738 - ("<td bgcolor=\"#f0fff0\">[x1 y1] and [x2 y2] are assumed to be Points identifying a line segment;"); 3739 - html += 3740 - wxT 3741 - ("then a Geometry will be returned representing the MBR for this line segment</td></tr>"); 3742 - html += 3743 - wxT 3744 - ("<tr><td bgcolor=\"#fffff0\">BuildCircleMbr( x Double precision , y Double precision , radius Double precision [ , SRID Integer] ) : Geometry</td>"); 3745 - html += 3746 - wxT 3747 - ("<td bgcolor=\"#f0fff0\">[x y] is assumed to be the center of a circle of given radius; then a Geometry will be returned representing the MBR for this circle</td></tr>"); 3748 - html += 3749 - wxT 3750 - ("<tr><td bgcolor=\"#fffff0\">MbrMinX( geom Geometry) : Double precision</td>"); 3751 - html += 3752 - wxT 3753 - ("<td bgcolor=\"#f0fff0\">return the x-coordinate for geom MBR's leftmost side as a double precision number</td></tr>"); 3754 - html += 3755 - wxT 3756 - ("<tr><td bgcolor=\"#fffff0\">MbrMinY( geom Geometry) : Double precision</td>"); 3757 - html += 3758 - wxT 3759 - ("<td bgcolor=\"#f0fff0\">return the y-coordinate for geom MBR's lowermost side as a double precision number</td></tr>"); 3760 - html += 3761 - wxT 3762 - ("<tr><td bgcolor=\"#fffff0\">MbrMaxX( geom Geometry) : Double precision</td>"); 3763 - html += 3764 - wxT 3765 - ("<td bgcolor=\"#f0fff0\">return the x-coordinate for geom MBR's rightmost side as a double precision number</td></tr>"); 3766 - html += 3767 - wxT 3768 - ("<tr><td bgcolor=\"#fffff0\">MbrMaxY( geom Geometry) : Double precision</td>"); 3769 - html += 3770 - wxT 3771 - ("<td bgcolor=\"#f0fff0\">return the y-coordinate for geom MBR's uppermost side as a double precision number</td></tr>"); 3772 - html += 3773 - wxT 3774 - ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c31\">functions for constructing a geometric object given its Well-known Text Representation</a>"); 3775 - html += wxT("<br><a href=\"#index\">back to index</a></td></tr>"); 3776 - html += 3777 - wxT 3778 - ("<tr><td bgcolor=\"#fffff0\">GeomFromText( wkt String [ , SRID Integer] ) : Geometry</td>"); 3779 - html += 3780 - wxT 3781 - ("<td bgcolor=\"#f0fff0\">construct a geometric object given its Well-known text Representation</td></tr>"); 3782 - html += 3783 - wxT 3784 - ("<tr><td bgcolor=\"#fffff0\">PointFromText( wktPoint String [ , SRID Integer] ) : Point</td>"); 3785 - html += wxT("<td bgcolor=\"#f0fff0\">construct a Point</td></tr>"); 3786 - html += 3787 - wxT 3788 - ("<tr><td bgcolor=\"#fffff0\">LineFromText( wktLineString String [ , SRID Integer] ) : Linestring<hr>"); 3789 - html += 3790 - wxT 3791 - ("LineStringFromText( wktLineString String [ , SRID Integer] ) : Linestring</td>"); 3792 - html += wxT("<td bgcolor=\"#f0fff0\">construct a Linestring</td></tr>"); 3793 - html += 3794 - wxT 3795 - ("<tr><td bgcolor=\"#fffff0\">PolyFromText( wktPolygon String [ , SRID Integer] ) : Polygon<hr>"); 3796 - html += 3797 - wxT 3798 - ("PolygonFromText( wktPolygon String [ , SRID Integer] ) : Polygon</td>"); 3799 - html += wxT("<td bgcolor=\"#f0fff0\">construct a Polygon</td></tr>"); 3800 - html += 3801 - wxT 3802 - ("<tr><td bgcolor=\"#fffff0\">MPointFromText( wktMultiPoint String [ , SRID Integer] ) : MultiPoint<hr>"); 3803 - html += 3804 - wxT 3805 - ("MultiPointFromText( wktMultiPoint String [ , SRID Integer] ) : MultiPoint</td>"); 3806 - html += wxT("<td bgcolor=\"#f0fff0\">construct a MultiPoint</td></tr>"); 3807 - html += 3808 - wxT 3809 - ("<tr><td bgcolor=\"#fffff0\">MLineFromText( wktMultiLineString String [ , SRID Integer] ) : MultiLinestring<hr>"); 3810 - html += 3811 - wxT 3812 - ("MultiLineStringFromText( wktMultiLineString String [ , SRID Integer] ) : MultiLinestring</td>"); 3813 - html += wxT("<td bgcolor=\"#f0fff0\">construct a MultiLinestring</td></tr>"); 3814 - html += 3815 - wxT 3816 - ("<tr><td bgcolor=\"#fffff0\">MPolyFromText( wktMultiPolygon String [ , SRID Integer] ) : MultiPolygon<hr>"); 3817 - html += 3818 - wxT 3819 - ("MultiPolygonFromText( wktMultiPolygon String [ , SRID Integer] ) : MultiPolygon</td>"); 3820 - html += wxT("<td bgcolor=\"#f0fff0\">construct a MultiPolygon</td></tr>"); 3821 - html += 3822 - wxT 3823 - ("<tr><td bgcolor=\"#fffff0\">GeomCollFromText( wktGeometryCollection String [ , SRID Integer] ) : GeometryCollection<hr>"); 3824 - html += 3825 - wxT 3826 - ("GeometryCollectionFromText( wktGeometryCollection String [ , SRID Integer] ) : GeometryCollection</td>"); 3827 - html += 3828 - wxT("<td bgcolor=\"#f0fff0\">construct a GeometryCollection</td></tr>"); 3829 - html += 3830 - wxT 3831 - ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c32\">functions for constructing a geometric object given its Well-known Binary Representation</a>"); 3832 - html += wxT("<br><a href=\"#index\">back to index</a></td></tr>"); 3833 - html += 3834 - wxT 3835 - ("<tr><td bgcolor=\"#fffff0\">GeomFromWKB( wkbGeometry Binary [ , SRID Integer] ) : Geometry</td>"); 3836 - html += 3837 - wxT 3838 - ("<td bgcolor=\"#f0fff0\">construct a geometric object given its Well-known binary Representation</td></tr>"); 3839 - html += 3840 - wxT 3841 - ("<tr><td bgcolor=\"#fffff0\">PointFromWKB( wkbPoint Binary [ , SRID Integer] ) : Point</td>"); 3842 - html += wxT("<td bgcolor=\"#f0fff0\">construct a Point</td></tr>"); 3843 - html += 3844 - wxT 3845 - ("<tr><td bgcolor=\"#fffff0\">LineFromWKB( wkbLineString Binary [ , SRID Integer] ) : Linestring<hr>"); 3846 - html += 3847 - wxT 3848 - ("LineStringFromText( wkbLineString Binary [ , SRID Integer] ) : Linestring</td>"); 3849 - html += wxT("<td bgcolor=\"#f0fff0\">construct a Linestring</td></tr>"); 3850 - html += 3851 - wxT 3852 - ("<tr><td bgcolor=\"#fffff0\">PolyFromWKB( wkbPolygon Binary [ , SRID Integer] ) : Polygon<br>"); 3853 - html += 3854 - wxT("PolygonFromWKB( wkbPolygon Binary [ , SRID Integer] ) : Polygon</td>"); 3855 - html += wxT("<td bgcolor=\"#f0fff0\">construct a Polygon</td></tr>"); 3856 - html += 3857 - wxT 3858 - ("<tr><td bgcolor=\"#fffff0\">MPointFromWKB( wkbMultiPoint Binary [ , SRID Integer] ) : MultiPoint<hr>"); 3859 - html += 3860 - wxT 3861 - ("MultiPointFromWKB( wkbMultiPoint Binary [ , SRID Integer] ) : MultiPoint</td>"); 3862 - html += wxT("<td bgcolor=\"#f0fff0\">construct a MultiPoint</td></tr>"); 3863 - html += 3864 - wxT 3865 - ("<tr><td bgcolor=\"#fffff0\">MLineFromWKB( wkbMultiLineString Binary [ , SRID Integer] ) : MultiLinestring<hr>"); 3866 - html += 3867 - wxT 3868 - ("MultiLineStringFromWKB( wkbMultiLineString Binary [ , SRID Integer] ) : MultiLinestring</td>"); 3869 - html += wxT("<td bgcolor=\"#f0fff0\">construct a MultiLinestring</td></tr>"); 3870 - html += 3871 - wxT 3872 - ("<tr><td bgcolor=\"#fffff0\">MPolyFromWKB( wkbMultiPolygon Binary [ , SRID Integer] ) : MultiPolygon<hr>"); 3873 - html += 3874 - wxT 3875 - ("MultiPolygonFromWKB( wkbMultiPolygon Binary [ , SRID Integer] ) : MultiPolygon</td>"); 3876 - html += wxT("<td bgcolor=\"#f0fff0\">construct a MultiPolygon</td></tr>"); 3877 - html += 3878 - wxT 3879 - ("<tr><td bgcolor=\"#fffff0\">GeomCollFromWKB( wkbGeometryCollection Binary [ , SRID Integer] ) : GeometryCollection<hr>"); 3880 - html += 3881 - wxT 3882 - ("GeometryCollectionFromWKB( wkbGeometryCollection Binary [ , SRID Integer] ) : GeometryCollection</td>"); 3883 - html += 3884 - wxT("<td bgcolor=\"#f0fff0\">construct a GeometryCollection</td></tr>"); 3885 - html += 3886 - wxT 3887 - ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c33\">functions for obtaining the Well-known Text / Well-known Binary Representation of a geometric object</a>"); 3888 - html += wxT("<br><a href=\"#index\">back to index</a></td></tr>"); 3889 - html += 3890 - wxT 3891 - ("<tr><td bgcolor=\"#fffff0\">AsText( geom Geometry ) : String</td><td bgcolor=\"#f0fff0\">return the Well-known Text representation</td></tr>"); 3892 - html += 3893 - wxT 3894 - ("<tr><td bgcolor=\"#fffff0\">AsBinary( geom Geometry ) : Binary</td><td bgcolor=\"#f0fff0\">return the Well-known Binary representation</td></tr>"); 3895 - html += 3896 - wxT 3897 - ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c33misc\">SQL functions supporting exotic geometric formats</a>"); 3898 - html += wxT("<br><a href=\"#index\">back to index</a></td></tr>"); 3899 - html += 3900 - wxT 3901 - ("<tr><td bgcolor=\"#fffff0\">AsSVG( geom Geometry ) : String</td><td bgcolor=\"#f0fff0\">returns the SVG [<i>Scalable Vector Graphics</i>] representation</td></tr>"); 3902 - html += 3903 - wxT 3904 - ("<tr><td bgcolor=\"#fffff0\">AsFGF( geom Geometry ) : String</td><td bgcolor=\"#f0fff0\">returns the FGF [<i>FDO Geometry Binary Format</i>] representation</td></tr>"); 3905 - html += 3906 - wxT 3907 - ("<tr><td bgcolor=\"#fffff0\">GeomFromFGF( fgfGeometry Binary [ , SRID Integer] ) : Geometry</td><td bgcolor=\"#f0fff0\">construct a geometric object given its FGF binary Representation</td></tr>"); 3908 - html += 3909 - wxT 3910 - ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c34\">functions on type Geometry</a>"); 3911 - html += wxT("<br><a href=\"#index\">back to index</a></td></tr>"); 3912 - html += 3913 - wxT 3914 - ("<tr><td bgcolor=\"#fffff0\">Dimension( geom Geometry ) : Integer</td>"); 3915 - html += 3916 - wxT 3917 - ("<td bgcolor=\"#f0fff0\">return the dimension of the geometric object, which is less than or equal to the dimension of the coordinate space</td></tr>"); 3918 - html += 3919 - wxT 3920 - ("<tr><td bgcolor=\"#fffff0\">GeometryType( geom Geometry ) : String</td>"); 3921 - html += 3922 - wxT 3923 - ("<td bgcolor=\"#f0fff0\">return the name of the instantiable subtype of Geometry of which this geometric object is a member, as a string</td></tr>"); 3924 - html += 3925 - wxT("<tr><td bgcolor=\"#fffff0\">SRID( geom Geometry ) : Integer</td>"); 3926 - html += 3927 - wxT 3928 - ("<td bgcolor=\"#f0fff0\">return the Spatial Reference System ID for this geometric object</td></tr>"); 3929 - html += 3930 - wxT 3931 - ("<tr><td bgcolor=\"#fffff0\">SetSRID( geom Geometry , SRID Integer ) : Integer</td>"); 3932 - html += 3933 - wxT 3934 - ("<td bgcolor=\"#f0fff0\">directly sets the Spatial Reference System ID for this geometric object [no reprojection is applied].<br>"); 3935 - html += 3936 - wxT 3937 - ("The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a "); 3938 - html += wxT("function invocation on NULL arguments</td></tr>"); 3939 - html += 3940 - wxT("<tr><td bgcolor=\"#fffff0\">IsEmpty( geom Geometry ) : Integer</td>"); 3941 - html += 3942 - wxT 3943 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 3944 - html += 3945 - wxT("TRUE if this geometric object corresponds to the empty set</td></tr>"); 3946 - html += 3947 - wxT("<tr><td bgcolor=\"#fffff0\">IsSimple( geom Geometry ) : Integer</td>"); 3948 - html += 3949 - wxT 3950 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 3951 - html += 3952 - wxT 3953 - ("TRUE if this geometric object is simple, as defined in the Geometry Model</td></tr>"); 3954 - html += 3955 - wxT("<tr><td bgcolor=\"#fffff0\">IsValid( geom Geometry ) : Integer</td>"); 3956 - html += 3957 - wxT 3958 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 3959 - html += 3960 - wxT 3961 - ("TRUE if this geometric object does not contains any topological error</td></tr>"); 3962 - html += 3963 - wxT 3964 - ("<tr><td bgcolor=\"#fffff0\">Boundary( geom Geometry ) : Geometry</td>"); 3965 - html += 3966 - wxT 3967 - ("<td bgcolor=\"#f0fff0\">return a geometric object that is the combinatorial boundary of g as defined in the Geometry Model</td></tr>"); 3968 - html += 3969 - wxT 3970 - ("<tr><td bgcolor=\"#fffff0\">Envelope( geom Geometry ) : Geometry</td>"); 3971 - html += 3972 - wxT 3973 - ("<td bgcolor=\"#f0fff0\">return the rectangle bounding g as a Polygon. "); 3974 - html += 3975 - wxT 3976 - ("The Polygon is defined by the corner points of the bounding box [(MINX, MINY),(MAXX, MINY), (MAXX, MAXY), (MINX, MAXY), (MINX, MINY)].</td></tr>"); 3977 - html += 3978 - wxT 3979 - ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c35\">functions on type Point</a>"); 3980 - html += wxT("<br><a href=\"#index\">back to index</a></td></tr>"); 3981 - html += 3982 - wxT 3983 - ("<tr><td bgcolor=\"#fffff0\">X( pt Point ) : Double precision</td><td bgcolor=\"#f0fff0\">return the x-coordinate of Point p as a double precision number</td></tr>"); 3984 - html += 3985 - wxT 3986 - ("<tr><td bgcolor=\"#fffff0\">Y( pt Point ) : Double precision</td><td bgcolor=\"#f0fff0\">return the y-coordinate of Point p as a double precision number</td></tr>"); 3987 - html += 3988 - wxT 3989 - ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\">functions on type Curve [Linestring or Ring]</td></tr>"); 3990 - html += 3991 - wxT 3992 - ("<tr><td bgcolor=\"#fffff0\">StartPoint( c Curve ) : Point</td><td bgcolor=\"#f0fff0\">return a Point containing the first Point of c</td></tr>"); 3993 - html += 3994 - wxT 3995 - ("<tr><td bgcolor=\"#fffff0\">EndPoint( c Curve ) : Point</td><td bgcolor=\"#f0fff0\">return a Point containing the last Point of c</td></tr>"); 3996 - html += 3997 - wxT 3998 - ("<tr><td bgcolor=\"#fffff0\">NumPoints( line LineString ) : Integer</td><td bgcolor=\"#f0fff0\">return the number of Points in the LineString</td></tr>"); 3999 - html += 4000 - wxT 4001 - ("<tr><td bgcolor=\"#fffff0\">PointN( line LineString , n Integer ) : Point</td><td bgcolor=\"#f0fff0\">return a Point containing Point n of line</td></tr>"); 4002 - html += 4003 - wxT 4004 - ("<tr><td bgcolor=\"#fffff0\">GLength( c Curve ) : Double precision</td><td bgcolor=\"#f0fff0\">return the length of c</td></tr>"); 4005 - html += wxT("<tr><td bgcolor=\"#fffff0\">IsClosed( c Curve ) : Integer</td>"); 4006 - html += 4007 - wxT 4008 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments<br>"); 4009 - html += 4010 - wxT 4011 - ("return TRUE if c is closed, i.e., if StartPoint(c) = EndPoint(c)</td></tr>"); 4012 - html += wxT("<tr><td bgcolor=\"#fffff0\">IsRing( c Curve ) : Integer</td>"); 4013 - html += 4014 - wxT 4015 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments<br>"); 4016 - html += 4017 - wxT 4018 - ("return TRUE if c is a ring, i.e., if c is closed and simple. A simple Curve does not pass through the same Point more than once.</td></tr>"); 4019 - html += 4020 - wxT 4021 - ("<tr><td bgcolor=\"#fffff0\">Simplify( c Curve , tolerance Double precision ) : Curve</td>"); 4022 - html += 4023 - wxT 4024 - ("<td bgcolor=\"#f0fff0\">return a geometric object representing a simplified version of c applying the Douglas-Peukert algorithm with given tolerance</td></tr>"); 4025 - html += 4026 - wxT 4027 - ("<tr><td bgcolor=\"#fffff0\">SimplifyPreserveTopology( c Curve , tolerance Double precision ) : Curve</td>"); 4028 - html += 4029 - wxT 4030 - ("<td bgcolor=\"#f0fff0\">return a geometric object representing a simplified version of c "); 4031 - html += 4032 - wxT 4033 - ("applying the Douglas-Peukert algorithm with given tolerance and respecting topology</td></tr>"); 4034 - html += 4035 - wxT 4036 - ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c36\">functions on type Surface [Polygon or Ring]</a>"); 4037 - html += wxT("<br><a href=\"#index\">back to index</a></td></tr>"); 4038 - html += 4039 - wxT 4040 - ("<tr><td bgcolor=\"#fffff0\">Centroid( s Surface ) : Point</td><td bgcolor=\"#f0fff0\">return the centroid of s, which may lie outside s</td></tr>"); 4041 - html += 4042 - wxT 4043 - ("<tr><td bgcolor=\"#fffff0\">PointOnSurface( s Surface ) : Point</td><td bgcolor=\"#f0fff0\">return a Point guaranteed to lie on the Surface</td></tr>"); 4044 - html += 4045 - wxT 4046 - ("<tr><td bgcolor=\"#fffff0\">Area( s Surface ) : Double precision</td><td bgcolor=\"#f0fff0\">return the area of s</td></tr>"); 4047 - html += 4048 - wxT 4049 - ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c37\">functions on type Polygon</a>"); 4050 - html += wxT("<br><a href=\"#index\">back to index</a></td></tr>"); 4051 - html += 4052 - wxT 4053 - ("<tr><td bgcolor=\"#fffff0\">ExteriorRing( polyg Polygon ) : LineString</td><td bgcolor=\"#f0fff0\">return the exteriorRing of p</td></tr>"); 4054 - html += 4055 - wxT 4056 - ("<tr><td bgcolor=\"#fffff0\">NumInteriorRing( polyg Polygon ) : Integer<hr>NumInteriorRings( polyg Polygon ) : Integer</td>"); 4057 - html += 4058 - wxT("<td bgcolor=\"#f0fff0\">return the number of interiorRings</td></tr>"); 4059 - html += 4060 - wxT 4061 - ("<tr><td bgcolor=\"#fffff0\">InteriorRingN( polyg Polygon , n Integer ) : LineString</td>"); 4062 - html += 4063 - wxT 4064 - ("<td bgcolor=\"#f0fff0\">return the nth interiorRing. The order of Rings is not geometrically significant.</td></tr>"); 4065 - html += 4066 - wxT 4067 - ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c38\">functions on type GeomCollection</a>"); 4068 - html += wxT("<br><a href=\"#index\">back to index</a></td></tr>"); 4069 - html += 4070 - wxT 4071 - ("<tr><td bgcolor=\"#fffff0\">NumGeometries( geom GeomCollection ) : Integer</td><td bgcolor=\"#f0fff0\">return the number of geometries</td></tr>"); 4072 - html += 4073 - wxT 4074 - ("<tr><td bgcolor=\"#fffff0\">GeometryN( geom GeomCollection , n Integer ) : Geometry</td>"); 4075 - html += 4076 - wxT 4077 - ("<td bgcolor=\"#f0fff0\">return the nth geometric object in the collection. The order of the elements in the collection is not geometrically significant.</td></tr>"); 4078 - html += 4079 - wxT 4080 - ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c39\">functions testing approximative spatial relationships via MBRs</a>"); 4081 - html += wxT("<br><a href=\"#index\">back to index</a></td></tr>"); 4082 - html += 4083 - wxT 4084 - ("<tr><td bgcolor=\"#fffff0\">MbrEqual( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 4085 - html += 4086 - wxT 4087 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 4088 - html += wxT("TRUE if g1 and g2 have equal MBRs</td></tr>"); 4089 - html += 4090 - wxT 4091 - ("<tr><td bgcolor=\"#fffff0\">MbrDisjoint( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 4092 - html += 4093 - wxT 4094 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 4095 - html += 4096 - wxT 4097 - ("TRUE if the intersection of g1 and g2 MBRs is the empty set</td></tr>"); 4098 - html += 4099 - wxT 4100 - ("<tr><td bgcolor=\"#fffff0\">MbrTouches( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 4101 - html += 4102 - wxT 4103 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 4104 - html += 4105 - wxT 4106 - ("TRUE if the only Points in common between g1 and g2 MBRs lie in the union of the boundaries of g1 and g2</td></tr>"); 4107 - html += 4108 - wxT 4109 - ("<tr><td bgcolor=\"#fffff0\">MbrWithin( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 4110 - html += 4111 - wxT 4112 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 4113 - html += wxT("TRUE if g1 MBR is completely contained in g2 MBR</td></tr>"); 4114 - html += 4115 - wxT 4116 - ("<tr><td bgcolor=\"#fffff0\">MbrOverlaps( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 4117 - html += 4118 - wxT 4119 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 4120 - html += 4121 - wxT 4122 - ("TRUE if the intersection of g1 and g2 MBRs results in a value of the same dimension as g1 and g2 that is different from both g1 and g2</td></tr>"); 4123 - html += 4124 - wxT 4125 - ("<tr><td bgcolor=\"#fffff0\">MbrIntersects( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 4126 - html += 4127 - wxT 4128 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments<br>"); 4129 - html += 4130 - wxT 4131 - ("convenience predicate: TRUE if the intersection of g1 and g2 MBRs is not empty</td></tr>"); 4132 - html += 4133 - wxT 4134 - ("<tr><td bgcolor=\"#fffff0\">MbrContains( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 4135 - html += 4136 - wxT 4137 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments<br>"); 4138 - html += 4139 - wxT 4140 - ("convenience predicate: TRUE if g2 MBR is completely contained in g1 MBR</td></tr>"); 4141 - html += 4142 - wxT 4143 - ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c40\">functions testing spatial relationships</a>"); 4144 - html += wxT("<br><a href=\"#index\">back to index</a></td></tr>"); 4145 - html += 4146 - wxT 4147 - ("<tr><td bgcolor=\"#fffff0\">Equals( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 4148 - html += 4149 - wxT 4150 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 4151 - html += wxT("TRUE if g1 and g2 are equal</td></tr>"); 4152 - html += 4153 - wxT 4154 - ("<tr><td bgcolor=\"#fffff0\">Disjoint( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 4155 - html += 4156 - wxT 4157 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 4158 - html += 4159 - wxT("TRUE if the intersection of g1 and g2 is the empty set</td></tr>"); 4160 - html += 4161 - wxT 4162 - ("<tr><td bgcolor=\"#fffff0\">Touches( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 4163 - html += 4164 - wxT 4165 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 4166 - html += 4167 - wxT 4168 - ("TRUE if the only Points in common between g1 and g2 lie in the union of the boundaries of g1 and g2</td></tr>"); 4169 - html += 4170 - wxT 4171 - ("<tr><td bgcolor=\"#fffff0\">Within( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 4172 - html += 4173 - wxT 4174 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 4175 - html += wxT("TRUE if g1 is completely contained in g2</td></tr>"); 4176 - html += 4177 - wxT 4178 - ("<tr><td bgcolor=\"#fffff0\">Overlaps( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 4179 - html += 4180 - wxT 4181 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 4182 - html += 4183 - wxT 4184 - ("TRUE if the intersection of g1 and g2 results in a value of the same dimension as g1 and g2 that is different from both g1 and g2</td></tr>"); 4185 - html += 4186 - wxT 4187 - ("<tr><td bgcolor=\"#fffff0\">Crosses( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 4188 - html += 4189 - wxT 4190 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 4191 - html += 4192 - wxT 4193 - ("TRUE if the intersection of g1 and g2 results in a value whose dimension is less than the maximum dimension of g1 and g2 "); 4194 - html += 4195 - wxT 4196 - ("and the intersection value includes Points interior to both g1 and g2, and the intersection value is not equal to either g1 or g2</td></tr>"); 4197 - html += 4198 - wxT 4199 - ("<tr><td bgcolor=\"#fffff0\">Intersects( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 4200 - html += 4201 - wxT 4202 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments<br>"); 4203 - html += 4204 - wxT 4205 - ("convenience predicate: TRUE if the intersection of g1 and g2 is not empty</td></tr>"); 4206 - html += 4207 - wxT 4208 - ("<tr><td bgcolor=\"#fffff0\">Contains( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 4209 - html += 4210 - wxT 4211 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments<br>"); 4212 - html += 4213 - wxT 4214 - ("convenience predicate: TRUE if g2 is completely contained in g1</td></tr>"); 4215 - html += 4216 - wxT 4217 - ("<tr><td bgcolor=\"#fffff0\">Relate( geom1 Geometry , geom2 Geometry , patternMatrix String ) : Integer</td>"); 4218 - html += 4219 - wxT 4220 - ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 4221 - html += 4222 - wxT 4223 - ("return TRUE if the spatial relationship specified by the patternMatrix holds</td></tr>"); 4224 - html += 4225 - wxT 4226 - ("<tr><td bgcolor=\"#fffff0\">Distance( geom1 Geometry , geom2 Geometry ) : Double precision</td>"); 4227 - html += 4228 - wxT 4229 - ("<td bgcolor=\"#f0fff0\">return the distance between geom1 and geom2</td></tr>"); 4230 - html += 4231 - wxT 4232 - ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c41\">functions implementing spatial operators</a>"); 4233 - html += wxT("<br><a href=\"#index\">back to index</a></td></tr>"); 4234 - html += 4235 - wxT 4236 - ("<tr><td bgcolor=\"#fffff0\">Intersection( geom1 Geometry , geom2 Geometry ) : Geometry</td>"); 4237 - html += 4238 - wxT 4239 - ("<td bgcolor=\"#f0fff0\">return a geometric object that is the intersection of geometric objects geom1 and geom2</td></tr>"); 4240 - html += 4241 - wxT 4242 - ("<tr><td bgcolor=\"#fffff0\">Difference( geom1 Geometry , geom2 Geometry ) : Geometry</td>"); 4243 - html += 4244 - wxT 4245 - ("<td bgcolor=\"#f0fff0\">return a geometric object that is the closure of the set difference of geom1 and geom2</td></tr>"); 4246 - html += 4247 - wxT 4248 - ("<tr><td bgcolor=\"#fffff0\">GUnion( geom1 Geometry , geom2 Geometry ) : Geometry</td>"); 4249 - html += 4250 - wxT 4251 - ("<td bgcolor=\"#f0fff0\">return a geometric object that is the set union of geom1 and geom2</td></tr>"); 4252 - html += 4253 - wxT("<tr><td bgcolor=\"#fffff0\">GUnion( geom Geometry ) : Geometry</td>"); 4254 - html += 4255 - wxT 4256 - ("<td bgcolor=\"#f0fff0\">return a geometric object that is the set union of input values<br>"); 4257 - html += wxT("<b><u>aggregate function</u></b></td></tr>"); 4258 - html += 4259 - wxT 4260 - ("<tr><td bgcolor=\"#fffff0\">SymDifference( geom1 Geometry , geom2 Geometry ) : Geometry</td>"); 4261 - html += 4262 - wxT 4263 - ("<td bgcolor=\"#f0fff0\">return a geometric object that is the closure of the set symmetric difference of geom1 and geom2 (logical XOR of space)</td></tr>"); 4264 - html += 4265 - wxT 4266 - ("<tr><td bgcolor=\"#fffff0\">Buffer( geom Geometry , dist Double precision ) : Geometry</td>"); 4267 - html += 4268 - wxT 4269 - ("<td bgcolor=\"#f0fff0\">return a geometric object defined by buffering a distance d around geom, "); 4270 - html += 4271 - wxT 4272 - ("where dist is in the distance units for the Spatial Reference of geom</td></tr>"); 4273 - html += 4274 - wxT 4275 - ("<tr><td bgcolor=\"#fffff0\">ConvexHull( geom Geometry ) : Geometry</td>"); 4276 - html += 4277 - wxT 4278 - ("<td bgcolor=\"#f0fff0\">return a geometric object that is the convex hull of geom</td></tr>"); 4279 - html += 4280 - wxT 4281 - ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c42\">functions for coordinate transformations</a>"); 4282 - html += wxT("<br><a href=\"#index\">back to index</a></td></tr>"); 4283 - html += 4284 - wxT 4285 - ("<tr><td bgcolor=\"#fffff0\">Transform( geom Geometry , newSRID Integer ) : Geometry</td>"); 4286 - html += 4287 - wxT 4288 - ("<td bgcolor=\"#f0fff0\">return a geometric object obtained by reprojecting coordinates into the Reference System identified by newSRID</td></tr>"); 4289 - html += 4290 - wxT 4291 - ("<tr><td bgcolor=\"#fffff0\">ShiftCoords( geom Geometry , shiftX Double precision , shiftY Double precision ) : Geometry<hr>"); 4292 - html += 4293 - wxT 4294 - ("ShiftCoordinates( geom Geometry , shiftX Double precision , shiftY Double precision ) : Geometry</td>"); 4295 - html += 4296 - wxT 4297 - ("<td bgcolor=\"#f0fff0\">return a geometric object obtained by translating coordinates according to shiftX and shiftY values</td></tr>"); 4298 - html += 4299 - wxT 4300 - ("<tr><td bgcolor=\"#fffff0\">ScaleCoords( geom Geometry , scaleX Double precision [ , scaleY Double precision ] ) : Geometry<hr>"); 4301 - html += 4302 - wxT 4303 - ("ScaleCoordinates( geom Geometry , scaleX Double precision [ , scaleY Double precision ] ) : Geometry</td>"); 4304 - html += 4305 - wxT 4306 - ("<td bgcolor=\"#f0fff0\">return a geometric object obtained by scaling coordinates according to scaleX and scaleY values<br>"); 4307 - html += 4308 - wxT 4309 - ("if only one scale factor is specified, then an isotropic scaling occurs [i.e. the same scale factor is applied to both axis]"); 4310 - html += 4311 - wxT 4312 - ("otherwise an anisotropic scaling occurs [i.e. each axis is scaled according to its own scale factor]</td></tr>"); 4313 - html += 4314 - wxT 4315 - ("<tr><td bgcolor=\"#fffff0\">RotateCoords( geom Geometry , angleInDegrees Double precision ) : Geometry<hr>"); 4316 - html += 4317 - wxT 4318 - ("RotateCoordinates( geom Geometry , angleInDegrees Double precision ) : Geometry</td>"); 4319 - html += 4320 - wxT 4321 - ("<td bgcolor=\"#f0fff0\">return a geometric object obtained by rotating coordinates according to angleInDegrees value</td></tr>"); 4322 - html += 4323 - wxT 4324 - ("<tr><td bgcolor=\"#fffff0\">ReflectCoords( geom Geometry , xAxis Integer , yAxis Integer ) : Geometry<hr>"); 4325 - html += 4326 - wxT 4327 - ("ReflectCoordinates( geom Geometry , xAxis Integer , yAxis Integer ) : Geometry</td>"); 4328 - html += 4329 - wxT 4330 - ("<td bgcolor=\"#f0fff0\">return a geometric object obtained by reflecting coordinates according to xAxis and yAxis switches<br>"); 4331 - html += 4332 - wxT 4333 - ("i.e. if xAxis is 0 (FALSE), then x-coordinates remains untouched; otherwise x-coordinates will be reflected</td></tr>"); 4334 - html += 4335 - wxT 4336 - ("<tr><td bgcolor=\"#fffff0\">SwapCoords( geom Geometry ) : Geometry<hr>SwapCoordinates( geom Geometry ) : Geometry</td>"); 4337 - html += 4338 - wxT 4339 - ("<td bgcolor=\"#f0fff0\">return a geometric object obtained by swapping x- and y-coordinates</td></tr>"); 4340 - html += 4341 - wxT 4342 - ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c43\">functions for Spatial-MetaData and Spatial-Index handling</a>"); 4343 - html += wxT("<br><a href=\"#index\">back to index</a></td></tr>"); 4344 - html += 4345 - wxT 4346 - ("<tr><td bgcolor=\"#fffff0\">InitSpatialMetaData( void ) : Integer</td>"); 4347 - html += 4348 - wxT 4349 - ("<td bgcolor=\"#f0fff0\">Creates the geometry_columns and spatial_ref_sys metadata tables"); 4350 - html += 4351 - wxT 4352 - ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE<br>"); 4353 - html += 4354 - wxT 4355 - ("direct invocation of these function is discouraged; you have to run the init_spatialite.sql "); 4356 - html += 4357 - wxT 4358 - ("script in order to fully initialize the Spatial MetaData tables</td></tr>"); 4359 - html += 4360 - wxT 4361 - ("<tr><td bgcolor=\"#fffff0\">AddGeometryColumn( table String , column String , srid Integer , geom_type String , dimension Integer [ , not_null Integer ] ) : Integer</td>"); 4362 - html += 4363 - wxT 4364 - ("<td bgcolor=\"#f0fff0\">Creates a new geometry column updating the Spatial Metadata tables and creating any required trigger in order to enforce constraints<br>"); 4365 - html += 4366 - wxT 4367 - ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>"); 4368 - html += 4369 - wxT 4370 - ("<tr><td bgcolor=\"#fffff0\">RecoverGeometryColumn( table String , column String , srid Integer , geom_type String , dimension Integer ) : Integer</td>"); 4371 - html += 4372 - wxT 4373 - ("<td bgcolor=\"#f0fff0\">Validates an existing ordinary column in order to possibly transform it in a real geometry column, "); 4374 - html += 4375 - wxT 4376 - ("thus updating the Spatial Metadata tables and creating any required trigger in order to enforce constraints<br>"); 4377 - html += 4378 - wxT 4379 - ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>"); 4380 - html += 4381 - wxT 4382 - ("<tr><td bgcolor=\"#fffff0\">DiscardGeometryColumn( table String , column String ) : Integer</td>"); 4383 - html += 4384 - wxT 4385 - ("<td bgcolor=\"#f0fff0\">Removes a geometry column from Spatial MetaData tables and drops any related trigger<br>"); 4386 - html += 4387 - wxT 4388 - ("the column itself still continues to exist untouched as an ordinary, unconstrained column<br>"); 4389 - html += 4390 - wxT 4391 - ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>"); 4392 - html += 4393 - wxT 4394 - ("<tr><td bgcolor=\"#fffff0\">CreateSpatialIndex( table String , column String ) : Integer</td>"); 4395 - html += 4396 - wxT 4397 - ("<td bgcolor=\"#f0fff0\">Builds an RTree Spatial Index on a geometry column, "); 4398 - html += 4399 - wxT 4400 - ("creating any required trigger required in order to enforce full data coherency between the main table and Spatial Index<br>"); 4401 - html += 4402 - wxT 4403 - ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>"); 4404 - html += 4405 - wxT 4406 - ("<tr><td bgcolor=\"#fffff0\">DisableSpatialIndex( table String , column String ) : Integer</td>"); 4407 - html += 4408 - wxT 4409 - ("<td bgcolor=\"#f0fff0\">Disables an RTree Spatial Index, removing any related trigger<br>"); 4410 - html += 4411 - wxT 4412 - ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>"); 4413 - html += 4414 - wxT 4415 - ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c43fdo\">functions implementing FDO/OGR compatibily</a>"); 4416 - html += wxT("<br><a href=\"#index\">back to index</a></td></tr>"); 4417 - html += 4418 - wxT 4419 - ("<tr><td bgcolor=\"#fffff0\">CheckSpatialMetaData( void ) : Integer</td>"); 4420 - html += 4421 - wxT 4422 - ("<td bgcolor=\"#f0fff0\">Checks the Spatial Metadata type, then returning:<br>"); 4423 - html += 4424 - wxT 4425 - ("<b>0</b> if <i>geometry_columns</i> and <i>spatial_ref_sys</i> tables does not exists<br>"); 4426 - html += 4427 - wxT 4428 - ("<b>1</b> if both tables exist, and their layout is the one used by <i>SpatiaLite</i><br>"); 4429 - html += 4430 - wxT 4431 - ("<b>2</b> if both tables exist, and their layout is the one used by <i>FDO/OGR</i></td></tr>"); 4432 - html += 4433 - wxT("<tr><td bgcolor=\"#fffff0\">AutoFDOStart( void ) : Integer</td>"); 4434 - html += 4435 - wxT 4436 - ("<td bgcolor=\"#f0fff0\">This function will inspect the Spatial Metadata, then automatically creating/refreshing a <i>VirtualFDO</i>"); 4437 - html += 4438 - wxT 4439 - (" wrapper for each FDO/OGR geometry table<br>the return type is Integer [how many VirtualFDO tables have been created]</td></tr>"); 4440 - html += wxT("<tr><td bgcolor=\"#fffff0\">AutoFDOStop( void ) : Integer</td>"); 4441 - html += 4442 - wxT 4443 - ("<td bgcolor=\"#f0fff0\">This function will inspect the Spatial Metadata, then automatically destroying any <i>VirtualFDO</i>"); 4444 - html += 4445 - wxT 4446 - (" wrapper found<br>the return type is Integer [how many VirtualFDO tables have been destroyed]</td></tr>"); 4447 - html += 4448 - wxT 4449 - ("<tr><td bgcolor=\"#fffff0\">InitFDOSpatialMetaData( void ) : Integer</td>"); 4450 - html += 4451 - wxT 4452 - ("<td bgcolor=\"#f0fff0\">Creates the geometry_columns and spatial_ref_sys metadata tables"); 4453 - html += 4454 - wxT 4455 - ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE<br>"); 4456 - html += 4457 - wxT 4458 - ("<u>Please note:</u> Spatial Metadata created using this function will have the FDO/OGR layout, and not the SpatiaLite's own</td></tr>"); 4459 - html += 4460 - wxT 4461 - ("<tr><td bgcolor=\"#fffff0\">AddFDOGeometryColumn( table String , column String , srid Integer , geom_type String , dimension Integer , geometry_type String ) : Integer</td>"); 4462 - html += 4463 - wxT 4464 - ("<td bgcolor=\"#f0fff0\">Creates a new geometry column updating the FDO/OGR Spatial Metadata tables<br>"); 4465 - html += 4466 - wxT 4467 - ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>"); 4468 - html += 4469 - wxT 4470 - ("<tr><td bgcolor=\"#fffff0\">RecoverFDOGeometryColumn( table String , column String , srid Integer , geom_type String , dimension Integer , geometry_type String ) : Integer</td>"); 4471 - html += 4472 - wxT 4473 - ("<td bgcolor=\"#f0fff0\">Validates an existing ordinary column in order to possibly transform it in a real geometry column, "); 4474 - html += wxT("thus updating the FDO/OGR Spatial Metadata tables<br>"); 4475 - html += 4476 - wxT 4477 - ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>"); 4478 - html += 4479 - wxT 4480 - ("<tr><td bgcolor=\"#fffff0\">DiscardFDOGeometryColumn( table String , column String ) : Integer</td>"); 4481 - html += 4482 - wxT 4483 - ("<td bgcolor=\"#f0fff0\">Removes a geometry column from FDO/OGR Spatial MetaData tables<br>"); 4484 - html += 4485 - wxT 4486 - ("the column itself still continues to exist untouched as an ordinary column<br>"); 4487 - html += 4488 - wxT 4489 - ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>"); 4490 - html += 4491 - wxT 4492 - ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c44\">functions for MbrCache-based queries</a>"); 4493 - html += wxT("<br><a href=\"#index\">back to index</a></td></tr>"); 4494 - html += 4495 - wxT 4496 - ("<tr><td bgcolor=\"#fffff0\">FilterMbrWithin( x1 Double precision , y1 Double precision , x2 Double precision , y2 Double precision ) : Integer</td>"); 4497 - html += 4498 - wxT 4499 - ("<td bgcolor=\"#f0fff0\">Retrieves from an MbrCache any entity whose MBR falls <u><i>within</i></u>"); 4500 - html += 4501 - wxT 4502 - (" the rectangle identified by extreme points <i>x1 y1</i> and <i>x2 y2</i></td></tr>"); 4503 - html += 4504 - wxT 4505 - ("<tr><td bgcolor=\"#fffff0\">FilterMbrContains( x1 Double precision , y1 Double precision , x2 Double precision , y2 Double precision ) : Integer</td>"); 4506 - html += 4507 - wxT 4508 - ("<td bgcolor=\"#f0fff0\">Retrieves from an MbrCache any entity whose MBR <u><i>contains</i></u>"); 4509 - html += 4510 - wxT 4511 - (" the rectangle identified by extreme points <i>x1 y1</i> and <i>x2 y2</i></td></tr>"); 4512 - html += 4513 - wxT 4514 - ("<tr><td bgcolor=\"#fffff0\">FilterMbrIntersects( x1 Double precision , y1 Double precision , x2 Double precision , y2 Double precision ) : Integer</td>"); 4515 - html += 4516 - wxT 4517 - ("<td bgcolor=\"#f0fff0\">Retrieves from an MbrCache any entity whose MBR <u><i>intersects</i></u>"); 4518 - html += 4519 - wxT 4520 - (" the rectangle identified by extreme points <i>x1 y1</i> and <i>x2 y2</i></td></tr>"); 4521 - 4522 - 4523 - html += wxT("</table>"); 4524 - html += wxT("<a href=\"#index\">back to index</a>"); 4525 - html += wxT("</body>"); 4526 - html += wxT("</html>"); 1914 + html = 1915 + wxT 1916 + ("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); 1917 + html += wxT ("<html>"); 1918 + html += wxT ("<head>"); 1919 + html += 1920 + wxT 1921 + ("<meta content=\"text/html; charset=ISO-8859-1\" http-equiv=\"content-type\">"); 1922 + html += wxT ("<title>SQLite + SpatiaLite quick Help</title>"); 1923 + html += wxT ("</head>"); 1924 + html += wxT ("<body bgcolor=\"#e8e8e8\">"); 1925 + html += 1926 + wxT ("<h1><a name=\"index\">SQLite + SpatiaLite quick Help</a></h1>"); 1927 + html += wxT ("<table cellspacing=\"2\" cellpadding=\"2\">"); 1928 + html += 1929 + wxT 1930 + ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\">Index of contents</td></tr>"); 1931 + html += 1932 + wxT 1933 + ("<tr><td bgcolor=\"#fffff0\">1.</td><td bgcolor=\"#f0fff0\"><a href=\"#c1\">SQLite SQL syntax</a></td></tr>"); 1934 + html += 1935 + wxT 1936 + ("<tr><td bgcolor=\"#fffff0\">2.</td><td bgcolor=\"#f0fff0\"><a href=\"#c2\">SQLite SQL functions</a><ul>"); 1937 + html += wxT ("<li><a href=\"#c21\">ordinary functions</a></li>"); 1938 + html += wxT ("<li><a href=\"#c22\">aggregate functions</a></li>"); 1939 + html += wxT ("</ul></td></tr>"); 1940 + html += 1941 + wxT 1942 + ("<tr><td bgcolor=\"#fffff0\">3.</td><td bgcolor=\"#f0fff0\"><a href=\"#c3\">SpatiaLite SQL Spatial functions</a><ul>"); 1943 + html += 1944 + wxT 1945 + ("<li><a href=\"#c30\">SQL utility functions [non-standard] for geometric objects</a></li>"); 1946 + html += 1947 + wxT 1948 + ("<li><a href=\"#c31\">functions for constructing a geometric object given its Well-known Text Representation</a></li>"); 1949 + html += 1950 + wxT 1951 + ("<li><a href=\"#c32\">functions for constructing a geometric object given its Well-known Binary Representation</a></li>"); 1952 + html += 1953 + wxT 1954 + ("<li><a href=\"#c33\">functions for obtaining the Well-known Text / Well-known Binary Representation of a geometric object</a></li>"); 1955 + html += wxT ("<li><a href=\"#c34\">functions on type Geometry</a></li>"); 1956 + html += wxT ("<li><a href=\"#c35\">functions on type Point</a></li>"); 1957 + html += 1958 + wxT 1959 + ("<li><a href=\"#c36\">functions on type Surface [Polygon or Ring]</a></li>"); 1960 + html += wxT ("<li><a href=\"#c37\">functions on type Polygon</a></li>"); 1961 + html += 1962 + wxT ("<li><a href=\"#c38\">functions on type GeomCollection</a></li>"); 1963 + html += 1964 + wxT 1965 + ("<li><a href=\"#c39\">functions testing approximative spatial relationships via MBRs</a></li>"); 1966 + html += 1967 + wxT 1968 + ("<li><a href=\"#c40\">functions testing spatial relationships</a></li>"); 1969 + html += 1970 + wxT 1971 + ("<li><a href=\"#c41\">functions implementing spatial operators</a></li>"); 1972 + html += 1973 + wxT 1974 + ("<li><a href=\"#c42\">functions for coordinate transformations</a></li>"); 1975 + html += 1976 + wxT 1977 + ("<li><a href=\"#c43\">functions for Spatial-MetaData and Spatial-Index handling</a></li>"); 1978 + html += wxT ("</ul></td></tr>"); 1979 + html += wxT ("</table>"); 1980 + html += wxT ("<h3><a name=\"c1\">SQLite SQL syntax</a></h3>"); 1981 + html += wxT ("<table cellspacing=\"4\" cellpadding=\"2\"width=\"100%\">"); 1982 + html += 1983 + wxT 1984 + ("<tr><td bgcolor=\"#fffff0\">ALTER TABLE</td><td bgcolor=\"#f0fff0\">sql-statement ::= ALTER TABLE [database-name .] table-name alteration<br>"); 1985 + html += wxT ("alteration ::= RENAME TO new-table-name<br>"); 1986 + html += wxT ("alteration ::= ADD [COLUMN] column-def<br></td></tr>"); 1987 + html += 1988 + wxT 1989 + ("<tr><td bgcolor=\"#fffff0\">ANALYZE</td><td bgcolor=\"#f0fff0\">sql-statement ::= ANALYZE<br>"); 1990 + html += wxT ("sql-statement ::= ANALYZE database-name<br>"); 1991 + html += 1992 + wxT 1993 + ("sql-statement ::= ANALYZE [database-name .] table-name<br></td></tr>"); 1994 + html += 1995 + wxT 1996 + ("<tr><td bgcolor=\"#fffff0\">ATTACH DATABASE</td><td bgcolor=\"#f0fff0\">sql-statement ::= ATTACH [DATABASE] database-filename AS database-name</td></tr>"); 1997 + html += 1998 + wxT 1999 + ("<tr><td bgcolor=\"#fffff0\">BEGIN TRANSACTION</td><td bgcolor=\"#f0fff0\">sql-statement ::= BEGIN [ DEFERRED | IMMEDIATE | EXCLUSIVE ] [TRANSACTION [name]]<br>"); 2000 + html += wxT ("sql-statement ::= END [TRANSACTION [name]]<br>"); 2001 + html += wxT ("sql-statement ::= COMMIT [TRANSACTION [name]]<br>"); 2002 + html += 2003 + wxT ("sql-statement ::= ROLLBACK [TRANSACTION [name]]<br></td></tr>"); 2004 + html += 2005 + wxT 2006 + ("<tr><td bgcolor=\"#fffff0\">COMMIT TRANSACTION</td><td bgcolor=\"#f0fff0\">sql-statement ::= BEGIN [ DEFERRED | IMMEDIATE | EXCLUSIVE ] [TRANSACTION [name]]<br>"); 2007 + html += wxT ("sql-statement ::= END [TRANSACTION [name]]<br>"); 2008 + html += wxT ("sql-statement ::= COMMIT [TRANSACTION [name]]<br>"); 2009 + html += 2010 + wxT ("sql-statement ::= ROLLBACK [TRANSACTION [name]]<br></td></tr>"); 2011 + html += 2012 + wxT 2013 + ("<tr><td bgcolor=\"#fffff0\">CREATE INDEX</td><td bgcolor=\"#f0fff0\">sql-statement ::= CREATE [UNIQUE] INDEX [IF NOT EXISTS] [database-name .] index-name<br>"); 2014 + html += wxT ("ON table-name ( column-name [, column-name]* )<br>"); 2015 + html += 2016 + wxT 2017 + ("column-name ::= name [ COLLATE collation-name] [ ASC | DESC ]</td></tr>"); 2018 + html += 2019 + wxT 2020 + ("<tr><td bgcolor=\"#fffff0\">CREATE TABLE</td><td bgcolor=\"#f0fff0\">sql-command ::= CREATE [TEMP | TEMPORARY] TABLE [IF NOT EXISTS] [database-name .] table-name (<br>"); 2021 + html += wxT ("column-def [, column-def]*<br>"); 2022 + html += wxT ("[, constraint]*<br>"); 2023 + html += wxT (")<br>"); 2024 + html += 2025 + wxT 2026 + ("sql-command ::= CREATE [TEMP | TEMPORARY] TABLE [database-name.] table-name AS select-statement<br>"); 2027 + html += 2028 + wxT 2029 + ("column-def ::= name [type] [[CONSTRAINT name] column-constraint]*<br>"); 2030 + html += wxT ("type ::= typename |<br>"); 2031 + html += wxT ("typename ( number ) |<br>"); 2032 + html += wxT ("typename ( number , number )<br>"); 2033 + html += wxT ("column-constraint ::= NOT NULL [ conflict-clause ] |<br>"); 2034 + html += 2035 + wxT 2036 + ("PRIMARY KEY [sort-order] [ conflict-clause ] [AUTOINCREMENT] |<br>"); 2037 + html += wxT ("UNIQUE [ conflict-clause ] |<br>"); 2038 + html += wxT ("CHECK ( expr ) |<br>"); 2039 + html += wxT ("DEFAULT value |<br>"); 2040 + html += wxT ("COLLATE collation-name<br>"); 2041 + html += 2042 + wxT 2043 + ("constraint ::= PRIMARY KEY ( column-list ) [ conflict-clause ] |<br>"); 2044 + html += wxT ("UNIQUE ( column-list ) [ conflict-clause ] |<br>"); 2045 + html += wxT ("CHECK ( expr )<br>"); 2046 + html += 2047 + wxT ("conflict-clause ::= ON CONFLICT conflict-algorithm</td></tr>"); 2048 + html += 2049 + wxT 2050 + ("<tr><td bgcolor=\"#fffff0\">CREATE TRIGGER</td><td bgcolor=\"#f0fff0\">sql-statement ::= CREATE [TEMP | TEMPORARY] TRIGGER [IF NOT EXISTS] trigger-name [ BEFORE | AFTER ]<br>"); 2051 + html += wxT ("database-event ON [database-name .] table-name<br>"); 2052 + html += wxT ("trigger-action<br>"); 2053 + html += 2054 + wxT 2055 + ("sql-statement ::= CREATE [TEMP | TEMPORARY] TRIGGER [IF NOT EXISTS] trigger-name INSTEAD OF<br>"); 2056 + html += wxT ("database-event ON [database-name .] view-name<br>"); 2057 + html += wxT ("trigger-action<br>"); 2058 + html += wxT ("database-event ::= DELETE |<br>"); 2059 + html += wxT ("INSERT |<br>"); 2060 + html += wxT ("UPDATE |<br>"); 2061 + html += wxT ("UPDATE OF column-list<br>"); 2062 + html += wxT ("trigger-action ::= [ FOR EACH ROW ] [ WHEN expression ]<br>"); 2063 + html += wxT ("BEGIN<br>"); 2064 + html += wxT ("trigger-step ; [ trigger-step ; ]*<br>"); 2065 + html += wxT ("END<br>"); 2066 + html += wxT ("trigger-step ::= update-statement | insert-statement |<br>"); 2067 + html += wxT ("delete-statement | select-statement</td></tr>"); 2068 + html += 2069 + wxT 2070 + ("<tr><td bgcolor=\"#fffff0\">CREATE VIEW</td><td bgcolor=\"#f0fff0\">sql-command ::= CREATE [TEMP | TEMPORARY] VIEW [IF NOT EXISTS] [database-name.] view-name AS select-statement</td></tr>"); 2071 + html += 2072 + wxT 2073 + ("<tr><td bgcolor=\"#fffff0\">CREATE VIRTUAL TABLE</td><td bgcolor=\"#f0fff0\">sql-command ::= CREATE VIRTUAL TABLE [database-name .] table-name USING module-name [( arguments )]</td></tr>"); 2074 + html += 2075 + wxT 2076 + ("<tr><td bgcolor=\"#fffff0\">DELETE</td><td bgcolor=\"#f0fff0\">sql-statement ::= DELETE FROM [database-name .] table-name [WHERE expr]</td></tr>"); 2077 + html += 2078 + wxT 2079 + ("<tr><td bgcolor=\"#fffff0\">DETACH DATABASE</td><td bgcolor=\"#f0fff0\">sql-command ::= DETACH [DATABASE] database-name</td></tr>"); 2080 + html += 2081 + wxT 2082 + ("<tr><td bgcolor=\"#fffff0\">DROP INDEX</td><td bgcolor=\"#f0fff0\">sql-command ::= DROP INDEX [IF EXISTS] [database-name .] index-name</td></tr>"); 2083 + html += 2084 + wxT 2085 + ("<tr><td bgcolor=\"#fffff0\">DROP TABLE</td><td bgcolor=\"#f0fff0\">sql-command ::= DROP TABLE [IF EXISTS] [database-name.] table-name</td></tr>"); 2086 + html += 2087 + wxT 2088 + ("<tr><td bgcolor=\"#fffff0\">DROP TRIGGER</td><td bgcolor=\"#f0fff0\">sql-statement ::= DROP TRIGGER [IF EXISTS] [database-name .] trigger-name</td></tr>"); 2089 + html += 2090 + wxT 2091 + ("<tr><td bgcolor=\"#fffff0\">DROP VIEW</td><td bgcolor=\"#f0fff0\">sql-command ::= DROP VIEW [IF EXISTS] view-name</td></tr>"); 2092 + html += 2093 + wxT 2094 + ("<tr><td bgcolor=\"#fffff0\">END TRANSACTION</td><td bgcolor=\"#f0fff0\">sql-statement ::= BEGIN [ DEFERRED | IMMEDIATE | EXCLUSIVE ] [TRANSACTION [name]]<br>"); 2095 + html += wxT ("sql-statement ::= END [TRANSACTION [name]]<br>"); 2096 + html += wxT ("sql-statement ::= COMMIT [TRANSACTION [name]]<br>"); 2097 + html += 2098 + wxT ("sql-statement ::= ROLLBACK [TRANSACTION [name]]<br></td></tr>"); 2099 + html += 2100 + wxT 2101 + ("<tr><td bgcolor=\"#fffff0\">EXPLAIN</td><td bgcolor=\"#f0fff0\">sql-statement ::= EXPLAIN sql-statement</td></tr>"); 2102 + html += 2103 + wxT 2104 + ("<tr><td bgcolor=\"#fffff0\">INSERT</td><td bgcolor=\"#f0fff0\">sql-statement ::= INSERT [OR conflict-algorithm] INTO [database-name .] table-name [(column-list)] VALUES(value-list) |<br>"); 2105 + html += 2106 + wxT 2107 + ("INSERT [OR conflict-algorithm] INTO [database-name .] table-name [(column-list)] select-statement</td></tr>"); 2108 + html += 2109 + wxT 2110 + ("<tr><td bgcolor=\"#fffff0\">ON CONFLICT clause</td><td bgcolor=\"#f0fff0\">conflict-clause ::= ON CONFLICT conflict-algorithm<br>"); 2111 + html += 2112 + wxT 2113 + ("conflict-algorithm ::= ROLLBACK | ABORT | FAIL | IGNORE | REPLACE</td></tr>"); 2114 + html += 2115 + wxT 2116 + ("<tr><td bgcolor=\"#fffff0\">PRAGMA</td><td bgcolor=\"#f0fff0\">sql-statement ::= PRAGMA name [= value] |<br>"); 2117 + html += wxT ("PRAGMA function(arg)<hr>"); 2118 + html += wxT ("PRAGMA auto_vacuum;<br>"); 2119 + html += 2120 + wxT ("PRAGMA auto_vacuum = 0 | none | 1 | full | 2 | incremental;<hr>"); 2121 + html += wxT ("PRAGMA cache_size;<br>"); 2122 + html += wxT ("PRAGMA cache_size = Number-of-pages;<hr>"); 2123 + html += wxT ("PRAGMA case_sensitive_like;<br>"); 2124 + html += wxT ("PRAGMA case_sensitive_like = 0 | 1;<hr>"); 2125 + html += wxT ("PRAGMA count_changes;<br>"); 2126 + html += wxT ("PRAGMA count_changes = 0 | 1;<hr>"); 2127 + html += wxT ("PRAGMA default_cache_size;<br>"); 2128 + html += wxT ("PRAGMA default_cache_size = Number-of-pages;<hr>"); 2129 + html += wxT ("PRAGMA empty_result_callbacks;<br>"); 2130 + html += wxT ("PRAGMA empty_result_callbacks = 0 | 1;<hr>"); 2131 + html += wxT ("PRAGMA encoding;<br>"); 2132 + html += wxT ("PRAGMA encoding = \"UTF-8\";<br>"); 2133 + html += wxT ("PRAGMA encoding = \"UTF-16\";<br>"); 2134 + html += wxT ("PRAGMA encoding = \"UTF-16le\";<br>"); 2135 + html += wxT ("PRAGMA encoding = \"UTF-16be\";<hr>"); 2136 + html += wxT ("PRAGMA full_column_names;<br>"); 2137 + html += wxT ("PRAGMA full_column_names = 0 | 1;<hr>"); 2138 + html += wxT ("PRAGMA fullfsync;<br>"); 2139 + html += wxT ("PRAGMA fullfsync = 0 | 1;<hr>"); 2140 + html += wxT ("PRAGMA journal_mode;<br>"); 2141 + html += wxT ("PRAGMA database.journal_mode;<br>"); 2142 + html += wxT ("PRAGMA journal_mode = DELETE | PERSIST | OFF<br>"); 2143 + html += wxT ("PRAGMA database.journal_mode = DELETE | PERSIST | OFF<hr>"); 2144 + html += wxT ("PRAGMA legacy_file_format;<br>"); 2145 + html += wxT ("PRAGMA legacy_file_format = ON | OFF<hr>"); 2146 + html += wxT ("PRAGMA locking_mode;<br>"); 2147 + html += wxT ("PRAGMA locking_mode = NORMAL | EXCLUSIVE<hr>"); 2148 + html += wxT ("PRAGMA page_size;<br>"); 2149 + html += wxT ("PRAGMA page_size = bytes;<hr>"); 2150 + html += wxT ("PRAGMA max_page_count;<br>"); 2151 + html += wxT ("PRAGMA max_page_count = N;<hr>"); 2152 + html += wxT ("PRAGMA read_uncommitted;<br>"); 2153 + html += wxT ("PRAGMA read_uncommitted = 0 | 1;<hr>"); 2154 + html += wxT ("PRAGMA short_column_names;<br>"); 2155 + html += wxT ("PRAGMA short_column_names = 0 | 1;<hr>"); 2156 + html += wxT ("PRAGMA synchronous;<br>"); 2157 + html += wxT ("PRAGMA synchronous = FULL; (2)<br>"); 2158 + html += wxT ("PRAGMA synchronous = NORMAL; (1)<br>"); 2159 + html += wxT ("PRAGMA synchronous = OFF; (0)<hr>"); 2160 + html += wxT ("PRAGMA temp_store;<br>"); 2161 + html += wxT ("PRAGMA temp_store = DEFAULT; (0)<br>"); 2162 + html += wxT ("PRAGMA temp_store = FILE; (1)<br>"); 2163 + html += wxT ("PRAGMA temp_store = MEMORY; (2)<hr>"); 2164 + html += wxT ("PRAGMA temp_store_directory;<br>"); 2165 + html += wxT ("PRAGMA temp_store_directory = 'directory-name';<hr>"); 2166 + html += wxT ("PRAGMA database_list;<hr>"); 2167 + html += wxT ("PRAGMA foreign_key_list(table-name);<hr>"); 2168 + html += wxT ("PRAGMA [database].freelist_count;<hr>"); 2169 + html += wxT ("PRAGMA index_info(index-name);<hr>"); 2170 + html += wxT ("PRAGMA index_list(table-name);<hr>"); 2171 + html += wxT ("PRAGMA table_info(table-name);<hr>"); 2172 + html += wxT ("PRAGMA [database.]schema_version;<br>"); 2173 + html += wxT ("PRAGMA [database.]schema_version = integer ;<br>"); 2174 + html += wxT ("PRAGMA [database.]user_version;<br>"); 2175 + html += wxT ("PRAGMA [database.]user_version = integer ;<hr>"); 2176 + html += wxT ("PRAGMA integrity_check;<br>"); 2177 + html += wxT ("PRAGMA integrity_check(integer)<hr>"); 2178 + html += wxT ("PRAGMA parser_trace = ON; (1)<br>"); 2179 + html += wxT ("PRAGMA parser_trace = OFF; (0)<hr>"); 2180 + html += wxT ("PRAGMA vdbe_trace = ON; (1)<br>"); 2181 + html += wxT ("PRAGMA vdbe_trace = OFF; (0)<hr>"); 2182 + html += wxT ("PRAGMA vdbe_listing = ON; (1)<br>"); 2183 + html += wxT ("PRAGMA vdbe_listing = OFF; (0)</td></tr>"); 2184 + html += 2185 + wxT 2186 + ("<tr><td bgcolor=\"#fffff0\">REINDEX</td><td bgcolor=\"#f0fff0\">sql-statement ::= REINDEX collation name<br>"); 2187 + html += 2188 + wxT 2189 + ("sql-statement ::= REINDEX [database-name .] table/index-name</td></tr>"); 2190 + html += 2191 + wxT 2192 + ("<tr><td bgcolor=\"#fffff0\">REPLACE</td><td bgcolor=\"#f0fff0\">sql-statement ::= REPLACE INTO [database-name .] table-name [( column-list )] VALUES ( value-list ) |<br>"); 2193 + html += 2194 + wxT 2195 + ("REPLACE INTO [database-name .] table-name [( column-list )] select-statement</td></tr>"); 2196 + html += 2197 + wxT 2198 + ("<tr><td bgcolor=\"#fffff0\">ROLLBACK TRANSACTION</td><td bgcolor=\"#f0fff0\">sql-statement ::= BEGIN [ DEFERRED | IMMEDIATE | EXCLUSIVE ] [TRANSACTION [name]]<br>"); 2199 + html += wxT ("sql-statement ::= END [TRANSACTION [name]]<br>"); 2200 + html += wxT ("sql-statement ::= COMMIT [TRANSACTION [name]]<br>"); 2201 + html += 2202 + wxT ("sql-statement ::= ROLLBACK [TRANSACTION [name]]<br></td></tr>"); 2203 + html += 2204 + wxT 2205 + ("<tr><td bgcolor=\"#fffff0\">SELECT</td><td bgcolor=\"#f0fff0\">sql-statement ::= SELECT [ALL | DISTINCT] result [FROM table-list]<br>"); 2206 + html += wxT ("[WHERE expr]<br>"); 2207 + html += wxT ("[GROUP BY expr-list]<br>"); 2208 + html += wxT ("[HAVING expr]<br>"); 2209 + html += wxT ("[compound-op select]*<br>"); 2210 + html += wxT ("[ORDER BY sort-expr-list]<br>"); 2211 + html += wxT ("[LIMIT integer [( OFFSET | , ) integer]]<br>"); 2212 + html += wxT ("result ::= result-column [, result-column]*<br>"); 2213 + html += 2214 + wxT ("result-column ::= * | table-name . * | expr [ [AS] string ]<br>"); 2215 + html += wxT ("table-list ::= table [join-op table join-args]*<br>"); 2216 + html += wxT ("table ::= table-name [AS alias] |<br>"); 2217 + html += wxT ("( select ) [AS alias]<br>"); 2218 + html += 2219 + wxT 2220 + ("join-op ::= , | [NATURAL] [LEFT | RIGHT | FULL] [OUTER | INNER | CROSS] JOIN<br>"); 2221 + html += wxT ("join-args ::= [ON expr] [USING ( id-list )]<br>"); 2222 + html += 2223 + wxT ("sort-expr-list ::= expr [sort-order] [, expr [sort-order]]*<br>"); 2224 + html += 2225 + wxT ("sort-order ::= [ COLLATE collation-name ] [ ASC | DESC ]<br>"); 2226 + html += 2227 + wxT 2228 + ("compound_op ::= UNION | UNION ALL | INTERSECT | EXCEPT</td></tr>"); 2229 + html += 2230 + wxT 2231 + ("<tr><td bgcolor=\"#fffff0\">UPDATE</td><td bgcolor=\"#f0fff0\">sql-statement ::= UPDATE [ OR conflict-algorithm ] [database-name .] table-name<br>"); 2232 + html += wxT ("SET assignment [, assignment]*<br>"); 2233 + html += wxT ("[WHERE expr]<br>"); 2234 + html += wxT ("assignment ::= column-name = expr</td></tr>"); 2235 + html += 2236 + wxT 2237 + ("<tr><td bgcolor=\"#fffff0\">VACUUM</td><td bgcolor=\"#f0fff0\">sql-statement ::= VACUUM</td></tr>"); 2238 + html += wxT ("</table>"); 2239 + html += wxT ("<a href=\"#index\">back to index</a>"); 2240 + html += 2241 + wxT 2242 + ("<h3><a align=\"center\" bgcolor=\"#e0ffe0\" name=\"c2\">SQLite SQL functions</a></h3>"); 2243 + html += wxT ("<table cellspacing=\"4\" cellpadding=\"2\" width=\"100%\">"); 2244 + html += 2245 + wxT 2246 + ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c21\">ordinary functions</a><br><a href=\"#index\">back to index</a></td></tr>"); 2247 + html += 2248 + wxT 2249 + ("<tr><td bgcolor=\"#fffff0\">abs(X)</td><td bgcolor=\"#f0fff0\">Return the absolute value of the numeric argument X. "); 2250 + html += 2251 + wxT 2252 + ("Return NULL if X is NULL. Return 0.0 if X is not a numeric value.</td></tr>"); 2253 + html += 2254 + wxT 2255 + ("<tr><td bgcolor=\"#fffff0\">coalesce(X,Y,...)</td><td bgcolor=\"#f0fff0\">Return a copy of the first non-NULL argument. "); 2256 + html += 2257 + wxT 2258 + ("If all arguments are NULL then NULL is returned. There must be at least 2 arguments.</td></tr>"); 2259 + html += 2260 + wxT 2261 + ("<tr><td bgcolor=\"#fffff0\">glob(X,Y)</td><td bgcolor=\"#f0fff0\">This function is used to implement the \"X GLOB Y\" syntax of SQLite. "); 2262 + html += 2263 + wxT 2264 + ("The sqlite3_create_function() interface can be used to override this function and thereby change the operation of the GLOB operator.</td></tr>"); 2265 + html += 2266 + wxT 2267 + ("<tr><td bgcolor=\"#fffff0\">ifnull(X,Y)</td><td bgcolor=\"#f0fff0\">Return a copy of the first non-NULL argument. "); 2268 + html += 2269 + wxT 2270 + ("If both arguments are NULL then NULL is returned. This behaves the same as coalesce().</td></tr>"); 2271 + html += 2272 + wxT 2273 + ("<tr><td bgcolor=\"#fffff0\">hex(X)</td><td bgcolor=\"#f0fff0\">The argument is interpreted as a BLOB. "); 2274 + html += 2275 + wxT 2276 + ("The result is a hexadecimal rendering of the content of that blob.</td></tr>"); 2277 + html += 2278 + wxT 2279 + ("<tr><td bgcolor=\"#fffff0\">last_insert_rowid()</td><td bgcolor=\"#f0fff0\">Return the ROWID of the last row insert from this connection to the database. "); 2280 + html += 2281 + wxT 2282 + ("This is the same value that would be returned from the sqlite3_last_insert_rowid() API function.</td></tr>"); 2283 + html += 2284 + wxT 2285 + ("<tr><td bgcolor=\"#fffff0\">length(X)</td><td bgcolor=\"#f0fff0\">Return the string length of X in characters. "); 2286 + html += 2287 + wxT 2288 + ("If SQLite is configured to support UTF-8, then the number of UTF-8 characters is returned, not the number of bytes.</td></tr>"); 2289 + html += 2290 + wxT 2291 + ("<tr><td bgcolor=\"#fffff0\">like(X,Y)<br>like(X,Y,Z)</td><td bgcolor=\"#f0fff0\">This function is used to implement the \"X LIKE Y [ESCAPE Z]\" syntax of SQL."); 2292 + html += 2293 + wxT 2294 + ("If the optional ESCAPE clause is present, then the user-function is invoked with three arguments. "); 2295 + html += wxT ("Otherwise, it is invoked with two arguments only. "); 2296 + html += 2297 + wxT 2298 + ("The sqlite3_create_function() interface can be used to override this function and thereby change the operation of the LIKE operator. "); 2299 + html += 2300 + wxT 2301 + ("When doing this, it may be important to override both the two and three argument versions of the like() function. "); 2302 + html += 2303 + wxT 2304 + ("Otherwise, different code may be called to implement the LIKE operator depending on whether or not an ESCAPE clause was specified.</td></tr>"); 2305 + html += 2306 + wxT 2307 + ("<tr><td bgcolor=\"#fffff0\">load_extension(X)</br>load_extension(X,Y)</td><td bgcolor=\"#f0fff0\">Load SQLite extensions "); 2308 + html += 2309 + wxT 2310 + ("out of the shared library file named X using the entry point Y. "); 2311 + html += 2312 + wxT 2313 + ("The result is a NULL. If Y is omitted then the default entry point of sqlite3_extension_init is used. "); 2314 + html += 2315 + wxT 2316 + ("This function raises an exception if the extension fails to load or initialize correctly.</td></tr>"); 2317 + html += 2318 + wxT 2319 + ("<tr><td bgcolor=\"#fffff0\">lower(X)</td><td bgcolor=\"#f0fff0\">Return a copy of string X will all ASCII characters converted to lower case. "); 2320 + html += 2321 + wxT 2322 + ("The C library tolower() routine is used for the conversion, which means that this function might not work correctly on non-ASCII UTF-8 characters.</td></tr>"); 2323 + html += 2324 + wxT 2325 + ("<tr><td bgcolor=\"#fffff0\">ltrim(X)<br>ltrim(X,Y)</td><td bgcolor=\"#f0fff0\">Return a string formed by removing any and all characters "); 2326 + html += 2327 + wxT 2328 + ("that appear in Y from the left side of X. If the Y argument is omitted, spaces are removed.</td></tr>"); 2329 + html += 2330 + wxT 2331 + ("<tr><td bgcolor=\"#fffff0\">max(X,Y,...)</td><td bgcolor=\"#f0fff0\">Return the argument with the maximum value. "); 2332 + html += wxT ("Arguments may be strings in addition to numbers. "); 2333 + html += wxT ("The maximum value is determined by the usual sort order. "); 2334 + html += 2335 + wxT 2336 + ("Note that max() is a simple function when it has 2 or more arguments but converts to an aggregate function if given only a single argument.</td></tr>"); 2337 + html += 2338 + wxT 2339 + ("<tr><td bgcolor=\"#fffff0\">min(X,Y,...)</td><td bgcolor=\"#f0fff0\">Return the argument with the minimum value. "); 2340 + html += wxT ("Arguments may be strings in addition to numbers. "); 2341 + html += wxT ("The minimum value is determined by the usual sort order. "); 2342 + html += 2343 + wxT 2344 + ("Note that min() is a simple function when it has 2 or more arguments but converts to an aggregate function if given only a single argument.</td></tr>"); 2345 + html += 2346 + wxT 2347 + ("<tr><td bgcolor=\"#fffff0\">nullif(X,Y)</td><td bgcolor=\"#f0fff0\">Return the first argument if the arguments are different, otherwise return NULL.</td></tr>"); 2348 + html += 2349 + wxT 2350 + ("<tr><td bgcolor=\"#fffff0\">quote(X)</td><td bgcolor=\"#f0fff0\">This routine return a string which is the value of its argument suitable for inclusion "); 2351 + html += 2352 + wxT 2353 + ("into another SQL statement. Strings are surrounded by single-quotes with escapes on interior quotes as needed. "); 2354 + html += 2355 + wxT 2356 + ("BLOBs are encoded as hexadecimal literals. The implementation of VACUUM uses this function. "); 2357 + html += 2358 + wxT 2359 + ("The function is also useful when writing triggers to implement undo/redo functionality.</td></tr>"); 2360 + html += 2361 + wxT 2362 + ("<tr><td bgcolor=\"#fffff0\">random()</td><td bgcolor=\"#f0fff0\">Return a pseudo-random integer between -9223372036854775808 and +9223372036854775807.</td></tr>"); 2363 + html += 2364 + wxT 2365 + ("<tr><td bgcolor=\"#fffff0\">randomblob(N)</td><td bgcolor=\"#f0fff0\">Return an N-byte blob containing pseudo-random bytes. N should be a postive integer.</td></tr>"); 2366 + html += 2367 + wxT 2368 + ("<tr><td bgcolor=\"#fffff0\">replace(X,Y,Z)</td><td bgcolor=\"#f0fff0\">Return a string formed by substituting string Z for every occurrance of string Y in string X. "); 2369 + html += 2370 + wxT 2371 + ("The BINARY collating sequence is used for comparisons.</td></tr>"); 2372 + html += 2373 + wxT 2374 + ("<tr><td bgcolor=\"#fffff0\">round(X)<br>round(X,Y)</td><td bgcolor=\"#f0fff0\">Round off the number X to Y digits to the right of the decimal point. "); 2375 + html += wxT ("If the Y argument is omitted, 0 is assumed.</td></tr>"); 2376 + html += 2377 + wxT 2378 + ("<tr><td bgcolor=\"#fffff0\">rtrim(X)<br>rtrim(X,Y)</td><td bgcolor=\"#f0fff0\">Return a string formed by removing any and all characters "); 2379 + html += 2380 + wxT 2381 + ("that appear in Y from the right side of X. If the Y argument is omitted, spaces are removed.</td></tr>"); 2382 + html += 2383 + wxT 2384 + ("<tr><td bgcolor=\"#fffff0\">sqlite_version(X)</td><td bgcolor=\"#f0fff0\">Return the version string for the SQLite library that is running. Example: \"3.5.9\"</td></tr>"); 2385 + html += 2386 + wxT 2387 + ("<tr><td bgcolor=\"#fffff0\">substr(X,Y,Z)<br>substr(X,Y)</td><td bgcolor=\"#f0fff0\">Return a substring of input string X that begins with the Y-th character "); 2388 + html += 2389 + wxT 2390 + ("and which is Z characters long. If Z is omitted then all character through the end of the string are returned. "); 2391 + html += wxT ("The left-most character of X is number 1. "); 2392 + html += 2393 + wxT 2394 + ("If Y is negative the the first character of the substring is found by counting from the right rather than the left. "); 2395 + html += 2396 + wxT 2397 + ("If X is string then characters indices refer to actual UTF-8 characters. If X is a BLOB then the indices refer to bytes.</td></tr>"); 2398 + html += 2399 + wxT 2400 + ("<tr><td bgcolor=\"#fffff0\">trim(X)<br>trim(X,Y)</td><td bgcolor=\"#f0fff0\">Return a string formed by removing any and all characters that appear in Y from both ends of X. "); 2401 + html += wxT ("If the Y argument is omitted, spaces are removed.</td></tr>"); 2402 + html += 2403 + wxT 2404 + ("<tr><td bgcolor=\"#fffff0\">typeof(X)</td><td bgcolor=\"#f0fff0\">Return the type of the expression X. "); 2405 + html += 2406 + wxT 2407 + ("The only return values are \"null\", \"integer\", \"real\", \"text\", and \"blob\".</td></tr>"); 2408 + html += 2409 + wxT 2410 + ("<tr><td bgcolor=\"#fffff0\">upper(X)</td><td bgcolor=\"#f0fff0\">Return a copy of input string X converted to all upper-case letters. "); 2411 + html += 2412 + wxT 2413 + ("The implementation of this function uses the C library routine toupper() which means it may not work correctly on non-ASCII UTF-8 strings.</td></tr>"); 2414 + html += 2415 + wxT 2416 + ("<tr><td bgcolor=\"#fffff0\">zeroblob(N)</td><td bgcolor=\"#f0fff0\">Return a BLOB consisting of N bytes of 0x00. "); 2417 + html += wxT ("SQLite manages these zeroblobs very efficiently. "); 2418 + html += 2419 + wxT 2420 + ("Zeroblobs can be used to reserve space for a BLOB that is later written using incremental BLOB I/O.</td></tr> "); 2421 + html += 2422 + wxT 2423 + ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c22\">aggregate functions</a><br><a href=\"#index\">back to index</a></td></tr>"); 2424 + html += 2425 + wxT 2426 + ("<tr><td bgcolor=\"#fffff0\">avg(X)</td><td bgcolor=\"#f0fff0\">Return the average value of all non-NULL X within a group. "); 2427 + html += 2428 + wxT 2429 + ("String and BLOB values that do not look like numbers are interpreted as 0. "); 2430 + html += 2431 + wxT 2432 + ("The result of avg() is always a floating point value even if all inputs are integers.</td></tr>"); 2433 + html += 2434 + wxT 2435 + ("<tr><td bgcolor=\"#fffff0\">count(X)<br>count(*)</td><td bgcolor=\"#f0fff0\">The first form return a count of the number of times that X is not NULL in a group. "); 2436 + html += 2437 + wxT 2438 + ("The second form (with no argument) return the total number of rows in the group.</td></tr>"); 2439 + html += 2440 + wxT 2441 + ("<tr><td bgcolor=\"#fffff0\">group_concat(X)<br>group_concat(X,Y)</td><td bgcolor=\"#f0fff0\">The result is a string which is the concatenation of all non-NULL values of X. "); 2442 + html += 2443 + wxT 2444 + ("If parameter Y is the separator between instances of X. A comma (\",\") is used as the separator if Y is omitted.</td></tr>"); 2445 + html += 2446 + wxT 2447 + ("<tr><td bgcolor=\"#fffff0\">max(X)</td><td bgcolor=\"#f0fff0\">Return the maximum value of all values in the group. "); 2448 + html += 2449 + wxT 2450 + ("The usual sort order is used to determine the maximum.</td></tr>"); 2451 + html += 2452 + wxT 2453 + ("<tr><td bgcolor=\"#fffff0\">min(X)</td><td bgcolor=\"#f0fff0\">Return the minimum non-NULL value of all values in the group. "); 2454 + html += 2455 + wxT 2456 + ("The usual sort order is used to determine the minimum. NULL is only returned if all values in the group are NULL.</td></tr>"); 2457 + html += 2458 + wxT 2459 + ("<tr><td bgcolor=\"#fffff0\">sum(X)<br>total(X)</td><td bgcolor=\"#f0fff0\">Return the numeric sum of all non-NULL values in the group. "); 2460 + html += 2461 + wxT 2462 + ("If there are no non-NULL input rows then sum() return NULL but total() return 0.0. "); 2463 + html += 2464 + wxT 2465 + ("NULL is not normally a helpful result for the sum of no rows but the SQL standard requires it and most other SQL "); 2466 + html += 2467 + wxT 2468 + ("database engines implement sum() that way so SQLite does it in the same way in order to be compatible. "); 2469 + html += 2470 + wxT 2471 + ("The non-standard total() function is provided as a convenient way to work around this design problem in the SQL language.<br>"); 2472 + html += 2473 + wxT 2474 + ("The result of total() is always a floating point value. The result of sum() is an integer value if all non-NULL inputs are integers. "); 2475 + html += 2476 + wxT 2477 + ("If any input to sum() is neither an integer or a NULL then sum() return a floating point value which might be an approximation to the true sum.<br>"); 2478 + html += 2479 + wxT 2480 + ("Sum() will throw an \"integer overflow\" exception if all inputs are integers or NULL and an integer overflow occurs at any point during the computation."); 2481 + html += wxT ("Total() never throws an exception.</td></tr> "); 2482 + html += wxT ("</table>"); 2483 + html += wxT ("<a href=\"#index\">back to index</a>"); 2484 + html += 2485 + wxT ("<h3><a name=\"c3\">SpatiaLite SQL Spatial functions</a></h3>"); 2486 + html += wxT ("<table cellspacing=\"4\" cellpadding=\"2\" width=\"100%\">"); 2487 + html += 2488 + wxT 2489 + ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c30\">SQL utility functions [<i>non-standard</i>] for geometric objects</a></a>"); 2490 + html += wxT ("<br><a href=\"#index\">back to index</a></td></tr>"); 2491 + html += 2492 + wxT 2493 + ("<tr><td bgcolor=\"#fffff0\">MakePoint( x Double precision , y Double precision, [ , SRID Integer] ) : Geometry</td>"); 2494 + html += 2495 + wxT 2496 + ("<td bgcolor=\"#f0fff0\">a Geometry will be returned representing the POINT defined by [x y] coordinates</td></tr>"); 2497 + html += 2498 + wxT 2499 + ("<tr><td bgcolor=\"#fffff0\">BuildMbr( x1 Double precision , y1 Double precision , x2 Double precision , y2 Double precision, [ , SRID Integer] ) : Geometry</td>"); 2500 + html += 2501 + wxT 2502 + ("<td bgcolor=\"#f0fff0\">[x1 y1] and [x2 y2] are assumed to be Points identifying a line segment;"); 2503 + html += 2504 + wxT 2505 + ("then a Geometry will be returned representing the MBR for this line segment</td></tr>"); 2506 + html += 2507 + wxT 2508 + ("<tr><td bgcolor=\"#fffff0\">BuildCircleMbr( x Double precision , y Double precision , radius Double precision [ , SRID Integer] ) : Geometry</td>"); 2509 + html += 2510 + wxT 2511 + ("<td bgcolor=\"#f0fff0\">[x y] is assumed to be the center of a circle of given radius; then a Geometry will be returned representing the MBR for this circle</td></tr>"); 2512 + html += 2513 + wxT 2514 + ("<tr><td bgcolor=\"#fffff0\">MbrMinX( geom Geometry) : Double precision</td>"); 2515 + html += 2516 + wxT 2517 + ("<td bgcolor=\"#f0fff0\">return the x-coordinate for geom MBR's leftmost side as a double precision number</td></tr>"); 2518 + html += 2519 + wxT 2520 + ("<tr><td bgcolor=\"#fffff0\">MbrMinY( geom Geometry) : Double precision</td>"); 2521 + html += 2522 + wxT 2523 + ("<td bgcolor=\"#f0fff0\">return the y-coordinate for geom MBR's lowermost side as a double precision number</td></tr>"); 2524 + html += 2525 + wxT 2526 + ("<tr><td bgcolor=\"#fffff0\">MbrMaxX( geom Geometry) : Double precision</td>"); 2527 + html += 2528 + wxT 2529 + ("<td bgcolor=\"#f0fff0\">return the x-coordinate for geom MBR's rightmost side as a double precision number</td></tr>"); 2530 + html += 2531 + wxT 2532 + ("<tr><td bgcolor=\"#fffff0\">MbrMaxY( geom Geometry) : Double precision</td>"); 2533 + html += 2534 + wxT 2535 + ("<td bgcolor=\"#f0fff0\">return the y-coordinate for geom MBR's uppermost side as a double precision number</td></tr>"); 2536 + html += 2537 + wxT 2538 + ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c31\">functions for constructing a geometric object given its Well-known Text Representation</a>"); 2539 + html += wxT ("<br><a href=\"#index\">back to index</a></td></tr>"); 2540 + html += 2541 + wxT 2542 + ("<tr><td bgcolor=\"#fffff0\">GeomFromText( wkt String [ , SRID Integer] ) : Geometry</td>"); 2543 + html += 2544 + wxT 2545 + ("<td bgcolor=\"#f0fff0\">construct a geometric object given its Well-known text Representation</td></tr>"); 2546 + html += 2547 + wxT 2548 + ("<tr><td bgcolor=\"#fffff0\">PointFromText( wktPoint String [ , SRID Integer] ) : Point</td>"); 2549 + html += wxT ("<td bgcolor=\"#f0fff0\">construct a Point</td></tr>"); 2550 + html += 2551 + wxT 2552 + ("<tr><td bgcolor=\"#fffff0\">LineFromText( wktLineString String [ , SRID Integer] ) : Linestring<hr>"); 2553 + html += 2554 + wxT 2555 + ("LineStringFromText( wktLineString String [ , SRID Integer] ) : Linestring</td>"); 2556 + html += wxT ("<td bgcolor=\"#f0fff0\">construct a Linestring</td></tr>"); 2557 + html += 2558 + wxT 2559 + ("<tr><td bgcolor=\"#fffff0\">PolyFromText( wktPolygon String [ , SRID Integer] ) : Polygon<hr>"); 2560 + html += 2561 + wxT 2562 + ("PolygonFromText( wktPolygon String [ , SRID Integer] ) : Polygon</td>"); 2563 + html += wxT ("<td bgcolor=\"#f0fff0\">construct a Polygon</td></tr>"); 2564 + html += 2565 + wxT 2566 + ("<tr><td bgcolor=\"#fffff0\">MPointFromText( wktMultiPoint String [ , SRID Integer] ) : MultiPoint<hr>"); 2567 + html += 2568 + wxT 2569 + ("MultiPointFromText( wktMultiPoint String [ , SRID Integer] ) : MultiPoint</td>"); 2570 + html += wxT ("<td bgcolor=\"#f0fff0\">construct a MultiPoint</td></tr>"); 2571 + html += 2572 + wxT 2573 + ("<tr><td bgcolor=\"#fffff0\">MLineFromText( wktMultiLineString String [ , SRID Integer] ) : MultiLinestring<hr>"); 2574 + html += 2575 + wxT 2576 + ("MultiLineStringFromText( wktMultiLineString String [ , SRID Integer] ) : MultiLinestring</td>"); 2577 + html += 2578 + wxT ("<td bgcolor=\"#f0fff0\">construct a MultiLinestring</td></tr>"); 2579 + html += 2580 + wxT 2581 + ("<tr><td bgcolor=\"#fffff0\">MPolyFromText( wktMultiPolygon String [ , SRID Integer] ) : MultiPolygon<hr>"); 2582 + html += 2583 + wxT 2584 + ("MultiPolygonFromText( wktMultiPolygon String [ , SRID Integer] ) : MultiPolygon</td>"); 2585 + html += wxT ("<td bgcolor=\"#f0fff0\">construct a MultiPolygon</td></tr>"); 2586 + html += 2587 + wxT 2588 + ("<tr><td bgcolor=\"#fffff0\">GeomCollFromText( wktGeometryCollection String [ , SRID Integer] ) : GeometryCollection<hr>"); 2589 + html += 2590 + wxT 2591 + ("GeometryCollectionFromText( wktGeometryCollection String [ , SRID Integer] ) : GeometryCollection</td>"); 2592 + html += 2593 + wxT 2594 + ("<td bgcolor=\"#f0fff0\">construct a GeometryCollection</td></tr>"); 2595 + html += 2596 + wxT 2597 + ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c32\">functions for constructing a geometric object given its Well-known Binary Representation</a>"); 2598 + html += wxT ("<br><a href=\"#index\">back to index</a></td></tr>"); 2599 + html += 2600 + wxT 2601 + ("<tr><td bgcolor=\"#fffff0\">GeomFromWKB( wkbGeometry Binary [ , SRID Integer] ) : Geometry</td>"); 2602 + html += 2603 + wxT 2604 + ("<td bgcolor=\"#f0fff0\">construct a geometric object given its Well-known binary Representation</td></tr>"); 2605 + html += 2606 + wxT 2607 + ("<tr><td bgcolor=\"#fffff0\">PointFromWKB( wkbPoint Binary [ , SRID Integer] ) : Point</td>"); 2608 + html += wxT ("<td bgcolor=\"#f0fff0\">construct a Point</td></tr>"); 2609 + html += 2610 + wxT 2611 + ("<tr><td bgcolor=\"#fffff0\">LineFromWKB( wkbLineString Binary [ , SRID Integer] ) : Linestring<hr>"); 2612 + html += 2613 + wxT 2614 + ("LineStringFromText( wkbLineString Binary [ , SRID Integer] ) : Linestring</td>"); 2615 + html += wxT ("<td bgcolor=\"#f0fff0\">construct a Linestring</td></tr>"); 2616 + html += 2617 + wxT 2618 + ("<tr><td bgcolor=\"#fffff0\">PolyFromWKB( wkbPolygon Binary [ , SRID Integer] ) : Polygon<br>"); 2619 + html += 2620 + wxT 2621 + ("PolygonFromWKB( wkbPolygon Binary [ , SRID Integer] ) : Polygon</td>"); 2622 + html += wxT ("<td bgcolor=\"#f0fff0\">construct a Polygon</td></tr>"); 2623 + html += 2624 + wxT 2625 + ("<tr><td bgcolor=\"#fffff0\">MPointFromWKB( wkbMultiPoint Binary [ , SRID Integer] ) : MultiPoint<hr>"); 2626 + html += 2627 + wxT 2628 + ("MultiPointFromWKB( wkbMultiPoint Binary [ , SRID Integer] ) : MultiPoint</td>"); 2629 + html += wxT ("<td bgcolor=\"#f0fff0\">construct a MultiPoint</td></tr>"); 2630 + html += 2631 + wxT 2632 + ("<tr><td bgcolor=\"#fffff0\">MLineFromWKB( wkbMultiLineString Binary [ , SRID Integer] ) : MultiLinestring<hr>"); 2633 + html += 2634 + wxT 2635 + ("MultiLineStringFromWKB( wkbMultiLineString Binary [ , SRID Integer] ) : MultiLinestring</td>"); 2636 + html += 2637 + wxT ("<td bgcolor=\"#f0fff0\">construct a MultiLinestring</td></tr>"); 2638 + html += 2639 + wxT 2640 + ("<tr><td bgcolor=\"#fffff0\">MPolyFromWKB( wkbMultiPolygon Binary [ , SRID Integer] ) : MultiPolygon<hr>"); 2641 + html += 2642 + wxT 2643 + ("MultiPolygonFromWKB( wkbMultiPolygon Binary [ , SRID Integer] ) : MultiPolygon</td>"); 2644 + html += wxT ("<td bgcolor=\"#f0fff0\">construct a MultiPolygon</td></tr>"); 2645 + html += 2646 + wxT 2647 + ("<tr><td bgcolor=\"#fffff0\">GeomCollFromWKB( wkbGeometryCollection Binary [ , SRID Integer] ) : GeometryCollection<hr>"); 2648 + html += 2649 + wxT 2650 + ("GeometryCollectionFromWKB( wkbGeometryCollection Binary [ , SRID Integer] ) : GeometryCollection</td>"); 2651 + html += 2652 + wxT 2653 + ("<td bgcolor=\"#f0fff0\">construct a GeometryCollection</td></tr>"); 2654 + html += 2655 + wxT 2656 + ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c33\">functions for obtaining the Well-known Text / Well-known Binary Representation of a geometric object</a>"); 2657 + html += wxT ("<br><a href=\"#index\">back to index</a></td></tr>"); 2658 + html += 2659 + wxT 2660 + ("<tr><td bgcolor=\"#fffff0\">AsText( geom Geometry ) : String</td><td bgcolor=\"#f0fff0\">return the Well-known Text representation</td></tr>"); 2661 + html += 2662 + wxT 2663 + ("<tr><td bgcolor=\"#fffff0\">AsBinary( geom Geometry ) : Binary</td><td bgcolor=\"#f0fff0\">return the Well-known Binary representation</td></tr>"); 2664 + html += 2665 + wxT 2666 + ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c34\">functions on type Geometry</a>"); 2667 + html += wxT ("<br><a href=\"#index\">back to index</a></td></tr>"); 2668 + html += 2669 + wxT 2670 + ("<tr><td bgcolor=\"#fffff0\">Dimension( geom Geometry ) : Integer</td>"); 2671 + html += 2672 + wxT 2673 + ("<td bgcolor=\"#f0fff0\">return the dimension of the geometric object, which is less than or equal to the dimension of the coordinate space</td></tr>"); 2674 + html += 2675 + wxT 2676 + ("<tr><td bgcolor=\"#fffff0\">GeometryType( geom Geometry ) : String</td>"); 2677 + html += 2678 + wxT 2679 + ("<td bgcolor=\"#f0fff0\">return the name of the instantiable subtype of Geometry of which this geometric object is a member, as a string</td></tr>"); 2680 + html += 2681 + wxT 2682 + ("<tr><td bgcolor=\"#fffff0\">SRID( geom Geometry ) : Integer</td>"); 2683 + html += 2684 + wxT 2685 + ("<td bgcolor=\"#f0fff0\">return the Spatial Reference System ID for this geometric object</td></tr>"); 2686 + html += 2687 + wxT 2688 + ("<tr><td bgcolor=\"#fffff0\">SetSRID( geom Geometry , SRID Integer ) : Integer</td>"); 2689 + html += 2690 + wxT 2691 + ("<td bgcolor=\"#f0fff0\">directly sets the Spatial Reference System ID for this geometric object [no reprojection is applied].<br>"); 2692 + html += 2693 + wxT 2694 + ("The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a "); 2695 + html += wxT ("function invocation on NULL arguments</td></tr>"); 2696 + html += 2697 + wxT 2698 + ("<tr><td bgcolor=\"#fffff0\">IsEmpty( geom Geometry ) : Integer</td>"); 2699 + html += 2700 + wxT 2701 + ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 2702 + html += 2703 + wxT 2704 + ("TRUE if this geometric object corresponds to the empty set</td></tr>"); 2705 + html += 2706 + wxT 2707 + ("<tr><td bgcolor=\"#fffff0\">IsSimple( geom Geometry ) : Integer</td>"); 2708 + html += 2709 + wxT 2710 + ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 2711 + html += 2712 + wxT 2713 + ("TRUE if this geometric object is simple, as defined in the Geometry Model</td></tr>"); 2714 + html += 2715 + wxT 2716 + ("<tr><td bgcolor=\"#fffff0\">IsValid( geom Geometry ) : Integer</td>"); 2717 + html += 2718 + wxT 2719 + ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 2720 + html += 2721 + wxT 2722 + ("TRUE if this geometric object does not contains any topological error</td></tr>"); 2723 + html += 2724 + wxT 2725 + ("<tr><td bgcolor=\"#fffff0\">Boundary( geom Geometry ) : Geometry</td>"); 2726 + html += 2727 + wxT 2728 + ("<td bgcolor=\"#f0fff0\">return a geometric object that is the combinatorial boundary of g as defined in the Geometry Model</td></tr>"); 2729 + html += 2730 + wxT 2731 + ("<tr><td bgcolor=\"#fffff0\">Envelope( geom Geometry ) : Geometry</td>"); 2732 + html += 2733 + wxT 2734 + ("<td bgcolor=\"#f0fff0\">return the rectangle bounding g as a Polygon. "); 2735 + html += 2736 + wxT 2737 + ("The Polygon is defined by the corner points of the bounding box [(MINX, MINY),(MAXX, MINY), (MAXX, MAXY), (MINX, MAXY), (MINX, MINY)].</td></tr>"); 2738 + html += 2739 + wxT 2740 + ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c35\">functions on type Point</a>"); 2741 + html += wxT ("<br><a href=\"#index\">back to index</a></td></tr>"); 2742 + html += 2743 + wxT 2744 + ("<tr><td bgcolor=\"#fffff0\">X( pt Point ) : Double precision</td><td bgcolor=\"#f0fff0\">return the x-coordinate of Point p as a double precision number</td></tr>"); 2745 + html += 2746 + wxT 2747 + ("<tr><td bgcolor=\"#fffff0\">Y( pt Point ) : Double precision</td><td bgcolor=\"#f0fff0\">return the y-coordinate of Point p as a double precision number</td></tr>"); 2748 + html += 2749 + wxT 2750 + ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\">functions on type Curve [Linestring or Ring]</td></tr>"); 2751 + html += 2752 + wxT 2753 + ("<tr><td bgcolor=\"#fffff0\">StartPoint( c Curve ) : Point</td><td bgcolor=\"#f0fff0\">return a Point containing the first Point of c</td></tr>"); 2754 + html += 2755 + wxT 2756 + ("<tr><td bgcolor=\"#fffff0\">EndPoint( c Curve ) : Point</td><td bgcolor=\"#f0fff0\">return a Point containing the last Point of c</td></tr>"); 2757 + html += 2758 + wxT 2759 + ("<tr><td bgcolor=\"#fffff0\">NumPoints( line LineString ) : Integer</td><td bgcolor=\"#f0fff0\">return the number of Points in the LineString</td></tr>"); 2760 + html += 2761 + wxT 2762 + ("<tr><td bgcolor=\"#fffff0\">PointN( line LineString , n Integer ) : Point</td><td bgcolor=\"#f0fff0\">return a Point containing Point n of line</td></tr>"); 2763 + html += 2764 + wxT 2765 + ("<tr><td bgcolor=\"#fffff0\">GLength( c Curve ) : Double precision</td><td bgcolor=\"#f0fff0\">return the length of c</td></tr>"); 2766 + html += 2767 + wxT ("<tr><td bgcolor=\"#fffff0\">IsClosed( c Curve ) : Integer</td>"); 2768 + html += 2769 + wxT 2770 + ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments<br>"); 2771 + html += 2772 + wxT 2773 + ("return TRUE if c is closed, i.e., if StartPoint(c) = EndPoint(c)</td></tr>"); 2774 + html += 2775 + wxT ("<tr><td bgcolor=\"#fffff0\">IsRing( c Curve ) : Integer</td>"); 2776 + html += 2777 + wxT 2778 + ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments<br>"); 2779 + html += 2780 + wxT 2781 + ("return TRUE if c is a ring, i.e., if c is closed and simple. A simple Curve does not pass through the same Point more than once.</td></tr>"); 2782 + html += 2783 + wxT 2784 + ("<tr><td bgcolor=\"#fffff0\">Simplify( c Curve , tolerance Double precision ) : Curve</td>"); 2785 + html += 2786 + wxT 2787 + ("<td bgcolor=\"#f0fff0\">return a geometric object representing a simplified version of c applying the Douglas-Peukert algorithm with given tolerance</td></tr>"); 2788 + html += 2789 + wxT 2790 + ("<tr><td bgcolor=\"#fffff0\">SimplifyPreserveTopology( c Curve , tolerance Double precision ) : Curve</td>"); 2791 + html += 2792 + wxT 2793 + ("<td bgcolor=\"#f0fff0\">return a geometric object representing a simplified version of c "); 2794 + html += 2795 + wxT 2796 + ("applying the Douglas-Peukert algorithm with given tolerance and respecting topology</td></tr>"); 2797 + html += 2798 + wxT 2799 + ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c36\">functions on type Surface [Polygon or Ring]</a>"); 2800 + html += wxT ("<br><a href=\"#index\">back to index</a></td></tr>"); 2801 + html += 2802 + wxT 2803 + ("<tr><td bgcolor=\"#fffff0\">Centroid( s Surface ) : Point</td><td bgcolor=\"#f0fff0\">return the centroid of s, which may lie outside s</td></tr>"); 2804 + html += 2805 + wxT 2806 + ("<tr><td bgcolor=\"#fffff0\">PointOnSurface( s Surface ) : Point</td><td bgcolor=\"#f0fff0\">return a Point guaranteed to lie on the Surface</td></tr>"); 2807 + html += 2808 + wxT 2809 + ("<tr><td bgcolor=\"#fffff0\">Area( s Surface ) : Double precision</td><td bgcolor=\"#f0fff0\">return the area of s</td></tr>"); 2810 + html += 2811 + wxT 2812 + ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c37\">functions on type Polygon</a>"); 2813 + html += wxT ("<br><a href=\"#index\">back to index</a></td></tr>"); 2814 + html += 2815 + wxT 2816 + ("<tr><td bgcolor=\"#fffff0\">ExteriorRing( polyg Polygon ) : LineString</td><td bgcolor=\"#f0fff0\">return the exteriorRing of p</td></tr>"); 2817 + html += 2818 + wxT 2819 + ("<tr><td bgcolor=\"#fffff0\">NumInteriorRing( polyg Polygon ) : Integer<hr>NumInteriorRings( polyg Polygon ) : Integer</td>"); 2820 + html += 2821 + wxT 2822 + ("<td bgcolor=\"#f0fff0\">return the number of interiorRings</td></tr>"); 2823 + html += 2824 + wxT 2825 + ("<tr><td bgcolor=\"#fffff0\">InteriorRingN( polyg Polygon , n Integer ) : LineString</td>"); 2826 + html += 2827 + wxT 2828 + ("<td bgcolor=\"#f0fff0\">return the nth interiorRing. The order of Rings is not geometrically significant.</td></tr>"); 2829 + html += 2830 + wxT 2831 + ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c38\">functions on type GeomCollection</a>"); 2832 + html += wxT ("<br><a href=\"#index\">back to index</a></td></tr>"); 2833 + html += 2834 + wxT 2835 + ("<tr><td bgcolor=\"#fffff0\">NumGeometries( geom GeomCollection ) : Integer</td><td bgcolor=\"#f0fff0\">return the number of geometries</td></tr>"); 2836 + html += 2837 + wxT 2838 + ("<tr><td bgcolor=\"#fffff0\">GeometryN( geom GeomCollection , n Integer ) : Geometry</td>"); 2839 + html += 2840 + wxT 2841 + ("<td bgcolor=\"#f0fff0\">return the nth geometric object in the collection. The order of the elements in the collection is not geometrically significant.</td></tr>"); 2842 + html += 2843 + wxT 2844 + ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c39\">functions testing approximative spatial relationships via MBRs</a>"); 2845 + html += wxT ("<br><a href=\"#index\">back to index</a></td></tr>"); 2846 + html += 2847 + wxT 2848 + ("<tr><td bgcolor=\"#fffff0\">MbrEqual( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 2849 + html += 2850 + wxT 2851 + ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 2852 + html += wxT ("TRUE if g1 and g2 have equal MBRs</td></tr>"); 2853 + html += 2854 + wxT 2855 + ("<tr><td bgcolor=\"#fffff0\">MbrDisjoint( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 2856 + html += 2857 + wxT 2858 + ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 2859 + html += 2860 + wxT 2861 + ("TRUE if the intersection of g1 and g2 MBRs is the empty set</td></tr>"); 2862 + html += 2863 + wxT 2864 + ("<tr><td bgcolor=\"#fffff0\">MbrTouches( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 2865 + html += 2866 + wxT 2867 + ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 2868 + html += 2869 + wxT 2870 + ("TRUE if the only Points in common between g1 and g2 MBRs lie in the union of the boundaries of g1 and g2</td></tr>"); 2871 + html += 2872 + wxT 2873 + ("<tr><td bgcolor=\"#fffff0\">MbrWithin( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 2874 + html += 2875 + wxT 2876 + ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 2877 + html += wxT ("TRUE if g1 MBR is completely contained in g2 MBR</td></tr>"); 2878 + html += 2879 + wxT 2880 + ("<tr><td bgcolor=\"#fffff0\">MbrOverlaps( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 2881 + html += 2882 + wxT 2883 + ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 2884 + html += 2885 + wxT 2886 + ("TRUE if the intersection of g1 and g2 MBRs results in a value of the same dimension as g1 and g2 that is different from both g1 and g2</td></tr>"); 2887 + html += 2888 + wxT 2889 + ("<tr><td bgcolor=\"#fffff0\">MbrIntersects( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 2890 + html += 2891 + wxT 2892 + ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments<br>"); 2893 + html += 2894 + wxT 2895 + ("convenience predicate: TRUE if the intersection of g1 and g2 MBRs is not empty</td></tr>"); 2896 + html += 2897 + wxT 2898 + ("<tr><td bgcolor=\"#fffff0\">MbrContains( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 2899 + html += 2900 + wxT 2901 + ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments<br>"); 2902 + html += 2903 + wxT 2904 + ("convenience predicate: TRUE if g2 MBR is completely contained in g1 MBR</td></tr>"); 2905 + html += 2906 + wxT 2907 + ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c40\">functions testing spatial relationships</a>"); 2908 + html += wxT ("<br><a href=\"#index\">back to index</a></td></tr>"); 2909 + html += 2910 + wxT 2911 + ("<tr><td bgcolor=\"#fffff0\">Equals( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 2912 + html += 2913 + wxT 2914 + ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 2915 + html += wxT ("TRUE if g1 and g2 are equal</td></tr>"); 2916 + html += 2917 + wxT 2918 + ("<tr><td bgcolor=\"#fffff0\">Disjoint( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 2919 + html += 2920 + wxT 2921 + ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 2922 + html += 2923 + wxT 2924 + ("TRUE if the intersection of g1 and g2 is the empty set</td></tr>"); 2925 + html += 2926 + wxT 2927 + ("<tr><td bgcolor=\"#fffff0\">Touches( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 2928 + html += 2929 + wxT 2930 + ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 2931 + html += 2932 + wxT 2933 + ("TRUE if the only Points in common between g1 and g2 lie in the union of the boundaries of g1 and g2</td></tr>"); 2934 + html += 2935 + wxT 2936 + ("<tr><td bgcolor=\"#fffff0\">Within( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 2937 + html += 2938 + wxT 2939 + ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 2940 + html += wxT ("TRUE if g1 is completely contained in g2</td></tr>"); 2941 + html += 2942 + wxT 2943 + ("<tr><td bgcolor=\"#fffff0\">Overlaps( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 2944 + html += 2945 + wxT 2946 + ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 2947 + html += 2948 + wxT 2949 + ("TRUE if the intersection of g1 and g2 results in a value of the same dimension as g1 and g2 that is different from both g1 and g2</td></tr>"); 2950 + html += 2951 + wxT 2952 + ("<tr><td bgcolor=\"#fffff0\">Crosses( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 2953 + html += 2954 + wxT 2955 + ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 2956 + html += 2957 + wxT 2958 + ("TRUE if the intersection of g1 and g2 results in a value whose dimension is less than the maximum dimension of g1 and g2 "); 2959 + html += 2960 + wxT 2961 + ("and the intersection value includes Points interior to both g1 and g2, and the intersection value is not equal to either g1 or g2</td></tr>"); 2962 + html += 2963 + wxT 2964 + ("<tr><td bgcolor=\"#fffff0\">Intersects( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 2965 + html += 2966 + wxT 2967 + ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments<br>"); 2968 + html += 2969 + wxT 2970 + ("convenience predicate: TRUE if the intersection of g1 and g2 is not empty</td></tr>"); 2971 + html += 2972 + wxT 2973 + ("<tr><td bgcolor=\"#fffff0\">Contains( geom1 Geometry , geom2 Geometry ) : Integer</td>"); 2974 + html += 2975 + wxT 2976 + ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments<br>"); 2977 + html += 2978 + wxT 2979 + ("convenience predicate: TRUE if g2 is completely contained in g1</td></tr>"); 2980 + html += 2981 + wxT 2982 + ("<tr><td bgcolor=\"#fffff0\">Relate( geom1 Geometry , geom2 Geometry , patternMatrix String ) : Integer</td>"); 2983 + html += 2984 + wxT 2985 + ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.<br>"); 2986 + html += 2987 + wxT 2988 + ("return TRUE if the spatial relationship specified by the patternMatrix holds</td></tr>"); 2989 + html += 2990 + wxT 2991 + ("<tr><td bgcolor=\"#fffff0\">Distance( geom1 Geometry , geom2 Geometry ) : Double precision</td>"); 2992 + html += 2993 + wxT 2994 + ("<td bgcolor=\"#f0fff0\">return the distance between geom1 and geom2</td></tr>"); 2995 + html += 2996 + wxT 2997 + ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c41\">functions implementing spatial operators</a>"); 2998 + html += wxT ("<br><a href=\"#index\">back to index</a></td></tr>"); 2999 + html += 3000 + wxT 3001 + ("<tr><td bgcolor=\"#fffff0\">Intersection( geom1 Geometry , geom2 Geometry ) : Geometry</td>"); 3002 + html += 3003 + wxT 3004 + ("<td bgcolor=\"#f0fff0\">return a geometric object that is the intersection of geometric objects geom1 and geom2</td></tr>"); 3005 + html += 3006 + wxT 3007 + ("<tr><td bgcolor=\"#fffff0\">Difference( geom1 Geometry , geom2 Geometry ) : Geometry</td>"); 3008 + html += 3009 + wxT 3010 + ("<td bgcolor=\"#f0fff0\">return a geometric object that is the closure of the set difference of geom1 and geom2</td></tr>"); 3011 + html += 3012 + wxT 3013 + ("<tr><td bgcolor=\"#fffff0\">GUnion( geom1 Geometry , geom2 Geometry ) : Geometry</td>"); 3014 + html += 3015 + wxT 3016 + ("<td bgcolor=\"#f0fff0\">return a geometric object that is the set union of geom1 and geom2</td></tr>"); 3017 + html += 3018 + wxT 3019 + ("<tr><td bgcolor=\"#fffff0\">SymDifference( geom1 Geometry , geom2 Geometry ) : Geometry</td>"); 3020 + html += 3021 + wxT 3022 + ("<td bgcolor=\"#f0fff0\">return a geometric object that is the closure of the set symmetric difference of geom1 and geom2 (logical XOR of space)</td></tr>"); 3023 + html += 3024 + wxT 3025 + ("<tr><td bgcolor=\"#fffff0\">Buffer( geom Geometry , dist Double precision ) : Geometry</td>"); 3026 + html += 3027 + wxT 3028 + ("<td bgcolor=\"#f0fff0\">return a geometric object defined by buffering a distance d around geom, "); 3029 + html += 3030 + wxT 3031 + ("where dist is in the distance units for the Spatial Reference of geom</td></tr>"); 3032 + html += 3033 + wxT 3034 + ("<tr><td bgcolor=\"#fffff0\">ConvexHull( geom Geometry ) : Geometry</td>"); 3035 + html += 3036 + wxT 3037 + ("<td bgcolor=\"#f0fff0\">return a geometric object that is the convex hull of geom</td></tr>"); 3038 + html += 3039 + wxT 3040 + ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c42\">functions for coordinate transformations</a>"); 3041 + html += wxT ("<br><a href=\"#index\">back to index</a></td></tr>"); 3042 + html += 3043 + wxT 3044 + ("<tr><td bgcolor=\"#fffff0\">Transform( geom Geometry , newSRID Integer ) : Geometry</td>"); 3045 + html += 3046 + wxT 3047 + ("<td bgcolor=\"#f0fff0\">return a geometric object obtained by reprojecting coordinates into the Reference System identified by newSRID</td></tr>"); 3048 + html += 3049 + wxT 3050 + ("<tr><td bgcolor=\"#fffff0\">ShiftCoords( geom Geometry , shiftX Double precision , shiftY Double precision ) : Geometry<hr>"); 3051 + html += 3052 + wxT 3053 + ("ShiftCoordinates( geom Geometry , shiftX Double precision , shiftY Double precision ) : Geometry</td>"); 3054 + html += 3055 + wxT 3056 + ("<td bgcolor=\"#f0fff0\">return a geometric object obtained by translating coordinates according to shiftX and shiftY values</td></tr>"); 3057 + html += 3058 + wxT 3059 + ("<tr><td bgcolor=\"#fffff0\">ScaleCoords( geom Geometry , scaleX Double precision [ , scaleY Double precision ] ) : Geometry<hr>"); 3060 + html += 3061 + wxT 3062 + ("ScaleCoordinates( geom Geometry , scaleX Double precision [ , scaleY Double precision ] ) : Geometry</td>"); 3063 + html += 3064 + wxT 3065 + ("<td bgcolor=\"#f0fff0\">return a geometric object obtained by scaling coordinates according to scaleX and scaleY values<br>"); 3066 + html += 3067 + wxT 3068 + ("if only one scale factor is specified, then an isotropic scaling occurs [i.e. the same scale factor is applied to both axis]"); 3069 + html += 3070 + wxT 3071 + ("otherwise an anisotropic scaling occurs [i.e. each axis is scaled according to its own scale factor]</td></tr>"); 3072 + html += 3073 + wxT 3074 + ("<tr><td bgcolor=\"#fffff0\">RotateCoords( geom Geometry , angleInDegrees Double precision ) : Geometry<hr>"); 3075 + html += 3076 + wxT 3077 + ("RotateCoordinates( geom Geometry , angleInDegrees Double precision ) : Geometry</td>"); 3078 + html += 3079 + wxT 3080 + ("<td bgcolor=\"#f0fff0\">return a geometric object obtained by rotating coordinates according to angleInDegrees value</td></tr>"); 3081 + html += 3082 + wxT 3083 + ("<tr><td bgcolor=\"#fffff0\">ReflectCoords( geom Geometry , xAxis Integer , yAxis Integer ) : Geometry<hr>"); 3084 + html += 3085 + wxT 3086 + ("ReflectCoordinates( geom Geometry , xAxis Integer , yAxis Integer ) : Geometry</td>"); 3087 + html += 3088 + wxT 3089 + ("<td bgcolor=\"#f0fff0\">return a geometric object obtained by reflecting coordinates according to xAxis and yAxis switches<br>"); 3090 + html += 3091 + wxT 3092 + ("i.e. if xAxis is 0 (FALSE), then x-coordinates remains untouched; otherwise x-coordinates will be reflected</td></tr>"); 3093 + html += 3094 + wxT 3095 + ("<tr><td bgcolor=\"#fffff0\">SwapCoords( geom Geometry ) : Geometry<hr>SwapCoordinates( geom Geometry ) : Geometry</td>"); 3096 + html += 3097 + wxT 3098 + ("<td bgcolor=\"#f0fff0\">return a geometric object obtained by swapping x- and y-coordinates</td></tr>"); 3099 + html += 3100 + wxT 3101 + ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c43\">functions for Spatial-MetaData and Spatial-Index handling</a>"); 3102 + html += wxT ("<br><a href=\"#index\">back to index</a></td></tr>"); 3103 + html += 3104 + wxT 3105 + ("<tr><td bgcolor=\"#fffff0\">InitSpatialMetaData( void ) : Integer</td>"); 3106 + html += 3107 + wxT 3108 + ("<td bgcolor=\"#f0fff0\">Creates the geometry_columns and spatial_ref_sys metadata tables"); 3109 + html += 3110 + wxT 3111 + ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE<br>"); 3112 + html += 3113 + wxT 3114 + ("direct invocation of these function is discouraged; you have to run the init_spatialite.sql "); 3115 + html += 3116 + wxT 3117 + ("script in order to fully initialize the Spatial MetaData tables</td></tr>"); 3118 + html += 3119 + wxT 3120 + ("<tr><td bgcolor=\"#fffff0\">AddGeometryColumn( table String , column String , srid Integer , geom_type String , dimension Integer ) : Integer</td>"); 3121 + html += 3122 + wxT 3123 + ("<td bgcolor=\"#f0fff0\">Creates a new geometry column updating the Spatial Metadata tables and creating any required trigger in order to enforce constraints<br>"); 3124 + html += 3125 + wxT 3126 + ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>"); 3127 + html += 3128 + wxT 3129 + ("<tr><td bgcolor=\"#fffff0\">RecoverGeometryColumn( table String , column String , srid Integer , geom_type String , dimension Integer ) : Integer</td>"); 3130 + html += 3131 + wxT 3132 + ("<td bgcolor=\"#f0fff0\">Validates an existing ordinary column in order to possibly transform it in a real geometry column, "); 3133 + html += 3134 + wxT 3135 + ("thus updating the Spatial Metadata tables and creating any required trigger in order to enforce constraints<br>"); 3136 + html += 3137 + wxT 3138 + ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>"); 3139 + html += 3140 + wxT 3141 + ("<tr><td bgcolor=\"#fffff0\">DiscardGeometryColumn( table String , column String ) : Integer</td>"); 3142 + html += 3143 + wxT 3144 + ("<td bgcolor=\"#f0fff0\">Removes a geometry column from Spatial MetaData tables and drops any related trigger<br>"); 3145 + html += 3146 + wxT 3147 + ("the column itself still continues to exist untouched as an ordinary, unconstrained column<br>"); 3148 + html += 3149 + wxT 3150 + ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>"); 3151 + html += 3152 + wxT 3153 + ("<tr><td bgcolor=\"#fffff0\">CreateSpatialIndex( table String , column String ) : Integer</td>"); 3154 + html += 3155 + wxT 3156 + ("<td bgcolor=\"#f0fff0\">Builds an RTree Spatial Index on a geometry column, "); 3157 + html += 3158 + wxT 3159 + ("creating any required trigger required in order to enforce full data coherency between the main table and Spatial Index<br>"); 3160 + html += 3161 + wxT 3162 + ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>"); 3163 + html += 3164 + wxT 3165 + ("<tr><td bgcolor=\"#fffff0\">DisableSpatialIndex( table String , column String ) : Integer</td>"); 3166 + html += 3167 + wxT 3168 + ("<td bgcolor=\"#f0fff0\">Disables an RTree Spatial Index, removing any related trigger<br>"); 3169 + html += 3170 + wxT 3171 + ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>"); 3172 + html += wxT ("</table>"); 3173 + html += wxT ("<a href=\"#index\">back to index</a>"); 3174 + html += wxT ("</body>"); 3175 + html += wxT ("</html>"); 4527 3176 }
Changes to Makefile-MinGW.
1 1 # SandroFurieri (c) 2008 2 2 # Makefile ( Mingw & wxwidgets) for spatialite-GUI 3 3 4 -SRC = Main.cpp TableTree.cpp QueryView.cpp ResultSetView.cpp BlobExplorer.cpp \ 5 - Dialogs.cpp Shapefiles.cpp Network.cpp Exif.cpp TextCsv.cpp Objects.cpp \ 6 - MetadataInit.cpp win_resource/resource.rc 7 -OBJ = Main.o TableTree.o QueryView.o ResultSetView.o BlobExplorer.o \ 8 - Dialogs.o Shapefiles.o Network.o Exif.o TextCsv.o Objects.o \ 9 - MetadataInit.o win_resource/resource.o 4 +SRC = Main.cpp TableTree.cpp QueryView.cpp BlobExplorer.cpp Dialogs.cpp \ 5 + Shapefiles.cpp TextCsv.cpp Objects.cpp win_resource/resource.rc 6 +OBJ = Main.o TableTree.o QueryView.o BlobExplorer.o Dialogs.o Shapefiles.o \ 7 + TextCsv.o Objects.o win_resource/resource.o 10 8 EXE = ./bin/spatialite-gui.exe 11 9 INCLUDE = Classdef.h 12 10 13 11 # Define default flags: 14 12 CXXFLAGS = $(shell wx-config --cxxflags) 15 13 LIB = $(shell wx-config --libs) 16 -EXTRAFLAGS = -O3 -march=i686 -Wall -Wundef -Wno-ctor-dtor-privacy \ 17 - -fno-strict-aliasing -I/usr/local/include -D_LARGE_FILE=1 \ 18 - -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1 14 +EXTRAFLAGS = -O3 -march=i686 -Wall -Wundef -Wno-ctor-dtor-privacy -fno-strict-aliasing -I/usr/local/include 19 15 REZ = $(shell wx-config --rescomp) 20 -EXTRALIBS = /usr/local/lib/libspatialite.a /usr/local/lib/libgeos_c.a \ 21 - /usr/local/lib/libiconv.a /usr/local/lib/libgeos.a \ 22 - /usr/local/lib/libproj.a 16 +EXTRALIBS = /usr/local/lib/libspatialite.a /usr/local/lib/libsqlite3.a \ 17 + /usr/local/lib/libgeos_c.a /usr/local/lib/libiconv.a \ 18 + /usr/local/lib/libgeos.a /usr/local/lib/libproj.a 23 19 24 20 all: $(EXE) 25 21 26 -$(EXE): $(OBJ) $(EXTRALIBS) 22 +$(EXE): $(OBJ) 27 23 $(CXX) $(OBJ) -o $(EXE) $(LIB) $(EXTRALIBS) 28 24 strip --strip-all $(EXE) 29 25 30 26 clean : 31 27 $(RM) $(OBJ) $(EXE) 32 28 33 29 Main.o: Main.cpp $(INCLUDE) ................................................................................ 35 31 36 32 TableTree.o: TableTree.cpp $(INCLUDE) 37 33 $(CXX) -c TableTree.cpp $(CXXFLAGS) $(EXTRAFLAGS) 38 34 39 35 QueryView.o: QueryView.cpp $(INCLUDE) 40 36 $(CXX) -c QueryView.cpp $(CXXFLAGS) $(EXTRAFLAGS) 41 37 42 -ResultSetView.o: ResultSetView.cpp $(INCLUDE) 43 - $(CXX) -c ResultSetView.cpp $(CXXFLAGS) $(EXTRAFLAGS) 44 - 45 38 BlobExplorer.o: BlobExplorer.cpp $(INCLUDE) 46 39 $(CXX) -c BlobExplorer.cpp $(CXXFLAGS) $(EXTRAFLAGS) 47 40 48 41 Dialogs.o: Dialogs.cpp $(INCLUDE) 49 42 $(CXX) -c Dialogs.cpp $(CXXFLAGS) $(EXTRAFLAGS) 50 43 51 44 Shapefiles.o: Shapefiles.cpp $(INCLUDE) 52 45 $(CXX) -c Shapefiles.cpp $(CXXFLAGS) $(EXTRAFLAGS) 53 46 54 -Network.o: Network.cpp $(INCLUDE) 55 - $(CXX) -c Network.cpp $(CXXFLAGS) $(EXTRAFLAGS) 56 - 57 -Exif.o: Exif.cpp $(INCLUDE) 58 - $(CXX) -c Exif.cpp $(CXXFLAGS) $(EXTRAFLAGS) 59 - 60 47 TextCsv.o: TextCsv.cpp $(INCLUDE) 61 48 $(CXX) -c TextCsv.cpp $(CXXFLAGS) $(EXTRAFLAGS) 62 49 63 50 Objects.o: Objects.cpp $(INCLUDE) 64 51 $(CXX) -c Objects.cpp $(CXXFLAGS) $(EXTRAFLAGS) 65 - 66 -MetadataInit.o: MetadataInit.cpp $(INCLUDE) 67 - $(CXX) -c MetadataInit.cpp $(CXXFLAGS) $(EXTRAFLAGS) 68 52 69 53 win_resource/resource.o: win_resource/resource.rc 70 54 $(REZ) -i win_resource/resource.rc -o win_resource/resource.o
Changes to Makefile-OsX.
1 1 # SandroFurieri (c) 2008 2 2 # Makefile ( wxwidgets MacOsX) for spatialite-GUI 3 3 4 -SRC = Main.cpp TableTree.cpp QueryView.cpp ResultSetView.cpp BlobExplorer.cpp \ 5 - Dialogs.cpp Shapefiles.cpp Network.cpp Exif.cpp TextCsv.cpp Objects.cpp \ 6 - MetadataInit.cpp 7 -OBJ = Main.o TableTree.o QueryView.o ResultSetView.o BlobExplorer.o Dialogs.o \ 8 - Shapefiles.o Network.o Exif.o TextCsv.o Objects.o MetadataInit.o 4 +SRC = Main.cpp TableTree.cpp QueryView.cpp BlobExplorer.cpp Dialogs.cpp \ 5 + Shapefiles.cpp TextCsv.cpp Objects.cpp 6 +OBJ = Main.o TableTree.o QueryView.o BlobExplorer.o Dialogs.o Shapefiles.o \ 7 + TextCsv.o Objects.o 9 8 EXE = ./bin/spatialite-gui 10 9 INCLUDE = Classdef.h 11 10 12 11 # Define default flags: 13 12 CXXFLAGS = $(shell wx-config --cxxflags) 14 13 LIB = $(shell wx-config --libs) 15 -EXTRAFLAGS = -O3 -Wall -Wundef -Wno-ctor-dtor-privacy \ 16 - -fno-strict-aliasing -I/usr/local/include -D_LARGE_FILE=1 \ 17 - -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1 18 -EXTRALIBS = /usr/local/lib/libspatialite.a /usr/local/lib/libgeos_c.a \ 19 - /usr/local/lib/libgeos.a /usr/local/lib/libproj.a 20 -EXTRALIB2 = -liconv 14 +EXTRAFLAGS = -O3 -Wall -Wundef -Wno-ctor-dtor-privacy -fno-strict-aliasing -I/usr/local/include 15 +EXTRALIBS = /usr/local/lib/libspatialite.a /usr/local/lib/libsqlite3.a \ 16 + /usr/local/lib/libgeos_c.a /usr/local/lib/libgeos.a \ 17 + /usr/local/lib/libproj.a \ 18 + -liconv 21 19 22 20 all: $(EXE) 23 21 24 -$(EXE): $(OBJ) $(EXTRALIBS) 25 - $(CXX) $(OBJ) -o $(EXE) $(LIB) $(EXTRALIBS) $(EXTRALIB2) 22 +$(EXE): $(OBJ) 23 + $(CXX) $(OBJ) -o $(EXE) $(LIB) $(EXTRALIBS) 26 24 strip $(EXE) 27 25 28 26 clean : 29 27 $(RM) $(OBJ) $(EXE) 30 28 31 29 Main.o: Main.cpp $(INCLUDE) 32 30 $(CXX) -c Main.cpp $(CXXFLAGS) $(EXTRAFLAGS) ................................................................................ 33 31 34 32 TableTree.o: TableTree.cpp $(INCLUDE) 35 33 $(CXX) -c TableTree.cpp $(CXXFLAGS) $(EXTRAFLAGS) 36 34 37 35 QueryView.o: QueryView.cpp $(INCLUDE) 38 36 $(CXX) -c QueryView.cpp $(CXXFLAGS) $(EXTRAFLAGS) 39 37 40 -ResultSetView.o: ResultSetView.cpp $(INCLUDE) 41 - $(CXX) -c ResultSetView.cpp $(CXXFLAGS) $(EXTRAFLAGS) 42 - 43 38 BlobExplorer.o: BlobExplorer.cpp $(INCLUDE) 44 39 $(CXX) -c BlobExplorer.cpp $(CXXFLAGS) $(EXTRAFLAGS) 45 40 46 41 Dialogs.o: Dialogs.cpp $(INCLUDE) 47 42 $(CXX) -c Dialogs.cpp $(CXXFLAGS) $(EXTRAFLAGS) 48 43 49 44 Shapefiles.o: Shapefiles.cpp $(INCLUDE) 50 45 $(CXX) -c Shapefiles.cpp $(CXXFLAGS) $(EXTRAFLAGS) 51 46 52 -Network.o: Network.cpp $(INCLUDE) 53 - $(CXX) -c Network.cpp $(CXXFLAGS) $(EXTRAFLAGS) 54 - 55 -Exif.o: Exif.cpp $(INCLUDE) 56 - $(CXX) -c Exif.cpp $(CXXFLAGS) $(EXTRAFLAGS) 57 - 58 47 TextCsv.o: TextCsv.cpp $(INCLUDE) 59 48 $(CXX) -c TextCsv.cpp $(CXXFLAGS) $(EXTRAFLAGS) 60 49 61 50 Objects.o: Objects.cpp $(INCLUDE) 62 51 $(CXX) -c Objects.cpp $(CXXFLAGS) $(EXTRAFLAGS) 63 - 64 -MetadataInit.o: MetadataInit.cpp $(INCLUDE) 65 - $(CXX) -c MetadataInit.cpp $(CXXFLAGS) $(EXTRAFLAGS) 66 52
Changes to Makefile-linux32.
1 1 # SandroFurieri (c) 2008 2 2 # Makefile ( wxwidgets GTK) for spatialite-GUI 3 3 4 -SRC = Main.cpp TableTree.cpp QueryView.cpp ResultSetView.cpp BlobExplorer.cpp \ 5 - Dialogs.cpp Shapefiles.cpp Network.cpp Exif.cpp TextCsv.cpp Objects.cpp \ 6 - MetadataInit.cpp 7 -OBJ = Main.o TableTree.o QueryView.o ResultSetView.o BlobExplorer.o Dialogs.o \ 8 - Shapefiles.o Network.o Exif.o TextCsv.o Objects.o MetadataInit.o 4 +SRC = Main.cpp TableTree.cpp QueryView.cpp BlobExplorer.cpp Dialogs.cpp \ 5 + Shapefiles.cpp TextCsv.cpp Objects.cpp 6 +OBJ = Main.o TableTree.o QueryView.o BlobExplorer.o Dialogs.o Shapefiles.o \ 7 + TextCsv.o Objects.o 9 8 EXE = ./bin/spatialite-gui 10 9 INCLUDE = Classdef.h 11 10 12 11 # Define default flags: 13 12 CXXFLAGS = $(shell wx-config --cxxflags) 14 13 LIB = $(shell wx-config --libs) 15 -EXTRAFLAGS = -O3 -march=i686 -Wall -Wundef -Wno-ctor-dtor-privacy \ 16 - -fno-strict-aliasing -I/usr/local/include -D_LARGE_FILE=1 \ 17 - -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1 18 -EXTRALIBS = /usr/local/lib/libspatialite.a /usr/local/lib/libgeos_c.a \ 19 - /usr/local/lib/libgeos.a /usr/local/lib/libproj.a 14 +EXTRAFLAGS = -O3 -march=i686 -Wall -Wundef -Wno-ctor-dtor-privacy -fno-strict-aliasing -I/usr/local/include 15 +EXTRALIBS = /usr/local/lib/libspatialite.a /usr/local/lib/libsqlite3.a \ 16 + /usr/local/lib/libgeos_c.a /usr/local/lib/libgeos.a \ 17 + /usr/local/lib/libproj.a 20 18 21 19 all: $(EXE) 22 20 23 -$(EXE): $(OBJ) $(EXTRALIBS) 21 +$(EXE): $(OBJ) 24 22 $(CXX) $(OBJ) -o $(EXE) $(LIB) $(EXTRALIBS) 25 23 strip --strip-all $(EXE) 26 24 27 25 clean : 28 26 $(RM) $(OBJ) $(EXE) 29 27 30 28 Main.o: Main.cpp $(INCLUDE) ................................................................................ 32 30 33 31 TableTree.o: TableTree.cpp $(INCLUDE) 34 32 $(CXX) -c TableTree.cpp $(CXXFLAGS) $(EXTRAFLAGS) 35 33 36 34 QueryView.o: QueryView.cpp $(INCLUDE) 37 35 $(CXX) -c QueryView.cpp $(CXXFLAGS) $(EXTRAFLAGS) 38 36 39 -ResultSetView.o: ResultSetView.cpp $(INCLUDE) 40 - $(CXX) -c ResultSetView.cpp $(CXXFLAGS) $(EXTRAFLAGS) 41 - 42 37 BlobExplorer.o: BlobExplorer.cpp $(INCLUDE) 43 38 $(CXX) -c BlobExplorer.cpp $(CXXFLAGS) $(EXTRAFLAGS) 44 39 45 40 Dialogs.o: Dialogs.cpp $(INCLUDE) 46 41 $(CXX) -c Dialogs.cpp $(CXXFLAGS) $(EXTRAFLAGS) 47 42 48 43 Shapefiles.o: Shapefiles.cpp $(INCLUDE) 49 44 $(CXX) -c Shapefiles.cpp $(CXXFLAGS) $(EXTRAFLAGS) 50 45 51 -Network.o: Network.cpp $(INCLUDE) 52 - $(CXX) -c Network.cpp $(CXXFLAGS) $(EXTRAFLAGS) 53 - 54 -Exif.o: Exif.cpp $(INCLUDE) 55 - $(CXX) -c Exif.cpp $(CXXFLAGS) $(EXTRAFLAGS) 56 - 57 46 TextCsv.o: TextCsv.cpp $(INCLUDE) 58 47 $(CXX) -c TextCsv.cpp $(CXXFLAGS) $(EXTRAFLAGS) 59 48 60 49 Objects.o: Objects.cpp $(INCLUDE) 61 50 $(CXX) -c Objects.cpp $(CXXFLAGS) $(EXTRAFLAGS) 62 - 63 -MetadataInit.o: MetadataInit.cpp $(INCLUDE) 64 - $(CXX) -c MetadataInit.cpp $(CXXFLAGS) $(EXTRAFLAGS) 51 +
Deleted MetadataInit.cpp.
more than 10,000 changes
Deleted Network.cpp.
1 -/* 2 -/ Network.cpp 3 -/ methods related to Network building 4 -/ 5 -/ version 1.2, 2008 October 9 6 -/ 7 -/ Author: Sandro Furieri a-furieri@lqt.it 8 -/ 9 -/ Copyright (C) 2008 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 -#include <float.h> 28 - 29 -#define MAX_BLOCK 1048576 30 - 31 -void 32 - MyFrame::BuildNetwork(wxString & table, wxString & from, wxString & to, 33 - wxString & geometry, bool cost_length, wxString & cost, 34 - bool bidirectional, bool one_way, 35 - wxString & one_way_from_to, wxString & one_way_to_from) 36 -{ 37 -// 38 -// trying to build a Network 39 -// 40 - int ret; 41 - sqlite3_stmt *stmt; 42 - Network *p_graph = NULL; 43 - wxString sql; 44 - char xsql[2048]; 45 - char **results; 46 - int n_rows; 47 - int n_columns; 48 - int i; 49 - char *errMsg = NULL; 50 - char *col_name; 51 - int type; 52 - bool ok_from_column = false; 53 - bool ok_to_column = false; 54 - bool ok_cost_column = false; 55 - bool ok_geom_column = false; 56 - bool ok_oneway_tofrom = false; 57 - bool ok_oneway_fromto = false; 58 - bool from_null = false; 59 - bool from_int = false; 60 - bool from_double = false; 61 - bool from_text = false; 62 - bool from_blob = false; 63 - bool to_null = false; 64 - bool to_int = false; 65 - bool to_double = false; 66 - bool to_text = false; 67 - bool to_blob = false; 68 - bool cost_null = false; 69 - bool cost_int = false; 70 - bool cost_double = false; 71 - bool cost_text = false; 72 - bool cost_blob = false; 73 - bool tofrom_null = false; 74 - bool tofrom_int = false; 75 - bool tofrom_double = false; 76 - bool tofrom_text = false; 77 - bool tofrom_blob = false; 78 - bool fromto_null = false; 79 - bool fromto_int = false; 80 - bool fromto_double = false; 81 - bool fromto_text = false; 82 - bool fromto_blob = false; 83 - bool geom_null = false; 84 - bool geom_not_linestring = false; 85 - int col_n; 86 - int cost_n; 87 - int fromto_n = 0; 88 - int tofrom_n = 0; 89 - int rowid; 90 - int id_from = -1; 91 - int id_to = -1; 92 - char code_from[1024]; 93 - char code_to[1024]; 94 - double node_from_x; 95 - double node_from_y; 96 - double node_to_x; 97 - double node_to_y; 98 - double cost_val; 99 - int fromto; 100 - int tofrom; 101 - wxString endMsg; 102 - wxString msg; 103 - bool wr; 104 - ::wxBeginBusyCursor(); 105 -// checking for table existence 106 - sql = wxT("SELECT tbl_name FROM sqlite_master WHERE tbl_name LIKE '"); 107 - sql += table; 108 - sql += wxT("' AND type = 'table'"); 109 - strcpy(xsql, sql.ToUTF8()); 110 - ret = 111 - sqlite3_get_table(SqliteHandle, xsql, &results, &n_rows, &n_columns, 112 - &errMsg); 113 - if (ret != SQLITE_OK) 114 - { 115 -// some error occurred 116 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 117 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 118 - sqlite3_free(errMsg); 119 - goto abort; 120 - } 121 - if (n_rows == 0) 122 - { 123 - // required table does not exists 124 - wxMessageBox(wxT("ERROR: table \"") + table + wxT("\" does not exists"), 125 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 126 - goto abort; 127 - } else 128 - sqlite3_free_table(results); 129 -// checking for columns existence 130 - sql = wxT("PRAGMA table_info(\""); 131 - sql += table; 132 - sql += wxT("\")"); 133 - strcpy(xsql, sql.ToUTF8()); 134 - ret = 135 - sqlite3_get_table(SqliteHandle, xsql, &results, &n_rows, &n_columns, 136 - &errMsg); 137 - if (ret != SQLITE_OK) 138 - { 139 -// some error occurred 140 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 141 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 142 - sqlite3_free(errMsg); 143 - goto abort; 144 - } 145 - if (n_rows > 1) 146 - { 147 - for (i = 1; i <= n_rows; i++) 148 - { 149 - char xcol[256]; 150 - col_name = results[(i * n_columns) + 1]; 151 - strcpy(xcol, from.ToUTF8()); 152 - if (strcasecmp(xcol, col_name) == 0) 153 - ok_from_column = true; 154 - strcpy(xcol, to.ToUTF8()); 155 - if (strcasecmp(xcol, col_name) == 0) 156 - ok_to_column = true; 157 - if (cost_length == false) 158 - { 159 - strcpy(xcol, cost.ToUTF8()); 160 - if (strcasecmp(xcol, col_name) == 0) 161 - ok_cost_column = true; 162 - } 163 - strcpy(xcol, geometry.ToUTF8()); 164 - if (strcasecmp(xcol, col_name) == 0) 165 - ok_geom_column = true; 166 - if (one_way == true) 167 - { 168 - strcpy(xcol, one_way_from_to.ToUTF8()); 169 - if (strcasecmp(xcol, col_name) == 0) 170 - ok_oneway_tofrom = true; 171 - } 172 - if (one_way == true) 173 - { 174 - strcpy(xcol, one_way_to_from.ToUTF8()); 175 - if (strcasecmp(xcol, col_name) == 0) 176 - ok_oneway_fromto = true; 177 - } 178 - } 179 - sqlite3_free_table(results); 180 - } 181 - if (ok_from_column == true && ok_to_column == true && ok_geom_column == true) 182 - ; 183 - else 184 - goto abort; 185 - if (cost_length == false && ok_cost_column == false) 186 - goto abort; 187 - if (one_way == true && ok_oneway_tofrom == false) 188 - goto abort; 189 - if (one_way == true && ok_oneway_fromto == false) 190 - goto abort; 191 -// checking column types 192 - p_graph = new Network(); 193 - sql = 194 - wxT("SELECT \"") + from + wxT("\", \"") + to + wxT("\", GeometryType(\"") + 195 - geometry + wxT("\")"); 196 - col_n = 3; 197 - if (cost_length == false) 198 - { 199 - sql += wxT(", \"") + cost + wxT("\""); 200 - cost_n = col_n; 201 - col_n++; 202 - } 203 - if (one_way == true) 204 - { 205 - sql += wxT(", \"") + one_way_to_from + wxT("\""); 206 - tofrom_n = col_n; 207 - col_n++; 208 - sql += wxT(", \"") + one_way_from_to + wxT("\""); 209 - fromto_n = col_n; 210 - col_n++; 211 - } 212 - sql += wxT(" FROM \"") + table; 213 - sql += wxT("\""); 214 - strcpy(xsql, sql.ToUTF8()); 215 - ret = sqlite3_prepare_v2(SqliteHandle, xsql, strlen(xsql), &stmt, NULL); 216 - if (ret != SQLITE_OK) 217 - { 218 - wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)); 219 - wxMessageBox(wxT("SQL error: ") + err, wxT("spatialite-gui"), 220 - wxOK | wxICON_ERROR, this); 221 - goto abort; 222 - } 223 - n_columns = sqlite3_column_count(stmt); 224 - while (1) 225 - { 226 - ret = sqlite3_step(stmt); 227 - if (ret == SQLITE_DONE) 228 - break; 229 - if (ret == SQLITE_ROW) 230 - { 231 - // the NodeFrom type 232 - type = sqlite3_column_type(stmt, 0); 233 - if (type == SQLITE_NULL) 234 - from_null = true; 235 - if (type == SQLITE_INTEGER) 236 - { 237 - from_int = true; 238 - id_from = sqlite3_column_int(stmt, 0); 239 - p_graph->InsertNode(id_from); 240 - } 241 - if (type == SQLITE_FLOAT) 242 - from_double = true; 243 - if (type == SQLITE_TEXT) 244 - { 245 - from_text = true; 246 - strcpy(code_from, (char *) sqlite3_column_text(stmt, 0)); 247 - p_graph->InsertNode(code_from); 248 - } 249 - if (type == SQLITE_BLOB) 250 - from_blob = true; 251 - // the NodeTo type 252 - type = sqlite3_column_type(stmt, 1); 253 - if (type == SQLITE_NULL) 254 - to_null = true; 255 - if (type == SQLITE_INTEGER) 256 - { 257 - to_int = true; 258 - id_to = sqlite3_column_int(stmt, 1); 259 - p_graph->InsertNode(id_to); 260 - } 261 - if (type == SQLITE_FLOAT) 262 - to_double = true; 263 - if (type == SQLITE_TEXT) 264 - { 265 - to_text = true; 266 - strcpy(code_to, (char *) sqlite3_column_text(stmt, 1)); 267 - p_graph->InsertNode(code_to); 268 - } 269 - if (type == SQLITE_BLOB) 270 - to_blob = true; 271 - // the Geometry type 272 - type = sqlite3_column_type(stmt, 2); 273 - if (type == SQLITE_NULL) 274 - geom_null = true; 275 - else if (strcmp("LINESTRING", (char *) sqlite3_column_text(stmt, 2)) 276 - != 0) 277 - geom_not_linestring = true; 278 - if (cost_length == false) 279 - { 280 - // the Cost type 281 - type = sqlite3_column_type(stmt, 3); 282 - if (type == SQLITE_NULL) 283 - cost_null = true; 284 - if (type == SQLITE_INTEGER) 285 - cost_int = true; 286 - if (type == SQLITE_FLOAT) 287 - cost_double = true; 288 - if (type == SQLITE_TEXT) 289 - cost_text = true; 290 - if (type == SQLITE_BLOB) 291 - cost_blob = true; 292 - } 293 - if (one_way == true) 294 - { 295 - // the FromTo type 296 - type = sqlite3_column_type(stmt, 4); 297 - if (type == SQLITE_NULL) 298 - fromto_null = true; 299 - if (type == SQLITE_INTEGER) 300 - fromto_int = true; 301 - if (type == SQLITE_FLOAT) 302 - fromto_double = true; 303 - if (type == SQLITE_TEXT) 304 - fromto_text = true; 305 - if (type == SQLITE_BLOB) 306 - fromto_blob = true; 307 - // the ToFrom type 308 - type = sqlite3_column_type(stmt, 5); 309 - if (type == SQLITE_NULL) 310 - tofrom_null = true; 311 - if (type == SQLITE_INTEGER) 312 - tofrom_int = true; 313 - if (type == SQLITE_FLOAT) 314 - tofrom_double = true; 315 - if (type == SQLITE_TEXT) 316 - tofrom_text = true; 317 - if (type == SQLITE_BLOB) 318 - tofrom_blob = true; 319 - } 320 - } else 321 - { 322 - wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)); 323 - wxMessageBox(wxT("sqlite3_step error: ") + err, wxT("spatialite-gui"), 324 - wxOK | wxICON_ERROR, this); 325 - sqlite3_finalize(stmt); 326 - goto abort; 327 - } 328 - } 329 - sqlite3_finalize(stmt); 330 - ret = 1; 331 - if (from_null == true) 332 - ret = 0; 333 - if (from_blob == true) 334 - ret = 0; 335 - if (from_double == true) 336 - ret = 0; 337 - if (to_null == true) 338 - ret = 0; 339 - if (to_blob == true) 340 - ret = 0; 341 - if (to_double == true) 342 - ret = 0; 343 - if (geom_null == true) 344 - ret = 0; 345 - if (geom_not_linestring == true) 346 - ret = 0; 347 - if (cost_length == false) 348 - { 349 - if (cost_null == true) 350 - ret = 0; 351 - if (cost_blob == true) 352 - ret = 0; 353 - if (cost_text == true) 354 - ret = 0; 355 - } 356 - if (one_way == true) 357 - { 358 - if (fromto_null == true) 359 - ret = 0; 360 - if (fromto_blob == true) 361 - ret = 0; 362 - if (fromto_text == true) 363 - ret = 0; 364 - if (fromto_double == true) 365 - ret = 0; 366 - if (tofrom_null == true) 367 - ret = 0; 368 - if (tofrom_blob == true) 369 - ret = 0; 370 - if (tofrom_text == true) 371 - ret = 0; 372 - if (tofrom_double == true) 373 - ret = 0; 374 - } 375 - if (!ret) 376 - goto abort; 377 - if (from_int == true && to_int == true) 378 - { 379 - // each node is identified by an INTEGER id 380 - p_graph->SetNodeCode(false); 381 - } else if (from_text == true && to_text == true) 382 - { 383 - // each node is identified by a TEXT code 384 - p_graph->SetNodeCode(true); 385 - } else 386 - goto abort; 387 - p_graph->InitNodes(); 388 -// checking topologic consistency 389 - sql = wxT("SELECT ROWID, \"") + from + wxT("\", \"") + to + wxT("\", "); 390 - sql += 391 - wxT("X(StartPoint(\"") + geometry + wxT("\")), Y(StartPoint(\"") + 392 - geometry + wxT("\")), "); 393 - sql += 394 - wxT("X(EndPoint(\"") + geometry + wxT("\")), Y(EndPoint(\"") + geometry + 395 - wxT("\"))"); 396 - if (cost_length == false) 397 - sql += wxT(", ") + cost; 398 - else 399 - sql += wxT(", GLength(\"") + geometry + wxT("\")"); 400 - col_n = 8; 401 - if (one_way == true) 402 - { 403 - sql += wxT(", \"") + one_way_to_from + wxT("\""); 404 - tofrom_n = col_n; 405 - col_n++; 406 - sql += wxT(", \"") + one_way_from_to + wxT("\""); 407 - fromto_n = col_n; 408 - col_n++; 409 - } 410 - sql += wxT(" FROM \"") + table + wxT("\""); 411 - strcpy(xsql, sql.ToUTF8()); 412 - ret = sqlite3_prepare_v2(SqliteHandle, xsql, strlen(xsql), &stmt, NULL); 413 - if (ret != SQLITE_OK) 414 - { 415 - wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)); 416 - wxMessageBox(wxT("SQL error: ") + err, wxT("spatialite-gui"), 417 - wxOK | wxICON_ERROR, this); 418 - goto abort; 419 - } 420 - n_columns = sqlite3_column_count(stmt); 421 - while (1) 422 - { 423 - ret = sqlite3_step(stmt); 424 - if (ret == SQLITE_DONE) 425 - break; 426 - if (ret == SQLITE_ROW) 427 - { 428 - fromto = true; 429 - tofrom = true; 430 - if (p_graph->IsNodeCode() == true) 431 - { 432 - id_from = -1; 433 - id_to = -1; 434 - } else 435 - { 436 - *code_from = '\0'; 437 - *code_to = '\0'; 438 - } 439 - // fetching the ROWID 440 - rowid = sqlite3_column_int(stmt, 0); 441 - // fetching the NodeFrom value 442 - if (p_graph->IsNodeCode() == true) 443 - strcpy(code_from, (char *) sqlite3_column_text(stmt, 1)); 444 - else 445 - id_from = sqlite3_column_int(stmt, 1); 446 - // fetching the NodeTo value 447 - if (p_graph->IsNodeCode() == true) 448 - strcpy(code_to, (char *) sqlite3_column_text(stmt, 2)); 449 - else 450 - id_to = sqlite3_column_int(stmt, 2); 451 - // fetching the NodeFromX value 452 - node_from_x = sqlite3_column_double(stmt, 3); 453 - // fetching the NodeFromY value 454 - node_from_y = sqlite3_column_double(stmt, 4); 455 - // fetching the NodeFromX value 456 - node_to_x = sqlite3_column_double(stmt, 5); 457 - // fetching the NodeFromY value 458 - node_to_y = sqlite3_column_double(stmt, 6); 459 - // fetching the Cost value 460 - cost_val = sqlite3_column_double(stmt, 7); 461 - if (one_way == true) 462 - { 463 - // fetching the OneWay-FromTo value 464 - fromto = sqlite3_column_int(stmt, fromto_n); 465 - // fetching the OneWay-ToFrom value 466 - tofrom = sqlite3_column_int(stmt, tofrom_n); 467 - } 468 - if (cost_val <= 0.0) 469 - p_graph->SetError(); 470 - if (bidirectional == true) 471 - { 472 - if (fromto) 473 - { 474 - if (p_graph->IsNodeCode() == true) 475 - p_graph->AddArc(rowid, code_from, code_to, node_from_x, 476 - node_from_y, node_to_x, node_to_y, 477 - cost_val); 478 - else 479 - p_graph->AddArc(rowid, id_from, id_to, node_from_x, 480 - node_from_y, node_to_x, node_to_y, 481 - cost_val); 482 - } 483 - if (tofrom) 484 - { 485 - if (p_graph->IsNodeCode() == true) 486 - p_graph->AddArc(rowid, code_to, code_from, node_to_x, 487 - node_to_y, node_from_x, node_from_y, 488 - cost_val); 489 - else 490 - p_graph->AddArc(rowid, id_to, id_from, node_to_x, node_to_y, 491 - node_from_x, node_from_y, cost_val); 492 - } 493 - } else 494 - { 495 - if (p_graph->IsNodeCode() == true) 496 - p_graph->AddArc(rowid, code_from, code_to, node_from_x, 497 - node_from_y, node_to_x, node_to_y, cost_val); 498 - else 499 - p_graph->AddArc(rowid, id_from, id_to, node_from_x, node_from_y, 500 - node_to_x, node_to_y, cost_val); 501 - } 502 - if (p_graph->IsError() == true) 503 - { 504 - sqlite3_finalize(stmt); 505 - goto abort; 506 - } 507 - } else 508 - { 509 - wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)); 510 - wxMessageBox(wxT("sqlite3_step error: ") + err, wxT("spatialite-gui"), 511 - wxOK | wxICON_ERROR, this); 512 - sqlite3_finalize(stmt); 513 - goto abort; 514 - } 515 - } 516 - sqlite3_finalize(stmt); 517 - ::wxEndBusyCursor(); 518 - wr = CreateNetwork(p_graph, table, from, to, geometry); 519 - if (wr == true) 520 - { 521 - endMsg = 522 - wxT("OK: VirtualNetwork table '") + table + 523 - wxT("_net' successfully created"); 524 - wxMessageBox(endMsg, wxT("spatialite-gui"), wxOK | wxICON_INFORMATION, 525 - this); 526 - } else 527 - { 528 - endMsg = 529 - wxT("DB ERROR: VirtualNetwork table '") + table + 530 - wxT("_net' was not created"); 531 - wxMessageBox(endMsg, wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 532 - } 533 - if (p_graph) 534 - delete p_graph; 535 - InitTableTree(); 536 - return; 537 -abort: 538 - ::wxEndBusyCursor(); 539 - msg = 540 - wxT 541 - ("It's impossible to build a Network using the given configuration;\nsome fatal error occurred\n\n"); 542 - msg += wxT("please note: using the 'spatialite_network' command-line tool\n"); 543 - msg += 544 - wxT 545 - ("you can obtain a full detailed report explaining causes for this failure"); 546 - wxMessageBox(msg, wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 547 - if (p_graph) 548 - delete p_graph; 549 -} 550 - 551 -void 552 - MyFrame::OutputNetNode(unsigned char *auxbuf, int *size, int ind, 553 - bool node_code, int max_node_length, NetNode * pN, 554 - int endian_arch) 555 -{ 556 -// 557 -// exporting a Node into NETWORK-DATA 558 -// 559 - int n_star; 560 - int i; 561 - NetArc **arc_array; 562 - NetArc *pA; 563 - unsigned char *out = auxbuf; 564 - *out++ = GAIA_NET_NODE; 565 - gaiaExport32(out, ind, 1, endian_arch); // the Node internal index 566 - out += 4; 567 - if (node_code) 568 - { 569 - // Nodes are identified by a TEXT Code 570 - memset(out, '\0', max_node_length); 571 - strcpy((char *) out, pN->GetCode().ToUTF8()); 572 - out += max_node_length; 573 - } else 574 - { 575 - // Nodes are identified by an INTEGER Id 576 - gaiaExport32(out, pN->GetId(), 1, endian_arch); // the Node ID 577 - out += 4; 578 - } 579 - arc_array = pN->PrepareOutcomings(&n_star); 580 - gaiaExport16(out, n_star, 1, endian_arch); // # of outcoming arcs 581 - out += 2; 582 - for (i = 0; i < n_star; i++) 583 - { 584 - // exporting the outcoming arcs 585 - pA = *(arc_array + i); 586 - *out++ = GAIA_NET_ARC; 587 - gaiaExport32(out, pA->GetRowId(), 1, endian_arch); // the Arc rowid 588 - out += 4; 589 - gaiaExport32(out, pA->GetTo()->GetInternalIndex(), 1, endian_arch); // the ToNode internal index 590 - out += 4; 591 - gaiaExport64(out, pA->GetCost(), 1, endian_arch); // the Arc Cost 592 - out += 8; 593 - *out++ = GAIA_NET_END; 594 - } 595 - if (arc_array) 596 - delete[]arc_array; 597 - *out++ = GAIA_NET_END; 598 - *size = out - auxbuf; 599 -} 600 - 601 -bool MyFrame::CreateNetwork(Network * p_graph, wxString & table, 602 - wxString & from, wxString & to, wxString & geometry) 603 -{ 604 -// 605 -// creates the NETWORK-DATA table 606 -// 607 - int ret; 608 - wxString sql; 609 - char xsql[1024]; 610 - char *errMsg = NULL; 611 - unsigned char *auxbuf = new unsigned char[MAX_BLOCK]; 612 - unsigned char *buf = new unsigned char[MAX_BLOCK]; 613 - unsigned char *out; 614 - sqlite3_stmt *stmt; 615 - int i; 616 - int size; 617 - int endian_arch = gaiaEndianArch(); 618 - NetNode *pN; 619 - int pk = 0; 620 - int nodes_cnt = 0; 621 - int len; 622 - bool net_data_exists = false; 623 - bool net_exists = false; 624 - bool delete_existing = false; 625 - wxString data_table = table + wxT("_net_data"); 626 - wxString net_table = table + wxT("_net"); 627 - net_data_exists = TableAlreadyExists(data_table); 628 - net_exists = TableAlreadyExists(net_table); 629 - if (net_data_exists == true || net_exists == true) 630 - { 631 - // asking permission to overwrite existing tables 632 - wxString msg; 633 - if (net_data_exists == true) 634 - msg += wxT("A table named '") + data_table + wxT("' already exists\n"); 635 - if (net_exists == true) 636 - msg += wxT("A table named '") + net_table + wxT("' already exists\n"); 637 - msg += wxT("\nDo you allow DROPping existing table(s) ?"); 638 - wxMessageDialog confirm(this, msg, wxT("Confirm overwrite"), 639 - wxYES_NO | wxICON_QUESTION); 640 - ret = confirm.ShowModal(); 641 - if (ret == wxID_YES) 642 - delete_existing = true; 643 - } 644 - ::wxBeginBusyCursor(); 645 - for (i = 0; i < p_graph->GetNumNodes(); i++) 646 - { 647 - // setting the internal index to each Node 648 - pN = p_graph->GetSortedNode(i); 649 - pN->SetInternalIndex(i); 650 - } 651 -// starts a transaction 652 - ret = sqlite3_exec(SqliteHandle, "BEGIN", NULL, NULL, &errMsg); 653 - if (ret != SQLITE_OK) 654 - { 655 - wxMessageBox(wxT("BEGIN error: ") + wxString::FromUTF8(errMsg), 656 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 657 - sqlite3_free(errMsg); 658 - goto abort; 659 - } 660 - if (delete_existing == true) 661 - { 662 - sql = wxT("DROP TABLE IF EXISTS \"") + net_table + wxT("\""); 663 - strcpy(xsql, sql.ToUTF8()); 664 - ret = sqlite3_exec(SqliteHandle, xsql, NULL, NULL, &errMsg); 665 - if (ret != SQLITE_OK) 666 - { 667 - wxMessageBox(wxT("DROP TABLE error: ") + wxString::FromUTF8(errMsg), 668 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 669 - sqlite3_free(errMsg); 670 - goto abort; 671 - } 672 - sql = wxT("DROP TABLE IF EXISTS \"") + data_table + wxT("\""); 673 - strcpy(xsql, sql.ToUTF8()); 674 - ret = sqlite3_exec(SqliteHandle, xsql, NULL, NULL, &errMsg); 675 - if (ret != SQLITE_OK) 676 - { 677 - wxMessageBox(wxT("DROP TABLE error: ") + wxString::FromUTF8(errMsg), 678 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 679 - sqlite3_free(errMsg); 680 - goto abort; 681 - } 682 - } 683 -// creating the NETWORK-DATA table 684 - sql = wxT("CREATE TABLE \"") + data_table; 685 - sql += wxT("\" (\"Id\" INTEGER PRIMARY KEY, \"NetworkData\" BLOB NOT NULL)"); 686 - strcpy(xsql, sql.ToUTF8()); 687 - ret = sqlite3_exec(SqliteHandle, xsql, NULL, NULL, &errMsg); 688 - if (ret != SQLITE_OK) 689 - { 690 - wxMessageBox(wxT("CREATE TABLE error: ") + wxString::FromUTF8(errMsg), 691 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 692 - sqlite3_free(errMsg); 693 - goto abort; 694 - } 695 -// preparing the SQL statement 696 - sql = 697 - wxT("INSERT INTO \"") + data_table + 698 - wxT("\" (\"Id\", \"NetworkData\") VALUES (?, ?)"); 699 - strcpy(xsql, sql.ToUTF8()); 700 - ret = sqlite3_prepare_v2(SqliteHandle, xsql, strlen(xsql), &stmt, NULL); 701 - if (ret != SQLITE_OK) 702 - { 703 - wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)); 704 - wxMessageBox(wxT("INSERT error: ") + err, wxT("spatialite-gui"), 705 - wxOK | wxICON_ERROR, this); 706 - goto abort; 707 - } 708 - if (pk == 0) 709 - { 710 - // preparing the HEADER block 711 - out = buf; 712 - *out++ = GAIA_NET_START; 713 - *out++ = GAIA_NET_HEADER; 714 - gaiaExport32(out, p_graph->GetNumNodes(), 1, endian_arch); // how many Nodes are there 715 - out += 4; 716 - if (p_graph->IsNodeCode() == true) 717 - *out++ = GAIA_NET_CODE; // Nodes are identified by a TEXT code 718 - else 719 - *out++ = GAIA_NET_ID; // Nodes are identified by an INTEGER id 720 - if (p_graph->IsNodeCode() == true) 721 - *out++ = p_graph->GetMaxCodeLength(); // max TEXT code length 722 - else 723 - *out++ = 0x00; 724 - // inserting the main Table name 725 - *out++ = GAIA_NET_TABLE; 726 - len = table.Len() + 1; 727 - gaiaExport16(out, len, 1, endian_arch); // the Table Name length, including last '\0' 728 - out += 2; 729 - memset(out, '\0', len); 730 - strcpy((char *) out, table.ToUTF8()); 731 - out += len; 732 - // inserting the NodeFrom column name 733 - *out++ = GAIA_NET_FROM; 734 - len = from.Len() + 1; 735 - gaiaExport16(out, len, 1, endian_arch); // the NodeFrom column Name length, including last '\0' 736 - out += 2; 737 - memset(out, '\0', len); 738 - strcpy((char *) out, from.ToUTF8()); 739 - out += len; 740 - // inserting the NodeTo column name 741 - *out++ = GAIA_NET_TO; 742 - len = to.Len() + 1; 743 - gaiaExport16(out, len, 1, endian_arch); // the NodeTo column Name length, including last '\0' 744 - out += 2; 745 - memset(out, '\0', len); 746 - strcpy((char *) out, to.ToUTF8()); 747 - out += len; 748 - // inserting the Geometry column name 749 - *out++ = GAIA_NET_GEOM; 750 - len = geometry.Len() + 1; 751 - gaiaExport16(out, len, 1, endian_arch); // the Geometry column Name length, including last '\0' 752 - out += 2; 753 - memset(out, '\0', len); 754 - strcpy((char *) out, geometry.ToUTF8()); 755 - out += len; 756 - *out++ = GAIA_NET_END; 757 - // INSERTing the Header block 758 - sqlite3_reset(stmt); 759 - sqlite3_clear_bindings(stmt); 760 - sqlite3_bind_int64(stmt, 1, pk); 761 - sqlite3_bind_blob(stmt, 2, buf, out - buf, SQLITE_STATIC); 762 - ret = sqlite3_step(stmt); 763 - if (ret == SQLITE_DONE || ret == SQLITE_ROW) 764 - ; 765 - else 766 - { 767 - wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)); 768 - wxMessageBox(wxT("sqlite3_step error: ") + err, wxT("spatialite-gui"), 769 - wxOK | wxICON_ERROR, this); 770 - sqlite3_finalize(stmt); 771 - goto abort; 772 - } 773 - pk++; 774 - // preparing a new block 775 - out = buf; 776 - *out++ = GAIA_NET_BLOCK; 777 - gaiaExport16(out, 0, 1, endian_arch); // how many Nodes are into this block 778 - out += 2; 779 - nodes_cnt = 0; 780 - } 781 - for (i = 0; i < p_graph->GetNumNodes(); i++) 782 - { 783 - // looping on each Node 784 - pN = p_graph->GetSortedNode(i); 785 - OutputNetNode(auxbuf, &size, i, p_graph->IsNodeCode(), 786 - p_graph->GetMaxCodeLength(), pN, endian_arch); 787 - if (size >= (MAX_BLOCK - (out - buf))) 788 - { 789 - // inserting the last block 790 - gaiaExport16(buf + 1, nodes_cnt, 1, endian_arch); // how many Nodes are into this block 791 - sqlite3_reset(stmt); 792 - sqlite3_clear_bindings(stmt); 793 - sqlite3_bind_int64(stmt, 1, pk); 794 - sqlite3_bind_blob(stmt, 2, buf, out - buf, SQLITE_STATIC); 795 - ret = sqlite3_step(stmt); 796 - if (ret == SQLITE_DONE || ret == SQLITE_ROW) 797 - ; 798 - else 799 - { 800 - wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)); 801 - wxMessageBox(wxT("sqlite3_step error: ") + err, 802 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 803 - sqlite3_finalize(stmt); 804 - goto abort; 805 - } 806 - pk++; 807 - // preparing a new block 808 - out = buf; 809 - *out++ = GAIA_NET_BLOCK; 810 - gaiaExport16(out, 0, 1, endian_arch); // how many Nodes are into this block 811 - out += 2; 812 - nodes_cnt = 0; 813 - } 814 - // inserting the current Node into the block 815 - nodes_cnt++; 816 - memcpy(out, auxbuf, size); 817 - out += size; 818 - } 819 - if (nodes_cnt) 820 - { 821 - // inserting the last block 822 - gaiaExport16(buf + 1, nodes_cnt, 1, endian_arch); // how many Nodes are into this block 823 - sqlite3_reset(stmt); 824 - sqlite3_clear_bindings(stmt); 825 - sqlite3_bind_int64(stmt, 1, pk); 826 - sqlite3_bind_blob(stmt, 2, buf, out - buf, SQLITE_STATIC); 827 - ret = sqlite3_step(stmt); 828 - if (ret == SQLITE_DONE || ret == SQLITE_ROW) 829 - ; 830 - else 831 - { 832 - wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)); 833 - wxMessageBox(wxT("sqlite3_step error: ") + err, wxT("spatialite-gui"), 834 - wxOK | wxICON_ERROR, this); 835 - sqlite3_finalize(stmt); 836 - goto abort; 837 - } 838 - } 839 - sqlite3_finalize(stmt); 840 -// creating the VirtualNetwork NET-table 841 - sql = wxT("CREATE VIRTUAL TABLE \"") + net_table; 842 - sql += wxT("\" USING VirtualNetwork("); 843 - sql += data_table + wxT(")"); 844 - strcpy(xsql, sql.ToUTF8()); 845 - ret = sqlite3_exec(SqliteHandle, xsql, NULL, NULL, &errMsg); 846 - if (ret != SQLITE_OK) 847 - { 848 - wxMessageBox(wxT("CREATE VIRTUAL TABLE error: ") + 849 - wxString::FromUTF8(errMsg), wxT("spatialite-gui"), 850 - wxOK | wxICON_ERROR, this); 851 - sqlite3_free(errMsg); 852 - goto abort; 853 - } 854 -// commits the transaction 855 - ret = sqlite3_exec(SqliteHandle, "COMMIT", NULL, NULL, &errMsg); 856 - if (ret != SQLITE_OK) 857 - { 858 - wxMessageBox(wxT("COMMIT error: ") + wxString::FromUTF8(errMsg), 859 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 860 - sqlite3_free(errMsg); 861 - goto abort; 862 - } 863 - if (buf) 864 - delete[]buf; 865 - if (auxbuf) 866 - delete[]auxbuf; 867 - ::wxEndBusyCursor(); 868 - return true; 869 -abort: 870 - ::wxEndBusyCursor(); 871 - if (buf) 872 - delete[]buf; 873 - if (auxbuf) 874 - delete[]auxbuf; 875 - return true; 876 - return false; 877 -} 878 - 879 -int cmp_prenodes_code(const void *p1, const void *p2) 880 -{ 881 -// 882 -// compares two preliminary nodes by CODE [for QSORT] 883 -// 884 - NetNodePre *pP1 = *((NetNodePre **) p1); 885 - NetNodePre *pP2 = *((NetNodePre **) p2); 886 - return pP1->GetCode().Cmp(pP2->GetCode()); 887 -} 888 - 889 -int cmp_prenodes_id(const void *p1, const void *p2) 890 -{ 891 -// 892 -// compares two preliminary nodes by ID [for QSORT] 893 -// 894 - NetNodePre *pP1 = *((NetNodePre **) p1); 895 - NetNodePre *pP2 = *((NetNodePre **) p2); 896 - return pP1->GetId() - pP2->GetId(); 897 -} 898 - 899 -int cmp_nodes2_code(const void *p1, const void *p2) 900 -{ 901 -// 902 -// compares two nodes by CODE [for BSEARCH] 903 -// 904 - NetNode *pN1 = (NetNode *) p1; 905 - NetNode *pN2 = *((NetNode **) p2); 906 - return pN1->GetCode().Cmp(pN2->GetCode()); 907 -} 908 - 909 -int cmp_nodes2_id(const void *p1, const void *p2) 910 -{ 911 -// 912 -// compares two nodes by ID [for BSEARCH] 913 -// 914 - NetNode *pN1 = (NetNode *) p1; 915 - NetNode *pN2 = *((NetNode **) p2); 916 - return pN1->GetId() - pN2->GetId(); 917 -} 918 - 919 -int cmp_nodes1_code(const void *p1, const void *p2) 920 -{ 921 -// 922 -// compares two nodes by CODE [for QSORT] 923 -// 924 - NetNode *pN1 = *((NetNode **) p1); 925 - NetNode *pN2 = *((NetNode **) p2); 926 - return pN1->GetCode().Cmp(pN2->GetCode()); 927 -} 928 - 929 -int cmp_nodes1_id(const void *p1, const void *p2) 930 -{ 931 -// 932 -// compares two nodes by ID [for QSORT ] 933 -// 934 - NetNode *pN1 = *((NetNode **) p1); 935 - NetNode *pN2 = *((NetNode **) p2); 936 - return pN1->GetId() - pN2->GetId(); 937 -} 938 - 939 -NetNodePre::NetNodePre(int id) 940 -{ 941 -// 942 -// Network Node [preliminary] constructor 943 -// 944 - Id = id; 945 - Code = wxT(""); 946 - Next = NULL; 947 -} 948 - 949 -NetNodePre::NetNodePre(const char *code) 950 -{ 951 -// 952 -// Network Node [preliminary] constructor 953 -// 954 - Id = -1; 955 - Code = wxString::FromUTF8(code); 956 - Code.Truncate(30); 957 - Next = NULL; 958 -} 959 - 960 -NetNode::NetNode(int id) 961 -{ 962 -// 963 -// Network Node [final] constructor 964 -// 965 - InternalIndex = -1; 966 - Id = id; 967 - Code = wxT(""); 968 - X = DBL_MAX; 969 - Y = DBL_MAX; 970 - First = NULL; 971 - Last = NULL; 972 - Next = NULL; 973 -} 974 - 975 -NetNode::NetNode(wxString & code) 976 -{ 977 -// 978 -// Network Node [final] constructor 979 -// 980 - InternalIndex = -1; 981 - Id = -1; 982 - Code = code; 983 - X = DBL_MAX; 984 - Y = DBL_MAX; 985 - First = NULL; 986 - Last = NULL; 987 - Next = NULL; 988 -} 989 - 990 -NetNode::~NetNode() 991 -{ 992 -// Network Node [final] destructor 993 - NetArcRef *pAR; 994 - NetArcRef *pARn; 995 - pAR = First; 996 - while (pAR) 997 - { 998 - pARn = pAR->GetNext(); 999 - delete pAR; 1000 - pAR = pARn; 1001 - } 1002 -} 1003 - 1004 -void NetNode::AddOutcoming(NetArc * pA) 1005 -{ 1006 -// 1007 -// adds an outcoming Arc to a Node 1008 -// 1009 - NetArcRef *pAR = new NetArcRef(pA); 1010 - if (!First) 1011 - First = pAR; 1012 - if (Last) 1013 - Last->SetNext(pAR); 1014 - Last = pAR; 1015 -} 1016 - 1017 -NetArc **NetNode::PrepareOutcomings(int *count) 1018 -{ 1019 -// 1020 -// preparing the outcoming arc array 1021 -// 1022 - NetArc **arc_array; 1023 - int n = 0; 1024 - int i; 1025 - bool ok; 1026 - NetArcRef *pAR; 1027 - NetArc *pA0; 1028 - NetArc *pA1; 1029 - pAR = First; 1030 - while (pAR) 1031 - { 1032 - // counting how many outcoming arcs are there 1033 - n++; 1034 - pAR = pAR->GetNext(); 1035 - } 1036 - if (!n) 1037 - { 1038 - *count = 0; 1039 - return NULL; 1040 - } 1041 - arc_array = new NetArc *[n]; 1042 - i = 0; 1043 - pAR = First; 1044 - while (pAR) 1045 - { 1046 - // populating the arcs array 1047 - *(arc_array + i++) = pAR->GetReference(); 1048 - pAR = pAR->GetNext(); 1049 - } 1050 - ok = true; 1051 - while (ok == true) 1052 - { 1053 - // bubble sorting the arcs by Cost 1054 - ok = false; 1055 - for (i = 1; i < n; i++) 1056 - { 1057 - pA0 = *(arc_array + i - 1); 1058 - pA1 = *(arc_array + i); 1059 - if (pA0->GetCost() > pA1->GetCost()) 1060 - { 1061 - // swapping the arcs 1062 - *(arc_array + i - 1) = pA1; 1063 - *(arc_array + i) = pA0; 1064 - ok = true; 1065 - } 1066 - } 1067 - } 1068 - *count = n; 1069 - return arc_array; 1070 -} 1071 - 1072 -NetArc::NetArc(int rowid, NetNode * from, NetNode * to, double cost) 1073 -{ 1074 -// 1075 -// Network Arc constructor 1076 -// 1077 - RowId = rowid; 1078 - From = from; 1079 - To = to; 1080 - Cost = cost; 1081 - Next = NULL; 1082 -} 1083 - 1084 -Network::Network() 1085 -{ 1086 -// 1087 -// Network constructor 1088 -// 1089 - FirstPre = NULL; 1090 - LastPre = NULL; 1091 - NumPreNodes = 0; 1092 - SortedPreNodes = NULL; 1093 - NumPreNodes = 0; 1094 - SortedPreNodes = NULL; 1095 - FirstArc = NULL; 1096 - LastArc = NULL; 1097 - FirstNode = NULL; 1098 - LastNode = NULL; 1099 - NumNodes = 0; 1100 - SortedNodes = NULL; 1101 - Error = false; 1102 - NodeCode = false; 1103 - MaxCodeLength = 0; 1104 -} 1105 - 1106 -Network::~Network() 1107 -{ 1108 -// 1109 -// Network destructor 1110 -// 1111 - NetArc *pA; 1112 - NetArc *pAn; 1113 - NetNode *pN; 1114 - NetNode *pNn; 1115 - CleanPreNodes(); 1116 - pA = FirstArc; 1117 - while (pA) 1118 - { 1119 - pAn = pA->GetNext(); 1120 - delete pA; 1121 - pA = pAn; 1122 - } 1123 - pN = FirstNode; 1124 - while (pN) 1125 - { 1126 - pNn = pN->GetNext(); 1127 - delete pN; 1128 - pN = pNn; 1129 - } 1130 - if (SortedNodes) 1131 - delete[]SortedNodes; 1132 -} 1133 - 1134 -void Network::CleanPreNodes() 1135 -{ 1136 -// 1137 -// cleaning up the preliminary Nodes list 1138 -// 1139 - NetNodePre *pP; 1140 - NetNodePre *pPn; 1141 - pP = FirstPre; 1142 - while (pP) 1143 - { 1144 - pPn = pP->GetNext(); 1145 - delete pP; 1146 - pP = pPn; 1147 - } 1148 - FirstPre = NULL; 1149 - LastPre = NULL; 1150 - NumPreNodes = 0; 1151 - if (SortedPreNodes) 1152 - delete[]SortedPreNodes; 1153 - SortedPreNodes = NULL; 1154 -} 1155 - 1156 -void Network::InsertNode(int id) 1157 -{ 1158 -// 1159 -// inserts a Node into the preliminary list 1160 -// 1161 - NetNodePre *pP = new NetNodePre(id); 1162 - if (!FirstPre) 1163 - FirstPre = pP; 1164 - if (LastPre) 1165 - LastPre->SetNext(pP); 1166 - LastPre = pP; 1167 -} 1168 - 1169 -void Network::InsertNode(const char *code) 1170 -{ 1171 -// 1172 -// inserts a Node into the preliminary list 1173 -// 1174 - NetNodePre *pP = new NetNodePre(code); 1175 - if (!FirstPre) 1176 - FirstPre = pP; 1177 - if (LastPre) 1178 - LastPre->SetNext(pP); 1179 - LastPre = pP; 1180 -} 1181 - 1182 -void Network::AddNode(int id) 1183 -{ 1184 -// 1185 -// inserts a Node into the final list 1186 -// 1187 - NetNode *pN = new NetNode(id); 1188 - if (!FirstNode) 1189 - FirstNode = pN; 1190 - if (LastNode) 1191 - LastNode->SetNext(pN); 1192 - LastNode = pN; 1193 -} 1194 - 1195 -void Network::AddNode(wxString & code) 1196 -{ 1197 -// 1198 -// inserts a Node into the final list 1199 -// 1200 - int len; 1201 - NetNode *pN = new NetNode(code); 1202 - len = pN->GetCode().Len() + 1; 1203 - if (len > MaxCodeLength) 1204 - MaxCodeLength = len; 1205 - if (!FirstNode) 1206 - FirstNode = pN; 1207 - if (LastNode) 1208 - LastNode->SetNext(pN); 1209 - LastNode = pN; 1210 -} 1211 - 1212 -NetNode *Network::ProcessNode(int id, double x, double y, NetNode ** pOther) 1213 -{ 1214 -// 1215 -// inserts a new node or retrieves an already defined one 1216 -// 1217 - NetNode *pN = Find(id); 1218 - *pOther = NULL; 1219 - if (pN) 1220 - { 1221 - // this Node already exists into the sorted list 1222 - if (pN->GetX() == DBL_MAX && pN->GetY() == DBL_MAX) 1223 - ; 1224 - else 1225 - { 1226 - if (pN->GetX() == x && pN->GetY() == y) 1227 - ; 1228 - else 1229 - *pOther = pN; 1230 - } 1231 - return pN; 1232 - } 1233 -// unexpected error; undefined Node 1234 - return NULL; 1235 -} 1236 - 1237 -NetNode *Network::ProcessNode(wxString & code, double x, double y, 1238 - NetNode ** pOther) 1239 -{ 1240 -// 1241 -// inserts a new node or retrieves an already defined one 1242 -// 1243 - NetNode *pN = Find(code); 1244 - *pOther = NULL; 1245 - if (pN) 1246 - { 1247 - // this Node already exists into the sorted list 1248 - if (pN->GetX() == DBL_MAX && pN->GetY() == DBL_MAX) 1249 - ; 1250 - else 1251 - { 1252 - if (pN->GetX() == x && pN->GetY() == y) 1253 - ; 1254 - else 1255 - *pOther = pN; 1256 - } 1257 - return pN; 1258 - } 1259 -// unexpected error; undefined Node 1260 - return NULL; 1261 -} 1262 - 1263 -void 1264 - Network::AddArc(int rowid, int id_from, int id_to, double node_from_x, 1265 - double node_from_y, double node_to_x, double node_to_y, 1266 - double cost) 1267 -{ 1268 -// 1269 -// inserting an arc into the memory structures 1270 -// 1271 - NetNode *pFrom; 1272 - NetNode *pTo; 1273 - NetNode *pN2; 1274 - NetArc *pA; 1275 - pFrom = ProcessNode(id_from, node_from_x, node_from_y, &pN2); 1276 - if (pN2) 1277 - Error = true; 1278 - pTo = ProcessNode(id_to, node_to_x, node_to_y, &pN2); 1279 - if (pN2) 1280 - Error = true; 1281 - if (!pFrom) 1282 - Error = true; 1283 - if (!pTo) 1284 - Error = true; 1285 - if (pFrom == pTo) 1286 - Error = true; 1287 - if (Error == true) 1288 - return; 1289 - pA = new NetArc(rowid, pFrom, pTo, cost); 1290 - if (!FirstArc) 1291 - FirstArc = pA; 1292 - if (LastArc) 1293 - LastArc->SetNext(pA); 1294 - LastArc = pA; 1295 -// updating Node connections 1296 - pFrom->AddOutcoming(pA); 1297 -} 1298 - 1299 -void 1300 - Network::AddArc(int rowid, const char *code_from, const char *code_to, 1301 - double node_from_x, double node_from_y, double node_to_x, 1302 - double node_to_y, double cost) 1303 -{ 1304 -// 1305 -// inserting an arc into the memory structures 1306 -// 1307 - NetNode *pFrom; 1308 - NetNode *pTo; 1309 - NetNode *pN2; 1310 - NetArc *pA; 1311 - wxString stCode = wxString::FromUTF8(code_from); 1312 - pFrom = ProcessNode(stCode, node_from_x, node_from_y, &pN2); 1313 - if (pN2) 1314 - Error = true; 1315 - stCode = wxString::FromUTF8(code_to); 1316 - pTo = ProcessNode(stCode, node_to_x, node_to_y, &pN2); 1317 - if (pN2) 1318 - Error = true; 1319 - if (!pFrom) 1320 - Error = true; 1321 - if (!pTo) 1322 - Error = true; 1323 - if (pFrom == pTo) 1324 - Error = true; 1325 - if (Error == true) 1326 - return; 1327 - pA = new NetArc(rowid, pFrom, pTo, cost); 1328 - if (!FirstArc) 1329 - FirstArc = pA; 1330 - if (LastArc) 1331 - LastArc->SetNext(pA); 1332 - LastArc = pA; 1333 -// updating Node connections 1334 - pFrom->AddOutcoming(pA); 1335 -} 1336 - 1337 -void Network::Sort() 1338 -{ 1339 -// 1340 -// updating the Nodes sorted list 1341 -// 1342 - int i; 1343 - NetNode *pN; 1344 - NumNodes = 0; 1345 - if (SortedNodes) 1346 - { 1347 - // we must free the already existent sorted list 1348 - delete[]SortedNodes; 1349 - } 1350 - SortedNodes = NULL; 1351 - pN = FirstNode; 1352 - while (pN) 1353 - { 1354 - NumNodes++; 1355 - pN = pN->GetNext(); 1356 - } 1357 - if (!NumNodes) 1358 - return; 1359 - SortedNodes = new NetNode *[NumNodes]; 1360 - i = 0; 1361 - pN = FirstNode; 1362 - while (pN) 1363 - { 1364 - *(SortedNodes + i++) = pN; 1365 - pN = pN->GetNext(); 1366 - } 1367 - if (NodeCode == true) 1368 - { 1369 - // Nodes are identified by a TEXT code 1370 - qsort(SortedNodes, NumNodes, sizeof(NetNode *), cmp_nodes1_code); 1371 - } else 1372 - { 1373 - // Nodes are identified by an INTEGER id 1374 - qsort(SortedNodes, NumNodes, sizeof(NetNode *), cmp_nodes1_id); 1375 - } 1376 -} 1377 - 1378 -NetNode *Network::GetSortedNode(int x) 1379 -{ 1380 -// 1381 -// return a sorted Node [by position] 1382 -// 1383 - if (x >= 0 && x < NumNodes) 1384 - return *(SortedNodes + x); 1385 - return NULL; 1386 -} 1387 - 1388 -NetNode *Network::Find(int id) 1389 -{ 1390 -// 1391 -// searching a Node into the sorted list 1392 -// 1393 - NetNode **ret; 1394 - NetNode pN(id); 1395 - if (!SortedNodes) 1396 - return NULL; 1397 -// Nodes are identified by an INTEGER id 1398 - ret = 1399 - (NetNode **) bsearch(&pN, SortedNodes, NumNodes, sizeof(NetNode *), 1400 - cmp_nodes2_id); 1401 - if (!ret) 1402 - return NULL; 1403 - return *ret; 1404 -} 1405 - 1406 -NetNode *Network::Find(wxString & code) 1407 -{ 1408 -// 1409 -// searching a Node into the sorted list 1410 -// 1411 - NetNode **ret; 1412 - NetNode pN(code); 1413 - if (!SortedNodes) 1414 - return NULL; 1415 -// Nodes are identified by a TEXT code 1416 - ret = 1417 - (NetNode **) bsearch(&pN, SortedNodes, NumNodes, sizeof(NetNode *), 1418 - cmp_nodes2_code); 1419 - if (!ret) 1420 - return NULL; 1421 - return *ret; 1422 -} 1423 - 1424 -void Network::InitNodes() 1425 -{ 1426 -// 1427 -// prepares the final Nodes list 1428 -// 1429 - int last_id; 1430 - wxString last_code; 1431 - int i; 1432 - NetNodePre *pP; 1433 - NumPreNodes = 0; 1434 -// sorting preliminary nodes 1435 - if (SortedPreNodes) 1436 - { 1437 - // we must free the already existent sorted list 1438 - delete[]SortedPreNodes; 1439 - } 1440 - SortedPreNodes = NULL; 1441 - pP = FirstPre; 1442 - while (pP) 1443 - { 1444 - NumPreNodes++; 1445 - pP = pP->GetNext(); 1446 - } 1447 - if (!NumPreNodes) 1448 - return; 1449 - SortedPreNodes = new NetNodePre *[NumPreNodes]; 1450 - i = 0; 1451 - pP = FirstPre; 1452 - while (pP) 1453 - { 1454 - *(SortedPreNodes + i++) = pP; 1455 - pP = pP->GetNext(); 1456 - } 1457 - if (NodeCode == true) 1458 - { 1459 - // Nodes are identified by a TEXT code 1460 - qsort(SortedPreNodes, NumPreNodes, sizeof(NetNodePre *), 1461 - cmp_prenodes_code); 1462 - } else 1463 - { 1464 - // Nodes are identified by an INTEGER id 1465 - qsort(SortedPreNodes, NumPreNodes, sizeof(NetNodePre *), cmp_prenodes_id); 1466 - } 1467 -// creating the final Nodes linked list 1468 - last_id = -1; 1469 - last_code = wxT(""); 1470 - for (i = 0; i < NumPreNodes; i++) 1471 - { 1472 - pP = *(SortedPreNodes + i); 1473 - if (NodeCode == true) 1474 - { 1475 - // Nodes are identified by a TEXT code 1476 - if (pP->GetCode().Cmp(last_code) != 0) 1477 - AddNode(pP->GetCode()); 1478 - } else 1479 - { 1480 - // Nodes are identified by an INTEGER id 1481 - if (pP->GetId() != last_id) 1482 - AddNode(pP->GetId()); 1483 - } 1484 - last_id = pP->GetId(); 1485 - last_code = pP->GetCode(); 1486 - } 1487 -// sorting the final Nodes list 1488 - Sort(); 1489 -// cleaning up the preliminary Nodes structs 1490 - CleanPreNodes(); 1491 -}
Changes to Objects.cpp.
1 1 /* 2 2 / Objects.cpp 3 3 / miscellaneous ancillary classes implementation 4 4 / 5 -/ version 1.2, 2008 October 9 5 +/ version 1.1, 2008 September 13 6 6 / 7 7 / Author: Sandro Furieri a-furieri@lqt.it 8 8 / 9 9 / Copyright (C) 2008 Alessandro Furieri 10 10 / 11 11 / This program is free software: you can redistribute it and/or modify 12 12 / it under the terms of the GNU General Public License as published by ................................................................................ 21 21 / You should have received a copy of the GNU General Public License 22 22 / along with this program. If not, see <http://www.gnu.org/licenses/>. 23 23 / 24 24 */ 25 25 26 26 #include "Classdef.h" 27 27 28 -MyObject::MyObject(int type, wxString & name) 28 +MyObject::MyObject (int type, wxString & name) 29 29 { 30 30 // 31 31 // constructor - TreeItemData 32 32 // 33 - Type = type; 34 - Name = name; 35 - Column = wxT(""); 33 + Type = type; 34 + Name = name; 35 + Column = wxT (""); 36 36 } 37 37 38 -MyObject::MyObject(int type, wxString & name, wxString & column) 38 +MyObject::MyObject (int type, wxString & name, wxString & column) 39 39 { 40 40 // 41 41 // constructor - TreeItemData 42 42 // 43 - Type = type; 44 - Name = name; 45 - Column = column; 43 + Type = type; 44 + Name = name; 45 + Column = column; 46 46 } 47 47 48 -void MyVariant::Copy(MyVariant * other) 48 +void 49 +MyVariant::Copy (MyVariant * other) 49 50 { 50 51 // 51 52 // transfers a BLOB value 52 53 // 53 - if (other->Type != MY_BLOB_VARIANT) 54 - return; 55 - if (!(other->Blob)) 56 - return; 57 - if (Blob) 58 - delete[]Blob; 59 - Type = MY_BLOB_VARIANT; 60 - BlobSize = other->BlobSize; 61 - Blob = other->Blob; 62 - other->Type = MY_NULL_VARIANT; 63 - other->Blob = NULL; 64 - other->BlobSize = 0; 54 + if (other->Type != MY_BLOB_VARIANT) 55 + return; 56 + if (!(other->Blob)) 57 + return; 58 + if (Blob) 59 + delete[]Blob; 60 + Type = MY_BLOB_VARIANT; 61 + BlobSize = other->BlobSize; 62 + Blob = other->Blob; 63 + other->Type = MY_NULL_VARIANT; 64 + other->Blob = NULL; 65 + other->BlobSize = 0; 65 66 } 66 67 67 -void MyVariant::Set(const unsigned char *text) 68 +void 69 +MyVariant::Set (const unsigned char *text) 68 70 { 69 71 // 70 72 // sets a String value for this Variant value 71 73 // 72 - Type = MY_TXT_VARIANT; 73 - TxtValue = wxString::FromUTF8((const char *) text); 74 + Type = MY_TXT_VARIANT; 75 + TxtValue = wxString::FromUTF8 ((const char *) text); 74 76 } 75 77 76 -void MyVariant::Set(const void *blob, int size) 78 +void 79 +MyVariant::Set (const void *blob, int size) 77 80 { 78 81 // 79 82 // sets a BLOB value for this Variant value 80 83 // 81 - if (size <= 0) 82 - return; 83 - Type = MY_BLOB_VARIANT; 84 - BlobSize = size; 85 - Blob = new unsigned char[size]; 86 - memcpy(Blob, blob, size); 84 + if (size <= 0) 85 + return; 86 + Type = MY_BLOB_VARIANT; 87 + BlobSize = size; 88 + Blob = new unsigned char[size]; 89 + memcpy (Blob, blob, size); 87 90 } 88 91 89 -void MyRowVariant::Create(int cols) 92 +void 93 +MyRowVariant::Create (int cols) 90 94 { 91 95 // 92 96 // creating the row variant 93 97 // 94 - if (ColumnArray) 95 - delete[]ColumnArray; 96 - NumCols = cols; 97 - ColumnArray = new MyVariant[NumCols]; 98 + if (ColumnArray) 99 + delete[]ColumnArray; 100 + NumCols = cols; 101 + ColumnArray = new MyVariant[NumCols]; 98 102 } 99 103 100 -void MyRowVariant::Set(int col, sqlite3_int64 value) 104 +void 105 +MyRowVariant::Set (int col, int value) 101 106 { 102 107 // 103 108 // setting an Integer value for the Nth column 104 109 // 105 - MyVariant *var; 106 - if (col < 0 || col >= NumCols) 107 - return; 108 - var = ColumnArray + col; 109 - var->Set(value); 110 + MyVariant *var; 111 + if (col < 0 || col >= NumCols) 112 + return; 113 + var = ColumnArray + col; 114 + var->Set (value); 110 115 } 111 116 112 -void MyRowVariant::Set(int col, double value) 117 +void 118 +MyRowVariant::Set (int col, double value) 113 119 { 114 120 // 115 121 // setting a Double value for the Nth column 116 122 // 117 - MyVariant *var; 118 - if (col < 0 || col >= NumCols) 119 - return; 120 - var = ColumnArray + col; 121 - var->Set(value); 123 + MyVariant *var; 124 + if (col < 0 || col >= NumCols) 125 + return; 126 + var = ColumnArray + col; 127 + var->Set (value); 122 128 } 123 129 124 -void MyRowVariant::Set(int col, const unsigned char *value) 130 +void 131 +MyRowVariant::Set (int col, const unsigned char *value) 125 132 { 126 133 // 127 134 // setting a String value for the Nth column 128 135 // 129 - MyVariant *var; 130 - if (col < 0 || col >= NumCols) 131 - return; 132 - var = ColumnArray + col; 133 - var->Set(value); 136 + MyVariant *var; 137 + if (col < 0 || col >= NumCols) 138 + return; 139 + var = ColumnArray + col; 140 + var->Set (value); 134 141 } 135 142 136 -void MyRowVariant::Set(int col, const void *blob, int size) 143 +void 144 +MyRowVariant::Set (int col, const void *blob, int size) 137 145 { 138 146 // 139 147 // setting a BLOB value for the Nth column 140 148 // 141 - MyVariant *var; 142 - if (col < 0 || col >= NumCols) 143 - return; 144 - var = ColumnArray + col; 145 - var->Set(blob, size); 149 + MyVariant *var; 150 + if (col < 0 || col >= NumCols) 151 + return; 152 + var = ColumnArray + col; 153 + var->Set (blob, size); 146 154 } 147 155 148 -MyVariant *MyRowVariant::GetColumn(int col) 156 +MyVariant * 157 +MyRowVariant::GetColumn (int col) 149 158 { 150 159 // 151 160 // returns a Column Variant Value 152 161 // 153 - MyVariant *var; 154 - if (col < 0 || col >= NumCols) 155 - return NULL; 156 - var = ColumnArray + col; 157 - return var; 162 + MyVariant *var; 163 + if (col < 0 || col >= NumCols) 164 + return NULL; 165 + var = ColumnArray + col; 166 + return var; 158 167 } 159 168 160 -MyVariantList::MyVariantList() 169 +MyVariantList::MyVariantList () 161 170 { 162 171 // 163 172 // constructor - result set container 164 173 // 165 - NumCols = 0; 166 - ColumnName = NULL; 167 - First = NULL; 168 - Last = NULL; 174 + NumCols = 0; 175 + ColumnName = NULL; 176 + First = NULL; 177 + Last = NULL; 169 178 } 170 179 171 -MyVariantList::~MyVariantList() 180 +MyVariantList::~MyVariantList () 172 181 { 173 182 // 174 183 // destructor - result set container 175 184 // 176 - MyRowVariant *el; 177 - MyRowVariant *elN; 178 - if (ColumnName) 179 - delete[]ColumnName; 180 - el = First; 181 - while (el) 182 - { 183 - elN = el->GetNext(); 184 - delete el; 185 - el = elN; 186 - } 185 + MyRowVariant *el; 186 + MyRowVariant *elN; 187 + if (ColumnName) 188 + delete[]ColumnName; 189 + el = First; 190 + while (el) 191 + { 192 + elN = el->GetNext (); 193 + delete el; 194 + el = elN; 195 + } 187 196 } 188 197 189 -int MyVariantList::GetRows() 198 +int 199 +MyVariantList::GetRows () 190 200 { 191 201 // 192 202 // counting how many rows are there 193 203 // 194 - int cnt = 0; 195 - MyRowVariant *el = First; 196 - while (el) 197 - { 198 - cnt++; 199 - el = el->GetNext(); 200 - } 201 - return cnt; 204 + int cnt = 0; 205 + MyRowVariant *el = First; 206 + while (el) 207 + { 208 + cnt++; 209 + el = el->GetNext (); 210 + } 211 + return cnt; 202 212 } 203 213 204 -MyRowVariant *MyVariantList::Add(int columns) 214 +MyRowVariant * 215 +MyVariantList::Add (int columns) 205 216 { 206 217 // 207 218 // adds a row into the result set 208 219 // 209 - if (!NumCols) 210 - { 211 - NumCols = columns; 212 - ColumnName = new wxString[NumCols]; 213 - } 214 - MyRowVariant *el = new MyRowVariant(columns); 215 - if (!First) 216 - First = el; 217 - if (Last) 218 - Last->SetNext(el); 219 - Last = el; 220 - return el; 220 + if (!NumCols) 221 + { 222 + NumCols = columns; 223 + ColumnName = new wxString[NumCols]; 224 + } 225 + MyRowVariant *el = new MyRowVariant (columns); 226 + if (!First) 227 + First = el; 228 + if (Last) 229 + Last->SetNext (el); 230 + Last = el; 231 + return el; 221 232 } 222 233 223 -void MyVariantList::SetColumnName(int col, const char *name) 234 +void 235 +MyVariantList::SetColumnName (int col, const char *name) 224 236 { 225 237 // 226 238 // storing a column name 227 239 // 228 - if (col < 0 || col >= NumCols) 229 - return; 230 - ColumnName[col] = wxString::FromUTF8(name); 240 + if (col < 0 || col >= NumCols) 241 + return; 242 + ColumnName[col] = wxString::FromUTF8 (name); 231 243 } 232 244 233 -wxString & MyVariantList::GetColumnName(int col) 245 +wxString & MyVariantList::GetColumnName (int col) 234 246 { 235 247 // 236 248 // retrieving a column name 237 249 // 238 - return ColumnName[col]; 250 + return ColumnName[col]; 239 251 } 240 252 241 -MyBlobs::MyBlobs(int rows, int cols) 253 +MyBlobs::MyBlobs (int rows, int cols) 242 254 { 243 255 // 244 256 // constructor - a BLOB matrix 245 257 // 246 - int r; 247 - MyRowVariant *rowVar; 248 - NumRows = 0; 249 - NumCols = 0; 250 - Rows = NULL; 251 - if (rows < 1 || cols < 1) 252 - return; 253 - NumRows = rows; 254 - NumCols = cols; 255 - Rows = new MyRowVariant[rows]; 256 - for (r = 0; r < rows; r++) 257 - { 258 - rowVar = Rows + r; 259 - rowVar->Create(cols); 260 - } 258 + int r; 259 + MyRowVariant *rowVar; 260 + NumRows = 0; 261 + NumCols = 0; 262 + Rows = NULL; 263 + if (rows < 1 || cols < 1) 264 + return; 265 + NumRows = rows; 266 + NumCols = cols; 267 + Rows = new MyRowVariant[rows]; 268 + for (r = 0; r < rows; r++) 269 + { 270 + rowVar = Rows + r; 271 + rowVar->Create (cols); 272 + } 261 273 } 262 274 263 -MyBlobs::~MyBlobs() 275 +MyBlobs::~MyBlobs () 264 276 { 265 277 // 266 278 // destructor - a BLOB matrix 267 279 // 268 - if (Rows) 269 - delete[]Rows; 280 + if (Rows) 281 + delete[]Rows; 270 282 } 271 283 272 -void MyBlobs::SetBlob(int row, int col, MyVariant * org) 284 +void 285 +MyBlobs::SetBlob (int row, int col, MyVariant * org) 273 286 { 274 287 // 275 288 // setting a BLOB value 276 289 // 277 - MyRowVariant *rowVar; 278 - MyVariant *dest; 279 - if (row < 0 || row >= NumRows) 280 - return; 281 - if (col < 0 || col >= NumCols) 282 - return; 283 - rowVar = Rows + row; 284 - if (!rowVar) 285 - return; 286 - dest = rowVar->GetColumn(col); 287 - if (!dest) 288 - return; 289 - dest->Copy(org); 290 + MyRowVariant *rowVar; 291 + MyVariant *dest; 292 + if (row < 0 || row >= NumRows) 293 + return; 294 + if (col < 0 || col >= NumCols) 295 + return; 296 + rowVar = Rows + row; 297 + if (!rowVar) 298 + return; 299 + dest = rowVar->GetColumn (col); 300 + if (!dest) 301 + return; 302 + dest->Copy (org); 290 303 } 291 304 292 -MyVariant *MyBlobs::GetBlob(int row, int col) 305 +MyVariant * 306 +MyBlobs::GetBlob (int row, int col) 293 307 { 294 308 // 295 309 // return a BLOB value 296 310 // 297 - MyRowVariant *rowVar; 298 - MyVariant *dest; 299 - if (row < 0 || row >= NumRows) 300 - return NULL; 301 - if (col < 0 || col >= NumCols) 302 - return NULL; 303 - rowVar = Rows + row; 304 - if (!rowVar) 305 - return NULL; 306 - dest = rowVar->GetColumn(col); 307 - if (!dest) 308 - return NULL; 309 - if (dest->GetType() != MY_BLOB_VARIANT) 310 - return NULL; 311 - return dest; 312 -} 313 - 314 -MyValues::MyValues(int rows, int cols) 315 -{ 316 -// 317 -// constructor - a generic values matrix 318 -// 319 - int r; 320 - MyRowVariant *rowVar; 321 - NumRows = 0; 322 - NumCols = 0; 323 - Rows = NULL; 324 - if (rows < 1 || cols < 1) 325 - return; 326 - NumRows = rows; 327 - NumCols = cols; 328 - Rows = new MyRowVariant[rows]; 329 - for (r = 0; r < rows; r++) 330 - { 331 - rowVar = Rows + r; 332 - rowVar->Create(cols); 333 - } 334 -} 335 - 336 -MyValues::~MyValues() 311 + MyRowVariant *rowVar; 312 + MyVariant *dest; 313 + if (row < 0 || row >= NumRows) 314 + return NULL; 315 + if (col < 0 || col >= NumCols) 316 + return NULL; 317 + rowVar = Rows + row; 318 + if (!rowVar) 319 + return NULL; 320 + dest = rowVar->GetColumn (col); 321 + if (!dest) 322 + return NULL; 323 + if (dest->GetType () != MY_BLOB_VARIANT) 324 + return NULL; 325 + return dest; 326 +} 327 + 328 +MyValues::MyValues (int rows, int cols) 329 +{ 330 +// 331 +// constructor - a generic values matrix 332 +// 333 + int r; 334 + MyRowVariant *rowVar; 335 + NumRows = 0; 336 + NumCols = 0; 337 + Rows = NULL; 338 + if (rows < 1 || cols < 1) 339 + return; 340 + NumRows = rows; 341 + NumCols = cols; 342 + Rows = new MyRowVariant[rows]; 343 + for (r = 0; r < rows; r++) 344 + { 345 + rowVar = Rows + r; 346 + rowVar->Create (cols); 347 + } 348 +} 349 + 350 +MyValues::~MyValues () 337 351 { 338 352 // 339 353 // destructor - a generic values matrix 340 354 // 341 - if (Rows) 342 - delete[]Rows; 355 + if (Rows) 356 + delete[]Rows; 343 357 } 344 358 345 -void MyValues::SetValue(int row, int col, sqlite3_int64 value) 359 +void 360 +MyValues::SetValue (int row, int col, int value) 346 361 { 347 362 // 348 363 // setting an integer value 349 364 // 350 - MyRowVariant *rowVar; 351 - MyVariant *dest; 352 - if (row < 0 || row >= NumRows) 353 - return; 354 - if (col < 0 || col >= NumCols) 355 - return; 356 - rowVar = Rows + row; 357 - if (!rowVar) 358 - return; 359 - dest = rowVar->GetColumn(col); 360 - if (!dest) 361 - return; 362 - dest->Set(value); 365 + MyRowVariant *rowVar; 366 + MyVariant *dest; 367 + if (row < 0 || row >= NumRows) 368 + return; 369 + if (col < 0 || col >= NumCols) 370 + return; 371 + rowVar = Rows + row; 372 + if (!rowVar) 373 + return; 374 + dest = rowVar->GetColumn (col); 375 + if (!dest) 376 + return; 377 + dest->Set (value); 363 378 } 364 379 365 -void MyValues::SetValue(int row, int col, double value) 380 +void 381 +MyValues::SetValue (int row, int col, double value) 366 382 { 367 383 // 368 384 // setting a double value 369 385 // 370 - MyRowVariant *rowVar; 371 - MyVariant *dest; 372 - if (row < 0 || row >= NumRows) 373 - return; 374 - if (col < 0 || col >= NumCols) 375 - return; 376 - rowVar = Rows + row; 377 - if (!rowVar) 378 - return; 379 - dest = rowVar->GetColumn(col); 380 - if (!dest) 381 - return; 382 - dest->Set(value); 386 + MyRowVariant *rowVar; 387 + MyVariant *dest; 388 + if (row < 0 || row >= NumRows) 389 + return; 390 + if (col < 0 || col >= NumCols) 391 + return; 392 + rowVar = Rows + row; 393 + if (!rowVar) 394 + return; 395 + dest = rowVar->GetColumn (col); 396 + if (!dest) 397 + return; 398 + dest->Set (value); 383 399 } 384 400 385 -void MyValues::SetValue(int row, int col, wxString & value) 401 +void 402 +MyValues::SetValue (int row, int col, wxString & value) 386 403 { 387 404 // 388 405 // setting a string value 389 406 // 390 - MyRowVariant *rowVar; 391 - MyVariant *dest; 392 - if (row < 0 || row >= NumRows) 393 - return; 394 - if (col < 0 || col >= NumCols) 395 - return; 396 - rowVar = Rows + row; 397 - if (!rowVar) 398 - return; 399 - dest = rowVar->GetColumn(col); 400 - if (!dest) 401 - return; 402 - dest->Set(value); 407 + MyRowVariant *rowVar; 408 + MyVariant *dest; 409 + if (row < 0 || row >= NumRows) 410 + return; 411 + if (col < 0 || col >= NumCols) 412 + return; 413 + rowVar = Rows + row; 414 + if (!rowVar) 415 + return; 416 + dest = rowVar->GetColumn (col); 417 + if (!dest) 418 + return; 419 + dest->Set (value); 403 420 } 404 421 405 -MyVariant *MyValues::GetValue(int row, int col) 422 +MyVariant * 423 +MyValues::GetValue (int row, int col) 406 424 { 407 425 // 408 426 // return a generic value 409 427 // 410 - MyRowVariant *rowVar; 411 - MyVariant *dest; 412 - if (row < 0 || row >= NumRows) 413 - return NULL; 414 - if (col < 0 || col >= NumCols) 415 - return NULL; 416 - rowVar = Rows + row; 417 - if (!rowVar) 418 - return NULL; 419 - dest = rowVar->GetColumn(col); 420 - if (!dest) 421 - return NULL; 422 - return dest; 428 + MyRowVariant *rowVar; 429 + MyVariant *dest; 430 + if (row < 0 || row >= NumRows) 431 + return NULL; 432 + if (col < 0 || col >= NumCols) 433 + return NULL; 434 + rowVar = Rows + row; 435 + if (!rowVar) 436 + return NULL; 437 + dest = rowVar->GetColumn (col); 438 + if (!dest) 439 + return NULL; 440 + return dest; 423 441 } 424 442 425 -MyRowVariant *MyValues::GetRow(int row) 443 +MyRowVariant * 444 +MyValues::GetRow (int row) 426 445 { 427 446 // 428 447 // return a row of generic values 429 448 // 430 - MyRowVariant *rowVar; 431 - if (row < 0 || row >= NumRows) 432 - return NULL; 433 - rowVar = Rows + row; 434 - return rowVar; 449 + MyRowVariant *rowVar; 450 + if (row < 0 || row >= NumRows) 451 + return NULL; 452 + rowVar = Rows + row; 453 + return rowVar; 435 454 } 436 455 437 -MyColumnInfo::MyColumnInfo(wxString & name, bool pkey) 456 +MyColumnInfo::MyColumnInfo (wxString & name, bool pkey) 438 457 { 439 458 // 440 459 // constructor - a table column object 441 460 // 442 - Name = name; 443 - PrimaryKey = pkey; 444 - Geometry = false; 445 - GeometryIndex = false; 446 - MbrCache = false; 447 - Next = NULL; 461 + Name = name; 462 + PrimaryKey = pkey; 463 + Geometry = false; 464 + GeometryIndex = false; 465 + Next = NULL; 448 466 } 449 467 450 -MyIndexInfo::MyIndexInfo(wxString & name) 468 +MyIndexInfo::MyIndexInfo (wxString & name) 451 469 { 452 470 // 453 471 // constructor - a table index object 454 472 // 455 - Name = name; 456 - Next = NULL; 473 + Name = name; 474 + Next = NULL; 457 475 } 458 476 459 -MyTriggerInfo::MyTriggerInfo(wxString & name) 477 +MyTriggerInfo::MyTriggerInfo (wxString & name) 460 478 { 461 479 // 462 480 // constructor - a table trigger object 463 481 // 464 - Name = name; 465 - Next = NULL; 482 + Name = name; 483 + Next = NULL; 466 484 } 467 485 468 -MyTableInfo::~MyTableInfo() 486 +MyTableInfo::~MyTableInfo () 469 487 { 470 488 // 471 489 // destructor - a table columns collection 472 490 // 473 - MyColumnInfo *elc; 474 - MyColumnInfo *elcN; 475 - MyIndexInfo *eli; 476 - MyIndexInfo *eliN; 477 - MyTriggerInfo *elt; 478 - MyTriggerInfo *eltN; 479 - elc = FirstColumn; 480 - while (elc) 481 - { 482 - elcN = elc->GetNext(); 483 - delete elc; 484 - elc = elcN; 485 - } 486 - eli = FirstIndex; 487 - while (eli) 488 - { 489 - eliN = eli->GetNext(); 490 - delete eli; 491 - eli = eliN; 492 - } 493 - elt = FirstTrigger; 494 - while (elt) 495 - { 496 - eltN = elt->GetNext(); 497 - delete elt; 498 - elt = eltN; 499 - } 491 + MyColumnInfo *elc; 492 + MyColumnInfo *elcN; 493 + MyIndexInfo *eli; 494 + MyIndexInfo *eliN; 495 + MyTriggerInfo *elt; 496 + MyTriggerInfo *eltN; 497 + elc = FirstColumn; 498 + while (elc) 499 + { 500 + elcN = elc->GetNext (); 501 + delete elc; 502 + elc = elcN; 503 + } 504 + eli = FirstIndex; 505 + while (eli) 506 + { 507 + eliN = eli->GetNext (); 508 + delete eli; 509 + eli = eliN; 510 + } 511 + elt = FirstTrigger; 512 + while (elt) 513 + { 514 + eltN = elt->GetNext (); 515 + delete elt; 516 + elt = eltN; 517 + } 500 518 } 501 519 502 -void MyTableInfo::AddColumn(wxString & name, bool pkey) 520 +void 521 +MyTableInfo::AddColumn (wxString & name, bool pkey) 503 522 { 504 523 // 505 524 // inserting a column def into a table 506 525 // 507 - MyColumnInfo *el = new MyColumnInfo(name, pkey); 508 - if (!FirstColumn) 509 - FirstColumn = el; 510 - if (LastColumn) 511 - LastColumn->SetNext(el); 512 - LastColumn = el; 526 + MyColumnInfo *el = new MyColumnInfo (name, pkey); 527 + if (!FirstColumn) 528 + FirstColumn = el; 529 + if (LastColumn) 530 + LastColumn->SetNext (el); 531 + LastColumn = el; 513 532 } 514 533 515 -void MyTableInfo::SetGeometry(wxString & name, bool index, bool cached) 534 +void 535 +MyTableInfo::SetGeometry (wxString & name, bool index, bool cached) 516 536 { 517 537 // 518 538 //setting a geometry column 519 539 // 520 - MyColumnInfo *elc; 521 - elc = FirstColumn; 522 - while (elc) 523 - { 524 - if (name == elc->GetName()) 525 - { 526 - elc->SetGeometry(); 527 - if (index == true) 528 - elc->SetGeometryIndex(); 529 - if (cached == true) 530 - elc->SetMbrCache(); 531 - } 532 - elc = elc->GetNext(); 533 - } 540 + MyColumnInfo *elc; 541 + elc = FirstColumn; 542 + while (elc) 543 + { 544 + if (name == elc->GetName ()) 545 + { 546 + elc->SetGeometry (); 547 + if (index == true) 548 + elc->SetGeometryIndex (); 549 + if (cached == true) 550 + elc->SetMbrCache (); 551 + } 552 + elc = elc->GetNext (); 553 + } 534 554 } 535 555 536 -void MyTableInfo::AddIndex(wxString & name) 556 +void 557 +MyTableInfo::AddIndex (wxString & name) 537 558 { 538 559 // 539 560 // inserting an index def into a table 540 561 // 541 - MyIndexInfo *el = new MyIndexInfo(name); 542 - if (!FirstIndex) 543 - FirstIndex = el; 544 - if (LastIndex) 545 - LastIndex->SetNext(el); 546 - LastIndex = el; 562 + MyIndexInfo *el = new MyIndexInfo (name); 563 + if (!FirstIndex) 564 + FirstIndex = el; 565 + if (LastIndex) 566 + LastIndex->SetNext (el); 567 + LastIndex = el; 547 568 } 548 569 549 -void MyTableInfo::AddTrigger(wxString & name) 570 +void 571 +MyTableInfo::AddTrigger (wxString & name) 550 572 { 551 573 // 552 574 // inserting a trigger def into a table 553 575 // 554 - MyTriggerInfo *el = new MyTriggerInfo(name); 555 - if (!FirstTrigger) 556 - FirstTrigger = el; 557 - if (LastTrigger) 558 - LastTrigger->SetNext(el); 559 - LastTrigger = el; 576 + MyTriggerInfo *el = new MyTriggerInfo (name); 577 + if (!FirstTrigger) 578 + FirstTrigger = el; 579 + if (LastTrigger) 580 + LastTrigger->SetNext (el); 581 + LastTrigger = el; 560 582 } 561 583 562 -MyViewInfo::~MyViewInfo() 584 +MyViewInfo::~MyViewInfo () 563 585 { 564 586 // 565 587 // destructor - a view columns collection 566 588 // 567 - MyColumnInfo *elc; 568 - MyColumnInfo *elcN; 569 - elc = First; 570 - while (elc) 571 - { 572 - elcN = elc->GetNext(); 573 - delete elc; 574 - elc = elcN; 575 - } 589 + MyColumnInfo *elc; 590 + MyColumnInfo *elcN; 591 + elc = First; 592 + while (elc) 593 + { 594 + elcN = elc->GetNext (); 595 + delete elc; 596 + elc = elcN; 597 + } 576 598 } 577 599 578 -void MyViewInfo::AddColumn(wxString & name) 600 +void 601 +MyViewInfo::AddColumn (wxString & name) 579 602 { 580 603 // 581 604 // inserting a column def into a view 582 605 // 583 - MyColumnInfo *el = new MyColumnInfo(name, false); 584 - if (!First) 585 - First = el; 586 - if (Last) 587 - Last->SetNext(el); 588 - Last = el; 606 + MyColumnInfo *el = new MyColumnInfo (name, false); 607 + if (!First) 608 + First = el; 609 + if (Last) 610 + Last->SetNext (el); 611 + Last = el; 589 612 } 590 613 591 -MySqlHistory::~MySqlHistory() 614 +MySqlHistory::~MySqlHistory () 592 615 { 593 616 // 594 617 // destructor - the SQL queries history 595 618 // 596 - MySqlQuery *elq; 597 - MySqlQuery *elqN; 598 - elq = First; 599 - while (elq) 600 - { 601 - elqN = elq->GetNext(); 602 - delete elq; 603 - elq = elqN; 604 - } 619 + MySqlQuery *elq; 620 + MySqlQuery *elqN; 621 + elq = First; 622 + while (elq) 623 + { 624 + elqN = elq->GetNext (); 625 + delete elq; 626 + elq = elqN; 627 + } 605 628 } 606 629 607 -void MySqlHistory::Add(wxString & sql) 630 +void 631 +MySqlHistory::Add (wxString & sql) 608 632 { 609 633 // 610 634 // inserting an SQL query into the history 611 635 // 612 - if (Last) 613 - { 614 - // avoiding stupid duplicates 615 - if (Last->GetSql() == sql) 616 - return; 617 - } 618 - MySqlQuery *el = new MySqlQuery(sql); 619 - if (!First) 620 - First = el; 621 - el->SetPrev(Last); 622 - if (Last) 623 - Last->SetNext(el); 624 - Last = el; 625 - Current = el; 636 + if (Last) 637 + { 638 + // avoiding stupid duplicates 639 + if (Last->GetSql () == sql) 640 + return; 641 + } 642 + MySqlQuery *el = new MySqlQuery (sql); 643 + if (!First) 644 + First = el; 645 + el->SetPrev (Last); 646 + if (Last) 647 + Last->SetNext (el); 648 + Last = el; 649 + Current = el; 626 650 } 627 651 628 -MySqlQuery *MySqlHistory::GetNext() 652 +MySqlQuery * 653 +MySqlHistory::GetNext () 629 654 { 630 655 // 631 656 // return the next SQL query 632 657 // 633 - if (Current) 634 - { 635 - if (Current->GetNext()) 636 - { 637 - Current = Current->GetNext(); 638 - return Current; 639 - } else 640 - return NULL; 641 - } 642 - return NULL; 658 + if (Current) 659 + { 660 + if (Current->GetNext ()) 661 + { 662 + Current = Current->GetNext (); 663 + return Current; 664 + } 665 + else 666 + return NULL; 667 + } 668 + return NULL; 643 669 } 644 670 645 -MySqlQuery *MySqlHistory::GetPrev() 671 +MySqlQuery * 672 +MySqlHistory::GetPrev () 646 673 { 647 674 // 648 675 // return the previous SQL query 649 676 // 650 - if (Current) 651 - { 652 - if (Current->GetPrev()) 653 - { 654 - Current = Current->GetPrev(); 655 - return Current; 656 - } else 657 - return NULL; 658 - } 659 - return NULL; 677 + if (Current) 678 + { 679 + if (Current->GetPrev ()) 680 + { 681 + Current = Current->GetPrev (); 682 + return Current; 683 + } 684 + else 685 + return NULL; 686 + } 687 + return NULL; 660 688 } 661 689 662 -bool MySqlHistory::TestNext() 690 +bool 691 +MySqlHistory::TestNext () 663 692 { 664 693 // 665 694 // tests if the next SQL query exists 666 695 // 667 - if (Current) 668 - { 669 - if (Current->GetNext()) 670 - return true; 671 - else 672 - return false; 673 - } 674 - return false; 696 + if (Current) 697 + { 698 + if (Current->GetNext ()) 699 + return true; 700 + else 701 + return false; 702 + } 703 + return false; 675 704 } 676 705 677 -bool MySqlHistory::TestPrev() 706 +bool 707 +MySqlHistory::TestPrev () 678 708 { 679 709 // 680 710 // tests if the previous SQL query exists 681 711 // 682 - if (Current) 683 - { 684 - if (Current->GetPrev()) 685 - return true; 686 - else 687 - return false; 688 - } 689 - return false; 690 -} 691 - 692 -AutoFDOTables::~AutoFDOTables() 693 -{ 694 -// 695 -// destructor - auto FDO-OGR wrapper linked list 696 -// 697 - AutoFDOTable *el; 698 - AutoFDOTable *elN; 699 - el = First; 700 - while (el) 701 - { 702 - elN = el->GetNext(); 703 - delete el; 704 - el = elN; 705 - } 706 -} 707 - 708 -void AutoFDOTables::Add(const char *name, const int len) 709 -{ 710 -// 711 -// adding a table name to the auto FDO-OGR wrapper linked list 712 -// 713 - AutoFDOTable *el = new AutoFDOTable(name, len); 714 - if (!First) 715 - First = el; 716 - if (Last) 717 - Last->SetNext(el); 718 - Last = el; 712 + if (Current) 713 + { 714 + if (Current->GetPrev ()) 715 + return true; 716 + else 717 + return false; 718 + } 719 + return false; 719 720 }
Changes to QueryView.cpp.
1 1 /* 2 2 / QueryView.cpp 3 -/ a panel to set SQL queries 3 +/ a panel to set and show SQL queries 4 4 / 5 -/ version 1.2, 2008 October 9 5 +/ version 1.1, 2008 September 13 6 6 / 7 7 / Author: Sandro Furieri a-furieri@lqt.it 8 8 / 9 9 / Copyright (C) 2008 Alessandro Furieri 10 10 / 11 11 / This program is free software: you can redistribute it and/or modify 12 12 / it under the terms of the GNU General Public License as published by ................................................................................ 32 32 // ICONs in XPM format [universally portable] 33 33 // 34 34 #include "icons/sql_go.xpm" 35 35 #include "icons/hs_back.xpm" 36 36 #include "icons/hs_back_no.xpm" 37 37 #include "icons/hs_forward.xpm" 38 38 #include "icons/hs_forward_no.xpm" 39 +#include "icons/rs_first.xpm" 40 +#include "icons/rs_last.xpm" 41 +#include "icons/rs_next.xpm" 42 +#include "icons/rs_previous.xpm" 43 +#include "icons/refresh.xpm" 39 44 40 -MyQueryView::MyQueryView(MyFrame * parent, wxWindowID id): 41 -wxPanel(parent, id, wxDefaultPosition, wxSize(440, 76), wxBORDER_SUNKEN) 45 +MyQueryView::MyQueryView (MyFrame * parent, wxWindowID id): 46 +wxPanel (parent, id, wxDefaultPosition, wxSize (440, 480), wxBORDER_SUNKEN) 42 47 { 43 48 // 44 49 // constructor: a frame for SQL Queries 45 50 // 46 - MainFrame = parent; 47 - BracketStart = -1; 48 - BracketEnd = -1; 49 - IgnoreEvent = false; 51 + RsBlock = 500; // the ResultSet block size 52 + RowIds = new int[RsBlock]; 53 + ReadOnly = true; 54 + InsertRow = NULL; 55 + MainFrame = parent; 50 56 // SQL statement 51 - SqlCtrl = 52 - new MySqlControl(this, ID_SQL, wxT(""), wxPoint(40, 5), 53 - wxSize(20, 20), 54 - wxTE_MULTILINE | wxTE_PROCESS_ENTER | wxTE_PROCESS_TAB | 55 - wxHSCROLL | wxTE_RICH); 56 - BtnSqlGo = 57 - new wxBitmapButton(this, ID_SQL_GO, wxBitmap(sql_go_xpm), wxPoint(340, 5), 58 - wxSize(32, 69)); 59 - BtnSqlGo->SetToolTip(wxT("Execute SQL statement")); 60 - BtnHistoryBack = 61 - new wxBitmapButton(this, ID_HISTORY_BACK, wxBitmap(hs_back_xpm), 62 - wxPoint(5, 5), wxSize(32, 32)); 63 - BtnHistoryBack->SetBitmapDisabled(wxBitmap(hs_back_no_xpm)); 64 - BtnHistoryBack->SetToolTip(wxT("History: previous SQL statement")); 65 - BtnHistoryForward = 66 - new wxBitmapButton(this, ID_HISTORY_FORWARD, wxBitmap(hs_forward_xpm), 67 - wxPoint(5, 40), wxSize(32, 32)); 68 - BtnHistoryForward->SetBitmapDisabled(wxBitmap(hs_forward_no_xpm)); 69 - BtnHistoryForward->SetToolTip(wxT("History: next SQL statement")); 70 - SetHistoryStates(); 57 + SqlCtrl = 58 + new wxTextCtrl (this, ID_SQL, wxT (""), wxPoint (40, 5), 59 + wxSize (200, 20), 60 + wxTE_MULTILINE | wxTE_PROCESS_ENTER | wxTE_PROCESS_TAB | 61 + wxHSCROLL); 62 + BtnSqlGo = 63 + new wxBitmapButton (this, ID_SQL_GO, wxBitmap (sql_go_xpm), 64 + wxPoint (340, 30), wxSize (32, 48)); 65 + BtnSqlGo->SetToolTip (wxT ("Execute SQL statement")); 66 + BtnHistoryBack = 67 + new wxBitmapButton (this, ID_HISTORY_BACK, wxBitmap (hs_back_xpm), 68 + wxPoint (5, 5), wxSize (32, 48)); 69 + BtnHistoryBack->SetBitmapDisabled (wxBitmap (hs_back_no_xpm)); 70 + BtnHistoryBack->SetToolTip (wxT ("History: previous SQL statement")); 71 + BtnHistoryForward = 72 + new wxBitmapButton (this, ID_HISTORY_FORWARD, wxBitmap (hs_forward_xpm), 73 + wxPoint (5, 55), wxSize (32, 48)); 74 + BtnHistoryForward->SetBitmapDisabled (wxBitmap (hs_forward_no_xpm)); 75 + BtnHistoryForward->SetToolTip (wxT ("History: next SQL statement")); 76 + BtnRsFirst = 77 + new wxBitmapButton (this, ID_RS_FIRST, wxBitmap (rs_first_xpm), 78 + wxPoint (5, 400), wxSize (32, 32)); 79 + BtnRsFirst->SetToolTip (wxT ("ResultSet: go to first row")); 80 + BtnRsPrevious = 81 + new wxBitmapButton (this, ID_RS_PREVIOUS, wxBitmap (rs_previous_xpm), 82 + wxPoint (55, 400), wxSize (32, 32)); 83 + BtnRsPrevious->SetToolTip (wxT ("ResultSet: go to previous block")); 84 + BtnRefresh = 85 + new wxBitmapButton (this, ID_REFRESH, wxBitmap (refresh_xpm), 86 + wxPoint (55, 400), wxSize (32, 32)); 87 + BtnRefresh->SetToolTip (wxT ("ResultSet: refresh")); 88 + BtnRsNext = 89 + new wxBitmapButton (this, ID_RS_NEXT, wxBitmap (rs_next_xpm), 90 + wxPoint (105, 400), wxSize (32, 32)); 91 + BtnRsNext->SetToolTip (wxT ("ResultSet: go to next block")); 92 + BtnRsLast = 93 + new wxBitmapButton (this, ID_RS_LAST, wxBitmap (rs_last_xpm), 94 + wxPoint (155, 400), wxSize (32, 32)); 95 + BtnRsLast->SetToolTip (wxT ("ResultSet: go to last row")); 96 + RsCurrentBlock = 97 + new wxStaticText (this, ID_RS_BLOCK, wxT (""), wxPoint (210, 400), 98 + wxSize (200, 18)); 99 + TableView = NULL; 100 + TableBlobs = NULL; 101 + TableValues = NULL; 102 + CurrentBlob = NULL; 103 + SetHistoryStates (); 71 104 // setting up event handlers 72 - Connect(ID_SQL_GO, wxEVT_COMMAND_BUTTON_CLICKED, 73 - (wxObjectEventFunction) & MyQueryView::OnSqlGo); 74 - Connect(ID_HISTORY_BACK, wxEVT_COMMAND_BUTTON_CLICKED, 75 - (wxObjectEventFunction) & MyQueryView::OnHistoryBack); 76 - Connect(ID_HISTORY_FORWARD, wxEVT_COMMAND_BUTTON_CLICKED, 77 - (wxObjectEventFunction) & MyQueryView::OnHistoryForward); 78 - Connect(wxID_ANY, wxEVT_SIZE, (wxObjectEventFunction) & MyQueryView::OnSize); 79 - Connect(wxID_ANY, wxEVT_COMMAND_TEXT_UPDATED, 80 - (wxObjectEventFunction) & MyQueryView::OnSqlSyntaxColor); 81 -} 82 - 83 -void MyQueryView::ShowControls() 105 + Connect (ID_SQL_GO, wxEVT_COMMAND_BUTTON_CLICKED, 106 + (wxObjectEventFunction) & MyQueryView::OnSqlGo); 107 + Connect (ID_HISTORY_BACK, wxEVT_COMMAND_BUTTON_CLICKED, 108 + (wxObjectEventFunction) & MyQueryView::OnHistoryBack); 109 + Connect (ID_HISTORY_FORWARD, wxEVT_COMMAND_BUTTON_CLICKED, 110 + (wxObjectEventFunction) & MyQueryView::OnHistoryForward); 111 + Connect (ID_RS_FIRST, wxEVT_COMMAND_BUTTON_CLICKED, 112 + (wxObjectEventFunction) & MyQueryView::OnRsFirst); 113 + Connect (ID_RS_PREVIOUS, wxEVT_COMMAND_BUTTON_CLICKED, 114 + (wxObjectEventFunction) & MyQueryView::OnRsPrevious); 115 + Connect (ID_RS_NEXT, wxEVT_COMMAND_BUTTON_CLICKED, 116 + (wxObjectEventFunction) & MyQueryView::OnRsNext); 117 + Connect (ID_RS_LAST, wxEVT_COMMAND_BUTTON_CLICKED, 118 + (wxObjectEventFunction) & MyQueryView::OnRsLast); 119 + Connect (ID_REFRESH, wxEVT_COMMAND_BUTTON_CLICKED, 120 + (wxObjectEventFunction) & MyQueryView::OnRefresh); 121 + Connect (wxID_ANY, wxEVT_SIZE, 122 + (wxObjectEventFunction) & MyQueryView::OnSize); 123 + Connect (wxID_ANY, wxEVT_GRID_SELECT_CELL, 124 + (wxObjectEventFunction) & MyQueryView::OnCellSelected); 125 + Connect (wxID_ANY, wxEVT_GRID_CELL_RIGHT_CLICK, 126 + (wxObjectEventFunction) & MyQueryView::OnRightClick); 127 + Connect (wxID_ANY, wxEVT_GRID_CELL_CHANGE, 128 + (wxObjectEventFunction) & MyQueryView::OnCellChanged); 129 + Connect (Grid_Delete, wxEVT_COMMAND_MENU_SELECTED, 130 + (wxObjectEventFunction) & MyQueryView::OnCmdDelete); 131 + Connect (Grid_Insert, wxEVT_COMMAND_MENU_SELECTED, 132 + (wxObjectEventFunction) & MyQueryView::OnCmdInsert); 133 + Connect (Grid_Abort, wxEVT_COMMAND_MENU_SELECTED, 134 + (wxObjectEventFunction) & MyQueryView::OnCmdAbort); 135 + Connect (Grid_Clear, wxEVT_COMMAND_MENU_SELECTED, 136 + (wxObjectEventFunction) & MyQueryView::OnCmdClearSelection); 137 + Connect (Grid_All, wxEVT_COMMAND_MENU_SELECTED, 138 + (wxObjectEventFunction) & MyQueryView::OnCmdSelectAll); 139 + Connect (Grid_Row, wxEVT_COMMAND_MENU_SELECTED, 140 + (wxObjectEventFunction) & MyQueryView::OnCmdSelectRow); 141 + Connect (Grid_Column, wxEVT_COMMAND_MENU_SELECTED, 142 + (wxObjectEventFunction) & MyQueryView::OnCmdSelectColumn); 143 + Connect (Grid_Copy, wxEVT_COMMAND_MENU_SELECTED, 144 + (wxObjectEventFunction) & MyQueryView::OnCmdCopy); 145 + Connect (Grid_Blob, wxEVT_COMMAND_MENU_SELECTED, 146 + (wxObjectEventFunction) & MyQueryView::OnCmdBlob); 147 + Connect (Grid_BlobIn, wxEVT_COMMAND_MENU_SELECTED, 148 + (wxObjectEventFunction) & MyQueryView::OnCmdBlobIn); 149 + Connect (Grid_BlobOut, wxEVT_COMMAND_MENU_SELECTED, 150 + (wxObjectEventFunction) & MyQueryView::OnCmdBlobOut); 151 + Connect (Grid_BlobNull, wxEVT_COMMAND_MENU_SELECTED, 152 + (wxObjectEventFunction) & MyQueryView::OnCmdBlobNull); 153 +} 154 + 155 +void 156 +MyQueryView::ShowSqlControls () 84 157 { 85 158 // 86 159 // making all SQL controls to be visible 87 160 // 88 - SqlCtrl->Show(true); 89 - BtnSqlGo->Show(true); 90 - BtnHistoryBack->Show(true); 91 - BtnHistoryForward->Show(true); 92 - SetHistoryStates(); 161 + SqlCtrl->Show (true); 162 + BtnSqlGo->Show (true); 163 + BtnHistoryBack->Show (true); 164 + BtnHistoryForward->Show (true); 165 + SetHistoryStates (); 93 166 } 94 167 95 -void MyQueryView::HideControls() 168 +void 169 +MyQueryView::ShowRsControls () 170 +{ 171 +// 172 +// making all ResultSet controls to be visible 173 +// 174 + BtnRsFirst->Show (true); 175 + BtnRsPrevious->Show (true); 176 + BtnRsNext->Show (true); 177 + BtnRsLast->Show (true); 178 + BtnRefresh->Show (true); 179 + RsCurrentBlock->Show (true); 180 + if (TableView) 181 + TableView->Show (true); 182 +} 183 + 184 +void 185 +MyQueryView::HideControls () 96 186 { 97 187 // 98 188 // making all controls to be invisible 99 189 // 100 - SqlCtrl->Show(false); 101 - BtnSqlGo->Show(false); 102 - BtnHistoryBack->Show(false); 103 - BtnHistoryForward->Show(false); 104 - 105 -} 106 - 107 -void MyQueryView::AddToHistory(wxString & sql) 108 -{ 109 -// 110 -// adds an SQL statement to history 111 -// 112 - History.Add(sql); 113 - SetHistoryStates(); 114 -} 115 - 116 -void MyQueryView::SetHistoryStates() 190 + SqlCtrl->Show (false); 191 + BtnSqlGo->Show (false); 192 + BtnHistoryBack->Show (false); 193 + BtnHistoryForward->Show (false); 194 + BtnRsFirst->Show (false); 195 + BtnRsPrevious->Show (false); 196 + BtnRsNext->Show (false); 197 + BtnRsLast->Show (false); 198 + BtnRefresh->Show (false); 199 + RsCurrentBlock->Show (false); 200 + if (TableView) 201 + TableView->Show (false); 202 +} 203 + 204 +void 205 +MyQueryView::HideRsControls () 206 +{ 207 +// 208 +// making all ResultSet controls to be invisible 209 +// 210 + BtnRsFirst->Show (false); 211 + BtnRsPrevious->Show (false); 212 + BtnRsNext->Show (false); 213 + BtnRsLast->Show (false); 214 + BtnRefresh->Show (false); 215 + RsCurrentBlock->Show (false); 216 + if (TableView) 217 + TableView->Show (false); 218 +} 219 + 220 +void 221 +MyQueryView::SetHistoryStates () 117 222 { 118 223 // 119 224 // updates the history buttons state 120 225 // 121 - BtnHistoryForward->Enable(History.TestNext()); 122 - BtnHistoryBack->Enable(History.TestPrev()); 226 + BtnHistoryForward->Enable (History.TestNext ()); 227 + BtnHistoryBack->Enable (History.TestPrev ()); 123 228 } 124 229 125 -void MyQueryView::SetSql(wxString & sql, bool execute) 230 +void 231 +MyQueryView::EditTable (wxString & sql, int *primaryKeys, int *blobCols, 232 + wxString & table) 233 +{ 234 +// 235 +// starting the edit table sequence 236 +// 237 + int i; 238 + for (i = 0; i < 1024; i++) 239 + { 240 + PrimaryKeys[i] = *(primaryKeys + i); 241 + BlobColumns[i] = *(blobCols + i); 242 + } 243 + ReadOnly = false; 244 + TableName = table; 245 + SqlCtrl->SetValue (sql); 246 + if (ExecuteSql (sql, 0) == false) 247 + wxMessageBox (SqlErrorMsg, wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 248 + MainFrame); 249 +} 250 + 251 +void 252 +MyQueryView::SetSql (wxString & sql, bool execute) 126 253 { 127 254 // 128 255 // sets an SQL statement [and maybe executes it] 129 256 // 130 - SqlCtrl->SetValue(sql); 131 - if (execute == true) 132 - { 133 - if (MainFrame->GetRsView()->ExecuteSql(sql, 0, true) == false) 134 - wxMessageBox(MainFrame->GetRsView()->GetSqlErrorMsg(), 135 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, MainFrame); 136 - } 137 -} 138 - 139 -void MyQueryView::OnSize(wxSizeEvent & event) 257 + ReadOnly = true; 258 + SqlCtrl->SetValue (sql); 259 + if (execute == true) 260 + { 261 + if (ExecuteSql (sql, 0) == false) 262 + wxMessageBox (SqlErrorMsg, wxT ("spatialite-gui"), 263 + wxOK | wxICON_ERROR, MainFrame); 264 + } 265 +} 266 + 267 +bool 268 +MyQueryView::ExecuteSql (wxString & sql, int from) 269 +{ 270 +// 271 +// executing some SQL statement 272 +// 273 + char *xSql = NULL; 274 + char err_msg[2048]; 275 + int columns; 276 + int i_col; 277 + int i_row; 278 + int end_row = 0; 279 + wxString blobType; 280 + MyVariantList list; 281 + MyRowVariant *row; 282 + MyVariant *value; 283 + wxString cellValue; 284 + wxString currentBlock; 285 + sqlite3_stmt *stmt; 286 + sqlite3 *sqlite = MainFrame->GetSqlite (); 287 + SqlErrorMsg = wxT (""); 288 + if (TableView) 289 + TableView->Destroy (); 290 + TableView = NULL; 291 + if (TableBlobs) 292 + delete TableBlobs; 293 + if (TableValues) 294 + delete TableValues; 295 + TableBlobs = NULL; 296 + TableValues = NULL; 297 + CurrentBlob = NULL; 298 + HideRsControls (); 299 + RsBeginRow = 0; 300 + RsEndRow = 0; 301 + RsMaxRow = 0; 302 + for (i_row = 0; i_row < RsBlock; i_row++) 303 + RowIds[i_row] = -1; 304 + i_row = 0; 305 + xSql = new char[65536]; 306 + strcpy (xSql, sql.ToUTF8 ()); 307 + ::wxBeginBusyCursor (); 308 + int ret = sqlite3_prepare_v2 (sqlite, xSql, strlen (xSql), &stmt, NULL); 309 + if (ret != SQLITE_OK) 310 + { 311 + sprintf (err_msg, "SQL error: \"%s\"", sqlite3_errmsg (sqlite)); 312 + SqlErrorMsg = wxString::FromUTF8 (err_msg); 313 + ::wxEndBusyCursor (); 314 + delete[]xSql; 315 + return false; 316 + } 317 + RsCurrentBlock->Show (true); 318 + while (1) 319 + { 320 + // 321 + // fetching the result set rows 322 + // 323 + ret = sqlite3_step (stmt); 324 + if (ret == SQLITE_DONE) 325 + break; // end of result set 326 + if (ret == SQLITE_ROW) 327 + { 328 + // 329 + // fetching a row 330 + // 331 + if ((i_row % 100) == 0) 332 + { 333 + currentBlock.Printf (wxT 334 + ("fetching the result set: %d rows"), 335 + i_row); 336 + RsCurrentBlock->SetLabel (currentBlock); 337 + } 338 + if (i_row < from) 339 + { 340 + i_row++; 341 + continue; 342 + } 343 + if ((i_row - from) >= RsBlock) 344 + { 345 + i_row++; 346 + continue; 347 + } 348 + end_row = i_row; 349 + columns = sqlite3_column_count (stmt); 350 + MyRowVariant *rowVariant = list.Add (columns); 351 + for (i_col = 0; i_col < columns; i_col++) 352 + { 353 + int int_value; 354 + double dbl_value; 355 + const unsigned char *txt_value; 356 + const void *blob_value; 357 + int blobSize; 358 + list.SetColumnName (i_col, 359 + sqlite3_column_name (stmt, i_col)); 360 + switch (sqlite3_column_type (stmt, i_col)) 361 + { 362 + case SQLITE_INTEGER: 363 + int_value = sqlite3_column_int (stmt, i_col); 364 + rowVariant->Set (i_col, int_value); 365 + break; 366 + case SQLITE_FLOAT: 367 + dbl_value = sqlite3_column_double (stmt, i_col); 368 + rowVariant->Set (i_col, dbl_value); 369 + break; 370 + case SQLITE_TEXT: 371 + txt_value = sqlite3_column_text (stmt, i_col); 372 + rowVariant->Set (i_col, txt_value); 373 + break; 374 + case SQLITE_BLOB: 375 + blob_value = sqlite3_column_blob (stmt, i_col); 376 + blobSize = sqlite3_column_bytes (stmt, i_col); 377 + rowVariant->Set (i_col, blob_value, blobSize); 378 + break; 379 + case SQLITE_NULL: 380 + default: 381 + break; 382 + }; 383 + } 384 + i_row++; 385 + } 386 + else 387 + { 388 + sprintf (err_msg, "SQL error: \"%s\"", sqlite3_errmsg (sqlite)); 389 + SqlErrorMsg = wxString::FromUTF8 (err_msg); 390 + goto error; 391 + } 392 + } 393 + sqlite3_finalize (stmt); 394 + RsBeginRow = from; 395 + RsEndRow = end_row; 396 + RsMaxRow = i_row; 397 + if (list.GetRows () == 0) 398 + { 399 + // 400 + // this one is an EMPTY Result Set 401 + // 402 + if (ReadOnly == false) 403 + { 404 + // preparing the insert row 405 + int numCols = 0; 406 + wxString *colNames = 407 + MainFrame->GetColumnNames (TableName, &numCols); 408 + CreateGrid (0, numCols + 1); 409 + TableView->SetColLabelValue (0, wxT ("ROWID")); 410 + for (i_col = 0; i_col < numCols; i_col++) 411 + TableView->SetColLabelValue (i_col + 1, 412 + *(colNames + i_col)); 413 + TableView->EnableEditing (true); 414 + delete[]colNames; 415 + } 416 + else 417 + { 418 + // simply showing a warning message 419 + CreateGrid (1, 1); 420 + TableView->SetColLabelValue (0, wxT ("Message")); 421 + TableView->SetRowLabelValue (0, wxT ("Message")); 422 + TableView->SetCellValue (0, 0, 423 + wxT 424 + ("SQL query returned an empty ResultSet\n\nThis is not an error")); 425 + } 426 + } 427 + else 428 + { 429 + // 430 + // preparing the Grid to show the result set 431 + // 432 + CreateGrid (list.GetRows (), list.GetColumns ()); 433 + if (ReadOnly == true) 434 + TableView->EnableEditing (false); 435 + else 436 + TableView->EnableEditing (true); 437 + for (i_col = 0; i_col < list.GetColumns (); i_col++) 438 + TableView->SetColLabelValue (i_col, list.GetColumnName (i_col)); 439 + if (ReadOnly == false) 440 + TableView->SetColLabelValue (0, wxT ("ROWID")); 441 + i_row = 0; 442 + row = list.GetFirst (); 443 + while (row) 444 + { 445 + cellValue.Printf (wxT ("%d"), i_row + RsBeginRow + 1); 446 + TableView->SetRowLabelValue (i_row, cellValue); 447 + if (ReadOnly == false) 448 + { 449 + // storing the ROWID value into the RowIds array 450 + value = row->GetColumn (0); 451 + if (value->GetType () == MY_INT_VARIANT) 452 + RowIds[i_row] = value->GetIntValue (); 453 + } 454 + for (i_col = 0; i_col < row->GetNumCols (); i_col++) 455 + { 456 + value = row->GetColumn (i_col); 457 + if (value) 458 + { 459 + switch (value->GetType ()) 460 + { 461 + case MY_INT_VARIANT: 462 + cellValue.Printf (wxT ("%d"), 463 + value->GetIntValue ()); 464 + TableView->SetCellValue (i_row, i_col, 465 + cellValue); 466 + if (ReadOnly == false) 467 + TableValues->SetValue (i_row, i_col, 468 + value->GetIntValue 469 + ()); 470 + break; 471 + case MY_DBL_VARIANT: 472 + cellValue.Printf (wxT ("%1.4lf"), 473 + value->GetDblValue ()); 474 + TableView->SetCellValue (i_row, i_col, 475 + cellValue); 476 + if (ReadOnly == false) 477 + TableValues->SetValue (i_row, i_col, 478 + value->GetDblValue 479 + ()); 480 + break; 481 + case MY_TXT_VARIANT: 482 + TableView->SetCellValue (i_row, i_col, 483 + value->GetTxtValue 484 + ()); 485 + if (ReadOnly == false) 486 + TableValues->SetValue (i_row, i_col, 487 + value->GetTxtValue 488 + ()); 489 + break; 490 + case MY_BLOB_VARIANT: 491 + blobType = wxT ("UNKNOWN type"); 492 + switch (MainFrame->GuessBlobType 493 + (value->GetBlobSize (), 494 + value->GetBlob ())) 495 + { 496 + case MyFrame::BLOB_GEOMETRY: 497 + blobType = wxT ("GEOMETRY"); 498 + break; 499 + case MyFrame::BLOB_EXIF: 500 + case MyFrame::BLOB_JFIF: 501 + case MyFrame::BLOB_JPEG: 502 + blobType = wxT ("JPEG image"); 503 + break; 504 + case MyFrame::BLOB_PNG: 505 + blobType = wxT ("PNG image"); 506 + break; 507 + case MyFrame::BLOB_GIF: 508 + blobType = wxT ("GIF image"); 509 + break; 510 + case MyFrame::BLOB_PDF: 511 + blobType = wxT ("PDF document"); 512 + break; 513 + case MyFrame::BLOB_ZIP: 514 + blobType = wxT ("ZIP archive"); 515 + break; 516 + }; 517 + cellValue.Printf (wxT ("BLOB sz=%d "), 518 + value->GetBlobSize ()); 519 + cellValue += blobType; 520 + TableView->SetCellValue (i_row, i_col, 521 + cellValue); 522 + TableView->SetReadOnly (i_row, i_col); 523 + TableBlobs->SetBlob (i_row, i_col, value); 524 + break; 525 + case MY_NULL_VARIANT: 526 + default: 527 + TableView->SetCellValue (i_row, i_col, 528 + wxT ("NULL")); 529 + break; 530 + }; 531 + } 532 + else 533 + TableView->SetCellValue (i_row, i_col, wxT ("NULL")); 534 + if (ReadOnly == false) 535 + { 536 + if (IsPrimaryKey (i_col) == true) 537 + TableView->SetReadOnly (i_row, i_col); 538 + if (IsBlobColumn (i_col) == true) 539 + TableView->SetReadOnly (i_row, i_col); 540 + } 541 + } 542 + i_row++; 543 + row = row->GetNext (); 544 + } 545 + } 546 + if (ReadOnly == false) 547 + { 548 + // prepearing the insert row 549 + TableView->SetRowLabelValue (TableView->GetNumberRows () - 1, 550 + wxT ("Insert row")); 551 + InsertPending = false; 552 + for (i_col = 0; i_col < TableView->GetNumberCols (); i_col++) 553 + { 554 + TableView->SetCellValue (TableView->GetNumberRows () - 1, i_col, 555 + wxT ("")); 556 + TableView->SetCellBackgroundColour (TableView-> 557 + GetNumberRows () - 1, i_col, 558 + wxColour (0, 0, 0)); 559 + TableView->SetReadOnly (TableView->GetNumberRows () - 1, i_col); 560 + } 561 + } 562 + TableView->AutoSize (); 563 + ResizeTableView (); 564 + currentBlock.Printf (wxT ("current block: %d / %d [%d rows]"), 565 + RsBeginRow + 1, RsEndRow + 1, RsMaxRow); 566 + RsCurrentBlock->SetLabel (currentBlock); 567 + ShowRsControls (); 568 + History.Add (sql); 569 + SetHistoryStates (); 570 + ::wxEndBusyCursor (); 571 + if (xSql) 572 + delete[]xSql; 573 + return true; 574 + error: 575 + ::wxEndBusyCursor (); 576 + sqlite3_finalize (stmt); 577 + if (xSql) 578 + delete[]xSql; 579 + return false; 580 +} 581 + 582 +bool 583 +MyQueryView::IsPrimaryKey (int column) 584 +{ 585 +// 586 +// checks if this column is a Primary Key one 587 +// 588 + int i; 589 + for (i = 0; i < 1024; i++) 590 + { 591 + if (PrimaryKeys[i] == column) 592 + return true; 593 + } 594 + return false; 595 +} 596 + 597 +bool 598 +MyQueryView::IsBlobColumn (int column) 599 +{ 600 +// 601 +// checks if this column is a BLOB-type column 602 +// 603 + int i; 604 + for (i = 0; i < 1024; i++) 605 + { 606 + if (BlobColumns[i] == column) 607 + return true; 608 + } 609 + return false; 610 +} 611 + 612 +void 613 +MyQueryView::CreateGrid (int rows, int cols) 614 +{ 615 +// 616 +// creating a new Grid to show the result set 617 +// 618 + int extra = 0; 619 + if (ReadOnly == false) 620 + extra = 1; 621 + wxSize sz = GetClientSize (); 622 + TableView = 623 + new wxGrid (this, wxID_ANY, wxPoint (5, 120), wxSize (200, 200)); 624 + TableView->Show (false); 625 + TableView->CreateGrid (rows + extra, cols); 626 + TableBlobs = new MyBlobs (rows, cols); 627 + if (ReadOnly == false) 628 + TableValues = new MyValues (rows, cols); 629 +} 630 + 631 +void 632 +MyQueryView::ResizeTableView () 633 +{ 634 +// 635 +// resizing the Grid to show the result set 636 +// 637 + wxSize sz = GetClientSize (); 638 + if (TableView) 639 + { 640 + TableView->SetSize (sz.GetWidth () - 10, sz.GetHeight () - 160); 641 + TableView->Show (true); 642 + } 643 +} 644 + 645 +void 646 +MyQueryView::OnSize (wxSizeEvent & event) 140 647 { 141 648 // 142 649 // this window has changed its size 143 650 // 144 - int vert; 145 - int vertBack; 146 - wxSize sz = GetClientSize(); 147 -// setting the SQL statement pane size 148 - SqlCtrl->SetSize(sz.GetWidth() - 80, sz.GetHeight() - 10); 149 -// setting the SQL GO button position 150 - vert = (sz.GetHeight() - 69) / 2; 151 - if (vert < 5) 152 - vert = 5; 153 - BtnSqlGo->Move(sz.GetWidth() - 35, 5); 154 -// setting the SQL GO button size 155 - vert = sz.GetHeight() - 10; 156 - if (vert < 66) 157 - vert = 66; 158 - BtnSqlGo->SetSize(32, vert); 159 -// setting the HISTORY BACK button position 160 - BtnHistoryBack->Move(5, 5); 161 -// setting the HISTORY BACK button size 162 - vert = (sz.GetHeight() - 15) / 2; 163 - if (vert < 32) 164 - vert = 32; 165 - BtnHistoryBack->SetSize(32, vert); 166 - vertBack = 10 + vert; 167 -// setting the HISTORY FORWARD button position 168 - BtnHistoryForward->Move(5, vertBack); 169 -// setting the HISTORY FORWARD button size 170 - BtnHistoryForward->SetSize(32, vert); 171 -} 172 - 173 -void MyQueryView::OnSqlGo(wxCommandEvent & WXUNUSED(event)) 651 + wxSize sz = GetClientSize (); 652 + SqlCtrl->SetSize (sz.GetWidth () - 80, 100); 653 + BtnSqlGo->Move (sz.GetWidth () - 35, 30); 654 + if (TableView) 655 + TableView->SetSize (sz.GetWidth () - 10, sz.GetHeight () - 160); 656 + BtnRsFirst->Move (5, sz.GetHeight () - 35); 657 + BtnRsPrevious->Move (40, sz.GetHeight () - 35); 658 + BtnRefresh->Move (75, sz.GetHeight () - 35); 659 + BtnRsNext->Move (110, sz.GetHeight () - 35); 660 + BtnRsLast->Move (145, sz.GetHeight () - 35); 661 + RsCurrentBlock->Move (180, sz.GetHeight () - 25); 662 +} 663 + 664 +void 665 +MyQueryView::OnSqlGo (wxCommandEvent & WXUNUSED (event)) 174 666 { 175 667 // 176 668 // executing an SQL statement 177 669 // 178 - wxString sql = SqlCtrl->GetValue(); 179 - if (MainFrame->GetRsView()->ExecuteSql(sql, 0, true) == false) 180 - wxMessageBox(MainFrame->GetRsView()->GetSqlErrorMsg(), 181 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, MainFrame); 670 + ReadOnly = true; 671 + wxString sql = SqlCtrl->GetValue (); 672 + if (ExecuteSql (sql, 0) == false) 673 + wxMessageBox (SqlErrorMsg, wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 674 + MainFrame); 182 675 } 183 676 184 -void MyQueryView::OnHistoryBack(wxCommandEvent & WXUNUSED(event)) 677 +void 678 +MyQueryView::OnHistoryBack (wxCommandEvent & WXUNUSED (event)) 185 679 { 186 680 // 187 681 // going backward into the SQL Queries History 188 682 // 189 - MySqlQuery *sql = History.GetPrev(); 190 - if (sql) 191 - { 192 - SetSql(sql->GetSql(), false); 193 - SetHistoryStates(); 194 - } 683 + MySqlQuery *sql = History.GetPrev (); 684 + if (sql) 685 + { 686 + SetSql (sql->GetSql (), false); 687 + SetHistoryStates (); 688 + } 195 689 } 196 690 197 -void MyQueryView::OnHistoryForward(wxCommandEvent & WXUNUSED(event)) 691 +void 692 +MyQueryView::OnHistoryForward (wxCommandEvent & WXUNUSED (event)) 198 693 { 199 694 // 200 695 // going forward into the SQL Queries History 201 696 // 202 - MySqlQuery *sql = History.GetNext(); 203 - if (sql) 204 - { 205 - SetSql(sql->GetSql(), false); 206 - SetHistoryStates(); 207 - } 697 + MySqlQuery *sql = History.GetNext (); 698 + if (sql) 699 + { 700 + SetSql (sql->GetSql (), false); 701 + SetHistoryStates (); 702 + } 703 +} 704 + 705 +void 706 +MyQueryView::OnRsFirst (wxCommandEvent & WXUNUSED (event)) 707 +{ 708 +// 709 +// scrolling to the result set beginning 710 +// 711 + wxString sql = SqlCtrl->GetValue (); 712 + if (ExecuteSql (sql, 0) == false) 713 + wxMessageBox (SqlErrorMsg, wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 714 + MainFrame); 715 +} 716 + 717 +void 718 +MyQueryView::OnRsPrevious (wxCommandEvent & WXUNUSED (event)) 719 +{ 720 +// 721 +// scrolling to the result set previous block 722 +// 723 + wxString sql = SqlCtrl->GetValue (); 724 + int start = RsBeginRow - RsBlock; 725 + if (start < 0) 726 + start = 0; 727 + if (ExecuteSql (sql, start) == false) 728 + wxMessageBox (SqlErrorMsg, wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 729 + MainFrame); 730 +} 731 + 732 +void 733 +MyQueryView::OnRsNext (wxCommandEvent & WXUNUSED (event)) 734 +{ 735 +// 736 +// scrolling to the result set next block 737 +// 738 + wxString sql = SqlCtrl->GetValue (); 739 + int start = RsEndRow + 1; 740 + if (ExecuteSql (sql, start) == false) 741 + wxMessageBox (SqlErrorMsg, wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 742 + MainFrame); 743 +} 744 + 745 +void 746 +MyQueryView::OnRsLast (wxCommandEvent & WXUNUSED (event)) 747 +{ 748 +// 749 +// scrolling to the result set ending 750 +// 751 + wxString sql = SqlCtrl->GetValue (); 752 + int start = RsMaxRow - RsBlock; 753 + if (start < 0) 754 + start = 0; 755 + if (ExecuteSql (sql, start) == false) 756 + wxMessageBox (SqlErrorMsg, wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 757 + MainFrame); 758 +} 759 + 760 +void 761 +MyQueryView::OnRefresh (wxCommandEvent & WXUNUSED (event)) 762 +{ 763 +// 764 +// refreshing the result set 765 +// 766 + wxString sql = SqlCtrl->GetValue (); 767 + int start = RsBeginRow; 768 + if (ExecuteSql (sql, start) == false) 769 + wxMessageBox (SqlErrorMsg, wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 770 + MainFrame); 771 +} 772 + 773 +void 774 +MyQueryView::OnRightClick (wxGridEvent & event) 775 +{ 776 +// 777 +// right click on some cell [mouse action] 778 +// 779 + MyVariant *blobVar; 780 + wxMenu menu; 781 + wxMenuItem *menuItem; 782 + wxPoint pt = event.GetPosition (); 783 + if (ReadOnly == false && event.GetRow () == TableView->GetNumberRows () - 1) 784 + { 785 + // this is the INSERT ROW 786 + if (InsertPending == true) 787 + { 788 + menuItem = 789 + new wxMenuItem (&menu, Grid_Insert, 790 + wxT ("&Confirm insertion")); 791 + menu.Append (menuItem); 792 + menuItem = 793 + new wxMenuItem (&menu, Grid_Abort, 794 + wxT ("&Abort insertion")); 795 + menu.Append (menuItem); 796 + } 797 + else 798 + { 799 + menuItem = 800 + new wxMenuItem (&menu, Grid_Insert, 801 + wxT ("&Insert new row")); 802 + menu.Append (menuItem); 803 + } 804 + TableView->PopupMenu (&menu, pt); 805 + return; 806 + } 807 + CurrentEvtRow = event.GetRow (); 808 + CurrentEvtColumn = event.GetCol (); 809 + blobVar = TableBlobs->GetBlob (CurrentEvtRow, CurrentEvtColumn); 810 + if (blobVar) 811 + { 812 + // this one is a BLOB cell 813 + if (ReadOnly == false) 814 + { 815 + MyRowVariant *varRow = TableValues->GetRow (CurrentEvtRow); 816 + if (varRow->IsDeleted () == false) 817 + { 818 + menuItem = 819 + new wxMenuItem (&menu, Grid_Delete, 820 + wxT ("&Delete row")); 821 + menu.Append (menuItem); 822 + menuItem = 823 + new wxMenuItem (&menu, Grid_Insert, 824 + wxT ("&Insert new row")); 825 + menu.Append (menuItem); 826 + menu.AppendSeparator (); 827 + } 828 + } 829 + menuItem = new wxMenuItem (&menu, Grid_Blob, wxT ("BLOB &explore")); 830 + menu.Append (menuItem); 831 + if (MainFrame->GuessBlobType (blobVar->GetBlobSize (), 832 + blobVar->GetBlob ()) == 833 + MyFrame::BLOB_GEOMETRY) 834 + ; 835 + else 836 + { 837 + menu.AppendSeparator (); 838 + menuItem = 839 + new wxMenuItem (&menu, Grid_BlobIn, wxT ("BLOB &import")); 840 + menu.Append (menuItem); 841 + menuItem = 842 + new wxMenuItem (&menu, Grid_BlobOut, wxT ("BLOB &export")); 843 + menu.Append (menuItem); 844 + menuItem = 845 + new wxMenuItem (&menu, Grid_BlobNull, 846 + wxT ("Set BLOB as &NULL")); 847 + menu.Append (menuItem); 848 + } 849 + CurrentBlob = blobVar; 850 + } 851 + else 852 + { 853 + // this one is an ordinary cell 854 + CurrentBlob = NULL; 855 + if (ReadOnly == false) 856 + { 857 + MyRowVariant *varRow = TableValues->GetRow (CurrentEvtRow); 858 + if (varRow->IsDeleted () == false) 859 + { 860 + menuItem = 861 + new wxMenuItem (&menu, Grid_Delete, 862 + wxT ("&Delete row")); 863 + menu.Append (menuItem); 864 + menuItem = 865 + new wxMenuItem (&menu, Grid_Insert, 866 + wxT ("&Insert new row")); 867 + menu.Append (menuItem); 868 + if (IsBlobColumn (CurrentEvtColumn) == true) 869 + { 870 + menu.AppendSeparator (); 871 + menuItem = 872 + new wxMenuItem (&menu, Grid_BlobIn, 873 + wxT ("BLOB &import")); 874 + menu.Append (menuItem); 875 + } 876 + menu.AppendSeparator (); 877 + } 878 + } 879 + menuItem = 880 + new wxMenuItem (&menu, Grid_Clear, wxT ("&Clear selection")); 881 + menu.Append (menuItem); 882 + menuItem = new wxMenuItem (&menu, Grid_All, wxT ("Select &all")); 883 + menu.Append (menuItem); 884 + menuItem = new wxMenuItem (&menu, Grid_Row, wxT ("Select &row")); 885 + menu.Append (menuItem); 886 + menuItem = 887 + new wxMenuItem (&menu, Grid_Column, wxT ("&Select column")); 888 + menu.Append (menuItem); 889 + menu.AppendSeparator (); 890 + menuItem = new wxMenuItem (&menu, Grid_Copy, wxT ("&Copy")); 891 + menu.Append (menuItem); 892 + if (TableView->IsSelection () == false) 893 + menuItem->Enable (false); 894 + } 895 + TableView->PopupMenu (&menu, pt); 896 +} 897 + 898 +void 899 +MyQueryView::OnCellSelected (wxGridEvent & event) 900 +{ 901 +// 902 +// cell selection changed 903 +// 904 + if (InsertPending == true) 905 + { 906 + // an INSERT row is still pending 907 + if (event.GetRow () != TableView->GetNumberRows () - 1) 908 + DoInsert (false); 909 + } 910 + event.Skip (); 911 +} 912 + 913 +void 914 +MyQueryView::OnCellChanged (wxGridEvent & event) 915 +{ 916 +// 917 +// user changed value in some cell 918 +// 919 + MyVariant *oldValue; 920 + MyVariant *insValue; 921 + wxString value; 922 + wxString numValue; 923 + wxString newValue = wxT ("NULL"); 924 + wxString sql; 925 + wxString rowid; 926 + char *errMsg = NULL; 927 + bool error = false; 928 + long int_value; 929 + bool okIntValue = false; 930 + double dbl_value; 931 + bool okDblValue = false; 932 + int ret; 933 + int row = event.GetRow (); 934 + int column = event.GetCol (); 935 + value = TableView->GetCellValue (row, column); 936 + if (InsertPending == true) 937 + { 938 + // an INSERT row is still pending 939 + insValue = InsertRow->GetColumn (column); 940 + numValue = value; 941 + numValue.Replace (wxT (","), wxT (".")); 942 + okIntValue = numValue.ToLong (&int_value); 943 + okDblValue = numValue.ToDouble (&dbl_value); 944 + if (okIntValue == true) 945 + insValue->Set ((int) int_value); 946 + else if (okDblValue == true) 947 + insValue->Set (dbl_value); 948 + else 949 + insValue->Set (value); 950 + if (row != TableView->GetNumberRows () - 1) 951 + DoInsert (false); 952 + return; 953 + } 954 + if (value.Len () > 0) 955 + { 956 + numValue = value; 957 + numValue.Replace (wxT (","), wxT (".")); 958 + okIntValue = numValue.ToLong (&int_value); 959 + okDblValue = numValue.ToDouble (&dbl_value); 960 + if (okIntValue == true) 961 + newValue.Printf (wxT ("%d"), int_value); 962 + else if (okDblValue == true) 963 + newValue.Printf (wxT ("%1.6lf"), dbl_value); 964 + else 965 + { 966 + value.Replace (wxT ("'"), wxT ("''")); 967 + newValue = wxT ("'") + value + wxT ("'"); 968 + } 969 + } 970 + oldValue = TableValues->GetValue (row, 0); 971 + rowid.Printf (wxT ("%d"), oldValue->GetIntValue ()); 972 + sql = 973 + wxT ("UPDATE ") + TableName + wxT (" SET ") + 974 + TableView->GetColLabelValue (column) + wxT (" = ") + newValue + 975 + wxT (" WHERE ROWID = ") + rowid; 976 + ret = 977 + sqlite3_exec (MainFrame->GetSqlite (), sql.ToUTF8 (), NULL, NULL, 978 + &errMsg); 979 + if (ret != SQLITE_OK) 980 + { 981 + wxMessageBox (wxT ("SQLite SQL error: ") + 982 + wxString::FromUTF8 (errMsg), wxT ("spatialite-gui"), 983 + wxOK | wxICON_ERROR, this); 984 + sqlite3_free (errMsg); 985 + error = true; 986 + } 987 + oldValue = TableValues->GetValue (row, column); 988 + if (error == true) 989 + { 990 + // update failed; restorig old cell value 991 + value = wxT ("NULL"); 992 + if (oldValue) 993 + { 994 + if (oldValue->GetType () == MY_INT_VARIANT) 995 + value.Printf (wxT ("%d"), oldValue->GetIntValue ()); 996 + if (oldValue->GetType () == MY_DBL_VARIANT) 997 + value.Printf (wxT ("%1.6lf"), oldValue->GetDblValue ()); 998 + if (oldValue->GetType () == MY_TXT_VARIANT) 999 + value = oldValue->GetTxtValue (); 1000 + } 1001 + TableView->SetCellValue (row, column, value); 1002 + TableView->ForceRefresh (); 1003 + } 1004 + else 1005 + { 1006 + // marking cell as modified 1007 + TableView->SetCellTextColour (row, column, wxColour (0, 0, 192)); 1008 + TableView->SetCellBackgroundColour (row, column, 1009 + wxColour (255, 255, 204)); 1010 + TableView->ForceRefresh (); 1011 + } 1012 +} 1013 + 1014 +void 1015 +MyQueryView::DoInsert (bool confirmed) 1016 +{ 1017 +// 1018 +// performing actual row INSERT 1019 +// 1020 + int i; 1021 + int ret; 1022 + MyVariant *var; 1023 + wxString value; 1024 + wxString strValue; 1025 + wxString sql; 1026 + char *errMsg = NULL; 1027 + if (confirmed == false) 1028 + { 1029 + ret = 1030 + wxMessageBox (wxT 1031 + ("A new row is ready for insertion\n\nConfirm ?"), 1032 + wxT ("spatialite-gui"), wxYES_NO | wxICON_QUESTION, 1033 + this); 1034 + if (ret != wxYES) 1035 + goto close_insert; 1036 + } 1037 + sql = wxT ("INSERT INTO ") + TableName + wxT (" ("); 1038 + for (i = 1; i < TableView->GetNumberCols (); i++) 1039 + { 1040 + if (i > 1) 1041 + sql += wxT (", "); 1042 + sql += TableView->GetColLabelValue (i); 1043 + } 1044 + sql += wxT (") VALUES ("); 1045 + for (i = 1; i < InsertRow->GetNumCols (); i++) 1046 + { 1047 + if (i > 1) 1048 + sql += wxT (", "); 1049 + var = InsertRow->GetColumn (i); 1050 + value = wxT ("NULL"); 1051 + if (var->GetType () == MY_INT_VARIANT) 1052 + value.Printf (wxT ("%d"), var->GetIntValue ()); 1053 + if (var->GetType () == MY_DBL_VARIANT) 1054 + value.Printf (wxT ("%d"), var->GetDblValue ()); 1055 + if (var->GetType () == MY_TXT_VARIANT) 1056 + { 1057 + strValue = var->GetTxtValue (); 1058 + strValue.Replace (wxT ("'"), wxT ("''")); 1059 + value = wxT ("'") + strValue + wxT ("'"); 1060 + } 1061 + sql += value; 1062 + } 1063 + sql += wxT (")"); 1064 + ret = 1065 + sqlite3_exec (MainFrame->GetSqlite (), sql.ToUTF8 (), NULL, NULL, 1066 + &errMsg); 1067 + if (ret != SQLITE_OK) 1068 + { 1069 + wxMessageBox (wxT ("SQLite SQL error: ") + 1070 + wxString::FromUTF8 (errMsg), wxT ("spatialite-gui"), 1071 + wxOK | wxICON_ERROR, this); 1072 + sqlite3_free (errMsg); 1073 + } 1074 + close_insert: 1075 +// 1076 +// closing insert row 1077 +// 1078 + InsertPending = false; 1079 + delete InsertRow; 1080 + InsertRow = NULL; 1081 + for (i = 0; i < TableView->GetNumberCols (); i++) 1082 + { 1083 + TableView->SetCellValue (TableView->GetNumberRows () - 1, i, 1084 + wxT ("")); 1085 + TableView->SetCellBackgroundColour (TableView->GetNumberRows () - 1, 1086 + i, wxColour (0, 0, 0)); 1087 + TableView->SetReadOnly (TableView->GetNumberRows () - 1, i); 1088 + } 1089 +} 1090 + 1091 +void 1092 +MyQueryView::OnCmdDelete (wxCommandEvent & event) 1093 +{ 1094 +// 1095 +// user required row deletion 1096 +// 1097 + char *errMsg = NULL; 1098 + bool error = false; 1099 + int ret; 1100 + int i; 1101 + wxString sql; 1102 + wxString rowid; 1103 + MyVariant *value; 1104 + MyRowVariant *varRow = TableValues->GetRow (CurrentEvtRow); 1105 + if (varRow->IsDeleted () == true) 1106 + return; 1107 + value = TableValues->GetValue (CurrentEvtRow, 0); 1108 + rowid.Printf (wxT ("%d"), value->GetIntValue ()); 1109 + ret = 1110 + wxMessageBox (wxT ("Requested deletion for row identified by RowId = ") 1111 + + rowid + wxT ("\n\nConfirm ?"), wxT ("spatialite-gui"), 1112 + wxYES_NO | wxICON_QUESTION, this); 1113 + if (ret != wxYES) 1114 + return; 1115 + sql = wxT ("DELETE FROM ") + TableName + wxT (" WHERE ROWID = ") + rowid; 1116 + ret = 1117 + sqlite3_exec (MainFrame->GetSqlite (), sql.ToUTF8 (), NULL, NULL, 1118 + &errMsg); 1119 + if (ret != SQLITE_OK) 1120 + { 1121 + wxMessageBox (wxT ("SQLite SQL error: ") + 1122 + wxString::FromUTF8 (errMsg), wxT ("spatialite-gui"), 1123 + wxOK | wxICON_ERROR, this); 1124 + sqlite3_free (errMsg); 1125 + error = true; 1126 + } 1127 + if (error == false) 1128 + { 1129 + // marking row as deleted 1130 + varRow->SetDeleted (); 1131 + for (i = 0; i < TableView->GetNumberCols (); i++) 1132 + { 1133 + TableView->SetCellTextColour (CurrentEvtRow, i, 1134 + wxColour (0, 0, 0)); 1135 + TableView->SetCellBackgroundColour (CurrentEvtRow, i, 1136 + wxColour (128, 128, 128)); 1137 + TableView->SetReadOnly (CurrentEvtRow, i); 1138 + } 1139 + TableView->ForceRefresh (); 1140 + } 1141 +} 1142 + 1143 +void 1144 +MyQueryView::OnCmdInsert (wxCommandEvent & event) 1145 +{ 1146 +// 1147 +// user required row insertion 1148 +// 1149 + int i; 1150 + if (ReadOnly == true) 1151 + return; 1152 + if (InsertPending == true) 1153 + { 1154 + // an INSERT is still pending, and the user required actual insertion 1155 + DoInsert (true); 1156 + return; 1157 + } 1158 + InsertRow = new MyRowVariant (TableView->GetNumberCols ()); 1159 + TableView->MakeCellVisible (TableView->GetNumberRows () - 1, 1); 1160 + InsertPending = true; 1161 + for (i = 1; i < TableView->GetNumberCols (); i++) 1162 + { 1163 + TableView->SetCellValue (TableView->GetNumberRows () - 1, i, 1164 + wxT ("")); 1165 + TableView->SetCellBackgroundColour (TableView->GetNumberRows () - 1, 1166 + i, wxColour (255, 255, 255)); 1167 + TableView->SetReadOnly (TableView->GetNumberRows () - 1, i, false); 1168 + } 1169 +} 1170 + 1171 +void 1172 +MyQueryView::OnCmdAbort (wxCommandEvent & event) 1173 +{ 1174 +// 1175 +// user cancelled current row insertion 1176 +// 1177 + int i; 1178 + if (InsertPending) 1179 + { 1180 + InsertPending = false; 1181 + delete InsertRow; 1182 + InsertRow = NULL; 1183 + for (i = 0; i < TableView->GetNumberCols (); i++) 1184 + { 1185 + TableView->SetCellValue (TableView->GetNumberRows () - 1, i, 1186 + wxT ("")); 1187 + TableView->SetCellBackgroundColour (TableView-> 1188 + GetNumberRows () - 1, i, 1189 + wxColour (0, 0, 0)); 1190 + TableView->SetReadOnly (TableView->GetNumberRows () - 1, i); 1191 + } 1192 + } 1193 +} 1194 + 1195 +void 1196 +MyQueryView::OnCmdClearSelection (wxCommandEvent & event) 1197 +{ 1198 +// 1199 +// clearing current selection 1200 +// 1201 + TableView->ClearSelection (); 1202 +} 1203 + 1204 +void 1205 +MyQueryView::OnCmdSelectAll (wxCommandEvent & event) 1206 +{ 1207 +// 1208 +// selecting all 1209 +// 1210 + TableView->SelectAll (); 1211 +} 1212 + 1213 +void 1214 +MyQueryView::OnCmdSelectRow (wxCommandEvent & event) 1215 +{ 1216 +// 1217 +// selecting the current row 1218 +// 1219 + TableView->SelectRow (CurrentEvtRow); 208 1220 } 209 1221 210 -bool MyQueryView::IsSqlString(wxString & str) 1222 +void 1223 +MyQueryView::OnCmdSelectColumn (wxCommandEvent & event) 211 1224 { 212 -// checks if this one is an SQL string constant 213 - char word[4096]; 214 - strcpy(word, str.ToUTF8()); 215 - int len = strlen(word); 216 - if (len < 2) 217 - return false; 218 - if (word[0] == '\'' && word[len - 1] == '\'') 219 - return true; 220 - if (word[0] == '"' && word[len - 1] == '"') 221 - return true; 222 - return false; 1225 +// 1226 +// selecting column 1227 +// 1228 + TableView->SelectCol (CurrentEvtColumn); 223 1229 } 224 1230 225 -bool MyQueryView::IsSqlNumber(wxString & str) 1231 +void 1232 +MyQueryView::OnCmdCopy (wxCommandEvent & event) 226 1233 { 227 -// checks if this one is an SQL numeric constant 228 - double dbl; 229 - return str.ToDouble(&dbl); 1234 +// 1235 +// copying the selection into the clipboard 1236 +// 1237 + wxString copyData; 1238 + int row; 1239 + int col; 1240 + bool newRow; 1241 + bool firstRow = true; 1242 + for (row = 0; row < TableView->GetNumberRows (); row++) 1243 + { 1244 + newRow = true; 1245 + for (col = 0; col < TableView->GetNumberCols (); col++) 1246 + { 1247 + if (TableView->IsInSelection (row, col) == true) 1248 + { 1249 + // ok, this cell is included into the selection to copy 1250 + if (firstRow == true) 1251 + { 1252 + newRow = false; 1253 + firstRow = false; 1254 + } 1255 + else if (newRow == true) 1256 + { 1257 + newRow = false; 1258 + copyData += wxT ("\n"); 1259 + } 1260 + else 1261 + copyData += wxT ("\t"); 1262 + copyData += TableView->GetCellValue (row, col); 1263 + } 1264 + } 1265 + } 1266 + if (wxTheClipboard->Open ()) 1267 + { 1268 + wxTheClipboard->SetData (new wxTextDataObject (copyData)); 1269 + wxTheClipboard->Close (); 1270 + } 230 1271 } 231 1272 232 -bool MyQueryView::IsSqliteExtra(wxString & str) 1273 +void 1274 +MyQueryView::OnCmdBlob (wxCommandEvent & event) 233 1275 { 234 -// checks if this one is an extra SQLite keyword 235 - if (str.CmpNoCase(wxT("asc")) == 0) 236 - return true; 237 - if (str.CmpNoCase(wxT("desc")) == 0) 238 - return true; 239 - if (str.CmpNoCase(wxT("null")) == 0) 240 - return true; 241 - if (str.CmpNoCase(wxT("trigger")) == 0) 242 - return true; 243 - if (str.CmpNoCase(wxT("for")) == 0) 244 - return true; 245 - if (str.CmpNoCase(wxT("each")) == 0) 246 - return true; 247 - if (str.CmpNoCase(wxT("row")) == 0) 248 - return true; 249 - if (str.CmpNoCase(wxT("begin")) == 0) 250 - return true; 251 - if (str.CmpNoCase(wxT("end")) == 0) 252 - return true; 253 - if (str.CmpNoCase(wxT("before")) == 0) 254 - return true; 255 - if (str.CmpNoCase(wxT("after")) == 0) 256 - return true; 257 - if (str.CmpNoCase(wxT("virtual")) == 0) 258 - return true; 259 - return false; 1276 +// 1277 +// exploring some BLOB value 1278 +// 1279 + if (!CurrentBlob) 1280 + return; 1281 + BlobExplorerDialog dlg; 1282 + dlg.Create (MainFrame, CurrentBlob->GetBlobSize (), 1283 + CurrentBlob->GetBlob ()); 1284 + dlg.ShowModal (); 260 1285 } 261 1286 262 -bool MyQueryView::IsSqlFunction(wxString & str, char next_c) 1287 +void 1288 +MyQueryView::OnCmdBlobIn (wxCommandEvent & event) 263 1289 { 264 -// checks if this one is an SQL function 265 - if (next_c != '(') 266 - return false; 267 - if (str.CmpNoCase(wxT("raise")) == 0) 268 - return true; 269 - if (str.CmpNoCase(wxT("avg")) == 0) 270 - return true; 271 - if (str.CmpNoCase(wxT("count")) == 0) 272 - return true; 273 - if (str.CmpNoCase(wxT("group_concat")) == 0) 274 - return true; 275 - if (str.CmpNoCase(wxT("max")) == 0) 276 - return true; 277 - if (str.CmpNoCase(wxT("min")) == 0) 278 - return true; 279 - if (str.CmpNoCase(wxT("sum")) == 0) 280 - return true; 281 - if (str.CmpNoCase(wxT("total")) == 0) 282 - return true; 283 - if (str.CmpNoCase(wxT("abs")) == 0) 284 - return true; 285 - if (str.CmpNoCase(wxT("coalesce")) == 0) 286 - return true; 287 - if (str.CmpNoCase(wxT("glob")) == 0) 288 - return true; 289 - if (str.CmpNoCase(wxT("ifnull")) == 0) 290 - return true; 291 - if (str.CmpNoCase(wxT("hex")) == 0) 292 - return true; 293 - if (str.CmpNoCase(wxT("last_insert_rowid")) == 0) 294 - return true; 295 - if (str.CmpNoCase(wxT("length")) == 0) 296 - return true; 297 - if (str.CmpNoCase(wxT("load_extension")) == 0) 298 - return true; 299 - if (str.CmpNoCase(wxT("lower")) == 0) 300 - return true; 301 - if (str.CmpNoCase(wxT("ltrim")) == 0) 302 - return true; 303 - if (str.CmpNoCase(wxT("nullif")) == 0) 304 - return true; 305 - if (str.CmpNoCase(wxT("quote")) == 0) 306 - return true; 307 - if (str.CmpNoCase(wxT("random")) == 0) 308 - return true; 309 - if (str.CmpNoCase(wxT("randomblob")) == 0) 310 - return true; 311 - if (str.CmpNoCase(wxT("replace")) == 0) 312 - return true; 313 - if (str.CmpNoCase(wxT("round")) == 0) 314 - return true; 315 - if (str.CmpNoCase(wxT("rtrim")) == 0) 316 - return true; 317 - if (str.CmpNoCase(wxT("soundex")) == 0) 318 - return true; 319 - if (str.CmpNoCase(wxT("sqlite_version")) == 0) 320 - return true; 321 - if (str.CmpNoCase(wxT("substr")) == 0) 322 - return true; 323 - if (str.CmpNoCase(wxT("trim")) == 0) 324 - return true; 325 - if (str.CmpNoCase(wxT("typeof")) == 0) 326 - return true; 327 - if (str.CmpNoCase(wxT("upper")) == 0) 328 - return true; 329 - if (str.CmpNoCase(wxT("zeroblob")) == 0) 330 - return true; 331 - return false; 1290 +// importing an external file into a BLOB-value 1291 + FILE *in = NULL; 1292 + char path[2048]; 1293 + int rd; 1294 + int maxSize = 1024 * 1024; // limit BLOB size to 1MB 1295 + wxString fileList; 1296 + wxString rowid; 1297 + wxString sql; 1298 + wxString blobValue; 1299 + wxString hex; 1300 + MyVariant *value; 1301 + bool error = false; 1302 + unsigned char *buffer = NULL; 1303 + int ret; 1304 + char *errMsg = NULL; 1305 + wxString lastDir; 1306 + fileList = 1307 + wxT 1308 + ("BLOB Document (*.jpg;*.jpeg;*.png;*.gif;*.pdf;*.zip)|*.jpg;*.jpeg;*.png;*.gif;*.pdf;*.zip|"); 1309 + fileList += 1310 + wxT ("Image (*.jpg;*.jpeg;*.png;*.gif)|*.jpg;*.jpeg;*.png;*.gif|"); 1311 + fileList += 1312 + wxT 1313 + ("JPEG Image (*.jpg;*.jpeg)|*.jpg;*.jpeg|PNG Image (*.png)|*.png|GIF Image (*.gif)|*.gif"); 1314 + fileList += 1315 + wxT 1316 + ("PDF Document (*.pdf)|*.pdf|ZIP Archive|(*.zip)|All files (*.*)|*.*"); 1317 + wxFileDialog *fileDialog = 1318 + new wxFileDialog (this, wxT ("loading a BLOB value"), 1319 + wxT (""), wxT (""), fileList, 1320 + wxFD_OPEN | wxFD_FILE_MUST_EXIST, wxDefaultPosition, 1321 + wxDefaultSize, wxT ("filedlg")); 1322 + lastDir = MainFrame->GetLastDirectory (); 1323 + if (lastDir.Len () >= 1) 1324 + fileDialog->SetDirectory (lastDir); 1325 + ret = fileDialog->ShowModal (); 1326 + if (ret == wxID_OK) 1327 + { 1328 + strcpy (path, fileDialog->GetPath ().ToUTF8 ()); 1329 + in = fopen (path, "rb"); 1330 + if (!in) 1331 + { 1332 + wxMessageBox (wxT ("Cannot open '") + fileDialog->GetPath () + 1333 + wxT ("' for reading"), wxT ("spatialite-gui"), 1334 + wxOK | wxICON_ERROR, this); 1335 + return; 1336 + } 1337 + wxFileName file (fileDialog->GetPath ()); 1338 + lastDir = file.GetPath (); 1339 + MainFrame->SetLastDirectory (lastDir); 1340 + ::wxBeginBusyCursor (); 1341 + buffer = new unsigned char[maxSize]; 1342 + rd = fread (buffer, 1, maxSize, in); 1343 + if (rd == maxSize && !(feof (in))) 1344 + { 1345 + // exceding 1MB; it's too big for a BLOB 1346 + wxMessageBox (wxT 1347 + ("Selected file excedes 1MB; cowardly refusing to load it as a BLOB value ..."), 1348 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 1349 + this); 1350 + goto end; 1351 + } 1352 + if (ferror (in)) 1353 + { 1354 + // I/O error 1355 + wxMessageBox (wxT ("an I/O error occurred"), 1356 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 1357 + this); 1358 + goto end; 1359 + } 1360 + // 1361 + // preparing theSQL UPDATE statement 1362 + // 1363 + value = TableValues->GetValue (CurrentEvtRow, 0); 1364 + rowid.Printf (wxT ("%d"), value->GetIntValue ()); 1365 + HexBlobValue (buffer, rd, hex); 1366 + sql = 1367 + wxT ("UPDATE ") + TableName + wxT (" SET ") + 1368 + TableView->GetColLabelValue (CurrentEvtColumn); 1369 + sql += wxT (" = ") + hex + wxT (" WHERE ROWID = ") + rowid; 1370 + ret = 1371 + sqlite3_exec (MainFrame->GetSqlite (), sql.ToUTF8 (), NULL, NULL, 1372 + &errMsg); 1373 + if (ret != SQLITE_OK) 1374 + { 1375 + wxMessageBox (wxT ("SQLite SQL error: ") + 1376 + wxString::FromUTF8 (errMsg), 1377 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 1378 + this); 1379 + sqlite3_free (errMsg); 1380 + error = true; 1381 + } 1382 + ::wxEndBusyCursor (); 1383 + value = TableValues->GetValue (CurrentEvtRow, CurrentEvtColumn); 1384 + if (error == false) 1385 + { 1386 + // updating the Grid cell 1387 + blobValue.Printf (wxT ("BLOB sz=%d "), rd); 1388 + switch (MainFrame->GuessBlobType (rd, buffer)) 1389 + { 1390 + case MyFrame::BLOB_EXIF: 1391 + case MyFrame::BLOB_JFIF: 1392 + case MyFrame::BLOB_JPEG: 1393 + blobValue += wxT ("JPEG image"); 1394 + break; 1395 + case MyFrame::BLOB_PNG: 1396 + blobValue += wxT ("PNG image"); 1397 + break; 1398 + case MyFrame::BLOB_GIF: 1399 + blobValue += wxT ("GIF image"); 1400 + break; 1401 + case MyFrame::BLOB_PDF: 1402 + blobValue += wxT ("PDF document"); 1403 + break; 1404 + case MyFrame::BLOB_ZIP: 1405 + blobValue += wxT ("ZIP archive"); 1406 + break; 1407 + default: 1408 + blobValue += wxT ("UNKNOWN type"); 1409 + }; 1410 + TableView->SetCellValue (CurrentEvtRow, CurrentEvtColumn, 1411 + blobValue); 1412 + TableView->SetCellTextColour (CurrentEvtRow, CurrentEvtColumn, 1413 + wxColour (0, 0, 192)); 1414 + TableView->SetCellBackgroundColour (CurrentEvtRow, 1415 + CurrentEvtColumn, 1416 + wxColour (255, 255, 204)); 1417 + TableView->ForceRefresh (); 1418 + } 1419 + } 1420 + end: 1421 +// clean-up 1422 + if (in) 1423 + fclose (in); 1424 + if (buffer) 1425 + delete[]buffer; 332 1426 } 333 1427 334 -bool MyQueryView::IsSqlGeoFunction(wxString & str, char next_c) 1428 +void 1429 +MyQueryView::HexBlobValue (unsigned char *blob, int size, wxString & hex) 335 1430 { 336 -// checks if this one is an SQL geo-function 337 - if (next_c != '(') 338 - return false; 339 - if (str.CmpNoCase(wxT("MakePoint")) == 0) 340 - return true; 341 - if (str.CmpNoCase(wxT("BuildMbr")) == 0) 342 - return true; 343 - if (str.CmpNoCase(wxT("BuildCircleMbr")) == 0) 344 - return true; 345 - if (str.CmpNoCase(wxT("MbrMinX")) == 0) 346 - return true; 347 - if (str.CmpNoCase(wxT("MbrMinY")) == 0) 348 - return true; 349 - if (str.CmpNoCase(wxT("MbrMaxX")) == 0) 350 - return true; 351 - if (str.CmpNoCase(wxT("MbrMaxY")) == 0) 352 - return true; 353 - if (str.CmpNoCase(wxT("GeomFromText")) == 0) 354 - return true; 355 - if (str.CmpNoCase(wxT("PointFromText")) == 0) 356 - return true; 357 - if (str.CmpNoCase(wxT("LineFromText")) == 0) 358 - return true; 359 - if (str.CmpNoCase(wxT("LineStringFromText")) == 0) 360 - return true; 361 - if (str.CmpNoCase(wxT("PolyFromText")) == 0) 362 - return true; 363 - if (str.CmpNoCase(wxT("PolygonFromText")) == 0) 364 - return true; 365 - if (str.CmpNoCase(wxT("MPointFromText")) == 0) 366 - return true; 367 - if (str.CmpNoCase(wxT("MultiPointFromText")) == 0) 368 - return true; 369 - if (str.CmpNoCase(wxT("MLineFromText")) == 0) 370 - return true; 371 - if (str.CmpNoCase(wxT("MultiLineStringFromText")) == 0) 372 - return true; 373 - if (str.CmpNoCase(wxT("MPolyFromText")) == 0) 374 - return true; 375 - if (str.CmpNoCase(wxT("MultiPolygonFromText")) == 0) 376 - return true; 377 - if (str.CmpNoCase(wxT("GeomCollFromText")) == 0) 378 - return true; 379 - if (str.CmpNoCase(wxT("GeometryCollectionFromText")) == 0) 380 - return true; 381 - if (str.CmpNoCase(wxT("GeomFromWKB")) == 0) 382 - return true; 383 - if (str.CmpNoCase(wxT("PointFromWKB")) == 0) 384 - return true; 385 - if (str.CmpNoCase(wxT("LineFromWKB")) == 0) 386 - return true; 387 - if (str.CmpNoCase(wxT("LineStringFromWKB")) == 0) 388 - return true; 389 - if (str.CmpNoCase(wxT("PolyFromWKB")) == 0) 390 - return true; 391 - if (str.CmpNoCase(wxT("PolygonFromWKB")) == 0) 392 - return true; 393 - if (str.CmpNoCase(wxT("MPointFromWKB")) == 0) 394 - return true; 395 - if (str.CmpNoCase(wxT("MultiPointFromWKB")) == 0) 396 - return true; 397 - if (str.CmpNoCase(wxT("MLineFromWKB")) == 0) 398 - return true; 399 - if (str.CmpNoCase(wxT("MultiLineStringFromWKB")) == 0) 400 - return true; 401 - if (str.CmpNoCase(wxT("MPolyFromWKB")) == 0) 402 - return true; 403 - if (str.CmpNoCase(wxT("MultiPolygonFromWKB")) == 0) 404 - return true; 405 - if (str.CmpNoCase(wxT("GeomCollFromWKB")) == 0) 406 - return true; 407 - if (str.CmpNoCase(wxT("GeometryCollectionFromWKB")) == 0) 408 - return true; 409 - if (str.CmpNoCase(wxT("AsText")) == 0) 410 - return true; 411 - if (str.CmpNoCase(wxT("AsBinary")) == 0) 412 - return true; 413 - if (str.CmpNoCase(wxT("Dimension")) == 0) 414 - return true; 415 - if (str.CmpNoCase(wxT("GeometryType")) == 0) 416 - return true; 417 - if (str.CmpNoCase(wxT("SRID")) == 0) 418 - return true; 419 - if (str.CmpNoCase(wxT("SetSRID")) == 0) 420 - return true; 421 - if (str.CmpNoCase(wxT("IsEmpty")) == 0) 422 - return true; 423 - if (str.CmpNoCase(wxT("IsSimple")) == 0) 424 - return true; 425 - if (str.CmpNoCase(wxT("IsValid")) == 0) 426 - return true; 427 - if (str.CmpNoCase(wxT("Boundary")) == 0) 428 - return true; 429 - if (str.CmpNoCase(wxT("Envelope")) == 0) 430 - return true; 431 - if (str.CmpNoCase(wxT("X")) == 0) 432 - return true; 433 - if (str.CmpNoCase(wxT("Y")) == 0) 434 - return true; 435 - if (str.CmpNoCase(wxT("StartPoint")) == 0) 436 - return true; 437 - if (str.CmpNoCase(wxT("EndPoint")) == 0) 438 - return true; 439 - if (str.CmpNoCase(wxT("GLength")) == 0) 440 - return true; 441 - if (str.CmpNoCase(wxT("IsClosed")) == 0) 442 - return true; 443 - if (str.CmpNoCase(wxT("IsRing")) == 0) 444 - return true; 445 - if (str.CmpNoCase(wxT("Simplify")) == 0) 446 - return true; 447 - if (str.CmpNoCase(wxT("SimplifyPreserveTopology")) == 0) 448 - return true; 449 - if (str.CmpNoCase(wxT("NumPoints")) == 0) 450 - return true; 451 - if (str.CmpNoCase(wxT("PointN")) == 0) 452 - return true; 453 - if (str.CmpNoCase(wxT("Centroid")) == 0) 454 - return true; 455 - if (str.CmpNoCase(wxT("PointOnSurface")) == 0) 456 - return true; 457 - if (str.CmpNoCase(wxT("Area")) == 0) 458 - return true; 459 - if (str.CmpNoCase(wxT("ExteriorRing")) == 0) 460 - return true; 461 - if (str.CmpNoCase(wxT("NumInteriorRing")) == 0) 462 - return true; 463 - if (str.CmpNoCase(wxT("NumInteriorRings")) == 0) 464 - return true; 465 - if (str.CmpNoCase(wxT("InteriorRingN")) == 0) 466 - return true; 467 - if (str.CmpNoCase(wxT("NumGeometries")) == 0) 468 - return true; 469 - if (str.CmpNoCase(wxT("GeometryN")) == 0) 470 - return true; 471 - if (str.CmpNoCase(wxT("MbrEqual")) == 0) 472 - return true; 473 - if (str.CmpNoCase(wxT("MbrDisjoint")) == 0) 474 - return true; 475 - if (str.CmpNoCase(wxT("MbrTouches")) == 0) 476 - return true; 477 - if (str.CmpNoCase(wxT("MbrWithin")) == 0) 478 - return true; 479 - if (str.CmpNoCase(wxT("MbrOverlaps")) == 0) 480 - return true; 481 - if (str.CmpNoCase(wxT("MbrIntersects")) == 0) 482 - return true; 483 - if (str.CmpNoCase(wxT("MbrContains")) == 0) 484 - return true; 485 - if (str.CmpNoCase(wxT("Equals")) == 0) 486 - return true; 487 - if (str.CmpNoCase(wxT("Disjoint")) == 0) 488 - return true; 489 - if (str.CmpNoCase(wxT("Touches")) == 0) 490 - return true; 491 - if (str.CmpNoCase(wxT("Within")) == 0) 492 - return true; 493 - if (str.CmpNoCase(wxT("Overlaps")) == 0) 494 - return true; 495 - if (str.CmpNoCase(wxT("Crosses")) == 0) 496 - return true; 497 - if (str.CmpNoCase(wxT("Intersects")) == 0) 498 - return true; 499 - if (str.CmpNoCase(wxT("Contains")) == 0) 500 - return true; 501 - if (str.CmpNoCase(wxT("Relate")) == 0) 502 - return true; 503 - if (str.CmpNoCase(wxT("Distance")) == 0) 504 - return true; 505 - if (str.CmpNoCase(wxT("Intersection")) == 0) 506 - return true; 507 - if (str.CmpNoCase(wxT("Difference")) == 0) 508 - return true; 509 - if (str.CmpNoCase(wxT("GUnion")) == 0) 510 - return true; 511 - if (str.CmpNoCase(wxT("SymDifference")) == 0) 512 - return true; 513 - if (str.CmpNoCase(wxT("Buffer")) == 0) 514 - return true; 515 - if (str.CmpNoCase(wxT("ConvexHull")) == 0) 516 - return true; 517 - if (str.CmpNoCase(wxT("Transform")) == 0) 518 - return true; 519 - if (str.CmpNoCase(wxT("ShiftCoords")) == 0) 520 - return true; 521 - if (str.CmpNoCase(wxT("ShiftCoordinates")) == 0) 522 - return true; 523 - if (str.CmpNoCase(wxT("ScaleCoords")) == 0) 524 - return true; 525 - if (str.CmpNoCase(wxT("ScaleCoordinates")) == 0) 526 - return true; 527 - if (str.CmpNoCase(wxT("RotateCoords")) == 0) 528 - return true; 529 - if (str.CmpNoCase(wxT("RotateCoordinates")) == 0) 530 - return true; 531 - if (str.CmpNoCase(wxT("ReflectCoords")) == 0) 532 - return true; 533 - if (str.CmpNoCase(wxT("ReflectCoordinates")) == 0) 534 - return true; 535 - if (str.CmpNoCase(wxT("SwapCoords")) == 0) 536 - return true; 537 - if (str.CmpNoCase(wxT("SwapCoordinates")) == 0) 538 - return true; 539 - if (str.CmpNoCase(wxT("InitSpatialMetaData")) == 0) 540 - return true; 541 - if (str.CmpNoCase(wxT("AddGeometryColumn")) == 0) 542 - return true; 543 - if (str.CmpNoCase(wxT("RecoverGeometryColumn")) == 0) 544 - return true; 545 - if (str.CmpNoCase(wxT("DiscardGeometryColumn")) == 0) 546 - return true; 547 - if (str.CmpNoCase(wxT("CreateSpatialIndex")) == 0) 548 - return true; 549 - if (str.CmpNoCase(wxT("CreateMbrCache")) == 0) 550 - return true; 551 - if (str.CmpNoCase(wxT("DisableSpatialIndex")) == 0) 552 - return true; 553 - if (str.CmpNoCase(wxT("FilterMbrWithin")) == 0) 554 - return true; 555 - if (str.CmpNoCase(wxT("FilterMbrContains")) == 0) 556 - return true; 557 - if (str.CmpNoCase(wxT("FilterMbrIntersects")) == 0) 558 - return true; 559 - if (str.CmpNoCase(wxT("BuildMbrFilter")) == 0) 560 - return true; 561 - return false; 1431 +// 1432 +// builds the HEX BLOB as X'01234567890abcdef' 1433 +// 1434 + int i; 1435 + wxString digit; 1436 + hex = wxT ("X'"); 1437 + for (i = 0; i < size; i++) 1438 + { 1439 + digit.Printf (wxT ("%02x"), *(blob + i)); 1440 + hex += digit; 1441 + } 1442 + hex += wxT ("'"); 562 1443 } 563 1444 564 -void MyQueryView::DoSqlSyntaxColor() 1445 +void 1446 +MyQueryView::OnCmdBlobOut (wxCommandEvent & event) 565 1447 { 566 -// 567 -// evidencing a nice colored SQL syntax 568 -// 569 - IgnoreEvent = true; 570 - SqlCtrl->Hide(); 571 - wxTextAttr normal_style(wxColour(128, 128, 128), wxColour(255, 255, 255), 572 - wxFont(10, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, 573 - wxFONTWEIGHT_NORMAL)); 574 - wxTextAttr sql_style(wxColour(0, 0, 255), wxColour(255, 255, 255), 575 - wxFont(10, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, 576 - wxFONTWEIGHT_BOLD)); 577 - wxTextAttr const_style(wxColour(255, 0, 255), wxColour(255, 255, 255), 578 - wxFont(10, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, 579 - wxFONTWEIGHT_NORMAL)); 580 - wxTextAttr fnct_style(wxColour(192, 128, 0), wxColour(255, 255, 255), 581 - wxFont(10, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, 582 - wxFONTWEIGHT_BOLD)); 583 - wxTextAttr bracket_style(wxColour(255, 0, 0), wxColour(192, 192, 192), 584 - wxFont(12, wxFONTFAMILY_ROMAN, wxFONTSTYLE_NORMAL, 585 - wxFONTWEIGHT_BOLD)); 586 - wxString sql = SqlCtrl->GetValue(); 587 -// setting the base style 588 - SqlCtrl->SetStyle(0, sql.Len(), normal_style); 589 - wxString right = sql; 590 - int from; 591 - int to = 0; 592 - int i; 593 - char c; 594 - char next_c; 595 - SqlTokenizer tokenizer(sql); 596 - while (tokenizer.HasMoreTokens()) 597 - { 598 - wxString token = tokenizer.GetNextToken(); 599 - from = to + right.Find(token); 600 - to = from + token.Len(); 601 - // extracting the unparsed portion of the SQL string 602 - right = sql.Mid(to); 603 - next_c = '\0'; 604 - for (i = 0; i < (int) right.Len(); i++) 605 - { 606 - c = right.GetChar(i); 607 - if (c == ' ' || c == '\t' || c == '\r' || c == '\n') 608 - continue; 609 - next_c = c; 610 - break; 611 - } 612 - char word[4096]; 613 - strcpy(word, token.ToUTF8()); 614 - if (gaiaIsReservedSqliteName(word)) 615 - { 616 - // setting the SQL keyword style 617 - SqlCtrl->SetStyle(from, to, sql_style); 618 - } else if (IsSqliteExtra(token)) 619 - { 620 - // setting the SQL keyword style 621 - SqlCtrl->SetStyle(from, to, sql_style); 622 - } else if (IsSqlString(token) == true) 623 - { 624 - // setting the SQL string constant style 625 - SqlCtrl->SetStyle(from, to, const_style); 626 - } else if (IsSqlNumber(token) == true) 627 - { 628 - // setting the SQL numeric constant style 629 - SqlCtrl->SetStyle(from, to, const_style); 630 - } else if (IsSqlFunction(token, next_c) == true) 631 - { 632 - // setting the SQL function style 633 - SqlCtrl->SetStyle(from, to, fnct_style); 634 - } else if (IsSqlGeoFunction(token, next_c) == true) 635 - { 636 - // setting the SQL geo-function style 637 - SqlCtrl->SetStyle(from, to, fnct_style); 638 - } 639 - } 640 - if (BracketStart >= 0) 641 - { 642 - // evidencing an opening bracket 643 - SqlCtrl->SetStyle(BracketStart, BracketStart + 1, bracket_style); 644 - } 645 - if (BracketEnd >= 0) 646 - { 647 - // evidencing a closing bracket 648 - SqlCtrl->SetStyle(BracketEnd, BracketEnd + 1, bracket_style); 649 - } 650 - SqlCtrl->Show(); 651 - SqlCtrl->SetFocus(); 652 - IgnoreEvent = false; 1448 +// exporting to external file a BLOB-value 1449 + int blobType; 1450 + wxString fileName; 1451 + wxString fileType; 1452 + int ret; 1453 + wxString path; 1454 + FILE *out = NULL; 1455 + char xpath[2048]; 1456 + int wr; 1457 + wxString lastDir; 1458 + if (!CurrentBlob) 1459 + return; 1460 + blobType = 1461 + MainFrame->GuessBlobType (CurrentBlob->GetBlobSize (), 1462 + CurrentBlob->GetBlob ()); 1463 + switch (blobType) 1464 + { 1465 + case MyFrame::BLOB_EXIF: 1466 + case MyFrame::BLOB_JFIF: 1467 + case MyFrame::BLOB_JPEG: 1468 + fileName = wxT ("image.jpg"); 1469 + fileType = wxT ("File JPEG (*.jpg;*.jpeg)|*.jpg"); 1470 + break; 1471 + case MyFrame::BLOB_PNG: 1472 + fileName = wxT ("image.png"); 1473 + fileType = wxT ("File PNG (*.png)|*.png"); 1474 + break; 1475 + case MyFrame::BLOB_GIF: 1476 + fileName = wxT ("image.gif"); 1477 + fileType = wxT ("File GIF (*.gif)|*.gif"); 1478 + break; 1479 + case MyFrame::BLOB_PDF: 1480 + fileName = wxT ("document.pdf"); 1481 + fileType = wxT ("PDF document (*.jpg;*.jpeg)|*.jpg"); 1482 + break; 1483 + case MyFrame::BLOB_ZIP: 1484 + fileName = wxT ("archive.zip"); 1485 + fileType = wxT ("ZIP Archive (*.zip)|*.zip"); 1486 + break; 1487 + default: 1488 + fileName = wxT ("file"); 1489 + }; 1490 + fileType += wxT ("|All files (*.*)|*.*"); 1491 + wxFileDialog *fileDialog = 1492 + new wxFileDialog (this, wxT ("exporting a BLOB value to file"), 1493 + wxT (""), fileName, fileType, 1494 + wxFD_SAVE | wxFD_OVERWRITE_PROMPT, wxDefaultPosition, 1495 + wxDefaultSize, wxT ("filedlg")); 1496 + lastDir = MainFrame->GetLastDirectory (); 1497 + if (lastDir.Len () >= 1) 1498 + fileDialog->SetDirectory (lastDir); 1499 + ret = fileDialog->ShowModal (); 1500 + if (ret == wxID_OK) 1501 + { 1502 + wxFileName file (fileDialog->GetPath ()); 1503 + path = file.GetPath (); 1504 + path += file.GetPathSeparator (); 1505 + path += file.GetName (); 1506 + switch (blobType) 1507 + { 1508 + case MyFrame::BLOB_EXIF: 1509 + case MyFrame::BLOB_JFIF: 1510 + case MyFrame::BLOB_JPEG: 1511 + path += wxT (".jpg"); 1512 + break; 1513 + case MyFrame::BLOB_PNG: 1514 + path += wxT (".png"); 1515 + break; 1516 + case MyFrame::BLOB_GIF: 1517 + path += wxT (".gif"); 1518 + break; 1519 + case MyFrame::BLOB_PDF: 1520 + path += wxT (".pdf"); 1521 + break; 1522 + case MyFrame::BLOB_ZIP: 1523 + path += wxT (".zip"); 1524 + break; 1525 + default: 1526 + path += file.GetExt (); 1527 + }; 1528 + strcpy (xpath, path.ToUTF8 ()); 1529 + out = fopen (xpath, "wb"); 1530 + if (!out) 1531 + { 1532 + wxMessageBox (wxT ("Cannot open '") + path + 1533 + wxT ("' for writing"), wxT ("spatialite-gui"), 1534 + wxOK | wxICON_ERROR, this); 1535 + return; 1536 + } 1537 + lastDir = file.GetPath (); 1538 + MainFrame->SetLastDirectory (lastDir); 1539 + ::wxBeginBusyCursor (); 1540 + wr = fwrite (CurrentBlob->GetBlob (), 1, CurrentBlob->GetBlobSize (), 1541 + out); 1542 + if (wr != CurrentBlob->GetBlobSize ()) 1543 + { 1544 + wxMessageBox (wxT ("an I/O error occurred"), 1545 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 1546 + this); 1547 + } 1548 + fclose (out); 1549 + ::wxEndBusyCursor (); 1550 + } 653 1551 } 654 1552 655 -void MyQueryView::OnSqlSyntaxColor(wxCommandEvent & event) 656 -{ 657 -// 658 -// EVENT: updating the SQL syntax 659 -// 660 - if (IgnoreEvent == true) 661 - { 662 - // processing is still in progress; ignoring any internally generated call 663 - return; 664 - } 665 - event.Skip(); 666 - EventBrackets(); 667 -} 668 - 669 -void MyQueryView::EvidBrackets(int on, int off) 1553 +void 1554 +MyQueryView::OnCmdBlobNull (wxCommandEvent & event) 670 1555 { 671 -// evidencing corresponding brackets [open/close] 672 - BracketStart = -1; 673 - BracketEnd = -1; 674 - if (on >= 0) 675 - BracketStart = on; 676 - if (off >= 0) 677 - BracketEnd = off; 678 - DoSqlSyntaxColor(); 679 -} 680 - 681 -void MyQueryView::EventBrackets() 682 -{ 683 -// 684 -// evidencing brackets [balancing open-close pairs] 685 -// 686 - if (IgnoreEvent == true) 687 - { 688 - // processing is still in progress; ignoring any internally generated call 689 - return; 690 - } 691 - int pos = SqlCtrl->GetInsertionPoint(); 692 - int on; 693 - int off; 694 - wxString sql = SqlCtrl->GetValue(); 695 - char pre = '\0'; 696 - char post = '\0'; 697 - if (pos > 0) 698 - pre = sql.GetChar(pos - 1); 699 - if (pos < (int) sql.Len()) 700 - post = sql.GetChar(pos); 701 - if (post == '(') 702 - { 703 - // positioned before an opening bracket 704 - if (CheckBrackets(pos, false, &on, &off) == true) 705 - EvidBrackets(on, off); 706 - else 707 - EvidBrackets(pos, -1); 708 - return; 709 - } 710 - if (pre == ')') 711 - { 712 - // positioned after a closing bracket 713 - if (CheckBrackets(pos - 1, true, &on, &off) == true) 714 - EvidBrackets(on, off); 715 - else 716 - EvidBrackets(-1, pos - 1); 717 - return; 718 - } 719 - EvidBrackets(-1, -1); 720 -} 721 - 722 -bool MyQueryView::CheckBrackets(int pos, bool reverse_direction, int *on, 723 - int *off) 724 -{ 725 -// trying to balance a brackets pair [opening/closing] 726 - int i; 727 - int len; 728 - int level = 0; 729 - char c; 730 - int single_quoted = 0; 731 - int double_quoted = 0; 732 - wxString sql = SqlCtrl->GetValue(); 733 - if (reverse_direction == true) 734 - { 735 - // going backward from CLOSE to OPEN 736 - for (i = pos - 1; i >= 0; i--) 737 - { 738 - c = sql.GetChar(i); 739 - if (c == '\'' && !double_quoted) 740 - { 741 - // single quoting start-stop 742 - if (single_quoted) 743 - single_quoted = 0; 744 - else 745 - single_quoted = 1; 746 - } 747 - if (c == '"' && !single_quoted) 748 - { 749 - // double quoting start-stop 750 - if (double_quoted) 751 - double_quoted = 0; 752 - else 753 - double_quoted = 1; 754 - } 755 - if (single_quoted || double_quoted) 756 - continue; 757 - if (c == ')') 758 - level++; 759 - if (c == '(') 760 - { 761 - if (level == 0) 762 - { 763 - *on = i; 764 - *off = pos; 765 - return true; 766 - } 767 - level--; 768 - } 769 - } 770 - } else 771 - { 772 - // going forward from OPEN to CLOSE 773 - len = sql.Len(); 774 - for (i = pos + 1; i < len; i++) 775 - { 776 - c = sql.GetChar(i); 777 - if (c == '\'' && !double_quoted) 778 - { 779 - // single quoting start-stop 780 - if (single_quoted) 781 - single_quoted = 0; 782 - else 783 - single_quoted = 1; 784 - } 785 - if (c == '"' && !single_quoted) 786 - { 787 - // double quoting start-stop 788 - if (double_quoted) 789 - double_quoted = 0; 790 - else 791 - double_quoted = 1; 792 - } 793 - if (single_quoted || double_quoted) 794 - continue; 795 - if (c == '(') 796 - level++; 797 - if (c == ')') 798 - { 799 - if (level == 0) 800 - { 801 - *on = pos; 802 - *off = i; 803 - return true; 804 - } 805 - level--; 806 - } 807 - } 808 - } 809 - return false; 810 -} 811 - 812 -MySqlControl::MySqlControl(MyQueryView * parent, wxWindowID id, const wxString & value, const wxPoint & pos, const wxSize & size, long style): 813 -wxTextCtrl(parent, id, value, pos, size, style) 814 -{ 815 -// 816 -// constructor: SQL text control 817 -// 818 - Parent = parent; 819 - Connect(wxID_ANY, wxEVT_LEFT_DOWN, 820 - (wxObjectEventFunction) & MySqlControl::OnSqlMousePosition); 821 - Connect(wxID_ANY, wxEVT_KEY_UP, 822 - (wxObjectEventFunction) & MySqlControl::OnSqlArrowPosition); 823 -} 824 - 825 -void MySqlControl::OnSqlMousePosition(wxMouseEvent & event) 826 -{ 827 -// 828 -// intercepting mouse clicks 829 -// 830 - if (Parent->IsIgnoreEvent() == true) 831 - return; 832 - event.Skip(); 833 - Parent->EventBrackets(); 834 -} 835 - 836 -void MySqlControl::OnSqlArrowPosition(wxKeyEvent & event) 837 -{ 838 -// 839 -// intercepting arrow keys 840 -// 841 - if (Parent->IsIgnoreEvent() == true) 842 - return; 843 - event.Skip(); 844 - int key_code = event.GetKeyCode(); 845 - switch (key_code) 846 - { 847 - case WXK_DELETE: 848 - case WXK_HOME: 849 - case WXK_LEFT: 850 - case WXK_UP: 851 - case WXK_RIGHT: 852 - case WXK_DOWN: 853 - case WXK_PAGEUP: 854 - case WXK_PAGEDOWN: 855 - case WXK_NUMPAD_DELETE: 856 - case WXK_NUMPAD_HOME: 857 - case WXK_NUMPAD_LEFT: 858 - case WXK_NUMPAD_UP: 859 - case WXK_NUMPAD_RIGHT: 860 - case WXK_NUMPAD_DOWN: 861 - case WXK_NUMPAD_PAGEUP: 862 - case WXK_NUMPAD_PAGEDOWN: 863 - Parent->EventBrackets(); 864 - break; 865 - default: 866 - break; 867 - }; 868 -} 869 - 870 -SqlTokenizer::SqlTokenizer(wxString & sql) 871 -{ 872 -// breaking tokens from an SQL expression 873 - Block = 1024; 874 - Max = Block; 875 - int i; 876 - char c; 877 - int single_quoted = 0; 878 - int double_quoted = 0; 879 - int white_space = 0; 880 - int start = -1; 881 - int len; 882 -// initial allocation for the token list 883 - TokenList = new wxString *[Max]; 884 - for (i = 0; i < Max; i++) 885 - TokenList[i] = NULL; 886 - Index = 0; 887 - for (i = 0; i < (int) sql.Len(); i++) 888 - { 889 - // scanning the SQL statement 890 - c = sql.GetChar(i); 891 - if (c == '\'' && !double_quoted) 892 - { 893 - if (single_quoted) 894 - { 895 - single_quoted = 0; 896 - len = i - start; 897 - len++; 898 - wxString *token = new wxString(sql.Mid(start, len)); 899 - Insert(token); 900 - start = -1; 901 - } else 902 - { 903 - single_quoted = 1; 904 - start = i; 905 - } 906 - continue; 907 - } 908 - if (c == '"' && !single_quoted) 909 - { 910 - if (double_quoted) 911 - { 912 - double_quoted = 0; 913 - len = i - start; 914 - len++; 915 - wxString *token = new wxString(sql.Mid(start, len)); 916 - Insert(token); 917 - start = -1; 918 - } else 919 - { 920 - double_quoted = 1; 921 - start = i; 922 - } 923 - continue; 924 - } 925 - if (single_quoted || double_quoted) 926 - continue; 927 - if (c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '(' 928 - || c == ')' || c == ';' || c == ',') 929 - { 930 - if (white_space) 931 - continue; 932 - if (start >= 0) 933 - { 934 - // ok, we have a valid SQL token 935 - len = i - start; 936 - wxString *token = new wxString(sql.Mid(start, len)); 937 - Insert(token); 938 - } 939 - start = -1; 940 - white_space = 1; 941 - continue; 942 - } 943 - white_space = 0; 944 - if (start < 0) 945 - start = i; 946 - } 947 - if (start >= 0) 948 - { 949 - // fetching the last token 950 - i = sql.Len(); 951 - len = i - start; 952 - wxString *token = new wxString(sql.Mid(start, len)); 953 - Insert(token); 954 - } 955 - Index = 0; 956 -} 957 - 958 -SqlTokenizer::~SqlTokenizer() 959 -{ 960 -// destructor 961 - wxString *token; 962 - Index = 0; 963 - while (1) 964 - { 965 - token = TokenList[Index]; 966 - if (token == NULL) 967 - break; 968 - delete token; 969 - Index++; 970 - } 971 - delete[]TokenList; 972 -} 973 - 974 -void SqlTokenizer::Expand() 975 -{ 976 -// expanding the token list 977 - int newSize = Max + Block; 978 - int i; 979 - wxString **newList = new wxString *[newSize]; 980 - for (i = 0; i < newSize; i++) 981 - newList[i] = NULL; 982 - for (i = 0; i < Max; i++) 983 - newList[i] = TokenList[i]; 984 - delete[]TokenList; 985 - TokenList = newList; 986 - Max = newSize; 987 -} 988 - 989 -void SqlTokenizer::Insert(wxString * token) 990 -{ 991 -// inserting a new token 992 - if (Index == (Max - 1)) 993 - Expand(); 994 - TokenList[Index++] = token; 995 -} 996 - 997 -bool SqlTokenizer::HasMoreTokens() 998 -{ 999 - wxString *token = TokenList[Index]; 1000 - if (token == NULL) 1001 - return false; 1002 - return true; 1003 -} 1004 - 1005 -wxString & SqlTokenizer::GetNextToken() 1006 -{ 1007 -// return the next token 1008 - wxString *token = TokenList[Index]; 1009 - Index++; 1010 - CurrentToken = *token; 1011 - return CurrentToken; 1556 +// setting to NULL a BLOB-value 1557 + wxString rowid; 1558 + wxString sql; 1559 + int ret; 1560 + char *errMsg = NULL; 1561 + bool error = false; 1562 + MyVariant *value; 1563 + value = TableValues->GetValue (CurrentEvtRow, 0); 1564 + rowid.Printf (wxT ("%d"), value->GetIntValue ()); 1565 + sql = 1566 + wxT ("UPDATE ") + TableName + wxT (" SET ") + 1567 + TableView->GetColLabelValue (CurrentEvtColumn); 1568 + sql += wxT (" = NULL WHERE ROWID = ") + rowid; 1569 + ret = 1570 + sqlite3_exec (MainFrame->GetSqlite (), sql.ToUTF8 (), NULL, NULL, 1571 + &errMsg); 1572 + if (ret != SQLITE_OK) 1573 + { 1574 + wxMessageBox (wxT ("SQLite SQL error: ") + 1575 + wxString::FromUTF8 (errMsg), wxT ("spatialite-gui"), 1576 + wxOK | wxICON_ERROR, this); 1577 + sqlite3_free (errMsg); 1578 + error = true; 1579 + } 1580 + if (error == false) 1581 + { 1582 + // updating the Grid cell 1583 + TableView->SetCellValue (CurrentEvtRow, CurrentEvtColumn, 1584 + wxT ("NULL")); 1585 + TableView->SetCellTextColour (CurrentEvtRow, CurrentEvtColumn, 1586 + wxColour (0, 0, 192)); 1587 + TableView->SetCellBackgroundColour (CurrentEvtRow, CurrentEvtColumn, 1588 + wxColour (255, 255, 204)); 1589 + TableView->ForceRefresh (); 1590 + } 1012 1591 }
Deleted ResultSetView.cpp.
1 -/* 2 -/ ResultSetView.cpp 3 -/ a panel to show SQL query results 4 -/ 5 -/ version 1.2, 2008 October 9 6 -/ 7 -/ Author: Sandro Furieri a-furieri@lqt.it 8 -/ 9 -/ Copyright (C) 2008 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 -#include "wx/filename.h" 30 - 31 -// 32 -// ICONs in XPM format [universally portable] 33 -// 34 -#include "icons/rs_first.xpm" 35 -#include "icons/rs_last.xpm" 36 -#include "icons/rs_next.xpm" 37 -#include "icons/rs_previous.xpm" 38 -#include "icons/refresh.xpm" 39 - 40 -#if defined(_WIN32) || defined (__MINGW32__) 41 -#define FORMAT_64 "%I64d" 42 -#else 43 -#define FORMAT_64 "%lld" 44 -#endif 45 - 46 -MyResultSetView::MyResultSetView(MyFrame * parent, wxWindowID id): 47 -wxPanel(parent, id, wxDefaultPosition, wxSize(440, 480), wxBORDER_SUNKEN) 48 -{ 49 -// 50 -// constructor: a frame for SQL Result Sets 51 -// 52 - RsBlock = 500; // the ResultSet block size 53 - RowIds = new sqlite3_int64[RsBlock]; 54 - ReadOnly = true; 55 - InsertRow = NULL; 56 - MainFrame = parent; 57 - BtnRsFirst = 58 - new wxBitmapButton(this, ID_RS_FIRST, wxBitmap(rs_first_xpm), 59 - wxPoint(5, 400), wxSize(32, 32)); 60 - BtnRsFirst->SetToolTip(wxT("ResultSet: go to first row")); 61 - BtnRsPrevious = 62 - new wxBitmapButton(this, ID_RS_PREVIOUS, wxBitmap(rs_previous_xpm), 63 - wxPoint(55, 400), wxSize(32, 32)); 64 - BtnRsPrevious->SetToolTip(wxT("ResultSet: go to previous block")); 65 - BtnRefresh = 66 - new wxBitmapButton(this, ID_REFRESH, wxBitmap(refresh_xpm), 67 - wxPoint(55, 400), wxSize(32, 32)); 68 - BtnRefresh->SetToolTip(wxT("ResultSet: refresh")); 69 - BtnRsNext = 70 - new wxBitmapButton(this, ID_RS_NEXT, wxBitmap(rs_next_xpm), 71 - wxPoint(105, 400), wxSize(32, 32)); 72 - BtnRsNext->SetToolTip(wxT("ResultSet: go to next block")); 73 - BtnRsLast = 74 - new wxBitmapButton(this, ID_RS_LAST, wxBitmap(rs_last_xpm), 75 - wxPoint(155, 400), wxSize(32, 32)); 76 - BtnRsLast->SetToolTip(wxT("ResultSet: go to last row")); 77 - RsCurrentBlock = 78 - new wxStaticText(this, ID_RS_BLOCK, wxT(""), wxPoint(210, 400), 79 - wxSize(200, 18)); 80 - TableView = NULL; 81 - TableBlobs = NULL; 82 - TableValues = NULL; 83 - CurrentBlob = NULL; 84 -// setting up event handlers 85 - Connect(ID_RS_FIRST, wxEVT_COMMAND_BUTTON_CLICKED, 86 - (wxObjectEventFunction) & MyResultSetView::OnRsFirst); 87 - Connect(ID_RS_PREVIOUS, wxEVT_COMMAND_BUTTON_CLICKED, 88 - (wxObjectEventFunction) & MyResultSetView::OnRsPrevious); 89 - Connect(ID_RS_NEXT, wxEVT_COMMAND_BUTTON_CLICKED, 90 - (wxObjectEventFunction) & MyResultSetView::OnRsNext); 91 - Connect(ID_RS_LAST, wxEVT_COMMAND_BUTTON_CLICKED, 92 - (wxObjectEventFunction) & MyResultSetView::OnRsLast); 93 - Connect(ID_REFRESH, wxEVT_COMMAND_BUTTON_CLICKED, 94 - (wxObjectEventFunction) & MyResultSetView::OnRefresh); 95 - Connect(wxID_ANY, wxEVT_SIZE, 96 - (wxObjectEventFunction) & MyResultSetView::OnSize); 97 - Connect(wxID_ANY, wxEVT_GRID_SELECT_CELL, 98 - (wxObjectEventFunction) & MyResultSetView::OnCellSelected); 99 - Connect(wxID_ANY, wxEVT_GRID_CELL_RIGHT_CLICK, 100 - (wxObjectEventFunction) & MyResultSetView::OnRightClick); 101 - Connect(wxID_ANY, wxEVT_GRID_CELL_CHANGE, 102 - (wxObjectEventFunction) & MyResultSetView::OnCellChanged); 103 - Connect(Grid_Delete, wxEVT_COMMAND_MENU_SELECTED, 104 - (wxObjectEventFunction) & MyResultSetView::OnCmdDelete); 105 - Connect(Grid_Insert, wxEVT_COMMAND_MENU_SELECTED, 106 - (wxObjectEventFunction) & MyResultSetView::OnCmdInsert); 107 - Connect(Grid_Abort, wxEVT_COMMAND_MENU_SELECTED, 108 - (wxObjectEventFunction) & MyResultSetView::OnCmdAbort); 109 - Connect(Grid_Clear, wxEVT_COMMAND_MENU_SELECTED, 110 - (wxObjectEventFunction) & MyResultSetView::OnCmdClearSelection); 111 - Connect(Grid_All, wxEVT_COMMAND_MENU_SELECTED, 112 - (wxObjectEventFunction) & MyResultSetView::OnCmdSelectAll); 113 - Connect(Grid_Row, wxEVT_COMMAND_MENU_SELECTED, 114 - (wxObjectEventFunction) & MyResultSetView::OnCmdSelectRow); 115 - Connect(Grid_Column, wxEVT_COMMAND_MENU_SELECTED, 116 - (wxObjectEventFunction) & MyResultSetView::OnCmdSelectColumn); 117 - Connect(Grid_Copy, wxEVT_COMMAND_MENU_SELECTED, 118 - (wxObjectEventFunction) & MyResultSetView::OnCmdCopy); 119 - Connect(Grid_Blob, wxEVT_COMMAND_MENU_SELECTED, 120 - (wxObjectEventFunction) & MyResultSetView::OnCmdBlob); 121 - Connect(Grid_BlobIn, wxEVT_COMMAND_MENU_SELECTED, 122 - (wxObjectEventFunction) & MyResultSetView::OnCmdBlobIn); 123 - Connect(Grid_BlobOut, wxEVT_COMMAND_MENU_SELECTED, 124 - (wxObjectEventFunction) & MyResultSetView::OnCmdBlobOut); 125 - Connect(Grid_BlobNull, wxEVT_COMMAND_MENU_SELECTED, 126 - (wxObjectEventFunction) & MyResultSetView::OnCmdBlobNull); 127 -} 128 - 129 -MyResultSetView::~MyResultSetView() 130 -{ 131 -// destructor 132 - if (RowIds) 133 - delete[]RowIds; 134 - if (InsertRow) 135 - delete InsertRow; 136 - if (TableBlobs) 137 - delete TableBlobs; 138 - if (TableValues) 139 - delete TableValues; 140 -} 141 - 142 -void MyResultSetView::ShowControls() 143 -{ 144 -// 145 -// making all ResultSet controls to be visible 146 -// 147 - BtnRsFirst->Show(true); 148 - BtnRsPrevious->Show(true); 149 - BtnRsNext->Show(true); 150 - BtnRsLast->Show(true); 151 - BtnRefresh->Show(true); 152 - RsCurrentBlock->Show(true); 153 - if (TableView) 154 - TableView->Show(true); 155 -} 156 - 157 -void MyResultSetView::HideControls() 158 -{ 159 -// 160 -// making all controls to be invisible 161 -// 162 - BtnRsFirst->Show(false); 163 - BtnRsPrevious->Show(false); 164 - BtnRsNext->Show(false); 165 - BtnRsLast->Show(false); 166 - BtnRefresh->Show(false); 167 - RsCurrentBlock->Show(false); 168 - if (TableView) 169 - TableView->Show(false); 170 -} 171 - 172 -void MyResultSetView::EditTable(wxString & sql, int *primaryKeys, int *blobCols, 173 - wxString & table) 174 -{ 175 -// 176 -// starting the edit table sequence 177 -// 178 - int i; 179 - for (i = 0; i < 1024; i++) 180 - { 181 - PrimaryKeys[i] = *(primaryKeys + i); 182 - BlobColumns[i] = *(blobCols + i); 183 - } 184 - ReadOnly = false; 185 - TableName = table; 186 - MainFrame->GetQueryView()->GetSqlCtrl()->SetValue(sql); 187 - if (ExecuteSql(sql, 0, ReadOnly) == false) 188 - wxMessageBox(SqlErrorMsg, wxT("spatialite-gui"), wxOK | wxICON_ERROR, 189 - MainFrame); 190 -} 191 - 192 -bool MyResultSetView::ExecuteSql(wxString & sql, int from, bool read_only) 193 -{ 194 -// 195 -// executing some SQL statement 196 -// 197 - ReadOnly = read_only; 198 - char *xSql = NULL; 199 - char err_msg[2048]; 200 - char dummy[1024]; 201 - int columns; 202 - int i_col; 203 - int i_row; 204 - int end_row = 0; 205 - wxString blobType; 206 - MyVariantList list; 207 - MyRowVariant *row; 208 - MyVariant *value; 209 - wxString cellValue; 210 - wxString currentBlock; 211 - sqlite3_stmt *stmt; 212 - sqlite3 *sqlite = MainFrame->GetSqlite(); 213 - SqlErrorMsg = wxT(""); 214 - if (TableView) 215 - TableView->Destroy(); 216 - TableView = NULL; 217 - if (TableBlobs) 218 - delete TableBlobs; 219 - if (TableValues) 220 - delete TableValues; 221 - TableBlobs = NULL; 222 - TableValues = NULL; 223 - CurrentBlob = NULL; 224 - HideControls(); 225 - RsBeginRow = 0; 226 - RsEndRow = 0; 227 - RsMaxRow = 0; 228 - for (i_row = 0; i_row < RsBlock; i_row++) 229 - RowIds[i_row] = -1; 230 - i_row = 0; 231 - xSql = new char[65536]; 232 - strcpy(xSql, sql.ToUTF8()); 233 - ::wxBeginBusyCursor(); 234 - int ret = sqlite3_prepare_v2(sqlite, xSql, strlen(xSql), &stmt, NULL); 235 - if (ret != SQLITE_OK) 236 - { 237 - sprintf(err_msg, "SQL error: \"%s\"", sqlite3_errmsg(sqlite)); 238 - SqlErrorMsg = wxString::FromUTF8(err_msg); 239 - ::wxEndBusyCursor(); 240 - delete[]xSql; 241 - return false; 242 - } 243 - RsCurrentBlock->Show(true); 244 - while (1) 245 - { 246 - // 247 - // fetching the result set rows 248 - // 249 - ret = sqlite3_step(stmt); 250 - if (ret == SQLITE_DONE) 251 - break; // end of result set 252 - if (ret == SQLITE_ROW) 253 - { 254 - // 255 - // fetching a row 256 - // 257 - if ((i_row % 100) == 0) 258 - { 259 - sprintf(dummy, "fetching the result set: %d rows", i_row); 260 - currentBlock = wxString::FromUTF8(dummy); 261 - RsCurrentBlock->SetLabel(currentBlock); 262 - } 263 - if (i_row < from) 264 - { 265 - i_row++; 266 - continue; 267 - } 268 - if ((i_row - from) >= RsBlock) 269 - { 270 - i_row++; 271 - continue; 272 - } 273 - end_row = i_row; 274 - columns = sqlite3_column_count(stmt); 275 - MyRowVariant *rowVariant = list.Add(columns); 276 - for (i_col = 0; i_col < columns; i_col++) 277 - { 278 - sqlite3_int64 int_value; 279 - double dbl_value; 280 - const unsigned char *txt_value; 281 - const void *blob_value; 282 - int blobSize; 283 - list.SetColumnName(i_col, sqlite3_column_name(stmt, i_col)); 284 - switch (sqlite3_column_type(stmt, i_col)) 285 - { 286 - case SQLITE_INTEGER: 287 - int_value = sqlite3_column_int64(stmt, i_col); 288 - rowVariant->Set(i_col, int_value); 289 - break; 290 - case SQLITE_FLOAT: 291 - dbl_value = sqlite3_column_double(stmt, i_col); 292 - rowVariant->Set(i_col, dbl_value); 293 - break; 294 - case SQLITE_TEXT: 295 - txt_value = sqlite3_column_text(stmt, i_col); 296 - rowVariant->Set(i_col, txt_value); 297 - break; 298 - case SQLITE_BLOB: 299 - blob_value = sqlite3_column_blob(stmt, i_col); 300 - blobSize = sqlite3_column_bytes(stmt, i_col); 301 - rowVariant->Set(i_col, blob_value, blobSize); 302 - break; 303 - case SQLITE_NULL: 304 - default: 305 - break; 306 - }; 307 - } 308 - i_row++; 309 - } else 310 - { 311 - sprintf(err_msg, "SQL error: \"%s\"", sqlite3_errmsg(sqlite)); 312 - SqlErrorMsg = wxString::FromUTF8(err_msg); 313 - goto error; 314 - } 315 - } 316 - sqlite3_finalize(stmt); 317 - RsBeginRow = from; 318 - RsEndRow = end_row; 319 - RsMaxRow = i_row; 320 - if (list.GetRows() == 0) 321 - { 322 - // 323 - // this one is an EMPTY Result Set 324 - // 325 - if (ReadOnly == false) 326 - { 327 - // preparing the insert row 328 - int numCols = 0; 329 - wxString *colNames = MainFrame->GetColumnNames(TableName, &numCols); 330 - CreateGrid(0, numCols + 1); 331 - TableView->SetColLabelValue(0, wxT("ROWID")); 332 - for (i_col = 0; i_col < numCols; i_col++) 333 - TableView->SetColLabelValue(i_col + 1, *(colNames + i_col)); 334 - TableView->EnableEditing(true); 335 - delete[]colNames; 336 - } else 337 - { 338 - // simply showing a warning message 339 - CreateGrid(1, 1); 340 - TableView->SetColLabelValue(0, wxT("Message")); 341 - TableView->SetRowLabelValue(0, wxT("Message")); 342 - TableView->SetCellValue(0, 0, 343 - wxT 344 - ("SQL query returned an empty ResultSet\n\nThis is not an error")); 345 - } 346 - } else 347 - { 348 - // 349 - // preparing the Grid to show the result set 350 - // 351 - CreateGrid(list.GetRows(), list.GetColumns()); 352 - if (ReadOnly == true) 353 - TableView->EnableEditing(false); 354 - else 355 - TableView->EnableEditing(true); 356 - for (i_col = 0; i_col < list.GetColumns(); i_col++) 357 - TableView->SetColLabelValue(i_col, list.GetColumnName(i_col)); 358 - if (ReadOnly == false) 359 - TableView->SetColLabelValue(0, wxT("ROWID")); 360 - i_row = 0; 361 - row = list.GetFirst(); 362 - while (row) 363 - { 364 - sprintf(dummy, "%d", i_row + RsBeginRow + 1); 365 - cellValue = wxString::FromUTF8(dummy); 366 - TableView->SetRowLabelValue(i_row, cellValue); 367 - if (ReadOnly == false) 368 - { 369 - // storing the ROWID value into the RowIds array 370 - value = row->GetColumn(0); 371 - if (value->GetType() == MY_INT_VARIANT) 372 - RowIds[i_row] = value->GetIntValue(); 373 - } 374 - for (i_col = 0; i_col < row->GetNumCols(); i_col++) 375 - { 376 - value = row->GetColumn(i_col); 377 - if (value) 378 - { 379 - switch (value->GetType()) 380 - { 381 - case MY_INT_VARIANT: 382 - sprintf(dummy, FORMAT_64, value->GetIntValue()); 383 - cellValue = wxString::FromUTF8(dummy); 384 - TableView->SetCellValue(i_row, i_col, cellValue); 385 - if (ReadOnly == false) 386 - TableValues->SetValue(i_row, i_col, 387 - value->GetIntValue()); 388 - break; 389 - case MY_DBL_VARIANT: 390 - sprintf(dummy, "%1.6lf", value->GetDblValue()); 391 - cellValue = wxString::FromUTF8(dummy); 392 - TableView->SetCellValue(i_row, i_col, cellValue); 393 - if (ReadOnly == false) 394 - TableValues->SetValue(i_row, i_col, 395 - value->GetDblValue()); 396 - break; 397 - case MY_TXT_VARIANT: 398 - TableView->SetCellValue(i_row, i_col, 399 - value->GetTxtValue()); 400 - if (ReadOnly == false) 401 - TableValues->SetValue(i_row, i_col, 402 - value->GetTxtValue()); 403 - break; 404 - case MY_BLOB_VARIANT: 405 - blobType = wxT("UNKNOWN type"); 406 - switch (gaiaGuessBlobType 407 - (value->GetBlob(), value->GetBlobSize())) 408 - { 409 - case GAIA_GEOMETRY_BLOB: 410 - blobType = wxT("GEOMETRY"); 411 - break; 412 - case GAIA_JPEG_BLOB: 413 - blobType = wxT("JPEG image"); 414 - break; 415 - case GAIA_EXIF_BLOB: 416 - blobType = wxT("JPEG-EXIF image"); 417 - break; 418 - case GAIA_EXIF_GPS_BLOB: 419 - blobType = wxT("JPEG-EXIF-GPS image"); 420 - break; 421 - case GAIA_PNG_BLOB: 422 - blobType = wxT("PNG image"); 423 - break; 424 - case GAIA_GIF_BLOB: 425 - blobType = wxT("GIF image"); 426 - break; 427 - case GAIA_PDF_BLOB: 428 - blobType = wxT("PDF document"); 429 - break; 430 - case GAIA_ZIP_BLOB: 431 - blobType = wxT("ZIP archive"); 432 - break; 433 - }; 434 - sprintf(dummy, "BLOB sz=%d ", value->GetBlobSize()); 435 - cellValue = wxString::FromUTF8(dummy); 436 - cellValue += blobType; 437 - TableView->SetCellValue(i_row, i_col, cellValue); 438 - TableView->SetReadOnly(i_row, i_col); 439 - TableBlobs->SetBlob(i_row, i_col, value); 440 - break; 441 - case MY_NULL_VARIANT: 442 - default: 443 - TableView->SetCellValue(i_row, i_col, wxT("NULL")); 444 - break; 445 - }; 446 - } else 447 - TableView->SetCellValue(i_row, i_col, wxT("NULL")); 448 - if (ReadOnly == false) 449 - { 450 - if (IsPrimaryKey(i_col) == true) 451 - TableView->SetReadOnly(i_row, i_col); 452 - if (IsBlobColumn(i_col) == true) 453 - TableView->SetReadOnly(i_row, i_col); 454 - } 455 - } 456 - i_row++; 457 - row = row->GetNext(); 458 - } 459 - } 460 - if (ReadOnly == false) 461 - { 462 - // prepearing the insert row 463 - TableView->SetRowLabelValue(TableView->GetNumberRows() - 1, 464 - wxT("Insert row")); 465 - InsertPending = false; 466 - for (i_col = 0; i_col < TableView->GetNumberCols(); i_col++) 467 - { 468 - TableView->SetCellValue(TableView->GetNumberRows() - 1, i_col, 469 - wxT("")); 470 - TableView->SetCellBackgroundColour(TableView->GetNumberRows() - 1, 471 - i_col, wxColour(0, 0, 0)); 472 - TableView->SetReadOnly(TableView->GetNumberRows() - 1, i_col); 473 - } 474 - } 475 - TableView->SetRowLabelSize(wxGRID_AUTOSIZE); 476 - TableView->AutoSize(); 477 - ResizeView(); 478 - sprintf(dummy, "current block: %d / %d [%d rows]", RsBeginRow + 1, 479 - RsEndRow + 1, RsMaxRow); 480 - currentBlock = wxString::FromUTF8(dummy); 481 - RsCurrentBlock->SetLabel(currentBlock); 482 - ShowControls(); 483 - MainFrame->GetQueryView()->AddToHistory(sql); 484 - ::wxEndBusyCursor(); 485 - if (xSql) 486 - delete[]xSql; 487 - return true; 488 -error: 489 - ::wxEndBusyCursor(); 490 - sqlite3_finalize(stmt); 491 - if (xSql) 492 - delete[]xSql; 493 - return false; 494 -} 495 - 496 -bool MyResultSetView::IsPrimaryKey(int column) 497 -{ 498 -// 499 -// checks if this column is a Primary Key one 500 -// 501 - int i; 502 - for (i = 0; i < 1024; i++) 503 - { 504 - if (PrimaryKeys[i] == column) 505 - return true; 506 - } 507 - return false; 508 -} 509 - 510 -bool MyResultSetView::IsBlobColumn(int column) 511 -{ 512 -// 513 -// checks if this column is a BLOB-type column 514 -// 515 - int i; 516 - for (i = 0; i < 1024; i++) 517 - { 518 - if (BlobColumns[i] == column) 519 - return true; 520 - } 521 - return false; 522 -} 523 - 524 -void MyResultSetView::CreateGrid(int rows, int cols) 525 -{ 526 -// 527 -// creating a new Grid to show the result set 528 -// 529 - int extra = 0; 530 - if (ReadOnly == false) 531 - extra = 1; 532 - wxSize sz = GetClientSize(); 533 - TableView = new wxGrid(this, wxID_ANY, wxPoint(5, 5), wxSize(200, 200)); 534 - TableView->Show(false); 535 - TableView->CreateGrid(rows + extra, cols); 536 - TableBlobs = new MyBlobs(rows, cols); 537 - if (ReadOnly == false) 538 - TableValues = new MyValues(rows, cols); 539 -} 540 - 541 -void MyResultSetView::ResizeView() 542 -{ 543 -// 544 -// resizing the Grid to show the result set 545 -// 546 - wxSize sz = GetClientSize(); 547 - if (TableView) 548 - { 549 - TableView->SetSize(sz.GetWidth() - 10, sz.GetHeight() - 45); 550 - TableView->Show(true); 551 - } 552 -} 553 - 554 -void MyResultSetView::OnSize(wxSizeEvent & event) 555 -{ 556 -// 557 -// this window has changed its size 558 -// 559 - wxSize sz = GetClientSize(); 560 - if (TableView) 561 - TableView->SetSize(sz.GetWidth() - 10, sz.GetHeight() - 45); 562 - BtnRsFirst->Move(5, sz.GetHeight() - 35); 563 - BtnRsPrevious->Move(40, sz.GetHeight() - 35); 564 - BtnRefresh->Move(75, sz.GetHeight() - 35); 565 - BtnRsNext->Move(110, sz.GetHeight() - 35); 566 - BtnRsLast->Move(145, sz.GetHeight() - 35); 567 - RsCurrentBlock->Move(180, sz.GetHeight() - 25); 568 -} 569 - 570 -void MyResultSetView::OnRsFirst(wxCommandEvent & WXUNUSED(event)) 571 -{ 572 -// 573 -// scrolling to the result set beginning 574 -// 575 - wxString sql = MainFrame->GetQueryView()->GetSqlCtrl()->GetValue(); 576 - if (ExecuteSql(sql, 0, ReadOnly) == false) 577 - wxMessageBox(SqlErrorMsg, wxT("spatialite-gui"), wxOK | wxICON_ERROR, 578 - MainFrame); 579 -} 580 - 581 -void MyResultSetView::OnRsPrevious(wxCommandEvent & WXUNUSED(event)) 582 -{ 583 -// 584 -// scrolling to the result set previous block 585 -// 586 - wxString sql = MainFrame->GetQueryView()->GetSqlCtrl()->GetValue(); 587 - int start = RsBeginRow - RsBlock; 588 - if (start < 0) 589 - start = 0; 590 - if (ExecuteSql(sql, start, ReadOnly) == false) 591 - wxMessageBox(SqlErrorMsg, wxT("spatialite-gui"), wxOK | wxICON_ERROR, 592 - MainFrame); 593 -} 594 - 595 -void MyResultSetView::OnRsNext(wxCommandEvent & WXUNUSED(event)) 596 -{ 597 -// 598 -// scrolling to the result set next block 599 -// 600 - wxString sql = MainFrame->GetQueryView()->GetSqlCtrl()->GetValue(); 601 - int start = RsEndRow + 1; 602 - if (ExecuteSql(sql, start, ReadOnly) == false) 603 - wxMessageBox(SqlErrorMsg, wxT("spatialite-gui"), wxOK | wxICON_ERROR, 604 - MainFrame); 605 -} 606 - 607 -void MyResultSetView::OnRsLast(wxCommandEvent & WXUNUSED(event)) 608 -{ 609 -// 610 -// scrolling to the result set ending 611 -// 612 - wxString sql = MainFrame->GetQueryView()->GetSqlCtrl()->GetValue(); 613 - int start = RsMaxRow - RsBlock; 614 - if (start < 0) 615 - start = 0; 616 - if (ExecuteSql(sql, start, ReadOnly) == false) 617 - wxMessageBox(SqlErrorMsg, wxT("spatialite-gui"), wxOK | wxICON_ERROR, 618 - MainFrame); 619 -} 620 - 621 -void MyResultSetView::OnRefresh(wxCommandEvent & WXUNUSED(event)) 622 -{ 623 -// 624 -// refreshing the result set 625 -// 626 - wxString sql = MainFrame->GetQueryView()->GetSqlCtrl()->GetValue(); 627 - int start = RsBeginRow; 628 - if (ExecuteSql(sql, start, ReadOnly) == false) 629 - wxMessageBox(SqlErrorMsg, wxT("spatialite-gui"), wxOK | wxICON_ERROR, 630 - MainFrame); 631 -} 632 - 633 -void MyResultSetView::OnRightClick(wxGridEvent & event) 634 -{ 635 -// 636 -// right click on some cell [mouse action] 637 -// 638 - MyVariant *blobVar; 639 - wxMenu *menu = new wxMenu(); 640 - wxMenuItem *menuItem; 641 - wxPoint pt = event.GetPosition(); 642 - if (ReadOnly == false && event.GetRow() == TableView->GetNumberRows() - 1) 643 - { 644 - // this is the INSERT ROW 645 - if (InsertPending == true) 646 - { 647 - menuItem = 648 - new wxMenuItem(menu, Grid_Insert, wxT("&Confirm insertion")); 649 - menu->Append(menuItem); 650 - menuItem = new wxMenuItem(menu, Grid_Abort, wxT("&Abort insertion")); 651 - menu->Append(menuItem); 652 - } else 653 - { 654 - menuItem = new wxMenuItem(menu, Grid_Insert, wxT("&Insert new row")); 655 - menu->Append(menuItem); 656 - } 657 - TableView->PopupMenu(menu, pt); 658 - return; 659 - } 660 - CurrentEvtRow = event.GetRow(); 661 - CurrentEvtColumn = event.GetCol(); 662 - blobVar = TableBlobs->GetBlob(CurrentEvtRow, CurrentEvtColumn); 663 - if (blobVar) 664 - { 665 - // this one is a BLOB cell 666 - if (ReadOnly == false) 667 - { 668 - MyRowVariant *varRow = TableValues->GetRow(CurrentEvtRow); 669 - if (varRow->IsDeleted() == false) 670 - { 671 - menuItem = new wxMenuItem(menu, Grid_Delete, wxT("&Delete row")); 672 - menu->Append(menuItem); 673 - menuItem = 674 - new wxMenuItem(menu, Grid_Insert, wxT("&Insert new row")); 675 - menu->Append(menuItem); 676 - menu->AppendSeparator(); 677 - } 678 - } 679 - menuItem = new wxMenuItem(menu, Grid_Blob, wxT("BLOB &explore")); 680 - menu->Append(menuItem); 681 - if (gaiaGuessBlobType(blobVar->GetBlob(), blobVar->GetBlobSize()) == 682 - GAIA_GEOMETRY_BLOB) 683 - ; 684 - else 685 - { 686 - menu->AppendSeparator(); 687 - menuItem = new wxMenuItem(menu, Grid_BlobIn, wxT("BLOB &import")); 688 - menu->Append(menuItem); 689 - menuItem = new wxMenuItem(menu, Grid_BlobOut, wxT("BLOB &export")); 690 - menu->Append(menuItem); 691 - menuItem = 692 - new wxMenuItem(menu, Grid_BlobNull, wxT("Set BLOB as &NULL")); 693 - menu->Append(menuItem); 694 - } 695 - CurrentBlob = blobVar; 696 - } else 697 - { 698 - // this one is an ordinary cell 699 - CurrentBlob = NULL; 700 - if (ReadOnly == false) 701 - { 702 - MyRowVariant *varRow = TableValues->GetRow(CurrentEvtRow); 703 - if (varRow->IsDeleted() == false) 704 - { 705 - menuItem = new wxMenuItem(menu, Grid_Delete, wxT("&Delete row")); 706 - menu->Append(menuItem); 707 - menuItem = 708 - new wxMenuItem(menu, Grid_Insert, wxT("&Insert new row")); 709 - menu->Append(menuItem); 710 - if (IsBlobColumn(CurrentEvtColumn) == true) 711 - { 712 - menu->AppendSeparator(); 713 - menuItem = 714 - new wxMenuItem(menu, Grid_BlobIn, wxT("BLOB &import")); 715 - menu->Append(menuItem); 716 - } 717 - menu->AppendSeparator(); 718 - } 719 - } 720 - menuItem = new wxMenuItem(menu, Grid_Clear, wxT("&Clear selection")); 721 - menu->Append(menuItem); 722 - menuItem = new wxMenuItem(menu, Grid_All, wxT("Select &all")); 723 - menu->Append(menuItem); 724 - menuItem = new wxMenuItem(menu, Grid_Row, wxT("Select &row")); 725 - menu->Append(menuItem); 726 - menuItem = new wxMenuItem(menu, Grid_Column, wxT("&Select column")); 727 - menu->Append(menuItem); 728 - menu->AppendSeparator(); 729 - menuItem = new wxMenuItem(menu, Grid_Copy, wxT("&Copy")); 730 - menu->Append(menuItem); 731 - if (TableView->IsSelection() == false) 732 - menuItem->Enable(false); 733 - } 734 - TableView->PopupMenu(menu, pt); 735 -} 736 - 737 -void MyResultSetView::OnCellSelected(wxGridEvent & event) 738 -{ 739 -// 740 -// cell selection changed 741 -// 742 - if (InsertPending == true) 743 - { 744 - // an INSERT row is still pending 745 - if (event.GetRow() != TableView->GetNumberRows() - 1) 746 - DoInsert(false); 747 - } 748 - event.Skip(); 749 -} 750 - 751 -void MyResultSetView::OnCellChanged(wxGridEvent & event) 752 -{ 753 -// 754 -// user changed value in some cell 755 -// 756 - MyVariant *oldValue; 757 - MyVariant *insValue; 758 - wxString value; 759 - wxString numValue; 760 - wxString newValue = wxT("NULL"); 761 - wxString sql; 762 - wxString rowid; 763 - char *errMsg = NULL; 764 - bool error = false; 765 - sqlite3_int64 int64_value; 766 - long long_value; 767 - bool okIntValue = false; 768 - double dbl_value; 769 - bool okDblValue = false; 770 - int ret; 771 - char dummy[256]; 772 - int row = event.GetRow(); 773 - int column = event.GetCol(); 774 - value = TableView->GetCellValue(row, column); 775 - if (InsertPending == true) 776 - { 777 - // an INSERT row is still pending 778 - insValue = InsertRow->GetColumn(column); 779 - numValue = value; 780 - numValue.Replace(wxT(","), wxT(".")); 781 - okIntValue = numValue.ToLong(&long_value); 782 - okDblValue = numValue.ToDouble(&dbl_value); 783 - if (okIntValue == true) 784 - { 785 - int64_value = long_value; 786 - insValue->Set(int64_value); 787 - } else if (okDblValue == true) 788 - insValue->Set(dbl_value); 789 - else 790 - insValue->Set(value); 791 - if (row != TableView->GetNumberRows() - 1) 792 - DoInsert(false); 793 - return; 794 - } 795 - if (value.Len() > 0) 796 - { 797 - numValue = value; 798 - numValue.Replace(wxT(","), wxT(".")); 799 - okIntValue = numValue.ToLong(&long_value); 800 - okDblValue = numValue.ToDouble(&dbl_value); 801 - if (okIntValue == true) 802 - { 803 - int64_value = long_value; 804 - sprintf(dummy, FORMAT_64, int64_value); 805 - newValue = wxString::FromUTF8(dummy); 806 - } else if (okDblValue == true) 807 - { 808 - sprintf(dummy, "%1.6lf", dbl_value); 809 - newValue = wxString::FromUTF8(dummy); 810 - } else 811 - { 812 - value.Replace(wxT("'"), wxT("''")); 813 - newValue = wxT("'") + value + wxT("'"); 814 - } 815 - } 816 - oldValue = TableValues->GetValue(row, 0); 817 - sprintf(dummy, FORMAT_64, oldValue->GetIntValue()); 818 - rowid = wxString::FromUTF8(dummy); 819 - sql = 820 - wxT("UPDATE \"") + TableName + wxT("\" SET \"") + 821 - TableView->GetColLabelValue(column) + wxT("\" = ") + newValue + 822 - wxT(" WHERE ROWID = ") + rowid; 823 - ret = sqlite3_exec(MainFrame->GetSqlite(), sql.ToUTF8(), NULL, NULL, &errMsg); 824 - if (ret != SQLITE_OK) 825 - { 826 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 827 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 828 - sqlite3_free(errMsg); 829 - error = true; 830 - } 831 - oldValue = TableValues->GetValue(row, column); 832 - if (error == true) 833 - { 834 - // update failed; restorig old cell value 835 - value = wxT("NULL"); 836 - if (oldValue) 837 - { 838 - if (oldValue->GetType() == MY_INT_VARIANT) 839 - { 840 - sprintf(dummy, FORMAT_64, oldValue->GetIntValue()); 841 - value = wxString::FromUTF8(dummy); 842 - } 843 - if (oldValue->GetType() == MY_DBL_VARIANT) 844 - { 845 - sprintf(dummy, "%1.6lf", oldValue->GetDblValue()); 846 - value = wxString::FromUTF8(dummy); 847 - } 848 - if (oldValue->GetType() == MY_TXT_VARIANT) 849 - value = oldValue->GetTxtValue(); 850 - } 851 - TableView->SetCellValue(row, column, value); 852 - TableView->ForceRefresh(); 853 - } else 854 - { 855 - // marking cell as modified 856 - TableView->SetCellTextColour(row, column, wxColour(0, 0, 192)); 857 - TableView->SetCellBackgroundColour(row, column, wxColour(255, 255, 204)); 858 - TableView->ForceRefresh(); 859 - } 860 -} 861 - 862 -void MyResultSetView::DoInsert(bool confirmed) 863 -{ 864 -// 865 -// performing actual row INSERT 866 -// 867 - int i; 868 - int ret; 869 - MyVariant *var; 870 - wxString value; 871 - wxString strValue; 872 - wxString sql; 873 - char dummy[256]; 874 - char *errMsg = NULL; 875 - if (confirmed == false) 876 - { 877 - ret = 878 - wxMessageBox(wxT("A new row is ready for insertion\n\nConfirm ?"), 879 - wxT("spatialite-gui"), wxYES_NO | wxICON_QUESTION, this); 880 - if (ret != wxYES) 881 - goto close_insert; 882 - } 883 - sql = wxT("INSERT INTO \"") + TableName + wxT("\" ("); 884 - for (i = 1; i < TableView->GetNumberCols(); i++) 885 - { 886 - if (i > 1) 887 - sql += wxT(", "); 888 - sql += wxT("\"") + TableView->GetColLabelValue(i) + wxT("\""); 889 - } 890 - sql += wxT(") VALUES ("); 891 - for (i = 1; i < InsertRow->GetNumCols(); i++) 892 - { 893 - if (i > 1) 894 - sql += wxT(", "); 895 - var = InsertRow->GetColumn(i); 896 - value = wxT("NULL"); 897 - if (var->GetType() == MY_INT_VARIANT) 898 - { 899 - sprintf(dummy, FORMAT_64, var->GetIntValue()); 900 - value = wxString::FromUTF8(dummy); 901 - } 902 - if (var->GetType() == MY_DBL_VARIANT) 903 - { 904 - sprintf(dummy, "%1.6lf", var->GetDblValue()); 905 - value = wxString::FromUTF8(dummy); 906 - } 907 - if (var->GetType() == MY_TXT_VARIANT) 908 - { 909 - strValue = var->GetTxtValue(); 910 - strValue.Replace(wxT("'"), wxT("''")); 911 - value = wxT("'") + strValue + wxT("'"); 912 - } 913 - sql += value; 914 - } 915 - sql += wxT(")"); 916 - ret = sqlite3_exec(MainFrame->GetSqlite(), sql.ToUTF8(), NULL, NULL, &errMsg); 917 - if (ret != SQLITE_OK) 918 - { 919 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 920 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 921 - sqlite3_free(errMsg); 922 - } 923 -close_insert: 924 -// 925 -// closing insert row 926 -// 927 - InsertPending = false; 928 - delete InsertRow; 929 - InsertRow = NULL; 930 - for (i = 0; i < TableView->GetNumberCols(); i++) 931 - { 932 - TableView->SetCellValue(TableView->GetNumberRows() - 1, i, wxT("")); 933 - TableView->SetCellBackgroundColour(TableView->GetNumberRows() - 1, i, 934 - wxColour(0, 0, 0)); 935 - TableView->SetReadOnly(TableView->GetNumberRows() - 1, i); 936 - } 937 -} 938 - 939 -void MyResultSetView::OnCmdDelete(wxCommandEvent & event) 940 -{ 941 -// 942 -// user required row deletion 943 -// 944 - char *errMsg = NULL; 945 - bool error = false; 946 - int ret; 947 - int i; 948 - wxString sql; 949 - wxString rowid; 950 - MyVariant *value; 951 - char dummy[256]; 952 - MyRowVariant *varRow = TableValues->GetRow(CurrentEvtRow); 953 - if (varRow->IsDeleted() == true) 954 - return; 955 - value = TableValues->GetValue(CurrentEvtRow, 0); 956 - sprintf(dummy, FORMAT_64, value->GetIntValue()); 957 - rowid = wxString::FromUTF8(dummy); 958 - ret = 959 - wxMessageBox(wxT("Requested deletion for row identified by RowId = ") 960 - + rowid + wxT("\n\nConfirm ?"), wxT("spatialite-gui"), 961 - wxYES_NO | wxICON_QUESTION, this); 962 - if (ret != wxYES) 963 - return; 964 - sql = wxT("DELETE FROM \"") + TableName + wxT("\" WHERE ROWID = ") + rowid; 965 - ret = sqlite3_exec(MainFrame->GetSqlite(), sql.ToUTF8(), NULL, NULL, &errMsg); 966 - if (ret != SQLITE_OK) 967 - { 968 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 969 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 970 - sqlite3_free(errMsg); 971 - error = true; 972 - } 973 - if (error == false) 974 - { 975 - // marking row as deleted 976 - varRow->SetDeleted(); 977 - for (i = 0; i < TableView->GetNumberCols(); i++) 978 - { 979 - TableView->SetCellTextColour(CurrentEvtRow, i, wxColour(0, 0, 0)); 980 - TableView->SetCellBackgroundColour(CurrentEvtRow, i, 981 - wxColour(128, 128, 128)); 982 - TableView->SetReadOnly(CurrentEvtRow, i); 983 - } 984 - TableView->ForceRefresh(); 985 - } 986 -} 987 - 988 -void MyResultSetView::OnCmdInsert(wxCommandEvent & event) 989 -{ 990 -// 991 -// user required row insertion 992 -// 993 - int i; 994 - if (ReadOnly == true) 995 - return; 996 - if (InsertPending == true) 997 - { 998 - // an INSERT is still pending, and the user required actual insertion 999 - DoInsert(true); 1000 - return; 1001 - } 1002 - InsertRow = new MyRowVariant(TableView->GetNumberCols()); 1003 - TableView->MakeCellVisible(TableView->GetNumberRows() - 1, 1); 1004 - InsertPending = true; 1005 - for (i = 1; i < TableView->GetNumberCols(); i++) 1006 - { 1007 - TableView->SetCellValue(TableView->GetNumberRows() - 1, i, wxT("")); 1008 - TableView->SetCellBackgroundColour(TableView->GetNumberRows() - 1, i, 1009 - wxColour(255, 255, 255)); 1010 - TableView->SetReadOnly(TableView->GetNumberRows() - 1, i, false); 1011 - } 1012 -} 1013 - 1014 -void MyResultSetView::OnCmdAbort(wxCommandEvent & event) 1015 -{ 1016 -// 1017 -// user cancelled current row insertion 1018 -// 1019 - int i; 1020 - if (InsertPending) 1021 - { 1022 - InsertPending = false; 1023 - delete InsertRow; 1024 - InsertRow = NULL; 1025 - for (i = 0; i < TableView->GetNumberCols(); i++) 1026 - { 1027 - TableView->SetCellValue(TableView->GetNumberRows() - 1, i, wxT("")); 1028 - TableView->SetCellBackgroundColour(TableView->GetNumberRows() - 1, i, 1029 - wxColour(0, 0, 0)); 1030 - TableView->SetReadOnly(TableView->GetNumberRows() - 1, i); 1031 - } 1032 - } 1033 -} 1034 - 1035 -void MyResultSetView::OnCmdClearSelection(wxCommandEvent & event) 1036 -{ 1037 -// 1038 -// clearing current selection 1039 -// 1040 - TableView->ClearSelection(); 1041 -} 1042 - 1043 -void MyResultSetView::OnCmdSelectAll(wxCommandEvent & event) 1044 -{ 1045 -// 1046 -// selecting all 1047 -// 1048 - TableView->SelectAll(); 1049 -} 1050 - 1051 -void MyResultSetView::OnCmdSelectRow(wxCommandEvent & event) 1052 -{ 1053 -// 1054 -// selecting the current row 1055 -// 1056 - TableView->SelectRow(CurrentEvtRow); 1057 -} 1058 - 1059 -void MyResultSetView::OnCmdSelectColumn(wxCommandEvent & event) 1060 -{ 1061 -// 1062 -// selecting column 1063 -// 1064 - TableView->SelectCol(CurrentEvtColumn); 1065 -} 1066 - 1067 -void MyResultSetView::OnCmdCopy(wxCommandEvent & event) 1068 -{ 1069 -// 1070 -// copying the selection into the clipboard 1071 -// 1072 - wxString copyData; 1073 - int row; 1074 - int col; 1075 - bool newRow; 1076 - bool firstRow = true; 1077 - for (row = 0; row < TableView->GetNumberRows(); row++) 1078 - { 1079 - newRow = true; 1080 - for (col = 0; col < TableView->GetNumberCols(); col++) 1081 - { 1082 - if (TableView->IsInSelection(row, col) == true) 1083 - { 1084 - // ok, this cell is included into the selection to copy 1085 - if (firstRow == true) 1086 - { 1087 - newRow = false; 1088 - firstRow = false; 1089 - } else if (newRow == true) 1090 - { 1091 - newRow = false; 1092 - copyData += wxT("\n"); 1093 - } else 1094 - copyData += wxT("\t"); 1095 - copyData += TableView->GetCellValue(row, col); 1096 - } 1097 - } 1098 - } 1099 - if (wxTheClipboard->Open()) 1100 - { 1101 - wxTheClipboard->SetData(new wxTextDataObject(copyData)); 1102 - wxTheClipboard->Close(); 1103 - } 1104 -} 1105 - 1106 -void MyResultSetView::OnCmdBlob(wxCommandEvent & event) 1107 -{ 1108 -// 1109 -// exploring some BLOB value 1110 -// 1111 - if (!CurrentBlob) 1112 - return; 1113 - BlobExplorerDialog dlg; 1114 - dlg.Create(MainFrame, CurrentBlob->GetBlobSize(), CurrentBlob->GetBlob()); 1115 - dlg.ShowModal(); 1116 -} 1117 - 1118 -void MyResultSetView::OnCmdBlobIn(wxCommandEvent & event) 1119 -{ 1120 -// importing an external file into a BLOB-value 1121 - FILE *in = NULL; 1122 - char path[2048]; 1123 - int rd; 1124 - int maxSize = 1024 * 1024; // limit BLOB size to 1MB 1125 - wxString fileList; 1126 - wxString rowid; 1127 - wxString sql; 1128 - wxString blobValue; 1129 - wxString hex; 1130 - MyVariant *value; 1131 - char dummy[1024]; 1132 - bool error = false; 1133 - unsigned char *buffer = NULL; 1134 - int ret; 1135 - char *errMsg = NULL; 1136 - wxString lastDir; 1137 - fileList = 1138 - wxT 1139 - ("BLOB Document (*.jpg;*.jpeg;*.png;*.gif;*.pdf;*.zip)|*.jpg;*.jpeg;*.png;*.gif;*.pdf;*.zip|"); 1140 - fileList += wxT("Image (*.jpg;*.jpeg;*.png;*.gif)|*.jpg;*.jpeg;*.png;*.gif|"); 1141 - fileList += 1142 - wxT 1143 - ("JPEG Image (*.jpg;*.jpeg)|*.jpg;*.jpeg|PNG Image (*.png)|*.png|GIF Image (*.gif)|*.gif"); 1144 - fileList += 1145 - wxT("PDF Document (*.pdf)|*.pdf|ZIP Archive|(*.zip)|All files (*.*)|*.*"); 1146 - wxFileDialog *fileDialog = new wxFileDialog(this, wxT("loading a BLOB value"), 1147 - wxT(""), wxT(""), fileList, 1148 - wxFD_OPEN | wxFD_FILE_MUST_EXIST, 1149 - wxDefaultPosition, 1150 - wxDefaultSize, wxT("filedlg")); 1151 - lastDir = MainFrame->GetLastDirectory(); 1152 - if (lastDir.Len() >= 1) 1153 - fileDialog->SetDirectory(lastDir); 1154 - ret = fileDialog->ShowModal(); 1155 - if (ret == wxID_OK) 1156 - { 1157 - strcpy(path, fileDialog->GetPath().ToUTF8()); 1158 - in = fopen(path, "rb"); 1159 - if (!in) 1160 - { 1161 - wxMessageBox(wxT("Cannot open '") + fileDialog->GetPath() + 1162 - wxT("' for reading"), wxT("spatialite-gui"), 1163 - wxOK | wxICON_ERROR, this); 1164 - return; 1165 - } 1166 - wxFileName file(fileDialog->GetPath()); 1167 - lastDir = file.GetPath(); 1168 - MainFrame->SetLastDirectory(lastDir); 1169 - ::wxBeginBusyCursor(); 1170 - buffer = new unsigned char[maxSize]; 1171 - rd = fread(buffer, 1, maxSize, in); 1172 - if (rd == maxSize && !(feof(in))) 1173 - { 1174 - // exceding 1MB; it's too big for a BLOB 1175 - wxMessageBox(wxT 1176 - ("Selected file excedes 1MB; cowardly refusing to load it as a BLOB value ..."), 1177 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1178 - goto end; 1179 - } 1180 - if (ferror(in)) 1181 - { 1182 - // I/O error 1183 - wxMessageBox(wxT("an I/O error occurred"), wxT("spatialite-gui"), 1184 - wxOK | wxICON_ERROR, this); 1185 - goto end; 1186 - } 1187 - // 1188 - // preparing theSQL UPDATE statement 1189 - // 1190 - value = TableValues->GetValue(CurrentEvtRow, 0); 1191 - sprintf(dummy, FORMAT_64, value->GetIntValue()); 1192 - rowid = wxString::FromUTF8(dummy); 1193 - HexBlobValue(buffer, rd, hex); 1194 - sql = 1195 - wxT("UPDATE \"") + TableName + wxT("\" SET \"") + 1196 - TableView->GetColLabelValue(CurrentEvtColumn); 1197 - sql += wxT("\" = ") + hex + wxT(" WHERE ROWID = ") + rowid; 1198 - ret = 1199 - sqlite3_exec(MainFrame->GetSqlite(), sql.ToUTF8(), NULL, NULL, &errMsg); 1200 - if (ret != SQLITE_OK) 1201 - { 1202 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 1203 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1204 - sqlite3_free(errMsg); 1205 - error = true; 1206 - } 1207 - ::wxEndBusyCursor(); 1208 - value = TableValues->GetValue(CurrentEvtRow, CurrentEvtColumn); 1209 - if (error == false) 1210 - { 1211 - // updating the Grid cell 1212 - sprintf(dummy, "BLOB sz=%d ", rd); 1213 - blobValue = wxString::FromUTF8(dummy); 1214 - switch (gaiaGuessBlobType(buffer, rd)) 1215 - { 1216 - case GAIA_JPEG_BLOB: 1217 - blobValue += wxT("JPEG image"); 1218 - break; 1219 - case GAIA_EXIF_BLOB: 1220 - blobValue += wxT("JPEG-EXIF image"); 1221 - break; 1222 - case GAIA_EXIF_GPS_BLOB: 1223 - blobValue += wxT("JPEG-EXIF-GPS image"); 1224 - break; 1225 - case GAIA_PNG_BLOB: 1226 - blobValue += wxT("PNG image"); 1227 - break; 1228 - case GAIA_GIF_BLOB: 1229 - blobValue += wxT("GIF image"); 1230 - break; 1231 - case GAIA_PDF_BLOB: 1232 - blobValue += wxT("PDF document"); 1233 - break; 1234 - case GAIA_ZIP_BLOB: 1235 - blobValue += wxT("ZIP archive"); 1236 - break; 1237 - default: 1238 - blobValue += wxT("UNKNOWN type"); 1239 - }; 1240 - TableView->SetCellValue(CurrentEvtRow, CurrentEvtColumn, blobValue); 1241 - TableView->SetCellTextColour(CurrentEvtRow, CurrentEvtColumn, 1242 - wxColour(0, 0, 192)); 1243 - TableView->SetCellBackgroundColour(CurrentEvtRow, CurrentEvtColumn, 1244 - wxColour(255, 255, 204)); 1245 - TableView->ForceRefresh(); 1246 - } 1247 - } 1248 -end: 1249 -// clean-up 1250 - if (in) 1251 - fclose(in); 1252 - if (buffer) 1253 - delete[]buffer; 1254 -} 1255 - 1256 -void MyResultSetView::HexBlobValue(unsigned char *blob, int size, 1257 - wxString & hex) 1258 -{ 1259 -// 1260 -// builds the HEX BLOB as X'01234567890abcdef' 1261 -// 1262 - int i; 1263 - char digit[16]; 1264 - hex = wxT("X'"); 1265 - for (i = 0; i < size; i++) 1266 - { 1267 - sprintf(digit, "%02x", *(blob + i)); 1268 - hex += wxString::FromUTF8(digit); 1269 - } 1270 - hex += wxT("'"); 1271 -} 1272 - 1273 -void MyResultSetView::OnCmdBlobOut(wxCommandEvent & event) 1274 -{ 1275 -// exporting to external file a BLOB-value 1276 - int blobType; 1277 - wxString fileName; 1278 - wxString fileType; 1279 - int ret; 1280 - wxString path; 1281 - FILE *out = NULL; 1282 - char xpath[2048]; 1283 - int wr; 1284 - wxString lastDir; 1285 - if (!CurrentBlob) 1286 - return; 1287 - blobType = 1288 - gaiaGuessBlobType(CurrentBlob->GetBlob(), CurrentBlob->GetBlobSize()); 1289 - switch (blobType) 1290 - { 1291 - case GAIA_JPEG_BLOB: 1292 - case GAIA_EXIF_BLOB: 1293 - case GAIA_EXIF_GPS_BLOB: 1294 - fileName = wxT("image.jpg"); 1295 - fileType = wxT("File JPEG (*.jpg;*.jpeg)|*.jpg"); 1296 - break; 1297 - case GAIA_PNG_BLOB: 1298 - fileName = wxT("image.png"); 1299 - fileType = wxT("File PNG (*.png)|*.png"); 1300 - break; 1301 - case GAIA_GIF_BLOB: 1302 - fileName = wxT("image.gif"); 1303 - fileType = wxT("File GIF (*.gif)|*.gif"); 1304 - break; 1305 - case GAIA_PDF_BLOB: 1306 - fileName = wxT("document.pdf"); 1307 - fileType = wxT("PDF document (*.jpg;*.jpeg)|*.jpg"); 1308 - break; 1309 - case GAIA_ZIP_BLOB: 1310 - fileName = wxT("archive.zip"); 1311 - fileType = wxT("ZIP Archive (*.zip)|*.zip"); 1312 - break; 1313 - default: 1314 - fileName = wxT("file"); 1315 - }; 1316 - fileType += wxT("|All files (*.*)|*.*"); 1317 - wxFileDialog *fileDialog = 1318 - new wxFileDialog(this, wxT("exporting a BLOB value to file"), 1319 - wxT(""), fileName, fileType, 1320 - wxFD_SAVE | wxFD_OVERWRITE_PROMPT, wxDefaultPosition, 1321 - wxDefaultSize, wxT("filedlg")); 1322 - lastDir = MainFrame->GetLastDirectory(); 1323 - if (lastDir.Len() >= 1) 1324 - fileDialog->SetDirectory(lastDir); 1325 - ret = fileDialog->ShowModal(); 1326 - if (ret == wxID_OK) 1327 - { 1328 - wxFileName file(fileDialog->GetPath()); 1329 - path = file.GetPath(); 1330 - path += file.GetPathSeparator(); 1331 - path += file.GetName(); 1332 - switch (blobType) 1333 - { 1334 - case GAIA_JPEG_BLOB: 1335 - case GAIA_EXIF_BLOB: 1336 - case GAIA_EXIF_GPS_BLOB: 1337 - path += wxT(".jpg"); 1338 - break; 1339 - case GAIA_PNG_BLOB: 1340 - path += wxT(".png"); 1341 - break; 1342 - case GAIA_GIF_BLOB: 1343 - path += wxT(".gif"); 1344 - break; 1345 - case GAIA_PDF_BLOB: 1346 - path += wxT(".pdf"); 1347 - break; 1348 - case GAIA_ZIP_BLOB: 1349 - path += wxT(".zip"); 1350 - break; 1351 - default: 1352 - path += file.GetExt(); 1353 - }; 1354 - strcpy(xpath, path.ToUTF8()); 1355 - out = fopen(xpath, "wb"); 1356 - if (!out) 1357 - { 1358 - wxMessageBox(wxT("Cannot open '") + path + wxT("' for writing"), 1359 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1360 - return; 1361 - } 1362 - lastDir = file.GetPath(); 1363 - MainFrame->SetLastDirectory(lastDir); 1364 - ::wxBeginBusyCursor(); 1365 - wr = fwrite(CurrentBlob->GetBlob(), 1, CurrentBlob->GetBlobSize(), out); 1366 - if (wr != CurrentBlob->GetBlobSize()) 1367 - { 1368 - wxMessageBox(wxT("an I/O error occurred"), wxT("spatialite-gui"), 1369 - wxOK | wxICON_ERROR, this); 1370 - } 1371 - fclose(out); 1372 - ::wxEndBusyCursor(); 1373 - } 1374 -} 1375 - 1376 -void MyResultSetView::OnCmdBlobNull(wxCommandEvent & event) 1377 -{ 1378 -// setting to NULL a BLOB-value 1379 - wxString rowid; 1380 - wxString sql; 1381 - int ret; 1382 - char *errMsg = NULL; 1383 - bool error = false; 1384 - MyVariant *value; 1385 - char dummy[256]; 1386 - value = TableValues->GetValue(CurrentEvtRow, 0); 1387 - sprintf(dummy, FORMAT_64, value->GetIntValue()); 1388 - rowid = wxString::FromUTF8(dummy); 1389 - sql = 1390 - wxT("UPDATE \"") + TableName + wxT("\" SET \"") + 1391 - TableView->GetColLabelValue(CurrentEvtColumn); 1392 - sql += wxT("\" = NULL WHERE ROWID = ") + rowid; 1393 - ret = sqlite3_exec(MainFrame->GetSqlite(), sql.ToUTF8(), NULL, NULL, &errMsg); 1394 - if (ret != SQLITE_OK) 1395 - { 1396 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 1397 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1398 - sqlite3_free(errMsg); 1399 - error = true; 1400 - } 1401 - if (error == false) 1402 - { 1403 - // updating the Grid cell 1404 - TableView->SetCellValue(CurrentEvtRow, CurrentEvtColumn, wxT("NULL")); 1405 - TableView->SetCellTextColour(CurrentEvtRow, CurrentEvtColumn, 1406 - wxColour(0, 0, 192)); 1407 - TableView->SetCellBackgroundColour(CurrentEvtRow, CurrentEvtColumn, 1408 - wxColour(255, 255, 204)); 1409 - TableView->ForceRefresh(); 1410 - } 1411 -}
Changes to Shapefiles.cpp.
1 1 /* 2 2 / Shapefiles.cpp 3 3 / methods related to Shapefile loading and saving 4 4 / 5 -/ version 1.2, 2008 October 9 5 +/ version 1.1, 2008 September 13 6 6 / 7 7 / Author: Sandro Furieri a-furieri@lqt.it 8 8 / 9 9 / Copyright (C) 2008 Alessandro Furieri 10 10 / 11 11 / This program is free software: you can redistribute it and/or modify 12 12 / it under the terms of the GNU General Public License as published by ................................................................................ 21 21 / You should have received a copy of the GNU General Public License 22 22 / along with this program. If not, see <http://www.gnu.org/licenses/>. 23 23 / 24 24 */ 25 25 26 26 #include "Classdef.h" 27 27 28 -void MyFrame::CleanTxtTab(char *buf) 28 +void 29 +MyFrame::CleanTxtTab (char *buf) 29 30 { 30 31 // well-formatting a string to be used as a Txt/Tab string 31 - char tmp[65536]; 32 - char *in = tmp; 33 - char *out = buf; 34 - strcpy(tmp, buf); 35 - while (*in != '\0') 36 - { 37 - if (*in == '\t' || *in == '\r' || *in == '\n') 38 - { 39 - in++; 40 - *out++ = ' '; 41 - } else 42 - *out++ = *in++; 43 - } 44 - *out = '\0'; 32 + char tmp[65536]; 33 + char *in = tmp; 34 + char *out = buf; 35 + strcpy (tmp, buf); 36 + while (*in != '\0') 37 + { 38 + if (*in == '\t' || *in == '\r' || *in == '\n') 39 + { 40 + in++; 41 + *out++ = ' '; 42 + } 43 + else 44 + *out++ = *in++; 45 + } 46 + *out = '\0'; 45 47 } 46 48 47 -void MyFrame::CleanCsv(char *buf) 49 +void 50 +MyFrame::CleanCsv (char *buf) 48 51 { 49 52 // well-formatting a string to be used as a Csv string 50 - char tmp[65536]; 51 - char *in = tmp; 52 - char *out = buf; 53 - bool special = false; 54 - strcpy(tmp, buf); 55 - while (*in != '\0') 56 - { 57 - if (*in == ',' || *in == '\r' || *in == '\n') 58 - special = true; 59 - if (*in == '"') 60 - *out++ = '"'; 61 - *out++ = *in++; 62 - } 63 - *out = '\0'; 64 - if (special == true) 65 - { 66 - sprintf(tmp, "\"%s\"", buf); 67 - strcpy(buf, tmp); 68 - } 53 + char tmp[65536]; 54 + char *in = tmp; 55 + char *out = buf; 56 + bool special = false; 57 + strcpy (tmp, buf); 58 + while (*in != '\0') 59 + { 60 + if (*in == ',' || *in == '\r' || *in == '\n') 61 + special = true; 62 + if (*in == '"') 63 + *out++ = '"'; 64 + *out++ = *in++; 65 + } 66 + *out = '\0'; 67 + if (special == true) 68 + { 69 + sprintf (tmp, "\"%s\"", buf); 70 + strcpy (buf, tmp); 71 + } 69 72 } 70 73 71 -void MyFrame::CleanHtml(char *buf) 74 +void 75 +MyFrame::CleanHtml (char *buf) 72 76 { 73 77 // well-formatting a string to be used as an Html string 74 - char tmp[65536]; 75 - char *in = tmp; 76 - char *out = buf; 77 - strcpy(tmp, buf); 78 - while (*in != '\0') 79 - { 80 - if (*in == '<') 81 - { 82 - *out++ = '&'; 83 - *out++ = 'l'; 84 - *out++ = 't'; 85 - *out++ = ';'; 86 - in++; 87 - continue; 88 - } 89 - if (*in == '>') 90 - { 91 - *out++ = '&'; 92 - *out++ = 'g'; 93 - *out++ = 't'; 94 - *out++ = ';'; 95 - in++; 96 - continue; 97 - } 98 - if (*in == ' ') 99 - { 100 - *out++ = '&'; 101 - *out++ = 'n'; 102 - *out++ = 'b'; 103 - *out++ = 's'; 104 - *out++ = 'p'; 105 - *out++ = ';'; 106 - in++; 107 - continue; 108 - } 109 - if (*in == '"') 110 - { 111 - *out++ = '&'; 112 - *out++ = 'q'; 113 - *out++ = 'u'; 114 - *out++ = 'o'; 115 - *out++ = 't'; 116 - *out++ = ';'; 117 - in++; 118 - continue; 119 - } 120 - if (*in == '&') 121 - { 122 - *out++ = '&'; 123 - *out++ = 'a'; 124 - *out++ = 'm'; 125 - *out++ = 'p'; 126 - *out++ = ';'; 127 - in++; 128 - continue; 129 - } 130 - *out++ = *in++; 131 - } 132 - *out = '\0'; 78 + char tmp[65536]; 79 + char *in = tmp; 80 + char *out = buf; 81 + strcpy (tmp, buf); 82 + while (*in != '\0') 83 + { 84 + if (*in == '<') 85 + { 86 + *out++ = '&'; 87 + *out++ = 'l'; 88 + *out++ = 't'; 89 + *out++ = ';'; 90 + in++; 91 + continue; 92 + } 93 + if (*in == '>') 94 + { 95 + *out++ = '&'; 96 + *out++ = 'g'; 97 + *out++ = 't'; 98 + *out++ = ';'; 99 + in++; 100 + continue; 101 + } 102 + if (*in == ' ') 103 + { 104 + *out++ = '&'; 105 + *out++ = 'n'; 106 + *out++ = 'b'; 107 + *out++ = 's'; 108 + *out++ = 'p'; 109 + *out++ = ';'; 110 + in++; 111 + continue; 112 + } 113 + if (*in == '"') 114 + { 115 + *out++ = '&'; 116 + *out++ = 'q'; 117 + *out++ = 'u'; 118 + *out++ = 'o'; 119 + *out++ = 't'; 120 + *out++ = ';'; 121 + in++; 122 + continue; 123 + } 124 + if (*in == '&') 125 + { 126 + *out++ = '&'; 127 + *out++ = 'a'; 128 + *out++ = 'm'; 129 + *out++ = 'p'; 130 + *out++ = ';'; 131 + in++; 132 + continue; 133 + } 134 + *out++ = *in++; 135 + } 136 + *out = '\0'; 133 137 } 134 138 135 -bool MyFrame::TableAlreadyExists(wxString & name) 139 +bool MyFrame::TableAlreadyExists (wxString & name) 136 140 { 137 141 // 138 142 // checks if a table of this name already exists 139 143 // 140 - char **results; 141 - int rows; 142 - int columns; 143 - int i; 144 - char *errMsg = NULL; 145 - bool already_exists = false; 146 - wxString sql = 147 - wxT("SELECT name FROM sqlite_master WHERE type = 'table' AND name LIKE '"); 148 - sql += name; 149 - sql += wxT("'"); 150 - int ret = sqlite3_get_table(SqliteHandle, sql.ToUTF8(), &results, 151 - &rows, &columns, &errMsg); 152 - if (ret != SQLITE_OK) 153 - { 154 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 155 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 156 - sqlite3_free(errMsg); 157 - return false; 158 - } 159 - if (rows < 1) 160 - ; 161 - else 162 - { 163 - for (i = 1; i <= rows; i++) 164 - already_exists = true; 165 - } 166 - sqlite3_free_table(results); 167 - return already_exists; 144 + char ** 145 + results; 146 + int 147 + rows; 148 + int 149 + columns; 150 + int 151 + i; 152 + char * 153 + errMsg = NULL; 154 + bool 155 + already_exists = false; 156 + wxString 157 + sql = 158 + wxT 159 + ("SELECT name FROM sqlite_master WHERE type = 'table' AND name = '"); 160 + sql += name; 161 + sql += wxT ("'"); 162 + int 163 + ret = sqlite3_get_table (SqliteHandle, sql.ToUTF8 (), &results, 164 + &rows, &columns, &errMsg); 165 + if (ret != SQLITE_OK) 166 + { 167 + wxMessageBox (wxT ("SQLite SQL error: ") + 168 + wxString::FromUTF8 (errMsg), wxT ("spatialite-gui"), 169 + wxOK | wxICON_ERROR, this); 170 + sqlite3_free (errMsg); 171 + return false; 172 + } 173 + if (rows < 1) 174 + ; 175 + else 176 + { 177 + for (i = 1; i <= rows; i++) 178 + already_exists = true; 179 + } 180 + sqlite3_free_table (results); 181 + return already_exists; 168 182 } 169 183 170 -bool MyFrame::SridNotExists(int srid) 184 +bool MyFrame::SridNotExists (int srid) 171 185 { 172 186 // 173 187 // checks if a SRID value is a valid one 174 188 // 175 - char **results; 176 - int rows; 177 - int columns; 178 - int i; 179 - char *errMsg = NULL; 180 - bool constrained = false; 181 - bool not_exists = true; 182 - wxString RefSysName; 183 - char xsql[128]; 184 - wxString sql = 185 - wxT 186 - ("SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'spatial_ref_sys'"); 187 - int ret = sqlite3_get_table(SqliteHandle, sql.ToUTF8(), &results, 188 - &rows, &columns, &errMsg); 189 - if (ret != SQLITE_OK) 190 - { 191 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 192 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 193 - sqlite3_free(errMsg); 194 - return false; 195 - } 196 - if (rows < 1) 197 - ; 198 - else 199 - { 200 - for (i = 1; i <= rows; i++) 201 - constrained = true; 202 - } 203 - sqlite3_free_table(results); 204 - if (constrained == false) 205 - return false; 206 - sprintf(xsql, "SELECT ref_sys_name FROM spatial_ref_sys WHERE srid = %d", 207 - srid); 208 - ret = 209 - sqlite3_get_table(SqliteHandle, xsql, &results, &rows, &columns, &errMsg); 210 - if (ret != SQLITE_OK) 211 - { 212 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 213 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 214 - sqlite3_free(errMsg); 215 - return false; 216 - } 217 - if (rows < 1) 218 - ; 219 - else 220 - { 221 - for (i = 1; i <= rows; i++) 222 - not_exists = false; 223 - } 224 - sqlite3_free_table(results); 225 - return not_exists; 189 + char ** 190 + results; 191 + int 192 + rows; 193 + int 194 + columns; 195 + int 196 + i; 197 + char * 198 + errMsg = NULL; 199 + bool 200 + constrained = false; 201 + bool 202 + not_exists = true; 203 + wxString 204 + RefSysName; 205 + wxString 206 + sql = 207 + wxT 208 + ("SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'spatial_ref_sys'"); 209 + int 210 + ret = sqlite3_get_table (SqliteHandle, sql.ToUTF8 (), &results, 211 + &rows, &columns, &errMsg); 212 + if (ret != SQLITE_OK) 213 + { 214 + wxMessageBox (wxT ("SQLite SQL error: ") + 215 + wxString::FromUTF8 (errMsg), wxT ("spatialite-gui"), 216 + wxOK | wxICON_ERROR, this); 217 + sqlite3_free (errMsg); 218 + return false; 219 + } 220 + if (rows < 1) 221 + ; 222 + else 223 + { 224 + for (i = 1; i <= rows; i++) 225 + constrained = true; 226 + } 227 + sqlite3_free_table (results); 228 + if (constrained == false) 229 + return false; 230 + sql.Printf (wxT 231 + ("SELECT ref_sys_name FROM spatial_ref_sys WHERE srid = %d"), 232 + srid); 233 + ret = 234 + sqlite3_get_table (SqliteHandle, sql.ToUTF8 (), &results, &rows, 235 + &columns, &errMsg); 236 + if (ret != SQLITE_OK) 237 + { 238 + wxMessageBox (wxT ("SQLite SQL error: ") + 239 + wxString::FromUTF8 (errMsg), wxT ("spatialite-gui"), 240 + wxOK | wxICON_ERROR, this); 241 + sqlite3_free (errMsg); 242 + return false; 243 + } 244 + if (rows < 1) 245 + ; 246 + else 247 + { 248 + for (i = 1; i <= rows; i++) 249 + not_exists = false; 250 + } 251 + sqlite3_free_table (results); 252 + return not_exists; 226 253 } 227 254 228 -bool MyFrame::CheckMetadata() 255 +bool MyFrame::CheckMetadata () 229 256 { 230 257 // 231 258 // checking if METADATA tables are defined 232 259 // 233 - char **results; 234 - int rows; 235 - int columns; 236 - int i; 237 - char *errMsg = NULL; 238 - bool constrained = false; 239 - if (SpatiaLiteMetadata == false) 240 - return false; 241 - wxString sql = 242 - wxT 243 - ("SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'geometry_columns'"); 244 - int ret = sqlite3_get_table(SqliteHandle, sql.ToUTF8(), &results, 245 - &rows, &columns, &errMsg); 246 - if (ret != SQLITE_OK) 247 - { 248 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 249 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 250 - sqlite3_free(errMsg); 251 - return false; 252 - } 253 - if (rows < 1) 254 - ; 255 - else 256 - { 257 - for (i = 1; i <= rows; i++) 258 - constrained = true; 259 - } 260 - sqlite3_free_table(results); 261 - return constrained; 260 + char ** 261 + results; 262 + int 263 + rows; 264 + int 265 + columns; 266 + int 267 + i; 268 + char * 269 + errMsg = NULL; 270 + bool 271 + constrained = false; 272 + wxString 273 + sql = 274 + wxT 275 + ("SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'geometry_columns'"); 276 + int 277 + ret = sqlite3_get_table (SqliteHandle, sql.ToUTF8 (), &results, 278 + &rows, &columns, &errMsg); 279 + if (ret != SQLITE_OK) 280 + { 281 + wxMessageBox (wxT ("SQLite SQL error: ") + 282 + wxString::FromUTF8 (errMsg), wxT ("spatialite-gui"), 283 + wxOK | wxICON_ERROR, this); 284 + sqlite3_free (errMsg); 285 + return false; 286 + } 287 + if (rows < 1) 288 + ; 289 + else 290 + { 291 + for (i = 1; i <= rows; i++) 292 + constrained = true; 293 + } 294 + sqlite3_free_table (results); 295 + return constrained; 262 296 } 263 297 264 -void MyFrame::CleanSqlString(char *value) 298 +void 299 +MyFrame::CleanSqlString (char *value) 265 300 { 266 301 // 267 302 // returns a well formatted TEXT value for SQL 268 303 // 1] strips trailing spaces 269 304 // 2] masks any ' inside the string, appending another ' 270 305 // 271 - char new_value[1024]; 272 - char *p; 273 - int len; 274 - int i; 275 - len = strlen(value); 276 - for (i = (len - 1); i >= 0; i--) 277 - { 278 - // stripping trailing spaces 279 - if (value[i] == ' ') 280 - value[i] = '\0'; 281 - else 282 - break; 283 - } 284 - p = new_value; 285 - for (i = 0; i < len; i++) 286 - { 287 - if (value[i] == '\'') 288 - *(p++) = '\''; 289 - *(p++) = value[i]; 290 - } 291 - *p = '\0'; 292 - strcpy(value, new_value); 306 + char new_value[1024]; 307 + char *p; 308 + int len; 309 + int i; 310 + len = strlen (value); 311 + for (i = (len - 1); i >= 0; i--) 312 + { 313 + // stripping trailing spaces 314 + if (value[i] == ' ') 315 + value[i] = '\0'; 316 + else 317 + break; 318 + } 319 + p = new_value; 320 + for (i = 0; i < len; i++) 321 + { 322 + if (value[i] == '\'') 323 + *(p++) = '\''; 324 + *(p++) = value[i]; 325 + } 326 + *p = '\0'; 327 + strcpy (value, new_value); 293 328 } 294 329 295 -void MyFrame::LoadShapefile(wxString & path, wxString & table, int srid, 296 - wxString & column, wxString & charset) 330 +void 331 +MyFrame::LoadShapefile (wxString & path, wxString & table, int srid, 332 + wxString & column, wxString & charset) 297 333 { 298 334 // 299 335 // loading a Shapefile as a new DB table 300 336 // 301 - sqlite3_stmt *stmt; 302 - int cnt; 303 - int col_cnt; 304 - int seed; 305 - int len; 306 - int dup; 307 - int idup; 308 - int current_row; 309 - int ret; 310 - int rows = 0; 311 - char *errMsg = NULL; 312 - char xtable[1024]; 313 - char xcolumn[1024]; 314 - char dummyName[4096]; 315 - char sql[65536]; 316 - char **col_name = NULL; 317 - unsigned char *blob; 318 - int blob_size; 319 - const char *geom_type = "UNKNOWN"; 320 - wxString dummyStr; 321 - wxString msg; 322 - gaiaShapefilePtr shp = NULL; 323 - gaiaDbfFieldPtr dbf_field; 324 - bool metadata = CheckMetadata(); 325 - bool sqlError = false; 337 + int cnt; 338 + int col_cnt; 339 + int seed; 340 + int len; 341 + int dup; 342 + int idup; 343 + int current_row; 344 + int ret; 345 + int rows = 0; 346 + char *errMsg = NULL; 347 + char xtable[1024]; 348 + char xcolumn[1024]; 349 + char dummy[65536]; 350 + char dummyName[4096]; 351 + char sql[65536]; 352 + char **col_name = NULL; 353 + const char *geom_type = "UNKNOWN"; 354 + char *hexWKB = NULL; 355 + int szSQL; 356 + char *bufSQL = NULL; 357 + wxString dummyStr; 358 + wxString msg; 359 + gaiaShapefilePtr shp = NULL; 360 + gaiaDbfFieldPtr dbf_field; 361 + bool metadata = CheckMetadata (); 362 + bool sqlError = false; 326 363 // 327 364 // performing some checks before starting 328 365 // 329 - if (TableAlreadyExists(table) == true) 330 - { 331 - wxMessageBox(wxT("a table name '") + table + wxT("' already exists"), 332 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 333 - return; 334 - } 335 - if (metadata == true) 336 - { 337 - if (SridNotExists(srid) == true) 338 - { 339 - wxMessageBox(wxT("invalid SRID value"), wxT("spatialite-gui"), 340 - wxOK | wxICON_ERROR, this); 341 - return; 342 - } 343 - } 366 + if (TableAlreadyExists (table) == true) 367 + { 368 + wxMessageBox (wxT ("a table name '") + table + 369 + wxT ("' already exists"), wxT ("spatialite-gui"), 370 + wxOK | wxICON_ERROR, this); 371 + return; 372 + } 373 + if (gaiaIllegalSqlName (table.ToUTF8 ()) == 1 374 + || gaiaIsReservedSqlName (table.ToUTF8 ()) == 1 375 + || gaiaIsReservedSqliteName (table.ToUTF8 ()) == 1) 376 + { 377 + wxMessageBox (wxT ("'") + table + 378 + wxT 379 + ("' is an invalid TABLE NAME\n\nsame as SQL reserved keyword"), 380 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, this); 381 + return; 382 + } 383 + if (gaiaIllegalSqlName (column.ToUTF8 ()) == 1 384 + || gaiaIsReservedSqlName (column.ToUTF8 ()) == 1 385 + || gaiaIsReservedSqliteName (column.ToUTF8 ()) == 1) 386 + { 387 + wxMessageBox (wxT ("'") + column + 388 + wxT 389 + ("' is an invalid COLUMN NAME\n\nsame as SQL reserved keyword"), 390 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, this); 391 + return; 392 + } 393 + if (metadata == true) 394 + { 395 + if (SridNotExists (srid) == true) 396 + { 397 + wxMessageBox (wxT ("invalid SRID value"), 398 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 399 + this); 400 + return; 401 + } 402 + } 344 403 // 345 404 // initalizing the SHP struct 346 405 // 347 - shp = gaiaAllocShapefile(); 348 - gaiaOpenShpRead(shp, path.ToUTF8(), charset.ToUTF8(), "UTF-8"); 349 - if (!(shp->Valid)) 350 - { 351 - wxString error = wxT("ERROR: invalid Shapefile\n\n"); 352 - if (shp->LastError) 353 - error += wxString::FromUTF8(shp->LastError); 354 - gaiaFreeShapefile(shp); 355 - wxMessageBox(error, wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 356 - return; 357 - } 358 - ::wxBeginBusyCursor(); 406 + shp = gaiaAllocShapefile (); 407 + gaiaOpenShpRead (shp, path.ToUTF8 (), charset.ToUTF8 (), "UTF-8"); 408 + if (!(shp->Valid)) 409 + { 410 + gaiaFreeShapefile (shp); 411 + return; 412 + } 413 + ::wxBeginBusyCursor (); 359 414 // 360 415 // checking for duplicate / illegal column names and antialising them 361 416 // 362 - col_cnt = 0; 363 - dbf_field = shp->Dbf->First; 364 - while (dbf_field) 365 - { 366 - // counting DBF fields 367 - col_cnt++; 368 - dbf_field = dbf_field->Next; 369 - } 370 - col_name = (char **) malloc(sizeof(char *) * col_cnt); 371 - cnt = 0; 372 - seed = 0; 373 - dbf_field = shp->Dbf->First; 374 - while (dbf_field) 375 - { 376 - // preparing column names 377 - strcpy(dummyName, dbf_field->Name); 378 - dup = 0; 379 - for (idup = 0; idup < cnt; idup++) 380 - { 381 - if (strcasecmp(dummyName, *(col_name + idup)) == 0) 382 - dup = 1; 383 - } 384 - if (strcasecmp(dummyName, "PK_UID") == 0) 385 - dup = 1; 386 - if (strcasecmp(dummyName, column.ToUTF8()) == 0) 387 - dup = 1; 388 - if (dup) 389 - sprintf(dummyName, "COL_%d", seed++); 390 - len = strlen(dummyName); 391 - *(col_name + cnt) = (char *) malloc(len + 1); 392 - strcpy(*(col_name + cnt), dummyName); 393 - cnt++; 394 - dbf_field = dbf_field->Next; 395 - } 417 + col_cnt = 0; 418 + dbf_field = shp->Dbf->First; 419 + while (dbf_field) 420 + { 421 + // counting DBF fields 422 + col_cnt++; 423 + dbf_field = dbf_field->Next; 424 + } 425 + col_name = (char **) malloc (sizeof (char *) * col_cnt); 426 + cnt = 0; 427 + seed = 0; 428 + dbf_field = shp->Dbf->First; 429 + while (dbf_field) 430 + { 431 + // preparing column names 432 + if (gaiaIllegalSqlName (dbf_field->Name) 433 + || gaiaIsReservedSqlName (dbf_field->Name) 434 + || gaiaIsReservedSqliteName (dbf_field->Name)) 435 + sprintf (dummyName, "COL_%d", seed++); 436 + else 437 + strcpy (dummyName, dbf_field->Name); 438 + dup = 0; 439 + for (idup = 0; idup < cnt; idup++) 440 + { 441 + if (strcasecmp (dummyName, *(col_name + idup)) == 0) 442 + dup = 1; 443 + } 444 + if (strcasecmp (dummyName, "PK_UID") == 0) 445 + dup = 1; 446 + if (strcasecmp (dummyName, column.ToUTF8 ()) == 0) 447 + dup = 1; 448 + if (dup) 449 + sprintf (dummyName, "COL_%d", seed++); 450 + len = strlen (dummyName); 451 + *(col_name + cnt) = (char *) malloc (len + 1); 452 + strcpy (*(col_name + cnt), dummyName); 453 + cnt++; 454 + dbf_field = dbf_field->Next; 455 + } 396 456 // 397 457 // starting a transaction 398 458 // 399 - ret = sqlite3_exec(SqliteHandle, "BEGIN", NULL, 0, &errMsg); 400 - if (ret != SQLITE_OK) 401 - { 402 - wxMessageBox(wxT("load shapefile error:") + wxString::FromUTF8(errMsg), 403 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 404 - sqlite3_free(errMsg); 405 - sqlError = true; 406 - goto clean_up; 407 - } 459 + ret = sqlite3_exec (SqliteHandle, "BEGIN", NULL, 0, &errMsg); 460 + if (ret != SQLITE_OK) 461 + { 462 + wxMessageBox (wxT ("load shapefile error:") + 463 + wxString::FromUTF8 (errMsg), wxT ("spatialite-gui"), 464 + wxOK | wxICON_ERROR, this); 465 + sqlite3_free (errMsg); 466 + sqlError = true; 467 + goto clean_up; 468 + } 408 469 // 409 470 // creating the Table 410 471 // 411 - strcpy(xtable, table.ToUTF8()); 412 - strcpy(xcolumn, column.ToUTF8()); 413 - sprintf(sql, "CREATE TABLE \"%s\"", xtable); 414 - strcat(sql, " (\n\"PK_UID\" INTEGER PRIMARY KEY AUTOINCREMENT"); 415 - cnt = 0; 416 - dbf_field = shp->Dbf->First; 417 - while (dbf_field) 418 - { 419 - strcat(sql, ",\n\""); 420 - strcat(sql, *(col_name + cnt)); 421 - cnt++; 422 - switch (dbf_field->Type) 423 - { 424 - case 'C': 425 - strcat(sql, "\" TEXT"); 426 - break; 427 - case 'N': 428 - if (dbf_field->Decimals) 429 - strcat(sql, "\" DOUBLE"); 430 - else 431 - { 432 - if (dbf_field->Length <= 18) 433 - strcat(sql, "\" INTEGER"); 434 - else 435 - strcat(sql, "\" DOUBLE"); 436 - } 437 - break; 438 - case 'D': 439 - strcat(sql, "\" DOUBLE"); 440 - break; 441 - case 'L': 442 - strcat(sql, "\" INTEGER"); 443 - break; 444 - }; 445 - dbf_field = dbf_field->Next; 446 - } 447 - if (metadata == true) 448 - strcat(sql, ")"); 449 - else 450 - { 451 - strcat(sql, ",\n"); 452 - strcat(sql, xcolumn); 453 - strcat(sql, " BLOB)"); 454 - } 455 - ret = sqlite3_exec(SqliteHandle, sql, NULL, 0, &errMsg); 456 - if (ret != SQLITE_OK) 457 - { 458 - wxMessageBox(wxT("load shapefile error:") + wxString::FromUTF8(errMsg), 459 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 460 - sqlite3_free(errMsg); 461 - sqlError = true; 462 - goto clean_up; 463 - } 464 - if (metadata) 465 - { 466 - // creating Geometry column 467 - switch (shp->Shape) 468 - { 469 - case 1: 470 - case 11: 471 - case 21: 472 - geom_type = "POINT"; 473 - break; 474 - case 8: 475 - geom_type = "MULTIPOINT"; 476 - break; 477 - case 3: 478 - case 13: 479 - case 23: 480 - gaiaShpAnalyze(shp); 481 - if (shp->EffectiveType == GAIA_LINESTRING) 482 - geom_type = "LINESTRING"; 483 - else 484 - geom_type = "MULTILINESTRING"; 485 - break; 486 - case 5: 487 - case 15: 488 - case 25: 489 - gaiaShpAnalyze(shp); 490 - if (shp->EffectiveType == GAIA_POLYGON) 491 - geom_type = "POLYGON"; 492 - else 493 - geom_type = "MULTIPOLYGON"; 494 - break; 495 - }; 496 - sprintf(sql, "SELECT AddGeometryColumn('%s', '%s', %d, '%s', 2)", xtable, 497 - xcolumn, srid, geom_type); 498 - ret = sqlite3_exec(SqliteHandle, sql, NULL, 0, &errMsg); 499 - if (ret != SQLITE_OK) 500 - { 501 - wxMessageBox(wxT("load shapefile error:") + 502 - wxString::FromUTF8(errMsg), wxT("spatialite-gui"), 503 - wxOK | wxICON_ERROR, this); 504 - sqlite3_free(errMsg); 505 - sqlError = true; 506 - goto clean_up; 507 - } 508 - } else 509 - { 510 - // no Metadata 511 - if (shp->Shape == 3 || shp->Shape == 13 || shp->Shape == 23 512 - || shp->Shape == 5 || shp->Shape == 15 || shp->Shape == 25) 513 - { 514 - // fixing anyway the Geometry type for LINESTRING/MULTILINESTRING or POLYGON/MULTIPOLYGON 515 - gaiaShpAnalyze(shp); 516 - } 517 - } 518 -// preparing the INSERT INTO parameterized statement 519 - sprintf(sql, "INSERT INTO \"%s\" (\"PK_UID\",", xtable); 520 - cnt = 0; 521 - dbf_field = shp->Dbf->First; 522 - while (dbf_field) 523 - { 524 - // columns corresponding to some DBF attribute 525 - strcat(sql, "\""); 526 - strcat(sql, *(col_name + cnt)); 527 - cnt++; 528 - strcat(sql, "\","); 529 - dbf_field = dbf_field->Next; 530 - } 531 - strcat(sql, xcolumn); // the GEOMETRY column 532 - strcat(sql, ")\nVALUES (? "); 533 - dbf_field = shp->Dbf->First; 534 - while (dbf_field) 535 - { 536 - // column values 537 - strcat(sql, ", ?"); 538 - dbf_field = dbf_field->Next; 539 - } 540 - strcat(sql, ", ?)"); // the GEOMETRY column 541 - ret = sqlite3_prepare_v2(SqliteHandle, sql, strlen(sql), &stmt, NULL); 542 - if (ret != SQLITE_OK) 543 - { 544 - wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)); 545 - wxMessageBox(wxT("load shapefile error: ") + err, wxT("spatialite-gui"), 546 - wxOK | wxICON_ERROR, this); 547 - sqlError = true; 548 - goto clean_up; 549 - } 550 - current_row = 0; 551 - while (1) 552 - { 553 - // 554 - // inserting rows from shapefile 555 - // 556 - ret = gaiaReadShpEntity(shp, current_row, srid); 557 - if (!ret) 558 - { 559 - if (!(shp->LastError)) // normal SHP EOF 560 - break; 561 - wxMessageBox(wxT("load shapefile error:") + 562 - wxString::FromUTF8(shp->LastError), 563 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 564 - sqlError = true; 565 - goto clean_up; 566 - } 567 - current_row++; 568 - // binding query params 569 - sqlite3_reset(stmt); 570 - sqlite3_clear_bindings(stmt); 571 - sqlite3_bind_int(stmt, 1, current_row); 572 - cnt = 0; 573 - dbf_field = shp->Dbf->First; 574 - while (dbf_field) 575 - { 576 - // column values 577 - if (!(dbf_field->Value)) 578 - sqlite3_bind_null(stmt, cnt + 2); 579 - else 580 - { 581 - switch (dbf_field->Value->Type) 582 - { 583 - case GAIA_INT_VALUE: 584 - sqlite3_bind_int64(stmt, cnt + 2, 585 - dbf_field->Value->IntValue); 586 - break; 587 - case GAIA_DOUBLE_VALUE: 588 - sqlite3_bind_double(stmt, cnt + 2, 589 - dbf_field->Value->DblValue); 590 - break; 591 - case GAIA_TEXT_VALUE: 592 - sqlite3_bind_text(stmt, cnt + 2, 593 - dbf_field->Value->TxtValue, 594 - strlen(dbf_field->Value-> 595 - TxtValue), SQLITE_STATIC); 596 - break; 597 - default: 598 - sqlite3_bind_null(stmt, cnt + 2);; 599 - break; 600 - }; 601 - } 602 - cnt++; 603 - dbf_field = dbf_field->Next; 604 - } 605 - if (shp->Dbf->Geometry) 606 - { 607 - gaiaToSpatiaLiteBlobWkb(shp->Dbf->Geometry, &blob, &blob_size); 608 - sqlite3_bind_blob(stmt, cnt + 2, blob, blob_size, free); 609 - } else 610 - { 611 - /* handling a NULL-Geometry */ 612 - sqlite3_bind_null(stmt, cnt + 2); 613 - } 614 - ret = sqlite3_step(stmt); 615 - if (ret == SQLITE_DONE || ret == SQLITE_ROW) 616 - ; 617 - else 618 - { 619 - wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)); 620 - wxMessageBox(wxT("load shapefile error:") + err, 621 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 622 - sqlite3_finalize(stmt); 623 - sqlError = true; 624 - goto clean_up; 625 - } 626 - rows++; 627 - } 628 - sqlite3_finalize(stmt); 629 -clean_up: 630 - gaiaFreeShapefile(shp); 631 - if (col_name) 632 - { 633 - // releasing memory allocation for column names 634 - for (cnt = 0; cnt < col_cnt; cnt++) 635 - free(*(col_name + cnt)); 636 - free(col_name); 637 - } 638 - if (sqlError == true) 639 - { 640 - // some error occurred - ROLLBACK 641 - ret = sqlite3_exec(SqliteHandle, "ROLLBACK", NULL, 0, &errMsg); 642 - if (ret != SQLITE_OK) 643 - { 644 - wxMessageBox(wxT("load shapefile error:") + 645 - wxString::FromUTF8(errMsg), wxT("spatialite-gui"), 646 - wxOK | wxICON_ERROR, this); 647 - sqlite3_free(errMsg); 648 - } 649 - ::wxEndBusyCursor(); 650 - msg = 651 - wxT("Shapefile not loaded\n\n\na ROLLBACK was automatically performed"); 652 - wxMessageBox(msg, wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 653 - } else 654 - { 655 - // ok - confirming pending transaction - COMMIT 656 - ret = sqlite3_exec(SqliteHandle, "COMMIT", NULL, 0, &errMsg); 657 - if (ret != SQLITE_OK) 658 - { 659 - wxMessageBox(wxT("load shapefile error:") + 660 - wxString::FromUTF8(errMsg), wxT("spatialite-gui"), 661 - wxOK | wxICON_ERROR, this); 662 - sqlite3_free(errMsg); 663 - return; 664 - } 665 - ::wxEndBusyCursor(); 666 - sprintf(dummyName, "Shapefile loaded\n\n%d inserted rows", rows); 667 - msg = wxString::FromUTF8(dummyName); 668 - wxMessageBox(msg, wxT("spatialite-gui"), wxOK | wxICON_INFORMATION, this); 669 - InitTableTree(); 670 - } 472 + strcpy (xtable, table.ToUTF8 ()); 473 + strcpy (xcolumn, column.ToUTF8 ()); 474 + sprintf (sql, "CREATE TABLE %s", xtable); 475 + strcat (sql, " (\nPK_UID INTEGER PRIMARY KEY AUTOINCREMENT"); 476 + cnt = 0; 477 + dbf_field = shp->Dbf->First; 478 + while (dbf_field) 479 + { 480 + strcat (sql, ",\n"); 481 + strcat (sql, *(col_name + cnt)); 482 + cnt++; 483 + switch (dbf_field->Type) 484 + { 485 + case 'C': 486 + strcat (sql, " TEXT"); 487 + break; 488 + case 'N': 489 + if (dbf_field->Decimals) 490 + strcat (sql, " DOUBLE"); 491 + else 492 + { 493 + if (dbf_field->Length <= 9) 494 + strcat (sql, " INTEGER"); 495 + else 496 + strcat (sql, " DOUBLE"); 497 + } 498 + break; 499 + case 'D': 500 + strcat (sql, " TEXT"); 501 + break; 502 + case 'L': 503 + strcat (sql, " INTEGER"); 504 + break; 505 + }; 506 + strcat (sql, " NOT NULL"); 507 + dbf_field = dbf_field->Next; 508 + } 509 + if (metadata == true) 510 + strcat (sql, ")"); 511 + else 512 + { 513 + strcat (sql, ",\n"); 514 + strcat (sql, xcolumn); 515 + strcat (sql, " BLOB NOT NULL)"); 516 + } 517 + ret = sqlite3_exec (SqliteHandle, sql, NULL, 0, &errMsg); 518 + if (ret != SQLITE_OK) 519 + { 520 + wxMessageBox (wxT ("load shapefile error:") + 521 + wxString::FromUTF8 (errMsg), wxT ("spatialite-gui"), 522 + wxOK | wxICON_ERROR, this); 523 + sqlite3_free (errMsg); 524 + sqlError = true; 525 + goto clean_up; 526 + } 527 + if (metadata) 528 + { 529 + // creating Geometry column 530 + switch (shp->Shape) 531 + { 532 + case 1: 533 + case 11: 534 + case 21: 535 + geom_type = "POINT"; 536 + break; 537 + case 8: 538 + geom_type = "MULTIPOINT"; 539 + break; 540 + case 3: 541 + case 13: 542 + case 23: 543 + geom_type = "MULTILINESTRING"; 544 + break; 545 + case 5: 546 + case 15: 547 + case 25: 548 + geom_type = "MULTIPOLYGON"; 549 + break; 550 + }; 551 + sprintf (sql, "SELECT AddGeometryColumn('%s', '%s', %d, '%s', 2)", 552 + xtable, xcolumn, srid, geom_type); 553 + ret = sqlite3_exec (SqliteHandle, sql, NULL, 0, &errMsg); 554 + if (ret != SQLITE_OK) 555 + { 556 + wxMessageBox (wxT ("load shapefile error:") + 557 + wxString::FromUTF8 (errMsg), 558 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 559 + this); 560 + sqlite3_free (errMsg); 561 + sqlError = true; 562 + goto clean_up; 563 + } 564 + } 565 + current_row = 0; 566 + while (1) 567 + { 568 + // 569 + // inserting rows from shapefile 570 + // 571 + ret = gaiaReadShpEntity (shp, current_row, srid); 572 + if (!ret) 573 + { 574 + if (!(shp->LastError)) // normal SHP EOF 575 + break; 576 + wxMessageBox (wxT ("load shapefile error:") + 577 + wxString::FromUTF8 (shp->LastError), 578 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 579 + this); 580 + sqlError = true; 581 + goto clean_up; 582 + } 583 + current_row++; 584 + sprintf (sql, "INSERT INTO %s (\nPK_UID,", xtable); 585 + cnt = 0; 586 + dbf_field = shp->Dbf->First; 587 + while (dbf_field) 588 + { 589 + // columns corresponding to some DBF attribute 590 + strcat (sql, *(col_name + cnt)); 591 + cnt++; 592 + strcat (sql, ","); 593 + dbf_field = dbf_field->Next; 594 + } 595 + strcat (sql, xcolumn); // the GEOMETRY column 596 + strcat (sql, ")\nVALUES ("); 597 + sprintf (dummy, "%d,", current_row); 598 + strcat (sql, dummy); 599 + dbf_field = shp->Dbf->First; 600 + while (dbf_field) 601 + { 602 + // column values 603 + if (!(dbf_field->Value)) 604 + strcat (sql, "NULL"); 605 + else 606 + { 607 + switch (dbf_field->Value->Type) 608 + { 609 + case GAIA_INT_VALUE: 610 + sprintf (dummy, "%d", dbf_field->Value->IntValue); 611 + strcat (sql, dummy); 612 + break; 613 + case GAIA_DOUBLE_VALUE: 614 + sprintf (dummy, "%1.6lf", 615 + dbf_field->Value->DblValue); 616 + strcat (sql, dummy); 617 + break; 618 + case GAIA_TEXT_VALUE: 619 + strcpy (dummy, dbf_field->Value->TxtValue); 620 + CleanSqlString (dummy); 621 + strcat (sql, "'"); 622 + strcat (sql, dummy); 623 + strcat (sql, "'"); 624 + break; 625 + default: 626 + strcat (sql, "NULL"); 627 + break; 628 + }; 629 + } 630 + strcat (sql, ","); 631 + dbf_field = dbf_field->Next; 632 + } 633 + hexWKB = gaiaToHexWkb (shp->Dbf->Geometry); 634 + szSQL = strlen (sql) + strlen (hexWKB) + 1024; 635 + bufSQL = (char *) malloc (szSQL); 636 + strcpy (bufSQL, sql); 637 + strcat (bufSQL, "\n"); 638 + strcat (bufSQL, "GeomFromWkb(X'"); 639 + strcat (bufSQL, hexWKB); 640 + sprintf (dummy, "', %d))", srid); 641 + strcat (bufSQL, dummy); 642 + ret = sqlite3_exec (SqliteHandle, bufSQL, NULL, 0, &errMsg); 643 + if (ret != SQLITE_OK) 644 + { 645 + wxMessageBox (wxT ("load shapefile error:") + 646 + wxString::FromUTF8 (errMsg), 647 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 648 + this); 649 + sqlite3_free (errMsg); 650 + sqlError = true; 651 + goto clean_up; 652 + } 653 + rows++; 654 + free (hexWKB); 655 + hexWKB = NULL; 656 + free (bufSQL); 657 + bufSQL = NULL; 658 + } 659 + clean_up: 660 + if (hexWKB) 661 + free (hexWKB); 662 + if (bufSQL) 663 + free (bufSQL); 664 + gaiaFreeShapefile (shp); 665 + if (col_name) 666 + { 667 + // releasing memory allocation for column names 668 + for (cnt = 0; cnt < col_cnt; cnt++) 669 + free (*(col_name + cnt)); 670 + free (col_name); 671 + } 672 + if (sqlError == true) 673 + { 674 + // some error occurred - ROLLBACK 675 + ret = sqlite3_exec (SqliteHandle, "ROLLBACK", NULL, 0, &errMsg); 676 + if (ret != SQLITE_OK) 677 + { 678 + wxMessageBox (wxT ("load shapefile error:") + 679 + wxString::FromUTF8 (errMsg), 680 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 681 + this); 682 + sqlite3_free (errMsg); 683 + } 684 + ::wxEndBusyCursor (); 685 + msg.Printf (wxT 686 + ("Shapefile not loaded\n\n\na ROLLBACK was automatically performed")); 687 + wxMessageBox (msg, wxT ("spatialite-gui"), wxOK | wxICON_WARNING, 688 + this); 689 + } 690 + else 691 + { 692 + // ok - confirming pending transaction - COMMIT 693 + ret = sqlite3_exec (SqliteHandle, "COMMIT", NULL, 0, &errMsg); 694 + if (ret != SQLITE_OK) 695 + { 696 + wxMessageBox (wxT ("load shapefile error:") + 697 + wxString::FromUTF8 (errMsg), 698 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 699 + this); 700 + sqlite3_free (errMsg); 701 + return; 702 + } 703 + ::wxEndBusyCursor (); 704 + msg.Printf (wxT ("Shapefile loaded\n\n%d inserted rows"), rows); 705 + wxMessageBox (msg, wxT ("spatialite-gui"), 706 + wxOK | wxICON_INFORMATION, this); 707 + ClearTableTree (); 708 + InitTableTree (); 709 + } 671 710 } 672 711 673 -gaiaDbfFieldPtr MyFrame::GetDbfField(gaiaDbfListPtr list, char *name) 712 +gaiaDbfFieldPtr MyFrame::GetDbfField (gaiaDbfListPtr list, char *name) 674 713 { 675 714 // 676 715 // find a DBF attribute by name 677 716 // 678 - gaiaDbfFieldPtr fld = list->First; 679 - while (fld) 680 - { 681 - if (strcasecmp(fld->Name, name) == 0) 682 - return fld; 683 - fld = fld->Next; 684 - } 685 - return NULL; 717 + gaiaDbfFieldPtr 718 + fld = list->First; 719 + while (fld) 720 + { 721 + if (strcasecmp (fld->Name, name) == 0) 722 + return fld; 723 + fld = fld->Next; 724 + } 725 + return NULL; 686 726 } 687 727 688 -void MyFrame::DumpShapefile(wxString & path, wxString & table, 689 - wxString & column, wxString & charset) 728 +void 729 +MyFrame::DumpShapefile (wxString & path, wxString & table, wxString & column, 730 + wxString & charset) 690 731 { 691 732 // 692 733 // dumping a geometry table as Shapefile 693 734 // 694 - char **results; 695 - int rows; 696 - int columns; 697 - int i; 698 - char *errMsg = NULL; 699 - char *gtype; 700 - wxString geometryType; 701 - int shape = -1; 702 - char xtable[1024]; 703 - char xcolumn[1024]; 704 - char xpath[1024]; 705 - char xsql[4096]; 706 - sqlite3_stmt *stmt; 707 - int row1 = 0; 708 - int n_cols = 0; 709 - int offset = 0; 710 - int type; 711 - int multiple_entities = 0; 712 - const unsigned char *char_value; 713 - const void *blob_value; 714 - gaiaShapefilePtr shp = NULL; 715 - gaiaDbfListPtr dbf_export_list = NULL; 716 - gaiaDbfListPtr dbf_list = NULL; 717 - gaiaDbfListPtr dbf_write; 718 - gaiaDbfFieldPtr dbf_field; 719 - gaiaGeomCollPtr geom; 720 - int *max_length = NULL; 721 - int *sql_type = NULL; 722 - char dummy[1024]; 723 - int len; 724 - wxString msg; 725 - wxString sql = 726 - wxT("SELECT type FROM geometry_columns WHERE f_table_name = '"); 727 - sql += table; 728 - sql += wxT("' AND f_geometry_column = '"); 729 - sql += column; 730 - sql += wxT("'"); 731 - int ret = sqlite3_get_table(SqliteHandle, sql.ToUTF8(), &results, 732 - &rows, &columns, &errMsg); 733 - if (ret != SQLITE_OK) 734 - { 735 - wxMessageBox(wxT("dump shapefile error:") + wxString::FromUTF8(errMsg), 736 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 737 - sqlite3_free(errMsg); 738 - return; 739 - } 740 - if (rows < 1) 741 - ; 742 - else 743 - { 744 - for (i = 1; i <= rows; i++) 745 - { 746 - gtype = results[(i * columns) + 0]; 747 - geometryType = wxString::FromUTF8(gtype); 748 - } 749 - } 750 - sqlite3_free_table(results); 751 - if (geometryType == wxT("POINT")) 752 - shape = GAIA_POINT; 753 - if (geometryType == wxT("MULTIPOINT")) 754 - shape = GAIA_MULTIPOINT; 755 - if (geometryType == wxT("LINESTRING") 756 - || geometryType == wxT("MULTILINESTRING")) 757 - shape = GAIA_LINESTRING; 758 - if (geometryType == wxT("POLYGON") || geometryType == wxT("MULTIPOLYGON")) 759 - shape = GAIA_POLYGON; 760 - if (shape < 0) 761 - { 762 - wxMessageBox(wxT("Unable to detect GeometryType for '") + 763 - table + wxT(".") + column + wxT("'"), wxT("spatialite-gui"), 764 - wxOK | wxICON_ERROR, this); 765 - return; 766 - } 735 + char **results; 736 + int rows; 737 + int columns; 738 + int i; 739 + char *errMsg = NULL; 740 + char *gtype; 741 + wxString geometryType; 742 + int shape = -1; 743 + char xtable[1024]; 744 + char xcolumn[1024]; 745 + char xpath[1024]; 746 + char xsql[4096]; 747 + sqlite3_stmt *stmt; 748 + int row1 = 0; 749 + int n_cols = 0; 750 + int offset = 0; 751 + int type; 752 + int multiple_entities = 0; 753 + const unsigned char *char_value; 754 + const void *blob_value; 755 + gaiaShapefilePtr shp = NULL; 756 + gaiaDbfListPtr dbf_export_list = NULL; 757 + gaiaDbfListPtr dbf_list = NULL; 758 + gaiaDbfListPtr dbf_write; 759 + gaiaDbfFieldPtr dbf_field; 760 + gaiaGeomCollPtr geom; 761 + int *max_length = NULL; 762 + int *sql_type = NULL; 763 + char dummy[1024]; 764 + int len; 765 + wxString msg; 766 + wxString sql = 767 + wxT ("SELECT type FROM geometry_columns WHERE f_table_name = '"); 768 + sql += table; 769 + sql += wxT ("' AND f_geometry_column = '"); 770 + sql += column; 771 + sql += wxT ("'"); 772 + int ret = sqlite3_get_table (SqliteHandle, sql.ToUTF8 (), &results, 773 + &rows, &columns, &errMsg); 774 + if (ret != SQLITE_OK) 775 + { 776 + wxMessageBox (wxT ("dump shapefile error:") + 777 + wxString::FromUTF8 (errMsg), wxT ("spatialite-gui"), 778 + wxOK | wxICON_ERROR, this); 779 + sqlite3_free (errMsg); 780 + return; 781 + } 782 + if (rows < 1) 783 + ; 784 + else 785 + { 786 + for (i = 1; i <= rows; i++) 787 + { 788 + gtype = results[(i * columns) + 0]; 789 + geometryType = wxString::FromUTF8 (gtype); 790 + } 791 + } 792 + sqlite3_free_table (results); 793 + if (geometryType == wxT ("POINT")) 794 + shape = GAIA_POINT; 795 + if (geometryType == wxT ("MULTIPOINT")) 796 + shape = GAIA_MULTIPOINT; 797 + if (geometryType == wxT ("LINESTRING") 798 + || geometryType == wxT ("MULTILINESTRING")) 799 + shape = GAIA_LINESTRING; 800 + if (geometryType == wxT ("POLYGON") || geometryType == wxT ("MULTIPOLYGON")) 801 + shape = GAIA_POLYGON; 802 + if (shape < 0) 803 + { 804 + wxMessageBox (wxT ("Unable to detect GeometryType for '") + 805 + table + wxT (".") + column + wxT ("'"), 806 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, this); 807 + return; 808 + } 767 809 // 768 810 // preparing SQL statement 769 811 // 770 - strcpy(xtable, table.ToUTF8()); 771 - strcpy(xcolumn, column.ToUTF8()); 772 - sprintf(xsql, "SELECT * FROM \"%s\" WHERE GeometryType(\"%s\") = ", xtable, 773 - xcolumn); 774 - if (shape == GAIA_LINESTRING) 775 - { 776 - strcat(xsql, "'LINESTRING' OR GeometryType(\""); 777 - strcat(xsql, xcolumn); 778 - strcat(xsql, "\") = 'MULTILINESTRING'"); 779 - } else if (shape == GAIA_POLYGON) 780 - { 781 - strcat(xsql, "'POLYGON' OR GeometryType(\""); 782 - strcat(xsql, xcolumn); 783 - strcat(xsql, "\") = 'MULTIPOLYGON'"); 784 - } else if (shape == GAIA_MULTIPOINT) 785 - { 786 - strcat(xsql, "'POINT' OR GeometryType(\""); 787 - strcat(xsql, xcolumn); 788 - strcat(xsql, "\") = 'MULTIPOINT'"); 789 - } else 790 - strcat(xsql, "'POINT'"); 791 -// fetching anyway NULL Geometries 792 - strcat(xsql, " OR \""); 793 - strcat(xsql, xcolumn); 794 - strcat(xsql, "\" IS NULL"); 812 + strcpy (xtable, table.ToUTF8 ()); 813 + strcpy (xcolumn, column.ToUTF8 ()); 814 + sprintf (xsql, "SELECT * FROM %s WHERE GeometryType(%s) = ", xtable, 815 + xcolumn); 816 + if (shape == GAIA_LINESTRING) 817 + { 818 + strcat (xsql, "'LINESTRING' OR GeometryType("); 819 + strcat (xsql, xcolumn); 820 + strcat (xsql, ") = 'MULTILINESTRING'"); 821 + } 822 + else if (shape == GAIA_POLYGON) 823 + { 824 + strcat (xsql, "'POLYGON' OR GeometryType("); 825 + strcat (xsql, xcolumn); 826 + strcat (xsql, ") = 'MULTIPOLYGON'"); 827 + } 828 + else if (shape == GAIA_MULTIPOINT) 829 + { 830 + strcat (xsql, "'POINT' OR GeometryType("); 831 + strcat (xsql, xcolumn); 832 + strcat (xsql, ") = 'MULTIPOINT'"); 833 + } 834 + else 835 + strcat (xsql, "'POINT'"); 795 836 // 796 837 // compiling SQL prepared statement 797 838 // 798 - ret = sqlite3_prepare_v2(SqliteHandle, xsql, strlen(xsql), &stmt, NULL); 799 - if (ret != SQLITE_OK) 800 - goto sql_error; 801 - rows = 0; 802 - while (1) 803 - { 804 - // 805 - // Pass I - scrolling the result set to compute real DBF attributes' sizes and types 806 - // 807 - ret = sqlite3_step(stmt); 808 - if (ret == SQLITE_DONE) 809 - break; // end of result set 810 - if (ret == SQLITE_ROW) 811 - { 812 - // processing a result set row 813 - row1++; 814 - if (n_cols == 0) 815 - { 816 - // this one is the first row, so we are going to prepare the DBF Fields list 817 - n_cols = sqlite3_column_count(stmt); 818 - dbf_export_list = gaiaAllocDbfList(); 819 - max_length = (int *) malloc(sizeof(int) * n_cols); 820 - sql_type = (int *) malloc(sizeof(int) * n_cols); 821 - for (i = 0; i < n_cols; i++) 822 - { 823 - // initializes the DBF export fields 824 - strcpy(dummy, sqlite3_column_name(stmt, i)); 825 - gaiaAddDbfField(dbf_export_list, dummy, '\0', 0, 0, 0); 826 - max_length[i] = 0; 827 - sql_type[i] = SQLITE_NULL; 828 - } 829 - } 830 - for (i = 0; i < n_cols; i++) 831 - { 832 - // update the DBF export fields analyzing fetched data 833 - type = sqlite3_column_type(stmt, i); 834 - if (type == SQLITE_BLOB && strcasecmp((char *) xcolumn, 835 - (char *) 836 - sqlite3_column_name(stmt, 837 - i)) == 0 838 - && shape == GAIA_POINT) 839 - { 840 - // 841 - // we need to check if there is any MULTIPOINT, 842 - // because shapefile handles simple-points shapes and multi-points shapes 843 - // in a complete differet way 844 - // 845 - blob_value = sqlite3_column_blob(stmt, i); 846 - len = sqlite3_column_bytes(stmt, i); 847 - geom = 848 - gaiaFromSpatiaLiteBlobWkb((unsigned char *) blob_value, 849 - len); 850 - if (geom) 851 - { 852 - if (geom->FirstPoint != geom->LastPoint) 853 - multiple_entities = 1; 854 - gaiaFreeGeomColl(geom); 855 - } 856 - } 857 - if (type == SQLITE_NULL || type == SQLITE_BLOB) 858 - continue; 859 - if (type == SQLITE_TEXT) 860 - { 861 - char_value = sqlite3_column_text(stmt, i); 862 - len = sqlite3_column_bytes(stmt, i); 863 - sql_type[i] = SQLITE_TEXT; 864 - if (len > max_length[i]) 865 - max_length[i] = len; 866 - } else if (type == SQLITE_FLOAT && sql_type[i] != SQLITE_TEXT) 867 - sql_type[i] = SQLITE_FLOAT; // promoting a numeric column to be DOUBLE 868 - else if (type == SQLITE_INTEGER 869 - && (sql_type[i] == SQLITE_NULL 870 - || sql_type[i] == SQLITE_INTEGER)) 871 - sql_type[i] = SQLITE_INTEGER; // promoting a null column to be INTEGER 872 - } 873 - } else 874 - goto sql_error; 875 - } 876 - if (!row1) 877 - goto empty_result_set; 878 - i = 0; 879 - offset = 0; 880 - dbf_list = gaiaAllocDbfList(); 881 - dbf_field = dbf_export_list->First; 882 - while (dbf_field) 883 - { 884 - // preparing the final DBF attribute list 885 - if (sql_type[i] == SQLITE_NULL) 886 - { 887 - i++; 888 - dbf_field = dbf_field->Next; 889 - continue; 890 - } 891 - if (sql_type[i] == SQLITE_TEXT) 892 - { 893 - gaiaAddDbfField(dbf_list, dbf_field->Name, 'C', offset, max_length[i], 894 - 0); 895 - offset += max_length[i]; 896 - } 897 - if (sql_type[i] == SQLITE_FLOAT) 898 - { 899 - gaiaAddDbfField(dbf_list, dbf_field->Name, 'N', offset, 24, 6); 900 - offset += 24; 901 - } 902 - if (sql_type[i] == SQLITE_INTEGER) 903 - { 904 - gaiaAddDbfField(dbf_list, dbf_field->Name, 'N', offset, 18, 0); 905 - offset += 18; 906 - } 907 - i++; 908 - dbf_field = dbf_field->Next; 909 - } 910 - free(max_length); 911 - free(sql_type); 912 - gaiaFreeDbfList(dbf_export_list); 839 + ret = sqlite3_prepare_v2 (SqliteHandle, xsql, strlen (xsql), &stmt, NULL); 840 + if (ret != SQLITE_OK) 841 + goto sql_error; 842 + rows = 0; 843 + while (1) 844 + { 845 + // 846 + // Pass I - scrolling the result set to compute real DBF attributes' sizes and types 847 + // 848 + ret = sqlite3_step (stmt); 849 + if (ret == SQLITE_DONE) 850 + break; // end of result set 851 + if (ret == SQLITE_ROW) 852 + { 853 + // processing a result set row 854 + row1++; 855 + if (n_cols == 0) 856 + { 857 + // this one is the first row, so we are going to prepare the DBF Fields list 858 + n_cols = sqlite3_column_count (stmt); 859 + dbf_export_list = gaiaAllocDbfList (); 860 + max_length = (int *) malloc (sizeof (int) * n_cols); 861 + sql_type = (int *) malloc (sizeof (int) * n_cols); 862 + for (i = 0; i < n_cols; i++) 863 + { 864 + // initializes the DBF export fields 865 + strcpy (dummy, sqlite3_column_name (stmt, i)); 866 + gaiaAddDbfField (dbf_export_list, dummy, '\0', 0, 867 + 0, 0); 868 + max_length[i] = 0; 869 + sql_type[i] = SQLITE_NULL; 870 + } 871 + } 872 + for (i = 0; i < n_cols; i++) 873 + { 874 + // update the DBF export fields analyzing fetched data 875 + type = sqlite3_column_type (stmt, i); 876 + if (type == SQLITE_BLOB && strcasecmp ((char *) xcolumn, 877 + (char *) 878 + sqlite3_column_name 879 + (stmt, i)) == 0 880 + && shape == GAIA_POINT) 881 + { 882 + // 883 + // we need to check if there is any MULTIPOINT, 884 + // because shapefile handles simple-points shapes and multi-points shapes 885 + // in a complete differet way 886 + // 887 + blob_value = sqlite3_column_blob (stmt, i); 888 + len = sqlite3_column_bytes (stmt, i); 889 + geom = 890 + gaiaFromSpatiaLiteBlobWkb ((unsigned char *) 891 + blob_value, len); 892 + if (geom) 893 + { 894 + if (geom->FirstPoint != geom->LastPoint) 895 + multiple_entities = 1; 896 + gaiaFreeGeomColl (geom); 897 + } 898 + } 899 + if (type == SQLITE_NULL || type == SQLITE_BLOB) 900 + continue; 901 + if (type == SQLITE_TEXT) 902 + { 903 + char_value = sqlite3_column_text (stmt, i); 904 + len = sqlite3_column_bytes (stmt, i); 905 + sql_type[i] = SQLITE_TEXT; 906 + if (len > max_length[i]) 907 + max_length[i] = len; 908 + } 909 + else if (type == SQLITE_FLOAT 910 + && sql_type[i] != SQLITE_TEXT) 911 + sql_type[i] = SQLITE_FLOAT; // promoting a numeric column to be DOUBLE 912 + else if (type == SQLITE_INTEGER 913 + && (sql_type[i] == SQLITE_NULL 914 + || sql_type[i] == SQLITE_INTEGER)) 915 + sql_type[i] = SQLITE_INTEGER; // promoting a null column to be INTEGER 916 + } 917 + } 918 + else 919 + goto sql_error; 920 + } 921 + if (!row1) 922 + goto empty_result_set; 923 + i = 0; 924 + offset = 0; 925 + dbf_list = gaiaAllocDbfList (); 926 + dbf_field = dbf_export_list->First; 927 + while (dbf_field) 928 + { 929 + // preparing the final DBF attribute list 930 + if (sql_type[i] == SQLITE_NULL) 931 + { 932 + i++; 933 + dbf_field = dbf_field->Next; 934 + continue; 935 + } 936 + if (sql_type[i] == SQLITE_TEXT) 937 + { 938 + gaiaAddDbfField (dbf_list, dbf_field->Name, 'C', offset, 939 + max_length[i], 0); 940 + offset += max_length[i]; 941 + } 942 + if (sql_type[i] == SQLITE_FLOAT) 943 + { 944 + gaiaAddDbfField (dbf_list, dbf_field->Name, 'N', offset, 24, 6); 945 + offset += 24; 946 + } 947 + if (sql_type[i] == SQLITE_INTEGER) 948 + { 949 + gaiaAddDbfField (dbf_list, dbf_field->Name, 'N', offset, 9, 0); 950 + offset += 9; 951 + } 952 + i++; 953 + dbf_field = dbf_field->Next; 954 + } 955 + free (max_length); 956 + free (sql_type); 957 + gaiaFreeDbfList (dbf_export_list); 913 958 // resetting SQLite query 914 - ret = sqlite3_reset(stmt); 915 - if (ret != SQLITE_OK) 916 - goto sql_error; 959 + ret = sqlite3_reset (stmt); 960 + if (ret != SQLITE_OK) 961 + goto sql_error; 917 962 // trying to open shapefile files 918 - shp = gaiaAllocShapefile(); 919 - strcpy(xpath, path.ToUTF8()); 920 - gaiaOpenShpWrite(shp, xpath, shape, dbf_list, "UTF-8", charset.ToUTF8()); 921 - if (!(shp->Valid)) 922 - goto no_file; 923 - while (1) 924 - { 925 - // Pass II - scrolling the result set to dump data into shapefile 926 - ret = sqlite3_step(stmt); 927 - if (ret == SQLITE_DONE) 928 - break; // end of result set 929 - if (ret == SQLITE_ROW) 930 - { 931 - rows++; 932 - geom = NULL; 933 - dbf_write = gaiaCloneDbfEntity(dbf_list); 934 - for (i = 0; i < n_cols; i++) 935 - { 936 - if (strcasecmp 937 - ((char *) xcolumn, 938 - (char *) sqlite3_column_name(stmt, i)) == 0) 939 - { 940 - // this one is the internal BLOB encoded GEOMETRY to be exported 941 - if (sqlite3_column_type(stmt, i) != SQLITE_BLOB) 942 - { 943 - // this one is a NULL Geometry 944 - dbf_write->Geometry = NULL; 945 - } else 946 - { 947 - blob_value = sqlite3_column_blob(stmt, i); 948 - len = sqlite3_column_bytes(stmt, i); 949 - dbf_write->Geometry = 950 - gaiaFromSpatiaLiteBlobWkb((unsigned char *) blob_value, 951 - len); 952 - } 953 - } 954 - strcpy(dummy, sqlite3_column_name(stmt, i)); 955 - dbf_field = GetDbfField(dbf_write, dummy); 956 - if (!dbf_field) 957 - continue; 958 - if (sqlite3_column_type(stmt, i) == SQLITE_NULL) 959 - { 960 - // handling NULL values 961 - gaiaSetNullValue(dbf_field); 962 - } else 963 - { 964 - switch (dbf_field->Type) 965 - { 966 - case 'N': 967 - if (sqlite3_column_type(stmt, i) == SQLITE_INTEGER) 968 - gaiaSetIntValue(dbf_field, 969 - sqlite3_column_int64(stmt, i)); 970 - else if (sqlite3_column_type(stmt, i) == SQLITE_FLOAT) 971 - gaiaSetDoubleValue(dbf_field, 972 - sqlite3_column_double(stmt, i)); 973 - else 974 - gaiaSetNullValue(dbf_field); 975 - break; 976 - case 'C': 977 - if (sqlite3_column_type(stmt, i) == SQLITE_TEXT) 978 - { 979 - strcpy(dummy, 980 - (char *) sqlite3_column_text(stmt, i)); 981 - gaiaSetStrValue(dbf_field, dummy); 982 - } else 983 - gaiaSetNullValue(dbf_field); 984 - break; 985 - }; 986 - } 987 - } 988 - if (!gaiaWriteShpEntity(shp, dbf_write)) 989 - { 990 - wxMessageBox(wxT("Shapefile write error"), wxT("spatialite-gui"), 991 - wxOK | wxICON_INFORMATION, this); 992 - } 993 - gaiaFreeDbfList(dbf_write); 994 - } else 995 - goto sql_error; 996 - } 997 - sqlite3_finalize(stmt); 998 - gaiaFlushShpHeaders(shp); 999 - gaiaFreeShapefile(shp); 1000 - sprintf(dummy, "Exported %d rows into Shapefile", rows); 1001 - msg = wxString::FromUTF8(dummy); 1002 - wxMessageBox(msg, wxT("spatialite-gui"), wxOK | wxICON_INFORMATION, this); 1003 - return; 1004 -sql_error: 963 + shp = gaiaAllocShapefile (); 964 + strcpy (xpath, path.ToUTF8 ()); 965 + gaiaOpenShpWrite (shp, xpath, shape, dbf_list, "UTF-8", charset.ToUTF8 ()); 966 + if (!(shp->Valid)) 967 + goto no_file; 968 + while (1) 969 + { 970 + // Pass II - scrolling the result set to dump data into shapefile 971 + ret = sqlite3_step (stmt); 972 + if (ret == SQLITE_DONE) 973 + break; // end of result set 974 + if (ret == SQLITE_ROW) 975 + { 976 + rows++; 977 + geom = NULL; 978 + dbf_write = gaiaCloneDbfEntity (dbf_list); 979 + for (i = 0; i < n_cols; i++) 980 + { 981 + if (strcasecmp 982 + ((char *) xcolumn, 983 + (char *) sqlite3_column_name (stmt, i)) == 0) 984 + { 985 + // this one is the internal BLOB encoded GEOMETRY to be exported 986 + blob_value = sqlite3_column_blob (stmt, i); 987 + len = sqlite3_column_bytes (stmt, i); 988 + dbf_write->Geometry = 989 + gaiaFromSpatiaLiteBlobWkb ((unsigned char *) 990 + blob_value, len); 991 + } 992 + strcpy (dummy, sqlite3_column_name (stmt, i)); 993 + dbf_field = GetDbfField (dbf_write, dummy); 994 + if (!dbf_field) 995 + continue; 996 + switch (dbf_field->Type) 997 + { 998 + case 'N': 999 + if (sqlite3_column_type (stmt, i) == SQLITE_INTEGER) 1000 + gaiaSetIntValue (dbf_field, 1001 + sqlite3_column_int (stmt, i)); 1002 + else if (sqlite3_column_type (stmt, i) == 1003 + SQLITE_FLOAT) 1004 + gaiaSetDoubleValue (dbf_field, 1005 + sqlite3_column_double 1006 + (stmt, i)); 1007 + else 1008 + gaiaSetNullValue (dbf_field); 1009 + break; 1010 + case 'C': 1011 + if (sqlite3_column_type (stmt, i) == SQLITE_TEXT) 1012 + { 1013 + strcpy (dummy, 1014 + (char *) sqlite3_column_text (stmt, 1015 + i)); 1016 + gaiaSetStrValue (dbf_field, dummy); 1017 + } 1018 + else 1019 + gaiaSetNullValue (dbf_field); 1020 + break; 1021 + }; 1022 + } 1023 + if (!(dbf_write->Geometry)) 1024 + { 1025 + gaiaFreeDbfList (dbf_write); 1026 + continue; 1027 + } 1028 + if (!gaiaWriteShpEntity (shp, dbf_write)) 1029 + { 1030 + wxMessageBox (wxT ("Shapefile write error"), 1031 + wxT ("spatialite-gui"), 1032 + wxOK | wxICON_INFORMATION, this); 1033 + } 1034 + gaiaFreeDbfList (dbf_write); 1035 + } 1036 + else 1037 + goto sql_error; 1038 + } 1039 + sqlite3_finalize (stmt); 1040 + gaiaFlushShpHeaders (shp); 1041 + gaiaFreeShapefile (shp); 1042 + msg.Printf (wxT ("Exported %d rows into Shapefile"), rows); 1043 + wxMessageBox (msg, wxT ("spatialite-gui"), wxOK | wxICON_INFORMATION, this); 1044 + return; 1045 + sql_error: 1005 1046 // 1006 1047 // some SQL error occurred 1007 1048 // 1008 - sqlite3_finalize(stmt); 1009 - if (dbf_export_list); 1010 - gaiaFreeDbfList(dbf_export_list); 1011 - if (dbf_list); 1012 - gaiaFreeDbfList(dbf_list); 1013 - if (shp) 1014 - gaiaFreeShapefile(shp); 1015 - wxMessageBox(wxT("dump shapefile error:") + 1016 - wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)), 1017 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1018 - return; 1019 -no_file: 1049 + sqlite3_finalize (stmt); 1050 + if (dbf_export_list); 1051 + gaiaFreeDbfList (dbf_export_list); 1052 + if (dbf_list); 1053 + gaiaFreeDbfList (dbf_list); 1054 + if (shp) 1055 + gaiaFreeShapefile (shp); 1056 + wxMessageBox (wxT ("dump shapefile error:") + 1057 + wxString::FromUTF8 (sqlite3_errmsg (SqliteHandle)), 1058 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, this); 1059 + return; 1060 + no_file: 1020 1061 // 1021 1062 // shapefile can't be created/opened 1022 1063 // 1023 - if (dbf_export_list); 1024 - gaiaFreeDbfList(dbf_export_list); 1025 - if (dbf_list); 1026 - gaiaFreeDbfList(dbf_list); 1027 - if (shp) 1028 - gaiaFreeShapefile(shp); 1029 - wxMessageBox(wxT("ERROR: unable to open '") + path + wxT("' for writing"), 1030 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1031 - return; 1032 -empty_result_set: 1064 + if (dbf_export_list); 1065 + gaiaFreeDbfList (dbf_export_list); 1066 + if (dbf_list); 1067 + gaiaFreeDbfList (dbf_list); 1068 + if (shp) 1069 + gaiaFreeShapefile (shp); 1070 + wxMessageBox (wxT ("ERROR: unable to open '") + path + 1071 + wxT ("' for writing"), wxT ("spatialite-gui"), 1072 + wxOK | wxICON_ERROR, this); 1073 + return; 1074 + empty_result_set: 1033 1075 // 1034 1076 // the result set is empty - nothing to do 1035 1077 // 1036 - sqlite3_finalize(stmt); 1037 - if (dbf_export_list); 1038 - gaiaFreeDbfList(dbf_export_list); 1039 - if (dbf_list); 1040 - gaiaFreeDbfList(dbf_list); 1041 - if (shp) 1042 - gaiaFreeShapefile(shp); 1043 - wxMessageBox(wxT 1044 - ("The SQL SELECT returned an empty result set\n... there is nothing to export ..."), 1045 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 1078 + sqlite3_finalize (stmt); 1079 + if (dbf_export_list); 1080 + gaiaFreeDbfList (dbf_export_list); 1081 + if (dbf_list); 1082 + gaiaFreeDbfList (dbf_list); 1083 + if (shp) 1084 + gaiaFreeShapefile (shp); 1085 + wxMessageBox (wxT 1086 + ("The SQL SELECT returned an empty result set\n... there is nothing to export ..."), 1087 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 1046 1088 } 1047 1089 1048 -void MyFrame::DumpTxtTab(wxString & path, wxString & table, wxString & charset) 1090 +void 1091 +MyFrame::DumpTxtTab (wxString & path, wxString & table, wxString & charset) 1049 1092 { 1050 1093 // 1051 1094 // dumping a table as Txt/Tab 1052 1095 // 1053 - wxString sql; 1054 - sqlite3_stmt *stmt; 1055 - int ret; 1056 - int rows = 0; 1057 - int i; 1058 - int n_cols; 1059 - char xpath[1024]; 1060 - char dummy[65536]; 1061 - char outCs[128]; 1062 - char *pDummy; 1063 - wxString msg; 1064 - strcpy(outCs, charset.ToUTF8()); 1065 - strcpy(xpath, path.ToUTF8()); 1066 - FILE *out = fopen(xpath, "w"); 1067 - if (!out) 1068 - goto no_file; 1096 + wxString sql; 1097 + sqlite3_stmt *stmt; 1098 + int ret; 1099 + int rows = 0; 1100 + int i; 1101 + int n_cols; 1102 + char xpath[1024]; 1103 + char dummy[65536]; 1104 + char outCs[128]; 1105 + char *pDummy; 1106 + wxString msg; 1107 + strcpy (outCs, charset.ToUTF8 ()); 1108 + strcpy (xpath, path.ToUTF8 ()); 1109 + FILE *out = fopen (xpath, "w"); 1110 + if (!out) 1111 + goto no_file; 1069 1112 // 1070 1113 // preparing SQL statement 1071 1114 // 1072 - sql = wxT("SELECT * FROM \""); 1073 - sql += table; 1074 - sql += wxT("\""); 1115 + sql = wxT ("SELECT * FROM "); 1116 + sql += table; 1075 1117 // 1076 1118 // compiling SQL prepared statement 1077 1119 // 1078 - ret = sqlite3_prepare_v2(SqliteHandle, sql.ToUTF8(), sql.Len(), &stmt, NULL); 1079 - if (ret != SQLITE_OK) 1080 - goto sql_error; 1081 - rows = 0; 1082 - while (1) 1083 - { 1084 - ret = sqlite3_step(stmt); 1085 - if (ret == SQLITE_DONE) 1086 - break; // end of result set 1087 - if (ret == SQLITE_ROW) 1088 - { 1089 - n_cols = sqlite3_column_count(stmt); 1090 - if (rows == 0) 1091 - { 1092 - // outputting the column titles 1093 - for (i = 0; i < n_cols; i++) 1094 - { 1095 - if (i == 0) 1096 - fprintf(out, "%s", sqlite3_column_name(stmt, i)); 1097 - else 1098 - fprintf(out, "\t%s", sqlite3_column_name(stmt, i)); 1099 - } 1100 - fprintf(out, "\n"); 1101 - } 1102 - rows++; 1103 - for (i = 0; i < n_cols; i++) 1104 - { 1105 - if (i > 0) 1106 - fprintf(out, "\t"); 1107 - if (sqlite3_column_type(stmt, i) == SQLITE_INTEGER) 1108 - fprintf(out, "%d", sqlite3_column_int(stmt, i)); 1109 - else if (sqlite3_column_type(stmt, i) == SQLITE_FLOAT) 1110 - fprintf(out, "%1.6lf", sqlite3_column_double(stmt, i)); 1111 - else if (sqlite3_column_type(stmt, i) == SQLITE_TEXT) 1112 - { 1113 - strcpy(dummy, (char *) sqlite3_column_text(stmt, i)); 1114 - CleanTxtTab(dummy); 1115 - pDummy = dummy; 1116 - if (!gaiaConvertCharset(&pDummy, "UTF-8", outCs)) 1117 - goto encoding_error; 1118 - fprintf(out, "%s", dummy); 1119 - } 1120 - } 1121 - fprintf(out, "\n"); 1122 - } else 1123 - goto sql_error; 1124 - } 1125 - sqlite3_finalize(stmt); 1126 - fclose(out); 1127 - sprintf(dummy, "Exported %d rows into Txt/Tab file", rows); 1128 - msg = wxString::FromUTF8(dummy); 1129 - wxMessageBox(msg, wxT("spatialite-gui"), wxOK | wxICON_INFORMATION, this); 1130 - return; 1131 -sql_error: 1120 + ret = 1121 + sqlite3_prepare_v2 (SqliteHandle, sql.ToUTF8 (), sql.Len (), &stmt, 1122 + NULL); 1123 + if (ret != SQLITE_OK) 1124 + goto sql_error; 1125 + rows = 0; 1126 + while (1) 1127 + { 1128 + ret = sqlite3_step (stmt); 1129 + if (ret == SQLITE_DONE) 1130 + break; // end of result set 1131 + if (ret == SQLITE_ROW) 1132 + { 1133 + n_cols = sqlite3_column_count (stmt); 1134 + if (rows == 0) 1135 + { 1136 + // outputting the column titles 1137 + for (i = 0; i < n_cols; i++) 1138 + { 1139 + if (i == 0) 1140 + fprintf (out, "%s", 1141 + sqlite3_column_name (stmt, i)); 1142 + else 1143 + fprintf (out, "\t%s", 1144 + sqlite3_column_name (stmt, i)); 1145 + } 1146 + fprintf (out, "\n"); 1147 + } 1148 + rows++; 1149 + for (i = 0; i < n_cols; i++) 1150 + { 1151 + if (i > 0) 1152 + fprintf (out, "\t"); 1153 + if (sqlite3_column_type (stmt, i) == SQLITE_INTEGER) 1154 + fprintf (out, "%d", sqlite3_column_int (stmt, i)); 1155 + else if (sqlite3_column_type (stmt, i) == SQLITE_FLOAT) 1156 + fprintf (out, "%1.6lf", 1157 + sqlite3_column_double (stmt, i)); 1158 + else if (sqlite3_column_type (stmt, i) == SQLITE_TEXT) 1159 + { 1160 + strcpy (dummy, 1161 + (char *) sqlite3_column_text (stmt, i)); 1162 + CleanTxtTab (dummy); 1163 + pDummy = dummy; 1164 + if (!gaiaConvertCharset (&pDummy, "UTF-8", outCs)) 1165 + goto encoding_error; 1166 + fprintf (out, "%s", dummy); 1167 + } 1168 + } 1169 + fprintf (out, "\n"); 1170 + } 1171 + else 1172 + goto sql_error; 1173 + } 1174 + sqlite3_finalize (stmt); 1175 + fclose (out); 1176 + msg.Printf (wxT ("Exported %d rows into Txt/Tab file"), rows); 1177 + wxMessageBox (msg, wxT ("spatialite-gui"), wxOK | wxICON_INFORMATION, this); 1178 + return; 1179 + sql_error: 1132 1180 // 1133 1181 // some SQL error occurred 1134 1182 // 1135 - sqlite3_finalize(stmt); 1136 - wxMessageBox(wxT("dump Txt/Tab error:") + 1137 - wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)), 1138 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1139 - if (out) 1140 - fclose(out); 1141 - return; 1142 -encoding_error: 1183 + sqlite3_finalize (stmt); 1184 + wxMessageBox (wxT ("dump Txt/Tab error:") + 1185 + wxString::FromUTF8 (sqlite3_errmsg (SqliteHandle)), 1186 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, this); 1187 + if (out) 1188 + fclose (out); 1189 + return; 1190 + encoding_error: 1143 1191 // 1144 1192 // some CHARSET converion occurred 1145 1193 // 1146 - sqlite3_finalize(stmt); 1147 - wxMessageBox(wxT("dump Txt/Tab: charset conversion reported an error"), 1148 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1149 - if (out) 1150 - fclose(out); 1151 - return; 1152 -no_file: 1194 + sqlite3_finalize (stmt); 1195 + wxMessageBox (wxT ("dump Txt/Tab: charset conversion reported an error"), 1196 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, this); 1197 + if (out) 1198 + fclose (out); 1199 + return; 1200 + no_file: 1153 1201 // 1154 1202 // output file can't be created/opened 1155 1203 // 1156 - wxMessageBox(wxT("ERROR: unable to open '") + path + wxT("' for writing"), 1157 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1158 - return; 1204 + wxMessageBox (wxT ("ERROR: unable to open '") + path + 1205 + wxT ("' for writing"), wxT ("spatialite-gui"), 1206 + wxOK | wxICON_ERROR, this); 1207 + return; 1159 1208 } 1160 1209 1161 -void MyFrame::DumpCsv(wxString & path, wxString & table, wxString & charset) 1210 +void 1211 +MyFrame::DumpCsv (wxString & path, wxString & table, wxString & charset) 1162 1212 { 1163 1213 // 1164 1214 // dumping a table as CSV 1165 1215 // 1166 - wxString sql; 1167 - sqlite3_stmt *stmt; 1168 - int ret; 1169 - int rows = 0; 1170 - int i; 1171 - int n_cols; 1172 - char xpath[1024]; 1173 - char dummy[65536]; 1174 - char outCs[128]; 1175 - char *pDummy; 1176 - wxString msg; 1177 - strcpy(outCs, charset.ToUTF8()); 1178 - strcpy(xpath, path.ToUTF8()); 1179 - FILE *out = fopen(xpath, "w"); 1180 - if (!out) 1181 - goto no_file; 1216 + wxString sql; 1217 + sqlite3_stmt *stmt; 1218 + int ret; 1219 + int rows = 0; 1220 + int i; 1221 + int n_cols; 1222 + char xpath[1024]; 1223 + char dummy[65536]; 1224 + char outCs[128]; 1225 + char *pDummy; 1226 + wxString msg; 1227 + strcpy (outCs, charset.ToUTF8 ()); 1228 + strcpy (xpath, path.ToUTF8 ()); 1229 + FILE *out = fopen (xpath, "w"); 1230 + if (!out) 1231 + goto no_file; 1182 1232 // 1183 1233 // preparing SQL statement 1184 1234 // 1185 - sql = wxT("SELECT * FROM \""); 1186 - sql += table; 1187 - sql += wxT("\""); 1235 + sql = wxT ("SELECT * FROM "); 1236 + sql += table; 1188 1237 // 1189 1238 // compiling SQL prepared statement 1190 1239 // 1191 - ret = sqlite3_prepare_v2(SqliteHandle, sql.ToUTF8(), sql.Len(), &stmt, NULL); 1192 - if (ret != SQLITE_OK) 1193 - goto sql_error; 1194 - rows = 0; 1195 - while (1) 1196 - { 1197 - ret = sqlite3_step(stmt); 1198 - if (ret == SQLITE_DONE) 1199 - break; // end of result set 1200 - if (ret == SQLITE_ROW) 1201 - { 1202 - n_cols = sqlite3_column_count(stmt); 1203 - if (rows == 0) 1204 - { 1205 - // outputting the column titles 1206 - for (i = 0; i < n_cols; i++) 1207 - { 1208 - if (i == 0) 1209 - { 1210 - strcpy(dummy, sqlite3_column_name(stmt, i)); 1211 - CleanCsv(dummy); 1212 - fprintf(out, "%s", dummy); 1213 - } else 1214 - { 1215 - strcpy(dummy, sqlite3_column_name(stmt, i)); 1216 - CleanCsv(dummy); 1217 - fprintf(out, ",%s", dummy); 1218 - } 1219 - } 1220 - fprintf(out, "\n"); 1221 - } 1222 - rows++; 1223 - for (i = 0; i < n_cols; i++) 1224 - { 1225 - if (i > 0) 1226 - fprintf(out, ","); 1227 - if (sqlite3_column_type(stmt, i) == SQLITE_INTEGER) 1228 - fprintf(out, "%d", sqlite3_column_int(stmt, i)); 1229 - else if (sqlite3_column_type(stmt, i) == SQLITE_FLOAT) 1230 - fprintf(out, "%1.6lf", sqlite3_column_double(stmt, i)); 1231 - else if (sqlite3_column_type(stmt, i) == SQLITE_TEXT) 1232 - { 1233 - strcpy(dummy, (char *) sqlite3_column_text(stmt, i)); 1234 - CleanCsv(dummy); 1235 - pDummy = dummy; 1236 - if (!gaiaConvertCharset 1237 - (&pDummy, (const char *) "UTF-8", outCs)) 1238 - goto encoding_error; 1239 - fprintf(out, "%s", dummy); 1240 - } 1241 - } 1242 - fprintf(out, "\n"); 1243 - } else 1244 - goto sql_error; 1245 - } 1246 - sqlite3_finalize(stmt); 1247 - fclose(out); 1248 - sprintf(dummy, "Exported %d rows into CSV file", rows); 1249 - msg = wxString::FromUTF8(dummy); 1250 - wxMessageBox(msg, wxT("spatialite-gui"), wxOK | wxICON_INFORMATION, this); 1251 - return; 1252 -sql_error: 1240 + ret = 1241 + sqlite3_prepare_v2 (SqliteHandle, sql.ToUTF8 (), sql.Len (), &stmt, 1242 + NULL); 1243 + if (ret != SQLITE_OK) 1244 + goto sql_error; 1245 + rows = 0; 1246 + while (1) 1247 + { 1248 + ret = sqlite3_step (stmt); 1249 + if (ret == SQLITE_DONE) 1250 + break; // end of result set 1251 + if (ret == SQLITE_ROW) 1252 + { 1253 + n_cols = sqlite3_column_count (stmt); 1254 + if (rows == 0) 1255 + { 1256 + // outputting the column titles 1257 + for (i = 0; i < n_cols; i++) 1258 + { 1259 + if (i == 0) 1260 + { 1261 + strcpy (dummy, sqlite3_column_name (stmt, i)); 1262 + CleanCsv (dummy); 1263 + fprintf (out, "%s", dummy); 1264 + } 1265 + else 1266 + { 1267 + strcpy (dummy, sqlite3_column_name (stmt, i)); 1268 + CleanCsv (dummy); 1269 + fprintf (out, ",%s", dummy); 1270 + } 1271 + } 1272 + fprintf (out, "\n"); 1273 + } 1274 + rows++; 1275 + for (i = 0; i < n_cols; i++) 1276 + { 1277 + if (i > 0) 1278 + fprintf (out, ","); 1279 + if (sqlite3_column_type (stmt, i) == SQLITE_INTEGER) 1280 + fprintf (out, "%d", sqlite3_column_int (stmt, i)); 1281 + else if (sqlite3_column_type (stmt, i) == SQLITE_FLOAT) 1282 + fprintf (out, "%1.6lf", 1283 + sqlite3_column_double (stmt, i)); 1284 + else if (sqlite3_column_type (stmt, i) == SQLITE_TEXT) 1285 + { 1286 + strcpy (dummy, 1287 + (char *) sqlite3_column_text (stmt, i)); 1288 + CleanCsv (dummy); 1289 + pDummy = dummy; 1290 + if (!gaiaConvertCharset 1291 + (&pDummy, (const char *) "UTF-8", outCs)) 1292 + goto encoding_error; 1293 + fprintf (out, "%s", dummy); 1294 + } 1295 + } 1296 + fprintf (out, "\n"); 1297 + } 1298 + else 1299 + goto sql_error; 1300 + } 1301 + sqlite3_finalize (stmt); 1302 + fclose (out); 1303 + msg.Printf (wxT ("Exported %d rows into CSV file"), rows); 1304 + wxMessageBox (msg, wxT ("spatialite-gui"), wxOK | wxICON_INFORMATION, this); 1305 + return; 1306 + sql_error: 1253 1307 // 1254 1308 // some SQL error occurred 1255 1309 // 1256 - sqlite3_finalize(stmt); 1257 - wxMessageBox(wxT("dump CSV error:") + 1258 - wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)), 1259 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1260 - if (out) 1261 - fclose(out); 1262 - return; 1263 -encoding_error: 1310 + sqlite3_finalize (stmt); 1311 + wxMessageBox (wxT ("dump CSV error:") + 1312 + wxString::FromUTF8 (sqlite3_errmsg (SqliteHandle)), 1313 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, this); 1314 + if (out) 1315 + fclose (out); 1316 + return; 1317 + encoding_error: 1264 1318 // 1265 1319 // some CHARSET converion occurred 1266 1320 // 1267 - sqlite3_finalize(stmt); 1268 - wxMessageBox(wxT("dump CSV: charset conversion reported an error"), 1269 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1270 - if (out) 1271 - fclose(out); 1272 - return; 1273 -no_file: 1321 + sqlite3_finalize (stmt); 1322 + wxMessageBox (wxT ("dump CSV: charset conversion reported an error"), 1323 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, this); 1324 + if (out) 1325 + fclose (out); 1326 + return; 1327 + no_file: 1274 1328 // 1275 1329 // output file can't be created/opened 1276 1330 // 1277 - wxMessageBox(wxT("ERROR: unable to open '") + path + wxT("' for writing"), 1278 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1279 - return; 1331 + wxMessageBox (wxT ("ERROR: unable to open '") + path + 1332 + wxT ("' for writing"), wxT ("spatialite-gui"), 1333 + wxOK | wxICON_ERROR, this); 1334 + return; 1280 1335 } 1281 1336 1282 -void MyFrame::DumpHtml(wxString & path, wxString & table, wxString & charset) 1337 +void 1338 +MyFrame::DumpHtml (wxString & path, wxString & table, wxString & charset) 1283 1339 { 1284 1340 // 1285 1341 // dumping a table as HTML 1286 1342 // 1287 - wxString sql; 1288 - sqlite3_stmt *stmt; 1289 - int ret; 1290 - int rows = 0; 1291 - int i; 1292 - int n_cols; 1293 - char xpath[1024]; 1294 - char xtable[1024]; 1295 - char dummy[65536]; 1296 - char outCs[128]; 1297 - char *pDummy; 1298 - wxString msg; 1299 - strcpy(outCs, charset.ToUTF8()); 1300 - strcpy(xpath, path.ToUTF8()); 1301 - strcpy(xtable, table.ToUTF8()); 1302 - FILE *out = fopen(xpath, "w"); 1303 - if (!out) 1304 - goto no_file; 1305 - fprintf(out, 1306 - "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n"); 1307 - fprintf(out, "<html>\n\t<head>\n"); 1308 - fprintf(out, 1309 - "\t\t<meta http-equiv=\"content-type\" content=\"text/html; charset=%s\">\n", 1310 - outCs); 1311 - fprintf(out, "\t\t<title>\nTable '%s': from SQLite/SpatiaLite DB '%s'\n", 1312 - xtable, xpath); 1313 - fprintf(out, "\t\t</title>\n"); 1314 - fprintf(out, "\t\t<style type=\"text/css\">\n"); 1315 - fprintf(out, "table { border: 1px; }\n"); 1316 - fprintf(out, "tr.t0 th { background-color: #c9c9df; }\n"); 1317 - fprintf(out, "tr.d0 td { background-color: #e0efe0; }\n"); 1318 - fprintf(out, "tr.d1 td { background-color: #d0d0df; }\n"); 1319 - fprintf(out, "\t\t</style>\n\t</head>\n\t<body>\n\t\t<table>\n"); 1343 + wxString sql; 1344 + sqlite3_stmt *stmt; 1345 + int ret; 1346 + int rows = 0; 1347 + int i; 1348 + int n_cols; 1349 + char xpath[1024]; 1350 + char xtable[1024]; 1351 + char dummy[65536]; 1352 + char outCs[128]; 1353 + char *pDummy; 1354 + wxString msg; 1355 + strcpy (outCs, charset.ToUTF8 ()); 1356 + strcpy (xpath, path.ToUTF8 ()); 1357 + strcpy (xtable, table.ToUTF8 ()); 1358 + FILE *out = fopen (xpath, "w"); 1359 + if (!out) 1360 + goto no_file; 1361 + fprintf (out, 1362 + "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n"); 1363 + fprintf (out, "<html>\n\t<head>\n"); 1364 + fprintf (out, 1365 + "\t\t<meta http-equiv=\"content-type\" content=\"text/html; charset=%s\">\n", 1366 + outCs); 1367 + fprintf (out, "\t\t<title>\nTable '%s': from SQLite/SpatiaLite DB '%s'\n", 1368 + xtable, xpath); 1369 + fprintf (out, "\t\t</title>\n"); 1370 + fprintf (out, "\t\t<style type=\"text/css\">\n"); 1371 + fprintf (out, "table { border: 1px; }\n"); 1372 + fprintf (out, "tr.t0 th { background-color: #c9c9df; }\n"); 1373 + fprintf (out, "tr.d0 td { background-color: #e0efe0; }\n"); 1374 + fprintf (out, "tr.d1 td { background-color: #d0d0df; }\n"); 1375 + fprintf (out, "\t\t</style>\n\t</head>\n\t<body>\n\t\t<table>\n"); 1320 1376 // 1321 1377 // preparing SQL statement 1322 1378 // 1323 - sql = wxT("SELECT * FROM \""); 1324 - sql += table; 1325 - sql += wxT("\""); 1379 + sql = wxT ("SELECT * FROM "); 1380 + sql += table; 1326 1381 // 1327 1382 // compiling SQL prepared statement 1328 1383 // 1329 - ret = sqlite3_prepare_v2(SqliteHandle, sql.ToUTF8(), sql.Len(), &stmt, NULL); 1330 - if (ret != SQLITE_OK) 1331 - goto sql_error; 1332 - rows = 0; 1333 - while (1) 1334 - { 1335 - ret = sqlite3_step(stmt); 1336 - if (ret == SQLITE_DONE) 1337 - break; // end of result set 1338 - if (ret == SQLITE_ROW) 1339 - { 1340 - n_cols = sqlite3_column_count(stmt); 1341 - if (rows == 0) 1342 - { 1343 - // outputting the column titles 1344 - fprintf(out, "\t\t\t<tr class=\"t0\">\n"); 1345 - for (i = 0; i < n_cols; i++) 1346 - { 1347 - strcpy(dummy, sqlite3_column_name(stmt, i)); 1348 - CleanHtml(dummy); 1349 - fprintf(out, "\t\t\t\t<th>%s</th>\n", dummy); 1350 - } 1351 - fprintf(out, "\t\t\t</tr>\n"); 1352 - } 1353 - rows++; 1354 - fprintf(out, "\t\t\t<tr class=\"%s\">\n", (rows % 2) ? "d0" : "d1"); 1355 - for (i = 0; i < n_cols; i++) 1356 - { 1357 - if (sqlite3_column_type(stmt, i) == SQLITE_INTEGER) 1358 - fprintf(out, "\t\t\t\t<td align=\"right\">%d</td>\n", 1359 - sqlite3_column_int(stmt, i)); 1360 - else if (sqlite3_column_type(stmt, i) == SQLITE_FLOAT) 1361 - fprintf(out, "\t\t\t\t<td align=\"right\">%1.6lf</td>\n", 1362 - sqlite3_column_double(stmt, i)); 1363 - else if (sqlite3_column_type(stmt, i) == SQLITE_TEXT) 1364 - { 1365 - strcpy(dummy, (char *) sqlite3_column_text(stmt, i)); 1366 - CleanHtml(dummy); 1367 - pDummy = dummy; 1368 - if (!gaiaConvertCharset 1369 - (&pDummy, (const char *) "UTF-8", outCs)) 1370 - goto encoding_error; 1371 - fprintf(out, "\t\t\t\t<td>%s</td>\n", dummy); 1372 - } 1373 - } 1374 - fprintf(out, "\t\t\t</tr>\n"); 1375 - } else 1376 - goto sql_error; 1377 - } 1378 - sqlite3_finalize(stmt); 1379 - fprintf(out, "\t\t</table>\n\t</body>\n</html>\n"); 1380 - fclose(out); 1381 - sprintf(dummy, "Exported %d rows into HTML file", rows); 1382 - msg = wxString::FromUTF8(dummy); 1383 - wxMessageBox(msg, wxT("spatialite-gui"), wxOK | wxICON_INFORMATION, this); 1384 - return; 1385 -sql_error: 1384 + ret = 1385 + sqlite3_prepare_v2 (SqliteHandle, sql.ToUTF8 (), sql.Len (), &stmt, 1386 + NULL); 1387 + if (ret != SQLITE_OK) 1388 + goto sql_error; 1389 + rows = 0; 1390 + while (1) 1391 + { 1392 + ret = sqlite3_step (stmt); 1393 + if (ret == SQLITE_DONE) 1394 + break; // end of result set 1395 + if (ret == SQLITE_ROW) 1396 + { 1397 + n_cols = sqlite3_column_count (stmt); 1398 + if (rows == 0) 1399 + { 1400 + // outputting the column titles 1401 + fprintf (out, "\t\t\t<tr class=\"t0\">\n"); 1402 + for (i = 0; i < n_cols; i++) 1403 + { 1404 + strcpy (dummy, sqlite3_column_name (stmt, i)); 1405 + CleanHtml (dummy); 1406 + fprintf (out, "\t\t\t\t<th>%s</th>\n", dummy); 1407 + } 1408 + fprintf (out, "\t\t\t</tr>\n"); 1409 + } 1410 + rows++; 1411 + fprintf (out, "\t\t\t<tr class=\"%s\">\n", 1412 + (rows % 2) ? "d0" : "d1"); 1413 + for (i = 0; i < n_cols; i++) 1414 + { 1415 + if (sqlite3_column_type (stmt, i) == SQLITE_INTEGER) 1416 + fprintf (out, 1417 + "\t\t\t\t<td align=\"right\">%d</td>\n", 1418 + sqlite3_column_int (stmt, i)); 1419 + else if (sqlite3_column_type (stmt, i) == SQLITE_FLOAT) 1420 + fprintf (out, 1421 + "\t\t\t\t<td align=\"right\">%1.6lf</td>\n", 1422 + sqlite3_column_double (stmt, i)); 1423 + else if (sqlite3_column_type (stmt, i) == SQLITE_TEXT) 1424 + { 1425 + strcpy (dummy, 1426 + (char *) sqlite3_column_text (stmt, i)); 1427 + CleanHtml (dummy); 1428 + pDummy = dummy; 1429 + if (!gaiaConvertCharset 1430 + (&pDummy, (const char *) "UTF-8", outCs)) 1431 + goto encoding_error; 1432 + fprintf (out, "\t\t\t\t<td>%s</td>\n", dummy); 1433 + } 1434 + } 1435 + fprintf (out, "\t\t\t</tr>\n"); 1436 + } 1437 + else 1438 + goto sql_error; 1439 + } 1440 + sqlite3_finalize (stmt); 1441 + fprintf (out, "\t\t</table>\n\t</body>\n</html>\n"); 1442 + fclose (out); 1443 + msg.Printf (wxT ("Exported %d rows into HTML file"), rows); 1444 + wxMessageBox (msg, wxT ("spatialite-gui"), wxOK | wxICON_INFORMATION, this); 1445 + return; 1446 + sql_error: 1386 1447 // 1387 1448 // some SQL error occurred 1388 1449 // 1389 - sqlite3_finalize(stmt); 1390 - wxMessageBox(wxT("dump HTML error:") + 1391 - wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)), 1392 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1393 - if (out) 1394 - fclose(out); 1395 - return; 1396 -encoding_error: 1450 + sqlite3_finalize (stmt); 1451 + wxMessageBox (wxT ("dump HTML error:") + 1452 + wxString::FromUTF8 (sqlite3_errmsg (SqliteHandle)), 1453 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, this); 1454 + if (out) 1455 + fclose (out); 1456 + return; 1457 + encoding_error: 1397 1458 // 1398 -// some CHARSET convertion occurred 1459 +// some CHARSET converion occurred 1399 1460 // 1400 - sqlite3_finalize(stmt); 1401 - wxMessageBox(wxT("dump HTML: charset conversion reported an error"), 1402 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1403 - if (out) 1404 - fclose(out); 1405 - return; 1406 -no_file: 1461 + sqlite3_finalize (stmt); 1462 + wxMessageBox (wxT ("dump HTML: charset conversion reported an error"), 1463 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, this); 1464 + if (out) 1465 + fclose (out); 1466 + return; 1467 + no_file: 1407 1468 // 1408 1469 // output file can't be created/opened 1409 1470 // 1410 - wxMessageBox(wxT("ERROR: unable to open '") + path + wxT("' for writing"), 1411 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1412 - return; 1471 + wxMessageBox (wxT ("ERROR: unable to open '") + path + 1472 + wxT ("' for writing"), wxT ("spatialite-gui"), 1473 + wxOK | wxICON_ERROR, this); 1474 + return; 1413 1475 }
Changes to TableTree.cpp.
1 1 /* 2 2 / TableTree.cpp 3 3 / tree control to show tables, columns, indices and triggers 4 4 / 5 -/ version 1.2, 2008 October 9 5 +/ version 1.1, 2008 September 13 6 6 / 7 7 / Author: Sandro Furieri a-furieri@lqt.it 8 8 / 9 9 / Copyright (C) 2008 Alessandro Furieri 10 10 / 11 11 / This program is free software: you can redistribute it and/or modify 12 12 / it under the terms of the GNU General Public License as published by ................................................................................ 39 39 #include "icons/pkey.xpm" 40 40 #include "icons/column.xpm" 41 41 #include "icons/index.xpm" 42 42 #include "icons/trigger.xpm" 43 43 #include "icons/geometry.xpm" 44 44 #include "icons/spatialidx.xpm" 45 45 #include "icons/mbrcache.xpm" 46 -#include "icons/kill_spindex.xpm" 47 -#include "icons/dumpshp.xpm" 48 46 49 -MyTableTree::MyTableTree(MyFrame * parent, wxWindowID id):wxTreeCtrl(parent, id) 47 +MyTableTree::MyTableTree (MyFrame * parent, wxWindowID id):wxTreeCtrl (parent, 48 + id) 50 49 { 51 50 // 52 51 // constructor: TREE control to show DB objects 53 52 // 54 - MainFrame = parent; 55 - Root = AddRoot(wxT("no current DB")); 53 + MainFrame = parent; 54 + Root = AddRoot (wxT ("no current DB")); 56 55 // setting up icons 57 - Images = new wxImageList(16, 16, true); 58 - wxIcon icons[12]; 59 - icons[0] = wxIcon(db_xpm); 60 - icons[1] = wxIcon(table_xpm); 61 - icons[2] = wxIcon(pkey_xpm); 62 - icons[3] = wxIcon(column_xpm); 63 - icons[4] = wxIcon(index_xpm); 64 - icons[5] = wxIcon(trigger_xpm); 65 - icons[6] = wxIcon(geometry_xpm); 66 - icons[7] = wxIcon(spatialidx_xpm); 67 - icons[8] = wxIcon(vtable_xpm); 68 - icons[9] = wxIcon(view_xpm); 69 - icons[10] = wxIcon(geotable_xpm); 70 - icons[11] = wxIcon(mbrcache_xpm); 71 - Images->Add(icons[0]); 72 - Images->Add(icons[1]); 73 - Images->Add(icons[2]); 74 - Images->Add(icons[3]); 75 - Images->Add(icons[4]); 76 - Images->Add(icons[5]); 77 - Images->Add(icons[6]); 78 - Images->Add(icons[7]); 79 - Images->Add(icons[8]); 80 - Images->Add(icons[9]); 81 - Images->Add(icons[10]); 82 - Images->Add(icons[11]); 83 - SetImageList(Images); 84 - SetItemImage(Root, 0); 85 -// setting up event handlers 86 - Connect(wxID_ANY, wxEVT_COMMAND_TREE_SEL_CHANGED, 87 - (wxObjectEventFunction) & MyTableTree::OnSelChanged); 88 - Connect(wxID_ANY, wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK, 89 - (wxObjectEventFunction) & MyTableTree::OnRightClick); 90 - Connect(Tree_NewTable, wxEVT_COMMAND_MENU_SELECTED, 91 - (wxObjectEventFunction) & MyTableTree::OnCmdNewTable); 92 - Connect(Tree_NewView, wxEVT_COMMAND_MENU_SELECTED, 93 - (wxObjectEventFunction) & MyTableTree::OnCmdNewView); 94 - Connect(Tree_NewIndex, wxEVT_COMMAND_MENU_SELECTED, 95 - (wxObjectEventFunction) & MyTableTree::OnCmdNewIndex); 96 - Connect(Tree_NewTrigger, wxEVT_COMMAND_MENU_SELECTED, 97 - (wxObjectEventFunction) & MyTableTree::OnCmdNewTrigger); 98 - Connect(Tree_NewColumn, wxEVT_COMMAND_MENU_SELECTED, 99 - (wxObjectEventFunction) & MyTableTree::OnCmdNewColumn); 100 - Connect(Tree_Show, wxEVT_COMMAND_MENU_SELECTED, 101 - (wxObjectEventFunction) & MyTableTree::OnCmdShow); 102 - Connect(Tree_Drop, wxEVT_COMMAND_MENU_SELECTED, 103 - (wxObjectEventFunction) & MyTableTree::OnCmdDrop); 104 - Connect(Tree_Rename, wxEVT_COMMAND_MENU_SELECTED, 105 - (wxObjectEventFunction) & MyTableTree::OnCmdRename); 106 - Connect(Tree_Select, wxEVT_COMMAND_MENU_SELECTED, 107 - (wxObjectEventFunction) & MyTableTree::OnCmdSelect); 108 - Connect(Tree_Refresh, wxEVT_COMMAND_MENU_SELECTED, 109 - (wxObjectEventFunction) & MyTableTree::OnCmdRefresh); 110 - Connect(Tree_Recover, wxEVT_COMMAND_MENU_SELECTED, 111 - (wxObjectEventFunction) & MyTableTree::OnCmdRecover); 112 - Connect(Tree_ShowSql, wxEVT_COMMAND_MENU_SELECTED, 113 - (wxObjectEventFunction) & MyTableTree::OnCmdShowSql); 114 - Connect(Tree_SpatialIndex, wxEVT_COMMAND_MENU_SELECTED, 115 - (wxObjectEventFunction) & MyTableTree::OnCmdSpatialIndex); 116 - Connect(Tree_MbrCache, wxEVT_COMMAND_MENU_SELECTED, 117 - (wxObjectEventFunction) & MyTableTree::OnCmdMbrCache); 118 - Connect(Tree_RebuildTriggers, wxEVT_COMMAND_MENU_SELECTED, 119 - (wxObjectEventFunction) & MyTableTree::OnCmdRebuildTriggers); 120 - Connect(Tree_CheckGeometry, wxEVT_COMMAND_MENU_SELECTED, 121 - (wxObjectEventFunction) & MyTableTree::OnCmdCheckGeometry); 122 - Connect(Tree_SetSrid, wxEVT_COMMAND_MENU_SELECTED, 123 - (wxObjectEventFunction) & MyTableTree::OnCmdSetSrid); 124 - Connect(Tree_DumpShp, wxEVT_COMMAND_MENU_SELECTED, 125 - (wxObjectEventFunction) & MyTableTree::OnCmdDumpShp); 126 - Connect(Tree_DumpTxtTab, wxEVT_COMMAND_MENU_SELECTED, 127 - (wxObjectEventFunction) & MyTableTree::OnCmdDumpTxtTab); 128 - Connect(Tree_DumpCsv, wxEVT_COMMAND_MENU_SELECTED, 129 - (wxObjectEventFunction) & MyTableTree::OnCmdDumpCsv); 130 - Connect(Tree_DumpHtml, wxEVT_COMMAND_MENU_SELECTED, 131 - (wxObjectEventFunction) & MyTableTree::OnCmdDumpHtml); 132 - Connect(Tree_Edit, wxEVT_COMMAND_MENU_SELECTED, 133 - (wxObjectEventFunction) & MyTableTree::OnCmdEdit); 134 -} 135 - 136 -void MyTableTree::AddTable(wxString & tableName, bool virtualTable) 56 + Images = new wxImageList (16, 16, true); 57 + wxIcon icons[12]; 58 + icons[0] = wxIcon (db_xpm); 59 + icons[1] = wxIcon (table_xpm); 60 + icons[2] = wxIcon (pkey_xpm); 61 + icons[3] = wxIcon (column_xpm); 62 + icons[4] = wxIcon (index_xpm); 63 + icons[5] = wxIcon (trigger_xpm); 64 + icons[6] = wxIcon (geometry_xpm); 65 + icons[7] = wxIcon (spatialidx_xpm); 66 + icons[8] = wxIcon (vtable_xpm); 67 + icons[9] = wxIcon (view_xpm); 68 + icons[10] = wxIcon (geotable_xpm); 69 + icons[11] = wxIcon (mbrcache_xpm); 70 + Images->Add (icons[0]); 71 + Images->Add (icons[1]); 72 + Images->Add (icons[2]); 73 + Images->Add (icons[3]); 74 + Images->Add (icons[4]); 75 + Images->Add (icons[5]); 76 + Images->Add (icons[6]); 77 + Images->Add (icons[7]); 78 + Images->Add (icons[8]); 79 + Images->Add (icons[9]); 80 + Images->Add (icons[10]); 81 + Images->Add (icons[11]); 82 + SetImageList (Images); 83 + SetItemImage (Root, 0); 84 +// setting up event handlers 85 + Connect (wxID_ANY, wxEVT_COMMAND_TREE_SEL_CHANGED, 86 + (wxObjectEventFunction) & MyTableTree::OnSelChanged); 87 + Connect (wxID_ANY, wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK, 88 + (wxObjectEventFunction) & MyTableTree::OnRightClick); 89 + Connect (Tree_NewTable, wxEVT_COMMAND_MENU_SELECTED, 90 + (wxObjectEventFunction) & MyTableTree::OnCmdNewTable); 91 + Connect (Tree_NewView, wxEVT_COMMAND_MENU_SELECTED, 92 + (wxObjectEventFunction) & MyTableTree::OnCmdNewView); 93 + Connect (Tree_NewIndex, wxEVT_COMMAND_MENU_SELECTED, 94 + (wxObjectEventFunction) & MyTableTree::OnCmdNewIndex); 95 + Connect (Tree_NewTrigger, wxEVT_COMMAND_MENU_SELECTED, 96 + (wxObjectEventFunction) & MyTableTree::OnCmdNewTrigger); 97 + Connect (Tree_NewColumn, wxEVT_COMMAND_MENU_SELECTED, 98 + (wxObjectEventFunction) & MyTableTree::OnCmdNewColumn); 99 + Connect (Tree_Show, wxEVT_COMMAND_MENU_SELECTED, 100 + (wxObjectEventFunction) & MyTableTree::OnCmdShow); 101 + Connect (Tree_Drop, wxEVT_COMMAND_MENU_SELECTED, 102 + (wxObjectEventFunction) & MyTableTree::OnCmdDrop); 103 + Connect (Tree_Rename, wxEVT_COMMAND_MENU_SELECTED, 104 + (wxObjectEventFunction) & MyTableTree::OnCmdRename); 105 + Connect (Tree_Select, wxEVT_COMMAND_MENU_SELECTED, 106 + (wxObjectEventFunction) & MyTableTree::OnCmdSelect); 107 + Connect (Tree_Refresh, wxEVT_COMMAND_MENU_SELECTED, 108 + (wxObjectEventFunction) & MyTableTree::OnCmdRefresh); 109 + Connect (Tree_Recover, wxEVT_COMMAND_MENU_SELECTED, 110 + (wxObjectEventFunction) & MyTableTree::OnCmdRecover); 111 + Connect (Tree_ShowSql, wxEVT_COMMAND_MENU_SELECTED, 112 + (wxObjectEventFunction) & MyTableTree::OnCmdShowSql); 113 + Connect (Tree_SpatialIndex, wxEVT_COMMAND_MENU_SELECTED, 114 + (wxObjectEventFunction) & MyTableTree::OnCmdSpatialIndex); 115 + Connect (Tree_MbrCache, wxEVT_COMMAND_MENU_SELECTED, 116 + (wxObjectEventFunction) & MyTableTree::OnCmdMbrCache); 117 + Connect (Tree_CheckGeometry, wxEVT_COMMAND_MENU_SELECTED, 118 + (wxObjectEventFunction) & MyTableTree::OnCmdCheckGeometry); 119 + Connect (Tree_SetSrid, wxEVT_COMMAND_MENU_SELECTED, 120 + (wxObjectEventFunction) & MyTableTree::OnCmdSetSrid); 121 + Connect (Tree_DumpShp, wxEVT_COMMAND_MENU_SELECTED, 122 + (wxObjectEventFunction) & MyTableTree::OnCmdDumpShp); 123 + Connect (Tree_DumpTxtTab, wxEVT_COMMAND_MENU_SELECTED, 124 + (wxObjectEventFunction) & MyTableTree::OnCmdDumpTxtTab); 125 + Connect (Tree_DumpCsv, wxEVT_COMMAND_MENU_SELECTED, 126 + (wxObjectEventFunction) & MyTableTree::OnCmdDumpCsv); 127 + Connect (Tree_DumpHtml, wxEVT_COMMAND_MENU_SELECTED, 128 + (wxObjectEventFunction) & MyTableTree::OnCmdDumpHtml); 129 + Connect (Tree_Edit, wxEVT_COMMAND_MENU_SELECTED, 130 + (wxObjectEventFunction) & MyTableTree::OnCmdEdit); 131 +} 132 + 133 +void 134 +MyTableTree::AddTable (wxString & tableName, bool virtualTable) 137 135 { 138 136 // 139 137 // appends a table to the TREE list 140 - MyTableInfo list; 141 - MyColumnInfo *col; 142 - MyIndexInfo *idx; 143 - MyTriggerInfo *trgr; 144 - wxTreeItemId item; 145 - wxTreeItemId item2; 146 - wxString columnInfo; 147 - wxString indexInfo; 148 - wxString triggerInfo; 149 - int icon = 1; 150 - if (virtualTable == true) 151 - icon = 8; 152 - item = AppendItem(Root, tableName, icon); 153 - if (virtualTable == true) 154 - SetItemData(item, (wxTreeItemData *) (new MyObject(MY_VTABLE, tableName))); 155 - else 156 - SetItemData(item, (wxTreeItemData *) (new MyObject(MY_TABLE, tableName))); 157 - MainFrame->GetTableColumns(tableName, &list); 158 - MainFrame->GetTableIndices(tableName, &list); 159 - MainFrame->GetTableTriggers(tableName, &list); 160 - col = list.GetFirstColumn(); 161 - while (col) 162 - { 163 - int icon; 164 - if (col->IsPrimaryKey() == true) 165 - icon = 2; 166 - else 167 - { 168 - if (col->IsGeometry() == true) 169 - { 170 - if (virtualTable == false) 171 - SetItemImage(item, 10); 172 - if (col->IsGeometryIndex() == true) 173 - icon = 7; 174 - else if (col->IsMbrCache() == true) 175 - icon = 11; 176 - else 177 - icon = 6; 178 - } else 179 - icon = 3; 180 - } 181 - columnInfo = col->GetName(); 182 - item2 = AppendItem(item, columnInfo, icon); 183 - if (col->IsGeometry() == true) 184 - { 185 - if (col->IsGeometryIndex() == true) 186 - SetItemData(item2, 187 - (wxTreeItemData *) (new 188 - MyObject(MY_GEOMETRY_INDEX, 189 - tableName, 190 - col->GetName()))); 191 - else if (col->IsMbrCache() == true) 192 - SetItemData(item2, 193 - (wxTreeItemData *) (new 194 - MyObject(MY_GEOMETRY_CACHED, 195 - tableName, 196 - col->GetName()))); 197 - else 198 - SetItemData(item2, 199 - (wxTreeItemData *) (new 200 - MyObject(MY_GEOMETRY, tableName, 201 - col->GetName()))); 202 - } else 203 - SetItemData(item2, 204 - (wxTreeItemData *) (new 205 - MyObject(MY_COLUMN, tableName, 206 - col->GetName()))); 207 - col = col->GetNext(); 208 - } 209 - idx = list.GetFirstIndex(); 210 - while (idx) 211 - { 212 - indexInfo = idx->GetName(); 213 - item2 = AppendItem(item, indexInfo, 4); 214 - SetItemData(item2, 215 - (wxTreeItemData *) (new MyObject(MY_INDEX, idx->GetName()))); 216 - idx = idx->GetNext(); 217 - } 218 - trgr = list.GetFirstTrigger(); 219 - while (trgr) 220 - { 221 - triggerInfo = trgr->GetName(); 222 - item2 = AppendItem(item, triggerInfo, 5); 223 - SetItemData(item2, 224 - (wxTreeItemData *) (new 225 - MyObject(MY_TRIGGER, trgr->GetName()))); 226 - trgr = trgr->GetNext(); 227 - } 228 -} 229 - 230 -void MyTableTree::AddView(wxString & viewName) 138 + MyTableInfo list; 139 + MyColumnInfo *col; 140 + MyIndexInfo *idx; 141 + MyTriggerInfo *trgr; 142 + wxTreeItemId item; 143 + wxTreeItemId item2; 144 + wxString columnInfo; 145 + wxString indexInfo; 146 + wxString triggerInfo; 147 + int icon = 1; 148 + if (virtualTable == true) 149 + icon = 8; 150 + item = AppendItem (Root, tableName, icon); 151 + if (virtualTable == true) 152 + SetItemData (item, 153 + (wxTreeItemData *) (new MyObject (MY_VTABLE, tableName))); 154 + else 155 + SetItemData (item, 156 + (wxTreeItemData *) (new MyObject (MY_TABLE, tableName))); 157 + MainFrame->GetTableColumns (tableName, &list); 158 + MainFrame->GetTableIndices (tableName, &list); 159 + MainFrame->GetTableTriggers (tableName, &list); 160 + col = list.GetFirstColumn (); 161 + while (col) 162 + { 163 + int icon; 164 + if (col->IsPrimaryKey () == true) 165 + icon = 2; 166 + else 167 + { 168 + if (col->IsGeometry () == true) 169 + { 170 + if (virtualTable == false) 171 + SetItemImage (item, 10); 172 + if (col->IsGeometryIndex () == true) 173 + icon = 7; 174 + else if (col->IsMbrCache () == true) 175 + icon = 11; 176 + else 177 + icon = 6; 178 + } 179 + else 180 + icon = 3; 181 + } 182 + columnInfo = col->GetName (); 183 + item2 = AppendItem (item, columnInfo, icon); 184 + if (col->IsGeometry () == true) 185 + { 186 + if (col->IsGeometryIndex () == true) 187 + SetItemData (item2, 188 + (wxTreeItemData *) (new 189 + MyObject 190 + (MY_GEOMETRY_INDEX, 191 + tableName, 192 + col->GetName ()))); 193 + else if (col->IsMbrCache () == true) 194 + SetItemData (item2, 195 + (wxTreeItemData *) (new 196 + MyObject 197 + (MY_GEOMETRY_CACHED, 198 + tableName, 199 + col->GetName ()))); 200 + else 201 + SetItemData (item2, 202 + (wxTreeItemData *) (new 203 + MyObject (MY_GEOMETRY, 204 + tableName, 205 + col->GetName 206 + ()))); 207 + } 208 + else 209 + SetItemData (item2, 210 + (wxTreeItemData *) (new 211 + MyObject (MY_COLUMN, tableName, 212 + col->GetName ()))); 213 + col = col->GetNext (); 214 + } 215 + idx = list.GetFirstIndex (); 216 + while (idx) 217 + { 218 + indexInfo = idx->GetName (); 219 + item2 = AppendItem (item, indexInfo, 4); 220 + SetItemData (item2, 221 + (wxTreeItemData *) (new 222 + MyObject (MY_INDEX, 223 + idx->GetName ()))); 224 + idx = idx->GetNext (); 225 + } 226 + trgr = list.GetFirstTrigger (); 227 + while (trgr) 228 + { 229 + triggerInfo = trgr->GetName (); 230 + item2 = AppendItem (item, triggerInfo, 5); 231 + SetItemData (item2, 232 + (wxTreeItemData *) (new 233 + MyObject (MY_TRIGGER, 234 + trgr->GetName ()))); 235 + trgr = trgr->GetNext (); 236 + } 237 +} 238 + 239 +void 240 +MyTableTree::AddView (wxString & viewName) 231 241 { 232 242 // 233 243 // appends a view to the TREE list 234 - MyViewInfo list; 235 - MyColumnInfo *col; 236 - wxTreeItemId item; 237 - wxTreeItemId item2; 238 - wxString columnInfo; 239 - item = AppendItem(Root, viewName, 9); 240 - SetItemData(item, (wxTreeItemData *) (new MyObject(MY_VIEW, viewName))); 241 - MainFrame->GetViewColumns(viewName, &list); 242 - col = list.GetFirst(); 243 - while (col) 244 - { 245 - columnInfo = col->GetName(); 246 - item2 = AppendItem(item, columnInfo, 3); 247 - SetItemData(item2, 248 - (wxTreeItemData *) (new 249 - MyObject(MY_COLUMN, viewName, 250 - col->GetName()))); 251 - col = col->GetNext(); 252 - } 253 -} 254 - 255 -void MyTableTree::OnSelChanged(wxTreeEvent & event) 244 + MyViewInfo list; 245 + MyColumnInfo *col; 246 + wxTreeItemId item; 247 + wxTreeItemId item2; 248 + wxString columnInfo; 249 + item = AppendItem (Root, viewName, 9); 250 + SetItemData (item, (wxTreeItemData *) (new MyObject (MY_VIEW, viewName))); 251 + MainFrame->GetViewColumns (viewName, &list); 252 + col = list.GetFirst (); 253 + while (col) 254 + { 255 + columnInfo = col->GetName (); 256 + item2 = AppendItem (item, columnInfo, 3); 257 + SetItemData (item2, 258 + (wxTreeItemData *) (new 259 + MyObject (MY_COLUMN, viewName, 260 + col->GetName ()))); 261 + col = col->GetNext (); 262 + } 263 +} 264 + 265 +void 266 +MyTableTree::OnSelChanged (wxTreeEvent & event) 256 267 { 257 268 // 258 269 // selecting some node [mouse action] 259 270 // 260 - wxTreeItemId item = event.GetItem(); 261 - if (item == Root) 262 - return; 263 - MyObject *obj = (MyObject *) GetItemData(item); 264 - if (obj == NULL) 265 - return; 266 - CurrentItem = item; 271 + wxTreeItemId item = event.GetItem (); 272 + if (item == Root) 273 + return; 274 + MyObject *obj = (MyObject *) GetItemData (item); 275 + if (obj == NULL) 276 + return; 277 + CurrentItem = item; 267 278 } 268 279 269 -void MyTableTree::OnRightClick(wxTreeEvent & event) 280 +void 281 +MyTableTree::OnRightClick (wxTreeEvent & event) 270 282 { 271 283 // 272 284 // right click on some node [mouse action] 273 285 // 274 - wxMenu *menu = new wxMenu(); 275 - wxMenuItem *menuItem; 276 - wxString title; 277 - bool table = false; 278 - bool canEdit = false; 279 - bool view = false; 280 - bool column = false; 281 - bool geometry = false; 282 - bool geometry_index = false; 283 - bool geometry_cached = false; 284 - bool index = false; 285 - bool trigger = false; 286 - bool metadata = MainFrame->CheckMetadata(); 287 - if (MainFrame->IsConnected() == false) 288 - return; 289 - wxTreeItemId item = event.GetItem(); 290 - SelectItem(item); 291 - wxPoint pt = event.GetPoint(); 292 - if (item == Root) 293 - { 294 - CurrentItem = NULL; 295 - menuItem = new wxMenuItem(menu, Tree_Refresh, wxT("&Refresh")); 296 - menu->Append(menuItem); 297 - menu->AppendSeparator(); 298 - menuItem = new wxMenuItem(menu, Tree_NewTable, wxT("Create New &Table")); 299 - menu->Append(menuItem); 300 - menuItem = new wxMenuItem(menu, Tree_NewView, wxT("Create New &View")); 301 - menu->Append(menuItem); 302 - PopupMenu(menu, pt); 303 - return; 304 - } 305 - MyObject *obj = (MyObject *) GetItemData(item); 306 - if (obj == NULL) 307 - { 308 - CurrentItem = NULL; 309 - menuItem = new wxMenuItem(menu, Tree_Refresh, wxT("&Refresh")); 310 - menu->Append(menuItem); 311 - menu->AppendSeparator(); 312 - menuItem = new wxMenuItem(menu, Tree_NewTable, wxT("Create New &Table")); 313 - menu->Append(menuItem); 314 - menuItem = new wxMenuItem(menu, Tree_NewView, wxT("Create New &View")); 315 - menu->Append(menuItem); 316 - PopupMenu(menu, pt); 317 - return; 318 - } 319 - switch (obj->GetType()) 320 - { 286 + wxMenu menu; 287 + wxMenuItem *menuItem; 288 + wxString title; 289 + bool table = false; 290 + bool canEdit = false; 291 + bool view = false; 292 + bool column = false; 293 + bool geometry = false; 294 + bool geometry_index = false; 295 + bool geometry_cached = false; 296 + bool index = false; 297 + bool trigger = false; 298 + bool metadata = MainFrame->CheckMetadata (); 299 + if (MainFrame->IsConnected () == false) 300 + return; 301 + wxTreeItemId item = event.GetItem (); 302 + SelectItem (item); 303 + wxPoint pt = event.GetPoint (); 304 + if (item == Root) 305 + { 306 + CurrentItem = NULL; 307 + menuItem = new wxMenuItem (&menu, Tree_Refresh, wxT ("&Refresh")); 308 + menu.Append (menuItem); 309 + menu.AppendSeparator (); 310 + menuItem = 311 + new wxMenuItem (&menu, Tree_NewTable, wxT ("Create New &Table")); 312 + menu.Append (menuItem); 313 + menuItem = 314 + new wxMenuItem (&menu, Tree_NewView, wxT ("Create New &View")); 315 + menu.Append (menuItem); 316 + PopupMenu (&menu, pt); 317 + return; 318 + } 319 + MyObject *obj = (MyObject *) GetItemData (item); 320 + if (obj == NULL) 321 + { 322 + CurrentItem = NULL; 323 + menuItem = new wxMenuItem (&menu, Tree_Refresh, wxT ("&Refresh")); 324 + menu.Append (menuItem); 325 + menu.AppendSeparator (); 326 + menuItem = 327 + new wxMenuItem (&menu, Tree_NewTable, wxT ("Create New &Table")); 328 + menu.Append (menuItem); 329 + menuItem = 330 + new wxMenuItem (&menu, Tree_NewView, wxT ("Create New &View")); 331 + menu.Append (menuItem); 332 + PopupMenu (&menu, pt); 333 + return; 334 + } 335 + switch (obj->GetType ()) 336 + { 321 337 case MY_VTABLE: 322 338 case MY_TABLE: 323 - table = true; 324 - break; 339 + table = true; 340 + break; 325 341 case MY_VIEW: 326 - view = true; 327 - break; 342 + view = true; 343 + break; 328 344 case MY_COLUMN: 329 - column = true; 330 - break; 345 + column = true; 346 + break; 331 347 case MY_GEOMETRY: 332 - geometry = true; 333 - break; 348 + geometry = true; 349 + break; 334 350 case MY_GEOMETRY_INDEX: 335 - geometry_index = true; 336 - break; 351 + geometry_index = true; 352 + break; 337 353 case MY_GEOMETRY_CACHED: 338 - geometry_cached = true; 339 - break; 354 + geometry_cached = true; 355 + break; 340 356 case MY_INDEX: 341 - index = true; 342 - break; 357 + index = true; 358 + break; 343 359 case MY_TRIGGER: 344 - trigger = true; 345 - break; 346 - }; 347 - if (obj->GetType() == MY_TABLE) 348 - canEdit = true; 349 - CurrentItem = item; 350 - menuItem = new wxMenuItem(menu, Tree_Refresh, wxT("&Refresh")); 351 - menu->Append(menuItem); 352 - if (table == true) 353 - { 354 - wxString title = wxT("Table: \"") + obj->GetName() + wxT("\""); 355 - menu->SetTitle(title); 356 - menu->AppendSeparator(); 357 - menuItem = new wxMenuItem(menu, Tree_NewTable, wxT("Create New &Table")); 358 - menu->Append(menuItem); 359 - menuItem = new wxMenuItem(menu, Tree_NewView, wxT("Create New &View")); 360 - menu->Append(menuItem); 361 - menu->AppendSeparator(); 362 - if (canEdit == true) 363 - { 364 - menuItem = new wxMenuItem(menu, Tree_Edit, wxT("&Edit table rows")); 365 - menu->Append(menuItem); 366 - } else 367 - { 368 - menuItem = new wxMenuItem(menu, Tree_Select, wxT("&Query table")); 369 - menu->Append(menuItem); 370 - } 371 - menuItem = new wxMenuItem(menu, Tree_Show, wxT("&Show columns")); 372 - menu->Append(menuItem); 373 - menuItem = 374 - new wxMenuItem(menu, Tree_ShowSql, wxT("&Show CREATE statement")); 375 - menu->Append(menuItem); 376 - menu->AppendSeparator(); 377 - menuItem = new wxMenuItem(menu, Tree_NewColumn, wxT("Add New &Column")); 378 - menu->Append(menuItem); 379 - menuItem = new wxMenuItem(menu, Tree_Rename, wxT("&Rename table")); 380 - menu->Append(menuItem); 381 - menuItem = new wxMenuItem(menu, Tree_Drop, wxT("&Drop table")); 382 - menu->Append(menuItem); 383 - menu->AppendSeparator(); 384 - menuItem = new wxMenuItem(menu, Tree_NewIndex, wxT("Create New &Index")); 385 - menu->Append(menuItem); 386 - menuItem = 387 - new wxMenuItem(menu, Tree_NewTrigger, wxT("Create New &Trigger")); 388 - menu->Append(menuItem); 389 - menu->AppendSeparator(); 390 - menuItem = 391 - new wxMenuItem(menu, Tree_DumpTxtTab, wxT("Export as &Txt/Tab")); 392 - menu->Append(menuItem); 393 - menuItem = new wxMenuItem(menu, Tree_DumpCsv, wxT("Export as &CSV")); 394 - menu->Append(menuItem); 395 - menuItem = new wxMenuItem(menu, Tree_DumpHtml, wxT("Export as &HTML")); 396 - menu->Append(menuItem); 397 - } 398 - if (view == true) 399 - { 400 - wxString title = wxT("View: \"") + obj->GetName() + wxT("\""); 401 - menu->SetTitle(title); 402 - menu->AppendSeparator(); 403 - menuItem = new wxMenuItem(menu, Tree_NewTable, wxT("Create New &Table")); 404 - menu->Append(menuItem); 405 - menuItem = new wxMenuItem(menu, Tree_NewView, wxT("Create New &View")); 406 - menu->Append(menuItem); 407 - menu->AppendSeparator(); 408 - menuItem = new wxMenuItem(menu, Tree_Select, wxT("&Query view")); 409 - menu->Append(menuItem); 410 - menuItem = new wxMenuItem(menu, Tree_Show, wxT("&Show columns")); 411 - menu->Append(menuItem); 412 - menuItem = 413 - new wxMenuItem(menu, Tree_ShowSql, wxT("&Show CREATE statement")); 414 - menu->Append(menuItem); 415 - menu->AppendSeparator(); 416 - menuItem = new wxMenuItem(menu, Tree_Drop, wxT("&Drop view")); 417 - menu->Append(menuItem); 418 - menu->AppendSeparator(); 419 - menuItem = 420 - new wxMenuItem(menu, Tree_DumpTxtTab, wxT("Export as &Txt/Tab")); 421 - menu->Append(menuItem); 422 - menuItem = new wxMenuItem(menu, Tree_DumpCsv, wxT("Export as &CSV")); 423 - menu->Append(menuItem); 424 - menuItem = new wxMenuItem(menu, Tree_DumpHtml, wxT("Export as &HTML")); 425 - menu->Append(menuItem); 426 - } 427 - if (column == true) 428 - { 429 - wxString title = 430 - wxT("Column: \"") + obj->GetName() + wxT("\".\"") + obj->GetColumn() + 431 - wxT("\""); 432 - menu->SetTitle(title); 433 - menuItem = 434 - new wxMenuItem(menu, Tree_CheckGeometry, wxT("&Check geometries")); 435 - menu->Append(menuItem); 436 - menuItem = new wxMenuItem(menu, Tree_SetSrid, wxT("&Set SRID")); 437 - menu->Append(menuItem); 438 - if (metadata == true) 439 - { 440 - menu->AppendSeparator(); 441 - menuItem = 442 - new wxMenuItem(menu, Tree_Recover, wxT("&Recover geometry column")); 443 - menu->Append(menuItem); 444 - } 445 - } 446 - if (geometry == true) 447 - { 448 - wxString title = 449 - wxT("Column: \"") + obj->GetName() + wxT("\".\"") + obj->GetColumn() + 450 - wxT("\""); 451 - menu->SetTitle(title); 452 - menuItem = new wxMenuItem(menu, Tree_Show, wxT("&Show Spatial Metadata")); 453 - menu->Append(menuItem); 454 - menuItem = 455 - new wxMenuItem(menu, Tree_CheckGeometry, wxT("&Check geometries")); 456 - menu->Append(menuItem); 457 - menu->AppendSeparator(); 458 - menuItem = 459 - new wxMenuItem(menu, Tree_SpatialIndex, wxT("&Build Spatial Index")); 460 - menuItem->SetBitmap(wxBitmap(spatialidx_xpm)); 461 - menu->Append(menuItem); 462 - menuItem = new wxMenuItem(menu, Tree_MbrCache, wxT("Build &MBR cache")); 463 - menuItem->SetBitmap(wxBitmap(mbrcache_xpm)); 464 - menu->Append(menuItem); 465 - menu->AppendSeparator(); 466 - menuItem = 467 - new wxMenuItem(menu, Tree_RebuildTriggers, 468 - wxT("Rebuild Geometry &Triggers")); 469 - menu->Append(menuItem); 470 - menu->AppendSeparator(); 471 - menuItem = 472 - new wxMenuItem(menu, Tree_DumpShp, wxT("Export as &Shapefile")); 473 - menuItem->SetBitmap(wxBitmap(dumpshp_xpm)); 474 - menu->Append(menuItem); 475 - } 476 - if (geometry_index == true) 477 - { 478 - wxString title = 479 - wxT("Column: \"") + obj->GetName() + wxT("\".\"") + obj->GetColumn() + 480 - wxT("\""); 481 - menu->SetTitle(title); 482 - menuItem = new wxMenuItem(menu, Tree_Show, wxT("&Show Spatial Metadata")); 483 - menu->Append(menuItem); 484 - menuItem = 485 - new wxMenuItem(menu, Tree_CheckGeometry, wxT("&Check geometries")); 486 - menu->Append(menuItem); 487 - menu->AppendSeparator(); 488 - menuItem = 489 - new wxMenuItem(menu, Tree_SpatialIndex, wxT("&Remove Spatial Index")); 490 - menuItem->SetBitmap(wxBitmap(kill_spindex_xpm)); 491 - menu->Append(menuItem); 492 - menu->AppendSeparator(); 493 - menuItem = 494 - new wxMenuItem(menu, Tree_RebuildTriggers, 495 - wxT("Rebuild Geometry &Triggers")); 496 - menu->Append(menuItem); 497 - menu->AppendSeparator(); 498 - menuItem = 499 - new wxMenuItem(menu, Tree_DumpShp, wxT("Export as &Shapefile")); 500 - menuItem->SetBitmap(wxBitmap(dumpshp_xpm)); 501 - menu->Append(menuItem); 502 - } 503 - if (geometry_cached == true) 504 - { 505 - wxString title = 506 - wxT("Column: \"") + obj->GetName() + wxT("\".\"") + obj->GetColumn() + 507 - wxT("\""); 508 - menu->SetTitle(title); 509 - menuItem = new wxMenuItem(menu, Tree_Show, wxT("&Show Spatial Metadata")); 510 - menu->Append(menuItem); 511 - menuItem = 512 - new wxMenuItem(menu, Tree_CheckGeometry, wxT("&Check geometries")); 513 - menu->Append(menuItem); 514 - menu->AppendSeparator(); 515 - menuItem = new wxMenuItem(menu, Tree_MbrCache, wxT("&Remove MBR cache")); 516 - menuItem->SetBitmap(wxBitmap(kill_spindex_xpm)); 517 - menu->Append(menuItem); 518 - menu->AppendSeparator(); 519 - menuItem = 520 - new wxMenuItem(menu, Tree_RebuildTriggers, 521 - wxT("Rebuild Geometry &Triggers")); 522 - menu->Append(menuItem); 523 - menu->AppendSeparator(); 524 - menuItem = 525 - new wxMenuItem(menu, Tree_DumpShp, wxT("Export as &Shapefile")); 526 - menuItem->SetBitmap(wxBitmap(dumpshp_xpm)); 527 - menu->Append(menuItem); 528 - } 529 - if (index == true) 530 - { 531 - wxString title = wxT("Index: \"") + obj->GetName() + wxT("\""); 532 - menu->SetTitle(title); 533 - menu->AppendSeparator(); 534 - menuItem = new wxMenuItem(menu, Tree_Show, wxT("&Show index")); 535 - menu->Append(menuItem); 536 - menu->AppendSeparator(); 537 - menuItem = new wxMenuItem(menu, Tree_Drop, wxT("&Drop index")); 538 - menu->Append(menuItem); 539 - } 540 - if (trigger == true) 541 - { 542 - wxString title = wxT("Trigger: \"") + obj->GetName() + wxT("\""); 543 - menu->SetTitle(title); 544 - menu->AppendSeparator(); 545 - menuItem = new wxMenuItem(menu, Tree_Show, wxT("&Show trigger")); 546 - menu->Append(menuItem); 547 - menu->AppendSeparator(); 548 - menuItem = new wxMenuItem(menu, Tree_Drop, wxT("&Drop trigger")); 549 - menu->Append(menuItem); 550 - } 551 - PopupMenu(menu, pt); 552 -} 553 - 554 -void MyTableTree::OnCmdNewTable(wxCommandEvent & event) 360 + trigger = true; 361 + break; 362 + }; 363 + if (obj->GetType () == MY_TABLE) 364 + canEdit = true; 365 + CurrentItem = item; 366 + menuItem = new wxMenuItem (&menu, Tree_Refresh, wxT ("&Refresh")); 367 + menu.Append (menuItem); 368 + if (table == true) 369 + { 370 + wxString title = wxT ("Table: ") + obj->GetName (); 371 + menu.SetTitle (title); 372 + menu.AppendSeparator (); 373 + menuItem = 374 + new wxMenuItem (&menu, Tree_NewTable, wxT ("Create New &Table")); 375 + menu.Append (menuItem); 376 + menuItem = 377 + new wxMenuItem (&menu, Tree_NewView, wxT ("Create New &View")); 378 + menu.Append (menuItem); 379 + menu.AppendSeparator (); 380 + if (canEdit == true) 381 + { 382 + menuItem = 383 + new wxMenuItem (&menu, Tree_Edit, wxT ("&Edit table rows")); 384 + menu.Append (menuItem); 385 + } 386 + else 387 + { 388 + menuItem = 389 + new wxMenuItem (&menu, Tree_Select, wxT ("&Query table")); 390 + menu.Append (menuItem); 391 + } 392 + menuItem = new wxMenuItem (&menu, Tree_Show, wxT ("&Show columns")); 393 + menu.Append (menuItem); 394 + menuItem = 395 + new wxMenuItem (&menu, Tree_ShowSql, 396 + wxT ("&Show CREATE statement")); 397 + menu.Append (menuItem); 398 + menu.AppendSeparator (); 399 + menuItem = 400 + new wxMenuItem (&menu, Tree_NewColumn, wxT ("Add New &Column")); 401 + menu.Append (menuItem); 402 + menuItem = new wxMenuItem (&menu, Tree_Rename, wxT ("&Rename table")); 403 + menu.Append (menuItem); 404 + menuItem = new wxMenuItem (&menu, Tree_Drop, wxT ("&Drop table")); 405 + menu.Append (menuItem); 406 + menu.AppendSeparator (); 407 + menuItem = 408 + new wxMenuItem (&menu, Tree_NewIndex, wxT ("Create New &Index")); 409 + menu.Append (menuItem); 410 + menuItem = 411 + new wxMenuItem (&menu, Tree_NewTrigger, 412 + wxT ("Create New &Trigger")); 413 + menu.Append (menuItem); 414 + menu.AppendSeparator (); 415 + menuItem = 416 + new wxMenuItem (&menu, Tree_DumpTxtTab, 417 + wxT ("Export as &Txt/Tab")); 418 + menu.Append (menuItem); 419 + menuItem = 420 + new wxMenuItem (&menu, Tree_DumpCsv, wxT ("Export as &CSV")); 421 + menu.Append (menuItem); 422 + menuItem = 423 + new wxMenuItem (&menu, Tree_DumpHtml, wxT ("Export as &HTML")); 424 + menu.Append (menuItem); 425 + } 426 + if (view == true) 427 + { 428 + wxString title = wxT ("View: ") + obj->GetName (); 429 + menu.SetTitle (title); 430 + menu.AppendSeparator (); 431 + menuItem = 432 + new wxMenuItem (&menu, Tree_NewTable, wxT ("Create New &Table")); 433 + menu.Append (menuItem); 434 + menuItem = 435 + new wxMenuItem (&menu, Tree_NewView, wxT ("Create New &View")); 436 + menu.Append (menuItem); 437 + menu.AppendSeparator (); 438 + menuItem = new wxMenuItem (&menu, Tree_Select, wxT ("&Query view")); 439 + menu.Append (menuItem); 440 + menuItem = new wxMenuItem (&menu, Tree_Show, wxT ("&Show columns")); 441 + menu.Append (menuItem); 442 + menuItem = 443 + new wxMenuItem (&menu, Tree_ShowSql, 444 + wxT ("&Show CREATE statement")); 445 + menu.Append (menuItem); 446 + menu.AppendSeparator (); 447 + menuItem = new wxMenuItem (&menu, Tree_Drop, wxT ("&Drop view")); 448 + menu.Append (menuItem); 449 + menu.AppendSeparator (); 450 + menuItem = 451 + new wxMenuItem (&menu, Tree_DumpTxtTab, 452 + wxT ("Export as &Txt/Tab")); 453 + menu.Append (menuItem); 454 + menuItem = 455 + new wxMenuItem (&menu, Tree_DumpCsv, wxT ("Export as &CSV")); 456 + menu.Append (menuItem); 457 + menuItem = 458 + new wxMenuItem (&menu, Tree_DumpHtml, wxT ("Export as &HTML")); 459 + menu.Append (menuItem); 460 + } 461 + if (column == true) 462 + { 463 + wxString title = 464 + wxT ("Column: ") + obj->GetName () + wxT (".") + 465 + obj->GetColumn (); 466 + menu.SetTitle (title); 467 + menuItem = 468 + new wxMenuItem (&menu, Tree_CheckGeometry, 469 + wxT ("&Check geometries")); 470 + menu.Append (menuItem); 471 + menuItem = new wxMenuItem (&menu, Tree_SetSrid, wxT ("&Set SRID")); 472 + menu.Append (menuItem); 473 + if (metadata == true) 474 + { 475 + menu.AppendSeparator (); 476 + menuItem = 477 + new wxMenuItem (&menu, Tree_Recover, 478 + wxT ("&Recover geometry column")); 479 + menu.Append (menuItem); 480 + } 481 + } 482 + if (geometry == true) 483 + { 484 + wxString title = 485 + wxT ("Column: ") + obj->GetName () + wxT (".") + 486 + obj->GetColumn (); 487 + menu.SetTitle (title); 488 + menuItem = 489 + new wxMenuItem (&menu, Tree_Show, wxT ("&Show Spatial Metadata")); 490 + menu.Append (menuItem); 491 + menuItem = 492 + new wxMenuItem (&menu, Tree_CheckGeometry, 493 + wxT ("&Check geometries")); 494 + menu.Append (menuItem); 495 + menu.AppendSeparator (); 496 + menuItem = 497 + new wxMenuItem (&menu, Tree_SpatialIndex, 498 + wxT ("&Build Spatial Index")); 499 + menu.Append (menuItem); 500 + menuItem = 501 + new wxMenuItem (&menu, Tree_MbrCache, wxT ("Build &MBR cache")); 502 + menu.Append (menuItem); 503 + menu.AppendSeparator (); 504 + menuItem = 505 + new wxMenuItem (&menu, Tree_DumpShp, 506 + wxT ("Export as &Shapefile")); 507 + menu.Append (menuItem); 508 + } 509 + if (geometry_index == true) 510 + { 511 + wxString title = 512 + wxT ("Column: ") + obj->GetName () + wxT (".") + 513 + obj->GetColumn (); 514 + menu.SetTitle (title); 515 + menuItem = 516 + new wxMenuItem (&menu, Tree_Show, wxT ("&Show Spatial Metadata")); 517 + menu.Append (menuItem); 518 + menuItem = 519 + new wxMenuItem (&menu, Tree_CheckGeometry, 520 + wxT ("&Check geometries")); 521 + menu.Append (menuItem); 522 + menu.AppendSeparator (); 523 + menuItem = 524 + new wxMenuItem (&menu, Tree_SpatialIndex, 525 + wxT ("&Remove Spatial Index")); 526 + menu.Append (menuItem); 527 + menu.AppendSeparator (); 528 + menuItem = 529 + new wxMenuItem (&menu, Tree_DumpShp, 530 + wxT ("Export as &Shapefile")); 531 + menu.Append (menuItem); 532 + } 533 + if (geometry_cached == true) 534 + { 535 + wxString title = 536 + wxT ("Column: ") + obj->GetName () + wxT (".") + 537 + obj->GetColumn (); 538 + menu.SetTitle (title); 539 + menuItem = 540 + new wxMenuItem (&menu, Tree_Show, wxT ("&Show Spatial Metadata")); 541 + menu.Append (menuItem); 542 + menuItem = 543 + new wxMenuItem (&menu, Tree_CheckGeometry, 544 + wxT ("&Check geometries")); 545 + menu.Append (menuItem); 546 + menu.AppendSeparator (); 547 + menuItem = 548 + new wxMenuItem (&menu, Tree_MbrCache, wxT ("&Remove MBR cache")); 549 + menu.Append (menuItem); 550 + menu.AppendSeparator (); 551 + menuItem = 552 + new wxMenuItem (&menu, Tree_DumpShp, 553 + wxT ("Export as &Shapefile")); 554 + menu.Append (menuItem); 555 + } 556 + if (index == true) 557 + { 558 + wxString title = wxT ("Index: ") + obj->GetName (); 559 + menu.SetTitle (title); 560 + menu.AppendSeparator (); 561 + menuItem = new wxMenuItem (&menu, Tree_Show, wxT ("&Show index")); 562 + menu.Append (menuItem); 563 + menu.AppendSeparator (); 564 + menuItem = new wxMenuItem (&menu, Tree_Drop, wxT ("&Drop index")); 565 + menu.Append (menuItem); 566 + } 567 + if (trigger == true) 568 + { 569 + wxString title = wxT ("Trigger: ") + obj->GetName (); 570 + menu.SetTitle (title); 571 + menu.AppendSeparator (); 572 + menuItem = new wxMenuItem (&menu, Tree_Show, wxT ("&Show trigger")); 573 + menu.Append (menuItem); 574 + menu.AppendSeparator (); 575 + menuItem = new wxMenuItem (&menu, Tree_Drop, wxT ("&Drop trigger")); 576 + menu.Append (menuItem); 577 + } 578 + PopupMenu (&menu, pt); 579 +} 580 + 581 +void 582 +MyTableTree::OnCmdNewTable (wxCommandEvent & event) 555 583 { 556 584 // 557 585 // menu event - new table creation required 558 586 // 559 - wxString sql; 560 - sql = wxT("CREATE TABLE ...table-name... (\n"); 561 - sql += wxT("...column1,\n...column2,\n...columnN)"); 562 - MainFrame->SetSql(sql, false); 587 + wxString sql; 588 + sql = wxT ("CREATE TABLE ...table-name... (\n"); 589 + sql += wxT ("...column1,\n...column2,\n...columnN)"); 590 + MainFrame->SetSql (sql, false); 563 591 } 564 592 565 -void MyTableTree::OnCmdNewView(wxCommandEvent & event) 593 +void 594 +MyTableTree::OnCmdNewView (wxCommandEvent & event) 566 595 { 567 596 // 568 597 // menu event - new view creation required 569 598 // 570 - wxString sql; 571 - sql = wxT("CREATE VIEW ...view-name... AS\n"); 572 - sql += wxT("SELECT ...sql-select-statement..."); 573 - MainFrame->SetSql(sql, false); 599 + wxString sql; 600 + sql = wxT ("CREATE VIEW ...view-name... AS\n"); 601 + sql += wxT ("SELECT ...sql-select-statement..."); 602 + MainFrame->SetSql (sql, false); 574 603 } 575 604 576 -void MyTableTree::OnCmdNewIndex(wxCommandEvent & event) 605 +void 606 +MyTableTree::OnCmdNewIndex (wxCommandEvent & event) 577 607 { 578 608 // 579 609 // menu event - new index creation required 580 610 // 581 - wxString sql; 582 - MyObject *obj = (MyObject *) GetItemData(CurrentItem); 583 - if (obj == NULL) 584 - return; 585 - if (obj->GetType() == MY_TABLE) 586 - { 587 - sql = wxT("CREATE [ UNIQUE ] INDEX ...index-name...\nON "); 588 - sql += obj->GetName(); 589 - sql += wxT("\n(\n...column1, column2, columnN...\n)"); 590 - MainFrame->SetSql(sql, false); 591 - } 592 -} 593 - 594 -void MyTableTree::OnCmdNewTrigger(wxCommandEvent & event) 595 -{ 596 -// 597 -// menu event - new trigger creation required 598 -// 599 - wxString sql; 600 - MyObject *obj = (MyObject *) GetItemData(CurrentItem); 601 - if (obj == NULL) 602 - return; 603 - if (obj->GetType() == MY_TABLE) 604 - { 605 - sql = wxT("CREATE TRIGGER ...trigger-name...\n[ BEFORE | AFTER ]\n"); 606 - sql += wxT("[ INSERT | UPDATE | DELETE ]\nON "); 607 - sql += obj->GetName(); 608 - sql += wxT("\n...sql-statement..."); 609 - MainFrame->SetSql(sql, false); 610 - } 611 -} 612 - 613 -void MyTableTree::OnCmdNewColumn(wxCommandEvent & event) 611 + wxString sql; 612 + MyObject *obj = (MyObject *) GetItemData (CurrentItem); 613 + if (obj == NULL) 614 + return; 615 + if (obj->GetType () == MY_TABLE) 616 + { 617 + sql = wxT ("CREATE [ UNIQUE ] INDEX ...index-name...\nON "); 618 + sql += obj->GetName (); 619 + sql += wxT ("\n(\n...column1, column2, columnN...\n)"); 620 + MainFrame->SetSql (sql, false); 621 + } 622 +} 623 + 624 +void 625 +MyTableTree::OnCmdNewTrigger (wxCommandEvent & event) 626 +{ 627 +// 628 +// menu event - new trigger creation required 629 +// 630 + wxString sql; 631 + MyObject *obj = (MyObject *) GetItemData (CurrentItem); 632 + if (obj == NULL) 633 + return; 634 + if (obj->GetType () == MY_TABLE) 635 + { 636 + sql = wxT ("CREATE TRIGGER ...trigger-name...\n[ BEFORE | AFTER ]\n"); 637 + sql += wxT ("[ INSERT | UPDATE | DELETE ]\nON "); 638 + sql += obj->GetName (); 639 + sql += wxT ("\n...sql-statement..."); 640 + MainFrame->SetSql (sql, false); 641 + } 642 +} 643 + 644 +void 645 +MyTableTree::OnCmdNewColumn (wxCommandEvent & event) 614 646 { 615 647 // 616 648 // menu event - new column creation required 617 649 // 618 - wxString sql; 619 - MyObject *obj = (MyObject *) GetItemData(CurrentItem); 620 - if (obj == NULL) 621 - return; 622 - if (obj->GetType() == MY_TABLE) 623 - { 624 - sql = wxT("ALTER TABLE \""); 625 - sql += obj->GetName(); 626 - sql += wxT("\"\nADD COLUMN ...column-name column-type..."); 627 - MainFrame->SetSql(sql, false); 628 - } 650 + wxString sql; 651 + MyObject *obj = (MyObject *) GetItemData (CurrentItem); 652 + if (obj == NULL) 653 + return; 654 + if (obj->GetType () == MY_TABLE) 655 + { 656 + sql = wxT ("ALTER TABLE "); 657 + sql += obj->GetName (); 658 + sql += wxT ("\nADD COLUMN ...column-name column-type..."); 659 + MainFrame->SetSql (sql, false); 660 + } 629 661 } 630 662 631 -void MyTableTree::OnCmdSelect(wxCommandEvent & event) 663 +void 664 +MyTableTree::OnCmdSelect (wxCommandEvent & event) 632 665 { 633 666 // 634 667 // menu event - examining table rows required 635 668 // 636 - wxString sql; 637 - MyObject *obj = (MyObject *) GetItemData(CurrentItem); 638 - if (obj == NULL) 639 - return; 640 - sql = wxT("SELECT * FROM \""); 641 - sql += obj->GetName() + wxT("\""); 642 - MainFrame->SetSql(sql, true); 669 + wxString sql; 670 + MyObject *obj = (MyObject *) GetItemData (CurrentItem); 671 + if (obj == NULL) 672 + return; 673 + sql = wxT ("SELECT * FROM "); 674 + sql += obj->GetName (); 675 + MainFrame->SetSql (sql, true); 643 676 } 644 677 645 -void MyTableTree::OnCmdShow(wxCommandEvent & event) 678 +void 679 +MyTableTree::OnCmdShow (wxCommandEvent & event) 646 680 { 647 681 // 648 682 // menu event - examining full infos required 649 683 // 650 - wxString sql; 651 - MyObject *obj = (MyObject *) GetItemData(CurrentItem); 652 - if (obj == NULL) 653 - return; 654 - if (obj->GetType() == MY_TABLE || obj->GetType() == MY_VTABLE 655 - || obj->GetType() == MY_VIEW) 656 - { 657 - sql = wxT("PRAGMA table_info(\""); 658 - sql += obj->GetName(); 659 - sql += wxT("\")"); 660 - } 661 - if (obj->GetType() == MY_GEOMETRY || obj->GetType() == MY_GEOMETRY_INDEX 662 - || obj->GetType() == MY_GEOMETRY_CACHED) 663 - { 664 - sql = wxT("SELECT * FROM geom_cols_ref_sys\n"); 665 - sql += wxT("WHERE f_table_name = '"); 666 - sql += obj->GetName(); 667 - sql += wxT("'\nAND f_geometry_column = '"); 668 - sql += obj->GetColumn(); 669 - sql += wxT("'"); 670 - } 671 - if (obj->GetType() == MY_INDEX) 672 - { 673 - sql = wxT("PRAGMA index_info(\""); 674 - sql += obj->GetName(); 675 - sql += wxT("\")"); 676 - } 677 - if (obj->GetType() == MY_TRIGGER) 678 - { 679 - sql = 680 - wxT 681 - ("SELECT sql FROM sqlite_master\nWHERE type = 'trigger' AND name = '"); 682 - sql += obj->GetName(); 683 - sql += wxT("'"); 684 - } 685 - if (sql.Len() < 1) 686 - return; 687 - MainFrame->SetSql(sql, true); 688 -} 689 - 690 -void MyTableTree::OnCmdDrop(wxCommandEvent & event) 684 + wxString sql; 685 + MyObject *obj = (MyObject *) GetItemData (CurrentItem); 686 + if (obj == NULL) 687 + return; 688 + if (obj->GetType () == MY_TABLE || obj->GetType () == MY_VTABLE 689 + || obj->GetType () == MY_VIEW) 690 + { 691 + sql = wxT ("PRAGMA table_info("); 692 + sql += obj->GetName (); 693 + sql += wxT (")"); 694 + } 695 + if (obj->GetType () == MY_GEOMETRY || obj->GetType () == MY_GEOMETRY_INDEX 696 + || obj->GetType () == MY_GEOMETRY_CACHED) 697 + { 698 + sql = wxT ("SELECT * FROM geom_cols_ref_sys\n"); 699 + sql += wxT ("WHERE f_table_name = '"); 700 + sql += obj->GetName (); 701 + sql += wxT ("'\nAND f_geometry_column = '"); 702 + sql += obj->GetColumn (); 703 + sql += wxT ("'"); 704 + } 705 + if (obj->GetType () == MY_INDEX) 706 + { 707 + sql = wxT ("PRAGMA index_info("); 708 + sql += obj->GetName (); 709 + sql += wxT (")"); 710 + } 711 + if (obj->GetType () == MY_TRIGGER) 712 + { 713 + sql = 714 + wxT 715 + ("SELECT sql FROM sqlite_master\nWHERE type = 'trigger' AND name = '"); 716 + sql += obj->GetName (); 717 + sql += wxT ("'"); 718 + } 719 + if (sql.Len () < 1) 720 + return; 721 + MainFrame->SetSql (sql, true); 722 +} 723 + 724 +void 725 +MyTableTree::OnCmdDrop (wxCommandEvent & event) 691 726 { 692 727 // 693 728 // menu event - dropping some object required 694 729 // 695 - wxString sql; 696 - wxString msg; 697 - char *errMsg = NULL; 698 - int ret; 699 - sqlite3 *sqlite = MainFrame->GetSqlite(); 700 - MyObject *obj = (MyObject *) GetItemData(CurrentItem); 701 - if (obj == NULL) 702 - return; 703 - if (obj->GetType() == MY_TABLE || obj->GetType() == MY_VTABLE) 704 - { 705 - bool metadata = MainFrame->CheckMetadata(); 706 - if (metadata == true) 707 - { 708 - // SpatialMetadata exists; we must check for geometry_columns and SpatialIndices as well 709 - char *errMsg = NULL; 710 - int ret; 711 - int i; 712 - char **results; 713 - int rows; 714 - int columns; 715 - sqlite3 *sqlite = MainFrame->GetSqlite(); 716 - sql = wxT("SELECT f_geometry_column, spatial_index_enabled "); 717 - sql += wxT("FROM geometry_columns WHERE f_table_name = '"); 718 - sql += obj->GetName(); 719 - sql += wxT("'"); 720 - ret = 721 - sqlite3_get_table(sqlite, sql.ToUTF8(), &results, &rows, &columns, 722 - &errMsg); 723 - if (ret != SQLITE_OK) 724 - { 725 - wxMessageBox(wxT("SQLite SQL error: ") + 726 - wxString::FromUTF8(errMsg), wxT("spatialite-gui"), 727 - wxOK | wxICON_ERROR, this); 728 - sqlite3_free(errMsg); 729 - return; 730 - } 731 - sql = wxT("BEGIN; "); 732 - if (rows < 1) 733 - ; 734 - else 735 - { 736 - for (i = 1; i <= rows; i++) 737 - { 738 - if (results[(i * columns) + 0]) 739 - { 740 - const char *column = results[(i * columns) + 0]; 741 - wxString geo_column = wxString::FromUTF8(column); 742 - if (atoi(results[(i * columns) + 1])) 743 - { 744 - // dropping the SpatialIndex 745 - sql += wxT("DROP TABLE IF EXISTS \"idx_"); 746 - sql += obj->GetName(); 747 - sql += wxT("_"); 748 - sql += geo_column; 749 - sql += wxT("\"; "); 750 - // dropping the MBR cache 751 - sql += wxT("DROP TABLE IF EXISTS \"cache_"); 752 - sql += obj->GetName(); 753 - sql += wxT("_"); 754 - sql += geo_column; 755 - sql += wxT("\"; "); 756 - } 757 - // deleting from geometry_columns 758 - sql += 759 - wxT 760 - ("DELETE FROM geometry_columns\n WHERE f_table_name = '"); 761 - sql += obj->GetName(); 762 - sql += wxT("'\n AND f_geometry_column = '"); 763 - sql += geo_column; 764 - sql += wxT("'; "); 765 - } 766 - } 767 - } 768 - sqlite3_free_table(results); 769 - sql += wxT("DROP TABLE IF EXISTS \""); 770 - sql += obj->GetName(); 771 - sql += wxT("\"; COMMIT;"); 772 - } else 773 - { 774 - // there are no SpatialMetadata at all; we'll simply try to drop the table 775 - sql = wxT("BEGIN; "); 776 - sql += wxT("DROP TABLE IF EXISTS \""); 777 - sql += obj->GetName(); 778 - sql += wxT("\"; COMMIT;"); 779 - } 780 - msg = wxT("Do you really intend to drop the Table named: \""); 781 - msg += obj->GetName(); 782 - msg += wxT("\"\n[and any other related object] ?"); 783 - } 784 - if (obj->GetType() == MY_VIEW) 785 - { 786 - msg = wxT("Do you really intend to drop the View named: \""); 787 - msg += obj->GetName(); 788 - msg += wxT("\" ?"); 789 - sql = wxT("BEGIN; DROP VIEW IF EXISTS \""); 790 - sql += obj->GetName(); 791 - sql += wxT("\"; COMMIT;"); 792 - } 793 - if (obj->GetType() == MY_INDEX) 794 - { 795 - sql = wxT("BEGIN; DROP INDEX IF EXISTS \""); 796 - sql += obj->GetName(); 797 - sql += wxT("\"; COMMIT;"); 798 - } 799 - if (obj->GetType() == MY_TRIGGER) 800 - { 801 - msg = wxT("Do you really intend to drop the Index named: \""); 802 - msg += obj->GetName(); 803 - msg += wxT("\" ?"); 804 - sql = wxT("BEGIN; DROP TRIGGER IF EXISTS \""); 805 - sql += obj->GetName(); 806 - sql += wxT("\"; COMMIT;"); 807 - } 808 - if (sql.Len() < 1) 730 + wxString sql; 731 + wxString msg; 732 + char *errMsg = NULL; 733 + int ret; 734 + sqlite3 *sqlite = MainFrame->GetSqlite (); 735 + MyObject *obj = (MyObject *) GetItemData (CurrentItem); 736 + if (obj == NULL) 737 + return; 738 + if (obj->GetType () == MY_TABLE || obj->GetType () == MY_VTABLE) 739 + { 740 + bool metadata = MainFrame->CheckMetadata (); 741 + if (metadata == true) 742 + { 743 + // SpatialMetadata exists; we must check for geometry_columns and SpatialIndices as well 744 + char *errMsg = NULL; 745 + int ret; 746 + int i; 747 + char **results; 748 + int rows; 749 + int columns; 750 + sqlite3 *sqlite = MainFrame->GetSqlite (); 751 + sql = wxT ("SELECT f_geometry_column, spatial_index_enabled "); 752 + sql += wxT ("FROM geometry_columns WHERE f_table_name = '"); 753 + sql += obj->GetName (); 754 + sql += wxT ("'"); 755 + ret = sqlite3_get_table (sqlite, sql.ToUTF8 (), &results, 756 + &rows, &columns, &errMsg); 757 + if (ret != SQLITE_OK) 758 + { 759 + wxMessageBox (wxT ("SQLite SQL error: ") + 760 + wxString::FromUTF8 (errMsg), 761 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 762 + this); 763 + sqlite3_free (errMsg); 764 + return; 765 + } 766 + sql = wxT ("BEGIN; "); 767 + if (rows < 1) 768 + ; 769 + else 770 + { 771 + for (i = 1; i <= rows; i++) 772 + { 773 + if (results[(i * columns) + 0]) 774 + { 775 + const char *column = 776 + results[(i * columns) + 0]; 777 + wxString geo_column = 778 + wxString::FromUTF8 (column); 779 + if (atoi (results[(i * columns) + 1])) 780 + { 781 + // dropping the SpatialIndex 782 + sql += 783 + wxT ("DROP TABLE IF EXISTS idx_"); 784 + sql += obj->GetName (); 785 + sql += wxT ("_"); 786 + sql += geo_column; 787 + sql += wxT ("; "); 788 + // dropping the MBR cache 789 + sql += 790 + wxT ("DROP TABLE IF EXISTS cache_"); 791 + sql += obj->GetName (); 792 + sql += wxT ("_"); 793 + sql += geo_column; 794 + sql += wxT ("; "); 795 + } 796 + // deleting from geometry_columns 797 + sql += 798 + wxT 799 + ("DELETE FROM geometry_columns\n WHERE f_table_name = '"); 800 + sql += obj->GetName (); 801 + sql += 802 + wxT 803 + ("'\n AND f_geometry_column = '"); 804 + sql += geo_column; 805 + sql += wxT ("'; "); 806 + } 807 + } 808 + } 809 + sqlite3_free_table (results); 810 + sql += wxT ("DROP TABLE IF EXISTS "); 811 + sql += obj->GetName (); 812 + sql += wxT ("; COMMIT;"); 813 + } 814 + else 815 + { 816 + // there are no SpatialMetadata at all; we'll simply try to drop the table 817 + sql = wxT ("BEGIN; "); 818 + sql += wxT ("DROP TABLE IF EXISTS "); 819 + sql += obj->GetName (); 820 + sql += wxT ("; COMMIT;"); 821 + } 822 + msg = wxT ("Do you really intend to drop the Table named: '"); 823 + msg += obj->GetName (); 824 + msg += wxT ("'\n[and any other related object] ?"); 825 + } 826 + if (obj->GetType () == MY_VIEW) 827 + { 828 + msg = wxT ("Do you really intend to drop the View named: '"); 829 + msg += obj->GetName (); 830 + msg += wxT ("' ?"); 831 + sql = wxT ("BEGIN; DROP VIEW IF EXISTS "); 832 + sql += obj->GetName (); 833 + sql += wxT ("; COMMIT;"); 834 + } 835 + if (obj->GetType () == MY_INDEX) 836 + { 837 + sql = wxT ("BEGIN; DROP INDEX IF EXISTS "); 838 + sql += obj->GetName (); 839 + sql += wxT ("; COMMIT;"); 840 + } 841 + if (obj->GetType () == MY_TRIGGER) 842 + { 843 + msg = wxT ("Do you really intend to drop the Index named: '"); 844 + msg += obj->GetName (); 845 + msg += wxT ("' ?"); 846 + sql = wxT ("BEGIN; DROP TRIGGER IF EXISTS "); 847 + sql += obj->GetName (); 848 + sql += wxT ("; COMMIT;"); 849 + } 850 + if (sql.Len () < 1) 851 + return; 852 + wxMessageDialog confirm (this, msg, wxT ("Confirming DROP"), 853 + wxOK | wxCANCEL | wxICON_QUESTION); 854 + ret = confirm.ShowModal (); 855 + if (ret != wxID_OK) 856 + return; 857 + ::wxBeginBusyCursor (); 858 + ret = sqlite3_exec (sqlite, sql.ToUTF8 (), NULL, NULL, &errMsg); 859 + if (ret != SQLITE_OK) 860 + { 861 + wxMessageBox (wxT ("SQLite SQL error: ") + 862 + wxString::FromUTF8 (errMsg), 863 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, this); 864 + sqlite3_free (errMsg); 865 + ::wxEndBusyCursor (); 866 + goto rollback; 867 + } 868 + ::wxEndBusyCursor (); 869 + wxMessageBox (wxT ("Selected object '") + obj->GetName () + 870 + wxT ("' was successfully removed"), 871 + wxT ("spatialite-gui"), wxOK | wxICON_INFORMATION, this); 872 + MainFrame->ClearTableTree (); 873 + MainFrame->InitTableTree (); 809 874 return; 810 - wxMessageDialog confirm(this, msg, wxT("Confirming DROP"), 811 - wxOK | wxCANCEL | wxICON_QUESTION); 812 - ret = confirm.ShowModal(); 813 - if (ret != wxID_OK) 814 - return; 815 - ::wxBeginBusyCursor(); 816 - ret = sqlite3_exec(sqlite, sql.ToUTF8(), NULL, NULL, &errMsg); 817 - if (ret != SQLITE_OK) 818 - { 819 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 820 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 821 - sqlite3_free(errMsg); 822 - ::wxEndBusyCursor(); 823 - goto rollback; 824 - } 825 - ::wxEndBusyCursor(); 826 - wxMessageBox(wxT("Selected object '") + obj->GetName() + 827 - wxT("' was successfully removed"), wxT("spatialite-gui"), 828 - wxOK | wxICON_INFORMATION, this); 829 - MainFrame->InitTableTree(); 830 - return; 831 -rollback: 832 - ret = sqlite3_exec(sqlite, "ROLLBACK", NULL, NULL, &errMsg); 833 - if (ret != SQLITE_OK) 834 - { 835 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 836 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 837 - sqlite3_free(errMsg); 838 - ::wxEndBusyCursor(); 839 - return; 840 - } 841 - ::wxEndBusyCursor(); 842 - wxMessageBox(wxT 843 - ("An error occurred\n\na ROLLBACK was automatically performed"), 844 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 845 -} 846 - 847 -void MyTableTree::OnCmdRename(wxCommandEvent & event) 875 + rollback: 876 + ret = sqlite3_exec (sqlite, "ROLLBACK", NULL, NULL, &errMsg); 877 + if (ret != SQLITE_OK) 878 + { 879 + wxMessageBox (wxT ("SQLite SQL error: ") + 880 + wxString::FromUTF8 (errMsg), wxT ("spatialite-gui"), 881 + wxOK | wxICON_ERROR, this); 882 + sqlite3_free (errMsg); 883 + ::wxEndBusyCursor (); 884 + return; 885 + } 886 + ::wxEndBusyCursor (); 887 + wxMessageBox (wxT 888 + ("An error occurred\n\na ROLLBACK was automatically performed"), 889 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 890 +} 891 + 892 +void 893 +MyTableTree::OnCmdRename (wxCommandEvent & event) 848 894 { 849 895 // 850 896 // menu event - table renaming required 851 897 // 852 - wxString sql; 853 - MyObject *obj = (MyObject *) GetItemData(CurrentItem); 854 - if (obj == NULL) 855 - return; 856 - if (obj->GetType() == MY_TABLE || obj->GetType() == MY_VTABLE) 857 - { 858 - sql = wxT("ALTER TABLE \""); 859 - sql += obj->GetName(); 860 - sql += wxT("\"\nRENAME TO ...new-table-name..."); 861 - MainFrame->SetSql(sql, false); 862 - } 898 + wxString sql; 899 + MyObject *obj = (MyObject *) GetItemData (CurrentItem); 900 + if (obj == NULL) 901 + return; 902 + if (obj->GetType () == MY_TABLE || obj->GetType () == MY_VTABLE) 903 + { 904 + sql = wxT ("ALTER TABLE "); 905 + sql += obj->GetName (); 906 + sql += wxT ("\nRENAME TO ...new-table-name..."); 907 + MainFrame->SetSql (sql, false); 908 + } 863 909 } 864 910 865 -void MyTableTree::OnCmdRefresh(wxCommandEvent & event) 911 +void 912 +MyTableTree::OnCmdRefresh (wxCommandEvent & event) 866 913 { 867 914 // 868 915 // menu event - refreshing the Tree 869 916 // 870 - MainFrame->InitTableTree(); 917 + MainFrame->ClearTableTree (); 918 + MainFrame->InitTableTree (); 871 919 } 872 920 873 -void MyTableTree::OnCmdRecover(wxCommandEvent & event) 921 +void 922 +MyTableTree::OnCmdRecover (wxCommandEvent & event) 874 923 { 875 924 // 876 925 // menu event - Recover Geometry 877 926 // 878 - char *errMsg = NULL; 879 - int ret; 880 - wxString sql; 881 - int i; 882 - char **results; 883 - int rows; 884 - int columns; 885 - int retval = 0; 886 - int srid = -1; 887 - char dummy[128]; 888 - wxString type; 889 - RecoverDialog dlg; 890 - sqlite3 *sqlite = MainFrame->GetSqlite(); 891 - MyObject *obj = (MyObject *) GetItemData(CurrentItem); 892 - if (obj == NULL) 927 + char *errMsg = NULL; 928 + int ret; 929 + wxString sql; 930 + int i; 931 + char **results; 932 + int rows; 933 + int columns; 934 + int retval = 0; 935 + int srid = -1; 936 + wxString strSrid; 937 + wxString type; 938 + RecoverDialog dlg; 939 + sqlite3 *sqlite = MainFrame->GetSqlite (); 940 + MyObject *obj = (MyObject *) GetItemData (CurrentItem); 941 + if (obj == NULL) 942 + return; 943 + if (obj->GetType () == MY_COLUMN) 944 + { 945 + // trying to recover a geometry column 946 + if (MainFrame->CheckMetadata () == false) 947 + { 948 + wxMessageBox (wxT 949 + ("Missing Spatial Metadata tables\n\ntry to run the 'init_spatialite.sql' script ..."), 950 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 951 + this); 952 + return; 953 + } 954 + dlg.Create (MainFrame, obj->GetName (), obj->GetColumn ()); 955 + ret = dlg.ShowModal (); 956 + if (ret == wxID_OK) 957 + { 958 + srid = dlg.GetSrid (); 959 + type = dlg.GetType (); 960 + ::wxBeginBusyCursor (); 961 + ret = sqlite3_exec (sqlite, "BEGIN", NULL, NULL, &errMsg); 962 + if (ret != SQLITE_OK) 963 + { 964 + wxMessageBox (wxT ("SQLite SQL error: ") + 965 + wxString::FromUTF8 (errMsg), 966 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 967 + this); 968 + sqlite3_free (errMsg); 969 + ::wxEndBusyCursor (); 970 + return; 971 + } 972 + sql = wxT ("SELECT RecoverGeometryColumn('"); 973 + sql += obj->GetName (); 974 + sql += wxT ("', '"); 975 + sql += obj->GetColumn (); 976 + strSrid.Printf (wxT ("', %d, '"), srid); 977 + sql += strSrid; 978 + sql += type; 979 + sql += wxT ("', 2)"); 980 + ret = sqlite3_get_table (sqlite, sql.ToUTF8 (), &results, 981 + &rows, &columns, &errMsg); 982 + if (ret != SQLITE_OK) 983 + { 984 + wxMessageBox (wxT ("SQLite SQL error: ") + 985 + wxString::FromUTF8 (errMsg), 986 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 987 + this); 988 + sqlite3_free (errMsg); 989 + goto rollback; 990 + } 991 + if (rows < 1) 992 + ; 993 + else 994 + { 995 + for (i = 1; i <= rows; i++) 996 + { 997 + if (results[(i * columns) + 0]) 998 + retval = atoi (results[(i * columns) + 0]); 999 + } 1000 + } 1001 + sqlite3_free_table (results); 1002 + if (!retval) 1003 + goto rollback; 1004 + ret = sqlite3_exec (sqlite, "COMMIT", NULL, NULL, &errMsg); 1005 + if (ret != SQLITE_OK) 1006 + { 1007 + wxMessageBox (wxT ("SQLite SQL error: ") + 1008 + wxString::FromUTF8 (errMsg), 1009 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 1010 + this); 1011 + sqlite3_free (errMsg); 1012 + ::wxEndBusyCursor (); 1013 + return; 1014 + } 1015 + ::wxEndBusyCursor (); 1016 + wxMessageBox (wxT ("Geometry column '") + obj->GetName () + 1017 + wxT (".") + obj->GetColumn () + 1018 + wxT ("' was successfully recovered"), 1019 + wxT ("spatialite-gui"), wxOK | wxICON_INFORMATION, 1020 + this); 1021 + } 1022 + } 893 1023 return; 894 - if (obj->GetType() == MY_COLUMN) 895 - { 896 - // trying to recover a geometry column 897 - if (MainFrame->CheckMetadata() == false) 898 - { 899 - wxMessageBox(wxT 900 - ("Missing Spatial Metadata tables\n\ntry to run the 'init_spatialite.sql' script ..."), 901 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 902 - return; 903 - } 904 - dlg.Create(MainFrame, obj->GetName(), obj->GetColumn()); 905 - ret = dlg.ShowModal(); 906 - if (ret == wxID_OK) 907 - { 908 - srid = dlg.GetSrid(); 909 - type = dlg.GetType(); 910 - ::wxBeginBusyCursor(); 911 - ret = sqlite3_exec(sqlite, "BEGIN", NULL, NULL, &errMsg); 912 - if (ret != SQLITE_OK) 913 - { 914 - wxMessageBox(wxT("SQLite SQL error: ") + 915 - wxString::FromUTF8(errMsg), wxT("spatialite-gui"), 916 - wxOK | wxICON_ERROR, this); 917 - sqlite3_free(errMsg); 918 - ::wxEndBusyCursor(); 919 - return; 920 - } 921 - sql = wxT("SELECT RecoverGeometryColumn('"); 922 - sql += obj->GetName(); 923 - sql += wxT("', '"); 924 - sql += obj->GetColumn(); 925 - sprintf(dummy, "', %d, '", srid); 926 - sql += wxString::FromUTF8(dummy); 927 - sql += type; 928 - sql += wxT("', 2)"); 929 - ret = 930 - sqlite3_get_table(sqlite, sql.ToUTF8(), &results, &rows, &columns, 931 - &errMsg); 932 - if (ret != SQLITE_OK) 933 - { 934 - wxMessageBox(wxT("SQLite SQL error: ") + 935 - wxString::FromUTF8(errMsg), wxT("spatialite-gui"), 936 - wxOK | wxICON_ERROR, this); 937 - sqlite3_free(errMsg); 938 - goto rollback; 939 - } 940 - if (rows < 1) 941 - ; 942 - else 943 - { 944 - for (i = 1; i <= rows; i++) 945 - { 946 - if (results[(i * columns) + 0]) 947 - retval = atoi(results[(i * columns) + 0]); 948 - } 949 - } 950 - sqlite3_free_table(results); 951 - if (!retval) 952 - goto rollback; 953 - ret = sqlite3_exec(sqlite, "COMMIT", NULL, NULL, &errMsg); 954 - if (ret != SQLITE_OK) 955 - { 956 - wxMessageBox(wxT("SQLite SQL error: ") + 957 - wxString::FromUTF8(errMsg), wxT("spatialite-gui"), 958 - wxOK | wxICON_ERROR, this); 959 - sqlite3_free(errMsg); 960 - ::wxEndBusyCursor(); 961 - return; 962 - } 963 - ::wxEndBusyCursor(); 964 - wxMessageBox(wxT("Geometry column \"") + obj->GetName() + 965 - wxT(".") + obj->GetColumn() + 966 - wxT("\" was successfully recovered"), 967 - wxT("spatialite-gui"), wxOK | wxICON_INFORMATION, this); 968 - } 969 - } 970 - return; 971 -rollback: 972 - ret = sqlite3_exec(sqlite, "ROLLBACK", NULL, NULL, &errMsg); 973 - if (ret != SQLITE_OK) 974 - { 975 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 976 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 977 - sqlite3_free(errMsg); 978 - ::wxEndBusyCursor(); 979 - return; 980 - } 981 - ::wxEndBusyCursor(); 982 - wxMessageBox(wxT 983 - ("Geometry column doesn't satisfies required constraints\n\na ROLLBACK was automatically performed"), 984 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 1024 + rollback: 1025 + ret = sqlite3_exec (sqlite, "ROLLBACK", NULL, NULL, &errMsg); 1026 + if (ret != SQLITE_OK) 1027 + { 1028 + wxMessageBox (wxT ("SQLite SQL error: ") + 1029 + wxString::FromUTF8 (errMsg), wxT ("spatialite-gui"), 1030 + wxOK | wxICON_ERROR, this); 1031 + sqlite3_free (errMsg); 1032 + ::wxEndBusyCursor (); 1033 + return; 1034 + } 1035 + ::wxEndBusyCursor (); 1036 + wxMessageBox (wxT 1037 + ("Geometry column doesn't satisfies required constraints\n\na ROLLBACK was automatically performed"), 1038 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 985 1039 } 986 1040 987 -void MyTableTree::OnCmdShowSql(wxCommandEvent & event) 1041 +void 1042 +MyTableTree::OnCmdShowSql (wxCommandEvent & event) 988 1043 { 989 1044 // 990 1045 // menu event - Showing CREATE TABLE statement 991 1046 // 992 - wxString sql; 993 - MyObject *obj = (MyObject *) GetItemData(CurrentItem); 994 - if (obj == NULL) 995 - return; 996 - if (obj->GetType() == MY_TABLE || obj->GetType() == MY_VTABLE) 997 - { 998 - sql = 999 - wxT("SELECT sql FROM sqlite_master\nWHERE type = 'table' AND name = '"); 1000 - sql += obj->GetName(); 1001 - sql += wxT("'"); 1002 - MainFrame->SetSql(sql, true); 1003 - } 1004 - if (obj->GetType() == MY_VIEW) 1005 - { 1006 - sql = 1007 - wxT("SELECT sql FROM sqlite_master\nWHERE type = 'view' AND name = '"); 1008 - sql += obj->GetName(); 1009 - sql += wxT("'"); 1010 - MainFrame->SetSql(sql, true); 1011 - } 1047 + wxString sql; 1048 + MyObject *obj = (MyObject *) GetItemData (CurrentItem); 1049 + if (obj == NULL) 1050 + return; 1051 + if (obj->GetType () == MY_TABLE || obj->GetType () == MY_VTABLE) 1052 + { 1053 + sql = 1054 + wxT 1055 + ("SELECT sql FROM sqlite_master\nWHERE type = 'table' AND name = '"); 1056 + sql += obj->GetName (); 1057 + sql += wxT ("'"); 1058 + MainFrame->SetSql (sql, true); 1059 + } 1060 + if (obj->GetType () == MY_VIEW) 1061 + { 1062 + sql = 1063 + wxT 1064 + ("SELECT sql FROM sqlite_master\nWHERE type = 'view' AND name = '"); 1065 + sql += obj->GetName (); 1066 + sql += wxT ("'"); 1067 + MainFrame->SetSql (sql, true); 1068 + } 1012 1069 } 1013 1070 1014 -void MyTableTree::OnCmdSpatialIndex(wxCommandEvent & event) 1071 +void 1072 +MyTableTree::OnCmdSpatialIndex (wxCommandEvent & event) 1015 1073 { 1016 1074 // 1017 1075 // menu event - Spatial Index creation-destruction 1018 1076 // 1019 - char *errMsg = NULL; 1020 - int ret; 1021 - wxString sql; 1022 - wxString msg; 1023 - int i; 1024 - char **results; 1025 - int rows; 1026 - int columns; 1027 - int retval = 0; 1028 - sqlite3 *sqlite = MainFrame->GetSqlite(); 1029 - MyObject *obj = (MyObject *) GetItemData(CurrentItem); 1030 - if (obj == NULL) 1077 + char *errMsg = NULL; 1078 + int ret; 1079 + wxString sql; 1080 + wxString msg; 1081 + int i; 1082 + char **results; 1083 + int rows; 1084 + int columns; 1085 + int retval = 0; 1086 + sqlite3 *sqlite = MainFrame->GetSqlite (); 1087 + MyObject *obj = (MyObject *) GetItemData (CurrentItem); 1088 + if (obj == NULL) 1089 + return; 1090 + if (obj->GetType () == MY_GEOMETRY) 1091 + { 1092 + // creating the Spatial Index 1093 + ::wxBeginBusyCursor (); 1094 + ret = sqlite3_exec (sqlite, "BEGIN", NULL, NULL, &errMsg); 1095 + if (ret != SQLITE_OK) 1096 + { 1097 + wxMessageBox (wxT ("SQLite SQL error: ") + 1098 + wxString::FromUTF8 (errMsg), 1099 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 1100 + this); 1101 + sqlite3_free (errMsg); 1102 + ::wxEndBusyCursor (); 1103 + return; 1104 + } 1105 + sql = wxT ("SELECT CreateSpatialIndex('"); 1106 + sql += obj->GetName (); 1107 + sql += wxT ("', '"); 1108 + sql += obj->GetColumn (); 1109 + sql += wxT ("')"); 1110 + ret = sqlite3_get_table (sqlite, sql.ToUTF8 (), &results, 1111 + &rows, &columns, &errMsg); 1112 + if (ret != SQLITE_OK) 1113 + { 1114 + wxMessageBox (wxT ("SQLite SQL error: ") + 1115 + wxString::FromUTF8 (errMsg), 1116 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 1117 + this); 1118 + sqlite3_free (errMsg); 1119 + goto rollback; 1120 + } 1121 + if (rows < 1) 1122 + ; 1123 + else 1124 + { 1125 + for (i = 1; i <= rows; i++) 1126 + { 1127 + if (results[(i * columns) + 0]) 1128 + retval = atoi (results[(i * columns) + 0]); 1129 + } 1130 + } 1131 + sqlite3_free_table (results); 1132 + if (!retval) 1133 + goto rollback; 1134 + ret = sqlite3_exec (sqlite, "COMMIT", NULL, NULL, &errMsg); 1135 + if (ret != SQLITE_OK) 1136 + { 1137 + wxMessageBox (wxT ("SQLite SQL error: ") + 1138 + wxString::FromUTF8 (errMsg), 1139 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 1140 + this); 1141 + sqlite3_free (errMsg); 1142 + ::wxEndBusyCursor (); 1143 + return; 1144 + } 1145 + ::wxEndBusyCursor (); 1146 + wxMessageBox (wxT ("Spatial Index idx_") + obj->GetName () + 1147 + wxT ("_") + obj->GetColumn () + 1148 + wxT (" was successfully created"), 1149 + wxT ("spatialite-gui"), wxOK | wxICON_INFORMATION, 1150 + this); 1151 + MainFrame->ClearTableTree (); 1152 + MainFrame->InitTableTree (); 1153 + } 1154 + else if (obj->GetType () == MY_GEOMETRY_INDEX) 1155 + { 1156 + // dropping the Spatial Index 1157 + ::wxBeginBusyCursor (); 1158 + ret = sqlite3_exec (sqlite, "BEGIN", NULL, NULL, &errMsg); 1159 + if (ret != SQLITE_OK) 1160 + { 1161 + wxMessageBox (wxT ("SQLite SQL error: ") + 1162 + wxString::FromUTF8 (errMsg), 1163 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 1164 + this); 1165 + sqlite3_free (errMsg); 1166 + ::wxEndBusyCursor (); 1167 + return; 1168 + } 1169 + sql = wxT ("SELECT DisableSpatialIndex('"); 1170 + sql += obj->GetName (); 1171 + sql += wxT ("', '"); 1172 + sql += obj->GetColumn (); 1173 + sql += wxT ("')"); 1174 + msg = wxT ("Do you really intend to delete the SpatialIndex\n"); 1175 + msg += wxT ("on column '"); 1176 + msg += obj->GetName (); 1177 + msg += wxT ("."); 1178 + msg += obj->GetColumn (); 1179 + msg += wxT ("' ?"); 1180 + wxMessageDialog confirm (this, msg, 1181 + wxT ("Confirming Delete Spatial Index"), 1182 + wxOK | wxCANCEL | wxICON_QUESTION); 1183 + ret = confirm.ShowModal (); 1184 + if (ret != wxID_OK) 1185 + return; 1186 + ret = sqlite3_get_table (sqlite, sql.ToUTF8 (), &results, 1187 + &rows, &columns, &errMsg); 1188 + if (ret != SQLITE_OK) 1189 + { 1190 + wxMessageBox (wxT ("SQLite SQL error: ") + 1191 + wxString::FromUTF8 (errMsg), 1192 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 1193 + this); 1194 + sqlite3_free (errMsg); 1195 + goto rollback; 1196 + } 1197 + if (rows < 1) 1198 + ; 1199 + else 1200 + { 1201 + for (i = 1; i <= rows; i++) 1202 + { 1203 + if (results[(i * columns) + 0]) 1204 + retval = atoi (results[(i * columns) + 0]); 1205 + } 1206 + } 1207 + sqlite3_free_table (results); 1208 + if (!retval) 1209 + goto rollback; 1210 + sql = wxT ("DROP TABLE IF EXISTS idx_"); 1211 + sql += obj->GetName (); 1212 + sql += wxT ("_"); 1213 + sql += obj->GetColumn (); 1214 + ret = sqlite3_exec (sqlite, sql.ToUTF8 (), NULL, NULL, &errMsg); 1215 + if (ret != SQLITE_OK) 1216 + { 1217 + wxMessageBox (wxT ("SQLite SQL error: ") + 1218 + wxString::FromUTF8 (errMsg), 1219 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 1220 + this); 1221 + sqlite3_free (errMsg); 1222 + ::wxEndBusyCursor (); 1223 + return; 1224 + } 1225 + ret = sqlite3_exec (sqlite, "COMMIT", NULL, NULL, &errMsg); 1226 + if (ret != SQLITE_OK) 1227 + { 1228 + wxMessageBox (wxT ("SQLite SQL error: ") + 1229 + wxString::FromUTF8 (errMsg), 1230 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 1231 + this); 1232 + sqlite3_free (errMsg); 1233 + ::wxEndBusyCursor (); 1234 + return; 1235 + } 1236 + ::wxEndBusyCursor (); 1237 + wxMessageBox (wxT ("Spatial Index idx_") + obj->GetName () + 1238 + wxT ("_") + obj->GetColumn () + 1239 + wxT (" was successfully removed"), 1240 + wxT ("spatialite-gui"), wxOK | wxICON_INFORMATION, 1241 + this); 1242 + MainFrame->ClearTableTree (); 1243 + MainFrame->InitTableTree (); 1244 + } 1031 1245 return; 1032 - if (obj->GetType() == MY_GEOMETRY) 1033 - { 1034 - // creating the Spatial Index 1035 - ::wxBeginBusyCursor(); 1036 - ret = sqlite3_exec(sqlite, "BEGIN", NULL, NULL, &errMsg); 1037 - if (ret != SQLITE_OK) 1038 - { 1039 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 1040 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1041 - sqlite3_free(errMsg); 1042 - ::wxEndBusyCursor(); 1043 - return; 1044 - } 1045 - sql = wxT("SELECT CreateSpatialIndex('"); 1046 - sql += obj->GetName(); 1047 - sql += wxT("', '"); 1048 - sql += obj->GetColumn(); 1049 - sql += wxT("')"); 1050 - ret = 1051 - sqlite3_get_table(sqlite, sql.ToUTF8(), &results, &rows, &columns, 1052 - &errMsg); 1053 - if (ret != SQLITE_OK) 1054 - { 1055 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 1056 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1057 - sqlite3_free(errMsg); 1058 - goto rollback; 1059 - } 1060 - if (rows < 1) 1061 - ; 1062 - else 1063 - { 1064 - for (i = 1; i <= rows; i++) 1065 - { 1066 - if (results[(i * columns) + 0]) 1067 - retval = atoi(results[(i * columns) + 0]); 1068 - } 1069 - } 1070 - sqlite3_free_table(results); 1071 - if (!retval) 1072 - goto rollback; 1073 - ret = sqlite3_exec(sqlite, "COMMIT", NULL, NULL, &errMsg); 1074 - if (ret != SQLITE_OK) 1075 - { 1076 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 1077 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1078 - sqlite3_free(errMsg); 1079 - ::wxEndBusyCursor(); 1080 - return; 1081 - } 1082 - ::wxEndBusyCursor(); 1083 - wxMessageBox(wxT("Spatial Index \"idx_") + obj->GetName() + 1084 - wxT("_") + obj->GetColumn() + 1085 - wxT("\" was successfully created"), wxT("spatialite-gui"), 1086 - wxOK | wxICON_INFORMATION, this); 1087 - MainFrame->InitTableTree(); 1088 - } else if (obj->GetType() == MY_GEOMETRY_INDEX) 1089 - { 1090 - // dropping the Spatial Index 1091 - ::wxBeginBusyCursor(); 1092 - ret = sqlite3_exec(sqlite, "BEGIN", NULL, NULL, &errMsg); 1093 - if (ret != SQLITE_OK) 1094 - { 1095 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 1096 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1097 - sqlite3_free(errMsg); 1098 - ::wxEndBusyCursor(); 1099 - return; 1100 - } 1101 - sql = wxT("SELECT DisableSpatialIndex('"); 1102 - sql += obj->GetName(); 1103 - sql += wxT("', '"); 1104 - sql += obj->GetColumn(); 1105 - sql += wxT("')"); 1106 - msg = wxT("Do you really intend to delete the SpatialIndex\n"); 1107 - msg += wxT("on column \""); 1108 - msg += obj->GetName(); 1109 - msg += wxT("\".\""); 1110 - msg += obj->GetColumn(); 1111 - msg += wxT("\" ?"); 1112 - wxMessageDialog confirm(this, msg, wxT("Confirming Delete Spatial Index"), 1113 - wxOK | wxCANCEL | wxICON_QUESTION); 1114 - ret = confirm.ShowModal(); 1115 - if (ret != wxID_OK) 1116 - return; 1117 - ret = 1118 - sqlite3_get_table(sqlite, sql.ToUTF8(), &results, &rows, &columns, 1119 - &errMsg); 1120 - if (ret != SQLITE_OK) 1121 - { 1122 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 1123 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1124 - sqlite3_free(errMsg); 1125 - goto rollback; 1126 - } 1127 - if (rows < 1) 1128 - ; 1129 - else 1130 - { 1131 - for (i = 1; i <= rows; i++) 1132 - { 1133 - if (results[(i * columns) + 0]) 1134 - retval = atoi(results[(i * columns) + 0]); 1135 - } 1136 - } 1137 - sqlite3_free_table(results); 1138 - if (!retval) 1139 - goto rollback; 1140 - sql = wxT("DROP TABLE IF EXISTS \"idx_"); 1141 - sql += obj->GetName(); 1142 - sql += wxT("_"); 1143 - sql += obj->GetColumn(); 1144 - sql += wxT("\""); 1145 - ret = sqlite3_exec(sqlite, sql.ToUTF8(), NULL, NULL, &errMsg); 1146 - if (ret != SQLITE_OK) 1147 - { 1148 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 1149 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1150 - sqlite3_free(errMsg); 1151 - ::wxEndBusyCursor(); 1152 - return; 1153 - } 1154 - ret = sqlite3_exec(sqlite, "COMMIT", NULL, NULL, &errMsg); 1155 - if (ret != SQLITE_OK) 1156 - { 1157 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 1158 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1159 - sqlite3_free(errMsg); 1160 - ::wxEndBusyCursor(); 1161 - return; 1162 - } 1163 - ::wxEndBusyCursor(); 1164 - wxMessageBox(wxT("Spatial Index idx_") + obj->GetName() + 1165 - wxT("_") + obj->GetColumn() + 1166 - wxT(" was successfully removed"), wxT("spatialite-gui"), 1167 - wxOK | wxICON_INFORMATION, this); 1168 - MainFrame->InitTableTree(); 1169 - } 1170 - return; 1171 -rollback: 1172 - ret = sqlite3_exec(sqlite, "ROLLBACK", NULL, NULL, &errMsg); 1173 - if (ret != SQLITE_OK) 1174 - { 1175 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 1176 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1177 - sqlite3_free(errMsg); 1178 - ::wxEndBusyCursor(); 1179 - return; 1180 - } 1181 - ::wxEndBusyCursor(); 1182 - wxMessageBox(wxT 1183 - ("An error occurred\n\na ROLLBACK was automatically performed"), 1184 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 1246 + rollback: 1247 + ret = sqlite3_exec (sqlite, "ROLLBACK", NULL, NULL, &errMsg); 1248 + if (ret != SQLITE_OK) 1249 + { 1250 + wxMessageBox (wxT ("SQLite SQL error: ") + 1251 + wxString::FromUTF8 (errMsg), wxT ("spatialite-gui"), 1252 + wxOK | wxICON_ERROR, this); 1253 + sqlite3_free (errMsg); 1254 + ::wxEndBusyCursor (); 1255 + return; 1256 + } 1257 + ::wxEndBusyCursor (); 1258 + wxMessageBox (wxT 1259 + ("An error occurred\n\na ROLLBACK was automatically performed"), 1260 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 1185 1261 } 1186 1262 1187 -void MyTableTree::OnCmdMbrCache(wxCommandEvent & event) 1263 +void 1264 +MyTableTree::OnCmdMbrCache (wxCommandEvent & event) 1188 1265 { 1189 1266 // 1190 1267 // menu event - MBR cache creation-destruction 1191 1268 // 1192 - char *errMsg = NULL; 1193 - int ret; 1194 - wxString sql; 1195 - wxString msg; 1196 - int i; 1197 - char **results; 1198 - int rows; 1199 - int columns; 1200 - int retval = 0; 1201 - sqlite3 *sqlite = MainFrame->GetSqlite(); 1202 - MyObject *obj = (MyObject *) GetItemData(CurrentItem); 1203 - if (obj == NULL) 1269 + char *errMsg = NULL; 1270 + int ret; 1271 + wxString sql; 1272 + wxString msg; 1273 + int i; 1274 + char **results; 1275 + int rows; 1276 + int columns; 1277 + int retval = 0; 1278 + sqlite3 *sqlite = MainFrame->GetSqlite (); 1279 + MyObject *obj = (MyObject *) GetItemData (CurrentItem); 1280 + if (obj == NULL) 1281 + return; 1282 + if (obj->GetType () == MY_GEOMETRY) 1283 + { 1284 + // creating the MBR cache 1285 + ::wxBeginBusyCursor (); 1286 + ret = sqlite3_exec (sqlite, "BEGIN", NULL, NULL, &errMsg); 1287 + if (ret != SQLITE_OK) 1288 + { 1289 + wxMessageBox (wxT ("SQLite SQL error: ") + 1290 + wxString::FromUTF8 (errMsg), 1291 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 1292 + this); 1293 + sqlite3_free (errMsg); 1294 + ::wxEndBusyCursor (); 1295 + return; 1296 + } 1297 + sql = wxT ("SELECT CreateMbrCache('"); 1298 + sql += obj->GetName (); 1299 + sql += wxT ("', '"); 1300 + sql += obj->GetColumn (); 1301 + sql += wxT ("')"); 1302 + ret = sqlite3_get_table (sqlite, sql.ToUTF8 (), &results, 1303 + &rows, &columns, &errMsg); 1304 + if (ret != SQLITE_OK) 1305 + { 1306 + wxMessageBox (wxT ("SQLite SQL error: ") + 1307 + wxString::FromUTF8 (errMsg), 1308 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 1309 + this); 1310 + sqlite3_free (errMsg); 1311 + goto rollback; 1312 + } 1313 + if (rows < 1) 1314 + ; 1315 + else 1316 + { 1317 + for (i = 1; i <= rows; i++) 1318 + { 1319 + if (results[(i * columns) + 0]) 1320 + retval = atoi (results[(i * columns) + 0]); 1321 + } 1322 + } 1323 + sqlite3_free_table (results); 1324 + if (!retval) 1325 + goto rollback; 1326 + ret = sqlite3_exec (sqlite, "COMMIT", NULL, NULL, &errMsg); 1327 + if (ret != SQLITE_OK) 1328 + { 1329 + wxMessageBox (wxT ("SQLite SQL error: ") + 1330 + wxString::FromUTF8 (errMsg), 1331 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 1332 + this); 1333 + sqlite3_free (errMsg); 1334 + ::wxEndBusyCursor (); 1335 + return; 1336 + } 1337 + ::wxEndBusyCursor (); 1338 + wxMessageBox (wxT ("MBR cache cache_") + obj->GetName () + 1339 + wxT ("_") + obj->GetColumn () + 1340 + wxT (" was successfully created"), 1341 + wxT ("spatialite-gui"), wxOK | wxICON_INFORMATION, 1342 + this); 1343 + MainFrame->ClearTableTree (); 1344 + MainFrame->InitTableTree (); 1345 + } 1346 + else if (obj->GetType () == MY_GEOMETRY_CACHED) 1347 + { 1348 + // dropping the MBR cache 1349 + ::wxBeginBusyCursor (); 1350 + ret = sqlite3_exec (sqlite, "BEGIN", NULL, NULL, &errMsg); 1351 + if (ret != SQLITE_OK) 1352 + { 1353 + wxMessageBox (wxT ("SQLite SQL error: ") + 1354 + wxString::FromUTF8 (errMsg), 1355 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 1356 + this); 1357 + sqlite3_free (errMsg); 1358 + ::wxEndBusyCursor (); 1359 + return; 1360 + } 1361 + sql = wxT ("SELECT DisableSpatialIndex('"); 1362 + sql += obj->GetName (); 1363 + sql += wxT ("', '"); 1364 + sql += obj->GetColumn (); 1365 + sql += wxT ("')"); 1366 + msg = wxT ("Do you really intend to delete the MBR cache\n"); 1367 + msg += wxT ("on column '"); 1368 + msg += obj->GetName (); 1369 + msg += wxT ("."); 1370 + msg += obj->GetColumn (); 1371 + msg += wxT ("' ?"); 1372 + wxMessageDialog confirm (this, msg, 1373 + wxT ("Confirming Delete MBR cache"), 1374 + wxOK | wxCANCEL | wxICON_QUESTION); 1375 + ret = confirm.ShowModal (); 1376 + if (ret != wxID_OK) 1377 + return; 1378 + ret = sqlite3_get_table (sqlite, sql.ToUTF8 (), &results, 1379 + &rows, &columns, &errMsg); 1380 + if (ret != SQLITE_OK) 1381 + { 1382 + wxMessageBox (wxT ("SQLite SQL error: ") + 1383 + wxString::FromUTF8 (errMsg), 1384 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 1385 + this); 1386 + sqlite3_free (errMsg); 1387 + goto rollback; 1388 + } 1389 + if (rows < 1) 1390 + ; 1391 + else 1392 + { 1393 + for (i = 1; i <= rows; i++) 1394 + { 1395 + if (results[(i * columns) + 0]) 1396 + retval = atoi (results[(i * columns) + 0]); 1397 + } 1398 + } 1399 + sqlite3_free_table (results); 1400 + if (!retval) 1401 + goto rollback; 1402 + sql = wxT ("DROP TABLE IF EXISTS cache_"); 1403 + sql += obj->GetName (); 1404 + sql += wxT ("_"); 1405 + sql += obj->GetColumn (); 1406 + ret = sqlite3_exec (sqlite, sql.ToUTF8 (), NULL, NULL, &errMsg); 1407 + if (ret != SQLITE_OK) 1408 + { 1409 + wxMessageBox (wxT ("SQLite SQL error: ") + 1410 + wxString::FromUTF8 (errMsg), 1411 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 1412 + this); 1413 + sqlite3_free (errMsg); 1414 + ::wxEndBusyCursor (); 1415 + return; 1416 + } 1417 + ret = sqlite3_exec (sqlite, "COMMIT", NULL, NULL, &errMsg); 1418 + if (ret != SQLITE_OK) 1419 + { 1420 + wxMessageBox (wxT ("SQLite SQL error: ") + 1421 + wxString::FromUTF8 (errMsg), 1422 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 1423 + this); 1424 + sqlite3_free (errMsg); 1425 + ::wxEndBusyCursor (); 1426 + return; 1427 + } 1428 + ::wxEndBusyCursor (); 1429 + wxMessageBox (wxT ("MBR cache cache_") + obj->GetName () + 1430 + wxT ("_") + obj->GetColumn () + 1431 + wxT (" was successfully removed"), 1432 + wxT ("spatialite-gui"), wxOK | wxICON_INFORMATION, 1433 + this); 1434 + MainFrame->ClearTableTree (); 1435 + MainFrame->InitTableTree (); 1436 + } 1204 1437 return; 1205 - if (obj->GetType() == MY_GEOMETRY) 1206 - { 1207 - // creating the MBR cache 1208 - ::wxBeginBusyCursor(); 1209 - ret = sqlite3_exec(sqlite, "BEGIN", NULL, NULL, &errMsg); 1210 - if (ret != SQLITE_OK) 1211 - { 1212 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 1213 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1214 - sqlite3_free(errMsg); 1215 - ::wxEndBusyCursor(); 1216 - return; 1217 - } 1218 - sql = wxT("SELECT CreateMbrCache('"); 1219 - sql += obj->GetName(); 1220 - sql += wxT("', '"); 1221 - sql += obj->GetColumn(); 1222 - sql += wxT("')"); 1223 - ret = 1224 - sqlite3_get_table(sqlite, sql.ToUTF8(), &results, &rows, &columns, 1225 - &errMsg); 1226 - if (ret != SQLITE_OK) 1227 - { 1228 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 1229 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1230 - sqlite3_free(errMsg); 1231 - goto rollback; 1232 - } 1233 - if (rows < 1) 1234 - ; 1235 - else 1236 - { 1237 - for (i = 1; i <= rows; i++) 1238 - { 1239 - if (results[(i * columns) + 0]) 1240 - retval = atoi(results[(i * columns) + 0]); 1241 - } 1242 - } 1243 - sqlite3_free_table(results); 1244 - if (!retval) 1245 - goto rollback; 1246 - ret = sqlite3_exec(sqlite, "COMMIT", NULL, NULL, &errMsg); 1247 - if (ret != SQLITE_OK) 1248 - { 1249 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 1250 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1251 - sqlite3_free(errMsg); 1252 - ::wxEndBusyCursor(); 1253 - return; 1254 - } 1255 - ::wxEndBusyCursor(); 1256 - wxMessageBox(wxT("MBR cache \"cache_") + obj->GetName() + 1257 - wxT("_") + obj->GetColumn() + 1258 - wxT("\" was successfully created"), wxT("spatialite-gui"), 1259 - wxOK | wxICON_INFORMATION, this); 1260 - MainFrame->InitTableTree(); 1261 - } else if (obj->GetType() == MY_GEOMETRY_CACHED) 1262 - { 1263 - // dropping the MBR cache 1264 - ::wxBeginBusyCursor(); 1265 - ret = sqlite3_exec(sqlite, "BEGIN", NULL, NULL, &errMsg); 1266 - if (ret != SQLITE_OK) 1267 - { 1268 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 1269 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1270 - sqlite3_free(errMsg); 1271 - ::wxEndBusyCursor(); 1272 - return; 1273 - } 1274 - sql = wxT("SELECT DisableSpatialIndex('"); 1275 - sql += obj->GetName(); 1276 - sql += wxT("', '"); 1277 - sql += obj->GetColumn(); 1278 - sql += wxT("')"); 1279 - msg = wxT("Do you really intend to delete the MBR cache\n"); 1280 - msg += wxT("on column \""); 1281 - msg += obj->GetName(); 1282 - msg += wxT("\".\""); 1283 - msg += obj->GetColumn(); 1284 - msg += wxT("\" ?"); 1285 - wxMessageDialog confirm(this, msg, wxT("Confirming Delete MBR cache"), 1286 - wxOK | wxCANCEL | wxICON_QUESTION); 1287 - ret = confirm.ShowModal(); 1288 - if (ret != wxID_OK) 1289 - return; 1290 - ret = 1291 - sqlite3_get_table(sqlite, sql.ToUTF8(), &results, &rows, &columns, 1292 - &errMsg); 1293 - if (ret != SQLITE_OK) 1294 - { 1295 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 1296 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1297 - sqlite3_free(errMsg); 1298 - goto rollback; 1299 - } 1300 - if (rows < 1) 1301 - ; 1302 - else 1303 - { 1304 - for (i = 1; i <= rows; i++) 1305 - { 1306 - if (results[(i * columns) + 0]) 1307 - retval = atoi(results[(i * columns) + 0]); 1308 - } 1309 - } 1310 - sqlite3_free_table(results); 1311 - if (!retval) 1312 - goto rollback; 1313 - sql = wxT("DROP TABLE IF EXISTS \"cache_"); 1314 - sql += obj->GetName(); 1315 - sql += wxT("_"); 1316 - sql += obj->GetColumn(); 1317 - sql += wxT("\""); 1318 - ret = sqlite3_exec(sqlite, sql.ToUTF8(), NULL, NULL, &errMsg); 1319 - if (ret != SQLITE_OK) 1320 - { 1321 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 1322 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1323 - sqlite3_free(errMsg); 1324 - ::wxEndBusyCursor(); 1325 - return; 1326 - } 1327 - ret = sqlite3_exec(sqlite, "COMMIT", NULL, NULL, &errMsg); 1328 - if (ret != SQLITE_OK) 1329 - { 1330 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 1331 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1332 - sqlite3_free(errMsg); 1333 - ::wxEndBusyCursor(); 1334 - return; 1335 - } 1336 - ::wxEndBusyCursor(); 1337 - wxMessageBox(wxT("MBR cache \"cache_") + obj->GetName() + 1338 - wxT("_") + obj->GetColumn() + 1339 - wxT("\" was successfully removed"), wxT("spatialite-gui"), 1340 - wxOK | wxICON_INFORMATION, this); 1341 - MainFrame->InitTableTree(); 1342 - } 1343 - return; 1344 -rollback: 1345 - ret = sqlite3_exec(sqlite, "ROLLBACK", NULL, NULL, &errMsg); 1346 - if (ret != SQLITE_OK) 1347 - { 1348 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 1349 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1350 - sqlite3_free(errMsg); 1351 - ::wxEndBusyCursor(); 1352 - return; 1353 - } 1354 - ::wxEndBusyCursor(); 1355 - wxMessageBox(wxT 1356 - ("An error occurred\n\na ROLLBACK was automatically performed"), 1357 - wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 1438 + rollback: 1439 + ret = sqlite3_exec (sqlite, "ROLLBACK", NULL, NULL, &errMsg); 1440 + if (ret != SQLITE_OK) 1441 + { 1442 + wxMessageBox (wxT ("SQLite SQL error: ") + 1443 + wxString::FromUTF8 (errMsg), wxT ("spatialite-gui"), 1444 + wxOK | wxICON_ERROR, this); 1445 + sqlite3_free (errMsg); 1446 + ::wxEndBusyCursor (); 1447 + return; 1448 + } 1449 + ::wxEndBusyCursor (); 1450 + wxMessageBox (wxT 1451 + ("An error occurred\n\na ROLLBACK was automatically performed"), 1452 + wxT ("spatialite-gui"), wxOK | wxICON_WARNING, this); 1358 1453 } 1359 1454 1360 -void MyTableTree::OnCmdRebuildTriggers(wxCommandEvent & event) 1361 -{ 1362 -// 1363 -// menu event - rebuilding Geometry Triggers 1364 -// 1365 - wxString sql; 1366 - MyObject *obj = (MyObject *) GetItemData(CurrentItem); 1367 - if (obj == NULL) 1368 - return; 1369 - if (obj->GetType() == MY_COLUMN || obj->GetType() == MY_GEOMETRY 1370 - || obj->GetType() == MY_GEOMETRY_INDEX 1371 - || obj->GetType() == MY_GEOMETRY_CACHED) 1372 - { 1373 - sql = wxT("SELECT RebuildGeometryTriggers('"); 1374 - sql += obj->GetName(); 1375 - sql += wxT("', '"); 1376 - sql += obj->GetColumn(); 1377 - sql += wxT("')"); 1378 - MainFrame->SetSql(sql, true); 1379 - } 1380 -} 1381 - 1382 -void MyTableTree::OnCmdCheckGeometry(wxCommandEvent & event) 1455 +void 1456 +MyTableTree::OnCmdCheckGeometry (wxCommandEvent & event) 1383 1457 { 1384 1458 // 1385 1459 // menu event - checking geometries 1386 1460 // 1387 - wxString sql; 1388 - MyObject *obj = (MyObject *) GetItemData(CurrentItem); 1389 - if (obj == NULL) 1390 - return; 1391 - if (obj->GetType() == MY_COLUMN || obj->GetType() == MY_GEOMETRY 1392 - || obj->GetType() == MY_GEOMETRY_INDEX 1393 - || obj->GetType() == MY_GEOMETRY_CACHED) 1394 - { 1395 - sql = wxT("SELECT Count(*), GeometryType(\""); 1396 - sql += obj->GetColumn(); 1397 - sql += wxT("\"), Srid(\""); 1398 - sql += obj->GetColumn(); 1399 - sql += wxT("\")\nFROM \""); 1400 - sql += obj->GetName(); 1401 - sql += wxT("\"\nGROUP BY 2, 3"); 1402 - MainFrame->SetSql(sql, true); 1403 - } 1461 + wxString sql; 1462 + MyObject *obj = (MyObject *) GetItemData (CurrentItem); 1463 + if (obj == NULL) 1464 + return; 1465 + if (obj->GetType () == MY_COLUMN) 1466 + { 1467 + sql = wxT ("SELECT Count(*), GeometryType("); 1468 + sql += obj->GetColumn (); 1469 + sql += wxT ("), Srid("); 1470 + sql += obj->GetColumn (); 1471 + sql += wxT (")\nFROM "); 1472 + sql += obj->GetName (); 1473 + sql += wxT ("\nGROUP BY 2, 3"); 1474 + MainFrame->SetSql (sql, true); 1475 + } 1404 1476 } 1405 1477 1406 -void MyTableTree::OnCmdSetSrid(wxCommandEvent & event) 1478 +void 1479 +MyTableTree::OnCmdSetSrid (wxCommandEvent & event) 1407 1480 { 1408 1481 // 1409 1482 // menu event - setting SRID for geometries 1410 1483 // 1411 - SetSridDialog dlg; 1412 - wxString sql; 1413 - int srid; 1414 - int oldSrid; 1415 - int ret; 1416 - char dummy[128]; 1417 - MyObject *obj = (MyObject *) GetItemData(CurrentItem); 1418 - if (obj == NULL) 1419 - return; 1420 - if (obj->GetType() == MY_COLUMN) 1421 - { 1422 - dlg.Create(MainFrame, obj->GetName(), obj->GetColumn()); 1423 - ret = dlg.ShowModal(); 1424 - if (ret == wxID_OK) 1425 - { 1426 - srid = dlg.GetSrid(); 1427 - oldSrid = dlg.GetOldSrid(); 1428 - sql = wxT("UPDATE "); 1429 - sql += obj->GetName(); 1430 - sql += wxT(" SET "); 1431 - sql += obj->GetColumn(); 1432 - sql += wxT(" = SetSrid("); 1433 - sql += obj->GetColumn(); 1434 - sprintf(dummy, ", %d)", srid); 1435 - sql += wxString::FromUTF8(dummy); 1436 - sql += wxT("\nWHERE Srid("); 1437 - sql += obj->GetColumn(); 1438 - sprintf(dummy, ") = %d", oldSrid); 1439 - sql += wxString::FromUTF8(dummy); 1440 - MainFrame->SetSql(sql, true); 1441 - } 1442 - } 1484 + SetSridDialog dlg; 1485 + wxString sql; 1486 + wxString strSrid; 1487 + int srid; 1488 + int oldSrid; 1489 + int ret; 1490 + MyObject *obj = (MyObject *) GetItemData (CurrentItem); 1491 + if (obj == NULL) 1492 + return; 1493 + if (obj->GetType () == MY_COLUMN) 1494 + { 1495 + dlg.Create (MainFrame, obj->GetName (), obj->GetColumn ()); 1496 + ret = dlg.ShowModal (); 1497 + if (ret == wxID_OK) 1498 + { 1499 + srid = dlg.GetSrid (); 1500 + oldSrid = dlg.GetOldSrid (); 1501 + sql = wxT ("UPDATE "); 1502 + sql += obj->GetName (); 1503 + sql += wxT (" SET "); 1504 + sql += obj->GetColumn (); 1505 + sql += wxT (" = SetSrid("); 1506 + sql += obj->GetColumn (); 1507 + strSrid.Printf (wxT (", %d)"), srid); 1508 + sql += strSrid; 1509 + sql += wxT ("\nWHERE Srid("); 1510 + sql += obj->GetColumn (); 1511 + strSrid.Printf (wxT (") = %d"), oldSrid); 1512 + sql += strSrid; 1513 + MainFrame->SetSql (sql, true); 1514 + } 1515 + } 1443 1516 } 1444 1517 1445 -void MyTableTree::OnCmdDumpShp(wxCommandEvent & event) 1518 +void 1519 +MyTableTree::OnCmdDumpShp (wxCommandEvent & event) 1446 1520 { 1447 1521 // 1448 1522 // menu event - dumping as Shapefile 1449 1523 // 1450 - int ret; 1451 - wxString path; 1452 - wxString lastDir; 1453 - MyObject *obj = (MyObject *) GetItemData(CurrentItem); 1454 - if (obj == NULL) 1455 - return; 1456 - if (obj->GetType() == MY_GEOMETRY || obj->GetType() == MY_GEOMETRY_INDEX 1457 - || obj->GetType() == MY_GEOMETRY_CACHED) 1458 - { 1459 - wxFileDialog *fileDialog = new wxFileDialog(this, wxT("Dump Shapefile"), 1460 - wxT(""), wxT("shapefile.shp"), 1461 - wxT 1462 - ("Shapefile (*.shp)|*.shp|All files (*.*)|*.*"), 1463 - wxFD_SAVE | 1464 - wxFD_OVERWRITE_PROMPT, 1465 - wxDefaultPosition, 1466 - wxDefaultSize, 1467 - wxT("filedlg")); 1468 - lastDir = MainFrame->GetLastDirectory(); 1469 - if (lastDir.Len() >= 1) 1470 - fileDialog->SetDirectory(lastDir); 1471 - ret = fileDialog->ShowModal(); 1472 - if (ret == wxID_OK) 1473 - { 1524 + int ret; 1525 + wxString path; 1526 + wxString lastDir; 1527 + MyObject *obj = (MyObject *) GetItemData (CurrentItem); 1528 + if (obj == NULL) 1529 + return; 1530 + if (obj->GetType () == MY_GEOMETRY || obj->GetType () == MY_GEOMETRY_INDEX) 1531 + { 1532 + wxFileDialog *fileDialog = 1533 + new wxFileDialog (this, wxT ("Dump Shapefile"), 1534 + wxT (""), wxT ("shapefile.shp"), 1535 + wxT 1536 + ("Shapefile (*.shp)|*.shp|All files (*.*)|*.*"), 1537 + wxFD_SAVE | wxFD_OVERWRITE_PROMPT, 1538 + wxDefaultPosition, wxDefaultSize, 1539 + wxT ("filedlg")); 1540 + lastDir = MainFrame->GetLastDirectory (); 1541 + if (lastDir.Len () >= 1) 1542 + fileDialog->SetDirectory (lastDir); 1543 + ret = fileDialog->ShowModal (); 1544 + if (ret == wxID_OK) 1545 + { 1474 1546 1475 - wxFileName file(fileDialog->GetPath()); 1476 - path = file.GetPath(); 1477 - path += file.GetPathSeparator(); 1478 - path += file.GetName(); 1479 - lastDir = file.GetPath(); 1480 - if (MainFrame->IsSetAskCharset() == false) 1481 - { 1482 - // using the default output charset 1483 - MainFrame->SetLastDirectory(lastDir); 1484 - ::wxBeginBusyCursor(); 1485 - MainFrame->DumpShapefile(path, obj->GetName(), obj->GetColumn(), 1486 - MainFrame->GetDefaultCharset()); 1487 - ::wxEndBusyCursor(); 1488 - } else 1489 - { 1490 - // asking the charset to be used 1491 - DumpShpDialog dlg; 1492 - dlg.Create(MainFrame, path, obj->GetName(), obj->GetColumn(), 1493 - MainFrame->GetDefaultCharset()); 1494 - ret = dlg.ShowModal(); 1495 - if (ret == wxID_OK) 1496 - { 1497 - MainFrame->SetLastDirectory(lastDir); 1498 - ::wxBeginBusyCursor(); 1499 - MainFrame->DumpShapefile(path, obj->GetName(), 1500 - obj->GetColumn(), dlg.GetCharset()); 1501 - ::wxEndBusyCursor(); 1502 - } 1503 - } 1504 - } 1505 - } 1547 + wxFileName file (fileDialog->GetPath ()); 1548 + path = file.GetPath (); 1549 + path += file.GetPathSeparator (); 1550 + path += file.GetName (); 1551 + lastDir = file.GetPath (); 1552 + if (MainFrame->IsSetAskCharset () == false) 1553 + { 1554 + // using the default output charset 1555 + MainFrame->SetLastDirectory (lastDir); 1556 + ::wxBeginBusyCursor (); 1557 + MainFrame->DumpShapefile (path, obj->GetName (), 1558 + obj->GetColumn (), 1559 + MainFrame->GetDefaultCharset 1560 + ()); 1561 + ::wxEndBusyCursor (); 1562 + } 1563 + else 1564 + { 1565 + // asking the charset to be used 1566 + DumpShpDialog dlg; 1567 + dlg.Create (MainFrame, path, obj->GetName (), 1568 + obj->GetColumn (), 1569 + MainFrame->GetDefaultCharset ()); 1570 + ret = dlg.ShowModal (); 1571 + if (ret == wxID_OK) 1572 + { 1573 + MainFrame->SetLastDirectory (lastDir); 1574 + ::wxBeginBusyCursor (); 1575 + MainFrame->DumpShapefile (path, obj->GetName (), 1576 + obj->GetColumn (), 1577 + dlg.GetCharset ()); 1578 + ::wxEndBusyCursor (); 1579 + } 1580 + } 1581 + } 1582 + } 1506 1583 } 1507 1584 1508 -void MyTableTree::OnCmdDumpTxtTab(wxCommandEvent & event) 1585 +void 1586 +MyTableTree::OnCmdDumpTxtTab (wxCommandEvent & event) 1509 1587 { 1510 1588 // 1511 1589 // menu event - dumping as TxtTab 1512 1590 // 1513 - int ret; 1514 - wxString path; 1515 - wxString lastDir; 1516 - wxString target; 1517 - MyObject *obj = (MyObject *) GetItemData(CurrentItem); 1518 - if (obj == NULL) 1519 - return; 1520 - wxFileDialog *fileDialog = new wxFileDialog(this, wxT("Dump Txt/Tab file"), 1521 - wxT(""), wxT("table.txt"), 1522 - wxT 1523 - ("File Txt/Tab (*.txt)|*.txt|All files (*.*)|*.*"), 1524 - wxFD_SAVE | wxFD_OVERWRITE_PROMPT, 1525 - wxDefaultPosition, 1526 - wxDefaultSize, wxT("filedlg")); 1527 - lastDir = MainFrame->GetLastDirectory(); 1528 - if (lastDir.Len() >= 1) 1529 - fileDialog->SetDirectory(lastDir); 1530 - ret = fileDialog->ShowModal(); 1531 - if (ret == wxID_OK) 1532 - { 1533 - wxFileName file(fileDialog->GetPath()); 1534 - path = file.GetPath(); 1535 - path += file.GetPathSeparator(); 1536 - path += file.GetName(); 1537 - path += wxT(".txt"); 1538 - lastDir = file.GetPath(); 1539 - if (MainFrame->IsSetAskCharset() == false) 1540 - { 1541 - // using the default output charset 1542 - MainFrame->SetLastDirectory(lastDir); 1543 - ::wxBeginBusyCursor(); 1544 - MainFrame->DumpTxtTab(path, obj->GetName(), 1545 - MainFrame->GetDefaultCharset()); 1546 - ::wxEndBusyCursor(); 1547 - } else 1548 - { 1549 - // asking the charset to be used 1550 - DumpTxtDialog dlg; 1551 - target = wxT("TXT / TAB"); 1552 - dlg.Create(MainFrame, path, target, MainFrame->GetDefaultCharset()); 1553 - ret = dlg.ShowModal(); 1554 - if (ret == wxID_OK) 1555 - { 1556 - MainFrame->SetLastDirectory(lastDir); 1557 - ::wxBeginBusyCursor(); 1558 - MainFrame->DumpTxtTab(path, obj->GetName(), dlg.GetCharset()); 1559 - ::wxEndBusyCursor(); 1560 - } 1561 - } 1562 - } 1591 + int ret; 1592 + wxString path; 1593 + wxString lastDir; 1594 + wxString target; 1595 + MyObject *obj = (MyObject *) GetItemData (CurrentItem); 1596 + if (obj == NULL) 1597 + return; 1598 + wxFileDialog *fileDialog = 1599 + new wxFileDialog (this, wxT ("Dump Txt/Tab file"), 1600 + wxT (""), wxT ("table.txt"), 1601 + wxT 1602 + ("File Txt/Tab (*.txt)|*.txt|All files (*.*)|*.*"), 1603 + wxFD_SAVE | wxFD_OVERWRITE_PROMPT, wxDefaultPosition, 1604 + wxDefaultSize, wxT ("filedlg")); 1605 + lastDir = MainFrame->GetLastDirectory (); 1606 + if (lastDir.Len () >= 1) 1607 + fileDialog->SetDirectory (lastDir); 1608 + ret = fileDialog->ShowModal (); 1609 + if (ret == wxID_OK) 1610 + { 1611 + wxFileName file (fileDialog->GetPath ()); 1612 + path = file.GetPath (); 1613 + path += file.GetPathSeparator (); 1614 + path += file.GetName (); 1615 + path += wxT (".txt"); 1616 + lastDir = file.GetPath (); 1617 + if (MainFrame->IsSetAskCharset () == false) 1618 + { 1619 + // using the default output charset 1620 + MainFrame->SetLastDirectory (lastDir); 1621 + ::wxBeginBusyCursor (); 1622 + MainFrame->DumpTxtTab (path, obj->GetName (), 1623 + MainFrame->GetDefaultCharset ()); 1624 + ::wxEndBusyCursor (); 1625 + } 1626 + else 1627 + { 1628 + // asking the charset to be used 1629 + DumpTxtDialog dlg; 1630 + target = wxT ("TXT / TAB"); 1631 + dlg.Create (MainFrame, path, target, 1632 + MainFrame->GetDefaultCharset ()); 1633 + ret = dlg.ShowModal (); 1634 + if (ret == wxID_OK) 1635 + { 1636 + MainFrame->SetLastDirectory (lastDir); 1637 + ::wxBeginBusyCursor (); 1638 + MainFrame->DumpTxtTab (path, obj->GetName (), 1639 + dlg.GetCharset ()); 1640 + ::wxEndBusyCursor (); 1641 + } 1642 + } 1643 + } 1563 1644 } 1564 1645 1565 -void MyTableTree::OnCmdDumpCsv(wxCommandEvent & event) 1646 +void 1647 +MyTableTree::OnCmdDumpCsv (wxCommandEvent & event) 1566 1648 { 1567 1649 // 1568 1650 // menu event - dumping as CSV 1569 1651 // 1570 - int ret; 1571 - wxString path; 1572 - wxString lastDir; 1573 - wxString target; 1574 - MyObject *obj = (MyObject *) GetItemData(CurrentItem); 1575 - if (obj == NULL) 1576 - return; 1577 - wxFileDialog *fileDialog = new wxFileDialog(this, wxT("Dump CSV file"), 1578 - wxT(""), wxT("table.csv"), 1579 - wxT 1580 - ("File CSV (*.csv)|*.csv|All files (*.*)|*.*"), 1581 - wxFD_SAVE | wxFD_OVERWRITE_PROMPT, 1582 - wxDefaultPosition, 1583 - wxDefaultSize, 1584 - wxT("filedlg")); 1585 - lastDir = MainFrame->GetLastDirectory(); 1586 - if (lastDir.Len() >= 1) 1587 - fileDialog->SetDirectory(lastDir); 1588 - ret = fileDialog->ShowModal(); 1589 - if (ret == wxID_OK) 1590 - { 1591 - wxFileName file(fileDialog->GetPath()); 1592 - path = file.GetPath(); 1593 - path += file.GetPathSeparator(); 1594 - path += file.GetName(); 1595 - path += wxT(".csv"); 1596 - lastDir = file.GetPath(); 1597 - if (MainFrame->IsSetAskCharset() == false) 1598 - { 1599 - // using the default output charset 1600 - MainFrame->SetLastDirectory(lastDir); 1601 - ::wxBeginBusyCursor(); 1602 - MainFrame->DumpCsv(path, obj->GetName(), 1603 - MainFrame->GetDefaultCharset()); 1604 - ::wxEndBusyCursor(); 1605 - } else 1606 - { 1607 - // asking the charset to be used 1608 - DumpTxtDialog dlg; 1609 - target = wxT("CSV"); 1610 - dlg.Create(MainFrame, path, target, MainFrame->GetDefaultCharset()); 1611 - ret = dlg.ShowModal(); 1612 - if (ret == wxID_OK) 1613 - { 1614 - MainFrame->SetLastDirectory(lastDir); 1615 - ::wxBeginBusyCursor(); 1616 - MainFrame->DumpCsv(path, obj->GetName(), dlg.GetCharset()); 1617 - ::wxEndBusyCursor(); 1618 - } 1619 - } 1620 - } 1652 + int ret; 1653 + wxString path; 1654 + wxString lastDir; 1655 + wxString target; 1656 + MyObject *obj = (MyObject *) GetItemData (CurrentItem); 1657 + if (obj == NULL) 1658 + return; 1659 + wxFileDialog *fileDialog = new wxFileDialog (this, wxT ("Dump CSV file"), 1660 + wxT (""), wxT ("table.csv"), 1661 + wxT 1662 + ("File CSV (*.csv)|*.csv|All files (*.*)|*.*"), 1663 + wxFD_SAVE | 1664 + wxFD_OVERWRITE_PROMPT, 1665 + wxDefaultPosition, 1666 + wxDefaultSize, 1667 + wxT ("filedlg")); 1668 + lastDir = MainFrame->GetLastDirectory (); 1669 + if (lastDir.Len () >= 1) 1670 + fileDialog->SetDirectory (lastDir); 1671 + ret = fileDialog->ShowModal (); 1672 + if (ret == wxID_OK) 1673 + { 1674 + wxFileName file (fileDialog->GetPath ()); 1675 + path = file.GetPath (); 1676 + path += file.GetPathSeparator (); 1677 + path += file.GetName (); 1678 + path += wxT (".csv"); 1679 + lastDir = file.GetPath (); 1680 + if (MainFrame->IsSetAskCharset () == false) 1681 + { 1682 + // using the default output charset 1683 + MainFrame->SetLastDirectory (lastDir); 1684 + ::wxBeginBusyCursor (); 1685 + MainFrame->DumpCsv (path, obj->GetName (), 1686 + MainFrame->GetDefaultCharset ()); 1687 + ::wxEndBusyCursor (); 1688 + } 1689 + else 1690 + { 1691 + // asking the charset to be used 1692 + DumpTxtDialog dlg; 1693 + target = wxT ("CSV"); 1694 + dlg.Create (MainFrame, path, target, 1695 + MainFrame->GetDefaultCharset ()); 1696 + ret = dlg.ShowModal (); 1697 + if (ret == wxID_OK) 1698 + { 1699 + MainFrame->SetLastDirectory (lastDir); 1700 + ::wxBeginBusyCursor (); 1701 + MainFrame->DumpCsv (path, obj->GetName (), 1702 + dlg.GetCharset ()); 1703 + ::wxEndBusyCursor (); 1704 + } 1705 + } 1706 + } 1621 1707 } 1622 1708 1623 -void MyTableTree::OnCmdDumpHtml(wxCommandEvent & event) 1709 +void 1710 +MyTableTree::OnCmdDumpHtml (wxCommandEvent & event) 1624 1711 { 1625 1712 // 1626 1713 // menu event - dumping as Html 1627 1714 // 1628 - int ret; 1629 - wxString path; 1630 - wxString lastDir; 1631 - wxString target; 1632 - MyObject *obj = (MyObject *) GetItemData(CurrentItem); 1633 - if (obj == NULL) 1634 - return; 1635 - wxFileDialog *fileDialog = new wxFileDialog(this, wxT("Dump HTML file"), 1636 - wxT(""), wxT("table.html"), 1637 - wxT 1638 - ("HTML web page (*.html)|*.html|All files (*.*)|*.*"), 1639 - wxFD_SAVE | wxFD_OVERWRITE_PROMPT, 1640 - wxDefaultPosition, 1641 - wxDefaultSize, 1642 - wxT("filedlg")); 1643 - lastDir = MainFrame->GetLastDirectory(); 1644 - if (lastDir.Len() >= 1) 1645 - fileDialog->SetDirectory(lastDir); 1646 - ret = fileDialog->ShowModal(); 1647 - if (ret == wxID_OK) 1648 - { 1649 - wxFileName file(fileDialog->GetPath()); 1650 - path = file.GetPath(); 1651 - path += file.GetPathSeparator(); 1652 - path += file.GetName(); 1653 - path += wxT(".html"); 1654 - lastDir = file.GetPath(); 1655 - if (MainFrame->IsSetAskCharset() == false) 1656 - { 1657 - // using the default output charset 1658 - MainFrame->SetLastDirectory(lastDir); 1659 - ::wxBeginBusyCursor(); 1660 - MainFrame->DumpHtml(path, obj->GetName(), 1661 - MainFrame->GetDefaultCharset()); 1662 - ::wxEndBusyCursor(); 1663 - } else 1664 - { 1665 - // asking the charset to be used 1666 - DumpTxtDialog dlg; 1667 - target = wxT("HTML"); 1668 - dlg.Create(MainFrame, path, target, MainFrame->GetDefaultCharset()); 1669 - ret = dlg.ShowModal(); 1670 - if (ret == wxID_OK) 1671 - { 1672 - MainFrame->SetLastDirectory(lastDir); 1673 - ::wxBeginBusyCursor(); 1674 - MainFrame->DumpHtml(path, obj->GetName(), dlg.GetCharset()); 1675 - ::wxEndBusyCursor(); 1676 - } 1677 - } 1678 - } 1715 + int ret; 1716 + wxString path; 1717 + wxString lastDir; 1718 + wxString target; 1719 + MyObject *obj = (MyObject *) GetItemData (CurrentItem); 1720 + if (obj == NULL) 1721 + return; 1722 + wxFileDialog *fileDialog = new wxFileDialog (this, wxT ("Dump HTML file"), 1723 + wxT (""), wxT ("table.html"), 1724 + wxT 1725 + ("HTML web page (*.html)|*.html|All files (*.*)|*.*"), 1726 + wxFD_SAVE | 1727 + wxFD_OVERWRITE_PROMPT, 1728 + wxDefaultPosition, 1729 + wxDefaultSize, 1730 + wxT ("filedlg")); 1731 + lastDir = MainFrame->GetLastDirectory (); 1732 + if (lastDir.Len () >= 1) 1733 + fileDialog->SetDirectory (lastDir); 1734 + ret = fileDialog->ShowModal (); 1735 + if (ret == wxID_OK) 1736 + { 1737 + wxFileName file (fileDialog->GetPath ()); 1738 + path = file.GetPath (); 1739 + path += file.GetPathSeparator (); 1740 + path += file.GetName (); 1741 + path += wxT (".html"); 1742 + lastDir = file.GetPath (); 1743 + if (MainFrame->IsSetAskCharset () == false) 1744 + { 1745 + // using the default output charset 1746 + MainFrame->SetLastDirectory (lastDir); 1747 + ::wxBeginBusyCursor (); 1748 + MainFrame->DumpHtml (path, obj->GetName (), 1749 + MainFrame->GetDefaultCharset ()); 1750 + ::wxEndBusyCursor (); 1751 + } 1752 + else 1753 + { 1754 + // asking the charset to be used 1755 + DumpTxtDialog dlg; 1756 + target = wxT ("HTML"); 1757 + dlg.Create (MainFrame, path, target, 1758 + MainFrame->GetDefaultCharset ()); 1759 + ret = dlg.ShowModal (); 1760 + if (ret == wxID_OK) 1761 + { 1762 + MainFrame->SetLastDirectory (lastDir); 1763 + ::wxBeginBusyCursor (); 1764 + MainFrame->DumpHtml (path, obj->GetName (), 1765 + dlg.GetCharset ()); 1766 + ::wxEndBusyCursor (); 1767 + } 1768 + } 1769 + } 1679 1770 } 1680 1771 1681 -void MyTableTree::OnCmdEdit(wxCommandEvent & event) 1772 +void 1773 +MyTableTree::OnCmdEdit (wxCommandEvent & event) 1682 1774 { 1683 1775 // 1684 1776 // menu event - editing row valuew 1685 1777 // 1686 - char **results; 1687 - int rows; 1688 - int columns; 1689 - int i; 1690 - char *errMsg = NULL; 1691 - wxString sql; 1692 - char *column; 1693 - char *type; 1694 - int pk = 0; 1695 - int pb = 0; 1696 - int primaryKeys[1024]; 1697 - int blobCols[1024]; 1698 - for (i = 0; i < 1024; i++) 1699 - { 1700 - primaryKeys[i] = -1; 1701 - blobCols[i] = -1; 1702 - } 1703 - primaryKeys[pk++] = 0; 1704 - MyObject *obj = (MyObject *) GetItemData(CurrentItem); 1705 - if (obj == NULL) 1706 - return; 1707 - sql = wxT("PRAGMA table_info(\""); 1708 - sql += obj->GetName(); 1709 - sql += wxT("\")"); 1710 - int ret = sqlite3_get_table(MainFrame->GetSqlite(), sql.ToUTF8(), &results, 1711 - &rows, &columns, &errMsg); 1712 - if (ret != SQLITE_OK) 1713 - { 1714 - wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg), 1715 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 1716 - sqlite3_free(errMsg); 1717 - return; 1718 - } 1719 - sql = wxT(""); 1720 - if (rows < 1) 1721 - ; 1722 - else 1723 - { 1724 - sql = wxT("SELECT ROWID"); 1725 - for (i = 1; i <= rows; i++) 1726 - { 1727 - column = results[(i * columns) + 1]; 1728 - sql += wxT(", \""); 1729 - sql += wxString::FromUTF8(column); 1730 - sql += wxT("\""); 1731 - type = results[(i * columns) + 2]; 1732 - if (strcasecmp(type, "BLOB") == 0) 1733 - blobCols[pb++] = i; 1734 - if (atoi(results[(i * columns) + 5]) == 0) 1735 - ; 1736 - else 1737 - primaryKeys[pk++] = i; 1738 - } 1739 - } 1740 - sqlite3_free_table(results); 1741 - if (sql.Len() < 1) 1742 - return; 1743 - sql += wxT("\nFROM \""); 1744 - sql += obj->GetName(); 1745 - sql += wxT("\"\nORDER BY ROWID"); 1746 - MainFrame->EditTable(sql, primaryKeys, blobCols, obj->GetName()); 1778 + char **results; 1779 + int rows; 1780 + int columns; 1781 + int i; 1782 + char *errMsg = NULL; 1783 + wxString sql; 1784 + char *column; 1785 + char *type; 1786 + int pk = 0; 1787 + int pb = 0; 1788 + int primaryKeys[1024]; 1789 + int blobCols[1024]; 1790 + for (i = 0; i < 1024; i++) 1791 + { 1792 + primaryKeys[i] = -1; 1793 + blobCols[i] = -1; 1794 + } 1795 + primaryKeys[pk++] = 0; 1796 + MyObject *obj = (MyObject *) GetItemData (CurrentItem); 1797 + if (obj == NULL) 1798 + return; 1799 + sql = wxT ("PRAGMA table_info("); 1800 + sql += obj->GetName (); 1801 + sql += wxT (")"); 1802 + int ret = 1803 + sqlite3_get_table (MainFrame->GetSqlite (), sql.ToUTF8 (), &results, 1804 + &rows, &columns, &errMsg); 1805 + if (ret != SQLITE_OK) 1806 + { 1807 + wxMessageBox (wxT ("SQLite SQL error: ") + 1808 + wxString::FromUTF8 (errMsg), wxT ("spatialite-gui"), 1809 + wxOK | wxICON_ERROR, this); 1810 + sqlite3_free (errMsg); 1811 + return; 1812 + } 1813 + sql = wxT (""); 1814 + if (rows < 1) 1815 + ; 1816 + else 1817 + { 1818 + sql = wxT ("SELECT ROWID"); 1819 + for (i = 1; i <= rows; i++) 1820 + { 1821 + column = results[(i * columns) + 1]; 1822 + sql += wxT (", ") + wxString::FromUTF8 (column); 1823 + type = results[(i * columns) + 2]; 1824 + if (strcasecmp (type, "BLOB") == 0) 1825 + blobCols[pb++] = i; 1826 + if (atoi (results[(i * columns) + 5]) == 0) 1827 + ; 1828 + else 1829 + primaryKeys[pk++] = i; 1830 + } 1831 + } 1832 + sqlite3_free_table (results); 1833 + if (sql.Len () < 1) 1834 + return; 1835 + sql += wxT ("\nFROM "); 1836 + sql += obj->GetName (); 1837 + sql += wxT ("\nORDER BY ROWID"); 1838 + MainFrame->EditTable (sql, primaryKeys, blobCols, obj->GetName ()); 1747 1839 }
Changes to TextCsv.cpp.
1 1 /* 2 2 / TextCsv.cpp 3 3 / methods related to CSV/TXT loading 4 4 / 5 -/ version 1.2, 2008 October 9 5 +/ version 1.1, 2008 September 13 6 6 / 7 7 / Author: Sandro Furieri a-furieri@lqt.it 8 8 / 9 9 / Copyright (C) 2008 Alessandro Furieri 10 10 / 11 11 / This program is free software: you can redistribute it and/or modify 12 12 / it under the terms of the GNU General Public License as published by ................................................................................ 28 28 #define VRTTXT_TEXT 1 29 29 #define VRTTXT_INTEGER 2 30 30 #define VRTTXT_DOUBLE 3 31 31 32 32 struct row_buffer 33 33 { 34 34 /* a complete row */ 35 - int n_cells; /* how many cells are stored into this line */ 36 - char **cells; /* the cells array */ 37 - struct row_buffer *next; /* pointer for linked list */ 35 + int n_cells; /* how many cells are stored into this line */ 36 + char **cells; /* the cells array */ 37 + struct row_buffer *next; /* pointer for linked list */ 38 38 }; 39 39 40 40 struct text_buffer 41 41 { 42 - int max_n_cells; /* the maximun cell index */ 43 - char **titles; /* the column titles array */ 44 - char *types; /* the column types array */ 45 - int n_rows; /* the number of rows */ 46 - struct row_buffer **rows; /* the rows array */ 47 - struct row_buffer *first; /* pointers to build a linked list of rows */ 48 - struct row_buffer *last; 42 + int max_n_cells; /* the maximun cell index */ 43 + char **titles; /* the column titles array */ 44 + char *types; /* the column types array */ 45 + int n_rows; /* the number of rows */ 46 + struct row_buffer **rows; /* the rows array */ 47 + struct row_buffer *first; /* pointers to build a linked list of rows */ 48 + struct row_buffer *last; 49 49 }; 50 50 51 -static void text_insert_row(struct text_buffer *text, char **fields, 52 - int max_cell) 51 +static void 52 +text_insert_row (struct text_buffer *text, char **fields, int max_cell) 53 53 { 54 54 /* inserting a row into the text buffer struct */ 55 - int i; 56 - struct row_buffer *row = 57 - (struct row_buffer *) malloc(sizeof(struct row_buffer)); 58 - row->n_cells = max_cell + 1; 59 - if (max_cell < 0) 60 - row->cells = NULL; 61 - else 62 - { 63 - row->cells = (char **) malloc(sizeof(char *) * (max_cell + 1)); 64 - for (i = 0; i < row->n_cells; i++) 65 - { 66 - /* setting cell values */ 67 - *(row->cells + i) = *(fields + i); 68 - } 69 - } 70 - row->next = NULL; 55 + int i; 56 + struct row_buffer *row = 57 + (struct row_buffer *) malloc (sizeof (struct row_buffer)); 58 + row->n_cells = max_cell + 1; 59 + if (max_cell < 0) 60 + row->cells = NULL; 61 + else 62 + { 63 + row->cells = (char **) malloc (sizeof (char *) * (max_cell + 1)); 64 + for (i = 0; i < row->n_cells; i++) 65 + { 66 + /* setting cell values */ 67 + *(row->cells + i) = *(fields + i); 68 + } 69 + } 70 + row->next = NULL; 71 71 /* inserting the row into the linked list */ 72 - if (!(text->first)) 73 - text->first = row; 74 - if (text->last) 75 - text->last->next = row; 76 - text->last = row; 72 + if (!(text->first)) 73 + text->first = row; 74 + if (text->last) 75 + text->last->next = row; 76 + text->last = row; 77 77 } 78 78 79 -static struct text_buffer *text_buffer_alloc() 79 +static struct text_buffer * 80 +text_buffer_alloc () 80 81 { 81 82 /* allocating and initializing the text buffer struct */ 82 - struct text_buffer *text = 83 - (struct text_buffer *) malloc(sizeof(struct text_buffer)); 84 - text->max_n_cells = 0; 85 - text->titles = NULL; 86 - text->types = NULL; 87 - text->n_rows = 0; 88 - text->rows = NULL; 89 - text->first = NULL; 90 - text->last = NULL; 91 - return text; 83 + struct text_buffer *text = 84 + (struct text_buffer *) malloc (sizeof (struct text_buffer)); 85 + text->max_n_cells = 0; 86 + text->titles = NULL; 87 + text->types = NULL; 88 + text->n_rows = 0; 89 + text->rows = NULL; 90 + text->first = NULL; 91 + text->last = NULL; 92 + return text; 92 93 } 93 94 94 -static void text_buffer_free(struct text_buffer *text) 95 +static void 96 +text_buffer_free (struct text_buffer *text) 95 97 { 96 98 /* memory cleanup - freeing the text buffer */ 97 - int i; 98 - struct row_buffer *row; 99 - if (!text) 100 - return; 101 - row = text->first; 102 - while (row) 103 - { 104 - for (i = 0; i < row->n_cells; i++) 105 - { 106 - if (*(row->cells + i)) 107 - free(*(row->cells + i)); 108 - } 109 - row = row->next; 110 - } 111 - if (text->types) 112 - free(text->types); 113 - free(text); 99 + int i; 100 + struct row_buffer *row; 101 + if (!text) 102 + return; 103 + row = text->first; 104 + while (row) 105 + { 106 + for (i = 0; i < row->n_cells; i++) 107 + { 108 + if (*(row->cells + i)) 109 + free (*(row->cells + i)); 110 + } 111 + row = row->next; 112 + } 113 + if (text->types) 114 + free (text->types); 115 + free (text); 114 116 } 115 117 116 -static int text_is_integer(char *value) 118 +static int 119 +text_is_integer (char *value) 117 120 { 118 121 /* checking if this value can be an INTEGER */ 119 - int invalids = 0; 120 - int digits = 0; 121 - int signs = 0; 122 - char last = '\0'; 123 - char *p = value; 124 - while (*p != '\0') 125 - { 126 - last = *p; 127 - if (*p >= '0' && *p <= '9') 128 - digits++; 129 - else if (*p == '+' || *p == '-') 130 - signs++; 131 - else 132 - signs++; 133 - p++; 134 - } 135 - if (invalids) 136 - return 0; 137 - if (signs > 1) 138 - return 0; 139 - if (signs) 140 - { 141 - if (*value == '+' || *value == '-' || last == '+' || last == '-') 142 - ; 143 - else 144 - return 0; 145 - } 146 - return 1; 122 + int invalids = 0; 123 + int digits = 0; 124 + int signs = 0; 125 + char last = '\0'; 126 + char *p = value; 127 + while (*p != '\0') 128 + { 129 + last = *p; 130 + if (*p >= '0' && *p <= '9') 131 + digits++; 132 + else if (*p == '+' || *p == '-') 133 + signs++; 134 + else 135 + signs++; 136 + p++; 137 + } 138 + if (invalids) 139 + return 0; 140 + if (signs > 1) 141 + return 0; 142 + if (signs) 143 + { 144 + if (*value == '+' || *value == '-' || last == '+' || last == '-') 145 + ; 146 + else 147 + return 0; 148 + } 149 + return 1; 147 150 } 148 151 149 -static int text_is_double(char *value, char decimal_separator) 152 +static int 153 +text_is_double (char *value, char decimal_separator) 150 154 { 151 155 /* checking if this value can be a DOUBLE */ 152 - int invalids = 0; 153 - int digits = 0; 154 - int signs = 0; 155 - int points = 0; 156 - char last = '\0'; 157 - char *p = value; 158 - while (*p != '\0') 159 - { 160 - last = *p; 161 - if (*p >= '0' && *p <= '9') 162 - digits++; 163 - else if (*p == '+' || *p == '-') 164 - points++; 165 - else 166 - { 167 - if (decimal_separator == ',') 168 - { 169 - if (*p == ',') 170 - points++; 171 - else 172 - invalids++; 173 - } else 174 - { 175 - if (*p == '.') 176 - points++; 177 - else 178 - invalids++; 179 - } 180 - } 181 - p++; 182 - } 183 - if (invalids) 184 - return 0; 185 - if (points > 1) 186 - return 0; 187 - if (signs > 1) 188 - return 0; 189 - if (signs) 190 - { 191 - if (*value == '+' || *value == '-' || last == '+' || last == '-') 192 - ; 193 - else 194 - return 0; 195 - } 196 - return 1; 156 + int invalids = 0; 157 + int digits = 0; 158 + int signs = 0; 159 + int points = 0; 160 + char last = '\0'; 161 + char *p = value; 162 + while (*p != '\0') 163 + { 164 + last = *p; 165 + if (*p >= '0' && *p <= '9') 166 + digits++; 167 + else if (*p == '+' || *p == '-') 168 + points++; 169 + else 170 + { 171 + if (decimal_separator == ',') 172 + { 173 + if (*p == ',') 174 + points++; 175 + else 176 + invalids++; 177 + } 178 + else 179 + { 180 + if (*p == '.') 181 + points++; 182 + else 183 + invalids++; 184 + } 185 + } 186 + p++; 187 + } 188 + if (invalids) 189 + return 0; 190 + if (points > 1) 191 + return 0; 192 + if (signs > 1) 193 + return 0; 194 + if (signs) 195 + { 196 + if (*value == '+' || *value == '-' || last == '+' || last == '-') 197 + ; 198 + else 199 + return 0; 200 + } 201 + return 1; 197 202 } 198 203 199 -static void text_clean_integer(char *value) 204 +static void 205 +text_clean_integer (char *value) 200 206 { 201 207 /* cleaning an integer value */ 202 - char last; 203 - char buffer[35536]; 204 - int len = strlen(value); 205 - last = value[len - 1]; 206 - if (last == '-' || last == '+') 207 - { 208 - /* trailing sign; transforming into a leading sign */ 209 - *buffer = last; 210 - strcpy(buffer + 1, value); 211 - buffer[len - 1] = '\0'; 212 - strcpy(value, buffer); 213 - } 208 + char last; 209 + char buffer[35536]; 210 + int len = strlen (value); 211 + last = value[len - 1]; 212 + if (last == '-' || last == '+') 213 + { 214 + /* trailing sign; transforming into a leading sign */ 215 + *buffer = last; 216 + strcpy (buffer + 1, value); 217 + buffer[len - 1] = '\0'; 218 + strcpy (value, buffer); 219 + } 214 220 } 215 221 216 -static void text_clean_double(char *value) 222 +static void 223 +text_clean_double (char *value) 217 224 { 218 225 /* cleaning an integer value */ 219 - char *p; 220 - char last; 221 - char buffer[35536]; 222 - int len = strlen(value); 223 - last = value[len - 1]; 224 - if (last == '-' || last == '+') 225 - { 226 - /* trailing sign; transforming into a leading sign */ 227 - *buffer = last; 228 - strcpy(buffer + 1, value); 229 - buffer[len - 1] = '\0'; 230 - strcpy(value, buffer); 231 - } 232 - p = value; 233 - while (*p != '\0') 234 - { 235 - /* transforming COMMAs into POINTs */ 236 - if (*p == ',') 237 - *p = '.'; 238 - p++; 239 - } 226 + char *p; 227 + char last; 228 + char buffer[35536]; 229 + int len = strlen (value); 230 + last = value[len - 1]; 231 + if (last == '-' || last == '+') 232 + { 233 + /* trailing sign; transforming into a leading sign */ 234 + *buffer = last; 235 + strcpy (buffer + 1, value); 236 + buffer[len - 1] = '\0'; 237 + strcpy (value, buffer); 238 + } 239 + p = value; 240 + while (*p != '\0') 241 + { 242 + /* transforming COMMAs into POINTs */ 243 + if (*p == ',') 244 + *p = '.'; 245 + p++; 246 + } 240 247 } 241 248 242 -static int text_clean_text(char **value, void *toUtf8) 249 +static int 250 +text_clean_text (char **value, void *toUtf8) 243 251 { 244 252 /* cleaning a TEXT value and converting to UTF-8 */ 245 - char *text = *value; 246 - char *utf8text; 247 - int err; 248 - int i; 249 - int oldlen = strlen(text); 250 - int newlen; 251 - for (i = oldlen - 1; i > 0; i++) 252 - { 253 - /* cleaning up trailing spaces */ 254 - if (text[i] == ' ') 255 - text[i] = '\0'; 256 - else 257 - break; 258 - } 259 - utf8text = gaiaConvertToUTF8(toUtf8, text, oldlen, &err); 260 - if (err) 261 - return 1; 262 - newlen = strlen(utf8text); 263 - if (newlen <= oldlen) 264 - strcpy(*value, utf8text); 265 - else 266 - { 267 - free(*value); 268 - *value = (char *) malloc(newlen + 1); 269 - strcpy(*value, utf8text); 270 - } 271 - return 0; 253 + char *text = *value; 254 + char *utf8text; 255 + int err; 256 + int i; 257 + int oldlen = strlen (text); 258 + int newlen; 259 + for (i = oldlen - 1; i > 0; i++) 260 + { 261 + /* cleaning up trailing spaces */ 262 + if (text[i] == ' ') 263 + text[i] = '\0'; 264 + else 265 + break; 266 + } 267 + utf8text = gaiaConvertToUTF8 (toUtf8, text, oldlen, &err); 268 + if (err) 269 + return 1; 270 + newlen = strlen (utf8text); 271 + if (newlen <= oldlen) 272 + strcpy (*value, utf8text); 273 + else 274 + { 275 + free (*value); 276 + *value = (char *) malloc (newlen + 1); 277 + strcpy (*value, utf8text); 278 + } 279 + return 0; 272 280 } 273 281 274 -static struct text_buffer *text_parse(const char *path, const char *encoding, 275 - bool first_line_titles, 276 - char field_separator, char text_separator, 277 - char decimal_separator) 282 +static struct text_buffer * 283 +text_parse (const char *path, const char *encoding, bool first_line_titles, 284 + char field_separator, char text_separator, char decimal_separator) 278 285 { 279 286 /* trying to open and parse the text file */ 280 - int c; 281 - int fld; 282 - int len; 283 - int max_cell; 284 - int is_string = 0; 285 - char last = '\0'; 286 - char *fields[4096]; 287 - char buffer[35536]; 288 - char *p = buffer; 289 - struct text_buffer *text; 290 - int nrows; 291 - int ncols; 292 - int errs; 293 - struct row_buffer *row; 294 - void *toUtf8; 295 - int encoding_errors; 296 - int ir; 297 - char title[64]; 298 - char *first_valid_row; 299 - int i; 300 - char *name; 301 - for (fld = 0; fld < 4096; fld++) 302 - { 303 - /* preparing an empty row */ 304 - fields[fld] = NULL; 305 - } 287 + int c; 288 + int fld; 289 + int len; 290 + int max_cell; 291 + int is_string = 0; 292 + char last = '\0'; 293 + char *fields[4096]; 294 + char buffer[35536]; 295 + char *p = buffer; 296 + struct text_buffer *text; 297 + int nrows; 298 + int ncols; 299 + int errs; 300 + struct row_buffer *row; 301 + void *toUtf8; 302 + int encoding_errors; 303 + int ir; 304 + char title[64]; 305 + char *first_valid_row; 306 + int i; 307 + char *name; 308 + for (fld = 0; fld < 4096; fld++) 309 + { 310 + /* preparing an empty row */ 311 + fields[fld] = NULL; 312 + } 306 313 /* trying to open the text file */ 307 - FILE *in = fopen(path, "rb"); 308 - if (!in) 309 - return NULL; 310 - text = text_buffer_alloc(); 311 - fld = 0; 312 - while ((c = getc(in)) != EOF) 313 - { 314 - /* parsing the file, one char at each time */ 315 - if (c == '\r' && !is_string) 316 - { 317 - last = c; 318 - continue; 319 - } 320 - if (c == field_separator && !is_string) 321 - { 322 - /* insering a field into the fields tmp array */ 323 - last = c; 324 - *p = '\0'; 325 - len = strlen(buffer); 326 - if (len) 327 - { 328 - fields[fld] = (char *) malloc(len + 1); 329 - strcpy(fields[fld], buffer); 330 - } 331 - fld++; 332 - p = buffer; 333 - *p = '\0'; 334 - continue; 335 - } 336 - if (c == text_separator) 337 - { 338 - /* found a text separator */ 339 - if (is_string) 340 - { 341 - is_string = 0; 342 - last = c; 343 - } else 344 - { 345 - if (last == text_separator) 346 - *p++ = text_separator; 347 - is_string = 1; 348 - } 349 - continue; 350 - } 351 - last = c; 352 - if (c == '\n' && !is_string) 353 - { 354 - /* inserting the row into the text buffer */ 355 - *p = '\0'; 356 - len = strlen(buffer); 357 - if (len) 358 - { 359 - fields[fld] = (char *) malloc(len + 1); 360 - strcpy(fields[fld], buffer); 361 - } 362 - fld++; 363 - p = buffer; 364 - *p = '\0'; 365 - max_cell = -1; 366 - for (fld = 0; fld < 4096; fld++) 367 - { 368 - if (fields[fld]) 369 - max_cell = fld; 370 - } 371 - text_insert_row(text, fields, max_cell); 372 - for (fld = 0; fld < 4096; fld++) 373 - { 374 - /* resetting an empty row */ 375 - fields[fld] = NULL; 376 - } 377 - fld = 0; 378 - continue; 379 - } 380 - *p++ = c; 381 - } 382 - fclose(in); 314 + FILE *in = fopen (path, "rb"); 315 + if (!in) 316 + return NULL; 317 + text = text_buffer_alloc (); 318 + fld = 0; 319 + while ((c = getc (in)) != EOF) 320 + { 321 + /* parsing the file, one char at each time */ 322 + if (c == '\r' && !is_string) 323 + { 324 + last = c; 325 + continue; 326 + } 327 + if (c == field_separator && !is_string) 328 + { 329 + /* insering a field into the fields tmp array */ 330 + last = c; 331 + *p = '\0'; 332 + len = strlen (buffer); 333 + if (len) 334 + { 335 + fields[fld] = (char *) malloc (len + 1); 336 + strcpy (fields[fld], buffer); 337 + } 338 + fld++; 339 + p = buffer; 340 + *p = '\0'; 341 + continue; 342 + } 343 + if (c == text_separator) 344 + { 345 + /* found a text separator */ 346 + if (is_string) 347 + { 348 + is_string = 0; 349 + last = c; 350 + } 351 + else 352 + { 353 + if (last == text_separator) 354 + *p++ = text_separator; 355 + is_string = 1; 356 + } 357 + continue; 358 + } 359 + last = c; 360 + if (c == '\n' && !is_string) 361 + { 362 + /* inserting the row into the text buffer */ 363 + *p = '\0'; 364 + len = strlen (buffer); 365 + if (len) 366 + { 367 + fields[fld] = (char *) malloc (len + 1); 368 + strcpy (fields[fld], buffer); 369 + } 370 + fld++; 371 + p = buffer; 372 + *p = '\0'; 373 + max_cell = -1; 374 + for (fld = 0; fld < 4096; fld++) 375 + { 376 + if (fields[fld]) 377 + max_cell = fld; 378 + } 379 + text_insert_row (text, fields, max_cell); 380 + for (fld = 0; fld < 4096; fld++) 381 + { 382 + /* resetting an empty row */ 383 + fields[fld] = NULL; 384 + } 385 + fld = 0; 386 + continue; 387 + } 388 + *p++ = c; 389 + } 390 + fclose (in); 383 391 /* checking if the text file really seems to contain a table */ 384 - nrows = 0; 385 - ncols = 0; 386 - errs = 0; 387 - row = text->first; 388 - while (row) 389 - { 390 - if (first_line_titles == true && row == text->first) 391 - { 392 - /* skipping first line */ 393 - row = row->next; 394 - continue; 395 - } 396 - nrows++; 397 - if (row->n_cells > ncols) 398 - ncols = row->n_cells; 399 - row = row->next; 400 - } 401 - if (nrows == 0 && ncols == 0) 402 - { 403 - text_buffer_free(text); 404 - return NULL; 405 - } 406 - text->n_rows = nrows; 392 + nrows = 0; 393 + ncols = 0; 394 + errs = 0; 395 + row = text->first; 396 + while (row) 397 + { 398 + if (first_line_titles == true && row == text->first) 399 + { 400 + /* skipping first line */ 401 + row = row->next; 402 + continue; 403 + } 404 + nrows++; 405 + if (row->n_cells > ncols) 406 + ncols = row->n_cells; 407 + row = row->next; 408 + } 409 + if (nrows == 0 && ncols == 0) 410 + { 411 + text_buffer_free (text); 412 + return NULL; 413 + } 414 + text->n_rows = nrows; 407 415 /* going to check the column types */ 408 - text->max_n_cells = ncols; 409 - text->types = (char *) malloc(sizeof(char) * text->max_n_cells); 410 - first_valid_row = (char *) malloc(sizeof(char) * text->max_n_cells); 411 - for (fld = 0; fld < text->max_n_cells; fld++) 412 - { 413 - /* initally assuming any cell contains TEXT */ 414 - *(text->types + fld) = VRTTXT_TEXT; 415 - *(first_valid_row + fld) = 1; 416 - } 417 - row = text->first; 418 - while (row) 419 - { 420 - if (first_line_titles == true && row == text->first) 421 - { 422 - /* skipping first line */ 423 - row = row->next; 424 - continue; 425 - } 426 - for (fld = 0; fld < row->n_cells; fld++) 427 - { 428 - if (*(row->cells + fld)) 429 - { 430 - if (text_is_integer(*(row->cells + fld))) 431 - { 432 - if (*(first_valid_row + fld)) 433 - { 434 - *(text->types + fld) = VRTTXT_INTEGER; 435 - *(first_valid_row + fld) = 0; 436 - } 437 - } else if (text_is_double(*(row->cells + fld), decimal_separator)) 438 - { 439 - if (*(first_valid_row + fld)) 440 - { 441 - *(text->types + fld) = VRTTXT_DOUBLE; 442 - *(first_valid_row + fld) = 0; 443 - } else 444 - { 445 - /* promoting an INTEGER column to be of the DOUBLE type */ 446 - if (*(text->types + fld) == VRTTXT_INTEGER) 447 - *(text->types + fld) = VRTTXT_DOUBLE; 448 - } 449 - } else 450 - { 451 - /* this column is anyway of the TEXT type */ 452 - *(text->types + fld) = VRTTXT_TEXT; 453 - if (*(first_valid_row + fld)) 454 - *(first_valid_row + fld) = 0; 455 - } 456 - } 457 - } 458 - row = row->next; 459 - } 460 - free(first_valid_row); 416 + text->max_n_cells = ncols; 417 + text->types = (char *) malloc (sizeof (char) * text->max_n_cells); 418 + first_valid_row = (char *) malloc (sizeof (char) * text->max_n_cells); 419 + for (fld = 0; fld < text->max_n_cells; fld++) 420 + { 421 + /* initally assuming any cell contains TEXT */ 422 + *(text->types + fld) = VRTTXT_TEXT; 423 + *(first_valid_row + fld) = 1; 424 + } 425 + row = text->first; 426 + while (row) 427 + { 428 + if (first_line_titles == true && row == text->first) 429 + { 430 + /* skipping first line */ 431 + row = row->next; 432 + continue; 433 + } 434 + for (fld = 0; fld < row->n_cells; fld++) 435 + { 436 + if (*(row->cells + fld)) 437 + { 438 + if (text_is_integer (*(row->cells + fld))) 439 + { 440 + if (*(first_valid_row + fld)) 441 + { 442 + *(text->types + fld) = VRTTXT_INTEGER; 443 + *(first_valid_row + fld) = 0; 444 + } 445 + } 446 + else if (text_is_double 447 + (*(row->cells + fld), decimal_separator)) 448 + { 449 + if (*(first_valid_row + fld)) 450 + { 451 + *(text->types + fld) = VRTTXT_DOUBLE; 452 + *(first_valid_row + fld) = 0; 453 + } 454 + else 455 + { 456 + /* promoting an INTEGER column to be of the DOUBLE type */ 457 + if (*(text->types + fld) == VRTTXT_INTEGER) 458 + *(text->types + fld) = VRTTXT_DOUBLE; 459 + } 460 + } 461 + else 462 + { 463 + /* this column is anyway of the TEXT type */ 464 + *(text->types + fld) = VRTTXT_TEXT; 465 + if (*(first_valid_row + fld)) 466 + *(first_valid_row + fld) = 0; 467 + } 468 + } 469 + } 470 + row = row->next; 471 + } 472 + free (first_valid_row); 461 473 /* preparing the column names */ 462 - text->titles = (char **) malloc(sizeof(char *) * text->max_n_cells); 463 - if (first_line_titles == true) 464 - { 465 - for (fld = 0; fld < text->max_n_cells; fld++) 466 - { 467 - if (fld >= text->first->n_cells) 468 - { 469 - /* this column name is NULL; setting a default name */ 470 - sprintf(title, "COL%03d", fld + 1); 471 - len = strlen(title); 472 - *(text->titles + fld) = (char *) malloc(len + 1); 473 - strcpy(*(text->titles + fld), title); 474 - } else 475 - { 476 - if (*(text->first->cells + fld)) 477 - { 478 - len = strlen(*(text->first->cells + fld)); 479 - *(text->titles + fld) = (char *) malloc(len + 1); 480 - strcpy(*(text->titles + fld), *(text->first->cells + fld)); 481 - name = *(text->titles + fld); 482 - for (i = 0; i < len; i++) 483 - { 484 - /* masking any space in the column name */ 485 - if (*(name + i) == ' ') 486 - *(name + i) = '_'; 487 - } 488 - } else 489 - { 490 - /* this column name is NULL; setting a default name */ 491 - sprintf(title, "COL%03d", fld + 1); 492 - len = strlen(title); 493 - *(text->titles + fld) = (char *) malloc(len + 1); 494 - strcpy(*(text->titles + fld), title); 495 - } 496 - } 497 - } 498 - } else 499 - { 500 - for (fld = 0; fld < text->max_n_cells; fld++) 501 - { 502 - sprintf(title, "COL%03d", fld + 1); 503 - len = strlen(title); 504 - *(text->titles + fld) = (char *) malloc(len + 1); 505 - strcpy(*(text->titles + fld), title); 506 - } 507 - } 474 + text->titles = (char **) malloc (sizeof (char *) * text->max_n_cells); 475 + if (first_line_titles == true) 476 + { 477 + for (fld = 0; fld < text->max_n_cells; fld++) 478 + { 479 + if (fld >= text->first->n_cells) 480 + { 481 + /* this column name is NULL; setting a default name */ 482 + sprintf (title, "COL%03d", fld + 1); 483 + len = strlen (title); 484 + *(text->titles + fld) = (char *) malloc (len + 1); 485 + strcpy (*(text->titles + fld), title); 486 + } 487 + else 488 + { 489 + if (*(text->first->cells + fld)) 490 + { 491 + len = strlen (*(text->first->cells + fld)); 492 + *(text->titles + fld) = (char *) malloc (len + 1); 493 + strcpy (*(text->titles + fld), 494 + *(text->first->cells + fld)); 495 + name = *(text->titles + fld); 496 + for (i = 0; i < len; i++) 497 + { 498 + /* masking any space in the column name */ 499 + if (*(name + i) == ' ') 500 + *(name + i) = '_'; 501 + } 502 + } 503 + else 504 + { 505 + /* this column name is NULL; setting a default name */ 506 + sprintf (title, "COL%03d", fld + 1); 507 + len = strlen (title); 508 + *(text->titles + fld) = (char *) malloc (len + 1); 509 + strcpy (*(text->titles + fld), title); 510 + } 511 + } 512 + } 513 + } 514 + else 515 + { 516 + for (fld = 0; fld < text->max_n_cells; fld++) 517 + { 518 + sprintf (title, "COL%03d", fld + 1); 519 + len = strlen (title); 520 + *(text->titles + fld) = (char *) malloc (len + 1); 521 + strcpy (*(text->titles + fld), title); 522 + } 523 + } 508 524 /* cleaning cell values when needed */ 509 - toUtf8 = gaiaCreateUTF8Converter(encoding); 510 - if (!toUtf8) 511 - { 512 - text_buffer_free(text); 513 - return NULL; 514 - } 515 - encoding_errors = 0; 516 - row = text->first; 517 - while (row) 518 - { 519 - if (first_line_titles == true && row == text->first) 520 - { 521 - /* skipping first line */ 522 - row = row->next; 523 - continue; 524 - } 525 - for (fld = 0; fld < row->n_cells; fld++) 526 - { 527 - if (*(row->cells + fld)) 528 - { 529 - if (*(text->types + fld) == VRTTXT_INTEGER) 530 - text_clean_integer(*(row->cells + fld)); 531 - else if (*(text->types + fld) == VRTTXT_DOUBLE) 532 - text_clean_double(*(row->cells + fld)); 533 - else 534 - encoding_errors += text_clean_text(row->cells + fld, toUtf8); 535 - } 536 - } 537 - row = row->next; 538 - } 539 - gaiaFreeUTF8Converter(toUtf8); 540 - if (encoding_errors) 541 - { 542 - text_buffer_free(text); 543 - return NULL; 544 - } 525 + toUtf8 = gaiaCreateUTF8Converter (encoding); 526 + if (!toUtf8) 527 + { 528 + text_buffer_free (text); 529 + return NULL; 530 + } 531 + encoding_errors = 0; 532 + row = text->first; 533 + while (row) 534 + { 535 + if (first_line_titles == true && row == text->first) 536 + { 537 + /* skipping first line */ 538 + row = row->next; 539 + continue; 540 + } 541 + for (fld = 0; fld < row->n_cells; fld++) 542 + { 543 + if (*(row->cells + fld)) 544 + { 545 + if (*(text->types + fld) == VRTTXT_INTEGER) 546 + text_clean_integer (*(row->cells + fld)); 547 + else if (*(text->types + fld) == VRTTXT_DOUBLE) 548 + text_clean_double (*(row->cells + fld)); 549 + else 550 + encoding_errors += 551 + text_clean_text (row->cells + fld, toUtf8); 552 + } 553 + } 554 + row = row->next; 555 + } 556 + gaiaFreeUTF8Converter (toUtf8); 557 + if (encoding_errors) 558 + { 559 + text_buffer_free (text); 560 + return NULL; 561 + } 545 562 /* ok, we can now go to prepare the rows array */ 546 - text->rows = 547 - (struct row_buffer **) malloc(sizeof(struct text_row *) * text->n_rows); 548 - ir = 0; 549 - row = text->first; 550 - while (row) 551 - { 552 - if (first_line_titles == true && row == text->first) 553 - { 554 - /* skipping first line */ 555 - row = row->next; 556 - continue; 557 - } 558 - *(text->rows + ir++) = row; 559 - row = row->next; 560 - } 561 - return text; 563 + text->rows = 564 + (struct row_buffer **) malloc (sizeof (struct text_row *) * 565 + text->n_rows); 566 + ir = 0; 567 + row = text->first; 568 + while (row) 569 + { 570 + if (first_line_titles == true && row == text->first) 571 + { 572 + /* skipping first line */ 573 + row = row->next; 574 + continue; 575 + } 576 + *(text->rows + ir++) = row; 577 + row = row->next; 578 + } 579 + return text; 562 580 } 563 581 564 582 void 565 - MyFrame::LoadText(wxString & path, wxString & table, wxString & charset, 566 - bool first_titles, char decimal_separator, char separator, 567 - char text_separator) 583 +MyFrame::LoadText (wxString & path, wxString & table, wxString & charset, 584 + bool first_titles, char decimal_separator, char separator, 585 + char text_separator) 568 586 { 569 587 // 570 588 // loading a CSV/TXT as a new DB table 571 589 // 572 - struct text_buffer *text = NULL; 573 - struct row_buffer *row; 574 - int seed; 575 - int dup; 576 - int idup; 577 - char dummy[65536]; 578 - char dummyName[4096]; 579 - char **col_name = NULL; 580 - int i; 581 - char sql[65536]; 582 - int len; 583 - int ret; 584 - int rows = 0; 585 - char *errMsg = NULL; 586 - bool sqlError = false; 587 - char xtable[1024]; 588 - int current_row; 589 - wxString msg; 590 + struct text_buffer *text = NULL; 591 + struct row_buffer *row; 592 + int seed; 593 + int dup; 594 + int idup; 595 + char dummy[65536]; 596 + char dummyName[4096]; 597 + char **col_name = NULL; 598 + int i; 599 + char sql[65536]; 600 + int len; 601 + int ret; 602 + int rows = 0; 603 + char *errMsg = NULL; 604 + bool sqlError = false; 605 + char xtable[1024]; 606 + int current_row; 607 + wxString msg; 590 608 // 591 609 // performing some checks before starting 592 610 // 593 - if (TableAlreadyExists(table) == true) 594 - { 595 - wxMessageBox(wxT("a table name '") + table + wxT("' already exists"), 596 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 597 - return; 598 - } 599 - text = 600 - text_parse(path.ToUTF8(), charset.ToUTF8(), first_titles, separator, 601 - text_separator, decimal_separator); 602 - if (!text) 603 - return; 604 - ::wxBeginBusyCursor(); 611 + if (TableAlreadyExists (table) == true) 612 + { 613 + wxMessageBox (wxT ("a table name '") + table + 614 + wxT ("' already exists"), wxT ("spatialite-gui"), 615 + wxOK | wxICON_ERROR, this); 616 + return; 617 + } 618 + if (gaiaIllegalSqlName (table.ToUTF8 ()) == 1 619 + || gaiaIsReservedSqlName (table.ToUTF8 ()) == 1 620 + || gaiaIsReservedSqliteName (table.ToUTF8 ()) == 1) 621 + { 622 + wxMessageBox (wxT ("'") + table + 623 + wxT 624 + ("' is an invalid TABLE NAME\n\nsame as SQL reserved keyword"), 625 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, this); 626 + return; 627 + } 628 + text = 629 + text_parse (path.ToUTF8 (), charset.ToUTF8 (), first_titles, separator, 630 + text_separator, decimal_separator); 631 + if (!text) 632 + return; 633 + ::wxBeginBusyCursor (); 605 634 // 606 635 // checking for duplicate / illegal column names and antialising them 607 636 // 608 - col_name = (char **) malloc(sizeof(char *) * text->max_n_cells); 609 - seed = 0; 610 - for (i = 0; i < text->max_n_cells; i++) 611 - { 612 - strcpy(dummyName, *(text->titles + i)); 613 - dup = 0; 614 - for (idup = 0; idup < i; idup++) 615 - { 616 - if (strcasecmp(dummyName, *(col_name + idup)) == 0) 617 - dup = 1; 618 - } 619 - if (strcasecmp(dummyName, "PKUID") == 0) 620 - dup = 1; 621 - if (strcasecmp(dummyName, "Geometry") == 0) 622 - dup = 1; 623 - if (dup) 624 - sprintf(dummyName, "COL_%d", seed++); 625 - len = strlen(dummyName); 626 - *(col_name + i) = (char *) malloc(len + 1); 627 - strcpy(*(col_name + i), dummyName); 628 - } 637 + col_name = (char **) malloc (sizeof (char *) * text->max_n_cells); 638 + seed = 0; 639 + for (i = 0; i < text->max_n_cells; i++) 640 + { 641 + if (gaiaIllegalSqlName (*(text->titles + i)) 642 + || gaiaIsReservedSqlName (*(text->titles + i)) 643 + || gaiaIsReservedSqliteName (*(text->titles + i))) 644 + sprintf (dummyName, "COL_%d", seed++); 645 + else 646 + strcpy (dummyName, *(text->titles + i)); 647 + dup = 0; 648 + for (idup = 0; idup < i; idup++) 649 + { 650 + if (strcasecmp (dummyName, *(col_name + idup)) == 0) 651 + dup = 1; 652 + } 653 + if (strcasecmp (dummyName, "PKUID") == 0) 654 + dup = 1; 655 + if (strcasecmp (dummyName, "Geometry") == 0) 656 + dup = 1; 657 + if (dup) 658 + sprintf (dummyName, "COL_%d", seed++); 659 + len = strlen (dummyName); 660 + *(col_name + i) = (char *) malloc (len + 1); 661 + strcpy (*(col_name + i), dummyName); 662 + } 629 663 // 630 664 // starting a transaction 631 665 // 632 - ret = sqlite3_exec(SqliteHandle, "BEGIN", NULL, 0, &errMsg); 633 - if (ret != SQLITE_OK) 634 - { 635 - wxMessageBox(wxT("load CSV/TXT error:") + wxString::FromUTF8(errMsg), 636 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 637 - sqlite3_free(errMsg); 638 - sqlError = true; 639 - goto clean_up; 640 - } 666 + ret = sqlite3_exec (SqliteHandle, "BEGIN", NULL, 0, &errMsg); 667 + if (ret != SQLITE_OK) 668 + { 669 + wxMessageBox (wxT ("load CSV/TXT error:") + 670 + wxString::FromUTF8 (errMsg), wxT ("spatialite-gui"), 671 + wxOK | wxICON_ERROR, this); 672 + sqlite3_free (errMsg); 673 + sqlError = true; 674 + goto clean_up; 675 + } 641 676 // 642 677 // creating the Table 643 678 // 644 - strcpy(xtable, table.ToUTF8()); 645 - sprintf(sql, "CREATE TABLE \"%s\"", xtable); 646 - strcat(sql, " (\n\"PK_UID\" INTEGER PRIMARY KEY AUTOINCREMENT"); 647 - for (i = 0; i < text->max_n_cells; i++) 648 - { 649 - strcat(sql, ",\n\""); 650 - strcat(sql, *(col_name + i)); 651 - if (*(text->types + i) == VRTTXT_INTEGER) 652 - strcat(sql, "\" INTEGER"); 653 - else if (*(text->types + i) == VRTTXT_DOUBLE) 654 - strcat(sql, "\" DOUBLE"); 655 - else 656 - strcat(sql, "\" TEXT"); 657 - } 658 - strcat(sql, ")"); 659 - ret = sqlite3_exec(SqliteHandle, sql, NULL, 0, &errMsg); 660 - if (ret != SQLITE_OK) 661 - { 662 - wxMessageBox(wxT("load text error:") + wxString::FromUTF8(errMsg), 663 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 664 - sqlite3_free(errMsg); 665 - sqlError = true; 666 - goto clean_up; 667 - } 668 - current_row = 0; 669 - while (current_row < text->n_rows) 670 - { 671 - // 672 - // inserting rows from CSV/TXT 673 - // 674 - sprintf(sql, "INSERT INTO \"%s\" (\n\"PK_UID\"", xtable); 675 - for (i = 0; i < text->max_n_cells; i++) 676 - { 677 - // columns corresponding to some CSV/TXT column 678 - strcat(sql, ",\""); 679 - strcat(sql, *(col_name + i)); 680 - strcat(sql, "\""); 681 - } 682 - strcat(sql, ")\nVALUES ("); 683 - sprintf(dummy, "%d", current_row); 684 - strcat(sql, dummy); 685 - for (i = 0; i < text->max_n_cells; i++) 686 - { 687 - // column values 688 - row = *(text->rows + current_row); 689 - strcat(sql, ","); 690 - if (i >= row->n_cells) 691 - strcat(sql, "NULL"); 692 - else 693 - { 694 - if (*(row->cells + i)) 695 - { 696 - if (*(text->types + i) == VRTTXT_INTEGER) 697 - { 698 - sprintf(dummy, "%d", atoi(*(row->cells + i))); 699 - strcat(sql, dummy); 700 - } else if (*(text->types + i) == VRTTXT_DOUBLE) 701 - { 702 - sprintf(dummy, "%1.6lf", atof(*(row->cells + i))); 703 - strcat(sql, dummy); 704 - } else 705 - { 706 - strcpy(dummy, *(row->cells + i)); 707 - CleanSqlString(dummy); 708 - strcat(sql, "'"); 709 - strcat(sql, dummy); 710 - strcat(sql, "'"); 711 - } 712 - } else 713 - strcat(sql, "NULL"); 714 - } 715 - } 716 - strcat(sql, ")"); 717 - ret = sqlite3_exec(SqliteHandle, sql, NULL, 0, &errMsg); 718 - if (ret != SQLITE_OK) 719 - { 720 - wxMessageBox(wxT("load text error:") + wxString::FromUTF8(errMsg), 721 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 722 - sqlite3_free(errMsg); 723 - sqlError = true; 724 - goto clean_up; 725 - } 726 - rows++; 727 - current_row++; 728 - } 729 -clean_up: 730 - if (col_name) 731 - { 732 - // releasing memory allocation for column names 733 - for (i = 0; i < text->max_n_cells; i++) 734 - free(*(col_name + i)); 735 - free(col_name); 736 - } 737 - free(text); 738 - if (sqlError == true) 739 - { 740 - // some error occurred - ROLLBACK 741 - ret = sqlite3_exec(SqliteHandle, "ROLLBACK", NULL, 0, &errMsg); 742 - if (ret != SQLITE_OK) 743 - { 744 - wxMessageBox(wxT("load text error:") + wxString::FromUTF8(errMsg), 745 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 746 - sqlite3_free(errMsg); 747 - } 748 - ::wxEndBusyCursor(); 749 - msg = 750 - wxT("CSV/TXT not loaded\n\n\na ROLLBACK was automatically performed"); 751 - wxMessageBox(msg, wxT("spatialite-gui"), wxOK | wxICON_WARNING, this); 752 - } else 753 - { 754 - // ok - confirming pending transaction - COMMIT 755 - ret = sqlite3_exec(SqliteHandle, "COMMIT", NULL, 0, &errMsg); 756 - if (ret != SQLITE_OK) 757 - { 758 - wxMessageBox(wxT("load text error:") + wxString::FromUTF8(errMsg), 759 - wxT("spatialite-gui"), wxOK | wxICON_ERROR, this); 760 - sqlite3_free(errMsg); 761 - return; 762 - } 763 - ::wxEndBusyCursor(); 764 - sprintf(dummy, "CSV/TXT loaded\n\n%d inserted rows", rows); 765 - msg = wxString::FromUTF8(dummy); 766 - wxMessageBox(msg, wxT("spatialite-gui"), wxOK | wxICON_INFORMATION, this); 767 - InitTableTree(); 768 - } 679 + strcpy (xtable, table.ToUTF8 ()); 680 + sprintf (sql, "CREATE TABLE %s", xtable); 681 + strcat (sql, " (\nPK_UID INTEGER PRIMARY KEY AUTOINCREMENT"); 682 + for (i = 0; i < text->max_n_cells; i++) 683 + { 684 + strcat (sql, ",\n"); 685 + strcat (sql, *(col_name + i)); 686 + if (*(text->types + i) == VRTTXT_INTEGER) 687 + strcat (sql, " INTEGER"); 688 + else if (*(text->types + i) == VRTTXT_DOUBLE) 689 + strcat (sql, " DOUBLE"); 690 + else 691 + strcat (sql, " TEXT"); 692 + } 693 + strcat (sql, ")"); 694 + ret = sqlite3_exec (SqliteHandle, sql, NULL, 0, &errMsg); 695 + if (ret != SQLITE_OK) 696 + { 697 + wxMessageBox (wxT ("load text error:") + 698 + wxString::FromUTF8 (errMsg), wxT ("spatialite-gui"), 699 + wxOK | wxICON_ERROR, this); 700 + sqlite3_free (errMsg); 701 + sqlError = true; 702 + goto clean_up; 703 + } 704 + current_row = 0; 705 + while (current_row < text->n_rows) 706 + { 707 + // 708 + // inserting rows from CSV/TXT 709 + // 710 + sprintf (sql, "INSERT INTO %s (\nPK_UID", xtable); 711 + for (i = 0; i < text->max_n_cells; i++) 712 + { 713 + // columns corresponding to some CSV/TXT column 714 + strcat (sql, ","); 715 + strcat (sql, *(col_name + i)); 716 + } 717 + strcat (sql, ")\nVALUES ("); 718 + sprintf (dummy, "%d", current_row); 719 + strcat (sql, dummy); 720 + for (i = 0; i < text->max_n_cells; i++) 721 + { 722 + // column values 723 + row = *(text->rows + current_row); 724 + strcat (sql, ","); 725 + if (i >= row->n_cells) 726 + strcat (sql, "NULL"); 727 + else 728 + { 729 + if (*(row->cells + i)) 730 + { 731 + if (*(text->types + i) == VRTTXT_INTEGER) 732 + { 733 + sprintf (dummy, "%d", 734 + atoi (*(row->cells + i))); 735 + strcat (sql, dummy); 736 + } 737 + else if (*(text->types + i) == VRTTXT_DOUBLE) 738 + { 739 + sprintf (dummy, "%1.6lf", 740 + atof (*(row->cells + i))); 741 + strcat (sql, dummy); 742 + } 743 + else 744 + { 745 + strcpy (dummy, *(row->cells + i)); 746 + CleanSqlString (dummy); 747 + strcat (sql, "'"); 748 + strcat (sql, dummy); 749 + strcat (sql, "'"); 750 + } 751 + } 752 + else 753 + strcat (sql, "NULL"); 754 + } 755 + } 756 + strcat (sql, ")"); 757 + ret = sqlite3_exec (SqliteHandle, sql, NULL, 0, &errMsg); 758 + if (ret != SQLITE_OK) 759 + { 760 + wxMessageBox (wxT ("load text error:") + 761 + wxString::FromUTF8 (errMsg), 762 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 763 + this); 764 + sqlite3_free (errMsg); 765 + sqlError = true; 766 + goto clean_up; 767 + } 768 + rows++; 769 + current_row++; 770 + } 771 + clean_up: 772 + if (col_name) 773 + { 774 + // releasing memory allocation for column names 775 + for (i = 0; i < text->max_n_cells; i++) 776 + free (*(col_name + i)); 777 + free (col_name); 778 + } 779 + free (text); 780 + if (sqlError == true) 781 + { 782 + // some error occurred - ROLLBACK 783 + ret = sqlite3_exec (SqliteHandle, "ROLLBACK", NULL, 0, &errMsg); 784 + if (ret != SQLITE_OK) 785 + { 786 + wxMessageBox (wxT ("load text error:") + 787 + wxString::FromUTF8 (errMsg), 788 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 789 + this); 790 + sqlite3_free (errMsg); 791 + } 792 + ::wxEndBusyCursor (); 793 + msg.Printf (wxT 794 + ("CSV/TXT not loaded\n\n\na ROLLBACK was automatically performed")); 795 + wxMessageBox (msg, wxT ("spatialite-gui"), wxOK | wxICON_WARNING, 796 + this); 797 + } 798 + else 799 + { 800 + // ok - confirming pending transaction - COMMIT 801 + ret = sqlite3_exec (SqliteHandle, "COMMIT", NULL, 0, &errMsg); 802 + if (ret != SQLITE_OK) 803 + { 804 + wxMessageBox (wxT ("load text error:") + 805 + wxString::FromUTF8 (errMsg), 806 + wxT ("spatialite-gui"), wxOK | wxICON_ERROR, 807 + this); 808 + sqlite3_free (errMsg); 809 + return; 810 + } 811 + ::wxEndBusyCursor (); 812 + msg.Printf (wxT ("CSV/TXT loaded\n\n%d inserted rows"), rows); 813 + wxMessageBox (msg, wxT ("spatialite-gui"), 814 + wxOK | wxICON_INFORMATION, this); 815 + ClearTableTree (); 816 + InitTableTree (); 817 + } 769 818 }
Deleted icons/dumpshp.xpm.
1 -/* XPM */ 2 -static const char * dumpshp_xpm[] = { 3 -"16 16 16 1", 4 -" c None", 5 -". c #5AB24A", 6 -"+ c #41A0E9", 7 -"@ c #8BCC5C", 8 -"# c #ECF7E6", 9 -"$ c #D3EDBC", 10 -"% c #D0EBFA", 11 -"& c #0A5EC5", 12 -"* c #9BD48C", 13 -"= c #BCE7B1", 14 -"- c #94B7E3", 15 -"; c #A7D6A3", 16 -"> c #209910", 17 -", c #638F45", 18 -"' c #106CD2", 19 -") c #FFFFFF", 20 -" )))))) ", 21 -" ),@.,) ", 22 -" )),@@,)) ", 23 -" ),,,@@,,,) ", 24 -" )),@@@@,)) ", 25 -" )>#),@.,#=>) ", 26 -" )'#$#,,#.=>) ", 27 -" )'%$$*%%.@@=>) ", 28 -" )'%+*+++@@.;>) ", 29 -" )'%+-+++...;>) ", 30 -" )>$*.+++''>;') ", 31 -" )>$@..'&&-') ", 32 -" )>==>.'&--') ", 33 -" )>>;;--'') ", 34 -" ))>''')) ", 35 -" )))) "};
Deleted icons/exif.xpm.
1 -/* XPM */ 2 -static const char * exif_xpm[] = { 3 -"16 16 114 2", 4 -" c None", 5 -". c #AA7128", 6 -"+ c #A96F27", 7 -"@ c #A76E26", 8 -"# c #A56C25", 9 -"$ c #A36A23", 10 -"% c #A06822", 11 -"& c #9D6620", 12 -"* c #9B641F", 13 -"= c #98611D", 14 -"- c #955F1C", 15 -"; c #A86F26", 16 -"> c #DDA252", 17 -", c #DA934D", 18 -"' c #D59243", 19 -") c #D1913C", 20 -"! c #CD8E3C", 21 -"~ c #CB8B3A", 22 -"{ c #BE843E", 23 -"] c #CA924B", 24 -"^ c #905B19", 25 -"/ c #D8903F", 26 -"( c #61BCF3", 27 -"_ c #62BDF3", 28 -": c #5DB8F1", 29 -"< c #4DA6E9", 30 -"[ c #368EDE", 31 -"} c #CA9249", 32 -"| c #8C5817", 33 -"1 c #A26A23", 34 -"2 c #DD9148", 35 -"3 c #5CB6F0", 36 -"4 c #5EB8F1", 37 -"5 c #5CB7F0", 38 -"6 c #A47536", 39 -"7 c #A27234", 40 -"8 c #9F7032", 41 -"9 c #A86E26", 42 -"0 c #A16922", 43 -"a c #9E6721", 44 -"b c #D98F46", 45 -"c c #4BA4E8", 46 -"d c #4FA8EA", 47 -"e c #4CA5E8", 48 -"f c #A17233", 49 -"g c #D2A15B", 50 -"h c #CE9256", 51 -"i c #D49244", 52 -"j c #CC8D39", 53 -"k c #9A631F", 54 -"l c #D48A43", 55 -"m c #368DDE", 56 -"n c #3890DF", 57 -"o c #9B6F35", 58 -"p c #CC8F49", 59 -"q c #35C62D", 60 -"r c #40C723", 61 -"s c #3CC321", 62 -"t c #3BCD27", 63 -"u c #43D12E", 64 -"v c #57DA3F", 65 -"w c #96601C", 66 -"x c #CC8A43", 67 -"y c #6EE454", 68 -"z c #CF9037", 69 -"A c #885514", 70 -"B c #925D1A", 71 -"C c #8F5A18", 72 -"D c #6EE46E", 73 -"E c #CA8B51", 74 -"F c #845112", 75 -"G c #38BAED", 76 -"H c #58BFFF", 77 -"I c #62BBFF", 78 -"J c #44B6FF", 79 -"K c #DBEB8C", 80 -"L c #FFFF6D", 81 -"M c #78EF69", 82 -"N c #CE8F45", 83 -"O c #804E10", 84 -"P c #3BCE45", 85 -"Q c #07BE31", 86 -"R c #5AB7FF", 87 -"S c #58B6FF", 88 -"T c #97D1CC", 89 -"U c #F3FA8A", 90 -"V c #C99A40", 91 -"W c #C7883D", 92 -"X c #7D4C0E", 93 -"Y c #4BC84F", 94 -"Z c #36CB21", 95 -"` c #42C825", 96 -" . c #54B8AC", 97 -".. c #42A6FF", 98 -"+. c #00A2FF", 99 -"@. c #7E4D0F", 100 -"#. c #7C4B0E", 101 -"$. c #7A490D", 102 -"%. c #77F35E", 103 -"&. c #A4FF8C", 104 -"*. c #ACFF77", 105 -"=. c #7CF634", 106 -"-. c #75EF55", 107 -";. c #64FF79", 108 -">. c #C59046", 109 -",. c #C6954A", 110 -"'. c #E8D462", 111 -"). c #E9D461", 112 -"!. c #C99644", 113 -"~. c #8C5816", 114 -"{. c #895515", 115 -"]. c #865313", 116 -"^. c #835112", 117 -"/. c #804F10", 118 -" ", 119 -". + @ # $ % & * = - ", 120 -"; > , ' ) ! ~ { ] ^ ", 121 -"# / ( _ ( : < [ } | ", 122 -"1 2 3 4 5 6 7 8 9 0 % & * = - ", 123 -"a b c d e f g h i j ! ~ { ] ^ ", 124 -"k l m n [ o p q r s t u v } | ", 125 -"w x . + @ # $ % & * = - y z A ", 126 -"B C ; > , ' ) ! ~ { ] ^ D E F ", 127 -" # / G H I J K L } | M N O ", 128 -" 1 2 P Q R S T U z A V W X ", 129 -" a b Y Z ` ...+.E F @.#.$. ", 130 -" k l %.&.*.=.-.;.N O ", 131 -" w x >.,.'.).!.V W X ", 132 -" B C ~.{.].^./.@.#.$. ", 133 -" "};
Changes to icons/icon.xpm.
1 1 /* XPM */ 2 2 static const char * icon_xpm[] = { 3 -"32 32 9 1", 3 +"32 32 8 1", 4 4 " c None", 5 -". c #5F6431", 6 -"+ c #496E14", 7 -"@ c #AF5C57", 8 -"# c #916864", 9 -"$ c #5F8B22", 10 -"% c #878882", 11 -"& c #9C9D9A", 12 -"* c #C1C2BF", 13 -" * ", 14 -" *** ", 15 -" &**** ", 16 -" &&**** ", 17 -" &&***** ", 18 -" &&&***** ", 19 -" &&&***** ", 20 -" &&&&******", 21 -" &&&&******", 22 -" #####&&&&&&*****", 23 -" #######&&&&&***** ", 24 -" #####@#&&&&&&***** ", 25 -" ####@@@##@@##***** ", 26 -" ##@@@@@@@@@@@&**** ", 27 -" ###@@@@@@@@@@@#*** ", 28 -" #@@@@@@@@@@@@@@&** ", 29 -" .#@@@@@@@@@@@@@@#* ", 30 -" .+.#@@@@@@@@@@@@@@#.+. ", 31 -" +++##@@@@@@@@@@@@@@@#+++ ", 32 -" +++ ###@@@@@@@@@@@@@@# ++ ", 33 -" +++ ###@@@@@@@@@@@@@## +++", 34 -" +++ ###@@@@@@@@@@@@@# ++$", 35 -" ++++##@@@@@@@@@@@@@@# ++$$", 36 -" $++.##@@@@@@@@@@@@##++$$ ", 37 -" $$++.#@@@@@@@@@##.++$$ ", 38 -" $$$++++......+++$$$$ ", 39 -" %%%+$$$$$$$$+$$$$$$ ", 40 -" %&%%&&%..+$$$$+.. ", 41 -" %%%&&****######## ", 42 -" %%%&&&&*&* ", 43 -" && %&&*&& ", 44 -" & "}; 5 +". c #F0C080", 6 +"+ c #D0E0D0", 7 +"@ c #D0FFD0", 8 +"# c #E0F0E0", 9 +"$ c #D0D0FF", 10 +"% c #F0F0F0", 11 +"& c #E0E0FF", 12 +" ", 13 +" ", 14 +" ", 15 +" ........ ", 16 +" ....++++++++.... ", 17 +" ....++++++##@##+++++.... ", 18 +" ..++++++##+++#@#+++@++++++.. ", 19 +" .+++@@@##@@@@@##+#@@@##@@@+++. ", 20 +" .++++++@#@@@#+##@@@@@#@++++++. ", 21 +" ..++++++@+++#@#+++##++++++.. ", 22 +" $....++++++#@##++++++....$ ", 23 +" $$$$$....++++++++....$$$$$ ", 24 +" $$$$$&&&&........&&&&$$$$$ ", 25 +" $$$$$&&&&%%%%%%%%&&&&$$$$$ ", 26 +" $$$$$&&&&%%%%%%%%&&&&$$$$$ ", 27 +" .$$$$$&&&&%%%%%%%%&&&&$$$$$. ", 28 +" .+$$$$$&&&&%%%%%%%%&&&&$$$$$+. ", 29 +" .++$$$$&&&&%%%%%%%%&&&&$$$$++. ", 30 +" ..++++&&&&%%%%%%%%&&&&++++.. ", 31 +" $....++++%%%%%%%%++++....$ ", 32 +" $$$$$....++++++++....$$$$$ ", 33 +" $$$$$&&&&........&&&&$$$$$ ", 34 +" $$$$$&&&&%%%%%%%%&&&&$$$$$ ", 35 +" $$$$$&&&&%%%%%%%%&&&&$$$$$ ", 36 +" .$$$$$&&&&%%%%%%%%&&&&$$$$$. ", 37 +" .+$$$$$&&&&%%%%%%%%&&&&$$$$$+. ", 38 +" .++$$$$&&&&%%%%%%%%&&&&$$$$++. ", 39 +" ..++++&&&&%%%%%%%%&&&&++++.. ", 40 +" ....++++%%%%%%%%++++.... ", 41 +" ....++++++++.... ", 42 +" ........ ", 43 +" "};
Deleted icons/icon_info.xpm.
1 -/* XPM */ 2 -static const char * icon_info_xpm[] = { 3 -"128 113 256 2", 4 -" c None", 5 -". c #583F32", 6 -"+ c #653D22", 7 -"@ c #4A4625", 8 -"# c #643E2B", 9 -"$ c #4F452E", 10 -"% c #6E3C2D", 11 -"& c #3A5016", 12 -"* c #5E432D", 13 -"= c #3C4F1C", 14 -"- c #3A5211", 15 -"; c #404F23", 16 -"> c #784129", 17 -", c #92392C", 18 -"' c #495025", 19 -") c #873D2C", 20 -"! c #77413D", 21 -"~ c #3F590F", 22 -"{ c #3F5917", 23 -"] c #6D4745", 24 -"^ c #973D30", 25 -"/ c #42591F", 26 -"( c #8D4226", 27 -"_ c #944028", 28 -": c #864521", 29 -"< c #84452E", 30 -"[ c #844626", 31 -"} c #475829", 32 -"| c #4F5536", 33 -"1 c #3E5F14", 34 -"2 c #3F600B", 35 -"3 c #824743", 36 -"4 c #7B4947", 37 -"5 c #9E4228", 38 -"6 c #8E453B", 39 -"7 c #6A5040", 40 -"8 c #6F4E4D", 41 -"9 c #535843", 42 -"0 c #3F6505", 43 -"a c #8B4846", 44 -"b c #4E5E24", 45 -"c c #894B3F", 46 -"d c #476221", 47 -"e c #9B4925", 48 -"f c #9C492C", 49 -"g c #964A38", 50 -"h c #944A45", 51 -"i c #6B5554", 52 -"j c #76534A", 53 -"k c #426815", 54 -"l c #4B651C", 55 -"m c #9B4946", 56 -"n c #655A43", 57 -"o c #47671C", 58 -"p c #A9473B", 59 -"q c #85504E", 60 -"r c #486815", 61 -"s c #8C4F4A", 62 -"t c #8B4F4F", 63 -"u c #466B0E", 64 -"v c #AA4844", 65 -"w c #536339", 66 -"x c #536430", 67 -"y c #924F4C", 68 -"z c #A54B47", 69 -"A c #7C5749", 70 -"B c #446F04", 71 -"C c #994F4F", 72 -"D c #476D19", 73 -"E c #436F11", 74 -"F c #586443", 75 -"G c #A14E4B", 76 -"H c #795A4A", 77 -"I c #496E12", 78 -"J c #9C504B", 79 -"K c #5C644D", 80 -"L c #417309", 81 -"M c #6B6140", 82 -"N c #506C2B", 83 -"O c #6F5E5C", 84 -"P c #985351", 85 -"Q c #B04D46", 86 -"R c #48720A", 87 -"S c #AF4D4C", 88 -"T c #9D5347", 89 -"U c #66625B", 90 -"V c #825A58", 91 -"W c #785E5C", 92 -"X c #6B6352", 93 -"Y c #4D7217", 94 -"Z c #AB514C", 95 -"` c #746153", 96 -" . c #965752", 97 -".. c #A65350", 98 -"+. c #45770E", 99 -"@. c #497518", 100 -"#. c #77624E", 101 -"$. c #487802", 102 -"%. c #B4514A", 103 -"&. c #965958", 104 -"*. c #B4514F", 105 -"=. c #8B5C5D", 106 -"-. c #4C7710", 107 -";. c #507424", 108 -">. c #A35751", 109 -",. c #AE5454", 110 -"'. c #B0544F", 111 -"). c #B75346", 112 -"!. c #915D59", 113 -"~. c #A35857", 114 -"{. c #A5594D", 115 -"]. c #A75A48", 116 -"^. c #836263", 117 -"/. c #A05B58", 118 -"(. c #AC5854", 119 -"_. c #7F6463", 120 -":. c #B9554E", 121 -"<. c #85635E", 122 -"[. c #786766", 123 -"}. c #8B6260", 124 -"|. c #6B6C5E", 125 -"1. c #B95654", 126 -"2. c #4D7E08", 127 -"3. c #8E635C", 128 -"4. c #4F7D17", 129 -"5. c #B55954", 130 -"6. c #AF5B58", 131 -"7. c #68705A", 132 -"8. c #9E605E", 133 -"9. c #9C6254", 134 -"0. c #6E6E6B", 135 -"a. c #B65B5A", 136 -"b. c #8F6664", 137 -"c. c #A6605D", 138 -"d. c #63764B", 139 -"e. c #B95C50", 140 -"f. c #AB5F5E", 141 -"g. c #BE5A58", 142 -"h. c #956565", 143 -"i. c #976661", 144 -"j. c #8A696A", 145 -"k. c #B95D57", 146 -"l. c #AE605A", 147 -"m. c #8C6965", 148 -"n. c #677654", 149 -"o. c #9D6562", 150 -"p. c #538314", 151 -"q. c #C15C54", 152 -"r. c #777254", 153 -"s. c #627A44", 154 -"t. c #816D6C", 155 -"u. c #B4605C", 156 -"v. c #627C3B", 157 -"w. c #7C7071", 158 -"x. c #C25E5B", 159 -"y. c #508717", 160 -"z. c #51880B", 161 -"A. c #886E6D", 162 -"B. c #558520", 163 -"C. c #986B5E", 164 -"D. c #AA6752", 165 -"E. c #956B69", 166 -"F. c #AC6562", 167 -"G. c #A56766", 168 -"H. c #BE615B", 169 -"I. c #A16966", 170 -"J. c #B86360", 171 -"K. c #B3655F", 172 -"L. c #9B6B6B", 173 -"M. c #C16257", 174 -"N. c #BE6261", 175 -"O. c #568B00", 176 -"P. c #7A7572", 177 -"Q. c #767A51", 178 -"R. c #757774", 179 -"S. c #AA6963", 180 -"T. c #5F8530", 181 -"U. c #AF6865", 182 -"V. c #C7625F", 183 -"W. c #967067", 184 -"X. c #538F04", 185 -"Y. c #AA6B6B", 186 -"Z. c #B9685D", 187 -"`. c #C3655F", 188 -" + c #A56D6A", 189 -".+ c #847676", 190 -"++ c #B96B4D", 191 -"@+ c #588E15", 192 -"#+ c #B36D51", 193 -"$+ c #728246", 194 -"%+ c #B86A69", 195 -"&+ c #B46C69", 196 -"*+ c #C56867", 197 -"=+ c #8F795F", 198 -"-+ c #C8695D", 199 -";+ c #7B7D7A", 200 -">+ c #C16C5A", 201 -",+ c #817C7B", 202 -"'+ c #B66E6B", 203 -")+ c #738460", 204 -"!+ c #BC6E6C", 205 -"~+ c #BE6E68", 206 -"{+ c #BF7052", 207 -"]+ c #5F9226", 208 -"^+ c #AB7470", 209 -"/+ c #B27270", 210 -"(+ c #5A9611", 211 -"_+ c #6E8B49", 212 -":+ c #C56E6A", 213 -"<+ c #599902", 214 -"[+ c #977B78", 215 -"}+ c #659134", 216 -"|+ c #5D961E", 217 -"1+ c #6A8F3F", 218 -"2+ c #A37974", 219 -"3+ c #7E856F", 220 -"4+ c #818380", 221 -"5+ c #738C56", 222 -"6+ c #90807F", 223 -"7+ c #5C9E0C", 224 -"8+ c #858784", 225 -"9+ c #639F1F", 226 -"0+ c #8A8C89", 227 -"a+ c #63A518", 228 -"b+ c #AC8582", 229 -"c+ c #7E975E", 230 -"d+ c #9E8A89", 231 -"e+ c #8E8F8D", 232 -"f+ c #919390", 233 -"g+ c #6AAC21", 234 -"h+ c #949693", 235 -"i+ c #7AA648", 236 -"j+ c #8C9B83", 237 -"k+ c #71AC32", 238 -"l+ c #6FB019", 239 -"m+ c #76AA40", 240 -"n+ c #999B98", 241 -"o+ c #9C9E9B", 242 -"p+ c #9FA19E", 243 -"q+ c #7BB938", 244 -"r+ c #AFA1A2", 245 -"s+ c #A4A6A3", 246 -"t+ c #AAACA8", 247 -"u+ c #ADAFAC", 248 -"v+ c #B0B2AF", 249 -"w+ c #B3B5B2", 250 -"x+ c #C7B5B4", 251 -"y+ c #B8BAB7", 252 -"z+ c #BBBDBA", 253 -"A+ c #C0C2BF", 254 -"B+ c #C7C9C6", 255 -"C+ c #CED0CC", 256 -"D+ c #D0D2CF", 257 -"E+ c #D3D5D2", 258 -"F+ c #D7D9D6", 259 -"G+ c #DEE0DC", 260 -" ", 261 -" s+ ", 262 -" t+w+A+s+ ", 263 -" p+t+z+A+A+z+s+z+ ", 264 -" y+w+A+A+A+A+p+C+E+z+4+ ", 265 -" A+C+u+A+A+A+z+s+E+E+z+t+;+ ", 266 -" p+B+C+y+z+A+A+A+p+C+E+C+A+w+A+0+ ", 267 -" p+C+C+C+v+A+A+A+z+s+E+E+y+F+E+y+ ", 268 -" h+n+A+C+C+B+v+A+A+A+p+C+E+B+C+E+B+e+ ", 269 -" h+p+p+C+C+C+w+A+A+A+z+t+E+D+z+F+E+s+f+ ", 270 -" f+n+p+p+t+C+C+C+u+A+A+A+p+C+E+z+E+E+w+p+t+ ", 271 -" f+8+p+p+p+w+C+C+A+y+A+A+z+t+E+C+A+E+B+p+E+A+f+ ", 272 -" f+e+h+f+f+p+p+n+B+C+C+w+A+A+A+p+C+E+y+F+D+p+B+F+A+ ", 273 -" o+f+p+8+o+p+p+h+C+C+C+u+A+A+z+t+E+B+B+E+u+w+F+B+s+ ", 274 -" e+p+n+p+4+p+p+p+p+C+C+y+z+A+A+p+C+E+z+F+B+p+F+E+A+z+ ", 275 -" e+u+n+p+p+4+p+p+o+u+C+C+v+A+A+z+t+E+z+E+D+n+C+F+z+F+A+t+ ", 276 -" 8+t+u+h+p+n+8+p+p+f+B+C+B+v+A+A+p+C+C+A+E+t+z+F+z+F+F+C+y+ ", 277 -" ;+e+p+u+u+f+p+0+f+p+p+n+C+C+w+A+A+y+t+E+z+F+A+s+F+B+C+F+C+C+A+ ", 278 -" 4+h+u+u+t+f+p+4+o+p+p+s+C+C+u+A+A+p+C+B+B+D+h+D+C+B+F+C+C+C+A+ ", 279 -" 8+o+u+u+u+p+o+p+4+p+p+p+y+C+A+y+A+y+t+E+z+E+s+A+E+A+F+B+C+C+C+B+ ", 280 -" ;+h+t+u+u+u+n+p+p+4+p+p+h+B+C+w+A+A+p+C+A+D+z+s+F+z+F+C+C+C+C+C+C+ ", 281 -" 0+s+u+u+u+u+h+p+f+e+p+p+p+C+C+u+A+y+u+C+A+C+n+E+A+E+D+B+C+C+C+C+C+n+ ", 282 -" 4+o+t+u+u+u+u+f+p+e+f+p+p+v+C+y+z+A+s+C+y+E+p+B+B+C+E+B+C+C+C+C+C+C+o+ ", 283 -" s+h+t+u+u+u+t+h+p+4+o+p+s+y+C+v+A+y+u+B+B+y+t+C+B+E+B+C+C+C+C+C+C+w+y+ ", 284 -" e+z+f+u+u+u+u+p+n+o+4+p+p+n+C+B+w+A+s+D+y+C+n+F+z+E+B+C+C+C+C+C+C+u+C+F+ ", 285 -" 4+w+z+e+u+u+u+u+n+p+e+e+p+n+t+C+w+A+y+v+A+C+p+C+z+F+A+C+C+C+C+C+C+t+D+F+F+w+ ", 286 -" h+z+z+8+u+u+u+u+h+p+0+f+p+s+v+C+u+A+s+C+z+w+w+A+D+A+C+C+C+C+C+B+t+E+F+F+F+y+ ", 287 -" ;+w+s+z+8+u+u+u+u+f+p+0+f+p+s+A+A+y+y+w+z+C+n+B+B+z+B+C+C+C+C+A+t+F+F+F+F+A+z+ ", 288 -" 4+p+v+y+0+u+u+u+t+f+p+4+o+n+t+C+w+A+s+B+B+p+B+A+A+B+C+C+C+C+z+v+F+F+F+F+y+C+A+ ", 289 -" ;+u+w+u+h+u+u+u+o+o+f+0+p+p+w+C+u+y+w+y+y+z+z+B+z+C+C+C+C+v+y+F+F+F+C+z+F+F+z+ ", 290 -" ;+s+s+z+t+p+u+u+u+n+p+0+h+p+t+w+y+z+s+A+A+t+z+C+w+C+C+C+C+t+A+F+F+F+B+A+F+F+F+w+ ", 291 -" f+v+s+z+s+o+u+u+u+h+p+f+f+n+t+B+v+y+w+z+n+A+B+u+C+C+C+C+s+B+F+F+F+z+B+F+F+F+F+ ", 292 -" w.w.[..+.+[.0.U O w..+ 8+v+v+s+z+s+h+u+u+u+f+p+h+f+n+u+B+w+o+h+o+w+B+t+C+C+C+B+o+B+F+F+E+y+E+F+F+F+F+B+ ", 293 -" w.t.W W W W O W W ^.i i i i i W O [.P.4+t+v+v+s+z+s+h+u+u+t+h+n+e+o+s+v+w+y+;+0+s+z+t+C+C+C+B+p+D+F+F+B+z+F+F+F+F+F+F+A+ ", 294 -" P.[.O W O <.<.<.}.}.}.h.b.h.L.}.}.}.^.}.}.^.w.p+v+v+u+t+z+s+h+u+u+o+o+e+n+o+w+v+u+f+4+h+y+u+B+C+C+z+p+E+F+F+A+B+F+F+F+F+F+F+F+w+h+ ", 295 -" [.W W W <.^.W b.h.b.h. +}. + +h. +h.h.I.}.<.A.e+v+v+v+h+w+z+s+n+u+u+h+p+e+n+h+w+y+u+;+0+u+v+A+C+C+w+s+F+F+F+y+C+F+F+F+F+F+F+F+F+u+ ", 296 -" w.O ^.W b.}.}.}.h.h.}.}.h.h.h.i.i.}.i.h.h.=.o.h.w.p+v+v+v+f+z+y+s+o+u+u+h+p+f+f+s+v+v+e+4+p+t+y+C+C+u+u+F+F+C+z+E+F+F+F+F+F+F+F+F+E+f+ ", 297 -" [.W ^.W ^.h.}.h.h.I.i.h.I.o.&+o.&+o.&+I.&+Y.o.Y.o.[+;+p+v+v+v+n+z+u+u+n+u+u+f+n+h+f+v+t+e+;+e+t+v+C+C+s+y+F+F+B+A+F+F+F+F+F+F+F+F+F+F+A+ ", 298 -" ,+_.^.^.^.L.}.}.}.h.Y.h.I.Y.o.&+G.G.&+o.&+S.G.&+i.&+L.4+e+p+v+v+v+p+z+t+w+h+u+s+h+0+o+f+A+n+;+8+p+o+C+C+p+A+F+F+z+B+F+F+F+F+F+F+F+F+F+G+G+s+ ", 299 -" w._.^.^.h.L.h. +h.I.I.}.h.i.}.o.G.o.&+&+o.&+&+o.&+S.E.,+s+e+p+v+v+v+h+z+s+w+h+u+o+p+0+p+o+w+e+4+e+h+C+B+s+B+F+E+y+E+F+F+F+F+F+F+F+F+G+G+G+y+0+ ", 300 -" .+W m.^.L.h.h. +h.G.&+o.&+&+o.&+%+G.o.G.G.!.G.G.!.S.G.P.h+s+f+p+v+v+t+n+z+s+w+h+u+h+n+n+n+t+s+4+4+f+B+A+s+B+F+C+z+F+F+F+F+F+F+F+F+G+G+G+G+G+ ", 301 -" t.^.^.^.I.b.I. +h.G.&+G.G.&+&+o.!+!+G.!+!+!+G.~+~+G.~+W.f+o+s+f+p+v+v+s+s+z+s+w+n+u+h+h+t+e+A+8+4+8+A+z+s+C+F+A+B+F+F+F+F+F+F+F+G+G+G+G+G+G+A+ ", 302 -" t.^.m.h.h.<.i. +h.Y.&+Y.G.&+&+o.%+!+!+G.!+!+!+G.~+~+G.^+,+p+s+r+e+d+[+^+8.o.b+d+v+e+r+[+6+t+0+s+4+;+y+w+u+E+E+v+C+F+F+F+F+F+F+G+G+G+G+G+G+G+G+ ", 303 -" [.j.m.h.L.h.Y.h.V h.Y.Y.o.&+&+&+G.!+!+&+G.!+!+&+F.~+~+/+P.t+n+2+~.G G P J G .. .y t t q C .6+e+0+R.u+v+u+F+y+t+E+F+F+F+F+C+F+G+G+G+G+G+G+G+G+A+ ", 304 -" O m.<.h.L.}.Y.Y.o.S.&+o.h.o.o.S.o.!+!+!+G.!+!+!+U.%+~+~+<.o+r+L.Z y G G ..q s y .q ..G J a C y ^.,+t+t+y+D+p+y+C+F+F+F+C+A+G+G+G+G+G+G+G+G+G+F+ ", 305 -" [.^.^.h.L.h. +Y.I.G.&+&+G.&+!+!+G.8.F.G.G.!.S.S.G.o.G.F./.O V P J y t y C >...C Z ,...P G G y y h a q r+z+A+p+y+D+F+F+E+z+C+G+G+G+G+G+G+G+G+G+G+u+ ", 306 -" w._.W h.L.h.I.Y.Y.o.&+&+&+G.!+!+!+G.:+:+:+~+F.:+:+:+U.:+*+v Q h '.S *.Z C Z '.'.P Z Z ,.C J m ..s C h y !.r+s+y+E+F+F+B+A+G+G+G+G+G+G+G+G+G+G+G+F+n+ ", 307 -" ,+_.^.}.}.h.I.Y.Y.i.&+&+&+o.!+!+!+%+U.:+:+:+F.:+:+:+:+U.*+Q S S h '.S *.S P Z '.Z (.P Z ,.'.a m (.G 3 C ~.s V z+F+F+D+z+E+G+G+G+G+G+G+G+G+G+G+G+G+t+ ", 308 -" [.m.<.L.b.h.I.Y.o.&+&+&+S.U.!+!+!+G.:+:+:+:+G.:+:+:+:+U.k.S *.S h '.S *.S P Z '.Z 5.y Z ,.,.G y G m ..q .s &.b+E+z+B+G+G+G+G+G+G+G+G+G+G+G+G+E+z+ ", 309 -" w.j.^.L.L.h.Y.I.h.o.&+&+&+G.!+!+!+!+F.:+:+:+:+F.:+:+:+:+U.S S '.Q h '.S *.S '.J '.Z 5.(.C ,.'.z h h m y y t f.f.q [+F+G+G+G+G+G+G+G+G+G+G+E+y+t+z+w+ ", 310 -" _.^.E.L.b.Y.Y.Y.o.&+I.o.o.&+!+!+!+U.~+:+:+:+~+F.:+:+:+:+>.v S '.Q G G *.*.*.'.C '.'.5.'.y ,.Z m y 3 /...6. .~.J /.i.C+G+G+G+G+G+G+G+C+A+u+t+A+C+B+ ", 311 -" .+j.}.L.h.o.Y.Y.i.&+&+&+&+G.G.G.G.G.G.:+:+:+:+F.:+*+N.N.k.m S S '.Q S J *.*.*.'.C '.'.6.J y q y m Z 6.J (.(.6.t f.F.8.b+G+G+G+G+C+A+A+w+y+B+C+C+C+t+ ", 312 -" _.W L.L.h.Y.Y.Y.o.&+&+&+G.%+:+J.u.>.h 6 6 6 6 c 6 ) ) 6 m y G G ..m G s J J J J y y >...*.%.>.Z '.S S P u.6.u.c.c.F.F.!.x+C+A+A+B+z+y+C+C+C+C+C+z+ ", 313 -" .+_.<.L.b. +Y.Y.i.&+&+f.>.h g ^ , _ ) 5 ^ 5 5 5 ) 5 5 5 v '.h Z Z 5.Q %.J :.%.:.1.%.G 1.1.%.*...'.v '.N.6.>.J.J.J.&.F.f./.=.B+B+z+A+C+C+C+C+C+C+B+ ", 314 -" A.^.E.}.h.Y.G. .3 ) ) ) ) ) , _ ( ( < f e f e f < 5 f p Q 1.J %.%.:.%.%.J :.%.1.1.%.G 1.1.Q 1.*.C N.N.5.a.c.J.J.u.~. .f.8.q [+B+C+C+C+C+C+B+v+C+v+ ", 315 -" .+_.b.h.V 3 % ) % ( ( ( ( > ( ( ( ( ( [ e e f f f g f p %.Q 1.J %.%.:.%.:.J :.%.g.1.%.G 1.1.Q *.1./.k.5.N.N.l.>.6.u.J.&.&.P /.!.A+C+C+C+z+y+z+u+v+ ", 316 -" t.8 4 % % > > % % ( ( : [ < ( ( ( f < ].%.e.H.*+F.*+%.Q 1.Q 1.G %.%.:.%.:.J :.%.g.1.%.z 5.1.Q 1.1...6.k.k.k.N.c.J.6.P P &.f.f.!.b+B+y+y+B+C+w+4+ ", 317 -" 9 . # % # > > > > < > > [ > f g (.J.~+F.:+:+:+:+:+F.H.Q 1.1.%.*.>.%.:.:.%.:.J :.%.g.1.%.1...1.*.*.1.g.~.N.N.N.N.~.P /.u.u.&.f.f.P E.A+C+C+C+B+ ", 318 -" F / ' . + + # > > > > [ ( g .!.F.&+~+~+!+F.:+:+:+:+:+c.v %.1.1.%.S >.%.:.%.%.:.J :.%.g.1.Q g.(.*.g.g.`.`.c.N.f.~.~.6./.u.u.u./.P ~.c.!.x+C+C+C+f+ ", 319 -" |.F / o r @ . + + > [ > > c >.U.&+S.&+~+%+F.F.o.U.~+:+:+:+*+h *.1.1.1.%.S >.%.:.%.%.:.G '.%.g.1.Q g...1.5.u.l.l./.P a.N.N.k.P (.z ,.6.!.c.c.&.b+C+C+u+N / w ", 320 -" w / k d o d $ * + * > > c !.&+&+&+&+G.~+~+~+~+~+F.:+~+%+%+f.h y J C >...Z Z ..%.1.%.Z '.G C G >.>.J >. .>.u.N.g.g.x.~.5.5.5.*.J (.u.u.u.&.c.c.c.V B+B+s.I r k d w ", 321 -" K / r D D E D I $ # * # s G. +o.&+&+&+&+S.~+~+~+~+~+U.:+:+:+*+S Z (.:.:.k.5.Z J D.D.D.D.D.#+#+>.e.M.q.).M.e.6.g.g.g.1.1.>.k.5.5.k.N./.u.u.u.f.&.c. .=.r+0+R D I D k o } K ", 322 -" w / u r R D +.@.b * # 8 h.I. +h.&+&+&+&+&+F.~+~+~+~+!+%+:+:+:+k.S J 5.:.:.q.:.:.Z #+{+{+{+{+{+{+{.q.M.:.q.).e.G :.g.g.V.g.>.5.N.N.N.N./.u.u.u.u.&.8.8.!.[+* l D o d u d E d x n. ", 323 -" n.d d u o r d D o 2.' . }.<.I.h.h.o.&+&+&+&+G.!+~+~+~+~+%+~+:+:+:+Q S J :.:.%.q.:.:.'.#+{+{+{+{+{+{+T M.q.M.).e.M.l.V.x.g.g.x.6.u.N.N.N.N./.l.u.J.K.!.8.c.8.=.! | D o R o L o B o l d. ", 324 -" w 1 o B r L D $.D D N U ^.E.}.I.I.I.h.G.&+&+&+G.~+~+~+~+~+F.:+:+:+S Q S J :.:.%.q.:.:.(.{+{+{+{+{+{+{+T :.e.q.-+-+-+>.g.g.x.x.x.x.~.N.N.N.N.J.c.K.c.c.c.8.c./.h.I.U } u o R o R r B o o w ", 325 -" w 1 o B r L r $.D +.N P.b.E.b.I.I.L.I.S.o.o.&+G.~+~+~+~+~+F.:+:+S Q S Q J :.:.%.:.:.:.(.++{+{+{+++{+{+T q.q.-+-+M.M.l.x.x.x.x.x.V.c.N.N.N.N.J.!.c.K.K.K.!.c.F.h.I.d+ } u o D d u d o d o w ", 326 -" F d d u d D d I r $.d .+E.b.h.I.I.h.S.&+&+&+o.G.F.%+~+~+~+U.:+S v *.Q S J :.:.:.:.:.:.>.{+{+{+{+++{+{+{.).M.M.M.M.M.{.1.1.g.g.V.`.f.N.u.f.f.u.c.K.K.K.K.!./.&+o.h.[+ ; r o B r L r $.r D v. ", 327 -" s.o k B u R E E u u / .+^.<.I.I.I.h.&+&+&+&+I.!+!+&+S.F.U.U.Q S Q *.S S >.:.:.:.:.:.:.>.{+{+{+{+++{+{+{.:.M.M.M.M.-+Z.J.`.`.`.J.l./.c.J.N.N.N.f.K.K.K.K.&.F.&+I.}.[+ & 0 u u E E u E u o s. ", 328 -" o E r L r $.r $.r u w w._.^.I.I.I.h.&+&+&+&+I.!+!+!+!+!+F.h m J m J G Z >.:.:.1.:.:.:.{.{+++{+{+++{+++D.-+M.M.-+:+`.K./.l.l.l.N.`.N.f.N.N.N.N.l.f.K.K.K.&.&+&+o.b.[+ K k o B d u d I o E o ", 329 -" N o k B u B R u E E l w.j.^.h.I.I.i.&+&+&+&+G.!+!+!+!+!+G.v Z Z S S z J C ....>.G ....>.D.].D.D.].].D.9.l.l.K.K.J.J.`.l.`.`.`.x.x.k.~.a.k.k.k.5.P ..(.l.S.Y.o.I.}.[+ ' ~ d 1 B B D R d o N ", 330 -" d k o u o u o r d o w w.j.^.b.h.I.o.&+&+&+&+G.!+!+!+!+~+y v '.Z Z S S ..Z 1.*.1.%.%.*.C :.).M.e.).e.M.>.q.q.q.q.q.q.q.(.g.g.x.x.x.g.P 5.5.a.k.k./.l.!+!+!+=.I.Y.}.[+ 9 0 1 0 u L D $.D +.-. ", 331 -" s.r $.r $.r L k B k u 7. [.j.<.L.h.<.G.&+&+&+&+G.!+!+!+!+..a S Z '.Z S S J Q 1.1.1.%.%.%.J :.).e.:.M.-+-+l.V.V.V.V.V.V.q.>.g.g.g.g.x.`.c.N.N.k.k.k.P K.!+U.G.h.Y.Y.}.A. 9 0 1 u k L D $.D $.I s. ", 332 -" o D $.D $.r L k B k u 7. 6+j.<.L.L.}.o.o.S.&+S.F.!+!+!+(.z C S '.'.Z S S J %.1.%.1.%.%.:.J e.).).M.-+-+-+c.q.q.q.x.q.x.V.l.`.`.`.`.`.`.f.k.N.N.N.N.c.&+G.U.&+i.Y.Y.}.A. 9 { / 2 d u d u r $.I ;. ", 333 -" D D $.D $.r B d u r 0 K .+j.^.L.L.b.Y.Y.o.o.o.!+!+!+(.z ..h S '.'.Z S S J %.1.1.1.%.Q 1.>.e.).e.M.M.M.M.>.V.V.V.V.V.x.x.6.x.g.g.g.g.g.~.k.5.5.5.6.8.G.&+&+&+h.Y.Y.^. |.~ 1 0 u L u L o Y N D ", 334 -" I D I d D o u u 2 k { F _.^.L.L.b.Y.Y.Y.Y.i.G.F.G z z ..h *.'.'.S S S J %.1.%.1.%.Q 1.>.%.M.M.M.M.M.M.l.x.x.x.x.V.V.V.l.H.H.g.g.g.g.>.a.6./.c.%+G.&+&+&+&+i.Y.Y.W w ~ 0 2 L B I $.E 2.-.-. ", 335 -" o D $.I $.L u L k 0 1 d [.^.L.L.b.Y.Y.Y.Y.o.%+f.a a a J h *.Z '.S S S J :.%.%.1.%.Q 1.G M.-+-+-+-+-+-+l.V.V.x.x.g.x.x.6.g.x.V.H.k.6.P /.>.u.:+:+F.&+&+&+&+o.Y.h._. - ~ 0 r L u L $.R 2.-.-. ", 336 -" I -.$.+.R $.u L B k 0 2 n. t.W h.L.b.Y.Y.Y.Y.o.f.m m ..m P s C J >.,.'.S J :.%.%.1.:.%.Q >.-+-+M.M.M.M.M.l.g.q.x.V.V.V.V.6.a.(.>.>.f.N.l.(.u.:+:+:+S.&+&+&+&+o.o.}.[+ 7.& { { o u r L L +.2.2.;. ", 337 -" x 2.@.$.E $.R u E d 1 { / .+_.<.b.b.Y.Y.Y.Y.!.m G ..G m J h '.z ..G C h y ..G G ..(.S Q J e.M.M.-+-+>+>+l.u.u.l.l.l.l.l. .u.N.N.N.N.N.l.6.:+:+:+:+S.&+&+&+&+=.h.b.A. & { 2 k B u R E r Y @.z.v. ", 338 -" d.-.R $.R u I o k B 1 0 { b [.b.m.^.Y.Y.Y.Y.t m ....G m G J '.z ,.z '.z J 5.S Q 5.z ..l./.6.6.6.6.6.6.(.~.(.g.g.g.g.k.k.~.5.5.5.5.5.5.6.~+:+:+:+:+F.&+&+&+o.}.I.}. / - 2 1 B B I $.R 2.z.@.-.d. ", 339 -" o $.D -.@.L $.u B B 1 0 { { [.j.E.^.h.I.Y.y 3 G ....m G m J '.Z Z Z '.z J 5.S 5.S *.H.k.>.x.H.x.g.g.g.g.6.5.g.g.g.1.*.*.J '.5.k.k.k.k.%+!+:+:+:+:+F.&+G.o.Y.h.I.t. / - 2 1 B B u $.L 4.z.4.X.4.)+ ", 340 -" s.-.p.$.2.E L $.u B L r 0 ~ { .+^.E.b.h.h.4 a t G ....m G m J Z Z Z z '.z J *.5.S Q *.*.5.>.g.g.g.x.`.`.`.u.N.H.H.g.H.H.H./.N.N.N.N.k.:+%+%+:+:+:+:+G.o.Y.Y.o.I.L. ' = { { k k r $.$.@.z.2.z.p.1+ ", 341 -" ;.z.p.$.2.I L $.u B u d { { ' F W E.E.V a 3 q 4 P ....m G J J Z '.z z '.z J '.Q *.k.k.k.5.>.g.g.g.g.g.g.g.6.k.H.H.H.H.H.H./.N.N.N.k.*+:+%+%+:+!+F.G.o.Y.Y.Y.i.I.E. w = ~ 1 k B u u E D o z.y.p.z.T. ", 342 -" ;.z.2.$.2.I R D o k B u 1 2 - } |.E.j.] 3 t t q y t s C G J J Z '.z z '.'.J S S k.k.k.k.k.f.H.H.H.H.H.H.H.6.5.1.1.1.1.1.1.J 5.5.k.H.:+:+%+S.G.G.%+!+G.Y.Y.Y.h.h.P.; - 2 1 E B u R $.L -.z.Y @.X.T. ", 343 -" c+;.z.4.$.-.Y R $.L D E B u 1 1 - w U ] 3 t t q a C h y t a y Z '.z z ,.z C *.*.S S *.S S G *.*.1.1.1.1.1.,.'.1.1.1.1.1.k.~.5.*+*+~+U.U.o.U.!+!+!+!+o.Y.Y./+<.9 ; = { r B B D $.$.R p.z.y.y.@+;._+ ", 344 -" _+Y 4.@.2.z.p.@.L $.R u B B k 1 / = | 7 q t t t C h h C C 3 y P y C h ,./.k.k.k.5.1.5.5.>.1.1.1.g.k.H.H.u.N.`.`.`.`.`.H.P c.U.F.%+!+~+G.%+!+!+!+!+o.^+#.| & - ~ 2 u k o I $.$.@.z.z.p.X.X.@+1+ ", 345 -" 5+B.z.X.4.p.z.2.E $.$.E D o k k 1 ~ - = $ j q C h h C C 3 ....m m m P &.~.~.~.f.f.f.l./.u.u.u.u.u.u.l.f.c.f.f.f.f.f.>.F.!+~+~+~+~+~+G.!+!+!+'+ +n ; - ~ 1 k B E u I $.I D 4.z.z.p.(+@+@+c+ ", 346 -" s.B.p.X.z.4.z.z.-.E I R E u u B E 2 ~ ~ - ; n 4 y C C 3 G m G l.l.l.&.6.6.6.6.6.6.u.8.l.u.u.u.u.J.J.c.u.J.J.J.J.a.:+F.~+~+~+~+~+~+G./+W.#.| = = ~ 1 E B u u R $.$.@.-.z.@.p.@+(+@+}+ ", 347 -" T.p.z.X.p.2.z.-.-.@.L $.$.I u u B u 2 { = & = | 7 7 s ~.l.l.l.l.&.u.u.u.u.u.u.6.P 5.a.a.5.a.a.J./.u.J.J.J.a.:+:+F.~+~+!+/+C.#.| = & - ~ 2 u k k k I $.$.R -.p.X.O.p.y.@+@+@+1+ ", 348 -" )+T.y.z.z.4.p.z.z.p.-.E $.$.R u u r u u k 2 1 { & & ; | 7 A q 3./.F.6.6.6.6.6./.a.a.a.a.,.'.'.P Z '.5.!+'+^+C.H #.n | ; - - ~ 2 u B B u u u E D $.R -.p.X.z.p.@+<+(+(+B._+ ", 349 -" v.p.B.@+(+@+p.p.z.z.2.-.R $.D E I u u u B B E k 2 1 & = & & = ; ; F n #.H ` H H H 7 ` ` X n n n | ; = & & & { ~ 1 2 l B B u u u E $.$.$.R -.o z.X.z.p.@+<+(+9+|+1+ ", 350 -" 1+]+(+@+(+(+p.p.z.z.z.Y @.R R $.$.$.R I u u u u B B u u k 2 2 1 1 ~ - & - { ~ ~ ~ ~ ~ ~ ~ { 1 2 k u B B B u u k r r E $.$.$.R -.4.p.X.X.z.;.p.(+<+(+9+|+_+ ", 351 -" R.0.n.B.|+|+@+<+@+p.@.p.X.X.z.p.4.-.@.R $.$.R r E I I u u u u k u B r B B B B B B E u u u r o u u u I E R +.$.$.$.R R R 4.p.X.X.X.p.y.@+(+7+B.(+9+]+s. ", 352 -" 0+R.R.4+4+f+4+3+v.]+|+@+@+@+(+@+y.p.p.z.X.X.z.p.-.o R R R +.$.$.$.$.$.$.R r E R R R R R R +.$.$.$.I $.$.$.+.R R -.-.4.p.p.4.X.X.z.p.@+@+7+7+(+9+a+]+}+d. ", 353 -" R.4+n+0+8+f+h+0+n+4+n.T.]+a+9+(+(+7+<+X.@+y.p.p.z.p.X.X.z.z.y.p.2.4.4.-.-.o R -.-.-.-.-.-.-.-.-.-.;.4.p.p.z.X.X.X.X.@+p.p.p.4.@+<+7+(+(+a+9+9+}+5+ ", 354 -" e+;+h+h+f+8+e+n+n+e+n+e+0+p+R.)+_+]+9+9+7+(+@+(+7+<+4.@+@+@+y.y.p.p.z.@+X.X.X.p.X.X.X.X.X.X.X.X.X.X.X.p.z.z.p.p.@+@+@+@+(+7+7+7+y.(+7+a+9+]+_+ ", 355 -" 0+n+h+h+8+e+e+e+f+e+e+e+f+p+o+p+p+A+u+j+5+1+|+9+a+9+p.(+(+(+<+7+7+7+<+(+@+@+@+4.@+@+@+@+@+@+@+@+@+@+|+|+p.7+7+7+<+(+(+9+a+g+l+g+9+]+1+s. ", 356 -" 0+R.n+o+0+h+8+f+f+8+f+e+f+f+e+w+s+t+p+f+e+f+p+s+P.X M v.T.|+9+a+a+a+g+a+a+7+9+(+@+B.(+(+9+9+9+9+9+9+9+k+g+g+]+g+l+g+g+g+9+]+1+$+Q.r.3+ ", 357 -" R.R.R.f+o+f+f+8+0+n+4+h+0+0+n+n+8+0+f+p+p+n+n+e+4+8+P.8 4 q V W H #.M M x $+T.}+|+9+q+q+q+q+q+k+k+k+m+m+m+m+i+1+_+Q.r.=+W.L.L.h.h._..+ ", 358 -" ;+0.;+R.0+e+n+f+0+8+4+s+4+n+e+o+f+v+y+w+s+h+f+h+p+s+t+s+o+n+w.] ] ] 4 3 3 ! ! 4 s 8. +2+W.W.W.2+2+b+^+I.I.h. +^+^+^+Y.h. + + + +^.^.t. ", 359 -" 0.4+4+e+4+0+e+f+e+;+f+e+o+e+h+w+A+z+w+y+B+G+G+G+G+C+B+F+E+C+B+A+n+i i 8 q q q t V + + + + + +h.Y.Y.Y.Y.Y.i.I.Y.Y.Y.Y.I.h.I.h.}.W A..+ ", 360 -" R.0.0+8+0+0+8+f+8+o+4+n+R.p+A+z+t+n+n+s+w+z+w+y+A+G+G+G+G+G+G+G+G+G+B+d+W i ] V }.<.h.I. + + + +h.Y.Y.Y.Y.Y.h.Y.Y.o.h.h.<.}.b.b.[..+ ", 361 -" 0.R.;+;+8+8+f+4+h+4+p+;+s+y+p+h+s+u+t+t+p+s+p+t+w+u+t+y+A+F+G+G+G+G+G+G+G+B+w.t.j.m.E._.b.}.}.}.b.<.h.h.h.b.b.<.}.b.E.L.<.b.j.[+ ", 362 -" R.0.R.;+8+;+8+;+n+8+h+;+o+w+p+h+h+o+o+p+t+A+B+z+w+t+p+v+t+s+s+f+s+A+F+G+G+G+C+ .+A.W b.E.E.E.<.L.L.L.L.L.<.L.b.m.[+.+ ", 363 -" p+8+R.;+R.;+;+;+0+R.f+e+e+p+p+e+0+h+n+o+n+t+t+n+t+v+z+A+B+B+B+B+A+v+s+h+4+p+A+B+ [.w.t.[.W [.t.t.[.w.w. ", 364 -" p+p+e+8+;+;+;+;+8+R.;+8+f+o+s+w+o+8+e+h+f+f+p+s+n+t+u+u+s+h+p+t+w+w+w+w+v+A+o+0. ", 365 -" p+s+h+8+e+n+h+;+R.R.8+8+8+0+f+8+0+0+0+h+p+s+o+n+u+s+h+f+h+e+8+p+v+u+p+f+n+v+w+n+ ", 366 -" n+s+o+e+e+p+n+4+;+ ;+;+;+e+n+f+o+t+z+B+y+s+f+f+8+4+e+h+s+s+t+n+s+v+s+h+f+s+A+t+p+ ", 367 -" o+s+s+n+h+s+o+8+0. 0+0+8+4+R.8+4+8+p+n+w+C+F+F+F+D+z+s+h+8+f+t+w+s+p+u+t+t+ ", 368 -" h+s+t+p+p+s+s+0+R. 8+8+8+f+4+;+o+h+h+s+A+F+F+F+F+F+y+0.0.h+u+v+ ", 369 -" h+e+n+s+t+v+f+4+ 8+e+p+f+8+8+;+e+8+8+w+E+E+v+ ", 370 -" 0+4+e+f+o+n+8+ o+s+u+u+o+8+o+e+h+ ", 371 -" f+n+ s+t+p+o+ ", 372 -" "};
Deleted icons/kill_spindex.xpm.
1 -/* XPM */ 2 -static const char * kill_spindex_xpm[] = { 3 -"16 16 124 2", 4 -" c None", 5 -". c #ECCE40", 6 -"+ c #EBCC3F", 7 -"@ c #EACB3E", 8 -"# c #E9C93C", 9 -"$ c #E9C73B", 10 -"% c #E8C43A", 11 -"& c #E7C238", 12 -"* c #E6C036", 13 -"= c #E5BD35", 14 -"- c #E4BB33", 15 -"; c #E3B831", 16 -"> c #FAED9A", 17 -", c #F9EB99", 18 -"' c #F9E897", 19 -") c #F8E594", 20 -"! c #F7E291", 21 -"~ c #F6DF8E", 22 -"{ c #F5DB8B", 23 -"] c #EBC756", 24 -"^ c #F1D964", 25 -"/ c #FAEB9A", 26 -"( c #F4D848", 27 -"_ c #F3D344", 28 -": c #F1CE3F", 29 -"< c #F0C83A", 30 -"[ c #F5DC8C", 31 -"} c #EDCB62", 32 -"| c #EACA3D", 33 -"1 c #F9E993", 34 -"2 c #F7E172", 35 -"3 c #F3D445", 36 -"4 c #F2CE41", 37 -"5 c #F0C93C", 38 -"6 c #F5DC8A", 39 -"7 c #EFD070", 40 -"8 c #E4BB3D", 41 -"9 c #EFD45B", 42 -"0 c #F9EA99", 43 -"a c #F4D647", 44 -"b c #F2D042", 45 -"c c #F0CB3D", 46 -"d c #F3D56E", 47 -"e c #F3D77F", 48 -"f c #E7C04A", 49 -"g c #F5E180", 50 -"h c #F8E68E", 51 -"i c #F3D243", 52 -"j c #F1CD3F", 53 -"k c #EFC739", 54 -"l c #EAC658", 55 -"m c #ECCD4F", 56 -"n c #F9E998", 57 -"o c #F3D54A", 58 -"p c #F1CF45", 59 -"q c #F0CA40", 60 -"r c #EEC238", 61 -"s c #F4D989", 62 -"t c #E1B42E", 63 -"u c #E0B12C", 64 -"v c #DFAE2B", 65 -"w c #DEAC29", 66 -"x c #DCA927", 67 -"y c #DBA625", 68 -"z c #DAA323", 69 -"A c #F2DA75", 70 -"B c #F8E693", 71 -"C c #F7E391", 72 -"D c #F6E08D", 73 -"E c #F5DB8A", 74 -"F c #F4D788", 75 -"G c #F2D384", 76 -"H c #F1CF7F", 77 -"I c #F0CC7C", 78 -"J c #EFC97A", 79 -"K c #E3B448", 80 -"L c #E2B62F", 81 -"M c #F3D786", 82 -"N c #EBB62F", 83 -"O c #ECBC4A", 84 -"P c #F1CE80", 85 -"Q c #D68B39", 86 -"R c #C35812", 87 -"S c #BC4204", 88 -"T c #B94503", 89 -"U c #E0B22D", 90 -"V c #EECC70", 91 -"W c #F2D283", 92 -"X c #F1CE7E", 93 -"Y c #D58A35", 94 -"Z c #D17438", 95 -"` c #F7B58D", 96 -" . c #FED6B8", 97 -".. c #F5A872", 98 -"+. c #CB6B2D", 99 -"@. c #DFAF2B", 100 -"#. c #E7BD55", 101 -"$. c #DEAA2E", 102 -"%. c #BC4C06", 103 -"&. c #F6B58D", 104 -"*. c #FF924D", 105 -"=. c #FF7711", 106 -"-. c #FF8621", 107 -";. c #EB8A40", 108 -">. c #B94403", 109 -",. c #E7BC4F", 110 -"'. c #E6BA4C", 111 -"). c #DCA726", 112 -"!. c #FECDAE", 113 -"~. c #FFFFFF", 114 -"{. c #EF7F18", 115 -"]. c #DFAE2D", 116 -"^. c #DEAB2B", 117 -"/. c #F49D63", 118 -"(. c #FF7F18", 119 -"_. c #F87600", 120 -":. c #EE7600", 121 -"<. c #E16803", 122 -"[. c #C3571A", 123 -"}. c #C96425", 124 -"|. c #E67721", 125 -"1. c #EA7905", 126 -"2. c #DD6401", 127 -"3. c #BD4D04", 128 -" ", 129 -" . + @ # $ % & * = - ; ", 130 -" + > , ' ) ! ~ { ] ; ", 131 -" + ^ / ( _ : < [ } ; ", 132 -" | 1 2 3 4 5 6 7 8 ", 133 -" 9 0 a b c d e f ", 134 -" $ g h i j k [ l ", 135 -" m n o p q r s t u v w x y z ", 136 -"% A B C D 6 E F G H I J K z ", 137 -"& * = - ; L M N O P Q R S T ", 138 -" U V W X Y Z ` ...+. ", 139 -" @.G #.$.%.&.*.=.-.;.>.", 140 -" @.,.'.). S !.~.~.~.{.S ", 141 -" ].^.y T /.(._.:.<.T ", 142 -" w x [.}.|.1.2.3. ", 143 -" T S T "};
Deleted icons/memdb_clock.xpm.
1 -/* XPM */ 2 -static const char * memdb_clock_xpm[] = { 3 -"16 16 158 2", 4 -" c None", 5 -". c #C6AB7E", 6 -"+ c #CDB378", 7 -"@ c #D0B87B", 8 -"# c #CDB47A", 9 -"$ c #C4A971", 10 -"% c #B99D71", 11 -"& c #C2AA86", 12 -"* c #D2BA78", 13 -"= c #E3D9C8", 14 -"- c #EAE7DD", 15 -"; c #F1F1EE", 16 -"> c #F0F0EC", 17 -", c #E4E0D2", 18 -"' c #D2C4A8", 19 -") c #B89C67", 20 -"! c #C0A885", 21 -"~ c #DCCC97", 22 -"{ c #EEEBE1", 23 -"] c #D9E1EE", 24 -"^ c #ACBEDF", 25 -"/ c #96ADD5", 26 -"( c #92AAD4", 27 -"_ c #A3B7DC", 28 -": c #CEDAE8", 29 -"< c #DFD9C6", 30 -"[ c #B69B68", 31 -"} c #CCB374", 32 -"| c #ECE9DF", 33 -"1 c #C2CFE6", 34 -"2 c #AEBFDF", 35 -"3 c #DCE3F1", 36 -"4 c #ECF1F3", 37 -"5 c #EBF1F4", 38 -"6 c #D9E2F1", 39 -"7 c #A3BADC", 40 -"8 c #AFC1DE", 41 -"9 c #D8CFB7", 42 -"0 c #A48358", 43 -"a c #BCA177", 44 -"b c #DBCFB7", 45 -"c c #D7E0ED", 46 -"d c #AABDDE", 47 -"e c #FFFFFF", 48 -"f c #EEF0F0", 49 -"g c #DAE5E7", 50 -"h c #F7FFFF", 51 -"i c #F3FEFF", 52 -"j c #98B4DC", 53 -"k c #C4D1E1", 54 -"l c #BBA473", 55 -"m c #987C59", 56 -"n c #BEA26D", 57 -"o c #E6E1D3", 58 -"p c #A4B9DB", 59 -"q c #D6E3F1", 60 -"r c #F5FBFE", 61 -"s c #F3F5F5", 62 -"t c #959E9F", 63 -"u c #E9F0F0", 64 -"v c #F2F8F8", 65 -"w c #ADB9BE", 66 -"x c #C2DAF0", 67 -"y c #8BA7D1", 68 -"z c #D3CAA9", 69 -"A c #9B7B53", 70 -"B c #BDA16C", 71 -"C c #EEECE4", 72 -"D c #8AA5D1", 73 -"E c #E9F6FA", 74 -"F c #EEF8FD", 75 -"G c #F9FFFF", 76 -"H c #798081", 77 -"I c #A4AEB1", 78 -"J c #777F81", 79 -"K c #BAC6C9", 80 -"L c #D3F0FA", 81 -"M c #7295C9", 82 -"N c #E2DFC9", 83 -"O c #9E7B54", 84 -"P c #B89A67", 85 -"Q c #ECEADD", 86 -"R c #819FCF", 87 -"S c #E2F3FA", 88 -"T c #E9F6FD", 89 -"U c #E3F0F2", 90 -"V c #848C8D", 91 -"W c #C2CFD2", 92 -"X c #EBFBFF", 93 -"Y c #CCECFA", 94 -"Z c #6D90C7", 95 -"` c #E1DDC1", 96 -" . c #9D7953", 97 -".. c #AD8E5E", 98 -"+. c #DDD3B7", 99 -"@. c #90AAD1", 100 -"#. c #C1DBF0", 101 -"$. c #E6F7FF", 102 -"%. c #E3F2FA", 103 -"&. c #B6C0C5", 104 -"*. c #DEEDF1", 105 -"=. c #E8FCFF", 106 -"-. c #A9C6AE", 107 -";. c #719760", 108 -">. c #668E4F", 109 -",. c #5F8744", 110 -"'. c #6E773E", 111 -"). c #A0855E", 112 -"!. c #C0A978", 113 -"~. c #C6D1DA", 114 -"{. c #88AAD9", 115 -"]. c #EBFEFF", 116 -"^. c #EEFAFF", 117 -"/. c #F2FDFF", 118 -"(. c #F2FEFF", 119 -"_. c #ABC5A8", 120 -":. c #81AB61", 121 -"<. c #B4D495", 122 -"[. c #D0E6BA", 123 -"}. c #8FBB6A", 124 -"|. c #578F2D", 125 -"1. c #376B19", 126 -"2. c #A28257", 127 -"3. c #D8CCA2", 128 -"4. c #A5B7CD", 129 -"5. c #89AAD8", 130 -"6. c #CFDFEF", 131 -"7. c #F3F6FA", 132 -"8. c #F3F5FA", 133 -"9. c #618A49", 134 -"0. c #B1D390", 135 -"a. c #B1D692", 136 -"b. c #8CBC65", 137 -"c. c #8FBC67", 138 -"d. c #A68855", 139 -"e. c #D6C896", 140 -"f. c #BFCACC", 141 -"g. c #869FC8", 142 -"h. c #7692C5", 143 -"i. c #7390C4", 144 -"j. c #4C7B31", 145 -"k. c #B6D49C", 146 -"l. c #B2D295", 147 -"m. c #9A7850", 148 -"n. c #B1975A", 149 -"o. c #CEBD85", 150 -"p. c #DED6A4", 151 -"q. c #DED5A0", 152 -"r. c #3E6E1E", 153 -"s. c #8BBA62", 154 -"t. c #87BA60", 155 -"u. c #87B960", 156 -"v. c #917553", 157 -"w. c #93724E", 158 -"x. c #97744D", 159 -"y. c #606E31", 160 -"z. c #538C28", 161 -"A. c #8DBA64", 162 -" ", 163 -" . + @ # $ % ", 164 -" & * = - ; > , ' ) ", 165 -" ! ~ { ] ^ / ( _ : < [ ", 166 -" } | 1 2 3 4 5 6 7 8 9 0 ", 167 -" a b c d e f g h h i j k l m ", 168 -" n o p q r s t u v w x y z A ", 169 -" B C D E F G H I J K L M N O ", 170 -" P Q R S T U V J W X Y Z ` . ", 171 -" ..+.@.#.$.%.&.*.=.-.;.>.,.'. ", 172 -" ).!.~.{.].^./.(._.:.<.[.}.|.1.", 173 -" 2.3.4.5.6.7.8.9.0.a.e b.c.1.", 174 -" d.e.f.g.h.i.j.k.e e e l.1.", 175 -" m.n.o.p.q.r.s.t.e u.c.1.", 176 -" v.w.x.x.y.z.A.l.A.z.1.", 177 -" 1.1.1.1.1. "};
Deleted icons/memdb_load.xpm.
1 -/* XPM */ 2 -static const char * memdb_load_xpm[] = { 3 -"16 16 121 2", 4 -" c None", 5 -". c #BABABA", 6 -"+ c #B8B8B8", 7 -"@ c #B7B7B7", 8 -"# c #B6B6B6", 9 -"$ c #B4B4B4", 10 -"% c #B3B3B3", 11 -"& c #BBBBBB", 12 -"* c #D0D0D0", 13 -"= c #E8E8E8", 14 -"- c #F3F3F3", 15 -"; c #FDFDFD", 16 -"> c #FCFCFC", 17 -", c #EDEDED", 18 -"' c #E0E0E0", 19 -") c #C2C2C2", 20 -"! c #ADADAD", 21 -"~ c #E1E1E1", 22 -"{ c #FEFEFE", 23 -"] c #FFFFFF", 24 -"^ c #FBFBFB", 25 -"/ c #CFCFCF", 26 -"( c #A9A9A9", 27 -"_ c #B9B9B9", 28 -": c #F8F8F8", 29 -"< c #EAEAEA", 30 -"[ c #A7A7A7", 31 -"} c #F7F7F7", 32 -"| c #E7E7E7", 33 -"1 c #EFEFEF", 34 -"2 c #F6F6F6", 35 -"3 c #FAFAFA", 36 -"4 c #F0F0F0", 37 -"5 c #DEDEDE", 38 -"6 c #C3C3C3", 39 -"7 c #E6E6E6", 40 -"8 c #A5A5A5", 41 -"9 c #B5B5B5", 42 -"0 c #EBEBEB", 43 -"a c #D6D6D6", 44 -"b c #D5D5D5", 45 -"c c #D1D1D1", 46 -"d c #BCBCBC", 47 -"e c #C0C0C0", 48 -"f c #E5E5E5", 49 -"g c #A3A3A3", 50 -"h c #F5F5F5", 51 -"i c #EEEEEE", 52 -"j c #E2E2E2", 53 -"k c #CDCDCD", 54 -"l c #6EA43C", 55 -"m c #659F31", 56 -"n c #DEE1DD", 57 -"o c #A0A0A0", 58 -"p c #B2B2B2", 59 -"q c #F4F4F4", 60 -"r c #DDDDDD", 61 -"s c #E3E3E3", 62 -"t c #C9C9C9", 63 -"u c #67A036", 64 -"v c #81B35A", 65 -"w c #579828", 66 -"x c #9B9E99", 67 -"y c #B0B0B0", 68 -"z c #6FA53D", 69 -"A c #6EA338", 70 -"B c #68A134", 71 -"C c #629D30", 72 -"D c #7CAF55", 73 -"E c #AACB91", 74 -"F c #74AB4F", 75 -"G c #468F18", 76 -"H c #AEAEAE", 77 -"I c #F2F2F2", 78 -"J c #D8D8D8", 79 -"K c #6BA337", 80 -"L c #B0CE96", 81 -"M c #ADCD94", 82 -"N c #A8CB90", 83 -"O c #90BC74", 84 -"P c #A1C78A", 85 -"Q c #68A546", 86 -"R c #358707", 87 -"S c #ACACAC", 88 -"T c #D4D4D4", 89 -"U c #639F31", 90 -"V c #8EBA6F", 91 -"W c #89B86B", 92 -"X c #85B666", 93 -"Y c #80B361", 94 -"Z c #82B567", 95 -"` c #98C283", 96 -" . c #5CA03C", 97 -".. c #257F00", 98 -"+. c #DBDBDB", 99 -"@. c #5B9B29", 100 -"#. c #A9CA90", 101 -"$. c #A5C88D", 102 -"%. c #A1C68A", 103 -"&. c #9EC588", 104 -"*. c #85B66A", 105 -"=. c #97C282", 106 -"-. c #66A548", 107 -";. c #217D00", 108 -">. c #CECECE", 109 -",. c #529722", 110 -"'. c #4A911C", 111 -"). c #448F16", 112 -"!. c #3C8B10", 113 -"~. c #5E9F3A", 114 -"{. c #96C180", 115 -"]. c #62A346", 116 -"^. c #217D03", 117 -"/. c #A1A1A1", 118 -"(. c #9F9F9F", 119 -"_. c #ABABAB", 120 -":. c #959595", 121 -"<. c #2E8306", 122 -"[. c #5FA143", 123 -"}. c #207B01", 124 -"|. c #1E7B03", 125 -" ", 126 -" . + @ # $ % ", 127 -" & * = - ; > , ' ) ! ", 128 -" . ~ { ] ] ] ] ] ] ^ / ( ", 129 -" _ : { ] ] ] ] ] ] ^ < [ ", 130 -" @ } | 1 2 ^ 3 4 5 6 7 8 ", 131 -" 9 2 0 5 a b c 6 d e f g ", 132 -" $ h i 7 j 7 ~ k l m n o ", 133 -" p q < ~ r s 5 t u v w x ", 134 -" y - | r z A B C D E F G ", 135 -" H I j J K L M E N O P Q R ", 136 -" S 4 5 T U M V W X Y Z ` ...", 137 -" ( 5 - +.@.#.$.%.&.*.=.-.;. ", 138 -" 8 >., ,.'.).!.~.{.].^. ", 139 -" /.(./._.[ :.<.[.}. ", 140 -" ;.|. "};
Deleted icons/memdb_new.xpm.
1 -/* XPM */ 2 -static const char * memdb_new_xpm[] = { 3 -"16 16 137 2", 4 -" c None", 5 -". c #BABABA", 6 -"+ c #B8B8B8", 7 -"@ c #B7B7B7", 8 -"# c #B6B6B6", 9 -"$ c #B4B4B4", 10 -"% c #B3B3B3", 11 -"& c #BBBBBB", 12 -"* c #D0D0D0", 13 -"= c #E8E8E8", 14 -"- c #F3F3F3", 15 -"; c #FDFDFD", 16 -"> c #FCFCFC", 17 -", c #EDEDED", 18 -"' c #E0E0E0", 19 -") c #C2C2C2", 20 -"! c #ADADAD", 21 -"~ c #E1E1E1", 22 -"{ c #FEFEFE", 23 -"] c #FFFFFF", 24 -"^ c #FBFBFB", 25 -"/ c #CFCFCF", 26 -"( c #A9A9A9", 27 -"_ c #EAC93D", 28 -": c #E2C54C", 29 -"< c #EACC55", 30 -"[ c #EACA55", 31 -"} c #E9C753", 32 -"| c #E7C34E", 33 -"1 c #E8C559", 34 -"2 c #FCF7E8", 35 -"3 c #EAEAEA", 36 -"4 c #A7A7A7", 37 -"5 c #F3DC73", 38 -"6 c #F6E289", 39 -"7 c #F4DE84", 40 -"8 c #F3D981", 41 -"9 c #F1D378", 42 -"0 c #E8C14F", 43 -"a c #F0DFAF", 44 -"b c #F8F7F6", 45 -"c c #E7E7E7", 46 -"d c #D8D8D8", 47 -"e c #C7C7C7", 48 -"f c #E6E6E6", 49 -"g c #A5A5A5", 50 -"h c #E8C63B", 51 -"i c #F8E793", 52 -"j c #F4D85F", 53 -"k c #F6E090", 54 -"l c #F2D57C", 55 -"m c #E9C352", 56 -"n c #CFBD89", 57 -"o c #CCCCCC", 58 -"p c #C9C9C9", 59 -"q c #B5B5B5", 60 -"r c #C1C1C1", 61 -"s c #E5E5E5", 62 -"t c #A3A3A3", 63 -"u c #E8C63A", 64 -"v c #F1D86A", 65 -"w c #F8E796", 66 -"x c #F2CF47", 67 -"y c #F4DC89", 68 -"z c #E2B837", 69 -"A c #E3D098", 70 -"B c #E2E2E2", 71 -"C c #CDCDCD", 72 -"D c #E3E3E3", 73 -"E c #A0A0A0", 74 -"F c #E7C338", 75 -"G c #F8E68F", 76 -"H c #F7E38D", 77 -"I c #F2D260", 78 -"J c #F4D784", 79 -"K c #E1B63A", 80 -"L c #E0C47B", 81 -"M c #DDC27D", 82 -"N c #DFC179", 83 -"O c #DCC183", 84 -"P c #CBC4B6", 85 -"Q c #BDBDBD", 86 -"R c #BFBFBF", 87 -"S c #9E9E9E", 88 -"T c #E7C238", 89 -"U c #F0D76D", 90 -"V c #EFD267", 91 -"W c #EDCF66", 92 -"X c #F3D984", 93 -"Y c #F4D788", 94 -"Z c #F1CF7D", 95 -"` c #E8BD58", 96 -" . c #E6B852", 97 -".. c #DAA425", 98 -"+. c #D9C393", 99 -"@. c #C5C2BD", 100 -"#. c #9B9B9B", 101 -"$. c #E4BC34", 102 -"%. c #E3B831", 103 -"&. c #E1B52F", 104 -"*. c #DCB137", 105 -"=. c #F0D07D", 106 -"-. c #EDC76D", 107 -";. c #E3B345", 108 -">. c #D8B567", 109 -",. c #DBD3C3", 110 -"'. c #C0C0C0", 111 -"). c #969696", 112 -"!. c #DCAD2F", 113 -"~. c #E7BC52", 114 -"{. c #DBAC39", 115 -"]. c #D6C192", 116 -"^. c #D2D2D2", 117 -"/. c #DBDBDB", 118 -"(. c #D6D6D6", 119 -"_. c #B0B0B0", 120 -":. c #DEDEDE", 121 -"<. c #909090", 122 -"[. c #DEAD2A", 123 -"}. c #E4B644", 124 -"|. c #DCB863", 125 -"1. c #F1EEE6", 126 -"2. c #C4C4C4", 127 -"3. c #8B8B8B", 128 -"4. c #DCA927", 129 -"5. c #C7A657", 130 -"6. c #CECECE", 131 -"7. c #F4F4F4", 132 -"8. c #F5F5F5", 133 -"9. c #EFEFEF", 134 -"0. c #8A8A8A", 135 -"a. c #A1A1A1", 136 -"b. c #9F9F9F", 137 -"c. c #ABABAB", 138 -"d. c #959595", 139 -"e. c #8D8D8D", 140 -"f. c #898989", 141 -" ", 142 -" . + @ # $ % ", 143 -" & * = - ; > , ' ) ! ", 144 -" . ~ { ] ] ] ] ] ] ^ / ( ", 145 -" _ : < [ } | 1 2 ] ] ^ 3 4 ", 146 -" _ 5 6 7 8 9 0 a b c d e f g ", 147 -" h i j k l m n o p q @ r s t ", 148 -" u v w x y z A B f ~ C ) ) D E ", 149 -" F G H I J K L M N O P Q R B S ", 150 -"T U V W X Y Z ` ...+.@.+ & ~ #.", 151 -" $.%.&.*.=.-.;.>.,.d '.% @ ' ).", 152 -" !.~.{.].^./.(.R _.% :.<.", 153 -" [.}.|.1./.^./.(.'.p f 2.3.", 154 -" 4.5.g 6., 7.8.7.9.B . 0. ", 155 -" a.b.a.c.4 d.e.f. ", 156 -" "};
Deleted icons/memdb_save.xpm.
1 -/* XPM */ 2 -static const char * memdb_save_xpm[] = { 3 -"16 16 158 2", 4 -" c None", 5 -". c #BABABA", 6 -"+ c #B8B8B8", 7 -"@ c #B7B7B7", 8 -"# c #B6B6B6", 9 -"$ c #B4B4B4", 10 -"% c #B3B3B3", 11 -"& c #BBBBBB", 12 -"* c #D0D0D0", 13 -"= c #E8E8E8", 14 -"- c #F3F3F3", 15 -"; c #FDFDFD", 16 -"> c #FCFCFC", 17 -", c #EDEDED", 18 -"' c #E0E0E0", 19 -") c #C2C2C2", 20 -"! c #ADADAD", 21 -"~ c #E1E1E1", 22 -"{ c #FEFEFE", 23 -"] c #FFFFFF", 24 -"^ c #FBFBFB", 25 -"/ c #CFCFCF", 26 -"( c #A9A9A9", 27 -"_ c #B9B9B9", 28 -": c #F8F8F8", 29 -"< c #EAEAEA", 30 -"[ c #A7A7A7", 31 -"} c #F7F7F7", 32 -"| c #E7E7E7", 33 -"1 c #EFEFEF", 34 -"2 c #F6F6F6", 35 -"3 c #FAFAFA", 36 -"4 c #F0F0F0", 37 -"5 c #DEDEDE", 38 -"6 c #C3C3C3", 39 -"7 c #E6E6E6", 40 -"8 c #A5A5A5", 41 -"9 c #B5B5B5", 42 -"0 c #EBEBEB", 43 -"a c #D6D6D6", 44 -"b c #D5D5D5", 45 -"c c #D1D1D1", 46 -"d c #BCBCBC", 47 -"e c #C0C0C0", 48 -"f c #E5E5E5", 49 -"g c #A3A3A3", 50 -"h c #F5F5F5", 51 -"i c #EEEEEE", 52 -"j c #E2E2E2", 53 -"k c #6E97D4", 54 -"l c #7B9ED4", 55 -"m c #7198D0", 56 -"n c #82A4D6", 57 -"o c #688ECD", 58 -"p c #6990CD", 59 -"q c #759AD0", 60 -"r c #7399D1", 61 -"s c #628BC8", 62 -"t c #B2B2B2", 63 -"u c #F4F4F4", 64 -"v c #DDDDDD", 65 -"w c #E3E3E3", 66 -"x c #658DCC", 67 -"y c #B0CDF3", 68 -"z c #B3C7E3", 69 -"A c #A1BFEA", 70 -"B c #6089C9", 71 -"C c #B0B0B0", 72 -"D c #D9D9D9", 73 -"E c #5B86C7", 74 -"F c #9EC0EF", 75 -"G c #6E93CC", 76 -"H c #F7FBFF", 77 -"I c #F1F8FF", 78 -"J c #8CAFE4", 79 -"K c #618AC7", 80 -"L c #AEAEAE", 81 -"M c #F2F2F2", 82 -"N c #D8D8D8", 83 -"O c #DCDCDC", 84 -"P c #5D88C8", 85 -"Q c #A1BFEF", 86 -"R c #FAFCFD", 87 -"S c #FBFCFE", 88 -"T c #FDFDFE", 89 -"U c #FCFDFE", 90 -"V c #FAFBFD", 91 -"W c #FBFCFD", 92 -"X c #85A8DD", 93 -"Y c #537FC1", 94 -"Z c #ACACAC", 95 -"` c #D4D4D4", 96 -" . c #D2D2D2", 97 -".. c #DBDBDB", 98 -"+. c #658DCA", 99 -"@. c #99B8EA", 100 -"#. c #7EA5DD", 101 -"$. c #80A6DD", 102 -"%. c #7CA3DB", 103 -"&. c #7AA0D9", 104 -"*. c #79A0D9", 105 -"=. c #789FD8", 106 -"-. c #789ED8", 107 -";. c #5D84BF", 108 -">. c #618BC9", 109 -",. c #92B5E6", 110 -"'. c #81A7E2", 111 -"). c #81A7E1", 112 -"!. c #7DA3DE", 113 -"~. c #7BA1DC", 114 -"{. c #799FDB", 115 -"]. c #779ED9", 116 -"^. c #739AD4", 117 -"/. c #577EBB", 118 -"(. c #CECECE", 119 -"_. c #5481C4", 120 -":. c #97B6EA", 121 -"<. c #EAF3F3", 122 -"[. c #E6F1ED", 123 -"}. c #E6F1EF", 124 -"|. c #E6F0EF", 125 -"1. c #E5F1ED", 126 -"2. c #EDF5F3", 127 -"3. c #799CD5", 128 -"4. c #4470B0", 129 -"5. c #A1A1A1", 130 -"6. c #9F9F9F", 131 -"7. c #ABABAB", 132 -"8. c #517FC3", 133 -"9. c #9AB6EF", 134 -"0. c #E8F3EA", 135 -"a. c #84BF51", 136 -"b. c #98C96F", 137 -"c. c #99C971", 138 -"d. c #84BF54", 139 -"e. c #E9F4E4", 140 -"f. c #7B9CDD", 141 -"g. c #3A69AA", 142 -"h. c #5583C6", 143 -"i. c #BACEEF", 144 -"j. c #FFFFDD", 145 -"k. c #C7EE87", 146 -"l. c #D7F4A2", 147 -"m. c #D7F6A2", 148 -"n. c #C7EE8C", 149 -"o. c #FFFFE0", 150 -"p. c #85A2DD", 151 -"q. c #3E6AAB", 152 -"r. c #3368BA", 153 -"s. c #5884C3", 154 -"t. c #688BD3", 155 -"u. c #708FE1", 156 -"v. c #6C8DDC", 157 -"w. c #6D8BDA", 158 -"x. c #6E8AD7", 159 -"y. c #6C8BCD", 160 -"z. c #446DAB", 161 -"A. c #2E5FA6", 162 -" . + @ # $ % ", 163 -" & * = - ; > , ' ) ! ", 164 -". ~ { ] ] ] ] ] ] ^ / ( ", 165 -"_ : { ] ] ] ] ] ] ^ < [ ", 166 -"@ } | 1 2 ^ 3 4 5 6 7 8 ", 167 -"9 2 0 5 a b c 6 d e f g ", 168 -"$ h i 7 j 7 k l m n o p q r s ", 169 -"t u < ~ v w x y ] z ] ] ] ] A B ", 170 -"C - | v D ' E F ] G ] ] H I J K ", 171 -"L M j N b O P Q R S T U V W X Y ", 172 -"Z 4 5 ` ...+.@.#.$.%.&.*.=.-.;.", 173 -"( 5 - .. ...>.,.'.).!.~.{.].^./.", 174 -" 8 (., u h _.:.<.[.}.|.1.2.3.4.", 175 -" 5.6.5.7.8.9.0.a.b.c.d.e.f.g.", 176 -" h.i.j.k.l.m.n.o.p.q.", 177 -" r.s.t.u.v.w.x.y.z.A."};
Deleted icons/network.xpm.
1 -/* XPM */ 2 -static const char * network_xpm[] = { 3 -"16 16 37 1", 4 -" c None", 5 -". c #707070", 6 -"+ c #C5C5C5", 7 -"@ c #A8A8A8", 8 -"# c #9A9A9A", 9 -"$ c #D1D1D1", 10 -"% c #737373", 11 -"& c #A4A4A4", 12 -"* c #979797", 13 -"= c #A0A0A0", 14 -"- c #D5D5D5", 15 -"; c #989898", 16 -"> c #777777", 17 -", c #C7C7C7", 18 -"' c #A2A2A2", 19 -") c #8D8D8D", 20 -"! c #9B9B9B", 21 -"~ c #A1A1A1", 22 -"{ c #7F7F7F", 23 -"] c #8A8A8A", 24 -"^ c #949494", 25 -"/ c #A7A7A7", 26 -"( c #909090", 27 -"_ c #939393", 28 -": c #A3A3A3", 29 -"< c #7B7B7B", 30 -"[ c #A5A5A5", 31 -"} c #9D9D9D", 32 -"| c #7D7D7D", 33 -"1 c #9F9F9F", 34 -"2 c #848484", 35 -"3 c #727272", 36 -"4 c #7E7E7E", 37 -"5 c #858585", 38 -"6 c #9E9E9E", 39 -"7 c #DADADA", 40 -"8 c #FFFFFF", 41 -" ", 42 -" ", 43 -" 888888 ", 44 -" 8@/[&~=8 ", 45 -" 8@87-$,+!8 ", 46 -"888@8&=1#;;+^888", 47 -"866666:88*666668", 48 -"8777775 {777778", 49 -"855555#88%.....8", 50 -"888'8*(]24<+>888", 51 -" 8}87-$,+38 ", 52 -" 8_)5|>%8 ", 53 -" 888888 ", 54 -" ", 55 -" ", 56 -" "};
Deleted indent_me.
1 -indent -npsl -nbfda -l80 -i2 -ci2 -cbi2 -cp2 -ts2 -cli2 -bl -ce -lp -npcs -nut *.h *.cpp 2 -
Deleted mac_resource/wxmac.icns.
cannot compute difference between binary files
Changes to win_resource/icon.ico.
cannot compute difference between binary files
Deleted win_resource/spatialite-icon.png.
cannot compute difference between binary files