Check-in Differences
Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Difference From 028b99927b4cfbb3 To 164c9d435f4d167b

2018-07-29
17:00
updating the internal HTML documentation check-in: a5c0047ccc user: sandro tags: trunk
15:35
VirtualPG integration - aligning to recent changes in rasterlite2 check-in: 028b99927b user: sandro tags: trunk
2017-08-24
16:04
implementing dynamic styles check-in: 161086f290 user: sandro tags: trunk
2017-08-05
16:08
implementing HtmlHep.cpp and helpgen.c check-in: 7943b510a1 user: sandro tags: trunk
2017-08-02
16:27
Map Panel: several enhancements check-in: 164c9d435f user: sandro tags: trunk
2017-07-16
16:24
implementing Raster Pixel Identify check-in: 15e5b8f5f9 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      5   / version 1.7, 2013 May 8
     6      6   /
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
     8      8   /
     9      9   / Copyright (C) 2008-2013  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
    13     13   /    the Free Software Foundation, either version 3 of the License, or
    14     14   /    (at your option) any later version.
................................................................................
    72     72     unsigned int width;
    73     73     unsigned int height;
    74     74     unsigned char sample_type;
    75     75     unsigned char pixel_type;
    76     76     unsigned char num_bands;
    77     77   
    78     78     if (BlobType == GAIA_GEOMETRY_BLOB)
    79         -    Geometry = gaiaFromSpatiaLiteBlobWkb(Blob, BlobSize);
    80         -  else if (BlobType == GAIA_TINYPOINT_BLOB)
    81     79       Geometry = gaiaFromSpatiaLiteBlobWkb(Blob, BlobSize);
    82     80     else if (BlobType == GAIA_GPB_BLOB)
    83     81       Geometry = gaiaFromGeoPackageGeometryBlob(Blob, BlobSize);
    84     82     else if (BlobType == GAIA_XML_BLOB)
    85     83       {
    86     84   #ifdef ENABLE_LIBXML2           // only if LIBXML2 is enabled
    87     85   
................................................................................
   314    312     if (wxPropertySheetDialog::Create(parent, wxID_ANY, wxT("BLOB explorer")) ==
   315    313         false)
   316    314       return false;
   317    315     wxBookCtrlBase *book = GetBookCtrl();
   318    316   // creates individual panels
   319    317     wxPanel *hexadecimal = CreateHexadecimalPage(book);
   320    318     book->AddPage(hexadecimal, wxT("Hexadecimal dump"), true);
   321         -  if (BlobType == GAIA_GEOMETRY_BLOB || BlobType == GAIA_TINYPOINT_BLOB
   322         -      || BlobType == GAIA_GPB_BLOB)
          319  +  if (BlobType == GAIA_GEOMETRY_BLOB || BlobType == GAIA_GPB_BLOB)
   323    320       {
   324    321         wxPanel *geometry = CreateGeometryPage(book);
   325    322         book->AddPage(geometry, wxT("Geometry explorer"), false);
   326    323         wxPanel *wkt = CreateWKTPage(book);
   327    324         book->AddPage(wkt, wxT("WKT"), false);
   328    325         wxPanel *ewkt = CreateEWKTPage(book);
   329    326         book->AddPage(ewkt, wxT("EWKT"), false);
................................................................................
  1082   1079   //
  1083   1080     switch (event.GetSelection())
  1084   1081       {
  1085   1082         case 0:
  1086   1083           UpdateHexadecimalPage();
  1087   1084           break;
  1088   1085         case 1:
  1089         -        if (BlobType == GAIA_GEOMETRY_BLOB || BlobType == GAIA_TINYPOINT_BLOB
  1090         -            || BlobType == GAIA_GPB_BLOB)
         1086  +        if (BlobType == GAIA_GEOMETRY_BLOB || BlobType == GAIA_GPB_BLOB)
  1091   1087             UpdateGeometryPage();
  1092   1088           else if (BlobType == GAIA_XML_BLOB)
  1093   1089             UpdateXmlDocumentPage();
  1094   1090           else
  1095   1091             UpdateImagePage();
  1096   1092           break;
  1097   1093         case 2:

Changes to Classdef.h.

     1      1   /*
     2      2   / Classdef.h
     3      3   / class definitions for spatialite_gui  - a SQLite /SpatiaLite GUI tool
     4      4   /
     5      5   / version 1.7, 2013 May 8
     6      6   /
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
     8      8   /
     9      9   / Copyright (C) 2008-2013  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
    13     13   /    the Free Software Foundation, either version 3 of the License, or
    14     14   /    (at your option) any later version.
................................................................................
    29     29   #include "wx/grid.h"
    30     30   #include "wx/listctrl.h"
    31     31   #include "wx/textctrl.h"
    32     32   #include "wx/propdlg.h"
    33     33   #include "wx/generic/propdlg.h"
    34     34   #include "wx/timer.h"
    35     35   #include "wx/string.h"
    36         -#include "wx/dynlib.h"
    37     36   
    38     37   #include "config.h"
    39     38   
    40     39   #ifdef SPATIALITE_AMALGAMATION
    41     40   #include <spatialite/sqlite3.h>
    42     41   #else
    43     42   #include <sqlite3.h>
................................................................................
    47     46   #include <spatialite/gaiaexif.h>
    48     47   #include <spatialite/gaiageo.h>
    49     48   #include <spatialite.h>
    50     49   #include <spatialite/gg_wfs.h>
    51     50   #include <spatialite/geopackage.h>
    52     51   
    53     52   #include <freexl.h>
    54         -#include <virtualpg.h>
    55     53   
    56     54   #include <rasterlite2/rasterlite2.h>
    57     55   #include <rasterlite2/rl2wms.h>
    58     56   #include "rasterlite2/rl2graphics.h"
    59     57   
           58  +//
           59  +// functions for QSORT / BSEARCH
           60  +//
           61  +int cmp_prenodes_code(const void *p1, const void *p2);
           62  +int cmp_prenodes_id(const void *p1, const void *p2);
           63  +int cmp_nodes2_code(const void *p1, const void *p2);
           64  +int cmp_nodes2_id(const void *p1, const void *p2);
           65  +int cmp_nodes1_code(const void *p1, const void *p2);
           66  +int cmp_nodes1_id(const void *p1, const void *p2);
           67  +
    60     68   //
    61     69   // functions for threaded queries
    62     70   //
    63     71   int SqlProgressCallback(void *arg);
    64     72   #if defined(__WIN32) && !defined(__MINGW32__)
    65     73   DWORD WINAPI DoExecuteSqlThread(void *arg);
    66     74   #else
................................................................................
   141    149     ID_Exif,
   142    150     ID_GpsPics,
   143    151     ID_LoadXml,
   144    152     ID_Srids,
   145    153     ID_Charset,
   146    154     ID_Help,
   147    155     ID_Attach,
   148         -  ID_Postgres,
   149    156     ID_SqlLog,
   150    157     ID_DbStatus,
   151    158     ID_CheckGeom,
   152    159     ID_SaneGeom,
   153    160     ID_WFS,
   154    161     ID_DXF,
   155    162     ID_AddLayer,
................................................................................
   265    272     Tree_MapRemoveAll,
   266    273     Tree_MapShowAll,
   267    274     Tree_MapHideAll,
   268    275     Tree_MapConfigure,
   269    276     Tree_MapVisible,
   270    277     Tree_MapFullExtent,
   271    278     Tree_MapLayerFullExtent,
   272         -  Tree_SqlSample,
   273         -  Tree_UrlSample,
   274    279     Tree_MapLayerConfigure,
   275    280     Tree_MapLayerInfo,
   276    281     Tree_QuickStyleEdit,
   277    282     Tree_MapRemoveLayer,
   278    283     Tree_MapDeleteItem,
   279         -  Tree_CreatePostgreSqlConn,
   280         -  Tree_CloseAllPostgreSqlConns,
   281         -  Tree_ClosePostgreSqlConn,
   282         -  Tree_PostgreSqlDropOrphans,
   283         -  Tree_PostgreSqlInfos,
   284    284     Grid_Clear,
   285    285     Grid_All,
   286    286     Grid_Column,
   287    287     Grid_Row,
   288    288     Grid_Copy,
   289    289     Grid_Blob,
   290    290     Grid_Delete,
................................................................................
   438    438     ID_NET_FROM_TO,
   439    439     ID_NET_TO_FROM,
   440    440     ID_NET_NAME_ENABLE,
   441    441     ID_NET_NAME,
   442    442     ID_NET_A_STAR,
   443    443     ID_NET_DATA,
   444    444     ID_NET_VIRTUAL,
   445         -  ID_NET_OVERWRITE,
   446    445     ID_EXIF_PATH,
   447    446     ID_EXIF_FOLDER,
   448    447     ID_EXIF_METADATA,
   449    448     ID_EXIF_GPS_ONLY,
   450    449     ID_GPS_PICS_PATH,
   451    450     ID_GPS_PICS_FOLDER,
   452    451     ID_GPS_PICS_TABLE,
................................................................................
   760    759     ID_RASTER_KEYWORD_REMOVE,
   761    760     ID_RASTER_KEYWORD,
   762    761     ID_RASTER_KEYWORD_GRID,
   763    762     ID_SYMBOLIZER_NAME,
   764    763     ID_SYMBOLIZER_TITLE,
   765    764     ID_SYMBOLIZER_ABSTRACT,
   766    765     ID_SYMBOLIZER_OPACITY,
   767         -  ID_SYMBOLIZER_BAND_MODE,
   768    766     ID_SYMBOLIZER_RED,
   769    767     ID_SYMBOLIZER_GREEN,
   770    768     ID_SYMBOLIZER_BLUE,
   771    769     ID_SYMBOLIZER_GRAY,
   772    770     ID_SYMBOLIZER_CONTRAST,
   773    771     ID_SYMBOLIZER_GAMMA,
   774    772     ID_SYMBOLIZER_MAP,
................................................................................
   991    989     ID_SYMBOLIZER_FACE_SEED_ANCHOR_Y,
   992    990     ID_SYMBOLIZER_FACE_SEED_FILL_COLOR,
   993    991     ID_SYMBOLIZER_FACE_SEED_FILL_PICKER_HEX,
   994    992     ID_SYMBOLIZER_FACE_SEED_FILL_PICKER_BTN,
   995    993     ID_SYMBOLIZER_FACE_SEED_STROKE_COLOR,
   996    994     ID_SYMBOLIZER_FACE_SEED_STROKE_PICKER_HEX,
   997    995     ID_SYMBOLIZER_FACE_SEED_STROKE_PICKER_BTN,
   998         -  ID_SYMBOLIZER_COLOR_MAP_MODE,
   999         -  ID_SYMBOLIZER_MIN_COLOR,
  1000         -  ID_SYMBOLIZER_MIN_PICKER_HEX,
  1001         -  ID_SYMBOLIZER_MIN_PICKER_BTN,
  1002         -  ID_SYMBOLIZER_MAX_COLOR,
  1003         -  ID_SYMBOLIZER_MAX_PICKER_HEX,
  1004         -  ID_SYMBOLIZER_MAX_PICKER_BTN,
  1005    996     ID_WMS_URL,
  1006    997     ID_WMS_CATALOG,
  1007    998     ID_WMS_RESET,
  1008    999     ID_WMS_SERVER,
  1009   1000     ID_WMS_VERSION,
  1010   1001     ID_WMS_CRS,
  1011   1002     ID_WMS_STYLE,
................................................................................
  1033   1024     ID_RASTER_STYLE,
  1034   1025     ID_RASTER_OK,
  1035   1026     ID_VECTOR_LAYER,
  1036   1027     ID_VECTOR_TYPE,
  1037   1028     ID_VECTOR_UUID,
  1038   1029     ID_VECTOR_STYLE,
  1039   1030     ID_VECTOR_OK,
  1040         -  ID_VECTOR_COPY,
  1041         -  ID_MIME_TYPE,
  1042         -  ID_IMAGE_QUALITY,
  1043         -  ID_SQL_SAMPLE,
  1044   1031     ID_TOPOGEO_LAYER,
  1045   1032     ID_TOPOGEO_SRID,
  1046   1033     ID_TOPOGEO_STYLE,
  1047   1034     ID_TOPOGEO_FACE,
  1048   1035     ID_TOPOGEO_EDGE,
  1049   1036     ID_TOPOGEO_NODE,
  1050   1037     ID_TOPOGEO_FACE_SEED,
................................................................................
  1105   1092     ID_QUICK_STYLE_APPLY,
  1106   1093     ID_QUICK_STYLE_EXPORT,
  1107   1094     ID_QUICK_STYLE_COPY,
  1108   1095     ID_PANE_POINT,
  1109   1096     ID_PANE_LINE,
  1110   1097     ID_PANE_POLYGON,
  1111   1098     ID_PANE_TEXT,
  1112         -  ID_PANE_CONTRAST_ENHANCEMENT,
  1113         -  ID_PANE_CHANNEL_SELECTION,
  1114         -  ID_PANE_COLOR_MAP,
  1115   1099     ID_PAINT_MAP_STEP,
  1116         -  ID_PAINT_MAP_THREAD_FINISHED,
  1117         -  ID_POSTGRES_HOST,
  1118         -  ID_POSTGRES_HOSTADDR,
  1119         -  ID_POSTGRES_PORT,
  1120         -  ID_POSTGRES_DBNAME,
  1121         -  ID_POSTGRES_USER,
  1122         -  ID_POSTGRES_PASSWORD,
  1123         -  ID_POSTGRES_RDONLY,
  1124         -  ID_POSTGRES_TEXTDATES
         1100  +  ID_PAINT_MAP_THREAD_FINISHED
  1125   1101   };
  1126   1102   
  1127   1103   enum
  1128   1104   {
  1129   1105   // tree item data types
  1130   1106     MY_ROOT_NODE = 0,
  1131   1107     MY_ROOT_USERDATA,
  1132   1108     MY_ROOT_ISOMETADATA,
  1133   1109     MY_ROOT_TOPOLOGIES,
  1134   1110     MY_ROOT_NETWORKS,
  1135   1111     MY_ROOT_RASTER,
  1136   1112     MY_ROOT_VECTOR,
  1137   1113     MY_ROOT_WMS,
  1138         -  MY_ROOT_POSTGRESQL,
  1139   1114     MY_ROOT_STYLING,
  1140   1115     MY_ROOT_METADATA,
  1141   1116     MY_ROOT_INTERNAL,
  1142   1117     MY_ROOT_RTREE,
  1143   1118     MY_TABLE,
  1144   1119     MY_VTABLE,
  1145   1120     MY_VIEW,
................................................................................
  1179   1154     MY_FOREIGN_KEY,
  1180   1155     MY_FOREIGN_KEY_FLD,
  1181   1156     MY_INT_VARIANT,
  1182   1157     MY_DBL_VARIANT,
  1183   1158     MY_TXT_VARIANT,
  1184   1159     MY_BLOB_VARIANT,
  1185   1160     MY_NULL_VARIANT,
  1186         -  MY_UNDEFINED,
  1187         -  MY_POSTGRES_CONN,
  1188         -  MY_POSTGRES_SCHEMA,
  1189         -  MY_POSTGRES_TABLE,
  1190         -  MY_POSTGRES_VIEW,
  1191         -  MY_POSTGIS_VIEW,
  1192         -  MY_POSTGRES_COLUMN,
  1193         -  MY_POSTGIS_GEOMETRY
         1161  +  MY_UNDEFINED
  1194   1162   };
  1195   1163   
  1196   1164   enum
  1197   1165   {
  1198   1166   // control IDs for timers
  1199   1167     ID_AUTO_SAVE_TIMER = 20000,
  1200   1168     ID_DB_STATUS_TIMER,
................................................................................
  1396   1364     int Type;                     // the object type
  1397   1365     int SubType;                  // the object sub-type  
  1398   1366     wxString DbAlias;             // the DB alias [Attached DB] 
  1399   1367     wxString MainName;            // the object name [usually: table name]
  1400   1368     wxString ColName;             // the column name [optional]
  1401   1369     wxString PathOrURL;           // the Path or request URL [optional]
  1402   1370     bool Restricted;              // not editable
  1403         -// PostgreSQL specific
  1404         -  wxString Host;
  1405         -  wxString HostAddr;
  1406         -  int Port;
  1407         -  wxString DbName;
  1408         -  wxString User;
  1409         -  wxString Schema;
  1410         -  wxString Name;
  1411         -  wxString Column;
  1412         -  wxString VirtName;
  1413         -  bool ReadOnly;
  1414         -  bool PK;
  1415         -  bool Select;
  1416         -  bool InsertUpdateDelete;
  1417   1371   public:
  1418   1372       MyObject(int type);
  1419   1373       MyObject(int type, wxString & dbAlias);
  1420   1374       MyObject(int type, wxString & dbAlias, wxString & name, bool restricted =
  1421   1375                false);
  1422   1376       MyObject(int type, wxString & dbAlias, wxString & name, wxString & column);
  1423   1377       MyObject(int type, wxString & dbAlias, wxString & name, wxString & column,
  1424   1378                wxString & path_or_url);
  1425         -    MyObject(int type, wxString & host, wxString & hostaddr, int port,
  1426         -             wxString & dbname, wxString & user, bool readOnly);
  1427         -    MyObject(int type, wxString & host, wxString & hostaddr, int port,
  1428         -             wxString & dbname, wxString & user, wxString & schema);
  1429         -    MyObject(int type, wxString & host, wxString & hostaddr, int port,
  1430         -             wxString & dbname, wxString & user, wxString & schema,
  1431         -             wxString & name, wxString & virtname, bool readOnly, bool pk,
  1432         -             bool select, bool insertUpdateDelete);
  1433         -    MyObject(int type, wxString & host, wxString & hostaddr, int port,
  1434         -             wxString & dbname, wxString & user, wxString & schema,
  1435         -             wxString & name, wxString & column, wxString & virtname);
  1436   1379       virtual ~ MyObject()
  1437   1380     {;
  1438   1381     }
  1439   1382     int GetType()
  1440   1383     {
  1441   1384       return Type;
  1442   1385     }
................................................................................
  1456   1399     {
  1457   1400       return ColName;
  1458   1401     }
  1459   1402     wxString & GetPathOrURL()
  1460   1403     {
  1461   1404       return PathOrURL;
  1462   1405     }
  1463         -  wxString & GetHost()
  1464         -  {
  1465         -    return Host;
  1466         -  }
  1467         -  wxString & GetHostAddr()
  1468         -  {
  1469         -    return HostAddr;
  1470         -  }
  1471         -  int GetPort()
  1472         -  {
  1473         -    return Port;
  1474         -  }
  1475         -  wxString & GetDbName()
  1476         -  {
  1477         -    return DbName;
  1478         -  }
  1479         -  wxString & GetUser()
  1480         -  {
  1481         -    return User;
  1482         -  }
  1483         -  wxString & GetSchema()
  1484         -  {
  1485         -    return Schema;
  1486         -  }
  1487         -  wxString & GetName()
  1488         -  {
  1489         -    return Name;
  1490         -  }
  1491         -  wxString & GetColumn()
  1492         -  {
  1493         -    return Column;
  1494         -  }
  1495         -  wxString & GetVirtName()
  1496         -  {
  1497         -    return VirtName;
  1498         -  }
  1499         -  bool IsReadOnly()
  1500         -  {
  1501         -    return ReadOnly;
  1502         -  }
  1503         -  bool HasPK()
  1504         -  {
  1505         -    return PK;
  1506         -  }
  1507         -  bool CanSelect()
  1508         -  {
  1509         -    return Select;
  1510         -  }
  1511         -  bool CanInsertUpdateDelete()
  1512         -  {
  1513         -    return InsertUpdateDelete;
  1514         -  }
  1515   1406     bool IsTable();
  1516   1407     bool IsView();
  1517   1408     bool IsTemporary();
  1518   1409     bool IsEditable();
  1519   1410     bool IsAttachedDB();
  1520   1411     bool IsRootAttached();
  1521   1412     bool IsAttached();
................................................................................
  1533   1424     bool IsIndex();
  1534   1425     bool IsIndexColumn();
  1535   1426     bool IsTrigger();
  1536   1427     bool IsPrimaryKey();
  1537   1428     bool IsPrimaryKeyColumn();
  1538   1429     bool IsForeignKey();
  1539   1430     bool IsForeignKeyColumn();
  1540         -  bool IsPostgreSQL();
  1541   1431   };
  1542   1432   
  1543   1433   class MyColumnInfo
  1544   1434   {
  1545   1435   //
  1546   1436   // a class to store a DB column
  1547   1437   //
................................................................................
  2589   2479     wxTreeItemId RootTopologies;
  2590   2480     wxTreeItemId RootNetworks;
  2591   2481     wxTreeItemId RootRasterCoverages;
  2592   2482     wxTreeItemId RootVectorCoverages;
  2593   2483     wxTreeItemId RootStyling;
  2594   2484     wxTreeItemId RootWMS;
  2595   2485     wxTreeItemId RootIsoMetadata;
  2596         -  wxTreeItemId RootPostgreSQL;
  2597   2486     TopoGeoList Topologies;
  2598   2487     TopoNetList Networks;
  2599   2488     RasterCoverageList RasterCoverages;
  2600   2489     VectorCoverageList VectorCoverages;
  2601   2490     WmsLayerList WmsLayers;
  2602   2491     TopoGeoList AltTopologies;
  2603   2492     TopoNetList AltNetworks;
................................................................................
  2613   2502     wxString CurrentVectorCoverageName;
  2614   2503     wxString CurrentWmsLayerURL;
  2615   2504     wxString CurrentWmsLayerName;
  2616   2505     void ExpandTable(wxTreeItemId & item);
  2617   2506     void ExpandView(wxTreeItemId & item);
  2618   2507     void ExpandAttachedTable(wxTreeItemId & item);
  2619   2508     void ExpandAttachedView(wxTreeItemId & item);
  2620         -  void ExpandPostgresTable(wxTreeItemId & item);
  2621         -  void ExpandPostGisView(wxTreeItemId & item);
  2622   2509   // context menus
  2623   2510     void DoRootRasterCoveragesContextMenu(wxPoint & pt);
  2624   2511     void DoRootVectorCoveragesContextMenu(wxPoint & pt);
  2625   2512     void DoRootWmsLayersContextMenu(wxPoint & pt);
  2626   2513     void DoRootTopoGeoContextMenu(wxPoint & pt);
  2627   2514     void DoRootTopoNetContextMenu(wxPoint & pt);
  2628   2515     void DoRootStylingContextMenu(wxPoint & pt);
  2629         -  void DoRootPostgreSqlContextMenu(wxPoint & pt);
  2630   2516     void DoRootOthersContextMenu(wxPoint & pt, MyObject * obj);
  2631   2517     void DoAttachedDbContextMenu(wxPoint & pt, MyObject * obj);
  2632   2518     void DoRootAttachedContextMenu(wxPoint & pt, MyObject * obj);
  2633   2519     void DoGenericAttachedContextMenu(wxPoint & pt, wxString & title);
  2634   2520     void DoTopoGeoContextMenu(wxPoint & pt, wxString & name);
  2635   2521     void DoTopoNetContextMenu(wxPoint & pt, wxString & name);
  2636   2522     void DoRasterCoverageContextMenu(wxPoint & pt, wxString & name);
................................................................................
  2659   2545     void DoAttachedPrimaryKeyContextMenu(wxPoint & pt, MyObject * obj);
  2660   2546     void DoMainPrimaryKeyColumnContextMenu(wxPoint & pt, MyObject * obj);
  2661   2547     void DoAttachedPrimaryKeyColumnContextMenu(wxPoint & pt, MyObject * obj);
  2662   2548     void DoMainForeignKeyContextMenu(wxPoint & pt, MyObject * obj);
  2663   2549     void DoAttachedForeignKeyContextMenu(wxPoint & pt, MyObject * obj);
  2664   2550     void DoMainForeignKeyColumnContextMenu(wxPoint & pt, MyObject * obj);
  2665   2551     void DoAttachedForeignKeyColumnContextMenu(wxPoint & pt, MyObject * obj);
  2666         -  void DoPostgreSqlContextMenu(wxPoint & pt, MyObject * obj);
  2667         -  void DoPostgresConnContextMenu(wxPoint & pt, MyObject * obj);
  2668         -  void DoPostgresSchemaContextMenu(wxPoint & pt, MyObject * obj);
  2669         -  void DoPostgresTableContextMenu(wxPoint & pt, MyObject * obj);
  2670         -  void DoPostgresViewContextMenu(wxPoint & pt, MyObject * obj);
  2671         -  void DoPostGisViewContextMenu(wxPoint & pt, MyObject * obj);
  2672         -  void DoPostgresColumnContextMenu(wxPoint & pt, MyObject * obj);
  2673         -  void DoPostGisGeometryContextMenu(wxPoint & pt, MyObject * obj);
  2674   2552   public:
  2675   2553       MyTableTree()
  2676   2554     {;
  2677   2555     }
  2678   2556     MyTableTree(MyFrame * parent, wxWindowID id = wxID_ANY);
  2679   2557     virtual ~ MyTableTree();
  2680   2558     void SetPath(wxString & path)
................................................................................
  2701   2579     wxTreeItemId & GetRootNode(wxString & tableName, bool * restricted,
  2702   2580                                bool * tile_data);
  2703   2581     wxTreeItemId & GetAltRootNode(wxString & tableName, RootNodes * nodes,
  2704   2582                                   bool * tile_data);
  2705   2583     void AddTable(wxString & tableName, bool virtualTable, bool geometry);
  2706   2584     void AddTable(wxString & dbAlias, wxString & tableName, bool virtualTable,
  2707   2585                   bool geometry);
  2708         -  void AddTmpMetadata(wxString & tableName);
  2709   2586     void AddGeoPackageTable(wxString & tableName);
  2710   2587     void AddGeoPackageTable(wxString & dbAlias, wxString & tableName,
  2711   2588                             RootNodes * nodes);
  2712   2589     void AddGeoPackageVirtualTable(wxString & tableName);
  2713   2590     void AddGeoPackageVirtualTable(wxString & dbAlias, wxString & tableName,
  2714   2591                                    RootNodes * nodes);
  2715   2592     void AddFdoOgrTable(wxString & tableName);
................................................................................
  2721   2598     wxTreeItemId & AddAttached(wxString & dbAlias, wxString & path);
  2722   2599     void AddTable(wxString & dbAlias, wxString & tableName,
  2723   2600                   bool virtualTable, bool geometry, RootNodes * list);
  2724   2601     void AddView(wxString & viewName, bool geometry);
  2725   2602     void AddView(wxString & dbAlias, wxString & viewName, bool geometry);
  2726   2603     void AddView(wxString & dbAlias, wxString & viewName, bool geometry,
  2727   2604                  RootNodes * list);
  2728         -  void AddPostgresTable(class MyPostgres * list, wxString & virtName);
  2729   2605     void ExpandRoot()
  2730   2606     {
  2731   2607       Expand(Root);
  2732   2608       Expand(RootUserData);
  2733   2609       CollapseAllChildren(RootTopologies);
  2734   2610       CollapseAllChildren(RootNetworks);
  2735   2611       CollapseAllChildren(RootRasterCoverages);
  2736   2612       CollapseAllChildren(RootVectorCoverages);
  2737   2613       CollapseAllChildren(RootStyling);
  2738   2614       CollapseAllChildren(RootWMS);
  2739         -    CollapseAllChildren(RootPostgreSQL);
  2740   2615       CollapseAllChildren(RootIsoMetadata);
  2741   2616       Collapse(RootMetadata);
  2742   2617       Collapse(RootInternal);
  2743   2618       Collapse(RootSpatialIndex);
  2744   2619     }
  2745   2620     void AddTopology(TopoGeoSet * topology)
  2746   2621     {
................................................................................
  2817   2692     {
  2818   2693       AltRasterCoverages.Flush();
  2819   2694     }
  2820   2695     void DeleteAltVectorCoverages(void)
  2821   2696     {
  2822   2697       AltVectorCoverages.Flush();
  2823   2698     }
  2824         -  void AddPostgresConnection(int num, class MyPostgresConn * conn,
  2825         -                             wxTreeItemId & itemId);
  2826         -  void AddPostgresSchema(wxTreeItemId & parent, MyPostgresConn * conn,
  2827         -                         wxString & schema, wxTreeItemId & itemId);
  2828         -  void AddPostgresTable(wxTreeItemId & parent, MyPostgresConn * conn,
  2829         -                        wxString & schema, wxString & table,
  2830         -                        wxString & virtName);
  2831         -  void AddPostgresView(wxTreeItemId & parent, MyPostgresConn * conn,
  2832         -                       wxString & schema, wxString & view, wxString & virtName);
  2833         -  void AddPostGisView(wxTreeItemId & parent, MyPostgresConn * conn,
  2834         -                      wxString & schema, wxString & table, wxString & geometry,
  2835         -                      wxString & virtName);
  2836   2699     sqlite3 *GetSQLiteHandle();
  2837   2700     void OnSelChanged(wxTreeEvent & event);
  2838   2701     void OnRightClick(wxTreeEvent & event);
  2839   2702     void OnCmdQueryViewComposer(wxCommandEvent & event);
  2840   2703     void OnCmdCloneTable(wxCommandEvent & event);
  2841   2704     void OnCmdNewTable(wxCommandEvent & event);
  2842   2705     void OnCmdNewView(wxCommandEvent & event);
................................................................................
  2918   2781     void OnCmdDumpCsv(wxCommandEvent & event);
  2919   2782     void OnCmdDumpHtml(wxCommandEvent & event);
  2920   2783     void OnCmdDumpDif(wxCommandEvent & event);
  2921   2784     void OnCmdDumpSylk(wxCommandEvent & event);
  2922   2785     void OnCmdDumpDbf(wxCommandEvent & event);
  2923   2786     void OnCmdDumpPostGIS(wxCommandEvent & event);
  2924   2787     void OnCmdEdit(wxCommandEvent & event);
  2925         -  void OnCmdCreatePostgreSqlConn(wxCommandEvent & event);
  2926         -  void OnCmdCloseAllPostgreSqlConns(wxCommandEvent & event);
  2927         -  void OnCmdClosePostgreSqlConn(wxCommandEvent & event);
  2928         -  void OnCmdPostgreSqlDropOrphans(wxCommandEvent & event);
  2929         -  void OnCmdPostgreSqlInfos(wxCommandEvent & event);
  2930   2788     bool DropRenameAux1(MyObject * obj, class GeomColsList * geometries,
  2931   2789                         bool * autoincrement);
  2932   2790     void DropRenameAux2(MyObject * obj, GeomColsList * geometries,
  2933   2791                         wxString & aliasTable, wxString & new_column,
  2934   2792                         wxString & renameSql, wxString & dropSql,
  2935   2793                         wxString & disableSpatialIdxSql,
  2936   2794                         wxString & dropSpatialIdxSql,
................................................................................
  3423   3281                    wxString & error, wxString & geosMsg);
  3424   3282     MalformedGeom *GetFirst()
  3425   3283     {
  3426   3284       return First;
  3427   3285     }
  3428   3286   };
  3429   3287   
  3430         -class PostgresConnectionDialog:public wxDialog
  3431         -{
  3432         -// 
  3433         -// a dialog for connecting to a PosgreSQL DBMS
  3434         -//
  3435         -private:
  3436         -  MyFrame * MainFrame;
  3437         -  char *host;
  3438         -  char *hostaddr;
  3439         -  unsigned int port;
  3440         -  char *dbname;
  3441         -  char *user;
  3442         -  char *password;
  3443         -  bool ReadOnly;
  3444         -  bool TextDates;
  3445         -public:
  3446         -    PostgresConnectionDialog()
  3447         -  {
  3448         -    host = NULL;
  3449         -    hostaddr = NULL;
  3450         -    port = 5432;
  3451         -    dbname = NULL;
  3452         -    user = NULL;
  3453         -    password = NULL;
  3454         -    ReadOnly = true;
  3455         -    TextDates = true;
  3456         -  }
  3457         -  virtual ~ PostgresConnectionDialog()
  3458         -  {
  3459         -    if (host != NULL)
  3460         -      free(host);
  3461         -    if (hostaddr != NULL)
  3462         -      free(hostaddr);
  3463         -    if (dbname != NULL)
  3464         -      free(dbname);
  3465         -    if (user != NULL)
  3466         -      free(user);
  3467         -    if (password != NULL)
  3468         -      free(password);
  3469         -  }
  3470         -  bool Create(MyFrame * parent);
  3471         -  void CreateControls();
  3472         -  const char *GetHost()
  3473         -  {
  3474         -    return host;
  3475         -  }
  3476         -  const char *GetHostAddr()
  3477         -  {
  3478         -    return hostaddr;
  3479         -  }
  3480         -  int GetPort()
  3481         -  {
  3482         -    return port;
  3483         -  }
  3484         -  const char *GetDbName()
  3485         -  {
  3486         -    return dbname;
  3487         -  }
  3488         -  const char *GetUser()
  3489         -  {
  3490         -    return user;
  3491         -  }
  3492         -  const char *GetPassword()
  3493         -  {
  3494         -    return password;
  3495         -  }
  3496         -  bool IsReadOnly()
  3497         -  {
  3498         -    return ReadOnly;
  3499         -  }
  3500         -  bool IsTextDates()
  3501         -  {
  3502         -    return TextDates;
  3503         -  }
  3504         -  void OnOk(wxCommandEvent & event);
  3505         -};
  3506         -
  3507   3288   class SanitizeAllGeometriesDialog:public wxDialog
  3508   3289   {
  3509   3290   //
  3510   3291   // a dialog supporting Sanitize All Geometries
  3511   3292   //
  3512   3293   private:
  3513   3294     MyFrame * MainFrame;
................................................................................
  3971   3752   
  3972   3753   class TableViewItem
  3973   3754   {
  3974   3755   //
  3975   3756   // an ancillary class wrapping Tables and Views
  3976   3757   //
  3977   3758   private:
  3978         -  wxString DbName;
  3979   3759     wxString Name;
  3980   3760     bool View;
  3981   3761     bool Virtual;
  3982   3762     bool Geometry;
  3983   3763     bool GeoPackageGeometry;
  3984   3764     bool GeoPackageVirtualGeometry;
  3985   3765     bool FdoOgrGeometry;
  3986   3766     bool FdoOgrVirtualGeometry;
  3987   3767     TableViewItem *Next;
  3988   3768   public:
  3989         -    TableViewItem(wxString & db, wxString & name);
  3990   3769       TableViewItem(wxString & name, bool is_view, bool is_virtual);
  3991   3770      ~TableViewItem()
  3992   3771     {;
  3993   3772     }
  3994         -  wxString & GetDbName()
  3995         -  {
  3996         -    return DbName;
  3997         -  }
  3998   3773     wxString & GetName()
  3999   3774     {
  4000   3775       return Name;
  4001   3776     }
  4002   3777     bool IsView()
  4003   3778     {
  4004   3779       return View;
................................................................................
  4043   3818     {
  4044   3819       FdoOgrVirtualGeometry = true;
  4045   3820     }
  4046   3821     bool IsFdoOgrVirtualGeometry()
  4047   3822     {
  4048   3823       return FdoOgrVirtualGeometry;
  4049   3824     }
  4050         -  bool IsPostgresTable(class MyPostgres * list);
  4051         -  bool IsTmpMetadata();
  4052   3825     void SetNext(TableViewItem * next)
  4053   3826     {
  4054   3827       Next = next;
  4055   3828     }
  4056   3829     TableViewItem *GetNext()
  4057   3830     {
  4058   3831       return Next;
................................................................................
  4068   3841     TableViewItem * First;
  4069   3842     TableViewItem *Last;
  4070   3843     int Count;
  4071   3844     TableViewItem **Sorted;
  4072   3845   public:
  4073   3846       TableViewList();
  4074   3847      ~TableViewList();
  4075         -  void Add(wxString & db, wxString & name);
  4076   3848     void Add(wxString & name, bool isView, bool isVirtual);
  4077   3849     void PrepareSorted();
  4078   3850     void SetGeometry(wxString & name);
  4079   3851     void SetGeoPackageGeometry(wxString & name);
  4080   3852     void SetGeoPackageVirtualGeometry(wxString & name);
  4081   3853     void SetFdoOgrGeometry(wxString & name);
  4082   3854     void SetFdoOgrVirtualGeometry(wxString & name);
................................................................................
  4468   4240     MyAttachedTable *FindGeoTable(wxString & db_prefix, wxString & name);
  4469   4241     MyAttachedDB *GetFirst()
  4470   4242     {
  4471   4243       return First;
  4472   4244     }
  4473   4245   };
  4474   4246   
  4475         -class MyPostgresCol
  4476         -{
  4477         -//
  4478         -// a PostgreSQL Column
  4479         -//
  4480         -private:
  4481         -  wxString Name;
  4482         -  bool PK;
  4483         -  MyPostgresCol *Next;
  4484         -public:
  4485         -    MyPostgresCol(wxString & name)
  4486         -  {
  4487         -    Name = name;
  4488         -    PK = false;
  4489         -    Next = NULL;
  4490         -  }
  4491         -   ~MyPostgresCol()
  4492         -  {;
  4493         -  }
  4494         -  wxString & GetName()
  4495         -  {
  4496         -    return Name;
  4497         -  }
  4498         -  void SetPK()
  4499         -  {
  4500         -    PK = true;
  4501         -  }
  4502         -  bool IsPK()
  4503         -  {
  4504         -    return PK;
  4505         -  }
  4506         -  void SetNext(MyPostgresCol * next)
  4507         -  {
  4508         -    Next = next;
  4509         -  }
  4510         -  MyPostgresCol *GetNext()
  4511         -  {
  4512         -    return Next;
  4513         -  }
  4514         -};
  4515         -
  4516         -class MyPostgresColumns
  4517         -{
  4518         -//
  4519         -// a list of PostgreSQL Columns
  4520         -//
  4521         -private:
  4522         -  MyPostgresCol * First;
  4523         -  MyPostgresCol *Last;
  4524         -public:
  4525         -    MyPostgresColumns()
  4526         -  {
  4527         -    First = NULL;
  4528         -    Last = NULL;
  4529         -  }
  4530         -   ~MyPostgresColumns();
  4531         -  void Add(wxString & name);
  4532         -  void SetPK(wxString & name);
  4533         -  MyPostgresCol *GetFirst()
  4534         -  {
  4535         -    return First;
  4536         -  }
  4537         -  char *BuildWhere();
  4538         -};
  4539         -
  4540         -class MyPostGisGeometry
  4541         -{
  4542         -//
  4543         -// a PostGIS Geometry column
  4544         -//
  4545         -private:
  4546         -  wxString Name;
  4547         -  wxString GeomType;
  4548         -  bool MultiType;
  4549         -  int Srid;
  4550         -  int Dims;
  4551         -  MyPostGisGeometry *Next;
  4552         -public:
  4553         -    MyPostGisGeometry(wxString & name, wxString & type, int srid, int dims);
  4554         -   ~MyPostGisGeometry()
  4555         -  {;
  4556         -  }
  4557         -  wxString & GetName()
  4558         -  {
  4559         -    return Name;
  4560         -  }
  4561         -  wxString & GetGeomType()
  4562         -  {
  4563         -    return GeomType;
  4564         -  }
  4565         -  bool IsMultiType()
  4566         -  {
  4567         -    return MultiType;
  4568         -  }
  4569         -  int GetSrid()
  4570         -  {
  4571         -    return Srid;
  4572         -  }
  4573         -  int GetDims()
  4574         -  {
  4575         -    return Dims;
  4576         -  }
  4577         -  void SetNext(MyPostGisGeometry * next)
  4578         -  {
  4579         -    Next = next;
  4580         -  }
  4581         -  MyPostGisGeometry *GetNext()
  4582         -  {
  4583         -    return Next;
  4584         -  }
  4585         -};
  4586         -
  4587         -class MyPostgresPK
  4588         -{
  4589         -//
  4590         -// a ProgresSQL PK column
  4591         -//
  4592         -private:
  4593         -  wxString Name;
  4594         -  MyPostgresPK *Next;
  4595         -public:
  4596         -    MyPostgresPK(wxString & name)
  4597         -  {
  4598         -    Name = name;
  4599         -    Next = NULL;
  4600         -  }
  4601         -   ~MyPostgresPK()
  4602         -  {;
  4603         -  }
  4604         -  wxString & GetName()
  4605         -  {
  4606         -    return Name;
  4607         -  }
  4608         -  void SetNext(MyPostgresPK * next)
  4609         -  {
  4610         -    Next = next;
  4611         -  }
  4612         -  MyPostgresPK *GetNext()
  4613         -  {
  4614         -    return Next;
  4615         -  }
  4616         -};
  4617         -
  4618         -class MyPostgresTable
  4619         -{
  4620         -//
  4621         -// a PostgreSQL Table
  4622         -//
  4623         -private:
  4624         -  wxString Name;
  4625         -  wxString VirtName;
  4626         -  wxString PostGisName;
  4627         -  bool PkChecked;
  4628         -  bool GrantSelect;
  4629         -  bool GrantInsertUpdateDelete;
  4630         -  MyPostgresPK *FirstPK;
  4631         -  MyPostgresPK *LastPK;
  4632         -  MyPostGisGeometry *First;
  4633         -  MyPostGisGeometry *Last;
  4634         -  MyPostgresTable *Next;
  4635         -public:
  4636         -    MyPostgresTable(wxString & name);
  4637         -   ~MyPostgresTable();
  4638         -    wxString & GetName()
  4639         -  {
  4640         -    return Name;
  4641         -  }
  4642         -  void SetVirtName(wxString & name)
  4643         -  {
  4644         -    VirtName = name;
  4645         -  }
  4646         -  wxString & GetVirtName()
  4647         -  {
  4648         -    return VirtName;
  4649         -  }
  4650         -  void SetPostGisName(wxString & name)
  4651         -  {
  4652         -    PostGisName = name;
  4653         -  }
  4654         -  wxString & GetPostGisName()
  4655         -  {
  4656         -    return PostGisName;
  4657         -  }
  4658         -  void Add(wxString & geometry, wxString & type, int srid, int dims);
  4659         -  void AddPK(wxString & column);
  4660         -  MyPostGisGeometry *Find(wxString & column);
  4661         -  bool IsPkColumn(wxString & column);
  4662         -  bool HasPK();
  4663         -  void SetGrants(bool grantSelect, bool granInsertUpdateDelete)
  4664         -  {
  4665         -    GrantSelect = grantSelect;
  4666         -    GrantInsertUpdateDelete = granInsertUpdateDelete;
  4667         -  }
  4668         -  bool CanSelect()
  4669         -  {
  4670         -    return GrantSelect;
  4671         -  }
  4672         -  bool CanInsertUpdateDelete()
  4673         -  {
  4674         -    return GrantInsertUpdateDelete;
  4675         -  }
  4676         -  bool IsPkAlreadyChecked()
  4677         -  {
  4678         -    return PkChecked;
  4679         -  }
  4680         -  void SetPkChecked()
  4681         -  {
  4682         -    PkChecked = true;
  4683         -  }
  4684         -  MyPostgresPK *GetFirstPK()
  4685         -  {
  4686         -    return FirstPK;
  4687         -  }
  4688         -  MyPostGisGeometry *GetFirst()
  4689         -  {
  4690         -    return First;
  4691         -  }
  4692         -  void SetNext(MyPostgresTable * next)
  4693         -  {
  4694         -    Next = next;
  4695         -  }
  4696         -  MyPostgresTable *GetNext()
  4697         -  {
  4698         -    return Next;
  4699         -  }
  4700         -};
  4701         -
  4702         -class MyPostgresView
  4703         -{
  4704         -//
  4705         -// a PostgreSQL View
  4706         -//
  4707         -private:
  4708         -  wxString Name;
  4709         -  wxString VirtName;
  4710         -  bool GrantSelect;
  4711         -  bool GrantInsertUpdateDelete;
  4712         -  MyPostgresView *Next;
  4713         -public:
  4714         -    MyPostgresView(wxString & name);
  4715         -   ~MyPostgresView()
  4716         -  {;
  4717         -  }
  4718         -  wxString & GetName()
  4719         -  {
  4720         -    return Name;
  4721         -  }
  4722         -  void SetVirtName(wxString & name)
  4723         -  {
  4724         -    VirtName = name;
  4725         -  }
  4726         -  wxString & GetVirtName()
  4727         -  {
  4728         -    return VirtName;
  4729         -  }
  4730         -  void SetGrants(bool grantSelect, bool granInsertUpdateDelete)
  4731         -  {
  4732         -    GrantSelect = grantSelect;
  4733         -    GrantInsertUpdateDelete = granInsertUpdateDelete;
  4734         -  }
  4735         -  bool CanSelect()
  4736         -  {
  4737         -    return GrantSelect;
  4738         -  }
  4739         -  bool CanInsertUpdateDelete()
  4740         -  {
  4741         -    return GrantInsertUpdateDelete;
  4742         -  }
  4743         -  void SetNext(MyPostgresView * next)
  4744         -  {
  4745         -    Next = next;
  4746         -  }
  4747         -  MyPostgresView *GetNext()
  4748         -  {
  4749         -    return Next;
  4750         -  }
  4751         -};
  4752         -
  4753         -class MyPostgresSchema
  4754         -{
  4755         -//
  4756         -// a PostgreSQL Schema
  4757         -//
  4758         -private:
  4759         -  wxString Name;
  4760         -  wxTreeItemId TreeNode;
  4761         -  MyPostgresTable *FirstTable;
  4762         -  MyPostgresTable *LastTable;
  4763         -  MyPostgresTable *CurrentTable;
  4764         -  MyPostgresView *FirstView;
  4765         -  MyPostgresView *LastView;
  4766         -  MyPostgresSchema *Next;
  4767         -public:
  4768         -    MyPostgresSchema(wxString & name);
  4769         -   ~MyPostgresSchema();
  4770         -    wxString & GetName()
  4771         -  {
  4772         -    return Name;
  4773         -  }
  4774         -  void Add(wxString & name, wxString & geometry, wxString & type, int srid,
  4775         -           int dims);
  4776         -  void Add(wxString & name);
  4777         -  void SetTreeNode(wxTreeItemId & node)
  4778         -  {
  4779         -    TreeNode = node;
  4780         -  }
  4781         -  wxTreeItemId & GetTreeNode()
  4782         -  {
  4783         -    return TreeNode;
  4784         -  }
  4785         -  MyPostgresTable *GetFirstTable()
  4786         -  {
  4787         -    return FirstTable;
  4788         -  }
  4789         -  MyPostgresView *GetFirstView()
  4790         -  {
  4791         -    return FirstView;
  4792         -  }
  4793         -  void SetNext(MyPostgresSchema * next)
  4794         -  {
  4795         -    Next = next;
  4796         -  }
  4797         -  MyPostgresSchema *GetNext()
  4798         -  {
  4799         -    return Next;
  4800         -  }
  4801         -};
  4802         -
  4803         -class MyPostgresConn
  4804         -{
  4805         -//
  4806         -// a connection to some PosgreSQL DBMS
  4807         -//
  4808         -private:
  4809         -  wxString Host;
  4810         -  wxString HostAddr;
  4811         -  int Port;
  4812         -  wxString DbName;
  4813         -  wxString User;
  4814         -  bool ReadOnly;
  4815         -  bool TextDates;
  4816         -  wxString ConnectionString;
  4817         -  MyPostgresSchema *First;
  4818         -  MyPostgresSchema *Last;
  4819         -  MyPostgresSchema *Current;
  4820         -  MyPostgresConn *Prev;
  4821         -  MyPostgresConn *Next;
  4822         -public:
  4823         -    MyPostgresConn(wxString & host, wxString & hostaddr, int port,
  4824         -                   wxString & dbname, wxString & user, bool readOnly,
  4825         -                   bool textDates);
  4826         -   ~MyPostgresConn();
  4827         -    wxString & GetHost()
  4828         -  {
  4829         -    return Host;
  4830         -  }
  4831         -  wxString & GetHostAddr()
  4832         -  {
  4833         -    return HostAddr;
  4834         -  }
  4835         -  int GetPort()
  4836         -  {
  4837         -    return Port;
  4838         -  }
  4839         -  wxString & GetDbName()
  4840         -  {
  4841         -    return DbName;
  4842         -  }
  4843         -  wxString & GetUser()
  4844         -  {
  4845         -    return User;
  4846         -  }
  4847         -  bool IsReadOnly()
  4848         -  {
  4849         -    return ReadOnly;
  4850         -  }
  4851         -  bool IsTextDates()
  4852         -  {
  4853         -    return TextDates;
  4854         -  }
  4855         -  void SetConnectionString(const char *connection_string)
  4856         -  {
  4857         -    ConnectionString = wxString::FromUTF8(connection_string);
  4858         -  }
  4859         -  wxString & GetConnectionString()
  4860         -  {
  4861         -    return ConnectionString;
  4862         -  }
  4863         -  MyPostgresSchema *Add(wxString & schema);
  4864         -  void Add(wxString & schema, wxString & table, wxString & geometry,
  4865         -           wxString & type, int srid, int dims);
  4866         -  void Add(wxString & schema, wxString & view);
  4867         -  MyPostgresSchema *GetFirst()
  4868         -  {
  4869         -    return First;
  4870         -  }
  4871         -  void SetPrev(MyPostgresConn * conn)
  4872         -  {
  4873         -    Prev = conn;
  4874         -  }
  4875         -  MyPostgresConn *GetPrev()
  4876         -  {
  4877         -    return Prev;
  4878         -  }
  4879         -  void SetNext(MyPostgresConn * conn)
  4880         -  {
  4881         -    Next = conn;
  4882         -  }
  4883         -  MyPostgresConn *GetNext()
  4884         -  {
  4885         -    return Next;
  4886         -  }
  4887         -};
  4888         -
  4889         -class MyPostgres
  4890         -{
  4891         -//
  4892         -// general container for all PostgreSQL connections
  4893         -//
  4894         -private:
  4895         -  MyPostgresConn * First;
  4896         -  MyPostgresConn *Last;
  4897         -  MyPostgresConn *Current;
  4898         -public:
  4899         -    MyPostgres()
  4900         -  {
  4901         -    First = NULL;
  4902         -    Last = NULL;
  4903         -    Current = NULL;
  4904         -  }
  4905         -   ~MyPostgres()
  4906         -  {
  4907         -    Clear();
  4908         -  }
  4909         -  void Clear();
  4910         -  MyPostgresConn *Insert(wxString & host, wxString & hostaddr, int port,
  4911         -                         wxString & dbname, wxString & user, bool readOnly,
  4912         -                         bool textDates);
  4913         -  MyPostgresConn *Find(wxString & host, wxString & hostaddr, int port,
  4914         -                       wxString & dbname, wxString & user);
  4915         -  MyPostgresTable *FindTable(class MyFrame * parent, wxString & virtName);
  4916         -  MyPostgresTable *FindPostGisView(class MyFrame * parent, wxString & virtName);
  4917         -  void Remove(MyPostgresConn * conn);
  4918         -  bool CheckUniqueVirtName(wxString & virtName);
  4919         -  void MakeUniqueVirtName(wxString & baseName, wxString & uniqueName);
  4920         -  MyPostgresConn *GetFirst()
  4921         -  {
  4922         -    return First;
  4923         -  }
  4924         -};
  4925         -
  4926   4247   class MyFrame:public wxFrame
  4927   4248   {
  4928   4249   //
  4929   4250   // the main GUI frame
  4930   4251   //
  4931   4252   private:
  4932   4253     char *Old_SPATIALITE_SECURITY_ENV;
................................................................................
  5001   4322     wxBitmap *BtnSqlLog;          // button icon for SQL LOG
  5002   4323     wxBitmap *BtnDbStatus;        // button icon for DB STATUS
  5003   4324     wxBitmap *BtnCheckGeom;       // button icon for CheckGeom
  5004   4325     wxBitmap *BtnSaneGeom;        // button icon for SaneGeom
  5005   4326     wxBitmap *BtnWFS;             // button icon for WFS
  5006   4327     wxBitmap *BtnDXF;             // button icon for DXF
  5007   4328     wxBitmap *BtnMap;             // button icon for Map Panel
  5008         -  wxBitmap *BtnPostgres;        // button icon for PostgreSQL
  5009   4329     rl2WmsCachePtr WmsCache;      // internal WMS Cache
  5010   4330     bool ReadOnlyConnection;
  5011   4331   // AutoSave timer
  5012   4332     int AutoSaveInterval;
  5013   4333     int LastTotalChanges;
  5014   4334     wxTimer *TimerAutoSave;
  5015   4335     gaiaGeomCollPtr GeomFromPoint(gaiaPointPtr pt, int srid);
................................................................................
  5029   4349     rl2PixelPtr ParseNoData(wxString & NoData, int SampleType, int PixelType,
  5030   4350                             int NumBands);
  5031   4351     char *GetNum(const char *start, const char *end);
  5032   4352     bool IsValidSqliteFile(wxString & path);
  5033   4353     void DoUpdateRL2MaxThreads();
  5034   4354     void DoAutoDetachDatabases();
  5035   4355     CurrentSqlFilters SqlFilters;
  5036         -  MyPostgres PostgresList;
  5037         -  virtualPQ VirtualPQapi;
  5038         -  wxDynamicLibrary DynamicLibPQ;
  5039         -  wxString PathLibPQ;
  5040         -  bool VirtualPQapiOK;
  5041         -  void DoInitVirtualPQapi();
  5042         -  void DoLocateLibPQ(wxString & path);
  5043         -  void DoLoadLibPQ(wxString & path);
  5044         -  bool DoCheckPostgres(wxString & host, wxString & hostaddr, int port,
  5045         -                       wxString & dbname, wxString & user);
  5046         -  bool DoInitPostgres(wxString & host, wxString & hostaddr, int port,
  5047         -                      wxString & dbname, wxString & user, bool readOnly,
  5048         -                      bool textDates, const char *conninfo);
  5049         -  void DoSetUniqueVirtNames();
  5050         -  void DoCreatePostgresTables();
  5051         -  void DoDropPostgresTables();
  5052         -  char *DoCreatePostGisSpatialView(MyPostgresTable * table, char *sql);
  5053         -  void DoCreatePostGisSpatialViewTriggers(MyPostgresConn * conn,
  5054         -                                          MyPostgresSchema * schema,
  5055         -                                          MyPostgresTable * table);
  5056         -  void GetPQlibVersion(wxString & ver);
  5057         -  void DoCreatePostgreSqlNodes();
  5058         -  MyPostgresColumns *DoGetPostgresColumns(MyPostgresTable * table);
  5059         -  void DoCheckGrantPermissions(void *pg_conn, wxString & user,
  5060         -                               MyPostgresSchema * schema,
  5061         -                               MyPostgresTable * table);
  5062         -  void DoCheckGrantPermissions(void *pg_conn, wxString & user,
  5063         -                               MyPostgresSchema * schema,
  5064         -                               MyPostgresView * view);
  5065   4356   public:
  5066   4357       MyFrame(const wxString & title, const wxPoint & pos, const wxSize & size);
  5067   4358       virtual ~ MyFrame();
  5068   4359     enum VectorTypes
  5069   4360     {
  5070   4361       VECTOR_UNKNOWN = 0,
  5071   4362       VECTOR_GEOTABLE,
................................................................................
  5204   4495     bool CreateDB();
  5205   4496     void CloseDB();
  5206   4497     void InitializeSpatialMetadata();
  5207   4498     void AutoFDOStart();
  5208   4499     void AutoFDOStop();
  5209   4500     void AutoGPKGStart();
  5210   4501     void AutoGPKGStop();
  5211         -  void AutoPostgresStop();
  5212         -  bool DoClosePostgreSqlConn(wxString & host, wxString & hostaddr, int port,
  5213         -                             wxString & dbname, wxString & user);
  5214         -  char *DropPostgreSqlOrphans();
  5215         -  void DoInitVirtualPG();
  5216   4502     void InitTableTree();
  5217   4503     void LoadHistory();
  5218   4504     bool HasHistory();
  5219   4505     void ListAttached();
  5220   4506     void AutoFDOStart(wxString & dbAlias, MyAttachedDB * db);
  5221   4507     void AutoFDOStop(wxString & dbAlias);
  5222   4508     void AutoGPKGStart(wxString & dbAlias, MyAttachedDB * db);
................................................................................
  5381   4667                               wxString & charset, char decimal_point,
  5382   4668                               bool date_time);
  5383   4669     void ExportResultSetAsSylk(wxString & path, wxString & sql,
  5384   4670                                wxString & charset, bool date_time);
  5385   4671     void ExportResultSetAsDbf(wxString & path, wxString & sql,
  5386   4672                               wxString & charset);
  5387   4673     void GetHelp(wxString & html);
  5388         -  void FeedZipHtml(unsigned char *zip, int offset, const char *data);
  5389   4674     wxString *GetColumnNames(wxString & table, int *columns);
  5390   4675     void SetLastDirectory(wxString & path)
  5391   4676     {
  5392   4677       LastDirectory = path;
  5393   4678     }
  5394   4679     wxString & GetLastDirectory()
  5395   4680     {
................................................................................
  5437   4722     MyResultSetView *GetRsView()
  5438   4723     {
  5439   4724       return RsView;
  5440   4725     }
  5441   4726     wxString *GetTables(int *cnt);
  5442   4727     wxString *GetTableColumns(wxString & dbPrefix, wxString & table, int *cnt);
  5443   4728     wxString *GetTableGeometries(wxString & dbPrefix, wxString & table, int *cnt);
         4729  +  void BuildNetwork(wxString & table, wxString & from, wxString & to,
         4730  +                    bool isNoGeometry, wxString & geometry, wxString & name,
         4731  +                    bool cost_length, wxString & cost, bool bidirectional,
         4732  +                    bool one_way, wxString & one_way_from_to,
         4733  +                    wxString & one_way_to_from, bool aStarSupported,
         4734  +                    wxString & dataTableName, wxString & virtualTableName);
         4735  +  void BuildNetwork(wxString & table, wxString & from, wxString & to,
         4736  +                    wxString & name, wxString & cost, bool bidirectional,
         4737  +                    bool one_way, wxString & one_way_from_to,
         4738  +                    wxString & one_way_to_from, wxString & dataTableName,
         4739  +                    wxString & virtualTableName);
         4740  +  bool CreateNetwork(class Network * net, wxString & table, wxString & from,
         4741  +                     wxString & to, wxString & geometry, wxString & name,
         4742  +                     bool aStarSupported, double aStarCoeff,
         4743  +                     wxString & dataTableName, wxString & virtualTableName);
         4744  +  bool CreateNetwork(class Network * net, wxString & table, wxString & from,
         4745  +                     wxString & to, wxString & name, wxString & dataTableName,
         4746  +                     wxString & virtualTableName);
  5444   4747     void ImportExifPhotos(wxString & path, bool folder, bool metadata,
  5445   4748                           bool gps_only);
  5446   4749     void ImportGpsPhotos(wxString & path, bool folder, wxString & table,
  5447   4750                          wxString & geometry, bool update_statistics,
  5448   4751                          bool spatial_index);
  5449   4752     void ImportXmlDocuments(wxString & path, bool folder, wxString & suffix,
  5450   4753                             wxString & table, wxString & pkName,
................................................................................
  5451   4754                             wxString & xmlColumn, wxString & inPathColumn,
  5452   4755                             wxString & schemaColumn, wxString & parseErrColumn,
  5453   4756                             wxString & validateErrColumn, int compressed,
  5454   4757                             const char *schemaURI, bool isInternaleSchemaUri);
  5455   4758     void ImportDXFfiles(wxString & path, bool folder, wxString & prefix,
  5456   4759                         wxString & layer, int srid, bool force2d, bool force3d,
  5457   4760                         bool mixed, bool linked, bool unlinked, bool append);
         4761  +  void OutputNetNode(unsigned char *auxbuf, int *size, int ind, bool node_code,
         4762  +                     int max_node_length, class NetNode * pN, int endian_arch,
         4763  +                     bool aStarSupported);
  5458   4764     bool CheckExifTables();
  5459   4765     int ExifLoadDir(wxString & path, bool gps_only, bool metadata);
  5460   4766     int ExifLoadFile(wxString & path, bool gps_only, bool metadata);
  5461   4767     bool UpdateExifTables(unsigned char *blob, int sz,
  5462   4768                           gaiaExifTagListPtr tag_list, bool metadata,
  5463   4769                           wxString & path);
  5464   4770     bool CheckGpsPicsTable(wxString & table, wxString & geometry, bool rtree);
................................................................................
  5668   4974                           double *miny, double *maxx, double *maxy);
  5669   4975     void DoRegisterWMS();
  5670   4976     void DoCreateTopoGeo();
  5671   4977     void DoCreateTopoNet();
  5672   4978   
  5673   4979     void MapPanelClosing();
  5674   4980   
  5675         -  void CreateNetwork(wxString & table, wxString & from, wxString & to,
  5676         -                     bool isNoGeometry, wxString & geom, bool isNameEnabled,
  5677         -                     wxString & name, bool isGeomLength, wxString & cost,
  5678         -                     bool isBidirectional, bool isOneWays,
  5679         -                     wxString & oneWayFromTo, wxString & oneWayToFrom,
  5680         -                     bool aStarSupported, wxString & dataTableName,
  5681         -                     wxString & virtualTableName, bool overwrite);
  5682         -  void GetLastRoutingError(wxString & errCause);
  5683         -
  5684         -  bool HasPostgreSqlConnections();
  5685         -  void DoPostgreSqlConnection();
  5686         -  bool DoCheckPostGisGeometry(wxString & virtName, wxString & columnName);
  5687         -  MyPostgresTable *FindPostgresTable(wxString & virtName)
  5688         -  {
  5689         -    return PostgresList.FindTable(this, virtName);
  5690         -  }
  5691         -  MyPostgresTable *FindPostGisView(wxString & virtName)
  5692         -  {
  5693         -    return PostgresList.FindPostGisView(this, virtName);
  5694         -  }
  5695         -  void InitPostgresPkColumns(MyPostgresConn * conn, MyPostgresSchema * schema,
  5696         -                             MyPostgresTable * table);
  5697         -  void InitPostgresPks(void *conn, MyPostgresSchema * schema,
  5698         -                       MyPostgresTable * table);
  5699         -
  5700   4981     void OnQuit(wxCommandEvent & event);
  5701   4982     void OnClose(wxCloseEvent & event);
  5702   4983     void OnAbout(wxCommandEvent & event);
  5703   4984     void OnConnect(wxCommandEvent & event);
  5704   4985     void OnConnectReadOnly(wxCommandEvent & event);
  5705   4986     void OnCreateNew(wxCommandEvent & event);
  5706   4987     void OnDisconnect(wxCommandEvent & event);
  5707   4988     void OnMemoryDbLoad(wxCommandEvent & event);
  5708   4989     void OnMemoryDbNew(wxCommandEvent & event);
  5709   4990     void OnMemoryDbClock(wxCommandEvent & event);
  5710   4991     void OnMemoryDbSave(wxCommandEvent & event);
  5711   4992     void OnVacuum(wxCommandEvent & event);
  5712         -  void OnPostgreSQL(wxCommandEvent & event)
  5713         -  {
  5714         -    DoPostgreSqlConnection();
  5715         -  }
  5716   4993     void OnMapPanel(wxCommandEvent & event);
  5717   4994     void OnSqlScript(wxCommandEvent & event);
  5718   4995     void OnQueryViewComposer(wxCommandEvent & event);
  5719   4996     void OnCharset(wxCommandEvent & event);
  5720   4997     void OnLoadShp(wxCommandEvent & event);
  5721   4998     void OnLoadTxt(wxCommandEvent & event);
  5722   4999     void OnLoadDbf(wxCommandEvent & event);
................................................................................
  5778   5055     wxString dbPrefix;
  5779   5056     wxString inTable;
  5780   5057   public:
  5781   5058       CloneTableDialog()
  5782   5059     {
  5783   5060       MainFrame = NULL;
  5784   5061     }
  5785         -  CloneTableDialog(MyFrame * parent, wxString & dbPrefix, wxString & inTable)
         5062  +  CloneTableDialog(MyFrame * parent, wxString & dbPrefx, wxString & inTable)
  5786   5063     {
  5787   5064       Create(parent, dbPrefix, inTable);
  5788   5065     }
  5789   5066     bool Create(MyFrame * parent, wxString & dbPrefix, wxString & inTable);
  5790   5067     virtual ~ CloneTableDialog()
  5791   5068     {;
  5792   5069     }
................................................................................
  6718   5995   public:
  6719   5996       LoadXLDialog()
  6720   5997     {;
  6721   5998     }
  6722   5999     LoadXLDialog(MyFrame * parent, wxString & path, wxString & table);
  6723   6000     bool Create(MyFrame * parent, wxString & path, wxString & table);
  6724   6001     virtual ~ LoadXLDialog()
  6725         -  {
  6726         -    if (Worksheets != NULL)
  6727         -      delete[]Worksheets;
         6002  +  {;
  6728   6003     }
  6729   6004     void CreateControls();
  6730   6005     wxString & GetTable()
  6731   6006     {
  6732   6007       return Table;
  6733   6008     }
  6734   6009     int GetWorksheetIndex()
................................................................................
  6945   6220     wxString OneWayToFrom;        // the OneWay To-From column
  6946   6221     wxString OneWayFromTo;        // the OneWay From-To column
  6947   6222     bool NameEnabled;             // Name column supported
  6948   6223     wxString NameColumn;          // the Name column name
  6949   6224     bool AStarSupported;          // A* algorithm supported
  6950   6225     wxString DataTable;           // name of the binary data table
  6951   6226     wxString VirtualTable;        // name of the VirtualNetwork table
  6952         -  bool Overwrite;               // enabled to overwrite existing tables
  6953         -  void SetCurrentTable();
  6954   6227   public:
  6955   6228       NetworkDialog()
  6956   6229     {;
  6957   6230     }
  6958   6231     NetworkDialog(MyFrame * parent);
  6959   6232     bool Create(MyFrame * parent);
  6960   6233     virtual ~ NetworkDialog()
................................................................................
  7021   6294     {
  7022   6295       return DataTable;
  7023   6296     }
  7024   6297     wxString & GetVirtualTable()
  7025   6298     {
  7026   6299       return VirtualTable;
  7027   6300     }
  7028         -  bool IsOverwriteEnabled()
  7029         -  {
  7030         -    return Overwrite;
  7031         -  }
  7032   6301     void OnTable(wxCommandEvent & event);
  7033   6302     void OnDirection(wxCommandEvent & event);
  7034   6303     void OnCost(wxCommandEvent & event);
  7035   6304     void OnOneWay(wxCommandEvent & event);
  7036   6305     void OnNameEnabled(wxCommandEvent & event);
  7037   6306     void OnNoGeometry(wxCommandEvent & event);
  7038         -  void OnOverwrite(wxCommandEvent & event);
  7039   6307     void OnOk(wxCommandEvent & event);
  7040   6308   };
  7041   6309   
  7042   6310   class ExifDialog:public wxDialog
  7043   6311   {
  7044   6312   //
  7045   6313   // a dialog preparing an IMPORT EXIF PHOTOS
................................................................................
  7744   7012       MyHexList(BlobExplorerDialog * parent, unsigned char *blob,
  7745   7013                 int blob_size, wxWindow * panel, wxWindowID id,
  7746   7014                 const wxPoint & pos = wxDefaultPosition, const wxSize & size =
  7747   7015                 wxDefaultSize, long style = 0);
  7748   7016       virtual ~ MyHexList();
  7749   7017     virtual wxString OnGetItemText(long item, long column) const;
  7750   7018   };
         7019  +
         7020  +class NetNodePre
         7021  +{
         7022  +//
         7023  +// a class to store a temporary node for Network
         7024  +//
         7025  +private:
         7026  +  sqlite3_int64 Id;
         7027  +  wxString Code;
         7028  +  NetNodePre *Next;
         7029  +public:
         7030  +    NetNodePre(sqlite3_int64 id);
         7031  +    NetNodePre(const char *code);
         7032  +   ~NetNodePre()
         7033  +  {;
         7034  +  }
         7035  +  sqlite3_int64 GetId()
         7036  +  {
         7037  +    return Id;
         7038  +  }
         7039  +  wxString & GetCode()
         7040  +  {
         7041  +    return Code;
         7042  +  }
         7043  +  void SetNext(NetNodePre * next)
         7044  +  {
         7045  +    Next = next;
         7046  +  }
         7047  +  NetNodePre *GetNext()
         7048  +  {
         7049  +    return Next;
         7050  +  }
         7051  +};
         7052  +
         7053  +class NetNode
         7054  +{
         7055  +//
         7056  +// a class to store a final node for Network
         7057  +//
         7058  +private:
         7059  +  int InternalIndex;
         7060  +  sqlite3_int64 Id;
         7061  +  wxString Code;
         7062  +  double X;
         7063  +  double Y;
         7064  +  class NetArcRef *First;
         7065  +  class NetArcRef *Last;
         7066  +  NetNode *Next;
         7067  +public:
         7068  +    NetNode(sqlite3_int64 id);
         7069  +    NetNode(wxString & code);
         7070  +   ~NetNode();
         7071  +  int GetInternalIndex()
         7072  +  {
         7073  +    return InternalIndex;
         7074  +  }
         7075  +  void SetInternalIndex(int idx)
         7076  +  {
         7077  +    InternalIndex = idx;
         7078  +  }
         7079  +  sqlite3_int64 GetId()
         7080  +  {
         7081  +    return Id;
         7082  +  }
         7083  +  wxString & GetCode()
         7084  +  {
         7085  +    return Code;
         7086  +  }
         7087  +  double GetX()
         7088  +  {
         7089  +    return X;
         7090  +  }
         7091  +  void SetX(double x)
         7092  +  {
         7093  +    X = x;
         7094  +  }
         7095  +  double GetY()
         7096  +  {
         7097  +    return Y;
         7098  +  }
         7099  +  void SetY(double y)
         7100  +  {
         7101  +    Y = y;
         7102  +  }
         7103  +  void AddOutcoming(class NetArc * pA);
         7104  +  NetArcRef *GetFirst()
         7105  +  {
         7106  +    return First;
         7107  +  }
         7108  +  NetArc **PrepareOutcomings(int *count);
         7109  +  void SetNext(NetNode * next)
         7110  +  {
         7111  +    Next = next;
         7112  +  }
         7113  +  NetNode *GetNext()
         7114  +  {
         7115  +    return Next;
         7116  +  }
         7117  +};
         7118  +
         7119  +class NetArc
         7120  +{
         7121  +//
         7122  +// a class to store an arc for Network
         7123  +//
         7124  +private:
         7125  +  sqlite3_int64 RowId;
         7126  +  NetNode *From;
         7127  +  NetNode *To;
         7128  +  double Cost;
         7129  +  NetArc *Next;
         7130  +public:
         7131  +    NetArc(sqlite3_int64 rowid, NetNode * from, NetNode * to, double cost);
         7132  +   ~NetArc()
         7133  +  {;
         7134  +  }
         7135  +  sqlite3_int64 GetRowId()
         7136  +  {
         7137  +    return RowId;
         7138  +  }
         7139  +  NetNode *GetFrom()
         7140  +  {
         7141  +    return From;
         7142  +  }
         7143  +  NetNode *GetTo()
         7144  +  {
         7145  +    return To;
         7146  +  }
         7147  +  double GetCost()
         7148  +  {
         7149  +    return Cost;
         7150  +  }
         7151  +  void SetNext(NetArc * next)
         7152  +  {
         7153  +    Next = next;
         7154  +  }
         7155  +  NetArc *GetNext()
         7156  +  {
         7157  +    return Next;
         7158  +  }
         7159  +};
         7160  +
         7161  +class NetArcRef
         7162  +{
         7163  +//
         7164  +// a class to store a reference to an arc for Network
         7165  +//
         7166  +private:
         7167  +  NetArc * Reference;
         7168  +  NetArcRef *Next;
         7169  +public:
         7170  +    NetArcRef(NetArc * arc)
         7171  +  {
         7172  +    Reference = arc;
         7173  +    Next = NULL;
         7174  +  }
         7175  +   ~NetArcRef()
         7176  +  {;
         7177  +  }
         7178  +  NetArc *GetReference()
         7179  +  {
         7180  +    return Reference;
         7181  +  }
         7182  +  void SetNext(NetArcRef * next)
         7183  +  {
         7184  +    Next = next;
         7185  +  }
         7186  +  NetArcRef *GetNext()
         7187  +  {
         7188  +    return Next;
         7189  +  }
         7190  +};
         7191  +
         7192  +class Network
         7193  +{
         7194  +//
         7195  +// a class representing a Network
         7196  +//
         7197  +private:
         7198  +  NetNodePre * FirstPre;
         7199  +  NetNodePre *LastPre;
         7200  +  int NumPreNodes;
         7201  +  NetNodePre **SortedPreNodes;
         7202  +  NetArc *FirstArc;
         7203  +  NetArc *LastArc;
         7204  +  NetNode *FirstNode;
         7205  +  NetNode *LastNode;
         7206  +  int NumNodes;
         7207  +  NetNode **SortedNodes;
         7208  +  bool Error;
         7209  +  bool NodeCode;
         7210  +  int MaxCodeLength;
         7211  +public:
         7212  +    Network();
         7213  +   ~Network();
         7214  +  void CleanPreNodes();
         7215  +  void InsertNode(sqlite3_int64 id);
         7216  +  void InsertNode(const char *code);
         7217  +  void AddNode(sqlite3_int64 id);
         7218  +  void AddNode(wxString & code);
         7219  +  NetNode *ProcessNode(sqlite3_int64 id, double x, double y, NetNode ** pOther);
         7220  +  NetNode *ProcessNode(wxString & code, double x, double y, NetNode ** pOther);
         7221  +  NetNode *ProcessNode(sqlite3_int64 id, NetNode ** pOther);
         7222  +  NetNode *ProcessNode(wxString & code, NetNode ** pOther);
         7223  +  void Sort();
         7224  +  NetNode *Find(sqlite3_int64 id);
         7225  +  NetNode *Find(wxString & code);
         7226  +  NetNode *GetSortedNode(sqlite3_int64 x);
         7227  +  void AddArc(sqlite3_int64 rowid, sqlite3_int64 id_from, sqlite3_int64 id_to,
         7228  +              double node_from_x, double node_from_y, double node_to_x,
         7229  +              double node_to_y, double cost);
         7230  +  void AddArc(sqlite3_int64 rowid, const char *code_from, const char *code_to,
         7231  +              double node_from_x, double node_from_y, double node_to_x,
         7232  +              double node_to_y, double cost);
         7233  +  void AddArc(sqlite3_int64 rowid, sqlite3_int64 id_from, sqlite3_int64 id_to,
         7234  +              double cost);
         7235  +  void AddArc(sqlite3_int64 rowid, const char *code_from, const char *code_to,
         7236  +              double cost);
         7237  +  void InitNodes();
         7238  +  void SetError()
         7239  +  {
         7240  +    Error = true;
         7241  +  }
         7242  +  bool IsError()
         7243  +  {
         7244  +    return Error;
         7245  +  }
         7246  +  void SetNodeCode(bool mode)
         7247  +  {
         7248  +    NodeCode = mode;
         7249  +  }
         7250  +  bool IsNodeCode()
         7251  +  {
         7252  +    return NodeCode;
         7253  +  }
         7254  +  int GetNumNodes()
         7255  +  {
         7256  +    return NumNodes;
         7257  +  }
         7258  +  int GetMaxCodeLength()
         7259  +  {
         7260  +    return MaxCodeLength;
         7261  +  }
         7262  +};
  7751   7263   
  7752   7264   class AutoFDOTable
  7753   7265   {
  7754   7266   private:
  7755   7267     char *Name;
  7756   7268     AutoFDOTable *Next;
  7757   7269   public:
................................................................................
 11991  11503     {;
 11992  11504     }
 11993  11505     virtual ~ WmsServersDialog()
 11994  11506     {
 11995  11507       if (List != NULL)
 11996  11508         delete[]List;
 11997  11509     }
 11998         -  bool Create(MyFrame * grandparent);
        11510  +  bool Create(WmsDialog * parent, MyFrame * grandparent);
 11999  11511     void CreateControls();
 12000  11512     wxString & GetURL()
 12001  11513     {
 12002  11514       return URL;
 12003  11515     }
 12004  11516     void OnUrlSelected(wxCommandEvent & event);
 12005  11517     void OnOk(wxCommandEvent & event);
................................................................................
 12144  11656     unsigned char ParseHex(const char *byte);
 12145  11657     void DoConfigureWmsLayer();
 12146  11658     void DoConfigureMapLayer();
 12147  11659   public:
 12148  11660       WmsLayerConfigDialog()
 12149  11661     {;
 12150  11662     }
 12151         -  virtual ~ WmsLayerConfigDialog();
        11663  +  virtual ~ WmsLayerConfigDialog()
        11664  +  {
        11665  +    if (Version != NULL)
        11666  +      free(Version);
        11667  +    if (MaxVersion != NULL)
        11668  +      free(MaxVersion);
        11669  +    if (RefSys != NULL)
        11670  +      free(RefSys);
        11671  +    if (Style != NULL)
        11672  +      free(Style);
        11673  +    if (ImageFormat != NULL)
        11674  +      free(ImageFormat);
        11675  +    if (BgColor != NULL)
        11676  +      free(BgColor);
        11677  +  }
 12152  11678     bool Create(MyFrame * parent, wxString url, wxString layer);
 12153  11679     bool Create(MyMapPanel * parent, MapLayer * layer);
 12154  11680     void CreateControls();
 12155  11681     void LoadData();
 12156  11682     void InitData();
 12157  11683     void FindMaxVersion();
 12158  11684     void PopulateRefSys(wxComboBox * crsList);
................................................................................
 12259  11785       return IsBBoxChanged;
 12260  11786     }
 12261  11787     bool ConfigChanged()
 12262  11788     {
 12263  11789       return IsConfigChanged;
 12264  11790     }
 12265  11791     void OnOk(wxCommandEvent & event);
 12266         -  void OnQuit(wxCommandEvent & event);
 12267         -};
 12268         -
 12269         -class VectorSqlSampleDialog:public wxDialog
 12270         -{
 12271         -//
 12272         -// a dialog for configuring an SQL Map Request
 12273         -// based on some Vector Layer
 12274         -//
 12275         -private:
 12276         -  MyFrame * MainFrame;
 12277         -  MyMapPanel *MapPanel;
 12278         -  MapLayer *Layer;
 12279         -  wxString DbPrefix;
 12280         -  wxString LayerName;
 12281         -  char *Style;
 12282         -  wxColour BgColor;
 12283         -  wxString Sql;
 12284         -  void GetButtonBitmap(wxColour & bgcolor, wxBitmap & bmp);
 12285         -  void DoUpdateSql();
 12286         -public:
 12287         -    VectorSqlSampleDialog()
 12288         -  {;
 12289         -  }
 12290         -  virtual ~ VectorSqlSampleDialog()
 12291         -  {
 12292         -    if (Style != NULL)
 12293         -      free(Style);
 12294         -  }
 12295         -  bool Create(MyMapPanel * parent, MapLayer * layer);
 12296         -  void CreateControls();
 12297         -  void InitData();
 12298         -  void PopulateStyles(wxComboBox * stlList);
 12299         -  void OnStyleChanged(wxCommandEvent & event);
 12300         -  void OnMimeTypeChanged(wxCommandEvent & event);
 12301         -  void OnQualityChanged(wxCommandEvent & event);
 12302         -  void OnTransparentChanged(wxCommandEvent & event);
 12303         -  void OnBackgroundChanged(wxCommandEvent & event);
 12304         -  void OnCopy(wxCommandEvent & event);
 12305         -  void OnQuit(wxCommandEvent & event);
 12306         -};
 12307         -
 12308         -class RasterSqlSampleDialog:public wxDialog
 12309         -{
 12310         -//
 12311         -// a dialog for configuring an SQL Map Request
 12312         -// based on some Raster Layer
 12313         -//
 12314         -private:
 12315         -  MyFrame * MainFrame;
 12316         -  MyMapPanel *MapPanel;
 12317         -  MapLayer *Layer;
 12318         -  wxString DbPrefix;
 12319         -  wxString LayerName;
 12320         -  char *Style;
 12321         -  wxColour BgColor;
 12322         -  wxString Sql;
 12323         -  void GetButtonBitmap(wxColour & bgcolor, wxBitmap & bmp);
 12324         -  void DoUpdateSql();
 12325         -public:
 12326         -    RasterSqlSampleDialog()
 12327         -  {;
 12328         -  }
 12329         -  virtual ~ RasterSqlSampleDialog()
 12330         -  {
 12331         -    if (Style != NULL)
 12332         -      free(Style);
 12333         -  }
 12334         -  bool Create(MyMapPanel * parent, MapLayer * layer);
 12335         -  void CreateControls();
 12336         -  void InitData();
 12337         -  void PopulateStyles(wxComboBox * stlList);
 12338         -  void OnStyleChanged(wxCommandEvent & event);
 12339         -  void OnMimeTypeChanged(wxCommandEvent & event);
 12340         -  void OnQualityChanged(wxCommandEvent & event);
 12341         -  void OnTransparentChanged(wxCommandEvent & event);
 12342         -  void OnBackgroundChanged(wxCommandEvent & event);
 12343         -  void OnCopy(wxCommandEvent & event);
 12344         -  void OnQuit(wxCommandEvent & event);
 12345         -};
 12346         -
 12347         -class WmsSqlSampleDialog:public wxDialog
 12348         -{
 12349         -//
 12350         -// a dialog for configuring an SQL Map Request
 12351         -// based on some WMS Layer
 12352         -//
 12353         -private:
 12354         -  MyFrame * MainFrame;
 12355         -  MyMapPanel *MapPanel;
 12356         -  MapLayer *Layer;
 12357         -  bool RequestURL;
 12358         -  wxString Url;
 12359         -  wxString DbPrefix;
 12360         -  wxString LayerName;
 12361         -  char *Version;
 12362         -  char *MaxVersion;
 12363         -  char *Style;
 12364         -  char *ImageFormat;
 12365         -  char *BgColor;
 12366         -  int Transparent;
 12367         -  wxString Sql;
 12368         -  void GetButtonBitmap(const char *color, wxBitmap & bmp);
 12369         -  void ParseBgColor(const char *color, unsigned char *red, unsigned char *green,
 12370         -                    unsigned char *blue);
 12371         -  unsigned char ParseHex(const char *byte);
 12372         -  void DoUpdateSql();
 12373         -  void DoUpdateUrl();
 12374         -  int CheckMarker(wxString & url);
 12375         -  int DoQueryWmsCoverage(const char *db_prefix, const char *cvg_name, int srid,
 12376         -                         char **url, int *swap_axes);
 12377         -public:
 12378         -    WmsSqlSampleDialog()
 12379         -  {;
 12380         -  }
 12381         -  virtual ~ WmsSqlSampleDialog();
 12382         -  bool Create(MyMapPanel * parent, MapLayer * layer, bool request_url = false);
 12383         -  void CreateControls();
 12384         -  void InitData();
 12385         -  void FindMaxVersion();
 12386         -  void PopulateImageFormats(wxComboBox * fmtList);
 12387         -  void PopulateStyles(wxComboBox * stlList);
 12388         -  void OnStyleChanged(wxCommandEvent & event);
 12389         -  void OnMimeTypeChanged(wxCommandEvent & event);
 12390         -  void OnVersionChanged(wxCommandEvent & event);
 12391         -  void OnTransparentChanged(wxCommandEvent & event);
 12392         -  void OnBgColorChanged(wxCommandEvent & event);
 12393         -  void OnCopy(wxCommandEvent & event);
 12394  11792     void OnQuit(wxCommandEvent & event);
 12395  11793   };
 12396  11794   
 12397  11795   class TopologyLayerConfigDialog:public wxDialog
 12398  11796   {
 12399  11797   //
 12400  11798   // a dialog for configuring a TopoGeo Layer
................................................................................
 13467  12865     const char *GetXmlStyle()
 13468  12866     {
 13469  12867       return XmlStyle;
 13470  12868     }
 13471  12869     const unsigned char *CloneXmlStyle();
 13472  12870   };
 13473  12871   
 13474         -class QuickStyleRasterObj
 13475         -{
 13476         -//
 13477         -// a class wrapping a Quick Style - Raster
 13478         -//
 13479         -private:
 13480         -  char UUID[64];
 13481         -  bool MinScaleEnabled;
 13482         -  bool MaxScaleEnabled;
 13483         -  double ScaleMin;
 13484         -  double ScaleMax;
 13485         -  double Opacity;
 13486         -  bool Normalize;
 13487         -  bool Histogram;
 13488         -  bool Gamma;
 13489         -  double GammaValue;
 13490         -  bool TripleBand;
 13491         -  bool SingleBand;
 13492         -  unsigned char RedBand;
 13493         -  unsigned char GreenBand;
 13494         -  unsigned char BlueBand;
 13495         -  unsigned char GrayBand;
 13496         -  bool SrtmColorMap;
 13497         -  bool TerrainColorMap;
 13498         -  bool NdviColorMap;
 13499         -  bool ColorRamp;
 13500         -  double MinValue;
 13501         -  char MinValueColor[8];
 13502         -  double MaxValue;
 13503         -  char MaxValueColor[8];
 13504         -  bool ShadedRelief;
 13505         -  double ShadedReliefFactor;
 13506         -  char *XmlStyle;
 13507         -  char *DoCreateRasterXML();
 13508         -  char *DoCreatePredefinedSrtmStyle(char *base_xml);
 13509         -  char *DoCreatePredefinedTerrainStyle(char *base_xml);
 13510         -  char *DoCreatePredefinedNdviStyle(char *base_xml);
 13511         -public:
 13512         -    QuickStyleRasterObj();
 13513         -   ~QuickStyleRasterObj()
 13514         -  {
 13515         -    if (XmlStyle)
 13516         -      sqlite3_free(XmlStyle);
 13517         -  }
 13518         -  QuickStyleRasterObj *Clone();
 13519         -  bool Compare(QuickStyleRasterObj * style);
 13520         -  const char *GetUUID()
 13521         -  {
 13522         -    return UUID;
 13523         -  }
 13524         -  void EnableMinScale(bool mode)
 13525         -  {
 13526         -    MinScaleEnabled = mode;
 13527         -  }
 13528         -  bool IsMinScaleEnabled()
 13529         -  {
 13530         -    return MinScaleEnabled;
 13531         -  }
 13532         -  void EnableMaxScale(bool mode)
 13533         -  {
 13534         -    MaxScaleEnabled = mode;
 13535         -  }
 13536         -  bool IsMaxScaleEnabled()
 13537         -  {
 13538         -    return MaxScaleEnabled;
 13539         -  }
 13540         -  void SetScaleMin(double x)
 13541         -  {
 13542         -    ScaleMin = x;
 13543         -  }
 13544         -  double GetScaleMin()
 13545         -  {
 13546         -    return ScaleMin;
 13547         -  }
 13548         -  void SetScaleMax(double x)
 13549         -  {
 13550         -    ScaleMax = x;
 13551         -  }
 13552         -  double GetScaleMax()
 13553         -  {
 13554         -    return ScaleMax;
 13555         -  }
 13556         -  void SetOpacity(double x)
 13557         -  {
 13558         -    Opacity = x;
 13559         -  }
 13560         -  double GetOpacity()
 13561         -  {
 13562         -    return Opacity;
 13563         -  }
 13564         -  void SetNormalize(bool mode)
 13565         -  {
 13566         -    Normalize = mode;
 13567         -  }
 13568         -  bool IsNormalize()
 13569         -  {
 13570         -    return Normalize;
 13571         -  }
 13572         -  void SetHistogram(bool mode)
 13573         -  {
 13574         -    Histogram = mode;
 13575         -  }
 13576         -  bool IsHistogram()
 13577         -  {
 13578         -    return Histogram;
 13579         -  }
 13580         -  void SetGamma(bool mode)
 13581         -  {
 13582         -    Gamma = mode;
 13583         -  }
 13584         -  bool IsGamma()
 13585         -  {
 13586         -    return Gamma;
 13587         -  }
 13588         -  void SetGammaValue(double value)
 13589         -  {
 13590         -    GammaValue = value;
 13591         -  }
 13592         -  double GetGammaValue()
 13593         -  {
 13594         -    return GammaValue;
 13595         -  }
 13596         -  void SetTripleBand(bool mode)
 13597         -  {
 13598         -    TripleBand = mode;
 13599         -  }
 13600         -  bool IsTripleBand()
 13601         -  {
 13602         -    return TripleBand;
 13603         -  }
 13604         -  void SetSingleBand(bool mode)
 13605         -  {
 13606         -    SingleBand = mode;
 13607         -  }
 13608         -  bool IsSingleBand()
 13609         -  {
 13610         -    return SingleBand;
 13611         -  }
 13612         -  void SetRedBand(unsigned char red)
 13613         -  {
 13614         -    RedBand = red;
 13615         -  }
 13616         -  unsigned char GetRedBand()
 13617         -  {
 13618         -    return RedBand;
 13619         -  }
 13620         -  void SetGreenBand(unsigned char green)
 13621         -  {
 13622         -    GreenBand = green;
 13623         -  }
 13624         -  unsigned char GetGreenBand()
 13625         -  {
 13626         -    return GreenBand;
 13627         -  }
 13628         -  void SetBlueBand(unsigned char blue)
 13629         -  {
 13630         -    BlueBand = blue;
 13631         -  }
 13632         -  unsigned char GetBlueBand()
 13633         -  {
 13634         -    return BlueBand;
 13635         -  }
 13636         -  void SetGrayBand(unsigned char gray)
 13637         -  {
 13638         -    GrayBand = gray;
 13639         -  }
 13640         -  unsigned char GetGrayBand()
 13641         -  {
 13642         -    return GrayBand;
 13643         -  }
 13644         -  void SetSrtmColorMap(bool mode)
 13645         -  {
 13646         -    SrtmColorMap = mode;
 13647         -  }
 13648         -  bool IsSrtmColorMap()
 13649         -  {
 13650         -    return SrtmColorMap;
 13651         -  }
 13652         -  void SetTerrainColorMap(bool mode)
 13653         -  {
 13654         -    TerrainColorMap = mode;
 13655         -  }
 13656         -  bool IsTerrainColorMap()
 13657         -  {
 13658         -    return TerrainColorMap;
 13659         -  }
 13660         -  void SetNdviColorMap(bool mode)
 13661         -  {
 13662         -    NdviColorMap = mode;
 13663         -  }
 13664         -  bool IsNdviColorMap()
 13665         -  {
 13666         -    return NdviColorMap;
 13667         -  }
 13668         -  void SetColorRamp(bool mode)
 13669         -  {
 13670         -    ColorRamp = mode;
 13671         -  }
 13672         -  bool IsColorRamp()
 13673         -  {
 13674         -    return ColorRamp;
 13675         -  }
 13676         -  void SetMinValue(double x)
 13677         -  {
 13678         -    MinValue = x;
 13679         -  }
 13680         -  double GetMinValue()
 13681         -  {
 13682         -    return MinValue;
 13683         -  }
 13684         -  void SetMinValueColor(const char *x)
 13685         -  {
 13686         -    strcpy(MinValueColor, x);
 13687         -  }
 13688         -  const char *GetMinValueColor()
 13689         -  {
 13690         -    return MinValueColor;
 13691         -  }
 13692         -  void SetMaxValue(double x)
 13693         -  {
 13694         -    MaxValue = x;
 13695         -  }
 13696         -  double GetMaxValue()
 13697         -  {
 13698         -    return MaxValue;
 13699         -  }
 13700         -  void SetMaxValueColor(const char *x)
 13701         -  {
 13702         -    strcpy(MaxValueColor, x);
 13703         -  }
 13704         -  const char *GetMaxValueColor()
 13705         -  {
 13706         -    return MaxValueColor;
 13707         -  }
 13708         -  void SetShadedRelief(bool mode)
 13709         -  {
 13710         -    ShadedRelief = mode;
 13711         -  }
 13712         -  bool IsShadedRelief()
 13713         -  {
 13714         -    return ShadedRelief;
 13715         -  }
 13716         -  void SetShadedReliefFactor(double x)
 13717         -  {
 13718         -    ShadedReliefFactor = x;
 13719         -  }
 13720         -  double GetShadedReliefFactor()
 13721         -  {
 13722         -    return ShadedReliefFactor;
 13723         -  }
 13724         -  char *CreateXmlStyle();
 13725         -  void UpdateXmlStyle();
 13726         -  const char *GetXmlStyle()
 13727         -  {
 13728         -    return XmlStyle;
 13729         -  }
 13730         -  unsigned char *CloneXmlStyle();
 13731         -};
 13732         -
 13733  12872   class QuickStyleVectorDialog:public wxPropertySheetDialog
 13734  12873   {
 13735  12874   //
 13736  12875   // a dialog for configuring a Quick Style (Vector)
 13737  12876   //
 13738  12877   private:
 13739  12878     MyFrame * MainFrame;
................................................................................
 13823  12962     void OnCmdIsRepeatedChanged(wxCommandEvent & event);
 13824  12963     void OnCmdIsAlignedChanged(wxCommandEvent & event);
 13825  12964     void OnCmdGeneralizeLineChanged(wxCommandEvent & event);
 13826  12965     void OnFont1Changed(wxCommandEvent & event);
 13827  12966     void OnFont2Changed(wxCommandEvent & event);
 13828  12967   };
 13829  12968   
 13830         -class QuickStyleRasterDialog:public wxPropertySheetDialog
 13831         -{
 13832         -//
 13833         -// a dialog for configuring a Quick Style (Raster)
 13834         -//
 13835         -private:
 13836         -  MyFrame * MainFrame;
 13837         -  MyMapPanel *MapPanel;
 13838         -  MapLayer *Layer;
 13839         -  wxString DbPrefix;
 13840         -  wxString LayerName;
 13841         -  bool CanApplyContrastEnhancement;
 13842         -  bool IsMultiband;
 13843         -  unsigned char NumBands;
 13844         -  unsigned char RedBand;
 13845         -  unsigned char GreenBand;
 13846         -  unsigned char BlueBand;
 13847         -  unsigned char GrayBand;
 13848         -  bool CanApplyColorMap;
 13849         -  bool CanApplyNDVI;
 13850         -  double MinPixelValue;
 13851         -  double MaxPixelValue;
 13852         -  bool CanApplyShadedRelief;
 13853         -  QuickStyleRasterObj *Style;
 13854         -  bool IsConfigChanged;
 13855         -  int PageContrastEnhancementIndex;
 13856         -  int PageChannelSelectionIndex;
 13857         -  int PageColorMapIndex;
 13858         -  wxPanel *CreateMainPage(wxWindow * book);
 13859         -  wxPanel *CreateContrastEnhancementPage(wxWindow * book);
 13860         -  wxPanel *CreateChannelSelectionPage(wxWindow * book);
 13861         -  wxPanel *CreateColorMapPage(wxWindow * book);
 13862         -  bool RetrieveMainPage();
 13863         -  bool RetrieveContrastEnhancementPage(bool check = true);
 13864         -  bool RetrieveChannelSelectionPage(bool check = true);
 13865         -  bool RetrieveColorMapPage(bool check = true);
 13866         -  void UpdateMainPage();
 13867         -  void UpdateContrastEnhancementPage();
 13868         -  void UpdateChannelSelectionPage();
 13869         -  void UpdateColorMapPage();
 13870         -  void GetCoverageInfos();
 13871         -  bool UpdateStyle();
 13872         -public:
 13873         -    QuickStyleRasterDialog()
 13874         -  {;
 13875         -  }
 13876         -  virtual ~ QuickStyleRasterDialog()
 13877         -  {
 13878         -    if (Style != NULL)
 13879         -      delete Style;
 13880         -  }
 13881         -  bool Create(MyMapPanel * parent, MapLayer * layer);
 13882         -  void CreateButtons();
 13883         -  bool ConfigChanged()
 13884         -  {
 13885         -    return IsConfigChanged;
 13886         -  }
 13887         -  void OnQuit(wxCommandEvent & event);
 13888         -  void OnOk(wxCommandEvent & event);
 13889         -  void OnApply(wxCommandEvent & event);
 13890         -  void OnExport(wxCommandEvent & event);
 13891         -  void OnCopy(wxCommandEvent & event);
 13892         -  void OnPageChanging(wxNotebookEvent & event);
 13893         -  void OnPageChanged(wxNotebookEvent & event);
 13894         -  void OnCmdScaleChanged(wxCommandEvent & event);
 13895         -  void OnCmdContrastChanged(wxCommandEvent & event);
 13896         -  void OnCmdBandModeChanged(wxCommandEvent & event);
 13897         -  void OnCmdColorMapModeChanged(wxCommandEvent & event);
 13898         -  void OnCmdColorMinChanged(wxCommandEvent & event);
 13899         -  void OnCmdMinColorPicker(wxCommandEvent & event);
 13900         -  void OnCmdColorMaxChanged(wxCommandEvent & event);
 13901         -  void OnCmdMaxColorPicker(wxCommandEvent & event);
 13902         -  void OnShadedChanged(wxCommandEvent & event);
 13903         -};
 13904         -
 13905  12969   class QuickStyleTopologyDialog:public wxPropertySheetDialog
 13906  12970   {
 13907  12971   //
 13908  12972   // a dialog for configuring a Quick Style (Topology)
 13909  12973   //
 13910  12974   private:
 13911  12975     MyFrame * MainFrame;
................................................................................
 16350  15414     CachedFrame *CachedLinks;
 16351  15415     CachedFrame *CachedFaces;
 16352  15416     CachedFrame *CachedEdgeSeeds;
 16353  15417     CachedFrame *CachedLinkSeeds;
 16354  15418     CachedFrame *CachedFaceSeeds;
 16355  15419     QuickStyleObj *QuickStyle;
 16356  15420     QuickStyleTopologyObj *QuickStyleTopology;
 16357         -  QuickStyleRasterObj *QuickStyleRaster;
 16358  15421     MapLayer *Prev;
 16359  15422     MapLayer *Next;
 16360  15423   public:
 16361  15424       MapLayer(LayerListItem * layer);
 16362  15425      ~MapLayer();
 16363  15426     int GetType()
 16364  15427     {
................................................................................
 16368  15431     {
 16369  15432       return QuickStyle;
 16370  15433     }
 16371  15434     QuickStyleTopologyObj *GetQuickStyleTopology()
 16372  15435     {
 16373  15436       return QuickStyleTopology;
 16374  15437     }
 16375         -  QuickStyleRasterObj *GetQuickStyleRaster()
 16376         -  {
 16377         -    return QuickStyleRaster;
 16378         -  }
 16379  15438     QuickStyleObj *CloneQuickStyle()
 16380  15439     {
 16381  15440       return QuickStyle->Clone();
 16382  15441     }
 16383  15442     QuickStyleTopologyObj *CloneQuickStyleTopology()
 16384  15443     {
 16385  15444       return QuickStyleTopology->Clone();
 16386  15445     }
 16387         -  QuickStyleRasterObj *CloneQuickStyleRaster()
 16388         -  {
 16389         -    return QuickStyleRaster->Clone();
 16390         -  }
 16391  15446     bool UpdateQuickStyle(QuickStyleObj * style);
 16392  15447     bool UpdateQuickStyle(QuickStyleTopologyObj * style);
 16393         -  bool UpdateQuickStyle(QuickStyleRasterObj * style);
 16394  15448     WmsLayerSettings *GetWmsConfig()
 16395  15449     {
 16396  15450       return WmsConfig;
 16397  15451     }
 16398  15452     RasterLayerConfig *GetRasterConfig()
 16399  15453     {
 16400  15454       return RasterConfig;
................................................................................
 16619  15673   private:
 16620  15674     MyMapPanel * MapPanel;
 16621  15675     bool Changed;
 16622  15676     wxTreeItemId Root;            // the root node
 16623  15677     wxImageList *Images;          // the images list
 16624  15678     wxTreeItemId CurrentItem;     // the tree item holding the current context menu
 16625  15679     wxTreeItemId DraggedItem;     // the tree item to be moved
 16626         -  void DoWmsSqlSample(MapLayer * lyr);
 16627         -  void DoWmsUrlSample(MapLayer * lyr);
 16628         -  void DoVectorSqlSample(MapLayer * lyr);
 16629         -  void DoRasterSqlSample(MapLayer * lyr);
 16630  15680   public:
 16631  15681       MyLayerTree()
 16632  15682     {;
 16633  15683     }
 16634  15684     MyLayerTree(MyMapPanel * parent, wxWindowID id = wxID_ANY);
 16635  15685     virtual ~ MyLayerTree();
 16636  15686     void FlushAll()
................................................................................
 16655  15705     void OnCmdRemoveAll(wxCommandEvent & event);
 16656  15706     void OnCmdShowAll(wxCommandEvent & event);
 16657  15707     void OnCmdHideAll(wxCommandEvent & event);
 16658  15708     void OnCmdMapConfigure(wxCommandEvent & event);
 16659  15709     void OnCmdVisible(wxCommandEvent & event);
 16660  15710     void OnCmdMapFullExtent(wxCommandEvent & event);
 16661  15711     void OnCmdMapLayerFullExtent(wxCommandEvent & event);
 16662         -  void OnCmdMapSqlSample(wxCommandEvent & event);
 16663         -  void OnCmdMapUrlSample(wxCommandEvent & event);
 16664  15712     void OnCmdRemoveLayer(wxCommandEvent & event);
 16665  15713     void OnCmdDeleteItem(wxCommandEvent & event);
 16666  15714     void OnCmdLayerInfo(wxCommandEvent & event);
 16667  15715     void OnCmdMapLayerConfigure(wxCommandEvent & event);
 16668  15716     void OnCmdQuickStyleEdit(wxCommandEvent & event);
 16669  15717     void OnDragStart(wxTreeEvent & event);
 16670  15718     void OnDragEnd(wxTreeEvent & event);
................................................................................
 16785  15833       if (UnusedThreads != NULL)
 16786  15834         delete[]UnusedThreads;
 16787  15835       UnusedThreads = NULL;
 16788  15836       NumThreads = 0;
 16789  15837     }
 16790  15838     void PrepareThreadsPool(int count);
 16791  15839     int FindUnusedThread();
 16792         -  void ReleaseThread(int index);
        15840  +  void ReleaseThread(int index, SingleLayerPainter * lyr);
 16793  15841   };
 16794  15842   
 16795  15843   class MyMapView:public wxPanel
 16796  15844   {
 16797  15845   //
 16798  15846   // a panel used to show the Map
 16799  15847   //
................................................................................
 16876  15924     {
 16877  15925       return MapSRID;
 16878  15926     }
 16879  15927     void EnableMultiThreading(bool mode)
 16880  15928     {
 16881  15929       MultiThreadingEnabled = mode;
 16882  15930     }
 16883         -  int GetImageWidth();
 16884         -  int GetImageHeight();
 16885  15931     double GetMapMinX()
 16886  15932     {
 16887  15933       return MapMinX;
 16888  15934     }
 16889  15935     double GetMapMinY()
 16890  15936     {
 16891  15937       return MapMinY;
................................................................................
 16910  15956     {
 16911  15957       return GeoMaxX;
 16912  15958     }
 16913  15959     double GetGeoMaxY()
 16914  15960     {
 16915  15961       return GeoMaxY;
 16916  15962     }
 16917         -  void DoPrepareBBox(wxString & bbox);
 16918         -  void GetBBox(int *srid, double *minx, double *miny, double *maxx, double *maxy);
 16919  15963     MapLayer *GetFirstLayer()
 16920  15964     {
 16921  15965       return FirstLayer;
 16922  15966     }
 16923  15967     bool IsMultiThreadingEnabled()
 16924  15968     {
 16925  15969       return MultiThreadingEnabled;
................................................................................
 17175  16219     {
 17176  16220       Parent->InitializeSqlFilters(db_prefix, table, read_only, geom_column);
 17177  16221     }
 17178  16222     void UpdateMapViewPoint(int fromSrid, int toSrid)
 17179  16223     {
 17180  16224       MapView->UpdateMapViewPoint(fromSrid, toSrid);
 17181  16225     }
 17182         -  int GetImageWidth()
 17183         -  {
 17184         -    return MapView->GetImageWidth();
 17185         -  }
 17186         -  int GetImageHeight()
 17187         -  {
 17188         -    return MapView->GetImageHeight();
 17189         -  }
 17190         -  void DoPrepareBBox(wxString & bbox)
 17191         -  {
 17192         -    MapView->DoPrepareBBox(bbox);
 17193         -  }
 17194         -  void GetBBox(int *srid, double *minx, double *miny, double *maxx, double *maxy)
 17195         -  {
 17196         -    MapView->GetBBox(srid, minx, miny, maxx, maxy);
 17197         -  }
 17198  16226     double GetMapMinX()
 17199  16227     {
 17200  16228       return MapView->GetMapMinX();
 17201  16229     }
 17202  16230     double GetMapMinY()
 17203  16231     {
 17204  16232       return MapView->GetMapMinY();

Changes to Dialogs.cpp.

     1      1   /*
     2      2   / Dialogs.cpp
     3      3   / various dialog classes
     4      4   /
     5      5   / version 1.7, 2013 May 8
     6      6   /
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
     8      8   /
     9      9   / Copyright (C) 2008-2013  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
    13     13   /    the Free Software Foundation, either version 3 of the License, or
    14     14   /    (at your option) any later version.
................................................................................
  4221   4221       sql += wxT(", '::with-foreign-keys::'");
  4222   4222     if (WithTriggers->GetValue() == true)
  4223   4223       sql += wxT(", '::with-triggers::'");
  4224   4224     if (Resequence->GetValue() == true)
  4225   4225       sql += wxT(", '::resequence::'");
  4226   4226     if (Append->GetValue() == true)
  4227   4227       sql += wxT(", '::append::'");
  4228         -  for (unsigned int i = 1; i < ignoreCtrl->GetCount(); i++)
         4228  +  for (int i = 1; i < ignoreCtrl->GetCount(); i++)
  4229   4229       {
  4230   4230         if (ignoreCtrl->IsSelected(i) == true)
  4231   4231           {
  4232   4232             wxString str = ignoreCtrl->GetString(i);
  4233   4233             xname = (char *) malloc((str.Len() * 4) + 1);
  4234   4234             strcpy(xname, str.ToUTF8());
  4235   4235             xname2 = gaiaSingleQuotedSql(xname);
  4236   4236             free(xname);
  4237   4237             sql += wxT(", '::ignore::") + wxString::FromUTF8(xname2) + wxT("'");
  4238   4238             free(xname2);
  4239   4239           }
  4240   4240       }
  4241         -  for (unsigned int i = 1; i < castCtrl->GetCount(); i++)
         4241  +  for (int i = 1; i < castCtrl->GetCount(); i++)
  4242   4242       {
  4243   4243         if (castCtrl->IsSelected(i) == true)
  4244   4244           {
  4245   4245             wxString str = castCtrl->GetString(i);
  4246   4246             xname = (char *) malloc((str.Len() * 4) + 1);
  4247   4247             strcpy(xname, str.ToUTF8());
  4248   4248             xname2 = gaiaSingleQuotedSql(xname);
................................................................................
  4305   4305     NameEnabled = false;
  4306   4306     AStarSupported = true;
  4307   4307     OneWayFromTo = wxT("");
  4308   4308     OneWayToFrom = wxT("");
  4309   4309     NameColumn = wxT("");
  4310   4310     DataTable = wxT("");
  4311   4311     VirtualTable = wxT("");
  4312         -  Overwrite = false;
  4313         -  if (wxDialog::Create(parent, wxID_ANY, wxT("Create Network")) == false)
         4312  +  if (wxDialog::Create(parent, wxID_ANY, wxT("Build Network")) == false)
  4314   4313       return false;
  4315   4314   // populates individual controls
  4316   4315     CreateControls();
  4317   4316   // sets dialog sizer
  4318   4317     GetSizer()->Fit(this);
  4319   4318     GetSizer()->SetSizeHints(this);
  4320   4319   // centers the dialog window
  4321   4320     Centre();
  4322         -  wxString table;
  4323         -  if (MainFrame->GetCurrentlySelectedTable(table) == true)
  4324         -    {
  4325         -      // automatically selecting the current table
  4326         -      wxListBox *tableCtrl = (wxListBox *) FindWindow(ID_NET_TABLE);
  4327         -      int sel = tableCtrl->FindString(table);
  4328         -      if (sel != wxNOT_FOUND)
  4329         -        tableCtrl->SetSelection(sel);
  4330         -      TableName = table;
  4331         -      SetCurrentTable();
  4332         -    }
  4333   4321     return true;
  4334   4322   }
  4335   4323   
  4336   4324   void NetworkDialog::CreateControls()
  4337   4325   {
  4338   4326   //
  4339   4327   // creating individual control and setting initial values
................................................................................
  4359   4347     wxListBox *tableCtrl = new wxListBox();
  4360   4348     tableCtrl->Create(this, ID_NET_TABLE, wxDefaultPosition, size, nTables,
  4361   4349                       tables, wxLB_SINGLE | wxLB_HSCROLL);
  4362   4350     delete[]tables;
  4363   4351     tableNameSizer->Add(tableCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  4364   4352     size = wxSize(140, 80);
  4365   4353     wxSize size2 = wxSize(140, 60);
         4354  +  wxString table;
         4355  +  if (MainFrame->GetCurrentlySelectedTable(table) == true)
         4356  +    {
         4357  +      // automatically selecting the current table
         4358  +      int sel = tableCtrl->FindString(table);
         4359  +      if (sel != wxNOT_FOUND)
         4360  +        tableCtrl->SetSelection(sel);
         4361  +    }
  4366   4362   // the NodeFrom COLUMN
  4367   4363     wxBoxSizer *netSizer = new wxBoxSizer(wxHORIZONTAL);
  4368   4364     row0Sizer->Add(netSizer, 0, wxALIGN_RIGHT | wxALL, 0);
  4369   4365     wxStaticBox *netBox = new wxStaticBox(this, wxID_STATIC,
  4370   4366                                           wxT("Network configuration"),
  4371   4367                                           wxDefaultPosition,
  4372   4368                                           wxDefaultSize);
................................................................................
  4546   4542   // output tables
  4547   4543     wxBoxSizer *outSizer = new wxBoxSizer(wxHORIZONTAL);
  4548   4544     boxSizer->Add(outSizer, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 0);
  4549   4545     wxStaticBox *outTablesBox = new wxStaticBox(this, wxID_STATIC,
  4550   4546                                                 wxT("Output Tables"),
  4551   4547                                                 wxDefaultPosition,
  4552   4548                                                 wxDefaultSize);
  4553         -  wxBoxSizer *outTablesSizer = new wxStaticBoxSizer(outTablesBox, wxVERTICAL);
         4549  +  wxBoxSizer *outTablesSizer = new wxStaticBoxSizer(outTablesBox, wxHORIZONTAL);
  4554   4550     outSizer->Add(outTablesSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  4555         -  wxBoxSizer *out1Sizer = new wxBoxSizer(wxHORIZONTAL);
  4556         -  outTablesSizer->Add(out1Sizer, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 0);
  4557   4551     wxStaticText *dataTableLabel =
  4558   4552       new wxStaticText(this, wxID_STATIC, wxT("&binary data Table:"));
  4559         -  out1Sizer->Add(dataTableLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 1);
         4553  +  outTablesSizer->Add(dataTableLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 1);
  4560   4554     wxTextCtrl *dataTableCtrl = new wxTextCtrl(this, ID_NET_DATA, wxT(""),
  4561   4555                                                wxDefaultPosition, wxSize(150,
  4562   4556                                                                          22));
  4563         -  out1Sizer->Add(dataTableCtrl, 0, wxALIGN_RIGHT | wxALL, 5);
  4564         -  out1Sizer->AddSpacer(15);
         4557  +  outTablesSizer->Add(dataTableCtrl, 0, wxALIGN_RIGHT | wxALL, 5);
         4558  +  outTablesSizer->AddSpacer(15);
  4565   4559     wxStaticText *virtualTableLabel =
  4566   4560       new wxStaticText(this, wxID_STATIC, wxT("&VirtualNetwork Table:"));
  4567         -  out1Sizer->Add(virtualTableLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 1);
         4561  +  outTablesSizer->Add(virtualTableLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 1);
  4568   4562     wxTextCtrl *virtualTableCtrl = new wxTextCtrl(this, ID_NET_VIRTUAL, wxT(""),
  4569   4563                                                   wxDefaultPosition, wxSize(150,
  4570   4564                                                                             22));
  4571         -  out1Sizer->Add(virtualTableCtrl, 0, wxALIGN_RIGHT | wxALL, 5);
  4572         -// Overwrite existing output tables
  4573         -  wxBoxSizer *out2Sizer = new wxBoxSizer(wxHORIZONTAL);
  4574         -  outTablesSizer->Add(out2Sizer, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 0);
  4575         -  wxCheckBox *overwrite = new wxCheckBox(this, ID_NET_OVERWRITE,
  4576         -                                         wxT
  4577         -                                         ("&Overwrite existing output tables"));
  4578         -  out2Sizer->Add(overwrite, 0, wxALIGN_CENTRE_HORIZONTAL | wxALL, 1);
         4565  +  outTablesSizer->Add(virtualTableCtrl, 0, wxALIGN_RIGHT | wxALL, 5);
  4579   4566   // OK - CANCEL buttons
  4580   4567     wxBoxSizer *okCancelBox = new wxBoxSizer(wxHORIZONTAL);
  4581   4568     boxSizer->Add(okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  4582   4569     wxButton *ok = new wxButton(this, wxID_OK, wxT("&OK"));
  4583   4570     okCancelBox->Add(ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  4584   4571     wxButton *cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel"));
  4585   4572     okCancelBox->Add(cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
................................................................................
  4595   4582             (wxObjectEventFunction) & NetworkDialog::OnCost);
  4596   4583     Connect(ID_NET_ONEWAY, wxEVT_COMMAND_CHECKBOX_CLICKED,
  4597   4584             (wxObjectEventFunction) & NetworkDialog::OnOneWay);
  4598   4585     Connect(ID_NET_NAME_ENABLE, wxEVT_COMMAND_CHECKBOX_CLICKED,
  4599   4586             (wxObjectEventFunction) & NetworkDialog::OnNameEnabled);
  4600   4587     Connect(ID_NET_NO_GEOM, wxEVT_COMMAND_CHECKBOX_CLICKED,
  4601   4588             (wxObjectEventFunction) & NetworkDialog::OnNoGeometry);
  4602         -  Connect(ID_NET_OVERWRITE, wxEVT_COMMAND_CHECKBOX_CLICKED,
  4603         -          (wxObjectEventFunction) & NetworkDialog::OnOverwrite);
  4604   4589   }
  4605   4590   
  4606   4591   void NetworkDialog::OnTable(wxCommandEvent & WXUNUSED(event))
  4607   4592   {
  4608   4593   //
  4609   4594   // TABLE selection changed
  4610   4595   //
  4611   4596     wxListBox *tableCtrl = (wxListBox *) FindWindow(ID_NET_TABLE);
  4612   4597     TableName = tableCtrl->GetStringSelection();
  4613         -  SetCurrentTable();
  4614         -}
  4615         -
  4616         -void NetworkDialog::SetCurrentTable()
  4617         -{
  4618         -//
  4619         -// The currently selected Table changed
  4620         -//
  4621   4598     wxTextCtrl *dataTableCtrl = (wxTextCtrl *) FindWindow(ID_NET_DATA);
  4622   4599     wxString data_table = TableName + wxT("_net_data");
  4623   4600     dataTableCtrl->SetValue(data_table);
  4624   4601     wxTextCtrl *virtualTableCtrl = (wxTextCtrl *) FindWindow(ID_NET_VIRTUAL);
  4625   4602     wxString net_table = TableName + wxT("_net");
  4626   4603     virtualTableCtrl->SetValue(net_table);
  4627   4604     int n_cols;
................................................................................
  4799   4776         costSel->Enable(false);
  4800   4777         GeomLength = false;
  4801   4778         costSel->SetSelection(1);
  4802   4779         costCtrl->Enable(true);
  4803   4780       }
  4804   4781   }
  4805   4782   
  4806         -void NetworkDialog::OnOverwrite(wxCommandEvent & WXUNUSED(event))
  4807         -{
  4808         -//
  4809         -// Overwrite check box
  4810         -//
  4811         -  if (Overwrite == true)
  4812         -    Overwrite = false;
  4813         -  else
  4814         -    Overwrite = true;
  4815         -}
  4816         -
  4817   4783   void NetworkDialog::OnOk(wxCommandEvent & WXUNUSED(event))
  4818   4784   {
  4819   4785   //
  4820   4786   // all done: 
  4821   4787   //
  4822   4788     wxListBox *tableCtrl = (wxListBox *) FindWindow(ID_NET_TABLE);
  4823   4789     TableName = tableCtrl->GetStringSelection();
................................................................................
  6714   6680     int i;
  6715   6681     char **results;
  6716   6682     int rows;
  6717   6683     int columns;
  6718   6684     char *value;
  6719   6685     wxSpinCtrl *sridNewCtrl = (wxSpinCtrl *) FindWindow(ID_ADDALL_SRID_NEW);
  6720   6686     wxSpinCtrl *sridOldCtrl = (wxSpinCtrl *) FindWindow(ID_ADDALL_SRID_OLD);
         6687  +  wxButton *ok = (wxButton *) FindWindow(wxID_OK);
  6721   6688     int newSrid = sridNewCtrl->GetValue();
  6722   6689     int oldSrid = sridOldCtrl->GetValue();
  6723   6690     int inserted = 0;
  6724   6691   
  6725   6692     char *sql =
  6726   6693       sqlite3_mprintf
  6727   6694       ("SELECT SE_RegisterRasterCoverageSrid( z.coverage_name, %d) FROM "
................................................................................
  6968   6935     int i;
  6969   6936     char **results;
  6970   6937     int rows;
  6971   6938     int columns;
  6972   6939     char *value;
  6973   6940     wxSpinCtrl *sridNewCtrl = (wxSpinCtrl *) FindWindow(ID_ADDALL_SRID_NEW);
  6974   6941     wxSpinCtrl *sridOldCtrl = (wxSpinCtrl *) FindWindow(ID_ADDALL_SRID_OLD);
         6942  +  wxButton *ok = (wxButton *) FindWindow(wxID_OK);
  6975   6943     int newSrid = sridNewCtrl->GetValue();
  6976   6944     int oldSrid = sridOldCtrl->GetValue();
  6977   6945     int inserted = 0;
  6978   6946   
  6979   6947     char *sql =
  6980   6948       sqlite3_mprintf
  6981   6949       ("SELECT SE_RegisterVectorCoverageSrid( z.coverage_name, %d) FROM "

Changes to DialogsGraph.cpp.

     1      1   /*
     2      2   / DialogsGraph.cpp
     3      3   / graphics dialog classes
     4      4   /
     5      5   / version 1.7, 2013 May 8
     6      6   /
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
     8      8   /
     9      9   / Copyright (C) 2010-2013  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
    13     13   /    the Free Software Foundation, either version 3 of the License, or
    14     14   /    (at your option) any later version.

Changes to Exif.cpp.

     1      1   /*
     2      2   / Exif.cpp
     3      3   / methods related to EXIF import and XmlBLOB import/export
     4      4   /
     5      5   / version 1.7, 2013 May 8
     6      6   /
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
     8      8   /
     9      9   / Copyright (C) 2008-2013  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
    13     13   /    the Free Software Foundation, either version 3 of the License, or
    14     14   /    (at your option) any later version.
................................................................................
  2329   2329       goto create_new;
  2330   2330     else
  2331   2331       {
  2332   2332         for (i = 1; i <= rows; i++)
  2333   2333           {
  2334   2334             const char *name;
  2335   2335             bool ok_id = false;
         2336  +          bool ok_name = false;
  2336   2337             bool ok_photo = false;
  2337   2338             bool ok_width = false;
  2338   2339             bool ok_height = false;
  2339   2340             bool ok_timestamp = false;
  2340   2341             bool pKey = false;
         2342  +          bool ok_pk = false;
  2341   2343             bool err_pk = false;
  2342   2344             name = results[(i * columns) + 1];
  2343   2345             if (atoi(results[(i * columns) + 5]) == 0)
  2344   2346               pKey = false;
  2345   2347             else
  2346   2348               pKey = true;
  2347   2349             if (strcasecmp(name, "id") == 0)
  2348   2350               ok_id = true;
         2351  +          if (strcasecmp(name, "name") == 0)
         2352  +            ok_name = true;
  2349   2353             if (strcasecmp(name, "photo") == 0)
  2350   2354               ok_photo = true;
  2351   2355             if (strcasecmp(name, "width") == 0)
  2352   2356               ok_width = true;
  2353   2357             if (strcasecmp(name, "heigth") == 0)
  2354   2358               ok_height = true;
  2355   2359             if (strcasecmp(name, "timestamp") == 0)
  2356   2360               ok_timestamp = true;
  2357   2361             if (pKey == true)
  2358   2362               {
  2359         -              if (strcasecmp(name, "id") != 0)
         2363  +              if (strcasecmp(name, "id") == 0)
         2364  +                ok_pk = true;
         2365  +              else
  2360   2366                   err_pk = true;
  2361   2367               }
  2362   2368             if (ok_id == true && pKey != true)
  2363   2369               err_pk = true;
  2364   2370             if (err_pk == true)
  2365   2371               {
  2366   2372                 err = true;
................................................................................
  2584   2590   {
  2585   2591   //
  2586   2592   // importing a single EXIF-GPS image into the DB Table
  2587   2593   //
  2588   2594     sqlite3_int64 val64;
  2589   2595     int ret;
  2590   2596     wxString timestamp;
         2597  +  char *errMsg = NULL;
  2591   2598     double longitude;
  2592   2599     double latitude;
  2593   2600     gaiaGeomCollPtr geom;
  2594   2601     bool ok;
  2595   2602     unsigned char *geoblob;
  2596   2603     int geosize;
  2597   2604   

Deleted HtmlHelp.cpp.

     1         -/*
     2         -/ HtmlHelp.cpp
     3         -/ spatialite_gui HTML Help generator
     4         -/
     5         -/ This code was autogenerated by "helpgen" on xxxxx
     6         -/
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
     8         -/
     9         -/ Copyright (C) 2017  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 <zlib.h>
    29         -
    30         -void MyFrame::GetHelp(wxString & html_text)
    31         -{
    32         -//
    33         -// return the HTML Help Page from the ZIP compressed data
    34         -//
    35         -  unsigned char *zip_buf = NULL;
    36         -  int uncompressed_len = 595001;
    37         -  int compressed_len = 67145;
    38         -  uLong inLen = compressed_len;
    39         -  uLong outLen = uncompressed_len;
    40         -  const Bytef *in;
    41         -  Bytef *out;
    42         -  char *html = NULL;
    43         -
    44         -// allocating the ZIP compressed buffer
    45         -  zip_buf = (unsigned char *) malloc(uncompressed_len);
    46         -  if (zip_buf == NULL)
    47         -    goto error;
    48         -
    49         -// feeding the ZIP compressed buffer
    50         -  FeedZipHtml(zip_buf, 0, "789cecbd6977e338b228f8b9ea5770f29ed725bff6927666f7");
    51         -  FeedZipHtml(zip_buf, 25,
    52         -              "adcec5ef386da7cb5ddeaeadaccae5e4f1a12448622545aa49");
    53         -  FeedZipHtml(zip_buf, 50,
    54         -              "ca4bcdbcff3eb100204882142553b25de99a797dd302080462");
    55         -  FeedZipHtml(zip_buf, 75,
    56         -              "4320108878f3ffec9deeb63f9ded3bbfb48f8f9cb30fef8e0e");
    57         -  FeedZipHtml(zip_buf, 100,
    58         -              "779d676b1b1bbfbfd8ddd8d86bef71c3cbf5e79b4e3b7283d8");
    59         -  FeedZipHtml(zip_buf, 125,
    60         -              "4bbc3070fd8d8dfd9367db3fbe1926237ffbcd50b8bded1f7f");
    61         -  FeedZipHtml(zip_buf, 150,
    62         -              "f8e1cd4824aed30d834404c9db6789b84936b0c76ba73b74a3");
    63         -  FeedZipHtml(zip_buf, 175,
    64         -              "58246f3fb4dfaffdfccc1926c9784dfc67e25dbd7d26bbaf25");
    65         -  FeedZipHtml(zip_buf, 200,
    66         -              "b763f18c4649bcc417db176337f1dc232f11cec5ff1c39fd49");
    67         -  FeedZipHtml(zip_buf, 225,
    68         -              "d0c5b96327127d1189a02b1cdf8b93371bdc1d3f8c935b5f38");
    69         -  FeedZipHtml(zip_buf, 250,
    70         -              "38909cbc1bc734e40fc32de7ffed867e18bd0adcabdbd70eb6");
    71         -  FeedZipHtml(zip_buf, 275,
    72         -              "aeb9be37085e75617211bdfebf0ef57ba1fa75fc89903f76f4");
    73         -  FeedZipHtml(zip_buf, 300,
    74         -              "6f51781dbcfebff89b97190f7f7ab341d3c3746f3608216f3a");
    75         -  FeedZipHtml(zip_buf, 325,
    76         -              "61efd6e90ca8dfdb67ffd5c7ff9e13d636b7db6e07400dfbce");
    77         -  FeedZipHtml(zip_buf, 350,
    78         -              "2e2f3f868f36a169e2c3fff8def61bd719c242e1b398f0e003");
    79         -  FeedZipHtml(zip_buf, 375,
    80         -              "1e2ee3fff8cf4af1f266c3dd7eb3019fe6be8fdc18d687df6f");
    81         -  FeedZipHtml(zip_buf, 400,
    82         -              "f100e7f4030eb0553ac206c0f1a61301692384770bc70bdc11");
    83         -  FeedZipHtml(zip_buf, 425,
    84         -              "e0b5029c97ebff587fbed61357c2ff5bd089c7afe7fbdf6a6a");
    85         -  FeedZipHtml(zip_buf, 450,
    86         -              "2388000f221c7105a4c82ef74a44317c0880c130bff11fce61");
    87         -  FeedZipHtml(zip_buf, 475,
    88         -              "d00f9d2f6ed0733a13cfef39e198074f449c78c1e0ab0d0785");
    89         -  FeedZipHtml(zip_buf, 500,
    90         -              "9107221091d77db67dc0ff20e44d120f70715b6f003fecb880");
    91         -  FeedZipHtml(zip_buf, 525,
    92         -              "b203fabf0ec8034e1e3b6311a1d0048246a8182006914154f0");
    93         -  FeedZipHtml(zip_buf, 550,
    94         -              "e2521c8ddcc01b4f7c1787732e64a72a48466e32e441f05fb5");
    95         -  FeedZipHtml(zip_buf, 575,
    96         -              "8017511446f98923310e239af560fff4c2d970cedbedd3b353");
    97         -  FeedZipHtml(zip_buf, 600,
    98         -              "873ac70e22fcda8d025c65c5d0be0806c9f0b27b95f0f8fcf7");
    99         -  FeedZipHtml(zip_buf, 625,
   100         -              "460fe8ed22e1278197ac018224696b81db1bc5e980b66f9d7e");
   101         -  FeedZipHtml(zip_buf, 650,
   102         -              "148e9cbdbd8dbde30b270813977f6df96130f092494f6c203e");
   103         -  FeedZipHtml(zip_buf, 675,
   104         -              "f11f2b15d37480943c4781119c7e1839ef8e4edf3961e70f20");
   105         -  FeedZipHtml(zip_buf, 700,
   106         -              "6d15b4e3e765837c09c2600df1d073a3de571a732042d0b3c8");
   107         -  FeedZipHtml(zip_buf, 725,
   108         -              "803506decc930c47007cc44934e912e5dcc280cec0bb1281e3");
   109         -  FeedZipHtml(zip_buf, 750,
   110         -              "25b1f3bbf0fdb56f01a83da70d2ad33917e348c4a0afdc29ac");
   111         -  FeedZipHtml(zip_buf, 775,
   112         -              "3ade6a6ce2775ee046b7334cfdc23675d8495c0f39d14986a2");
   113         -  FeedZipHtml(zip_buf, 800,
   114         -              "b0ae8da913a2ae2e425c09c6c88bbb7950e2c958898cb80913");
   115         -  FeedZipHtml(zip_buf, 825,
   116         -              "18281d12c00471ac24e7cbfc780018ee77ce018f725bf13108");
   117         -  FeedZipHtml(zip_buf, 850,
   118         -              "abeb1544d84d12311a134049e8701fd00a3e02237a6a5caf52");
   119         -  FeedZipHtml(zip_buf, 875,
   120         -              "9d74c311a22ae6b115286beae7ba32db858d293704ad0d7f47");
   121         -  FeedZipHtml(zip_buf, 900,
   122         -              "f86ac9bd378ad7d2816077ea8a35f85104312d7796b1c6ff28");
   123         -  FeedZipHtml(zip_buf, 925,
   124         -              "c3f659e80595b4ff67d997bb93e84a385f8ebc00b69e082101");
   125         -  FeedZipHtml(zip_buf, 950,
   126         -              "de3cc73da86ab8ff2e1b0ec7b9a071aa3effb9ecf38b49d407");
   127         -  FeedZipHtml(zip_buf, 975,
   128         -              "04395fce42ff76804c5e03987f95638506a95447cfab187837");
   129         -  FeedZipHtml(zip_buf, 1000,
   130         -              "f4fda99be078b3a0d392a19bd05eeeb8e37114de782046c291");
   131         -  FeedZipHtml(zip_buf, 1025,
   132         -              "960af0b4cfca7de88d63e7ca739de377e7d54ab3a0bcd219ac");
   133         -  FeedZipHtml(zip_buf, 1050,
   134         -              "a3560e6655477a73ab3f4e41f609286f34f605b0770a5908f6");
   135         -  FeedZipHtml(zip_buf, 1075,
   136         -              "849bc0fe5b3d5a67d6e19c2fb4c9c763d1f5faa8ae849b4c40");
   137         -  FeedZipHtml(zip_buf, 1100,
   138         -              "be2b9965f3654105d69cc7ed5d21827a75e7e9cd3e8fb456ea");
   139         -  FeedZipHtml(zip_buf, 1125,
   140         -              "4d505006bca185510fb60b60b7048f47acc2a7e995cd7f8cfd");
   141         -  FeedZipHtml(zip_buf, 1150,
   142         -              "495cb135ecf4fb20d87ce24a87247bea200a27f07ff0d81085");
   143         -  FeedZipHtml(zip_buf, 1175,
   144         -              "3e6ba2eac90aba080167b3dd5f3b8613db9e0ba7361c5bfd78");
   145         -  FeedZipHtml(zip_buf, 1200,
   146         -              "18f4c48d33849ffc299a65f39f78e4ebc2007e38a85810eeb9");
   147         -  FeedZipHtml(zip_buf, 1225,
   148         -              "38d52ef7a4d988f381be17b8c18256ee4e59061daf2ae6b838");
   149         -  FeedZipHtml(zip_buf, 1250,
   150         -              "dadbb8d887e1a05bcf39726fc51411f8a717e336e3568c7978");
   151         -  FeedZipHtml(zip_buf, 1275,
   152         -              "714a70f700eeeab1fabd303f8ee63d1ce9fddee9c6e9c1b983");
   153         -  FeedZipHtml(zip_buf, 1300,
   154         -              "9b22acb743865ef59083f1b7024e33639e1eeca2de3c73bbdf");
   155         -  FeedZipHtml(zip_buf, 1325,
   156         -              "dc819861e8c27e822c71dc8976ddee50ac75dc181008a78829");
   157         -  FeedZipHtml(zip_buf, 1350,
   158         -              "dbfe78b3b0b1e038e7ffbb1d89dc284e4b6de9ceaeebfb1d80");
   159         -  FeedZipHtml(zip_buf, 1375,
   160         -              "38aeb2ab6f46fe3b6d5a5b29f3117a80715d755a8abc824e30");
   161         -  FeedZipHtml(zip_buf, 1400,
   162         -              "d9e5fc70cff102546753769c241cc3117e705b31585b7659ab");
   163         -  FeedZipHtml(zip_buf, 1425,
   164         -              "61870522b90ea36f75463be1ae15835d8faaf4c8ef70b641d6");
   165         -  FeedZipHtml(zip_buf, 1450,
   166         -              "8dc349547d22c45ebe5765ae929638f2ba6049558ea4f4f6b3");
   167         -  FeedZipHtml(zip_buf, 1475,
   168         -              "6db47fc1aa7603114ee2549f97f81c8af4fb8f0f9bb904e90c");
   169         -  FeedZipHtml(zip_buf, 1500,
   170         -              "fe257aa8a55741c2c308c6497f62e5c5bffee6461efa56e254");
   171         -  FeedZipHtml(zip_buf, 1525,
   172         -              "bf94cd475e0e7238913326f5d4882de18aad674e0794bb801f");
   173         -  FeedZipHtml(zip_buf, 1550,
   174         -              "369f39b890b1db035d3f78fb6c8bff861da5abfebef67ac910");
   175         -  FeedZipHtml(zip_buf, 1575,
   176         -              "7a3e7ffebfd8e3f42641f7cff69b2482ffd703d9c4eec1db67");
   177         -  FeedZipHtml(zip_buf, 1600,
   178         -              "ff78e690dfe9ed33763c3d333d44cfc5f3ee73fefe8737c317");
   179         -  FeedZipHtml(zip_buf, 1625,
   180         -              "a9d7a511af060eb891f4f07f22092302373420e83dc7ffefd9");
   181         -  FeedZipHtml(zip_buf, 1650,
   182         -              "f67bf925741d4a70acfd2e6ee1787493eda597fae299ed8bc9");
   183         -  FeedZipHtml(zip_buf, 1675,
   184         -              "68e4a27cc0273940d065b66df897e4a2df6c74186e3943cfd2");
   185         -  FeedZipHtml(zip_buf, 1700,
   186         -              "a7e55c855ecf59715e396fbc6d65117bd9ef4cc8b623017b3e");
   187         -  FeedZipHtml(zip_buf, 1725,
   188         -              "5909a03827518426024c9fbab3705a47b90d5ce031721a3ab1");
   189         -  FeedZipHtml(zip_buf, 1750,
   190         -              "1cbb88c73cf8891b0d4472d91d4f2a5790765bd422da3483b3");
   191         -  FeedZipHtml(zip_buf, 1775,
   192         -              "7bf6a1fe3afaa0c26ffc721264db1b83fc3d0cfbf1a81af51d");
   193         -  FeedZipHtml(zip_buf, 1800,
   194         -              "06f6871f60af39f97074e4787d87bf73bc580de6df3a93406a");
   195         -  FeedZipHtml(zip_buf, 1825,
   196         -              "2fd12b5d2628983f5e96af32d3dcd822cfce4fffbdfe72f645");
   197         -  FeedZipHtml(zip_buf, 1850,
   198         -              "f277b32f7220c2b87c8d666b634b440b7ef60592dd3ff3f2a2");
   199         -  FeedZipHtml(zip_buf, 1875,
   200         -              "0437e8f20566db1b5b221f1e665fa43c74ccbc4cdfeb8055b4");
   201         -  FeedZipHtml(zip_buf, 1900,
   202         -              "55bece5c87c6167ae4753e1e1f6dcdbe52f9e1ec4bfdc58d0f");
   203         -  FeedZipHtml(zip_buf, 1925,
   204         -              "d1675b5ca36ac92eee5d18fac20daa57d73effb08f50e1eae0");
   205         -  FeedZipHtml(zip_buf, 1950,
   206         -              "042522ff16cd1ac05a84debe6b58126ea38923023007b00920");
   207         -  FeedZipHtml(zip_buf, 1975,
   208         -              "39dc3d3df94d835102ebb19b0c615fb6422bdb9605eff14efb");
   209         -  FeedZipHtml(zip_buf, 2000,
   210         -              "1713941288c14ad566b8156cb3c3b26007e9dfdd393a7ab7b3");
   211         -  FeedZipHtml(zip_buf, 2025,
   212         -              "fbebc5b40580edf78715706c5816c0a88f6b60ba14c3cbc4ec");
   213         -  FeedZipHtml(zip_buf, 2050,
   214         -              "548c223c3bd2442f0558755826e03b7bbfed9ceceeefd55940");
   215         -  FeedZipHtml(zip_buf, 2075,
   216         -              "3b9a04df4aa1a7d665820e1f9efc5a07ee7301ca3172d1a75c");
   217         -  FeedZipHtml(zip_buf, 2100,
   218         -              "02bbeeb14cf8cff7f74fdae73b27ed3a6b380dfcdbe9ebc8f4");
   219         -  FeedZipHtml(zip_buf, 2125,
   220         -              "5ae65a4e4f8e3ed55ecf79824770eb22b8695990a7464615b8");
   221         -  FeedZipHtml(zip_buf, 2150,
   222         -              "c60e5d8057b62d0be03c282510ef8fe381155c6c5816acfb67");
   223         -  FeedZipHtml(zip_buf, 2175,
   224         -              "1707d3004d0f240550b96959c0be07e6fd58676397dec03209");
   225         -  FeedZipHtml(zip_buf, 2200,
   226         -              "94cd4b13bd0c40ca9fe4b4b0e9ec5742ff4ae58276cfec2bd9");
   227         -  FeedZipHtml(zip_buf, 2225,
   228         -              "3d2b5fc2501aa30efc877dc9652e3de6ec307796b67ebbbb3e");
   229         -  FeedZipHtml(zip_buf, 2250,
   230         -              "8f8a83b3a998504e412b3a54e3b2966502e3b4584bada82559");
   231         -  FeedZipHtml(zip_buf, 2275,
   232         -              "5771570f9835fae6313ab876dd18b6904358f940444562669a");
   233         -  FeedZipHtml(zip_buf, 2300,
   234         -              "819cae3f11484bb96ca4a522af1ea3eea10e786f3c49e498e3");
   235         -  FeedZipHtml(zip_buf, 2325,
   236         -              "308ebd0e9cc8f04a5cf4f0f61ffbc841c96d4cd7efaff4792e");
   237         -  FeedZipHtml(zip_buf, 2350,
   238         -              "08cd481a38d5c921c47a29dff26af6c209f42a5b2bb7562f95");
   239         -  FeedZipHtml(zip_buf, 2375,
   240         -              "fb38e348743d3efd36b966397a934bc6a892b205635bf572f9");
   241         -  FeedZipHtml(zip_buf, 2400,
   242         -              "6b43934dfd70d5f95344e1e5d8ede538a330646358a3c099d9");
   243         -  FeedZipHtml(zip_buf, 2425,
   244         -              "70a6bc04877dc70da4bfdaf51d371a4c46d2dba096419a053f");
   245         -  FeedZipHtml(zip_buf, 2450,
   246         -              "7663bc47422f370396c205ad613fc3b461a4688920ad625b40");
   247         -  FeedZipHtml(zip_buf, 2475,
   248         -              "1d786d308e0cbab8f67cdfe9c0d2dc5e0f7e9dc41490143ba3");
   249         -  FeedZipHtml(zip_buf, 2500,
   250         -              "49778837b91e29bacffbe7a7b11387b86211c49348c8c1fe33");
   251         -  FeedZipHtml(zip_buf, 2525,
   252         -              "f1f0ae8103d5a6b1025e6495b102b655b3027f2d59c199f2df");
   253         -  FeedZipHtml(zip_buf, 2550,
   254         -              "d441579da1b8b96424663788c27c8df109c5c0a57c32751172");
   255         -  FeedZipHtml(zip_buf, 2575,
   256         -              "2fb27287865eb1472c129c07b724d8c7e8d73c9b285a8b1bbc");
   257         -  FeedZipHtml(zip_buf, 2600,
   258         -              "ea63b8ba611489781c06f417f0e22fe2c6dd03e532c2c04ce2");
   259         -  FeedZipHtml(zip_buf, 2625,
   260         -              "915547ac0fd671e4e79b6ee7e77fedbfc7d15f33783033f0e5");
   261         -  FeedZipHtml(zip_buf, 2650,
   262         -              "6444303a7de09798998d8440cda8b86ebd16f1eea073de8751");
   263         -  FeedZipHtml(zip_buf, 2675,
   264         -              "57ecc42713df2f729ad1485cb159640af8752bf7ab6407e397");
   265         -  FeedZipHtml(zip_buf, 2700,
   266         -              "728e00a001081c9a0880b2ca7fb3d3d005b9019101ccb6b009");
   267         -  FeedZipHtml(zip_buf, 2725,
   268         -              "30dd454fa094dd18b6f7943d56ec187c4d81d83f84f04174ed");
   269         -  FeedZipHtml(zip_buf, 2750,
   270         -              "c522335fbeb3e376e2d09f2482dc8d4908322d35489c60570a");
   271         -  FeedZipHtml(zip_buf, 2775,
   272         -              "eb8bae50c231d4308cbc81078c66405121d2917013f1e1c3e1");
   273         -  FeedZipHtml(zip_buf, 2800,
   274         -              "9e45a4755bd60cabaf7a5d7db7f7d269c109b9178e561c1c10");
   275         -  FeedZipHtml(zip_buf, 2825,
   276         -              "ac44752f8ab1f3af363644b07eed7df3c6a2e7b9eb6134d8c0");
   277         -  FeedZipHtml(zip_buf, 2850,
   278         -              "bf363e041e328eebfbb79793c0fbcf445c7a3d8c16e87b6068");
   279         -  FeedZipHtml(zip_buf, 2875,
   280         -              "6d1bcd0e373b6933da502be52b3fdefbc7ee5074bf01d71797");
   281         -  FeedZipHtml(zip_buf, 2900,
   282         -              "6e34b658e0ff3fa7bdffb13ddfee536fad30e7339cd8e96ab0");
   283         -  FeedZipHtml(zip_buf, 2925,
   284         -              "dc6d43b26548634e1dd026f43bb201cf889c842c479c84e10b");
   285         -  FeedZipHtml(zip_buf, 2950,
   286         -              "1870cb61bbfc6f5a060d50899b7698b87e2582323dee8825d7");
   287         -  FeedZipHtml(zip_buf, 2975,
   288         -              "e94e4614f17d251c1307b43c80e8cd64db1d0c2231c0d0a4be");
   289         -  FeedZipHtml(zip_buf, 3000,
   290         -              "367627db9527c8fda01bf6c48773cb815737b59c49e49bd096");
   291         -  FeedZipHtml(zip_buf, 3025,
   292         -              "1a2d3f547cb3aa9e84548ed420b79c89088f1b6b026102d678");
   293         -  FeedZipHtml(zip_buf, 3050,
   294         -              "b63de65f1cfa0514042dbb090ef202e807e2cf4cc3a8508f15");
   295         -  FeedZipHtml(zip_buf, 3075,
   296         -              "7ee02807827bb2cda3d2c413dace5cffdabd957b0bef54a0d7");
   297         -  FeedZipHtml(zip_buf, 3100,
   298         -              "5c9a829ecef0c991f6a7751d36911d339c24e6a04a39f29682");
   299         -  FeedZipHtml(zip_buf, 3125,
   300         -              "db1fecd9bc264501851215da077d3ab78cdaceb6ec241539ef");
   301         -  FeedZipHtml(zip_buf, 3150,
   302         -              "c4a92107ffd18e9518df666055d3ab15c1c03dd177277e62c2");
   303         -  FeedZipHtml(zip_buf, 3175,
   304         -              "cfef4dcab812f6e532aed44d337065f9370d31a5eb8c7dd70b");
   305         -  FeedZipHtml(zip_buf, 3200,
   306         -              "9004fcca0077992c5765788f88d9184f95d05f7256ba47c633");
   307         -  FeedZipHtml(zip_buf, 3225,
   308         -              "f25596578b6c452b7d546ce54527607bbc07b8cfdc646861ae");
   309         -  FeedZipHtml(zip_buf, 3250,
   310         -              "6c87d61d7634180a6ccf30ba757044c6952b637f4183038195");
   311         -  FeedZipHtml(zip_buf, 3275,
   312         -              "cde2e054e8f2988d25d09ac21fdde0d689294810ce36c9d0f1");
   313         -  FeedZipHtml(zip_buf, 3300,
   314         -              "ddee377e6ca141a83023c1447ceff9a21a2db65e77c10d8ee7");
   315         -  FeedZipHtml(zip_buf, 3325,
   316         -              "e0808c9b961774fd09310e30a8b802c640d3913aecdf241cc8");
   317         -  FeedZipHtml(zip_buf, 3350,
   318         -              "bfb2601422eed885982250835881c0e9c86b127129cec4cda3");
   319         -  FeedZipHtml(zip_buf, 3375,
   320         -              "c619c0588d32a3c39d31a611729ff8c0b9aef1c008a7bd1420");
   321         -  FeedZipHtml(zip_buf, 3400,
   322         -              "3cecf19ba3727c0998ae8824fcb5e57c2494007a68e3fa0256");
   323         -  FeedZipHtml(zip_buf, 3425,
   324         -              "d6a7cc2fb591b68f960e45b50ff99929c57a78b4fa8f38fbba");
   325         -  FeedZipHtml(zip_buf, 3450,
   326         -              "e39c333ed8231283ea8d57a523453a59a0ef2756f08cfd588c");
   327         -  FeedZipHtml(zip_buf, 3475,
   328         -              "5d0abdcf3882742f74e78cbc04f6121c0774bb8383f9f490a3");
   329         -  FeedZipHtml(zip_buf, 3500,
   330         -              "cbdb0a1c1c45643f4defdf8c7dafebe1c1523eaca4394570e5");
   331         -  FeedZipHtml(zip_buf, 3525,
   332         -              "456140fe832b191a4a2172673bedc39da3c3f6fee5c5feee87");
   333         -  FeedZipHtml(zip_buf, 3550,
   334         -              "f3c3f6a7b7c80737427b9e8c53a4f6f878f844a62722f208f5");
   335         -  FeedZipHtml(zip_buf, 3575,
   336         -              "fb183a7c851dc8372ed831a0ac6d938426a44d39c467784dfa");
   337         -  FeedZipHtml(zip_buf, 3600,
   338         -              "281ce3fb84c383f1b7c131d867b61388d9de4246c653b6c9d8");
   339         -  FeedZipHtml(zip_buf, 3625,
   340         -              "eaef0ac60e3838589a2107221ccbe8f9919a54f1269c920d44");
   341         -  FeedZipHtml(zip_buf, 3650,
   342         -              "c6407b0f633691c112374ac8e6f062792782e3e185160db3ca");
   343         -  FeedZipHtml(zip_buf, 3675,
   344         -              "6f4f86ae36e8d99017298f32c3f4480780be8e80c506c462a9");
   345         -  FeedZipHtml(zip_buf, 3700,
   346         -              "6cecabfb163d2e71a5a3e3a7a48bcc090318507acdd2402b09");
   347         -  FeedZipHtml(zip_buf, 3725,
   348         -              "3a74db7bb7d6f7d87b8eaa05c7a0217df736ac3ad5eed1ea2a");
   349         -  FeedZipHtml(zip_buf, 3750,
   350         -              "2892eb302749e42895342903f14024e5e0198d56d03a75aec7");
   351         -  FeedZipHtml(zip_buf, 3775,
   352         -              "cee5f6617a1825aeedb066c3dd249d579d8cebeafdced1c5fe");
   353         -  FeedZipHtml(zip_buf, 3800,
   354         -              "9493b8c2ecce683cf43a5e3889a78945b667e302e2eae11b90");
   355         -  FeedZipHtml(zip_buf, 3825,
   356         -              "95dc60cd480c9c524e420c7a9e6cb3f352090ea180dc92f2c7");
   357         -  FeedZipHtml(zip_buf, 3850,
   358         -              "c25a3c76538e266838e16c6850c5641470547d2d319946abd2");
   359         -  FeedZipHtml(zip_buf, 3875,
   360         -              "aecd8b8e8d5a53a4681af4d66e4b902ccb529a11b20b91489f");
   361         -  FeedZipHtml(zip_buf, 3900,
   362         -              "ff597ab1985fb5a513add92bdeb1d590ae8c95c2740b26a30e");
   363         -  FeedZipHtml(zip_buf, 3925,
   364         -              "de5df5e108cb17103d6f802e83160c99b9f15c915201a23406");
   365         -  FeedZipHtml(zip_buf, 3950,
   366         -              "e5cde75e5c47fb7227a6cbc1156d961a2f13c96b15bf621b4c");
   367         -  FeedZipHtml(zip_buf, 3975,
   368         -              "a61250c7656d2c7944887fd2f7593852f93a83e3369f3168da");
   369         -  FeedZipHtml(zip_buf, 4000,
   370         -              "00bd8b2022f48d0694cfe6ee2409f1d96297a409361e7c9d23");
   371         -  FeedZipHtml(zip_buf, 4025,
   372         -              "3d69a41af200a4b3b499018c271220e77cb3036cc5c30fc300");
   373         -  FeedZipHtml(zip_buf, 4050,
   374         -              "d648e6965a0099ddd0d4f7434e8431c6580bb9f802e242365c");
   375         -  FeedZipHtml(zip_buf, 4075,
   376         -              "e36e2444502edb077538c4d2c92a155e9dfbfaf3621036330b");
   377         -  FeedZipHtml(zip_buf, 4100,
   378         -              "e24411666c0293626ea7822adacfcf4317b0bf88988dca7c25");
   379         -  FeedZipHtml(zip_buf, 4125,
   380         -              "a13d5fc9a33055d5c22e03103aeb792cdfc36901aaff738978");
   381         -  FeedZipHtml(zip_buf, 4150,
   382         -              "b139176b8572c81774c4cca81f706879c749c73439a5ba2b0f");
   383         -  FeedZipHtml(zip_buf, 4175,
   384         -              "1cf3e89bbaaed9375676a4f5fa24de94c1c509bbc482bd7201");
   385         -  FeedZipHtml(zip_buf, 4200,
   386         -              "d1ebc48ed598903d9ac0446161b031c4092ca7cbe2c2c93eb4");
   387         -  FeedZipHtml(zip_buf, 4225,
   388         -              "7ecc13c3509319c46919e10fbd6d052841530775f587235b87");
   389         -  FeedZipHtml(zip_buf, 4250,
   390         -              "0d990ea8203cf14237013055f84af4427c379ec277b28763d5");
   391         -  FeedZipHtml(zip_buf, 4275,
   392         -              "44cb43722dac9593288724dc4d66411368b76a2c718732965c");
   393         -  FeedZipHtml(zip_buf, 4300,
   394         -              "4d83282c1135b590a87779fda0c6dba64169a4691cd8315846");
   395         -  FeedZipHtml(zip_buf, 4325,
   396         -              "c71e18dd7ba188839f12e716dded371e50c74b52d73c5d47e3");
   397         -  FeedZipHtml(zip_buf, 4350,
   398         -              "56b7061fadf5fddb32f1374182ad229e7441cbe0c578865032");
   399         -  FeedZipHtml(zip_buf, 4375,
   400         -              "d06192c13c8ed5e08e519d98ea51ec0d3b1dcb830ff8b1e5dc");
   401         -  FeedZipHtml(zip_buf, 4400,
   402         -              "9445b2dd3dca4dbb2d99614392a99b4ae377a76b7b9982bf2e");
   403         -  FeedZipHtml(zip_buf, 4425,
   404         -              "16d2a80b6d31a6b730a094e73f2f5e35d4cdf5308c85eaccf6");
   405         -  FeedZipHtml(zip_buf, 4450,
   406         -              "e94d46a7a87155e48cea809df1f2c893de49378053c4da26ee");
   407         -  FeedZipHtml(zip_buf, 4475,
   408         -              "9b9be5f880692cf8805f178e8f19b0b1245c24ae0d17f0ebc2");
   409         -  FeedZipHtml(zip_buf, 4500,
   410         -              "719120804152131daab78991aa4559de48d0cf2de7b67459ab");
   411         -  FeedZipHtml(zip_buf, 4525,
   412         -              "8b5cf238f282ae37863d484bae1d13b71b929c60d6b93dcf0d");
   413         -  FeedZipHtml(zip_buf, 4550,
   414         -              "b4b79dce31a069753464721db25346deab92c1d813a08447c8");
   415         -  FeedZipHtml(zip_buf, 4575,
   416         -              "3dd8e53f13b7872f70d427ecc05f77f0ecc59b820eb13419e7");
   417         -  FeedZipHtml(zip_buf, 4600,
   418         -              "0b00b236f69828f06ffee7d78a7029e1f9c8a2f87fe9fd6921");
   419         -  FeedZipHtml(zip_buf, 4625,
   420         -              "660a1ae6e5291d1ccb832f9435e3119a1eb8c1ca5053c60f4a");
   421         -  FeedZipHtml(zip_buf, 4650,
   422         -              "968f7b257068309d05776d2a7777c11ad7a66daf872212191d");
   423         -  FeedZipHtml(zip_buf, 4675,
   424         -              "2153ef0578d52f198cc3854a97628b6f0e93052fc5aa1eeebe");
   425         -  FeedZipHtml(zip_buf, 4700,
   426         -              "9a3d318884b01047362c58eda501ae7245b9b00ab904966309");
   427         -  FeedZipHtml(zip_buf, 4725,
   428         -              "6999e3f8666cf111df8c17ba02d3ea8081f8bc444f43b01533");
   429         -  FeedZipHtml(zip_buf, 4750,
   430         -              "0161638069b640d3f9e1c08dbc64388a5760655e9c860a8fc3");
   431         -  FeedZipHtml(zip_buf, 4775,
   432         -              "6bf68469495232ce9e230c5e943ad2b86893daff281cc85343");
   433         -  FeedZipHtml(zip_buf, 4800,
   434         -              "4bc673ab0b448d60bc29599176ed51204f28a517d37e185a1e");
   435         -  FeedZipHtml(zip_buf, 4825,
   436         -              "68d0cf0bc5a68ff93aacaa6640267d5453db1c05ca4260ec14");
   437         -  FeedZipHtml(zip_buf, 4850,
   438         -              "d77234f77eaee882485f242e0a3c6372c7ebac61807cb696e7");
   439         -  FeedZipHtml(zip_buf, 4875,
   440         -              "40eb87b9fb67ad3652550e3cc221cbc099cf578dd86e2f8da1");
   441         -  FeedZipHtml(zip_buf, 4900,
   442         -              "2a47bc15d788a9cefd5819562428a123f1841f3b7361062320");
   443         -  FeedZipHtml(zip_buf, 4925,
   444         -              "fafaf3f2ae9b6548549c2425b803886029c65e9423dcf55176");
   445         -  FeedZipHtml(zip_buf, 4950,
   446         -              "39ca1fbbc8f60df577a75a8ea18bc5ecc35f17cab9c48d5b25");
   447         -  FeedZipHtml(zip_buf, 4975,
   448         -              "fc975df4566bd6256f4d5df2e673eb9a379f2f7ed19bcf6bad");
   449         -  FeedZipHtml(zip_buf, 5000,
   450         -              "1a409975d99bcfabd77d76585cf4d961361abf995dce98c90a");
   451         -  FeedZipHtml(zip_buf, 5025,
   452         -              "48786de8de33dcd62c9085d755c458ad3893d451cd34eb2226");
   453         -  FeedZipHtml(zip_buf, 5050,
   454         -              "981959ac45cab7fadb4a5c9e2bfb2d8f3fd970cfb69934c828");
   455         -  FeedZipHtml(zip_buf, 5075,
   456         -              "7bb282b4ecbe114e69960b46f875b1671798203d58caf5b8b1");
   457         -  FeedZipHtml(zip_buf, 5100,
   458         -              "b3063a993538fc8346e989b1e00065bcc71b0abc4ecd7a12e4");
   459         -  FeedZipHtml(zip_buf, 5125,
   460         -              "e5123f37a46fc7211685b812eb4ec5baadcb5ef4aa9b3ff45c");
   461         -  FeedZipHtml(zip_buf, 5150,
   462         -              "fc27b29c7af0d7c52e053651803c0ac384d390e3bb14450a75");
   463         -  FeedZipHtml(zip_buf, 5175,
   464         -              "7f3cd51cbc487a3d7175390e2d0784b46da10b81f1279ceed8");
   465         -  FeedZipHtml(zip_buf, 5200,
   466         -              "bc88bef27486f5dc538bf84eaf59e4a2627754be626c5c2ced");
   467         -  FeedZipHtml(zip_buf, 5225,
   468         -              "5c0ac65ec272db369f5d7bc12ebb059dc77f73233ba3ca8665");
   469         -  FeedZipHtml(zip_buf, 5250,
   470         -              "7129858ce24d8b8558149f2145533657f2374570a4b14af392");
   471         -  FeedZipHtml(zip_buf, 5275,
   472         -              "1931606769d5b20c7e9e1131a552d00052ee7ae7d44c659347");
   473         -  FeedZipHtml(zip_buf, 5300,
   474         -              "7137856bb93c10c9911b27bf33f8c7b6443cf67ed6abe4b2c4");
   475         -  FeedZipHtml(zip_buf, 5325,
   476         -              "821584605839299995e5b69e6522ee91818cab678578670407");
   477         -  FeedZipHtml(zip_buf, 5350,
   478         -              "4d8c0fd36f9a3ab74cad160731acac9b270e7d8f59782eccb7");
   479         -  FeedZipHtml(zip_buf, 5375,
   480         -              "aa91e0ab1247994034949cab2242c840d53e32c75484aa5e0f");
   481         -  FeedZipHtml(zip_buf, 5400,
   482         -              "059d1ceab10c64d24cf550b933b9a9874da3e3c34468cb9ddc");
   483         -  FeedZipHtml(zip_buf, 5425,
   484         -              "78be0762b9b250e49af3d444f42e1cd131428fb212e1fb9a4a");
   485         -  FeedZipHtml(zip_buf, 5450,
   486         -              "6cdb7a5b512eaba31847d1ea212813bb3dc6221daa71e2b554");
   487         -  FeedZipHtml(zip_buf, 5475,
   488         -              "ba0a4516b0ab693a5d7dc61137093d39311e37624af1589178");
   489         -  FeedZipHtml(zip_buf, 5500,
   490         -              "43a9079aa54c821aa0ad1c5a79dbcc7812b39dcf70322604eb");
   491         -  FeedZipHtml(zip_buf, 5525,
   492         -              "eae12b54d7e94aacf3f2cad982b7b83afb4359cfe624100be5");
   493         -  FeedZipHtml(zip_buf, 5550,
   494         -              "a9e4774def11722b6f46f6e46053f7892ccaca759bbddfc341");
   495         -  FeedZipHtml(zip_buf, 5575,
   496         -              "6cf96eb108b45628b2bb9a7d77ac3af728ecbd5f3d1f559935");
   497         -  FeedZipHtml(zip_buf, 5600,
   498         -              "cfd855d20e7f1dddf5fee707180715f9fc23959e3a007e823d");
   499         -  FeedZipHtml(zip_buf, 5625,
   500         -              "4e7dc0dfd47ae2ca23124563572c7bafb165cf3fd22ccbeea9");
   501         -  FeedZipHtml(zip_buf, 5650,
   502         -              "f5542f7b176307abd6bddbd8bae71f69967577f582aa177e0c");
   503         -  FeedZipHtml(zip_buf, 5675,
   504         -              "4aa572e1c78d2d7cfe916659f8482fa87ae1683145812b1365");
   505         -  FeedZipHtml(zip_buf, 5700,
   506         -              "9db813dee7011fb66c7b2cf15e73223ff750b3e0c2cbac3150");
   507         -  FeedZipHtml(zip_buf, 5725,
   508         -              "6b04148959907318742d6fcb09278777be055728997fa4f931");
   509         -  FeedZipHtml(zip_buf, 5750,
   510         -              "e2c1c266c2c4fbd01aba8398783fb71f3b8f89f9479a1f137d");
   511         -  FeedZipHtml(zip_buf, 5775,
   512         -              "219219f0f0c98d2c99ce090f9f7a4de161fe91e6c7c32d2c6c");
   513         -  FeedZipHtml(zip_buf, 5800,
   514         -              "1686c0026c183b5ca1368e1bd31af38f343f4262b9c05975c6");
   515         -  FeedZipHtml(zip_buf, 5825,
   516         -              "7b37198696645e2c2b948ba22169b9c3587790175ade2c08d9");
   517         -  FeedZipHtml(zip_buf, 5850,
   518         -              "1dbab6ab3c362e1ac3c6fc23cd8f8b2eae6c16541c79b64a03");
   519         -  FeedZipHtml(zip_buf, 5875,
   520         -              "84096c6a0a1777196b7e6cf8306b35323eac5fac57eda91fe2");
   521         -  FeedZipHtml(zip_buf, 5900,
   522         -              "e676d5bb8c350b0e684d35b653ea57b18b7e889bdb47ef32d6");
   523         -  FeedZipHtml(zip_buf, 5925,
   524         -              "cc6b9fba8152af8a7df343dcdcce7997b1665ef9f42d93bad5");
   525         -  FeedZipHtml(zip_buf, 5950,
   526         -              "d8293fc4cded9577196b6614d4df24a97bd556f0216e6e33b8");
   527         -  FeedZipHtml(zip_buf, 5975,
   528         -              "cb5833e3a0d62e80b7d755e20f3d9a93ff3b0d36db0640ebaa");
   529         -  FeedZipHtml(zip_buf, 6000,
   530         -              "614353bf0a25003d9ad302771a6c8ef5d7b19da96315ff4397");
   531         -  FeedZipHtml(zip_buf, 6025,
   532         -              "e604e04e83cd818129327057b76b6f14a73e579b7b95ef5af6");
   533         -  FeedZipHtml(zip_buf, 6050,
   534         -              "f636f68e2f30e85dd6be6ef96130f092494f6c608405fe63e5");
   535         -  FeedZipHtml(zip_buf, 6075,
   536         -              "117962f7f630401096648bca0d06472eba258f2f5a8e5e6645");
   537         -  FeedZipHtml(zip_buf, 6100,
   538         -              "d8a642c03496a853f4efdaf0f5bb08a0caded6924f5f5661b7");
   539         -  FeedZipHtml(zip_buf, 6125,
   540         -              "0b606390557605d0ac17af705e1fcabbc1e4c2fe9c9c427eb7");
   541         -  FeedZipHtml(zip_buf, 6150,
   542         -              "226342d2442471ad34e895b705f8d8239309d58a6b580422db");
   543         -  FeedZipHtml(zip_buf, 6175,
   544         -              "92a2fb4861979cb7886fe4477103e88b890d33589b2aa7d3d6");
   545         -  FeedZipHtml(zip_buf, 6200,
   546         -              "82ff1d4962dd7dc65a34a46ca37b26d69942d75e32f41489d3");
   547         -  FeedZipHtml(zip_buf, 6225,
   548         -              "e9974092bb6a8c8e2e043e49a8b479aede3827ebeefc21bac9");
   549         -  FeedZipHtml(zip_buf, 6250,
   550         -              "63ba9b398c3f7b637b6d08ddd4a25b5c993680cb9dcf987fa0");
   551         -  FeedZipHtml(zip_buf, 6275,
   552         -              "ad8b5f50490cbc6593dfad124b50fa4be3c167d8773609ab98");
   553         -  FeedZipHtml(zip_buf, 6300,
   554         -              "9269d5794effa64c4aab24ff7ffbaf9fb736375f739f0f27bf");
   555         -  FeedZipHtml(zip_buf, 6325,
   556         -              "9e9cfe7ec2db55216db66b3cd00aaec2ae8c7a944f4028bb7a");
   557         -  FeedZipHtml(zip_buf, 6350,
   558         -              "c299d6d304c07af34bab1201c406858d3cca314fc2acf7f9f0");
   559         -  FeedZipHtml(zip_buf, 6375,
   560         -              "6cad1b8e88adf1be9e0cf4b21d3c3eebf5cb302f9b9e305f17");
   561         -  FeedZipHtml(zip_buf, 6400,
   562         -              "f3677bef9d5ed8a5612a507ee095a25c36b51cd83e06e209e1");
   563         -  FeedZipHtml(zip_buf, 6425,
   564         -              "53107e70f89e3155c5e0c1a094c1b9e909db35d9fbe4602ab6");
   565         -  FeedZipHtml(zip_buf, 6450,
   566         -              "db5ebf94b955db13beebe1bb7df87e3a7bff7b2c4af95bb53d");
   567         -  FeedZipHtml(zip_buf, 6475,
   568         -              "21bc1ec2ff7db63f9dc3f76fcad5b76a7b42783d84ef7fd40a");
   569         -  FeedZipHtml(zip_buf, 6500,
   570         -              "5ca7637a33d93ef3053ec48599c42b2ab18069d8f25f700660");
   571         -  FeedZipHtml(zip_buf, 6525,
   572         -              "83706eec5c0bacfa5449ba83715c453dd9fc44c0fa045c3b38");
   573         -  FeedZipHtml(zip_buf, 6550,
   574         -              "bb989d88e957262189bcb8e09a14fd5d744a0f0eaaed8996f5");
   575         -  FeedZipHtml(zip_buf, 6575,
   576         -              "6809f83a9bbedd9c6d95ee36dcf484eeba9bcd96f30577e8ad");
   577         -  FeedZipHtml(zip_buf, 6600,
   578         -              "e7cf9f7f9d82f803911c7b23d1068458a2d2d3c69633766ffd");
   579         -  FeedZipHtml(zip_buf, 6625,
   580         -              "904b5fe6d15fc70766c13ee600645476c3898f2907012588f7");
   581         -  FeedZipHtml(zip_buf, 6650,
   582         -              "57e42a45b837065e9fdfbbe95fc69ce26855ea03f5f31fb0e0");
   583         -  FeedZipHtml(zip_buf, 6675,
   584         -              "5ccf3fc65bb95f123014733fc55783bfdf8c7cfdab3bc6ecc1");
   585         -  FeedZipHtml(zip_buf, 6700,
   586         -              "44a00df5bb9eca6cfcd3a3e761abf9dfc73d9ac2c8034844d6");
   587         -  FeedZipHtml(zip_buf, 6725,
   588         -              "4bd44e1dae61a11d3b690295485628e4df474081358532cc30");
   589         -  FeedZipHtml(zip_buf, 6750,
   590         -              "85c1f2e531d0282914ee60bd3e335b5b7482a70a3656ff98a2");
   591         -  FeedZipHtml(zip_buf, 6775,
   592         -              "72394d317f85b7ad46a16f733c19872321d73196c53e56759d");
   593         -  FeedZipHtml(zip_buf, 6800,
   594         -              "d1ac98e030527c002b5877a82bf384bb942a912b4344025850");
   595         -  FeedZipHtml(zip_buf, 6825,
   596         -              "6533978547af87a12fe87bed5028962b84ad80472709ca676a");
   597         -  FeedZipHtml(zip_buf, 6850,
   598         -              "3dd549ad4b8a4b566e4017ff73e42569a64855753a9d29763a");
   599         -  FeedZipHtml(zip_buf, 6875,
   600         -              "de60a092ca4077ac8971bcf3f1f268ffe4a0fd0b26d3a1a5ae");
   601         -  FeedZipHtml(zip_buf, 6900,
   602         -              "82c63978b752af96a5f61c6620921b1b66672785613eb973c2");
   603         -  FeedZipHtml(zip_buf, 6925,
   604         -              "b144592fc4177640a01155510911691e55b8e84e2274ff7971");
   605         -  FeedZipHtml(zip_buf, 6950,
   606         -              "3c41bf34d36a121b85d380e49c673e53130aa9cf68aa0bf7c3");
   607         -  FeedZipHtml(zip_buf, 6975,
   608         -              "ae265294aa76582e53dc665792ab53e4acd6e6c5a22687a7af");
   609         -  FeedZipHtml(zip_buf, 7000,
   610         -              "d3cabc38d31a17e3457279f34825e726f8a1c5b28695501173");
   611         -  FeedZipHtml(zip_buf, 7025,
   612         -              "d7c00b6283939c92d4ad18625714df7c5ad48df00aa42ac27a");
   613         -  FeedZipHtml(zip_buf, 7050,
   614         -              "330197f855fb233f9ba134f49955198236f7762d53abaa1d5b");
   615         -  FeedZipHtml(zip_buf, 7075,
   616         -              "e7537d92a9872553bbe124483e04b1db17ed88d4a335715fa1");
   617         -  FeedZipHtml(zip_buf, 7100,
   618         -              "536b46ab2f4f302ee3595dcc857479fabccba427f41cb98864");
   619         -  FeedZipHtml(zip_buf, 7125,
   620         -              "ac9520617aad36ae48f427d883e660ec7b344ecf93453bf048");
   621         -  FeedZipHtml(zip_buf, 7150,
   622         -              "32f2029d621e63ad0128b370725a4910c447262aa66cccbaea");
   623         -  FeedZipHtml(zip_buf, 7175,
   624         -              "186d8a80745753b80631517e4db3b254be9c56826554d164e1");
   625         -  FeedZipHtml(zip_buf, 7200,
   626         -              "ac03f12496d0291aacbc06e91a09ca9787e9c12a30190f95e5");
   627         -  FeedZipHtml(zip_buf, 7225,
   628         -              "033fc71eb04db67a3092f66eaf8ffa25975ae3e765575a5f80");
   629         -  FeedZipHtml(zip_buf, 7250,
   630         -              "7b30bf877a2b8f2cf495b4c580df257add7bb9ed2af63a3dd8");
   631         -  FeedZipHtml(zip_buf, 7275,
   632         -              "4505000ac1e36c6895bd9584e22740ee095dd0544331ed353b");
   633         -  FeedZipHtml(zip_buf, 7300,
   634         -              "e0030dc64a0f87a553c5614d3dfd2cc86d4e8a4b298e0fec10");
   635         -  FeedZipHtml(zip_buf, 7325,
   636         -              "764c84951dc075ce4e0f4fdae9ebd2821d18893157684a0b4a");
   637         -  FeedZipHtml(zip_buf, 7350,
   638         -              "5d503c00463c2881c70a387c95ab1d0a00378ce862f56a849b");
   639         -  FeedZipHtml(zip_buf, 7375,
   640         -              "665499c5c9cee36396922eab15892a4715ae830d32c6d360f2");
   641         -  FeedZipHtml(zip_buf, 7400,
   642         -              "13a70e56f5c749fe271e080c6c63b8c7d1824a75e845fb523e");
   643         -  FeedZipHtml(zip_buf, 7425,
   644         -              "df2de45e912df326a75a02b5a886e62d9e81e063375e233ba4");
   645         -  FeedZipHtml(zip_buf, 7450,
   646         -              "cf99238fdd6f82e1cfa6b8cf6ecc6a4fa6e2a9f8c499fd41ea");
   647         -  FeedZipHtml(zip_buf, 7475,
   648         -              "24e5a9c4f669392fccf83e4991b3529921450351446f0adf9c");
   649         -  FeedZipHtml(zip_buf, 7500,
   650         -              "f8e54325960fb43ccdfeba145999414a58aca41642246296e2");
   651         -  FeedZipHtml(zip_buf, 7525,
   652         -              "1b87928a7dcd849f4cc5e5e70a647e9e1b9bce9f7f294c7fb6");
   653         -  FeedZipHtml(zip_buf, 7550,
   654         -              "e0daf9730e6c1f5760fb787e6c8ffe52d83eb6617b340f6f57");
   655         -  FeedZipHtml(zip_buf, 7575,
   656         -              "a1fbf31df03d8dbbcbe9f1b828f1d94a8a3f6725c6118c60a7");
   657         -  FeedZipHtml(zip_buf, 7600,
   658         -              "04b6c0313dd9c4b513594c0400aec6c996bd49e20b07e0e8bd");
   659         -  FeedZipHtml(zip_buf, 7625,
   660         -              "85622e9d661624c662401b9f2a13c8056261b57400e09c9fb0");
   661         -  FeedZipHtml(zip_buf, 7650,
   662         -              "4042cd5453252d5184a943033a0da0f17e27cca37dfd68f06b");
   663         -  FeedZipHtml(zip_buf, 7675,
   664         -              "a011ab9ea539b808fad8416f0931e400cc182c18458daaf0cd");
   665         -  FeedZipHtml(zip_buf, 7700,
   666         -              "0c29b7ee9716c7133ff16cb2d0a372e63280f25d5a6ff02f48");
   667         -  FeedZipHtml(zip_buf, 7725,
   668         -              "abd7940340adf7adae6be8a08d8a05dd30a99e90b9d1d1f781");
   669         -  FeedZipHtml(zip_buf, 7750,
   670         -              "b45baf344bc1bcf57c37d2c958e1736f824e833010ab60e427");
   671         -  FeedZipHtml(zip_buf, 7775,
   672         -              "ec1c08b9d808a57246dd068b6be18940b3cb8ae697d7701e48");
   673         -  FeedZipHtml(zip_buf, 7800,
   674         -              "892597903a91940f61bd117e2a758d65996cd78bba36af68da");
   675         -  FeedZipHtml(zip_buf, 7825,
   676         -              "d672ba55db5e779a8d8cb90c27f1ac1b1cfd3ed56f1627625c");
   677         -  FeedZipHtml(zip_buf, 7850,
   678         -              "3af2576719bb643638bceb8778d3717478b27fd13e3f3c3970");
   679         -  FeedZipHtml(zip_buf, 7875,
   680         -              "dcf1380a6fbc51eaeb61b49a1b25e671b8415412cb5211d6ce");
   681         -  FeedZipHtml(zip_buf, 7900,
   682         -              "36e32dbd8b9a860b7408712156d7cfe4e44524b12cf41d7404");
   683         -  FeedZipHtml(zip_buf, 7925,
   684         -              "b14b8aa78f9d6178ad3c9e24688adde8b52355204c4b417601");
   685         -  FeedZipHtml(zip_buf, 7950,
   686         -              "f2c9a80f9c063287dcccf523d52758811165ec3633ab4cfe5b");
   687         -  FeedZipHtml(zip_buf, 7975,
   688         -              "7f1124b25d2f29d4df2c5c98f2f472cac936e6f39e1813ce2c");
   689         -  FeedZipHtml(zip_buf, 8000,
   690         -              "0cfbbeef8de31269908d7715879b4bf7c62b1707b023ab3b7c");
   691         -  FeedZipHtml(zip_buf, 8025,
   692         -              "7ff222113f556018b30a810f4a70042fe12f28323b51d72e2e");
   693         -  FeedZipHtml(zip_buf, 8050,
   694         -              "d0b0e09da316bf6365edf201e2242c9787bf96a44ddd922668");
   695         -  FeedZipHtml(zip_buf, 8075,
   696         -              "ec00d566d8985eab425c3fc59408508cbc048d2dc5ddd99188");
   697         -  FeedZipHtml(zip_buf, 8100,
   698         -              "188c7339dc00eb72cb87367c2f3533e73fed7877dff112af5b");
   699         -  FeedZipHtml(zip_buf, 8125,
   700         -              "2ac64687fbdef99ee4bd31795754ad25efc57df5af2ff77fdd");
   701         -  FeedZipHtml(zip_buf, 8150,
   702         -              "0d5ba9fa0b386bda6a7715fb3c6de30f48accf4e8f3e1d9c9e");
   703         -  FeedZipHtml(zip_buf, 8175,
   704         -              "54ede14cb5a76dfc3bdcc6ab843adbe76933af9cf9d148bdde");
   705         -  FeedZipHtml(zip_buf, 8200,
   706         -              "c96b4afdd366fe57927bbd512791677b0150ecd3cc667eb959");
   707         -  FeedZipHtml(zip_buf, 8225,
   708         -              "3186ecb2f524fb4bdbf189b4c047be07c2cbb29a5c8728d4b1");
   709         -  FeedZipHtml(zip_buf, 8250,
   710         -              "130fdd485f3062880ee6408e04ddce766ff4c30956135fa7e2");
   711         -  FeedZipHtml(zip_buf, 8275,
   712         -              "072f3e86ee158ed8f3fab4a52644728f4654fca1c755dc40a3");
   713         -  FeedZipHtml(zip_buf, 8300,
   714         -              "fff575cda3b534b2f78f17549ae820f22c19acd2b6f40e7227");
   715         -  FeedZipHtml(zip_buf, 8325,
   716         -              "12ae9fbb7e8cbd3fcbd3efa02c62446b5e4657a1258cbc8117");
   717         -  FeedZipHtml(zip_buf, 8350,
   718         -              "d8af99cb24b06e74f845fbf241c23f8f0629ade4b1ad95c700");
   719         -  FeedZipHtml(zip_buf, 8375,
   720         -              "564921c05c6aaa0b5b61ecb4a4fcd2ded81b0899d79f0a9479");
   721         -  FeedZipHtml(zip_buf, 8400,
   722         -              "dbb86c046945ae585044308632cb4ff8de52415f9f69a56075");
   723         -  FeedZipHtml(zip_buf, 8425,
   724         -              "1d7c908693e91b4d7d2dccc1d64914fa32925ec64623a65905");
   725         -  FeedZipHtml(zip_buf, 8450,
   726         -              "24a0ea3a98838f5e0dbc9a9e9767e2cb8069c28def6da320e3");
   727         -  FeedZipHtml(zip_buf, 8475,
   728         -              "ab05599391a8c24f104848bbee24061545418c7857cbb7d71e");
   729         -  FeedZipHtml(zip_buf, 8500,
   730         -              "bf5a93e1dde9bba20ddfcb0d0f4363dd471ab6a5c493c65fb1");
   731         -  FeedZipHtml(zip_buf, 8525,
   732         -              "4f7016fab78330a839bc845e55369c06bd0e7fb40f3d157b1b");
   733         -  FeedZipHtml(zip_buf, 8550,
   734         -              "88be69bd0e39145f6b56989c458049a6f46c2b1f24cf77fb2b");
   735         -  FeedZipHtml(zip_buf, 8575,
   736         -              "5cd6223114af7ea3d27abefa7c4532310b9552a46e1cc3a8e6");
   737         -  FeedZipHtml(zip_buf, 8600,
   738         -              "6b8b3b5c9b97ebc13696701be0266bd785d9f607a44f66d087");
   739         -  FeedZipHtml(zip_buf, 8625,
   740         -              "0f760d0bd689895ef7935e7cd28b4f7a7116bdf88bb87107b8");
   741         -  FeedZipHtml(zip_buf, 8650,
   742         -              "28bb5acc343f208d3283567ca84b58b0521caa653fe9c4279d");
   743         -  FeedZipHtml(zip_buf, 8675,
   744         -              "f8a41367d189eff0ddd771c7e27e572d2de7a6ca71765bd1c8");
   745         -  FeedZipHtml(zip_buf, 8700,
   746         -              "4ef72a9fda6d79e33d3e22a037009bb0347e01805e68fa690b");
   747         -  FeedZipHtml(zip_buf, 8725,
   748         -              "e0953f45298598d832e4d7eb61687cff966282b1de820e907f");
   749         -  FeedZipHtml(zip_buf, 8750,
   750         -              "fd23517da6070ac7efce1d7ef107f43407aba627076b965355");
   751         -  FeedZipHtml(zip_buf, 8775,
   752         -              "b7dfed21d97c41b24b23a07a2986c1ca195291cb8b464325ed");
   753         -  FeedZipHtml(zip_buf, 8800,
   754         -              "92fbcb2785cde5ccb3f78c77255b57062b97106cff2611b6c7");
   755         -  FeedZipHtml(zip_buf, 8825,
   756         -              "7efc7bba87dbde2d2c1083e91e9b7b9c5c5c6d07b40ca563e8");
   757         -  FeedZipHtml(zip_buf, 8850,
   758         -              "8437fc321b340f8648e2b373f41d0262cd32e2772f95de0e0f");
   759         -  FeedZipHtml(zip_buf, 8875,
   760         -              "76ce2d19b7f9f76a9c95e40dba3bc6002e9c57e53030f7028d");
   761         -  FeedZipHtml(zip_buf, 8900,
   762         -              "32f5b6d6c87a4eda4527fe361e1badbc9eba2f153362bc719d");
   763         -  FeedZipHtml(zip_buf, 8925,
   764         -              "6124fa6f9f0d93641cbfdad8b8bebe5e1fb89ebb36f0e2752f");
   765         -  FeedZipHtml(zip_buf, 8950,
   766         -              "d9e8e39b5f1ff6c64e3c7631b50026dbb8f6be79ff87deaf23");
   767         -  FeedZipHtml(zip_buf, 8975,
   768         -              "fec0e422ecbab8b50917b69f1890c1e9a3ba68141633d5d431");
   769         -  FeedZipHtml(zip_buf, 9000,
   770         -              "511bdcb4103eab76930d2d86f38d2df3c90265062f24941d97");
   771         -  FeedZipHtml(zip_buf, 9025,
   772         -              "553a2603c864af00a91dbdaf7f9c53d7e479414fb174fa0009");
   773         -  FeedZipHtml(zip_buf, 9050,
   774         -              "8ebde0a3e56a8f1bec125aa77802020ae79cf90659888644bc");
   775         -  FeedZipHtml(zip_buf, 9075,
   776         -              "dfaca572cb8fc93da90b80ef80403fd1531e5ff413aab88b09");
   777         -  FeedZipHtml(zip_buf, 9100,
   778         -              "29f8d1386ac85e0e5427988c3a22ba23d14c083cca10a5394f");
   779         -  FeedZipHtml(zip_buf, 9125,
   780         -              "9f6baac9f7a98c7c9f9a20df1c832c8c7cb7f5c8175e8be8d1");
   781         -  FeedZipHtml(zip_buf, 9150,
   782         -              "d0cfbd29113f68b83bfde61ae49ec50f8e57c3c7237fee4d89");
   783         -  FeedZipHtml(zip_buf, 9175,
   784         -              "fc414313f47b7cf237198f1f8bfc798125e104ebbdcf0f08ef");
   785         -  FeedZipHtml(zip_buf, 9200,
   786         -              "94126a32723e9bf8675f4b9e0af78a69999dd2ec3874a9aafc");
   787         -  FeedZipHtml(zip_buf, 9225,
   788         -              "67a7e7c17138aeccf905dc5e420e687848e4706fbe0b727881");
   789         -  FeedZipHtml(zip_buf, 9250,
   790         -              "2563054bc7f1432287948ee3474b8ee39ad251420e687848e4");
   791         -  FeedZipHtml(zip_buf, 9275,
   792         -              "90d2f11726c79d73cf6d72eeb96c1925cc8097441399a6a0e8");
   793         -  FeedZipHtml(zip_buf, 9300,
   794         -              "cf619f9797c4ceefc2f7d7be05e1754069929d7375d674d92b");
   795         -  FeedZipHtml(zip_buf, 9325,
   796         -              "f394942e0a478899f26c74d8da72aebf2539e7c34cbe509d2e");
   797         -  FeedZipHtml(zip_buf, 9350,
   798         -              "11a4b0d1816713c78f77165fcd7ab5f92eb1f15d89e602ecfc");
   799         -  FeedZipHtml(zip_buf, 9375,
   800         -              "fe6bbb1d02cb5b15986ab4a16d29ce20987be39894ab8325ac");
   801         -  FeedZipHtml(zip_buf, 9400,
   802         -              "7ccf0d124ad12133d0010094848ec497c09289e87274d7e95a");
   803         -  FeedZipHtml(zip_buf, 9425,
   804         -              "a6a92df59f2d33080e0b7cf2f6b9764f71020fe9a52adf20e8");
   805         -  FeedZipHtml(zip_buf, 9450,
   806         -              "62a39cf333cd846a4e14321b9bca6bbc1cf3373df67df2bf84");
   807         -  FeedZipHtml(zip_buf, 9475,
   808         -              "a204c978099bc131e82df933afb49c00e6a784a3f4a3191195");
   809         -  FeedZipHtml(zip_buf, 9500,
   810         -              "e6bc295062f1931497bad0c52c70aafbe43213945279f66f2d");
   811         -  FeedZipHtml(zip_buf, 9525,
   812         -              "ac266fe9ab043dfd4eca227d31b334ca688082ac2f6ef8dcda");
   813         -  FeedZipHtml(zip_buf, 9550,
   814         -              "16047df333dcafbe9270949d1b8afb0233521a9651ce4bc745");
   815         -  FeedZipHtml(zip_buf, 9575,
   816         -              "cd6ee4989a0d616618488e2acb98a6b8dcc52d67b153dd27b7");
   817         -  FeedZipHtml(zip_buf, 9600,
   818         -              "99a094315cc91ea98398a66d94c7854d2cf7e93ce8abd86696");
   819         -  FeedZipHtml(zip_buf, 9625,
   820         -              "3a5f091696b1cca5ce7cef4c5a63873d2ed962cd68b84add98");
   821         -  FeedZipHtml(zip_buf, 9650,
   822         -              "db09cdefe61371fba6b5a4996ccb5eecba9631e1bd33e2b40d");
   823         -  FeedZipHtml(zip_buf, 9675,
   824         -              "1a4f90bba1ef5b18511d7bb199934f567b36cc610891c501e6");
   825         -  FeedZipHtml(zip_buf, 9700,
   826         -              "744ba403583d1fcb9fb81c354b5df83d80709f0c6d03a984ad");
   827         -  FeedZipHtml(zip_buf, 9725,
   828         -              "dff50ada351be0d8b36b353f4de8da8cc9bfd08916438cf290");
   829         -  FeedZipHtml(zip_buf, 9750,
   830         -              "fadda2e52f1d74582921ea7849844962bb29cf857d9507315d");
   831         -  FeedZipHtml(zip_buf, 9775,
   832         -              "70ccaef7fcae4f4ebd28e3d45b97deeb08c3c96381c567620a");
   833         -  FeedZipHtml(zip_buf, 9800,
   834         -              "2927471505a9e2a385d68a7e922da1f2fe14fc63058314f7df");
   835         -  FeedZipHtml(zip_buf, 9825,
   836         -              "1c87946c7c7353ae72375ac274f7c92d993df511b2cc9d2f5d");
   837         -  FeedZipHtml(zip_buf, 9850,
   838         -              "b61abb7479c799989fae5d2cd72ebffffaaefcd6051a51ac3a");
   839         -  FeedZipHtml(zip_buf, 9875,
   840         -              "fa0e0e388491d9cce54b93e33ffc3b988e9d0dab6e61de55dd");
   841         -  FeedZipHtml(zip_buf, 9900,
   842         -              "c2bcd3b73065087c34b7318a0befff32c62a0f662be15b7b85");
   843         -  FeedZipHtml(zip_buf, 9925,
   844         -              "66e0d6295731cd0cfdf06f6214826d173156e41b1f1282b26e");
   845         -  FeedZipHtml(zip_buf, 9950,
   846         -              "8f19b054e31a666173d8fd380b5bcb02a77a24b7305936339c");
   847         -  FeedZipHtml(zip_buf, 9975,
   848         -              "162502aebf9242a87d19338961f515cc0246cf2e6c41b0373e");
   849         -  FeedZipHtml(zip_buf, 10000,
   850         -              "c1e3b87fc9b250f692c0ca45c705659ebd4298015bb52e5f16");
   851         -  FeedZipHtml(zip_buf, 10025,
   852         -              "364b61ad4d4e5372edd2f4621e801fb1d6ad8b85cb6a6c8ac7");
   853         -  FeedZipHtml(zip_buf, 10050,
   854         -              "f91dcb7223302beeea5cb92c613a3b0a96b1c8654e7cefec39");
   855         -  FeedZipHtml(zip_buf, 10075,
   856         -              "cb7d8b551356efa8c7f94d2f7f4730bb644fb96c59e8449635");
   857         -  FeedZipHtml(zip_buf, 10100,
   858         -              "2f76554b98efde5970969b962c0bda5df9a5be0c6390cc7139");
   859         -  FeedZipHtml(zip_buf, 10125,
   860         -              "ebea9fc3f350f39a6569f396e265a9cb5e3e048fee8ec5caaa");
   861         -  FeedZipHtml(zip_buf, 10150,
   862         -              "99e654dcb3feec066cfa45cef397ba60911ebbfbb862296110");
   863         -  FeedZipHtml(zip_buf, 10175,
   864         -              "fb6e3737e5ea5eb02c68b6bfdefdca3239e6ce372c2f6c372c");
   865         -  FeedZipHtml(zip_buf, 10200,
   866         -              "612771bd406541c83f5dd9987aafc2a95ff21ef1effcb66527");
   867         -  FeedZipHtml(zip_buf, 10225,
   868         -              "b65f99f2efb513ab98d239e3a7cbde21f971576c65a2a8de0d");
   869         -  FeedZipHtml(zip_buf, 10250,
   870         -              "c84efcfbaf6d1bcee0e79275a3064a5fa665d5509a426f61a9");
   871         -  FeedZipHtml(zip_buf, 10275,
   872         -              "6a6658349052de4dc8b778a856ba09a5cc0b400e476e90385b");
   873         -  FeedZipHtml(zip_buf, 10300,
   874         -              "7b0ea1a014414af91671c42dd5ec91aaee1c67cdf8f103e1ad");
   875         -  FeedZipHtml(zip_buf, 10325,
   876         -              "7736ddbb20cd39f2e26e5e7bc693f1388ce8665adc84588623");
   877         -  FeedZipHtml(zip_buf, 10350,
   878         -              "d58244d124feeed5e0c56f07366e859f2b243a123ee52ccc0b");
   879         -  FeedZipHtml(zip_buf, 10375,
   880         -              "f414695faebcc3129c2f3859d7f55d7c21fb1bd7603988dcf1");
   881         -  FeedZipHtml(zip_buf, 10400,
   882         -              "d0ebc66c09d5567dbf8e7c1ba2e0e7a6549fca16260745cece");
   883         -  FeedZipHtml(zip_buf, 10425,
   884         -              "f658c5144addc81b1763e156ef55fd22419e6d9f9d9ffe7bfd");
   885         -  FeedZipHtml(zip_buf, 10450,
   886         -              "6539417e3d3e2282fc2a6e8721d0e3d88dbe4dc6ce11a67976");
   887         -  FeedZipHtml(zip_buf, 10475,
   888         -              "07c24a0f8513cc3adaf7a23821c1e517cbf2467b200211e11b");
   889         -  FeedZipHtml(zip_buf, 10500,
   890         -              "699c63a0eedd852f307de02b2eac214087f78c4ff5372e5f91");
   891         -  FeedZipHtml(zip_buf, 10525,
   892         -              "8b84c1c37453c96da5ff03ad6f2b2f188d2d07fec70c0158ea");
   893         -  FeedZipHtml(zip_buf, 10550,
   894         -              "83cc9a8110b8deb2d0871f0aec7f6067ff8345b03f0d8ad5e0");
   895         -  FeedZipHtml(zip_buf, 10575,
   896         -              "8b5fde2f9fd7513b0792cb01be016a9adb99f8fc901ed4abb5");
   897         -  FeedZipHtml(zip_buf, 10600,
   898         -              "bf755ed00a92219c8470e017eb371844a1d8b7b7ea84306774");
   899         -  FeedZipHtml(zip_buf, 10625,
   900         -              "edc5ccfee124c1f483bcb9e977fdf8e5d6facd54b6867ee56c");
   901         -  FeedZipHtml(zip_buf, 10650,
   902         -              "0d8d40e987cfd607b3b1b508ff7d717a62656d6e9a87bdb191");
   903         -  FeedZipHtml(zip_buf, 10675,
   904         -              "73e8c6f7bd0bca55645812d0f66ff7cabda0adc439650c9e84");
   905         -  FeedZipHtml(zip_buf, 10700,
   906         -              "0a5b16f654d6280c22d7458be9e2019d227968ae3e9cd0c36b");
   907         -  FeedZipHtml(zip_buf, 10725,
   908         -              "34b738ffe52bfe46e76da6a4ca9d6d8e050a428d22844da6fe");
   909         -  FeedZipHtml(zip_buf, 10750,
   910         -              "a5d98d64c9f213ca4fabd7f24ee6e17c17de14bb6e65baee9e");
   911         -  FeedZipHtml(zip_buf, 10775,
   912         -              "5fd0f0f1100c41a5534a2679415f1a833b7f77f8bb5dcc1299");
   913         -  FeedZipHtml(zip_buf, 10800,
   914         -              "effed23a11a6bb9c32cf3f2cf3d06799692861f374912de3df");
   915         -  FeedZipHtml(zip_buf, 10825,
   916         -              "5c07e262fcc783175f89cffa22bc6ff5ccf1eff79421d51440");
   917         -  FeedZipHtml(zip_buf, 10850,
   918         -              "04833883f2dcf6448f4e48ceafc609c926724eeb2c8c9383c3");
   919         -  FeedZipHtml(zip_buf, 10875,
   920         -              "0b3250e0a78ee78369b2329523ece8305b5b8ec845283e4446");
   921         -  FeedZipHtml(zip_buf, 10900,
   922         -              "20bccdc40556d7c47eb96f62c95cd02ee502764535cb031664");
   923         -  FeedZipHtml(zip_buf, 10925,
   924         -              "98adc403c923e081f60c3cf0fee0bd8d05e0e7120e58c54445");
   925         -  FeedZipHtml(zip_buf, 10950,
   926         -              "852dbada9fd22c5f006cc416eff74ed3c44ad26ff29eacb869");
   927         -  FeedZipHtml(zip_buf, 10975,
   928         -              "fb31ae20bf19870125f99e794ffef829cddc54b6097ffcf4b9");
   929         -  FeedZipHtml(zip_buf, 11000,
   930         -              "aad396ec745cd5e9851ac9daabdece6725b6d1d872fa837ed3");
   931         -  FeedZipHtml(zip_buf, 11025,
   932         -              "71ec4be37ce48bd9c2d377e276c946d89eba11628fb58e1f76");
   933         -  FeedZipHtml(zip_buf, 11050,
   934         -              "32ae478ce9aefcdab0802f6f6e73c85ce0d099d63f4bc477f9");
   935         -  FeedZipHtml(zip_buf, 11075,
   936         -              "139b8da3c701d52a9c1193e1a52a91f3a801964d1d4cce5f67");
   937         -  FeedZipHtml(zip_buf, 11100,
   938         -              "2df3c8755fbabacedbedd3b3d372b5de56465fdb0b6e6734f8");
   939         -  FeedZipHtml(zip_buf, 11125,
   940         -              "368edd71e07dcbedf916b59da9d4a26ab3c4785b69e25e5f61");
   941         -  FeedZipHtml(zip_buf, 11150,
   942         -              "1a28374b4e1bc896455eb8742a192949286bb9dca665567bf0");
   943         -  FeedZipHtml(zip_buf, 11175,
   944         -              "f70866ec79030f73d40ec389df433703ad26ba123d06d19eab");
   945         -  FeedZipHtml(zip_buf, 11200,
   946         -              "ddc869d8c2e39288e3cc88b080b778f502e72111110eb09aac");
   947         -  FeedZipHtml(zip_buf, 11225,
   948         -              "3c4cadac63859a42851927539c47bd3289a98aebe7fdf3535a");
   949         -  FeedZipHtml(zip_buf, 11250,
   950         -              "570b0e9cb9895c50c2bebfb29edba0caf1aa79cf44a0e63a8d");
   951         -  FeedZipHtml(zip_buf, 11275,
   952         -              "3eb9f5e2557218fac2951581b056520b8b3a9c7fd8a75ff8d5");
   953         -  FeedZipHtml(zip_buf, 11300,
   954         -              "cdfb9da30bfa7b8546445ce135f715576ba2124a9867114664");
   955         -  FeedZipHtml(zip_buf, 11325,
   956         -              "1089b7b49f53a2df0bba3e96558021113d5436c80474031ae8");
   957         -  FeedZipHtml(zip_buf, 11350,
   958         -              "c777ef4e295ff62c98bc8d3370aecfba55db3726b3b5e524f9");
   959         -  FeedZipHtml(zip_buf, 11375,
   960         -              "475347a7efaaf7ea46eb6f950975cdedba5df7b072e78bae97");
   961         -  FeedZipHtml(zip_buf, 11400,
   962         -              "f94b2eac6c8c9c95a2e1bbbed1da4bedc93cc3e9a66a63c860");
   963         -  FeedZipHtml(zip_buf, 11425,
   964         -              "b2cc2dec1c9fdfe73dac36ac953acab32fec9743af3b442127");
   965         -  FeedZipHtml(zip_buf, 11450,
   966         -              "2d4c4e6650134012d07ba0f9b3a3301ee4588616076eee9617");
   967         -  FeedZipHtml(zip_buf, 11475,
   968         -              "fdd9c58e1534c9b63f80837aba60ac54e73b93382d5f575000");
   969         -  FeedZipHtml(zip_buf, 11500,
   970         -              "6efc4a7bee7ff80996fb9172d9ffb4eaf01f9f337fd193cc9f");
   971         -  FeedZipHtml(zip_buf, 11525,
   972         -              "10c5b2957f28c5ddc91e1ded2c4f4da9653e366c165b9c6a18");
   973         -  FeedZipHtml(zip_buf, 11550,
   974         -              "394ce32d9e0165eabc48f6c90b634f7c5919957718bfd8b3e2");
   975         -  FeedZipHtml(zip_buf, 11575,
   976         -              "051bee0b2dbb43d1fd16db3222231e3209c3eb9459c4fff0d2");
   977         -  FeedZipHtml(zip_buf, 11600,
   978         -              "53258646150f922ae1675b17f624d9ccdb3590619342c6d0c2");
   979         -  FeedZipHtml(zip_buf, 11625,
   980         -              "58759ed3bf69db5e756a4d88f6c71a0ff1e1e4d793d3df4f72");
   981         -  FeedZipHtml(zip_buf, 11650,
   982         -              "d61b15ad577b0f181d576157c698d15f941f5a5b4ce58f7b0f");
   983         -  FeedZipHtml(zip_buf, 11675,
   984         -              "e363e1c61354fc7632aae67b2566192d8f9f689933f2903058");
   985         -  FeedZipHtml(zip_buf, 11700,
   986         -              "0ad46ee4a9d6b9a2eae61ae03ef75d0adb90dba407c6a31b24");
   987         -  FeedZipHtml(zip_buf, 11725,
   988         -              "1e859fc4934e22cba56a4317fecd9b3015d02b284bb4bf9d91");
   989         -  FeedZipHtml(zip_buf, 11750,
   990         -              "401dbbcae1ad531e08a1a16c1129f8753e9b67b62fef13ed17");
   991         -  FeedZipHtml(zip_buf, 11775,
   992         -              "5ce40d8cf0be8844d0855f6ee3448c1c3839e80a85c520d832");
   993         -  FeedZipHtml(zip_buf, 11800,
   994         -              "3c8aa40495dc50eaf5b09c5496e054ec810d4da18ab148ee80");
   995         -  FeedZipHtml(zip_buf, 11825,
   996         -              "0ee74bc015dcc23f64a03532e078ecc3e9f06bca17bf635881");
   997         -  FeedZipHtml(zip_buf, 11850,
   998         -              "2e9b18886bc3730da7366d5ef2568e15067867b7a815b237b1");
   999         -  FeedZipHtml(zip_buf, 11875,
  1000         -              "e25ae566b13f1a2796984ad9301f67cffcf1b299bbc90d03f7");
  1001         -  FeedZipHtml(zip_buf, 11900,
  1002         -              "82bffdd7cf5b9b9baf333b0263a3feb640d5228c3d412314e7");
  1003         -  FeedZipHtml(zip_buf, 11925,
  1004         -              "6427858dadd2096275ae10887c64d70ab25f607c97654f512d");
  1005         -  FeedZipHtml(zip_buf, 11950,
  1006         -              "f3127ed6af1743f9f247117f21cac36f14a52768fb924e0118");
  1007         -  FeedZipHtml(zip_buf, 11975,
  1008         -              "5a85a6b0d638c693560523fc864ac3c607d45011a023e2c8bb");
  1009         -  FeedZipHtml(zip_buf, 12000,
  1010         -              "ecfb2ebf8b51be383324ac9c4b9a1d7b5ebfd4e3e5107dc83b");
  1011         -  FeedZipHtml(zip_buf, 12025,
  1012         -              "d4ded07dd81d0965d96ae2c82422c1c1379d1642b8b2ca75c3");
  1013         -  FeedZipHtml(zip_buf, 12050,
  1014         -              "5dd867f09b35dffbc64ee9085db2183c1af3d8ad2b2fc45064");
  1015         -  FeedZipHtml(zip_buf, 12075,
  1016         -              "f93806adad9e1bf59cd3835d3ebfafe82038f4e4793d2ce7c9");
  1017         -  FeedZipHtml(zip_buf, 12100,
  1018         -              "756c6af3702f14b143ae52f4c6ba60d351a1d0241c039d065e");
  1019         -  FeedZipHtml(zip_buf, 12125,
  1020         -              "1720a22d6c1a039fc399c6e602c934df89e14a4ce8854cd02c");
  1021         -  FeedZipHtml(zip_buf, 12150,
  1022         -              "43674d8af6fec7b6b47491a4445e2ccf9a6a0ca093b42402aa");
  1023         -  FeedZipHtml(zip_buf, 12175,
  1024         -              "5684d4a11f5689f571a16058df3e2a2eb497629af5604da4de");
  1025         -  FeedZipHtml(zip_buf, 12200,
  1026         -              "13c0a79678dd4c7309274c61856999e41634c522d94d73558f");
  1027         -  FeedZipHtml(zip_buf, 12225,
  1028         -              "80765a93780244bfe50b132a63cdd7335d7712132f3241bce4");
  1029         -  FeedZipHtml(zip_buf, 12250,
  1030         -              "afca6064bbcb5dba8b09dde80961ddaa9014d9687d05a55a66");
  1031         -  FeedZipHtml(zip_buf, 12275,
  1032         -              "28f69e79ff3afbe7cbb6ddd491d4725b4405e3bd58facf4718");
  1033         -  FeedZipHtml(zip_buf, 12300,
  1034         -              "dd9184111ed23a725d88e6c1fc86d27e7025fcd0e685512d73");
  1035         -  FeedZipHtml(zip_buf, 12325,
  1036         -              "e27d8ecfefd3158067613718f882118b523360ef897cc5bb4e");
  1037         -  FeedZipHtml(zip_buf, 12350,
  1038         -              "de38f5d4d84bf12d9dd660f4042272c6982f2856be1c351663");
  1039         -  FeedZipHtml(zip_buf, 12375,
  1040         -              "05830cbeb48e0f4f3eae3af0bf9f56565bc73b1ff51f8efa6b");
  1041         -  FeedZipHtml(zip_buf, 12400,
  1042         -              "e723ffc51db37f61cfafe562b47f330631b73a48b9a9d409e1");
  1043         -  FeedZipHtml(zip_buf, 12425,
  1044         -              "8eb0723936d82a172ec11f3107357463da1f8bb0d342591250");
  1045         -  FeedZipHtml(zip_buf, 12450,
  1046         -              "4db2a3836e193a94cb522e956646af677a9b2d69299ffe28d5");
  1047         -  FeedZipHtml(zip_buf, 12475,
  1048         -              "568eee134a0f5572dfc26df77be342cb49c20414467aedc280");
  1049         -  FeedZipHtml(zip_buf, 12500,
  1050         -              "392d325d39088012f182819ae613da50ac7e25a244dcac5420");
  1051         -  FeedZipHtml(zip_buf, 12525,
  1052         -              "e11c5fd2db71404d0f1005045701039d108e41186c1b7918fa");
  1053         -  FeedZipHtml(zip_buf, 12550,
  1054         -              "002c80c0d11ff4410512ce05c6ef5bd4286041b6cda9099b93");
  1055         -  FeedZipHtml(zip_buf, 12575,
  1056         -              "ac9cdfed8b57dca09d6b979fc092fb8eb674b2005094803de8");
  1057         -  FeedZipHtml(zip_buf, 12600,
  1058         -              "e110edeef52a85e27f3b19b672242eb54d0123478c1f68021b");
  1059         -  FeedZipHtml(zip_buf, 12625,
  1060         -              "c469f1933d663bdd0d89e8bbf07b1888d5da7719f48565249e");
  1061         -  FeedZipHtml(zip_buf, 12650,
  1062         -              "0286aaa0e8fb30ea8aa35fcead24558df746d37f4f60019897");
  1063         -  FeedZipHtml(zip_buf, 12675,
  1064         -              "b7c37979d7382f6fc7cccb4b404a31defdbdb5c27138caf87c");
  1065         -  FeedZipHtml(zip_buf, 12700,
  1066         -              "93d00d8361a0c07fcf61328583933011aff87c6b1cdf9597d8");
  1067         -  FeedZipHtml(zip_buf, 12725,
  1068         -              "4b045d6eb9a05ffbe42f4ed80c857d4306a791a10a5fc81835");
  1069         -  FeedZipHtml(zip_buf, 12750,
  1070         -              "03d5f03f38b904a492021afe723aa44bfc4e250c185be220d6");
  1071         -  FeedZipHtml(zip_buf, 12775,
  1072         -              "6c0e56222e0096d3ed52dcc5c047ff83b3eb87dd6ff4f6ef7c");
  1073         -  FeedZipHtml(zip_buf, 12800,
  1074         -              "02e46fd14142aabc5ab365a4b7ab4753f3b1730847cdea4ee3");
  1075         -  FeedZipHtml(zip_buf, 12825,
  1076         -              "b031c186b5e2a7d38451d1b90e2f3c31432d6690b46898294a");
  1077         -  FeedZipHtml(zip_buf, 12850,
  1078         -              "293c9d3966618ac3b85a3918ed53b260a49e8405f18219c1d9");
  1079         -  FeedZipHtml(zip_buf, 12875,
  1080         -              "52cf2256c84165d20b1468983dbd5168e8424579843bc96ca2");
  1081         -  FeedZipHtml(zip_buf, 12900,
  1082         -              "ac3fa912e5b2200703253a3a9470f25ce3240893d766bfb5cd");
  1083         -  FeedZipHtml(zip_buf, 12925,
  1084         -              "fc65a0c48f27e272c97833a12d8c73ca1b1e1be991c5b50761");
  1085         -  FeedZipHtml(zip_buf, 12950,
  1086         -              "4e56b2d95c906475d86f2afffd5519b051f5319daba63364f3");
  1087         -  FeedZipHtml(zip_buf, 12975,
  1088         -              "8cf8ea6133e25d6383233176bd281f1fec26095eb6caeb1bee");
  1089         -  FeedZipHtml(zip_buf, 13000,
  1090         -              "e38c5c1f73040873d1df79e0f0851b7889f7a74865baa00672");
  1091         -  FeedZipHtml(zip_buf, 13025,
  1092         -              "3d2af480ad6161a6496b1cc6b1d7f16f579c5882689825f80a");
  1093         -  FeedZipHtml(zip_buf, 13050,
  1094         -              "659ab94201f515264bea0db4d5f8e84e223e32e045ef48c5bf");
  1095         -  FeedZipHtml(zip_buf, 13075,
  1096         -              "63643afad0e140d14de257e9d3157a63017c283081059de8bc");
  1097         -  FeedZipHtml(zip_buf, 13100,
  1098         -              "ae6058f4530ffd1e833aa362f829a6947f13506102d3717569");
  1099         -  FeedZipHtml(zip_buf, 13125,
  1100         -              "26f3e546e55384fd003fdda5a481253e8e42978742df8ce909");
  1101         -  FeedZipHtml(zip_buf, 13150,
  1102         -              "c76aef0af0d68f00028e31c38c1faafd35a9d4378c337e178a");
  1103         -  FeedZipHtml(zip_buf, 13175,
  1104         -              "17c2d2912cd38364360441cba6a73e1df958874289600cceb1");
  1105         -  FeedZipHtml(zip_buf, 13200,
  1106         -              "8883aca61e366f5dacb35e1bba57f0f98d2b93a47941d7eb09");
  1107         -  FeedZipHtml(zip_buf, 13225,
  1108         -              "f63bc6891bd1cb557e24e36d8b80c6d1e44ecfae38663b7330");
  1109         -  FeedZipHtml(zip_buf, 13250,
  1110         -              "859d498c9338bb325050740b017cd9f5dd387ee5a822313a80");
  1111         -  FeedZipHtml(zip_buf, 13275,
  1112         -              "d84cf22e7f32736a9bbd72bf4b0eeaa48953b343667f54e833");
  1113         -  FeedZipHtml(zip_buf, 13300,
  1114         -              "f3cba6cf814cfdb16e0f9a9a1215b55e7d943e17a3f04a9c4b");
  1115         -  FeedZipHtml(zip_buf, 13325,
  1116         -              "012af35ada7acdcad0e66bbf19c65b055ef245e462d499f641");
  1117         -  FeedZipHtml(zip_buf, 13350,
  1118         -              "3f16d1292aa63e7aa65127be314bafb06ca17f262b6bea760d");
  1119         -  FeedZipHtml(zip_buf, 13375,
  1120         -              "b1c5d7d3e485c6a0508ea48b354a793be6d9e45d833917f1de");
  1121         -  FeedZipHtml(zip_buf, 13400,
  1122         -              "5892d7dbfe4e24466d3399dd829fbf151fe5e1d79ad7548529");
  1123         -  FeedZipHtml(zip_buf, 13425,
  1124         -              "759983d45444dc90f8950fb4b8565dcfc38b5460527afe927d");
  1125         -  FeedZipHtml(zip_buf, 13450,
  1126         -              "f9c201061361bb5775e33cdd8c6b60ca54a65ed1a572a0dfd3");
  1127         -  FeedZipHtml(zip_buf, 13475,
  1128         -              "a14dbafe9c31235dd6f8d6929df6a42951a1a6eab44b92f3ba");
  1129         -  FeedZipHtml(zip_buf, 13500,
  1130         -              "c045148b13909a0ec480b2f11107ea29d7f3bbe89b7ce52083");
  1131         -  FeedZipHtml(zip_buf, 13525,
  1132         -              "7b33ba99b60563bdbc33e825d3b6ce14e11d04770ae82dba13");
  1133         -  FeedZipHtml(zip_buf, 13550,
  1134         -              "05856dee949d69324990eaa9bca007ff0c7057c1d7904a70c1");
  1135         -  FeedZipHtml(zip_buf, 13575,
  1136         -              "80d51908c9d1bc5eb003e6d1bb7185e2bdab6dae1eb2b275ae");
  1137         -  FeedZipHtml(zip_buf, 13600,
  1138         -              "387ecd78df9a9aecdfb921be2b71526e88e77b3c14434d5173");
  1139         -  FeedZipHtml(zip_buf, 13625,
  1140         -              "b9e6f7203d83a6cc64dadeced1e1c9fe45fbfcf0e420269d7b");
  1141         -  FeedZipHtml(zip_buf, 13650,
  1142         -              "767af4e9e0f4245ea5b8290a70894bcd8d0f41772a418a7d1e");
  1143         -  FeedZipHtml(zip_buf, 13675,
  1144         -              "08490267122c8c2a0bd1136e9ce474044578e2efb8473c2909");
  1145         -  FeedZipHtml(zip_buf, 13700,
  1146         -              "a924001fed509b2e39fd90363e103ecc0492ad65de6b2b5ec4");
  1147         -  FeedZipHtml(zip_buf, 13725,
  1148         -              "1f613f0854ee47300de4b95ed4d70f9803a8a36c849eb2116c");
  1149         -  FeedZipHtml(zip_buf, 13750,
  1150         -              "5e2a56100ec6b3f9827500e9064ccb4703cb04aa1896144f3a");
  1151         -  FeedZipHtml(zip_buf, 13775,
  1152         -              "6b038da5123dc148cf9a8936b2a43d1e106d520df940099402");
  1153         -  FeedZipHtml(zip_buf, 13800,
  1154         -              "d804950cfbdc2e39d4fc80e82377ac074a1c095d1394c99ec8");
  1155         -  FeedZipHtml(zip_buf, 13825,
  1156         -              "6cc4497b3c20fa1c7f386a1f3e340547d950466124d55b2b5e");
  1157         -  FeedZipHtml(zip_buf, 13850,
  1158         -              "698c42d3d55caedb43a3d583547829c152f09aa4da14b567f6");
  1159         -  FeedZipHtml(zip_buf, 13875,
  1160         -              "7968f47a780ad0942e82ad214af16c3957918d5c45a7d20322");
  1161         -  FeedZipHtml(zip_buf, 13900,
  1162         -              "dac1fee9f17efbfcd3eee9d1d1fe6efbf09e48973dded49191");
  1163         -  FeedZipHtml(zip_buf, 13925,
  1164         -              "4ae198d781ac0b283e200aa55bd65aeabcccaac6352323c912");
  1165         -  FeedZipHtml(zip_buf, 13950,
  1166         -              "a5309be5cd7552488baf37fa94d7abe1fd2f930d4dce6f18a0");
  1167         -  FeedZipHtml(zip_buf, 13975,
  1168         -              "7302318f4eb741a2acadb97131a3b6cac15094ec12483475f3");
  1169         -  FeedZipHtml(zip_buf, 14000,
  1170         -              "4258f3ca92e5ee824ccc32a9e4d60724553981b2cbd2fd88d1");
  1171         -  FeedZipHtml(zip_buf, 14025,
  1172         -              "1c1234ef1139c732f3cace9d0e803918e6929af90f393578fc");
  1173         -  FeedZipHtml(zip_buf, 14050,
  1174         -              "aeae324c7cbc96facb2e300fd99a9186eac96566d3279ca1cc");
  1175         -  FeedZipHtml(zip_buf, 14075,
  1176         -              "a64b3e7e7a287a4433233fb7c4abaf2f3ab9da57ce3867268e");
  1177         -  FeedZipHtml(zip_buf, 14100,
  1178         -              "ae54a0320b9b7dc59f1ffc923fcfb7e6e3f2351f3ffc351fcf");
  1179         -  FeedZipHtml(zip_buf, 14125,
  1180         -              "49e88a557ffe6b2d3b559eff3d5f1ed17f94e51195cea7ef5a");
  1181         -  FeedZipHtml(zip_buf, 14150,
  1182         -              "557e2cf2d1c79633a6d0a6337d852d037e6d6f2c33279f193f");
  1183         -  FeedZipHtml(zip_buf, 14175,
  1184         -              "9d8dd39a7a3a4b7c78b36624f654af0b9d313fd7ece580954f");
  1185         -  FeedZipHtml(zip_buf, 14200,
  1186         -              "f04aa5d2b2d17c9a1f89337e7a8f48bc6d128996bdebf3fc48");
  1187         -  FeedZipHtml(zip_buf, 14225,
  1188         -              "9cf1d37b44e29ff3205107e1e8d3418ca66a662ccc6876e57a");
  1189         -  FeedZipHtml(zip_buf, 14250,
  1190         -              "5411b214eb967de4787eaccff8e93d627dd420d6473361fdce");
  1191         -  FeedZipHtml(zip_buf, 14275,
  1192         -              "79b1ff59b69fed4ea22bd8618bcf56bf7ee79bdc05c6e8965c");
  1193         -  FeedZipHtml(zip_buf, 14300,
  1194         -              "35a56d2da78b9c4a58345957f372365fe40cdfdd139fbb92ab");
  1195         -  FeedZipHtml(zip_buf, 14325,
  1196         -              "8d836efa8c989bb0bc7ca96ed80f7a2548532db3a1acfe570f");
  1197         -  FeedZipHtml(zip_buf, 14350,
  1198         -              "0b61f41e7b0abe9c28bc66a9de7a86b83b12c120195ab2c472");
  1199         -  FeedZipHtml(zip_buf, 14375,
  1200         -              "43190a6c6a527a17f8edf19ba413f66ed56be7cce27e7edeef");
  1201         -  FeedZipHtml(zip_buf, 14400,
  1202         -              "4b85f1c30fa763111ca07ac2404a9d06337d114de199129615");
  1203         -  FeedZipHtml(zip_buf, 14425,
  1204         -              "7662752689e3d1e2fbbe87c1549c5f2d7040dbe0bb6955f3c2");
  1205         -  FeedZipHtml(zip_buf, 14450,
  1206         -              "f9266eaf41df29af87c206fc0fc3269f4967683fe7b217c409");
  1207         -  FeedZipHtml(zip_buf, 14475,
  1208         -              "d3b2da30d9096426392e85249e12757914e7bafe72fdf9faf3");
  1209         -  FeedZipHtml(zip_buf, 14500,
  1210         -              "1c62cd72bd2adad34824c05169b91bd378d50138c348a5b350");
  1211         -  FeedZipHtml(zip_buf, 14525,
  1212         -              "392c806ad9cb3c9b9c9631d42a2627bf14beef8de3d0ebe553");
  1213         -  FeedZipHtml(zip_buf, 14550,
  1214         -              "4fd5ddd11b1ffd2191d5698d64f66df4aec2515544b17c7a97");
  1215         -  FeedZipHtml(zip_buf, 14575,
  1216         -              "e6b8ca2cb42ccf95f95011bfe3250ba7854215fbe1b58856d4");
  1217         -  FeedZipHtml(zip_buf, 14600,
  1218         -              "cc699cf5683ce130632e9ca726314bdd96753e88849b38bb5e");
  1219         -  FeedZipHtml(zip_buf, 14625,
  1220         -              "975e2e8ec75178e38d284e9805b90f3a0be6e46719d9107a72");
  1221         -  FeedZipHtml(zip_buf, 14650,
  1222         -              "76ca82f1b1731406838d2337310a1dc4fc62f1da8827266b47");
  1223         -  FeedZipHtml(zip_buf, 14675,
  1224         -              "f9fac7be1bb811d5f07cb07291d7c76722f288c04595ac9b5a");
  1225         -  FeedZipHtml(zip_buf, 14700,
  1226         -              "0e15c8bb98447db75b532d8388dce5fbfb1484b1821b6521be");
  1227         -  FeedZipHtml(zip_buf, 14725,
  1228         -              "2329f53b504d47f54b8e8859ebb4106262537155086e48cd2d");
  1229         -  FeedZipHtml(zip_buf, 14750,
  1230         -              "668a0746e225abbb74f2278db70c31e1f7453d117b5da7d4fc");
  1231         -  FeedZipHtml(zip_buf, 14775,
  1232         -              "941d6637c71a761203c3e10d28a241beb2a1eb4ecee88e99e5");
  1233         -  FeedZipHtml(zip_buf, 14800,
  1234         -              "dd380ebb1ebd8d213b149fde108c9ebc7f1de812dff2958be0");
  1235         -  FeedZipHtml(zip_buf, 14825,
  1236         -              "3b557cb4897fb0cf19ab4d7b09d60be3cc4a89fa63e08b986f");
  1237         -  FeedZipHtml(zip_buf, 14850,
  1238         -              "580926cafa6326734bcd043db3969e3cfb72dded4977a8be4a");
  1239         -  FeedZipHtml(zip_buf, 14875,
  1240         -              "ab89891b1591af458e66d5be8453cdf8d6a49569fdd3cc7b88");
  1241         -  FeedZipHtml(zip_buf, 14900,
  1242         -              "57f820420244cba479e32264f2301d9338f9e2062f009845ba");
  1243         -  FeedZipHtml(zip_buf, 14925,
  1244         -              "aedf9df8fc8079553edf9bc4047a4033c27907c68e31ed2f3e");
  1245         -  FeedZipHtml(zip_buf, 14950,
  1246         -              "929d6ca3607347906be2e9c988b8114049dcf85b395b4ad18d");
  1247         -  FeedZipHtml(zip_buf, 14975,
  1248         -              "50764b59133b719f27ee6c803b3348bf2706556c59091b3e8c");
  1249         -  FeedZipHtml(zip_buf, 15000,
  1250         -              "a377893faa6d84ea73957d9bf236e3b0c0d83f9a9cfd9a60c3");
  1251         -  FeedZipHtml(zip_buf, 15025,
  1252         -              "fd413fe2ebdcc25e11392017dd6fa050713f937b4d29031fc6");
  1253         -  FeedZipHtml(zip_buf, 15050,
  1254         -              "bbf2817831cf30b794316b79d6f5fadf2ddb8078f839d75fa7");
  1255         -  FeedZipHtml(zip_buf, 15075,
  1256         -              "b834728de053cd2e42cbaff957e901ff2afe6a38ebba2bce5b");
  1257         -  FeedZipHtml(zip_buf, 15100,
  1258         -              "477ba2bae515c60fe3736bd033ff3e3bbdeb7ef544ed8a1a0c");
  1259         -  FeedZipHtml(zip_buf, 15125,
  1260         -              "366a037c309e416d83070822aecbb0eeecc87f49473965bbc7");
  1261         -  FeedZipHtml(zip_buf, 15150,
  1262         -              "678163976a0246e1643094c5fff41b6476fb51381d570de4f7");
  1263         -  FeedZipHtml(zip_buf, 15175,
  1264         -              "c6253c43bd4f037d7a281c3533edd9b3c6464d2feabc63dcd3");
  1265         -  FeedZipHtml(zip_buf, 15200,
  1266         -              "3144f95407133772e16b8ed8f53da1f4b904dd6901bb10f8e5");
  1267         -  FeedZipHtml(zip_buf, 15225,
  1268         -              "2249e54cbcbe2d618d6cb138aa2c191aec5982f547b5b2d6e1");
  1269         -  FeedZipHtml(zip_buf, 15250,
  1270         -              "1540e3934a121f8800bef6bd3f453343cf631cd520ac8c814b");
  1271         -  FeedZipHtml(zip_buf, 15275,
  1272         -              "f37eeb32cf9c752066fc789c624215e8d4060b0670df2a1f3b");
  1273         -  FeedZipHtml(zip_buf, 15300,
  1274         -              "2c64e0bbf1da99987c8373d28fae3f80c350321cb10ee2fab3");
  1275         -  FeedZipHtml(zip_buf, 15325,
  1276         -              "f0a99103c12b0f28559439933eeb3657b0a8609c7ccf7b61a4");
  1277         -  FeedZipHtml(zip_buf, 15350,
  1278         -              "c500f1e8a85f8ff89912d2b49f281a2fe2d2f5bfcb2e5df154");
  1279         -  FeedZipHtml(zip_buf, 15375,
  1280         -              "ae8a857cd797ac27935159861eddd402c51f08955e26adb132");
  1281         -  FeedZipHtml(zip_buf, 15400,
  1282         -              "cd7a9a6b807b8c2e28642d9759a94ca0ab4c889312d3e1a474");
  1283         -  FeedZipHtml(zip_buf, 15425,
  1284         -              "fdab4e905b7f0d2be26ec33d9c4b5afe81f40bada7655e71e7");
  1285         -  FeedZipHtml(zip_buf, 15450,
  1286         -              "4ab2056f37cb0d8c9d5ed98db76aa9c018e579c906bf7ca19f");
  1287         -  FeedZipHtml(zip_buf, 15475,
  1288         -              "638fecda1c3e75a9a16caa9a0c959637eba24240312d95e1cb");
  1289         -  FeedZipHtml(zip_buf, 15500,
  1290         -              "c452063d4e01444d4c229dbf93b33a19fdbdd148f4d0cfe2df");
  1291         -  FeedZipHtml(zip_buf, 15525,
  1292         -              "3a1dd147331cc8a416c7b92fff1451b8863070169d9b8ae499");
  1293         -  FeedZipHtml(zip_buf, 15550,
  1294         -              "e67f3b8eca26541c5266355a41e74340852165e222126e0db7");
  1295         -  FeedZipHtml(zip_buf, 15575,
  1296         -              "aaf0876ea2be7501f54031b3f5145e2d789cd88a0a6f51a188");
  1297         -  FeedZipHtml(zip_buf, 15600,
  1298         -              "40a61a15bdf283c885288d7711c97496b2f38e95d9a633f172");
  1299         -  FeedZipHtml(zip_buf, 15625,
  1300         -              "665c1e03839de3bb5dc50dcc096ed2185f2e84192a23a0cce6");
  1301         -  FeedZipHtml(zip_buf, 15650,
  1302         -              "d9344d2de2373bf87dd0d9831d3c5dc53d92b13c22cb685c00");
  1303         -  FeedZipHtml(zip_buf, 15675,
  1304         -              "0961e8c74f41859ffba21fe7952ca19fd138879e9c4ec4458c");
  1305         -  FeedZipHtml(zip_buf, 15700,
  1306         -              "bf4c4202f48f44e3def9a8f973d9515379cabe1881304fe1bd");
  1307         -  FeedZipHtml(zip_buf, 15725,
  1308         -              "9ded5dc06e14daeae6aa96f2c81cfbe96896efee31bca32bc1");
  1309         -  FeedZipHtml(zip_buf, 15750,
  1310         -              "a4e88e55e77ae87587cec8bd65f7ea24c19803c79eef2e1f1f");
  1311         -  FeedZipHtml(zip_buf, 15775,
  1312         -              "b51309d772ea815f678b6aca1e5f66fffc1eb1e902b41c0a65");
  1313         -  FeedZipHtml(zip_buf, 15800,
  1314         -              "d5e0258b692800a9f1d1171d7bd487fee7edf6e9d9e974842e");
  1315         -  FeedZipHtml(zip_buf, 15825,
  1316         -              "39f088e66d24e6e8620c3dee35dca88eeca62915bd082fbe23");
  1317         -  FeedZipHtml(zip_buf, 15850,
  1318         -              "2fb97db6bd9bfec1fb434139a61d1eb8904ab270e88301b673");
  1319         -  FeedZipHtml(zip_buf, 15875,
  1320         -              "88bb7c9ae59a1dc5fad5293a1b4c2f733ff48143e8a17c188d");
  1321         -  FeedZipHtml(zip_buf, 15900,
  1322         -              "608c5734039900d92ccc18a94143bf755ace4be77f3b6787f0");
  1323         -  FeedZipHtml(zip_buf, 15925,
  1324         -              "3fb00fb590b75600391bd0807feb20b715d9c1f8618591a512");
  1325         -  FeedZipHtml(zip_buf, 15950,
  1326         -              "04d03c1b6a22cbac5e221311a4798f69a7e10031a20ae731ce");
  1327         -  FeedZipHtml(zip_buf, 15975,
  1328         -              "048ed1efe427cfaed1cb94357ba5e649a7e49576b637394973");
  1329         -  FeedZipHtml(zip_buf, 16000,
  1330         -              "de51e662005f9f33e42bc672e2a13bcee65b56a35c09c0384c");
  1331         -  FeedZipHtml(zip_buf, 16025,
  1332         -              "4d43d14d31887d20e01bb4ca568cd179f0640898ec511de0f2");
  1333         -  FeedZipHtml(zip_buf, 16050,
  1334         -              "41690dd203640e9c1f8cee6701371446d2f7b11008da6e34f0");
  1335         -  FeedZipHtml(zip_buf, 16075,
  1336         -              "6bc721bdc026a11a413a76b0f636c827b4caaf10738292c966");
  1337         -  FeedZipHtml(zip_buf, 16100,
  1338         -              "333b736e876caa6799ab3bc775fa5a3953433d2524d10b3548");
  1339         -  FeedZipHtml(zip_buf, 16125,
  1340         -              "da9e3818389360e4502173357b957aaa14a08cda71e3788219");
  1341         -  FeedZipHtml(zip_buf, 16150,
  1342         -              "b28d24dbbcb2423e6a3b90c4671a0033698cb26de29ab36bcb");
  1343         -  FeedZipHtml(zip_buf, 16175,
  1344         -              "393fbd85ddadfb6ab51abac3f6bafcbd8fb396b39a723b70de");
  1345         -  FeedZipHtml(zip_buf, 16200,
  1346         -              "7294a12d5fd7041c234a85a65193701ca856196945b1e27eb9");
  1347         -  FeedZipHtml(zip_buf, 16225,
  1348         -              "b8ed524ac44c1b260653fdf4a8f6ccbb9ecafe559e45408af5");
  1349         -  FeedZipHtml(zip_buf, 16250,
  1350         -              "233c8339cd1cc054d52c7bc094d9da72c688aebc3a34fc0b17");
  1351         -  FeedZipHtml(zip_buf, 16275,
  1352         -              "76ffc5dc83dce32da03060463b785cea1a3a998c546d308d43");
  1353         -  FeedZipHtml(zip_buf, 16300,
  1354         -              "a066b1c57eb96af6a8468ef582353fc71c43f01ded7c703c88");
  1355         -  FeedZipHtml(zip_buf, 16325,
  1356         -              "7b5a2f8be4123a990bb4dcd1669a4b10507eb35ac1fd8d0e7c");
  1357         -  FeedZipHtml(zip_buf, 16350,
  1358         -              "9ff8c6d063632d5c109d2b28ebfad61e9b4f3abe84c2cf6398");
  1359         -  FeedZipHtml(zip_buf, 16375,
  1360         -              "d6ebc31f6585cdeface0379f976978b49acc249d8f50d1371a");
  1361         -  FeedZipHtml(zip_buf, 16400,
  1362         -              "e671a0abee58b551da9ccd4364a2b0963a997fa007a2527ade");
  1363         -  FeedZipHtml(zip_buf, 16425,
  1364         -              "95d7c3423b26c64a548b32cd2d6a453755a2a15cfe4b139536");
  1365         -  FeedZipHtml(zip_buf, 16450,
  1366         -              "3af03dab9542389a0cb9e9eac5c8824b198d43db3467f68b8b");
  1367         -  FeedZipHtml(zip_buf, 16475,
  1368         -              "5fdc9b2adaccaba26408c67082af1552b35a60fa2c2c6a2e4b");
  1369         -  FeedZipHtml(zip_buf, 16500,
  1370         -              "0441bf2158eace95e73ac7efcebff72480c79d681fab5c5912");
  1371         -  FeedZipHtml(zip_buf, 16525,
  1372         -              "dcc816e6facd3c2703c3e3ef5b85dfa7289abb5f8135198acf");
  1373         -  FeedZipHtml(zip_buf, 16550,
  1374         -              "cc5e1690ef34108baf82f0079b74321b6cc93289545a8c19b0");
  1375         -  FeedZipHtml(zip_buf, 16575,
  1376         -              "44d70101f6bcf80ffb4da8d1f844a04608c44e1c742248b516");
  1377         -  FeedZipHtml(zip_buf, 16600,
  1378         -              "9a44434ae14248158ec6c92d3a0faa48d70e27dda16def4fdb");
  1379         -  FeedZipHtml(zip_buf, 16625,
  1380         -              "9e08d718e1c83192469176c3d128c4fce7c9b510419e8c78ef");
  1381         -  FeedZipHtml(zip_buf, 16650,
  1382         -              "2777b14920298d7f74b0d8a2abea24ea8faaa8fc3bd552b512");
  1383         -  FeedZipHtml(zip_buf, 16675,
  1384         -              "999b9e68dc94f604d2d18b257ac848a18ed233cbfe3f266e15");
  1385         -  FeedZipHtml(zip_buf, 16700,
  1386         -              "ad4eaf44e4bb63bb48aac6277a2d4b99c254139fc5d54d6157");
  1387         -  FeedZipHtml(zip_buf, 16725,
  1388         -              "4fca78389df314fdc5e9f764e761654fafdf17546a9a2eb73a");
  1389         -  FeedZipHtml(zip_buf, 16750,
  1390         -              "215ab875c4f65081666786b4f9891de67976aa330052caf6c0");
  1391         -  FeedZipHtml(zip_buf, 16775,
  1392         -              "c3aaa5e855efc1712011af9cd9b65c3c5bd0965b4ad17d98c5");
  1393         -  FeedZipHtml(zip_buf, 16800,
  1394         -              "0fc722aea22ba556bb6a94b4663d641e3e0fc64226a933fccd");
  1395         -  FeedZipHtml(zip_buf, 16825,
  1396         -              "66e9d3a755e7b6aaf166abeacbf2c686f1f32016d0bcecf29b");
  1397         -  FeedZipHtml(zip_buf, 16850,
  1398         -              "0bbc5957594f289504268e80115d4e45475901fab2ce485e5b");
  1399         -  FeedZipHtml(zip_buf, 16875,
  1400         -              "71e95f4eb74fe3b878974d97d17c8a641d2aba78ef8b9b66e7");
  1401         -  FeedZipHtml(zip_buf, 16900,
  1402         -              "d649ae43f4b347708457857631c5f4cd26a292934ca3d0d16f");
  1403         -  FeedZipHtml(zip_buf, 16925,
  1404         -              "5b8824faad5e5ca0faef416aa64249dfbb2927da61eaeb25a0");
  1405         -  FeedZipHtml(zip_buf, 16950,
  1406         -              "ddaebc3db6ee33aaf16997b95372832984e4ada4d276dc2cb5");
  1407         -  FeedZipHtml(zip_buf, 16975,
  1408         -              "1defeea5da2af752593d53dfb9438a7c4e1671e1df1bdc4fe9");
  1409         -  FeedZipHtml(zip_buf, 17000,
  1410         -              "beb4a941971debf50804b4d20786196604fb1d4b7467b9ebab");
  1411         -  FeedZipHtml(zip_buf, 17025,
  1412         -              "41bf97c90b0b72a73d71c37c67c4dabeb652475b735e36934d");
  1413         -  FeedZipHtml(zip_buf, 17050,
  1414         -              "16e3bb7be29226bc7b4d39f6cabc7a8db9f44c865a889ff089");
  1415         -  FeedZipHtml(zip_buf, 17075,
  1416         -              "9f2af6a04a2f62295394bb0f1bf41d9a8cb12097e4136bccb7");
  1417         -  FeedZipHtml(zip_buf, 17100,
  1418         -              "21dd9bbf72370ae3d8b6c1c98686d9aeb9519fb86e215c773d");
  1419         -  FeedZipHtml(zip_buf, 17125,
  1420         -              "0c63a31c182e931343d2b0947f8d6ab7b837de6832323a6606");
  1421         -  FeedZipHtml(zip_buf, 17150,
  1422         -              "e654a6b9a979022fe8fa931e6c9672cbe58155441aae36cbb9");
  1423         -  FeedZipHtml(zip_buf, 17175,
  1424         -              "ab9583494709dd77c3a7c223cf157c0c4355707d952b7721fe");
  1425         -  FeedZipHtml(zip_buf, 17200,
  1426         -              "551d41b808c7ff13fb377a3550cbfb56ee7a6bd0ef96d19c8b");
  1427         -  FeedZipHtml(zip_buf, 17225,
  1428         -              "71e73df1ceec0ebf4a675f05c75c5162df22bfe0ef8d734b43");
  1429         -  FeedZipHtml(zip_buf, 17250,
  1430         -              "83cee3fafd5e386133cb0688f14a530b7b88de3b4b0a44ddb4");
  1431         -  FeedZipHtml(zip_buf, 17275,
  1432         -              "08366868dc274ea8e284bc4e20bce3ed580943e41f109fa397");
  1433         -  FeedZipHtml(zip_buf, 17300,
  1434         -              "de92ae16fdfda707bb4ed70dc200a35f29f6d505cc08f2e3eb");
  1435         -  FeedZipHtml(zip_buf, 17325,
  1436         -              "2b501e60563aaf3a637c731905c76e127937d85e3f25606353");
  1437         -  FeedZipHtml(zip_buf, 17350,
  1438         -              "b6c54df210362bc2f87bf50cd30bf00694ef4ef02de124c941");
  1439         -  FeedZipHtml(zip_buf, 17375,
  1440         -              "9e7ddeeb8c39f53abea98555b8ce3012fdb7cf8649328e5f6d");
  1441         -  FeedZipHtml(zip_buf, 17400,
  1442         -              "6c8860fddafbe68df125ed7a180d36f0af8dbdfdb57f1d1e3f");
  1443         -  FeedZipHtml(zip_buf, 17425,
  1444         -              "dbe6ff4bb733f4e848dbf18f4a4c54fe18d3ceb25d43399831");
  1445         -  FeedZipHtml(zip_buf, 17450,
  1446         -              "94f392e2fd31be8acc207618fabdb82c8b0f303d88c29a4520");
  1447         -  FeedZipHtml(zip_buf, 17475,
  1448         -              "9cd65918270787176bf8a679a509f9900ca918b401f62f1bf1");
  1449         -  FeedZipHtml(zip_buf, 17500,
  1450         -              "2e32dc09a292e7010d025e6b9a856f1238d3aa7cc29b67580e");
  1451         -  FeedZipHtml(zip_buf, 17525,
  1452         -              "4d883c4adbdc4b93e1bacac68f613918f6f085c5ed2b3dcacd");
  1453         -  FeedZipHtml(zip_buf, 17550,
  1454         -              "1c0446c480eb59010cc7d8069ca69ff7c292011984811e3e0d");
  1455         -  FeedZipHtml(zip_buf, 17575,
  1456         -              "1ee183719aff1d7b836f9d93b0279cf3892fe8482bf0d180e7");
  1457         -  FeedZipHtml(zip_buf, 17600,
  1458         -              "63467c14c0a17ca13c2555403e2542679be2295e39b0236c1c");
  1459         -  FeedZipHtml(zip_buf, 17625,
  1460         -              "9fee6d392dc284bcce902913e96db3f1541727371f8df7f483");
  1461         -  FeedZipHtml(zip_buf, 17650,
  1462         -              "dd49f02d08afa5ee58c93f5b87e9b678bafda037e6ebb2428f");
  1463         -  FeedZipHtml(zip_buf, 17675,
  1464         -              "17dc83d221c030889c8ade2f65ef3008cb3ba72fd67fd8c929");
  1465         -  FeedZipHtml(zip_buf, 17700,
  1466         -              "069d128ad446ae9a2255e81037988c98339cc3c2052e8d6a84");
  1467         -  FeedZipHtml(zip_buf, 17725,
  1468         -              "20cb47f81da671533200c376872d2abe98a3f9c845a748efca");
  1469         -  FeedZipHtml(zip_buf, 17750,
  1470         -              "05f61990e35f1550f7627e00e276873c2b5eb8e3af8062d099");
  1471         -  FeedZipHtml(zip_buf, 17775,
  1472         -              "68054462885e912b213d2c48a6bc8ef39258f8fd955cca6620");
  1473         -  FeedZipHtml(zip_buf, 17800,
  1474         -              "d7388c630f0388328cc9908db0be86be9bc0c09b8150cf9a34");
  1475         -  FeedZipHtml(zip_buf, 17825,
  1476         -              "b1cd07e17f4ce28412e6e757ce8b2626e98613bfc7d8c367ef");
  1477         -  FeedZipHtml(zip_buf, 17850,
  1478         -              "b8f5c947ea60c9a067456b6a80552032d1c2015011e2126cbe");
  1479         -  FeedZipHtml(zip_buf, 17875,
  1480         -              "56fe221594148e45e42a4a31782e4b150c3614eed5ad232b84");
  1481         -  FeedZipHtml(zip_buf, 17900,
  1482         -              "a8e8220fa338a919dfacaf82f06228131a56842511d1ee4c4b");
  1483         -  FeedZipHtml(zip_buf, 17925,
  1484         -              "0b43f2804ee209f5d73c708d6b4a0b0760426c2ceb62b89cb4");
  1485         -  FeedZipHtml(zip_buf, 17950,
  1486         -              "dca3b4d2db09e69bee5074bf61ed82443b61a9e4ce2afa5ec5");
  1487         -  FeedZipHtml(zip_buf, 17975,
  1488         -              "fa601d55c0e96ffbe7473b6717cee9b9d33efdb0fbcb3efdf3");
  1489         -  FeedZipHtml(zip_buf, 18000,
  1490         -              "f0a4bd7f7eb1bfdbbe40056138e57e371ece9b691bd4968ad9");
  1491         -  FeedZipHtml(zip_buf, 18025,
  1492         -              "cd6448514ad675251425a70a03f5d6b0446eef316da47ecbd8");
  1493         -  FeedZipHtml(zip_buf, 18050,
  1494         -              "5cda1e9bc512bbbb6edf979219737a379b1a2ea8ea185826ee");
  1495         -  FeedZipHtml(zip_buf, 18075,
  1496         -              "23afe73f904b303da00fd67232c86cb86e17131ff4221f1f84");
  1497         -  FeedZipHtml(zip_buf, 18100,
  1498         -              "70f7bc3821c1790a0db21fc6f62482ace121d432a7d5373507");
  1499         -  FeedZipHtml(zip_buf, 18125,
  1500         -              "d922c65fb6bbcf7815aa394d5fa7d3aac8d14aeb6849cbc44c");
  1501         -  FeedZipHtml(zip_buf, 18150,
  1502         -              "b6b27b7e8137ec09e627b36abd7991d4509eb87b98fe419370");
  1503         -  FeedZipHtml(zip_buf, 18175,
  1504         -              "a989e534387fa58296657bfb5982bc56163062b6cec88bab4e");
  1505         -  FeedZipHtml(zip_buf, 18200,
  1506         -              "e40683f202265f985763cc232459d53cf561067b1687864285");
  1507         -  FeedZipHtml(zip_buf, 18225,
  1508         -              "399fd3d9f9e9bfd75f5a39913c0aadcd15e555287025804118");
  1509         -  FeedZipHtml(zip_buf, 18250,
  1510         -              "20f810eff2872dfac1e34aea327c871371110652abff83341e");
  1511         -  FeedZipHtml(zip_buf, 18275,
  1512         -              "d5c83187119aa5f98caa7fa89fec07509c3476f05485550af9");
  1513         -  FeedZipHtml(zip_buf, 18300,
  1514         -              "204789a7648037b7e3d8b212d6d929188cb1bae5f422ae6e08");
  1515         -  FeedZipHtml(zip_buf, 18325,
  1516         -              "10bf7cb1f54fa745e50a7f3fb8f8f9e5ca2a1be9190869fc0c");
  1517         -  FeedZipHtml(zip_buf, 18350,
  1518         -              "94c037aa86a079aa399489aff81c44e9af92dcd9167166929d");
  1519         -  FeedZipHtml(zip_buf, 18375,
  1520         -              "50d775e9583089f94c0587027cd96fd280864febc5b0018dfd");
  1521         -  FeedZipHtml(zip_buf, 18400,
  1522         -              "5f518dfbec98ce5b87694466350a351c0e103fa3105fd677bb");
  1523         -  FeedZipHtml(zip_buf, 18425,
  1524         -              "93089fd573f9462e26d83376639a4b49b33edcbda21b6c9029");
  1525         -  FeedZipHtml(zip_buf, 18450,
  1526         -              "7eb8a017c7188e294df18044bdcbf50ecd21b57298300241e2");
  1527         -  FeedZipHtml(zip_buf, 18475,
  1528         -              "ddde82ccb197d6706d829294a17296f169298cbe67a32c734f");
  1529         -  FeedZipHtml(zip_buf, 18500,
  1530         -              "2ff34b97dcd443eb9c0693f99bfdb2bea1b1ef6907b7d48852");
  1531         -  FeedZipHtml(zip_buf, 18525,
  1532         -              "f142d64bf05ce738bfdb57445473f491dd68566d4d53a9d991");
  1533         -  FeedZipHtml(zip_buf, 18550,
  1534         -              "1f268db08a223ab7553c18184b3dbd6c45b43a243af81058c5");
  1535         -  FeedZipHtml(zip_buf, 18575,
  1536         -              "887f6f0081ea0ec505830226ed84bddb6da53a4dfcfdfcbcdf");
  1537         -  FeedZipHtml(zip_buf, 18600,
  1538         -              "7fa63c83a763111c78fc348d6ca3825f0f406708c9b324d338");
  1539         -  FeedZipHtml(zip_buf, 18625,
  1540         -              "52eecebeef218ff2711e36dcff39f212f2b96105b79ef34ddc");
  1541         -  FeedZipHtml(zip_buf, 18650,
  1542         -              "5e83359677a0c0ff30681b125293a31ac5c503e52864211dc2");
  1543         -  FeedZipHtml(zip_buf, 18675,
  1544         -              "dc24f7cc2cbfb37efb08f0c9e58738a1278f03189b6cbb0330");
  1545         -  FeedZipHtml(zip_buf, 18700,
  1546         -              "400668daf4f50e3dd9d6e8b461fce27654a55533cd4d2bd6c6");
  1547         -  FeedZipHtml(zip_buf, 18725,
  1548         -              "077f9894b3e8d6f87624fb576a5979fe69f9e1802e213f9e9e");
  1549         -  FeedZipHtml(zip_buf, 18750,
  1550         -              "d30dd3d8ed56544f7d37c1218bb4e4df4b046195ccd5f2b31a");
  1551         -  FeedZipHtml(zip_buf, 18775,
  1552         -              "74f8cfc4ed6169d7580c388f96e5c0564df0fb81e0e1708534");
  1553         -  FeedZipHtml(zip_buf, 18800,
  1554         -              "71f196a343a8e00269fa9c89be5abcdaa32f9547f89ad2ec12");
  1555         -  FeedZipHtml(zip_buf, 18825,
  1556         -              "6e3c9dbb4c7f423e2cb9a5614e5e36edcf458ea90c9f75e640");
  1557         -  FeedZipHtml(zip_buf, 18850,
  1558         -              "06ec92476ad673a22ed1e35cd23b4d02756633f395b948a988");
  1559         -  FeedZipHtml(zip_buf, 18875,
  1560         -              "8e807c145285d670052f9e97b9dc38e2f14adcfc32f12de9bc");
  1561         -  FeedZipHtml(zip_buf, 18900,
  1562         -              "d2b6393782b9067838dc93d129b41467086b51245ed469b233");
  1563         -  FeedZipHtml(zip_buf, 18925,
  1564         -              "f371124e665f70618a79ba4e5f50ec445c5dc18638e0177712");
  1565         -  FeedZipHtml(zip_buf, 18950,
  1566         -              "f7c2a8df2ff78f17ba2cca51bed0899abde9329ca91aeaa96e");
  1567         -  FeedZipHtml(zip_buf, 18975,
  1568         -              "55edb7c9041295c611e9812fd5c0cfb67de1467cfdc9a42da1");
  1569         -  FeedZipHtml(zip_buf, 19000,
  1570         -              "ea2968bb3891b58a0baf8ffa7dd814a931154cb31872e4f6bc");
  1571         -  FeedZipHtml(zip_buf, 19025,
  1572         -              "495cba359496d8a637484d0fbe10ba4d2bb3cc326f7a020126");
  1573         -  FeedZipHtml(zip_buf, 19050,
  1574         -              "5ff49335acfdc34eb496ae93853101b42ac4b5f2a2724989c8");
  1575         -  FeedZipHtml(zip_buf, 19075,
  1576         -              "1b0cf31fe9fa98e64721e1cde9d2ba75d4023997e9d25cc648");
  1577         -  FeedZipHtml(zip_buf, 19100,
  1578         -              "e0edb7b812910a68d781053dd8dda89417dea71b63a5553c42");
  1579         -  FeedZipHtml(zip_buf, 19125,
  1580         -              "80c5c34d68a044464ff345dda2e3986b6840c154478727fb17");
  1581         -  FeedZipHtml(zip_buf, 19150,
  1582         -              "edf3c39303aacfa5eedfdd98cde1afe5362e0d75816b2eb38d");
  1583         -  FeedZipHtml(zip_buf, 19175,
  1584         -              "0a5de6e2955507497219469784e69238263b9fde0f040f8c99");
  1585         -  FeedZipHtml(zip_buf, 19200,
  1586         -              "9925ad9cba2239827f91f6d3dd18d336e27db0e7d08d44efcc");
  1587         -  FeedZipHtml(zip_buf, 19225,
  1588         -              "4d86b69c4f6963edcda7e6e9abd19197c5482d798a3afe70d4");
  1589         -  FeedZipHtml(zip_buf, 19250,
  1590         -              "3e34508ee117f938272ec722df5a632d44ae7512d3c2c90857");
  1591         -  FeedZipHtml(zip_buf, 19275,
  1592         -              "77251c0553c14dc4448e31141018f6c0f2d4a7988b9dfdbbe3");
  1593         -  FeedZipHtml(zip_buf, 19300,
  1594         -              "106f432e4bea41dafba5a51b4dd9ef476e57556dacdaabecb5");
  1595         -  FeedZipHtml(zip_buf, 19325,
  1596         -              "ee163bd382e83f5675a315d4385c48c28b701bf174171cd0a5");
  1597         -  FeedZipHtml(zip_buf, 19350,
  1598         -              "0f2e2d7d699756cea12b3b5d0829c72e7acdc8616102822faf");
  1599         -  FeedZipHtml(zip_buf, 19375,
  1600         -              "e164b57159a5323d44316c146549b7513ec6e060b5c87236ea");
  1601         -  FeedZipHtml(zip_buf, 19400,
  1602         -              "dbc272eaf3d0fe7f261e9b5ec9a52ade3395a18a1fd969ae8d");
  1603         -  FeedZipHtml(zip_buf, 19425,
  1604         -              "c5129a4b92cb9a54b538aca9a91dfbdc0be239345580e62205");
  1605         -  FeedZipHtml(zip_buf, 19450,
  1606         -              "5e651c2be543ce68a6c9ac760cc68c8c3e2994dd22154617b3");
  1607         -  FeedZipHtml(zip_buf, 19475,
  1608         -              "ea8a5f6d8ec7c60dbfd3caef9db5f399c1817c8057b668da69");
  1609         -  FeedZipHtml(zip_buf, 19500,
  1610         -              "14230b0a0a2b351743485da910270d442c973aa03a61851346");
  1611         -  FeedZipHtml(zip_buf, 19525,
  1612         -              "6654465bc30271446256a94fcd2e768e2b2f623cf550b89819");
  1613         -  FeedZipHtml(zip_buf, 19550,
  1614         -              "16c4cbd26133b332a428041d53d8d77e4cbce7664cf0faa035");
  1615         -  FeedZipHtml(zip_buf, 19575,
  1616         -              "ad3aa2a31328f481d64da1acae45b76ef5186bac631b66918b");
  1617         -  FeedZipHtml(zip_buf, 19600,
  1618         -              "49475556b3f2876eb7932ec612e09753f740e5a013416f7ae7");
  1619         -  FeedZipHtml(zip_buf, 19625,
  1620         -              "4adbffc100d52c179e2b2e348b3c0b697aabd52aeee22b0dac");
  1621         -  FeedZipHtml(zip_buf, 19650,
  1622         -              "50472b6503aee7083e20c81069e62cb5ae38cb4e794e522a8c");
  1623         -  FeedZipHtml(zip_buf, 19675,
  1624         -              "625ebcc8e01e15756306f14bc72a872c4d1597e6187697a5aa");
  1625         -  FeedZipHtml(zip_buf, 19700,
  1626         -              "449d99ad733a9f4a2a1f3739f022d886f79933a5651842e502");
  1627         -  FeedZipHtml(zip_buf, 19725,
  1628         -              "55aa28e1b7095b3393830e999ee121832f3eef9f9f96dfaa5c");
  1629         -  FeedZipHtml(zip_buf, 19750,
  1630         -              "0c6183863991976dc7b4b4754e7496b8059a1c7871748a2598");
  1631         -  FeedZipHtml(zip_buf, 19775,
  1632         -              "acbaec6f479641a4c01d5b8803bfce1e479b84be88ea58a5e5");
  1633         -  FeedZipHtml(zip_buf, 19800,
  1634         -              "27ec25cebb18d2820121aed36aa2d9e335be67e1573b1c4837");
  1635         -  FeedZipHtml(zip_buf, 19825,
  1636         -              "dae4d0893844b97c16c3ea9f3957027439851182fed497461c");
  1637         -  FeedZipHtml(zip_buf, 19850,
  1638         -              "882b6301b0a6a8ec255ff4c0f6001fa7744f51e2a5174e9812");
  1639         -  FeedZipHtml(zip_buf, 19875,
  1640         -              "210a7d87efc7f08331bd718bd5b39d268f62b25492ed528a1a");
  1641         -  FeedZipHtml(zip_buf, 19900,
  1642         -              "9abe1a6f70d86639035d328140878ce68a9674ade1c334f8e0");
  1643         -  FeedZipHtml(zip_buf, 19925,
  1644         -              "78bf7dfe69f7f4e8687fb77d787ab2a2431f35ea47221ac867");
  1645         -  FeedZipHtml(zip_buf, 19950,
  1646         -              "5d9a6dd4feaa7942a38328571883def3dc3a228a4272f189a0");
  1647         -  FeedZipHtml(zip_buf, 19975,
  1648         -              "1b4e7019c21e56599f8877a3d52327095b61075a67d363c124");
  1649         -  FeedZipHtml(zip_buf, 20000,
  1650         -              "1c088c794daf8ba6459b344f3bdcff8e0148cbdeab9be6a4df");
  1651         -  FeedZipHtml(zip_buf, 20025,
  1652         -              "3cdf374dc1947260da728cb8e5c1174091ba3c09367695e79c");
  1653         -  FeedZipHtml(zip_buf, 20050,
  1654         -              "a1ecadc9a33d55866d6d6eeb694d8f354ca5157dd9a46ec9b4");
  1655         -  FeedZipHtml(zip_buf, 20075,
  1656         -              "348953368b0cf3c6579251c74b227cc26c5461e3d09628166c");
  1657         -  FeedZipHtml(zip_buf, 20100,
  1658         -              "458099cfdbc52b0ad7a34175c81ead8e22d571600059b33c9e");
  1659         -  FeedZipHtml(zip_buf, 20125,
  1660         -              "64dd381623dc38a1c7087d12219d2c5a32ebc28a712269c52b");
  1661         -  FeedZipHtml(zip_buf, 20150,
  1662         -              "eb0be0d77713cfefed0024b6381cd93427bfcef3fdbdf1ebd9");
  1663         -  FeedZipHtml(zip_buf, 20175,
  1664         -              "e9d1a783d3933cb31a3f3f6e4e4d1969116c3ae6baaf0be251");
  1665         -  FeedZipHtml(zip_buf, 20200,
  1666         -              "5955d6fbd3a254d3b639b974ae019a65d3fd1b604eff367d5c");
  1667         -  FeedZipHtml(zip_buf, 20225,
  1668         -              "edc6f22979463a65b0af0a68e13b3b970eff95bbdc224872ec");
  1669         -  FeedZipHtml(zip_buf, 20250,
  1670         -              "7e13bad86fa1de42da5866187e29350da747e72d60f8f91e6a");
  1671         -  FeedZipHtml(zip_buf, 20275,
  1672         -              "95d574f8d5031b916e6306433860e2ff6ed0eb1b7d0ac993f6");
  1673         -  FeedZipHtml(zip_buf, 20300,
  1674         -              "9593260728ea11e9982f5327f25eb7a85554860be8eff5f034");
  1675         -  FeedZipHtml(zip_buf, 20325,
  1676         -              "d4671e0b27094e2185f6a7d851c5cca9e071bd5a246d233741");
  1677         -  FeedZipHtml(zip_buf, 20350,
  1678         -              "16e016f3d34a5e03a29a9ac532d030ab3bd214dec3c0801754");
  1679         -  FeedZipHtml(zip_buf, 20375,
  1680         -              "3b7acf587f8d6c2e33d2f824618caa957a4b64b93ae3444641");
  1681         -  FeedZipHtml(zip_buf, 20400,
  1682         -              "0892752d30de8fa5ea552e36bf178a38f82951873a82982e19");
  1683         -  FeedZipHtml(zip_buf, 20425,
  1684         -              "02cac609c087835b4ea540474f0adac75c13da0456cef0b496");
  1685         -  FeedZipHtml(zip_buf, 20450,
  1686         -              "8a5cb1595e8590bd0889fe10c0de5112d69eb6cd1dda3ec700");
  1687         -  FeedZipHtml(zip_buf, 20475,
  1688         -              "0b50b2a2a86581c42af65e9196152d9cd37d4fc68caa300a05");
  1689         -  FeedZipHtml(zip_buf, 20500,
  1690         -              "9f71606f01d899987759be177762e37c225f5ccadbb43564fb");
  1691         -  FeedZipHtml(zip_buf, 20525,
  1692         -              "e28147664dbb714c3cac2c80d87b913b16251ec2f6a56e6dfc");
  1693         -  FeedZipHtml(zip_buf, 20550,
  1694         -              "85d2bc035bbd4d4b621c33510929b0177b86354540746e9d1e");
  1695         -  FeedZipHtml(zip_buf, 20575,
  1696         -              "2c4d4608495f01ea368ceb7963bcbde517b0692623990928f5");
  1697         -  FeedZipHtml(zip_buf, 20600,
  1698         -              "2e94e8ccadc294c8761f3f191af4e3a763fa4b2721a68c0169");
  1699         -  FeedZipHtml(zip_buf, 20625,
  1700         -              "1ea174a6adaa998a8be3993e67a6fa3c752e0a59a9749c3823");
  1701         -  FeedZipHtml(zip_buf, 20650,
  1702         -              "4cc743412ea94ce2de787eb8c7664b76c4341e1c7b697e508b");
  1703         -  FeedZipHtml(zip_buf, 20675,
  1704         -              "c9449bcbe833e5dfcd9afc804c84e585e5de17d5febb5b9d3b");
  1705         -  FeedZipHtml(zip_buf, 20700,
  1706         -              "ca352f5632ce3dd4ec410f335825439888ea8bc92042818a06");
  1707         -  FeedZipHtml(zip_buf, 20725,
  1708         -              "a6f4822eee601cdb0ee37c34b1f089fe30dec71bab4d533e81");
  1709         -  FeedZipHtml(zip_buf, 20750,
  1710         -              "6e3a09132a52f6caa8fa85415ce94d152904997795b6c1df94");
  1711         -  FeedZipHtml(zip_buf, 20775,
  1712         -              "2bd308e3cfb065df0565d49fe06168ccefc3e455aa179500ca");
  1713         -  FeedZipHtml(zip_buf, 20800,
  1714         -              "2f785e3bcaabf2d9ec726c7431d4934afba803d5b254004643");
  1715         -  FeedZipHtml(zip_buf, 20825,
  1716         -              "4041d95107534a5691cfe44034236f919e7f9bbdb607cd1784");
  1717         -  FeedZipHtml(zip_buf, 20850,
  1718         -              "4074dcdc314b4e7728a39d8c87ded045e6c176b33d03f2abaa");
  1719         -  FeedZipHtml(zip_buf, 20875,
  1720         -              "d190abd4594ae9fd215fac59d64ab0b1754549ae301f66fa50");
  1721         -  FeedZipHtml(zip_buf, 20900,
  1722         -              "41310c6164da566dab9ce6f0754299562f7f95a0f5ebfe4d57");
  1723         -  FeedZipHtml(zip_buf, 20925,
  1724         -              "90a8d8ab335afa2d4cd5cf3fc56c4a7f6993af6699f00d272e");
  1725         -  FeedZipHtml(zip_buf, 20950,
  1726         -              "b9c7cd281b6da45481caa03609706b0240b55a3058899382dd");
  1727         -  FeedZipHtml(zip_buf, 20975,
  1728         -              "61ef32be58cdf45669270c3d0d3f0a79d2e5e4624ae9e75287");
  1729         -  FeedZipHtml(zip_buf, 21000,
  1730         -              "5224aa3c25a516c3caf43dc1a44bf67550798a4133c3a09962");
  1731         -  FeedZipHtml(zip_buf, 21025,
  1732         -              "90860721842550de2b5e13e0736b2fc5a4ef76bfc92b26d429");
  1733         -  FeedZipHtml(zip_buf, 21050,
  1734         -              "59b5a644dd0b62fca1c77e934cfc554ab9554760c4c0755ee7");
  1735         -  FeedZipHtml(zip_buf, 21075,
  1736         -              "6c84515ec52a0009871ddcdee24917a061856ee2c0c496b920");
  1737         -  FeedZipHtml(zip_buf, 21100,
  1738         -              "4e2c8334c6b42de6828cacbd6a6d53a0d14fa6a4332dd57f2b");
  1739         -  FeedZipHtml(zip_buf, 21125,
  1740         -              "b361c00a2c0644a7e95159231bf07b6916c78edeb5330319e9");
  1741         -  FeedZipHtml(zip_buf, 21150,
  1742         -              "136d1b6c7d9dbc3a4529cbe6842ef9c0a4c1a36041f42a34b7");
  1743         -  FeedZipHtml(zip_buf, 21175,
  1744         -              "17c7a17f252e8cc76d59c9cff798f3247687619a7592cc7d97");
  1745         -  FeedZipHtml(zip_buf, 21200,
  1746         -              "b05ae62f60e3b478aa62e72d4d3cab07573b555fa9286d8a83");
  1747         -  FeedZipHtml(zip_buf, 21225,
  1748         -              "a4e9642e23ca8d3909dc7e9f6c697976e4ce5900691e0652c3");
  1749         -  FeedZipHtml(zip_buf, 21250,
  1750         -              "ac00ea49b2481931ce90ea2e7a11677ec50c6531bad9f63b72");
  1751         -  FeedZipHtml(zip_buf, 21275,
  1752         -              "dccc83dc1bbfa534cedc04c81f1f2f2bc92233854553982def");
  1753         -  FeedZipHtml(zip_buf, 21300,
  1754         -              "5a8be0323aabbc07231fbd752591e069fb1d2e47e71ae48168");
  1755         -  FeedZipHtml(zip_buf, 21325,
  1756         -              "b5aa1bd2b9f8cd76b89f7ec9c5812d92e7b2aca572e2021307");
  1757         -  FeedZipHtml(zip_buf, 21350,
  1758         -              "31c7ada41b7ae19954fe126b416cb53b497612cc2e5dc65769");
  1759         -  FeedZipHtml(zip_buf, 21375,
  1760         -              "87a64f380b18feafc18b65d71877ba0c68298a9369c96c9a94");
  1761         -  FeedZipHtml(zip_buf, 21400,
  1762         -              "de4194f27f9562a739342f198f0c940a267f695e1cb4fb3e1e");
  1763         -  FeedZipHtml(zip_buf, 21425,
  1764         -              "fb5e42e1b9d7211c384003c72ae60ba0a2d0313815a81310d9");
  1765         -  FeedZipHtml(zip_buf, 21450,
  1766         -              "e978388d19349c775192422ab14a52721de654c1f38ff2d7e0");
  1767         -  FeedZipHtml(zip_buf, 21475,
  1768         -              "fba67430f1a1de2b5752958c39d2d7b259caa26cd632e5f0a4");
  1769         -  FeedZipHtml(zip_buf, 21500,
  1770         -              "afcde3513e02a12319ce8c10575a5f397e1f1b9befeab887fd");
  1771         -  FeedZipHtml(zip_buf, 21525,
  1772         -              "9b0443ef4b03e8d22ea5395e284df61bebabe45201687ef466");
  1773         -  FeedZipHtml(zip_buf, 21550,
  1774         -              "05e3805e25205ed36011755ccaa46675f9f1b1f1420cbd4ab1");
  1775         -  FeedZipHtml(zip_buf, 21575,
  1776         -              "17d3299fbc062a49507a388725717af68b49676d90de7c512c");
  1777         -  FeedZipHtml(zip_buf, 21600,
  1778         -              "3c3af9f1305ffc869a60296164ca53e18a84ef10de7282d035");
  1779         -  FeedZipHtml(zip_buf, 21625,
  1780         -              "fcb078b9b125fba4b25bd2f1851e8c842ed76b9a7ba0ca0b80");
  1781         -  FeedZipHtml(zip_buf, 21650,
  1782         -              "2131e4c409f086578c104f2a13a44ebddec7dc392b19ddd1c6");
  1783         -  FeedZipHtml(zip_buf, 21675,
  1784         -              "2689533d511ae54317c598e49392ed77d446d66115d2c96c64");
  1785         -  FeedZipHtml(zip_buf, 21700,
  1786         -              "1d2cc33196ef51d09d462a90a041db7f42ae961211927c6b7a");
  1787         -  FeedZipHtml(zip_buf, 21725,
  1788         -              "14f32254e8726f7a7e0e762ea24a31b895759163f92150a8b3");
  1789         -  FeedZipHtml(zip_buf, 21750,
  1790         -              "37a79f1239b58f2bcfc177e31d7e6ea979a51ec5cc8bbb2ab2");
  1791         -  FeedZipHtml(zip_buf, 21775,
  1792         -              "1941858f9076e6ce3c0f0173df2f928ad9540bb390b234b6ca");
  1793         -  FeedZipHtml(zip_buf, 21800,
  1794         -              "d2e93112519b3bf38960faf1628590e6a9433b7e67bb834fad");
  1795         -  FeedZipHtml(zip_buf, 21825,
  1796         -              "8f3903bcf5e24d3ec7a57e97b263a99130bae4621c6fe678d6");
  1797         -  FeedZipHtml(zip_buf, 21850,
  1798         -              "8317d97a3e9aaed1699ae5a3f30aab4387b2ca8acc98dd54ba");
  1799         -  FeedZipHtml(zip_buf, 21875,
  1800         -              "b4a469c1d7b959c34266e16f8a11e4842539ce490ae48c26af");
  1801         -  FeedZipHtml(zip_buf, 21900,
  1802         -              "d48a31cb0498f1457f29ac44401567a66efc8fd7741486baa3");
  1803         -  FeedZipHtml(zip_buf, 21925,
  1804         -              "a07eb21ded6ea92732cd7836d006466ab84ee3f0777cc090ac");
  1805         -  FeedZipHtml(zip_buf, 21950,
  1806         -              "6bbf5d964c2ebb2a362f3b0f2203d24bda5206c41e826f13ef");
  1807         -  FeedZipHtml(zip_buf, 21975,
  1808         -              "260712a2a502f2d02585df11836e950c1c2f51660a73ff35a5");
  1809         -  FeedZipHtml(zip_buf, 22000,
  1810         -              "a781dc86ddf9731b52d9b62ec6e1d4ca6df8d74fa3bf277c77");
  1811         -  FeedZipHtml(zip_buf, 22025,
  1812         -              "12b8b7edc803fe9b70f08fe5eecbd6ad447560b8b9e80d447c");
  1813         -  FeedZipHtml(zip_buf, 22050,
  1814         -              "4967e337d95a365f6a3d96fd5a23f2fda1c0346f4c4b47c6b4");
  1815         -  FeedZipHtml(zip_buf, 22075,
  1816         -              "ac29a6cc8e34435a36850927830abbb2c9fae5b245d1f2cf69");
  1817         -  FeedZipHtml(zip_buf, 22100,
  1818         -              "e8a04d911559b316cdccd714a321fd89180a929ea37e8a9d0d");
  1819         -  FeedZipHtml(zip_buf, 22125,
  1820         -              "a528e0dffa3171c99d1c5fc4a917c8f432a0eb25342a45fa0f");
  1821         -  FeedZipHtml(zip_buf, 22150,
  1822         -              "043ae9ccd8084b0d5cd34140f3a88a7f1d61d8caf9d3041bcc");
  1823         -  FeedZipHtml(zip_buf, 22175,
  1824         -              "2d37f74a88d1e88b78856f1d75ad4c3d46f670a94acf98097a");
  1825         -  FeedZipHtml(zip_buf, 22200,
  1826         -              "536eab51d4a8967e57ff95d41db54481aab84c9c2dc0928858");
  1827         -  FeedZipHtml(zip_buf, 22225,
  1828         -              "fdd4c205ab94ca88920e01a3a8528eb4812561c8ef0456249d");
  1829         -  FeedZipHtml(zip_buf, 22250,
  1830         -              "aa5e6703f6faaee793ad596639fd16466110feb1e7b983c81d");
  1831         -  FeedZipHtml(zip_buf, 22275,
  1832         -              "15354db67d6e71eec3c7e252e0f9f032c6559749757dd99fae");
  1833         -  FeedZipHtml(zip_buf, 22300,
  1834         -              "911a807db9c0dfbfea92287324ce9e74563d9df5a8f4123332");
  1835         -  FeedZipHtml(zip_buf, 22325,
  1836         -              "33752cdf2d22fac36bcea926698411cd04c29058798c572532");
  1837         -  FeedZipHtml(zip_buf, 22350,
  1838         -              "8a134660b354e1a58376b1ccff3712af32358ed9e2e7ea20ff");
  1839         -  FeedZipHtml(zip_buf, 22375,
  1840         -              "f85fe9adcef7a15f77c3a00bdc5f9a8c5d355668a7bedb4df8");
  1841         -  FeedZipHtml(zip_buf, 22400,
  1842         -              "32ae54e910f52e878090787e636aba427d0cf0debf0e35b0f4");
  1843         -  FeedZipHtml(zip_buf, 22425,
  1844         -              "7deb4ff971467d9a9a535e0fd914eaec2a42a91b18911990d5");
  1845         -  FeedZipHtml(zip_buf, 22450,
  1846         -              "1abd97885925bff85bec0d46ee6b6ae97b7e42b5235e73786e");
  1847         -  FeedZipHtml(zip_buf, 22475,
  1848         -              "d777e9c50a579ef7b6a98a25f19ae4e7db7042af30181754ab");
  1849         -  FeedZipHtml(zip_buf, 22500,
  1850         -              "9a9e35736a483d9c2328426eb605bc2355ab39c8dc200c51c9");
  1851         -  FeedZipHtml(zip_buf, 22525,
  1852         -              "ee10b93a9c487f00db53af4fe51746ecdd58955bfa5ef46f03");
  1853         -  FeedZipHtml(zip_buf, 22550,
  1854         -              "be8dde5cbe8df376fbf4ecf4c9a961bcc7ff0d23d6edaff1a9");
  1855         -  FeedZipHtml(zip_buf, 22575,
  1856         -              "69ceb09e79be9f7787c0c2a74cd9b9b70600057e7309bd081e");
  1857         -  FeedZipHtml(zip_buf, 22600,
  1858         -              "e865d38cca8ac96c627a681bc2b9c62c0c7e24dcdead438f06");
  1859         -  FeedZipHtml(zip_buf, 22625,
  1860         -              "6465522f29ba2155580c3e7149f0cbbbda3e9a387b5edc75a3");
  1861         -  FeedZipHtml(zip_buf, 22650,
  1862         -              "9ea86200dde7ae9c30cf40cb6389dc03a8ac0ffc5a8752a4fb");
  1863         -  FeedZipHtml(zip_buf, 22675,
  1864         -              "3a80da4bd1c7ef79338cbfe25c0f3d309088bcae6635f978a9");
  1865         -  FeedZipHtml(zip_buf, 22700,
  1866         -              "c850d3e8a97cc941589c9ba246d433c632b2cbd71bd68c2869");
  1867         -  FeedZipHtml(zip_buf, 22725,
  1868         -              "9b9d3a53ea574dcf163865fc6905b296ca1c99b480352cc5d7");
  1869         -  FeedZipHtml(zip_buf, 22750,
  1870         -              "289aa3497768beb0dde03c13dac2abad30dc380dfe49ebf46a");
  1871         -  FeedZipHtml(zip_buf, 22775,
  1872         -              "becbbc2364bb10ce7c137a0f0dac1a84eaf187fe182f720596");
  1873         -  FeedZipHtml(zip_buf, 22800,
  1874         -              "d07203c9390947d3dd4d8b5c604c9f8593f0e73226eaf86e4f");
  1875         -  FeedZipHtml(zip_buf, 22825,
  1876         -              "14683f9d7bcac774ca06bd4f8e6127a954251c43053c24dfbb");
  1877         -  FeedZipHtml(zip_buf, 22850,
  1878         -              "756438a4d608b9ada173abb6245a5863a43a12fd327261d322");
  1879         -  FeedZipHtml(zip_buf, 22875,
  1880         -              "48563eee7741367aceda87c164509d6cc762300e966549495b");
  1881         -  FeedZipHtml(zip_buf, 22900,
  1882         -              "5737ec68c030c445bdf9517373942d9bbc68bd70e573ec99c6");
  1883         -  FeedZipHtml(zip_buf, 22925,
  1884         -              "fba6068f06d39231513fd190e0d26abac6956503fc788e298e");
  1885         -  FeedZipHtml(zip_buf, 22950,
  1886         -              "4a1892da16c19115037fcf2cc9f594b23c398dbc2a81b17508");
  1887         -  FeedZipHtml(zip_buf, 22975,
  1888         -              "bae41f8d93db8af0a79d3fbdd1241916594036b49c7152781a");
  1889         -  FeedZipHtml(zip_buf, 23000,
  1890         -              "b30a3f16dfc5d4ae6f5035b4631f7b11850da6b001a2946ed6");
  1891         -  FeedZipHtml(zip_buf, 23025,
  1892         -              "408403ca4be206f14a9a14631846de9f68b0faea847225c817");
  1893         -  FeedZipHtml(zip_buf, 23050,
  1894         -              "6226efe86cc31acd3414b0b8d9bdbcef644a16fb58b6c45994");
  1895         -  FeedZipHtml(zip_buf, 23075,
  1896         -              "b44c14dd04172af37dec910771b2fd729d12ce4fc8014fb95f");
  1897         -  FeedZipHtml(zip_buf, 23100,
  1898         -              "642912593124c64e68bd6c80b543fd28f7892ad221395292d4");
  1899         -  FeedZipHtml(zip_buf, 23125,
  1900         -              "74a70085043ddf18813c30d3e22702d87e1c875e65ea64537f");
  1901         -  FeedZipHtml(zip_buf, 23150,
  1902         -              "0d6740d469a0ea4874bfbd7236b7de3e7fedbc787b76b8b1f5");
  1903         -  FeedZipHtml(zip_buf, 23175,
  1904         -              "daf927fcdfd7cebfdebec03f4be5e12c0affb066f0950d2d59");
  1905         -  FeedZipHtml(zip_buf, 23200,
  1906         -              "264117df281ae855bed955c795989adb8abf574016aa723915");
  1907         -  FeedZipHtml(zip_buf, 23225,
  1908         -              "ff98d7a7f2cfb8bc4e59ed641273d6868e6087244a825aea6c");
  1909         -  FeedZipHtml(zip_buf, 23250,
  1910         -              "3205b43610589258498a515e02f26e5e18ab67d412b50c24e3");
  1911         -  FeedZipHtml(zip_buf, 23275,
  1912         -              "a47a941f63b20d08055300c77a4d6ecc54093b2df79b8b5de4");
  1913         -  FeedZipHtml(zip_buf, 23300,
  1914         -              "0a693ef4054fb687c2edc95f56745e0c3ec952be3dacdf0cf3");
  1915         -  FeedZipHtml(zip_buf, 23325,
  1916         -              "f0f1d9c8c4a1d4edcab4b212c6b60233da7229545813813b6e");
  1917         -  FeedZipHtml(zip_buf, 23350,
  1918         -              "870791cd8f95b6956efa9537c7564e54cb50f4ac39c9e54d45");
  1919         -  FeedZipHtml(zip_buf, 23375,
  1920         -              "902075b89de9fc3b07185cf6af1210d9a51c94c52da6aefcd4");
  1921         -  FeedZipHtml(zip_buf, 23400,
  1922         -              "5ee80208213bfc39adc368aec853555861612c3bc30477a3f0");
  1923         -  FeedZipHtml(zip_buf, 23425,
  1924         -              "dd895c0bd087c2d04b5deea361eb66e398efe29f03d350da96");
  1925         -  FeedZipHtml(zip_buf, 23450,
  1926         -              "b86d17ae5da9c006ef9814690c34306d698fd2ab11eaa9d207");
  1927         -  FeedZipHtml(zip_buf, 23475,
  1928         -              "ba31e39ae1c6eabf73310aaf64cd017c1729ba132a4b2cc1ca");
  1929         -  FeedZipHtml(zip_buf, 23500,
  1930         -              "9dc9686fed82c13abb7f000f8dee384ee3bc3d73a1f027ad54");
  1931         -  FeedZipHtml(zip_buf, 23525,
  1932         -              "9f250a77c4773ddcc338bfb8b1e558271b2a2214344761abf9");
  1933         -  FeedZipHtml(zip_buf, 23550,
  1934         -              "cc5587145ce81493199dd9f0d04d9b9a3a025fc2995e404947");
  1935         -  FeedZipHtml(zip_buf, 23575,
  1936         -              "0d800d56d510ab91afa823dd60e6eba61d3d3ec6d7f7e87a5d");
  1937         -  FeedZipHtml(zip_buf, 23600,
  1938         -              "d718c5c7eb89b8491c4a34ac6a4dc570cc725198b9828d1b75");
  1939         -  FeedZipHtml(zip_buf, 23625,
  1940         -              "87f4274a1f911be0ec7b37b5333ce37f6642b41ff8f9eca1ba");
  1941         -  FeedZipHtml(zip_buf, 23650,
  1942         -              "b6c8ea0c04006cd5be27df15a494942c171b38d32061ce3283");
  1943         -  FeedZipHtml(zip_buf, 23675,
  1944         -              "9e993b3a85b439821564a29b284f2b7a13b1f5dc01cce0233a");
  1945         -  FeedZipHtml(zip_buf, 23700,
  1946         -              "309e71ca74fe96db096166118493c11035c830f47b9c380e01");
  1947         -  FeedZipHtml(zip_buf, 23725,
  1948         -              "ede59465065e9501b52e8c88cb534a4c89eb2b03d675aec080");
  1949         -  FeedZipHtml(zip_buf, 23750,
  1950         -              "67b28ef09d4506e0d51493a469d0969030c98bf1f5daf01c81");
  1951         -  FeedZipHtml(zip_buf, 23775,
  1952         -              "798e65a5e5853ab903346fd3fd0580e38b3836a78f47a0ebcc");
  1953         -  FeedZipHtml(zip_buf, 23800,
  1954         -              "afa817056ee85ef541a0e09c9e70399dab2ca5d7096f385a26");
  1955         -  FeedZipHtml(zip_buf, 23825,
  1956         -              "758ea6184a2360d4838e947f14066627cbef787d0b472f15a1");
  1957         -  FeedZipHtml(zip_buf, 23850,
  1958         -              "6386e865985e876a10243d3c8e8db022c830bc7646184c6430");
  1959         -  FeedZipHtml(zip_buf, 23875,
  1960         -              "5a3ce49bc75b2e0c259762aa6c5cd30cd0d233f5da7e0d431e");
  1961         -  FeedZipHtml(zip_buf, 23900,
  1962         -              "095874255f87d137a698b1bd649eeb7b54d06e10b9e3a1d775");
  1963         -  FeedZipHtml(zip_buf, 23925,
  1964         -              "5a707cc5d3eb8a99b8b6dc27187f7cb167f108e2cfd5f7c686");
  1965         -  FeedZipHtml(zip_buf, 23950,
  1966         -              "fa56fb57d557153b42e303aeca389df8fe665a75508ff7b2b3");
  1967         -  FeedZipHtml(zip_buf, 23975,
  1968         -              "556caa78769f0be7533e9c0bedf38f3907e61730594de4ffb8");
  1969         -  FeedZipHtml(zip_buf, 24000,
  1970         -              "20bb234ee31d6e65f50f589ff3f1f8886c0137414d1d80bda0");
  1971         -  FeedZipHtml(zip_buf, 24025,
  1972         -              "a21eaa22476ef60c6f533e644437ce99d76aaafb7e41532cd0");
  1973         -  FeedZipHtml(zip_buf, 24050,
  1974         -              "8d3f726f8a75a4197234b908d65274bfd82bc73660236d7e24");
  1975         -  FeedZipHtml(zip_buf, 24075,
  1976         -              "c878b1b7360d174eebb3b951e8830ba592e9e183d1f202992f");
  1977         -  FeedZipHtml(zip_buf, 24100,
  1978         -              "f62af99330f6383968d188eb1d517d613bce6463f556b06cac");
  1979         -  FeedZipHtml(zip_buf, 24125,
  1980         -              "c8cac87be82e06ec707d644a9acf39d78c5a04326156fedd87");
  1981         -  FeedZipHtml(zip_buf, 24150,
  1982         -              "b79d3b62e12c591c7a7d33f24665c22a62164c5c374d1106ba");
  1983         -  FeedZipHtml(zip_buf, 24175,
  1984         -              "55fbdc19aed74e8846fbb517e32314005a829b8ec41755153e");
  1985         -  FeedZipHtml(zip_buf, 24200,
  1986         -              "eef6a5cabd55201036dc634cdd7b4a211dc8f3269abd54c548");
  1987         -  FeedZipHtml(zip_buf, 24225,
  1988         -              "570e93172748347c769da8ac6042d56f0ffbf26b8e9733aa0b");
  1989         -  FeedZipHtml(zip_buf, 24250,
  1990         -              "a0af245f413bae5d8707bd1769e6fddcc36ecb75b9478fbcad");
  1991         -  FeedZipHtml(zip_buf, 24275,
  1992         -              "4b48d3381321e543f6b0db9d449501777effd0c8b466cb7c90");
  1993         -  FeedZipHtml(zip_buf, 24300,
  1994         -              "ef326394e5343470ecddfc732cce22491f2d9495e0b526afa3");
  1995         -  FeedZipHtml(zip_buf, 24325,
  1996         -              "97feaa304ef1dccf96c297dc1598e421233a0fa897530874a2");
  1997         -  FeedZipHtml(zip_buf, 24350,
  1998         -              "feda0073596bef72750a99e5a0b02a607dcc85476b5b54c8fc");
  1999         -  FeedZipHtml(zip_buf, 24375,
  2000         -              "3ff211f30867aaecd20cadae64d5ef3a34beadb0511459dd54");
  2001         -  FeedZipHtml(zip_buf, 24400,
  2002         -              "7a4208c435d6a3293973945efc343af07cae7716dcb3f3d37f");
  2003         -  FeedZipHtml(zip_buf, 24425,
  2004         -              "afbfac1b391d76d087c2de091460ba424781caeca42aa0ec5c");
  2005         -  FeedZipHtml(zip_buf, 24450,
  2006         -              "f481d5d18eb9b88d316a59166c939e1ab9c25295aa7184658c");
  2007         -  FeedZipHtml(zip_buf, 24475,
  2008         -              "4a29f3f1d3c268d3ccd04d5387aaca79325d26e56901e3a8ef");
  2009         -  FeedZipHtml(zip_buf, 24500,
  2010         -              "bb5721c3c0c584323c4657f2af9d3fb09ed2d442435acb1979");
  2011         -  FeedZipHtml(zip_buf, 24525,
  2012         -              "9c5779f6aaba3e2dab0195c61b5224e4045863d21d661239b2");
  2013         -  FeedZipHtml(zip_buf, 24550,
  2014         -              "4fda506cfdcef39f61ed8a13a8d731b09d0c88a6d74d78b425");
  2015         -  FeedZipHtml(zip_buf, 24575,
  2016         -              "f7941bd126810acea848ea8d646410e2e8cd64fbef49781d0f");
  2017         -  FeedZipHtml(zip_buf, 24600,
  2018         -              "7e7ee92884621d376f9bef7d3c5282af95032e1058d8042026");
  2019         -  FeedZipHtml(zip_buf, 24625,
  2020         -              "371c4e8427f71c3a6526489001dfed0ae9e24b86e81c76f1ca");
  2021         -  FeedZipHtml(zip_buf, 24650,
  2022         -              "090baf46a23ff10127801f3797fc05fe07572d31506a53445e");
  2023         -  FeedZipHtml(zip_buf, 24675,
  2024         -              "0f3396ef4c92e1eef985c5a2c87668392efce33270f9f59ce1");
  2025         -  FeedZipHtml(zip_buf, 24700,
  2026         -              "7f58e5960a96357e5acc551eefdfb2dc210152b8cdc31015b5");
  2027         -  FeedZipHtml(zip_buf, 24725,
  2028         -              "0093cf34ecfafdb5e4c6b5cd529b0fb75e8cd207b4a0b0a80b");
  2029         -  FeedZipHtml(zip_buf, 24750,
  2030         -              "be725c0fbd7eb24b21676a96ccafca97592041fa5df90d3bf6");
  2031         -  FeedZipHtml(zip_buf, 24775,
  2032         -              "f95875dd8a1d3ecd1945900371a9502ce8d2b772df21b5e4bb");
  2033         -  FeedZipHtml(zip_buf, 24800,
  2034         -              "856dc7ed76e90f6225b958bae9e265b19aaa3a74b5e5c0f693");
  2035         -  FeedZipHtml(zip_buf, 24825,
  2036         -              "976e5d18826587cf7f250ae8456b4a7cae4109e2e9cba33018");
  2037         -  FeedZipHtml(zip_buf, 24850,
  2038         -              "78c9a4e4249ceb736f392e6747191e7602acc48c2101be5a00");
  2039         -  FeedZipHtml(zip_buf, 24875,
  2040         -              "f67af1cfe769deeb53dcf064a01d6e24b8c5e5ee5af84bbc71");
  2041         -  FeedZipHtml(zip_buf, 24900,
  2042         -              "a17f64ae5dea9d6e4e0a70c04ebeb6f9f3f38de7e9d64d74e3");
  2043         -  FeedZipHtml(zip_buf, 24925,
  2044         -              "750084b2a2a1ab0a656532871bc3c833dbf30df84666724326");
  2045         -  FeedZipHtml(zip_buf, 24950,
  2046         -              "e0a7d9302506ed4661ac1d0687bc39c847ce7b784ec113db7a");
  2047         -  FeedZipHtml(zip_buf, 24975,
  2048         -              "b9ce3e51ef9b810b8e5c4b306daec303e711f55c5bf148ca1a");
  2049         -  FeedZipHtml(zip_buf, 25000,
  2050         -              "129584c4a924fd82e473369cbfc3fff94a28a7c1248f64c682");
  2051         -  FeedZipHtml(zip_buf, 25025,
  2052         -              "beffa2aecebf9e7f6d90f34a45bbebfaa2b8c9ea5f4b37d9f4");
  2053         -  FeedZipHtml(zip_buf, 25050,
  2054         -              "bb72ed8b7dcab5ef17d5a55cff4ecbbd910373e990dc074f22");
  2055         -  FeedZipHtml(zip_buf, 25075,
  2056         -              "a0d56a9e174bea9d1725d5bbc61b18639c103e10dc45257390");
  2057         -  FeedZipHtml(zip_buf, 25100,
  2058         -              "1121741e944fa2f9d5a2178749148ebd2e214381c01e38477a");
  2059         -  FeedZipHtml(zip_buf, 25125,
  2060         -              "7de8b9938e9eca8f6b9466a6b706ee8d177f4d639d0c0f2d4d");
  2061         -  FeedZipHtml(zip_buf, 25150,
  2062         -              "089c5e35254f4645907020021c27ec6551419163d7410698af");
  2063         -  FeedZipHtml(zip_buf, 25175,
  2064         -              "a5b2701e2680cd8230183f974983f9652913d29392c3604f0c");
  2065         -  FeedZipHtml(zip_buf, 25200,
  2066         -              "22c1095e66372d0bb02c62b6fbe0ea081756c9d6b90519955a");
  2067         -  FeedZipHtml(zip_buf, 25225,
  2068         -              "cfc2d8a31d931fedbce55720c44c3cac7a32a7b756dd91d3a0");
  2069         -  FeedZipHtml(zip_buf, 25250,
  2070         -              "dafa973289e8e3a3b0229718bf97b289f96d29e56e7690a30b");
  2071         -  FeedZipHtml(zip_buf, 25275,
  2072         -              "97d8b7b69fab99a500d2c2e6bc1796e1e555320daf0b55212f");
  2073         -  FeedZipHtml(zip_buf, 25300,
  2074         -              "25bef692ee30a30b51918042e49ef0ff3f775a543d74452ac0");
  2075         -  FeedZipHtml(zip_buf, 25325,
  2076         -              "9b357374aef816a76e13f37229db353d03139c1555502eaedd");
  2077         -  FeedZipHtml(zip_buf, 25350,
  2078         -              "71710f563f966ec1faabb9724364877fe086580cd052bddb9b");
  2079         -  FeedZipHtml(zip_buf, 25375,
  2080         -              "35a6a689e9065cf63f587df6637f12e7fdf6f2711cc2b2d347");
  2081         -  FeedZipHtml(zip_buf, 25400,
  2082         -              "0f86d3cebaee09be03f681ed8601ec61bea38a357ed74efd9d");
  2083         -  FeedZipHtml(zip_buf, 25425,
  2084         -              "f6f1e52e56efb59c1ed3b616f2db55e8f54cfe634c1fbbc01e");
  2085         -  FeedZipHtml(zip_buf, 25450,
  2086         -              "37193636bf738bfaab53fca957fca950d607f461d8ef5bd4a1");
  2087         -  FeedZipHtml(zip_buf, 25475,
  2088         -              "e5d7af0b80b13b1fd89864aed88d6018147f1f167ff2ee8288");
  2089         -  FeedZipHtml(zip_buf, 25500,
  2090         -              "55e7cf99d0b32035f2eee8f4dd1a0760f7ec128a39d501082e");
  2091         -  FeedZipHtml(zip_buf, 25525,
  2092         -              "5d912d5a94e8527814a6dd0ac2f40e71255b1e83ded81dd2ed");
  2093         -  FeedZipHtml(zip_buf, 25550,
  2094         -              "49c2492ae5b09672d7b2e01d2a8664e845e41b1fc56a3cb4b8");
  2095         -  FeedZipHtml(zip_buf, 25575,
  2096         -              "e5e95baf421586f6308d169c96c9e9bab567e487e338cdea15");
  2097         -  FeedZipHtml(zip_buf, 25600,
  2098         -              "e6ea23698e3417625ea6cef6f02fe5eb0a379da553cb49aa9e");
  2099         -  FeedZipHtml(zip_buf, 25625,
  2100         -              "ca24e5cf646691b506a683c6f217390f97b173f7f816ce7132");
  2101         -  FeedZipHtml(zip_buf, 25650,
  2102         -              "04cbdd3daf2f8c4de8b85ec522d4a1e5c4952fa99a618f3b4e");
  2103         -  FeedZipHtml(zip_buf, 25675,
  2104         -              "058d7f51d6d0445a1a5bf099b68a2fb847abee9976163ef87c");
  2105         -  FeedZipHtml(zip_buf, 25700,
  2106         -              "1e62d6d63b8ffc00299be235474aa7e5a2bf50e51efd4c2e14");
  2107         -  FeedZipHtml(zip_buf, 25725,
  2108         -              "593f750e22d7a1f147447315893f3ed1e1e312e8f0691a1d3e");
  2109         -  FeedZipHtml(zip_buf, 25750,
  2110         -              "3dd1e1d342e940716f63ce6b5e24826a6dc965ecd8908b458d");
  2111         -  FeedZipHtml(zip_buf, 25775,
  2112         -              "e88f77d6d6c741127e4985b994a89a905c375522ef6ccbc513");
  2113         -  FeedZipHtml(zip_buf, 25800,
  2114         -              "8639998e5c3027b2687e279a62c11ac6a45c8b9d2c4b366c17");
  2115         -  FeedZipHtml(zip_buf, 25825,
  2116         -              "02cb63b57a3bf4744fe61085035444a1c2d38d5f8c1987455e");
  2117         -  FeedZipHtml(zip_buf, 25850,
  2118         -              "79e124ce2b06758e6a9ee12a6c61699a561277b126f2222178");
  2119         -  FeedZipHtml(zip_buf, 25875,
  2120         -              "ac96736df6320ce8fb61ad2a7b5a59d295a46dd4cc9606f662");
  2121         -  FeedZipHtml(zip_buf, 25900,
  2122         -              "277cb8dc61181da556f7c218a59a4f2a6cf28f4f44b312ede3");
  2123         -  FeedZipHtml(zip_buf, 25925,
  2124         -              "bd13adc280fff444342bd13edd3bd1f6649601d7569c3dd7a1");
  2125         -  FeedZipHtml(zip_buf, 25950,
  2126         -              "92809a2e8dbdf7ab15246c802753f305531ccf25287c8e0927");
  2127         -  FeedZipHtml(zip_buf, 25975,
  2128         -              "e7c1e0617c1850daa04e99d564f6a887c385c75703ec9b6681");
  2129         -  FeedZipHtml(zip_buf, 26000,
  2130         -              "ab4abec61a2a580e9b1681d137882ef5751026a5389511d7b3");
  2131         -  FeedZipHtml(zip_buf, 26025,
  2132         -              "a394662a4126b5d543e3925444a051331febcd2fbd87714995");
  2133         -  FeedZipHtml(zip_buf, 26050,
  2134         -              "0ea3f181721caad534e3091c1f7dcacbaaebe4321aaaf0b978");
  2135         -  FeedZipHtml(zip_buf, 26075,
  2136         -              "3edc89dbe2a6840fb9ad1e727994c56d51b188d45d1c257292");
  2137         -  FeedZipHtml(zip_buf, 26100,
  2138         -              "ef160b4f26e6d58df33368c56bb94c737911ed72f47e297f59");
  2139         -  FeedZipHtml(zip_buf, 26125,
  2140         -              "f570422231b6f0966374edb87f5da8310898d5eb321ea350c4");
  2141         -  FeedZipHtml(zip_buf, 26150,
  2142         -              "8f352f9bcc5c14c740104e359c213c419c7f5db76ac406a9d2");
  2143         -  FeedZipHtml(zip_buf, 26175,
  2144         -              "32aadc541a295978935752f6a6d993e2c1eed9e52e3f7cb7e4");
  2145         -  FeedZipHtml(zip_buf, 26200,
  2146         -              "8a4b1b5b9cc36cc7c236d4f0aed0f005cec23d11e5d845730b");
  2147         -  FeedZipHtml(zip_buf, 26225,
  2148         -              "d6340bc211c8d26e28fafd786eaef997e49a8308a872e0613e");
  2149         -  FeedZipHtml(zip_buf, 26250,
  2150         -              "a99ec0709583b3a3abadbf5b192963673227e93c5448c61438");
  2151         -  FeedZipHtml(zip_buf, 26275,
  2152         -              "f815a0f3ba1ed5a1d1b9ac5566627ea44ed5d9a5cfb224e407");
  2153         -  FeedZipHtml(zip_buf, 26300,
  2154         -              "0883958d625bb80166f226e4ca077f8aa162950951663dcc73");
  2155         -  FeedZipHtml(zip_buf, 26325,
  2156         -              "08a50e66ec977dd91371e271e8be93609ab0c41698906131cc");
  2157         -  FeedZipHtml(zip_buf, 26350,
  2158         -              "2435c2f788b9ca742a49325521c61806ea44c5f7340feb8aec");
  2159         -  FeedZipHtml(zip_buf, 26375,
  2160         -              "716e16297732cd227d84e7a84f9f0da709fcc5ef16d3515810");
  2161         -  FeedZipHtml(zip_buf, 26400,
  2162         -              "d9a1d2956c627956660a58ea8ae10f729d6dcb370bca11cf66");
  2163         -  FeedZipHtml(zip_buf, 26425,
  2164         -              "4bc9a14966087c3f54ef2b389efa951c2ccdb727694adbe5ab");
  2165         -  FeedZipHtml(zip_buf, 26450,
  2166         -              "944b08b2aa65647498c47b1b5fd89fa19bd2c1d209019f6c80");
  2167         -  FeedZipHtml(zip_buf, 26475,
  2168         -              "4ec3b067ae454dbac993b640c254cd3f593b0f056c25074d31");
  2169         -  FeedZipHtml(zip_buf, 26500,
  2170         -              "9024cff9b1c1039b40ef143f79e86dd06cd95030dba45bc069");
  2171         -  FeedZipHtml(zip_buf, 26525,
  2172         -              "b34dfae2ee93be88ea4eca11350d04d8e88fde4c7011543cd1");
  2173         -  FeedZipHtml(zip_buf, 26550,
  2174         -              "1d20ddfb3afc0ff5f3c41a36a87579a9956a349a86944d0d37");
  2175         -  FeedZipHtml(zip_buf, 26575,
  2176         -              "67a9cea39b67335e198b055a2ed65e455c96d9ab695b7d34df");
  2177         -  FeedZipHtml(zip_buf, 26600,
  2178         -              "c9669d07c7f5cd58a44001bb0d1baf80b22db050adb8c486fa");
  2179         -  FeedZipHtml(zip_buf, 26625,
  2180         -              "886ce4103a1742abadfdda78550f61e8a197d660f595b2741f");
  2181         -  FeedZipHtml(zip_buf, 26650,
  2182         -              "8078c843f2d24f22c8ff1527914c73e94944aeb28cde4b398d");
  2183         -  FeedZipHtml(zip_buf, 26675,
  2184         -              "cc2757350f287952e864b065966786e088d655b9399a1b9bb9");
  2185         -  FeedZipHtml(zip_buf, 26700,
  2186         -              "6b3d9d751a4eddf34f5bea9e0bae70bb762c1277cf4d5c328c");
  2187         -  FeedZipHtml(zip_buf, 26725,
  2188         -              "d58f87414fdc80b11bf47cb2bfbeebb0ffc3c04b246214b28a");
  2189         -  FeedZipHtml(zip_buf, 26750,
  2190         -              "dac1d2a9e5e02b009b41a2dfb058bf22a7becbe9aaec2f97ea");
  2191         -  FeedZipHtml(zip_buf, 26775,
  2192         -              "8f350a7bf9bc1d4dc2b35a7382667d2a1c46122bb5a272775d");
  2193         -  FeedZipHtml(zip_buf, 26800,
  2194         -              "c2979351109b693e641de7cb48f42fe3db581d41dc1e723ce5");
  2195         -  FeedZipHtml(zip_buf, 26825,
  2196         -              "4ba1cace3fa65a844f89a06524fcab2a27b66ca6a3134afd26");
  2197         -  FeedZipHtml(zip_buf, 26850,
  2198         -              "8911d6e94625f69cfea277573ff281ca383c0236942e230c65");
  2199         -  FeedZipHtml(zip_buf, 26875,
  2200         -              "aa6da7d865a32fe6d4cfd92ae038ca3596fe36caf329e39ec4");
  2201         -  FeedZipHtml(zip_buf, 26900,
  2202         -              "54e5afc1a7ef3ecdd8360786495b7d171456b4f24a1eaf3347");
  2203         -  FeedZipHtml(zip_buf, 26925,
  2204         -              "2c9c360bcc5b5a0bdf46c554347dd5e9808a8b5d50802aef78");
  2205         -  FeedZipHtml(zip_buf, 26950,
  2206         -              "dd458e64ee419c06533ceb37baea89ee6d9ad56fffe2ec8093");
  2207         -  FeedZipHtml(zip_buf, 26975,
  2208         -              "b9a49974f45ac17066eb20ad30682732d1d606a5010c6e2bf0");
  2209         -  FeedZipHtml(zip_buf, 27000,
  2210         -              "f74fbf1f5cfcfcf22775f1e6b971faebe5e9c9d1a79ff8eacd");
  2211         -  FeedZipHtml(zip_buf, 27025,
  2212         -              "f2b6981e2153c7b5487049d5fdb30b063f2e005d0f9a93d393");
  2213         -  FeedZipHtml(zip_buf, 27050,
  2214         -              "fd0230fbc7676d3b1c41984e594413a6d5c6eb569fd203d381");
  2215         -  FeedZipHtml(zip_buf, 27075,
  2216         -              "afc4fab1883e6666aca5e9b0e37cda8ebf6c4ee3f17877d77a");
  2217         -  FeedZipHtml(zip_buf, 27100,
  2218         -              "53e1ba1fcdd7c63c5df4e81db3d3dfea945d6435071ed925e9");
  2219         -  FeedZipHtml(zip_buf, 27125,
  2220         -              "a11b85b0db15e36ced686d6e480f834de7af30ff91e62b54e8");
  2221         -  FeedZipHtml(zip_buf, 27150,
  2222         -              "5a498dfdb64cc044f9b3e26ec89a132433fffc87527102a079");
  2223         -  FeedZipHtml(zip_buf, 27175,
  2224         -              "dd8b30ea6ac51d0abaf2bd8e14682f11cecbf57fe0952bea2f");
  2225         -  FeedZipHtml(zip_buf, 27200,
  2226         -              "2a3d99bab0b8c47abcb22e218189d5d2590e5466283c7453f9");
  2227         -  FeedZipHtml(zip_buf, 27225,
  2228         -              "cb20d58f63b00d5fd91c9a5e193ebced9cff0dbacae07ed2ab");
  2229         -  FeedZipHtml(zip_buf, 27250,
  2230         -              "bb2140e40e44dcc695557ff11b555bcc7e11577f7291dca229");
  2231         -  FeedZipHtml(zip_buf, 27275,
  2232         -              "66ef4a92dde41656a12550b1ec8fe3c185b55e5ab6bde5c491");
  2233         -  FeedZipHtml(zip_buf, 27300,
  2234         -              "5778f8b77029d94912ac1d4a8cc89a90b78bb2ad0210472ad4");
  2235         -  FeedZipHtml(zip_buf, 27325,
  2236         -              "d86f2681f79f093e68cba617c411d4ba950c7c299e2f52856c");
  2237         -  FeedZipHtml(zip_buf, 27350,
  2238         -              "d9c2404a3cb3808e17f8749a41b1c09d5f9d6eb8085e461a70");
  2239         -  FeedZipHtml(zip_buf, 27375,
  2240         -              "deafa4b7e626763c018d10c729bd653d9ef2fbb95e4f9d6a76");
  2241         -  FeedZipHtml(zip_buf, 27400,
  2242         -              "c9beb2dcd1e5bbb458bc73da110fc7d85af8d9c624ab3fa259");
  2243         -  FeedZipHtml(zip_buf, 27425,
  2244         -              "77498bcbf6ff42b5dea59fddd206f6c565306175933d5f4f75");
  2245         -  FeedZipHtml(zip_buf, 27450,
  2246         -              "0e4e67b68f8d19af5c86eacd449baf123b54357132eeb95a6b");
  2247         -  FeedZipHtml(zip_buf, 27475,
  2248         -              "4b65e41c67752799b85d1c4d26f7f9512b5218157032a02562");
  2249         -  FeedZipHtml(zip_buf, 27500,
  2250         -              "75d4405e6851ad77207a97934fc3f6e665fcb76c4b13d24932");
  2251         -  FeedZipHtml(zip_buf, 27525,
  2252         -              "a8522367c00dd2222f4a05c7afb4ee4455f5d3d9e9e149fba7");
  2253         -  FeedZipHtml(zip_buf, 27550,
  2254         -              "5587fff159ffeb38fdedf8274369e137478727fb17edf3c393");
  2255         -  FeedZipHtml(zip_buf, 27575,
  2256         -              "03ec94fef539fbe771aeb530ced9e9d1a783d3139e89fef9d9");
  2257         -  FeedZipHtml(zip_buf, 27600,
  2258         -              "f8f7b1f97be1dbe30f47ed430d7cfad7e7ec9fc7b956fb38d9");
  2259         -  FeedZipHtml(zip_buf, 27625,
  2260         -              "05e57efa6cf9edd8d6af0c46bd48f3efcff91f8e0b3d0ae31d");
  2261         -  FeedZipHtml(zip_buf, 27650,
  2262         -              "ec9f1eefb7cf3fed9e1e1dedefb60f79d4e2af9f4b7e3e2efd");
  2263         -  FeedZipHtml(zip_buf, 27675,
  2264         -              "bd6422b37f66d0cc48d9efc95ec5faa452d86bf16476539717");
  2265         -  FeedZipHtml(zip_buf, 27700,
  2266         -              "2b3f7d64e359ba9be4e5ced69ebcd65b2daaf9ea7ca6d945f2");
  2267         -  FeedZipHtml(zip_buf, 27725,
  2268         -              "04c73fdd75d475764ced635220aebb1583994092ae53a3aeb1");
  2269         -  FeedZipHtml(zip_buf, 27750,
  2270         -              "3e6f912d4549e2e5ed18e68056967e16b0cfe6d2e515d38b69");
  2271         -  FeedZipHtml(zip_buf, 27775,
  2272         -              "40aea6104a703fd741c2e76373b297cd4dd62c6e90b3a6263d");
  2273         -  FeedZipHtml(zip_buf, 27800,
  2274         -              "3bc374f3549248bc52a7b52c2fea232e5ae5f2ecfb1a55f1b5");
  2275         -  FeedZipHtml(zip_buf, 27825,
  2276         -              "7bbb8a5e4ce39ce6ddfe5428ad4b1500c07894995ee5c1bceb");
  2277         -  FeedZipHtml(zip_buf, 27850,
  2278         -              "bb11bf97cf68e3bbedfb36234f0da8fdacffc401e018fa05e6");
  2279         -  FeedZipHtml(zip_buf, 27875,
  2280         -              "56db28d91c7cd008c2600d8b48f4dca8074b49e4166cdaef74");
  2281         -  FeedZipHtml(zip_buf, 27900,
  2282         -              "552eba1338b846cec5ff1ca1098f45e1b25b056246fb38f8ae");
  2283         -  FeedZipHtml(zip_buf, 27925,
  2284         -              "eb0b10adeffa3191eceb6aeadb3dc86e8fd2b34bc71a87ea0b");
  2285         -  FeedZipHtml(zip_buf, 27950,
  2286         -              "ca5cc192c87c1ae0e380275d441375a14cbb61470c5d8c9e8d");
  2287         -  FeedZipHtml(zip_buf, 27975,
  2288         -              "b2fc9bc284de0880eb6f7ef2fa6f83e435a08ca6d06026d1a4");
  2289         -  FeedZipHtml(zip_buf, 28000,
  2290         -              "1c4a65e5292b4e557d46dfef69dbd1fe5f20f204179b557665");
  2291         -  FeedZipHtml(zip_buf, 28025,
  2292         -              "46d8b9e8e261619a2166edb65c63cc7aa3b138539f6e85d99e");
  2293         -  FeedZipHtml(zip_buf, 28050,
  2294         -              "c2ea695e9c70767ed41a29cf9806904ae89cc64ea3b79fce86");
  2295         -  FeedZipHtml(zip_buf, 28075,
  2296         -              "78435b6291adfe48092ae7b2cb9cbbd8654b39d5ed79711764");
  2297         -  FeedZipHtml(zip_buf, 28100,
  2298         -              "7a1a7b59bbcdc45e0be7075d25b5ccb2a6639749b9bd1ce57a");
  2299         -  FeedZipHtml(zip_buf, 28125,
  2300         -              "51388e25d9d8a397a59a76172bde4ab01c03ec461e176605aa");
  2301         -  FeedZipHtml(zip_buf, 28150,
  2302         -              "a33a4292223ba679b664e92cc59babd0a2892d7a0ac6a5d1fc");
  2303         -  FeedZipHtml(zip_buf, 28175,
  2304         -              "5c0c70eb897ef3224caf9e5e3a16958ab5a39dee4b20304323");
  2305         -  FeedZipHtml(zip_buf, 28200,
  2306         -              "492c81ba18bab8494ea4df978ffb25547e4dc26b7e283f52c5");
  2307         -  FeedZipHtml(zip_buf, 28225,
  2308         -              "12857e5f41e964852bf3d47ac155f84dc6caed9eefefb4f79d");
  2309         -  FeedZipHtml(zip_buf, 28250,
  2310         -              "df0ecfdb1f768e9cf6cebba37d677d7dddf97001f67b66f416");
  2311         -  FeedZipHtml(zip_buf, 28275,
  2312         -              "fcbcb2980dbc549e8187a7d2d5d2e9de686a086d0945abe476");
  2313         -  FeedZipHtml(zip_buf, 28300,
  2314         -              "958476acf4b285b4ca38581e09a4d78e01a6ebd422058a7d1e");
  2315         -  FeedZipHtml(zip_buf, 28325,
  2316         -              "96327d37f1fc1e29adf37624c8fe5514d02bc28bec3265bb5a");
  2317         -  FeedZipHtml(zip_buf, 28350,
  2318         -              "6b1b4cdd16b6fd906be022adbbe1906ede6f750533ae6e86c9");
  2319         -  FeedZipHtml(zip_buf, 28375,
  2320         -              "877509e22c7c0bb198d736adc501e80e6b781b93a75cd20b2f");
  2321         -  FeedZipHtml(zip_buf, 28400,
  2322         -              "e07bceb3088ea6bd674eab0b18c662b62ba06adc9ecc744de0");
  2323         -  FeedZipHtml(zip_buf, 28425,
  2324         -              "c127e7a7bfabe88684ce08e5812acc37c79d68174e4396e0e7");
  2325         -  FeedZipHtml(zip_buf, 28450,
  2326         -              "6cfb43e5293cb5194b78608c843f69f09669882104d56ac3d2");
  2327         -  FeedZipHtml(zip_buf, 28475,
  2328         -              "e961d1580238557344791ec042a7b015a474b61a600ba58629");
  2329         -  FeedZipHtml(zip_buf, 28500,
  2330         -              "6643d1fd7641922a7ae728c316512bf4b9a73d9400a18a8371");
  2331         -  FeedZipHtml(zip_buf, 28525,
  2332         -              "3852dbde904202eeac9516b06d5232633cbd97d5d643591631");
  2333         -  FeedZipHtml(zip_buf, 28550,
  2334         -              "b94a6829bd5050793d32aad72b49f63b17cda9a298d9e52111");
  2335         -  FeedZipHtml(zip_buf, 28575,
  2336         -              "ec1a0866589cec3ebad51e84df0fdbbf9c7e6833550c37c223");
  2337         -  FeedZipHtml(zip_buf, 28600,
  2338         -              "23d014ab28dfa5466481e59b87a41025adabd521e29e0202bd");
  2339         -  FeedZipHtml(zip_buf, 28625,
  2340         -              "e4967d08ca3bd8fdffd97bf3e7b6b12441f8e79abf02e18d9d");
  2341         -  FeedZipHtml(zip_buf, 28650,
  2342         -              "a2762995edeaeee9965d8e9025d9ad2959f64a725d1d1d0a90");
  2343         -  FeedZipHtml(zip_buf, 28675,
  2344         -              "042994498005809258317ffce6f14ee0e120c553e6ccf7cd96");
  2345         -  FeedZipHtml(zip_buf, 28700,
  2346         -              "85c777e4cbcc97774e1d9e6aee47a49df9d83d1dbdda46ddfb");
  2347         -  FeedZipHtml(zip_buf, 28725,
  2348         -              "a9584e7b14d9e2e60c9852ee49dcab8a5591abe9d0480a79a1");
  2349         -  FeedZipHtml(zip_buf, 28750,
  2350         -              "4e6c34b7abe11281deb4e6769541a17c199d7fb02e3c16c032");
  2351         -  FeedZipHtml(zip_buf, 28775,
  2352         -              "f1788d025fd1fa574d368e412def5f80233704ea028abbad73");
  2353         -  FeedZipHtml(zip_buf, 28800,
  2354         -              "46e975c77433d0147b62675a7bd14a251d001f40740828b35f");
  2355         -  FeedZipHtml(zip_buf, 28825,
  2356         -              "2789bf04113b06caa971850497f046974f72650bd505efc96b");
  2357         -  FeedZipHtml(zip_buf, 28850,
  2358         -              "b426a3e09a31d0031bb6d8012733cacc9432093b6322ef07cf");
  2359         -  FeedZipHtml(zip_buf, 28875,
  2360         -              "082ed4f95e7c29faa0395ec1858de512df7c832725d0f83a96");
  2361         -  FeedZipHtml(zip_buf, 28900,
  2362         -              "dafe215f4b57b40f4c820e281f999977e5de9c157569cf4836");
  2363         -  FeedZipHtml(zip_buf, 28925,
  2364         -              "bb5ec890d273b27922ed26984e692576952559ed985c8ec99d");
  2365         -  FeedZipHtml(zip_buf, 28950,
  2366         -              "f10d82e873ee4f81f1601b8b340bbb8ebe01a54391e1358842");
  2367         -  FeedZipHtml(zip_buf, 28975,
  2368         -              "2cfdb58bbffdab8cc3ad80879d8d00d221ec74c812411efb42");
  2369         -  FeedZipHtml(zip_buf, 29000,
  2370         -              "7594d4ee854827f30c18cec6c9d43ca99ac1207cb9664ff4cd");
  2371         -  FeedZipHtml(zip_buf, 29025,
  2372         -              "f90611d10ae155de30761198214d64399f000303de72f2b694");
  2373         -  FeedZipHtml(zip_buf, 29050,
  2374         -              "e5391626df4b20481e97ccad928add38139606e15d20d4fb42");
  2375         -  FeedZipHtml(zip_buf, 29075,
  2376         -              "0ae452ac44cc05df183e64d45d0ff93466bf326c382a9b1991");
  2377         -  FeedZipHtml(zip_buf, 29100,
  2378         -              "6f72d807c0ecf74354a08d5e0d64a3881362e3083c8ca4146e");
  2379         -  FeedZipHtml(zip_buf, 29125,
  2380         -              "8ba13fc526a121e66df7265d79310043fe691a625ca8089824");
  2381         -  FeedZipHtml(zip_buf, 29150,
  2382         -              "bffcc18348b4898ca6e448c8c2bd3abcf7a7a951299efb9523");
  2383         -  FeedZipHtml(zip_buf, 29175,
  2384         -              "0a22e2183196b7fe781c44a544fd79dc88a09dc31a1173c92f");
  2385         -  FeedZipHtml(zip_buf, 29200,
  2386         -              "378d90799b3544eafdeb1d687e13b8e263ecea43e0be8e3318");
  2387         -  FeedZipHtml(zip_buf, 29225,
  2388         -              "798abef6ecdf0ba462494c3b0a9ec522f43ec8e8d2f83e1c29");
  2389         -  FeedZipHtml(zip_buf, 29250,
  2390         -              "82d6f719d1f05f464cf9db3806c61171d989559429b9d4b5b2");
  2391         -  FeedZipHtml(zip_buf, 29275,
  2392         -              "4e23e04b18c9edbc0613214976eb60d1081cd0891f78bfb130");
  2393         -  FeedZipHtml(zip_buf, 29300,
  2394         -              "6910285ed586d9e0ff083185a29bbf63ba2024312afd88c0ed");
  2395         -  FeedZipHtml(zip_buf, 29325,
  2396         -              "7c380862bc648f867c02d78ff20de60677b3a1361937eb6089");
  2397         -  FeedZipHtml(zip_buf, 29350,
  2398         -              "ff736de615060f22484749484918dc9951bc061933573e2c50");
  2399         -  FeedZipHtml(zip_buf, 29375,
  2400         -              "2b0ee3ee1965a9312200053192ec3d9f4eafaece3e9c5d5d9f");
  2401         -  FeedZipHtml(zip_buf, 29400,
  2402         -              "1d9352d264dff27fd0b10ce8af235244ffbab6470da3b03204");
  2403         -  FeedZipHtml(zip_buf, 29425,
  2404         -              "8749ab01239f5b392ad339d3abfb78f0833ebf460822790312");
  2405         -  FeedZipHtml(zip_buf, 29450,
  2406         -              "77f2b52a345bb0d23515aad116444e83e83665f11911e34321");
  2407         -  FeedZipHtml(zip_buf, 29475,
  2408         -              "5f46ee0fed4a6fc927063b254ed802f07dfc746d404f41a4ed");
  2409         -  FeedZipHtml(zip_buf, 29500,
  2410         -              "81983a162636a17aec1d38994a5360970adfc854f9f1147dff");
  2411         -  FeedZipHtml(zip_buf, 29525,
  2412         -              "b097a096c9c95b215cd684b03e534db9fdac34e3a0cc0de4cc");
  2413         -  FeedZipHtml(zip_buf, 29550,
  2414         -              "4e406e926f51b4b27cbd847674d3955bd2f95a762a48e70def");
  2415         -  FeedZipHtml(zip_buf, 29575,
  2416         -              "1d83c8f65f2ec883de1201f07b39968fe9711408bf570d7a67");
  2417         -  FeedZipHtml(zip_buf, 29600,
  2418         -              "ea4619ecdd791e6b05fe1d6d29077c6133c87fbb91b90e92c0");
  2419         -  FeedZipHtml(zip_buf, 29625,
  2420         -              "36ee7a6c2b19aae22a3ae99a3d46ce2686ce81e2b976b7bacf");
  2421         -  FeedZipHtml(zip_buf, 29650,
  2422         -              "59705c83c44d86cb4dfeb2539c92001ec7cc27917da836a972");
  2423         -  FeedZipHtml(zip_buf, 29675,
  2424         -              "11e5d1088e7831acba8bdcc8b5ded6e7f12081f7a6feb64a06");
  2425         -  FeedZipHtml(zip_buf, 29700,
  2426         -              "b6bcaaecbcb55cc684775a7315e2e9c2bfa69952ca68de16fe");
  2427         -  FeedZipHtml(zip_buf, 29725,
  2428         -              "f2e4ada4368e0426e74fe6a11e9951c87b21d4d4276d52c7df");
  2429         -  FeedZipHtml(zip_buf, 29750,
  2430         -              "8a7d18697a672adb349f6d6c46301bd2870e6ce5a4637934d5");
  2431         -  FeedZipHtml(zip_buf, 29775,
  2432         -              "bddbef83ee4a73070f41970a8b21ba84a2cea54abc937a03d6");
  2433         -  FeedZipHtml(zip_buf, 29800,
  2434         -              "1f30d63ea8d49195fa2b5d611c441b7752d84ba634594a6064");
  2435         -  FeedZipHtml(zip_buf, 29825,
  2436         -              "cb2dc519b75e7b7f39787e209b8c639e71476dbdb7467c5f40");
  2437         -  FeedZipHtml(zip_buf, 29850,
  2438         -              "0507d4f6bba0ef0fe341453f470a5a8091c73c92f8ba444053");
  2439         -  FeedZipHtml(zip_buf, 29875,
  2440         -              "fffeaacb3988e8180da6ea37bc3070d674e5e53ce7d4829a12");
  2441         -  FeedZipHtml(zip_buf, 29900,
  2442         -              "1a3131f0c6c00fbbfc41feeb4d6ad961644c64ada40b87722d");
  2443         -  FeedZipHtml(zip_buf, 29925,
  2444         -              "156a8fc0381e4f18d5d218f9482f48bb49081f4051026e450b");
  2445         -  FeedZipHtml(zip_buf, 29950,
  2446         -              "7d27543421d71b0c42700fc4e093b7cdb434214773bbc38596");
  2447         -  FeedZipHtml(zip_buf, 29975,
  2448         -              "54a85d7a3d25179a006525614a6cce3228a3deb8e71c5c9361");
  2449         -  FeedZipHtml(zip_buf, 30000,
  2450         -              "5f218fd58a61796b611ddce6dfe588d519b76f745147589e39");
  2451         -  FeedZipHtml(zip_buf, 30025,
  2452         -              "b23997a0caf5544654d51390a3e01122a6ab044d5bb91564bf");
  2453         -  FeedZipHtml(zip_buf, 30050,
  2454         -              "236b275937414f0d11eeebca12112623dd264160b96c659f57");
  2455         -  FeedZipHtml(zip_buf, 30075,
  2456         -              "614e91561edb9ee3be3975e8fafd98dc1cc065e7f5c10a6142");
  2457         -  FeedZipHtml(zip_buf, 30100,
  2458         -              "c24b8ad52c5591d924be47f0e4b2e0fa5476368ccadf98e630");
  2459         -  FeedZipHtml(zip_buf, 30125,
  2460         -              "128d6a7340ea53b6970d239f1cd68dc032422b8e79e2b4504b");
  2461         -  FeedZipHtml(zip_buf, 30150,
  2462         -              "a2216ae30387f5d850dec52c458375d0fe440a8280e6d44a6a");
  2463         -  FeedZipHtml(zip_buf, 30175,
  2464         -              "a251c4183453e143453dae01a2f88973aeec3ef6e4f63b01f6");
  2465         -  FeedZipHtml(zip_buf, 30200,
  2466         -              "975066dd509ad09abf316e48159f7a5092828cd25f94a9944f");
  2467         -  FeedZipHtml(zip_buf, 30225,
  2468         -              "2d23de105549dbd00e82c3da1de0858cc2542196858e4a4911");
  2469         -  FeedZipHtml(zip_buf, 30250,
  2470         -              "355206519c48f9bfc9d196fa7c2e401748b3e930a8d002aece");
  2471         -  FeedZipHtml(zip_buf, 30275,
  2472         -              "4fbe039d042b8600d8c99ef835cafcc5640cb3844a6936865d");
  2473         -  FeedZipHtml(zip_buf, 30300,
  2474         -              "67a52ae6d0319eb4ad87a049c993b9e669af40f7f8c73f7acf");
  2475         -  FeedZipHtml(zip_buf, 30325,
  2476         -              "fff18f675879e461347ce9563f54814f61ab30d00fc3a99c18");
  2477         -  FeedZipHtml(zip_buf, 30350,
  2478         -              "d879e32a21dea07a9800867cf4e1f91886dd10b507dc0457c8");
  2479         -  FeedZipHtml(zip_buf, 30375,
  2480         -              "32dfff8867a7ca48eab730a734b688a201228e01f7acac3346");
  2481         -  FeedZipHtml(zip_buf, 30400,
  2482         -              "012d34abc1ee5b6847a0c8201c482554c8a98493bf9ebcf9e5");
  2483         -  FeedZipHtml(zip_buf, 30425,
  2484         -              "eac44be1f3c857f3c511d73a0edfece5fd20f3d583ab3fb0f0");
  2485         -  FeedZipHtml(zip_buf, 30450,
  2486         -              "e356c83e2007c4238ce261af9aa574c10b1d47f110ffd1cd5b");
  2487         -  FeedZipHtml(zip_buf, 30475,
  2488         -              "6a161fbb546f4439f47434122dad3c2aeeaa99b82700a96547");
  2489         -  FeedZipHtml(zip_buf, 30500,
  2490         -              "0a65ac053e02027894c047126f75e126ad3fd7946b42a712e9");
  2491         -  FeedZipHtml(zip_buf, 30525,
  2492         -              "ba6ca872541a15e4c1959c81e6605c4f29bda55e9eabd31b95");
  2493         -  FeedZipHtml(zip_buf, 30550,
  2494         -              "7569ad5de45aa5435b9eb4e3bbd58ffe4d856ed2bfc919bc67");
  2495         -  FeedZipHtml(zip_buf, 30575,
  2496         -              "a8a6b69e1d0167843b2efeceefa0db8fc9953f784fe4046dde");
  2497         -  FeedZipHtml(zip_buf, 30600,
  2498         -              "6c98defc3101a94baa9f143a203b55c2c7a01766d6370e2b58");
  2499         -  FeedZipHtml(zip_buf, 30625,
  2500         -              "f16b0148cda0f44c54d6c583d11d2d884309bc322897e8ada4");
  2501         -  FeedZipHtml(zip_buf, 30650,
  2502         -              "fb84751f925f927c3a1d7580a575391a205fce8b522a02ac25");
  2503         -  FeedZipHtml(zip_buf, 30675,
  2504         -              "92db1585347c4a4292687f0ca64e2e0eeb9a376d328cc2250b");
  2505         -  FeedZipHtml(zip_buf, 30700,
  2506         -              "2b7b60293d24b73ab805ec8d9a580843186ca518391ce66a5b");
  2507         -  FeedZipHtml(zip_buf, 30725,
  2508         -              "ca4d59853c745410be288856e6262546891a2b22e91964f748");
  2509         -  FeedZipHtml(zip_buf, 30750,
  2510         -              "44caa2f0ac2a742283ee806e0b22fbed0454210cececf99d10");
  2511         -  FeedZipHtml(zip_buf, 30775,
  2512         -              "de8ba9e37d23c3a47b2326aa9afb31b054816b18f43177de2a");
  2513         -  FeedZipHtml(zip_buf, 30800,
  2514         -              "145ab82c4b79888290c2d8343544a89188890fb6e121ab7f0e");
  2515         -  FeedZipHtml(zip_buf, 30825,
  2516         -              "044dfc1406f78dde04c7f83a267607632bbea8f4ccb95e8495");
  2517         -  FeedZipHtml(zip_buf, 30850,
  2518         -              "ed6749efc1c6eeffab790d10f41bf618a81bb68229cccb7de4");
  2519         -  FeedZipHtml(zip_buf, 30875,
  2520         -              "2b8073a5f99765f7162ce02d9057781173754d34579a98a6e7");
  2521         -  FeedZipHtml(zip_buf, 30900,
  2522         -              "5775b9d868a90849f99ab9e4ad5084e93b39ada522964ac3f6");
  2523         -  FeedZipHtml(zip_buf, 30925,
  2524         -              "24ea05093753b0560acd560908d77d0c8164150f1fa796fadb");
  2525         -  FeedZipHtml(zip_buf, 30950,
  2526         -              "0faf45a399bd27f2aa99153b9aa93a8e1fd4f3e124abf8f2b8");
  2527         -  FeedZipHtml(zip_buf, 30975,
  2528         -              "776d751b5a96a2b3b107a87fd936fff1b24ad26ca23ea3aed2");
  2529         -  FeedZipHtml(zip_buf, 31000,
  2530         -              "7ec28c5b7cf4139664dbf88439f7e17cc0e0a28a0fd5efc1a8");
  2531         -  FeedZipHtml(zip_buf, 31025,
  2532         -              "fcb512114a6a9aca77c94221658ba21b11e93a38dd135377ae");
  2533         -  FeedZipHtml(zip_buf, 31050,
  2534         -              "e371fc3e881bbd09b9b175cc2b83e1c378309d218620cf3317");
  2535         -  FeedZipHtml(zip_buf, 31075,
  2536         -              "b8e292b8fa1a77f8e415926b01ac7dd5f469b3583a5e26f05b");
  2537         -  FeedZipHtml(zip_buf, 31100,
  2538         -              "6bd9f978b7408b30d8027ebdf92ac7b6f3e38b206bcc8f8db1");
  2539         -  FeedZipHtml(zip_buf, 31125,
  2540         -              "75bc270a324c857d243b5ecc824be4c6ebd9e0d7c38c2f1868");
  2541         -  FeedZipHtml(zip_buf, 31150,
  2542         -              "1bc88be13a17c08b0552ec38f157ca893f474973cf70d9e06a");
  2543         -  FeedZipHtml(zip_buf, 31175,
  2544         -              "ceb3126a8f4763cce5a07c4f51fd35cafbc7cb380105ac8551");
  2545         -  FeedZipHtml(zip_buf, 31200,
  2546         -              "77382122c160b0fe24c12bef05632c97f5aaccd076ad4d7618");
  2547         -  FeedZipHtml(zip_buf, 31225,
  2548         -              "1281092513dac4249259348d390735917746eae5f6bce51877");
  2549         -  FeedZipHtml(zip_buf, 31250,
  2550         -              "156436f69c45fdd8113f553ab456eb68f894d53db518bfb79a");
  2551         -  FeedZipHtml(zip_buf, 31275,
  2552         -              "4dd06339df4bba7cd23283bb3907638ca546e0d2010cd81337");
  2553         -  FeedZipHtml(zip_buf, 31300,
  2554         -              "ee86be6cb05c42624b2502f528563e474940cd77a3ace4206c");
  2555         -  FeedZipHtml(zip_buf, 31325,
  2556         -              "864f83acf9fbd7f4d911ada873615732ab05ee62842da98571");
  2557         -  FeedZipHtml(zip_buf, 31350,
  2558         -              "28ff1401216bcc8005be7b3a6f4f81b28ee3f1340907b78e52");
  2559         -  FeedZipHtml(zip_buf, 31375,
  2560         -              "1895c3eb88b12b073e9ef81fbd66db032408a2b4f04aae8e92");
  2561         -  FeedZipHtml(zip_buf, 31400,
  2562         -              "d5190861cfc576368e9ebb2636e88c00e644fa0cb7f110de65");
  2563         -  FeedZipHtml(zip_buf, 31425,
  2564         -              "6af2fdda68885d28f7a013cb4413ee5e234ae7a67904227da2");
  2565         -  FeedZipHtml(zip_buf, 31450,
  2566         -              "4475edc60c5a4a32c34ad0029498d8ce6252aeb12c968bbe11");
  2567         -  FeedZipHtml(zip_buf, 31475,
  2568         -              "931989306d0cc10c0e06078801c7c7cfbd17a245255634c6bf");
  2569         -  FeedZipHtml(zip_buf, 31500,
  2570         -              "786f7fc55454fcdb9693bc3b0eceddfbb172781df92db15164");
  2571         -  FeedZipHtml(zip_buf, 31525,
  2572         -              "258d1df57a42f4a49c657a60f0e897a2c02ef5032a08a67962");
  2573         -  FeedZipHtml(zip_buf, 31550,
  2574         -              "580579a9620c73ea8e0dfa246f299296a939a5685af5834d45");
  2575         -  FeedZipHtml(zip_buf, 31575,
  2576         -              "d4cb7235a90c7729e3c69f1b59650eb1c43b1b79a9c493d128");
  2577         -  FeedZipHtml(zip_buf, 31600,
  2578         -              "c5b519dcc9b6e316bdc1369a9495ffaa1c5e954b2284978a1f");
  2579         -  FeedZipHtml(zip_buf, 31625,
  2580         -              "cfd922bbc1c4335a021634f3da13597229b0fa4a3d2a6886f6");
  2581         -  FeedZipHtml(zip_buf, 31650,
  2582         -              "3c23a7a540446d9711c2309c95528383f8f25e663731e60b75");
  2583         -  FeedZipHtml(zip_buf, 31675,
  2584         -              "a8f6f3d9ad9fc95444a75d4c27d6bd127922ba1c974f456494");
  2585         -  FeedZipHtml(zip_buf, 31700,
  2586         -              "f093fb7d6ac86031521c5700b4321fbdd6c857f5d5e0132616");
  2587         -  FeedZipHtml(zip_buf, 31725,
  2588         -              "82363d0aca925fcc73362847524875a94a72d1954778595742");
  2589         -  FeedZipHtml(zip_buf, 31750,
  2590         -              "2f26b85c9ba548b69a3fb925ae1f83e97d9ccc22a3c99fd491");
  2591         -  FeedZipHtml(zip_buf, 31775,
  2592         -              "ed171eb60693214b6a880f5ff4e936483e337745f388f08efc");
  2593         -  FeedZipHtml(zip_buf, 31800,
  2594         -              "de648a7c8ae07d2236c23281aa0a0f6b7eb3b988582189e5d0");
  2595         -  FeedZipHtml(zip_buf, 31825,
  2596         -              "6031025801b16a6530f18b2d472ac9a8f06d46a6fe3ef1c7b7");
  2597         -  FeedZipHtml(zip_buf, 31850,
  2598         -              "61b792a9e5c6b6bc8761187db9b90595a78041a02bc5136c0d");
  2599         -  FeedZipHtml(zip_buf, 31875,
  2600         -              "8536daf38f6f6771e53e7a9d992dce58116b5dde9ab3280d92");
  2601         -  FeedZipHtml(zip_buf, 31900,
  2602         -              "0c9e7ab86e1625b080422405272a322c20e15d8ad356989d34");
  2603         -  FeedZipHtml(zip_buf, 31925,
  2604         -              "ac08a7f3de56545ac9d92aa76aea654d8ca51d75267c0fa12f");
  2605         -  FeedZipHtml(zip_buf, 31950,
  2606         -              "6bcab2d086a0837907c17783b08ff3b6f55fc60c61e32fbf8f");
  2607         -  FeedZipHtml(zip_buf, 31975,
  2608         -              "838161e8e13fa67783ff0b20a3bf8ffde930f69b19aa6c976c");
  2609         -  FeedZipHtml(zip_buf, 32000,
  2610         -              "bb6000971965a19966b62827ed36f203fd6034e108a5a32b68");
  2611         -  FeedZipHtml(zip_buf, 32025,
  2612         -              "7515b47412a0df337546312c869ea810af9c46d110d3408f56");
  2613         -  FeedZipHtml(zip_buf, 32050,
  2614         -              "7f2a2f033fac5466a081a84be35a1e95cfa8e3f94b63a1be17");
  2615         -  FeedZipHtml(zip_buf, 32075,
  2616         -              "05f786955e6d9e1f6feaed5072cda91aeae06d91f7cb6858e0");
  2617         -  FeedZipHtml(zip_buf, 32100,
  2618         -              "6f5c93c0aa0822934cc4fa78d3ba5024568a5469efbd5c2d0c");
  2619         -  FeedZipHtml(zip_buf, 32125,
  2620         -              "5a1a3b94711e3d970fc0c603469b3211a562565d60c6c7fab2");
  2621         -  FeedZipHtml(zip_buf, 32150,
  2622         -              "dc63ee00b73ea8c7027f388d860bd9c301b0920fa0f12f1fce");
  2623         -  FeedZipHtml(zip_buf, 32175,
  2624         -              "bd2b2eb3f0932ab360ec9bab752b3d964faab4425d9c488486");
  2625         -  FeedZipHtml(zip_buf, 32200,
  2626         -              "60375fb80c7e79c866463f1076b3580d505f2e944c36c9e211");
  2627         -  FeedZipHtml(zip_buf, 32225,
  2628         -              "569d16ed5fac42e002ceb0d92d27b0bc6c5e4e62ce9182c86e");
  2629         -  FeedZipHtml(zip_buf, 32250,
  2630         -              "8a96d27f79a2c7637083a687dcd7ea965475ab49e1e83a78c8");
  2631         -  FeedZipHtml(zip_buf, 32275,
  2632         -              "e65d6c15ca8281a7b3f3816b2a7b8e28c984cfe7eb69c140b9");
  2633         -  FeedZipHtml(zip_buf, 32300,
  2634         -              "ba6a91bd5787ec067d1d45d37b7f4a562ea3a0182f8e2973f4");
  2635         -  FeedZipHtml(zip_buf, 32325,
  2636         -              "3bbb08989852518e2e8ffe3b13beb007e1ff731f936c89fd4d");
  2637         -  FeedZipHtml(zip_buf, 32350,
  2638         -              "f678b214bb092581d694cda9b2db0916d1e2fa5efea8130e26");
  2639         -  FeedZipHtml(zip_buf, 32375,
  2640         -              "8e18b47b692d7a5d595b46e24749b5154779399bbbc81b4089");
  2641         -  FeedZipHtml(zip_buf, 32400,
  2642         -              "0c0f1366dfa6c65dabdbe8b0be26f6272f9e6be450891c25f5");
  2643         -  FeedZipHtml(zip_buf, 32425,
  2644         -              "21b25224135a16533d475a58d3cf3480d0e66672f2426b97dc");
  2645         -  FeedZipHtml(zip_buf, 32450,
  2646         -              "e54d142da90b74ef1a5da6fa76ec9deb8de7af77cb39e06580");
  2647         -  FeedZipHtml(zip_buf, 32475,
  2648         -              "827cbd80911b55cef9dacd040f5bd92c99bdc0e91a4ebe342b");
  2649         -  FeedZipHtml(zip_buf, 32500,
  2650         -              "7a8930bb9371162de3c8163a060b425884d1443e0845262ca3");
  2651         -  FeedZipHtml(zip_buf, 32525,
  2652         -              "2a4aa41d2c4529bc20395947c5495a328fdc82dfedc6097228");
  2653         -  FeedZipHtml(zip_buf, 32550,
  2654         -              "f441c44f47f671280d9a3f3751317874ad1fb9844fcc549868");
  2655         -  FeedZipHtml(zip_buf, 32575,
  2656         -              "e6f50a9c6325967b19a36447f76bb6908b5c32ebc62d367a49");
  2657         -  FeedZipHtml(zip_buf, 32600,
  2658         -              "3657b1e48423a768c6b42042011b095561890621e9e9152fe9");
  2659         -  FeedZipHtml(zip_buf, 32625,
  2660         -              "0b51ca084a820b80e117b27227cb72868507915c8a4b17dcdd");
  2661         -  FeedZipHtml(zip_buf, 32650,
  2662         -              "48883d310842adde04251680efb6d703708af715c457317e49");
  2663         -  FeedZipHtml(zip_buf, 32675,
  2664         -              "e4f7e815d74280a612226831a46e83d97d801d529d444992e8");
  2665         -  FeedZipHtml(zip_buf, 32700,
  2666         -              "4650a511e3b8a3caf53d885c2eb1deda668cdb186b1bef697d");
  2667         -  FeedZipHtml(zip_buf, 32725,
  2668         -              "92a858ff0949a23b6bdb129ebd3a12738e5c81b5cdb1da765a");
  2669         -  FeedZipHtml(zip_buf, 32750,
  2670         -              "db66e4033b6bdb53b1b61918bc65d63663e74fdcda562f60e4");
  2671         -  FeedZipHtml(zip_buf, 32775,
  2672         -              "462dc1dad684d36da8b56d27e3ecac6d5b48f90509a381b5ad");
  2673         -  FeedZipHtml(zip_buf, 32800,
  2674         -              "307a5e75bfa9b96dce050bac632df6b6026390f636f3c36235");
  2675         -  FeedZipHtml(zip_buf, 32825,
  2676         -              "7b31f3cedeb6d1c4e714f01bd9db164680f3a8204fc2de5620");
  2677         -  FeedZipHtml(zip_buf, 32850,
  2678         -              "4a656f5b3b55eeec6d1bf42436ceb92d0edfd454c6f9726e05");
  2679         -  FeedZipHtml(zip_buf, 32875,
  2680         -              "f22e30a7233fe32ee776fea763869cdbed41d4f9736ee745d6");
  2681         -  FeedZipHtml(zip_buf, 32900,
  2682         -              "5dcead4a2ab5d1a436e7d635bc71ceadf3c78bc8b9754fbc88");
  2683         -  FeedZipHtml(zip_buf, 32925,
  2684         -              "9cdbd967deba9cdb1c116d68ce6d6e9733e7dce67ebfcbb9dd");
  2685         -  FeedZipHtml(zip_buf, 32950,
  2686         -              "78fee496b89ae4dc3a7fb1b9998eb3a4dcae433cdba5dcce86");
  2687         -  FeedZipHtml(zip_buf, 32975,
  2688         -              "8635bfd95c449c39e5f691f2d7d79a727b15646c76789fc493");
  2689         -  FeedZipHtml(zip_buf, 33000,
  2690         -              "7165a1c7fcb89637c0ff5e4e89c7d564b436ae98284c3374f8");
  2691         -  FeedZipHtml(zip_buf, 33025,
  2692         -              "0ad38c06888bd379e62c87d2b061fed1ebc5411a7d9b795378");
  2693         -  FeedZipHtml(zip_buf, 33050,
  2694         -              "96892d82f493e987577736e5fea385bcd3d7cb28b2b88d78ad");
  2695         -  FeedZipHtml(zip_buf, 33075,
  2696         -              "199f81b6352cd2185981dbeb2a96eb424336214653ea1e4d3e");
  2697         -  FeedZipHtml(zip_buf, 33100,
  2698         -              "ff2c18cd859bc62b6c2eb2e5587059bc598e40ac94d90aa32b");
  2699         -  FeedZipHtml(zip_buf, 33125,
  2700         -              "39ddba0b2bcb5d5ba1d674c564f5d52d9fb78b8d2d20aaf489");
  2701         -  FeedZipHtml(zip_buf, 33150,
  2702         -              "602c4b364d3196476f13c6eaf37d3d185be297d9468cb52543");
  2703         -  FeedZipHtml(zip_buf, 33175,
  2704         -              "3ad1273f8cb28f49af046b2b7fd1a237cc19e033c64137318e");
  2705         -  FeedZipHtml(zip_buf, 33200,
  2706         -              "5a8731eb9402d71007404084099459cbd8176b247152c06cac");
  2707         -  FeedZipHtml(zip_buf, 33225,
  2708         -              "1fb200e6ccb135f905438e7b1eb0058c11425971a2e021f3fc");
  2709         -  FeedZipHtml(zip_buf, 33250,
  2710         -              "3bb8772a50cde01bc76968d974ec18143e206c06ebb064f1d8");
  2711         -  FeedZipHtml(zip_buf, 33275,
  2712         -              "1b0677c1505461510133af276f3e0d030c7d8ba869d9e4cd21");
  2713         -  FeedZipHtml(zip_buf, 33300,
  2714         -              "ad48db432ce7b56809d1b1ac1f0f87f13d8da22b87cfc904eb");
  2715         -  FeedZipHtml(zip_buf, 33325,
  2716         -              "eb8607c101d9b5ee7177f8699f7f6d5406167374c40a188113");
  2717         -  FeedZipHtml(zip_buf, 33350,
  2718         -              "00ac8d055114ba0d07b7f277075eb9cf3357390cfe3f9328bd");
  2719         -  FeedZipHtml(zip_buf, 33375,
  2720         -              "33c0427d3d16afe892522af762f8486dcfa8c0638ef47c4224");
  2721         -  FeedZipHtml(zip_buf, 33400,
  2722         -              "ce009b89c6f33fc93f4f46a05db54162eb58c08ee23796e20d");
  2723         -  FeedZipHtml(zip_buf, 33425,
  2724         -              "3a17e10ea9df6795cb0ccfcd45333c2952668e371329e77ff2");
  2725         -  FeedZipHtml(zip_buf, 33450,
  2726         -              "f590f2a3e5d41d292f9c948b4ff6d743ca4ec3559350befcf0");
  2727         -  FeedZipHtml(zip_buf, 33475,
  2728         -              "52917ba5867e232ecc8e56ad929fc9f83f2b1dee84c085a15b");
  2729         -  FeedZipHtml(zip_buf, 33500,
  2730         -              "8535ad62fc9c6fc6bad171d9d8b7e3620d4c5e15e3b714ad0a");
  2731         -  FeedZipHtml(zip_buf, 33525,
  2732         -              "72c5a2d0ea6b7e1ca58d9160569fc1ae876d4c023b3f33abca");
  2733         -  FeedZipHtml(zip_buf, 33550,
  2734         -              "ed823fa3cbe981177c22d95c4bc858cf0ff86a13d76b08cb35");
  2735         -  FeedZipHtml(zip_buf, 33575,
  2736         -              "700569ebc5c5b6336b7d36e2df25adef92d67749ebab4a5aaf");
  2737         -  FeedZipHtml(zip_buf, 33600,
  2738         -              "1529ec414b48596fc0e53634637d27d4ec52d4b781ce0b1a66");
  2739         -  FeedZipHtml(zip_buf, 33625,
  2740         -              "bd0a911f5c1982316772ec23d6da883a9079f25f6878657d08");
  2741         -  FeedZipHtml(zip_buf, 33650,
  2742         -              "db2e197da3c8cc69ca69a252ac82d41eb5dac6e6a0e70950a5");
  2743         -  FeedZipHtml(zip_buf, 33675,
  2744         -              "a0af89027789e72ba640498270e6613af601cbfefaac1cdffa");
  2745         -  FeedZipHtml(zip_buf, 33700,
  2746         -              "cffbcfbbcf9f8903de7effe6b5efe1e5fff06cfce26f216a2e");
  2747         -  FeedZipHtml(zip_buf, 33725,
  2748         -              "99ffec0de67af52711257aa56642dfd9d547ef030cc1aedaaf");
  2749         -  FeedZipHtml(zip_buf, 33750,
  2750         -              "bff361133885633bb7c69abde7f8bfcfdebc1333c2d05b89e4");
  2751         -  FeedZipHtml(zip_buf, 33775,
  2752         -              "ae71575310fd1eea467d7c7f8c6294308dd68d1689763dfcc9");
  2753         -  FeedZipHtml(zip_buf, 33800,
  2754         -              "28ee4d905a6a76311961b32a1ae6e0762c6a9ea5b104074b9b");
  2755         -  FeedZipHtml(zip_buf, 33825,
  2756         -              "453e5732b02aaff59bb2df78423e5d875b8ff7440981a02f63");
  2757         -  FeedZipHtml(zip_buf, 33850,
  2758         -              "bd28da93891d00161b41dc5c479061b5be2ee4705613746fac");
  2759         -  FeedZipHtml(zip_buf, 33875,
  2760         -              "16aab744647b6d72aa0b8e9017deef8224455e29ea5add09d9");
  2761         -  FeedZipHtml(zip_buf, 33900,
  2762         -              "1b36799d84830186aaeae4c734031eb1ddbaac94230d9c29a2");
  2763         -  FeedZipHtml(zip_buf, 33925,
  2764         -              "a26310a89bdd785c7cf546e27b5355f6b153b7e1d191805dee");
  2765         -  FeedZipHtml(zip_buf, 33950,
  2766         -              "3ad88ced4cea53c9a6e42d7127be3cf534d0a6f1e83454bcb3");
  2767         -  FeedZipHtml(zip_buf, 33975,
  2768         -              "68c689a929da2452bc5174c083030f7b57808ec484c51f61cf");
  2769         -  FeedZipHtml(zip_buf, 34000,
  2770         -              "c380f8b2f545ac12be81cd86c8d7c470dc1a30003d277005c0");
  2771         -  FeedZipHtml(zip_buf, 34025,
  2772         -              "e3ebe938c8ff4dfddbcf00c2a092daa3d45f730ba214a00601");
  2773         -  FeedZipHtml(zip_buf, 34050,
  2774         -              "afe64817de2b2c3e8c0713fd3d25dd5afd13de8d388a4753fd");
  2775         -  FeedZipHtml(zip_buf, 34075,
  2776         -              "3dee67f7bed88b79a6bbb01b3860f04f3fe9a9f1f8298aa3f7");
  2777         -  FeedZipHtml(zip_buf, 34100,
  2778         -              "413ce04e6e27b9c3f742a04a849990b2c23779c908ae68645e");
  2779         -  FeedZipHtml(zip_buf, 34125,
  2780         -              "a8aba521d3b83431a4598ce8c8598a069a573526ec8709886d");
  2781         -  FeedZipHtml(zip_buf, 34150,
  2782         -              "6872f05a6865d5fd0931d57d4f86358c8304c7a4a269e2d9c5");
  2783         -  FeedZipHtml(zip_buf, 34175,
  2784         -              "d5e9e535eefa158a468839e55d0e4365477ecd0d0d350d09b9");
  2785         -  FeedZipHtml(zip_buf, 34200,
  2786         -              "13a7fcfce9e4e8fad410c1ec368762036c15f673855714bd26");
  2787         -  FeedZipHtml(zip_buf, 34225,
  2788         -              "f13d8967b6f3739bb9f3fb20336ef2cc91d99b1fd15a3f9fba");
  2789         -  FeedZipHtml(zip_buf, 34250,
  2790         -              "1470450b958e7e6134b06f0e1059189b2a1858ce88e5c4a203");
  2791         -  FeedZipHtml(zip_buf, 34275,
  2792         -              "c5e7cffa5e14e79631273727e6ec0e515a428aad568c9ac001");
  2793         -  FeedZipHtml(zip_buf, 34300,
  2794         -              "80d86fa7971f19e3e11ffb2f0898daa62dee161161755277bf");
  2795         -  FeedZipHtml(zip_buf, 34325,
  2796         -              "17e7256ecc4e0970553cf6bb938fdf7d7c7f49a64f1061b80f");
  2797         -  FeedZipHtml(zip_buf, 34350,
  2798         -              "e857287c5bd2f76dd0fd72c5759910254e9cf28e6b54cbbb8b");
  2799         -  FeedZipHtml(zip_buf, 34375,
  2800         -              "e15a6b4ab4b87fd9ebdc8c41e50c1f96438d3dc0123c7c07de");
  2801         -  FeedZipHtml(zip_buf, 34400,
  2802         -              "18c741389e556c4a1302f23d16850502c3ae0e959c20de20c4");
  2803         -  FeedZipHtml(zip_buf, 34425,
  2804         -              "74a0c6fd1cdb4a91f185446a47d7d747c7ff3c3dd93f795ba4");
  2805         -  FeedZipHtml(zip_buf, 34450,
  2806         -              "5475709a85e9cde4c7bcc873b18694ef3b6f06012a94c9f406");
  2807         -  FeedZipHtml(zip_buf, 34475,
  2808         -              "8e381945a9f1849416d5a2c42daa0221e99af708538689e777");
  2809         -  FeedZipHtml(zip_buf, 34500,
  2810         -              "f129f186fe140df832c74bf389944b5b4cbd2f517c1f6942f2");
  2811         -  FeedZipHtml(zip_buf, 34525,
  2812         -              "19f7733b7ea177dc890111854a430bb7c994c2ab8ae542be02");
  2813         -  FeedZipHtml(zip_buf, 34550,
  2814         -              "7c288df2019354c1892fe73ccc026f180cfcee94e6c7a8dd78");
  2815         -  FeedZipHtml(zip_buf, 34575,
  2816         -              "48d1b3ac95980570be3f7871f09ccbe0f8c93064f4d92becf4");
  2817         -  FeedZipHtml(zip_buf, 34600,
  2818         -              "e5dc3b35b6273809134a6e81efe75e40b822ca20a140f09783");
  2819         -  FeedZipHtml(zip_buf, 34625,
  2820         -              "e770528cbd8eb048502705ae80ea9e008afbdc7fb1710a90b3");
  2821         -  FeedZipHtml(zip_buf, 34650,
  2822         -              "b801191dd5994abc03f6e4bdfff4e37bfab1501ebb6c3cc39d");
  2823         -  FeedZipHtml(zip_buf, 34675,
  2824         -              "8040f7c9ef7ef107417e512558e0bfae7355776c2a50eaaa54");
  2825         -  FeedZipHtml(zip_buf, 34700,
  2826         -              "4e41a30411f1564ae0b81549541e522a9275ea51f5a32c00d9");
  2827         -  FeedZipHtml(zip_buf, 34725,
  2828         -              "5c0a805d246e2c3204679c445ad5653ab9f87c7eae8bf8d0be");
  2829         -  FeedZipHtml(zip_buf, 34750,
  2830         -              "c4213f1c9d5df01b2b26d7be9d349d8c1820001b7f32ccdc8f");
  2831         -  FeedZipHtml(zip_buf, 34775,
  2832         -              "1702f86892c5801757999f384a73995f9b714efb176be398d7");
  2833         -  FeedZipHtml(zip_buf, 34800,
  2834         -              "45592024d8664e2e2a18a8ed14a3c450d8f1777002602fb7ec");
  2835         -  FeedZipHtml(zip_buf, 34825,
  2836         -              "8bc4b0d130412e04c74488d19af7a0208c31d20f6e8d1a9fcb");
  2837         -  FeedZipHtml(zip_buf, 34850,
  2838         -              "575bb240262805aa72c1d5fbd72dc8bf232412bd8e24477238");
  2839         -  FeedZipHtml(zip_buf, 34875,
  2840         -              "76d0f82bb256ffbd6a6c857b1d04d9fad13576d47e303ece88");
  2841         -  FeedZipHtml(zip_buf, 34900,
  2842         -              "acf883adc6d55e9066493c95591775483a897a8b4345b1b689");
  2843         -  FeedZipHtml(zip_buf, 34925,
  2844         -              "8c3bf49e0fbdcf40a54184ac936cdde3ca917ec1e2a8300557");
  2845         -  FeedZipHtml(zip_buf, 34950,
  2846         -              "4979b20aa643cc538a3edf3a05433c4e91b7d577c2193b1bea");
  2847         -  FeedZipHtml(zip_buf, 34975,
  2848         -              "10d3a18ab2b3c0328f43cc1cfa232124ee4db273963e582042");
  2849         -  FeedZipHtml(zip_buf, 35000,
  2850         -              "1995e2b2321f2b1ff63c53fca371e56cacd78319df0bc01d13");
  2851         -  FeedZipHtml(zip_buf, 35025,
  2852         -              "dc1cfccc31aa25a4e4620908fcdaa8ec6afb3ff0c66e08ce85");
  2853         -  FeedZipHtml(zip_buf, 35050,
  2854         -              "002665d2ca7d6aab97ec86425bea2b3e794bc23a114f3d5178");
  2855         -  FeedZipHtml(zip_buf, 35075,
  2856         -              "27ce4e574c065519d0232fada83331e249de2270982042187a");
  2857         -  FeedZipHtml(zip_buf, 35100,
  2858         -              "ebcbba4906ffe064398cd52ba857ac47c0f13f7d3cbbb8668a");
  2859         -  FeedZipHtml(zip_buf, 35125,
  2860         -              "730af030e4fcece2f4eafaf2ece2bd73dcf77aaaf35fdf7fbc");
  2861         -  FeedZipHtml(zip_buf, 35150,
  2862         -              "700efa8b1cf4e1f3f9f559f9a27fb5c6d5acfcb7dca4e5cbff");
  2863         -  FeedZipHtml(zip_buf, 35175,
  2864         -              "971cf9fef4e387d3ebcb5f8f3f9e9f9f1e5f9f15c6933cddd1");
  2865         -  FeedZipHtml(zip_buf, 35200,
  2866         -              "7652a67f7f8aa09540697bead8cc64ffc27fcdc522c1457e87");
  2867         -  FeedZipHtml(zip_buf, 35225,
  2868         -              "4f05b2e454055099ec87f172f60bfcf6e7b7d7dfda87fcf6e7");
  2869         -  FeedZipHtml(zip_buf, 35250,
  2870         -              "1f0b7f7af7feddb78bb741e6585719c3b80c28e1a501d3281b");
  2871         -  FeedZipHtml(zip_buf, 35275,
  2872         -              "b978c6618d5f1cdf5830db1061771c46a1a21908b37cc53bb0");
  2873         -  FeedZipHtml(zip_buf, 35300,
  2874         -              "3c2b27b802d68ce3340d3b887558ee94acea61c6055c81050d");
  2875         -  FeedZipHtml(zip_buf, 35325,
  2876         -              "4b584ffb3f285e796606b412f43909d32ebc500dd0a76ce44c");
  2877         -  FeedZipHtml(zip_buf, 35350,
  2878         -              "e8b3f44bd5d95725ef002569b8c07fe2103c240e646930ecc3");
  2879         -  FeedZipHtml(zip_buf, 35375,
  2880         -              "736e4660121f21b40171308b27a0ad735ddc288f43abb9cd05");
  2881         -  FeedZipHtml(zip_buf, 35400,
  2882         -              "189c07e32f834a8b33994f948d646778ce1b9e356c6a6ccfc5");
  2883         -  FeedZipHtml(zip_buf, 35425,
  2884         -              "8133989f8b3ff6365749d5863932672116519244de348b63d1");
  2885         -  FeedZipHtml(zip_buf, 35450,
  2886         -              "32e7a17536b583b89f94bdedd1cca06d792451dfd87fb158f3");
  2887         -  FeedZipHtml(zip_buf, 35475,
  2888         -              "7d858905afa8c224a83e3737b3183f59010ef7fbcf2c2bef3c");
  2889         -  FeedZipHtml(zip_buf, 35500,
  2890         -              "983c974d505a9ddd4641c2fc055804699e9dcd248faf653641");
  2891         -  FeedZipHtml(zip_buf, 35525,
  2892         -              "f975566c5d91557069c85a6a142cc1d279ad826e74749805bf");
  2893         -  FeedZipHtml(zip_buf, 35550,
  2894         -              "0e8444f98a8d156f618ab2b850d7281b41f1bf578958cc3f3c");
  2895         -  FeedZipHtml(zip_buf, 35575,
  2896         -              "3ab7b84d2a951479cf309b70facc100ae94a193fc8594b8c10");
  2897         -  FeedZipHtml(zip_buf, 35600,
  2898         -              "261211356d2ff1c394fc87dd80f3a830502349b0da4605d838");
  2899         -  FeedZipHtml(zip_buf, 35625,
  2900         -              "36ee749c0e64379e22d0ec31adaace42ab86a0dfc3e07b61f3");
  2901         -  FeedZipHtml(zip_buf, 35650,
  2902         -              "34a2d3d3698ac51ab0b5d4547732506879fae9eabd7eb5138e");
  2903         -  FeedZipHtml(zip_buf, 35675,
  2904         -              "720fc9c7e90ba891ec9490210417c1dff36c2c65599979e992");
  2905         -  FeedZipHtml(zip_buf, 35700,
  2906         -              "2e87b1f53a04c42074adc2693d0a1447f8ef1b42a8e6ada1da");
  2907         -  FeedZipHtml(zip_buf, 35725,
  2908         -              "de288c6e88e99ec413543c81517443e928f638960fc74ccbc7");
  2909         -  FeedZipHtml(zip_buf, 35750,
  2910         -              "00937aa89a83be97ff7ebd64c866ce1651de9e47f0142ab870");
  2911         -  FeedZipHtml(zip_buf, 35775,
  2912         -              "c6033e884866c628cc12c6ef8c3e67881429618bea65462dcf");
  2913         -  FeedZipHtml(zip_buf, 35800,
  2914         -              "ec1e67804f786937a8ee52a81f4e4e7fa15b835f24e1c30d55");
  2915         -  FeedZipHtml(zip_buf, 35825,
  2916         -              "8fd762bab965668ca93749312e833238602e0cf943bdb26d44");
  2917         -  FeedZipHtml(zip_buf, 35850,
  2918         -              "3af00e71df74164cfb1e637db1fdb8bf9fddc7fb7fc6f1e860");
  2919         -  FeedZipHtml(zip_buf, 35875,
  2920         -              "f9a8fb1b2c73cef5d36ad0578dac41e1b6875bbfa1a26c453c");
  2921         -  FeedZipHtml(zip_buf, 35900,
  2922         -              "0ea845d2cd7dd80381bf1a9dc5d0db201cdc669b8696ccdbf0");
  2923         -  FeedZipHtml(zip_buf, 35925,
  2924         -              "a45c7ecec1c74453bc55200a03ece55ffff600ffbf370e1f82");
  2925         -  FeedZipHtml(zip_buf, 35950,
  2926         -              "21ccf182e7953f9795f2bc96b1ede77bcb42b2a35e0ff14626");
  2927         -  FeedZipHtml(zip_buf, 35975,
  2928         -              "18b8f12b37a88e3baef1b261f858588008aacc7c724c2720b3");
  2929         -  FeedZipHtml(zip_buf, 36000,
  2930         -              "92bafae500f67d905d503a3552a41bacd690fa270794689021");
  2931         -  FeedZipHtml(zip_buf, 36025,
  2932         -              "82de4d39e5ae4fc04f74e06dc459e4a190bc73d447a6648c17");
  2933         -  FeedZipHtml(zip_buf, 36050,
  2934         -              "0f7a92c59712e3459c0592b2cc15b9ea5d4a7233c56f6531d3");
  2935         -  FeedZipHtml(zip_buf, 36075,
  2936         -              "6592c9463c62137a711699a9859404a4b9b57d5e8267219700");
  2937         -  FeedZipHtml(zip_buf, 36100,
  2938         -              "a6f04c47a8f5865d1de37bc9c8e0536b318d1228d138668539");
  2939         -  FeedZipHtml(zip_buf, 36125,
  2940         -              "40cf49414ca283267e3440ad80f762bc55b677b9b8f9b4d052");
  2941         -  FeedZipHtml(zip_buf, 36150,
  2942         -              "4a234b332cbc8cef6b901046d4e320efac02030d344de2fb9b");
  2943         -  FeedZipHtml(zip_buf, 36175,
  2944         -              "6832ea2cadb2ea42d11403f8c56e4b1e89760952a1f4a12e5f");
  2945         -  FeedZipHtml(zip_buf, 36200,
  2946         -              "4fb34834d6b3bad0d8d8fae3d1388a4d04c6a9e121c7ee5b48");
  2947         -  FeedZipHtml(zip_buf, 36225,
  2948         -              "ac0e94ad43bfb311dccbb570523bd14f8d687921fe27e53e0d");
  2949         -  FeedZipHtml(zip_buf, 36250,
  2950         -              "e38e892a1a09d78029bc2bb228b4b8bb20ed664feaf71dd8ac");
  2951         -  FeedZipHtml(zip_buf, 36275,
  2952         -              "320450e8efb34944b1bccf00a24a5737a6093958d8b0117cba");
  2953         -  FeedZipHtml(zip_buf, 36300,
  2954         -              "78dff6fefbd329fcdfebb377ef70929f83ce274ff81ff15729");
  2955         -  FeedZipHtml(zip_buf, 36325,
  2956         -              "e3108a16227f9159a83ed481325824410aeabeb204f042877c");
  2957         -  FeedZipHtml(zip_buf, 36350,
  2958         -              "de5c1cc0b3713478460604c4fb4fe868cfb9ce9ffd3e0e8c21");
  2959         -  FeedZipHtml(zip_buf, 36375,
  2960         -              "b8cbe2185003fb7a0c9ea138e661ff3ee88cf5283c61ce3b2d");
  2961         -  FeedZipHtml(zip_buf, 36400,
  2962         -              "4f804581448da5513812609384c99014a069c9ca28f8e5197d");
  2963         -  FeedZipHtml(zip_buf, 36425,
  2964         -              "faee99c7269abd03c38c635e71e99b0ecacbc1e0c0bb4fb0b5");
  2965         -  FeedZipHtml(zip_buf, 36450,
  2966         -              "a532eee0ea7bd5c6139091eadc94c6b0bc8bd229a1e76294dc");
  2967         -  FeedZipHtml(zip_buf, 36475,
  2968         -              "1c590d727ab869ed6f1042377f165935fd7d54fc7b9aa4e5a5");
  2969         -  FeedZipHtml(zip_buf, 36500,
  2970         -              "0a962ad689ce8f39efa874c2e418720e9f557500132232814d");
  2971         -  FeedZipHtml(zip_buf, 36525,
  2972         -              "b1d29f7fbc26f18f7f6cfe5ce3a90c117966479d1b23287ca5");
  2973         -  FeedZipHtml(zip_buf, 36550,
  2974         -              "fcb38e5aa99a828255ca07e838999a314d5633e363ca47e1c1");
  2975         -  FeedZipHtml(zip_buf, 36575,
  2976         -              "755c4c611cc78f14920519bd34a4fb437fe0b5d81384cf097b");
  2977         -  FeedZipHtml(zip_buf, 36600,
  2978         -              "8a48d5c13f8d30f20c04c0a9f1e5257d516656f961af64b151");
  2979         -  FeedZipHtml(zip_buf, 36625,
  2980         -              "e962a3d2c546658b8d8a8bd931f54bd1ba24b3a8d5bcf203cb");
  2981         -  FeedZipHtml(zip_buf, 36650,
  2982         -              "3986d788656c8676663b94d6a2a1016c4590c559d40b1e4a2f");
  2983         -  FeedZipHtml(zip_buf, 36675,
  2984         -              "c01cf434802f634be84852985825e83ff85f824f71e86aac6e");
  2985         -  FeedZipHtml(zip_buf, 36700,
  2986         -              "7df65a5596d05a2b28f9785094f42411598eb3852ce5360557");
  2987         -  FeedZipHtml(zip_buf, 36725,
  2988         -              "6f60d54659232e46d11d3d2cb50ac16cb7f95bcd75fe363f90");
  2989         -  FeedZipHtml(zip_buf, 36750,
  2990         -              "ff5ce45d2f651f5b8d08de6f0b46850f35a8f061fe2b182d12");
  2991         -  FeedZipHtml(zip_buf, 36775,
  2992         -              "1596b28fed46850f8be60a75b8f0db232ea18a1e178a28abdf");
  2993         -  FeedZipHtml(zip_buf, 36800,
  2994         -              "e47663d16f0b40a3b39402a1df7f7aebc82652df5ab4b4cb6a");
  2995         -  FeedZipHtml(zip_buf, 36825,
  2996         -              "b4c64017dfa3c22814ad918b2ec4786c8ccacae57feb104375");
  2997         -  FeedZipHtml(zip_buf, 36850,
  2998         -              "a38b8dc72b0f464a9d10a63f1bc0c5f3045137c69895818174");
  2999         -  FeedZipHtml(zip_buf, 36875,
  3000         -              "1b8292c270ea9b194d0a27c944479e630b678509c91aa6d1f6");
  3001         -  FeedZipHtml(zip_buf, 36900,
  3002         -              "67c30e88f13754000693dec950845571001a93884a77960217");
  3003         -  FeedZipHtml(zip_buf, 36925,
  3004         -              "61f12e89474e101b1f35a0dd7094502ebd86d503ba069012de");
  3005         -  FeedZipHtml(zip_buf, 36950,
  3006         -              "65f7b160401ffb697644a16483b0eb886d363f97b38cb58337");
  3007         -  FeedZipHtml(zip_buf, 36975,
  3008         -              "8c7a619f6270a82b5c17992587d08e2799cbe2650118d9071d");
  3009         -  FeedZipHtml(zip_buf, 37000,
  3010         -              "41a38e654031b84cc9306d85b5cb7378ee752488e6bb4c3473");
  3011         -  FeedZipHtml(zip_buf, 37025,
  3012         -              "1be1c1df79a33055011fd2faaa6ffc9b3c6dc1596eced2236a");
  3013         -  FeedZipHtml(zip_buf, 37050,
  3014         -              "35e78eee290c69a95a56641f746bf25cb1a374c0fa9e177a4a");
  3015         -  FeedZipHtml(zip_buf, 37075,
  3016         -              "10a2707aeb1cd220a66aee33ac7dd4ee83649f9e8e987e669c");
  3017         -  FeedZipHtml(zip_buf, 37100,
  3018         -              "4d9727b51d5321561fe22c0459a042e58bdad549704ec22889");
  3019         -  FeedZipHtml(zip_buf, 37125,
  3020         -              "48aa6a217c9316ab4507961b0881ff6320c5e3134dfe2b9f64");
  3021         -  FeedZipHtml(zip_buf, 37150,
  3022         -              "82ab7ee824c73e807e1fc30c7bde1f13515eeeabce2a79170e");
  3023         -  FeedZipHtml(zip_buf, 37175,
  3024         -              "01ae009a9fa9475491f472035a9ef7f0a24a80aef848733ebc");
  3025         -  FeedZipHtml(zip_buf, 37200,
  3026         -              "acfa75f9c7bdb989b32c8f8bbbeaa4c2491b29fc603e176561");
  3027         -  FeedZipHtml(zip_buf, 37225,
  3028         -              "36f5ee6fe334f03ebcbdf4fa20eea598f3051bbc17b0428e31");
  3029         -  FeedZipHtml(zip_buf, 37250,
  3030         -              "516c165dac405f8342a392e0214b80d8bc316a2054d20e4038");
  3031         -  FeedZipHtml(zip_buf, 37275,
  3032         -              "7d6126ab0354a62f15f02b2fea98db13384ccd85215fed65f1");
  3033         -  FeedZipHtml(zip_buf, 37300,
  3034         -              "357515a4d67251c817931496aaba2a3de82bbfacd080d62aaf");
  3035         -  FeedZipHtml(zip_buf, 37325,
  3036         -              "ebed241cf660837c23c59bb2bf3f994b52250d22ba83470036");
  3037         -  FeedZipHtml(zip_buf, 37350,
  3038         -              "e79a57b207c5c2d0ad46a429634218dd74a67c657ccf545a5a");
  3039         -  FeedZipHtml(zip_buf, 37375,
  3040         -              "5425559832f22390a428148366a7f01c8eb75029177d51d18b");
  3041         -  FeedZipHtml(zip_buf, 37400,
  3042         -              "5b104d52297ae5aff9f1f2c4df5df2c4e5ffb94e829c34e1b5");
  3043         -  FeedZipHtml(zip_buf, 37425,
  3044         -              "9408750ca7ee8040881ec9af5ac4b844305531c3dc80ada331");
  3045         -  FeedZipHtml(zip_buf, 37450,
  3046         -              "0603e8505d79e5750c915127e7c16bc21c57cb1be962ca0443");
  3047         -  FeedZipHtml(zip_buf, 37475,
  3048         -              "e3e393bb31ac5b10e052c497fa8a1c0106aa7fd21525eb8fb0");
  3049         -  FeedZipHtml(zip_buf, 37500,
  3050         -              "e3b84f419d694c1640caa3c239ef51d1b232d88183a514bb80");
  3051         -  FeedZipHtml(zip_buf, 37525,
  3052         -              "4d92a2f8de4b510f9b8a6c1ba1df837a3f0cfd743f921d25fa");
  3053         -  FeedZipHtml(zip_buf, 37550,
  3054         -              "9c3b564646a517572e285a9f7797b789977712a65925e5e901");
  3055         -  FeedZipHtml(zip_buf, 37575,
  3056         -              "7881f3b93468c6c4ef8593f44931c5f48f09861d76c3a43b19");
  3057         -  FeedZipHtml(zip_buf, 37600,
  3058         -              "a5dd24ec70d96cfc3608b18d227e82a3b6900d7a5c2b950f41");
  3059         -  FeedZipHtml(zip_buf, 37625,
  3060         -              "258118247bb95bf28cff599064f1301aa2e9b2a2ed89a8cdfe");
  3061         -  FeedZipHtml(zip_buf, 37650,
  3062         -              "958b10bfbcbd6181b5480cea1392c168f8894bd54b23b069e8");
  3063         -  FeedZipHtml(zip_buf, 37675,
  3064         -              "53a0349c830d7edd26369004d45d0f3fc4f130f0a325cfccb4");
  3065         -  FeedZipHtml(zip_buf, 37700,
  3066         -              "c93d063e5f9ee1e77c03a8a5ad2a85f62b73f59a63cfc324aa");
  3067         -  FeedZipHtml(zip_buf, 37725,
  3068         -              "9bbe002164c9049d70ba3563dcc1de9f68c664ea90ac03be9f");
  3069         -  FeedZipHtml(zip_buf, 37750,
  3070         -              "c45db2331f5891d1dc9c511f581a5845e3552a7d835ce11726");
  3071         -  FeedZipHtml(zip_buf, 37775,
  3072         -              "44b9808cb83620d512c9d7f8535c5bb66bf26afe47ef425da6");
  3073         -  FeedZipHtml(zip_buf, 37800,
  3074         -              "da840e84959d648d83a84d085b2c16ff19e0839d197c4c3478");
  3075         -  FeedZipHtml(zip_buf, 37825,
  3076         -              "cc6f8e66ff128ec732011f9b416a9beeec7b2fa08409c84267");
  3077         -  FeedZipHtml(zip_buf, 37850,
  3078         -              "9ca647115546f90c886786ba28536544effafc8ca262528bdd");
  3079         -  FeedZipHtml(zip_buf, 37875,
  3080         -              "12e24076c0a7996fef2cb48fcae47d301cee8bce10c6fc5cfb");
  3081         -  FeedZipHtml(zip_buf, 37900,
  3082         -              "9b1afcdaa0b3adea2009989bc2de0de406c65e9ce68fa4a60a");
  3083         -  FeedZipHtml(zip_buf, 37925,
  3084         -              "a4996213ceb2a71fc8f77d9009aa75f23afdb98504fe91f1d5");
  3085         -  FeedZipHtml(zip_buf, 37950,
  3086         -              "26466a4b1d463dea6854d2927a79847b0a9a87dfcd38003c02");
  3087         -  FeedZipHtml(zip_buf, 37975,
  3088         -              "adb8cb3e2683560d5ac62c55186d79d28dc60e71120e420cef");
  3089         -  FeedZipHtml(zip_buf, 38000,
  3090         -              "35c18cfa8be8790abfc0862aa2e8991addbdf5710f41c24e40");
  3091         -  FeedZipHtml(zip_buf, 38025,
  3092         -              "f8aef378cefaee5e238ce6bd80c3190d2641ed500064e3380d");
  3093         -  FeedZipHtml(zip_buf, 38050,
  3094         -              "33a03a02247b3714b22bbc32f6594b5e1229a3b01b0ca7c2fb");
  3095         -  FeedZipHtml(zip_buf, 38075,
  3096         -              "4ac401071c27f1384850bea43d691f8ec2be3e9c304ea89d84");
  3097         -  FeedZipHtml(zip_buf, 38100,
  3098         -              "ec2d21dc4bfe24e5a40b109940caa9dd88095cd9f55b9c8733");
  3099         -  FeedZipHtml(zip_buf, 38125,
  3100         -              "6542d230874090074e5e035b888281afa0c37b868f808707f0");
  3101         -  FeedZipHtml(zip_buf, 38150,
  3102         -              "1ba4b4241007249e8439e24323b1a39658917ca48791bca85e");
  3103         -  FeedZipHtml(zip_buf, 38175,
  3104         -              "0b67cdf7b061acaac8f2601a92c72da331f9fd7144f6c87ca7");
  3105         -  FeedZipHtml(zip_buf, 38200,
  3106         -              "866416d93cc84966af4ab1d4ea560240ff7cfd6effefca778e");
  3107         -  FeedZipHtml(zip_buf, 38225,
  3108         -              "02f2f5e92fd7082760ee219128f62bba238cc5b52cc2930c5c");
  3109         -  FeedZipHtml(zip_buf, 38250,
  3110         -              "d11df0f1ee1088d16e3efcd5d1e08e046d12e4375f16c87452");
  3111         -  FeedZipHtml(zip_buf, 38275,
  3112         -              "a13d84e5593725b63db79cfcaf4a59f7df3572f42cebd74acc");
  3113         -  FeedZipHtml(zip_buf, 38300,
  3114         -              "736c65c912b5966a82fcd5ede4eb9d7cfd58f95a744d613621");
  3115         -  FeedZipHtml(zip_buf, 38325,
  3116         -              "d16b11f2f1b14019b725407cac78b6574169475440c740ee1c");
  3117         -  FeedZipHtml(zip_buf, 38350,
  3118         -              "7de5a1c50f631db69cb9406a74ab33d6a340204c17a6e02110");
  3119         -  FeedZipHtml(zip_buf, 38375,
  3120         -              "864743f8006fc07e3c5e0fc3ff1c75ab2e4e7fde88ab9b44ab");
  3121         -  FeedZipHtml(zip_buf, 38400,
  3122         -              "be3c6bc5cdbb3e11a7edbc3bf1adfee296da33f07a618169dc");
  3123         -  FeedZipHtml(zip_buf, 38425,
  3124         -              "62e13fffd7df5fbe78f18ac77cbef8f1e2e3cf176ce42f28aa");
  3125         -  FeedZipHtml(zip_buf, 38450,
  3126         -              "be117317ddc5a2dd532c02276bdaf829001f5b8fa803ca7ac0");
  3127         -  FeedZipHtml(zip_buf, 38475,
  3128         -              "0ed48f03b52dda95c13b376a07f4c701bdb23f747ec40ed88f");
  3129         -  FeedZipHtml(zip_buf, 38500,
  3130         -              "c470ecb6fc5380cae91596ba2e43f1dcb01dd81700f64b1fdb");
  3131         -  FeedZipHtml(zip_buf, 38525,
  3132         -              "84d782dd18b603fb23c17e372883f4dd6007dcc701f7fdd851");
  3133         -  FeedZipHtml(zip_buf, 38550,
  3134         -              "54417ed901f731c0350ccd57e19f6e6e911bb366809b694114");
  3135         -  FeedZipHtml(zip_buf, 38575,
  3136         -              "69015bc2ea559d2906938a2a5836acf2ba943624adc9f67f2a");
  3137         -  FeedZipHtml(zip_buf, 38600,
  3138         -              "4cd365e096dfeb41bd4cfb7e1ed24597966dcd412bbb36509b");
  3139         -  FeedZipHtml(zip_buf, 38625,
  3140         -              "a61ca763cd5244977615da8b9adf94ec9f1c3c8c876137ccf4");
  3141         -  FeedZipHtml(zip_buf, 38650,
  3142         -              "195211f323fd76d5976919cc5cb7a9066cd6751a46b9a0df57");
  3143         -  FeedZipHtml(zip_buf, 38675,
  3144         -              "1e155940501af20c4fceea2e49d826f07a9441b1ee1ece5c06");
  3145         -  FeedZipHtml(zip_buf, 38700,
  3146         -              "4cd77d1406b66ac276d6742b15c4a568477999703e8a254bc3");
  3147         -  FeedZipHtml(zip_buf, 38725,
  3148         -              "c328bef047e4250b78ba73f138187de6705c5af8b83c5f4c3d");
  3149         -  FeedZipHtml(zip_buf, 38750,
  3150         -              "1d5ac427c0c01ea2ba9b7f170e83b3d26005feba59b4c77b92");
  3151         -  FeedZipHtml(zip_buf, 38775,
  3152         -              "35ef4b2ce1043e6dfe5efac544717e5fa1aa174bcb5fa96a91");
  3153         -  FeedZipHtml(zip_buf, 38800,
  3154         -              "7104480992c6d9d547ddd70d3d102a7aa5daf7567967570dee");
  3155         -  FeedZipHtml(zip_buf, 38825,
  3156         -              "acedf569883ba176a9f659f32eb94ebd846807dd07e3a1df55");
  3157         -  FeedZipHtml(zip_buf, 38850,
  3158         -              "2df06c70920468b77c2a58636532aeece0c8f2ccebc91b13d4");
  3159         -  FeedZipHtml(zip_buf, 38875,
  3160         -              "94b342e2268a8ca3499a7922d38c3c6bd2a22bd10a7e6def04");
  3161         -  FeedZipHtml(zip_buf, 38900,
  3162         -              "7fff1884aabc5c6cdc5a7eb9eaebec97dbf6ce7ac8d8aec67e");
  3163         -  FeedZipHtml(zip_buf, 38925,
  3164         -              "37f8e4ea4b638d103e50ebf3715a378131a238c1dad12ba4f6");
  3165         -  FeedZipHtml(zip_buf, 38950,
  3166         -              "1f9c45bf42e442f6f138042bdc9c9906625f9a68871358bb4d");
  3167         -  FeedZipHtml(zip_buf, 38975,
  3168         -              "020ab412fe44582fa2170e7e41db955cd22d69c212ff39cc5e");
  3169         -  FeedZipHtml(zip_buf, 39000,
  3170         -              "f5ad2dfee7207bc58d70b0ee63379e0c7b0893008bf24fe8d1");
  3171         -  FeedZipHtml(zip_buf, 39025,
  3172         -              "35e862efc06cba5ac022f33036022ded30c7521867f49cf534");
  3173         -  FeedZipHtml(zip_buf, 39050,
  3174         -              "4ba27d8a0dc49213e5cfb1fcbe590fb2dcd5e63dc9859d2df1");
  3175         -  FeedZipHtml(zip_buf, 39075,
  3176         -              "51aebcbbab4677d7f6c662d0a6f14efb692e80758d8f737e2f");
  3177         -  FeedZipHtml(zip_buf, 39100,
  3178         -              "cb7e9e2bafd9f83ecf35ef1e69eb915e299a3578a66b516d13");
  3179         -  FeedZipHtml(zip_buf, 39125,
  3180         -              "1eea716e93bba77a394ff57598953888e4c7cd7aa4694b9bf3");
  3181         -  FeedZipHtml(zip_buf, 39150,
  3182         -              "32f376667b8e11f3aece4fbebb3af5c8ef566b9d3feaa41465");
  3183         -  FeedZipHtml(zip_buf, 39175,
  3184         -              "5d764df2fb66dd94dcd5e65c96dad192ef4b174273df97fc5e");
  3185         -  FeedZipHtml(zip_buf, 39200,
  3186         -              "7f5f8f2e7e38d38da9a211adb7d80a15b9d8dbf8616f732ed0");
  3187         -  FeedZipHtml(zip_buf, 39225,
  3188         -              "dcd6d264e00fe730271752fcc57983e6804dba425f5fa01417");
  3189         -  FeedZipHtml(zip_buf, 39250,
  3190         -              "3a6f724d1dbc5f7ee512ba2c3680a4020f6dcaf1c30af40e2f");
  3191         -  FeedZipHtml(zip_buf, 39275,
  3192         -              "231cd5eb2ddb65a6ef3a3f00edc3a66893e6b654fc257ca52d");
  3193         -  FeedZipHtml(zip_buf, 39300,
  3194         -              "3a7ec99d80f155ce922fe64b5c47d7e77e8aea4f1a9c72a559");
  3195         -  FeedZipHtml(zip_buf, 39325,
  3196         -              "3775dba35a8803b244ff3ad8f0284e31e50267212290f72d3a");
  3197         -  FeedZipHtml(zip_buf, 39350,
  3198         -              "d4cc46bf1c4f9d88a643de386014b1e66c024519ce560b486b");
  3199         -  FeedZipHtml(zip_buf, 39375,
  3200         -              "e0c6c152c68e2f189cf9699bc4c4fef2c9cf6e4f1fc8c32deb");
  3201         -  FeedZipHtml(zip_buf, 39400,
  3202         -              "4c9484c8e6865211cbc495dabd0b9aa8456486651d16eb519b");
  3203         -  FeedZipHtml(zip_buf, 39425,
  3204         -              "85c2b8ad8562ae316375fa0456d77a379ca4b7ee040af5d909");
  3205         -  FeedZipHtml(zip_buf, 39450,
  3206         -              "2f236969f100bb0c286b887472914588a42e9c915d2a0b0638");
  3207         -  FeedZipHtml(zip_buf, 39475,
  3208         -              "1466d83d38a41a21d4a218d395b2a0f2d4e7b1df83b99c4716");
  3209         -  FeedZipHtml(zip_buf, 39500,
  3210         -              "df5ae4f6180314f7e364fff3e5b9dbb0b13cab062602856f72");
  3211         -  FeedZipHtml(zip_buf, 39525,
  3212         -              "9ba0a57335c6291792dfda215657f1703c6ac66dd59fd9263c");
  3213         -  FeedZipHtml(zip_buf, 39550,
  3214         -              "9cd36b998ab57892811eadfc774352db13140cc209f6a0ef0a");
  3215         -  FeedZipHtml(zip_buf, 39575,
  3216         -              "e5d8a78631dcb10ecd1b80d5bdc0484ae284e3be68b19b99b9");
  3217         -  FeedZipHtml(zip_buf, 39600,
  3218         -              "49563e23cf4e1246ce26936bf18606194cc4e2fe42316f8038");
  3219         -  FeedZipHtml(zip_buf, 39625,
  3220         -              "d408fb319a5bce55c0829dc3e5130c3b6f8cf93f22f9dc8769");
  3221         -  FeedZipHtml(zip_buf, 39650,
  3222         -              "c04cc79dce4123d16203e89e6297c92c38249bc3d5ffa3cac9");
  3223         -  FeedZipHtml(zip_buf, 39675,
  3224         -              "d26d2ebbeee893a45e87cadb619bbf08879f5d9fde7c38fae5");
  3225         -  FeedZipHtml(zip_buf, 39700,
  3226         -              "e6fcf4e2fdf53fbd1675211e4eb1b5d5fbb782ea9dc961d6ea");
  3227         -  FeedZipHtml(zip_buf, 39725,
  3228         -              "7451b88343ce0e310bc678f15880bf17c709e1c80865ad718c");
  3229         -  FeedZipHtml(zip_buf, 39750,
  3230         -              "1780749206dd4962d630624499a49c8242b9bf807cbd304538");
  3231         -  FeedZipHtml(zip_buf, 39775,
  3232         -              "13f844c61b22607986cba98ede91997119f587bf0b9338a24b");
  3233         -  FeedZipHtml(zip_buf, 39800,
  3234         -              "b9f393902e0f2ee3ead3d1f5d91141e4eaf4f8f3e5d9f5af3f");
  3235         -  FeedZipHtml(zip_buf, 39825,
  3236         -              "60f1bf079d38e877d27838c930164625d902aec5492fa04ef4");
  3237         -  FeedZipHtml(zip_buf, 39850,
  3238         -              "66b04c1031569808635c9f805e1a0487646fc272d59fa3d4ef");
  3239         -  FeedZipHtml(zip_buf, 39875,
  3240         -              "eb16c8f9123f05c671852d6ecb3887fcd84269b9ca998a04ea");
  3241         -  FeedZipHtml(zip_buf, 39900,
  3242         -              "6627e6436fe69e3e62e6b2acf4558816ccc3d49e391159c505");
  3243         -  FeedZipHtml(zip_buf, 39925,
  3244         -              "8aed53196b46c1d0e27935cc4eb239516babc5bc284414000c");
  3245         -  FeedZipHtml(zip_buf, 39950,
  3246         -              "b907fc0ebe132d2d902b99b9920e7ea85250e917bdefe23be0");
  3247         -  FeedZipHtml(zip_buf, 39975,
  3248         -              "0a3007900c170393220c73cae22c16eb69cd5a8f62ef2b4e86");
  3249         -  FeedZipHtml(zip_buf, 40000,
  3250         -              "df8a8214dfcc2d26abae6a2c2963d2eb246147c13e8f908ab9");
  3251         -  FeedZipHtml(zip_buf, 40025,
  3252         -              "21f0ee5e814d7c059ad6770b4aeabb61eb9f8ae26e57976727");
  3253         -  FeedZipHtml(zip_buf, 40050,
  3254         -              "b2d70ca98eeb2cf2a6cffa7d7d41b62b38d859fa3e8807893f");
  3255         -  FeedZipHtml(zip_buf, 40075,
  3256         -              "be7575eac88f68f169677b94ac3dfd6c76e6a1684d9c902c91");
  3257         -  FeedZipHtml(zip_buf, 40100,
  3258         -              "2183d66cd1a306e8f787fbb8183b26c27ea571c56c190d83b9");
  3259         -  FeedZipHtml(zip_buf, 40125,
  3260         -              "5a6a8b1806d64101f597bc422288f3b9fd593435b07c60d5aa");
  3261         -  FeedZipHtml(zip_buf, 40150,
  3262         -              "9cd13343f17ce40ef6e6279132b696092a0ceb4f49fc3b49f8");
  3263         -  FeedZipHtml(zip_buf, 40175,
  3264         -              "6597a1066cc65d58fb7d4a57f14f3f7d370cc7e3a077f41038");
  3265         -  FeedZipHtml(zip_buf, 40200,
  3266         -              "f2dd8b63d6762182bb720b5eda8e87fb41e5ad1f0e265cb7e7");
  3267         -  FeedZipHtml(zip_buf, 40225,
  3268         -              "d09380fdb5fd0bb3e828cd50fb139749a60dd26b70d02fed5f");
  3269         -  FeedZipHtml(zip_buf, 40250,
  3270         -              "71d013b94c4c211883c618bbb2df73032aaf51daf8b484217e");
  3271         -  FeedZipHtml(zip_buf, 40275,
  3272         -              "7d3a04c8a78d7ffe0814c8ec5e4038c61fa35c078f73c66fb3");
  3273         -  FeedZipHtml(zip_buf, 40300,
  3274         -              "71547ac3d605f34f49380a3e04f08fd077d8545da336007cb4");
  3275         -  FeedZipHtml(zip_buf, 40325,
  3276         -              "1fcfdcf65a8178e267935129f0e8eb06004ded72adb0fa0c1b");
  3277         -  FeedZipHtml(zip_buf, 40350,
  3278         -              "2e05157edc0048c93dae9932e9d976ba3a0a43360068f67ed7");
  3279         -  FeedZipHtml(zip_buf, 40375,
  3280         -              "0abaa38730bd79717341c5c14b60678cd900e0c9adb2daca8d");
  3281         -  FeedZipHtml(zip_buf, 40400,
  3282         -              "04fa6192321afab0d735c3f2631206a28b591d488da11b00d9");
  3283         -  FeedZipHtml(zip_buf, 40425,
  3284         -              "dcc63714c02f1b20ebcb4d46d6340051b6b729c06c8cad2fb7");
  3285         -  FeedZipHtml(zip_buf, 40450,
  3286         -              "075bd709e1c7da67b2780c6306d30a1bcdb518b2afc389d65a");
  3287         -  FeedZipHtml(zip_buf, 40475,
  3288         -              "8a1f63ab5e7cfff22fffd8ff7e9925f967b2060967bb04d5a9");
  3289         -  FeedZipHtml(zip_buf, 40500,
  3290         -              "ec0d5dc4f1b2912d0faf4236e9cc8743b871bcb6eb55c3e138");
  3291         -  FeedZipHtml(zip_buf, 40525,
  3292         -              "b80fc32fafaf3f7efa584347250e7ddd0e3bc12ed9c2360e08");
  3293         -  FeedZipHtml(zip_buf, 40550,
  3294         -              "8c2745d4690be5561104207a141bbf83b1dd49221ac60aaf7e");
  3295         -  FeedZipHtml(zip_buf, 40575,
  3296         -              "395be122ff38f9355a3f1d4686fc8856ad39612df0140e9b4e");
  3297         -  FeedZipHtml(zip_buf, 40600,
  3298         -              "8c7eacce1b4190219f48868a4741761f275ff86f4084fe7e46");
  3299         -  FeedZipHtml(zip_buf, 40625,
  3300         -              "6732acf5e6e5c0215f10fa005885319e6d0b21da16f8efd22a");
  3301         -  FeedZipHtml(zip_buf, 40650,
  3302         -              "df0aa3ee70420e1d19b01f00176323362d52514fe20c182842");
  3303         -  FeedZipHtml(zip_buf, 40675,
  3304         -              "18eed7c1ceaf6f8cefd5083eff9dfcb2e04bb92eb815382542");
  3305         -  FeedZipHtml(zip_buf, 40700,
  3306         -              "1af8cd8eb20801831b0104d0a530bdf7a7f0367c9baa0639b2");
  3307         -  FeedZipHtml(zip_buf, 40725,
  3308         -              "d7acf0ded005b9dbe468a445eee01940db632ffe63ef9ba0bd");
  3309         -  FeedZipHtml(zip_buf, 40750,
  3310         -              "ff42bba66a9ea48a50247baf550488df9bdfbf3c227a561acd");
  3311         -  FeedZipHtml(zip_buf, 40775,
  3312         -              "d1f6d0cdd0c078b8a099e1cfb77e7af3672e20680d2bb66192");
  3313         -  FeedZipHtml(zip_buf, 40800,
  3314         -              "6190f851976671f72fda60aee7c37f9ebcfd7025c27053afc5");
  3315         -  FeedZipHtml(zip_buf, 40825,
  3316         -              "2c07ce257c53e4cc0f29e425a2c5bf047b6e97588a2103e81a");
  3317         -  FeedZipHtml(zip_buf, 40850,
  3318         -              "0dc6586e3d502fcf016fc3ea360e0091e047881c8aa8ab5e78");
  3319         -  FeedZipHtml(zip_buf, 40875,
  3320         -              "17f6d08a3b89c23f260109496ce3355eb243da763ae9c0d261");
  3321         -  FeedZipHtml(zip_buf, 40900,
  3322         -              "c48d1b69d74c50e8e90d3376d38e29e9e720d7bd1c16c74bd6");
  3323         -  FeedZipHtml(zip_buf, 40925,
  3324         -              "0bcb8e4f9701754c87cbbc9aa6593032c5306b0b54967e9fcd");
  3325         -  FeedZipHtml(zip_buf, 40950,
  3326         -              "c8da49b9e75888d08657820757f8cf0d9b736e5e3a818ce981");
  3327         -  FeedZipHtml(zip_buf, 40975,
  3328         -              "61df9f78fb18b84d43bbb13c714a1b5086e99a3d108ee2b1f4");
  3329         -  FeedZipHtml(zip_buf, 41000,
  3330         -              "89551f6e8dbfece606b17b18728c96b5b3035af1f9c1f3dc7a");
  3331         -  FeedZipHtml(zip_buf, 41025,
  3332         -              "ca9d6dcca45cd98e6ef0b57cb3ede29a6d836bda4c323d447e");
  3333         -  FeedZipHtml(zip_buf, 41050,
  3334         -              "aea518c553590ababfc5500bacf6cc097979b7bcdeb488022b");
  3335         -  FeedZipHtml(zip_buf, 41075,
  3336         -              "63b627a08c94b35af3ebb21eda05b3012ce63a0c84877b14df");
  3337         -  FeedZipHtml(zip_buf, 41100,
  3338         -              "910b46e33753fbd0a30c8a50c7d0efe99e0bc8380e05da6030");
  3339         -  FeedZipHtml(zip_buf, 41125,
  3340         -              "ed1780f75d904c31da02ee629262b85e24923200f9a7f18412");
  3341         -  FeedZipHtml(zip_buf, 41150,
  3342         -              "ec0cdf7a8a1210d0f7fd2de08cfcde8b49f2dca097f6a8d73b");
  3343         -  FeedZipHtml(zip_buf, 41175,
  3344         -              "4be38bb8e732445cdfe8cfa58f4adfef06fbc577a5cded31f3");
  3345         -  FeedZipHtml(zip_buf, 41200,
  3346         -              "c9229b2795d11df8bd9e48770de10689f1e2a129de461c5006");
  3347         -  FeedZipHtml(zip_buf, 41225,
  3348         -              "5c99b19eb2bfcec8cfbab78439a05a0bc7dd3bf899c42da450");
  3349         -  FeedZipHtml(zip_buf, 41250,
  3350         -              "0a2a0a2302db2bce5191a46ba9f49e5a8f586860488b5c379e");
  3351         -  FeedZipHtml(zip_buf, 41275,
  3352         -              "6e3cf3bfc0ec885318b6cbc199d3827501f750826ec2517c76");
  3353         -  FeedZipHtml(zip_buf, 41300,
  3354         -              "c2a59364096d4cf015873710f1552527d288598e671f800cab");
  3355         -  FeedZipHtml(zip_buf, 41325,
  3356         -              "10cdf85e8a69117c9c1dd3e65470978266c88c10941692894e");
  3357         -  FeedZipHtml(zip_buf, 41350,
  3358         -              "10e21418871b51d7e5928bf34997834381b696725fe6ce9b85");
  3359         -  FeedZipHtml(zip_buf, 41375,
  3360         -              "ded56530aaba2afd79d69bdac01be107a270276b833d33dcd3");
  3361         -  FeedZipHtml(zip_buf, 41400,
  3362         -              "dea08a1fe3e772211f1b8c94924a10f54abf61c85f4ac1aedb");
  3363         -  FeedZipHtml(zip_buf, 41425,
  3364         -              "cbb51134c87523744ba16c7b1fdb375b66d8a8e68734ed22ef");
  3365         -  FeedZipHtml(zip_buf, 41450,
  3366         -              "f9f8d68f06014e8b7076deb53da4f4be031830e7756e122176");
  3367         -  FeedZipHtml(zip_buf, 41475,
  3368         -              "e9b404f58191f0097026d86354683c01e99ba3130de3b1472d");
  3369         -  FeedZipHtml(zip_buf, 41500,
  3370         -              "eed1b47c1b8ecb6e77554cb39470f5e7592f7203efcac134f1");
  3371         -  FeedZipHtml(zip_buf, 41525,
  3372         -              "646b83fd45708feba757a0e0b9020dae6fac11b393d23689b2");
  3373         -  FeedZipHtml(zip_buf, 41550,
  3374         -              "291e51d10dc89964106141935825ce3e0a7a2420d25be75d9b");
  3375         -  FeedZipHtml(zip_buf, 41575,
  3376         -              "f1f482dcf8127a012a521ca4ae350d2c3724ecf0c05e715202");
  3377         -  FeedZipHtml(zip_buf, 41600,
  3378         -              "eea6489a3ddc4d392e980376a8d0181546718ff3bf487f56b7");
  3379         -  FeedZipHtml(zip_buf, 41625,
  3380         -              "aebecb1bdd0c2c1004ffcfc01f563104fc5e89032fdc52147c");
  3381         -  FeedZipHtml(zip_buf, 41650,
  3382         -              "7959ceab370c0d6ee19044a944a56ce102b296ee6882bd2932");
  3383         -  FeedZipHtml(zip_buf, 41675,
  3384         -              "dd06a303ef2d7a8db23c36a44d390323808126b9f49d94cc9f");
  3385         -  FeedZipHtml(zip_buf, 41700,
  3386         -              "daf32d3182e233e42fe23bd06c6742287e9996c7554af1c9f8");
  3387         -  FeedZipHtml(zip_buf, 41725,
  3388         -              "bec327173e5dbb2fd7cd5e084328f641e2d9462001685fb879");
  3389         -  FeedZipHtml(zip_buf, 41750,
  3390         -              "e01d685871459f9386668ed9a969a69ae6d2ce5829e3266e98");
  3391         -  FeedZipHtml(zip_buf, 41775,
  3392         -              "772f87d1e385965b32a4599c88fee262442ed184ae6133943e");
  3393         -  FeedZipHtml(zip_buf, 41800,
  3394         -              "811bc02bde519db572f4114376d8b36cec714835d6f7474935");
  3395         -  FeedZipHtml(zip_buf, 41825,
  3396         -              "0b4720d0220de652a6681a43e65436370c05b4be496aa66cf8");
  3397         -  FeedZipHtml(zip_buf, 41850,
  3398         -              "28f93c5fb8f0cdf6082d88e88bd7ee165f4caea15160ae1b27");
  3399         -  FeedZipHtml(zip_buf, 41875,
  3400         -              "dc59c28d57b10c7bc8d77de3d8d893ef242a972cc8ba3e8f60");
  3401         -  FeedZipHtml(zip_buf, 41900,
  3402         -              "914e4080251176e1f78ced1c60cef2227b70d1b931b37ae4ea");
  3403         -  FeedZipHtml(zip_buf, 41925,
  3404         -              "4ab7adedaa15c0c99d66d57bf3ab48910c4b9fe2e174201b80");
  3405         -  FeedZipHtml(zip_buf, 41950,
  3406         -              "2cfe4248c4adba0d1a30e7559cbce560bb4db98ac998fbe278");
  3407         -  FeedZipHtml(zip_buf, 41975,
  3408         -              "b0318a6c34fd97cc4c7b0106c70c4390e3f17a86522d046a0a");
  3409         -  FeedZipHtml(zip_buf, 42000,
  3410         -              "47a1d201b8c337dd9df06e0ac382d2f7e84a44623c752b9fe0");
  3411         -  FeedZipHtml(zip_buf, 42025,
  3412         -              "d6bbc3b8fb050bc8b43de9a6e7f9b3c4bf0b12511d874b3a50");
  3413         -  FeedZipHtml(zip_buf, 42050,
  3414         -              "8906e0e461c2292822ad91bc69af276f020c9cc64ac231fe8b");
  3415         -  FeedZipHtml(zip_buf, 42075,
  3416         -              "0426fcf79ee60b7ef245327d0a84e4e0092f05505645c41981");
  3417         -  FeedZipHtml(zip_buf, 42100,
  3418         -              "a68b44385914ae2ae83137a63a1e63d3b04b066639b1cb375b");
  3419         -  FeedZipHtml(zip_buf, 42125,
  3420         -              "96c3838c414218b8a891499cf95086b1c7930c4b2fd211c92f");
  3421         -  FeedZipHtml(zip_buf, 42150,
  3422         -              "4ff5aa106bacd8df7b3f15b7c057893f55ae032c8790a69391");
  3423         -  FeedZipHtml(zip_buf, 42175,
  3424         -              "aa48cda546682b6d7e27a89a91ef25f17d412644fb19d743e6");
  3425         -  FeedZipHtml(zip_buf, 42200,
  3426         -              "4de07e03bf7b0bc4907188805e882332c26c6ac4f08b470d04");
  3427         -  FeedZipHtml(zip_buf, 42225,
  3428         -              "d80c439f70b73c91152d9b628c8a125b92981289f198a2ba8a");
  3429         -  FeedZipHtml(zip_buf, 42250,
  3430         -              "370d326e49bf6284d5418765e86a8d28e591caddf3da6c50b5");
  3431         -  FeedZipHtml(zip_buf, 42275,
  3432         -              "09183b8ec79321e32c2286bece0e45dec6b2163afc70287810");
  3433         -  FeedZipHtml(zip_buf, 42300,
  3434         -              "32c5a41302bb820389972c0c52ab06977de56a52aa749ebb7a");
  3435         -  FeedZipHtml(zip_buf, 42325,
  3436         -              "55011deb682382bfe2706ecae1c08fbd701444292556c0d25c");
  3437         -  FeedZipHtml(zip_buf, 42350,
  3438         -              "8d542fcbbfe5e814d74fccee5b721f2bc622784651877b3bfd");
  3439         -  FeedZipHtml(zip_buf, 42375,
  3440         -              "c4c1318eac06e37b29123536cb9b61b38f9a7b6b0364b1ec10");
  3441         -  FeedZipHtml(zip_buf, 42400,
  3442         -              "a01272bc7e2844620e5bf2d9648695ef4837ca3c02cc810218");
  3443         -  FeedZipHtml(zip_buf, 42425,
  3444         -              "46ba62e4e575594d2505129987118f42aa72c4cf3df15a47bd");
  3445         -  FeedZipHtml(zip_buf, 42450,
  3446         -              "27aef2a3b0916ade2a5f0533d864006c4ee328c65f52e865b9");
  3447         -  FeedZipHtml(zip_buf, 42475,
  3448         -              "f8ae43b1166e08c4ca0220965421adf17de1483bffdc4f1169");
  3449         -  FeedZipHtml(zip_buf, 42500,
  3450         -              "857b8b9c59a9b6390bb1e16960f0c22d49427ba9c260e3fbc2");
  3451         -  FeedZipHtml(zip_buf, 42525,
  3452         -              "3178feb99f2206b339e14923f0c20d2642aaa4ae3e6e14ce8f");
  3453         -  FeedZipHtml(zip_buf, 42550,
  3454         -              "980f890ba565f0121e39f50c38bc41e9990602b34d9eac2f02");
  3455         -  FeedZipHtml(zip_buf, 42575,
  3456         -              "f45e0b951faa264b05fa27c32c541ff738aab5980528910901");
  3457         -  FeedZipHtml(zip_buf, 42600,
  3458         -              "45e526a76cb8e72ae1721407976c1f05a062301af986a1d2b4");
  3459         -  FeedZipHtml(zip_buf, 42625,
  3460         -              "9b9c9d90c86eef81dc19cba213ecf0208b9956108b1e568ad6");
  3461         -  FeedZipHtml(zip_buf, 42650,
  3462         -              "b339914a28e771eb3c1d1a3a57872c23247bc422a8e93bf68a");
  3463         -  FeedZipHtml(zip_buf, 42675,
  3464         -              "3e519a2aee838d884ba7ab8bd8eda5a918bc2a1a9b7fb5ada3");
  3465         -  FeedZipHtml(zip_buf, 42700,
  3466         -              "b49f30532b0d4721209dcc49b44162901b2301f77511395e49");
  3467         -  FeedZipHtml(zip_buf, 42725,
  3468         -              "988558fbbd17f645d224134aa17a3a4c134703eccb0368340a");
  3469         -  FeedZipHtml(zip_buf, 42750,
  3470         -              "ff14fd6146fe43389a8c80f882a0d7d61152bfa33146d8d899");
  3471         -  FeedZipHtml(zip_buf, 42775,
  3472         -              "d1e32746cdf12401a2c5c431387c9c481f9361383a8ea334f8");
  3473         -  FeedZipHtml(zip_buf, 42800,
  3474         -              "63c2450ca4495018d087817f17b8e809ade59c141e465d9800");
  3475         -  FeedZipHtml(zip_buf, 42825,
  3476         -              "6805099aaafa732212a5b0f97daa9ffc107427449906c4847f");
  3477         -  FeedZipHtml(zip_buf, 42850,
  3478         -              "050ed7dae3ba01c39c2f9576a72a1803d161b6acf6b6e57744");
  3479         -  FeedZipHtml(zip_buf, 42875,
  3480         -              "bfea87dcfe1d4623e340aab637b7634d8f674df8ff5e45feb8");
  3481         -  FeedZipHtml(zip_buf, 42900,
  3482         -              "9c1fc911a56c810d8a458e1002be50f99a7a17a38b33cdbdae");
  3483         -  FeedZipHtml(zip_buf, 42925,
  3484         -              "baeb9b147e5eca8eac91e434c6f2992583673acd4689100403");
  3485         -  FeedZipHtml(zip_buf, 42950,
  3486         -              "f67a019bc2baececb7466a07f8d12174fb332c588d9560f7d8");
  3487         -  FeedZipHtml(zip_buf, 42975,
  3488         -              "5b9072c122cd29ac0e0fafed2c76264723d39d12b029dd50e6");
  3489         -  FeedZipHtml(zip_buf, 43000,
  3490         -              "9852497506a42c358d1a6dd453ce15515e80d3ad69cc0f5611");
  3491         -  FeedZipHtml(zip_buf, 43025,
  3492         -              "52aa7021bcf34c9d3f58354c5f89a5a99c3a92ab33e73cb0ad");
  3493         -  FeedZipHtml(zip_buf, 43050,
  3494         -              "e053edb6a1cd71616b6057a2d9c6040e3d4497d10873fc11a2");
  3495         -  FeedZipHtml(zip_buf, 43075,
  3496         -              "29a5eaf6b12b9b9971fe4d33264488b90a4e34dbae0411e437");
  3497         -  FeedZipHtml(zip_buf, 43100,
  3498         -              "86c2a686a2eacda993f5b19d920ebdc08628b77e1a5899f855");
  3499         -  FeedZipHtml(zip_buf, 43125,
  3500         -              "1c118181fe2aedd35f029fbbe245e03fafd9df59c6ee72034b");
  3501         -  FeedZipHtml(zip_buf, 43150,
  3502         -              "b94fafb33f56fd798dbf93776edff10320d2c928727d612f25");
  3503         -  FeedZipHtml(zip_buf, 43175,
  3504         -              "3b62ed4f8a2956739f3a216f33cfd4904f2f924d6facb54ffa");
  3505         -  FeedZipHtml(zip_buf, 43200,
  3506         -              "bdb1cf837228924c6602928e028c972886dc8a33336992330c");
  3507         -  FeedZipHtml(zip_buf, 43225,
  3508         -              "e79fba0d4e308e346364f77b61328523381b15a6d0d8c10b44");
  3509         -  FeedZipHtml(zip_buf, 43250,
  3510         -              "14ca62a046f9e3909fcf13fd8e0c3e231a95441cbbd9f54523");
  3511         -  FeedZipHtml(zip_buf, 43275,
  3512         -              "8bfc360b7da3a583ca68dd09b33efb707476f18c381c9676e8");
  3513         -  FeedZipHtml(zip_buf, 43300,
  3514         -              "e4f894dc546ef33065dc7c6bba6a4b2008c40c6230602fd999");
  3515         -  FeedZipHtml(zip_buf, 43325,
  3516         -              "3fc9e2914ffa0489bbf8f52ee8c9a70c9bb4c0ce7b9d6707cf");
  3517         -  FeedZipHtml(zip_buf, 43350,
  3518         -              "08d662ffcefe8e8a89f2ca6d51d3cf2861419170a881e05b66");
  3519         -  FeedZipHtml(zip_buf, 43375,
  3520         -              "eca682d31640e4b801e9813684fc010aeb52cc37bcccb2d818");
  3521         -  FeedZipHtml(zip_buf, 43400,
  3522         -              "7a9bcd3263dae9cc07341ccf4d5e38ab030535aa1a53abb29c");
  3523         -  FeedZipHtml(zip_buf, 43425,
  3524         -              "bb9bdc41009f21bcb587967db25db44ab68bc6977689c9a52d");
  3525         -  FeedZipHtml(zip_buf, 43450,
  3526         -              "b762c59b9973da7f943775ac02034c5898417e85935a1d6ab4");
  3527         -  FeedZipHtml(zip_buf, 43475,
  3528         -              "38d52e1132c494ee875e07acc04440894833b26485a01bcac3");
  3529         -  FeedZipHtml(zip_buf, 43500,
  3530         -              "c1aa627e0f2408557bac20a8efe5375bf1ecbf9665e897f2d8");
  3531         -  FeedZipHtml(zip_buf, 43525,
  3532         -              "4f3a544a29a01baa78ebad71ad528d020d1f37a0b1df90a93e");
  3533         -  FeedZipHtml(zip_buf, 43550,
  3534         -              "2d795c0a3851f61a2f665563c0308806dc87aacaf0e2dadf46");
  3535         -  FeedZipHtml(zip_buf, 43575,
  3536         -              "3d822215713e7b27c5595961368c7440eee92db6474e3c6de8");
  3537         -  FeedZipHtml(zip_buf, 43600,
  3538         -              "4a4510170ad8f954716565e84edd8f16f68b540418bec95d13");
  3539         -  FeedZipHtml(zip_buf, 43625,
  3540         -              "415cf78af231b050378a9ac84651a8df6007de1fbc97c25e4b");
  3541         -  FeedZipHtml(zip_buf, 43650,
  3542         -              "3d7c8743810efa78fa9d60f8d041b1b390d8923c1d59e7bc5b");
  3543         -  FeedZipHtml(zip_buf, 43675,
  3544         -              "9f628fa5ae424df058341735cba2c9a803a3012cbcdf027329");
  3545         -  FeedZipHtml(zip_buf, 43700,
  3546         -              "3b1e2359b3e3a1728e45cc3265cf405e2f1a821935d2447c1e");
  3547         -  FeedZipHtml(zip_buf, 43725,
  3548         -              "ae913b654066b60c5e04b1b50c6b2485f8c474814a5278df23");
  3549         -  FeedZipHtml(zip_buf, 43750,
  3550         -              "d5e58f74cce130be277b0aa82d85430521698c85eb322516d7");
  3551         -  FeedZipHtml(zip_buf, 43775,
  3552         -              "49f1d1173a996f85378963d29bc32a2cd9c4266fc83447a070");
  3553         -  FeedZipHtml(zip_buf, 43800,
  3554         -              "41969fbe59774165a3a8df12c6db28968cd06190eaac483a3e");
  3555         -  FeedZipHtml(zip_buf, 43825,
  3556         -              "7539a35859a5578ec7c3e28b49863fa94d93fc5283805c50b2");
  3557         -  FeedZipHtml(zip_buf, 43850,
  3558         -              "1b8f4333b251dca2417af201f1492f9ce2011aab836e025fae");
  3559         -  FeedZipHtml(zip_buf, 43875,
  3560         -              "76483dcd6b554373d4f275a886badd6a37d5f42ddcb25db7b5");
  3561         -  FeedZipHtml(zip_buf, 43900,
  3562         -              "1e34e3a3faf40ffa148269381037affb2e59e5152249851356");
  3563         -  FeedZipHtml(zip_buf, 43925,
  3564         -              "d534df69c73bed78a71d2f483b765abad33251bd42ec72a9c6");
  3565         -  FeedZipHtml(zip_buf, 43950,
  3566         -              "cd54e29c8ac74e51b145d52e15ddc078d98736d5d0458d023f");
  3567         -  FeedZipHtml(zip_buf, 43975,
  3568         -              "2a0894664959d59fb4dcb41f9a5ecf7045be8675a9fce63b5b");
  3569         -  FeedZipHtml(zip_buf, 44000,
  3570         -              "1761511cbb91d2dcaab6b60c996e63f6be1ac96e9b8fbb8df2");
  3571         -  FeedZipHtml(zip_buf, 44025,
  3572         -              "5d45f44e5e95db05ef6c68f0ce9a1f89d3878a70f0dcc05510");
  3573         -  FeedZipHtml(zip_buf, 44050,
  3574         -              "760f70a713462e8fa9a66939e82e0cee1ffbbc6cc5b996f136");
  3575         -  FeedZipHtml(zip_buf, 44075,
  3576         -              "3d8d83cf6cfedf81e869bd81db69e3c01bfd99e2b2e0affacd");
  3577         -  FeedZipHtml(zip_buf, 44100,
  3578         -              "60f3846c7724add73dcfd65a89f547e81ac0762b63eee5813d");
  3579         -  FeedZipHtml(zip_buf, 44125,
  3580         -              "7f3191fac7609ad36384791a9f07fc671f34186cb8a0acd9fe");
  3581         -  FeedZipHtml(zip_buf, 44150,
  3582         -              "9d69c5462098f84880507b968fdd30f6696e111cc693e193e8");
  3583         -  FeedZipHtml(zip_buf, 44175,
  3584         -              "633102d91b22c24ab6723d8e1ed39675f1776de1c0a711eb0b");
  3585         -  FeedZipHtml(zip_buf, 44200,
  3586         -              "c832183b33d0ce0cb43c33900b2d8c9e24ca51081822261769");
  3587         -  FeedZipHtml(zip_buf, 44225,
  3588         -              "5c9ace9c6697afc7c0e4e21408c53c5e8bb22346802b3789fa");
  3589         -  FeedZipHtml(zip_buf, 44250,
  3590         -              "f4239b58d222bf52bc41322dd15f86783b603b53114f9cdec6");
  3591         -  FeedZipHtml(zip_buf, 44275,
  3592         -              "93618fb0dbe2be62a766d1559b786451108132b9de2155c7c5");
  3593         -  FeedZipHtml(zip_buf, 44300,
  3594         -              "37b8ecb4b28bd44ff84e5b9da3b0e70d56eaa26d8b23d06bbe");
  3595         -  FeedZipHtml(zip_buf, 44325,
  3596         -              "b413a8421ac04bdf5cc41999cf0e99a6ca78bd62f1aef3aa6d");
  3597         -  FeedZipHtml(zip_buf, 44350,
  3598         -              "b03a26d78f0d6be0c9db7c25249bce7676caedb1533e972a28");
  3599         -  FeedZipHtml(zip_buf, 44375,
  3600         -              "9574117aa8471604f8aae31d3a2400a13ce8163db23883a392");
  3601         -  FeedZipHtml(zip_buf, 44400,
  3602         -              "348364929344525851d81f142a6be4e337953147e1f351a526");
  3603         -  FeedZipHtml(zip_buf, 44425,
  3604         -              "3c24eff83dda2c9af4752ab76435568ed5f0cd5717e636eb6d");
  3605         -  FeedZipHtml(zip_buf, 44450,
  3606         -              "c5e99667c47d1ac75faabafc75026a1b95e6868663c1ff76b6");
  3607         -  FeedZipHtml(zip_buf, 44475,
  3608         -              "e36db31d7f5d0fb7067ff96b6d5c51492548277babfd591bb1");
  3609         -  FeedZipHtml(zip_buf, 44500,
  3610         -              "9962c93b937048b2a9d58c78038c63b24030fca7324b31728a");
  3611         -  FeedZipHtml(zip_buf, 44525,
  3612         -              "6e7a0aed2888529c845b910ff16f234ab6e926a890bbdaf88a");
  3613         -  FeedZipHtml(zip_buf, 44550,
  3614         -              "e28c6a1aa9c4504ca82808382d60afc8c6d4754b552aa16c42");
  3615         -  FeedZipHtml(zip_buf, 44575,
  3616         -              "9b6279d14074a10dc23c8ed219f66ccd87502a1c89462d6c21");
  3617         -  FeedZipHtml(zip_buf, 44600,
  3618         -              "419ae0cddedf8ad65899ff85ce071ab84f3fccf7cbcd1f491c");
  3619         -  FeedZipHtml(zip_buf, 44625,
  3620         -              "050d8825e720435efe2043bffb4548e1eeed7b2d78287ca06f");
  3621         -  FeedZipHtml(zip_buf, 44650,
  3622         -              "1f4b50f426d4a312fe74879d533dd4f2d292b4fc7c1505a1f8");
  3623         -  FeedZipHtml(zip_buf, 44675,
  3624         -              "d7c60220cff98edb9cd70abe2ee006dc55ec8e81cb48afd91d");
  3625         -  FeedZipHtml(zip_buf, 44700,
  3626         -              "61944415374c9daa8f454452b576e4acb65049960c6eafc867");
  3627         -  FeedZipHtml(zip_buf, 44725,
  3628         -              "bd09de4f2fe425d416cd4868dd8518d63d8637c1274a3ee49a");
  3629         -  FeedZipHtml(zip_buf, 44750,
  3630         -              "a4fd7ed80d31e8fd3b7a993cbc1d2cff689b758475088be6a7");
  3631         -  FeedZipHtml(zip_buf, 44775,
  3632         -              "930eb651269ddf1f494ee9df01ab24c9e4f2e8c321239ab651");
  3633         -  FeedZipHtml(zip_buf, 44800,
  3634         -              "4bab293fa6b497dbc9c04037b41c79e3a19fc19eacfed3e2f9");
  3635         -  FeedZipHtml(zip_buf, 44825,
  3636         -              "a5f0667c3fd482b00cc300e6ee103221b39618850932513a11");
  3637         -  FeedZipHtml(zip_buf, 44850,
  3638         -              "87c3ee62a398ad3a5e90247152d6f42157c9d27c4d16e78ebc");
  3639         -  FeedZipHtml(zip_buf, 44875,
  3640         -              "24fe743582fb2ae9155236b294278f40e6eb86497702f24d98");
  3641         -  FeedZipHtml(zip_buf, 44900,
  3642         -              "4d1f2be42e7c5d1e097cc2df1a91d17c4a94815f971b168c5f");
  3643         -  FeedZipHtml(zip_buf, 44925,
  3644         -              "9223b5308aa49c846613e63ddeb1019d30ea050f5e8a609529");
  3645         -  FeedZipHtml(zip_buf, 44950,
  3646         -              "0c70e21c0c091830871ff504fbf2086eae9fe1071c6f57c430");
  3647         -  FeedZipHtml(zip_buf, 44975,
  3648         -              "6c4d2cc12251a1e80a8a48149a1d958a9b1bc34b9e62fd7cb8");
  3649         -  FeedZipHtml(zip_buf, 45000,
  3650         -              "69dfbb0579074066eceed91be33728fcf96f5ca6e6e2c409b6");
  3651         -  FeedZipHtml(zip_buf, 45025,
  3652         -              "70c472ded97d107047eb83e7a685eb39ffb30d0f0b324209ca");
  3653         -  FeedZipHtml(zip_buf, 45050,
  3654         -              "02743a6f380185ad40c097e06470ca0199e63478e4ece2811c");
  3655         -  FeedZipHtml(zip_buf, 45075,
  3656         -              "0f8113a090dc0b536253b04bb167049bfd52756f83ee17a709");
  3657         -  FeedZipHtml(zip_buf, 45100,
  3658         -              "1d2696ec9cf76e64e4e90be13c7ae4dc9866c4ee36d3a4e51b");
  3659         -  FeedZipHtml(zip_buf, 45125,
  3660         -              "e715e7c86ee1f92b6c531ab4aab747f7de2cfe6e990ced046e");
  3661         -  FeedZipHtml(zip_buf, 45150,
  3662         -              "18775c5216bf62f096f48e6fca117ae26c959d0f577d2ba45b");
  3663         -  FeedZipHtml(zip_buf, 45175,
  3664         -              "36bd151afc546fa5aad3eff26fa5b2f9a063d013bb85097668");
  3665         -  FeedZipHtml(zip_buf, 45200,
  3666         -              "c256af20d4898be81802c8515418818231b66e11cd9d583d92");
  3667         -  FeedZipHtml(zip_buf, 45225,
  3668         -              "8966bad31ca83a4374b2a2ab87ff92defa496064cdc94630af");
  3669         -  FeedZipHtml(zip_buf, 45250,
  3670         -              "bc30fb16e6ecb0ce41098670cdb7b2c475979c531428d067a1");
  3671         -  FeedZipHtml(zip_buf, 45275,
  3672         -              "9f1bcb0cb8bd4b274cd09b844f500aff1eb212a44ea09a110f");
  3673         -  FeedZipHtml(zip_buf, 45300,
  3674         -              "0192385e24dba133c6d0b0c896844eab7d33efd486850b5cb9");
  3675         -  FeedZipHtml(zip_buf, 45325,
  3676         -              "080e479c4447b7c2e152f4f24941e54a3caab9269764c35917");
  3677         -  FeedZipHtml(zip_buf, 45350,
  3678         -              "4154764f740cda11c48e20964110268aad95206a3a563b8755");
  3679         -  FeedZipHtml(zip_buf, 45375,
  3680         -              "d66e7cbc7768216b3dca15b37e5a2e162c1852412221eeaa98");
  3681         -  FeedZipHtml(zip_buf, 45400,
  3682         -              "b85cc70f99a6cf24d8acfc80dd1044b9f755335c409642a880");
  3683         -  FeedZipHtml(zip_buf, 45425,
  3684         -              "8e61b1a07ccb0e0d1d662022388803340f0eb0e85018fda29e");
  3685         -  FeedZipHtml(zip_buf, 45450,
  3686         -              "a04089eba079f586cd9e1d81499bf0f0d49059a38ee08ba1b2");
  3687         -  FeedZipHtml(zip_buf, 45475,
  3688         -              "452cb523b21d91d988b4561a3b1e82a4524e5cf4b914d5a3e0");
  3689         -  FeedZipHtml(zip_buf, 45500,
  3690         -              "7e7f7b64bd2e9e8501970b8596c1d2546fe315610635798af3");
  3691         -  FeedZipHtml(zip_buf, 45525,
  3692         -              "5d9e4040c340e738e339bcda40b87524d3881e335741d02bbf");
  3693         -  FeedZipHtml(zip_buf, 45550,
  3694         -              "5863d09c4d47dfcf5f597599ad287deeb9a143892751f8c784");
  3695         -  FeedZipHtml(zip_buf, 45575,
  3696         -              "5cf42c874ed9cfc65d5984a78c2324a9b056ae8d078edaab6e");
  3697         -  FeedZipHtml(zip_buf, 45600,
  3698         -              "61299b282ce92e5103a8bd4b39e869b5156d7897dc9fa4f62a");
  3699         -  FeedZipHtml(zip_buf, 45625,
  3700         -              "71d41aaf122bb1d10ad771f575e606b62afa90b8439a4274ff");
  3701         -  FeedZipHtml(zip_buf, 45650,
  3702         -              "99b13f9b7cd5aadb81ba09ece16cdd068b4578edb222ad0806");
  3703         -  FeedZipHtml(zip_buf, 45675,
  3704         -              "89023f4945940a29c246ba046bf21497cfe0c0a95eb1d99f95");
  3705         -  FeedZipHtml(zip_buf, 45700,
  3706         -              "67f52bd1aecf742d6abd1437857c5c3efdd5f122b257e42cc1");
  3707         -  FeedZipHtml(zip_buf, 45725,
  3708         -              "2278df286434c10b3daec5c5b9be36acc8159faa450de2f208");
  3709         -  FeedZipHtml(zip_buf, 45750,
  3710         -              "4184d9ecf841bf5a337e9c8420a676c2c104048aab6080bfaa");
  3711         -  FeedZipHtml(zip_buf, 45775,
  3712         -              "f1e094fd625996b945a3c0699452301719ba74380ec52014d2");
  3713         -  FeedZipHtml(zip_buf, 45800,
  3714         -              "d718c8b7184a8782d9906b5e53f1b92408303a016432d92e25");
  3715         -  FeedZipHtml(zip_buf, 45825,
  3716         -              "9fc2a527e7f0181928c49e58913080d3c89423399dbada61d0");
  3717         -  FeedZipHtml(zip_buf, 45850,
  3718         -              "cf30932c0694c1f807776135e762a26a5b27e0572cbb8ff785");
  3719         -  FeedZipHtml(zip_buf, 45875,
  3720         -              "ce98f2a5e944b45b74ceb24e417a503cf445f4052074d2e3bf");
  3721         -  FeedZipHtml(zip_buf, 45900,
  3722         -              "8a1823da63f0509307146249c26444e06a613656f46d66868e");
  3723         -  FeedZipHtml(zip_buf, 45925,
  3724         -              "607c211a04d35cd891b20dee91f41be4af0a151c209a549349");
  3725         -  FeedZipHtml(zip_buf, 45950,
  3726         -              "17b6e387119d94534a0837e38955e25007c1141a9171cc9fae");
  3727         -  FeedZipHtml(zip_buf, 45975,
  3728         -              "8f28a1b1bce60b9f29dc539dc34d65c6a0e684e5322bd44f84");
  3729         -  FeedZipHtml(zip_buf, 46000,
  3730         -              "651b41a3409cf087fb237cb46a2d18de26f071d9941c593ae0");
  3731         -  FeedZipHtml(zip_buf, 46025,
  3732         -              "928852c38bdb27f441996c9f4e8e5105586f1b1de964284f02");
  3733         -  FeedZipHtml(zip_buf, 46050,
  3734         -              "11b2c10ef609fc5d05b889e80820228c5e3555b9d2caa0a581");
  3735         -  FeedZipHtml(zip_buf, 46075,
  3736         -              "5e79c8e662bd30d04b84d9c961f254adbe8f2982ba29391673");
  3737         -  FeedZipHtml(zip_buf, 46100,
  3738         -              "0c839ecc78335a50dbe7e703eb378402c2ac4835af9562d5cc");
  3739         -  FeedZipHtml(zip_buf, 46125,
  3740         -              "64af40226b502831e494fc10e7b0ffea8056356ce6807bf8db");
  3741         -  FeedZipHtml(zip_buf, 46150,
  3742         -              "7e69d03d7e2c09bca78af68e98fb8d344118d6b3e081b2c265");
  3743         -  FeedZipHtml(zip_buf, 46175,
  3744         -              "9ab628d5792d5a88e3c50ec9f890de86631d9523f5184ad7b4");
  3745         -  FeedZipHtml(zip_buf, 46200,
  3746         -              "32b5f57b887425a284d3ef28c5722cfe25de1d2105f92c0329");
  3747         -  FeedZipHtml(zip_buf, 46225,
  3748         -              "76742943a7f75566dca2f39e5574f6d2729f7398b2cb7f2ec9");
  3749         -  FeedZipHtml(zip_buf, 46250,
  3750         -              "7f76dcc426e44037cb54a6b0fcbec40c2381d8e330e27c5e31");
  3751         -  FeedZipHtml(zip_buf, 46275,
  3752         -              "75ce291654364ae4320472c9a412116317129ebcd540510641");
  3753         -  FeedZipHtml(zip_buf, 46300,
  3754         -              "f2d4d65904d7cfd0518922e1a99aa15bc3760c7d690c5dc8b1");
  3755         -  FeedZipHtml(zip_buf, 46325,
  3756         -              "950cdda8facc3c5df7fcdbb1f51d5b7f826c3d67e931387bee");
  3757         -  FeedZipHtml(zip_buf, 46350,
  3758         -              "cb8eb9e71a079a55f6dc9c5d8fd944b6ee6e3ab8313b6e130b");
  3759         -  FeedZipHtml(zip_buf, 46375,
  3760         -              "db179e867d8e9e97597691bf1dcefbdc6bf5912945318d5cb1");
  3761         -  FeedZipHtml(zip_buf, 46400,
  3762         -              "2a0c0fcba5e6e9e789780772d1d65de8936ebb8f6cbca79951");
  3763         -  FeedZipHtml(zip_buf, 46425,
  3764         -              "bad7e05532f97118514604f38b0cf6d0996440e3bb776bf76e");
  3765         -  FeedZipHtml(zip_buf, 46450,
  3766         -              "6de0bbb5fd85938cc752c17f15ef2511958ec461af2e8c105b");
  3767         -  FeedZipHtml(zip_buf, 46475,
  3768         -              "a3fa6e8afc25191471c5696917fcd9a8dc4452b22a2be74039");
  3769         -  FeedZipHtml(zip_buf, 46500,
  3770         -              "5df7cdd94745cbcf18e8eae6516a0e325e264079c6591cdd57");
  3771         -  FeedZipHtml(zip_buf, 46525,
  3772         -              "da2ae35eecf3dbb4d8fc94ed8380b5fe600054204cfff04da7");
  3773         -  FeedZipHtml(zip_buf, 46550,
  3774         -              "67767e872b4f352f2e9c90678439c8a5a5f395883f9b859970");
  3775         -  FeedZipHtml(zip_buf, 46575,
  3776         -              "a367e4055393e596b133a369a114eb11a9abb6b33415f0b8da");
  3777         -  FeedZipHtml(zip_buf, 46600,
  3778         -              "a0834bbe9ebcf9c4696d912809c5f9af8e58611b8dc2e82efe");
  3779         -  FeedZipHtml(zip_buf, 46625,
  3780         -              "1298615ba62d9d2b1fb46c1baf276dbc1b615ad562cdfb200a");
  3781         -  FeedZipHtml(zip_buf, 46650,
  3782         -              "1278e6ab4a06b8466f80383457b5916a216fcbce5729126ea8");
  3783         -  FeedZipHtml(zip_buf, 46675,
  3784         -              "44782a1312541c64ea393153d09128b942128af0f5b1108989");
  3785         -  FeedZipHtml(zip_buf, 46700,
  3786         -              "064539849c9b1cf5ff1d7c97d7d9f3d20c478c407a90520c45");
  3787         -  FeedZipHtml(zip_buf, 46725,
  3788         -              "366646968119055a2af3d9b5c994b788fd95fe18c4868750b0");
  3789         -  FeedZipHtml(zip_buf, 46750,
  3790         -              "e7c4ef859354575014ef3f5ce5001eedfd4fc1e40b562e153b");
  3791         -  FeedZipHtml(zip_buf, 46775,
  3792         -              "ee0a9e3e1cc409dceac8608eeb6213c7f45ce2bfcefd29224f");
  3793         -  FeedZipHtml(zip_buf, 46800,
  3794         -              "69bca63d7085c443f7876bcedd626123f7de068d40156bda64");
  3795         -  FeedZipHtml(zip_buf, 46825,
  3796         -              "72e61057d1ad584458531403b616e4d8190b7f3caa8c4be4c7");
  3797         -  FeedZipHtml(zip_buf, 46850,
  3798         -              "8a5d511e3adca95b3b756ba76e2d5eddca87237498af58c50a");
  3799         -  FeedZipHtml(zip_buf, 46875,
  3800         -              "04dbe15a05eeca33ba45a428b8292a9f095bcd9f4112cbf6a5");
  3801         -  FeedZipHtml(zip_buf, 46900,
  3802         -              "5cfc956a4d148c2dbe37898ccbce6121a193a11a20ced3d5c0");
  3803         -  FeedZipHtml(zip_buf, 46925,
  3804         -              "50ec95faeee8fc8af7d32186839549f70afa844967f0234da7");
  3805         -  FeedZipHtml(zip_buf, 46950,
  3806         -              "f44b897b42d5048ea0aa2c30076b6b14141bcf5ba894aeb278");
  3807         -  FeedZipHtml(zip_buf, 46975,
  3808         -              "e45cd7a37f1685598327df1ab6d84773b6377dfdcf1f154f21");
  3809         -  FeedZipHtml(zip_buf, 47000,
  3810         -              "31138b15e1f3e6cfff0a8e8788664c2d40384840cb7b10ad65");
  3811         -  FeedZipHtml(zip_buf, 47025,
  3812         -              "16f52aae0b71b9544503d4cd0d2c45de6dc3c36e0c9a4490e9");
  3813         -  FeedZipHtml(zip_buf, 47050,
  3814         -              "546c2beb288f83ebc8113a25cdadc115e506ce73458ff4fc2c");
  3815         -  FeedZipHtml(zip_buf, 47075,
  3816         -              "710773aaed1bb8cbb610fdf7c989ba4daa0af0c5713c9e0c59");
  3817         -  FeedZipHtml(zip_buf, 47100,
  3818         -              "6f319c41b9e29f7e916e1a857aba64ab223c172566a1e021ec");
  3819         -  FeedZipHtml(zip_buf, 47125,
  3820         -              "ce676a5e5d2d4fecb3d2dceeb49357485a73c89606ae2ce6e0");
  3821         -  FeedZipHtml(zip_buf, 47150,
  3822         -              "55079247107bec4c84a118d51fd437c4e5f7b8c216f04b2196");
  3823         -  FeedZipHtml(zip_buf, 47175,
  3824         -              "1a4c149d96d36630589fb0960649f68e6df858beb291e496fb");
  3825         -  FeedZipHtml(zip_buf, 47200,
  3826         -              "cd62b946bf34dd6fb338414860604d44d427410809b8e4ca87");
  3827         -  FeedZipHtml(zip_buf, 47225,
  3828         -              "8464a484a331e272aef9e3b9860b8149ddd079be45a1cc6876");
  3829         -  FeedZipHtml(zip_buf, 47250,
  3830         -              "e1db2552731552f38fc35ea913aefce0c6a9731bf373c74ee2");
  3831         -  FeedZipHtml(zip_buf, 47275,
  3832         -              "7bed8923ad4a14bf253857f9b5d644471a25fefaac0aa782e7");
  3833         -  FeedZipHtml(zip_buf, 47300,
  3834         -              "5dc02946a4dbefdfbcf6c95cf3c3b328c8eee3e4cbb33757ff");
  3835         -  FeedZipHtml(zip_buf, 47325,
  3836         -              "ef5c191052b348a90a5ab8e0a15c1511e770ece7d6c2fb1ee1");
  3837         -  FeedZipHtml(zip_buf, 47350,
  3838         -              "fd3b312b0cbd95a8ec1a773505edf4a16ed4d9d547efc5f72f");
  3839         -  FeedZipHtml(zip_buf, 47375,
  3840         -              "fff28ffdef5151160a4addafa4f91a7f328a7b130cf0a9fc85");
  3841         -  FeedZipHtml(zip_buf, 47400,
  3842         -              "456a5793117609a29fb818d9fb203bf7d34c00e854de65917b");
  3843         -  FeedZipHtml(zip_buf, 47425,
  3844         -              "950c6c817e959589e7f2df1bc06d8cbca2510c44920438a181");
  3845         -  FeedZipHtml(zip_buf, 47450,
  3846         -              "bc026965a922441d449bb68840537e4dce14d4bf43c58e9354");
  3847         -  FeedZipHtml(zip_buf, 47475,
  3848         -              "e0c51a07448be5ef86d4da61e62288afae6f8cef9590dd9ca4");
  3849         -  FeedZipHtml(zip_buf, 47500,
  3850         -              "3daab36f52a0e098d294637a5f1000060d080d798a15a7a8d2");
  3851         -  FeedZipHtml(zip_buf, 47525,
  3852         -              "95c88cc3ff4b6e5b4eace3baa1b0513fd5e6dd3e5f0b3b0f04");
  3853         -  FeedZipHtml(zip_buf, 47550,
  3854         -              "527a1a647b551a56888c2c3419d91edd72f8e6b9fcbb605c04");
  3855         -  FeedZipHtml(zip_buf, 47575,
  3856         -              "eb7d1e9dcffd9c31add3da69f1eeadcf8dafde54491accd056");
  3857         -  FeedZipHtml(zip_buf, 47600,
  3858         -              "d111b3693b8f991a3e248d2492e52ed8f66efdf4e6cfb51fbc");
  3859         -  FeedZipHtml(zip_buf, 47625,
  3860         -              "641f6d346cc6f737dd388cba24016c953607ff79f2f6c3958a");
  3861         -  FeedZipHtml(zip_buf, 47650,
  3862         -              "476991609a82049b8403d86e8a998c3d4aa025d165187e09f6");
  3863         -  FeedZipHtml(zip_buf, 47675,
  3864         -              "346b0823a0bf5e90e8966c201206633fc1c925277615fc0780");
  3865         -  FeedZipHtml(zip_buf, 47700,
  3866         -              "883b919123012d7417f6b0fc30d78d30bc3b06633fa45da793");
  3867         -  FeedZipHtml(zip_buf, 47725,
  3868         -              "0eac1c46ac89d0a699d02769801e18643f1edbf8f255e4616d");
  3869         -  FeedZipHtml(zip_buf, 47750,
  3870         -              "71f3bc363c0c0e6dca5ad3ea3009b74c4e164379dc37d843db");
  3871         -  FeedZipHtml(zip_buf, 47775,
  3872         -              "33f208c99dc15e72738cd61ea97e71437d516e3e097b1a6a52");
  3873         -  FeedZipHtml(zip_buf, 47800,
  3874         -              "7d55019aded534cd02abe6bb7d165c6bff45838508e1678491");
  3875         -  FeedZipHtml(zip_buf, 47825,
  3876         -              "5815877d7fe2ed7bbffcfa1b0dedc6f2bad2990e9ba72ec776");
  3877         -  FeedZipHtml(zip_buf, 47850,
  3878         -              "f45494cf8c7dea7aa82cef5f50e4d004dd3f13742a7d31ff48");
  3879         -  FeedZipHtml(zip_buf, 47875,
  3880         -              "0f871e8b9fe9cfaaf8bf6c49ead3459ae272cb84817bfb25d9");
  3881         -  FeedZipHtml(zip_buf, 47900,
  3882         -              "d1ae17aced7abfdac6fb35db737592c4e3d2c7caf8b8242965");
  3883         -  FeedZipHtml(zip_buf, 47925,
  3884         -              "c1ccea386f994d4548336332f3a42159d34dbfeb9eae108aec");
  3885         -  FeedZipHtml(zip_buf, 47950,
  3886         -              "ed50767fa4f0b39e6840e44f325400879cb0438638c0ab693c");
  3887         -  FeedZipHtml(zip_buf, 47975,
  3888         -              "a16839a3932766cc231bbac7381af9bd1793bcb84182ca51af");
  3889         -  FeedZipHtml(zip_buf, 48000,
  3890         -              "7796a200ca28ee1052ad1165afa2bb7acdc689af1c20dfeb89");
  3891         -  FeedZipHtml(zip_buf, 48025,
  3892         -              "5223611ab3554a9caee466842346b81a45e08052b4c56f176a");
  3893         -  FeedZipHtml(zip_buf, 48050,
  3894         -              "70fa00485b732df690b27b899053b9e492ca0b9b53935bca6d");
  3895         -  FeedZipHtml(zip_buf, 48075,
  3896         -              "49cf4afeaea42f8f0fa22bbb55d57ecab031f408ebd60e8285");
  3897         -  FeedZipHtml(zip_buf, 48100,
  3898         -              "1b092f8351cd95592366bcb10dbc19edf56a4847cbbf03ee52");
  3899         -  FeedZipHtml(zip_buf, 48125,
  3900         -              "e478c3988fe1b752b91e7dc4a5e4029a7ee9379da4b9750c10");
  3901         -  FeedZipHtml(zip_buf, 48150,
  3902         -              "01222b5893cc771fcb3b2cabcd5fcd0c69c245dee8319581c1");
  3903         -  FeedZipHtml(zip_buf, 48175,
  3904         -              "6911b0ce8bb58794ddef1045b9f9ae6f93888ecbe270712b19");
  3905         -  FeedZipHtml(zip_buf, 48200,
  3906         -              "c383c1520c7955e59bbb659951fd5666f23a9924f08c521ad5");
  3907         -  FeedZipHtml(zip_buf, 48225,
  3908         -              "9f67bcc60dbc29c91ee966d606f08be01e5449dc42498565ae");
  3909         -  FeedZipHtml(zip_buf, 48250,
  3910         -              "066d8e990ff41bc6e344dd62268b964c389e48bd9ab436cc29");
  3911         -  FeedZipHtml(zip_buf, 48275,
  3912         -              "de435d4cb5ad1662a159674b3e691ef5cf4ec201b6c794d4c6");
  3913         -  FeedZipHtml(zip_buf, 48300,
  3914         -              "d7d10b86d4f5db2c149b04e3a12f1b54025795dc763eb6ba04");
  3915         -  FeedZipHtml(zip_buf, 48325,
  3916         -              "01b3578b166acc608716f3a0c528eeb1638ffd77eabd95dfe5");
  3917         -  FeedZipHtml(zip_buf, 48350,
  3918         -              "ed6e0646001380b7af965198630823667869b749492c43942b");
  3919         -  FeedZipHtml(zip_buf, 48375,
  3920         -              "6904dc2efeb1141db5578b306acc6087305bc35996802b2861");
  3921         -  FeedZipHtml(zip_buf, 48400,
  3922         -              "c006dddd85840422be573d332fca04f82f2fb7e605ba853312");
  3923         -  FeedZipHtml(zip_buf, 48425,
  3924         -              "451335b32518c85fa6f34ae89b4ad96d303af0dec62289da42");
  3925         -  FeedZipHtml(zip_buf, 48450,
  3926         -              "89b42913612c307045a42ecb75293910a6c6f459b337653f4c");
  3927         -  FeedZipHtml(zip_buf, 48475,
  3928         -              "d24cfe22c656093361956cf9b32406548954c6f71d52b991ea");
  3929         -  FeedZipHtml(zip_buf, 48500,
  3930         -              "da7dc36e46436812a0ab4322dba660024a6f302f45e4c153e1");
  3931         -  FeedZipHtml(zip_buf, 48525,
  3932         -              "c486dc98328cd88edac9761ea076173a62a0e006d8525a0c4e");
  3933         -  FeedZipHtml(zip_buf, 48550,
  3934         -              "b72abc700885d58d85da6388ee18080e19c912bec9c7c9e938");
  3935         -  FeedZipHtml(zip_buf, 48575,
  3936         -              "351134970beb5c46f4bbdaeab1e8ba62a796c5989e71eb0ffb");
  3937         -  FeedZipHtml(zip_buf, 48600,
  3938         -              "aae69a8c1b1108297da0f8289779edca510e7f5d8772b9314f");
  3939         -  FeedZipHtml(zip_buf, 48625,
  3940         -              "0ce524fc7628d718e5249556a1dc2b4e6ecbb8cdb10100f182");
  3941         -  FeedZipHtml(zip_buf, 48650,
  3942         -              "0b462cbe11ea856fc8b968424765be15cbae34c89bc36a1a2f");
  3943         -  FeedZipHtml(zip_buf, 48675,
  3944         -              "4fd8e9480ec8efe91f7b227bd20855a84c49ad279d529b6e6e");
  3945         -  FeedZipHtml(zip_buf, 48700,
  3946         -              "4c19e928132886cf9c7f7ccba4b3099462a43b50e5038909dc");
  3947         -  FeedZipHtml(zip_buf, 48725,
  3948         -              "302a96a1d05dab81969f74c22cc1a68a3ae9b18240e49c1407");
  3949         -  FeedZipHtml(zip_buf, 48750,
  3950         -              "2c0380451f03954a091742f420f00a6f9e3eea2bc7950b09b8");
  3951         -  FeedZipHtml(zip_buf, 48775,
  3952         -              "4626b0eb276666a5d8c66ac8a394aa75299a050a163fa11b5d");
  3953         -  FeedZipHtml(zip_buf, 48800,
  3954         -              "6cab2c883337a63244e2e42d07f16f1c3f878d395286298a40");
  3955         -  FeedZipHtml(zip_buf, 48825,
  3956         -              "54d708284207033175630dc19d5cf747e13646f879a62a0150");
  3957         -  FeedZipHtml(zip_buf, 48850,
  3958         -              "9a07a29315587befa7e262f87685d84ae801bf92214fccebb9");
  3959         -  FeedZipHtml(zip_buf, 48875,
  3960         -              "f001edce0e9cc2a8f8bc12ac23e1790f7884c007bceec16b41");
  3961         -  FeedZipHtml(zip_buf, 48900,
  3962         -              "fcd2e87b40738699d997ee8ccf61125e26cae759146794c1ea");
  3963         -  FeedZipHtml(zip_buf, 48925,
  3964         -              "2531b529c153cafc8129c0c91f0068cb1fa647a1f07ac52122");
  3965         -  FeedZipHtml(zip_buf, 48950,
  3966         -              "02314525a1e8315f31a198b0de11ca96114a9357aa9c50de07");
  3967         -  FeedZipHtml(zip_buf, 48975,
  3968         -              "99d080df4e55018b42ee853de4d141576690f323679fb310d8");
  3969         -  FeedZipHtml(zip_buf, 49000,
  3970         -              "fa83978db2a8fd5008d120d790ef5cda246402be9f714fba03");
  3971         -  FeedZipHtml(zip_buf, 49025,
  3972         -              "05350c44c6e0d2ebb2062376a12a20e97814669934a570a603");
  3973         -  FeedZipHtml(zip_buf, 49050,
  3974         -              "6188dfc5884311998a1ded00299e1f3c778785562468e9fd9b");
  3975         -  FeedZipHtml(zip_buf, 49075,
  3976         -              "169e471104521695e6eb14caf275fd48269a71fb139177172a");
  3977         -  FeedZipHtml(zip_buf, 49100,
  3978         -              "cb83d2fe4267be954a3f0aa32f55986f7c5f34dacf3df593c4");
  3979         -  FeedZipHtml(zip_buf, 49125,
  3980         -              "7932f815da27f273b565c83f77d0d1ea305f08003742a1ada8");
  3981         -  FeedZipHtml(zip_buf, 49150,
  3982         -              "dc9d1f3573b197d2422f2595d1361e75595fced702921626a5");
  3983         -  FeedZipHtml(zip_buf, 49175,
  3984         -              "b98a5a63763e6dae6a0b45c86b00b1e92422237fbea2982c9a");
  3985         -  FeedZipHtml(zip_buf, 49200,
  3986         -              "6d092fae345377ae717ee5e6f562f2075a6cf1b45de1b4fac2");
  3987         -  FeedZipHtml(zip_buf, 49225,
  3988         -              "69b91bd8b4a26994745055396dd6de0a54652d2836ea5b7185");
  3989         -  FeedZipHtml(zip_buf, 49250,
  3990         -              "05e47c159dcad5e7d2c8e9e07e7f1bd25358a12cf429574a5c");
  3991         -  FeedZipHtml(zip_buf, 49275,
  3992         -              "759b72396ce3bb94e37d09a9abbce56d6ed07c3166a6b0b601");
  3993         -  FeedZipHtml(zip_buf, 49300,
  3994         -              "573b635f6b0e18a9eb6b8da3d6d4d71aefc8d16c965ccde5b7");
  3995         -  FeedZipHtml(zip_buf, 49325,
  3996         -              "5af68bad6d4fcbaef5d86a4f2b899120fb88eeb43cf78abad3");
  3997         -  FeedZipHtml(zip_buf, 49350,
  3998         -              "9a8b6d51775acd1f37a739adc28985135c6d73dadca0b98a08");
  3999         -  FeedZipHtml(zip_buf, 49375,
  4000         -              "349e6715ad69e7a2df0f35bcd8dd9a96d27a17d190b65205d8");
  4001         -  FeedZipHtml(zip_buf, 49400,
  4002         -              "f5a37d0c01a08c4ae455debeb030ac0c7977dd0b1fdbbd5030");
  4003         -  FeedZipHtml(zip_buf, 49425,
  4004         -              "ba7cf742c99377cd0b7755c9b7a02ab98a54d8f52e5c2367af");
  4005         -  FeedZipHtml(zip_buf, 49450,
  4006         -              "eb5d688f597b6b988632d406ed781b1bd5d43c5573b42e54d1");
  4007         -  FeedZipHtml(zip_buf, 49475,
  4008         -              "51bbce85bb47eb2b7eb4441e478c3591a8e42e5b7b97d45563");
  4009         -  FeedZipHtml(zip_buf, 49500,
  4010         -              "968619ba7d04b6da83a3fb16516314aaeac7217c3776938ef0");
  4011         -  FeedZipHtml(zip_buf, 49525,
  4012         -              "cd5efed504360477edbec55df3c35df343b9d1ed6c7e9837d6");
  4013         -  FeedZipHtml(zip_buf, 49550,
  4014         -              "6c78f3435b2eaa6b7e58367a03e4a985343fdceaf36da34c59");
  4015         -  FeedZipHtml(zip_buf, 49575,
  4016         -              "d1fc3027b17ff5cd0fb7b326f8fd28ada807fef3872b127ed3");
  4017         -  FeedZipHtml(zip_buf, 49600,
  4018         -              "7892c05ed75b0e7ca632ddb073d928918a9416f9657e44ab8e");
  4019         -  FeedZipHtml(zip_buf, 49625,
  4020         -              "f6acfa88f4c354147265eb83813b18f70b22edc88fb8ccb590");
  4021         -  FeedZipHtml(zip_buf, 49650,
  4022         -              "6b1d20952f7b982042f7c3c12461fbe12cbe660c01937fac7d");
  4023         -  FeedZipHtml(zip_buf, 49675,
  4024         -              "55f0dc976243ef83ecd81ffb9d7018666119904a06b7bc4932");
  4025         -  FeedZipHtml(zip_buf, 49700,
  4026         -              "9c45cd9f692e60a8615660b27e0724668c809bc5646cde9b5c");
  4027         -  FeedZipHtml(zip_buf, 49725,
  4028         -              "1fcb59e24d90f45556f0ae29ace98ffb6ae80ca52311249fa3");
  4029         -  FeedZipHtml(zip_buf, 49750,
  4030         -              "996ea37478a3fb2805cc67d5dace068daef549966d940a6fc3");
  4031         -  FeedZipHtml(zip_buf, 49775,
  4032         -              "610f24c63257fa6aa0761564b9f39f81a85d02b392c18fc3ba");
  4033         -  FeedZipHtml(zip_buf, 49800,
  4034         -              "7258c27229aaccec6e4aa52a748d539baadc919897d33d45b6");
  4035         -  FeedZipHtml(zip_buf, 49825,
  4036         -              "8301fa42630bd86e5599f69500dec0be0ffeb89663c09816bc");
  4037         -  FeedZipHtml(zip_buf, 49850,
  4038         -              "ec5957011f207253843b0c19f963c7076ae772e390d2eed02f");
  4039         -  FeedZipHtml(zip_buf, 49875,
  4040         -              "27725c957406a2db4d0a8aa835f43f3cc7ffc0b33f086e583b");
  4041         -  FeedZipHtml(zip_buf, 49900,
  4042         -              "cbcd9c66d3020e84e90ddc5504779c386a8db7bdfe301cdff8");
  4043         -  FeedZipHtml(zip_buf, 49925,
  4044         -              "0f41da40a2ab608a5f3db8f8a7e130e815bfb83796de747d0a");
  4045         -  FeedZipHtml(zip_buf, 49950,
  4046         -              "da288cc7696eeec31e9a8ef2c529e81b3cbb83dbac417d8ab5");
  4047         -  FeedZipHtml(zip_buf, 49975,
  4048         -              "dc586356d4f6d4e69adff20a6f54edaefc6a177f8b6d2940e6");
  4049         -  FeedZipHtml(zip_buf, 50000,
  4050         -              "90dbd8cb1f9320994a55ce5e146e4b985ad082c3b7d611d374");
  4051         -  FeedZipHtml(zip_buf, 50025,
  4052         -              "1e2772d07d97443c77de5898c488c421f59f2fcf95ad46da6e");
  4053         -  FeedZipHtml(zip_buf, 50050,
  4054         -              "f45de0c405f181341e38649a792ddd3a9643a3b4a9b5d81a8d");
  4055         -  FeedZipHtml(zip_buf, 50075,
  4056         -              "b721b0955747eb376da1d0394a64d28b0dd093a0d7754dadf1");
  4057         -  FeedZipHtml(zip_buf, 50100,
  4058         -              "9d40699abfc53ca20755586cfd84a51ed52b8a361b333284ec");
  4059         -  FeedZipHtml(zip_buf, 50125,
  4060         -              "35871e3db372469cee0a6bf4741dc6fbce1bdf7c814be693af");
  4061         -  FeedZipHtml(zip_buf, 50150,
  4062         -              "74c329050532d824391a3f0595338b013f84ef61920a758182");
  4063         -  FeedZipHtml(zip_buf, 50175,
  4064         -              "30f3f04bbd5670303840dcfbf6c501fcefb7869f14fef2fdc1");
  4065         -  FeedZipHtml(zip_buf, 50200,
  4066         -              "73fa8bf30e05d9f34eb4992fe53605b32e7ffae9eafde15fbe");
  4067         -  FeedZipHtml(zip_buf, 50225,
  4068         -              "7ff9376b0bf457f8e3f72fcbf761321adecc87b30fa79cfc27");
  4069         -  FeedZipHtml(zip_buf, 50250,
  4070         -              "2b67e1105d7f9d1a85952295b129fadd77e368606d8afffafb");
  4071         -  FeedZipHtml(zip_buf, 50275,
  4072         -              "3818946f8a581cefc6c440e67c0c1b2359c5859c5eab1b4f86");
  4073         -  FeedZipHtml(zip_buf, 50300,
  4074         -              "3de1e4f95624de5480c162a0bc7438cff1d35bb96e3cf6b15d");
  4075         -  FeedZipHtml(zip_buf, 50325,
  4076         -              "074a8e7a66d7da8a39ab65ab16106a6c4a3c7d2c99cd6d9c84");
  4077         -  FeedZipHtml(zip_buf, 50350,
  4078         -              "7fc6641d45f9954328f11f0f0ecfbc382f32fb2ada425f55d9");
  4079         -  FeedZipHtml(zip_buf, 50375,
  4080         -              "3652e3a0b7b0a27837d02c130e057b839347b1f3c4ea419963");
  4081         -  FeedZipHtml(zip_buf, 50400,
  4082         -              "79b4539bab8b978917038588f042c432602b8cf08d38a8b179");
  4083         -  FeedZipHtml(zip_buf, 50425,
  4084         -              "270ae8a7ac6a5738cae3072f78408355ca1d5f60f4387c0886");
  4085         -  FeedZipHtml(zip_buf, 50450,
  4086         -              "7cf4c76e835fcdda7d88c775391b112f74e515116974fcee97");
  4087         -  FeedZipHtml(zip_buf, 50475,
  4088         -              "4142ae047ed371f43f8307eff2fd5b4fcc817948a9a75843bf");
  4089         -  FeedZipHtml(zip_buf, 50500,
  4090         -              "fff7e7cf9f5b7ce1e8eff8bf95148a224128e32a2ad0c6c910");
  4091         -  FeedZipHtml(zip_buf, 50525,
  4092         -              "84e12c9598c23c55b429448dd38248c9b39b133baaf651fe28");
  4093         -  FeedZipHtml(zip_buf, 50550,
  4094         -              "9bd45db2fe630c96cbb58194aa95f951ad9985eac75944e8a6");
  4095         -  FeedZipHtml(zip_buf, 50575,
  4096         -              "37db200250a9b583c831b3836f4946b947db4bf8620ae6125b");
  4097         -  FeedZipHtml(zip_buf, 50600,
  4098         -              "8895b3d8f2e766dcd9713c9e26921f6b40152f4e0d6c7c7957");
  4099         -  FeedZipHtml(zip_buf, 50625,
  4100         -              "22c440e4af8a9fe7be54a8bc0097156c00f393ba4194e67fb1");
  4101         -  FeedZipHtml(zip_buf, 50650,
  4102         -              "578e45458215e8a3b628626a795e64a854db23ee867ea67290");
  4103         -  FeedZipHtml(zip_buf, 50675,
  4104         -              "3b260f2feb7adb109738b441a6265999696a1117d7ef9ab7af");
  4105         -  FeedZipHtml(zip_buf, 50700,
  4106         -              "d19809419fe6361ef6309f8d037c94ebdc0cb2e7fed385e802");
  4107         -  FeedZipHtml(zip_buf, 50725,
  4108         -              "77284731a81e0ec4d0d2a7d17a0326db91430c7b3e09a8a666");
  4109         -  FeedZipHtml(zip_buf, 50750,
  4110         -              "c88e8a84c0b81c18742326e3d01cf299b6f5131dbe393e7eee");
  4111         -  FeedZipHtml(zip_buf, 50775,
  4112         -              "bd38782e0539fa8bf7f657ef2ffcb78a07ea1b8e27e0dc1254");
  4113         -  FeedZipHtml(zip_buf, 50800,
  4114         -              "23c2d41338c24e562ccfc29f192220ddbf208e4159012db337");
  4115         -  FeedZipHtml(zip_buf, 50825,
  4116         -              "d473fa3bf532c3c400a26ac0bafd178f6d0b6591cd4702761d");
  4117         -  FeedZipHtml(zip_buf, 50850,
  4118         -              "5b16a3e662ccf319270b96ad45eca5dcccb3581b4f0343dd82");
  4119         -  FeedZipHtml(zip_buf, 50875,
  4120         -              "8e33a3a568369fd822f6e8b2753de60956be483c33738a7471");
  4121         -  FeedZipHtml(zip_buf, 50900,
  4122         -              "4f6ec7808088e901bce87ef14a7d0cb43685201a1155c0ce3b");
  4123         -  FeedZipHtml(zip_buf, 50925,
  4124         -              "18b62ae46ea4d0f1227ca78b719000483311dc57ee211183e6");
  4125         -  FeedZipHtml(zip_buf, 50950,
  4126         -              "b9f22fc1346fe2275e37a74776c93b213212369259835e4aac");
  4127         -  FeedZipHtml(zip_buf, 50975,
  4128         -              "a911a7366252f71d9655a6fd2f0c49cb040138ac30a2e877da");
  4129         -  FeedZipHtml(zip_buf, 51000,
  4130         -              "f7d271d0c5a81078348759b8cfe7175be2e83dc36a030fa94c");
  4131         -  FeedZipHtml(zip_buf, 51025,
  4132         -              "0cb20d86141caa0d65426f55a62aa7b91157e20d950084461c");
  4133         -  FeedZipHtml(zip_buf, 51050,
  4134         -              "78a70f3e56774d0fc5efcda3a970193a1cdcc80fa42f8b9db1");
  4135         -  FeedZipHtml(zip_buf, 51075,
  4136         -              "0e4db1a362351af12d9b209f0b13a4b9b7c7ccf762e1f3bd58");
  4137         -  FeedZipHtml(zip_buf, 51100,
  4138         -              "e87cdfbbf667e4bd7ee3362c08d46f6056b095794ba2eb62e6");
  4139         -  FeedZipHtml(zip_buf, 51125,
  4140         -              "189b2901a5fca457c07afbc786d2fadaecd70a2b6106663f8c");
  4141         -  FeedZipHtml(zip_buf, 51150,
  4142         -              "72e6ff0d320454b2cfc2b01532d066068312e624bba396dcd3");
  4143         -  FeedZipHtml(zip_buf, 51175,
  4144         -              "5a1fae1346d14ac0db633601ea1ffc2f4129bcc9903f37d56c");
  4145         -  FeedZipHtml(zip_buf, 51200,
  4146         -              "84187119f4afa63591593c669edb70bb8647614491a91cc6aa");
  4147         -  FeedZipHtml(zip_buf, 51225,
  4148         -              "ff38cdff51491223ffc1f10bff21ff8b190492ed39d4d2659b");
  4149         -  FeedZipHtml(zip_buf, 51250,
  4150         -              "428ff105093965328ee53994eeb1c22616e11bc44b51920f5e");
  4151         -  FeedZipHtml(zip_buf, 51275,
  4152         -              "86fe0700dfdc39c29d375441b1dfa6de5bf412e01fdfc60f5e");
  4153         -  FeedZipHtml(zip_buf, 51300,
  4154         -              "cbff228a87031e0080caccfef3bece579757e56f73e9ad3d9d");
  4155         -  FeedZipHtml(zip_buf, 51325,
  4156         -              "47ba8a39e5472d8a9217f424176f670bdee62a785b43d6016c");
  4157         -  FeedZipHtml(zip_buf, 51350,
  4158         -              "e74b8c1452f20acf4a1f6bbd0036455cb2efecf3e5b9fb0ef2");
  4159         -  FeedZipHtml(zip_buf, 51375,
  4160         -              "a3e6b9861233585994d3d2df6ab9b506c1f0d29c6ed86d644c");
  4161         -  FeedZipHtml(zip_buf, 51400,
  4162         -              "01ba2917f46a517cc478cce5630cebf7704ab55fa40d489db7");
  4163         -  FeedZipHtml(zip_buf, 51425,
  4164         -              "f8be6917bc58403bc30f4be31c8cd60d2dcb1dcebef03d9d79");
  4165         -  FeedZipHtml(zip_buf, 51450,
  4166         -              "28ccc57010765f2ff2e1b39eb76e0cbb3372552a972650943f");
  4167         -  FeedZipHtml(zip_buf, 51475,
  4168         -              "1d7479c66db948ca2c1a2ea80a1ffbb9a8c9704b37a02ae7e8");
  4169         -  FeedZipHtml(zip_buf, 51500,
  4170         -              "1550d743ee4f6d6f5a18c4b06c4c8773d39fbeb6af17266d99");
  4171         -  FeedZipHtml(zip_buf, 51525,
  4172         -              "017bd30542280bdd9d8f655981125f25ebaae4581653121c69");
  4173         -  FeedZipHtml(zip_buf, 51550,
  4174         -              "1ca7a1eabc238a358adc6f359788a6a3c89aa07798fbd88de3");
  4175         -  FeedZipHtml(zip_buf, 51575,
  4176         -              "a41752592eeeca88f7d77adef69eefd18d86f9a472b9a9f0cd");
  4177         -  FeedZipHtml(zip_buf, 51600,
  4178         -              "643c867ba0ca7d203144121971fe5f3cff214cb9f6978f6eca");
  4179         -  FeedZipHtml(zip_buf, 51625,
  4180         -              "41cce6807b103cd8af4a3e551efd6bfde84e9c65f108b49d15");
  4181         -  FeedZipHtml(zip_buf, 51650,
  4182         -              "71f2ca9bb048a04a678105c3d1646454dd5379ee3ed63280f5");
  4183         -  FeedZipHtml(zip_buf, 51675,
  4184         -              "f0972f18d2a86f083bb6ad716cc2cbf1d83c4774480fc36e45");
  4185         -  FeedZipHtml(zip_buf, 51700,
  4186         -              "aea3e5d7dea24c47a965e1fecfb5fbde7e461d835a32e4423c");
  4187         -  FeedZipHtml(zip_buf, 51725,
  4188         -              "09d5e1edeae6679ba9ed2d2a74debc1e66909a39cac8726317");
  4189         -  FeedZipHtml(zip_buf, 51750,
  4190         -              "ac42174abdf85e061bf1b8ee4659395931cf77c21f6016b99f");
  4191         -  FeedZipHtml(zip_buf, 51775,
  4192         -              "8822f71341c4ba26880c76a0aa07a21c461a0cfbfb4285f7ee");
  4193         -  FeedZipHtml(zip_buf, 51800,
  4194         -              "6f8328dfb5f8e4ad74c798de18e19cf82cb57f0692e96ee001");
  4195         -  FeedZipHtml(zip_buf, 51825,
  4196         -              "9f92780c3c35c36e67fbde0510d3bb24084a479fc0a04ff092");
  4197         -  FeedZipHtml(zip_buf, 51850,
  4198         -              "865def24c6d4eab291466086fb3346697c5f37e02f3503f6af");
  4199         -  FeedZipHtml(zip_buf, 51875,
  4200         -              "8e6a27c1310de6d9bf386e32150e73cc66386f4c2b4b55988c");
  4201         -  FeedZipHtml(zip_buf, 51900,
  4202         -              "7ce447fed40beee08f132e58c23573500746a181cac01a6912");
  4203         -  FeedZipHtml(zip_buf, 51925,
  4204         -              "0245be85272d1860fb9b201971023076840d85eb5a6d61ad76");
  4205         -  FeedZipHtml(zip_buf, 51950,
  4206         -              "1e6dbda9e42bce61b371968601980ba07f2e25643424308297");
  4207         -  FeedZipHtml(zip_buf, 51975,
  4208         -              "0a34bfc26b28bf85cb00cf52c3d973435a5e3cecb93831309c");
  4209         -  FeedZipHtml(zip_buf, 52000,
  4210         -              "c75d082fd5f032e4261677117266790e1da486c1d672ce6983");
  4211         -  FeedZipHtml(zip_buf, 52025,
  4212         -              "4945c95a3432c19e44455a7c0aa8a8449660d9894d21c4ab20");
  4213         -  FeedZipHtml(zip_buf, 52050,
  4214         -              "332ef773e26ad46d0f412570490fb22b52b724007d6df42a67");
  4215         -  FeedZipHtml(zip_buf, 52075,
  4216         -              "973cda21046c377b7eac28ecf7eeb0224aef19682b6937180e");
  4217         -  FeedZipHtml(zip_buf, 52100,
  4218         -              "fd2888277052f177cf1291b74812a6d616255531f5b7566951");
  4219         -  FeedZipHtml(zip_buf, 52125,
  4220         -              "202afc76e32aeec3e5a99c9f68058abef4bbb2e772c36c6273");
  4221         -  FeedZipHtml(zip_buf, 52150,
  4222         -              "4fabdd545b8835372fac1ffe0b3e1c1c1c189f9f5bdfff3d13");
  4223         -  FeedZipHtml(zip_buf, 52175,
  4224         -              "b3309a74706f06aee7f67f31dc798f8a27b3c22fda355299ca");
  4225         -  FeedZipHtml(zip_buf, 52200,
  4226         -              "62ebc34371985b652050697786e4256d04340b1558865dfa59");
  4227         -  FeedZipHtml(zip_buf, 52225,
  4228         -              "2652c042ac3ed7f63a93acd05f111b3e92b44ecbd8bd1fad59");
  4229         -  FeedZipHtml(zip_buf, 52250,
  4230         -              "29e13609110361b203c5cd90dd7c4097461627534dbb876e9e");
  4231         -  FeedZipHtml(zip_buf, 52275,
  4232         -              "67d4b104a27766d3f2315fe516943a85fe496a64264a71dee3");
  4233         -  FeedZipHtml(zip_buf, 52300,
  4234         -              "c91decd0c0235adacc7a342fa2f84b13cf0a3f2ddc57f1f706");
  4235         -  FeedZipHtml(zip_buf, 52325,
  4236         -              "1eb2350437dc317ce41400925285782a0dca33dfdfc6147b1a");
  4237         -  FeedZipHtml(zip_buf, 52350,
  4238         -              "70411cefd64f25ffcee2912c118871aa91ac9fa78a638fe228");
  4239         -  FeedZipHtml(zip_buf, 52375,
  4240         -              "1ee23fbac4ccac1dd8fc5bff13fee3635ed64f0f71326145c1");
  4241         -  FeedZipHtml(zip_buf, 52400,
  4242         -              "20f2e7c018132c0faf82625dd88895ada421e5c0a3a6ad6a3c");
  4243         -  FeedZipHtml(zip_buf, 52425,
  4244         -              "a88725a8717848f5c1fa7112004fdfff124cd3c3c35ca8993d");
  4245         -  FeedZipHtml(zip_buf, 52450,
  4246         -              "14b4d8019061c530cc0000b906d87af9187f3c0ea25ef977ae");
  4247         -  FeedZipHtml(zip_buf, 52475,
  4248         -              "0729becbf65737b2d8a9eb175d3fcd5e5224a4fa956c337ec3");
  4249         -  FeedZipHtml(zip_buf, 52500,
  4250         -              "3fb77f99bf0aa5902956997b5df92165ae623acdf78cc7b54d");
  4251         -  FeedZipHtml(zip_buf, 52525,
  4252         -              "c220d5f21721466a3c6601a8e1e2813eb0cc548f8cfd67f332");
  4253         -  FeedZipHtml(zip_buf, 52550,
  4254         -              "f1f75ed983941fb241ef52716b4ff0793a222b1088ffbd2009");
  4255         -  FeedZipHtml(zip_buf, 52575,
  4256         -              "efd85b1d536a8df12e73553bae0c2b6df65c074f2201e79ba8");
  4257         -  FeedZipHtml(zip_buf, 52600,
  4258         -              "a2a4de08b81a8cd446236af988a9b1bdb02f1dde646de61279");
  4259         -  FeedZipHtml(zip_buf, 52625,
  4260         -              "54be320d50c404344d425f368cf91d351bd134b950e8bc1b63");
  4261         -  FeedZipHtml(zip_buf, 52650,
  4262         -              "306f86b62bff2e0ee5f3814f2ba13d3627e618638e69c022be");
  4263         -  FeedZipHtml(zip_buf, 52675,
  4264         -              "7413b2c4f2d65216e6099c4cc643acc0175cc6f78e6888e298");
  4265         -  FeedZipHtml(zip_buf, 52700,
  4266         -              "96377ba789a22843290ae275e22e9ff8baa967912a2c4b1350");
  4267         -  FeedZipHtml(zip_buf, 52725,
  4268         -              "4f2e8f5791029d2080f03f3d5182905e3a8535b4aa7807d1d7");
  4269         -  FeedZipHtml(zip_buf, 52750,
  4270         -              "84f9a5cc2953002e3260321a02d83f0989e0c740166dde3b28");
  4271         -  FeedZipHtml(zip_buf, 52775,
  4272         -              "bf5157e71d7b6b5ca195d07591f774198ce2bba0e6a21c831a");
  4273         -  FeedZipHtml(zip_buf, 52800,
  4274         -              "de943c6bc319da5e8edbcc1ba227608b8bd21de5612963881c");
  4275         -  FeedZipHtml(zip_buf, 52825,
  4276         -              "e821b2f1f01eb9fda097c27fa388d3652f6037b09986e1d3a1");
  4277         -  FeedZipHtml(zip_buf, 52850,
  4278         -              "7d9a06c8bc4c85fdc593115694a6e20e11b792425106e59f6b");
  4279         -  FeedZipHtml(zip_buf, 52875,
  4280         -              "e3f03a0fc1aa924bab8204c66934a2d2010b781cd7286366c3");
  4281         -  FeedZipHtml(zip_buf, 52900,
  4282         -              "be28de8c070fd17349aeabb007b88c7ccd6402b32266802cad");
  4283         -  FeedZipHtml(zip_buf, 52925,
  4284         -              "47a05c38429e0eb9b66f32d5f5b18b18e91ad582659ccf18ca");
  4285         -  FeedZipHtml(zip_buf, 52950,
  4286         -              "34429e29be7dae5fd032f86dfcc5f10312986eb8455f13dcdf");
  4287         -  FeedZipHtml(zip_buf, 52975,
  4288         -              "b8bdce4a65db791021beac4c81660980fd45ac8d19aa582f14");
  4289         -  FeedZipHtml(zip_buf, 53000,
  4290         -              "4db70a9a24a97c7ae4819645588ec8ecfaed49c2edd8427ab6");
  4291         -  FeedZipHtml(zip_buf, 53025,
  4292         -              "318116b44d96500250a249a0e0dada520d55ae8e405d9faadf");
  4293         -  FeedZipHtml(zip_buf, 53050,
  4294         -              "cdbd08d2987f9b8514fa87f580715b1f3e9f5f9fed63de2e1d");
  4295         -  FeedZipHtml(zip_buf, 53075,
  4296         -              "41951d0f75f5754ff79015d6015d383c05c623ba5a8ce041a4");
  4297         -  FeedZipHtml(zip_buf, 53100,
  4298         -              "957a94660db21cb18e128334a1803409aace0bac5262f4858c");
  4299         -  FeedZipHtml(zip_buf, 53125,
  4300         -              "f11000321edab6f4e09b185333932f853a81ab467309eb0684");
  4301         -  FeedZipHtml(zip_buf, 53150,
  4302         -              "13ea1e84299a22cd30cb91ca137b7f06492c3a6d70b5687a5f");
  4303         -  FeedZipHtml(zip_buf, 53175,
  4304         -              "ee41adbdd560c3a18282f68d760e23d1e0b92dc4cc781090c0");
  4305         -  FeedZipHtml(zip_buf, 53200,
  4306         -              "a68ae9b3d20f0cd89228b86b850e6e318bbe5bde4feec8102a");
  4307         -  FeedZipHtml(zip_buf, 53225,
  4308         -              "b086aa0db40da4f04daee2bfbc5ef14486069a86224d3c6fbe");
  4309         -  FeedZipHtml(zip_buf, 53250,
  4310         -              "58cf6bb884f7d0a5e3aedbe850a3de97fbbe29e6291eed4b8d");
  4311         -  FeedZipHtml(zip_buf, 53275,
  4312         -              "5ebed15180c54b118bb891449b768980328024e245a4a9cd61");
  4313         -  FeedZipHtml(zip_buf, 53300,
  4314         -              "b07298113a96b1ddaef24f6155cc608ee177d731f5b9f05ad6");
  4315         -  FeedZipHtml(zip_buf, 53325,
  4316         -              "83b167304d40bffcaa47249fc89636e4820853d5e040025360");
  4317         -  FeedZipHtml(zip_buf, 53350,
  4318         -              "83a8ed40482045755dd77cc8515dc098ba7ed2b34a30d49837");
  4319         -  FeedZipHtml(zip_buf, 53375,
  4320         -              "5c9211099761940689658e3419c9c205a693241e97779932bf");
  4321         -  FeedZipHtml(zip_buf, 53400,
  4322         -              "ce28b3d7fd745e31c29eb7cc60f188ad369f72b1fa86a1ec4b");
  4323         -  FeedZipHtml(zip_buf, 53425,
  4324         -              "d543b37fb607b40029af442f939fc2e07e8fed0af0260e273d");
  4325         -  FeedZipHtml(zip_buf, 53450,
  4326         -              "a93a4a6621479ee19bc2f211cce5638814a72aa3211670bb9b");
  4327         -  FeedZipHtml(zip_buf, 53475,
  4328         -              "8a0eba8289a0232efcf23569294b328830adf2b28b23d8b311");
  4329         -  FeedZipHtml(zip_buf, 53500,
  4330         -              "86b25dfdf353915ad5a796d747d6e4a81fe2c0e1eead9fa038");
  4331         -  FeedZipHtml(zip_buf, 53525,
  4332         -              "d3905816b7088ad169526c568e1f68298c482c5304f0c7e32f");
  4333         -  FeedZipHtml(zip_buf, 53550,
  4334         -              "655f941d9aeac6e4bf76e320e9062f4ff20bab4579d04886d0");
  4335         -  FeedZipHtml(zip_buf, 53575,
  4336         -              "e686d1be99b66e547b8ffc000c40bb61f779f52a4384e00df5");
  4337         -  FeedZipHtml(zip_buf, 53600,
  4338         -              "09cbef93fdef3706a13a160284efc469a1cdf0bf9dffbba716");
  4339         -  FeedZipHtml(zip_buf, 53625,
  4340         -              "9f91398574eb5cec4812f3ad3f460c50ade7149913b3ca4922");
  4341         -  FeedZipHtml(zip_buf, 53650,
  4342         -              "b3f9cf2466b15db693c22d53e8b068bc7a874571413005666b");
  4343         -  FeedZipHtml(zip_buf, 53675,
  4344         -              "bad47047016da9158f4266113e87a11fa4b7630e1ce67f7083");
  4345         -  FeedZipHtml(zip_buf, 53700,
  4346         -              "392ea572d0ebf4e99fe9a40f6c7fcf21a5b8bd628ce8ac10b8");
  4347         -  FeedZipHtml(zip_buf, 53725,
  4348         -              "da468aba4f8cfaf46b0a06877f03ff032602f247cc6cbb07cc");
  4349         -  FeedZipHtml(zip_buf, 53750,
  4350         -              "d56846f2f69d370a502ab02a297dbe7eb7ff7763dfc79f5ebc");
  4351         -  FeedZipHtml(zip_buf, 53775,
  4352         -              "fcebcb6a1f8bdbdde5063ad222ed12533a3decc1c66cee152e");
  4353         -  FeedZipHtml(zip_buf, 53800,
  4354         -              "b6cfe1c39da964c28e931ab4aa6185b891a62024ea1aabb976");
  4355         -  FeedZipHtml(zip_buf, 53825,
  4356         -              "7434bf6e7856b78aa27aeb3e7c829a600746d55ba18698da4f");
  4357         -  FeedZipHtml(zip_buf, 53850,
  4358         -              "028f34b563410ab8b83e7d7f7ae91d7dbefe7876717c79fae1");
  4359         -  FeedZipHtml(zip_buf, 53875,
  4360         -              "f4e25a93e9379f7ed49dc0449fb25a1028c623223e541d10a2");
  4361         -  FeedZipHtml(zip_buf, 53900,
  4362         -              "395c4961e22758f4fa7f7efb9f0ffff3db07f5c7f3b38bd3ab");
  4363         -  FeedZipHtml(zip_buf, 53925,
  4364         -              "ebcbb38bf7e617a99de18fce7f7dfff122ff3352b86798d0f8");
  4365         -  FeedZipHtml(zip_buf, 53950,
  4366         -              "4d7e3ed964d038abb97517920b96cae90f2c0679fda13f38c4");
  4367         -  FeedZipHtml(zip_buf, 53975,
  4368         -              "168832fe06582e3fe774e5cfebef5a33e1c2c4af4c0e6d341d");
  4369         -  FeedZipHtml(zip_buf, 54000,
  4370         -              "9a6d018b8f3b361f8e46410f2bc9a1ea3509874cae4a0823d9");
  4371         -  FeedZipHtml(zip_buf, 54025,
  4372         -              "6ac625f5cbe05a0f79289c8a63d501a3f909012e301e62bc1a");
  4373         -  FeedZipHtml(zip_buf, 54050,
  4374         -              "8635f37287aee57821164b7c7a2efe7b320c61f6139f28cbc5");
  4375         -  FeedZipHtml(zip_buf, 54075,
  4376         -              "dbcc27a880b1c55e4be71f7f3ebd34b810fdfbf808c525ecd3");
  4377         -  FeedZipHtml(zip_buf, 54100,
  4378         -              "a65d1a1e8711ea467ad11d2b368008d43d9ddebc96c42f162f");
  4379         -  FeedZipHtml(zip_buf, 54125,
  4380         -              "1da9dbc0f83e7db296a47fcfba24e591744bda7b5e1d7d3835");
  4381         -  FeedZipHtml(zip_buf, 54150,
  4382         -              "16c07f36989f92528c067ec5f4ed62b85afe49afc1391a8fb8");
  4383         -  FeedZipHtml(zip_buf, 54175,
  4384         -              "c0e94857f0bb098b0206d23560cd424a70ac26e5078c89a450");
  4385         -  FeedZipHtml(zip_buf, 54200,
  4386         -              "0cd2360f5df3b6bd693c21e39121718f81bb2b54e435412cc7");
  4387         -  FeedZipHtml(zip_buf, 54225,
  4388         -              "818043f8cadd838a724b7e10d496c5fc07734404b85466964b");
  4389         -  FeedZipHtml(zip_buf, 54250,
  4390         -              "1eeb4dc0d5f21d27ec4684de7d301c4aa308681666f01c46af");
  4391         -  FeedZipHtml(zip_buf, 54275,
  4392         -              "f0ee7a719cb04101c58e718cc508904da441779284191a3fd3");
  4393         -  FeedZipHtml(zip_buf, 54300,
  4394         -              "4990ca468f9354c72521087b618a1285f9c430bbed38f677aa");
  4395         -  FeedZipHtml(zip_buf, 54325,
  4396         -              "af40d541812d04d15d98c4d188eb4472956304c9d5a7a3ebb3");
  4397         -  FeedZipHtml(zip_buf, 54350,
  4398         -              "a3f3b3ebd39babd3e3cf9767d7bffe80c2d443a04c9c52ce12");
  4399         -  FeedZipHtml(zip_buf, 54375,
  4400         -              "769b90ab3d02a2f500d6d869b8df67830ab6ba8a58f631bb32");
  4401         -  FeedZipHtml(zip_buf, 54400,
  4402         -              "5678651e4a7516f5c96d2328f70394281f336a33ab58be0d72");
  4403         -  FeedZipHtml(zip_buf, 54425,
  4404         -              "3a4d9457466807955ac0bfe7f125888ed005891c59555e8027");
  4405         -  FeedZipHtml(zip_buf, 54450,
  4406         -              "71b9441eac177a65d3bfa6b2a0982227ff397ebd69f2ff4a65");
  4407         -  FeedZipHtml(zip_buf, 54475,
  4408         -              "f8eaa4148549926c41cced4f869c78c417c2494f4618b576b8");
  4409         -  FeedZipHtml(zip_buf, 54500,
  4410         -              "11ebe1558413202f9f9204e9101d0d9995c445e3105af22c95");
  4411         -  FeedZipHtml(zip_buf, 54525,
  4412         -              "0e732246ab70b43dcfb19f9df4b118e9638e8755f5f3dc3dac");
  4413         -  FeedZipHtml(zip_buf, 54550,
  4414         -              "1bfcb0b2310e784d9931103e2ddf18b88845caed79b6c1acdc");
  4415         -  FeedZipHtml(zip_buf, 54575,
  4416         -              "ae56fb90cef1943acc5ec8d837cbec853b6a691f808815df44");
  4417         -  FeedZipHtml(zip_buf, 54600,
  4418         -              "abd64acd591b6d27da1901bed66778a7ee3ef95799954ae7ab");
  4419         -  FeedZipHtml(zip_buf, 54625,
  4420         -              "ac3eb9f5cd19b4ca9ae76e695aa37cff96a134aef8fd5bcd1b");
  4421         -  FeedZipHtml(zip_buf, 54650,
  4422         -              "b653823688fbee94a0a7ca6e7ffce0a82ba73e959af766b0ee");
  4423         -  FeedZipHtml(zip_buf, 54675,
  4424         -              "d59a1117b40ea94249d00d658f5f634565326456e28e7ee805");
  4425         -  FeedZipHtml(zip_buf, 54700,
  4426         -              "693709c7322ae9b14a50d397018e5ffa32183a9025b53bca12");
  4427         -  FeedZipHtml(zip_buf, 54725,
  4428         -              "cff7823cd2eef8b817489ebcce01a475973a20a8fbe74318c9");
  4429         -  FeedZipHtml(zip_buf, 54750,
  4430         -              "135d5050b0d6db20ccd21c3cc819f4f70a6790aaada191c70d");
  4431         -  FeedZipHtml(zip_buf, 54775,
  4432         -              "e86f53c96e4504381e164f49dcd735a58173f3cd6c4c90eeb8");
  4433         -  FeedZipHtml(zip_buf, 54800,
  4434         -              "f8d7cac58144fffb0a8dcb6e4e2e3eaf849b2f702d64cac516");
  4435         -  FeedZipHtml(zip_buf, 54825,
  4436         -              "ec8a979731fbe5b26b71beaf94659ba75f1cdb36bafac828fd");
  4437         -  FeedZipHtml(zip_buf, 54850,
  4438         -              "948479d9781a83e67122a376b6da09fd367da58a368a445190");
  4439         -  FeedZipHtml(zip_buf, 54875,
  4440         -              "6a75ec4f0493e9e89db797eabf31e1e3ea16607c7c79650e70");
  4441         -  FeedZipHtml(zip_buf, 54900,
  4442         -              "fe1dff781e4703f13731bd70e6f06f8ccf2ea02fe77ddaf1fa");
  4443         -  FeedZipHtml(zip_buf, 54925,
  4444         -              "af83d7b3dbe097f3ab32b7057c9ac1a350eba0986d3a64c9f7");
  4445         -  FeedZipHtml(zip_buf, 54950,
  4446         -              "71f225bd0d82cc1de16bfb24fa61926637c3300a6ea8736ec1");
  4447         -  FeedZipHtml(zip_buf, 54975,
  4448         -              "35b128df433ac60a59b42ff641605dd70f613789d318f4e083");
  4449         -  FeedZipHtml(zip_buf, 55000,
  4450         -              "8761ea4916848d1337c64591dff8829c118f710fe46e58d4ac");
  4451         -  FeedZipHtml(zip_buf, 55025,
  4452         -              "e152c777e4ddc17bc2e29e88e4829a3298158ea07e2bdd0664");
  4453         -  FeedZipHtml(zip_buf, 55050,
  4454         -              "4721ef027786a38f4ee3fc81d3ec95c31f874f80ca90e2380f");
  4455         -  FeedZipHtml(zip_buf, 55075,
  4456         -              "c749f0e88d08693ab5cd24155e820a30eeecd24f99edfefcae");
  4457         -  FeedZipHtml(zip_buf, 55100,
  4458         -              "94edc227cd276fe264a6d6b4b3b3e5c52ed7d4839cdefbba4d");
  4459         -  FeedZipHtml(zip_buf, 55125,
  4460         -              "6ede813cf607c14d1afe59c8a7a84dfaf8f7237dcc94974599");
  4461         -  FeedZipHtml(zip_buf, 55150,
  4462         -              "bfbe0780a17fa7f124e92e865f0bf0cec6b6711fccae554ee6");
  4463         -  FeedZipHtml(zip_buf, 55175,
  4464         -              "91965c87535963d15118127f4a8530ba2e669fab976f727cfc");
  4465         -  FeedZipHtml(zip_buf, 55200,
  4466         -              "e130df437b4d6f44990b19f7b87617b2c263c76b81dfc68633");
  4467         -  FeedZipHtml(zip_buf, 55225,
  4468         -              "e4175a47646effcaff7868fc3e287048e2a015b111c13db358");
  4469         -  FeedZipHtml(zip_buf, 55250,
  4470         -              "556f1e53e2a91800420887f7640a30ea35b84c140c08796835");
  4471         -  FeedZipHtml(zip_buf, 55275,
  4472         -              "f98090e28169f0f4d7b0cfab620c712f8ebea5320041c4bddc");
  4473         -  FeedZipHtml(zip_buf, 55300,
  4474         -              "91f361a504b100d660c21f37494f5961acffee45fd9a5ed493");
  4475         -  FeedZipHtml(zip_buf, 55325,
  4476         -              "5fcae3af7ec985465d514dfabaf7f19bfa5f97644fb63d2ef4");
  4477         -  FeedZipHtml(zip_buf, 55350,
  4478         -              "57f8b3d11dc4781b650b97b8977f60c97e01d4820be69b2c12");
  4479         -  FeedZipHtml(zip_buf, 55375,
  4480         -              "c7bd716649973cd80b8abdfae59d788f909ef28843c8fd2847");
  4481         -  FeedZipHtml(zip_buf, 55400,
  4482         -              "b29abec83b1e9b1bc7b7e2e03a8470547880139d613e718378");
  4483         -  FeedZipHtml(zip_buf, 55425,
  4484         -              "29ecfe6cc69ef50de7237870022bef0c13b594abf5fb9392b0");
  4485         -  FeedZipHtml(zip_buf, 55450,
  4486         -              "5dde4071aa93b3ab6b78c1ae8d393e9cfd725a368d8549aef9");
  4487         -  FeedZipHtml(zip_buf, 55475,
  4488         -              "2e3e5e9caaad9d9f5dfc786a6eeff385fe53994c70a3abad62");
  4489         -  FeedZipHtml(zip_buf, 55500,
  4490         -              "590d819954ea85c899b421ba2be6a0f4ca00b8e5482076c919");
  4491         -  FeedZipHtml(zip_buf, 55525,
  4492         -              "6aa59543431010b5bd10716890100724f33eb456bc37b11afe");
  4493         -  FeedZipHtml(zip_buf, 55550,
  4494         -              "937ea12ab3e5ac60fc9f2bc8525fe4d3b20dcfcbd63e31a81b");
  4495         -  FeedZipHtml(zip_buf, 55575,
  4496         -              "9c8449c54b2346b4b0f4c90d31b8391e9cba49be9a7767a8df");
  4497         -  FeedZipHtml(zip_buf, 55600,
  4498         -              "1b59b24a551ee6aa4627546106b4b0daf748c2b2f97be48bfa");
  4499         -  FeedZipHtml(zip_buf, 55625,
  4500         -              "357132353da5b82b21d3ff9f83de034738f1166dd6b37bc376");
  4501         -  FeedZipHtml(zip_buf, 55650,
  4502         -              "6fd8ee0ddbbd61eb79c3bef9c6e9dd772a4aea538b4a3502db");
  4503         -  FeedZipHtml(zip_buf, 55675,
  4504         -              "cbbd38ed3215081e8b3f8637d872705af8c2f80eccfdc6f9c3");
  4505         -  FeedZipHtml(zip_buf, 55700,
  4506         -              "0248a513da3d7ce8778261f9678ae6e7168d332c49bf4ae2cc");
  4507         -  FeedZipHtml(zip_buf, 55725,
  4508         -              "974133eedfd1ce00021897fa3a5728a3267a60eed8015196bf");
  4509         -  FeedZipHtml(zip_buf, 55750,
  4510         -              "99be65949b24a7143d6521178f4ce2e150f5ce14d7cb8f2097");
  4511         -  FeedZipHtml(zip_buf, 55775,
  4512         -              "5a34153517db95f7ab705495c92232c47c78aa8928285d5201");
  4513         -  FeedZipHtml(zip_buf, 55800,
  4514         -              "194f83ac3ee2d846135ca5ad922c0b7fb5b140fdd975fbb45f");
  4515         -  FeedZipHtml(zip_buf, 55825,
  4516         -              "5e499cd47ddb348e2a2772bc008719dbf654e046a653073991");
  4517         -  FeedZipHtml(zip_buf, 55850,
  4518         -              "5967124602b380d3f2728ae531cc6d08a2bf307f0af166b94f");
  4519         -  FeedZipHtml(zip_buf, 55875,
  4520         -              "a1ad8665fb0fdf38eb141adcd8157a6d2035a34337a304171f");
  4521         -  FeedZipHtml(zip_buf, 55900,
  4522         -              "4f2b0c759efc0ee7d56e38ae8b89cc35c3e08a5bff2e1f63e2");
  4523         -  FeedZipHtml(zip_buf, 55925,
  4524         -              "b5d486aa76519a616bc73688388e2e2d260d9eb0493bd28136");
  4525         -  FeedZipHtml(zip_buf, 55950,
  4526         -              "893d0115e7c4879bdb9e4668afe4608e4359b24cd570f4ccba");
  4527         -  FeedZipHtml(zip_buf, 55975,
  4528         -              "665cb2ecfb0231acf631ddbd8aab7a15afae6f8e275824a3b5");
  4529         -  FeedZipHtml(zip_buf, 56000,
  4530         -              "577c17f547ae91bb6f1526b49e08feae5c628e6fb22e51e173");
  4531         -  FeedZipHtml(zip_buf, 56025,
  4532         -              "67e8f782f2a995e78cc7b997e06fb844e113bf0baedf593eb9");
  4533         -  FeedZipHtml(zip_buf, 56050,
  4534         -              "8a3a8af839f147fbc0e7c7fb583617fb09e7c6cce5776332c7");
  4535         -  FeedZipHtml(zip_buf, 56075,
  4536         -              "6beb4ec891efc3758ee3613ca05afd580f05f3e7b151833f55");
  4537         -  FeedZipHtml(zip_buf, 56100,
  4538         -              "4f226ae454b1583c31842693945d05f0f12dc2c2fa2812f160");
  4539         -  FeedZipHtml(zip_buf, 56125,
  4540         -              "fea413c241f91260a1e940955314e3f7b4a30d2183854a716f");
  4541         -  FeedZipHtml(zip_buf, 56150,
  4542         -              "7d38b3ec42212a8f62f9e09eeca624ebc6c2f21ff91d36d667");
  4543         -  FeedZipHtml(zip_buf, 56175,
  4544         -              "d242591d561d111bd8efde86c39ed03de198b7e138d5d23d4c");
  4545         -  FeedZipHtml(zip_buf, 56200,
  4546         -              "df9f200b17a5ec99fa52ffcef027993e2ee66cfc548836a9ea");
  4547         -  FeedZipHtml(zip_buf, 56225,
  4548         -              "0468584dfc2e684a7ef70b5f0f6ccf7c56085ef487b11f02ab");
  4549         -  FeedZipHtml(zip_buf, 56250,
  4550         -              "00cd1ad7e98409163016a5a5858a22e190835234b5a0640147");
  4551         -  FeedZipHtml(zip_buf, 56275,
  4552         -              "ec370f1658ce78abfaf07f497b9d6469d80b885ff23dde8766");
  4553         -  FeedZipHtml(zip_buf, 56300,
  4554         -              "ad58923e22fc1d3f1aa6c641e3732dbdab04260b16525cd1bc");
  4555         -  FeedZipHtml(zip_buf, 56325,
  4556         -              "cfec65072fcd90dacde28206e4951c45f283316ab6220e6df7");
  4557         -  FeedZipHtml(zip_buf, 56350,
  4558         -              "3ef3651d74bd307b3abb06842e0da12b574fc74139c33ecbb4");
  4559         -  FeedZipHtml(zip_buf, 56375,
  4560         -              "f81046b2794a6634fb129dc6e1ec1f8ece283298e0d5a1901b");
  4561         -  FeedZipHtml(zip_buf, 56400,
  4562         -              "6a2eaddf373452887660dec95b8dfec48f87ba0570a853ba5e");
  4563         -  FeedZipHtml(zip_buf, 56425,
  4564         -              "8ba659fb56cfae12a0c8b1da112da43b9bcbf217a396273ee5");
  4565         -  FeedZipHtml(zip_buf, 56450,
  4566         -              "35d8a0096109d85052b1632b6f2bf76255de96f16a99b7a51f");
  4567         -  FeedZipHtml(zip_buf, 56475,
  4568         -              "2cd76d951dbe58183dcb137281a9e9ca2b42cabff545dd77ea");
  4569         -  FeedZipHtml(zip_buf, 56500,
  4570         -              "2fa45bc3e0db7879c63623e2a8cdb086199b8536aad83fe34e");
  4571         -  FeedZipHtml(zip_buf, 56525,
  4572         -              "a1bb9deb6aca0f8deb08eea970c4ec10201f094f15c8471890");
  4573         -  FeedZipHtml(zip_buf, 56550,
  4574         -              "7151e0a0d4443489b005ca0aefa6d248b99ddb7990655caa8a");
  4575         -  FeedZipHtml(zip_buf, 56575,
  4576         -              "d5096c3711bde5d73daaa085a421ea983aac01b0d6ea3db057");
  4577         -  FeedZipHtml(zip_buf, 56600,
  4578         -              "229ddb01246f158a38598c8d8cb94faaef9422b761007a0650");
  4579         -  FeedZipHtml(zip_buf, 56625,
  4580         -              "3b49a20ab47e6abe42827c2296402928b1941873c0162d11f3");
  4581         -  FeedZipHtml(zip_buf, 56650,
  4582         -              "4a12cb0e696c9f435e62919e1eb37b23cae82c7f047f3ca636");
  4583         -  FeedZipHtml(zip_buf, 56675,
  4584         -              "e8a84ae5720218ebe471f0e68402a0ea50f7b82724f5e3118d");
  4585         -  FeedZipHtml(zip_buf, 56700,
  4586         -              "9d72114b249e8a6da5dc934b194673cbb59979dd83e8c8be69");
  4587         -  FeedZipHtml(zip_buf, 56725,
  4588         -              "6a1a1647dae6e8c3a70220575e44db5b44016d52280b9a73dd");
  4589         -  FeedZipHtml(zip_buf, 56750,
  4590         -              "59485cd7d2bae33cd92d47d82622e2860d0c6856c6d78c5b98");
  4591         -  FeedZipHtml(zip_buf, 56775,
  4592         -              "b1855b9c1a4b21a6f21930b42be3f432680ad0fff2e8833c36");
  4593         -  FeedZipHtml(zip_buf, 56800,
  4594         -              "ef7a51872f55c42bdafbb65d3d81db56f7607ceda4fe2d69ea");
  4595         -  FeedZipHtml(zip_buf, 56825,
  4596         -              "a5fc38866b2495597c277d82aa7de59b03a82060de22e59d24");
  4597         -  FeedZipHtml(zip_buf, 56850,
  4598         -              "de083b8dbcc6061cbc315d2b9582c42dfd34afa0be0f32d641");
  4599         -  FeedZipHtml(zip_buf, 56875,
  4600         -              "3fc0ca70952e3db5300617c36e75a6cf51eb7db55db75448d4");
  4601         -  FeedZipHtml(zip_buf, 56900,
  4602         -              "284ec995047a1a221620ca208ab1f8a537e295588ec74a6fea");
  4603         -  FeedZipHtml(zip_buf, 56925,
  4604         -              "91c969d49aa5547a07d88f421d71c4d41e37eb42a4a00e1069");
  4605         -  FeedZipHtml(zip_buf, 56950,
  4606         -              "1d9854edb9d307d4194b00951fe5dd819e034a08b74671d97f");
  4607         -  FeedZipHtml(zip_buf, 56975,
  4608         -              "05fc4cab6f3904612bc509a521c31422856035e526ba9c1e26");
  4609         -  FeedZipHtml(zip_buf, 57000,
  4610         -              "a229618e9f780e51afd1100909ad8e22ef1494a0613c0e7222");
  4611         -  FeedZipHtml(zip_buf, 57025,
  4612         -              "81095267cf5bbc2009816f81c010ed1912b8d0ab4617452d0e");
  4613         -  FeedZipHtml(zip_buf, 57050,
  4614         -              "92046549eca886f490a3381626ecfe1d034f1c8aceba576594");
  4615         -  FeedZipHtml(zip_buf, 57075,
  4616         -              "394bcfe3fba3abe3b333d7251a5fd9809fd25dd57bda4b2fed");
  4617         -  FeedZipHtml(zip_buf, 57100,
  4618         -              "2ca2fef4949c07cb8b9212707a2a421168e3712ae6c72b0952");
  4619         -  FeedZipHtml(zip_buf, 57125,
  4620         -              "c9c242f1b0a90400184efbf3fe6bbf13b2094215b6a8906eaf");
  4621         -  FeedZipHtml(zip_buf, 57150,
  4622         -              "6f03457c083fc018b1fd367713f2e567362262cb1a3272a211");
  4623         -  FeedZipHtml(zip_buf, 57175,
  4624         -              "b1ed3da7ff2696e97075e0ff205fdbe79f7cbef8f1e2e3cf17");
  4625         -  FeedZipHtml(zip_buf, 57200,
  4626         -              "aeb861c5d8e1565172256be2ca9aa6a77f0c41cee83e7b838f");
  4627         -  FeedZipHtml(zip_buf, 57225,
  4628         -              "ec27f8afa0870260dbbb62d950ff89c55cfeeb4fc2a298b249");
  4629         -  FeedZipHtml(zip_buf, 57250,
  4630         -              "658b7bab5ffd31c423de00ab3af7d3ec14e9cc6199748c5a2c");
  4631         -  FeedZipHtml(zip_buf, 57275,
  4632         -              "d7172c9fe95cb264d3b361df0f5d461f9e346c97dd6226b177");
  4633         -  FeedZipHtml(zip_buf, 57300,
  4634         -              "a0825bea584a465db900e1d1991e3032e616a09d9407e94888");
  4635         -  FeedZipHtml(zip_buf, 57325,
  4636         -              "5c0144e201b2b772a8e9311cdb395ba00e52d20c339961398f");
  4637         -  FeedZipHtml(zip_buf, 57350,
  4638         -              "ea4ea302af7d028d5817deccb1ac388a8a553f1616400f65d0");
  4639         -  FeedZipHtml(zip_buf, 57375,
  4640         -              "5474a893fb3d7d0840f352ed7659ce611a2a7e77f577bbe637");
  4641         -  FeedZipHtml(zip_buf, 57400,
  4642         -              "449ed55236f24f1ccac31e330d1564830ddb64f00d4e8044ff");
  4643         -  FeedZipHtml(zip_buf, 57425,
  4644         -              "0a39a8d25384d3d0c418547e624f7822e4e129f0dc21163b1d");
  4645         -  FeedZipHtml(zip_buf, 57450,
  4646         -              "4a46dc0c609b5e42ba5fa46381e0a55c2712c4d4666e2cf0f2");
  4647         -  FeedZipHtml(zip_buf, 57475,
  4648         -              "953d8372f8e8223e42baddb3e690589f25c05a9c091206adbc");
  4649         -  FeedZipHtml(zip_buf, 57500,
  4650         -              "280da11022e8ab2ac5c7c5ad11f042ea3791a7eb63703f429d");
  4651         -  FeedZipHtml(zip_buf, 57525,
  4652         -              "e6659b0f9e1ff7e7f2426db477a78295d6b184f706212f888d");
  4653         -  FeedZipHtml(zip_buf, 57550,
  4654         -              "4af496629d9667117b8c5b68ce26813b9ab787eab939693d28");
  4655         -  FeedZipHtml(zip_buf, 57575,
  4656         -              "de25f18823f3ca002147b428b2a313f7f20e2b0191b7e71fdf");
  4657         -  FeedZipHtml(zip_buf, 57600,
  4658         -              "96b2c5ba49543db51b55e6ab7a914640f73d1cefc59ddf0161");
  4659         -  FeedZipHtml(zip_buf, 57625,
  4660         -              "24d4614bfa1561b90ad6f4c7e964e82bf4555d8411ba6f61bb");
  4661         -  FeedZipHtml(zip_buf, 57650,
  4662         -              "b6e672c65329ce221a4ee6f89ea20bcbb12c67d4d61ecb44a0");
  4663         -  FeedZipHtml(zip_buf, 57675,
  4664         -              "ab73155b1acb9a7312464c3111f31d25a41e2c967108ed98f8");
  4665         -  FeedZipHtml(zip_buf, 57700,
  4666         -              "4585c457f0a31a37ffae92d2e488baa7b716c1aa26d93404cb");
  4667         -  FeedZipHtml(zip_buf, 57725,
  4668         -              "a196378cfd9ef3cecd87758780cde20537fa4d2a2394b3943a");
  4669         -  FeedZipHtml(zip_buf, 57750,
  4670         -              "8796d38918d092e86660abc25e2d4e9623f025dd81d5894f4a");
  4671         -  FeedZipHtml(zip_buf, 57775,
  4672         -              "02d838044e46480dbb67600b545528cd4630da83697835451f");
  4673         -  FeedZipHtml(zip_buf, 57800,
  4674         -              "8d0147b349250de074311929e5ae1c58e6a82a883592b625c4");
  4675         -  FeedZipHtml(zip_buf, 57825,
  4676         -              "5c4981689b31b763b9580a4f890b888d81d5941397414eeed3");
  4677         -  FeedZipHtml(zip_buf, 57850,
  4678         -              "51caa930c409b3b6e74cb39e41243221899170d351270652f5");
  4679         -  FeedZipHtml(zip_buf, 57875,
  4680         -              "94514c5bbc2e843221b7340f60cd76995ca941cda6ba694b73");
  4681         -  FeedZipHtml(zip_buf, 57900,
  4682         -              "87d48ce8883f3cd7be1b5c6b083a3579be6cedc9c2b23d6fdf");
  4683         -  FeedZipHtml(zip_buf, 57925,
  4684         -              "7b3113f63ff2693d1a0e1b508239aa8a1266b93e1ff3eebb78");
  4685         -  FeedZipHtml(zip_buf, 57950,
  4686         -              "25c37014e25b31c4fed218bb0e67fcc9e0add60daf9140ea25");
  4687         -  FeedZipHtml(zip_buf, 57975,
  4688         -              "61d8f54f6845ab240e1ad1c2d7c31d188c1fd8166746e81721");
  4689         -  FeedZipHtml(zip_buf, 58000,
  4690         -              "ac727ce69dbb9afe1e3dfd493c917dc197307bbe1cc522e77e");
  4691         -  FeedZipHtml(zip_buf, 58025,
  4692         -              "1c5aa347334830fe884af6646cea55084d465785251e9ec363");
  4693         -  FeedZipHtml(zip_buf, 58050,
  4694         -              "13f06a70f4d2bf072229c750febe282a178c38f1ef3d4b56dd");
  4695         -  FeedZipHtml(zip_buf, 58075,
  4696         -              "50023e8ee32f41af123e6a48431015b0b17a024245d8b05bb5");
  4697         -  FeedZipHtml(zip_buf, 58100,
  4698         -              "78fcbc2f7213631ce6c1c181f76f35e2a276e9a6b7dea51d3d");
  4699         -  FeedZipHtml(zip_buf, 58125,
  4700         -              "f2e23dbf8f2912d4215eda234d7afa49c4295a5ec190427a0e");
  4701         -  FeedZipHtml(zip_buf, 58150,
  4702         -              "69ffb663d9ef22eaa4ac98280f2e3fc92ffec68a46301cee23");
  4703         -  FeedZipHtml(zip_buf, 58175,
  4704         -              "f15653ae7a665f8943918e701f76b57b560504a939387f02c3");
  4705         -  FeedZipHtml(zip_buf, 58200,
  4706         -              "1113c39ed9f7512014c6e8c53efc25882e6cb2e5682e8db673");
  4707         -  FeedZipHtml(zip_buf, 58225,
  4708         -              "2279d5cfe747f126b32e15c1c5067618be100ccf055ba8b809");
  4709         -  FeedZipHtml(zip_buf, 58250,
  4710         -              "a1d5b7176456ca9380f64c1c536cc97599f4eb1ee8b4e53e56");
  4711         -  FeedZipHtml(zip_buf, 58275,
  4712         -              "6b56fbcabbbfb41332d3fa2165c7743045d534b1cb48196595");
  4713         -  FeedZipHtml(zip_buf, 58300,
  4714         -              "9f022a61813e11ec50ae693700d5a5683b57092639a8e5b9f3");
  4715         -  FeedZipHtml(zip_buf, 58325,
  4716         -              "e9b00a5e3197e0b1a6085e9344af0024ae48b867f2f0a4f044");
  4717         -  FeedZipHtml(zip_buf, 58350,
  4718         -              "87f7e93517ce76c553c0a74914fe310974d02ad338d9c072f3");
  4719         -  FeedZipHtml(zip_buf, 58375,
  4720         -              "bb1280f1c0ae896556988f814e5825cc28ed2e4d80b9e945b5");
  4721         -  FeedZipHtml(zip_buf, 58400,
  4722         -              "24f853da050133752cc79074ad6778cdd8dad8372d88365322");
  4723         -  FeedZipHtml(zip_buf, 58425,
  4724         -              "6ba351aaca61e917aebe38c97f24f3e95e2ed1c9f644b988c0");
  4725         -  FeedZipHtml(zip_buf, 58450,
  4726         -              "a4f9121c9dd50a546dcdd028fb3e70f92dacef4e6c9ed3d6eb");
  4727         -  FeedZipHtml(zip_buf, 58475,
  4728         -              "84b8690016a5e24af0f7a03a1d3a2c419d5e1ca43a6c269ddb");
  4729         -  FeedZipHtml(zip_buf, 58500,
  4730         -              "b4d614a82701a67256c295875482b609f513747b345705d41e");
  4731         -  FeedZipHtml(zip_buf, 58525,
  4732         -              "8b7cde92e0f499da465f4b2e510a2c63dc0cac756638766ffd");
  4733         -  FeedZipHtml(zip_buf, 58550,
  4734         -              "68a0628bd5b664f0bf1664b60fc6c0a4a48056036531b20cce");
  4735         -  FeedZipHtml(zip_buf, 58575,
  4736         -              "8f7cad1c70b684c7cd077539a4cb758a622c4805dd3b158066");
  4737         -  FeedZipHtml(zip_buf, 58600,
  4738         -              "33cca159cc36f1ea948b4a0cd8690c6bd01860bfb552b03966");
  4739         -  FeedZipHtml(zip_buf, 58625,
  4740         -              "2621b8d4e06b7215cb69bda0f51c46e0652f59340c2f7bc5bc");
  4741         -  FeedZipHtml(zip_buf, 58650,
  4742         -              "b178d9eb2d459191f4b2483dc6d7547801bf5d8e0aa309bd56");
  4743         -  FeedZipHtml(zip_buf, 58675,
  4744         -              "83b9539c4474ccc3b070cc6dda27adc4a7625dd5110718069f");
  4745         -  FeedZipHtml(zip_buf, 58700,
  4746         -              "a5560c32fe153060e223efa0ccb688eb5d6c819282c858a1a3");
  4747         -  FeedZipHtml(zip_buf, 58725,
  4748         -              "88cf0b5651cad8bb088a2fe828266acea4a268c7ecea341404");
  4749         -  FeedZipHtml(zip_buf, 58750,
  4750         -              "59b582a2472c4d3fb120b681a23382a08176921bb641cac9f6");
  4751         -  FeedZipHtml(zip_buf, 58775,
  4752         -              "00b8cc63ec1a562e9c96bb8ceb1fbb1917984b6498718d7964");
  4753         -  FeedZipHtml(zip_buf, 58800,
  4754         -              "841997985d289871814529889aff6e05aec37f61702efe0537");
  4755         -  FeedZipHtml(zip_buf, 58825,
  4756         -              "859b114a08fd3ff87f5cffff7fbcbe7da13376121f45a16198");
  4757         -  FeedZipHtml(zip_buf, 58850,
  4758         -              "052f6fd23f86201dd11fcef10f761a8eb76f54f2c010129197");
  4759         -  FeedZipHtml(zip_buf, 58875,
  4760         -              "f302674cb04bc4ebdb976fec9f18e90d3f81c0453a10881647");
  4761         -  FeedZipHtml(zip_buf, 58900,
  4762         -              "49f71616e866a466c1afe0b79978077bd9ed0fcf5e3c7ffebf");
  4763         -  FeedZipHtml(zip_buf, 58925,
  4764         -              "9f791d0ad9837f59c947f03f01a6e580a234f67b18d9f8c3b3");
  4765         -  FeedZipHtml(zip_buf, 58950,
  4766         -              "bf3d834d14f28182e7f8bfcfe4a47f8539cd9c9f06830be93e");
  4767         -  FeedZipHtml(zip_buf, 58975,
  4768         -              "aff9ff107fb93c7f79234ec52904252a280ecf8797df096880");
  4769         -  FeedZipHtml(zip_buf, 59000,
  4770         -              "0067025c0784871126ec1e88199c6b5f53339d9be34f9f675e");
  4771         -  FeedZipHtml(zip_buf, 59025,
  4772         -              "de8c6c87df038ee90b996d13c77e98c48b00c330ec7471ae19");
  4773         -  FeedZipHtml(zip_buf, 59050,
  4774         -              "979f24c345ad8edd53665afc37f8d52216ff13e6a1d27227a7");
  4775         -  FeedZipHtml(zip_buf, 59075,
  4776         -              "efce8faea90eeade6c5b39ffedc3d182e030fc73e4cfb6f8a7");
  4777         -  FeedZipHtml(zip_buf, 59100,
  4778         -              "8bf70b5a7b8c994fb32cfddf9f4e17b5f6efe360e0b5e244fe");
  4779         -  FeedZipHtml(zip_buf, 59125,
  4780         -              "f73e8cebc433dec3f5d9bb770bda0fe88efdd9167f1fc40b5c");
  4781         -  FeedZipHtml(zip_buf, 59150,
  4782         -              "7f10c4b36fe1e7d3b79f16b4fe7dd019cfc80c6efde4fc6a51");
  4783         -  FeedZipHtml(zip_buf, 59175,
  4784         -              "ec00261ba6b36de0e3388816889198caf5fbf825b186ff068c");
  4785         -  FeedZipHtml(zip_buf, 59200,
  4786         -              "7cf9fcf9f326bc41c80354d5d72b7f9c6512345784c45ce92e");
  4787         -  FeedZipHtml(zip_buf, 59225,
  4788         -              "75cbc45c452eec259e6f1d62019b4ae841dce637fbd64f6fe8");
  4789         -  FeedZipHtml(zip_buf, 59250,
  4790         -              "b437dc0dd4b8a382e4883fbbc6f63b529fc63ad50cab5c0297");
  4791         -  FeedZipHtml(zip_buf, 59275,
  4792         -              "04d5c17f30dc59be8cd3cca7efe2925f782d9411f72ad1486f");
  4793         -  FeedZipHtml(zip_buf, 59300,
  4794         -              "b017f431217ac63d8a67c46bfd198e0fd9b4005a76e67befa8");
  4795         -  FeedZipHtml(zip_buf, 59325,
  4796         -              "20e8decaf70f809eef0837171f8d53c4936c5d07198bfc99e6");
  4797         -  FeedZipHtml(zip_buf, 59350,
  4798         -              "2780477175dbc3f76ac6fd219f5add06fbfec35ffe7f7b57d7");
  4799         -  FeedZipHtml(zip_buf, 59375,
  4800         -              "dcb6cdaceff32b38e7c6f28ced247ddb73324ddb19f9238e3a");
  4801         -  FeedZipHtml(zip_buf, 59400,
  4802         -              "cec7d84ed3f626438bb4c496221592b2adf7d71fec2e00825f");
  4803         -  FeedZipHtml(zip_buf, 59425,
  4804         -              "1265891225edf422b54481c0ee02789ec56277c10ebeebfef9");
  4805         -  FeedZipHtml(zip_buf, 59450,
  4806         -              "63db671ac02eabf37fc74b4fb45ca7e1dce495d5a10c3a706c");
  4807         -  FeedZipHtml(zip_buf, 59475,
  4808         -              "84797007e2e754c36b420936efbdc124b2d33b4bcdcd47c497");
  4809         -  FeedZipHtml(zip_buf, 59500,
  4810         -              "30198db12e311dd7345cdac3171c2aa108ab0313e4d80fe3d8");
  4811         -  FeedZipHtml(zip_buf, 59525,
  4812         -              "172cbe7d630378b4e0c8beba779fad0e0c69dabef1f8fe7243");
  4813         -  FeedZipHtml(zip_buf, 59550,
  4814         -              "6aa79608c22dbc382390443ea2709fd55eb58931ae6e881b55");
  4815         -  FeedZipHtml(zip_buf, 59575,
  4816         -              "634de06c78b530a22c7623cff6bdff42f480f7e4fa32c42cde");
  4817         -  FeedZipHtml(zip_buf, 59600,
  4818         -              "6e982cafb0e28848b7e0bf1ceb3fb331e1707dcc86ac8fb7d3");
  4819         -  FeedZipHtml(zip_buf, 59625,
  4820         -              "b1abbecfb86ce1d874323ab5032756df9738b80b773c354d02");
  4821         -  FeedZipHtml(zip_buf, 59650,
  4822         -              "baa22e711b1217cd8a9fc96ec18fd2706fc8fc813e542f999e");
  4823         -  FeedZipHtml(zip_buf, 59675,
  4824         -              "48a5960636a4c6a38332a40dfd2c3f9c919f4e8601e7f26a51");
  4825         -  FeedZipHtml(zip_buf, 59700,
  4826         -              "1599195c15e33e73c29d2f411ce79222ce9e53e669a8947049");
  4827         -  FeedZipHtml(zip_buf, 59725,
  4828         -              "6a29b26d43f424e69f679f432e2832d21264eea6d741b98a30");
  4829         -  FeedZipHtml(zip_buf, 59750,
  4830         -              "c8e419f5020f12fac9541c74eafef7c5f5a734c4bad23f927c");
  4831         -  FeedZipHtml(zip_buf, 59775,
  4832         -              "cec86f86452f40da47813b0a03af6fe9c6d5c1ed5a245663c0");
  4833         -  FeedZipHtml(zip_buf, 59800,
  4834         -              "3759bb5af1b0d3d6db36ee8fe664983feaeab5c7749debdbe4");
  4835         -  FeedZipHtml(zip_buf, 59825,
  4836         -              "d874db869c9e61cd5baeef44f77bba94effcd51867a6da1a9b");
  4837         -  FeedZipHtml(zip_buf, 59850,
  4838         -              "7c697a2459ad05890b2c5a31ffa0b21c69fc0a0a7a64277d4a");
  4839         -  FeedZipHtml(zip_buf, 59875,
  4840         -              "208c9d3c88ad747d3d5cabde487499f21faaf287baeb7e4a99");
  4841         -  FeedZipHtml(zip_buf, 59900,
  4842         -              "82cbeeb9cb7bfc3517b99bd5eac4d8d9d316e7ec2b2596b2a6");
  4843         -  FeedZipHtml(zip_buf, 59925,
  4844         -              "5e959c66cfd9ec02f771d10dcfc47fc9d05515ba21dccab446");
  4845         -  FeedZipHtml(zip_buf, 59950,
  4846         -              "72abe682b9e015d00426f0d085a7f237d90c3bdd5e43ecc598");
  4847         -  FeedZipHtml(zip_buf, 59975,
  4848         -              "65796cc344ad85221b828089ee46bf7530b0177f1adbc27c36");
  4849         -  FeedZipHtml(zip_buf, 60000,
  4850         -              "299f706cf75b8890c592f14c035a66cea7c6926c7c4f171258");
  4851         -  FeedZipHtml(zip_buf, 60025,
  4852         -              "dc3a96183cd49d82d76d7ce0f8fe8bef82ade7a1dbb7d7e5bb");
  4853         -  FeedZipHtml(zip_buf, 60050,
  4854         -              "057df9c3e25306f8059694780c179837314e1c8af06ddfcc51");
  4855         -  FeedZipHtml(zip_buf, 60075,
  4856         -              "b00c2e0a5274c9e9f473e805492a4ce7ce28979a09d23aa2eb");
  4857         -  FeedZipHtml(zip_buf, 60100,
  4858         -              "d60fae4e3d5ff876acdb92a23ebec4d205fafb69648fa6ce37");
  4859         -  FeedZipHtml(zip_buf, 60125,
  4860         -              "df7d48edb402301c7fd6e29d01303735926118fdf75be46a36");
  4861         -  FeedZipHtml(zip_buf, 60150,
  4862         -              "4df8427f0d91d0c5af670cb1687fa23b905a3acddf46c3b4ce");
  4863         -  FeedZipHtml(zip_buf, 60175,
  4864         -              "64bf73355c0a0396596033c3447081531821b0c229237b6c54");
  4865         -  FeedZipHtml(zip_buf, 60200,
  4866         -              "d48b8d4c73d4b016c6cf2f30e01deb57a8296f655f5b1e1c8e");
  4867         -  FeedZipHtml(zip_buf, 60225,
  4868         -              "d506c45389ae4d710085330e2456801070553930237c9d061d");
  4869         -  FeedZipHtml(zip_buf, 60250,
  4870         -              "6bbce8e4eaba8404d62851b34ca6d32b2b9192b6e8c5901a55");
  4871         -  FeedZipHtml(zip_buf, 60275,
  4872         -              "5f81c903acbc909321c5f9a50d940f10a2dac37f08cde98230");
  4873         -  FeedZipHtml(zip_buf, 60300,
  4874         -              "f9c6c2c7007ba7468c01efc51562a17d9a560abdf62eb156ac");
  4875         -  FeedZipHtml(zip_buf, 60325,
  4876         -              "c0c769fb6e02e5b777c8cb493a942333f61ce383c5fc9d4b62");
  4877         -  FeedZipHtml(zip_buf, 60350,
  4878         -              "35f5deed7168c2524dbdfe38195d04b240c63c413ecff3822a");
  4879         -  FeedZipHtml(zip_buf, 60375,
  4880         -              "871aa658184a317969969bf5c15027cea0832084694d5b82b1");
  4881         -  FeedZipHtml(zip_buf, 60400,
  4882         -              "4ce73946ea78e594638444d4797ff1e7f1f5e5a94c91a5bd1e");
  4883         -  FeedZipHtml(zip_buf, 60425,
  4884         -              "95b3d9c24eaf9d74aa4ee0db57e606694417840bdca7ebc11d");
  4885         -  FeedZipHtml(zip_buf, 60450,
  4886         -              "b65c3df797723d541973def94011ec8ed4370ef3e4c52d5668");
  4887         -  FeedZipHtml(zip_buf, 60475,
  4888         -              "820f8ae929c49fe265b12beb5c61167170e3dabef5f5e2d432");
  4889         -  FeedZipHtml(zip_buf, 60500,
  4890         -              "0de60836710f979503b16cbf79f5e695dcca3548db6e23912d");
  4891         -  FeedZipHtml(zip_buf, 60525,
  4892         -              "1698067d5cc935e4d7cdb08dd295bf657c63790c41fbedcb53");
  4893         -  FeedZipHtml(zip_buf, 60550,
  4894         -              "aa0222f015d4258a771052a4833329cbe70c63c99fe12930ff");
  4895         -  FeedZipHtml(zip_buf, 60575,
  4896         -              "51dd322d79262a6b7d8e2d9610acb97d9dfb9e8d1ffd167b38");
  4897         -  FeedZipHtml(zip_buf, 60600,
  4898         -              "1f34c94218e2d7a92ee4afccb4dcfa1ead710d17d6a3eeed6d");
  4899         -  FeedZipHtml(zip_buf, 60625,
  4900         -              "f7ecfdc5f9f1f9a9f588c54f30704853b6c2a27b1f4e02275b");
  4901         -  FeedZipHtml(zip_buf, 60650,
  4902         -              "29a3bcd6fbec0a84b2ca272db646a53ee029aafe60eb5061de");
  4903         -  FeedZipHtml(zip_buf, 60675,
  4904         -              "b6be7d0ccfedc446521c9f09c1240b58db227891b23ff7e10d");
  4905         -  FeedZipHtml(zip_buf, 60700,
  4906         -              "001ae9b5448c35687c964965e151b3c24a6330d6292b1a8e14");
  4907         -  FeedZipHtml(zip_buf, 60725,
  4908         -              "55c77deafb13c42619191e6e8d10cbcebfeb8a6fc9a3f039b2");
  4909         -  FeedZipHtml(zip_buf, 60750,
  4910         -              "9843569a150b2ec8cfb4aa3a62c9a75f4faf13648ece5b2422");
  4911         -  FeedZipHtml(zip_buf, 60775,
  4912         -              "e89721a00f5eb0e84eb8aa036ef16a6f3419c954178ab691c7");
  4913         -  FeedZipHtml(zip_buf, 60800,
  4914         -              "ae4f877490c17bbdc25be7f1618936eca78d69c37e626d64b5");
  4915         -  FeedZipHtml(zip_buf, 60825,
  4916         -              "d17d186c4a1b5dc2592f3fb876c02a31b142b42995c055b211");
  4917         -  FeedZipHtml(zip_buf, 60850,
  4918         -              "26b2c43bf270459c1593e28fc439771f36af1bf1c6c0b123c7");
  4919         -  FeedZipHtml(zip_buf, 60875,
  4920         -              "12bdf1a836286b496be9bdf8371c44f6a809453d3be8f6e3a5");
  4921         -  FeedZipHtml(zip_buf, 60900,
  4922         -              "607a54be536654d22592b45e1d0f1206dd4d50a37a187ba1d5");
  4923         -  FeedZipHtml(zip_buf, 60925,
  4924         -              "e55d5124855b28c9b77beea75b59cdad86e3a9aee7094ff73d");
  4925         -  FeedZipHtml(zip_buf, 60950,
  4926         -              "e7aae2701f9f49c46b3f394ef974812f2f1edc6071c25ac30f");
  4927         -  FeedZipHtml(zip_buf, 60975,
  4928         -              "4403660f509b3c40a093de484527accc050a76d43b6f74cded");
  4929         -  FeedZipHtml(zip_buf, 61000,
  4930         -              "3c7831dc19122bef83e73e1e9651d68cc535b072a2a98e60e3");
  4931         -  FeedZipHtml(zip_buf, 61025,
  4932         -              "4ec2683ad768c9bc0cdbba73335d588d75952de730cdf4fd94");
  4933         -  FeedZipHtml(zip_buf, 61050,
  4934         -              "d8f2edfebf9833550c4cb5658d876182b11e623bd2d1228444");
  4935         -  FeedZipHtml(zip_buf, 61075,
  4936         -              "3ade897b629d776fbb97d7bdf34321655592f73212fb42df96");
  4937         -  FeedZipHtml(zip_buf, 61100,
  4938         -              "890d8d9fa843a758a8002f89a95ebe7827fa22e332403fb14a");
  4939         -  FeedZipHtml(zip_buf, 61125,
  4940         -              "76f3e1cbd56defb4fbf19cb2afd778479ac19db6aa3bdc4403");
  4941         -  FeedZipHtml(zip_buf, 61150,
  4942         -              "7f9a39f62af460de9488bcb1efc2b6b7f6c991852cd7ae33ff");
  4943         -  FeedZipHtml(zip_buf, 61175,
  4944         -              "a1cbc84d97ebeac74e9f1f1fbe6f22a1a706754f905962f324");
  4945         -  FeedZipHtml(zip_buf, 61200,
  4946         -              "46fd4d8377795bd8c4b690a2aaac6d506f8ef2df4993507d0d");
  4947         -  FeedZipHtml(zip_buf, 61225,
  4948         -              "9cfc03640cb9b150921a1399d9d19d27741f7998a076340e65");
  4949         -  FeedZipHtml(zip_buf, 61250,
  4950         -              "ff219001b4162736617f1d65490ee8427e1b05e0d41de3d5b1");
  4951         -  FeedZipHtml(zip_buf, 61275,
  4952         -              "96cc14be35cb01cb212bcb2e01a1ab8fe048cbdd8be60f90c0");
  4953         -  FeedZipHtml(zip_buf, 61300,
  4954         -              "dcdf1f58b803438d1bc80994b887a65a65d5e25cb733336e91");
  4955         -  FeedZipHtml(zip_buf, 61325,
  4956         -              "aedb907d59de12974e08b34f1a9e123a2d871d902e698a19d3");
  4957         -  FeedZipHtml(zip_buf, 61350,
  4958         -              "9566c42f4dde47160b9bb54cbd3e0713006810920368306f03");
  4959         -  FeedZipHtml(zip_buf, 61375,
  4960         -              "ff1006610b565e802dcfdf725b3e88956c92db3d46ded65aba");
  4961         -  FeedZipHtml(zip_buf, 61400,
  4962         -              "ad913ee7780caaf6a5946cf0eeb4b3bb53eb48f186f7d0c53d");
  4963         -  FeedZipHtml(zip_buf, 61425,
  4964         -              "b5da9d8651822e7547ac0de2a311aab46937edaa5db394f483");
  4965         -  FeedZipHtml(zip_buf, 61450,
  4966         -              "e47766ded8e9d4dd6e1ace1022b7bd11ce0321edaa76607f85");
  4967         -  FeedZipHtml(zip_buf, 61475,
  4968         -              "a0592fa9ded46067fc0ae2297de2857ce2bdeb0d86a5db1a36");
  4969         -  FeedZipHtml(zip_buf, 61500,
  4970         -              "02f768cabf7ca1c67aedc6a18f471ff8209d88cd097f647d34");
  4971         -  FeedZipHtml(zip_buf, 61525,
  4972         -              "a20fb82ef7b95a27f4105c9a9bf1102b6e4b15873d09d2d8ce");
  4973         -  FeedZipHtml(zip_buf, 61550,
  4974         -              "3ac73bacd99dd02cc91df04b926ba1acc323d186933e572de5");
  4975         -  FeedZipHtml(zip_buf, 61575,
  4976         -              "98b6fccf76329cfbd087f39fe63da2f7e74a0a3527589e6d93");
  4977         -  FeedZipHtml(zip_buf, 61600,
  4978         -              "6d73fdb6898f79f1b7ef1381d455f591f906fc22e707b093c4");
  4979         -  FeedZipHtml(zip_buf, 61625,
  4980         -              "1d8d315f1ad51c9637d0f2b79721b3ab97b94b4855bf02624a");
  4981         -  FeedZipHtml(zip_buf, 61650,
  4982         -              "e7a7c7f742eff34f995fde7c393bbbb8b9293b6d7ef9aedbbb");
  4983         -  FeedZipHtml(zip_buf, 61675,
  4984         -              "fa725debd47916b99a8613ac5f3691bc5ab240e0969971e6c7");
  4985         -  FeedZipHtml(zip_buf, 61700,
  4986         -              "08197b3cacb0255d1b626c763098f8764a7129c6fda4c08c85");
  4987         -  FeedZipHtml(zip_buf, 61725,
  4988         -              "7422f90adbf7c34724d482392aef81bc6a2ede2a83e5913ebe");
  4989         -  FeedZipHtml(zip_buf, 61750,
  4990         -              "2d7a217c1b82192ad8684ad867a722729fec3ebc3573d15f8d");
  4991         -  FeedZipHtml(zip_buf, 61775,
  4992         -              "f32056690042c7f58b43b90f27916035d56381fc7a24a1cf21");
  4993         -  FeedZipHtml(zip_buf, 61800,
  4994         -              "7c26f8dea7b19c17524c1de96170bc186c137d1592a21e9e58");
  4995         -  FeedZipHtml(zip_buf, 61825,
  4996         -              "17767fa82ef1d32ff3ae081bcc165c602a61e81d664950a41b");
  4997         -  FeedZipHtml(zip_buf, 61850,
  4998         -              "cde557ddf84b0b4ceb5737c03f0f4b86e4dd8b11015fbcf7c0");
  4999         -  FeedZipHtml(zip_buf, 61875,
  5000         -              "0f30636c09d886caf96b046ee0da684e3561a250304d8d344d");
  5001         -  FeedZipHtml(zip_buf, 61900,
  5002         -              "3aa86bf96406fd6296e7f8c64dd4bb7ac17d182fb67da43502");
  5003         -  FeedZipHtml(zip_buf, 61925,
  5004         -              "4bbeb4ef624c2551ed299db3bd6da66fcb2f6fbd40cc8b24c6");
  5005         -  FeedZipHtml(zip_buf, 61950,
  5006         -              "da1d13ac1c151fa25675a5c40770928811812b24ec7bb69c64");
  5007         -  FeedZipHtml(zip_buf, 61975,
  5008         -              "b6e95153192f8ce17ed3651e73792902aa9e67fa288cf41619");
  5009         -  FeedZipHtml(zip_buf, 62000,
  5010         -              "61c843ad8c0074245f452fc91b25ec2c9733437bb7f4aa5126");
  5011         -  FeedZipHtml(zip_buf, 62025,
  5012         -              "ba4eceab253d34ca9b9560f63bc7150be2c80bdcb86c0ae806");
  5013         -  FeedZipHtml(zip_buf, 62050,
  5014         -              "a5edbf8587c2919760abe6c3e81cc2d1440fb4acd9be58751d");
  5015         -  FeedZipHtml(zip_buf, 62075,
  5016         -              "9c0f5810122772261506797e28731a05a942288678ad54ef11");
  5017         -  FeedZipHtml(zip_buf, 62100,
  5018         -              "6552b7d5d7b4148861bc466f1aac00564756d792197fe1739c");
  5019         -  FeedZipHtml(zip_buf, 62125,
  5020         -              "8d5647569e155bcbf1eb5ab792dd78de45f22ce23b0bc7d348");
  5021         -  FeedZipHtml(zip_buf, 62150,
  5022         -              "a39edaf3a39ff9d933e767e33dc107c412e98a3955aba3f3e6");
  5023         -  FeedZipHtml(zip_buf, 62175,
  5024         -              "a1ee23ce842b6a79cdb3313b609d502796a6ac3a380c7dc78d");
  5025         -  FeedZipHtml(zip_buf, 62200,
  5026         -              "d0d6cd230433ab0299a2b22a65f74e9d796a0a15079016530b");
  5027         -  FeedZipHtml(zip_buf, 62225,
  5028         -              "039a3a0817a48862f13d95a93553cdc0a19578e89b6c8c9668");
  5029         -  FeedZipHtml(zip_buf, 62250,
  5030         -              "f47fa22fdd3d199c807ecece5e59af4fb0560c022cf8c43afd");
  5031         -  FeedZipHtml(zip_buf, 62275,
  5032         -              "cbfa913edbe2d9781e85e385a957bde9f5aca6d3f339bb5f45");
  5033         -  FeedZipHtml(zip_buf, 62300,
  5034         -              "2ce686b52a68ee84784a04354c31d7d048bcbb04bd76bc40dd");
  5035         -  FeedZipHtml(zip_buf, 62325,
  5036         -              "c7b4117dfb14dc4f4c223eb23e53846e8c530eddf487e9d952");
  5037         -  FeedZipHtml(zip_buf, 62350,
  5038         -              "eb41bddc8ff2273a7a2ed5dadf28ff934efb6407744a020dc1");
  5039         -  FeedZipHtml(zip_buf, 62375,
  5040         -              "71c36daab134ad747a02381482f3e704f151dd5a29f405bd00");
  5041         -  FeedZipHtml(zip_buf, 62400,
  5042         -              "f4a399b1abf38cb5a1b7afd19ed5818e69ce82460017c3a7c9");
  5043         -  FeedZipHtml(zip_buf, 62425,
  5044         -              "aaa52d835528d044e79aa9e16fab8513936c8f812f7e40a794");
  5045         -  FeedZipHtml(zip_buf, 62450,
  5046         -              "b3ce33b9555f9d30d3c1d07004bf5ed1d6f2fc76975d279a7c");
  5047         -  FeedZipHtml(zip_buf, 62475,
  5048         -              "333e21f6f8be7bedde4d3cbf34f6b3e5dd5bf53ad71118075f");
  5049         -  FeedZipHtml(zip_buf, 62500,
  5050         -              "26fd2572713bbe13335fc73feaf9828931e3762c4629d686b0");
  5051         -  FeedZipHtml(zip_buf, 62525,
  5052         -              "1ce5aca15118729623f08cb49147943611430330cb7a6674e9");
  5053         -  FeedZipHtml(zip_buf, 62550,
  5054         -              "527ee7fa613090f146c9d04ef4d2af5626b14ec702969b0520");
  5055         -  FeedZipHtml(zip_buf, 62575,
  5056         -              "32105cf743c5b3e0522630f2380a01772ac7d7a380f06e1909");
  5057         -  FeedZipHtml(zip_buf, 62600,
  5058         -              "902b6e293017e3cc5a8bf26cd55986218e43315ecd42328230");
  5059         -  FeedZipHtml(zip_buf, 62625,
  5060         -              "96df91eb00db4127619c44e114176e87c418d1eb4f20bfa5d0");
  5061         -  FeedZipHtml(zip_buf, 62650,
  5062         -              "ce116e71e54da6a5307cf73eb126821d4cfa43d918aac30888");
  5063         -  FeedZipHtml(zip_buf, 62675,
  5064         -              "1a79249fdc2fe165495142e894dcf0969472931cfc2a5daa21");
  5065         -  FeedZipHtml(zip_buf, 62700,
  5066         -              "becf079f75bfa945fb196fa0ecb05e043ac08b7275f31e6da4");
  5067         -  FeedZipHtml(zip_buf, 62725,
  5068         -              "1fcd2d8639b34defd2e4c642d142ad590e1591cfae27694e58");
  5069         -  FeedZipHtml(zip_buf, 62750,
  5070         -              "5a84e4e2030b2142d22033ef045ad5b377d69e40bd155f9b22");
  5071         -  FeedZipHtml(zip_buf, 62775,
  5072         -              "c9ed17eac5e9b2e1897517e014d5142061d3798efa0dc2e1b8");
  5073         -  FeedZipHtml(zip_buf, 62800,
  5074         -              "1fc1c140ce3f5149ada823397b517173da89de1f862a90718c");
  5075         -  FeedZipHtml(zip_buf, 62825,
  5076         -              "4e0ce9a27023214c81f0ef85158951ddb9c9a30b6975450393");
  5077         -  FeedZipHtml(zip_buf, 62850,
  5078         -              "dfc6c3690c418020653428748ce257f27df08d452f3db1ba18");
  5079         -  FeedZipHtml(zip_buf, 62875,
  5080         -              "6a8620121d0e14f3afcc010df607437cff81ff3fb16ed19d4a");
  5081         -  FeedZipHtml(zip_buf, 62900,
  5082         -              "f171b19ba0ecc9a3ff1ffa19ba32309768488dbb4ff01e79cf");
  5083         -  FeedZipHtml(zip_buf, 62925,
  5084         -              "0becf2d3c74f67efaf3f7db8b05e1f9ff66ef11dca0004b516");
  5085         -  FeedZipHtml(zip_buf, 62950,
  5086         -              "7297e572c16c945e54bf4e485a6d5e53c1e87b2300f0b6e8c3");
  5087         -  FeedZipHtml(zip_buf, 62975,
  5088         -              "c730f1fad2f26d2bb5c09476c578f681790b138f303d1eb04c");
  5089         -  FeedZipHtml(zip_buf, 63000,
  5090         -              "d369612657c69319b51d17cf53c9aae12c695a20d7196edd14");
  5091         -  FeedZipHtml(zip_buf, 63025,
  5092         -              "147f56cb2b02e30dbd7bd5abb75c6418acce05ab58981b5b4c");
  5093         -  FeedZipHtml(zip_buf, 63050,
  5094         -              "43b5ef697cb9b53e5dcb71413d6c16e6b66ac1798e8b81ec0b");
  5095         -  FeedZipHtml(zip_buf, 63075,
  5096         -              "861b275338f7fd608fb7302b43eec6903dc6fb27692d837411");
  5097         -  FeedZipHtml(zip_buf, 63100,
  5098         -              "58c54d943bc830203e390d7533baa2818bd98fd5938f95613d");
  5099         -  FeedZipHtml(zip_buf, 63125,
  5100         -              "f0edb032a4a7e6859bad1fa70c191296377bab6141c898a9d1");
  5101         -  FeedZipHtml(zip_buf, 63150,
  5102         -              "9c2cf82ca879825acd5537966303d7e958d6cdc91a9f991189");
  5103         -  FeedZipHtml(zip_buf, 63175,
  5104         -              "caba688f2ef0fb48007200917594353ffed4f1061ea4882d49");
  5105         -  FeedZipHtml(zip_buf, 63200,
  5106         -              "70665b371afaa97ba869859d7bb3f04e95f3485f791540ce0b");
  5107         -  FeedZipHtml(zip_buf, 63225,
  5108         -              "14784e9b555ce419f7556b92941d4e32952fe624c698992629");
  5109         -  FeedZipHtml(zip_buf, 63250,
  5110         -              "05cb96bf3423df70205403cba5bcd35905bda500dffc15dfb1");
  5111         -  FeedZipHtml(zip_buf, 63275,
  5112         -              "e80439dee5f5daa9f5af4799edd48c3c527e75c16ea853e27f");
  5113         -  FeedZipHtml(zip_buf, 63300,
  5114         -              "9e2cfb5fdbfa707a5d51dc49c7c4950fcf989e727015423e90");
  5115         -  FeedZipHtml(zip_buf, 63325,
  5116         -              "2ea803923489387fef1adad51740b1e91c89b475096cba394a");
  5117         -  FeedZipHtml(zip_buf, 63350,
  5118         -              "9e2ae3a2a52c302aa92285348b4684007498ab6c988cc31e03");
  5119         -  FeedZipHtml(zip_buf, 63375,
  5120         -              "9984a0d992c19586e217f27294c6e22b6108aa48d691d30dfa");
  5121         -  FeedZipHtml(zip_buf, 63400,
  5122         -              "ef8ec4fc08acc0051a4bf7a1ab22968131439954d93ecc3f88");
  5123         -  FeedZipHtml(zip_buf, 63425,
  5124         -              "8f92c6917e118b161cf1ae07dbf39111ca4bd25949e7687ea7");
  5125         -  FeedZipHtml(zip_buf, 63450,
  5126         -              "60f6da04a0696107f0236d1e2431bc0d3c161c7c1cc1f18d29");
  5127         -  FeedZipHtml(zip_buf, 63475,
  5128         -              "40315221fd8ca1819de5ac3e13a42d354f8325b1ca5da3206e");
  5129         -  FeedZipHtml(zip_buf, 63500,
  5130         -              "b55fc82f1cb1fc07310edd4ec837918a432d481764268fe0ec");
  5131         -  FeedZipHtml(zip_buf, 63525,
  5132         -              "9875e4952ee486b384229bc19993c6ab438c4544b2728d686e");
  5133         -  FeedZipHtml(zip_buf, 63550,
  5134         -              "fb09ad5a4e00b8503e86352ca0d80dbc985c2b2c4e7425ddd6");
  5135         -  FeedZipHtml(zip_buf, 63575,
  5136         -              "f2f34a2a1ee6144aece5d8b93fd00e60f9d93f637750f830f1");
  5137         -  FeedZipHtml(zip_buf, 63600,
  5138         -              "eee949b9c61fa02efb7843fae5d3b16ae7ad95bdd5ad5e130c");
  5139         -  FeedZipHtml(zip_buf, 63625,
  5140         -              "ca6ad66dc7a5f8595d6ec18578b31a2f1a9d5ef52681f77d02");
  5141         -  FeedZipHtml(zip_buf, 63650,
  5142         -              "a7a36226eba414714d23d2c0459dde4a4147501e29eddf313a");
  5143         -  FeedZipHtml(zip_buf, 63675,
  5144         -              "2d5fbdca2a5f7cf6063f02ff9735126314462e844aee42adb2");
  5145         -  FeedZipHtml(zip_buf, 63700,
  5146         -              "18adf1f7cf17f9be91631df04e1de7cf1f2e9c8f6c1b445d1c");
  5147         -  FeedZipHtml(zip_buf, 63725,
  5148         -              "8a6fe7381b70feeca82056effcd95341addcf9c3725c9ff387");
  5149         -  FeedZipHtml(zip_buf, 63750,
  5150         -              "65dd1ee70feb627f9c3fa46b76feb0f3879d3fecfc61e70f3b");
  5151         -  FeedZipHtml(zip_buf, 63775,
  5152         -              "7fd8f9c3ce9f36387f6a06397923758d8a32ab5a70b397d00e");
  5153         -  FeedZipHtml(zip_buf, 63800,
  5154         -              "ec891872051fc5e124eabbdb1dfe7415da4efe64b656e0238e");
  5155         -  FeedZipHtml(zip_buf, 63825,
  5156         -              "1d92ec54f3e23937251b79b5c4fbc9f06b18f9ce3baf6ed68a");
  5157         -  FeedZipHtml(zip_buf, 63850,
  5158         -              "967530bd2a5595a8690786804f8cb391b7fb38ca95c6091b44");
  5159         -  FeedZipHtml(zip_buf, 63875,
  5160         -              "4e209671389ef8694aa9346216534919dced6e6a2c7b98b841");
  5161         -  FeedZipHtml(zip_buf, 63900,
  5162         -              "2e747039978265cdd59024677524fe83c5f7c8baedbd7b7704");
  5163         -  FeedZipHtml(zip_buf, 63925,
  5164         -              "60ff566cf3b0c3776fce7a3deb3212480f63585b18aa3c6bf3");
  5165         -  FeedZipHtml(zip_buf, 63950,
  5166         -              "ca297f91db6759d826439ced1c0ad66d57714654a182bd9398");
  5167         -  FeedZipHtml(zip_buf, 63975,
  5168         -              "be1c842edced80f414b493825216bc5147b69a21839299b809");
  5169         -  FeedZipHtml(zip_buf, 64000,
  5170         -              "7416828b05c9ce26d59024b34818a1b5cc5d03f8b064a79ca5");
  5171         -  FeedZipHtml(zip_buf, 64025,
  5172         -              "14fa3906160355d2bd947d107db4ef1054d385756455929109");
  5173         -  FeedZipHtml(zip_buf, 64050,
  5174         -              "5a93da1f8accb03b30df23d1fbbe0da9c810388081c2930506");
  5175         -  FeedZipHtml(zip_buf, 64075,
  5176         -              "ab1284610fe0e5f5a56aceefe5ed24c8c5f8a741f0c6156f33");
  5177         -  FeedZipHtml(zip_buf, 64100,
  5178         -              "fb493e12debcd188f709df5aa1783e7af4e24280bdfecd2008");
  5179         -  FeedZipHtml(zip_buf, 64125,
  5180         -              "a30c3b6863d07a39cc32b095239079115b29d4b3708e6df137");
  5181         -  FeedZipHtml(zip_buf, 64150,
  5182         -              "65d8d6845673383778f0a2301851fa194142efe8c6c3cde7ee");
  5183         -  FeedZipHtml(zip_buf, 64175,
  5184         -              "6daf7bd5bbbdf8767371f6e5ba77fbd7af9011e149de37209d");
  5185         -  FeedZipHtml(zip_buf, 64200,
  5186         -              "9fa4c054e1d2427eb2529c16833ff5dc5b70ab1316346b9f43");
  5187         -  FeedZipHtml(zip_buf, 64225,
  5188         -              "5f4f6cec3d4ba0b9b577b019ccd7d261ac1e196eed401bc08f");
  5189         -  FeedZipHtml(zip_buf, 64250,
  5190         -              "3b2c8b55a34c828b96f214cf058bf1a26851622085550d4c4a");
  5191         -  FeedZipHtml(zip_buf, 64275,
  5192         -              "db6118e99aa1505410dd600636bd736197a45ec2d693035f85");
  5193         -  FeedZipHtml(zip_buf, 64300,
  5194         -              "cb63089a9d0c6aae51b273bd80352929c16258d71cd7917988");
  5195         -  FeedZipHtml(zip_buf, 64325,
  5196         -              "21de0360102a51d823426b4623139d8c6daaa0c63d1695a0ad");
  5197         -  FeedZipHtml(zip_buf, 64350,
  5198         -              "5e0bb54379cdee7e3b118f6a67dfc93fe381e1e43bb163bc4b");
  5199         -  FeedZipHtml(zip_buf, 64375,
  5200         -              "7e581f4e31f266e4cdc89b9177bb90376083af1f6e16f43191");
  5201         -  FeedZipHtml(zip_buf, 64400,
  5202         -              "81cc7a6480b1125f22bfea8105221d46f11f02c5ccc21aa3f8");
  5203         -  FeedZipHtml(zip_buf, 64425,
  5204         -              "ca9ebad1ac0ea967f0cc77c64314de114623bb3263a978aa2c");
  5205         -  FeedZipHtml(zip_buf, 64450,
  5206         -              "47bc7892d2c43f0ba5b1229ea588f71559fdb3ca30ba5f9ade");
  5207         -  FeedZipHtml(zip_buf, 64475,
  5208         -              "7f11d5b1e6daab397c3a1cdbdf679686e639b9739a25c93fda");
  5209         -  FeedZipHtml(zip_buf, 64500,
  5210         -              "e33fff62c5b3e2732e84287c9a96749bad82ada2a2db0bfb94");
  5211         -  FeedZipHtml(zip_buf, 64525,
  5212         -              "6a14c079f6d1652162c3f41b09832c21c56d72ee10a795467e");
  5213         -  FeedZipHtml(zip_buf, 64550,
  5214         -              "7d95f31454046c82c3ed583cad0314a1fe9383a3a5306ca4ed");
  5215         -  FeedZipHtml(zip_buf, 64575,
  5216         -              "6e9ce4a3767e5969802829a85dd1a1e61ccf96bacfceedf2ef");
  5217         -  FeedZipHtml(zip_buf, 64600,
  5218         -              "e49c2e7c9999cb85f84035d572deb842ad5f64b2df279e3016");
  5219         -  FeedZipHtml(zip_buf, 64625,
  5220         -              "10a3ebbbf498f6b198a9049d69608fe49855c162d0c16c25eb");
  5221         -  FeedZipHtml(zip_buf, 64650,
  5222         -              "445cc5c752d61fc713e9d041172a184fda07e953d2cacdc754");
  5223         -  FeedZipHtml(zip_buf, 64675,
  5224         -              "0afde1af842ebd07cf8122d5d8c03c6da549c19535c9571cc4");
  5225         -  FeedZipHtml(zip_buf, 64700,
  5226         -              "99f6954968d997ae90051d542d8e799dd40c6353cb633e1252");
  5227         -  FeedZipHtml(zip_buf, 64725,
  5228         -              "45ce4ed17395782337ce684dac04a217b2980c05b58126ec27");
  5229         -  FeedZipHtml(zip_buf, 64750,
  5230         -              "a8cf0b0fd57cbf5c7febbc1e9d2476dfcc4a06b18c28ee3b77");
  5231         -  FeedZipHtml(zip_buf, 64775,
  5232         -              "0873ce863ad4eea310bad043e0268f61f42f3b9f5ae27caa19");
  5233         -  FeedZipHtml(zip_buf, 64800,
  5234         -              "a328b4a077bcc7ccae8791cdc6794c6c75d21b1a9107953c9c");
  5235         -  FeedZipHtml(zip_buf, 64825,
  5236         -              "c3ad8e59fc1a79892b0f8e5280b98a2b4520afd9e1604b5c24");
  5237         -  FeedZipHtml(zip_buf, 64850,
  5238         -              "aa8f4ccbaa273fc763b6f382aaaa53590280abaa55b25cd721");
  5239         -  FeedZipHtml(zip_buf, 64875,
  5240         -              "57e3987bd9080d167e23c2272a27647a9656a97db61f8075b4");
  5241         -  FeedZipHtml(zip_buf, 64900,
  5242         -              "491de9c7a0fece4dfdc8984a564e60a38034f2f73f3d288666");
  5243         -  FeedZipHtml(zip_buf, 64925,
  5244         -              "f26d75dedb9e023f7c0974298e4f86209e979a6d17d95ffeb6");
  5245         -  FeedZipHtml(zip_buf, 64950,
  5246         -              "2496ff2bde0b5cd33dc8cc0d46a740b52b3a8733ec9715de58");
  5247         -  FeedZipHtml(zip_buf, 64975,
  5248         -              "5c2e48271b57a1c22a84229f3cdf034b48636f9492b555d931");
  5249         -  FeedZipHtml(zip_buf, 65000,
  5250         -              "92b29aa4b8b010ceb8a7f8f1d3c70be336e2f9c5bbabeeadf9");
  5251         -  FeedZipHtml(zip_buf, 65025,
  5252         -              "c9d5df5f8dbf20aac5f8f35df7cfff64ae2d8a0f7e2cbfa9a8");
  5253         -  FeedZipHtml(zip_buf, 65050,
  5254         -              "5f941b44059b86ebb92ac2280ef38b4c5ac401958c8e9558ac");
  5255         -  FeedZipHtml(zip_buf, 65075,
  5256         -              "e75687729b7f9f40d04c82240fc367d4a5bdc37cbf7ef8e97f");
  5257         -  FeedZipHtml(zip_buf, 65100,
  5258         -              "cd4eed3aa59e11ce81d00470c9edbbaf3b094d564a1e775950");
  5259         -  FeedZipHtml(zip_buf, 65125,
  5260         -              "9b248f2cd745b1f14aa9098b7ff5e26f0debb0c6be2de0b366");
  5261         -  FeedZipHtml(zip_buf, 65150,
  5262         -              "1ec65df6bb6905166176b24bec84a9c9ae5313e605cc0b1ae2");
  5263         -  FeedZipHtml(zip_buf, 65175,
  5264         -              "053b090a564e0a76524a9b66042cd4cdd10196fd3e7001c6f9");
  5265         -  FeedZipHtml(zip_buf, 65200,
  5266         -              "8cf319e733ce679cbfdf383ff2c6be7b2acc730b831444af7b");
  5267         -  FeedZipHtml(zip_buf, 65225,
  5268         -              "623378ba965298f9d065e4baa561f9d9c74efd199703364533");
  5269         -  FeedZipHtml(zip_buf, 65250,
  5270         -              "5849f594b47154c84add41a5ae3a648f35bf539a6f8085b381");
  5271         -  FeedZipHtml(zip_buf, 65275,
  5272         -              "eca181acd9559026ea17501e927bd78b5ed4854dc52faa0a5b");
  5273         -  FeedZipHtml(zip_buf, 65300,
  5274         -              "b01f616d7e84cc6ccb5ecfcb4fb20213cd4dafc22d3d2052a6");
  5275         -  FeedZipHtml(zip_buf, 65325,
  5276         -              "9c9403c1336ede295340fb88139b6ee2e82b6db086c5d96367");
  5277         -  FeedZipHtml(zip_buf, 65350,
  5278         -              "539e272fe41a5896871d536d45822c4223aa8c44eee620e4f5");
  5279         -  FeedZipHtml(zip_buf, 65375,
  5280         -              "7f82e1fc7d71fd09bacf219fec6f5989bf85433ed9e5b3eb2e");
  5281         -  FeedZipHtml(zip_buf, 65400,
  5282         -              "9f2d0cfeda3f970f2ba9dd148095ba834a6d92d3b3ee7742f7");
  5283         -  FeedZipHtml(zip_buf, 65425,
  5284         -              "eda5ebf9a8df1c63e7286066f5ccea398462ef283df369e6d3");
  5285         -  FeedZipHtml(zip_buf, 65450,
  5286         -              "8df36986756d27d3aca196026fd6e8ae69b4691acd8adf6ec5");
  5287         -  FeedZipHtml(zip_buf, 65475,
  5288         -              "6f2d87667eccfc98f931f363e6c7cc8f991fcfe6c71fc220dc");
  5289         -  FeedZipHtml(zip_buf, 65500,
  5290         -              "f258c6cbc89e563fb51952bbc362dd387c6535b4420db5a26b");
  5291         -  FeedZipHtml(zip_buf, 65525,
  5292         -              "5957dba3abd5fb0358a5dba1d2f632fdb2e07650492c3888cb");
  5293         -  FeedZipHtml(zip_buf, 65550,
  5294         -              "64bf3d649fe6c99c8156b1f554a3fbc4d939527d0f683b47aa");
  5295         -  FeedZipHtml(zip_buf, 65575,
  5296         -              "b3e760b73d075b1c31d966cfc10e8a75e39899d5d00a353447");
  5297         -  FeedZipHtml(zip_buf, 65600,
  5298         -              "34595b7c5a5cf7b4384b2339ee9aa9e6ee524de699bbce3399");
  5299         -  FeedZipHtml(zip_buf, 65625,
  5300         -              "e431c96b98e4ed12aa6a0bc3db25996e1ca9b20e36af8366b9");
  5301         -  FeedZipHtml(zip_buf, 65650,
  5302         -              "1dab8a89dd82c48e491b9336266d4cda98b43169db13d2d68d");
  5303         -  FeedZipHtml(zip_buf, 65675,
  5304         -              "fb9e771979ce36c1a5cd70b17d17153ee6c5b85c9f09031580");
  5305         -  FeedZipHtml(zip_buf, 65700,
  5306         -              "a2f4021c8b74e5223d02a93962391cd9feb937f092b859607d");
  5307         -  FeedZipHtml(zip_buf, 65725,
  5308         -              "debded5e5ef7ce6700eaeecd59af6781eeb80acde6a1f38ae1");
  5309         -  FeedZipHtml(zip_buf, 65750,
  5310         -              "64aadc7681cac28c9263dd30567c2b7edf4fec6030f1edc8c2");
  5311         -  FeedZipHtml(zip_buf, 65775,
  5312         -              "4e220c090e922cd148e5fa4c7c69ccbab5a3ccc23a25dbeee4");
  5313         -  FeedZipHtml(zip_buf, 65800,
  5314         -              "a68214e969188ae91920b13e4c152be6dc7d7e28680b6279f3");
  5315         -  FeedZipHtml(zip_buf, 65825,
  5316         -              "01ba89973df97e1fdf620e6a9af9d00bc4a2653b12d5c20fc2");
  5317         -  FeedZipHtml(zip_buf, 65850,
  5318         -              "2828fe20549f750c1408abd1e1b2a874183e0abd0460b2b82c");
  5319         -  FeedZipHtml(zip_buf, 65875,
  5320         -              "0b11c3ba6c0ded07570a424f275c3cb363cec3d21f494d99b6");
  5321         -  FeedZipHtml(zip_buf, 65900,
  5322         -              "f611a39682d4dfc7eee0f7cbad0ad5581b44dd17396df20480");
  5323         -  FeedZipHtml(zip_buf, 65925,
  5324         -              "e5baa8ab58f071df4b4a7dd9ab43a997d7ddbf6eceba5717d6");
  5325         -  FeedZipHtml(zip_buf, 65950,
  5326         -              "97dec7db37ca094c7f54235770697015f5bdc4b5a0fa7621da");
  5327         -  FeedZipHtml(zip_buf, 65975,
  5328         -              "fd7493e2146c0cc02ee961343aa7973105753d824091c0fa6e");
  5329         -  FeedZipHtml(zip_buf, 66000,
  5330         -              "3ad98f714978857f141c8e6f5eb1bf31bb95eee43eba6a1cb7");
  5331         -  FeedZipHtml(zip_buf, 66025,
  5332         -              "9342da348863a1ee16826374c6e88cd119a3334667cf4067ea");
  5333         -  FeedZipHtml(zip_buf, 66050,
  5334         -              "33b9b00de53f3ffc66762f96d3136c2bbf88e3f22e97e47b3c");
  5335         -  FeedZipHtml(zip_buf, 66075,
  5336         -              "7aefdcb87d69c41ef86a9dc35f5e8a06ad72998691e30a91be");
  5337         -  FeedZipHtml(zip_buf, 66100,
  5338         -              "ce8af7fede2d11af049343e351f715fcf73faad19f449bbfdd");
  5339         -  FeedZipHtml(zip_buf, 66125,
  5340         -              "4c83c416ab5132acf3f06434b2612785a72b11ab1c52237949");
  5341         -  FeedZipHtml(zip_buf, 66150,
  5342         -              "626abb775e09035a8231567a90ce12dd3014660534069b5798");
  5343         -  FeedZipHtml(zip_buf, 66175,
  5344         -              "e48ab5b4312dad3e329d95d97665ae3976bd5e1eabb7840d31");
  5345         -  FeedZipHtml(zip_buf, 66200,
  5346         -              "b4141196e341a80172333f0c0600cbe4d972ecfa44bb140653");
  5347         -  FeedZipHtml(zip_buf, 66225,
  5348         -              "8ca72f509ce7c0913dd3e55da2cb9c13aa358c99734271e439");
  5349         -  FeedZipHtml(zip_buf, 66250,
  5350         -              "479e2f761224b7a946d2b06c0d226a8257efb7445bc0ab5901");
  5351         -  FeedZipHtml(zip_buf, 66275,
  5352         -              "2dbf26cc7adaa09e5ac3b30a77826b8483311f633ec67770f7");
  5353         -  FeedZipHtml(zip_buf, 66300,
  5354         -              "958c31136226d42c13da532cd2140dda5371b68403b1f4b780");
  5355         -  FeedZipHtml(zip_buf, 66325,
  5356         -              "00b19298fdf04913331b6636cc6c98d930b36984d9e85aef3b");
  5357         -  FeedZipHtml(zip_buf, 66350,
  5358         -              "19ffb2ce82f06d2056accd556973e3a895b5bfcfdaaf153ec7");
  5359         -  FeedZipHtml(zip_buf, 66375,
  5360         -              "26c226b2a97059b624b6a4167851962c420bbf802c58ec62d9");
  5361         -  FeedZipHtml(zip_buf, 66400,
  5362         -              "21174b66eed2388ff2dfc9295b20e9b9c99a9312714c534e55");
  5363         -  FeedZipHtml(zip_buf, 66425,
  5364         -              "b9aec1b0f629cb35473cef812b8a239ed91bb627deb09d0c40");
  5365         -  FeedZipHtml(zip_buf, 66450,
  5366         -              "dc5b6f186b73db290a6b7f9fb5bf062f061bc99e18497b1d14");
  5367         -  FeedZipHtml(zip_buf, 66475,
  5368         -              "1585b0948f8283e0d98fc17e0c8ea76127c6524e0cf620b007");
  5369         -  FeedZipHtml(zip_buf, 66500,
  5370         -              "615d1e0446933be33e60556e2d3160d5efadead7e438600bd9");
  5371         -  FeedZipHtml(zip_buf, 66525,
  5372         -              "750bd95aaf017b04d823c01e01f608b047803d02ec11d88047");
  5373         -  FeedZipHtml(zip_buf, 66550,
  5374         -              "e04318843b1f267b19d9a5f5485a40e3f75afe1b87d7acafed");
  5375         -  FeedZipHtml(zip_buf, 66575,
  5376         -              "d2971ce3aaef9db0525bafd4c65c25acfb5dd17d7b9d206577");
  5377         -  FeedZipHtml(zip_buf, 66600,
  5378         -              "3b4025b120542efb4176d50f42b36ece40ab1c19a97dec933b");
  5379         -  FeedZipHtml(zip_buf, 66625,
  5380         -              "832f6aec8147832f6ab053652f9c2a3b1db5bb054e95bd94ff");
  5381         -  FeedZipHtml(zip_buf, 66650,
  5382         -              "c6313deb6bbbf4d538b566b5b658aded65cd15a10359e2ccd7");
  5383         -  FeedZipHtml(zip_buf, 66675,
  5384         -              "0e985c33b9e6580166d64c6b99d6ae8fd6ae16cc31636d4cb4");
  5385         -  FeedZipHtml(zip_buf, 66700,
  5386         -              "8c935959bba3acb57055d6691b75bae544954928935026a14c");
  5387         -  FeedZipHtml(zip_buf, 66725,
  5388         -              "42998432096512fa7c12da8dfb9e771979ce1a51da3a60da46");
  5389         -  FeedZipHtml(zip_buf, 66750,
  5390         -              "e9270bb51e4af562dc02ce84d1030aab894059f8eb12fe11c8");
  5391         -  FeedZipHtml(zip_buf, 66775,
  5392         -              "d7118bf1c8f6cfbd8197c4cd9284f3ee6df7f2ba773e831c74");
  5393         -  FeedZipHtml(zip_buf, 66800,
  5394         -              "6fce7a3d0bd4cbd5d2768d06ac181aa7a6d22e805c989f72ac");
  5395         -  FeedZipHtml(zip_buf, 66825,
  5396         -              "1bc6bd6f2d9839763098f87664612711520507499634a5727d");
  5397         -  FeedZipHtml(zip_buf, 66850,
  5398         -              "265636e6f0da117361d5936d777253418af4340cc5f40cd0e5");
  5399         -  FeedZipHtml(zip_buf, 66875,
  5400         -              "70982a56ccb9fbfc50d016c462e9030c152f7bf2fd3ebec51c");
  5401         -  FeedZipHtml(zip_buf, 66900,
  5402         -              "d434f3a1178825d0762442871f845150fc41a83eeb18881656");
  5403         -  FeedZipHtml(zip_buf, 66925,
  5404         -              "a3c36511f6307c147a09c064719117228655de1ada0fae1484");
  5405         -  FeedZipHtml(zip_buf, 66950,
  5406         -              "9e4eb81467c79c87d83f929a326ded23de9e05b87f1fbb83df");
  5407         -  FeedZipHtml(zip_buf, 66975,
  5408         -              "2fd719bdb365e06436e26389b6f0048735d0800bffbb00295e");
  5409         -  FeedZipHtml(zip_buf, 67000,
  5410         -              "527ac6b03ac47d79ddfdebe6ac7b75617de97dbc7da39cf3f4");
  5411         -  FeedZipHtml(zip_buf, 67025,
  5412         -              "47350a07e71039e7395e8c31fa12181d0ca95de87c3fddd738");
  5413         -  FeedZipHtml(zip_buf, 67050,
  5414         -              "a11b03e34b7a7e8dcee94551c1768fe05c24788b9b4ef6635c");
  5415         -  FeedZipHtml(zip_buf, 67075,
  5416         -              "125ee11f0547f09b57ec072eddc2f775ff6e0893eeab385b02");
  5417         -  FeedZipHtml(zip_buf, 67100,
  5418         -              "4859fc7b8746196932d264a4c9489391e6c691a6fcec450627");
  5419         -  FeedZipHtml(zip_buf, 67125, "0d69957b79173a53f1f830190989fc3fb7a47b9d");
  5420         -
  5421         -// uncompressing the ZIP payload
  5422         -  in = zip_buf;
  5423         -  html = (char *) malloc(uncompressed_len + 1);
  5424         -  if (html == NULL)
  5425         -    goto error;
  5426         -  out = (Bytef *) html;
  5427         -  if (uncompress(out, &outLen, in, inLen) != Z_OK)
  5428         -    goto error;
  5429         -  *(html + uncompressed_len) = '\0';
  5430         -  free(zip_buf);
  5431         -  html_text = wxString::FromUTF8(html);
  5432         -  free(html);
  5433         -  return;
  5434         -
  5435         -error:
  5436         -  if (zip_buf != NULL)
  5437         -    free(zip_buf);
  5438         -  if (html != NULL)
  5439         -    free(html);
  5440         -  html_text =
  5441         -    wxT
  5442         -    ("<html><body><h1>Sorry, HTML Help is currently unavailable.</h1></body></html>");
  5443         -}

Changes to LayerTree.cpp.

     1      1   /*
     2      2   / LayerTree.cpp
     3      3   / tree control to handle map layers
     4      4   /
     5      5   / version 2.0, 2017 January 8
     6      6   /
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
     8      8   /
     9      9   / Copyright (C) 2017  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
    13     13   /    the Free Software Foundation, either version 3 of the License, or
    14     14   /    (at your option) any later version.
................................................................................
    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     28   #include "wx/imaglist.h"
    29         -#include "wx/spinctrl.h"
    30         -#include "wx/colordlg.h"
    31         -#include "wx/clipbrd.h"
    32     29   
    33     30   //
    34     31   // ICONs in XPM format [universally portable]
    35     32   //
    36     33   #include "icons/map_root.xpm"
    37     34   #include "icons/wms.xpm"
    38     35   #include "icons/wms_off.xpm"
................................................................................
   119    116             (wxObjectEventFunction) & MyLayerTree::OnCmdMapConfigure);
   120    117     Connect(Tree_MapVisible, wxEVT_COMMAND_MENU_SELECTED,
   121    118             (wxObjectEventFunction) & MyLayerTree::OnCmdVisible);
   122    119     Connect(Tree_MapFullExtent, wxEVT_COMMAND_MENU_SELECTED,
   123    120             (wxObjectEventFunction) & MyLayerTree::OnCmdMapFullExtent);
   124    121     Connect(Tree_MapLayerFullExtent, wxEVT_COMMAND_MENU_SELECTED,
   125    122             (wxObjectEventFunction) & MyLayerTree::OnCmdMapLayerFullExtent);
   126         -  Connect(Tree_SqlSample, wxEVT_COMMAND_MENU_SELECTED,
   127         -          (wxObjectEventFunction) & MyLayerTree::OnCmdMapSqlSample);
   128         -  Connect(Tree_UrlSample, wxEVT_COMMAND_MENU_SELECTED,
   129         -          (wxObjectEventFunction) & MyLayerTree::OnCmdMapUrlSample);
   130    123     Connect(Tree_MapLayerConfigure, wxEVT_COMMAND_MENU_SELECTED,
   131    124             (wxObjectEventFunction) & MyLayerTree::OnCmdMapLayerConfigure);
   132    125     Connect(Tree_QuickStyleEdit, wxEVT_COMMAND_MENU_SELECTED,
   133    126             (wxObjectEventFunction) & MyLayerTree::OnCmdQuickStyleEdit);
   134    127     Connect(Tree_MapLayerInfo, wxEVT_COMMAND_MENU_SELECTED,
   135    128             (wxObjectEventFunction) & MyLayerTree::OnCmdLayerInfo);
   136    129     Connect(Tree_MapRemoveLayer, wxEVT_COMMAND_MENU_SELECTED,
................................................................................
   164    157         case MAP_LAYER_WMS:
   165    158           if (layer->IsVisible() == false)
   166    159             idx = 2;
   167    160           else
   168    161             idx = 1;
   169    162           break;
   170    163         case MAP_LAYER_VECTOR:
   171         -      case MAP_LAYER_VECTOR_VIEW:
   172         -      case MAP_LAYER_VECTOR_SHP:
   173    164           switch (layer->GetGeometryType())
   174    165             {
   175    166               case 1:
   176    167               case 1001:
   177    168               case 2001:
   178    169               case 3001:
   179    170               case 4:
................................................................................
   244    235   void MyLayerTree::AddLayer(MapLayer * layer)
   245    236   {
   246    237   //
   247    238   // adds a layer to the TREE list
   248    239   //
   249    240     wxTreeItemId item;
   250    241     wxString name = layer->GetDbPrefix();
   251         -  if (layer->GetType() == MAP_LAYER_VECTOR
   252         -      || layer->GetType() == MAP_LAYER_VECTOR_VIEW
   253         -      || layer->GetType() == MAP_LAYER_VECTOR_SHP)
          242  +  if (layer->GetType() == MAP_LAYER_VECTOR)
   254    243       name += wxT(".") + layer->GetVectorPrefix();
   255    244     name += wxT(".") + layer->GetName();
   256    245     if (GetChildrenCount(Root) == 0)
   257    246       item = AppendItem(Root, name, 1);
   258    247     else
   259    248       item = InsertItem(Root, 0, name, 1);
   260    249     MapLayerObject *obj = new MapLayerObject(layer);
................................................................................
   422    411         menuItem = new wxMenuItem(&menu, Tree_MapRemoveLayer, wxT("Remove"));
   423    412         menu.Append(menuItem);
   424    413         menu.AppendSeparator();
   425    414         menuItem =
   426    415           new wxMenuItem(&menu, Tree_MapLayerFullExtent,
   427    416                          wxT("Zoom to Full Extent"));
   428    417         menu.Append(menuItem);
   429         -      menu.AppendSeparator();
   430         -      menuItem = new wxMenuItem(&menu, Tree_SqlSample, wxT("SQL sample"));
   431         -      menu.Append(menuItem);
   432         -      if (layer->GetType() == MAP_LAYER_WMS)
   433         -        {
   434         -          menuItem =
   435         -            new wxMenuItem(&menu, Tree_UrlSample, wxT("Request URL sample"));
   436         -          menu.Append(menuItem);
   437         -        }
   438    418         menu.AppendSeparator();
   439    419         menuItem = new wxMenuItem(&menu, Tree_MapLayerInfo, wxT("Metadata"));
   440    420         menu.Append(menuItem);
   441    421         menuItem =
   442    422           new wxMenuItem(&menu, Tree_MapLayerConfigure, wxT("Configure"));
   443    423         menu.Append(menuItem);
   444    424         menuItem =
................................................................................
   479    459     MapLayerObject *obj = (MapLayerObject *) GetItemData(CurrentItem);
   480    460     if (obj == NULL)
   481    461       return;
   482    462     MapLayer *layer = obj->GetLayer();
   483    463     MapPanel->SetMapLayerToFullExtent(layer);
   484    464   }
   485    465   
   486         -void MyLayerTree::OnCmdMapSqlSample(wxCommandEvent & WXUNUSED(event))
   487         -{
   488         -//
   489         -// menu event - showing an SQL sample corresponding to the current Map settings
   490         -//
   491         -  MapLayerObject *obj = (MapLayerObject *) GetItemData(CurrentItem);
   492         -  if (obj == NULL)
   493         -    return;
   494         -  MapLayer *layer = obj->GetLayer();
   495         -  switch (layer->GetType())
   496         -    {
   497         -      case MAP_LAYER_WMS:
   498         -        DoWmsSqlSample(layer);
   499         -        break;
   500         -      case MAP_LAYER_VECTOR:
   501         -      case MAP_LAYER_VECTOR_VIEW:
   502         -      case MAP_LAYER_VECTOR_SHP:
   503         -        DoVectorSqlSample(layer);
   504         -        break;
   505         -      case MAP_LAYER_TOPOLOGY:
   506         -      case MAP_LAYER_NETWORK:
   507         -        DoVectorSqlSample(layer);
   508         -        break;
   509         -      case MAP_LAYER_RASTER:
   510         -        DoRasterSqlSample(layer);
   511         -        break;
   512         -    }
   513         -}
   514         -
   515         -void MyLayerTree::OnCmdMapUrlSample(wxCommandEvent & WXUNUSED(event))
   516         -{
   517         -//
   518         -// menu event - showing a Request URL sample corresponding to the current Map settings
   519         -//
   520         -  MapLayerObject *obj = (MapLayerObject *) GetItemData(CurrentItem);
   521         -  if (obj == NULL)
   522         -    return;
   523         -  MapLayer *layer = obj->GetLayer();
   524         -  if (layer->GetType() != MAP_LAYER_WMS)
   525         -    return;
   526         -  DoWmsUrlSample(layer);
   527         -}
   528         -
   529         -void MyLayerTree::DoWmsSqlSample(MapLayer * lyr)
   530         -{
   531         -//
   532         -// WMS - showing an SQL sample corresponding to the current Map settings
   533         -//
   534         -  WmsLayerSettings *conf = lyr->GetWmsConfig();
   535         -  WmsSqlSampleDialog dlg;
   536         -  dlg.Create(MapPanel, lyr);
   537         -  dlg.ShowModal();
   538         -}
   539         -
   540         -void MyLayerTree::DoWmsUrlSample(MapLayer * lyr)
   541         -{
   542         -//
   543         -// WMS - showing a Request URL sample corresponding to the current Map settings
   544         -//
   545         -  WmsLayerSettings *conf = lyr->GetWmsConfig();
   546         -  WmsSqlSampleDialog dlg;
   547         -  dlg.Create(MapPanel, lyr, true);
   548         -  dlg.ShowModal();
   549         -}
   550         -
   551         -void MyLayerTree::DoVectorSqlSample(MapLayer * lyr)
   552         -{
   553         -//
   554         -// Vector - showing an SQL sample corresponding to the current Map settings
   555         -//
   556         -//fprintf(stderr, "Vector SQL\n");
   557         -  VectorLayerConfig *conf = lyr->GetVectorConfig();
   558         -  VectorSqlSampleDialog dlg;
   559         -  dlg.Create(MapPanel, lyr);
   560         -  dlg.ShowModal();
   561         -}
   562         -
   563         -void MyLayerTree::DoRasterSqlSample(MapLayer * lyr)
   564         -{
   565         -//
   566         -// Raster - showing an SQL sample corresponding to the current Map settings
   567         -//
   568         -  RasterLayerConfig *conf = lyr->GetRasterConfig();
   569         -  RasterSqlSampleDialog dlg;
   570         -  dlg.Create(MapPanel, lyr);
   571         -  dlg.ShowModal();
   572         -}
   573         -
   574    466   void MyLayerTree::OnCmdRemoveLayer(wxCommandEvent & WXUNUSED(event))
   575    467   {
   576    468   //
   577    469   // menu event - removing some Map layer (Step #1)
   578    470   //
   579    471     MapLayerObject *obj = (MapLayerObject *) GetItemData(CurrentItem);
   580    472     if (obj == NULL)
................................................................................
   854    746   //
   855    747   // menu event - editing Layer's Quick Style
   856    748   //
   857    749     MapLayerObject *obj = (MapLayerObject *) GetItemData(CurrentItem);
   858    750     if (obj == NULL)
   859    751       return;
   860    752     MapLayer *layer = obj->GetLayer();
          753  +  bool bboxChanged = false;
   861    754     bool configChanged = false;
   862    755     if (layer->GetType() == MAP_LAYER_VECTOR
   863    756         || layer->GetType() == MAP_LAYER_VECTOR_VIEW
   864    757         || layer->GetType() == MAP_LAYER_VECTOR_SHP)
   865    758       {
   866    759         QuickStyleVectorDialog dlg;
   867    760         int type = layer->GetVectorConfig()->GetGeometryType();
................................................................................
   870    763         if (ret == wxID_OK)
   871    764           configChanged = dlg.ConfigChanged();
   872    765       }
   873    766     if (layer->GetType() == MAP_LAYER_TOPOLOGY
   874    767         || layer->GetType() == MAP_LAYER_NETWORK)
   875    768       {
   876    769         QuickStyleTopologyDialog dlg;
   877         -      dlg.Create(MapPanel, layer);
   878         -      int ret = dlg.ShowModal();
   879         -      if (ret == wxID_OK)
   880         -        configChanged = dlg.ConfigChanged();
   881         -    }
   882         -  if (layer->GetType() == MAP_LAYER_RASTER)
   883         -    {
   884         -      QuickStyleRasterDialog dlg;
   885    770         dlg.Create(MapPanel, layer);
   886    771         int ret = dlg.ShowModal();
   887    772         if (ret == wxID_OK)
   888    773           configChanged = dlg.ConfigChanged();
   889    774       }
   890    775     if (configChanged == true)
   891    776       MapPanel->RefreshMap();
................................................................................
   917    802     wxTreeItemId currentItem = event.GetItem();
   918    803     MapLayer *layer = obj->GetLayer();
   919    804   // 
   920    805   // creating the new node
   921    806   //
   922    807     wxTreeItemId position;
   923    808     wxString name = layer->GetDbPrefix();
   924         -  if (layer->GetType() == MAP_LAYER_VECTOR
   925         -      || layer->GetType() == MAP_LAYER_VECTOR_VIEW
   926         -      || layer->GetType() == MAP_LAYER_VECTOR_SHP)
          809  +  if (layer->GetType() == MAP_LAYER_VECTOR)
   927    810       name += wxT(".") + layer->GetVectorPrefix();
   928    811     name += wxT(".") + layer->GetName();
   929    812     wxColour color(0, 0, 0);
   930    813     int idx = GetIconIndex(layer);
   931    814     if (layer->IsVisible() == false)
   932    815       {
   933    816         color = wxColour(192, 192, 192);
................................................................................
  1019    902                                            wxT("SRID"),
  1020    903                                            wxDefaultPosition,
  1021    904                                            wxDefaultSize);
  1022    905     wxBoxSizer *sridBoxSizer = new wxStaticBoxSizer(sridBox, wxVERTICAL);
  1023    906     xxSizer->Add(sridBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  1024    907     wxComboBox *sridList =
  1025    908       new wxComboBox(this, ID_RASTER_SRID, wxT(""), wxDefaultPosition,
  1026         -                   wxSize(350, 21), 0, NULL,
  1027         -                   wxCB_DROPDOWN | wxCB_READONLY);
          909  +                   wxSize(350, 21), 0, NULL, wxCB_DROPDOWN | wxCB_READONLY);
  1028    910     PopulateSRIDs(sridList);
  1029    911     sridBoxSizer->Add(sridList, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  1030    912     wxStaticBox *stlBox = new wxStaticBox(this, wxID_STATIC,
  1031    913                                           wxT("Style"),
  1032    914                                           wxDefaultPosition,
  1033    915                                           wxDefaultSize);
  1034    916     wxBoxSizer *stlBoxSizer = new wxStaticBoxSizer(stlBox, wxVERTICAL);
  1035    917     xxSizer->Add(stlBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  1036    918     wxComboBox *stlList =
  1037    919       new wxComboBox(this, ID_RASTER_STYLE, wxT(""), wxDefaultPosition,
  1038         -                   wxSize(350, 21), 0, NULL,
  1039         -                   wxCB_DROPDOWN | wxCB_READONLY);
          920  +                   wxSize(350, 21), 0, NULL, wxCB_DROPDOWN | wxCB_READONLY);
  1040    921     PopulateStyles(stlList);
  1041    922     stlBoxSizer->Add(stlList, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  1042    923     wxBoxSizer *buttonSizer = new wxBoxSizer(wxVERTICAL);
  1043    924     rstSizer->Add(buttonSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  1044    925     wxButton *rst_ok = new wxButton(this, ID_RASTER_OK, wxT("&Apply Changes"));
  1045    926     buttonSizer->Add(rst_ok, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  1046    927     wxButton *rst_quit = new wxButton(this, wxID_CANCEL, wxT("&Quit"));
................................................................................
  1088    969        "JOIN \"%s\".spatial_ref_sys AS y ON (r.srid = y.srid) "
  1089    970        "WHERE r.coverage_name = %Q UNION "
  1090    971        "SELECT s.srid, y.ref_sys_name FROM \"%s\".raster_coverages AS r "
  1091    972        "JOIN \"%s\".raster_coverages_srid AS s ON (s.coverage_name = r.coverage_name) "
  1092    973        "JOIN \"%s\".spatial_ref_sys AS y ON (s.srid = y.srid) "
  1093    974        "WHERE r.coverage_name = %Q AND "
  1094    975        "s.extent_miny IS NOT NULL AND s.extent_maxx IS NOT NULL AND "
  1095         -     "s.extent_maxx IS NOT NULL ORDER BY s.srid", xdb_prefix, xdb_prefix,
  1096         -     layer, xdb_prefix, xdb_prefix, xdb_prefix, layer);
          976  +     "s.extent_maxx IS NOT NULL ORDER BY s.srid", xdb_prefix, xdb_prefix, layer,
          977  +     xdb_prefix, xdb_prefix, xdb_prefix, layer);
  1097    978     free(layer);
  1098    979     free(xdb_prefix);
  1099    980     ret =
  1100         -    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows,
  1101         -                      &columns, NULL);
          981  +    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows, &columns,
          982  +                      NULL);
  1102    983     sqlite3_free(sql);
  1103    984     if (ret != SQLITE_OK)
  1104    985       return;
  1105    986   
  1106    987     for (int i = 1; i <= rows; i++)
  1107    988       {
  1108    989         // populating the list
................................................................................
  1129   1010   
  1130   1011     char *db_prefix = (char *) malloc((DbPrefix.Len() * 4) + 1);
  1131   1012     strcpy(db_prefix, DbPrefix.ToUTF8());
  1132   1013     char *xdb_prefix = gaiaDoubleQuotedSql(db_prefix);
  1133   1014     free(db_prefix);
  1134   1015     char *layer = (char *) malloc((LayerName.Len() * 4) + 1);
  1135   1016     strcpy(layer, LayerName.ToUTF8());
  1136         -  sql =
  1137         -    sqlite3_mprintf
  1138         -    ("SELECT s.style_name FROM \"%s\".raster_coverages AS r "
  1139         -     "JOIN \"%s\".SE_raster_styled_layers AS x ON (x.coverage_name = r.coverage_name) "
  1140         -     "JOIN \"%s\".SE_raster_styles AS s ON (s.style_id = x.style_id) "
  1141         -     "WHERE r.coverage_name = %Q ORDER BY s.style_name", xdb_prefix,
  1142         -     xdb_prefix, xdb_prefix, layer);
         1017  +  sql = sqlite3_mprintf("SELECT s.style_name FROM \"%s\".raster_coverages AS r "
         1018  +                        "JOIN \"%s\".SE_raster_styled_layers AS x ON (x.coverage_name = r.coverage_name) "
         1019  +                        "JOIN \"%s\".SE_raster_styles AS s ON (s.style_id = x.style_id) "
         1020  +                        "WHERE r.coverage_name = %Q ORDER BY s.style_name",
         1021  +                        xdb_prefix, xdb_prefix, xdb_prefix, layer);
  1143   1022     free(layer);
  1144   1023     free(xdb_prefix);
  1145   1024     ret =
  1146         -    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows,
  1147         -                      &columns, NULL);
         1025  +    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows, &columns,
         1026  +                      NULL);
  1148   1027     sqlite3_free(sql);
  1149   1028     if (ret != SQLITE_OK)
  1150   1029       return;
  1151   1030   
  1152   1031     for (int i = 1; i <= rows; i++)
  1153   1032       {
  1154   1033         // populating the list
................................................................................
  1156   1035         if (strcasecmp(style, "default") == 0)
  1157   1036           has_default = 1;
  1158   1037         wxString str = wxString::FromUTF8(style);
  1159   1038         stlList->Append(str);
  1160   1039       }
  1161   1040     sqlite3_free_table(results);
  1162   1041   
  1163         -  QuickStyleRasterObj *quickStyle = Layer->GetQuickStyleRaster();
  1164         -  if (quickStyle != NULL)
  1165         -    {
  1166         -      wxString str = wxString::FromUTF8(quickStyle->GetUUID());
  1167         -      stlList->Append(str);
  1168         -    }
  1169         -
  1170   1042     if (!has_default)
  1171   1043       stlList->Append(wxT("default"));
  1172   1044     if (stlList->GetSelection() == wxNOT_FOUND)
  1173   1045       {
  1174         -      for (int i = 0; i < (int) stlList->GetCount(); i++)
         1046  +      for (int i = 0; i < stlList->GetCount(); i++)
  1175   1047           {
  1176   1048             if (Style == NULL)
  1177   1049               {
  1178   1050                 if (stlList->GetString(i).Cmp(wxT("default")) == 0)
  1179   1051                   stlList->SetSelection(i);
  1180   1052             } else
  1181   1053               {
................................................................................
  1306   1178                                            wxT("SRID"),
  1307   1179                                            wxDefaultPosition,
  1308   1180                                            wxDefaultSize);
  1309   1181     wxBoxSizer *sridBoxSizer = new wxStaticBoxSizer(sridBox, wxVERTICAL);
  1310   1182     xxSizer->Add(sridBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  1311   1183     wxComboBox *sridList =
  1312   1184       new wxComboBox(this, ID_VECTOR_SRID, wxT(""), wxDefaultPosition,
  1313         -                   wxSize(350, 21), 0, NULL,
  1314         -                   wxCB_DROPDOWN | wxCB_READONLY);
         1185  +                   wxSize(350, 21), 0, NULL, wxCB_DROPDOWN | wxCB_READONLY);
  1315   1186     PopulateSRIDs(sridList);
  1316   1187     sridBoxSizer->Add(sridList, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  1317   1188     wxStaticBox *stlBox = new wxStaticBox(this, wxID_STATIC,
  1318   1189                                           wxT("Style"),
  1319   1190                                           wxDefaultPosition,
  1320   1191                                           wxDefaultSize);
  1321   1192     wxBoxSizer *stlBoxSizer = new wxStaticBoxSizer(stlBox, wxVERTICAL);
  1322   1193     xxSizer->Add(stlBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  1323   1194     wxComboBox *stlList =
  1324   1195       new wxComboBox(this, ID_VECTOR_STYLE, wxT(""), wxDefaultPosition,
  1325         -                   wxSize(350, 21), 0, NULL,
  1326         -                   wxCB_DROPDOWN | wxCB_READONLY);
         1196  +                   wxSize(350, 21), 0, NULL, wxCB_DROPDOWN | wxCB_READONLY);
  1327   1197     PopulateStyles(stlList);
  1328   1198     stlBoxSizer->Add(stlList, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  1329   1199     wxBoxSizer *buttonSizer = new wxBoxSizer(wxVERTICAL);
  1330   1200     rstSizer->Add(buttonSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  1331   1201     wxButton *rst_ok = new wxButton(this, ID_VECTOR_OK, wxT("&Apply Changes"));
  1332   1202     buttonSizer->Add(rst_ok, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  1333   1203     wxButton *rst_quit = new wxButton(this, wxID_CANCEL, wxT("&Quit"));
................................................................................
  1395   1265        "WHERE c.coverage_name = %Q AND s.extent_minx IS NOT NULL AND "
  1396   1266        "s.extent_miny IS NOT NULL AND s.extent_maxx IS NOT NULL AND "
  1397   1267        "s.extent_maxx IS NOT NULL ORDER BY s.srid", xdb_prefix, xdb_prefix,
  1398   1268        xdb_prefix, layer, xdb_prefix, xdb_prefix, xdb_prefix, layer);
  1399   1269     free(layer);
  1400   1270     free(xdb_prefix);
  1401   1271     ret =
  1402         -    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows,
  1403         -                      &columns, NULL);
         1272  +    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows, &columns,
         1273  +                      NULL);
  1404   1274     sqlite3_free(sql);
  1405   1275     if (ret != SQLITE_OK)
  1406   1276       return;
  1407   1277   
  1408   1278     for (int i = 1; i <= rows; i++)
  1409   1279       {
  1410   1280         // populating the list
................................................................................
  1449   1319        "WHERE c.coverage_name = %Q AND s.extent_minx IS NOT NULL AND "
  1450   1320        "s.extent_miny IS NOT NULL AND s.extent_maxx IS NOT NULL AND "
  1451   1321        "s.extent_maxx IS NOT NULL ORDER BY s.srid", xdb_prefix, xdb_prefix,
  1452   1322        xdb_prefix, xdb_prefix, layer, xdb_prefix, xdb_prefix, xdb_prefix, layer);
  1453   1323     free(layer);
  1454   1324     free(xdb_prefix);
  1455   1325     ret =
  1456         -    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows,
  1457         -                      &columns, NULL);
         1326  +    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows, &columns,
         1327  +                      NULL);
  1458   1328     sqlite3_free(sql);
  1459   1329     if (ret != SQLITE_OK)
  1460   1330       return;
  1461   1331   
  1462   1332     for (int i = 1; i <= rows; i++)
  1463   1333       {
  1464   1334         // populating the list
................................................................................
  1501   1371        "WHERE c.coverage_name = %Q AND "
  1502   1372        "s.extent_miny IS NOT NULL AND s.extent_maxx IS NOT NULL AND "
  1503   1373        "s.extent_maxx IS NOT NULL ORDER BY s.srid", xdb_prefix, xdb_prefix,
  1504   1374        xdb_prefix, layer, xdb_prefix, xdb_prefix, xdb_prefix, layer);
  1505   1375     free(layer);
  1506   1376     free(xdb_prefix);
  1507   1377     ret =
  1508         -    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows,
  1509         -                      &columns, NULL);
         1378  +    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows, &columns,
         1379  +                      NULL);
  1510   1380     sqlite3_free(sql);
  1511   1381     if (ret != SQLITE_OK)
  1512   1382       return;
  1513   1383   
  1514   1384     for (int i = 1; i <= rows; i++)
  1515   1385       {
  1516   1386         // populating the list
................................................................................
  1552   1422       sqlite3_mprintf
  1553   1423       ("SELECT f_table_name, f_geometry_column, view_name, view_geometry, "
  1554   1424        "virt_name, virt_geometry, topology_name, network_name FROM \"%s\".vector_coverages "
  1555   1425        "WHERE coverage_name = %Q", xdb_prefix, layer);
  1556   1426     free(layer);
  1557   1427     free(xdb_prefix);
  1558   1428     ret =
  1559         -    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows,
  1560         -                      &columns, NULL);
         1429  +    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows, &columns,
         1430  +                      NULL);
  1561   1431     sqlite3_free(sql);
  1562   1432     if (ret != SQLITE_OK)
  1563   1433       return MAP_LAYER_UNKNOWN;
  1564   1434   
  1565   1435     for (int i = 1; i <= rows; i++)
  1566   1436       {
  1567   1437         // populating the list
................................................................................
  1617   1487   
  1618   1488     char *db_prefix = (char *) malloc((DbPrefix.Len() * 4) + 1);
  1619   1489     strcpy(db_prefix, DbPrefix.ToUTF8());
  1620   1490     char *xdb_prefix = gaiaDoubleQuotedSql(db_prefix);
  1621   1491     free(db_prefix);
  1622   1492     char *layer = (char *) malloc((LayerName.Len() * 4) + 1);
  1623   1493     strcpy(layer, LayerName.ToUTF8());
  1624         -  sql =
  1625         -    sqlite3_mprintf
  1626         -    ("SELECT s.style_name FROM \"%s\".vector_coverages AS r "
  1627         -     "JOIN \"%s\".SE_vector_styled_layers AS x ON (x.coverage_name = r.coverage_name) "
  1628         -     "JOIN \"%s\".SE_vector_styles AS s ON (s.style_id = x.style_id) "
  1629         -     "WHERE r.coverage_name = %Q ORDER BY s.style_name", xdb_prefix,
  1630         -     xdb_prefix, xdb_prefix, layer);
         1494  +  sql = sqlite3_mprintf("SELECT s.style_name FROM \"%s\".vector_coverages AS r "
         1495  +                        "JOIN \"%s\".SE_vector_styled_layers AS x ON (x.coverage_name = r.coverage_name) "
         1496  +                        "JOIN \"%s\".SE_vector_styles AS s ON (s.style_id = x.style_id) "
         1497  +                        "WHERE r.coverage_name = %Q ORDER BY s.style_name",
         1498  +                        xdb_prefix, xdb_prefix, xdb_prefix, layer);
  1631   1499     free(layer);
  1632   1500     free(xdb_prefix);
  1633   1501     ret =
  1634         -    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows,
  1635         -                      &columns, NULL);
         1502  +    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows, &columns,
         1503  +                      NULL);
  1636   1504     sqlite3_free(sql);
  1637   1505     if (ret != SQLITE_OK)
  1638   1506       return;
  1639   1507   
  1640   1508     for (int i = 1; i <= rows; i++)
  1641   1509       {
  1642   1510         // populating the list
................................................................................
  1655   1523         stlList->Append(str);
  1656   1524       }
  1657   1525   
  1658   1526     if (!has_default)
  1659   1527       stlList->Append(wxT("default"));
  1660   1528     if (stlList->GetSelection() == wxNOT_FOUND)
  1661   1529       {
  1662         -      for (int i = 0; i < (int) stlList->GetCount(); i++)
         1530  +      for (int i = 0; i < stlList->GetCount(); i++)
  1663   1531           {
  1664   1532             if (Style == NULL)
  1665   1533               {
  1666   1534                 if (stlList->GetString(i).Cmp(wxT("default")) == 0)
  1667   1535                   stlList->SetSelection(i);
  1668   1536             } else
  1669   1537               {
................................................................................
  1795   1663                                            wxT("SRID"),
  1796   1664                                            wxDefaultPosition,
  1797   1665                                            wxDefaultSize);
  1798   1666     wxBoxSizer *sridBoxSizer = new wxStaticBoxSizer(sridBox, wxVERTICAL);
  1799   1667     xxSizer->Add(sridBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  1800   1668     wxComboBox *sridList =
  1801   1669       new wxComboBox(this, ID_TOPOGEO_SRID, wxT(""), wxDefaultPosition,
  1802         -                   wxSize(350, 21), 0, NULL,
  1803         -                   wxCB_DROPDOWN | wxCB_READONLY);
         1670  +                   wxSize(350, 21), 0, NULL, wxCB_DROPDOWN | wxCB_READONLY);
  1804   1671     PopulateSRIDs(sridList);
  1805   1672     sridBoxSizer->Add(sridList, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  1806   1673     wxStaticBox *stlBox = new wxStaticBox(this, wxID_STATIC,
  1807   1674                                           wxT("Style"),
  1808   1675                                           wxDefaultPosition,
  1809   1676                                           wxDefaultSize);
  1810   1677     wxBoxSizer *stlBoxSizer = new wxStaticBoxSizer(stlBox, wxVERTICAL);
  1811   1678     xxSizer->Add(stlBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  1812   1679     wxComboBox *stlList =
  1813   1680       new wxComboBox(this, ID_TOPOGEO_STYLE, wxT(""), wxDefaultPosition,
  1814         -                   wxSize(350, 21), 0, NULL,
  1815         -                   wxCB_DROPDOWN | wxCB_READONLY);
         1681  +                   wxSize(350, 21), 0, NULL, wxCB_DROPDOWN | wxCB_READONLY);
  1816   1682     PopulateStyles(stlList);
  1817   1683     stlBoxSizer->Add(stlList, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  1818   1684   // third row: Primitives Visibility
  1819   1685     wxStaticBox *visBox = new wxStaticBox(this, wxID_STATIC,
  1820   1686                                           wxT("TopoGeo Primitives Visibility"),
  1821   1687                                           wxDefaultPosition,
  1822   1688                                           wxDefaultSize);
................................................................................
  1839   1705     wxCheckBox *nodeCtrl = new wxCheckBox(this, ID_TOPOGEO_NODE,
  1840   1706                                           wxT("Nodes"),
  1841   1707                                           wxDefaultPosition, wxDefaultSize);
  1842   1708     nodeCtrl->SetValue(config->AreNodesVisible());
  1843   1709     vis1BoxSizer->Add(nodeCtrl, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  1844   1710     wxCheckBox *faceSeedCtrl = new wxCheckBox(this, ID_TOPOGEO_FACE_SEED,
  1845   1711                                               wxT("FaceSeeds"),
  1846         -                                            wxDefaultPosition,
  1847         -                                            wxDefaultSize);
         1712  +                                            wxDefaultPosition, wxDefaultSize);
  1848   1713     faceSeedCtrl->SetValue(config->AreFaceSeedsVisible());
  1849   1714     vis2BoxSizer->Add(faceSeedCtrl, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  1850   1715     wxCheckBox *edgeSeedCtrl = new wxCheckBox(this, ID_TOPOGEO_EDGE_SEED,
  1851   1716                                               wxT("EdgeSeeds"),
  1852         -                                            wxDefaultPosition,
  1853         -                                            wxDefaultSize);
         1717  +                                            wxDefaultPosition, wxDefaultSize);
  1854   1718     edgeSeedCtrl->SetValue(config->AreEdgeSeedsVisible());
  1855   1719     vis2BoxSizer->Add(edgeSeedCtrl, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  1856   1720   // Apply/Quit buttons  
  1857   1721     wxBoxSizer *buttonSizer = new wxBoxSizer(wxVERTICAL);
  1858   1722     rstSizer->Add(buttonSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  1859   1723     wxButton *rst_ok = new wxButton(this, ID_TOPOGEO_OK, wxT("&Apply Changes"));
  1860   1724     buttonSizer->Add(rst_ok, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
................................................................................
  1909   1773        "WHERE c.coverage_name = %Q AND "
  1910   1774        "s.extent_miny IS NOT NULL AND s.extent_maxx IS NOT NULL AND "
  1911   1775        "s.extent_maxx IS NOT NULL ORDER BY s.srid", xdb_prefix, xdb_prefix,
  1912   1776        xdb_prefix, layer, xdb_prefix, xdb_prefix, xdb_prefix, layer);
  1913   1777     free(layer);
  1914   1778     free(xdb_prefix);
  1915   1779     ret =
  1916         -    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows,
  1917         -                      &columns, NULL);
         1780  +    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows, &columns,
         1781  +                      NULL);
  1918   1782     sqlite3_free(sql);
  1919   1783     if (ret != SQLITE_OK)
  1920   1784       return;
  1921   1785   
  1922   1786     for (int i = 1; i <= rows; i++)
  1923   1787       {
  1924   1788         // populating the list
................................................................................
  1945   1809   
  1946   1810     char *db_prefix = (char *) malloc((DbPrefix.Len() * 4) + 1);
  1947   1811     strcpy(db_prefix, DbPrefix.ToUTF8());
  1948   1812     char *xdb_prefix = gaiaDoubleQuotedSql(db_prefix);
  1949   1813     free(db_prefix);
  1950   1814     char *layer = (char *) malloc((LayerName.Len() * 4) + 1);
  1951   1815     strcpy(layer, LayerName.ToUTF8());
  1952         -  sql =
  1953         -    sqlite3_mprintf
  1954         -    ("SELECT s.style_name FROM \"%s\".vector_coverages AS r "
  1955         -     "JOIN \"%s\".SE_vector_styled_layers AS x ON (x.coverage_name = r.coverage_name) "
  1956         -     "JOIN \"%s\".SE_vector_styles AS s ON (s.style_id = x.style_id) "
  1957         -     "WHERE r.coverage_name = %Q ORDER BY s.style_name", xdb_prefix,
  1958         -     xdb_prefix, xdb_prefix, layer);
         1816  +  sql = sqlite3_mprintf("SELECT s.style_name FROM \"%s\".vector_coverages AS r "
         1817  +                        "JOIN \"%s\".SE_vector_styled_layers AS x ON (x.coverage_name = r.coverage_name) "
         1818  +                        "JOIN \"%s\".SE_vector_styles AS s ON (s.style_id = x.style_id) "
         1819  +                        "WHERE r.coverage_name = %Q ORDER BY s.style_name",
         1820  +                        xdb_prefix, xdb_prefix, xdb_prefix, layer);
  1959   1821     free(layer);
  1960   1822     free(xdb_prefix);
  1961   1823     ret =
  1962         -    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows,
  1963         -                      &columns, NULL);
         1824  +    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows, &columns,
         1825  +                      NULL);
  1964   1826     sqlite3_free(sql);
  1965   1827     if (ret != SQLITE_OK)
  1966   1828       return;
  1967   1829   
  1968   1830     for (int i = 1; i <= rows; i++)
  1969   1831       {
  1970   1832         // populating the list
................................................................................
  1983   1845         stlList->Append(str);
  1984   1846       }
  1985   1847   
  1986   1848     if (!has_default)
  1987   1849       stlList->Append(wxT("default"));
  1988   1850     if (stlList->GetSelection() == wxNOT_FOUND)
  1989   1851       {
  1990         -      for (int i = 0; i < (int) stlList->GetCount(); i++)
         1852  +      for (int i = 0; i < stlList->GetCount(); i++)
  1991   1853           {
  1992   1854             if (Style == NULL)
  1993   1855               {
  1994   1856                 if (stlList->GetString(i).Cmp(wxT("default")) == 0)
  1995   1857                   stlList->SetSelection(i);
  1996   1858             } else
  1997   1859               {
................................................................................
  2164   2026                                            wxT("SRID"),
  2165   2027                                            wxDefaultPosition,
  2166   2028                                            wxDefaultSize);
  2167   2029     wxBoxSizer *sridBoxSizer = new wxStaticBoxSizer(sridBox, wxVERTICAL);
  2168   2030     xxSizer->Add(sridBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2169   2031     wxComboBox *sridList =
  2170   2032       new wxComboBox(this, ID_TOPONET_SRID, wxT(""), wxDefaultPosition,
  2171         -                   wxSize(350, 21), 0, NULL,
  2172         -                   wxCB_DROPDOWN | wxCB_READONLY);
         2033  +                   wxSize(350, 21), 0, NULL, wxCB_DROPDOWN | wxCB_READONLY);
  2173   2034     PopulateSRIDs(sridList);
  2174   2035     sridBoxSizer->Add(sridList, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2175   2036     wxStaticBox *stlBox = new wxStaticBox(this, wxID_STATIC,
  2176   2037                                           wxT("Style"),
  2177   2038                                           wxDefaultPosition,
  2178   2039                                           wxDefaultSize);
  2179   2040     wxBoxSizer *stlBoxSizer = new wxStaticBoxSizer(stlBox, wxVERTICAL);
  2180   2041     xxSizer->Add(stlBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2181   2042     wxComboBox *stlList =
  2182   2043       new wxComboBox(this, ID_TOPONET_STYLE, wxT(""), wxDefaultPosition,
  2183         -                   wxSize(350, 21), 0, NULL,
  2184         -                   wxCB_DROPDOWN | wxCB_READONLY);
         2044  +                   wxSize(350, 21), 0, NULL, wxCB_DROPDOWN | wxCB_READONLY);
  2185   2045     PopulateStyles(stlList);
  2186   2046     stlBoxSizer->Add(stlList, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2187   2047   // third row: Primitives Visibility
  2188   2048     wxStaticBox *visBox = new wxStaticBox(this, wxID_STATIC,
  2189   2049                                           wxT("TopoNet Primitives Visibility"),
  2190   2050                                           wxDefaultPosition,
  2191   2051                                           wxDefaultSize);
................................................................................
  2204   2064     wxCheckBox *nodeCtrl = new wxCheckBox(this, ID_TOPONET_NODE,
  2205   2065                                           wxT("Nodes"),
  2206   2066                                           wxDefaultPosition, wxDefaultSize);
  2207   2067     nodeCtrl->SetValue(config->AreNodesVisible());
  2208   2068     vis1BoxSizer->Add(nodeCtrl, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2209   2069     wxCheckBox *linkSeedCtrl = new wxCheckBox(this, ID_TOPONET_LINK_SEED,
  2210   2070                                               wxT("LinkSeeds"),
  2211         -                                            wxDefaultPosition,
  2212         -                                            wxDefaultSize);
         2071  +                                            wxDefaultPosition, wxDefaultSize);
  2213   2072     linkSeedCtrl->SetValue(config->AreLinkSeedsVisible());
  2214   2073     vis2BoxSizer->Add(linkSeedCtrl, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2215   2074   // Apply/Quit buttons  
  2216   2075     wxBoxSizer *buttonSizer = new wxBoxSizer(wxVERTICAL);
  2217   2076     rstSizer->Add(buttonSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2218   2077     wxButton *rst_ok = new wxButton(this, ID_TOPONET_OK, wxT("&Apply Changes"));
  2219   2078     buttonSizer->Add(rst_ok, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
................................................................................
  2268   2127        "WHERE c.coverage_name = %Q AND "
  2269   2128        "s.extent_miny IS NOT NULL AND s.extent_maxx IS NOT NULL AND "
  2270   2129        "s.extent_maxx IS NOT NULL ORDER BY s.srid", xdb_prefix, xdb_prefix,
  2271   2130        xdb_prefix, layer, xdb_prefix, xdb_prefix, xdb_prefix, layer);
  2272   2131     free(layer);
  2273   2132     free(xdb_prefix);
  2274   2133     ret =
  2275         -    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows,
  2276         -                      &columns, NULL);
         2134  +    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows, &columns,
         2135  +                      NULL);
  2277   2136     sqlite3_free(sql);
  2278   2137     if (ret != SQLITE_OK)
  2279   2138       return;
  2280   2139   
  2281   2140     for (int i = 1; i <= rows; i++)
  2282   2141       {
  2283   2142         // populating the list
................................................................................
  2304   2163   
  2305   2164     char *db_prefix = (char *) malloc((DbPrefix.Len() * 4) + 1);
  2306   2165     strcpy(db_prefix, DbPrefix.ToUTF8());
  2307   2166     char *xdb_prefix = gaiaDoubleQuotedSql(db_prefix);
  2308   2167     free(db_prefix);
  2309   2168     char *layer = (char *) malloc((LayerName.Len() * 4) + 1);
  2310   2169     strcpy(layer, LayerName.ToUTF8());
  2311         -  sql =
  2312         -    sqlite3_mprintf
  2313         -    ("SELECT s.style_name FROM \"%s\".vector_coverages AS r "
  2314         -     "JOIN \"%s\".SE_vector_styled_layers AS x ON (x.coverage_name = r.coverage_name) "
  2315         -     "JOIN \"%s\".SE_vector_styles AS s ON (s.style_id = x.style_id) "
  2316         -     "WHERE r.coverage_name = %Q ORDER BY s.style_name", xdb_prefix,
  2317         -     xdb_prefix, xdb_prefix, layer);
         2170  +  sql = sqlite3_mprintf("SELECT s.style_name FROM \"%s\".vector_coverages AS r "
         2171  +                        "JOIN \"%s\".SE_vector_styled_layers AS x ON (x.coverage_name = r.coverage_name) "
         2172  +                        "JOIN \"%s\".SE_vector_styles AS s ON (s.style_id = x.style_id) "
         2173  +                        "WHERE r.coverage_name = %Q ORDER BY s.style_name",
         2174  +                        xdb_prefix, xdb_prefix, xdb_prefix, layer);
  2318   2175     free(layer);
  2319   2176     free(xdb_prefix);
  2320   2177     ret =
  2321         -    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows,
  2322         -                      &columns, NULL);
         2178  +    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows, &columns,
         2179  +                      NULL);
  2323   2180     sqlite3_free(sql);
  2324   2181     if (ret != SQLITE_OK)
  2325   2182       return;
  2326   2183   
  2327   2184     for (int i = 1; i <= rows; i++)
  2328   2185       {
  2329   2186         // populating the list
................................................................................
  2342   2199         stlList->Append(str);
  2343   2200       }
  2344   2201   
  2345   2202     if (!has_default)
  2346   2203       stlList->Append(wxT("default"));
  2347   2204     if (stlList->GetSelection() == wxNOT_FOUND)
  2348   2205       {
  2349         -      for (int i = 0; i < (int) stlList->GetCount(); i++)
         2206  +      for (int i = 0; i < stlList->GetCount(); i++)
  2350   2207           {
  2351   2208             if (Style == NULL)
  2352   2209               {
  2353   2210                 if (stlList->GetString(i).Cmp(wxT("default")) == 0)
  2354   2211                   stlList->SetSelection(i);
  2355   2212             } else
  2356   2213               {
................................................................................
  2441   2298     if (Style != NULL)
  2442   2299       free(Style);
  2443   2300     Style = (char *) malloc((stl.Len() * 4) + 1);
  2444   2301     strcpy(Style, stl.ToUTF8());
  2445   2302     DoConfigureMapLayer();
  2446   2303     wxDialog::EndModal(wxID_OK);
  2447   2304   }
  2448         -
  2449         -bool VectorSqlSampleDialog::Create(MyMapPanel * parent, MapLayer * layer)
  2450         -{
  2451         -//
  2452         -// creating the dialog
  2453         -//
  2454         -  MainFrame = parent->GetParent();
  2455         -  MapPanel = parent;
  2456         -  Layer = layer;
  2457         -  DbPrefix = layer->GetDbPrefix();
  2458         -  LayerName = layer->GetName();
  2459         -  BgColor = wxColour(255, 255, 255);
  2460         -  if (wxDialog::Create
  2461         -      (parent, wxID_ANY, wxT("SQL sample: Map Request configuration")) == false)
  2462         -    return false;
  2463         -// populates individual controls
  2464         -  InitData();
  2465         -  CreateControls();
  2466         -// sets dialog sizer
  2467         -  GetSizer()->Fit(this);
  2468         -  GetSizer()->SetSizeHints(this);
  2469         -// centers the dialog window
  2470         -  Centre();
  2471         -  DoUpdateSql();
  2472         -  return true;
  2473         -}
  2474         -
  2475         -void VectorSqlSampleDialog::CreateControls()
  2476         -{
  2477         -//
  2478         -// creating individual control and setting initial values
  2479         -//
  2480         -  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
  2481         -  this->SetSizer(topSizer);
  2482         -  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
  2483         -  topSizer->Add(boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2484         -// First row: Layer name
  2485         -  wxBoxSizer *lyrBoxSizer = new wxBoxSizer(wxVERTICAL);
  2486         -  boxSizer->Add(lyrBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2487         -  wxBoxSizer *nameSizer = new wxBoxSizer(wxHORIZONTAL);
  2488         -  lyrBoxSizer->Add(nameSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2489         -  wxStaticBox *nameBox = new wxStaticBox(this, wxID_ANY,
  2490         -                                         wxT("Layer FullName"),
  2491         -                                         wxDefaultPosition,
  2492         -                                         wxDefaultSize);
  2493         -  wxBoxSizer *nameBoxSizer = new wxStaticBoxSizer(nameBox, wxHORIZONTAL);
  2494         -  nameSizer->Add(nameBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2495         -  wxString fullName = DbPrefix + wxT(".") + LayerName;
  2496         -  wxTextCtrl *nameCtrl = new wxTextCtrl(this, ID_VECTOR_LAYER, fullName,
  2497         -                                        wxDefaultPosition, wxSize(470, 22),
  2498         -                                        wxTE_READONLY);
  2499         -  nameBoxSizer->Add(nameCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2500         -// Second row: Vector options
  2501         -  wxBoxSizer *rstSizer = new wxBoxSizer(wxHORIZONTAL);
  2502         -  lyrBoxSizer->Add(rstSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2503         -  wxBoxSizer *xxSizer = new wxBoxSizer(wxVERTICAL);
  2504         -  rstSizer->Add(xxSizer, 0, wxALIGN_TOP | wxALL, 5);
  2505         -// Style
  2506         -  wxStaticBox *stlBox = new wxStaticBox(this, wxID_STATIC,
  2507         -                                        wxT("Style"),
  2508         -                                        wxDefaultPosition,
  2509         -                                        wxDefaultSize);
  2510         -  wxBoxSizer *stlBoxSizer = new wxStaticBoxSizer(stlBox, wxVERTICAL);
  2511         -  xxSizer->Add(stlBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2512         -  wxComboBox *stlList =
  2513         -    new wxComboBox(this, ID_VECTOR_STYLE, wxT(""), wxDefaultPosition,
  2514         -                   wxSize(350, 21), 0, NULL,
  2515         -                   wxCB_DROPDOWN | wxCB_READONLY);
  2516         -  PopulateStyles(stlList);
  2517         -  stlBoxSizer->Add(stlList, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2518         -// Third row: Image options
  2519         -  wxBoxSizer *imageSizer = new wxBoxSizer(wxHORIZONTAL);
  2520         -  boxSizer->Add(imageSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2521         -// MIME type
  2522         -  wxString mime[4];
  2523         -  mime[0] = wxT("&PNG");
  2524         -  mime[1] = wxT("&JPEG");
  2525         -  mime[2] = wxT("&TIFF");
  2526         -  mime[3] = wxT("PDF");
  2527         -  wxRadioBox *mimeBox = new wxRadioBox(this, ID_MIME_TYPE,
  2528         -                                       wxT("&MIME Type"),
  2529         -                                       wxDefaultPosition,
  2530         -                                       wxDefaultSize, 4,
  2531         -                                       mime, 2,
  2532         -                                       wxRA_SPECIFY_COLS);
  2533         -  imageSizer->Add(mimeBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2534         -  mimeBox->SetSelection(0);
  2535         -// image Quality
  2536         -  wxStaticBox *qtyBox = new wxStaticBox(this, wxID_STATIC,
  2537         -                                        wxT("Quality"),
  2538         -                                        wxDefaultPosition,
  2539         -                                        wxDefaultSize);
  2540         -  wxBoxSizer *qtyBoxSizer = new wxStaticBoxSizer(qtyBox, wxVERTICAL);
  2541         -  imageSizer->Add(qtyBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2542         -  wxSlider *qualityCtrl = new wxSlider(this, ID_IMAGE_QUALITY, 85, 0, 100,
  2543         -                                       wxDefaultPosition, wxSize(100, 50),
  2544         -                                       wxSL_HORIZONTAL | wxSL_LABELS);
  2545         -  qtyBoxSizer->Add(qualityCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2546         -  qualityCtrl->Enable(false);
  2547         -// Map background
  2548         -  wxStaticBox *bgBox = new wxStaticBox(this, wxID_STATIC,
  2549         -                                       wxT("Map Background"),
  2550         -                                       wxDefaultPosition,
  2551         -                                       wxDefaultSize);
  2552         -  wxBoxSizer *bg1Sizer = new wxStaticBoxSizer(bgBox, wxVERTICAL);
  2553         -  imageSizer->Add(bg1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2554         -  wxBoxSizer *bg2Sizer = new wxBoxSizer(wxHORIZONTAL);
  2555         -  bg1Sizer->Add(bg2Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2556         -  wxCheckBox *checkeredCtrl =
  2557         -    new wxCheckBox(this, ID_MAPOPT_CHECKERED_BACKGROUND,
  2558         -                   wxT("&Transparent"),
  2559         -                   wxDefaultPosition, wxDefaultSize);
  2560         -  checkeredCtrl->SetValue(true);
  2561         -  bg2Sizer->Add(checkeredCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2562         -  wxStaticBox *bgColorBox = new wxStaticBox(this, wxID_ANY,
  2563         -                                            wxT("Background Color"),
  2564         -                                            wxDefaultPosition,
  2565         -                                            wxDefaultSize);
  2566         -  wxBoxSizer *bgColorBoxSizer = new wxStaticBoxSizer(bgColorBox, wxHORIZONTAL);
  2567         -  bg2Sizer->Add(bgColorBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2568         -  wxBitmap bgColorBmp;
  2569         -  GetButtonBitmap(BgColor, bgColorBmp);
  2570         -  wxBitmapButton *bgColorCtrl =
  2571         -    new wxBitmapButton(this, ID_MAPOPT_SOLID_BACKGROUND, bgColorBmp);
  2572         -  bgColorCtrl->Enable(false);
  2573         -  bgColorBoxSizer->Add(bgColorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2574         -// SQL sample
  2575         -  wxStaticBox *sqlBox = new wxStaticBox(this, wxID_STATIC,
  2576         -                                        wxT("SQL sample"),
  2577         -                                        wxDefaultPosition,
  2578         -                                        wxDefaultSize);
  2579         -  wxBoxSizer *sqlSizer = new wxStaticBoxSizer(sqlBox, wxVERTICAL);
  2580         -  boxSizer->Add(sqlSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2581         -  wxTextCtrl *sqlCtrl = new wxTextCtrl(this, ID_SQL_SAMPLE, Sql,
  2582         -                                       wxDefaultPosition, wxSize(470, 100),
  2583         -                                       wxTE_MULTILINE | wxTE_WORDWRAP |
  2584         -                                       wxTE_READONLY);
  2585         -  sqlSizer->Add(sqlCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2586         -// buttons
  2587         -  wxBoxSizer *buttonSizer = new wxBoxSizer(wxHORIZONTAL);
  2588         -  boxSizer->Add(buttonSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2589         -  wxButton *rst_ok = new wxButton(this, ID_VECTOR_COPY, wxT("&Copy"));
  2590         -  buttonSizer->Add(rst_ok, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2591         -  wxButton *rst_quit = new wxButton(this, wxID_CANCEL, wxT("&Quit"));
  2592         -  buttonSizer->Add(rst_quit, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2593         -// appends event handlers
  2594         -  Connect(ID_VECTOR_COPY, wxEVT_COMMAND_BUTTON_CLICKED,
  2595         -          (wxObjectEventFunction) & VectorSqlSampleDialog::OnCopy);
  2596         -  Connect(wxID_CANCEL, wxEVT_COMMAND_BUTTON_CLICKED,
  2597         -          (wxObjectEventFunction) & VectorSqlSampleDialog::OnQuit);
  2598         -  Connect(ID_VECTOR_STYLE, wxEVT_COMMAND_COMBOBOX_SELECTED,
  2599         -          (wxObjectEventFunction) & VectorSqlSampleDialog::OnStyleChanged);
  2600         -  Connect(ID_MIME_TYPE, wxEVT_COMMAND_RADIOBOX_SELECTED,
  2601         -          (wxObjectEventFunction) & VectorSqlSampleDialog::OnMimeTypeChanged);
  2602         -  Connect(ID_IMAGE_QUALITY, wxEVT_SLIDER,
  2603         -          (wxObjectEventFunction) & VectorSqlSampleDialog::OnQualityChanged);
  2604         -  Connect(ID_MAPOPT_CHECKERED_BACKGROUND, wxEVT_COMMAND_CHECKBOX_CLICKED,
  2605         -          (wxObjectEventFunction) &
  2606         -          VectorSqlSampleDialog::OnTransparentChanged);
  2607         -  Connect(ID_MAPOPT_SOLID_BACKGROUND, wxEVT_COMMAND_BUTTON_CLICKED,
  2608         -          (wxObjectEventFunction) & VectorSqlSampleDialog::OnBackgroundChanged);
  2609         -}
  2610         -
  2611         -void VectorSqlSampleDialog::GetButtonBitmap(wxColour & bgcolor, wxBitmap & bmp)
  2612         -{
  2613         -// creating a Bitmap representing some Color
  2614         -  bmp = wxBitmap(96, 18);
  2615         -  wxMemoryDC *dc = new wxMemoryDC(bmp);
  2616         -  dc->SetBrush(wxBrush(bgcolor));
  2617         -  dc->DrawRectangle(-1, -1, 98, 20);
  2618         -  delete dc;
  2619         -}
  2620         -
  2621         -void VectorSqlSampleDialog::InitData()
  2622         -{
  2623         -// initializing the current configuration
  2624         -  int len;
  2625         -  VectorLayerConfig *config = Layer->GetVectorConfig();
  2626         -  Style = NULL;
  2627         -  if (config->GetStyle() != NULL)
  2628         -    {
  2629         -      len = strlen(config->GetStyle());
  2630         -      Style = (char *) malloc(len + 1);
  2631         -      strcpy(Style, config->GetStyle());
  2632         -    }
  2633         -}
  2634         -
  2635         -void VectorSqlSampleDialog::PopulateStyles(wxComboBox * stlList)
  2636         -{
  2637         -// populating the Styles List
  2638         -  int ret;
  2639         -  char *sql;
  2640         -  char **results;
  2641         -  int rows;
  2642         -  int columns;
  2643         -  int has_default = 0;
  2644         -
  2645         -  char *db_prefix = (char *) malloc((DbPrefix.Len() * 4) + 1);
  2646         -  strcpy(db_prefix, DbPrefix.ToUTF8());
  2647         -  char *xdb_prefix = gaiaDoubleQuotedSql(db_prefix);
  2648         -  free(db_prefix);
  2649         -  char *layer = (char *) malloc((LayerName.Len() * 4) + 1);
  2650         -  strcpy(layer, LayerName.ToUTF8());
  2651         -  sql =
  2652         -    sqlite3_mprintf
  2653         -    ("SELECT s.style_name FROM \"%s\".vector_coverages AS r "
  2654         -     "JOIN \"%s\".SE_vector_styled_layers AS x ON (x.coverage_name = r.coverage_name) "
  2655         -     "JOIN \"%s\".SE_vector_styles AS s ON (s.style_id = x.style_id) "
  2656         -     "WHERE r.coverage_name = %Q ORDER BY s.style_name", xdb_prefix,
  2657         -     xdb_prefix, xdb_prefix, layer);
  2658         -  free(layer);
  2659         -  free(xdb_prefix);
  2660         -  ret =
  2661         -    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows,
  2662         -                      &columns, NULL);
  2663         -  sqlite3_free(sql);
  2664         -  if (ret != SQLITE_OK)
  2665         -    return;
  2666         -
  2667         -  for (int i = 1; i <= rows; i++)
  2668         -    {
  2669         -      // populating the list
  2670         -      const char *style = results[(i * columns) + 0];
  2671         -      if (strcasecmp(style, "default") == 0)
  2672         -        has_default = 1;
  2673         -      wxString str = wxString::FromUTF8(style);
  2674         -      stlList->Append(str);
  2675         -    }
  2676         -  sqlite3_free_table(results);
  2677         -
  2678         -  if (!has_default)
  2679         -    stlList->Append(wxT("default"));
  2680         -  if (stlList->GetSelection() == wxNOT_FOUND)
  2681         -    {
  2682         -      for (int i = 0; i < (int) stlList->GetCount(); i++)
  2683         -        {
  2684         -          if (Style == NULL)
  2685         -            {
  2686         -              if (stlList->GetString(i).Cmp(wxT("default")) == 0)
  2687         -                stlList->SetSelection(i);
  2688         -          } else
  2689         -            {
  2690         -              if (stlList->GetString(i).Cmp(wxString::FromUTF8(Style)) == 0)
  2691         -                stlList->SetSelection(i);
  2692         -            }
  2693         -        }
  2694         -    }
  2695         -  if (stlList->GetSelection() == wxNOT_FOUND)
  2696         -    {
  2697         -      // the current Style probably is a QuickStyle
  2698         -      free(Style);
  2699         -      Style = NULL;
  2700         -      for (int i = 0; i < (int) stlList->GetCount(); i++)
  2701         -        {
  2702         -          if (stlList->GetString(i).Cmp(wxT("default")) == 0)
  2703         -            stlList->SetSelection(i);
  2704         -        }
  2705         -    }
  2706         -}
  2707         -
  2708         -void VectorSqlSampleDialog::DoUpdateSql()
  2709         -{
  2710         -//
  2711         -// updating the SQL query
  2712         -//
  2713         -  char *str;
  2714         -  char *buf;
  2715         -  wxString col;
  2716         -  wxTextCtrl *sqlCtrl = (wxTextCtrl *) FindWindow(ID_SQL_SAMPLE);
  2717         -  wxComboBox *stlList = (wxComboBox *) FindWindow(ID_VECTOR_STYLE);
  2718         -  wxRadioBox *mimeBox = (wxRadioBox *) FindWindow(ID_MIME_TYPE);
  2719         -  wxCheckBox *transparentCtrl =
  2720         -    (wxCheckBox *) FindWindow(ID_MAPOPT_CHECKERED_BACKGROUND);
  2721         -  wxSlider *qualityCtrl = (wxSlider *) FindWindow(ID_IMAGE_QUALITY);
  2722         -  Sql = wxT("SELECT RL2_GetMapImageFromVector(");
  2723         -  if (DbPrefix.Len() == 0)
  2724         -    Sql += wxT("NULL, ");
  2725         -  else
  2726         -    {
  2727         -      str = (char *) malloc((DbPrefix.Len() * 4) + 1);
  2728         -      strcpy(str, DbPrefix.ToUTF8());
  2729         -      buf = sqlite3_mprintf("%Q, ", str);
  2730         -      free(str);
  2731         -      col = wxString::FromUTF8(buf);
  2732         -      sqlite3_free(buf);
  2733         -      Sql += col;
  2734         -    }
  2735         -// coverage name
  2736         -  str = (char *) malloc((LayerName.Len() * 4) + 1);
  2737         -  strcpy(str, LayerName.ToUTF8());
  2738         -  buf = sqlite3_mprintf("%Q, ", str);
  2739         -  free(str);
  2740         -  col = wxString::FromUTF8(buf);
  2741         -  sqlite3_free(buf);
  2742         -  Sql += col;
  2743         -// bounding box
  2744         -  wxString bbox;
  2745         -  MapPanel->DoPrepareBBox(bbox);
  2746         -  Sql += bbox;
  2747         -// image width and height
  2748         -  buf =
  2749         -    sqlite3_mprintf("%d, %d, ", MapPanel->GetImageWidth(),
  2750         -                    MapPanel->GetImageHeight());
  2751         -  col = wxString::FromUTF8(buf);
  2752         -  sqlite3_free(buf);
  2753         -  Sql += col;
  2754         -// style
  2755         -  wxString style = stlList->GetValue();
  2756         -  if (style.Len() == 0)
  2757         -    Sql += wxT("'default', ");
  2758         -  else
  2759         -    {
  2760         -      str = (char *) malloc((style.Len() * 4) + 1);
  2761         -      strcpy(str, style.ToUTF8());
  2762         -      buf = sqlite3_mprintf("%Q, ", str);
  2763         -      free(str);
  2764         -      col = wxString::FromUTF8(buf);
  2765         -      sqlite3_free(buf);
  2766         -      Sql += col;
  2767         -    }
  2768         -// MIME type
  2769         -  switch (mimeBox->GetSelection())
  2770         -    {
  2771         -      case 1:
  2772         -        Sql += wxT("'image/jpeg', ");
  2773         -        break;
  2774         -      case 2:
  2775         -        Sql += wxT("'image/tiff', ");
  2776         -        break;
  2777         -      case 3:
  2778         -        Sql += wxT("'application/x-pdf', ");
  2779         -        break;
  2780         -      default:
  2781         -        Sql += wxT("'image/png', ");
  2782         -        break;
  2783         -    };
  2784         -// bgColor
  2785         -  buf =
  2786         -    sqlite3_mprintf("'#%02x%02x%02x', ", BgColor.Red(), BgColor.Green(),
  2787         -                    BgColor.Blue());
  2788         -  col = wxString::FromUTF8(buf);
  2789         -  sqlite3_free(buf);
  2790         -  Sql += col;
  2791         -// transparent
  2792         -  if (transparentCtrl->GetValue())
  2793         -    Sql += wxT("1, ");
  2794         -  else
  2795         -    Sql += wxT("0, ");
  2796         -// quality
  2797         -  if (mimeBox->GetSelection() == 1)
  2798         -    {
  2799         -      buf = sqlite3_mprintf("%d", qualityCtrl->GetValue());
  2800         -      col = wxString::FromUTF8(buf);
  2801         -      sqlite3_free(buf);
  2802         -      Sql += col;
  2803         -  } else
  2804         -    Sql += wxT("100");
  2805         -  Sql += wxT(");");
  2806         -  sqlCtrl->SetValue(Sql);
  2807         -}
  2808         -
  2809         -void VectorSqlSampleDialog::OnStyleChanged(wxCommandEvent & WXUNUSED(event))
  2810         -{
  2811         -//
  2812         -// Style selection changed
  2813         -//
  2814         -  DoUpdateSql();
  2815         -}
  2816         -
  2817         -void VectorSqlSampleDialog::OnMimeTypeChanged(wxCommandEvent & WXUNUSED(event))
  2818         -{
  2819         -//
  2820         -// MIME Type selection changed
  2821         -//
  2822         -  wxRadioBox *mimeBox = (wxRadioBox *) FindWindow(ID_MIME_TYPE);
  2823         -  wxSlider *qualityCtrl = (wxSlider *) FindWindow(ID_IMAGE_QUALITY);
  2824         -  if (mimeBox->GetSelection() == 1)
  2825         -    qualityCtrl->Enable(true);
  2826         -  else
  2827         -    qualityCtrl->Enable(false);
  2828         -  DoUpdateSql();
  2829         -}
  2830         -
  2831         -void VectorSqlSampleDialog::OnQualityChanged(wxCommandEvent & WXUNUSED(event))
  2832         -{
  2833         -//
  2834         -// Image Quality selection changed
  2835         -//
  2836         -  DoUpdateSql();
  2837         -}
  2838         -
  2839         -void
  2840         -  VectorSqlSampleDialog::OnTransparentChanged(wxCommandEvent & WXUNUSED(event))
  2841         -{
  2842         -//
  2843         -// Transparent Background selection changed
  2844         -//
  2845         -  wxCheckBox *transparentCtrl =
  2846         -    (wxCheckBox *) FindWindow(ID_MAPOPT_CHECKERED_BACKGROUND);
  2847         -  wxBitmapButton *btn =
  2848         -    (wxBitmapButton *) FindWindow(ID_MAPOPT_SOLID_BACKGROUND);
  2849         -  if (transparentCtrl->GetValue() == false)
  2850         -    btn->Enable(true);
  2851         -  else
  2852         -    btn->Enable(false);
  2853         -  DoUpdateSql();
  2854         -}
  2855         -
  2856         -void
  2857         -  VectorSqlSampleDialog::OnBackgroundChanged(wxCommandEvent & WXUNUSED(event))
  2858         -{
  2859         -// Map Background Solid Color selection
  2860         -  wxColourData initColor;
  2861         -  int ret;
  2862         -  initColor.SetChooseFull(false);
  2863         -  initColor.SetColour(BgColor);
  2864         -  wxColourDialog colorDialog(this, &initColor);
  2865         -  ret = colorDialog.ShowModal();
  2866         -  if (ret == wxID_OK)
  2867         -    {
  2868         -      wxColourData colorData = colorDialog.GetColourData();
  2869         -      BgColor = colorData.GetColour();
  2870         -      wxBitmap bmp;
  2871         -      GetButtonBitmap(BgColor, bmp);
  2872         -      wxBitmapButton *btn =
  2873         -        (wxBitmapButton *) FindWindow(ID_MAPOPT_SOLID_BACKGROUND);
  2874         -      btn->SetBitmapLabel(bmp);
  2875         -      DoUpdateSql();
  2876         -    }
  2877         -}
  2878         -
  2879         -void VectorSqlSampleDialog::OnCopy(wxCommandEvent & WXUNUSED(event))
  2880         -{
  2881         -//
  2882         -// Copying the Map Request (SQL statement) 
  2883         -//
  2884         -  if (wxTheClipboard->Open())
  2885         -    {
  2886         -      wxTheClipboard->SetData(new wxTextDataObject(Sql));
  2887         -      wxTheClipboard->Close();
  2888         -    }
  2889         -}
  2890         -
  2891         -void VectorSqlSampleDialog::OnQuit(wxCommandEvent & WXUNUSED(event))
  2892         -{
  2893         -//
  2894         -// all done: 
  2895         -//
  2896         -  wxDialog::EndModal(wxID_CANCEL);
  2897         -}
  2898         -
  2899         -bool RasterSqlSampleDialog::Create(MyMapPanel * parent, MapLayer * layer)
  2900         -{
  2901         -//
  2902         -// creating the dialog
  2903         -//
  2904         -  MainFrame = parent->GetParent();
  2905         -  MapPanel = parent;
  2906         -  Layer = layer;
  2907         -  DbPrefix = layer->GetDbPrefix();
  2908         -  LayerName = layer->GetName();
  2909         -  BgColor = wxColour(255, 255, 255);
  2910         -  if (wxDialog::Create
  2911         -      (parent, wxID_ANY, wxT("SQL sample: Map Request configuration")) == false)
  2912         -    return false;
  2913         -// populates individual controls
  2914         -  InitData();
  2915         -  CreateControls();
  2916         -// sets dialog sizer
  2917         -  GetSizer()->Fit(this);
  2918         -  GetSizer()->SetSizeHints(this);
  2919         -// centers the dialog window
  2920         -  Centre();
  2921         -  DoUpdateSql();
  2922         -  return true;
  2923         -}
  2924         -
  2925         -void RasterSqlSampleDialog::CreateControls()
  2926         -{
  2927         -//
  2928         -// creating individual control and setting initial values
  2929         -//
  2930         -  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
  2931         -  this->SetSizer(topSizer);
  2932         -  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
  2933         -  topSizer->Add(boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2934         -// First row: Layer name
  2935         -  wxBoxSizer *lyrBoxSizer = new wxBoxSizer(wxVERTICAL);
  2936         -  boxSizer->Add(lyrBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2937         -  wxBoxSizer *nameSizer = new wxBoxSizer(wxHORIZONTAL);
  2938         -  lyrBoxSizer->Add(nameSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2939         -  wxStaticBox *nameBox = new wxStaticBox(this, wxID_ANY,
  2940         -                                         wxT("Layer FullName"),
  2941         -                                         wxDefaultPosition,
  2942         -                                         wxDefaultSize);
  2943         -  wxBoxSizer *nameBoxSizer = new wxStaticBoxSizer(nameBox, wxHORIZONTAL);
  2944         -  nameSizer->Add(nameBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2945         -  wxString fullName = DbPrefix + wxT(".") + LayerName;
  2946         -  wxTextCtrl *nameCtrl = new wxTextCtrl(this, ID_VECTOR_LAYER, fullName,
  2947         -                                        wxDefaultPosition, wxSize(470, 22),
  2948         -                                        wxTE_READONLY);
  2949         -  nameBoxSizer->Add(nameCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2950         -// Second row: Raster options
  2951         -  wxBoxSizer *rstSizer = new wxBoxSizer(wxHORIZONTAL);
  2952         -  lyrBoxSizer->Add(rstSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2953         -  wxBoxSizer *xxSizer = new wxBoxSizer(wxVERTICAL);
  2954         -  rstSizer->Add(xxSizer, 0, wxALIGN_TOP | wxALL, 5);
  2955         -// Style
  2956         -  wxStaticBox *stlBox = new wxStaticBox(this, wxID_STATIC,
  2957         -                                        wxT("Style"),
  2958         -                                        wxDefaultPosition,
  2959         -                                        wxDefaultSize);
  2960         -  wxBoxSizer *stlBoxSizer = new wxStaticBoxSizer(stlBox, wxVERTICAL);
  2961         -  xxSizer->Add(stlBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2962         -  wxComboBox *stlList =
  2963         -    new wxComboBox(this, ID_VECTOR_STYLE, wxT(""), wxDefaultPosition,
  2964         -                   wxSize(350, 21), 0, NULL,
  2965         -                   wxCB_DROPDOWN | wxCB_READONLY);
  2966         -  PopulateStyles(stlList);
  2967         -  stlBoxSizer->Add(stlList, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2968         -// Third row: Image options
  2969         -  wxBoxSizer *imageSizer = new wxBoxSizer(wxHORIZONTAL);
  2970         -  boxSizer->Add(imageSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2971         -// MIME type
  2972         -  wxString mime[4];
  2973         -  mime[0] = wxT("&PNG");
  2974         -  mime[1] = wxT("&JPEG");
  2975         -  mime[2] = wxT("&TIFF");
  2976         -  mime[3] = wxT("PDF");
  2977         -  wxRadioBox *mimeBox = new wxRadioBox(this, ID_MIME_TYPE,
  2978         -                                       wxT("&MIME Type"),
  2979         -                                       wxDefaultPosition,
  2980         -                                       wxDefaultSize, 4,
  2981         -                                       mime, 2,
  2982         -                                       wxRA_SPECIFY_COLS);
  2983         -  imageSizer->Add(mimeBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2984         -  mimeBox->SetSelection(0);
  2985         -// image Quality
  2986         -  wxStaticBox *qtyBox = new wxStaticBox(this, wxID_STATIC,
  2987         -                                        wxT("Quality"),
  2988         -                                        wxDefaultPosition,
  2989         -                                        wxDefaultSize);
  2990         -  wxBoxSizer *qtyBoxSizer = new wxStaticBoxSizer(qtyBox, wxVERTICAL);
  2991         -  imageSizer->Add(qtyBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2992         -  wxSlider *qualityCtrl = new wxSlider(this, ID_IMAGE_QUALITY, 85, 0, 100,
  2993         -                                       wxDefaultPosition, wxSize(100, 50),
  2994         -                                       wxSL_HORIZONTAL | wxSL_LABELS);
  2995         -  qtyBoxSizer->Add(qualityCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2996         -  qualityCtrl->Enable(false);
  2997         -// Map background
  2998         -  wxStaticBox *bgBox = new wxStaticBox(this, wxID_STATIC,
  2999         -                                       wxT("Map Background"),
  3000         -                                       wxDefaultPosition,
  3001         -                                       wxDefaultSize);
  3002         -  wxBoxSizer *bg1Sizer = new wxStaticBoxSizer(bgBox, wxVERTICAL);
  3003         -  imageSizer->Add(bg1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  3004         -  wxBoxSizer *bg2Sizer = new wxBoxSizer(wxHORIZONTAL);
  3005         -  bg1Sizer->Add(bg2Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  3006         -  wxCheckBox *checkeredCtrl =
  3007         -    new wxCheckBox(this, ID_MAPOPT_CHECKERED_BACKGROUND,
  3008         -                   wxT("&Transparent"),
  3009         -                   wxDefaultPosition, wxDefaultSize);
  3010         -  checkeredCtrl->SetValue(true);
  3011         -  bg2Sizer->Add(checkeredCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  3012         -  wxStaticBox *bgColorBox = new wxStaticBox(this, wxID_ANY,
  3013         -                                            wxT("Background Color"),
  3014         -                                            wxDefaultPosition,
  3015         -                                            wxDefaultSize);
  3016         -  wxBoxSizer *bgColorBoxSizer = new wxStaticBoxSizer(bgColorBox, wxHORIZONTAL);
  3017         -  bg2Sizer->Add(bgColorBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  3018         -  wxBitmap bgColorBmp;
  3019         -  GetButtonBitmap(BgColor, bgColorBmp);
  3020         -  wxBitmapButton *bgColorCtrl =
  3021         -    new wxBitmapButton(this, ID_MAPOPT_SOLID_BACKGROUND, bgColorBmp);
  3022         -  bgColorCtrl->Enable(false);
  3023         -  bgColorBoxSizer->Add(bgColorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  3024         -// SQL sample
  3025         -  wxStaticBox *sqlBox = new wxStaticBox(this, wxID_STATIC,
  3026         -                                        wxT("SQL sample"),
  3027         -                                        wxDefaultPosition,
  3028         -                                        wxDefaultSize);
  3029         -  wxBoxSizer *sqlSizer = new wxStaticBoxSizer(sqlBox, wxVERTICAL);
  3030         -  boxSizer->Add(sqlSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  3031         -  wxTextCtrl *sqlCtrl = new wxTextCtrl(this, ID_SQL_SAMPLE, Sql,
  3032         -                                       wxDefaultPosition, wxSize(470, 100),
  3033         -                                       wxTE_MULTILINE | wxTE_WORDWRAP |
  3034         -                                       wxTE_READONLY);
  3035         -  sqlSizer->Add(sqlCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  3036         -// buttons
  3037         -  wxBoxSizer *buttonSizer = new wxBoxSizer(wxHORIZONTAL);
  3038         -  boxSizer->Add(buttonSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  3039         -  wxButton *rst_ok = new wxButton(this, ID_VECTOR_COPY, wxT("&Copy"));
  3040         -  buttonSizer->Add(rst_ok, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  3041         -  wxButton *rst_quit = new wxButton(this, wxID_CANCEL, wxT("&Quit"));
  3042         -  buttonSizer->Add(rst_quit, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  3043         -// appends event handlers
  3044         -  Connect(ID_VECTOR_COPY, wxEVT_COMMAND_BUTTON_CLICKED,
  3045         -          (wxObjectEventFunction) & RasterSqlSampleDialog::OnCopy);
  3046         -  Connect(wxID_CANCEL, wxEVT_COMMAND_BUTTON_CLICKED,
  3047         -          (wxObjectEventFunction) & RasterSqlSampleDialog::OnQuit);
  3048         -  Connect(ID_VECTOR_STYLE, wxEVT_COMMAND_COMBOBOX_SELECTED,
  3049         -          (wxObjectEventFunction) & RasterSqlSampleDialog::OnStyleChanged);
  3050         -  Connect(ID_MIME_TYPE, wxEVT_COMMAND_RADIOBOX_SELECTED,
  3051         -          (wxObjectEventFunction) & RasterSqlSampleDialog::OnMimeTypeChanged);
  3052         -  Connect(ID_IMAGE_QUALITY, wxEVT_SLIDER,
  3053         -          (wxObjectEventFunction) & RasterSqlSampleDialog::OnQualityChanged);
  3054         -  Connect(ID_MAPOPT_CHECKERED_BACKGROUND, wxEVT_COMMAND_CHECKBOX_CLICKED,
  3055         -          (wxObjectEventFunction) &
  3056         -          RasterSqlSampleDialog::OnTransparentChanged);
  3057         -  Connect(ID_MAPOPT_SOLID_BACKGROUND, wxEVT_COMMAND_BUTTON_CLICKED,
  3058         -          (wxObjectEventFunction) & RasterSqlSampleDialog::OnBackgroundChanged);
  3059         -}
  3060         -
  3061         -void RasterSqlSampleDialog::GetButtonBitmap(wxColour & bgcolor, wxBitmap & bmp)
  3062         -{
  3063         -// creating a Bitmap representing some Color
  3064         -  bmp = wxBitmap(96, 18);
  3065         -  wxMemoryDC *dc = new wxMemoryDC(bmp);
  3066         -  dc->SetBrush(wxBrush(bgcolor));
  3067         -  dc->DrawRectangle(-1, -1, 98, 20);
  3068         -  delete dc;
  3069         -}
  3070         -
  3071         -void RasterSqlSampleDialog::InitData()
  3072         -{
  3073         -// initializing the current configuration
  3074         -  int len;
  3075         -  RasterLayerConfig *config = Layer->GetRasterConfig();
  3076         -  Style = NULL;
  3077         -  if (config->GetStyle() != NULL)
  3078         -    {
  3079         -      len = strlen(config->GetStyle());
  3080         -      Style = (char *) malloc(len + 1);
  3081         -      strcpy(Style, config->GetStyle());
  3082         -    }
  3083         -}
  3084         -
  3085         -void RasterSqlSampleDialog::PopulateStyles(wxComboBox * stlList)
  3086         -{
  3087         -// populating the Styles List
  3088         -  int ret;
  3089         -  char *sql;
  3090         -  char **results;
  3091         -  int rows;
  3092         -  int columns;
  3093         -  int has_default = 0;
  3094         -
  3095         -  char *db_prefix = (char *) malloc((DbPrefix.Len() * 4) + 1);
  3096         -  strcpy(db_prefix, DbPrefix.ToUTF8());
  3097         -  char *xdb_prefix = gaiaDoubleQuotedSql(db_prefix);
  3098         -  free(db_prefix);
  3099         -  char *layer = (char *) malloc((LayerName.Len() * 4) + 1);
  3100         -  strcpy(layer, LayerName.ToUTF8());
  3101         -  sql =
  3102         -    sqlite3_mprintf
  3103         -    ("SELECT s.style_name FROM \"%s\".raster_coverages AS r "
  3104         -     "JOIN \"%s\".SE_raster_styled_layers AS x ON (x.coverage_name = r.coverage_name) "
  3105         -     "JOIN \"%s\".SE_raster_styles AS s ON (s.style_id = x.style_id) "
  3106         -     "WHERE r.coverage_name = %Q ORDER BY s.style_name", xdb_prefix,
  3107         -     xdb_prefix, xdb_prefix, layer);
  3108         -  free(layer);
  3109         -  free(xdb_prefix);
  3110         -  ret =
  3111         -    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows,
  3112         -                      &columns, NULL);
  3113         -  sqlite3_free(sql);
  3114         -  if (ret != SQLITE_OK)
  3115         -    return;
  3116         -
  3117         -  for (int i = 1; i <= rows; i++)
  3118         -    {
  3119         -      // populating the list
  3120         -      const char *style = results[(i * columns) + 0];
  3121         -      if (strcasecmp(style, "default") == 0)
  3122         -        has_default = 1;
  3123         -      wxString str = wxString::FromUTF8(style);
  3124         -      stlList->Append(str);
  3125         -    }
  3126         -  sqlite3_free_table(results);
  3127         -
  3128         -  if (!has_default)
  3129         -    stlList->Append(wxT("default"));
  3130         -  if (stlList->GetSelection() == wxNOT_FOUND)
  3131         -    {
  3132         -      for (int i = 0; i < (int) stlList->GetCount(); i++)
  3133         -        {
  3134         -          if (Style == NULL)
  3135         -            {
  3136         -              if (stlList->GetString(i).Cmp(wxT("default")) == 0)
  3137         -                stlList->SetSelection(i);
  3138         -          } else
  3139         -            {
  3140         -              if (stlList->GetString(i).Cmp(wxString::FromUTF8(Style)) == 0)
  3141         -                stlList->SetSelection(i);
  3142         -            }
  3143         -        }
  3144         -    }
  3145         -  if (stlList->GetSelection() == wxNOT_FOUND)
  3146         -    {
  3147         -      // the current Style probably is a QuickStyle
  3148         -      free(Style);
  3149         -      Style = NULL;
  3150         -      for (int i = 0; i < (int) stlList->GetCount(); i++)
  3151         -        {
  3152         -          if (stlList->GetString(i).Cmp(wxT("default")) == 0)
  3153         -            stlList->SetSelection(i);
  3154         -        }
  3155         -    }
  3156         -}
  3157         -
  3158         -void RasterSqlSampleDialog::DoUpdateSql()
  3159         -{
  3160         -//
  3161         -// updating the SQL query
  3162         -//
  3163         -  char *str;
  3164         -  char *buf;
  3165         -  wxString col;
  3166         -  wxTextCtrl *sqlCtrl = (wxTextCtrl *) FindWindow(ID_SQL_SAMPLE);
  3167         -  wxComboBox *stlList = (wxComboBox *) FindWindow(ID_VECTOR_STYLE);
  3168         -  wxRadioBox *mimeBox = (wxRadioBox *) FindWindow(ID_MIME_TYPE);
  3169         -  wxCheckBox *transparentCtrl =
  3170         -    (wxCheckBox *) FindWindow(ID_MAPOPT_CHECKERED_BACKGROUND);
  3171         -  wxSlider *qualityCtrl = (wxSlider *) FindWindow(ID_IMAGE_QUALITY);
  3172         -  Sql = wxT("SELECT RL2_GetMapImageFromRaster(");
  3173         -  if (DbPrefix.Len() == 0)
  3174         -    Sql += wxT("NULL, ");
  3175         -  else
  3176         -    {
  3177         -      str = (char *) malloc((DbPrefix.Len() * 4) + 1);
  3178         -      strcpy(str, DbPrefix.ToUTF8());
  3179         -      buf = sqlite3_mprintf("%Q, ", str);
  3180         -      free(str);
  3181         -      col = wxString::FromUTF8(buf);
  3182         -      sqlite3_free(buf);
  3183         -      Sql += col;
  3184         -    }
  3185         -// coverage name
  3186         -  str = (char *) malloc((LayerName.Len() * 4) + 1);
  3187         -  strcpy(str, LayerName.ToUTF8());
  3188         -  buf = sqlite3_mprintf("%Q, ", str);
  3189         -  free(str);
  3190         -  col = wxString::FromUTF8(buf);
  3191         -  sqlite3_free(buf);
  3192         -  Sql += col;
  3193         -// bounding box
  3194         -  wxString bbox;
  3195         -  MapPanel->DoPrepareBBox(bbox);
  3196         -  Sql += bbox;
  3197         -// image width and height
  3198         -  buf =
  3199         -    sqlite3_mprintf("%d, %d, ", MapPanel->GetImageWidth(),
  3200         -                    MapPanel->GetImageHeight());
  3201         -  col = wxString::FromUTF8(buf);
  3202         -  sqlite3_free(buf);
  3203         -  Sql += col;
  3204         -// style
  3205         -  wxString style = stlList->GetValue();
  3206         -  if (style.Len() == 0)
  3207         -    Sql += wxT("'default', ");
  3208         -  else
  3209         -    {
  3210         -      str = (char *) malloc((style.Len() * 4) + 1);
  3211         -      strcpy(str, style.ToUTF8());
  3212         -      buf = sqlite3_mprintf("%Q, ", str);
  3213         -      free(str);
  3214         -      col = wxString::FromUTF8(buf);
  3215         -      sqlite3_free(buf);
  3216         -      Sql += col;
  3217         -    }
  3218         -// MIME type
  3219         -  switch (mimeBox->GetSelection())
  3220         -    {
  3221         -      case 1:
  3222         -        Sql += wxT("'image/jpeg', ");
  3223         -        break;
  3224         -      case 2:
  3225         -        Sql += wxT("'image/tiff', ");
  3226         -        break;
  3227         -      case 3:
  3228         -        Sql += wxT("'application/x-pdf', ");
  3229         -        break;
  3230         -      default:
  3231         -        Sql += wxT("'image/png', ");
  3232         -        break;
  3233         -    };
  3234         -// bgColor
  3235         -  buf =
  3236         -    sqlite3_mprintf("'#%02x%02x%02x', ", BgColor.Red(), BgColor.Green(),
  3237         -                    BgColor.Blue());
  3238         -  col = wxString::FromUTF8(buf);
  3239         -  sqlite3_free(buf);
  3240         -  Sql += col;
  3241         -// transparent
  3242         -  if (transparentCtrl->GetValue())
  3243         -    Sql += wxT("1, ");
  3244         -  else
  3245         -    Sql += wxT("0, ");
  3246         -// quality
  3247         -  if (mimeBox->GetSelection() == 1)
  3248         -    {
  3249         -      buf = sqlite3_mprintf("%d", qualityCtrl->GetValue());
  3250         -      col = wxString::FromUTF8(buf);
  3251         -      sqlite3_free(buf);
  3252         -      Sql += col;
  3253         -  } else
  3254         -    Sql += wxT("100");
  3255         -  Sql += wxT(");");
  3256         -  sqlCtrl->SetValue(Sql);
  3257         -}
  3258         -
  3259         -void RasterSqlSampleDialog::OnStyleChanged(wxCommandEvent & WXUNUSED(event))
  3260         -{
  3261         -//
  3262         -// Style selection changed
  3263         -//
  3264         -  DoUpdateSql();
  3265         -}
  3266         -
  3267         -void RasterSqlSampleDialog::OnMimeTypeChanged(wxCommandEvent & WXUNUSED(event))
  3268         -{
  3269         -//
  3270         -// MIME Type selection changed
  3271         -//
  3272         -  wxRadioBox *mimeBox = (wxRadioBox *) FindWindow(ID_MIME_TYPE);
  3273         -  wxSlider *qualityCtrl = (wxSlider *) FindWindow(ID_IMAGE_QUALITY);
  3274         -  if (mimeBox->GetSelection() == 1)
  3275         -    qualityCtrl->Enable(true);
  3276         -  else
  3277         -    qualityCtrl->Enable(false);
  3278         -  DoUpdateSql();
  3279         -}
  3280         -
  3281         -void RasterSqlSampleDialog::OnQualityChanged(wxCommandEvent & WXUNUSED(event))
  3282         -{
  3283         -//
  3284         -// Image Quality selection changed
  3285         -//
  3286         -  DoUpdateSql();
  3287         -}
  3288         -
  3289         -void
  3290         -  RasterSqlSampleDialog::OnTransparentChanged(wxCommandEvent & WXUNUSED(event))
  3291         -{
  3292         -//
  3293         -// Transparent Background selection changed
  3294         -//
  3295         -  wxCheckBox *transparentCtrl =
  3296         -    (wxCheckBox *) FindWindow(ID_MAPOPT_CHECKERED_BACKGROUND);
  3297         -  wxBitmapButton *btn =
  3298         -    (wxBitmapButton *) FindWindow(ID_MAPOPT_SOLID_BACKGROUND);
  3299         -  if (transparentCtrl->GetValue() == false)
  3300         -    btn->Enable(true);
  3301         -  else
  3302         -    btn->Enable(false);
  3303         -  DoUpdateSql();
  3304         -}
  3305         -
  3306         -void
  3307         -  RasterSqlSampleDialog::OnBackgroundChanged(wxCommandEvent & WXUNUSED(event))
  3308         -{
  3309         -// Map Background Solid Color selection
  3310         -  wxColourData initColor;
  3311         -  int ret;
  3312         -  initColor.SetChooseFull(false);
  3313         -  initColor.SetColour(BgColor);
  3314         -  wxColourDialog colorDialog(this, &initColor);
  3315         -  ret = colorDialog.ShowModal();
  3316         -  if (ret == wxID_OK)
  3317         -    {
  3318         -      wxColourData colorData = colorDialog.GetColourData();
  3319         -      BgColor = colorData.GetColour();
  3320         -      wxBitmap bmp;
  3321         -      GetButtonBitmap(BgColor, bmp);
  3322         -      wxBitmapButton *btn =
  3323         -        (wxBitmapButton *) FindWindow(ID_MAPOPT_SOLID_BACKGROUND);
  3324         -      btn->SetBitmapLabel(bmp);
  3325         -      DoUpdateSql();
  3326         -    }
  3327         -}
  3328         -
  3329         -void RasterSqlSampleDialog::OnCopy(wxCommandEvent & WXUNUSED(event))
  3330         -{
  3331         -//
  3332         -// Copying the Map Request (SQL statement) 
  3333         -//
  3334         -  if (wxTheClipboard->Open())
  3335         -    {
  3336         -      wxTheClipboard->SetData(new wxTextDataObject(Sql));
  3337         -      wxTheClipboard->Close();
  3338         -    }
  3339         -}
  3340         -
  3341         -void RasterSqlSampleDialog::OnQuit(wxCommandEvent & WXUNUSED(event))
  3342         -{
  3343         -//
  3344         -// all done: 
  3345         -//
  3346         -  wxDialog::EndModal(wxID_CANCEL);
  3347         -}
  3348         -
  3349         -bool
  3350         -  WmsSqlSampleDialog::Create(MyMapPanel * parent, MapLayer * layer,
  3351         -                             bool request_url)
  3352         -{
  3353         -//
  3354         -// creating the dialog
  3355         -//
  3356         -  MainFrame = parent->GetParent();
  3357         -  MapPanel = parent;
  3358         -  Layer = layer;
  3359         -  RequestURL = request_url;
  3360         -  Url = wxString::FromUTF8(layer->GetWmsGetMapURL());
  3361         -  DbPrefix = layer->GetDbPrefix();
  3362         -  LayerName = layer->GetName();
  3363         -  wxString title = wxT("SQL sample: Map Request configuration");
  3364         -  if (RequestURL == true)
  3365         -    title = wxT("URL sample: Map Request configuration");
  3366         -  if (wxDialog::Create(parent, wxID_ANY, title) == false)
  3367         -    return false;
  3368         -// populates individual controls
  3369         -  InitData();
  3370         -  CreateControls();
  3371         -// sets dialog sizer
  3372         -  GetSizer()->Fit(this);
  3373         -  GetSizer()->SetSizeHints(this);
  3374         -// centers the dialog window
  3375         -  Centre();
  3376         -  DoUpdateSql();
  3377         -  return true;
  3378         -}
  3379         -
  3380         -WmsSqlSampleDialog::~WmsSqlSampleDialog()
  3381         -{
  3382         -  if (Version != NULL)
  3383         -    free(Version);
  3384         -  if (MaxVersion != NULL)
  3385         -    free(MaxVersion);
  3386         -  if (Style != NULL)
  3387         -    free(Style);
  3388         -  if (ImageFormat != NULL)
  3389         -    free(ImageFormat);
  3390         -  if (BgColor != NULL)
  3391         -    free(BgColor);
  3392         -}
  3393         -
  3394         -void WmsSqlSampleDialog::CreateControls()
  3395         -{
  3396         -//
  3397         -// creating individual control and setting initial values
  3398         -//
  3399         -  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
  3400         -  this->SetSizer(topSizer);
  3401         -  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
  3402         -  topSizer->Add(boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  3403         -// First row: URL
  3404         -  wxBoxSizer *lyrBoxSizer = new wxBoxSizer(wxVERTICAL);
  3405         -  boxSizer->Add(lyrBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  3406         -  wxBoxSizer *urlSizer = new wxBoxSizer(wxHORIZONTAL);
  3407         -  lyrBoxSizer->Add(urlSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  3408         -  wxStaticBox *urlBox = new wxStaticBox(this, wxID_ANY,
  3409         -                                        wxT("WMS GetMap URL"),
  3410         -                                        wxDefaultPosition,
  3411         -                                        wxDefaultSize);
  3412         -  wxBoxSizer *urlBoxSizer = new wxStaticBoxSizer(urlBox, wxHORIZONTAL);
  3413         -  urlSizer->Add(urlBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  3414         -  wxTextCtrl *urlCtrl = new wxTextCtrl(this, ID_WMS_URL, Url,
  3415         -                                       wxDefaultPosition, wxSize(800, 22),
  3416         -                                       wxTE_READONLY);
  3417         -  urlBoxSizer->Add(urlCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  3418         -// Second row: WMS options
  3419         -  wxBoxSizer *optsSizer = new wxBoxSizer(wxHORIZONTAL);
  3420         -  lyrBoxSizer->Add(optsSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  3421         -// WMS version
  3422         -  wxBoxSizer *wmsSizer = new wxBoxSizer(wxHORIZONTAL);
  3423         -  optsSizer->Add(wmsSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  3424         -  wxString ver[4];
  3425         -  ver[0] = wxT("WMS &1.0.0");
  3426         -  ver[1] = wxT("WMS &1.1.0");
  3427         -  ver[2] = wxT("WMS &1.1.1");
  3428         -  ver[3] = wxT("WMS &1.3.0");
  3429         -  wxRadioBox *versionBox = new wxRadioBox(this, ID_WMS_VERSION,
  3430         -                                          wxT("WMS &Version"),
  3431         -                                          wxDefaultPosition,
  3432         -                                          wxDefaultSize, 4,
  3433         -                                          ver, 4,
  3434         -                                          wxRA_SPECIFY_ROWS);
  3435         -  FindMaxVersion();
  3436         -  if (MaxVersion == NULL)
  3437         -    {
  3438         -      versionBox->Enable(1, false);
  3439         -      versionBox->Enable(2, false);
  3440         -      versionBox->Enable(3, false);
  3441         -  } else
  3442         -    {
  3443         -      if (strcmp(MaxVersion, "1.1.0") == 0)
  3444         -        {
  3445         -          versionBox->Enable(2, false);
  3446         -          versionBox->Enable(3, false);
  3447         -      } else if (strcmp(MaxVersion, "1.1.1") == 0)
  3448         -        {
  3449         -          versionBox->Enable(3, false);
  3450         -      } else if (strcmp(MaxVersion, "1.3.0") == 0)
  3451         -        ;
  3452         -      else
  3453         -        {
  3454         -          versionBox->Enable(1, false);
  3455         -          versionBox->Enable(2, false);
  3456         -          versionBox->Enable(3, false);
  3457         -        }
  3458         -    }
  3459         -  if (strcmp(Version, "1.0.0") == 0)
  3460         -    versionBox->SetSelection(0);
  3461         -  else if (strcmp(Version, "1.1.0") == 0)
  3462         -    versionBox->SetSelection(1);
  3463         -  else if (strcmp(Version, "1.1.1") == 0)
  3464         -    versionBox->SetSelection(2);
  3465         -  else
  3466         -    versionBox->SetSelection(3);
  3467         -  wmsSizer->Add(versionBox, 0, wxALIGN_TOP | wxALL, 5);
  3468         -// layer Name
  3469         -  wxBoxSizer *opt2Sizer = new wxBoxSizer(wxVERTICAL);
  3470         -  optsSizer->Add(opt2Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  3471         -  wxBoxSizer *nameSizer = new wxBoxSizer(wxHORIZONTAL);
  3472         -  opt2Sizer->Add(nameSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  3473         -  wxStaticBox *nameBox = new wxStaticBox(this, wxID_ANY,
  3474         -                                         wxT("Layer Name"),
  3475         -                                         wxDefaultPosition,
  3476         -                                         wxDefaultSize);
  3477         -  wxBoxSizer *nameBoxSizer = new wxStaticBoxSizer(nameBox, wxHORIZONTAL);
  3478         -  nameSizer->Add(nameBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  3479         -  wxTextCtrl *nameCtrl = new wxTextCtrl(this, ID_WMS_LAYER, LayerName,
  3480         -                                        wxDefaultPosition, wxSize(420, 22),
  3481         -                                        wxTE_READONLY);
  3482         -  nameBoxSizer->Add(nameCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  3483         -// Style
  3484         -  wxBoxSizer *opt3Sizer = new wxBoxSizer(wxHORIZONTAL);
  3485         -  opt2Sizer->Add(opt3Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  3486         -  wxStaticBox *stlBox = new wxStaticBox(this, wxID_STATIC,
  3487         -                                        wxT("Style"),
  3488         -                                        wxDefaultPosition,
  3489         -                                        wxDefaultSize);
  3490         -  wxBoxSizer *stlBoxSizer = new wxStaticBoxSizer(stlBox, wxVERTICAL);
  3491         -  opt3Sizer->Add(stlBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  3492         -  wxComboBox *stlList =
  3493         -    new wxComboBox(this, ID_WMS_STYLE, wxT(""), wxDefaultPosition,
  3494         -                   wxSize(250, 21), 0, NULL,
  3495         -                   wxCB_DROPDOWN | wxCB_READONLY);
  3496         -  PopulateStyles(stlList);
  3497         -  stlBoxSizer->Add(stlList, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  3498         -// image format
  3499         -  wxStaticBox *fmtBox = new wxStaticBox(this, wxID_STATIC,
  3500         -                                        wxT("Image Format"),
  3501         -                                        wxDefaultPosition,
  3502         -                                        wxDefaultSize);
  3503         -  wxBoxSizer *fmtBoxSizer = new wxStaticBoxSizer(fmtBox, wxVERTICAL);
  3504         -  opt3Sizer->Add(fmtBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  3505         -  wxComboBox *fmtList =
  3506         -    new wxComboBox(this, ID_WMS_FORMAT, wxT(""), wxDefaultPosition,
  3507         -                   wxSize(150, 21), 0, NULL,
  3508         -                   wxCB_DROPDOWN | wxCB_READONLY);
  3509         -  PopulateImageFormats(fmtList);
  3510         -  fmtBoxSizer->Add(fmtList, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  3511         -// transparent / background color
  3512         -  wxStaticBox *bgColorBox = new wxStaticBox(this, wxID_ANY,
  3513         -                                            wxT("Background Color"),
  3514         -                                            wxDefaultPosition,
  3515         -                                            wxDefaultSize);
  3516         -  wxBoxSizer *bgColorBoxSizer = new wxStaticBoxSizer(bgColorBox, wxHORIZONTAL);
  3517         -  optsSizer->Add(bgColorBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  3518         -  wxCheckBox *enableBgColorCtrl = new wxCheckBox(this, ID_WMS_ENABLE_BGCOLOR,
  3519         -                                                 wxT("Transparent"),
  3520         -                                                 wxDefaultPosition,
  3521         -                                                 wxDefaultSize);
  3522         -  if (BgColor == NULL)
  3523         -    {
  3524         -      Transparent = 1;
  3525         -      enableBgColorCtrl->SetValue(true);
  3526         -  } else
  3527         -    {
  3528         -      Transparent = 0;
  3529         -      enableBgColorCtrl->SetValue(false);
  3530         -    }
  3531         -  bgColorBoxSizer->Add(enableBgColorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL,
  3532         -                       5);
  3533         -  wxBitmap bgColorBmp;
  3534         -  GetButtonBitmap(BgColor, bgColorBmp);
  3535         -  wxBitmapButton *bgColorCtrl =
  3536         -    new wxBitmapButton(this, ID_WMS_BGCOLOR, bgColorBmp);
  3537         -  if (Transparent)
  3538         -    bgColorCtrl->Enable(false);
  3539         -  else
  3540         -    bgColorCtrl->Enable(true);
  3541         -  bgColorBoxSizer->Add(bgColorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  3542         -// SQL sample
  3543         -  wxString title = wxT("SQL sample");
  3544         -  if (RequestURL == true)
  3545         -    title = wxT("URL sample");
  3546         -  wxStaticBox *sqlBox = new wxStaticBox(this, wxID_STATIC,
  3547         -                                        title,
  3548         -                                        wxDefaultPosition,
  3549         -                                        wxDefaultSize);
  3550         -  wxBoxSizer *sqlSizer = new wxStaticBoxSizer(sqlBox, wxVERTICAL);
  3551         -  lyrBoxSizer->Add(sqlSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  3552         -  wxTextCtrl *sqlCtrl = new wxTextCtrl(this, ID_SQL_SAMPLE, Sql,
  3553         -                                       wxDefaultPosition, wxSize(800, 70),
  3554         -                                       wxTE_MULTILINE | wxTE_WORDWRAP |
  3555         -                                       wxTE_READONLY);
  3556         -  sqlSizer->Add(sqlCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  3557         -
  3558         -  wxBoxSizer *buttonSizer = new wxBoxSizer(wxHORIZONTAL);
  3559         -  lyrBoxSizer->Add(buttonSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  3560         -  wxButton *wms_ok = new wxButton(this, ID_VECTOR_COPY, wxT("&Copy"));
  3561         -  buttonSizer->Add(wms_ok, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  3562         -  wxButton *wms_quit = new wxButton(this, wxID_CANCEL, wxT("&Quit"));
  3563         -  buttonSizer->Add(wms_quit, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  3564         -// appends event handlers
  3565         -  Connect(ID_VECTOR_COPY, wxEVT_COMMAND_BUTTON_CLICKED,
  3566         -          (wxObjectEventFunction) & WmsSqlSampleDialog::OnCopy);
  3567         -  Connect(wxID_CANCEL, wxEVT_COMMAND_BUTTON_CLICKED,
  3568         -          (wxObjectEventFunction) & WmsSqlSampleDialog::OnQuit);
  3569         -  Connect(ID_WMS_VERSION, wxEVT_COMMAND_RADIOBOX_SELECTED,
  3570         -          (wxObjectEventFunction) & WmsSqlSampleDialog::OnVersionChanged);
  3571         -  Connect(ID_WMS_STYLE, wxEVT_COMMAND_COMBOBOX_SELECTED,
  3572         -          (wxObjectEventFunction) & WmsSqlSampleDialog::OnStyleChanged);
  3573         -  Connect(ID_WMS_FORMAT, wxEVT_COMMAND_COMBOBOX_SELECTED,
  3574         -          (wxObjectEventFunction) & WmsSqlSampleDialog::OnMimeTypeChanged);
  3575         -  Connect(ID_WMS_ENABLE_BGCOLOR, wxEVT_COMMAND_CHECKBOX_CLICKED,
  3576         -          (wxObjectEventFunction) & WmsSqlSampleDialog::OnTransparentChanged);
  3577         -  Connect(ID_WMS_BGCOLOR, wxEVT_COMMAND_BUTTON_CLICKED,
  3578         -          (wxObjectEventFunction) & WmsSqlSampleDialog::OnBgColorChanged);
  3579         -}
  3580         -
  3581         -unsigned char WmsSqlSampleDialog::ParseHex(const char *byte)
  3582         -{
  3583         -// parsing an Hex Byte
  3584         -  unsigned char value = 0;
  3585         -  switch (byte[0])
  3586         -    {
  3587         -      case '0':
  3588         -        value = 16 * 0;
  3589         -        break;
  3590         -      case '1':
  3591         -        value = 16 * 1;
  3592         -        break;
  3593         -      case '2':
  3594         -        value = 16 * 2;
  3595         -        break;
  3596         -      case '3':
  3597         -        value = 16 * 3;
  3598         -        break;
  3599         -      case '4':
  3600         -        value = 16 * 4;
  3601         -        break;
  3602         -      case '5':
  3603         -        value = 16 * 5;
  3604         -        break;
  3605         -      case '6':
  3606         -        value = 16 * 6;
  3607         -        break;
  3608         -      case '7':
  3609         -        value = 16 * 7;
  3610         -        break;
  3611         -      case '8':
  3612         -        value = 16 * 8;
  3613         -        break;
  3614         -      case '9':
  3615         -        value = 16 * 9;
  3616         -        break;
  3617         -      case 'A':
  3618         -      case 'a':
  3619         -        value = 16 * 10;
  3620         -        break;
  3621         -      case 'B':
  3622         -      case 'b':
  3623         -        value = 16 * 11;
  3624         -        break;
  3625         -      case 'C':
  3626         -      case 'c':
  3627         -        value = 16 * 12;
  3628         -        break;
  3629         -      case 'D':
  3630         -      case 'd':
  3631         -        value = 16 * 13;
  3632         -        break;
  3633         -      case 'E':
  3634         -      case 'e':
  3635         -        value = 16 * 14;
  3636         -        break;
  3637         -      case 'F':
  3638         -      case 'f':
  3639         -        value = 16 * 15;
  3640         -        break;
  3641         -    };
  3642         -  switch (byte[1])
  3643         -    {
  3644         -      case '0':
  3645         -        value += 0;
  3646         -        break;
  3647         -      case '1':
  3648         -        value += 1;
  3649         -        break;
  3650         -      case '2':
  3651         -        value += 2;
  3652         -        break;
  3653         -      case '3':
  3654         -        value += 3;
  3655         -        break;
  3656         -      case '4':
  3657         -        value += 4;
  3658         -        break;
  3659         -      case '5':
  3660         -        value += 5;
  3661         -        break;
  3662         -      case '6':
  3663         -        value += 6;
  3664         -        break;
  3665         -      case '7':
  3666         -        value += 7;
  3667         -        break;
  3668         -      case '8':
  3669         -        value += 8;
  3670         -        break;
  3671         -      case '9':
  3672         -        value += 9;
  3673         -        break;
  3674         -      case 'A':
  3675         -      case 'a':
  3676         -        value += 10;
  3677         -        break;
  3678         -      case 'B':
  3679         -      case 'b':
  3680         -        value += 11;
  3681         -        break;
  3682         -      case 'C':
  3683         -      case 'c':
  3684         -        value += 12;
  3685         -        break;
  3686         -      case 'D':
  3687         -      case 'd':
  3688         -        value += 13;
  3689         -        break;
  3690         -      case 'E':
  3691         -      case 'e':
  3692         -        value += 14;
  3693         -        break;
  3694         -      case 'F':
  3695         -      case 'f':
  3696         -        value += 15;
  3697         -        break;
  3698         -    };
  3699         -  return value;
  3700         -}
  3701         -
  3702         -void
  3703         -  WmsSqlSampleDialog::ParseBgColor(const char *color, unsigned char *red,
  3704         -                                   unsigned char *green, unsigned char *blue)
  3705         -{
  3706         -// parsing an Hex RGB color
  3707         -  char byte[2];
  3708         -  *red = 0x80;
  3709         -  *green = 0x80;
  3710         -  *blue = 0x80;
  3711         -  if (color == NULL)
  3712         -    return;
  3713         -
  3714         -  byte[0] = *(color + 0);
  3715         -  byte[1] = *(color + 1);
  3716         -  *red = ParseHex(byte);
  3717         -  byte[0] = *(color + 2);
  3718         -  byte[1] = *(color + 3);
  3719         -  *green = ParseHex(byte);
  3720         -  byte[0] = *(color + 4);
  3721         -  byte[1] = *(color + 5);
  3722         -  *blue = ParseHex(byte);
  3723         -}
  3724         -
  3725         -void WmsSqlSampleDialog::GetButtonBitmap(const char *bgcolor, wxBitmap & bmp)
  3726         -{
  3727         -// creating a Bitmap representing some Color
  3728         -  unsigned char red;
  3729         -  unsigned char green;
  3730         -  unsigned char blue;
  3731         -  ParseBgColor(bgcolor, &red, &green, &blue);
  3732         -  wxColour color = wxColour(red, green, blue);
  3733         -  bmp = wxBitmap(96, 64);
  3734         -  wxMemoryDC *dc = new wxMemoryDC(bmp);
  3735         -  dc->SetBrush(wxBrush(color));
  3736         -  dc->DrawRectangle(-1, -1, 98, 66);
  3737         -  delete dc;
  3738         -}
  3739         -
  3740         -void WmsSqlSampleDialog::InitData()
  3741         -{
  3742         -// initializing the current configuration
  3743         -  int ret;
  3744         -  char *sql;
  3745         -  char **results;
  3746         -  int rows;
  3747         -  int columns;
  3748         -
  3749         -  char *url = (char *) malloc((Url.Len() * 4) + 1);
  3750         -  strcpy(url, Url.ToUTF8());
  3751         -  char *db_prefix = (char *) malloc((DbPrefix.Len() * 4) + 1);
  3752         -  strcpy(db_prefix, DbPrefix.ToUTF8());
  3753         -  char *xdb_prefix = gaiaDoubleQuotedSql(db_prefix);
  3754         -  free(db_prefix);
  3755         -  char *layer = (char *) malloc((LayerName.Len() * 4) + 1);
  3756         -  strcpy(layer, LayerName.ToUTF8());
  3757         -  sql =
  3758         -    sqlite3_mprintf
  3759         -    ("SELECT version, srs, format, style, is_queryable, flip_axes, "
  3760         -     "is_cached, tiled, tile_width, tile_height, bgcolor, transparent "
  3761         -     "FROM \"%s\".wms_getmap WHERE url = %Q AND layer_name = %Q",
  3762         -     xdb_prefix, url, layer);
  3763         -  free(url);
  3764         -  free(layer);
  3765         -  free(xdb_prefix);
  3766         -  ret =
  3767         -    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows,
  3768         -                      &columns, NULL);
  3769         -  sqlite3_free(sql);
  3770         -  if (ret != SQLITE_OK)
  3771         -    {
  3772         -      Version = NULL;
  3773         -      ImageFormat = NULL;
  3774         -      Style = NULL;
  3775         -      Transparent = 1;
  3776         -      BgColor = NULL;
  3777         -      return;
  3778         -    }
  3779         -
  3780         -  for (int i = 1; i <= rows; i++)
  3781         -    {
  3782         -      // fetching data
  3783         -      int len;
  3784         -      const char *version = results[(i * columns) + 0];
  3785         -      const char *ref_sys = results[(i * columns) + 1];
  3786         -      const char *format = results[(i * columns) + 2];
  3787         -      const char *style = results[(i * columns) + 3];
  3788         -      const char *bgcolor = results[(i * columns) + 10];
  3789         -      Transparent = atoi(results[(i * columns) + 11]);
  3790         -      if (version == NULL)
  3791         -        Version = NULL;
  3792         -      else
  3793         -        {
  3794         -          len = strlen(version);
  3795         -          Version = (char *) malloc(len + 1);
  3796         -          strcpy(Version, version);
  3797         -        }
  3798         -      if (format == NULL)
  3799         -        ImageFormat = NULL;
  3800         -      else
  3801         -        {
  3802         -          len = strlen(format);
  3803         -          ImageFormat = (char *) malloc(len + 1);
  3804         -          strcpy(ImageFormat, format);
  3805         -        }
  3806         -      if (style == NULL)
  3807         -        Style = NULL;
  3808         -      else
  3809         -        {
  3810         -          len = strlen(style);
  3811         -          Style = (char *) malloc(len + 1);
  3812         -          strcpy(Style, style);
  3813         -        }
  3814         -      if (bgcolor == NULL)
  3815         -        BgColor = NULL;
  3816         -      else
  3817         -        {
  3818         -          if (strlen(bgcolor) == 6)
  3819         -            {
  3820         -              BgColor = (char *) malloc(7);
  3821         -              strcpy(BgColor, bgcolor);
  3822         -          } else
  3823         -            BgColor = NULL;
  3824         -        }
  3825         -    }
  3826         -  sqlite3_free_table(results);
  3827         -}
  3828         -
  3829         -void WmsSqlSampleDialog::FindMaxVersion()
  3830         -{
  3831         -// identifying the Max WMS Version
  3832         -  int ret;
  3833         -  char *sql;
  3834         -  char **results;
  3835         -  int rows;
  3836         -  int columns;
  3837         -  MaxVersion = NULL;
  3838         -
  3839         -  char *url = (char *) malloc((Url.Len() * 4) + 1);
  3840         -  strcpy(url, Url.ToUTF8());
  3841         -  char *db_prefix = (char *) malloc((DbPrefix.Len() * 4) + 1);
  3842         -  strcpy(db_prefix, DbPrefix.ToUTF8());
  3843         -  char *xdb_prefix = gaiaDoubleQuotedSql(db_prefix);
  3844         -  free(db_prefix);
  3845         -  char *layer = (char *) malloc((LayerName.Len() * 4) + 1);
  3846         -  strcpy(layer, LayerName.ToUTF8());
  3847         -  sql = sqlite3_mprintf("SELECT Max(s.value) FROM \"%s\".wms_getmap AS m "
  3848         -                        "JOIN \"%s\".wms_settings AS s ON (s.parent_id = m.id) "
  3849         -                        "WHERE m.url = %Q AND m.layer_name = %Q AND s.key = 'version'",
  3850         -                        xdb_prefix, xdb_prefix, url, layer);
  3851         -  free(url);
  3852         -  free(layer);
  3853         -  free(xdb_prefix);
  3854         -  ret =
  3855         -    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows,
  3856         -                      &columns, NULL);
  3857         -  sqlite3_free(sql);
  3858         -  if (ret != SQLITE_OK)
  3859         -    return;
  3860         -
  3861         -  for (int i = 1; i <= rows; i++)
  3862         -    {
  3863         -      // fetching data
  3864         -      int len;
  3865         -      const char *version = results[(i * columns) + 0];
  3866         -      if (version == NULL)
  3867         -        MaxVersion = NULL;
  3868         -      else
  3869         -        {
  3870         -          len = strlen(version);
  3871         -          MaxVersion = (char *) malloc(len + 1);
  3872         -          strcpy(MaxVersion, version);
  3873         -        }
  3874         -    }
  3875         -  sqlite3_free_table(results);
  3876         -}
  3877         -
  3878         -void WmsSqlSampleDialog::PopulateStyles(wxComboBox * stlList)
  3879         -{
  3880         -// populating the Styles List
  3881         -  int ret;
  3882         -  char *sql;
  3883         -  char **results;
  3884         -  int rows;
  3885         -  int columns;
  3886         -
  3887         -  char *url = (char *) malloc((Url.Len() * 4) + 1);
  3888         -  strcpy(url, Url.ToUTF8());
  3889         -  char *db_prefix = (char *) malloc((DbPrefix.Len() * 4) + 1);
  3890         -  strcpy(db_prefix, DbPrefix.ToUTF8());
  3891         -  char *xdb_prefix = gaiaDoubleQuotedSql(db_prefix);
  3892         -  free(db_prefix);
  3893         -  char *layer = (char *) malloc((LayerName.Len() * 4) + 1);
  3894         -  strcpy(layer, LayerName.ToUTF8());
  3895         -  sql = sqlite3_mprintf("SELECT s.value FROM \"%s\".wms_getmap AS m "
  3896         -                        "JOIN \"%s\".wms_settings AS s ON (s.parent_id = m.id) "
  3897         -                        "WHERE m.url = %Q AND m.layer_name = %Q AND s.key = 'style' ORDER BY s.id",
  3898         -                        xdb_prefix, xdb_prefix, url, layer);
  3899         -  free(url);
  3900         -  free(layer);
  3901         -  free(xdb_prefix);
  3902         -  ret =
  3903         -    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows,
  3904         -                      &columns, NULL);
  3905         -  sqlite3_free(sql);
  3906         -  if (ret != SQLITE_OK)
  3907         -    return;
  3908         -
  3909         -  for (int i = 1; i <= rows; i++)
  3910         -    {
  3911         -      // populating the list
  3912         -      const char *style = results[(i * columns) + 0];
  3913         -      wxString str = wxString::FromUTF8(style);
  3914         -      stlList->Append(str);
  3915         -      if (strcmp(Style, style) == 0)
  3916         -        stlList->SetSelection(i - 1);
  3917         -    }
  3918         -  sqlite3_free_table(results);
  3919         -}
  3920         -
  3921         -void WmsSqlSampleDialog::PopulateImageFormats(wxComboBox * fmtList)
  3922         -{
  3923         -// populating the Image Formats List
  3924         -  int ret;
  3925         -  char *sql;
  3926         -  char **results;
  3927         -  int rows;
  3928         -  int columns;
  3929         -
  3930         -  char *url = (char *) malloc((Url.Len() * 4) + 1);
  3931         -  strcpy(url, Url.ToUTF8());
  3932         -  char *db_prefix = (char *) malloc((DbPrefix.Len() * 4) + 1);
  3933         -  strcpy(db_prefix, DbPrefix.ToUTF8());
  3934         -  char *xdb_prefix = gaiaDoubleQuotedSql(db_prefix);
  3935         -  free(db_prefix);
  3936         -  char *layer = (char *) malloc((LayerName.Len() * 4) + 1);
  3937         -  strcpy(layer, LayerName.ToUTF8());
  3938         -  sql = sqlite3_mprintf("SELECT s.value FROM \"%s\".wms_getmap AS m "
  3939         -                        "JOIN \"%s\".wms_settings AS s ON (s.parent_id = m.id) "
  3940         -                        "WHERE m.url = %Q AND m.layer_name = %Q AND s.key = 'format' ORDER BY s.id",
  3941         -                        xdb_prefix, xdb_prefix, url, layer);
  3942         -  free(url);
  3943         -  free(layer);
  3944         -  free(xdb_prefix);
  3945         -  ret =
  3946         -    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows,
  3947         -                      &columns, NULL);
  3948         -  sqlite3_free(sql);
  3949         -  if (ret != SQLITE_OK)
  3950         -    return;
  3951         -
  3952         -  for (int i = 1; i <= rows; i++)
  3953         -    {
  3954         -      // populating the list
  3955         -      const char *format = results[(i * columns) + 0];
  3956         -      wxString str = wxString::FromUTF8(format);
  3957         -      fmtList->Append(str);
  3958         -      if (strcmp(ImageFormat, format) == 0)
  3959         -        fmtList->SetSelection(i - 1);
  3960         -    }
  3961         -  sqlite3_free_table(results);
  3962         -}
  3963         -
  3964         -int WmsSqlSampleDialog::CheckMarker(wxString & url)
  3965         -{
  3966         -// testing if some "?" marker is already defined
  3967         -  int ret = url.Find('?');
  3968         -  if (ret == wxNOT_FOUND)
  3969         -    return 0;
  3970         -  return 1;
  3971         -}
  3972         -
  3973         -int
  3974         -  WmsSqlSampleDialog::DoQueryWmsCoverage(const char *db_prefix,
  3975         -                                         const char *cvg_name, int srid, char **url, int *swap_axes)
  3976         -{
  3977         -// querying the WMS Coverage definitions
  3978         -  int len;
  3979         -  int i;
  3980         -  char **results;
  3981         -  int rows;
  3982         -  int columns;
  3983         -  char *sql;
  3984         -  int ret;
  3985         -  char *xdb_prefix;
  3986         -  int ok = 0;
  3987         -  if (db_prefix == NULL)
  3988         -    db_prefix = "MAIN";
  3989         -  xdb_prefix = gaiaDoubleQuotedSql(db_prefix);
  3990         -  sql = sqlite3_mprintf("SELECT w.url, s.has_flipped_axes "
  3991         -  "FROM \"%s\".wms_getmap AS w, \"%s\".spatial_ref_sys_aux AS s "
  3992         -  "WHERE w.layer_name = %Q AND s.srid = %d",
  3993         -                        xdb_prefix, xdb_prefix, cvg_name, srid);
  3994         -  free(xdb_prefix);
  3995         -  ret =
  3996         -    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows,
  3997         -                      &columns, NULL);
  3998         -  sqlite3_free(sql);
  3999         -  if (ret != SQLITE_OK)
  4000         -    return 0;
  4001         -  if (rows < 1)
  4002         -    ;
  4003         -  else
  4004         -    {
  4005         -      for (i = 1; i <= rows; i++)
  4006         -        {
  4007         -          const char *val = results[(i * columns) + 0];
  4008         -          if (*url != NULL)
  4009         -            free(*url);
  4010         -          len = strlen(val);
  4011         -          *url = (char *) malloc(len + 1);
  4012         -          strcpy(*url, val);
  4013         -          val = results[(i * columns) + 1];
  4014         -          *swap_axes = atoi(val);
  4015         -          ok = 1;
  4016         -        }
  4017         -    }
  4018         -  sqlite3_free_table(results);
  4019         -  if (!ok)
  4020         -    return 0;
  4021         -  return 1;
  4022         -}
  4023         -
  4024         -void WmsSqlSampleDialog::DoUpdateUrl()
  4025         -{
  4026         -//
  4027         -// updating the Request URL
  4028         -//
  4029         -  char *str;
  4030         -  char *buf;
  4031         -  wxString col;
  4032         -  wxTextCtrl *sqlCtrl = (wxTextCtrl *) FindWindow(ID_SQL_SAMPLE);
  4033         -  wxRadioBox *versionBox = (wxRadioBox *) FindWindow(ID_WMS_VERSION);
  4034         -  wxComboBox *stlList = (wxComboBox *) FindWindow(ID_WMS_STYLE);
  4035         -  wxComboBox *mimeList = (wxComboBox *) FindWindow(ID_WMS_FORMAT);
  4036         -  wxCheckBox *transparentCtrl =
  4037         -    (wxCheckBox *) FindWindow(ID_WMS_ENABLE_BGCOLOR);
  4038         -  char *db_prefix;
  4039         -  int srid;
  4040         -  const char *crs_prefix = "CRS";
  4041         -  char *crs = NULL;
  4042         -  char *url = (char *) malloc((Url.Len() * 4) + 1);
  4043         -  strcpy(url, Url.ToUTF8());
  4044         -  const char *version = Version;
  4045         -  char *layer = (char *) malloc((LayerName.Len() * 4) + 1);
  4046         -  strcpy(layer, LayerName.ToUTF8());
  4047         -  char *style;
  4048         -  char *format = ImageFormat;
  4049         -  int swap_xy;
  4050         -  double minx;
  4051         -  double miny;
  4052         -  double maxx;
  4053         -  double maxy;
  4054         -  int width = MapPanel->GetImageWidth();
  4055         -  int height = MapPanel->GetImageHeight();
  4056         -  int opaque;
  4057         -  char *bg_color;
  4058         -  int valid_bg_color = 1;
  4059         -  char *request;
  4060         -  int force_marker = CheckMarker(Url);
  4061         -
  4062         -  MapPanel->GetBBox(&srid, &minx, &miny, &maxx, &maxy);
  4063         -  if (DbPrefix.Len() == 0)
  4064         -    db_prefix = NULL;
  4065         -  else
  4066         -    {
  4067         -      db_prefix = (char *) malloc((DbPrefix.Len() * 4) + 1);
  4068         -      strcpy(db_prefix, DbPrefix.ToUTF8());
  4069         -    }
  4070         -  if (!DoQueryWmsCoverage(db_prefix, layer, srid, &url, &swap_xy))
  4071         -    return;
  4072         -
  4073         -crs = sqlite3_mprintf("EPSG:%d", srid);
  4074         -  wxString xstyle = stlList->GetValue();
  4075         -  if (xstyle.Len() == 0)
  4076         -    style = NULL;
  4077         -  else
  4078         -    {
  4079         -      style = (char *) malloc((xstyle.Len() * 4) + 1);
  4080         -      strcpy(style, xstyle.ToUTF8());
  4081         -    }
  4082         -  wxString xformat = mimeList->GetValue();
  4083         -  if (xformat.Len() == 0)
  4084         -    format = NULL;
  4085         -  else
  4086         -    {
  4087         -      format = (char *) malloc((xformat.Len() * 4) + 1);
  4088         -      strcpy(format, xformat.ToUTF8());
  4089         -    }
  4090         -
  4091         -/* masking NULL arguments */
  4092         -  if (version == NULL)
  4093         -    version = "";
  4094         -    if (strcmp(version, "1.3.0") != 0)
  4095         -    swap_xy = 0;
  4096         -  if (style == NULL)
  4097         -    {
  4098         -      style = (char *) malloc(1);
  4099         -      *style = '\0';
  4100         -    }
  4101         -  if (format == NULL)
  4102         -    {
  4103         -      format = (char *) malloc(1);
  4104         -      *format = '\0';
  4105         -    }
  4106         -/* validating the background color */
  4107         -  if (BgColor == NULL)
  4108         -    valid_bg_color = 0;
  4109         -  else if (strlen(BgColor) != 6)
  4110         -    valid_bg_color = 0;
  4111         -  else
  4112         -    {
  4113         -      int i;
  4114         -      for (i = 0; i < 6; i++)
  4115         -        {
  4116         -          char h = *(BgColor + i);
  4117         -          if ((h >= '0' && h <= '9') || (h >= 'a' && h <= 'f')
  4118         -              || (h >= 'A' && h <= 'F'))
  4119         -            ;
  4120         -          else
  4121         -            valid_bg_color = 0;
  4122         -        }
  4123         -    }
  4124         -  if (valid_bg_color)
  4125         -    bg_color = sqlite3_mprintf("0x%s", BgColor);
  4126         -  else
  4127         -    bg_color = sqlite3_mprintf("0xFFFFFF");
  4128         -  if (transparentCtrl->GetValue())
  4129         -    opaque = 0;
  4130         -  else
  4131         -    opaque = 1;
  4132         -
  4133         -/* preparing the request URL */
  4134         -  if (strcmp(version, "1.3.0") < 0)
  4135         -    {
  4136         -      /* earlier versions of the protocol require SRS instead of CRS */
  4137         -      crs_prefix = "SRS";
  4138         -    }
  4139         -  if (force_marker)
  4140         -    {
  4141         -      /* "?" marker not declared */
  4142         -      if (swap_xy)
  4143         -        request =
  4144         -          sqlite3_mprintf("%s?SERVICE=WMS&REQUEST=GetMap&VERSION=%s"
  4145         -                          "&LAYERS=%s&%s=%s&BBOX=%1.6f,%1.6f,%1.6f,%1.6f"
  4146         -                          "&WIDTH=%d&HEIGHT=%d&STYLES=%s&FORMAT=%s"
  4147         -                          "&TRANSPARENT=%s&BGCOLOR=%s", url,
  4148         -                          version, layer, crs_prefix, crs, miny,
  4149         -                          minx, maxy, maxx, width, height, style,
  4150         -                          format, (opaque == 0) ? "TRUE" : "FALSE", bg_color);
  4151         -      else
  4152         -        request =
  4153         -          sqlite3_mprintf("%s?SERVICE=WMS&REQUEST=GetMap&VERSION=%s"
  4154         -                          "&LAYERS=%s&%s=%s&BBOX=%1.6f,%1.6f,%1.6f,%1.6f"
  4155         -                          "&WIDTH=%d&HEIGHT=%d&STYLES=%s&FORMAT=%s"
  4156         -                          "&TRANSPARENT=%s&BGCOLOR=%s", url,
  4157         -                          version, layer, crs_prefix, crs, minx,
  4158         -                          miny, maxx, maxy, width, height, style,
  4159         -                          format, (opaque == 0) ? "TRUE" : "FALSE", bg_color);
  4160         -  } else
  4161         -    {
  4162         -      /* "?" marker already defined */
  4163         -      if (swap_xy)
  4164         -        request =
  4165         -          sqlite3_mprintf("%sSERVICE=WMS&REQUEST=GetMap&VERSION=%s"
  4166         -                          "&LAYERS=%s&%s=%s&BBOX=%1.6f,%1.6f,%1.6f,%1.6f"
  4167         -                          "&WIDTH=%d&HEIGHT=%d&STYLES=%s&FORMAT=%s"
  4168         -                          "&TRANSPARENT=%s&BGCOLOR=%s", url,
  4169         -                          version, layer, crs_prefix, crs, miny,
  4170         -                          minx, maxy, maxx, width, height, style,
  4171         -                          format, (opaque == 0) ? "TRUE" : "FALSE", bg_color);
  4172         -      else
  4173         -        request =
  4174         -          sqlite3_mprintf("%sSERVICE=WMS&REQUEST=GetMap&VERSION=%s"
  4175         -                          "&LAYERS=%s&%s=%s&BBOX=%1.6f,%1.6f,%1.6f,%1.6f"
  4176         -                          "&WIDTH=%d&HEIGHT=%d&STYLES=%s&FORMAT=%s"
  4177         -                          "&TRANSPARENT=%s&BGCOLOR=%s", url,
  4178         -                          version, layer, crs_prefix, crs, minx,
  4179         -                          miny, maxx, maxy, width, height, style,
  4180         -                          format, (opaque == 0) ? "TRUE" : "FALSE", bg_color);
  4181         -    }
  4182         -  Sql = wxString::FromUTF8(request);
  4183         -  sqlite3_free(request);
  4184         -  sqlCtrl->SetValue(Sql);
  4185         -
  4186         -  if (url != NULL)
  4187         -    free(url);
  4188         -  if (layer != NULL)
  4189         -    free(layer);
  4190         -  if (db_prefix != NULL)
  4191         -    free(db_prefix);
  4192         -  if (crs != NULL)
  4193         -    sqlite3_free(crs);
  4194         -  if (style != NULL)
  4195         -    free(style);
  4196         -  if (format != NULL)
  4197         -    free(format);
  4198         -  if (bg_color != NULL)
  4199         -    sqlite3_free(bg_color);
  4200         -}
  4201         -
  4202         -void WmsSqlSampleDialog::DoUpdateSql()
  4203         -{
  4204         -//
  4205         -// updating the SQL query
  4206         -//
  4207         -  if (RequestURL == true)
  4208         -    {
  4209         -      DoUpdateUrl();
  4210         -      return;
  4211         -    }
  4212         -  char *str;
  4213         -  char *buf;
  4214         -  wxString col;
  4215         -  wxTextCtrl *sqlCtrl = (wxTextCtrl *) FindWindow(ID_SQL_SAMPLE);
  4216         -  wxRadioBox *versionBox = (wxRadioBox *) FindWindow(ID_WMS_VERSION);
  4217         -  wxComboBox *stlList = (wxComboBox *) FindWindow(ID_WMS_STYLE);
  4218         -  wxComboBox *mimeList = (wxComboBox *) FindWindow(ID_WMS_FORMAT);
  4219         -  wxCheckBox *transparentCtrl =
  4220         -    (wxCheckBox *) FindWindow(ID_WMS_ENABLE_BGCOLOR);
  4221         -  Sql = wxT("SELECT RL2_GetMapImageFromWMS(");
  4222         -  if (DbPrefix.Len() == 0)
  4223         -    Sql += wxT("NULL, ");
  4224         -  else
  4225         -    {
  4226         -      str = (char *) malloc((DbPrefix.Len() * 4) + 1);
  4227         -      strcpy(str, DbPrefix.ToUTF8());
  4228         -      buf = sqlite3_mprintf("%Q, ", str);
  4229         -      free(str);
  4230         -      col = wxString::FromUTF8(buf);
  4231         -      sqlite3_free(buf);
  4232         -      Sql += col;
  4233         -    }
  4234         -// coverage name
  4235         -  str = (char *) malloc((LayerName.Len() * 4) + 1);
  4236         -  strcpy(str, LayerName.ToUTF8());
  4237         -  buf = sqlite3_mprintf("%Q, ", str);
  4238         -  free(str);
  4239         -  col = wxString::FromUTF8(buf);
  4240         -  sqlite3_free(buf);
  4241         -  Sql += col;
  4242         -// bounding box
  4243         -  wxString bbox;
  4244         -  MapPanel->DoPrepareBBox(bbox);
  4245         -  Sql += bbox;
  4246         -// image width and height
  4247         -  buf =
  4248         -    sqlite3_mprintf("%d, %d, ", MapPanel->GetImageWidth(),
  4249         -                    MapPanel->GetImageHeight());
  4250         -  col = wxString::FromUTF8(buf);
  4251         -  sqlite3_free(buf);
  4252         -  Sql += col;
  4253         -// WMS version
  4254         -  switch (versionBox->GetSelection())
  4255         -    {
  4256         -      case 1:
  4257         -        Sql += wxT("'1.1.0', ");
  4258         -        break;
  4259         -      case 2:
  4260         -        Sql += wxT("'1.1.1', ");
  4261         -        break;
  4262         -      case 3:
  4263         -        Sql += wxT("'1.3.0', ");
  4264         -        break;
  4265         -      default:
  4266         -        Sql += wxT("'1.0.0', ");
  4267         -        break;
  4268         -    };
  4269         -// style
  4270         -  wxString style = stlList->GetValue();
  4271         -  if (style.Len() == 0)
  4272         -    Sql += wxT("'default', ");
  4273         -  else
  4274         -    {
  4275         -      str = (char *) malloc((style.Len() * 4) + 1);
  4276         -      strcpy(str, style.ToUTF8());
  4277         -      buf = sqlite3_mprintf("%Q, ", str);
  4278         -      free(str);
  4279         -      col = wxString::FromUTF8(buf);
  4280         -      sqlite3_free(buf);
  4281         -      Sql += col;
  4282         -    }
  4283         -// MIME type
  4284         -  wxString format = mimeList->GetValue();
  4285         -  if (format.Len() == 0)
  4286         -    Sql += wxT("'default', ");
  4287         -  else
  4288         -    {
  4289         -      str = (char *) malloc((format.Len() * 4) + 1);
  4290         -      strcpy(str, format.ToUTF8());
  4291         -      buf = sqlite3_mprintf("%Q, ", str);
  4292         -      free(str);
  4293         -      col = wxString::FromUTF8(buf);
  4294         -      sqlite3_free(buf);
  4295         -      Sql += col;
  4296         -    }
  4297         -// bgColor
  4298         -  if (BgColor == NULL)
  4299         -    Sql += wxT("'#ffffff', ");
  4300         -  else
  4301         -    {
  4302         -      buf = sqlite3_mprintf("'#%s', ", BgColor);
  4303         -      col = wxString::FromUTF8(buf);
  4304         -      sqlite3_free(buf);
  4305         -      Sql += col;
  4306         -    }
  4307         -// transparent
  4308         -  if (transparentCtrl->GetValue())
  4309         -    Sql += wxT("1");
  4310         -  else
  4311         -    Sql += wxT("0");
  4312         -  Sql += wxT(");");
  4313         -  sqlCtrl->SetValue(Sql);
  4314         -}
  4315         -
  4316         -void WmsSqlSampleDialog::OnVersionChanged(wxCommandEvent & WXUNUSED(event))
  4317         -{
  4318         -//
  4319         -// WMS Version selection changed
  4320         -//
  4321         -  DoUpdateSql();
  4322         -}
  4323         -
  4324         -void WmsSqlSampleDialog::OnStyleChanged(wxCommandEvent & WXUNUSED(event))
  4325         -{
  4326         -//
  4327         -// Style selection changed
  4328         -//
  4329         -  DoUpdateSql();
  4330         -}
  4331         -
  4332         -void WmsSqlSampleDialog::OnMimeTypeChanged(wxCommandEvent & WXUNUSED(event))
  4333         -{
  4334         -//
  4335         -// MIME Type selection changed
  4336         -//
  4337         -  DoUpdateSql();
  4338         -}
  4339         -
  4340         -void WmsSqlSampleDialog::OnTransparentChanged(wxCommandEvent & WXUNUSED(event))
  4341         -{
  4342         -//
  4343         -// Transparent selection changed
  4344         -//
  4345         -  wxBitmapButton *btn = (wxBitmapButton *) FindWindow(ID_WMS_BGCOLOR);
  4346         -  if (Transparent == 1)
  4347         -    {
  4348         -      Transparent = 0;
  4349         -      if (BgColor != NULL)
  4350         -        free(BgColor);
  4351         -      BgColor = (char *) malloc(7);
  4352         -      strcpy(BgColor, "ffffff");
  4353         -      wxBitmap bmp;
  4354         -      GetButtonBitmap(BgColor, bmp);
  4355         -      btn->SetBitmapLabel(bmp);
  4356         -      btn->Enable(true);
  4357         -  } else
  4358         -    {
  4359         -      Transparent = 0;
  4360         -      btn->Enable(false);
  4361         -      if (BgColor != NULL)
  4362         -        {
  4363         -          free(BgColor);
  4364         -          BgColor = NULL;
  4365         -        }
  4366         -    }
  4367         -  DoUpdateSql();
  4368         -}
  4369         -
  4370         -void WmsSqlSampleDialog::OnBgColorChanged(wxCommandEvent & WXUNUSED(event))
  4371         -{
  4372         -// BgColor selection
  4373         -  wxColourData initColor;
  4374         -  int ret;
  4375         -  unsigned char red;
  4376         -  unsigned char green;
  4377         -  unsigned char blue;
  4378         -  ParseBgColor(BgColor, &red, &green, &blue);
  4379         -  wxColour color = wxColour(red, green, blue);
  4380         -  initColor.SetChooseFull(false);
  4381         -  initColor.SetColour(color);
  4382         -  wxColourDialog colorDialog(this, &initColor);
  4383         -  ret = colorDialog.ShowModal();
  4384         -  if (ret == wxID_OK)
  4385         -    {
  4386         -      wxColourData colorData = colorDialog.GetColourData();
  4387         -      color = colorData.GetColour();
  4388         -      char byte[3];
  4389         -      sprintf(byte, "%02x", color.Red());
  4390         -      memcpy(BgColor, byte, 2);
  4391         -      sprintf(byte, "%02x", color.Green());
  4392         -      memcpy(BgColor + 2, byte, 2);
  4393         -      sprintf(byte, "%02x", color.Blue());
  4394         -      memcpy(BgColor + 4, byte, 2);
  4395         -      *(BgColor + 6) = '\0';
  4396         -      wxBitmap bmp;
  4397         -      GetButtonBitmap(BgColor, bmp);
  4398         -      wxBitmapButton *bgColorCtrl =
  4399         -        (wxBitmapButton *) FindWindow(ID_WMS_BGCOLOR);
  4400         -      bgColorCtrl->SetBitmapLabel(bmp);
  4401         -      DoUpdateSql();
  4402         -    }
  4403         -}
  4404         -
  4405         -void WmsSqlSampleDialog::OnCopy(wxCommandEvent & WXUNUSED(event))
  4406         -{
  4407         -//
  4408         -// Copying the Map Request (SQL statement) 
  4409         -//
  4410         -  if (wxTheClipboard->Open())
  4411         -    {
  4412         -      wxTheClipboard->SetData(new wxTextDataObject(Sql));
  4413         -      wxTheClipboard->Close();
  4414         -    }
  4415         -}
  4416         -
  4417         -void WmsSqlSampleDialog::OnQuit(wxCommandEvent & WXUNUSED(event))
  4418         -{
  4419         -//
  4420         -// all done: 
  4421         -//
  4422         -  wxDialog::EndModal(wxID_CANCEL);
  4423         -}

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      5   / version 1.7, 2014 May 8
     6      6   /
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
     8      8   /
     9      9   / Copyright (C) 2008-2014  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
    13     13   /    the Free Software Foundation, either version 3 of the License, or
    14     14   /    (at your option) any later version.
................................................................................
    31     31   #include "wx/config.h"
    32     32   #include "wx/tokenzr.h"
    33     33   
    34     34   #include <spatialite.h>
    35     35   #include <proj_api.h>
    36     36   #include <geos_c.h>
    37     37   
    38         -#include <virtualpg.h>
    39         -
    40     38   //
    41     39   // ICONs in XPM format [universally portable]
    42     40   //
    43     41   #include "icons/icon.xpm"
    44     42   #include "icons/icon_info.xpm"
    45     43   #include "icons/create_new.xpm"
    46     44   #include "icons/connect.xpm"
................................................................................
    77     75   #include "icons/sanegeom.xpm"
    78     76   #include "icons/wfs.xpm"
    79     77   #include "icons/dxf.xpm"
    80     78   #include "icons/map_go.xpm"
    81     79   #include "icons/security_lock.xpm"
    82     80   #include "icons/security_relaxed.xpm"
    83     81   #include "icons/security_rdonly.xpm"
    84         -#include "icons/postgres.xpm"
           82  +
    85     83   
    86     84   #if defined(_WIN32) && !defined(__MINGW32__)
    87     85   #define unlink	_unlink
    88     86   #endif
    89     87   
    90     88   IMPLEMENT_APP(MyApp)
    91     89        bool MyApp::OnInit()
................................................................................
   112    110   //
   113    111   // main GUI frame constructor
   114    112   //
   115    113     setlocale(LC_ALL, "");
   116    114   // forcing DECIMAL POINT IS COMMA
   117    115     setlocale(LC_NUMERIC, "C");
   118    116   
   119         -// setting up the LibPQ virtual API
   120         -  DoInitVirtualPQapi();
   121         -
   122    117   // creating the internal WMS Cache
   123    118     WmsCache = create_wms_cache();
   124    119   
   125    120     ::wxInitAllImageHandlers();
   126    121   
   127    122     MapPanel = NULL;
   128    123     Old_SPATIALITE_SECURITY_ENV = NULL;
................................................................................
   344    339     BtnSqlLog = new wxBitmap(sql_log_xpm);
   345    340     BtnDbStatus = new wxBitmap(db_status_xpm);
   346    341     BtnCheckGeom = new wxBitmap(checkgeom_xpm);
   347    342     BtnSaneGeom = new wxBitmap(sanegeom_xpm);
   348    343     BtnWFS = new wxBitmap(wfs_xpm);
   349    344     BtnDXF = new wxBitmap(dxf_xpm);
   350    345     BtnMap = new wxBitmap(map_go_xpm);
   351         -  BtnPostgres = new wxBitmap(postgres_xpm);
   352    346   
   353    347   //
   354    348   // setting up the application icon
   355    349   //      
   356    350     wxIcon MyIcon(icon_xpm);
   357    351     SetIcon(MyIcon);
   358    352   
................................................................................
   454    448     menuItem->SetBitmap(*BtnVacuum);
   455    449     menuFile->Append(menuItem);
   456    450     menuItem = new wxMenuItem(menuFile, ID_Attach, wxT("&Attach DataBase"));
   457    451     menuItem->SetBitmap(*BtnAttach);
   458    452     menuFile->Append(menuItem);
   459    453     menuFile->AppendSeparator();
   460    454     menuItem =
   461         -    new wxMenuItem(menuFile, ID_Postgres, wxT("&Connecting to PostgreSQL"));
   462         -  menuItem->SetBitmap(*BtnPostgres);
   463         -  menuFile->Append(menuItem);
   464         -  menuFile->AppendSeparator();
   465         -  menuItem =
   466    455       new wxMenuItem(menuFile, ID_MapPanel, wxT("Map &Panel"), wxT("Map &Panel"),
   467    456                      wxITEM_CHECK);
   468    457     menuFile->Append(menuItem);
   469    458     menuFile->AppendSeparator();
   470    459     wxMenu *advancedMenu = new wxMenu();
   471    460     menuItem =
   472    461       new wxMenuItem(advancedMenu, ID_SqlScript, wxT("&Execute SQL script"));
................................................................................
   505    494     menuItem = new wxMenuItem(advancedMenu, ID_LoadXL, wxT("Load &XLS"));
   506    495     menuItem->SetBitmap(*BtnLoadXL);
   507    496     advancedMenu->Append(menuItem);
   508    497     menuItem = new wxMenuItem(advancedMenu, ID_VirtualXL, wxT("Virtual &XLS"));
   509    498     menuItem->SetBitmap(*BtnVirtualXL);
   510    499     advancedMenu->Append(menuItem);
   511    500     advancedMenu->AppendSeparator();
   512         -  menuItem = new wxMenuItem(advancedMenu, ID_Network, wxT("Create &Network"));
          501  +  menuItem = new wxMenuItem(advancedMenu, ID_Network, wxT("Build &Network"));
   513    502     menuItem->SetBitmap(*BtnNetwork);
   514    503     advancedMenu->Append(menuItem);
   515    504     advancedMenu->AppendSeparator();
   516    505     menuItem = new wxMenuItem(advancedMenu, ID_Exif, wxT("Import &EXIF photos"));
   517    506     menuItem->SetBitmap(*BtnExif);
   518    507     advancedMenu->Append(menuItem);
   519    508     menuItem =
................................................................................
   572    561   //
   573    562   // setting up menu initial state 
   574    563   //
   575    564     menuBar->Enable(ID_Disconnect, false);
   576    565     menuBar->Enable(ID_MemoryDbClock, false);
   577    566     menuBar->Enable(ID_MemoryDbSave, false);
   578    567     menuBar->Enable(ID_Vacuum, false);
   579         -  menuBar->Enable(ID_Postgres, false);
   580    568     menuBar->Enable(ID_MapPanel, false);
   581    569     menuBar->Enable(ID_SqlScript, false);
   582    570     menuBar->Enable(ID_QueryViewComposer, false);
   583    571     menuBar->Enable(ID_LoadShp, false);
   584    572     menuBar->Enable(ID_VirtualShp, false);
   585    573     menuBar->Enable(ID_LoadTxt, false);
   586    574     menuBar->Enable(ID_VirtualTxt, false);
................................................................................
   633    621                      wxT("Disconnecting current SQLite DB"));
   634    622     toolBar->AddTool(ID_Vacuum, wxT("Optimizing current SQLite DB [VACUUM]"),
   635    623                      *BtnVacuum, wxNullBitmap, wxITEM_NORMAL,
   636    624                      wxT("Optimizing current SQLite DB [VACUUM]"));
   637    625     toolBar->AddTool(ID_Attach, wxT("Attach DataBase"),
   638    626                      *BtnAttach, wxNullBitmap, wxITEM_NORMAL,
   639    627                      wxT("Attach DataBase"));
   640         -  toolBar->AddTool(ID_Postgres, wxT("Connecting to PostgreSQL"),
   641         -                   *BtnPostgres, wxNullBitmap, wxITEM_CHECK,
   642         -                   wxT("Connecting to PostgreSQL"));
   643         -  toolBar->AddTool(ID_MapPanel, wxT("Map Panel"), *BtnMap, wxNullBitmap,
   644         -                   wxITEM_CHECK, wxT("Map Panel"));
   645         -  toolBar->AddTool(ID_SqlLog, wxT("SQL Log"), *BtnSqlLog, wxNullBitmap,
   646         -                   wxITEM_CHECK, wxT("SQL Log"));
   647         -  toolBar->AddTool(ID_DbStatus, wxT("DB Status"), *BtnDbStatus, wxNullBitmap,
   648         -                   wxITEM_NORMAL, wxT("DB Status"));
   649         -  toolBar->AddTool(ID_CheckGeom, wxT("Check Geometries"), *BtnCheckGeom,
   650         -                   wxNullBitmap, wxITEM_NORMAL, wxT("Check Geometries"));
          628  +  toolBar->AddTool(ID_MapPanel, wxT("Map Panel"),
          629  +                   *BtnMap, wxNullBitmap, wxITEM_CHECK, wxT("Map Panel"));
          630  +  toolBar->AddTool(ID_SqlLog, wxT("SQL Log"),
          631  +                   *BtnSqlLog, wxNullBitmap, wxITEM_CHECK, wxT("SQL Log"));
          632  +  toolBar->AddTool(ID_DbStatus, wxT("DB Status"),
          633  +                   *BtnDbStatus, wxNullBitmap, wxITEM_NORMAL, wxT("DB Status"));
          634  +  toolBar->AddTool(ID_CheckGeom, wxT("Check Geometries"),
          635  +                   *BtnCheckGeom, wxNullBitmap, wxITEM_NORMAL,
          636  +                   wxT("Check Geometries"));
   651    637     toolBar->AddTool(ID_SaneGeom, wxT("Sanitize Geometries"), *BtnSaneGeom,
   652    638                      wxNullBitmap, wxITEM_NORMAL, wxT("Sanitize Geometries"));
   653    639     toolBar->AddTool(ID_SqlScript, wxT("Execute SQL script"), *BtnSqlScript,
   654    640                      wxNullBitmap, wxITEM_NORMAL, wxT("Execute SQL script"));
   655    641     toolBar->AddTool(ID_QueryViewComposer, wxT("Query/View Composer"),
   656    642                      *BtnQueryComposer, wxNullBitmap, wxITEM_NORMAL,
   657    643                      wxT("Query/View Composer"));
................................................................................
   667    653                      wxITEM_NORMAL, wxT("Load DBF"));
   668    654     toolBar->AddTool(ID_VirtualDbf, wxT("Virtual DBF"), *BtnVirtualDbf,
   669    655                      wxNullBitmap, wxITEM_NORMAL, wxT("Virtual DBF"));
   670    656     toolBar->AddTool(ID_LoadXL, wxT("Load XLS"), *BtnLoadXL, wxNullBitmap,
   671    657                      wxITEM_NORMAL, wxT("Load XLS"));
   672    658     toolBar->AddTool(ID_VirtualXL, wxT("Virtual XLS"), *BtnVirtualXL,
   673    659                      wxNullBitmap, wxITEM_NORMAL, wxT("Virtual XLS"));
   674         -  toolBar->AddTool(ID_Network, wxT("Create Network"), *BtnNetwork, wxNullBitmap,
   675         -                   wxITEM_NORMAL, wxT("Create Network"));
          660  +  toolBar->AddTool(ID_Network, wxT("Build Network"), *BtnNetwork, wxNullBitmap,
          661  +                   wxITEM_NORMAL, wxT("Build Network"));
   676    662     toolBar->AddTool(ID_Exif, wxT("Import EXIF photos"), *BtnExif, wxNullBitmap,
   677    663                      wxITEM_NORMAL, wxT("Import EXIF photos"));
   678    664     toolBar->AddTool(ID_GpsPics, wxT("Import GPS photos"), *BtnGpsPics,
   679    665                      wxNullBitmap, wxITEM_NORMAL, wxT("Import GPS photos"));
   680    666     toolBar->AddTool(ID_LoadXml, wxT("Import XML Documents"), *BtnLoadXml,
   681    667                      wxNullBitmap, wxITEM_NORMAL, wxT("Import XML Documents"));
   682    668     toolBar->AddTool(ID_WFS, wxT("Import data from WFS datasource"), *BtnWFS,
................................................................................
   700    686   //
   701    687   // setting up the toolbar initial state
   702    688   //
   703    689     toolBar->EnableTool(ID_Disconnect, false);
   704    690     toolBar->EnableTool(ID_MemoryDbClock, false);
   705    691     toolBar->EnableTool(ID_MemoryDbSave, false);
   706    692     toolBar->EnableTool(ID_Vacuum, false);
   707         -  toolBar->EnableTool(ID_Postgres, false);
   708    693     toolBar->EnableTool(ID_MapPanel, false);
   709    694     toolBar->EnableTool(ID_SqlScript, false);
   710    695     toolBar->EnableTool(ID_QueryViewComposer, false);
   711    696     toolBar->EnableTool(ID_LoadShp, false);
   712    697     toolBar->EnableTool(ID_VirtualShp, false);
   713    698     toolBar->EnableTool(ID_LoadTxt, false);
   714    699     toolBar->EnableTool(ID_VirtualTxt, false);
................................................................................
   749    734             (wxObjectEventFunction) & MyFrame::OnMemoryDbNew);
   750    735     Connect(ID_MemoryDbClock, wxEVT_COMMAND_MENU_SELECTED,
   751    736             (wxObjectEventFunction) & MyFrame::OnMemoryDbClock);
   752    737     Connect(ID_MemoryDbSave, wxEVT_COMMAND_MENU_SELECTED,
   753    738             (wxObjectEventFunction) & MyFrame::OnMemoryDbSave);
   754    739     Connect(ID_Vacuum, wxEVT_COMMAND_MENU_SELECTED,
   755    740             (wxObjectEventFunction) & MyFrame::OnVacuum);
   756         -  Connect(ID_Postgres, wxEVT_COMMAND_MENU_SELECTED,
   757         -          (wxObjectEventFunction) & MyFrame::OnPostgreSQL);
   758    741     Connect(ID_MapPanel, wxEVT_COMMAND_MENU_SELECTED,
   759    742             (wxObjectEventFunction) & MyFrame::OnMapPanel);
   760    743     Connect(ID_SqlScript, wxEVT_COMMAND_MENU_SELECTED,
   761    744             (wxObjectEventFunction) & MyFrame::OnSqlScript);
   762    745     Connect(ID_QueryViewComposer, wxEVT_COMMAND_MENU_SELECTED,
   763    746             (wxObjectEventFunction) & MyFrame::OnQueryViewComposer);
   764    747     Connect(ID_LoadShp, wxEVT_COMMAND_MENU_SELECTED,
................................................................................
   878    861       delete BtnMemDbClock;
   879    862     if (BtnMemDbSave != NULL)
   880    863       delete BtnMemDbSave;
   881    864     if (BtnVacuum != NULL)
   882    865       delete BtnVacuum;
   883    866     if (BtnMap != NULL)
   884    867       delete BtnMap;
   885         -  if (BtnPostgres != NULL)
   886         -    delete BtnPostgres;
   887    868     if (BtnSqlScript != NULL)
   888    869       delete BtnSqlScript;
   889    870     if (BtnQueryComposer != NULL)
   890    871       delete BtnQueryComposer;
   891    872     if (BtnLoadShp != NULL)
   892    873       delete BtnLoadShp;
   893    874     if (BtnVirtualShp != NULL)
................................................................................
   940    921       delete[]Charsets;
   941    922     if (CharsetsNames)
   942    923       delete[]CharsetsNames;
   943    924     if (WmsCache != NULL)
   944    925       destroy_wms_cache(WmsCache);
   945    926     if (RL2PrivateData)
   946    927       rl2_cleanup_private(RL2PrivateData);
   947         -  if (DynamicLibPQ.IsLoaded() == true)
   948         -    DynamicLibPQ.Unload();
   949    928   }
   950    929   
   951    930   void MyFrame::SaveConfig()
   952    931   {
   953    932   //
   954    933   // saves layout configuration
   955    934   //
................................................................................
   964    943     config->Write(wxT("WfsGetCapabilitiesURL"), WfsGetCapabilitiesURL);
   965    944     config->Write(wxT("HttpProxy"), HttpProxy);
   966    945     config->Write(wxT("ReadOnlyConnection"), ReadOnlyConnection);
   967    946     config->Write(wxT("RL2MaxThreads"), RL2MaxThreads);
   968    947     config->Write(wxT("MapMultiThreadingEnabled"), MapMultiThreadingEnabled);
   969    948     config->Write(wxT("MapMaxThreads"), MapMaxThreads);
   970    949     config->Write(wxT("MapAutoTransformEnabled"), MapAutoTransformEnabled);
   971         -  config->Write(wxT("PathLibPQ"), PathLibPQ);
   972    950     delete config;
   973    951   }
   974    952   
   975    953   void MyFrame::LoadConfig(wxString & externalPath)
   976    954   {
   977    955   //
   978    956   // loads layout configuration
................................................................................
   991    969     config->Read(wxT("WfsGetCapabilitiesURL"), &WfsGetCapabilitiesURL);
   992    970     config->Read(wxT("HttpProxy"), &HttpProxy);
   993    971     config->Read(wxT("ReadOnlyConnection"), &ReadOnlyConnection);
   994    972     config->Read(wxT("RL2MaxThreads"), &RL2MaxThreads);
   995    973     config->Read(wxT("MapMultiThreadingEnabled"), &MapMultiThreadingEnabled);
   996    974     config->Read(wxT("MapMaxThreads"), &MapMaxThreads);
   997    975     config->Read(wxT("MapAutoTransformEnabled"), &MapAutoTransformEnabled);
   998         -  config->Read(wxT("PathLibPQ"), &PathLibPQ);
   999    976     delete config;
  1000    977     Hide();
  1001    978     if (externalPath.Len() > 0)
  1002    979       {
  1003    980         // applying the external path
  1004    981         wxFileName file(externalPath);
  1005    982         ConfigDir = file.GetPath();
................................................................................
  1033   1010               {
  1034   1011                 menuBar->Enable(ID_MemoryDbSave, false);
  1035   1012                 menuBar->Enable(ID_MemoryDbClock, false);
  1036   1013               }
  1037   1014             menuBar->Enable(ID_CreateNew, false);
  1038   1015             menuBar->Enable(ID_Disconnect, true);
  1039   1016             menuBar->Enable(ID_Vacuum, true);
  1040         -          menuBar->Enable(ID_Postgres, true);
  1041   1017             menuBar->Enable(ID_MapPanel, true);
  1042   1018             menuBar->Enable(ID_SqlScript, true);
  1043   1019             menuBar->Enable(ID_QueryViewComposer, HasViewsMetadata());
  1044   1020             menuBar->Enable(ID_LoadShp, true);
  1045   1021             menuBar->Enable(ID_VirtualShp, true);
  1046   1022             menuBar->Enable(ID_LoadTxt, true);
  1047   1023             menuBar->Enable(ID_VirtualTxt, true);
................................................................................
  1076   1052               {
  1077   1053                 toolBar->EnableTool(ID_MemoryDbSave, false);
  1078   1054                 toolBar->EnableTool(ID_MemoryDbClock, false);
  1079   1055               }
  1080   1056             toolBar->EnableTool(ID_CreateNew, false);
  1081   1057             toolBar->EnableTool(ID_Disconnect, true);
  1082   1058             toolBar->EnableTool(ID_Vacuum, true);
  1083         -          toolBar->EnableTool(ID_Postgres, true);
  1084   1059             toolBar->EnableTool(ID_MapPanel, true);
  1085   1060             toolBar->EnableTool(ID_SqlScript, true);
  1086   1061             toolBar->EnableTool(ID_QueryViewComposer, HasViewsMetadata());
  1087   1062             toolBar->EnableTool(ID_LoadShp, true);
  1088   1063             toolBar->EnableTool(ID_VirtualShp, true);
  1089   1064             toolBar->EnableTool(ID_LoadTxt, true);
  1090   1065             toolBar->EnableTool(ID_VirtualTxt, true);
................................................................................
  1104   1079             toolBar->ToggleTool(ID_SqlLog, SqlLogEnabled);
  1105   1080             toolBar->EnableTool(ID_DbStatus, true);
  1106   1081             toolBar->EnableTool(ID_CheckGeom, true);
  1107   1082             toolBar->EnableTool(ID_SaneGeom, true);
  1108   1083             UpdateStatusBar();
  1109   1084           }
  1110   1085       }
  1111         -  if (VirtualPQapiOK == false)
  1112         -    {
  1113         -      // attempting to attempting to load LibPQ
  1114         -      if (PathLibPQ.Len() > 0)
  1115         -        {
  1116         -          // using the same path from the previous session
  1117         -          DoLoadLibPQ(PathLibPQ);
  1118         -        }
  1119         -      if (VirtualPQapiOK == false)
  1120         -        {
  1121         -          // using just the library name
  1122         -          wxString path;
  1123         -#ifdef _WIN32
  1124         -          path = wxDynamicLibrary::CanonicalizeName(wxT("libpq"));
  1125         -#else
  1126         -          path = wxDynamicLibrary::CanonicalizeName(wxT("pq"));
  1127         -#endif
  1128         -          DoLoadLibPQ(path);
  1129         -        }
  1130         -    }
  1131   1086     Show();
  1132   1087     if (AutoFDOmsg.Len() > 0)
  1133   1088       {
  1134   1089         wxMessageBox(AutoFDOmsg, wxT("spatialite_gui"), wxOK | wxICON_INFORMATION,
  1135   1090                      this);
  1136   1091         AutoFDOmsg = wxT("");
  1137   1092       }
................................................................................
  1147   1102   {
  1148   1103   //
  1149   1104   // EXIT - event handler
  1150   1105   //
  1151   1106     Close(true);
  1152   1107   }
  1153   1108   
  1154         -void MyFrame::OnClose(wxCloseEvent & WXUNUSED(event))
         1109  +void MyFrame::OnClose(wxCloseEvent & event)
  1155   1110   {
  1156   1111   //
  1157   1112   // immedtiately before closing the main window
  1158   1113   //
  1159   1114     wxString db_path = SqlitePath;
  1160   1115     CloseDB();
  1161   1116     SqlitePath = db_path;
................................................................................
  1495   1450         str += wxT("RTTOPO version ") + wxString::FromUTF8(ver) + wxT("\n");
  1496   1451       }
  1497   1452     if (GetLibXml2Version(ver))
  1498   1453       {
  1499   1454         // printing out the LIBXML2 version if supported
  1500   1455         str += wxT("LIBXML2 version ") + wxString::FromUTF8(ver) + wxT("\n");
  1501   1456       }
  1502         -  strcpy(ver, virtualpg_version());
  1503         -  str += wxT("VirtualPG version ") + wxString::FromUTF8(ver) + wxT("\n");
  1504         -  wxString pqver;
  1505         -  GetPQlibVersion(pqver);
  1506         -  str += wxT("PQlib (PostgreSQL client) version ") + pqver + wxT("\n");
  1507   1457     str +=
  1508   1458       wxT("\nSQLite's extensions: 'SpatiaLite', 'VirtualShape', 'VirtualDbf',\n");
  1509   1459     str += wxT("'VirtualXL', 'VirtualText', 'VirtualXPath', 'VirtualNetwork',\n");
  1510   1460     str +=
  1511   1461       wxT("'RTree', 'MbrCache', 'VirtualBBox', 'VirtualFDO', 'VirtualGPKG',\n");
  1512   1462     str += wxT("'RasterLite2'\n\n");
  1513   1463     strcpy(ver, spatialite_target_cpu());
................................................................................
  1641   1591                 menuBar->Enable(ID_MemoryDbClock, true);
  1642   1592             } else
  1643   1593               {
  1644   1594                 menuBar->Enable(ID_MemoryDbSave, false);
  1645   1595                 menuBar->Enable(ID_MemoryDbClock, false);
  1646   1596               }
  1647   1597             menuBar->Enable(ID_Vacuum, true);
  1648         -          menuBar->Enable(ID_Postgres, true);
  1649   1598             menuBar->Enable(ID_MapPanel, true);
  1650   1599             menuBar->Enable(ID_SqlScript, true);
  1651   1600             menuBar->Enable(ID_QueryViewComposer, HasViewsMetadata());
  1652   1601             menuBar->Enable(ID_LoadShp, true);
  1653   1602             menuBar->Enable(ID_VirtualShp, true);
  1654   1603             menuBar->Enable(ID_LoadTxt, true);
  1655   1604             menuBar->Enable(ID_VirtualTxt, true);
................................................................................
  1684   1633                 toolBar->EnableTool(ID_MemoryDbClock, true);
  1685   1634             } else
  1686   1635               {
  1687   1636                 toolBar->EnableTool(ID_MemoryDbSave, false);
  1688   1637                 toolBar->EnableTool(ID_MemoryDbClock, false);
  1689   1638               }
  1690   1639             toolBar->EnableTool(ID_Vacuum, true);
  1691         -          toolBar->EnableTool(ID_Postgres, true);
  1692   1640             toolBar->EnableTool(ID_MapPanel, true);
  1693   1641             toolBar->EnableTool(ID_SqlScript, true);
  1694   1642             toolBar->EnableTool(ID_QueryViewComposer, HasViewsMetadata());
  1695   1643             toolBar->EnableTool(ID_LoadShp, true);
  1696   1644             toolBar->EnableTool(ID_VirtualShp, true);
  1697   1645             toolBar->EnableTool(ID_LoadTxt, true);
  1698   1646             toolBar->EnableTool(ID_VirtualTxt, true);
................................................................................
  1747   1695         mode2 = false;
  1748   1696         mode3 = false;
  1749   1697       }
  1750   1698   
  1751   1699     wxMenuBar *menuBar = GetMenuBar();
  1752   1700     menuBar->Enable(ID_Disconnect, mode);
  1753   1701     menuBar->Enable(ID_Vacuum, mode);
  1754         -  menuBar->Enable(ID_Postgres, mode);
  1755   1702     menuBar->Enable(ID_MapPanel, mode);
  1756   1703     menuBar->Enable(ID_SqlScript, mode);
  1757   1704     menuBar->Enable(ID_QueryViewComposer, mode2);
  1758   1705     menuBar->Enable(ID_LoadShp, mode);
  1759   1706     menuBar->Enable(ID_VirtualShp, mode);
  1760   1707     menuBar->Enable(ID_LoadTxt, mode);
  1761   1708     menuBar->Enable(ID_VirtualTxt, mode);
................................................................................
  1774   1721     menuBar->Enable(ID_SqlLog, mode);
  1775   1722     menuBar->Enable(ID_DbStatus, mode);
  1776   1723     menuBar->Enable(ID_CheckGeom, mode);
  1777   1724     menuBar->Enable(ID_SaneGeom, mode);
  1778   1725     wxToolBar *toolBar = GetToolBar();
  1779   1726     toolBar->EnableTool(ID_Disconnect, mode);
  1780   1727     toolBar->EnableTool(ID_Vacuum, mode);
  1781         -  toolBar->EnableTool(ID_Postgres, mode);
  1782   1728     toolBar->EnableTool(ID_MapPanel, mode);
  1783   1729     toolBar->EnableTool(ID_SqlScript, mode);
  1784   1730     toolBar->EnableTool(ID_QueryViewComposer, mode2);
  1785   1731     toolBar->EnableTool(ID_LoadShp, mode);
  1786   1732     toolBar->EnableTool(ID_VirtualShp, mode);
  1787   1733     toolBar->EnableTool(ID_LoadTxt, mode);
  1788   1734     toolBar->EnableTool(ID_VirtualTxt, mode);
................................................................................
  1856   1802                 menuBar->Enable(ID_MemoryDbClock, true);
  1857   1803             } else
  1858   1804               {
  1859   1805                 menuBar->Enable(ID_MemoryDbSave, false);
  1860   1806                 menuBar->Enable(ID_MemoryDbClock, false);
  1861   1807               }
  1862   1808             menuBar->Enable(ID_Vacuum, true);
  1863         -          menuBar->Enable(ID_Postgres, true);
  1864   1809             menuBar->Enable(ID_MapPanel, true);
  1865   1810             menuBar->Enable(ID_SqlScript, true);
  1866   1811             menuBar->Enable(ID_QueryViewComposer, HasViewsMetadata());
  1867   1812             menuBar->Enable(ID_LoadShp, true);
  1868   1813             menuBar->Enable(ID_VirtualShp, true);
  1869   1814             menuBar->Enable(ID_LoadTxt, true);
  1870   1815             menuBar->Enable(ID_VirtualTxt, true);
................................................................................
  1899   1844                 toolBar->EnableTool(ID_MemoryDbClock, true);
  1900   1845             } else
  1901   1846               {
  1902   1847                 toolBar->EnableTool(ID_MemoryDbSave, false);
  1903   1848                 toolBar->EnableTool(ID_MemoryDbClock, false);
  1904   1849               }
  1905   1850             toolBar->EnableTool(ID_Vacuum, true);
  1906         -          toolBar->EnableTool(ID_Postgres, true);
  1907   1851             toolBar->EnableTool(ID_MapPanel, true);
  1908   1852             toolBar->EnableTool(ID_SqlScript, true);
  1909   1853             toolBar->EnableTool(ID_QueryViewComposer, HasViewsMetadata());
  1910   1854             toolBar->EnableTool(ID_LoadShp, true);
  1911   1855             toolBar->EnableTool(ID_VirtualShp, true);
  1912   1856             toolBar->EnableTool(ID_LoadTxt, true);
  1913   1857             toolBar->EnableTool(ID_VirtualTxt, true);
................................................................................
  1965   1909     menuBar->Enable(ID_CreateNew, true);
  1966   1910     menuBar->Enable(ID_Disconnect, false);
  1967   1911     menuBar->Enable(ID_MemoryDbLoad, true);
  1968   1912     menuBar->Enable(ID_MemoryDbNew, true);
  1969   1913     menuBar->Enable(ID_MemoryDbSave, false);
  1970   1914     menuBar->Enable(ID_MemoryDbClock, false);
  1971   1915     menuBar->Enable(ID_Vacuum, false);
  1972         -  menuBar->Enable(ID_Postgres, false);
  1973   1916     menuBar->Enable(ID_MapPanel, false);
  1974   1917     menuBar->Enable(ID_SqlScript, false);
  1975   1918     menuBar->Enable(ID_QueryViewComposer, false);
  1976   1919     menuBar->Enable(ID_LoadShp, false);
  1977   1920     menuBar->Enable(ID_VirtualShp, false);
  1978   1921     menuBar->Enable(ID_LoadTxt, false);
  1979   1922     menuBar->Enable(ID_VirtualTxt, false);
................................................................................
  2000   1943     toolBar->EnableTool(ID_CreateNew, true);
  2001   1944     toolBar->EnableTool(ID_Disconnect, false);
  2002   1945     toolBar->EnableTool(ID_MemoryDbLoad, true);
  2003   1946     toolBar->EnableTool(ID_MemoryDbNew, true);
  2004   1947     toolBar->EnableTool(ID_MemoryDbSave, false);
  2005   1948     toolBar->EnableTool(ID_MemoryDbClock, false);
  2006   1949     toolBar->EnableTool(ID_Vacuum, false);
  2007         -  toolBar->EnableTool(ID_Postgres, false);
  2008   1950     toolBar->EnableTool(ID_MapPanel, false);
  2009   1951     toolBar->EnableTool(ID_SqlScript, false);
  2010   1952     toolBar->EnableTool(ID_QueryViewComposer, false);
  2011   1953     toolBar->EnableTool(ID_LoadShp, false);
  2012   1954     toolBar->EnableTool(ID_VirtualShp, false);
  2013   1955     toolBar->EnableTool(ID_LoadTxt, false);
  2014   1956     toolBar->EnableTool(ID_VirtualTxt, false);
................................................................................
  2071   2013         menuBar->Enable(ID_CreateNew, false);
  2072   2014         menuBar->Enable(ID_Disconnect, true);
  2073   2015         menuBar->Enable(ID_MemoryDbLoad, false);
  2074   2016         menuBar->Enable(ID_MemoryDbNew, false);
  2075   2017         menuBar->Enable(ID_MemoryDbSave, false);
  2076   2018         menuBar->Enable(ID_MemoryDbClock, false);
  2077   2019         menuBar->Enable(ID_Vacuum, true);
  2078         -      menuBar->Enable(ID_Postgres, true);
  2079   2020         menuBar->Enable(ID_MapPanel, true);
  2080   2021         menuBar->Enable(ID_SqlScript, true);
  2081   2022         menuBar->Enable(ID_QueryViewComposer, HasViewsMetadata());
  2082   2023         menuBar->Enable(ID_LoadShp, true);
  2083   2024         menuBar->Enable(ID_VirtualShp, true);
  2084   2025         menuBar->Enable(ID_LoadTxt, true);
  2085   2026         menuBar->Enable(ID_VirtualTxt, true);
................................................................................
  2107   2048         toolBar->EnableTool(ID_CreateNew, false);
  2108   2049         toolBar->EnableTool(ID_Disconnect, true);
  2109   2050         toolBar->EnableTool(ID_MemoryDbLoad, false);
  2110   2051         toolBar->EnableTool(ID_MemoryDbNew, false);
  2111   2052         toolBar->EnableTool(ID_MemoryDbSave, false);
  2112   2053         toolBar->EnableTool(ID_MemoryDbClock, false);
  2113   2054         toolBar->EnableTool(ID_Vacuum, true);
  2114         -      toolBar->EnableTool(ID_Postgres, true);
  2115   2055         toolBar->EnableTool(ID_MapPanel, true);
  2116   2056         toolBar->EnableTool(ID_SqlScript, true);
  2117   2057         toolBar->EnableTool(ID_QueryViewComposer, HasViewsMetadata());
  2118   2058         toolBar->EnableTool(ID_LoadShp, true);
  2119   2059         toolBar->EnableTool(ID_VirtualShp, true);
  2120   2060         toolBar->EnableTool(ID_LoadTxt, true);
  2121   2061         toolBar->EnableTool(ID_VirtualTxt, true);
................................................................................
  2214   2154           }
  2215   2155         ret = sqlite3_backup_finish(backup);
  2216   2156         sqlite3_close(extSqlite);
  2217   2157   // setting up the internal cache
  2218   2158         SpliteInternalCache = spatialite_alloc_connection();
  2219   2159         spatialite_init_ex(SqliteHandle, SpliteInternalCache, 0);
  2220   2160         rl2_init(SqliteHandle, RL2PrivateData, 0);
  2221         -      DoInitVirtualPG();
  2222   2161   // enabling LOAD_EXTENSION
  2223   2162         ret = sqlite3_enable_load_extension(SqliteHandle, 1);
  2224   2163         if (ret != SQLITE_OK)
  2225   2164           {
  2226   2165             wxMessageBox(wxT("Unable to enable LOAD_EXTENSION"),
  2227   2166                          wxT("spatialite_gui"), wxOK | wxICON_INFORMATION, this);
  2228   2167             sqlite3_free(errMsg);
................................................................................
  2259   2198             menuBar->Enable(ID_MemoryDbClock, true);
  2260   2199         } else
  2261   2200           {
  2262   2201             menuBar->Enable(ID_MemoryDbSave, false);
  2263   2202             menuBar->Enable(ID_MemoryDbClock, false);
  2264   2203           }
  2265   2204         menuBar->Enable(ID_Vacuum, true);
  2266         -      menuBar->Enable(ID_Postgres, true);
  2267   2205         menuBar->Enable(ID_MapPanel, true);
  2268   2206         menuBar->Enable(ID_SqlScript, true);
  2269   2207         menuBar->Enable(ID_QueryViewComposer, HasViewsMetadata());
  2270   2208         menuBar->Enable(ID_LoadShp, true);
  2271   2209         menuBar->Enable(ID_VirtualShp, true);
  2272   2210         menuBar->Enable(ID_LoadTxt, true);
  2273   2211         menuBar->Enable(ID_VirtualTxt, true);
................................................................................
  2302   2240             toolBar->EnableTool(ID_MemoryDbClock, true);
  2303   2241         } else
  2304   2242           {
  2305   2243             toolBar->EnableTool(ID_MemoryDbSave, false);
  2306   2244             toolBar->EnableTool(ID_MemoryDbClock, false);
  2307   2245           }
  2308   2246         toolBar->EnableTool(ID_Vacuum, true);
  2309         -      toolBar->EnableTool(ID_Postgres, true);
  2310   2247         toolBar->EnableTool(ID_MapPanel, true);
  2311   2248         toolBar->EnableTool(ID_SqlScript, true);
  2312   2249         toolBar->EnableTool(ID_QueryViewComposer, HasViewsMetadata());
  2313   2250         toolBar->EnableTool(ID_LoadShp, true);
  2314   2251         toolBar->EnableTool(ID_VirtualShp, true);
  2315   2252         toolBar->EnableTool(ID_LoadTxt, true);
  2316   2253         toolBar->EnableTool(ID_VirtualTxt, true);
................................................................................
  2406   2343     menuBar->Enable(ID_CreateNew, false);
  2407   2344     menuBar->Enable(ID_Disconnect, true);
  2408   2345     menuBar->Enable(ID_MemoryDbLoad, false);
  2409   2346     menuBar->Enable(ID_MemoryDbNew, false);
  2410   2347     menuBar->Enable(ID_MemoryDbSave, true);
  2411   2348     menuBar->Enable(ID_MemoryDbClock, true);
  2412   2349     menuBar->Enable(ID_Vacuum, true);
  2413         -  menuBar->Enable(ID_Postgres, true);
  2414   2350     menuBar->Enable(ID_MapPanel, true);
  2415   2351     menuBar->Enable(ID_SqlScript, true);
  2416   2352     menuBar->Enable(ID_QueryViewComposer, HasViewsMetadata());
  2417   2353     menuBar->Enable(ID_LoadShp, true);
  2418   2354     menuBar->Enable(ID_VirtualShp, true);
  2419   2355     menuBar->Enable(ID_LoadTxt, true);
  2420   2356     menuBar->Enable(ID_VirtualTxt, true);
................................................................................
  2442   2378     toolBar->EnableTool(ID_CreateNew, false);
  2443   2379     toolBar->EnableTool(ID_Disconnect, true);
  2444   2380     toolBar->EnableTool(ID_MemoryDbLoad, false);
  2445   2381     toolBar->EnableTool(ID_MemoryDbNew, false);
  2446   2382     toolBar->EnableTool(ID_MemoryDbSave, true);
  2447   2383     toolBar->EnableTool(ID_MemoryDbClock, true);
  2448   2384     toolBar->EnableTool(ID_Vacuum, true);
  2449         -  toolBar->EnableTool(ID_Postgres, true);
  2450   2385     toolBar->EnableTool(ID_MapPanel, true);
  2451   2386     toolBar->EnableTool(ID_SqlScript, true);
  2452   2387     toolBar->EnableTool(ID_QueryViewComposer, HasViewsMetadata());
  2453   2388     toolBar->EnableTool(ID_LoadShp, true);
  2454   2389     toolBar->EnableTool(ID_VirtualShp, true);
  2455   2390     toolBar->EnableTool(ID_LoadTxt, true);
  2456   2391     toolBar->EnableTool(ID_VirtualTxt, true);
................................................................................
  2806   2741               }
  2807   2742           }
  2808   2743       }
  2809   2744     sqlite3_free_table(results);
  2810   2745     return ok;
  2811   2746   }
  2812   2747   
  2813         -void MyFrame::CreateNetwork(wxString & table, wxString & from, wxString & to,
  2814         -                            bool isNoGeometry, wxString & geom,
  2815         -                            bool isNameEnabled, wxString & name,
  2816         -                            bool isGeomLength, wxString & cost,
  2817         -                            bool isBidirectional, bool isOneWays,
  2818         -                            wxString & oneWayFromTo, wxString & oneWayToFrom,
  2819         -                            bool aStarSupported, wxString & dataTableName,
  2820         -                            wxString & virtualTableName, bool overwrite)
  2821         -{
  2822         -//
  2823         -// creating VirtualRouting tables
  2824         -//
  2825         -  char *xtable = (char *) malloc(table.Len() * 4);
  2826         -  strcpy(xtable, table.ToUTF8());
  2827         -  char *xfrom = (char *) malloc(from.Len() * 4);
  2828         -  strcpy(xfrom, from.ToUTF8());
  2829         -  char *xto = (char *) malloc(to.Len() * 4);
  2830         -  strcpy(xto, to.ToUTF8());
  2831         -  char *xgeom = NULL;
  2832         -  if (isNoGeometry == false && geom.Len() > 0)
  2833         -    {
  2834         -      xgeom = (char *) malloc(geom.Len() * 4);
  2835         -      strcpy(xgeom, geom.ToUTF8());
  2836         -    }
  2837         -  char *xname = NULL;
  2838         -  if (isNameEnabled == true && name.Len() > 0)
  2839         -    {
  2840         -      xname = (char *) malloc(name.Len() * 4);
  2841         -      strcpy(xname, name.ToUTF8());
  2842         -    }
  2843         -  char *xcost = NULL;
  2844         -  if (isGeomLength == false && cost.Len() > 0)
  2845         -    {
  2846         -      xcost = (char *) malloc(cost.Len() * 4);
  2847         -      strcpy(xcost, cost.ToUTF8());
  2848         -    }
  2849         -  int xbidirectional = 0;
  2850         -  if (isBidirectional == true)
  2851         -    xbidirectional = 1;
  2852         -  char *xonewayfrom = NULL;
  2853         -  char *xonewayto = NULL;
  2854         -  if (isOneWays == true && oneWayFromTo.Len() > 0 && oneWayToFrom.Len() > 0)
  2855         -    {
  2856         -      xonewayfrom = (char *) malloc(oneWayFromTo.Len() * 4);
  2857         -      strcpy(xonewayfrom, oneWayFromTo.ToUTF8());
  2858         -      xonewayto = (char *) malloc(oneWayToFrom.Len() * 4);
  2859         -      strcpy(xonewayto, oneWayToFrom.ToUTF8());
  2860         -    }
  2861         -  int xastarsupported = 0;
  2862         -  if (aStarSupported == true)
  2863         -    xastarsupported = 1;
  2864         -  char *xdatatablename = (char *) malloc(dataTableName.Len() * 4);
  2865         -  strcpy(xdatatablename, dataTableName.ToUTF8());
  2866         -  char *xvirtualtablename = (char *) malloc(virtualTableName.Len() * 4);
  2867         -  strcpy(xvirtualtablename, virtualTableName.ToUTF8());
  2868         -  int xoverwrite = 0;
  2869         -  if (overwrite == true)
  2870         -    xoverwrite = 1;
  2871         -
  2872         -// preparing the SQL statement
  2873         -  char *sql = sqlite3_mprintf("SELECT CreateRouting(%Q, %Q, %Q, %Q, %Q",
  2874         -                              xdatatablename, xvirtualtablename, xtable, xfrom,
  2875         -                              xto);
  2876         -  char *prev = sql;
  2877         -  if (xgeom == NULL)
  2878         -    sql = sqlite3_mprintf("%s, NULL", prev);
  2879         -  else
  2880         -    sql = sqlite3_mprintf("%s, %Q", prev, xgeom);
  2881         -  sqlite3_free(prev);
  2882         -  prev = sql;
  2883         -  if (xcost == NULL)
  2884         -    sql = sqlite3_mprintf("%s, NULL", prev);
  2885         -  else
  2886         -    sql = sqlite3_mprintf("%s, %Q", prev, xcost);
  2887         -  sqlite3_free(prev);
  2888         -  prev = sql;
  2889         -  if (xname == NULL)
  2890         -    sql = sqlite3_mprintf("%s, NULL", prev);
  2891         -  else
  2892         -    sql = sqlite3_mprintf("%s, %Q", prev, xname);
  2893         -  sqlite3_free(prev);
  2894         -  prev = sql;
  2895         -  sql = sqlite3_mprintf("%s, %d, %d", prev, xastarsupported, xbidirectional);
  2896         -  sqlite3_free(prev);
  2897         -  prev = sql;
  2898         -  if (xonewayfrom != NULL && xonewayto != NULL)
  2899         -    sql = sqlite3_mprintf("%s, %Q, %Q", prev, xonewayfrom, xonewayto);
  2900         -  else
  2901         -    sql = sqlite3_mprintf("%s, NULL, NULL", prev);
  2902         -  sqlite3_free(prev);
  2903         -  prev = sql;
  2904         -  sql = sqlite3_mprintf("%s, %d)", prev, xoverwrite);
  2905         -  sqlite3_free(prev);
  2906         -
  2907         -// executing the SQL statement
  2908         -  int i;
  2909         -  char **results;
  2910         -  int rows;
  2911         -  int columns;
  2912         -  int success = 0;
  2913         -  int ret =
  2914         -    sqlite3_get_table(SqliteHandle, sql, &results, &rows, &columns, NULL);
  2915         -  sqlite3_free(sql);
  2916         -  if (ret != SQLITE_OK)
  2917         -    goto end;
  2918         -  if (rows < 1)
  2919         -    ;
  2920         -  else
  2921         -    {
  2922         -      for (i = 1; i <= rows; i++)
  2923         -        success = atoi(results[(i * columns) + 0]);
  2924         -    }
  2925         -  sqlite3_free_table(results);
  2926         -
  2927         -end:
  2928         -  free(xtable);
  2929         -  free(xfrom);
  2930         -  free(xto);
  2931         -  if (xgeom != NULL)
  2932         -    free(xgeom);
  2933         -  if (xname != NULL)
  2934         -    free(xname);
  2935         -  if (xcost != NULL)
  2936         -    free(xcost);
  2937         -  if (xonewayfrom != NULL)
  2938         -    free(xonewayfrom);
  2939         -  if (xonewayto != NULL)
  2940         -    free(xonewayto);
  2941         -  free(xdatatablename);
  2942         -  free(xvirtualtablename);
  2943         -  if (success)
  2944         -    {
  2945         -      wxString msg = wxT("The VirtualRouting Tables were succesfully created");
  2946         -      wxMessageBox(msg, wxT("spatialite_gui"), wxOK | wxICON_INFORMATION, this);
  2947         -      InitTableTree();
  2948         -  } else
  2949         -    {
  2950         -      // failure: reporting the error cause
  2951         -      wxString errCause = wxT("Unknown Cause");
  2952         -      GetLastRoutingError(errCause);
  2953         -      wxString msg =
  2954         -        wxT
  2955         -        ("Some error occurred forbidding to create the VirtualRouting Tables\n\n")
  2956         -        + errCause;
  2957         -      wxMessageBox(msg, wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
  2958         -    }
  2959         -
  2960         -}
  2961         -
  2962         -void MyFrame::GetLastRoutingError(wxString & msg)
  2963         -{
  2964         -//
  2965         -// attempting to retrieve the most recent failure cause - CreateRouting
  2966         -//
  2967         -  int i;
  2968         -  char **results;
  2969         -  int rows;
  2970         -  int columns;
  2971         -  int ret =
  2972         -    sqlite3_get_table(SqliteHandle, "SELECT CreateRouting_GetLastError()",
  2973         -                      &results, &rows, &columns, NULL);
  2974         -  if (ret != SQLITE_OK)
  2975         -    return;
  2976         -  if (rows < 1)
  2977         -    ;
  2978         -  else
  2979         -    {
  2980         -      for (i = 1; i <= rows; i++)
  2981         -        {
  2982         -          const char *message = results[(i * columns) + 0];
  2983         -          msg = wxString::FromUTF8(message);
  2984         -        }
  2985         -    }
  2986         -  sqlite3_free_table(results);
  2987         -}
  2988         -
  2989   2748   void MyFrame::OnVacuum(wxCommandEvent & WXUNUSED(event))
  2990   2749   {
  2991   2750   //
  2992   2751   // performing a VACUUM in order to reorganize the current DB
  2993   2752   //
  2994   2753     char *errMsg = NULL;
  2995   2754     int totalPages;
................................................................................
  4108   3867     NetworkDialog dlg;
  4109   3868     int ret;
  4110   3869     wxString table;
  4111   3870     wxString from;
  4112   3871     wxString to;
  4113   3872     bool isNoGeometry;
  4114   3873     wxString geom;
  4115         -  bool isNameEnabled;
  4116   3874     wxString name;
  4117   3875     bool isGeomLength;
  4118   3876     wxString cost;
  4119   3877     bool isBidirectional;
  4120   3878     bool isOneWays;
  4121   3879     wxString oneWayToFrom;
  4122   3880     wxString oneWayFromTo;
  4123   3881     bool aStarSupported;
  4124   3882     wxString dataTableName;
  4125   3883     wxString virtualTableName;
  4126         -  bool overwrite;
  4127   3884     dlg.Create(this);
  4128   3885     ret = dlg.ShowModal();
  4129   3886     if (ret == wxID_OK)
  4130   3887       {
  4131   3888         table = dlg.GetTableName();
  4132   3889         from = dlg.GetFromColumn();
  4133   3890         to = dlg.GetToColumn();
  4134   3891         isNoGeometry = dlg.IsNoGeometry();
  4135   3892         geom = dlg.GetGeomColumn();
  4136         -      isNameEnabled = dlg.IsNameEnabled();
  4137   3893         name = dlg.GetNameColumn();
  4138   3894         isGeomLength = dlg.IsGeomLength();
  4139   3895         cost = dlg.GetCostColumn();
  4140   3896         isBidirectional = dlg.IsBidirectional();
  4141   3897         isOneWays = dlg.IsOneWays();
  4142   3898         oneWayToFrom = dlg.GetOneWayToFrom();
  4143   3899         oneWayFromTo = dlg.GetOneWayFromTo();
  4144   3900         aStarSupported = dlg.IsAStarSupported();
  4145   3901         dataTableName = dlg.GetDataTable();
  4146   3902         virtualTableName = dlg.GetVirtualTable();
  4147         -      overwrite = dlg.IsOverwriteEnabled();
  4148         -      ::wxBeginBusyCursor();
  4149         -      CreateNetwork(table, from, to, isNoGeometry, geom, isNameEnabled, name,
  4150         -                    isGeomLength, cost, isBidirectional, isOneWays,
  4151         -                    oneWayFromTo, oneWayToFrom, aStarSupported, dataTableName,
  4152         -                    virtualTableName, overwrite);
  4153         -      ::wxEndBusyCursor();
         3903  +      BuildNetwork(table, from, to, isNoGeometry, geom, name, isGeomLength,
         3904  +                   cost, isBidirectional, isOneWays, oneWayFromTo, oneWayToFrom,
         3905  +                   aStarSupported, dataTableName, virtualTableName);
  4154   3906       }
  4155   3907   }
  4156   3908   
  4157   3909   void MyFrame::OnImportXmlDocuments(wxCommandEvent & WXUNUSED(event))
  4158   3910   {
  4159   3911   //
  4160   3912   // importing XML Documents
................................................................................
  4716   4468   
  4717   4469     if (NoData.Len() == 0)
  4718   4470       {
  4719   4471         // creating a default NO-DATA value
  4720   4472         no_data = DefaultNoData(SampleType, PixelType, NumBands);
  4721   4473     } else
  4722   4474       {
  4723         -      if (NoData.CmpNoCase(wxT("NONE")) == 0)
  4724         -        {
  4725         -          // creating a NoData pixel of the NONE type
  4726         -          no_data = rl2_create_pixel_none();
  4727         -      } else
  4728         -        {
  4729         -          // creating the NoData pixel
  4730         -          no_data = ParseNoData(NoData, SampleType, PixelType, NumBands);
  4731         -        }
         4475  +      no_data = ParseNoData(NoData, SampleType, PixelType, NumBands);
  4732   4476         if (no_data == NULL)
  4733   4477           {
  4734   4478             wxMessageBox(wxT("ERROR: invalid NO-DATA string"),
  4735   4479                          wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
  4736   4480             return false;
  4737   4481           }
  4738   4482       }
................................................................................
  5725   5469         MemoryDatabase = false;
  5726   5470         return false;
  5727   5471       }
  5728   5472   // setting up the internal cache
  5729   5473     SpliteInternalCache = spatialite_alloc_connection();
  5730   5474     spatialite_init_ex(SqliteHandle, SpliteInternalCache, 0);
  5731   5475     rl2_init(SqliteHandle, RL2PrivateData, 0);
  5732         -  DoInitVirtualPG();
  5733   5476   // enabling LOAD_EXTENSION
  5734   5477     ret = sqlite3_enable_load_extension(SqliteHandle, 1);
  5735   5478     if (ret != SQLITE_OK)
  5736   5479       {
  5737   5480         wxMessageBox(wxT("Unable to enable LOAD_EXTENSION"),
  5738   5481                      wxT("spatialite_gui"), wxOK | wxICON_INFORMATION, this);
  5739   5482         sqlite3_free(errMsg);
................................................................................
  5745   5488         wxMessageBox(wxT("Unable to activate FOREIGN_KEY constraints"),
  5746   5489                      wxT("spatialite_gui"), wxOK | wxICON_INFORMATION, this);
  5747   5490         sqlite3_free(errMsg);
  5748   5491       }
  5749   5492   // setting RL2 MaxThreads
  5750   5493     char sqlmax[1024];
  5751   5494     sprintf(sqlmax, "SELECT RL2_SetMaxThreads(%d)", RL2MaxThreads);
  5752         -  sqlite3_exec(SqliteHandle, sqlmax, NULL, 0, NULL);
  5753         -// creating POSTGIS_GEOMETRY_COLUMNS (Temporary Table)
  5754         -  const char *sql =
  5755         -    "CREATE TEMPORARY TABLE IF NOT EXISTS postgis_geometry_columns (\n"
  5756         -    "\tf_table_name TEXT NOT NULL,\n\tf_geometry_column TEXT NOT NULL,\n"
  5757         -    "\tcoord_dimension INTEGER NOT NULL,\n\tsrid INTEGER NOT NULL,\n"
  5758         -    "\tgeometry_type TEXT NOT NULL,\n\tCONSTRAINT tmp_postgis_pk PRIMARY "
  5759         -    "KEY (f_table_name, f_geometry_column))";
  5760         -  sqlite3_exec(SqliteHandle, sql, NULL, 0, NULL);
  5761         -// creating TMP_VECTOR_COVERAGES (Temporary Table)
  5762         -  sql =
  5763         -    "CREATE TEMPORARY TABLE IF NOT EXISTS tmp_vector_coverages (\n"
  5764         -    "\tcoverage_name TEXT NOT NULL PRIMARY KEY,\n"
  5765         -    "\tf_table_name TEXT,\n\tf_geometry_column TEXT,\n"
  5766         -    "\tview_name TEXT,\n\tview_geometry TEXT,\n\tvirt_name TEXT,\n"
  5767         -    "\tvirt_geometry TEXT,\n\ttopology_name TEXT,\n\tnetwork_name TEXT,\n"
  5768         -    "\tpostgis_table TEXT,\n\tpostgis_geometry TEXT,\n"
  5769         -    "\tgeo_minx DOUBLE,\n\tgeo_miny DOUBLE,\n\tgeo_maxx DOUBLE,\n"
  5770         -    "\tgeo_maxy DOUBLE,\n\textent_minx DOUBLE,\n\textent_miny DOUBLE,\n"
  5771         -    "\textent_maxx DOUBLE,\n\textent_maxy DOUBLE)";
  5772         -  sqlite3_exec(SqliteHandle, sql, NULL, 0, NULL);
  5773         -
         5495  +  sqlite3_exec(SqliteHandle, sqlmax, NULL, 0, &errMsg);
  5774   5496     AutoFDOStart();
  5775   5497     AutoGPKGStart();
  5776   5498     InitTableTree();
  5777   5499     LoadHistory();
  5778   5500     return true;
  5779   5501   }
  5780   5502   
................................................................................
  5958   5680   void MyFrame::CloseDB()
  5959   5681   {
  5960   5682   //
  5961   5683   // disconnecting current SQLite DB
  5962   5684   //
  5963   5685     if (!SqliteHandle)
  5964   5686       return;
  5965         -  AutoPostgresStop();
  5966   5687     AutoFDOStop();
  5967   5688     AutoGPKGStop();
  5968   5689     if (AutoFDOmsg.Len() > 0)
  5969   5690       wxMessageBox(AutoFDOmsg, wxT("spatialite_gui"), wxOK | wxICON_INFORMATION,
  5970   5691                    this);
  5971   5692     if (AutoGPKGmsg.Len() > 0)
  5972   5693       wxMessageBox(AutoGPKGmsg, wxT("spatialite_gui"), wxOK | wxICON_INFORMATION,
................................................................................
  5980   5701     SpliteInternalCache = NULL;
  5981   5702     SqlitePath = wxT("");
  5982   5703     ReadOnlyConnection = false;
  5983   5704     MemoryDatabase = false;
  5984   5705     ResetSecurity();
  5985   5706     AttachedList.Flush();
  5986   5707     ClearTableTree();
  5987         -// dropping POSTGIS_GEOMETRY_COLUMNS (Temporary Table)
  5988         -  const char *sql = "DROP TABLE IF EXISTS temp.postgis_geometry_columns";
  5989         -  sqlite3_exec(SqliteHandle, sql, NULL, 0, NULL);
  5990         -// dropping TMP_VECTOR_COVERAGES (Temporary Table)
  5991         -  sql = "DROP TABLE IF EXISTS temp.tmp_vector_coverages";
  5992         -  sqlite3_exec(SqliteHandle, sql, NULL, 0, NULL);
  5993   5708   }
  5994   5709   
  5995   5710   bool MyFrame::CreateDB()
  5996   5711   {
  5997   5712   // creating a new, empty SQLite DB
  5998   5713     int ret;
  5999   5714     char path[1024];
................................................................................
  6025   5740         MemoryDatabase = false;
  6026   5741         return false;
  6027   5742       }
  6028   5743   // setting up the internal cache
  6029   5744     SpliteInternalCache = spatialite_alloc_connection();
  6030   5745     spatialite_init_ex(SqliteHandle, SpliteInternalCache, 0);
  6031   5746     rl2_init(SqliteHandle, RL2PrivateData, 0);
  6032         -  DoInitVirtualPG();
  6033   5747   // enabling LOAD_EXTENSION
  6034   5748     ret = sqlite3_enable_load_extension(SqliteHandle, 1);
  6035   5749     if (ret != SQLITE_OK)
  6036   5750       {
  6037   5751         wxMessageBox(wxT("Unable to enable LOAD_EXTENSION"),
  6038   5752                      wxT("spatialite_gui"), wxOK | wxICON_INFORMATION, this);
  6039   5753         sqlite3_free(errMsg);
................................................................................
  6089   5803       }
  6090   5804     sqlite3_free_table(results);
  6091   5805   
  6092   5806     if (count > 0)
  6093   5807       return;
  6094   5808   
  6095   5809   // all right, it's empty: proceding to initialize
  6096         -  strcpy(sql, "SELECT InitSpatialMetadataFull(1)");
         5810  +  strcpy(sql, "SELECT InitSpatialMetadata(1)");
  6097   5811     ret = sqlite3_exec(SqliteHandle, sql, NULL, NULL, &errMsg);
  6098   5812     if (ret != SQLITE_OK)
  6099   5813       {
  6100         -      wxMessageBox(wxT("Unable to initialite SpatialMetadataFull: ") +
         5814  +      wxMessageBox(wxT("Unable to initialite SpatialMetadata: ") +
  6101   5815                      wxString::FromUTF8(errMsg), wxT("spatialite_gui"),
  6102   5816                      wxOK | wxICON_ERROR, this);
  6103   5817         sqlite3_free(errMsg);
  6104   5818         return;
  6105   5819       }
  6106   5820   }
  6107   5821   
................................................................................
  6213   5927     wxString tblName;
  6214   5928     wxString sql;
  6215   5929     char *xsql;
  6216   5930     bool status = false;
  6217   5931   // fetching any defined Spatial Index
  6218   5932     sql =
  6219   5933       wxT
  6220         -    ("SELECT f_table_name, f_geometry_column FROM main.geometry_columns WHERE spatial_index_enabled IN (1,3)");
         5934  +    ("SELECT f_table_name, f_geometry_column FROM main.geometry_columns WHERE spatial_index_enabled = 1");
  6221   5935     xsql = (char *) malloc((sql.Len() * 4) + 1);
  6222   5936     strcpy(xsql, sql.ToUTF8());
  6223   5937     int ret = sqlite3_get_table(SqliteHandle, xsql, &results,
  6224   5938                                 &rows, &columns, &errMsg);
  6225   5939     free(xsql);
  6226   5940     if (ret != SQLITE_OK)
  6227   5941       {
................................................................................
  8321   8035       }
  8322   8036     sqlite3_finalize(stmt);
  8323   8037     if (success == false)
  8324   8038       return false;
  8325   8039     return true;
  8326   8040   }
  8327   8041   
  8328         -void MyFrame::DoCreatePostgreSqlNodes()
  8329         -{
  8330         -// initializing the PostgreSQL nodes
  8331         -  int c = 0;
  8332         -  MyPostgresConn *pC = PostgresList.GetFirst();
  8333         -  while (pC != NULL)
  8334         -    {
  8335         -      // adding a Connection node
  8336         -      wxTreeItemId connId;
  8337         -      TableTree->AddPostgresConnection(c++, pC, connId);
  8338         -      MyPostgresSchema *pS = pC->GetFirst();
  8339         -      while (pS != NULL)
  8340         -        {
  8341         -          // adding a Schema node
  8342         -          wxTreeItemId schemaId;
  8343         -          TableTree->AddPostgresSchema(connId, pC, pS->GetName(), schemaId);
  8344         -          pS->SetTreeNode(schemaId);
  8345         -          pS = pS->GetNext();
  8346         -        }
  8347         -      pC = pC->GetNext();
  8348         -    }
  8349         -}
  8350         -
  8351   8042   void MyFrame::InitTableTree()
  8352   8043   {
  8353   8044   // loads the table TREE list
  8354   8045     int i;
  8355   8046     char **results;
  8356   8047     int rows;
  8357   8048     int columns;
................................................................................
  8369   8060     if (MemoryDatabase == true)
  8370   8061       {
  8371   8062         wxString memory = wxT("MEMORY-DB");
  8372   8063         TableTree->SetPath(memory);
  8373   8064     } else
  8374   8065       TableTree->SetPath(SqlitePath);
  8375   8066     TableTree->FlushAll();
  8376         -  DoCreatePostgreSqlNodes();
  8377   8067     if (ExistsTopologies())
  8378   8068       {
  8379   8069         // fetching topologies
  8380   8070         sql = wxT("SELECT topology_name, srid, has_z ");
  8381   8071         sql += wxT(" FROM main.topologies");
  8382   8072         xsql = (char *) malloc((sql.Len() * 4) + 1);
  8383   8073         strcpy(xsql, sql.ToUTF8());
................................................................................
  8474   8164                 int srid = atoi(results[(i * columns) + 1]);
  8475   8165                 RasterCoverageSet coverage(name, srid);
  8476   8166                 TableTree->AddRasterCoverage(&coverage);
  8477   8167               }
  8478   8168           }
  8479   8169         sqlite3_free_table(results);
  8480   8170       }
  8481         -  if (ExistsVectorCoverages() && ExistsTopologies() && ExistsNetworks())
         8171  +  if (ExistsVectorCoverages())
  8482   8172       {
  8483   8173         // fetching Vector Coverages
  8484   8174         sql = wxT("SELECT 'table', c.coverage_name, g.srid, g.geometry_type ");
  8485   8175         sql += wxT("FROM main.vector_coverages AS c ");
  8486   8176         sql += wxT("JOIN main.geometry_columns AS g ON (");
  8487   8177         sql += wxT("c.topology_name IS NULL AND c.network_name IS NULL AND ");
  8488   8178         sql += wxT("Lower(c.f_table_name) = Lower(g.f_table_name) AND ");
................................................................................
  8574   8264               }
  8575   8265           }
  8576   8266         sqlite3_free_table(results);
  8577   8267       }
  8578   8268   // fetching persistent tables and views
  8579   8269     sql =
  8580   8270       wxT
  8581         -    ("SELECT 'main', name, sql, type FROM main.sqlite_master WHERE (type = 'table' OR type = 'view') "
  8582         -     "UNION SELECT 'temp', name, sql, type FROM temp.sqlite_master WHERE type = 'table' "
  8583         -     "AND name IN ('postgis_geometry_columns', 'tmp_vector_coverages') ORDER BY name");
         8271  +    ("SELECT name, sql, type FROM main.sqlite_master WHERE (type = 'table' OR type = 'view') ORDER BY name");
  8584   8272     xsql = (char *) malloc((sql.Len() * 4) + 1);
  8585   8273     strcpy(xsql, sql.ToUTF8());
  8586   8274     int ret = sqlite3_get_table(SqliteHandle, xsql, &results,
  8587   8275                                 &rows, &columns, &errMsg);
  8588   8276     free(xsql);
  8589   8277     if (ret != SQLITE_OK)
  8590   8278       {
................................................................................
  8596   8284     list = new TableViewList();
  8597   8285     if (rows < 1)
  8598   8286       ;
  8599   8287     else
  8600   8288       {
  8601   8289         for (i = 1; i <= rows; i++)
  8602   8290           {
  8603         -          const char *db = results[(i * columns) + 0];
  8604         -          name = results[(i * columns) + 1];
  8605         -          createSql = results[(i * columns) + 2];
  8606         -          type = results[(i * columns) + 3];
         8291  +          name = results[(i * columns) + 0];
         8292  +          createSql = results[(i * columns) + 1];
         8293  +          type = results[(i * columns) + 2];
  8607   8294             if (strstr(createSql, " VIRTUAL ") || strstr(createSql, " virtual "))
  8608   8295               virtualTable = true;
  8609   8296             else
  8610   8297               virtualTable = false;
  8611   8298             tblName = wxString::FromUTF8(name);
  8612         -          wxString dbName = wxString::FromUTF8(db);
  8613         -          if (dbName.Cmp(wxT("temp")) == 0
  8614         -              && (tblName.Cmp(wxT("postgis_geometry_columns")) == 0 ||
  8615         -                  tblName.Cmp(wxT("tmp_vector_coverages")) == 0))
  8616         -            {
  8617         -              list->Add(dbName, tblName);
  8618         -              continue;
  8619         -            }
  8620   8299             if (strcmp(type, "view") == 0)
  8621   8300               list->Add(tblName, true, false);
  8622   8301             else
  8623   8302               list->Add(tblName, false, virtualTable);
  8624   8303           }
  8625   8304       }
  8626   8305     sqlite3_free_table(results);
................................................................................
  8631   8310       FindFdoOgrGeometries(list);
  8632   8311     else
  8633   8312       FindGeometries(list);
  8634   8313     ptv = list->GetFirst();
  8635   8314     while (ptv != NULL)
  8636   8315       {
  8637   8316         // inserting items into the Tree Control View
  8638         -      if (ptv->IsTmpMetadata() == true)
  8639         -        TableTree->AddTmpMetadata(ptv->GetName());
  8640         -      else if (ptv->IsPostgresTable(&PostgresList) == true)
  8641         -        TableTree->AddPostgresTable(&PostgresList, ptv->GetName());
  8642         -      else if (ptv->IsView() == true)
         8317  +      if (ptv->IsView() == true)
  8643   8318           TableTree->AddView(ptv->GetName(), ptv->IsGeometry());
  8644   8319         else if (ptv->IsGeoPackageGeometry() == true)
  8645   8320           TableTree->AddGeoPackageTable(ptv->GetName());
  8646   8321         else if (ptv->IsGeoPackageVirtualGeometry() == true)
  8647   8322           TableTree->AddGeoPackageVirtualTable(ptv->GetName());
  8648   8323         else if (ptv->IsFdoOgrGeometry() == true)
  8649   8324           TableTree->AddFdoOgrTable(ptv->GetName());
................................................................................
  8655   8330         ptv = ptv->GetNext();
  8656   8331       }
  8657   8332     delete list;
  8658   8333   
  8659   8334   // fetching temporary tables and views
  8660   8335     sql =
  8661   8336       wxT
  8662         -    ("SELECT name, sql, type FROM sqlite_temp_master WHERE (type = 'table' OR type = 'view') "
  8663         -     "AND name NOT IN ('postgis_geometry_columns', 'tmp_vector_coverages') ORDER BY name");
         8337  +    ("SELECT name, sql, type FROM sqlite_temp_master WHERE (type = 'table' OR type = 'view') ORDER BY name");
  8664   8338     xsql = (char *) malloc((sql.Len() * 4) + 1);
  8665   8339     strcpy(xsql, sql.ToUTF8());
  8666   8340     ret = sqlite3_get_table(SqliteHandle, xsql, &results,
  8667   8341                             &rows, &columns, &errMsg);
  8668   8342     free(xsql);
  8669   8343     if (ret != SQLITE_OK)
  8670   8344       {
................................................................................
  9423   9097         if (rows < 1)
  9424   9098           ;
  9425   9099         else
  9426   9100           {
  9427   9101             for (i = 1; i <= rows; i++)
  9428   9102               {
  9429   9103                 column = results[(i * columns) + 0];
  9430         -              if (atoi(results[(i * columns) + 1]) == 1
  9431         -                  || atoi(results[(i * columns) + 1]) == 3)
         9104  +              if (atoi(results[(i * columns) + 1]) == 1)
  9432   9105                   index = true;
  9433   9106                 else
  9434   9107                   index = false;
  9435   9108                 if (atoi(results[(i * columns) + 1]) == 2)
  9436   9109                   cached = true;
  9437   9110                 else
  9438   9111                   cached = false;
................................................................................
 11190  10863             TableTree->SetFdoOgrMode(true);
 11191  10864           }
 11192  10865         return;
 11193  10866       }
 11194  10867     TableTree->SetFdoOgrMode(false);
 11195  10868   }
 11196  10869   
 11197         -void MyFrame::AutoPostgresStop()
 11198         -{
 11199         -//
 11200         -// trying to stop the PostgreSQL auto-wrapper
 11201         -//
 11202         -  DoDropPostgresTables();
 11203         -  PostgresList.Clear();
 11204         -}
 11205         -
 11206  10870   void MyFrame::AutoFDOStop()
 11207  10871   {
 11208  10872   //
 11209  10873   // trying to stop the FDO-OGR auto-wrapper
 11210  10874   //
 11211  10875     int ret;
 11212  10876     const char *name;
................................................................................
 11620  11284             // creating the VirtualGPKG table 
 11621  11285             //
 11622  11286             xname = sqlite3_mprintf("vgpkg_%s", p->GetName());
 11623  11287             xname2 = gaiaDoubleQuotedSql(xname);
 11624  11288             xname3 = gaiaDoubleQuotedSql(p->GetName());
 11625  11289             sprintf(sql, "CREATE VIRTUAL TABLE \"%s\" USING VirtualGPKG(\"%s\")",
 11626  11290                     xname2, xname3);
 11627         -          sqlite3_free(xname);
        11291  +          free(xname);
 11628  11292             free(xname2);
 11629  11293             free(xname3);
 11630  11294             ret = sqlite3_exec(SqliteHandle, sql, NULL, 0, NULL);
 11631  11295             if (ret != SQLITE_OK)
 11632  11296               goto error;
 11633  11297             if (count < 5)
 11634  11298               gpkgNames[count] =
................................................................................
 11770  11434             free(db_prefix);
 11771  11435             xname = sqlite3_mprintf("vgpkg_%s", p->GetName());
 11772  11436             xname2 = gaiaDoubleQuotedSql(xname);
 11773  11437             xname3 = gaiaDoubleQuotedSql(p->GetName());
 11774  11438             sprintf(sql,
 11775  11439                     "CREATE VIRTUAL TABLE \"%s\".\"%s\" USING VirtualGPKG(\"%s\", \"%s\")",
 11776  11440                     xdb_prefix, xname2, xdb_prefix, xname3);
 11777         -          sqlite3_free(xname);
        11441  +          free(xname);
 11778  11442             free(xname2);
 11779  11443             free(xname3);
 11780  11444             free(xdb_prefix);
 11781  11445             ret = sqlite3_exec(SqliteHandle, sql, NULL, 0, NULL);
 11782  11446             if (ret != SQLITE_OK)
 11783  11447               goto error;
 11784  11448             wxString tbl_name = wxString::FromUTF8(p->GetName());
................................................................................
 13340  13004       ("The currently connected DB-file contains one or more harmful Triggers.\n");
 13341  13005     msg +=
 13342  13006       wxT("Such a condition could eventually cause serious security breaches.");
 13343  13007     wxMessageBox(msg, wxT("spatialite_gui"), wxOK | wxICON_EXCLAMATION, this);
 13344  13008     return false;
 13345  13009   }
 13346  13010   
 13347         -void MyFrame::FeedZipHtml(unsigned char *zip, int offset, const char *data)
 13348         -{
 13349         -//
 13350         -// feeding data into the Html ZIP buffer
 13351         -//
 13352         -  int i;
 13353         -  int j;
 13354         -  for (i = 0, j = 0; i < (int) strlen(data); i += 2, j++)
 13355         -    {
 13356         -      char byte_hi;
 13357         -      char byte_lo;
 13358         -      byte_hi = *(data + i);
 13359         -      byte_lo = *(data + i + 1);
 13360         -      *(zip + offset + j) = ColorMapEntry::ParseHex(byte_hi, byte_lo);
 13361         -    }
 13362         -}
 13363         -
 13364  13011   MyStatusBar::MyStatusBar(MyFrame * parent):wxStatusBar(parent)
 13365  13012   {
 13366  13013   // constructor
 13367  13014     Parent = parent;
 13368  13015     int widths[2];
 13369  13016     widths[0] = 20;
 13370  13017     widths[1] = -1;
................................................................................
 13410  13057   void MyStatusBar::SetText(wxString & msg)
 13411  13058   {
 13412  13059     wxStatusBar *sb = Parent->GetStatusBar();
 13413  13060     if (!sb)
 13414  13061       return;
 13415  13062     sb->SetStatusText(msg, 1);
 13416  13063   }
        13064  +
        13065  +void MyFrame::GetHelp(wxString & html)
        13066  +{
        13067  +//
        13068  +// return the HTML Help
        13069  +//
        13070  +  html =
        13071  +    wxT("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        13072  +  html += wxT("<html>");
        13073  +  html += wxT("<head>");
        13074  +  html +=
        13075  +    wxT
        13076  +    ("<meta content=\"text/html; charset=UTF-8\" http-equiv=\"content-type\">");
        13077  +  html += wxT("<title>SQLite + SpatiaLite quick Help</title>");
        13078  +  html += wxT("</head>");
        13079  +  html += wxT("<body bgcolor=\"#e8e8e8\">");
        13080  +  html += wxT("<h1><a name=\"index\">SQLite + SpatiaLite quick Help</a></h1>");
        13081  +  html += wxT("<table cellspacing=\"2\" cellpadding=\"2\">");
        13082  +  html +=
        13083  +    wxT
        13084  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\">Index of contents</td></tr>");
        13085  +  html +=
        13086  +    wxT
        13087  +    ("<tr><td bgcolor=\"#fffff0\">1.</td><td bgcolor=\"#f0fff0\"><a href=\"#c1\">SQLite SQL syntax</a></td></tr>");
        13088  +  html +=
        13089  +    wxT
        13090  +    ("<tr><td bgcolor=\"#fffff0\">2.</td><td bgcolor=\"#f0fff0\"><a href=\"#c2\">SQLite SQL functions</a><ul>");
        13091  +  html += wxT("<li><a href=\"#c21\">ordinary functions</a></li>");
        13092  +  html += wxT("<li><a href=\"#c22\">aggregate functions</a></li>");
        13093  +  html += wxT("</ul></td></tr>");
        13094  +  html +=
        13095  +    wxT
        13096  +    ("<tr><td bgcolor=\"#fffff0\">3.</td><td bgcolor=\"#f0fff0\"><a href=\"#c3\">SpatiaLite SQL Spatial functions</a><ul>");
        13097  +  html +=
        13098  +    wxT
        13099  +    ("<li><a href=\"#version\">version info [and build options] functions</a></li>");
        13100  +  html += wxT("<li><a href=\"#generic\">generic functions</a></li>");
        13101  +  html += wxT("<li><a href=\"#math\">math functions</a></li>");
        13102  +  html +=
        13103  +    wxT
        13104  +    ("<li><a href=\"#error\">SQL functions reporting GEOS / RTTOPO errors and warnings</a></li>");
        13105  +  html +=
        13106  +    wxT
        13107  +    ("<li><a href=\"#length_cvt\">length/distance unit-conversion functions</a></li>");
        13108  +  html +=
        13109  +    wxT
        13110  +    ("<li><a href=\"#dms_cvt\">DD/DMS conversion functions (longitude/latitude)</a></li>");
        13111  +  html +=
        13112  +    wxT("<li><a href=\"#blob\">utility functions for BLOB objects</a></li>");
        13113  +  html +=
        13114  +    wxT
        13115  +    ("<li><a href=\"#c30\">utility functions [non-standard] for geometric objects</a></li>");
        13116  +  html +=
        13117  +    wxT
        13118  +    ("<li><a href=\"#c31\">functions for constructing a geometric object given its Well-known Text Representation</a></li>");
        13119  +  html +=
        13120  +    wxT
        13121  +    ("<li><a href=\"#c32\">functions for constructing a geometric object given its Well-known Binary Representation</a></li>");
        13122  +  html +=
        13123  +    wxT
        13124  +    ("<li><a href=\"#c33\">functions for obtaining the Well-known Text / Well-known Binary Representation of a geometric object</a></li>");
        13125  +  html +=
        13126  +    wxT
        13127  +    ("<li><a href=\"#c33misc\">functions supporting exotic geometric formats</a></li>");
        13128  +  html += wxT("<li><a href=\"#c34\">functions on type Geometry</a></li>");
        13129  +  html +=
        13130  +    wxT
        13131  +    ("<li><a href=\"#repair\">Functions attempting to repair malformed Geometries</a></li>");
        13132  +  html +=
        13133  +    wxT("<li><a href=\"#compress\">Geometry-compression functions</a></li>");
        13134  +  html += wxT("<li><a href=\"#cast\">Geometry-type casting functions</a></li>");
        13135  +  html +=
        13136  +    wxT
        13137  +    ("<li><a href=\"#dims-cast\">Space-dimensions casting functions</a></li>");
        13138  +  html += wxT("<li><a href=\"#c35\">functions on type Point</a></li>");
        13139  +  html +=
        13140  +    wxT
        13141  +    ("<li><a href=\"#c361\">functions on type Curve [Linestring or Ring]</a></li>");
        13142  +  html +=
        13143  +    wxT
        13144  +    ("<li><a href=\"#c36\">functions on type Surface [Polygon or Ring]</a></li>");
        13145  +  html += wxT("<li><a href=\"#c37\">functions on type Polygon</a></li>");
        13146  +  html += wxT("<li><a href=\"#c38\">functions on type GeomCollection</a></li>");
        13147  +  html +=
        13148  +    wxT
        13149  +    ("<li><a href=\"#c39\">functions testing approximative spatial relationships via MBRs</a></li>");
        13150  +  html +=
        13151  +    wxT
        13152  +    ("<li><a href=\"#c40\">functions testing spatial relationships</a></li>");
        13153  +  html +=
        13154  +    wxT
        13155  +    ("<li><a href=\"#c41\">functions implementing spatial operators</a></li>");
        13156  +  html +=
        13157  +    wxT
        13158  +    ("<li><a href=\"#c42\">functions for coordinate transformations</a></li>");
        13159  +  html +=
        13160  +    wxT
        13161  +    ("<li><a href=\"#c43\">functions for Spatial-MetaData and Spatial-Index handling</a></li>");
        13162  +  html +=
        13163  +    wxT
        13164  +    ("<li><a href=\"#c43metacatalog\">functions for MetaCatalog and related Statistics</a></li>");
        13165  +  html +=
        13166  +    wxT
        13167  +    ("<li><a href=\"#c43style\">functions supporting SLD/SE Styled Layers</a></li>");
        13168  +  html +=
        13169  +    wxT
        13170  +    ("<li><a href=\"#c43isometa\">functions supporting ISO Metadata</a></li>");
        13171  +  html +=
        13172  +    wxT
        13173  +    ("<li><a href=\"#c43fdo\">functions implementing FDO/OGR compatibily</a></li>");
        13174  +  html +=
        13175  +    wxT("<li><a href=\"#c44\">functions for MbrCache-based queries</a></li>");
        13176  +  html +=
        13177  +    wxT
        13178  +    ("<li><a href=\"#c45\">functions for R*Tree-based queries (Geometry Callbacks)</a></li>");
        13179  +  html +=
        13180  +    wxT("<li><a href=\"#xmlBlob\">SQL functions supporting XmlBLOB</a></li>");
        13181  +  html += wxT("</ul></td></tr>");
        13182  +  html += wxT("</table>");
        13183  +  html += wxT("<h3><a name=\"c1\">SQLite SQL syntax</a></h3>");
        13184  +  html += wxT("<table cellspacing=\"4\" cellpadding=\"2\"width=\"100%\">");
        13185  +  html +=
        13186  +    wxT
        13187  +    ("<tr><td bgcolor=\"#fffff0\">ALTER TABLE</td><td bgcolor=\"#f0fff0\">sql-statement ::= ALTER TABLE [database-name .] table-name alteration<br>");
        13188  +  html += wxT("alteration ::= RENAME TO new-table-name<br>");
        13189  +  html += wxT("alteration ::= ADD [COLUMN] column-def<br></td></tr>");
        13190  +  html +=
        13191  +    wxT
        13192  +    ("<tr><td bgcolor=\"#fffff0\">ANALYZE</td><td bgcolor=\"#f0fff0\">sql-statement ::= ANALYZE<br>");
        13193  +  html += wxT("sql-statement ::= ANALYZE database-name<br>");
        13194  +  html +=
        13195  +    wxT("sql-statement ::= ANALYZE [database-name .] table-name<br></td></tr>");
        13196  +  html +=
        13197  +    wxT
        13198  +    ("<tr><td bgcolor=\"#fffff0\">ATTACH DATABASE</td><td bgcolor=\"#f0fff0\">sql-statement ::= ATTACH [DATABASE] database-filename AS database-name</td></tr>");
        13199  +  html +=
        13200  +    wxT
        13201  +    ("<tr><td bgcolor=\"#fffff0\">BEGIN TRANSACTION</td><td bgcolor=\"#f0fff0\">sql-statement ::= BEGIN [ DEFERRED | IMMEDIATE | EXCLUSIVE ] [TRANSACTION [name]]<br>");
        13202  +  html += wxT("sql-statement ::= END [TRANSACTION [name]]<br>");
        13203  +  html += wxT("sql-statement ::= COMMIT [TRANSACTION [name]]<br>");
        13204  +  html += wxT("sql-statement ::= ROLLBACK [TRANSACTION [name]]<br></td></tr>");
        13205  +  html +=
        13206  +    wxT
        13207  +    ("<tr><td bgcolor=\"#fffff0\">COMMIT TRANSACTION</td><td bgcolor=\"#f0fff0\">sql-statement ::= BEGIN [ DEFERRED | IMMEDIATE | EXCLUSIVE ] [TRANSACTION [name]]<br>");
        13208  +  html += wxT("sql-statement ::= END [TRANSACTION [name]]<br>");
        13209  +  html += wxT("sql-statement ::= COMMIT [TRANSACTION [name]]<br>");
        13210  +  html += wxT("sql-statement ::= ROLLBACK [TRANSACTION [name]]<br></td></tr>");
        13211  +  html +=
        13212  +    wxT
        13213  +    ("<tr><td bgcolor=\"#fffff0\">CREATE INDEX</td><td bgcolor=\"#f0fff0\">sql-statement ::= CREATE [UNIQUE] INDEX [IF NOT EXISTS] [database-name .] index-name<br>");
        13214  +  html += wxT("ON table-name ( column-name [, column-name]* )<br>");
        13215  +  html +=
        13216  +    wxT
        13217  +    ("column-name ::= name [ COLLATE collation-name] [ ASC | DESC ]</td></tr>");
        13218  +  html +=
        13219  +    wxT
        13220  +    ("<tr><td bgcolor=\"#fffff0\">CREATE TABLE</td><td bgcolor=\"#f0fff0\">sql-command ::= CREATE [TEMP | TEMPORARY] TABLE [IF NOT EXISTS] [database-name .] table-name (<br>");
        13221  +  html += wxT("column-def [, column-def]*<br>");
        13222  +  html += wxT("[, constraint]*<br>");
        13223  +  html += wxT(")<br>");
        13224  +  html +=
        13225  +    wxT
        13226  +    ("sql-command ::= CREATE [TEMP | TEMPORARY] TABLE [database-name.] table-name AS select-statement<br>");
        13227  +  html +=
        13228  +    wxT
        13229  +    ("column-def ::= name [type] [[CONSTRAINT name] column-constraint]*<br>");
        13230  +  html += wxT("type ::= typename |<br>");
        13231  +  html += wxT("typename ( number ) |<br>");
        13232  +  html += wxT("typename ( number , number )<br>");
        13233  +  html += wxT("column-constraint ::= NOT NULL [ conflict-clause ] |<br>");
        13234  +  html +=
        13235  +    wxT("PRIMARY KEY [sort-order] [ conflict-clause ] [AUTOINCREMENT] |<br>");
        13236  +  html += wxT("UNIQUE [ conflict-clause ] |<br>");
        13237  +  html += wxT("CHECK ( expr ) |<br>");
        13238  +  html += wxT("DEFAULT value |<br>");
        13239  +  html += wxT("COLLATE collation-name<br>");
        13240  +  html +=
        13241  +    wxT("constraint ::= PRIMARY KEY ( column-list ) [ conflict-clause ] |<br>");
        13242  +  html += wxT("UNIQUE ( column-list ) [ conflict-clause ] |<br>");
        13243  +  html += wxT("CHECK ( expr )<br>");
        13244  +  html += wxT("conflict-clause ::= ON CONFLICT conflict-algorithm</td></tr>");
        13245  +  html +=
        13246  +    wxT
        13247  +    ("<tr><td bgcolor=\"#fffff0\">CREATE TRIGGER</td><td bgcolor=\"#f0fff0\">sql-statement ::= CREATE [TEMP | TEMPORARY] TRIGGER [IF NOT EXISTS] trigger-name [ BEFORE | AFTER ]<br>");
        13248  +  html += wxT("database-event ON [database-name .] table-name<br>");
        13249  +  html += wxT("trigger-action<br>");
        13250  +  html +=
        13251  +    wxT
        13252  +    ("sql-statement ::= CREATE [TEMP | TEMPORARY] TRIGGER [IF NOT EXISTS] trigger-name INSTEAD OF<br>");
        13253  +  html += wxT("database-event ON [database-name .] view-name<br>");
        13254  +  html += wxT("trigger-action<br>");
        13255  +  html += wxT("database-event ::= DELETE |<br>");
        13256  +  html += wxT("INSERT |<br>");
        13257  +  html += wxT("UPDATE |<br>");
        13258  +  html += wxT("UPDATE OF column-list<br>");
        13259  +  html += wxT("trigger-action ::= [ FOR EACH ROW ] [ WHEN expression ]<br>");
        13260  +  html += wxT("BEGIN<br>");
        13261  +  html += wxT("trigger-step ; [ trigger-step ; ]*<br>");
        13262  +  html += wxT("END<br>");
        13263  +  html += wxT("trigger-step ::= update-statement | insert-statement |<br>");
        13264  +  html += wxT("delete-statement | select-statement</td></tr>");
        13265  +  html +=
        13266  +    wxT
        13267  +    ("<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>");
        13268  +  html +=
        13269  +    wxT
        13270  +    ("<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>");
        13271  +  html +=
        13272  +    wxT
        13273  +    ("<tr><td bgcolor=\"#fffff0\">DELETE</td><td bgcolor=\"#f0fff0\">sql-statement ::= DELETE FROM [database-name .] table-name [WHERE expr]</td></tr>");
        13274  +  html +=
        13275  +    wxT
        13276  +    ("<tr><td bgcolor=\"#fffff0\">DETACH DATABASE</td><td bgcolor=\"#f0fff0\">sql-command ::= DETACH [DATABASE] database-name</td></tr>");
        13277  +  html +=
        13278  +    wxT
        13279  +    ("<tr><td bgcolor=\"#fffff0\">DROP INDEX</td><td bgcolor=\"#f0fff0\">sql-command ::= DROP INDEX [IF EXISTS] [database-name .] index-name</td></tr>");
        13280  +  html +=
        13281  +    wxT
        13282  +    ("<tr><td bgcolor=\"#fffff0\">DROP TABLE</td><td bgcolor=\"#f0fff0\">sql-command ::= DROP TABLE [IF EXISTS] [database-name.] table-name</td></tr>");
        13283  +  html +=
        13284  +    wxT
        13285  +    ("<tr><td bgcolor=\"#fffff0\">DROP TRIGGER</td><td bgcolor=\"#f0fff0\">sql-statement ::= DROP TRIGGER [IF EXISTS] [database-name .] trigger-name</td></tr>");
        13286  +  html +=
        13287  +    wxT
        13288  +    ("<tr><td bgcolor=\"#fffff0\">DROP VIEW</td><td bgcolor=\"#f0fff0\">sql-command ::= DROP VIEW [IF EXISTS] view-name</td></tr>");
        13289  +  html +=
        13290  +    wxT
        13291  +    ("<tr><td bgcolor=\"#fffff0\">END TRANSACTION</td><td bgcolor=\"#f0fff0\">sql-statement ::= BEGIN [ DEFERRED | IMMEDIATE | EXCLUSIVE ] [TRANSACTION [name]]<br>");
        13292  +  html += wxT("sql-statement ::= END [TRANSACTION [name]]<br>");
        13293  +  html += wxT("sql-statement ::= COMMIT [TRANSACTION [name]]<br>");
        13294  +  html += wxT("sql-statement ::= ROLLBACK [TRANSACTION [name]]<br></td></tr>");
        13295  +  html +=
        13296  +    wxT
        13297  +    ("<tr><td bgcolor=\"#fffff0\">EXPLAIN</td><td bgcolor=\"#f0fff0\">sql-statement ::= EXPLAIN sql-statement</td></tr>");
        13298  +  html +=
        13299  +    wxT
        13300  +    ("<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>");
        13301  +  html +=
        13302  +    wxT
        13303  +    ("INSERT [OR conflict-algorithm] INTO [database-name .] table-name [(column-list)] select-statement</td></tr>");
        13304  +  html +=
        13305  +    wxT
        13306  +    ("<tr><td bgcolor=\"#fffff0\">ON CONFLICT clause</td><td bgcolor=\"#f0fff0\">conflict-clause ::= ON CONFLICT conflict-algorithm<br>");
        13307  +  html +=
        13308  +    wxT
        13309  +    ("conflict-algorithm ::= ROLLBACK | ABORT | FAIL | IGNORE | REPLACE</td></tr>");
        13310  +  html +=
        13311  +    wxT
        13312  +    ("<tr><td bgcolor=\"#fffff0\">PRAGMA</td><td bgcolor=\"#f0fff0\">sql-statement ::= PRAGMA name [= value] |<br>");
        13313  +  html += wxT("PRAGMA function(arg)<hr>");
        13314  +  html += wxT("PRAGMA auto_vacuum;<br>");
        13315  +  html +=
        13316  +    wxT("PRAGMA auto_vacuum = 0 | none | 1 | full | 2 | incremental;<hr>");
        13317  +  html += wxT("PRAGMA cache_size;<br>");
        13318  +  html += wxT("PRAGMA cache_size = Number-of-pages;<hr>");
        13319  +  html += wxT("PRAGMA case_sensitive_like;<br>");
        13320  +  html += wxT("PRAGMA case_sensitive_like = 0 | 1;<hr>");
        13321  +  html += wxT("PRAGMA count_changes;<br>");
        13322  +  html += wxT("PRAGMA count_changes = 0 | 1;<hr>");
        13323  +  html += wxT("PRAGMA default_cache_size;<br>");
        13324  +  html += wxT("PRAGMA default_cache_size = Number-of-pages;<hr>");
        13325  +  html += wxT("PRAGMA empty_result_callbacks;<br>");
        13326  +  html += wxT("PRAGMA empty_result_callbacks = 0 | 1;<hr>");
        13327  +  html += wxT("PRAGMA encoding;<br>");
        13328  +  html += wxT("PRAGMA encoding = \"UTF-8\";<br>");
        13329  +  html += wxT("PRAGMA encoding = \"UTF-16\";<br>");
        13330  +  html += wxT("PRAGMA encoding = \"UTF-16le\";<br>");
        13331  +  html += wxT("PRAGMA encoding = \"UTF-16be\";<hr>");
        13332  +  html += wxT("PRAGMA foreign_keys;<br>");
        13333  +  html += wxT("PRAGMA foreign_keys = 0 | 1;<hr>");
        13334  +  html += wxT("PRAGMA full_column_names;<br>");
        13335  +  html += wxT("PRAGMA full_column_names = 0 | 1;<hr>");
        13336  +  html += wxT("PRAGMA fullfsync;<br>");
        13337  +  html += wxT("PRAGMA fullfsync = 0 | 1;<hr>");
        13338  +  html += wxT("PRAGMA journal_mode;<br>");
        13339  +  html += wxT("PRAGMA database.journal_mode;<br>");
        13340  +  html +=
        13341  +    wxT("PRAGMA journal_mode = DELETE | TRUNCATE | PERSIST | MEMORY | OFF<br>");
        13342  +  html +=
        13343  +    wxT
        13344  +    ("PRAGMA database.journal_mode = DELETE | TRUNCATE | PERSIST | MEMORY | OFF<hr>");
        13345  +  html += wxT("PRAGMA journal_size_limit;<br>");
        13346  +  html += wxT("PRAGMA journal_size_limit = N<hr>");
        13347  +  html += wxT("PRAGMA legacy_file_format;<br>");
        13348  +  html += wxT("PRAGMA legacy_file_format = 0 | 1<hr>");
        13349  +  html += wxT("PRAGMA locking_mode;<br>");
        13350  +  html += wxT("PRAGMA locking_mode = NORMAL | EXCLUSIVE<hr>");
        13351  +  html += wxT("PRAGMA page_size;<br>");
        13352  +  html += wxT("PRAGMA page_size = bytes;<hr>");
        13353  +  html += wxT("PRAGMA max_page_count;<br>");
        13354  +  html += wxT("PRAGMA max_page_count = N;<hr>");
        13355  +  html += wxT("PRAGMA read_uncommitted;<br>");
        13356  +  html += wxT("PRAGMA read_uncommitted = 0 | 1;<hr>");
        13357  +  html += wxT("PRAGMA recursive_triggers;<br>");
        13358  +  html += wxT("PRAGMA recursive_triggers = 0 | 1;<hr>");
        13359  +  html += wxT("PRAGMA reverse_unordered_selects;<br>");
        13360  +  html += wxT("PRAGMA reverse_unordered_selects = 0 | 1;<hr>");
        13361  +  html += wxT("PRAGMA short_column_names;<br>");
        13362  +  html += wxT("PRAGMA short_column_names = 0 | 1;<hr>");
        13363  +  html += wxT("PRAGMA synchronous;<br>");
        13364  +  html += wxT("PRAGMA synchronous = FULL; (2)<br>");
        13365  +  html += wxT("PRAGMA synchronous = NORMAL; (1)<br>");
        13366  +  html += wxT("PRAGMA synchronous = OFF; (0)<hr>");
        13367  +  html += wxT("PRAGMA temp_store;<br>");
        13368  +  html += wxT("PRAGMA temp_store = DEFAULT; (0)<br>");
        13369  +  html += wxT("PRAGMA temp_store = FILE; (1)<br>");
        13370  +  html += wxT("PRAGMA temp_store = MEMORY; (2)<hr>");
        13371  +  html += wxT("PRAGMA temp_store_directory;<br>");
        13372  +  html += wxT("PRAGMA temp_store_directory = 'directory-name';<hr>");
        13373  +  html += wxT("PRAGMA database_list;<hr>");
        13374  +  html += wxT("PRAGMA foreign_key_list(table-name);<hr>");
        13375  +  html += wxT("PRAGMA [database].freelist_count;<hr>");
        13376  +  html += wxT("PRAGMA index_info(index-name);<hr>");
        13377  +  html += wxT("PRAGMA index_list(table-name);<hr>");
        13378  +  html += wxT("PRAGMA table_info(table-name);<hr>");
        13379  +  html += wxT("PRAGMA [database.]schema_version;<br>");
        13380  +  html += wxT("PRAGMA [database.]schema_version = integer ;<br>");
        13381  +  html += wxT("PRAGMA [database.]user_version;<br>");
        13382  +  html += wxT("PRAGMA [database.]user_version = integer ;<hr>");
        13383  +  html += wxT("PRAGMA integrity_check;<br>");
        13384  +  html += wxT("PRAGMA integrity_check(integer)<hr>");
        13385  +  html += wxT("PRAGMA quick_check;<br>");
        13386  +  html += wxT("PRAGMA quick_check(integer)<hr>");
        13387  +  html += wxT("PRAGMA parser_trace = ON; (1)<br>");
        13388  +  html += wxT("PRAGMA parser_trace = OFF; (0)<hr>");
        13389  +  html += wxT("PRAGMA vdbe_trace = ON; (1)<br>");
        13390  +  html += wxT("PRAGMA vdbe_trace = OFF; (0)<hr>");
        13391  +  html += wxT("PRAGMA vdbe_listing = ON; (1)<br>");
        13392  +  html += wxT("PRAGMA vdbe_listing = OFF; (0)</td></tr>");
        13393  +  html +=
        13394  +    wxT
        13395  +    ("<tr><td bgcolor=\"#fffff0\">REINDEX</td><td bgcolor=\"#f0fff0\">sql-statement ::= REINDEX collation name<br>");
        13396  +  html +=
        13397  +    wxT
        13398  +    ("sql-statement ::= REINDEX [database-name .] table/index-name</td></tr>");
        13399  +  html +=
        13400  +    wxT
        13401  +    ("<tr><td bgcolor=\"#fffff0\">REPLACE</td><td bgcolor=\"#f0fff0\">sql-statement ::= REPLACE INTO [database-name .] table-name [( column-list )] VALUES ( value-list ) |<br>");
        13402  +  html +=
        13403  +    wxT
        13404  +    ("REPLACE INTO [database-name .] table-name [( column-list )] select-statement</td></tr>");
        13405  +  html +=
        13406  +    wxT
        13407  +    ("<tr><td bgcolor=\"#fffff0\">ROLLBACK TRANSACTION</td><td bgcolor=\"#f0fff0\">sql-statement ::= BEGIN [ DEFERRED | IMMEDIATE | EXCLUSIVE ] [TRANSACTION [name]]<br>");
        13408  +  html += wxT("sql-statement ::= END [TRANSACTION [name]]<br>");
        13409  +  html += wxT("sql-statement ::= COMMIT [TRANSACTION [name]]<br>");
        13410  +  html += wxT("sql-statement ::= ROLLBACK [TRANSACTION [name]]<br></td></tr>");
        13411  +  html +=
        13412  +    wxT
        13413  +    ("<tr><td bgcolor=\"#fffff0\">SELECT</td><td bgcolor=\"#f0fff0\">sql-statement ::= SELECT [ALL | DISTINCT] result [FROM table-list]<br>");
        13414  +  html += wxT("[WHERE expr]<br>");
        13415  +  html += wxT("[GROUP BY expr-list]<br>");
        13416  +  html += wxT("[HAVING expr]<br>");
        13417  +  html += wxT("[compound-op select]*<br>");
        13418  +  html += wxT("[ORDER BY sort-expr-list]<br>");
        13419  +  html += wxT("[LIMIT integer [( OFFSET | , ) integer]]<br>");
        13420  +  html += wxT("result ::= result-column [, result-column]*<br>");
        13421  +  html +=
        13422  +    wxT("result-column ::= * | table-name . * | expr [ [AS] string ]<br>");
        13423  +  html += wxT("table-list ::= table [join-op table join-args]*<br>");
        13424  +  html += wxT("table ::= table-name [AS alias] |<br>");
        13425  +  html += wxT("( select ) [AS alias]<br>");
        13426  +  html +=
        13427  +    wxT
        13428  +    ("join-op ::= , | [NATURAL] [LEFT | RIGHT | FULL] [OUTER | INNER | CROSS] JOIN<br>");
        13429  +  html += wxT("join-args ::= [ON expr] [USING ( id-list )]<br>");
        13430  +  html +=
        13431  +    wxT("sort-expr-list ::= expr [sort-order] [, expr [sort-order]]*<br>");
        13432  +  html += wxT("sort-order ::= [ COLLATE collation-name ] [ ASC | DESC ]<br>");
        13433  +  html +=
        13434  +    wxT("compound_op ::= UNION | UNION ALL | INTERSECT | EXCEPT</td></tr>");
        13435  +  html +=
        13436  +    wxT
        13437  +    ("<tr><td bgcolor=\"#fffff0\">UPDATE</td><td bgcolor=\"#f0fff0\">sql-statement ::= UPDATE [ OR conflict-algorithm ] [database-name .] table-name<br>");
        13438  +  html += wxT("SET assignment [, assignment]*<br>");
        13439  +  html += wxT("[WHERE expr]<br>");
        13440  +  html += wxT("assignment ::= column-name = expr</td></tr>");
        13441  +  html +=
        13442  +    wxT
        13443  +    ("<tr><td bgcolor=\"#fffff0\">VACUUM</td><td bgcolor=\"#f0fff0\">sql-statement ::= VACUUM</td></tr>");
        13444  +  html += wxT("</table>");
        13445  +  html += wxT("<a href=\"#index\">back to index</a>");
        13446  +  html +=
        13447  +    wxT
        13448  +    ("<h3><a align=\"center\" bgcolor=\"#e0ffe0\" name=\"c2\">SQLite SQL functions</a></h3>");
        13449  +  html += wxT("<table cellspacing=\"4\" cellpadding=\"2\" width=\"100%\">");
        13450  +  html +=
        13451  +    wxT
        13452  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c21\">ordinary functions</a><br><a href=\"#index\">back to index</a></td></tr>");
        13453  +  html +=
        13454  +    wxT
        13455  +    ("<tr><td bgcolor=\"#fffff0\">abs(X)</td><td bgcolor=\"#f0fff0\">Return the absolute value of the numeric argument X. ");
        13456  +  html +=
        13457  +    wxT
        13458  +    ("Return NULL if X is NULL. Return 0.0 if X is not a numeric value.</td></tr>");
        13459  +  html +=
        13460  +    wxT
        13461  +    ("<tr><td bgcolor=\"#fffff0\">changes()</td><td bgcolor=\"#f0fff0\">Returns the number of database rows that were changed or inserted or deleted ");
        13462  +  html +=
        13463  +    wxT
        13464  +    ("by the most recently completed INSERT, DELETE, or UPDATE statement, exclusive of statements in lower-level triggers.</td></tr>");
        13465  +  html +=
        13466  +    wxT
        13467  +    ("<tr><td bgcolor=\"#fffff0\">char(X1,X2,...,XN)</td><td bgcolor=\"#f0fff0\">The char(X1,X2,...,XN) function returns a string ");
        13468  +  html +=
        13469  +    wxT
        13470  +    ("composed of characters having the unicode code point values of integers X1 through XN, respectively.</td></tr>");
        13471  +  html +=
        13472  +    wxT
        13473  +    ("<tr><td bgcolor=\"#fffff0\">coalesce(X,Y,...)</td><td bgcolor=\"#f0fff0\">Return a copy of the first non-NULL argument. ");
        13474  +  html +=
        13475  +    wxT
        13476  +    ("If all arguments are NULL then NULL is returned. There must be at least 2 arguments.</td></tr>");
        13477  +  html +=
        13478  +    wxT
        13479  +    ("<tr><td bgcolor=\"#fffff0\">glob(X,Y)</td><td bgcolor=\"#f0fff0\">This function is used to implement the \"X GLOB Y\" syntax of SQLite. ");
        13480  +  html +=
        13481  +    wxT
        13482  +    ("The sqlite3_create_function() interface can be used to override this function and thereby change the operation of the GLOB operator.</td></tr>");
        13483  +  html +=
        13484  +    wxT
        13485  +    ("<tr><td bgcolor=\"#fffff0\">ifnull(X,Y)</td><td bgcolor=\"#f0fff0\">Return a copy of the first non-NULL argument. ");
        13486  +  html +=
        13487  +    wxT
        13488  +    ("If both arguments are NULL then NULL is returned. This behaves the same as coalesce().</td></tr>");
        13489  +  html +=
        13490  +    wxT
        13491  +    ("<tr><td bgcolor=\"#fffff0\">instr(X,Y)</td><td bgcolor=\"#f0fff0\">The instr(X,Y) function finds the first occurrence of string Y within string X and returns the ");
        13492  +  html +=
        13493  +    wxT
        13494  +    ("number of prior characters plus 1, or 0 if Y is nowhere found within X. Or, if X and Y are both BLOBs, then instr(X,Y) returns one more than ");
        13495  +  html +=
        13496  +    wxT
        13497  +    ("the number bytes prior to the first occurrence of Y, or 0 if Y does not occur anywhere within X. If both arguments X and Y to instr(X,Y) ");
        13498  +  html +=
        13499  +    wxT
        13500  +    ("are non-NULL and are not BLOBs then both are interpreted as strings. If either X or Y are NULL in instr(X,Y) then the result is NULL. </td></tr>");
        13501  +  html +=
        13502  +    wxT
        13503  +    ("<tr><td bgcolor=\"#fffff0\">hex(X)</td><td bgcolor=\"#f0fff0\">The argument is interpreted as a BLOB. ");
        13504  +  html +=
        13505  +    wxT
        13506  +    ("The result is a hexadecimal rendering of the content of that blob.</td></tr>");
        13507  +  html +=
        13508  +    wxT
        13509  +    ("<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. ");
        13510  +  html +=
        13511  +    wxT
        13512  +    ("This is the same value that would be returned from the sqlite3_last_insert_rowid() API function.</td></tr>");
        13513  +  html +=
        13514  +    wxT
        13515  +    ("<tr><td bgcolor=\"#fffff0\">length(X)</td><td bgcolor=\"#f0fff0\">Return the string length of X in characters. ");
        13516  +  html +=
        13517  +    wxT
        13518  +    ("If SQLite is configured to support UTF-8, then the number of UTF-8 characters is returned, not the number of bytes.</td></tr>");
        13519  +  html +=
        13520  +    wxT
        13521  +    ("<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.");
        13522  +  html +=
        13523  +    wxT
        13524  +    ("If the optional ESCAPE clause is present, then the user-function is invoked with three arguments. ");
        13525  +  html += wxT("Otherwise, it is invoked with two arguments only. ");
        13526  +  html +=
        13527  +    wxT
        13528  +    ("The sqlite3_create_function() interface can be used to override this function and thereby change the operation of the LIKE operator. ");
        13529  +  html +=
        13530  +    wxT
        13531  +    ("When doing this, it may be important to override both the two and three argument versions of the like() function. ");
        13532  +  html +=
        13533  +    wxT
        13534  +    ("Otherwise, different code may be called to implement the LIKE operator depending on whether or not an ESCAPE clause was specified.</td></tr>");
        13535  +  html +=
        13536  +    wxT
        13537  +    ("<tr><td bgcolor=\"#fffff0\">load_extension(X)</br>load_extension(X,Y)</td><td bgcolor=\"#f0fff0\">Load SQLite extensions ");
        13538  +  html +=
        13539  +    wxT("out of the shared library file named X using the entry point Y. ");
        13540  +  html +=
        13541  +    wxT
        13542  +    ("The result is a NULL. If Y is omitted then the default entry point of sqlite3_extension_init is used. ");
        13543  +  html +=
        13544  +    wxT
        13545  +    ("This function raises an exception if the extension fails to load or initialize correctly.</td></tr>");
        13546  +  html +=
        13547  +    wxT
        13548  +    ("<tr><td bgcolor=\"#fffff0\">lower(X)</td><td bgcolor=\"#f0fff0\">Return a copy of string X will all ASCII characters converted to lower case. ");
        13549  +  html +=
        13550  +    wxT
        13551  +    ("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>");
        13552  +  html +=
        13553  +    wxT
        13554  +    ("<tr><td bgcolor=\"#fffff0\">ltrim(X)<br>ltrim(X,Y)</td><td bgcolor=\"#f0fff0\">Return a string formed by removing any and all characters ");
        13555  +  html +=
        13556  +    wxT
        13557  +    ("that appear in Y from the left side of X. If the Y argument is omitted, spaces are removed.</td></tr>");
        13558  +  html +=
        13559  +    wxT
        13560  +    ("<tr><td bgcolor=\"#fffff0\">max(X,Y,...)</td><td bgcolor=\"#f0fff0\">Return the argument with the maximum value. ");
        13561  +  html += wxT("Arguments may be strings in addition to numbers. ");
        13562  +  html += wxT("The maximum value is determined by the usual sort order. ");
        13563  +  html +=
        13564  +    wxT
        13565  +    ("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>");
        13566  +  html +=
        13567  +    wxT
        13568  +    ("<tr><td bgcolor=\"#fffff0\">min(X,Y,...)</td><td bgcolor=\"#f0fff0\">Return the argument with the minimum value. ");
        13569  +  html += wxT("Arguments may be strings in addition to numbers. ");
        13570  +  html += wxT("The minimum value is determined by the usual sort order. ");
        13571  +  html +=
        13572  +    wxT
        13573  +    ("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>");
        13574  +  html +=
        13575  +    wxT
        13576  +    ("<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>");
        13577  +  html +=
        13578  +    wxT
        13579  +    ("<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 ");
        13580  +  html +=
        13581  +    wxT
        13582  +    ("into another SQL statement. Strings are surrounded by single-quotes with escapes on interior quotes as needed. ");
        13583  +  html +=
        13584  +    wxT
        13585  +    ("BLOBs are encoded as hexadecimal literals. The implementation of VACUUM uses this function. ");
        13586  +  html +=
        13587  +    wxT
        13588  +    ("The function is also useful when writing triggers to implement undo/redo functionality.</td></tr>");
        13589  +  html +=
        13590  +    wxT
        13591  +    ("<tr><td bgcolor=\"#fffff0\">random()</td><td bgcolor=\"#f0fff0\">Return a pseudo-random integer between -9223372036854775808 and +9223372036854775807.</td></tr>");
        13592  +  html +=
        13593  +    wxT
        13594  +    ("<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>");
        13595  +  html +=
        13596  +    wxT
        13597  +    ("<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. ");
        13598  +  html +=
        13599  +    wxT("The BINARY collating sequence is used for comparisons.</td></tr>");
        13600  +  html +=
        13601  +    wxT
        13602  +    ("<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. ");
        13603  +  html += wxT("If the Y argument is omitted, 0 is assumed.</td></tr>");
        13604  +  html +=
        13605  +    wxT
        13606  +    ("<tr><td bgcolor=\"#fffff0\">rtrim(X)<br>rtrim(X,Y)</td><td bgcolor=\"#f0fff0\">Return a string formed by removing any and all characters ");
        13607  +  html +=
        13608  +    wxT
        13609  +    ("that appear in Y from the right side of X. If the Y argument is omitted, spaces are removed.</td></tr>");
        13610  +  html +=
        13611  +    wxT
        13612  +    ("<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>");
        13613  +  html +=
        13614  +    wxT
        13615  +    ("<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 ");
        13616  +  html +=
        13617  +    wxT
        13618  +    ("and which is Z characters long. If Z is omitted then all character through the end of the string are returned. ");
        13619  +  html += wxT("The left-most character of X is number 1. ");
        13620  +  html +=
        13621  +    wxT
        13622  +    ("If Y is negative the the first character of the substring is found by counting from the right rather than the left. ");
        13623  +  html +=
        13624  +    wxT
        13625  +    ("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>");
        13626  +  html +=
        13627  +    wxT
        13628  +    ("<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. ");
        13629  +  html += wxT("If the Y argument is omitted, spaces are removed.</td></tr>");
        13630  +  html +=
        13631  +    wxT
        13632  +    ("<tr><td bgcolor=\"#fffff0\">typeof(X)</td><td bgcolor=\"#f0fff0\">Return the type of the expression X. ");
        13633  +  html +=
        13634  +    wxT
        13635  +    ("The only return values are \"null\", \"integer\", \"real\", \"text\", and \"blob\".</td></tr>");
        13636  +  html +=
        13637  +    wxT
        13638  +    ("<tr><td bgcolor=\"#fffff0\">unicode(X)</td><td bgcolor=\"#f0fff0\">The unicode(X) function returns the numeric unicode code point corresponding to the first ");
        13639  +  html +=
        13640  +    wxT
        13641  +    ("character of the string X. If the argument to unicode(X) is not a string then the result is undefined. </td></tr>");
        13642  +  html +=
        13643  +    wxT
        13644  +    ("<tr><td bgcolor=\"#fffff0\">upper(X)</td><td bgcolor=\"#f0fff0\">Return a copy of input string X converted to all upper-case letters. ");
        13645  +  html +=
        13646  +    wxT
        13647  +    ("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>");
        13648  +  html +=
        13649  +    wxT
        13650  +    ("<tr><td bgcolor=\"#fffff0\">zeroblob(N)</td><td bgcolor=\"#f0fff0\">Return a BLOB consisting of N bytes of 0x00. ");
        13651  +  html += wxT("SQLite manages these zeroblobs very efficiently. ");
        13652  +  html +=
        13653  +    wxT
        13654  +    ("Zeroblobs can be used to reserve space for a BLOB that is later written using incremental BLOB I/O.</td></tr> ");
        13655  +  html +=
        13656  +    wxT
        13657  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c22\">aggregate functions</a><br><a href=\"#index\">back to index</a></td></tr>");
        13658  +  html +=
        13659  +    wxT
        13660  +    ("<tr><td bgcolor=\"#fffff0\">avg(X)</td><td bgcolor=\"#f0fff0\">Return the average value of all non-NULL X within a group. ");
        13661  +  html +=
        13662  +    wxT
        13663  +    ("String and BLOB values that do not look like numbers are interpreted as 0. ");
        13664  +  html +=
        13665  +    wxT
        13666  +    ("The result of avg() is always a floating point value even if all inputs are integers.</td></tr>");
        13667  +  html +=
        13668  +    wxT
        13669  +    ("<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. ");
        13670  +  html +=
        13671  +    wxT
        13672  +    ("The second form (with no argument) return the total number of rows in the group.</td></tr>");
        13673  +  html +=
        13674  +    wxT
        13675  +    ("<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. ");
        13676  +  html +=
        13677  +    wxT
        13678  +    ("If parameter Y is the separator between instances of X. A comma (\",\") is used as the separator if Y is omitted.</td></tr>");
        13679  +  html +=
        13680  +    wxT
        13681  +    ("<tr><td bgcolor=\"#fffff0\">max(X)</td><td bgcolor=\"#f0fff0\">Return the maximum value of all values in the group. ");
        13682  +  html +=
        13683  +    wxT("The usual sort order is used to determine the maximum.</td></tr>");
        13684  +  html +=
        13685  +    wxT
        13686  +    ("<tr><td bgcolor=\"#fffff0\">min(X)</td><td bgcolor=\"#f0fff0\">Return the minimum non-NULL value of all values in the group. ");
        13687  +  html +=
        13688  +    wxT
        13689  +    ("The usual sort order is used to determine the minimum. NULL is only returned if all values in the group are NULL.</td></tr>");
        13690  +  html +=
        13691  +    wxT
        13692  +    ("<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. ");
        13693  +  html +=
        13694  +    wxT
        13695  +    ("If there are no non-NULL input rows then sum() return NULL but total() return 0.0. ");
        13696  +  html +=
        13697  +    wxT
        13698  +    ("NULL is not normally a helpful result for the sum of no rows but the SQL standard requires it and most other SQL ");
        13699  +  html +=
        13700  +    wxT
        13701  +    ("database engines implement sum() that way so SQLite does it in the same way in order to be compatible. ");
        13702  +  html +=
        13703  +    wxT
        13704  +    ("The non-standard total() function is provided as a convenient way to work around this design problem in the SQL language.<br>");
        13705  +  html +=
        13706  +    wxT
        13707  +    ("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. ");
        13708  +  html +=
        13709  +    wxT
        13710  +    ("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>");
        13711  +  html +=
        13712  +    wxT
        13713  +    ("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.");
        13714  +  html += wxT("Total() never throws an exception.</td></tr> ");
        13715  +  html += wxT("</table>");
        13716  +  html += wxT("<a href=\"#index\">back to index</a>");
        13717  +  html += wxT("<h3><a name=\"c3\">SpatiaLite SQL Spatial functions</a></h3>");
        13718  +  html += wxT("<table cellspacing=\"4\" cellpadding=\"2\" width=\"100%\">");
        13719  +  html +=
        13720  +    wxT
        13721  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"version\">SQL version info [and build options] functions</a></a>");
        13722  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        13723  +  html +=
        13724  +    wxT("<tr><td bgcolor=\"#fffff0\">spatialite_version( void ) : String</td>");
        13725  +  html +=
        13726  +    wxT
        13727  +    ("<td bgcolor=\"#f0fff0\">returns the current SpatiaLite version</td></tr>");
        13728  +  html +=
        13729  +    wxT
        13730  +    ("<tr><td bgcolor=\"#fffff0\">spatialite_target_cpu( void ) : String</td>");
        13731  +  html +=
        13732  +    wxT
        13733  +    ("<td bgcolor=\"#f0fff0\">returns the current SpatiaLite Target CPU</td></tr>");
        13734  +  html +=
        13735  +    wxT("<tr><td bgcolor=\"#fffff0\">proj4_version( void ) : String</td>");
        13736  +  html +=
        13737  +    wxT
        13738  +    ("<td bgcolor=\"#f0fff0\">returns the current PROJ.4 version, or NULL if PROJ.4 is currently unsupported</td></tr>");
        13739  +  html += wxT("<tr><td bgcolor=\"#fffff0\">geos_version( void ) : String</td>");
        13740  +  html +=
        13741  +    wxT
        13742  +    ("<td bgcolor=\"#f0fff0\">returns the current GEOS version, or NULL if GEOS is currently unsupported</td></tr>");
        13743  +  html +=
        13744  +    wxT("<tr><td bgcolor=\"#fffff0\">rttopo_version( void ) : String</td>");
        13745  +  html +=
        13746  +    wxT
        13747  +    ("<td bgcolor=\"#f0fff0\">returns the current RTTOPO version, or NULL if RTTOPO is currently unsupported</td></tr>");
        13748  +  html +=
        13749  +    wxT("<tr><td bgcolor=\"#fffff0\">libxml2_version( void ) : String</td>");
        13750  +  html +=
        13751  +    wxT
        13752  +    ("<td bgcolor=\"#f0fff0\">returns the current LibXML2 version, or NULL if LibXML2 is currently unsupported</td></tr>");
        13753  +  html += wxT("<tr><td bgcolor=\"#fffff0\">HasIconv( void ) : Boolean</td>");
        13754  +  html +=
        13755  +    wxT
        13756  +    ("<td bgcolor=\"#f0fff0\">TRUE if the underlaying library was built enabling ICONV</td></tr>");
        13757  +  html += wxT("<tr><td bgcolor=\"#fffff0\">HasMathSQL( void ) : Boolean</td>");
        13758  +  html +=
        13759  +    wxT
        13760  +    ("<td bgcolor=\"#f0fff0\">TRUE if the underlaying library was built enabling MATHSQL</td></tr>");
        13761  +  html +=
        13762  +    wxT("<tr><td bgcolor=\"#fffff0\">HasGeoCallbacks( void ) : Boolean</td>");
        13763  +  html +=
        13764  +    wxT
        13765  +    ("<td bgcolor=\"#f0fff0\">TRUE if the underlaying library was built enabling GEOCALLBACKS</td></tr>");
        13766  +  html += wxT("<tr><td bgcolor=\"#fffff0\">HasProj( void ) : Boolean</td>");
        13767  +  html +=
        13768  +    wxT
        13769  +    ("<td bgcolor=\"#f0fff0\">TRUE if the underlaying library was built enabling PROJ</td></tr>");
        13770  +  html += wxT("<tr><td bgcolor=\"#fffff0\">HasGeos( void ) : Boolean</td>");
        13771  +  html +=
        13772  +    wxT
        13773  +    ("<td bgcolor=\"#f0fff0\">TRUE if the underlaying library was built enabling GEOS</td></tr>");
        13774  +  html +=
        13775  +    wxT("<tr><td bgcolor=\"#fffff0\">HasGeosAdvanced( void ) : Boolean</td>");
        13776  +  html +=
        13777  +    wxT
        13778  +    ("<td bgcolor=\"#f0fff0\">TRUE if the underlaying library was built enabling GEOSADVANCED</td></tr>");
        13779  +  html +=
        13780  +    wxT("<tr><td bgcolor=\"#fffff0\">HasGeosTrunk( void ) : Boolean</td>");
        13781  +  html +=
        13782  +    wxT
        13783  +    ("<td bgcolor=\"#f0fff0\">TRUE if the underlaying library was built enabling GEOSTRUNK</td></tr>");
        13784  +  html += wxT("<tr><td bgcolor=\"#fffff0\">HasRtTopo( void ) : Boolean</td>");
        13785  +  html +=
        13786  +    wxT
        13787  +    ("<td bgcolor=\"#f0fff0\">TRUE if the underlaying library was built enabling RTTOPO</td></tr>");
        13788  +  html += wxT("<tr><td bgcolor=\"#fffff0\">HasLibXML2( void ) : Boolean</td>");
        13789  +  html +=
        13790  +    wxT
        13791  +    ("<td bgcolor=\"#f0fff0\">TRUE if the underlaying library was built enabling LibXML2</td></tr>");
        13792  +  html += wxT("<tr><td bgcolor=\"#fffff0\">HasEpsg( void ) : Boolean</td>");
        13793  +  html +=
        13794  +    wxT
        13795  +    ("<td bgcolor=\"#f0fff0\">TRUE if the underlaying library was built enabling EPSG</td></tr>");
        13796  +  html += wxT("<tr><td bgcolor=\"#fffff0\">HasFreeXL( void ) : Boolean</td>");
        13797  +  html +=
        13798  +    wxT
        13799  +    ("<td bgcolor=\"#f0fff0\">TRUE if the underlaying library was built enabling FreeXL</td></tr>");
        13800  +  html +=
        13801  +    wxT
        13802  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"generic\">generic SQL functions</a></a>");
        13803  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        13804  +  html +=
        13805  +    wxT
        13806  +    ("<tr><td bgcolor=\"#fffff0\">CastToInteger( value Generic ) : Integer</td>");
        13807  +  html +=
        13808  +    wxT
        13809  +    ("<td bgcolor=\"#f0fff0\">returns the intput value possibly casted to the Integer data-type: NULL if no conversion is possible.</td></tr>");
        13810  +  html +=
        13811  +    wxT
        13812  +    ("<tr><td bgcolor=\"#fffff0\">CastToDouble( value Generic ) : Double precision</td>");
        13813  +  html +=
        13814  +    wxT
        13815  +    ("<td bgcolor=\"#f0fff0\">returns the intput value possibly casted to the Double data-type: NULL if no conversion is possible.</td></tr>");
        13816  +  html +=
        13817  +    wxT
        13818  +    ("<tr><td bgcolor=\"#fffff0\">CastToText( value Generic ) : Text<hr>CastToText( value Generic ) : Text</td>");
        13819  +  html +=
        13820  +    wxT
        13821  +    ("<td bgcolor=\"#f0fff0\">returns the intput value possibly casted to the Text data-type: NULL if no conversion is possible.<br>");
        13822  +  html +=
        13823  +    wxT
        13824  +    ("If an optional argument \"zero_pad\" is passed and the input value is of the Integer or Double type, then the returned string will be padded using as much trailing ZEROs so to ensure the required length.</td></tr>");
        13825  +  html +=
        13826  +    wxT("<tr><td bgcolor=\"#fffff0\">CastToBlob( value Generic ) : Blob<hr>");
        13827  +  html += wxT("(CastToBlob (value Generic , hex_input Boolean ) : Blob</td>");
        13828  +  html +=
        13829  +    wxT
        13830  +    ("<td bgcolor=\"#f0fff0\">returns the intput value possibly casted to the Blob data-type: NULL if no conversion is possible.</td></tr>");
        13831  +  html +=
        13832  +    wxT
        13833  +    ("<tr><td bgcolor=\"#fffff0\">ForceAsNull( val1 Generic , val2 Generic ) : Generic</td>");
        13834  +  html +=
        13835  +    wxT
        13836  +    ("<td bgcolor=\"#f0fff0\">if \"val1\" and \"val2\" are equal (and exactly of the same data-type) NULL will be returned; ");
        13837  +  html +=
        13838  +    wxT
        13839  +    ("otherwise \"val1\" will be returned absolutely untouched and still preserving its originale data-type.</td></tr>");
        13840  +  html += wxT("<tr><td bgcolor=\"#fffff0\">CreateUUID( void ) : Text</td>");
        13841  +  html +=
        13842  +    wxT
        13843  +    ("<td bgcolor=\"#f0fff0\">returns a Version 4 (random) UUID (<b>Universally unique identifier</b>).</td></tr>");
        13844  +  html +=
        13845  +    wxT("<tr><td bgcolor=\"#fffff0\">MD5Checksum( BLOB | TEXT ) : Text</td>");
        13846  +  html +=
        13847  +    wxT
        13848  +    ("<td bgcolor=\"#f0fff0\">returns the MD5 checksum corresponding to the input value.<br>Will return NULL for non-BLOB input.</td></tr>");
        13849  +  html +=
        13850  +    wxT
        13851  +    ("<tr><td bgcolor=\"#fffff0\">MD5TotalChecksum( BLOB | TEXT ) : Text</td>");
        13852  +  html +=
        13853  +    wxT
        13854  +    ("<td bgcolor=\"#f0fff0\">returns a cumulative MD5 checksum.<br><b><u>Aggregate function</u></b>.</td></tr>");
        13855  +  html +=
        13856  +    wxT
        13857  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"error\">SQL functions reporting ");
        13858  +  html += wxT("GEOS / RTTOPO errors and warnings</a></a>");
        13859  +  html +=
        13860  +    wxT
        13861  +    ("<tr><td bgcolor=\"#fffff0\">GEOS_GetLastWarningMsg( void ) : <i>String</td>");
        13862  +  html +=
        13863  +    wxT
        13864  +    ("<td bgcolor=\"#f0fff0\">Will return the most recent warning message returned by GEOS (if any).<hr>");
        13865  +  html +=
        13866  +    wxT("NULL will be returned if there is no pending GEOS warning.</td></tr>");
        13867  +  html +=
        13868  +    wxT
        13869  +    ("<tr><td bgcolor=\"#fffff0\">GEOS_GetLastErrorMsg( void ) : String</td>");
        13870  +  html +=
        13871  +    wxT
        13872  +    ("<td bgcolor=\"#f0fff0\">Will return the most recent error message returned by GEOS (if any).<hr>");
        13873  +  html +=
        13874  +    wxT("NULL will be returned if there is no pending GEOS error.</td></tr>");
        13875  +  html +=
        13876  +    wxT
        13877  +    ("<tr><td bgcolor=\"#fffff0\">GEOS_GetLastAuxErrorMsg( void ) : String</td>");
        13878  +  html +=
        13879  +    wxT
        13880  +    ("<td bgcolor=\"#f0fff0\">Will return the most recent (auxiliary) error message returned by GEOS (if any).<hr>");
        13881  +  html +=
        13882  +    wxT
        13883  +    ("NULL will be returned if there is no pending GEOS (auxiliary) error.</td></tr>");
        13884  +  html +=
        13885  +    wxT
        13886  +    ("<tr><td bgcolor=\"#fffff0\">GEOS_GetCriticalPointFromMsg( void ) : Point<hr>");
        13887  +  html += wxT("GEOS_GetCriticalPointFromMsg( SRID Integer ) : Point</td>");
        13888  +  html +=
        13889  +    wxT
        13890  +    ("<td bgcolor=\"#f0fff0\">Will (possibly) return a Point Geometry extracted from the latest error / warning ");
        13891  +  html +=
        13892  +    wxT
        13893  +    ("message returned by GEOS.<hr>NULL will be returned if there is no pending GEOS message, or if the ");
        13894  +  html +=
        13895  +    wxT("current GEOS message doesn't contain a critical Point.</td></tr>");
        13896  +  html +=
        13897  +    wxT
        13898  +    ("<tr><td bgcolor=\"#fffff0\">RTTOPO_GetLastWarningMsg( void ) : String</td>");
        13899  +  html +=
        13900  +    wxT
        13901  +    ("<td bgcolor=\"#f0fff0\">Will return the most recent warning message returned by RTTOPO (if any).<hr>");
        13902  +  html +=
        13903  +    wxT("NULL will be returned if there is no pending RTTOPO error.</td></tr>");
        13904  +  html +=
        13905  +    wxT
        13906  +    ("<tr><td bgcolor=\"#fffff0\">RTTOPO_GetLastErrorMsg( void ) : String</td>");
        13907  +  html +=
        13908  +    wxT
        13909  +    ("<td bgcolor=\"#f0fff0\">Will return the most recent error message returned by RTTOPO (if any).<hr>");
        13910  +  html +=
        13911  +    wxT("NULL will be returned if there is no pending RTTOPO error.</td></tr>");
        13912  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        13913  +  html +=
        13914  +    wxT
        13915  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"math\">SQL math functions</a></a>");
        13916  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        13917  +  html +=
        13918  +    wxT
        13919  +    ("<tr><td bgcolor=\"#fffff0\">Abs( x Double precision ) : Double precision</td>");
        13920  +  html +=
        13921  +    wxT
        13922  +    ("<td bgcolor=\"#f0fff0\">returns the absolute value of <i>x</i></td></tr>");
        13923  +  html +=
        13924  +    wxT
        13925  +    ("<tr><td bgcolor=\"#fffff0\">Acos( x Double precision ) : Double precision</td>");
        13926  +  html +=
        13927  +    wxT
        13928  +    ("<td bgcolor=\"#f0fff0\">returns the arc cosine of <i>x</i>, that is, the value whose cosine is <i>x</i><br>");
        13929  +  html += wxT("returns NULL if <i>x</i> is not in the range -1 to 1</td></tr>");
        13930  +  html +=
        13931  +    wxT
        13932  +    ("<tr><td bgcolor=\"#fffff0\">Asin( x Double precision ) : Double precision</td>");
        13933  +  html +=
        13934  +    wxT
        13935  +    ("<td bgcolor=\"#f0fff0\">returns the arc sine of <i>x</i>, that is, the value whose sine is <i>x</i><br>");
        13936  +  html += wxT("returns NULL if <i>x</i> is not in the range -1 to 1</td></tr>");
        13937  +  html +=
        13938  +    wxT
        13939  +    ("<tr><td bgcolor=\"#fffff0\">Atan( x Double precision ) : Double precision</td>");
        13940  +  html +=
        13941  +    wxT
        13942  +    ("<td bgcolor=\"#f0fff0\">returns the arc tangent of <i>x</i>, that is, the value whose tangent is <i>x</i></td></tr>");
        13943  +  html +=
        13944  +    wxT
        13945  +    ("<tr><td bgcolor=\"#fffff0\">Ceil( x Double precision ) : Double precision<hr>");
        13946  +  html += wxT("Ceiling( x Double precision ) : Double precision</td>");
        13947  +  html +=
        13948  +    wxT
        13949  +    ("<td bgcolor=\"#f0fff0\">returns the smallest integer value not less than <i>x</i></td></tr>");
        13950  +  html +=
        13951  +    wxT
        13952  +    ("<tr><td bgcolor=\"#fffff0\">Cos( x Double precision ) : Double precision</td>");
        13953  +  html +=
        13954  +    wxT
        13955  +    ("<td bgcolor=\"#f0fff0\">returns the cosine of <i>x</i>, where <i>x</i> is given in <u>radians</u></td></tr>");
        13956  +  html +=
        13957  +    wxT
        13958  +    ("<tr><td bgcolor=\"#fffff0\">Cot( x Double precision ) : Double precision</td>");
        13959  +  html +=
        13960  +    wxT
        13961  +    ("<td bgcolor=\"#f0fff0\">returns the cotangent of <i>x</i>, where <i>x</i> is given in <u>radians</u></td></tr>");
        13962  +  html +=
        13963  +    wxT
        13964  +    ("<tr><td bgcolor=\"#fffff0\">Degrees( x Double precision ) : Double precision</td>");
        13965  +  html +=
        13966  +    wxT
        13967  +    ("<td bgcolor=\"#f0fff0\">returns the argument <i>x</i>, converted from radians to degrees</td></tr>");
        13968  +  html +=
        13969  +    wxT
        13970  +    ("<tr><td bgcolor=\"#fffff0\">Exp( x Double precision ) : Double precision</td>");
        13971  +  html +=
        13972  +    wxT
        13973  +    ("<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>");
        13974  +  html +=
        13975  +    wxT
        13976  +    ("the inverse of this function is <i>Log()</i> (using a single argument only) or <i>Ln()</i></td></tr>");
        13977  +  html +=
        13978  +    wxT
        13979  +    ("<tr><td bgcolor=\"#fffff0\">Floor( x Double precision ) : Double precision</td>");
        13980  +  html +=
        13981  +    wxT
        13982  +    ("<td bgcolor=\"#f0fff0\">returns the largest integer value not greater than <i>x</i></td></tr>");
        13983  +  html +=
        13984  +    wxT
        13985  +    ("<tr><td bgcolor=\"#fffff0\">Ln( x Double precision ) : Double precision<hr>");
        13986  +  html += wxT("Log( x Double precision ) : Double precision</td>");
        13987  +  html +=
        13988  +    wxT
        13989  +    ("<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>");
        13990  +  html +=
        13991  +    wxT
        13992  +    ("If <i>x</i> is less than or equal to 0, then NULL is returned</td></tr>");
        13993  +  html +=
        13994  +    wxT
        13995  +    ("<tr><td bgcolor=\"#fffff0\">Log( b Double precision, x Double precision ) : Double precision</td>");
        13996  +  html +=
        13997  +    wxT
        13998  +    ("<td bgcolor=\"#f0fff0\">returns the logarithm of <i>x</i> to the base <i>b</i><br>");
        13999  +  html +=
        14000  +    wxT
        14001  +    ("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>");
        14002  +  html +=
        14003  +    wxT
        14004  +    ("<i>Log(b, x)</i>  is equivalent to <i>Log(x)</i> / <i>Log(b)</i></td></tr>");
        14005  +  html +=
        14006  +    wxT
        14007  +    ("<tr><td bgcolor=\"#fffff0\">Log2( x Double precision ) : Double precision</td>");
        14008  +  html +=
        14009  +    wxT("<td bgcolor=\"#f0fff0\">returns the base-2 logarithm of <i>x</i><hr>");
        14010  +  html +=
        14011  +    wxT
        14012  +    ("<i>Log2(x)</i>  is equivalent to <i>Log(x)</i> / <i>Log(2)</i></td></tr>");
        14013  +  html +=
        14014  +    wxT
        14015  +    ("<tr><td bgcolor=\"#fffff0\">Log10( x Double precision ) : Double precision</td>");
        14016  +  html +=
        14017  +    wxT
        14018  +    ("<td bgcolor=\"#f0fff0\">returns the base-10 logarithm of <i>x</i><hr>");
        14019  +  html +=
        14020  +    wxT
        14021  +    ("<i>Log10(x)</i>  is equivalent to <i>Log(x)</i> / <i>Log(10)</i></td></tr>");
        14022  +  html += wxT("<tr><td bgcolor=\"#fffff0\">PI( void ) : Double precision</td>");
        14023  +  html +=
        14024  +    wxT("<td bgcolor=\"#f0fff0\">returns the value of <i>PI</i></td></tr>");
        14025  +  html +=
        14026  +    wxT
        14027  +    ("<tr><td bgcolor=\"#fffff0\">Pow( x Double precision, y Double precision ) : Double precision<hr>");
        14028  +  html +=
        14029  +    wxT
        14030  +    ("Power( x Double precision, y Double precision ) : Double precision</td>");
        14031  +  html +=
        14032  +    wxT
        14033  +    ("<td bgcolor=\"#f0fff0\">returns the value of <i>x</i> raised to the power of <i>y</i></td></tr>");
        14034  +  html +=
        14035  +    wxT
        14036  +    ("<tr><td bgcolor=\"#fffff0\">Radians( x Double precision ) : Double precision</td>");
        14037  +  html +=
        14038  +    wxT
        14039  +    ("<td bgcolor=\"#f0fff0\">returns the argument <i>x</i>, converted from degrees to radians</td></tr>");
        14040  +  html +=
        14041  +    wxT
        14042  +    ("<tr><td bgcolor=\"#fffff0\">Sign( x Double precision ) : Double precision</td>");
        14043  +  html +=
        14044  +    wxT
        14045  +    ("<td bgcolor=\"#f0fff0\">returns the sign of the argument as -1, 0, or 1, ");
        14046  +  html +=
        14047  +    wxT
        14048  +    ("depending on whether <i>x</i> is negative, zero, or positive.</td></tr>");
        14049  +  html +=
        14050  +    wxT
        14051  +    ("<tr><td bgcolor=\"#fffff0\">Sin( x Double precision ) : Double precision</td>");
        14052  +  html +=
        14053  +    wxT
        14054  +    ("<td bgcolor=\"#f0fff0\">returns the sine of <i>x</i>, where <i>x</i> is given in <u>radians</u></td></tr>");
        14055  +  html +=
        14056  +    wxT
        14057  +    ("<tr><td bgcolor=\"#fffff0\">Sqrt( x Double precision ) : Double precision</td>");
        14058  +  html +=
        14059  +    wxT
        14060  +    ("<td bgcolor=\"#f0fff0\">returns the square root of a non-negative number <i>x</i></td></tr>");
        14061  +  html +=
        14062  +    wxT
        14063  +    ("<tr><td bgcolor=\"#fffff0\">Stddev_pop( x Double precision ) : Double precision</td>");
        14064  +  html +=
        14065  +    wxT
        14066  +    ("<td bgcolor=\"#f0fff0\">returns the population standard deviation of the input values<br>");
        14067  +  html += wxT("<b><u>aggregate function</u></b></u></td></tr>");
        14068  +  html +=
        14069  +    wxT
        14070  +    ("<tr><td bgcolor=\"#fffff0\">Stddev_samp( x Double precision ) : Double precision</td>");
        14071  +  html +=
        14072  +    wxT
        14073  +    ("<td bgcolor=\"#f0fff0\">returns the sample standard deviation of the input values<br>");
        14074  +  html += wxT("<b><u>aggregate function</u></b></u></td></tr>");
        14075  +  html +=
        14076  +    wxT
        14077  +    ("<tr><td bgcolor=\"#fffff0\">Tan( x Double precision ) : Double precision</td>");
        14078  +  html +=
        14079  +    wxT
        14080  +    ("<td bgcolor=\"#f0fff0\">returns the tangent of <i>x</i>, where <i>x</i> is given in <u>radians</u></td></tr>");
        14081  +  html +=
        14082  +    wxT
        14083  +    ("<tr><td bgcolor=\"#fffff0\">Var_pop( x Double precision ) : Double precision</td>");
        14084  +  html +=
        14085  +    wxT
        14086  +    ("<td bgcolor=\"#f0fff0\">returns the population variance of the input values (<i>square of the population standard deviation</i>)<br>");
        14087  +  html += wxT("<b><u>aggregate function</u></b></u></td></tr>");
        14088  +  html +=
        14089  +    wxT
        14090  +    ("<tr><td bgcolor=\"#fffff0\">Var_samp( x Double precision ) : Double precision</td>");
        14091  +  html +=
        14092  +    wxT
        14093  +    ("<td bgcolor=\"#f0fff0\">returns the sample variance of the input values (<i>square of the sample standard deviation</i>)<br>");
        14094  +  html += wxT("<b><u>aggregate function</u></b></u></td></tr>");
        14095  +  html +=
        14096  +    wxT
        14097  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"length_cvt\">SQL length/distance unit-conversion functions</a></a>");
        14098  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        14099  +  html +=
        14100  +    wxT
        14101  +    ("<tr><td bgcolor=\"#fffff0\">CvtToKm( x Double precision ) : Double precision<hr>CvtFromKm( x Double precision ) : Double precision</td>");
        14102  +  html += wxT("<td bgcolor=\"#f0fff0\">meters / kilometers</td></tr>");
        14103  +  html +=
        14104  +    wxT
        14105  +    ("<tr><td bgcolor=\"#fffff0\">CvtToDm( x Double precision ) : Double precision<hr>CvtFromDm( x Double precision ) : Double precision</td>");
        14106  +  html += wxT("<td bgcolor=\"#f0fff0\">meters / decimeters</td></tr>");
        14107  +  html +=
        14108  +    wxT
        14109  +    ("<tr><td bgcolor=\"#fffff0\">CvtToCm( x Double precision ) : Double precision<hr>CvtFromCm( x Double precision ) : Double precision</td>");
        14110  +  html += wxT("<td bgcolor=\"#f0fff0\">meters / centimeters</td></tr>");
        14111  +  html +=
        14112  +    wxT
        14113  +    ("<tr><td bgcolor=\"#fffff0\">CvtToMm( x Double precision ) : Double precision<hr>CvtFromMm( x Double precision ) : Double precision</td>");
        14114  +  html += wxT("<td bgcolor=\"#f0fff0\">meters / millimeters</td></tr>");
        14115  +  html +=
        14116  +    wxT
        14117  +    ("<tr><td bgcolor=\"#fffff0\">CvtToKmi( x Double precision ) : Double precision<hr>CvtFromKmi( x Double precision ) : Double precision</td>");
        14118  +  html +=
        14119  +    wxT
        14120  +    ("<td bgcolor=\"#f0fff0\">meters / internation nautical miles</td></tr>");
        14121  +  html +=
        14122  +    wxT
        14123  +    ("<tr><td bgcolor=\"#fffff0\">CvtToIn( x Double precision ) : Double precision<hr>CvtFromIn( x Double precision ) : Double precision</td>");
        14124  +  html +=
        14125  +    wxT("<td bgcolor=\"#f0fff0\">meters / international inches</td></tr>");
        14126  +  html +=
        14127  +    wxT
        14128  +    ("<tr><td bgcolor=\"#fffff0\">CvtToFt( x Double precision ) : Double precision<hr>CvtFromFt( x Double precision ) : Double precision</td>");
        14129  +  html += wxT("<td bgcolor=\"#f0fff0\">meters / international feet</td></tr>");
        14130  +  html +=
        14131  +    wxT
        14132  +    ("<tr><td bgcolor=\"#fffff0\">CvtToYd( x Double precision ) : Double precision<hr>CvtFromYd( x Double precision ) : Double precision</td>");
        14133  +  html += wxT("<td bgcolor=\"#f0fff0\">meters / international yards</td></tr>");
        14134  +  html +=
        14135  +    wxT
        14136  +    ("<tr><td bgcolor=\"#fffff0\">CvtToMi( x Double precision ) : Double precision<hr>CvtFromMi( x Double precision ) : Double precision</td>");
        14137  +  html +=
        14138  +    wxT
        14139  +    ("<td bgcolor=\"#f0fff0\">meters / international statute miles</td></tr>");
        14140  +  html +=
        14141  +    wxT
        14142  +    ("<tr><td bgcolor=\"#fffff0\">CvtToFath( x Double precision ) : Double precision<hr>CvtFromFath( x Double precision ) : Double precision</td>");
        14143  +  html +=
        14144  +    wxT("<td bgcolor=\"#f0fff0\">meters / international fathoms</td></tr>");
        14145  +  html +=
        14146  +    wxT
        14147  +    ("<tr><td bgcolor=\"#fffff0\">CvtToCh( x Double precision ) : Double precision<hr>CvtFromCh( x Double precision ) : Double precision</td>");
        14148  +  html +=
        14149  +    wxT("<td bgcolor=\"#f0fff0\">meters / international chains</td></tr>");
        14150  +  html +=
        14151  +    wxT
        14152  +    ("<tr><td bgcolor=\"#fffff0\">CvtToLink( x Double precision ) : Double precision<hr>CvtFromLink( x Double precision ) : Double precision</td>");
        14153  +  html += wxT("<td bgcolor=\"#f0fff0\">meters / international links</td></tr>");
        14154  +  html +=
        14155  +    wxT
        14156  +    ("<tr><td bgcolor=\"#fffff0\">CvtToUsIn( x Double precision ) : Double precision<hr>CvtFromUsIn( x Double precision ) : Double precision</td>");
        14157  +  html += wxT("<td bgcolor=\"#f0fff0\">meters / U.S. inches</td></tr>");
        14158  +  html +=
        14159  +    wxT
        14160  +    ("<tr><td bgcolor=\"#fffff0\">CvtToUsFt( x Double precision ) : Double precision<hr>CvtFromUsFt( x Double precision ) : Double precision</td>");
        14161  +  html += wxT("<td bgcolor=\"#f0fff0\">meters / U.S. feet</td></tr>");
        14162  +  html +=
        14163  +    wxT
        14164  +    ("<tr><td bgcolor=\"#fffff0\">CvtToUsYd( x Double precision ) : Double precision<hr>CvtFromUsYd( x Double precision ) : Double precision</td>");
        14165  +  html += wxT("<td bgcolor=\"#f0fff0\">meters / U.S. yards</td></tr>");
        14166  +  html +=
        14167  +    wxT
        14168  +    ("<tr><td bgcolor=\"#fffff0\">CvtToUsMi( x Double precision ) : Double precision<hr>CvtFromUsMi( x Double precision ) : Double precision</td>");
        14169  +  html += wxT("<td bgcolor=\"#f0fff0\">meters / U.S. statute miles</td></tr>");
        14170  +  html +=
        14171  +    wxT
        14172  +    ("<tr><td bgcolor=\"#fffff0\">CvtToUsCh( x Double precision ) : Double precision<hr>CvtFromUsCh( x Double precision ) : Double precision</td>");
        14173  +  html += wxT("<td bgcolor=\"#f0fff0\">meters / U.S. chains</td></tr>");
        14174  +  html +=
        14175  +    wxT
        14176  +    ("<tr><td bgcolor=\"#fffff0\">CvtToIndFt( x Double precision ) : Double precision<hr>CvtFromIndFt( x Double precision ) : Double precision</td>");
        14177  +  html += wxT("<td bgcolor=\"#f0fff0\">meters / indian feet</td></tr>");
        14178  +  html +=
        14179  +    wxT
        14180  +    ("<tr><td bgcolor=\"#fffff0\">CvtToIndYd( x Double precision ) : Double precision<hr>CvtFromIndYd( x Double precision ) : Double precision</td>");
        14181  +  html += wxT("<td bgcolor=\"#f0fff0\">meters / indian yards</td></tr>");
        14182  +  html +=
        14183  +    wxT
        14184  +    ("<tr><td bgcolor=\"#fffff0\">CvtToIndCh( x Double precision ) : Double precision<hr>CvtFromIndCh( x Double precision ) : Double precision</td>");
        14185  +  html += wxT("<td bgcolor=\"#f0fff0\">meters / indian chains</td></tr>");
        14186  +  html +=
        14187  +    wxT
        14188  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"dms_cvt\">DD/DMS conversion functions (longitude/latitude)</a></a>");
        14189  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        14190  +  html +=
        14191  +    wxT
        14192  +    ("<tr><td bgcolor=\"#fffff0\">LongLatToDMS( longitude Double precision , latitude Double precision ) : String</td>");
        14193  +  html +=
        14194  +    wxT
        14195  +    ("<td bgcolor=\"#f0fff0\">will return a DMS string (Degrees, Minutes and Seconds) starting from DD (Decimal Degrees) input coordinates<hr>");
        14196  +  html += wxT("NULL will be returned on invalid input.</td></tr>");
        14197  +  html +=
        14198  +    wxT
        14199  +    ("<tr><td bgcolor=\"#fffff0\">LongitudeFromDMS( dms_expression String ) : Double precision<hr>LatitudeFromDMS( dms_expression String ) : Double precision</td>");
        14200  +  html +=
        14201  +    wxT
        14202  +    ("<td bgcolor=\"#f0fff0\">will return the DD coordinates from within a DMS expression<hr>");
        14203  +  html += wxT("NULL will be returned on invalid input.</td></tr>");
        14204  +  html +=
        14205  +    wxT
        14206  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"blob\">SQL utility functions for BLOB objects</a></a>");
        14207  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        14208  +  html +=
        14209  +    wxT("<tr><td bgcolor=\"#fffff0\">IsZipBlob( content Blob ) : Integer</td>");
        14210  +  html +=
        14211  +    wxT
        14212  +    ("<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>");
        14213  +  html +=
        14214  +    wxT
        14215  +    ("TRUE if this BLOB object corresponds to a valid ZIP-compressed file</td></tr>");
        14216  +  html +=
        14217  +    wxT("<tr><td bgcolor=\"#fffff0\">IsPdfBlob( content Blob ) : Integer</td>");
        14218  +  html +=
        14219  +    wxT
        14220  +    ("<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>");
        14221  +  html +=
        14222  +    wxT
        14223  +    ("TRUE if this BLOB object corresponds to a valid PDF document</td></tr>");
        14224  +  html +=
        14225  +    wxT("<tr><td bgcolor=\"#fffff0\">IsGifBlob( image Blob ) : Integer</td>");
        14226  +  html +=
        14227  +    wxT
        14228  +    ("<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>");
        14229  +  html +=
        14230  +    wxT("TRUE if this BLOB object corresponds to a valid GIF image</td></tr>");
        14231  +  html +=
        14232  +    wxT("<tr><td bgcolor=\"#fffff0\">IsPngBlob( image Blob ) : Integer</td>");
        14233  +  html +=
        14234  +    wxT
        14235  +    ("<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>");
        14236  +  html +=
        14237  +    wxT("TRUE if this BLOB object corresponds to a valid PNG image</td></tr>");
        14238  +  html +=
        14239  +    wxT("<tr><td bgcolor=\"#fffff0\">IsTiffBlob( image Blob ) : Integer</td>");
        14240  +  html +=
        14241  +    wxT
        14242  +    ("<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>");
        14243  +  html +=
        14244  +    wxT("TRUE if this BLOB object corresponds to a valid TIFF image</td></tr>");
        14245  +  html +=
        14246  +    wxT("<tr><td bgcolor=\"#fffff0\">IsJpegBlob( image Blob ) : Integer</td>");
        14247  +  html +=
        14248  +    wxT
        14249  +    ("<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>");
        14250  +  html +=
        14251  +    wxT("TRUE if this BLOB object corresponds to a valid JPEG image</td></tr>");
        14252  +  html +=
        14253  +    wxT("<tr><td bgcolor=\"#fffff0\">IsExifBlob( image Blob ) : Integer</td>");
        14254  +  html +=
        14255  +    wxT
        14256  +    ("<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>");
        14257  +  html += wxT("TRUE if this BLOB object corresponds to a valid EXIF image<br>");
        14258  +  html +=
        14259  +    wxT
        14260  +    ("<u>Please note:</u> any valid EXIF image is a valid JPEG as well</td></tr>");
        14261  +  html +=
        14262  +    wxT
        14263  +    ("<tr><td bgcolor=\"#fffff0\">IsExifGpsBlob( image Blob ) : Integer</td>");
        14264  +  html +=
        14265  +    wxT
        14266  +    ("<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>");
        14267  +  html +=
        14268  +    wxT("TRUE if this BLOB object corresponds to a valid EXIF-GPS image<br>");
        14269  +  html +=
        14270  +    wxT
        14271  +    ("<u>Please note:</u> any valid EXIF-GPS image is a valid EXIF and JPEG as well</td></tr>");
        14272  +  html +=
        14273  +    wxT("<tr><td bgcolor=\"#fffff0\">IsWebpBlob( image Blob ) : Integer</td>");
        14274  +  html +=
        14275  +    wxT
        14276  +    ("<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>");
        14277  +  html +=
        14278  +    wxT("TRUE if this BLOB object corresponds to a valid WebP image</td></tr>");
        14279  +  html +=
        14280  +    wxT
        14281  +    ("<tr><td bgcolor=\"#fffff0\">GetMimeType( payload Blob ) : String</td>");
        14282  +  html += wxT("<td bgcolor=\"#f0fff0\">The return type is Text.<br>");
        14283  +  html +=
        14284  +    wxT
        14285  +    ("NULL could be returned for an invalid argument or if no valid mime-type is detected.</td></tr>");
        14286  +  html +=
        14287  +    wxT
        14288  +    ("<tr><td bgcolor=\"#fffff0\">BlobFromFile( filepath String ) : BLOB</td>");
        14289  +  html +=
        14290  +    wxT
        14291  +    ("<td bgcolor=\"#f0fff0\">If filepath corresponds to some valid pathname, and the corresponding file ");
        14292  +  html +=
        14293  +    wxT
        14294  +    ("can be actually accessed in read mode, then the whole file content will be returned as a BLOB value.<br>");
        14295  +  html +=
        14296  +    wxT
        14297  +    ("Otherwise NULL will be returned.<br><u>Please note:</u> SQLite doesn't support BLOB values bigger than SQLITE_MAX_LENGTH (usually, 1 GB).<hr>");
        14298  +  html +=
        14299  +    wxT
        14300  +    ("<u>Please note</u>: security restrictions apply to this function, which is really supported only when the environment variable \"SPATIALTE_SECURITY=relaxed\" is explicitly set.</td></tr>");
        14301  +  html +=
        14302  +    wxT
        14303  +    ("<tr><td bgcolor=\"#fffff0\">BlobToFile( payload BLOB , filepath String ) : Integer</td>");
        14304  +  html +=
        14305  +    wxT
        14306  +    ("<td bgcolor=\"#f0fff0\">If payload is of the BLOB-type, and if filepath corresponds to some valid pathname ");
        14307  +  html +=
        14308  +    wxT
        14309  +    ("(accessible in write/create mode), then the corresponding file will be created/overwritten so to contain the payload.<br>");
        14310  +  html +=
        14311  +    wxT
        14312  +    ("The return type is Integer, with a return value of 1 for success, 0 for failure.<hr>");
        14313  +  html +=
        14314  +    wxT
        14315  +    ("<u>Please note</u>: security restrictions apply to this function, which is really supported only when the environment variable \"SPATIALTE_SECURITY=relaxed\" is explicitly set.</td></tr>");
        14316  +  html +=
        14317  +    wxT("<tr><td bgcolor=\"#fffff0\">CountUnsafeTriggers( ) : Integer</td>");
        14318  +  html +=
        14319  +    wxT
        14320  +    ("<td bgcolor=\"#f0fff0\">This SQL function checks if the currently connected DB does contain any potentially malicious Trigger; ");
        14321  +  html +=
        14322  +    wxT
        14323  +    ("carefully checking this conditions is a minimal precaution expected to be always verified before eventually activating the \"SPATIALITE_SECURITY=relaxed\" mode.<hr>");
        14324  +  html +=
        14325  +    wxT
        14326  +    ("The return type is Integer (total count of suspected Triggers); 0 means that the currently connected DB should be considered absolutely safe.</td></tr>");
        14327  +  html +=
        14328  +    wxT
        14329  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c30\">SQL utility functions [<i>non-standard</i>] for geometric objects</a></a>");
        14330  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        14331  +  html +=
        14332  +    wxT
        14333  +    ("<tr><td bgcolor=\"#fffff0\">GeomFromExifGpsBlob( image Blob ) : Geometry</td>");
        14334  +  html +=
        14335  +    wxT
        14336  +    ("<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<br>");
        14337  +  html +=
        14338  +    wxT
        14339  +    ("NULL will be returned if for any reason it's not possible to build such a POINT</td></tr>");
        14340  +  html +=
        14341  +    wxT
        14342  +    ("<tr><td bgcolor=\"#fffff0\">ST_Point( x Double precision , y Double precision ) : Geometry</td>");
        14343  +  html +=
        14344  +    wxT
        14345  +    ("<td bgcolor=\"#f0fff0\">simply an alias-name for MakePoint() (SRID is never supported).</td></tr>");
        14346  +  html +=
        14347  +    wxT
        14348  +    ("<tr><td bgcolor=\"#fffff0\">MakePoint( x Double precision , y Double precision [ , SRID Integer] ) : Geometry</td>");
        14349  +  html +=
        14350  +    wxT
        14351  +    ("<td bgcolor=\"#f0fff0\">a Geometry will be returned representing the POINT defined by [x y] coordinates</td></tr>");
        14352  +  html +=
        14353  +    wxT
        14354  +    ("<tr><td bgcolor=\"#fffff0\">MakePointZ( x Double precision , y Double precision , z Double precision [ , SRID Integer] ) : Geometry</td>");
        14355  +  html +=
        14356  +    wxT
        14357  +    ("<td bgcolor=\"#f0fff0\">a Geometry will be returned representing the POINT Z defined by [x y z] coordinates</td></tr>");
        14358  +  html +=
        14359  +    wxT
        14360  +    ("<tr><td bgcolor=\"#fffff0\">MakePointM( x Double precision , y Double precision , m Double precision [ , SRID Integer] ) : Geometry</td>");
        14361  +  html +=
        14362  +    wxT
        14363  +    ("<td bgcolor=\"#f0fff0\">a Geometry will be returned representing the POINT M defined by [x y m] coordinates</td></tr>");
        14364  +  html +=
        14365  +    wxT
        14366  +    ("<tr><td bgcolor=\"#fffff0\">MakePointZM( x Double precision , y Double precision , z Double precision , m Double precision ");
        14367  +  html += wxT("[ , SRID Integer] ) : Geometry</td>");
        14368  +  html +=
        14369  +    wxT
        14370  +    ("<td bgcolor=\"#f0fff0\">a Geometry will be returned representing the POINT ZM defined by [x y z m] coordinates</td></tr>");
        14371  +  html +=
        14372  +    wxT
        14373  +    ("<tr><td bgcolor=\"#fffff0\">MakeLine( pt1 PointGeometry , pt2 PointGeometry ) : LinestringGeometry</td>");
        14374  +  html +=
        14375  +    wxT
        14376  +    ("<td bgcolor=\"#f0fff0\">a Linestring Geometry will be returned representing the segment connecting pt1 to pt2<br>");
        14377  +  html += wxT("NULL will be returned if any error is encountered</td></tr>");
        14378  +  html +=
        14379  +    wxT
        14380  +    ("<tr><td bgcolor=\"#fffff0\">MakeLine( geom PointGeometry ) : LinestringGeometry</td>");
        14381  +  html +=
        14382  +    wxT
        14383  +    ("<td bgcolor=\"#f0fff0\">a Linestring Geometry will be returned connecting all the input Points (accordingly to input sequence)<br>");
        14384  +  html += wxT("<b><u>aggregate function</u></b><br>");
        14385  +  html += wxT("NULL will be returned if any error is encountered</td></tr>");
        14386  +  html +=
        14387  +    wxT
        14388  +    ("<tr><td bgcolor=\"#fffff0\">MakeLine( geom MultiPointGeometry , direction Boolean ) : LinestringGeometry</td>");
        14389  +  html +=
        14390  +    wxT
        14391  +    ("<td bgcolor=\"#f0fff0\">a Linestring Geometry will be returned connecting all the input Points (accordingly to input sequence); \"direction=FALSE\" implies reverse order.<br>");
        14392  +  html +=
        14393  +    wxT
        14394  +    ("<u>Please note</u>: similar to the previuous one, but this one is an ordinary (not aggregate) function; a MultiPoint input is always expected.<hr>");
        14395  +  html += wxT("NULL will be returned if any error is encountered</td></tr>");
        14396  +  html +=
        14397  +    wxT
        14398  +    ("<tr><td bgcolor=\"#fffff0\">MakeCircle( cx Double , cy Double , radius Double [ , SRID Integer [ , step Double ] ] ) : LinestringGeometry</td>");
        14399  +  html +=
        14400  +    wxT
        14401  +    ("<td bgcolor=\"#f0fff0\">will return a closed LINESTRING approximating the Circle defined by \"cx\", \"cy\" and \"radius\".<br>");
        14402  +  html +=
        14403  +    wxT
        14404  +    ("The optional argument \"step\" if specified defines how many points will be interpolated on the circumference; a point will be set every \"step\" degrees.<br>");
        14405  +  html +=
        14406  +    wxT
        14407  +    ("The implicit default setting corresponds to a point every 10 degrees.</td></tr>");
        14408  +  html +=
        14409  +    wxT
        14410  +    ("<tr><td bgcolor=\"#fffff0\">MakeEllipse( cx Double , cy Double , x_axis Double , y_axus Double [ , SRID Integer [ , step Double ] ] ) : LinestringGeometry</td>");
        14411  +  html +=
        14412  +    wxT
        14413  +    ("<td bgcolor=\"#f0fff0\">will return a closed LINESTRING approximating the Ellipsee defined by \"cx\", \"cy\" and \"x_axis\", \"y_axis\".<br>");
        14414  +  html +=
        14415  +    wxT
        14416  +    ("The optional argument \"step\" if specified defines how many points will be interpolated on the ellipse; a point will be set every \"step\" degrees.<br>");
        14417  +  html +=
        14418  +    wxT
        14419  +    ("The implicit default setting corresponds to a point every 10 degrees.</td></tr>");
        14420  +  html +=
        14421  +    wxT
        14422  +    ("<tr><td bgcolor=\"#fffff0\">MakeArc( cx Double , cy Double , radius Double , start Double , stop Double [ , SRID Integer [ , step Double ] ] ) : LinestringGeometry</td>");
        14423  +  html +=
        14424  +    wxT
        14425  +    ("<td bgcolor=\"#f0fff0\">will return a LINESTRING approximating the Circular Arc defined by \"cx\", \"cy\" and \"radius\"; the arc's extremities will be defined by \"start\", \"stop\" angles expressed in degrees.<br>");
        14426  +  html +=
        14427  +    wxT
        14428  +    ("The optional argument \"step\" if specified defines how many points will be interpolated on the circumference; a point will be set every \"step\" degrees.<br>");
        14429  +  html +=
        14430  +    wxT
        14431  +    ("The implicit default setting corresponds to a point every 10 degrees.</td></tr>");
        14432  +  html +=
        14433  +    wxT
        14434  +    ("<tr><td bgcolor=\"#fffff0\">MakeEllipticArc( cx Double , cy Double , x_axis Double , y_axis Double, start Double , stop Double [ , SRID Integer [ , step Double ] ] ) : LinestringGeometry</td>");
        14435  +  html +=
        14436  +    wxT
        14437  +    ("<td bgcolor=\"#f0fff0\">will return a LINESTRING approximating the Elliptic Arc defined by \"cx\", \"cy\" and \"x_axis\", \"y_axis\"; the arc's extremities will be defined by \"start\", \"stop\" angles expressed in degrees.<br>");
        14438  +  html +=
        14439  +    wxT
        14440  +    ("The optional argument \"step\" if specified defines how many points will be interpolated on the ellipse; a point will be set every \"step\" degrees.<br>");
        14441  +  html +=
        14442  +    wxT
        14443  +    ("The implicit default setting corresponds to a point every 10 degrees.</td></tr>");
        14444  +  html +=
        14445  +    wxT
        14446  +    ("<tr><td bgcolor=\"#fffff0\">MakeCircularSector( cx Double , cy Double , radius Double , start Double , stop Double [ , SRID Integer [ , step Double ] ] ) : PolygonGeometry</td>");
        14447  +  html +=
        14448  +    wxT
        14449  +    ("<td bgcolor=\"#f0fff0\">will return a POLYGON approximating the Circular Sector defined by \"cx\", \"cy\" and \"radius\"; the arc's extremities will be defined by \"start\", \"stop\" angles expressed in degrees.<br>");
        14450  +  html +=
        14451  +    wxT
        14452  +    ("The optional argument \"step\" if specified defines how many points will be interpolated on the circumference; a point will be set every \"step\" degrees.<br>");
        14453  +  html +=
        14454  +    wxT
        14455  +    ("The implicit default setting corresponds to a point every 10 degrees.</td></tr>");
        14456  +  html +=
        14457  +    wxT
        14458  +    ("<tr><td bgcolor=\"#fffff0\">MakeEllipticSector( cx Double , cy Double , x_axis Double , y_axis Double, start Double , stop Double [ , SRID Integer [ , step Double ] ] ) : PolygonGeometry</td>");
        14459  +  html +=
        14460  +    wxT
        14461  +    ("<td bgcolor=\"#f0fff0\">will return a POLYGON approximating the Elliptic Sector defined by \"cx\", \"cy\" and \"x_axis\", \"y_axis\"; the arc's extremities will be defined by \"start\", \"stop\" angles expressed in degrees.<br>");
        14462  +  html +=
        14463  +    wxT
        14464  +    ("The optional argument \"step\" if specified defines how many points will be interpolated on the ellipse; a point will be set every \"step\" degrees.<br>");
        14465  +  html +=
        14466  +    wxT
        14467  +    ("The implicit default setting corresponds to a point every 10 degrees.</td></tr>");
        14468  +  html +=
        14469  +    wxT
        14470  +    ("<tr><td bgcolor=\"#fffff0\">MakeCircularStripe( cx Double , cy Double , radius_1 Double , radius_2 Double, start Double , stop Double [ , SRID Integer [ , step Double ] ] ) : PolygonGeometry</td>");
        14471  +  html +=
        14472  +    wxT
        14473  +    ("<td bgcolor=\"#f0fff0\">will return a POLYGON approximating the Circular Stripe delimited by two arcs sharing the same Centre \"cx\", \"cy\" ");
        14474  +  html +=
        14475  +    wxT
        14476  +    ("but having different radii \"radius_1\", \"radius_2\"; the arc's extremities will be defined by \"start\", \"stop\" angles expressed in degrees.<br>");
        14477  +  html +=
        14478  +    wxT
        14479  +    ("The optional argument \"step\" if specified defines how many points will be interpolated on the circumference; a point will be set every \"step\" degrees.<br>");
        14480  +  html +=
        14481  +    wxT
        14482  +    ("The implicit default setting corresponds to a point every 10 degrees.</td></tr>");
        14483  +  html +=
        14484  +    wxT
        14485  +    ("<tr><td bgcolor=\"#fffff0\">Collect( geom1 Geometry , geom2 Geometry ) : Geometry<hr>");
        14486  +  html += wxT("ST_Collect( geom1 Geometry , geom2 Geometry ) : Geometry</td>");
        14487  +  html +=
        14488  +    wxT
        14489  +    ("<td bgcolor=\"#f0fff0\">a generic Geometry (possibly a GEOMETRYCOLLECTION) will be returned merging geom1 and geom2<br>");
        14490  +  html += wxT("NULL will be returned if any error is encountered</td></tr>");
        14491  +  html +=
        14492  +    wxT("<tr><td bgcolor=\"#fffff0\">Collect( geom Geometry ) : Geometry<hr>");
        14493  +  html += wxT("ST_Collect( geom1 Geometry , geom2 Geometry ) : Geometry</td>");
        14494  +  html +=
        14495  +    wxT
        14496  +    ("<td bgcolor=\"#f0fff0\">a generic Geometry (possibly a GEOMETRYCOLLECTION) will be returned merging input Geometries all together<br>");
        14497  +  html += wxT("<b><u>aggregate function</u></b><br>");
        14498  +  html += wxT("NULL will be returned if any error is encountered</td></tr>");
        14499  +  html +=
        14500  +    wxT
        14501  +    ("<tr><td bgcolor=\"#fffff0\">BuildArea( geom Geometry  ) : Geometry<hr>");
        14502  +  html += wxT("ST_BuildArea( geom Geometry  ) : Geometry</td>");
        14503  +  html +=
        14504  +    wxT
        14505  +    ("<td bgcolor=\"#f0fff0\">a Geometry (actually corresponding to a POLYGON or MULTIPOLYGON) will be returned.<br>");
        14506  +  html += wxT
        14507  +    ("The input Geometry is expected to represent a LINESTRING or a MULTILINESTRING.<br>The input Geometry can be an arbitrary collection ");
        14508  +  html += wxT
        14509  +    ("of sparse Linestrings: this function will then try to (possibly) reassemble them into one (or more) polygon(s).");
        14510  +  html += wxT
        14511  +    ("<br>If the second [optional] argument is TRUE then a MULTIPOLYGON will be returned anyway.<br>");
        14512  +  html += wxT("NULL will be returned if any error is encountered</td></tr>");
        14513  +  html +=
        14514  +    wxT
        14515  +    ("<tr><td bgcolor=\"#fffff0\">Polygonize( geom Geometry ) : Geometry<hr>");
        14516  +  html += wxT("ST_Polygonize( geom Geometry ) : Geometry</td>");
        14517  +  html +=
        14518  +    wxT
        14519  +    ("<td bgcolor=\"#f0fff0\">Exactly the same as ST_BuildArea, but implemented as an <u>aggregate function</u>.<br>");
        14520  +  html += wxT("NULL will be returned if any error is encountered</td></tr>");
        14521  +  html +=
        14522  +    wxT
        14523  +    ("<tr><td bgcolor=\"#fffff0\">LineMerge( geom Geometry ) : Geometry<hr>");
        14524  +  html += wxT("ST_LineMerge( geom Geometry ) : Geometry</td>");
        14525  +  html +=
        14526  +    wxT
        14527  +    ("<td bgcolor=\"#f0fff0\">a Geometry (actually corresponding to a LINESTRING or MULTILINESTRING) will be returned.<br>");
        14528  +  html += wxT
        14529  +    ("The input Geometry is expected to represent a LINESTRING or a MULTILINESTRING.<br>The input Geometry can be an arbitrary collection ");
        14530  +  html += wxT
        14531  +    ("of sparse Linestrings: this function will then try to (possibly) reassemble them into one (or more) polygon(s).");
        14532  +  html += wxT
        14533  +    ("<br>If the second [optional] argument is TRUE then a MULTIPOLYGON will be returned anyway.<br>");
        14534  +  html += wxT("NULL will be returned if any error is encountered</td></tr>");
        14535  +  html +=
        14536  +    wxT
        14537  +    ("<tr><td bgcolor=\"#fffff0\">MakePolygon( geom1 Geometry [ , geom2 Geometry ]  ) : Geometry<hr>");
        14538  +  html +=
        14539  +    wxT
        14540  +    ("ST_MakePolygon( geom1 Geometry [ , geom2 Geometry ]  ) : Geometry</td>");
        14541  +  html +=
        14542  +    wxT
        14543  +    ("<td bgcolor=\"#f0fff0\">Kind of lightweight/simplified ST_BuildArea: the first input Geometry is always ");
        14544  +  html +=
        14545  +    wxT
        14546  +    ("expected to represent a closed LINESTRING assumed to identify the output polygon's Exterior Ring.<br>");
        14547  +  html +=
        14548  +    wxT
        14549  +    ("The second input Geometry (if any) is expected to be a LINESTRING or MULTILINESTRING identifying any ");
        14550  +  html +=
        14551  +    wxT
        14552  +    ("polygon's Interior Ring (and all them are expected to be correctly closed).<br>");
        14553  +  html +=
        14554  +    wxT
        14555  +    ("<b><u>Please note well</u></b>: this function doesn't perform any internal topology check, so it could ");
        14556  +  html +=
        14557  +    wxT
        14558  +    ("possibly return an invalid polygon on invalid input.<hr>NULL will be returned if any error is encountered</td></tr>");
        14559  +  html +=
        14560  +    wxT
        14561  +    ("<tr><td bgcolor=\"#fffff0\">LinesFromRings( geom Geometry ) : Geometry<hr>");
        14562  +  html += wxT("ST_LinesFromRings( geom Geometry ) : Geometry</td>");
        14563  +  html +=
        14564  +    wxT
        14565  +    ("<td bgcolor=\"#f0fff0\">a Geometry (actually corresponding to a LINESTRING or MULTILINESTRING) will be returned.<br>");
        14566  +  html +=
        14567  +    wxT
        14568  +    ("The input Geometry is expected to be a POLYGON or MULTIPOLYGON; any RING will then be transformed into the corresponding LINESTRING.<br>");
        14569  +  html += wxT("NULL will be returned if any error is encountered</td></tr>");
        14570  +  html +=
        14571  +    wxT
        14572  +    ("<tr><td bgcolor=\"#fffff0\">LinesCutAtNodes( geom1 Geometry , geom2 Geometry ) : Geometry<hr>");
        14573  +  html +=
        14574  +    wxT
        14575  +    ("ST_LinesCutAtNodes( geom1 Geometry , geom2 Geometry ) : Geometry</td>");
        14576  +  html +=
        14577  +    wxT
        14578  +    ("<td bgcolor=\"#f0fff0\">a Geometry (actually corresponding to a LINESTRING or MULTILINESTRING) will be returned.<br>");
        14579  +  html +=
        14580  +    wxT
        14581  +    ("The first input Geometry is expected to be a LINESTRING or MULTILINESTRING (Lines); ");
        14582  +  html +=
        14583  +    wxT
        14584  +    ("the second input Geometry is expected to be a POINT or MULTIPOINT (Nodes).<br>");
        14585  +  html +=
        14586  +    wxT
        14587  +    ("any Line will then be possibly split in two halves where some vertex exactely intercepts a Node.<br>");
        14588  +  html += wxT("NULL will be returned if any error is encountered</td></tr>");
        14589  +  html +=
        14590  +    wxT
        14591  +    ("<tr><td bgcolor=\"#fffff0\">RingsCutAtNodes( geom Geometry ) : Geometry<hr>");
        14592  +  html += wxT("ST_RingsCutAtNodes( geom Geometry ) : Geometry</td>");
        14593  +  html +=
        14594  +    wxT
        14595  +    ("<td bgcolor=\"#f0fff0\">a Geometry (actually corresponding to a LINESTRING or MULTILINESTRING) will be returned.<br>");
        14596  +  html +=
        14597  +    wxT
        14598  +    ("The input Geometry is expected to be a POLYGON or MULTIPOLYGON (Rings); ");
        14599  +  html +=
        14600  +    wxT
        14601  +    ("any self-intersection or intersection between Rings is assumed to represent a Node.<br>");
        14602  +  html +=
        14603  +    wxT
        14604  +    ("any Ring will then be possibly split in two halves where some vertex exactely intercepts a Node.<br>");
        14605  +  html += wxT("NULL will be returned if any error is encountered</td></tr>");
        14606  +  html +=
        14607  +    wxT
        14608  +    ("<tr><td bgcolor=\"#fffff0\">DissolveSegments( geom Geometry ) : Geometry<hr>");
        14609  +  html += wxT("ST_DissolveSegments( geom Geometry ) : Geometry</td>");
        14610  +  html +=
        14611  +    wxT
        14612  +    ("<td bgcolor=\"#f0fff0\">a Geometry (actually corresponding to a LINESTRING, MULTILINESTRING or GEOMETRYCOLLECTION) will be returned.<br>");
        14613  +  html +=
        14614  +    wxT
        14615  +    ("The input Geometry is arbitrary: any POINT will remain unaffected, but any LINESTRING or RING will be dissolved into elementary segments.<br>");
        14616  +  html += wxT("NULL will be returned if any error is encountered</td></tr>");
        14617  +  html +=
        14618  +    wxT
        14619  +    ("<tr><td bgcolor=\"#fffff0\">DissolvePoints( geom Geometry ) : Geometry<hr>");
        14620  +  html += wxT("ST_DissolvePoints( geom Geometry ) : Geometry</td>");
        14621  +  html +=
        14622  +    wxT
        14623  +    ("<td bgcolor=\"#f0fff0\">a Geometry (actually corresponding to a POINT or MULTIPOINT) will be returned.<br>");
        14624  +  html +=
        14625  +    wxT
        14626  +    ("The input Geometry is arbitrary: any POINT will remain unaffected, but any LINESTRING or RING will be dissolved into elementary Points corresponding to each Vertex.<br>");
        14627  +  html += wxT("NULL will be returned if any error is encountered</td></tr>");
        14628  +  html +=
        14629  +    wxT
        14630  +    ("<tr><td bgcolor=\"#fffff0\">CollectionExtract( geom Geometry, type Integer ) : Geometry<hr>");
        14631  +  html +=
        14632  +    wxT("ST_CollectionExtract( geom Geometry, type Integer ) : Geometry</td>");
        14633  +  html +=
        14634  +    wxT
        14635  +    ("<td bgcolor=\"#f0fff0\">Given a GEOMETRYCOLLECTION, returns a MULTI* geometry consisting only of the specified type.<br>");
        14636  +  html +=
        14637  +    wxT
        14638  +    ("Sub-geometries that are not the specified type are ignored.<br>(1=POINT-type, 2=LINESTRING-type, 3=POLYGON-type)<br>");
        14639  +  html +=
        14640  +    wxT
        14641  +    ("NULL will be returned if any error is encountered (or when no item of required type is found)</td></tr>");
        14642  +  html +=
        14643  +    wxT
        14644  +    ("<tr><td bgcolor=\"#fffff0\">ST_Locate_Along_Measure( geom Geometry, m_value Double precision ) : Geometry</td>");
        14645  +  html +=
        14646  +    wxT
        14647  +    ("<td bgcolor=\"#f0fff0\">Return a derived geometry collection value with elements that match the specified measure.<br>");
        14648  +  html +=
        14649  +    wxT
        14650  +    ("NULL will be returned if any error is encountered (or when no element corresponding to the given measure is found).<br>");
        14651  +  html +=
        14652  +    wxT
        14653  +    ("Please note: NULL will be returned anyway if Geometry doesn't support M-dimension, or if it contains any Polygon, or if it's of the GeometryCollection type.</td></tr>");
        14654  +  html +=
        14655  +    wxT
        14656  +    ("<tr><td bgcolor=\"#fffff0\">ST_Locate_Between_Measures( geom Geometry, m_start Double precision , m_end Double precision ) : Geometry</td>");
        14657  +  html +=
        14658  +    wxT
        14659  +    ("<td bgcolor=\"#f0fff0\">Return a derived geometry collection value with elements that match the specified range of measures.<br>");
        14660  +  html +=
        14661  +    wxT
        14662  +    ("NULL will be returned if any error is encountered (or when no element corresponding to the given range if measures is found).<br>");
        14663  +  html +=
        14664  +    wxT
        14665  +    ("Please note: NULL will be returned anyway if Geometry doesn't support M-dimension, or if it contains any Polygon, or if it's of the GeometryCollection type.</td></tr>");
        14666  +  html +=
        14667  +    wxT
        14668  +    ("<tr><td bgcolor=\"#fffff0\">SquareGrid( geom Geometry [ , size Double precision [ , edges_only Boolean [ , origin Geometry  ]] ) : Geometry<hr>");
        14669  +  html +=
        14670  +    wxT
        14671  +    ("ST_SquareGrid( geom Geometry [ , size Double precision [ , edges_only Boolean [ , origin Geometry  ]] ) : Geometry</td>");
        14672  +  html +=
        14673  +    wxT
        14674  +    ("<td bgcolor=\"#f0fff0\">return a grid of square cells (having the edge length of size) precisely covering the input Geometry (expected to be a Polygon or MultiPolygon).<br>");
        14675  +  html +=
        14676  +    wxT
        14677  +    ("The returned Geometry will usually be of the MultiPolygon type (a collection of Squares), but will be a MultiLinestring if the optional edges_only argument is set to TRUE<br>");
        14678  +  html +=
        14679  +    wxT
        14680  +    ("If the optional origin argument (expected to be a Point) is not specified then the (0,0) grid origin will be assumed by default.<br>");
        14681  +  html += wxT("NULL will be returned if any error is encountered.</td></tr>");
        14682  +  html +=
        14683  +    wxT
        14684  +    ("<tr><td bgcolor=\"#fffff0\">TriangularGrid( geom Geometry [ , size Double precision [ , edges_only Boolean [ , origin Geometry  ]] ) : Geometry<hr>");
        14685  +  html +=
        14686  +    wxT
        14687  +    ("ST_TriangularGrid( geom Geometry [ , size Double precision [ , edges_only Boolean [ , origin Geometry  ]] ) : Geometry</td>");
        14688  +  html +=
        14689  +    wxT
        14690  +    ("<td bgcolor=\"#f0fff0\">return a grid of square cells (having the edge length of size) precisely covering the input Geometry (expected to be a Polygon or MultiPolygon).<br>");
        14691  +  html +=
        14692  +    wxT
        14693  +    ("The returned Geometry will usually be of the MultiPolygon type (a collection of Triangles), but will be a MultiLinestring if the optional edges_only argument is set to TRUE<br>");
        14694  +  html +=
        14695  +    wxT
        14696  +    ("If the optional origin argument (expected to be a Point) is not specified then the (0,0) grid origin will be assumed by default.<br>");
        14697  +  html += wxT("NULL will be returned if any error is encountered.</td></tr>");
        14698  +  html +=
        14699  +    wxT
        14700  +    ("<tr><td bgcolor=\"#fffff0\">HexagonalGrid( geom Geometry [ , size Double precision [ , edges_only Boolean [ , origin Geometry  ]] ) : Geometry<hr>");
        14701  +  html +=
        14702  +    wxT
        14703  +    ("ST_HexagonalGrid( geom Geometry [ , size Double precision [ , edges_only Boolean [ , origin Geometry  ]] ) : Geometry</td>");
        14704  +  html +=
        14705  +    wxT
        14706  +    ("<td bgcolor=\"#f0fff0\">return a grid of square cells (having the edge length of size) precisely covering the input Geometry (expected to be a Polygon or MultiPolygon).<br>");
        14707  +  html +=
        14708  +    wxT
        14709  +    ("The returned Geometry will usually be of the MultiPolygon type (a collection of Hexagons), but will be a MultiLinestring if the optional edges_only argument is set to TRUE<br>");
        14710  +  html +=
        14711  +    wxT
        14712  +    ("If the optional origin argument (expected to be a Point) is not specified then the (0,0) grid origin will be assumed by default.<br>");
        14713  +  html += wxT("NULL will be returned if any error is encountered.</td></tr>");
        14714  +  html +=
        14715  +    wxT
        14716  +    ("<tr><td bgcolor=\"#fffff0\">DelaunayTriangulation( geom Geometry [ , edges_only Boolean [ , tolerance Double precision  ]] ) : Geometry<hr>");
        14717  +  html +=
        14718  +    wxT
        14719  +    ("ST_DelaunayTriangulation( geom Geometry [ , edges_only Boolean [ , tolerance Double precision ]] ) : Geometry</td>");
        14720  +  html +=
        14721  +    wxT
        14722  +    ("<td bgcolor=\"#f0fff0\">Return the Delaunay Triangulation corresponding to the input Geometry.<br>");
        14723  +  html += wxT("NULL will be returned if any error is encountered.</td></tr>");
        14724  +  html +=
        14725  +    wxT
        14726  +    ("<tr><td bgcolor=\"#fffff0\">VoronojDiagram( geom Geometry [ , edges_only Boolean [ , extra_frame_size Double precision [ , tolerance Double precision ]]] ) : Geometry<hr>");
        14727  +  html +=
        14728  +    wxT
        14729  +    ("ST_VoronojDiagram( geom Geometry [ , edges_only Boolean [ , extra_frame_size Double precision [ , tolerance Double precision ]]] ) : Geometry</td>");
        14730  +  html +=
        14731  +    wxT
        14732  +    ("<td bgcolor=\"#f0fff0\">Return the Voronoj Diagram corresponding to the input Geometry.<br>");
        14733  +  html += wxT("NULL will be returned if any error is encountered.</td></tr>");
        14734  +  html +=
        14735  +    wxT
        14736  +    ("<tr><td bgcolor=\"#fffff0\">ConcaveHull( geom Geometry [ , factor Double precision [ , allow_hols Boolean [ , tolerance Double precision  ]]] ) : Geometry<hr>");
        14737  +  html +=
        14738  +    wxT
        14739  +    ("ST_ConcaveHull( geom Geometry [ , factor Double precision [ , allow_hols Boolean [ , tolerance Double precision  ]]] ) : Geometry</td>");
        14740  +  html +=
        14741  +    wxT
        14742  +    ("<td bgcolor=\"#f0fff0\">Return the ConcaveHull corresponding to the input Geometry.<br>");
        14743  +  html += wxT("NULL will be returned if any error is encountered.</td></tr>");
        14744  +  html +=
        14745  +    wxT
        14746  +    ("<tr><td bgcolor=\"#fffff0\">MakeValid( geom Geometry ) : Geometry<hr>");
        14747  +  html += wxT("ST_MakeValid( geom Geometry ) : Geometry</td>");
        14748  +  html +=
        14749  +    wxT
        14750  +    ("<td bgcolor=\"#f0fff0\">Return a surely valid version of the input Geometry.<br>");
        14751  +  html +=
        14752  +    wxT
        14753  +    ("If the input Geometry was already valid, then it will be returned exactly as it was.<br>");
        14754  +  html += wxT("NULL will be returned if any error is encountered.</td></tr>");
        14755  +  html +=
        14756  +    wxT
        14757  +    ("<tr><td bgcolor=\"#fffff0\">MakeValidDiscarded( geom Geometry ) : Geometry<hr>");
        14758  +  html += wxT("ST_MakeValidDiscarded( geom Geometry ) : Geometry</td>");
        14759  +  html +=
        14760  +    wxT
        14761  +    ("<td bgcolor=\"#f0fff0\">Return all elements that would be eventually discarded by ST_MakeValid() while validating the same input Geometry.<br>");
        14762  +  html +=
        14763  +    wxT
        14764  +    ("NULL will be returned if any error is encountered, or if no discarded item exists.</td></tr>");
        14765  +  html +=
        14766  +    wxT
        14767  +    ("<tr><td bgcolor=\"#fffff0\">Segmentize( geom Geometry , dist Double precision ) : Geometry<hr>");
        14768  +  html +=
        14769  +    wxT
        14770  +    ("ST_Segmentize( geom Geometry , dist Double precision ) : Geometry</td>");
        14771  +  html +=
        14772  +    wxT
        14773  +    ("<td bgcolor=\"#f0fff0\">return a new Geometry corresponding to the input Geometry; as much Linestring / Ring vertices ");
        14774  +  html +=
        14775  +    wxT
        14776  +    ("as required will be eventually interpolated so to ensure that no segment will be longer than dist.<br>");
        14777  +  html += wxT("NULL will be returned if any error is encountered.</td></tr>");
        14778  +  html +=
        14779  +    wxT
        14780  +    ("<tr><td bgcolor=\"#fffff0\">Split( geom Geometry , blade Geometry ) : Geometry<hr>");
        14781  +  html += wxT("ST_Split( geom Geometry , blade Geometry ) : Geometry</td>");
        14782  +  html +=
        14783  +    wxT
        14784  +    ("<td bgcolor=\"#f0fff0\">return a new Geometry collecting all items resulting by splitting the input Geometry by the blade.<br>");
        14785  +  html += wxT("NULL will be returned if any error is encountered.</td></tr>");
        14786  +  html +=
        14787  +    wxT
        14788  +    ("<tr><td bgcolor=\"#fffff0\">SplitLeft( geom Geometry , blade Geometry ) : Geometry<hr>");
        14789  +  html += wxT("ST_SplitLeft( geom Geometry , blade Geometry ) : Geometry</td>");
        14790  +  html +=
        14791  +    wxT
        14792  +    ("<td bgcolor=\"#f0fff0\">return a new Geometry collecting all items resulting by splitting the input Geometry by the blade and falling on the left side.<br>");
        14793  +  html +=
        14794  +    wxT
        14795  +    ("All items not affected by the split operation (i.e. not intersecting the blade) will be returned into the left collection.<br>");
        14796  +  html += wxT("NULL will be returned if any error is encountered.</td></tr>");
        14797  +  html +=
        14798  +    wxT
        14799  +    ("<tr><td bgcolor=\"#fffff0\">SplitRight( geom Geometry , blade Geometry ) : Geometry<hr>");
        14800  +  html +=
        14801  +    wxT("ST_SplitRight( geom Geometry , blade Geometry ) : Geometry</td>");
        14802  +  html +=
        14803  +    wxT
        14804  +    ("<td bgcolor=\"#f0fff0\">return a new Geometry collecting all items resulting by splitting the input Geometry by the blade and falling on the right side.<br>");
        14805  +  html +=
        14806  +    wxT
        14807  +    ("NULL will be returned if any error is encountered (or if the right side is empty).</td></tr>");
        14808  +  html +=
        14809  +    wxT
        14810  +    ("<tr><td bgcolor=\"#fffff0\">Azimuth( pt1 Geometry , pt2 Geometry ) : Double precision<hr>");
        14811  +  html +=
        14812  +    wxT("ST_Azimuth( pt1 Geometry , pt2 Geometry ) : Double precision</td>");
        14813  +  html +=
        14814  +    wxT
        14815  +    ("<td bgcolor=\"#f0fff0\">return the angle (in radians) from the horizontal of the vector defined by pt1 and pt2.<br>");
        14816  +  html += wxT("Both pt1 and pt2 are expected to be simple Points.<br>");
        14817  +  html +=
        14818  +    wxT
        14819  +    ("Starting since 4.1.0 if both points supports \"long/lat\" coords the returned Azimuth will be precisely computed on the ellipsoid.<br>");
        14820  +  html += wxT("NULL will be returned if any error is encountered.<hr>");
        14821  +  html += wxT("On the clock: 12=0; 3=PI/2; 6=PI; 9=3PI/2</td></tr>");
        14822  +  html +=
        14823  +    wxT
        14824  +    ("<tr><td bgcolor=\"#fffff0\">Project( start_point Geometry, distance Double precision, azimuth Double precision ) : Geometry<hr>");
        14825  +  html +=
        14826  +    wxT
        14827  +    ("Project( start_point Geometry, distance Double precision, azimuth Double precision ) : Geometry</td>");
        14828  +  html +=
        14829  +    wxT
        14830  +    ("<td bgcolor=\"#f0fff0\">return a new Point projected from a start point using a bearing and distance.<br>");
        14831  +  html +=
        14832  +    wxT
        14833  +    ("start_point is expected to be simple long/lat Point.<br>distance is expected to be measured in meters; ");
        14834  +  html +=
        14835  +    wxT
        14836  +    ("azimuth (aka bearing or heading) has the same identical meaning as in ST_Azimuth().<br>");
        14837  +  html += wxT("NULL is returned on failure or on invalid arguments.</td></tr>");
        14838  +  html +=
        14839  +    wxT
        14840  +    ("<tr><td bgcolor=\"#fffff0\">SnapToGrid( geom Geometry , size Double precision  ) : Geometry<br>");
        14841  +  html +=
        14842  +    wxT
        14843  +    ("SnapToGrid( geom Geometry , size_x Double precision , size_y Double precision ) : Geometry<br>");
        14844  +  html +=
        14845  +    wxT
        14846  +    ("SnapToGrid( geom Geometry , origin_x Double precision , origin_y Double precision , size_x Double precision , size_y Double precision ) : Geometry<br>");
        14847  +  html +=
        14848  +    wxT
        14849  +    ("SnapToGrid( geom Geometry , origin Geometry , size_x Double precision , size_y Double precision , size_z Double precision , size_m Double precision ) : Geometry<hr>");
        14850  +  html +=
        14851  +    wxT
        14852  +    ("ST_SnapToGrid( geom Geometry , size Double precision  ) : Geometry<br>");
        14853  +  html +=
        14854  +    wxT
        14855  +    ("ST_SnapToGrid( geom Geometry , size_x Double precision , size_y Double precision )  ) : Geometry<br>");
        14856  +  html +=
        14857  +    wxT
        14858  +    ("ST_SnapToGrid( geom Geometry , origin_x Double precision , origin_y Double precision , size_x Double precision , size_y Double precision )  ) : Geometry<br>");
        14859  +  html +=
        14860  +    wxT
        14861  +    ("ST_SnapToGrid( geom Geometry , origin Geometry , size_x Double precision , size_y Double precision, size_z Double precision , size_m Double precision ) : Geometry</td>");
        14862  +  html +=
        14863  +    wxT
        14864  +    ("<td bgcolor=\"#f0fff0\">return a new Geometry corresponding to the input Geometry; all points and vertices will be snapped to the grid defined by its origin and size(s).<br>");
        14865  +  html += wxT("Removes all consecutive points falling on the same cell.<br>");
        14866  +  html +=
        14867  +    wxT
        14868  +    ("All collapsed geometries will be stripped from the returned Geometry.<br>");
        14869  +  html += wxT("NULL will be returned if any error is encountered.</td></tr>");
        14870  +  html +=
        14871  +    wxT("<tr><td bgcolor=\"#fffff0\">GeoHash( geom Geometry ) : String<hr>");
        14872  +  html += wxT("ST_GeoHash( geom Geometry ) : String</td>");
        14873  +  html +=
        14874  +    wxT
        14875  +    ("<td bgcolor=\"#f0fff0\">Return a GeoHash representation (geohash.org) of the geometry.<br>");
        14876  +  html +=
        14877  +    wxT
        14878  +    ("A GeoHash encodes a point into a text form that is sortable and searchable based on prefixing.<hr>");
        14879  +  html +=
        14880  +    wxT
        14881  +    ("ST_GeoHash will not work with geometries that are not in geographic (lon/lat) coordinates</td></tr>");
        14882  +  html +=
        14883  +    wxT
        14884  +    ("<tr><td bgcolor=\"#fffff0\">AsX3D( geom Geometry [ , precision Integer [ , options Integer [ , refid String ]]] ) : String<hr>");
        14885  +  html +=
        14886  +    wxT
        14887  +    ("ST_AsX3D( geom Geometry [ , precision Integer [ , options Integer [ , refid String ]]] ) : String</td>");
        14888  +  html +=
        14889  +    wxT
        14890  +    ("<td bgcolor=\"#f0fff0\">Returns a geometry as an X3D XML formatted node element</td></tr>");
        14891  +  html +=
        14892  +    wxT
        14893  +    ("<tr><td bgcolor=\"#fffff0\">MaxDistance( geom1 Geometry , geom2 Geometry ) : Double precision<hr>");
        14894  +  html +=
        14895  +    wxT
        14896  +    ("ST_MaxDistance( geom1 Geometry , geom2 Geometry ) : Double precision</td>");
        14897  +  html +=
        14898  +    wxT
        14899  +    ("<td bgcolor=\"#f0fff0\">return the max distance between geom1 and geom2</td></tr>");
        14900  +  html +=
        14901  +    wxT
        14902  +    ("<tr><td bgcolor=\"#fffff0\">ST_3DDistance( geom1 Geometry , geom2 Geometry ) : Double precision</td>");
        14903  +  html +=
        14904  +    wxT
        14905  +    ("<td bgcolor=\"#f0fff0\">return the 3D-distance between geom1 and geom2 (considering Z coordinates)</td></tr>");
        14906  +  html +=
        14907  +    wxT
        14908  +    ("<tr><td bgcolor=\"#fffff0\">ST_Max3DDistance( geom1 Geometry , geom2 Geometry ) : Double precision</td>");
        14909  +  html +=
        14910  +    wxT
        14911  +    ("<td bgcolor=\"#f0fff0\">return the max 3D-distance between geom1 and geom2 (considering Z coordinates)</td></tr>");
        14912  +  html +=
        14913  +    wxT("<tr><td bgcolor=\"#fffff0\">ST_Node( geom Geometry ) : Geometry</td>");
        14914  +  html +=
        14915  +    wxT
        14916  +    ("<td bgcolor=\"#f0fff0\">Fully nodes a set of linestrings using the least possible number of nodes while preserving all of the input ones.<br>");
        14917  +  html +=
        14918  +    wxT
        14919  +    ("NULL will be returned if the input Geometry isn't a set of linestrings or if any other error occurs.</td></tr>");
        14920  +  html +=
        14921  +    wxT
        14922  +    ("<tr><td bgcolor=\"#fffff0\">SelfIntersections( geom Geometry ) : Geometry<hr>ST_SelffIntersections( geom Geometry ) : Geometry</td>");
        14923  +  html +=
        14924  +    wxT
        14925  +    ("<td bgcolor=\"#f0fff0\">Returns a MultiPoint Geometry representing any self-intersection found within the input geometry ");
        14926  +  html +=
        14927  +    wxT("[Expected to be of the Linestring or MultiLinestring type].<br>");
        14928  +  html +=
        14929  +    wxT
        14930  +    ("NULL will be returned for invalid arguments, or when no self-intersections were found.</td></tr>");
        14931  +  html +=
        14932  +    wxT
        14933  +    ("<tr><td bgcolor=\"#fffff0\">BuildMbr( x1 Double precision , y1 Double precision , x2 Double precision , y2 Double precision, [ , SRID Integer] ) : Geometry</td>");
        14934  +  html +=
        14935  +    wxT
        14936  +    ("<td bgcolor=\"#f0fff0\">[x1 y1] and [x2 y2] are assumed to be Points identifying a line segment;");
        14937  +  html +=
        14938  +    wxT
        14939  +    ("then a Geometry will be returned representing the MBR for this line segment</td></tr>");
        14940  +  html +=
        14941  +    wxT
        14942  +    ("<tr><td bgcolor=\"#fffff0\">BuildCircleMbr( x Double precision , y Double precision , radius Double precision [ , SRID Integer] ) : Geometry</td>");
        14943  +  html +=
        14944  +    wxT
        14945  +    ("<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>");
        14946  +  html +=
        14947  +    wxT("<tr><td bgcolor=\"#fffff0\">Extent( geom Geometry ) : Geometry</td>");
        14948  +  html +=
        14949  +    wxT
        14950  +    ("<td bgcolor=\"#f0fff0\">return a geometric object representing the bounding box that encloses a set of input values<br>");
        14951  +  html += wxT("<b><u>aggregate function</u></b></td></tr>");
        14952  +  html +=
        14953  +    wxT("<tr><td bgcolor=\"#fffff0\">ToGARS( geom Geometry ) : String</td>");
        14954  +  html +=
        14955  +    wxT
        14956  +    ("<td bgcolor=\"#f0fff0\">geom is expected to represent a POINT (longitude and latitude coords); ");
        14957  +  html +=
        14958  +    wxT("the corresponding GARS area designation code will be returned.<hr>");
        14959  +  html += wxT("NULL will be returned if any error is encountered.</td></tr>");
        14960  +  html +=
        14961  +    wxT
        14962  +    ("<tr><td bgcolor=\"#fffff0\">GARSMbr( GARS_code String ) : Geometry</td>");
        14963  +  html +=
        14964  +    wxT
        14965  +    ("<td bgcolor=\"#f0fff0\">code is assumed to represent a valid GARS area designation code; ");
        14966  +  html +=
        14967  +    wxT
        14968  +    ("a Geometry will be returned representing the MBR for the corresponding GARS area.<hr>");
        14969  +  html += wxT("NULL will be returned if any error is encountered.</td></tr>");
        14970  +  html +=
        14971  +    wxT
        14972  +    ("<tr><td bgcolor=\"#fffff0\">MbrMinX( geom Geometry) : Double precision<hr>");
        14973  +  html += wxT("ST_MinX( geom Geometry) : Double precision</td>");
        14974  +  html +=
        14975  +    wxT
        14976  +    ("<td bgcolor=\"#f0fff0\">return the x-coordinate for geom MBR's leftmost side as a double precision number.<br>");
        14977  +  html +=
        14978  +    wxT("NULL will be returned if geom isn't a valid Geometry.</td></tr>");
        14979  +  html +=
        14980  +    wxT
        14981  +    ("<tr><td bgcolor=\"#fffff0\">MbrMinY( geom Geometry) : Double precision<hr>");
        14982  +  html += wxT("ST_MinY( geom Geometry) : Double precision</td>");
        14983  +  html +=
        14984  +    wxT
        14985  +    ("<td bgcolor=\"#f0fff0\">return the y-coordinate for geom MBR's lowermost side as a double precision number.<br>");
        14986  +  html +=
        14987  +    wxT("NULL will be returned if geom isn't a valid Geometry.</td></tr>");
        14988  +  html +=
        14989  +    wxT
        14990  +    ("<tr><td bgcolor=\"#fffff0\">MbrMaxX( geom Geometry) : Double precision<hr>");
        14991  +  html += wxT("ST_MaxX( geom Geometry) : Double precision</td>");
        14992  +  html +=
        14993  +    wxT
        14994  +    ("<td bgcolor=\"#f0fff0\">return the x-coordinate for geom MBR's rightmost side as a double precision number.<br>");
        14995  +  html +=
        14996  +    wxT("NULL will be returned if geom isn't a valid Geometry.</td></tr>");
        14997  +  html +=
        14998  +    wxT
        14999  +    ("<tr><td bgcolor=\"#fffff0\">MbrMaxY( geom Geometry) : Double precision<hr>");
        15000  +  html += wxT("ST_MaxY( geom Geometry) : Double precision</td>");
        15001  +  html +=
        15002  +    wxT
        15003  +    ("<td bgcolor=\"#f0fff0\">return the y-coordinate for geom MBR's uppermost side as a double precision number.<br>");
        15004  +  html +=
        15005  +    wxT("NULL will be returned if geom isn't a valid Geometry.</td></tr>");
        15006  +  html +=
        15007  +    wxT
        15008  +    ("<tr><td bgcolor=\"#fffff0\">ST_MinZ( geom Geometry) : Double precision</td>");
        15009  +  html +=
        15010  +    wxT
        15011  +    ("<td bgcolor=\"#f0fff0\">return the minimum Z-coordinate value for geom as a double precision number.<br>");
        15012  +  html +=
        15013  +    wxT
        15014  +    ("NULL will be returned if geom isn't a valid Geometry or if geom has no Z dimension.</td></tr>");
        15015  +  html +=
        15016  +    wxT
        15017  +    ("<tr><td bgcolor=\"#fffff0\">ST_MaxZ( geom Geometry) : Double precision</td>");
        15018  +  html +=
        15019  +    wxT
        15020  +    ("<td bgcolor=\"#f0fff0\">return the maximum Z-coordinate value for geom as a double precision number.<br>");
        15021  +  html +=
        15022  +    wxT
        15023  +    ("NULL will be returned if geom isn't a valid Geometry or if geom has no Z dimension.</td></tr>");
        15024  +  html +=
        15025  +    wxT
        15026  +    ("<tr><td bgcolor=\"#fffff0\">ST_MinM( geom Geometry) : Double precision</td>");
        15027  +  html +=
        15028  +    wxT
        15029  +    ("<td bgcolor=\"#f0fff0\">return the minimum M-coordinate value for geom as a double precision number.<br>");
        15030  +  html +=
        15031  +    wxT
        15032  +    ("NULL will be returned if geom isn't a valid Geometry or if geom has no M dimension.</td></tr>");
        15033  +  html +=
        15034  +    wxT
        15035  +    ("<tr><td bgcolor=\"#fffff0\">ST_MaxM( geom Geometry) : Double precision</td>");
        15036  +  html +=
        15037  +    wxT
        15038  +    ("<td bgcolor=\"#f0fff0\">return the maximum M-coordinate value for geom as a double precision number.<br>");
        15039  +  html +=
        15040  +    wxT
        15041  +    ("NULL will be returned if geom isn't a valid Geometry or if geom has no M dimension.</td></tr>");
        15042  +  html +=
        15043  +    wxT
        15044  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c31\">functions for constructing a geometric object given its Well-known Text Representation</a>");
        15045  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        15046  +  html +=
        15047  +    wxT
        15048  +    ("<tr><td bgcolor=\"#fffff0\">GeomFromText( wkt String [ , SRID Integer] ) : Geometry<hr>");
        15049  +  html +=
        15050  +    wxT("ST_GeomFromText( wkt String [ , SRID Integer] ) : Geometry</td>");
        15051  +  html +=
        15052  +    wxT
        15053  +    ("<td bgcolor=\"#f0fff0\">construct a geometric object given its Well-known text Representation</td></tr>");
        15054  +  html +=
        15055  +    wxT
        15056  +    ("<tr><td bgcolor=\"#fffff0\">ST_WKTToSQL( wkt String ) : Geometry</td>");
        15057  +  html +=
        15058  +    wxT
        15059  +    ("<td bgcolor=\"#f0fff0\">SQL/MM alias name for ST_GeomFromText: SRID=0 is assumed.</td></tr>");
        15060  +  html +=
        15061  +    wxT
        15062  +    ("<tr><td bgcolor=\"#fffff0\">PointFromText( wktPoint String [ , SRID Integer] ) : Point<hr>");
        15063  +  html +=
        15064  +    wxT("ST_PointFromText( wktPoint String [ , SRID Integer] ) : Point</td>");
        15065  +  html += wxT("<td bgcolor=\"#f0fff0\">construct a Point</td></tr>");
        15066  +  html +=
        15067  +    wxT
        15068  +    ("<tr><td bgcolor=\"#fffff0\">LineFromText( wktLineString String [ , SRID Integer] ) : Linestring<hr>");
        15069  +  html +=
        15070  +    wxT
        15071  +    ("ST_LineFromText( wktLineString String [ , SRID Integer] ) : Linestring<hr>");
        15072  +  html +=
        15073  +    wxT
        15074  +    ("LineStringFromText( wktLineString String [ , SRID Integer] ) : Linestring<hr>");
        15075  +  html +=
        15076  +    wxT
        15077  +    ("ST_LineStringFromText( wktLineString String [ , SRID Integer] ) : Linestring</td>");
        15078  +  html += wxT("<td bgcolor=\"#f0fff0\">construct a Linestring</td></tr>");
        15079  +  html +=
        15080  +    wxT
        15081  +    ("<tr><td bgcolor=\"#fffff0\">PolyFromText( wktPolygon String [ , SRID Integer] ) : Polygon<hr>");
        15082  +  html +=
        15083  +    wxT("ST_PolyFromText( wktPolygon String [ , SRID Integer] ) : Polygon<hr>");
        15084  +  html +=
        15085  +    wxT("PolygonFromText( wktPolygon String [ , SRID Integer] ) : Polygon<hr>");
        15086  +  html +=
        15087  +    wxT
        15088  +    ("ST_PolygonFromText( wktPolygon String [ , SRID Integer] ) : Polygon</td>");
        15089  +  html += wxT("<td bgcolor=\"#f0fff0\">construct a Polygon</td></tr>");
        15090  +  html +=
        15091  +    wxT
        15092  +    ("<tr><td bgcolor=\"#fffff0\">MPointFromText( wktMultiPoint String [ , SRID Integer] ) : MultiPoint<hr>");
        15093  +  html +=
        15094  +    wxT
        15095  +    ("ST_MPointFromText( wktMultiPoint String [ , SRID Integer] ) : MultiPoint<hr>");
        15096  +  html +=
        15097  +    wxT
        15098  +    ("MultiPointFromText( wktMultiPoint String [ , SRID Integer] ) : MultiPoint<hr>");
        15099  +  html +=
        15100  +    wxT
        15101  +    ("ST_MultiPointFromText( wktMultiPoint String [ , SRID Integer] ) : MultiPoint</td>");
        15102  +  html += wxT("<td bgcolor=\"#f0fff0\">construct a MultiPoint</td></tr>");
        15103  +  html +=
        15104  +    wxT
        15105  +    ("<tr><td bgcolor=\"#fffff0\">MLineFromText( wktMultiLineString String [ , SRID Integer] ) : MultiLinestring<hr>");
        15106  +  html +=
        15107  +    wxT
        15108  +    ("ST_MLineFromText( wktMultiLineString String [ , SRID Integer] ) : MultiLinestring<hr>");
        15109  +  html +=
        15110  +    wxT
        15111  +    ("MultiLineStringFromText( wktMultiLineString String [ , SRID Integer] ) : MultiLinestring<hr>");
        15112  +  html +=
        15113  +    wxT
        15114  +    ("ST_MultiLineStringFromText( wktMultiLineString String [ , SRID Integer] ) : MultiLinestring</td>");
        15115  +  html += wxT("<td bgcolor=\"#f0fff0\">construct a MultiLinestring</td></tr>");
        15116  +  html +=
        15117  +    wxT
        15118  +    ("<tr><td bgcolor=\"#fffff0\">MPolyFromText( wktMultiPolygon String [ , SRID Integer] ) : MultiPolygon<hr>");
        15119  +  html +=
        15120  +    wxT
        15121  +    ("ST_MPolyFromText( wktMultiPolygon String [ , SRID Integer] ) : MultiPolygon<hr>");
        15122  +  html +=
        15123  +    wxT
        15124  +    ("MultiPolygonFromText( wktMultiPolygon String [ , SRID Integer] ) : MultiPolygon<hr>");
        15125  +  html +=
        15126  +    wxT
        15127  +    ("ST_MultiPolygonFromText( wktMultiPolygon String [ , SRID Integer] ) : MultiPolygon</td>");
        15128  +  html += wxT("<td bgcolor=\"#f0fff0\">construct a MultiPolygon</td></tr>");
        15129  +  html +=
        15130  +    wxT
        15131  +    ("<tr><td bgcolor=\"#fffff0\">GeomCollFromText( wktGeometryCollection String [ , SRID Integer] ) : GeometryCollection<hr>");
        15132  +  html +=
        15133  +    wxT
        15134  +    ("ST_GeomCollFromText( wktGeometryCollection String [ , SRID Integer] ) : GeometryCollection<hr>");
        15135  +  html +=
        15136  +    wxT
        15137  +    ("GeometryCollectionFromText( wktGeometryCollection String [ , SRID Integer] ) : GeometryCollection<hr>");
        15138  +  html +=
        15139  +    wxT
        15140  +    ("ST_GeometryCollectionFromText( wktGeometryCollection String [ , SRID Integer] ) : GeometryCollection</td>");
        15141  +  html +=
        15142  +    wxT("<td bgcolor=\"#f0fff0\">construct a GeometryCollection</td></tr>");
        15143  +  html +=
        15144  +    wxT
        15145  +    ("<tr><td bgcolor=\"#fffff0\">BdPolyFromText( wktMultilinestring String [ , SRID Integer] ) : Polygon<hr>");
        15146  +  html +=
        15147  +    wxT
        15148  +    ("ST_BdPolyFromText( wktMultilinestring String [ , SRID Integer] ) : Polygon</td>");
        15149  +  html +=
        15150  +    wxT
        15151  +    ("<td bgcolor=\"#f0fff0\">Construct a Polygon given an arbitrary collection of closed ");
        15152  +  html +=
        15153  +    wxT
        15154  +    ("linestrings as a MultiLineString text representation.<hr>see also: BuildArea(), Polygonize()</td></tr>");
        15155  +  html +=
        15156  +    wxT
        15157  +    ("<tr><td bgcolor=\"#fffff0\">BdMPolyFromText( wktMultilinestring String [ , SRID Integer] ) : MultiPolygon<hr>");
        15158  +  html +=
        15159  +    wxT
        15160  +    ("ST_BdMPolyFromText( wktMultilinestring String [ , SRID Integer] ) : MultiPolygon</td>");
        15161  +  html +=
        15162  +    wxT
        15163  +    ("<td bgcolor=\"#f0fff0\">Construct a MultiPolygon given an arbitrary collection of closed ");
        15164  +  html +=
        15165  +    wxT
        15166  +    ("linestrings as a MultiLineString text representation.<hr>see also: BuildArea(), Polygonize()</td></tr>");
        15167  +  html +=
        15168  +    wxT
        15169  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c32\">functions for constructing a geometric object given its Well-known Binary Representation</a>");
        15170  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        15171  +  html +=
        15172  +    wxT
        15173  +    ("<tr><td bgcolor=\"#fffff0\">GeomFromWKB( wkbGeometry Binary [ , SRID Integer] ) : Geometry<hr>");
        15174  +  html +=
        15175  +    wxT
        15176  +    ("ST_GeomFromWKB( wkbGeometry Binary [ , SRID Integer] ) : Geometry</td>");
        15177  +  html +=
        15178  +    wxT
        15179  +    ("<td bgcolor=\"#f0fff0\">construct a geometric object given its Well-known binary Representation</td></tr>");
        15180  +  html +=
        15181  +    wxT
        15182  +    ("<tr><td bgcolor=\"#fffff0\">ST_WKBToSQL( wkbGeometry Binary ) : Geometry</td>");
        15183  +  html +=
        15184  +    wxT
        15185  +    ("<td bgcolor=\"#f0fff0\">SQL/MM alias name for ST_GeomFromWKB: SRID=0 is assumed.</td></tr>");
        15186  +  html +=
        15187  +    wxT
        15188  +    ("<tr><td bgcolor=\"#fffff0\">PointFromWKB( wkbPoint Binary [ , SRID Integer] ) : Point<hr>");
        15189  +  html +=
        15190  +    wxT("ST_PointFromWKB( wkbPoint Binary [ , SRID Integer] ) : Point</td>");
        15191  +  html += wxT("<td bgcolor=\"#f0fff0\">construct a Point</td></tr>");
        15192  +  html +=
        15193  +    wxT
        15194  +    ("<tr><td bgcolor=\"#fffff0\">LineFromWKB( wkbLineString Binary [ , SRID Integer] ) : Linestring<hr>");
        15195  +  html +=
        15196  +    wxT
        15197  +    ("ST_LineFromWKB( wkbLineString Binary [ , SRID Integer] ) : Linestring<hr>");
        15198  +  html +=
        15199  +    wxT
        15200  +    ("LineStringFromWKB( wkbLineString Binary [ , SRID Integer] ) : Linestring<hr>");
        15201  +  html +=
        15202  +    wxT
        15203  +    ("ST_LineStringFromWKB ( wkbLineString Binary [ , SRID Integer] ) : Linestring</td>");
        15204  +  html += wxT("<td bgcolor=\"#f0fff0\">construct a Linestring</td></tr>");
        15205  +  html +=
        15206  +    wxT
        15207  +    ("<tr><td bgcolor=\"#fffff0\">PolyFromWKB( wkbPolygon Binary [ , SRID Integer] ) : Polygon<hr>");
        15208  +  html +=
        15209  +    wxT("ST_PolyFromWKB( wkbPolygon Binary [ , SRID Integer] ) : Polygon<hr>");
        15210  +  html +=
        15211  +    wxT("PolygonFromWKB( wkbPolygon Binary [ , SRID Integer] ) : Polygon<hr>");
        15212  +  html +=
        15213  +    wxT
        15214  +    ("ST_PolygonFromWKB( wkbPolygon Binary [ , SRID Integer] ) : Polygon</td>");
        15215  +  html += wxT("<td bgcolor=\"#f0fff0\">construct a Polygon</td></tr>");
        15216  +  html +=
        15217  +    wxT
        15218  +    ("<tr><td bgcolor=\"#fffff0\">MPointFromWKB( wkbMultiPoint Binary [ , SRID Integer] ) : MultiPoint<hr>");
        15219  +  html +=
        15220  +    wxT
        15221  +    ("ST_MPointFromWKB( wkbMultiPoint Binary [ , SRID Integer] ) : MultiPoint<hr>");
        15222  +  html +=
        15223  +    wxT
        15224  +    ("MultiPointFromWKB( wkbMultiPoint Binary [ , SRID Integer] ) : MultiPoint<hr>");
        15225  +  html +=
        15226  +    wxT
        15227  +    ("ST_MultiPointFromWKB( wkbMultiPoint Binary [ , SRID Integer] ) : MultiPoint</td>");
        15228  +  html += wxT("<td bgcolor=\"#f0fff0\">construct a MultiPoint</td></tr>");
        15229  +  html +=
        15230  +    wxT
        15231  +    ("<tr><td bgcolor=\"#fffff0\">MLineFromWKB( wkbMultiLineString Binary [ , SRID Integer] ) : MultiLinestring<hr>");
        15232  +  html +=
        15233  +    wxT
        15234  +    ("ST_MLineFromWKB( wkbMultiLineString Binary [ , SRID Integer] ) : MultiLinestring<hr>");
        15235  +  html +=
        15236  +    wxT
        15237  +    ("MultiLineStringFromWKB( wkbMultiLineString Binary [ , SRID Integer] ) : MultiLinestring<hr>");
        15238  +  html +=
        15239  +    wxT
        15240  +    ("ST_MultiLineStringFromWKB( wkbMultiLineString Binary [ , SRID Integer] ) : MultiLinestring</td>");
        15241  +  html += wxT("<td bgcolor=\"#f0fff0\">construct a MultiLinestring</td></tr>");
        15242  +  html +=
        15243  +    wxT
        15244  +    ("<tr><td bgcolor=\"#fffff0\">MPolyFromWKB( wkbMultiPolygon Binary [ , SRID Integer] ) : MultiPolygon<hr>");
        15245  +  html +=
        15246  +    wxT
        15247  +    ("ST_MPolyFromWKB( wkbMultiPolygon Binary [ , SRID Integer] ) : MultiPolygon<hr>");
        15248  +  html +=
        15249  +    wxT
        15250  +    ("MultiPolygonFromWKB( wkbMultiPolygon Binary [ , SRID Integer] ) : MultiPolygon<hr>");
        15251  +  html +=
        15252  +    wxT
        15253  +    ("ST_MultiPolygonFromWKB( wkbMultiPolygon Binary [ , SRID Integer] ) : MultiPolygon</td>");
        15254  +  html += wxT("<td bgcolor=\"#f0fff0\">construct a MultiPolygon</td></tr>");
        15255  +  html +=
        15256  +    wxT
        15257  +    ("<tr><td bgcolor=\"#fffff0\">GeomCollFromWKB( wkbGeometryCollection Binary [ , SRID Integer] ) : GeometryCollection<hr>");
        15258  +  html +=
        15259  +    wxT
        15260  +    ("ST_GeomCollFromWKB( wkbGeometryCollection Binary [ , SRID Integer] ) : GeometryCollection<hr>");
        15261  +  html +=
        15262  +    wxT
        15263  +    ("GeometryCollectionFromWKB( wkbGeometryCollection Binary [ , SRID Integer] ) : GeometryCollection<hr>");
        15264  +  html +=
        15265  +    wxT
        15266  +    ("ST_GeometryCollectionFromWKB( wkbGeometryCollection Binary [ , SRID Integer] ) : GeometryCollection</td>");
        15267  +  html +=
        15268  +    wxT("<td bgcolor=\"#f0fff0\">construct a GeometryCollection</td></tr>");
        15269  +  html +=
        15270  +    wxT
        15271  +    ("<tr><td bgcolor=\"#fffff0\">BdPolyFromWKB( wkbMultilinestring Binary [ , SRID Integer] ) : Polygon<hr>");
        15272  +  html +=
        15273  +    wxT
        15274  +    ("ST_BdPolyFromWKB( wkbMultilinestring Binary [ , SRID Integer] ) : Polygon</td>");
        15275  +  html +=
        15276  +    wxT
        15277  +    ("<td bgcolor=\"#f0fff0\">Construct a Polygon given an arbitrary collection of closed ");
        15278  +  html +=
        15279  +    wxT
        15280  +    ("linestrings as a MultiLineString binary representation.<hr>see also: BuildArea(), Polygonize()</td></tr>");
        15281  +  html +=
        15282  +    wxT
        15283  +    ("<tr><td bgcolor=\"#fffff0\">BdMPolyFromWKB( wkbMultilinestring Binary [ , SRID Integer] ) : MultiPolygon<hr>");
        15284  +  html +=
        15285  +    wxT
        15286  +    ("ST_BdMPolyFromWKB( wkbMultilinestring Binary [ , SRID Integer] ) : MultiPolygon</td>");
        15287  +  html +=
        15288  +    wxT
        15289  +    ("<td bgcolor=\"#f0fff0\">Construct a MultiPolygon given an arbitrary collection of closed ");
        15290  +  html +=
        15291  +    wxT
        15292  +    ("linestrings as a MultiLineString binary representation.<hr>see also: BuildArea(), Polygonize()</td></tr>");
        15293  +  html +=
        15294  +    wxT
        15295  +    ("<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>");
        15296  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        15297  +  html +=
        15298  +    wxT("<tr><td bgcolor=\"#fffff0\">AsText( geom Geometry ) : String<hr>");
        15299  +  html +=
        15300  +    wxT
        15301  +    ("ST_AsText( geom Geometry ) : String</td><td bgcolor=\"#f0fff0\">return the Well-known Text representation</td></tr>");
        15302  +  html +=
        15303  +    wxT
        15304  +    ("<tr><td bgcolor=\"#fffff0\">AsWKT( geom Geometry [ , precision Integer ] ) : String</td>");
        15305  +  html +=
        15306  +    wxT
        15307  +    ("<td bgcolor=\"#f0fff0\">return the Well-known Text representation<hr>always return strictly conformant 2D WKT</td></tr>");
        15308  +  html +=
        15309  +    wxT("<tr><td bgcolor=\"#fffff0\">AsBinary( geom Geometry ) : Binary<hr>");
        15310  +  html +=
        15311  +    wxT
        15312  +    ("ST_AsBinary( geom Geometry ) : Binary</td><td bgcolor=\"#f0fff0\">return the Well-known Binary representation</td></tr>");
        15313  +  html +=
        15314  +    wxT
        15315  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c33misc\">SQL functions supporting exotic geometric formats</a>");
        15316  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        15317  +  html +=
        15318  +    wxT
        15319  +    ("<tr><td bgcolor=\"#fffff0\">AsSVG( geom Geometry, [ , relative Integer [ , precision Integer ] ] ) : String</td>");
        15320  +  html +=
        15321  +    wxT
        15322  +    ("<td bgcolor=\"#f0fff0\">returns the SVG [<i>Scalable Vector Graphics</i>] representation</td></tr>");
        15323  +  html +=
        15324  +    wxT
        15325  +    ("<tr><td bgcolor=\"#fffff0\">AsKML( geom Geometry [ , precision Integer ] ) : String<br>");
        15326  +  html +=
        15327  +    wxT
        15328  +    ("AsKML( name String, description String, geom Geometry [ , precision Integer ] ) : String</td>");
        15329  +  html +=
        15330  +    wxT
        15331  +    ("<td bgcolor=\"#f0fff0\">returns the KML [<i>Keyhole Markup Language</i>] representation</td></tr>");
        15332  +  html +=
        15333  +    wxT
        15334  +    ("<tr><td bgcolor=\"#fffff0\">GeomFromKml( KmlGeometry String ) : Geometry</td><td bgcolor=\"#f0fff0\">construct a geometric object given its KML Representation</td></tr>");
        15335  +  html +=
        15336  +    wxT
        15337  +    ("<tr><td bgcolor=\"#fffff0\">AsGML( geom Geometry [ , precision Integer ] ) : String<br>");
        15338  +  html +=
        15339  +    wxT
        15340  +    ("AsGML( version Integer, geom Geometry [ , precision Integer ] ) : String</td>");
        15341  +  html +=
        15342  +    wxT
        15343  +    ("<td bgcolor=\"#f0fff0\">returns the GML [<i>Geography Markup Language</i>] representation</td></tr>");
        15344  +  html +=
        15345  +    wxT
        15346  +    ("<tr><td bgcolor=\"#fffff0\">GeomFromGML( gmlGeometry String ) : Geometry</td><td bgcolor=\"#f0fff0\">construct a geometric object given its GML Representation</td></tr>");
        15347  +  html +=
        15348  +    wxT
        15349  +    ("<tr><td bgcolor=\"#fffff0\">AsGeoJSON( geom Geometry [ , precision Integer [ , options Integer ] ] ) : String</td>");
        15350  +  html +=
        15351  +    wxT
        15352  +    ("<td bgcolor=\"#f0fff0\">returns the GeoJSON [<i>Geographic JavaScript Object Notation</i>] representation</td></tr>");
        15353  +  html +=
        15354  +    wxT
        15355  +    ("<tr><td bgcolor=\"#fffff0\">GeomFromGeoJSON( GeoJSONGeometry String ) : Geometry</td><td bgcolor=\"#f0fff0\">construct a geometric object given its GeoJSON Representation</td></tr>");
        15356  +  html +=
        15357  +    wxT
        15358  +    ("<tr><td bgcolor=\"#fffff0\">AsEWKB( geom Geometry ) : String</td><td bgcolor=\"#f0fff0\">returns the EWKB [<i>Extended Well Known Binary</i>] representation</td></tr>");
        15359  +  html +=
        15360  +    wxT
        15361  +    ("<tr><td bgcolor=\"#fffff0\">GeomFromEWKB( ewkbGeometry String ) : Geometry</td><td bgcolor=\"#f0fff0\">construct a geometric object given its EWKB Representation</td></tr>");
        15362  +  html +=
        15363  +    wxT
        15364  +    ("<tr><td bgcolor=\"#fffff0\">AsEWKT( geom Geometry ) : String</td><td bgcolor=\"#f0fff0\">returns the EWKT [<i>Extended Well Known Text</i>] representation</td></tr>");
        15365  +  html +=
        15366  +    wxT
        15367  +    ("<tr><td bgcolor=\"#fffff0\">GeomFromEWKT( ewktGeometry String ) : Geometry</td><td bgcolor=\"#f0fff0\">construct a geometric object given its EWKT Representation</td></tr>");
        15368  +  html +=
        15369  +    wxT
        15370  +    ("<tr><td bgcolor=\"#fffff0\">AsFGF( geom Geometry ) : String</td><td bgcolor=\"#f0fff0\">returns the FGF [<i>FDO Geometry Binary Format</i>] representation</td></tr>");
        15371  +  html +=
        15372  +    wxT
        15373  +    ("<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>");
        15374  +  html +=
        15375  +    wxT
        15376  +    ("<tr><td bgcolor=\"#fffff0\">ExportDXF( out_dir String , filename String , sql_query String , layer_col_name String , ");
        15377  +  html +=
        15378  +    wxT
        15379  +    ("geom_col_name String , label_col_name String , text_height_col_name String , text_rotation_col_name String , geom_filter Geometry [ , precision Integer ] ) : Integer</td>");
        15380  +  html +=
        15381  +    wxT
        15382  +    ("<td bgcolor=\"#f0fff0\">Exports a whole DXF file.<br>Will return 0 (i.e. FALSE) on failure, any other value (i.e. TRUE) on success.<hr>");
        15383  +  html +=
        15384  +    wxT
        15385  +    ("Please note this SQL function open the doors to many potential security issues, and thus is always disabled by default.<br>");
        15386  +  html +=
        15387  +    wxT
        15388  +    ("Explicitly setting the environment variable SPATIALITE_SECURITY=relaxed is absolutely required in order to effectively enable this function.</td></tr>");
        15389  +  html +=
        15390  +    wxT
        15391  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c34\">functions on type Geometry</a>");
        15392  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        15393  +  html +=
        15394  +    wxT("<tr><td bgcolor=\"#fffff0\">Dimension( geom Geometry ) : Integer<hr>");
        15395  +  html += wxT("ST_Dimension( geom Geometry ) : Integer</td>");
        15396  +  html +=
        15397  +    wxT
        15398  +    ("<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>");
        15399  +  html +=
        15400  +    wxT
        15401  +    ("<tr><td bgcolor=\"#fffff0\">CoordDimension( geom Geometry ) : String</td>");
        15402  +  html +=
        15403  +    wxT
        15404  +    ("<td bgcolor=\"#f0fff0\">return the dimension model used by the geometric object as:<br>'XY', 'XYZ', 'XYM' or 'XYZM'</td></tr>");
        15405  +  html +=
        15406  +    wxT("<tr><td bgcolor=\"#fffff0\">ST_NDims( geom Geometry ) : Integer</td>");
        15407  +  html +=
        15408  +    wxT
        15409  +    ("<td bgcolor=\"#f0fff0\">return the number of dimensions used by the geometric object as:<br>2, 3 or 4</td></tr>");
        15410  +  html +=
        15411  +    wxT("<tr><td bgcolor=\"#fffff0\">ST_Is3D( geom Geometry ) : Integer</td>");
        15412  +  html +=
        15413  +    wxT("<td bgcolor=\"#f0fff0\">Checks if geom has the Z dimension.<br>");
        15414  +  html +=
        15415  +    wxT
        15416  +    ("The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a ");
        15417  +  html += wxT("function invocation on invalid arguments.</td></tr>");
        15418  +  html +=
        15419  +    wxT
        15420  +    ("<tr><td bgcolor=\"#fffff0\">ST_IsMeasured( geom Geometry ) : Integer</td>");
        15421  +  html +=
        15422  +    wxT("<td bgcolor=\"#f0fff0\">Checks if geom has the M dimension.<br>");
        15423  +  html +=
        15424  +    wxT
        15425  +    ("The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a ");
        15426  +  html += wxT("function invocation on invalid arguments.</td></tr>");
        15427  +  html +=
        15428  +    wxT
        15429  +    ("<tr><td bgcolor=\"#fffff0\">GeometryType( geom Geometry ) : String<hr>");
        15430  +  html += wxT("ST_GeometryType( geom Geometry ) : String</td>");
        15431  +  html +=
        15432  +    wxT
        15433  +    ("<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>");
        15434  +  html +=
        15435  +    wxT("<tr><td bgcolor=\"#fffff0\">SRID( geom Geometry ) : Integer<hr>");
        15436  +  html += wxT("ST_SRID( geom <i>Geometry</i> ) : <i>Integer</i></td>");
        15437  +  html +=
        15438  +    wxT
        15439  +    ("<td bgcolor=\"#f0fff0\">return the Spatial Reference System ID for this geometric object</td></tr>");
        15440  +  html +=
        15441  +    wxT
        15442  +    ("<tr><td bgcolor=\"#fffff0\">SetSRID( geom Geometry , SRID Integer ) : Integer</td>");
        15443  +  html +=
        15444  +    wxT
        15445  +    ("<td bgcolor=\"#f0fff0\">directly sets the Spatial Reference System ID for this geometric object [no reprojection is applied].<br>");
        15446  +  html +=
        15447  +    wxT
        15448  +    ("The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, and -1 for UNKNOWN corresponding to a ");
        15449  +  html += wxT("function invocation on NULL arguments</td></tr>");
        15450  +  html +=
        15451  +    wxT("<tr><td bgcolor=\"#fffff0\">IsEmpty( geom Geometry ) : Integer<hr>");
        15452  +  html += wxT("ST_IsEmpty( geom Geometry ) : Integer</td>");
        15453  +  html +=
        15454  +    wxT
        15455  +    ("<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>");
        15456  +  html +=
        15457  +    wxT("TRUE if this geometric object corresponds to the empty set</td></tr>");
        15458  +  html +=
        15459  +    wxT("<tr><td bgcolor=\"#fffff0\">IsSimple( geom Geometry ) : Integer<hr>");
        15460  +  html += wxT("ST_IsSimple( geom <i>Geometry</i> ) : <i>Integer</i></td>");
        15461  +  html +=
        15462  +    wxT
        15463  +    ("<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>");
        15464  +  html +=
        15465  +    wxT
        15466  +    ("TRUE if this geometric object is simple, as defined in the Geometry Model</td></tr>");
        15467  +  html +=
        15468  +    wxT("<tr><td bgcolor=\"#fffff0\">IsValid( geom Geometry ) : Integer<hr>");
        15469  +  html += wxT("ST_IsValid( geom Geometry ) : Integer</td>");
        15470  +  html +=
        15471  +    wxT
        15472  +    ("<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>");
        15473  +  html +=
        15474  +    wxT
        15475  +    ("TRUE if this geometric object does not contains any topological error</td></tr>");
        15476  +  html +=
        15477  +    wxT("<tr><td bgcolor=\"#fffff0\">Boundary( geom Geometry ) : Geometry<hr>");
        15478  +  html += wxT("ST_Boundary( geom Geometry ) : Geometry</td>");
        15479  +  html +=
        15480  +    wxT
        15481  +    ("<td bgcolor=\"#f0fff0\">return a geometric object that is the combinatorial boundary of g as defined in the Geometry Model</td></tr>");
        15482  +  html +=
        15483  +    wxT("<tr><td bgcolor=\"#fffff0\">Envelope( geom Geometry ) : Geometry<hr>");
        15484  +  html += wxT("ST_Envelope( geom Geometry ) : Geometry</td>");
        15485  +  html +=
        15486  +    wxT
        15487  +    ("<td bgcolor=\"#f0fff0\">return the rectangle bounding g as a Polygon. ");
        15488  +  html +=
        15489  +    wxT
        15490  +    ("The Polygon is defined by the corner points of the bounding box [(MINX, MINY),(MAXX, MINY), (MAXX, MAXY), (MINX, MAXY), (MINX, MINY)].</td></tr>");
        15491  +  html +=
        15492  +    wxT
        15493  +    ("<tr><td bgcolor=\"#fffff0\">ST_Expand( geom Geometry , amount Double ) : Geometry</td>");
        15494  +  html +=
        15495  +    wxT
        15496  +    ("<td bgcolor=\"#f0fff0\">return the rectangle bounding g as a Polygon.<br>");
        15497  +  html +=
        15498  +    wxT
        15499  +    ("The bounding rectangle is expanded in all directions by an amount specified by the second argument.</td></tr>");
        15500  +  html +=
        15501  +    wxT
        15502  +    ("<tr><td bgcolor=\"#fffff0\">ST_NPoints( geom Geometry ) : Integer</td>");
        15503  +  html +=
        15504  +    wxT
        15505  +    ("<td bgcolor=\"#f0fff0\">return the total number of Points (this including any Linestring/Polygon vertex)</td></tr>");
        15506  +  html +=
        15507  +    wxT
        15508  +    ("<tr><td bgcolor=\"#fffff0\">ST_NRings( geom Geometry ) : Integer</td>");
        15509  +  html +=
        15510  +    wxT
        15511  +    ("<td bgcolor=\"#f0fff0\">return the total number of Rings (this including both Exterior and Interior Rings)</td></tr>");
        15512  +  html +=
        15513  +    wxT
        15514  +    ("<tr><td bgcolor=\"#fffff0\">ST_Reverse( geom Geometry ) : geom Geometry</td>");
        15515  +  html +=
        15516  +    wxT
        15517  +    ("<td bgcolor=\"#f0fff0\">returns a new Geometry [if possible] or NULL<hr>");
        15518  +  html += wxT("Any Linestring or Ring will be in reverse order.</td></tr>");
        15519  +  html +=
        15520  +    wxT
        15521  +    ("<tr><td bgcolor=\"#fffff0\">ST_ForceLHR( geom Geometry ) : geom Geometry</td>");
        15522  +  html +=
        15523  +    wxT
        15524  +    ("<td bgcolor=\"#f0fff0\">returns a new Geometry [if possible] or NULL<hr>");
        15525  +  html +=
        15526  +    wxT
        15527  +    ("Any Polygon will be oriented accordingly to Left Hand Rule (Exterior Ring clockwise, ");
        15528  +  html += wxT("Interior Rings counter-clockwise).</td></tr>");
        15529  +  html +=
        15530  +    wxT
        15531  +    ("<tr><td bgcolor=\"#fffff0\">AddPoint( line Linestring , point Point [ , position Integer ] ) : Linestring<hr>");
        15532  +  html +=
        15533  +    wxT
        15534  +    ("ST_AddPoint( line Linestring , point Point [ , position Integer ] ) : Linestring</td>");
        15535  +  html +=
        15536  +    wxT
        15537  +    ("<td bgcolor=\"#f0fff0\">Adds a new Point into the input Linestring immediately before \"position\" (zero-based index)<br>");
        15538  +  html +=
        15539  +    wxT
        15540  +    ("A negative \"position\" (default) means appending the new Point to the end of the input Linestring.<br>");
        15541  +  html += wxT("NULL will be returned if any error is encountered.</td></tr>");
        15542  +  html +=
        15543  +    wxT
        15544  +    ("<tr><td bgcolor=\"#fffff0\">SetPoint( line Linestring , position Integer , point Point ) : Linestring<hr>");
        15545  +  html +=
        15546  +    wxT
        15547  +    ("ST_SetPoint( line Linestring , position Integer , point Point ) : Linestring</td>");
        15548  +  html +=
        15549  +    wxT
        15550  +    ("<td bgcolor=\"#f0fff0\">Replaces the Point into the input Linestring at \"position\" (zero-based index)<br>");
        15551  +  html += wxT("NULL will be returned if any error is encountered.</td></tr>");
        15552  +  html +=
        15553  +    wxT("ST_SetStartPoint( line Linestring , point Point ) : Linestring</td>");
        15554  +  html +=
        15555  +    wxT
        15556  +    ("<td bgcolor=\"#f0fff0\">Replaces the StartPoint into the input Linestring<br>");
        15557  +  html += wxT("NULL will be returned if any error is encountered.</td></tr>");
        15558  +  html +=
        15559  +    wxT("ST_SetEndtPoint( line Linestring , point Point ) : Linestring</td>");
        15560  +  html +=
        15561  +    wxT
        15562  +    ("<td bgcolor=\"#f0fff0\">Replaces the EndPoint into the input Linestring<br>");
        15563  +  html += wxT("NULL will be returned if any error is encountered.</td></tr>");
        15564  +  html +=
        15565  +    wxT
        15566  +    ("<tr><td bgcolor=\"#fffff0\">RemovePoint( line Linestring , position Integer ) : Linestring<hr>");
        15567  +  html +=
        15568  +    wxT
        15569  +    ("ST_RemovePoint( line Linestring , position Integer ) : Linestring</td>");
        15570  +  html +=
        15571  +    wxT
        15572  +    ("<td bgcolor=\"#f0fff0\">Removes the Point into the input Linestring at \"position\" (zero-based index)<br>");
        15573  +  html += wxT("NULL will be returned if any error is encountered.</td></tr>");
        15574  +  html +=
        15575  +    wxT
        15576  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"repair\">Functions attempting to repair malformed Geometries</a>");
        15577  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        15578  +  html +=
        15579  +    wxT
        15580  +    ("<tr><td bgcolor=\"#fffff0\">SanitizeGeometry( geom Geometry ) : geom Geometry</td>");
        15581  +  html +=
        15582  +    wxT
        15583  +    ("<td bgcolor=\"#f0fff0\">returns a (possibly) sanitized Geometry or NULL</td></tr>");
        15584  +  html +=
        15585  +    wxT
        15586  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"compress\">Geometry-compression functions</a>");
        15587  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        15588  +  html +=
        15589  +    wxT
        15590  +    ("<tr><td bgcolor=\"#fffff0\">CompressGeometry( geom Geometry ) : geom Geometry</td>");
        15591  +  html +=
        15592  +    wxT
        15593  +    ("<td bgcolor=\"#f0fff0\">returns a compressed Geometry or NULL</td></tr>");
        15594  +  html +=
        15595  +    wxT
        15596  +    ("<tr><td bgcolor=\"#fffff0\">UncompressGeometry( geom Geometry ) : geom Geometry</td>");
        15597  +  html +=
        15598  +    wxT
        15599  +    ("<td bgcolor=\"#f0fff0\">returns an uncompressed Geometry or NULL</td></tr>");
        15600  +  html +=
        15601  +    wxT
        15602  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"cast\">Geometry-type casting functions</a>");
        15603  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        15604  +  html +=
        15605  +    wxT
        15606  +    ("<tr><td bgcolor=\"#fffff0\">CastToPoint( geom Geometry ) : geom Geometry</td>");
        15607  +  html +=
        15608  +    wxT
        15609  +    ("<td bgcolor=\"#f0fff0\">returns a POINT-type Geometry [if possible] or NULL</td></tr>");
        15610  +  html +=
        15611  +    wxT
        15612  +    ("<tr><td bgcolor=\"#fffff0\">CastToLinestring( geom Geometry ) : geom Geometry</td>");
        15613  +  html +=
        15614  +    wxT
        15615  +    ("<td bgcolor=\"#f0fff0\">returns a LINESTRING-type Geometry [if possible] or NULL</td></tr>");
        15616  +  html +=
        15617  +    wxT
        15618  +    ("<tr><td bgcolor=\"#fffff0\">CastToPolygon( geom Geometry ) : geom Geometry</td>");
        15619  +  html +=
        15620  +    wxT
        15621  +    ("<td bgcolor=\"#f0fff0\">returns a POLYGON-type Geometry [if possible] or NULL</td></tr>");
        15622  +  html +=
        15623  +    wxT
        15624  +    ("<tr><td bgcolor=\"#fffff0\">CastToMultiPoint( geom Geometry ) : geom Geometry</td>");
        15625  +  html +=
        15626  +    wxT
        15627  +    ("<td bgcolor=\"#f0fff0\">returns a MULTIPOINT-type Geometry [if possible] or NULL</td></tr>");
        15628  +  html +=
        15629  +    wxT
        15630  +    ("<tr><td bgcolor=\"#fffff0\">CastToMultiLinestring( geom Geometry ) : geom Geometry</td>");
        15631  +  html +=
        15632  +    wxT
        15633  +    ("<td bgcolor=\"#f0fff0\">returns a MULTILINESTRING-type Geometry [if possible] or NULL</td></tr>");
        15634  +  html +=
        15635  +    wxT
        15636  +    ("<tr><td bgcolor=\"#fffff0\">CastToMultiPolygon( geom Geometry ) : geom Geometry</td>");
        15637  +  html +=
        15638  +    wxT
        15639  +    ("<td bgcolor=\"#f0fff0\">returns a MULTIPOLYGON-type Geometry [if possible] or NULL</td></tr>");
        15640  +  html +=
        15641  +    wxT
        15642  +    ("<tr><td bgcolor=\"#fffff0\">CastToGeometryCollection( geom Geometry ) : geom Geometry</td>");
        15643  +  html +=
        15644  +    wxT
        15645  +    ("<td bgcolor=\"#f0fff0\">returns a GEOMETRYCOLLECTION-type Geometry [if possible] or NULL</td></tr>");
        15646  +  html +=
        15647  +    wxT
        15648  +    ("<tr><td bgcolor=\"#fffff0\">CastToMulti( geom Geometry ) : geom Geometry<hr>");
        15649  +  html += wxT("ST_Multi( geom Geometry ) : geom Geometry</td>");
        15650  +  html +=
        15651  +    wxT
        15652  +    ("<td bgcolor=\"#f0fff0\">returns a MULTIPOINT-, MULTILINESTRING- or MULTIPOLYGON-type Geometry [if possible]: NULL in any other case</td></tr>");
        15653  +  html +=
        15654  +    wxT
        15655  +    ("<tr><td bgcolor=\"#fffff0\">CastToSingle( geom Geometry ) : geom Geometry</td>");
        15656  +  html +=
        15657  +    wxT
        15658  +    ("<td bgcolor=\"#f0fff0\">returns a POINT-, LINESTRING- or POLYGON-type Geometry [if possible]: NULL in any other case</td></tr>");
        15659  +  html +=
        15660  +    wxT
        15661  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"dims-cast\">Space-dimensions casting functions</a>");
        15662  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        15663  +  html +=
        15664  +    wxT
        15665  +    ("<tr><td bgcolor=\"#fffff0\">CastToXY( geom Geometry ) : geom Geometry</td>");
        15666  +  html +=
        15667  +    wxT
        15668  +    ("<td bgcolor=\"#f0fff0\">returns a Geometry using the [XY] space dimension</td></tr>");
        15669  +  html +=
        15670  +    wxT
        15671  +    ("<tr><td bgcolor=\"#fffff0\">CastToXYZ( geom Geometry ) : geom Geometry</td>");
        15672  +  html +=
        15673  +    wxT
        15674  +    ("<td bgcolor=\"#f0fff0\">returns a Geometry using the [XYZ] space dimension</td></tr>");
        15675  +  html +=
        15676  +    wxT
        15677  +    ("<tr><td bgcolor=\"#fffff0\">CastToXYM( geom Geometry ) : geom Geometry</td>");
        15678  +  html +=
        15679  +    wxT
        15680  +    ("<td bgcolor=\"#f0fff0\">returns a Geometry using the [XYM] space dimension</td></tr>");
        15681  +  html +=
        15682  +    wxT
        15683  +    ("<tr><td bgcolor=\"#fffff0\">CastToXYZM( geom Geometry ) : geom Geometry</td>");
        15684  +  html +=
        15685  +    wxT
        15686  +    ("<td bgcolor=\"#f0fff0\">returns a Geometry using the [XYZM] space dimension</td></tr>");
        15687  +  html +=
        15688  +    wxT
        15689  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c35\">functions on type Point</a>");
        15690  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        15691  +  html +=
        15692  +    wxT("<tr><td bgcolor=\"#fffff0\">X( pt Point ) : Double precision<hr>");
        15693  +  html +=
        15694  +    wxT
        15695  +    ("ST_X( pt Point ) : Double precision</td><td bgcolor=\"#f0fff0\">return the x-coordinate of Point p as a double precision number</td></tr>");
        15696  +  html +=
        15697  +    wxT("<tr><td bgcolor=\"#fffff0\">Y( pt Point ) : Double precision<hr>");
        15698  +  html +=
        15699  +    wxT
        15700  +    ("ST_Y( pt Point ) : Double precision</td><td bgcolor=\"#f0fff0\">return the y-coordinate of Point p as a double precision number</td></tr>");
        15701  +  html +=
        15702  +    wxT("<tr><td bgcolor=\"#fffff0\">Z( pt Point ) : Double precision<hr>");
        15703  +  html +=
        15704  +    wxT
        15705  +    ("ST_Z( pt Point ) : Double precision</td><td bgcolor=\"#f0fff0\">return the z-coordinate of Point p as a double precision number");
        15706  +  html += wxT("or NULL if no z-coordinate is available</td></tr>");
        15707  +  html +=
        15708  +    wxT("<tr><td bgcolor=\"#fffff0\">M( pt Point ) : Double precision<hr>");
        15709  +  html +=
        15710  +    wxT
        15711  +    ("ST_M( pt Point ) : Double precision</td><td bgcolor=\"#f0fff0\">return the m-coordinate of Point p as a double precision number<br>");
        15712  +  html += wxT("or NULL if no m-coordinate is available</td></tr>");
        15713  +  html +=
        15714  +    wxT
        15715  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c361\">functions on type Curve [Linestring or Ring]</a></td></tr>");
        15716  +  html += wxT("<tr><td bgcolor=\"#fffff0\">StartPoint( c Curve ) : Point<hr>");
        15717  +  html +=
        15718  +    wxT
        15719  +    ("ST_StartPoint( c Curve ) : Point</td><td bgcolor=\"#f0fff0\">return a Point containing the first Point of c</td></tr>");
        15720  +  html += wxT("<tr><td bgcolor=\"#fffff0\">EndPoint( c Curve ) : Point<hr>");
        15721  +  html +=
        15722  +    wxT
        15723  +    ("ST_EndPoint( c Curve ) : Point</td><td bgcolor=\"#f0fff0\">return a Point containing the last Point of c</td></tr>");
        15724  +  html +=
        15725  +    wxT
        15726  +    ("<tr><td bgcolor=\"#fffff0\">NumPoints( line LineString ) : Integer<hr>");
        15727  +  html +=
        15728  +    wxT
        15729  +    ("ST_NumPoints( line LineString ) : Integer</td><td bgcolor=\"#f0fff0\">return the number of Points in the LineString</td></tr>");
        15730  +  html +=
        15731  +    wxT
        15732  +    ("<tr><td bgcolor=\"#fffff0\">PointN( line LineString , n Integer ) : Point<hr>");
        15733  +  html +=
        15734  +    wxT
        15735  +    ("ST_PointN( line LineString , n Integer ) : Point</td><td bgcolor=\"#f0fff0\">return a Point containing Point n of line</td></tr>");
        15736  +  html +=
        15737  +    wxT
        15738  +    ("<tr><td bgcolor=\"#fffff0\">GLength( c Curve [ , use_ellipsoid Boolean ] ) : Double precision<hr>");
        15739  +  html +=
        15740  +    wxT
        15741  +    ("ST_Length( c Curve [ , use_ellipsoid Boolean ] ) : Double precision</td><td bgcolor=\"#f0fff0\">return the length of c</td></tr>");
        15742  +  html +=
        15743  +    wxT
        15744  +    ("<tr><td bgcolor=\"#fffff0\">Perimeter( s Surface [ , use_ellipsoid Boolean ] ) : Double precision<hr>");
        15745  +  html +=
        15746  +    wxT
        15747  +    ("ST_Perimeter( s Surface [ , use_ellipsoid Boolean ] ) : Double precision</td><td bgcolor=\"#f0fff0\">return the perimeter of s</td></tr>");
        15748  +  html +=
        15749  +    wxT
        15750  +    ("<tr><td bgcolor=\"#fffff0\">GeodesicLength( c Curve ) : Double precision</td><td bgcolor=\"#f0fff0\">return the geodesic length of c");
        15751  +  html +=
        15752  +    wxT
        15753  +    (" measured on the Ellipsoid [<i>only for <b>geographic</b> SRIDs</i>]</td></tr>");
        15754  +  html +=
        15755  +    wxT
        15756  +    ("<tr><td bgcolor=\"#fffff0\">GreatCircleLength( c Curve ) : Double precision</td><td bgcolor=\"#f0fff0\">return the Great Circle length of c");
        15757  +  html += wxT(" [<i>only for <b>geographic</b> SRIDs</i>]</td></tr>");
        15758  +  html += wxT("<tr><td bgcolor=\"#fffff0\">IsClosed( c Curve ) : Integer<hr>");
        15759  +  html += wxT("ST_IsClosed( c Curve ) : Integer</td>");
        15760  +  html +=
        15761  +    wxT
        15762  +    ("<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>");
        15763  +  html +=
        15764  +    wxT
        15765  +    ("return TRUE if c is closed, i.e., if StartPoint(c) = EndPoint(c)</td></tr>");
        15766  +  html += wxT("<tr><td bgcolor=\"#fffff0\">IsRing( c Curve ) : Integer<hr>");
        15767  +  html += wxT("ST_IsRing( c Curve ) : Integer</td>");
        15768  +  html +=
        15769  +    wxT
        15770  +    ("<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>");
        15771  +  html +=
        15772  +    wxT
        15773  +    ("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>");
        15774  +  html +=
        15775  +    wxT
        15776  +    ("<tr><td bgcolor=\"#fffff0\">PointOnSurface( s Surface/Curve ) : Point<hr>");
        15777  +  html +=
        15778  +    wxT
        15779  +    ("ST_PointOnSurface( s Surface ) : Point</td><td bgcolor=\"#f0fff0\">return a Point guaranteed to lie on the Surface (or Curve)</td></tr>");
        15780  +  html +=
        15781  +    wxT
        15782  +    ("<tr><td bgcolor=\"#fffff0\">Simplify( c Curve , tolerance Double precision ) : Curve<hr>");
        15783  +  html +=
        15784  +    wxT("ST_Simplify( c Curve , tolerance Double precision ) : Curve<hr>");
        15785  +  html +=
        15786  +    wxT("ST_Generalize( c Curve , tolerance Double precision ) : Curve</td>");
        15787  +  html +=
        15788  +    wxT
        15789  +    ("<td bgcolor=\"#f0fff0\">return a geometric object representing a simplified version of c applying the Douglas-Peukert algorithm with given tolerance</td></tr>");
        15790  +  html +=
        15791  +    wxT
        15792  +    ("<tr><td bgcolor=\"#fffff0\">SimplifyPreserveTopology( c Curve , tolerance Double precision ) : Curve<hr>");
        15793  +  html +=
        15794  +    wxT
        15795  +    ("ST_SimplifyPreserveTopology( c Curve , tolerance Double precision ) : Curve</td>");
        15796  +  html +=
        15797  +    wxT
        15798  +    ("<td bgcolor=\"#f0fff0\">return a geometric object representing a simplified version of c ");
        15799  +  html +=
        15800  +    wxT
        15801  +    ("applying the Douglas-Peukert algorithm with given tolerance and respecting topology</td></tr>");
        15802  +  html +=
        15803  +    wxT
        15804  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c36\">functions on type Surface [Polygon or Ring]</a>");
        15805  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        15806  +  html += wxT("<tr><td bgcolor=\"#fffff0\">Centroid( s Surface ) : Point<hr>");
        15807  +  html +=
        15808  +    wxT
        15809  +    ("ST_Centroid( s Surface ) : Point</td><td bgcolor=\"#f0fff0\">return the centroid of s, which may lie outside s</td></tr>");
        15810  +  html +=
        15811  +    wxT
        15812  +    ("<tr><td bgcolor=\"#fffff0\">Area( s Surface [ , use_ellipsoid Boolean ] ) : Double precision<hr>");
        15813  +  html +=
        15814  +    wxT
        15815  +    ("ST_Area( s Surface [ , use_ellipsoid Boolean ] ) : Double precision</td><td bgcolor=\"#f0fff0\">return the area of s</td></tr>");
        15816  +  html +=
        15817  +    wxT
        15818  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c37\">functions on type Polygon</a>");
        15819  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        15820  +  html +=
        15821  +    wxT
        15822  +    ("<tr><td bgcolor=\"#fffff0\">ExteriorRing( polyg Polygon ) : LineString<hr>");
        15823  +  html +=
        15824  +    wxT
        15825  +    ("ST_ExteriorRing( polyg Polygon ) : LineString</td><td bgcolor=\"#f0fff0\">return the exteriorRing of p</td></tr>");
        15826  +  html +=
        15827  +    wxT
        15828  +    ("<tr><td bgcolor=\"#fffff0\">NumInteriorRing( polyg Polygon ) : Integer<hr>NumInteriorRings( polyg Polygon ) : Integer<hr>");
        15829  +  html += wxT("ST_NumInteriorRing( polyg Polygon ) : Integer</td>");
        15830  +  html +=
        15831  +    wxT("<td bgcolor=\"#f0fff0\">return the number of interiorRings</td></tr>");
        15832  +  html +=
        15833  +    wxT
        15834  +    ("<tr><td bgcolor=\"#fffff0\">InteriorRingN( polyg Polygon , n Integer ) : LineString<hr>");
        15835  +  html +=
        15836  +    wxT("ST_InteriorRingN( polyg Polygon , n Integer ) : LineString</td>");
        15837  +  html +=
        15838  +    wxT
        15839  +    ("<td bgcolor=\"#f0fff0\">return the nth interiorRing. The order of Rings is not geometrically significant.</td></tr>");
        15840  +  html +=
        15841  +    wxT
        15842  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c38\">functions on type GeomCollection</a>");
        15843  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        15844  +  html +=
        15845  +    wxT
        15846  +    ("<tr><td bgcolor=\"#fffff0\">NumGeometries( geom GeomCollection ) : Integer<hr>");
        15847  +  html +=
        15848  +    wxT
        15849  +    ("ST_NumGeometries( geom GeomCollection ) : Integer</td><td bgcolor=\"#f0fff0\">return the number of geometries</td></tr>");
        15850  +  html +=
        15851  +    wxT
        15852  +    ("<tr><td bgcolor=\"#fffff0\">GeometryN( geom GeomCollection , n Integer ) : Geometry<hr>");
        15853  +  html +=
        15854  +    wxT("ST_GeometryN( geom GeomCollection , n Integer ) : Geometry</td>");
        15855  +  html +=
        15856  +    wxT
        15857  +    ("<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>");
        15858  +  html +=
        15859  +    wxT
        15860  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c39\">functions testing approximative spatial relationships via MBRs</a>");
        15861  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        15862  +  html +=
        15863  +    wxT
        15864  +    ("<tr><td bgcolor=\"#fffff0\">MbrEqual( geom1 Geometry , geom2 Geometry ) : Integer</td>");
        15865  +  html +=
        15866  +    wxT
        15867  +    ("<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>");
        15868  +  html += wxT("TRUE if g1 and g2 have equal MBRs</td></tr>");
        15869  +  html +=
        15870  +    wxT
        15871  +    ("<tr><td bgcolor=\"#fffff0\">MbrDisjoint( geom1 Geometry , geom2 Geometry ) : Integer</td>");
        15872  +  html +=
        15873  +    wxT
        15874  +    ("<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>");
        15875  +  html +=
        15876  +    wxT
        15877  +    ("TRUE if the intersection of g1 and g2 MBRs is the empty set</td></tr>");
        15878  +  html +=
        15879  +    wxT
        15880  +    ("<tr><td bgcolor=\"#fffff0\">MbrTouches( geom1 Geometry , geom2 Geometry ) : Integer</td>");
        15881  +  html +=
        15882  +    wxT
        15883  +    ("<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>");
        15884  +  html +=
        15885  +    wxT
        15886  +    ("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>");
        15887  +  html +=
        15888  +    wxT
        15889  +    ("<tr><td bgcolor=\"#fffff0\">MbrWithin( geom1 Geometry , geom2 Geometry ) : Integer</td>");
        15890  +  html +=
        15891  +    wxT
        15892  +    ("<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>");
        15893  +  html += wxT("TRUE if g1 MBR is completely contained in g2 MBR</td></tr>");
        15894  +  html +=
        15895  +    wxT
        15896  +    ("<tr><td bgcolor=\"#fffff0\">MbrOverlaps( geom1 Geometry , geom2 Geometry ) : Integer</td>");
        15897  +  html +=
        15898  +    wxT
        15899  +    ("<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>");
        15900  +  html +=
        15901  +    wxT
        15902  +    ("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>");
        15903  +  html +=
        15904  +    wxT
        15905  +    ("<tr><td bgcolor=\"#fffff0\">MbrIntersects( geom1 Geometry , geom2 Geometry ) : Integer</td>");
        15906  +  html +=
        15907  +    wxT
        15908  +    ("<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>");
        15909  +  html +=
        15910  +    wxT
        15911  +    ("convenience predicate: TRUE if the intersection of g1 and g2 MBRs is not empty</td></tr>");
        15912  +  html +=
        15913  +    wxT
        15914  +    ("<tr><td bgcolor=\"#fffff0\">ST_EnvIntersects( geom1 Geometry , geom2 Geometry ) : Integer<hr>");
        15915  +  html +=
        15916  +    wxT
        15917  +    ("ST_EnvelopesIntersects( geom1 Geometry , geom2 Geometry ) : Integer<hr>");
        15918  +  html +=
        15919  +    wxT
        15920  +    ("ST_EnvIntersects( geom1 Geometry , x1 Double precision , y1 Double precision , x2 Double precision , y2 Double precision ) : Integer<hr>");
        15921  +  html +=
        15922  +    wxT
        15923  +    ("ST_EnvelopesIntersects( geom1 Geometry , x1 Double precision , y1 Double precision , x2 Double precision , y2 Double precision ) : Integer</td>");
        15924  +  html +=
        15925  +    wxT
        15926  +    ("<td bgcolor=\"#f0fff0\">The first form simply is an alias name for MbrIntersects; the other form allows to define the second MBR by two extreme points [x1, y1] and [x2, y2].<br>");
        15927  +  html +=
        15928  +    wxT
        15929  +    ("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 invalid arguments<br>");
        15930  +  html +=
        15931  +    wxT
        15932  +    ("convenience predicate: TRUE if the intersection of both MBRs is not empty</td></tr>");
        15933  +  html +=
        15934  +    wxT
        15935  +    ("<tr><td bgcolor=\"#fffff0\">MbrContains( geom1 Geometry , geom2 Geometry ) : Integer</td>");
        15936  +  html +=
        15937  +    wxT
        15938  +    ("<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>");
        15939  +  html +=
        15940  +    wxT
        15941  +    ("convenience predicate: TRUE if g2 MBR is completely contained in g1 MBR</td></tr>");
        15942  +  html +=
        15943  +    wxT
        15944  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c40\">functions testing spatial relationships</a>");
        15945  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        15946  +  html +=
        15947  +    wxT
        15948  +    ("<tr><td bgcolor=\"#fffff0\">Equals( geom1 Geometry , geom2 Geometry ) : Integer<hr>");
        15949  +  html += wxT("ST_Equals( geom1 Geometry , geom2 Geometry ) : Integer</td>");
        15950  +  html +=
        15951  +    wxT
        15952  +    ("<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>");
        15953  +  html += wxT("TRUE if g1 and g2 are equal</td></tr>");
        15954  +  html +=
        15955  +    wxT
        15956  +    ("<tr><td bgcolor=\"#fffff0\">Disjoint( geom1 Geometry , geom2 Geometry ) : Integer<hr>");
        15957  +  html += wxT("ST_Disjoint( geom1 Geometry , geom2 Geometry ) : Integer</td>");
        15958  +  html +=
        15959  +    wxT
        15960  +    ("<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>");
        15961  +  html +=
        15962  +    wxT("TRUE if the intersection of g1 and g2 is the empty set</td></tr>");
        15963  +  html +=
        15964  +    wxT
        15965  +    ("<tr><td bgcolor=\"#fffff0\">Touches( geom1 Geometry , geom2 Geometry ) : Integer<hr>");
        15966  +  html += wxT("ST_Touches( geom1 Geometry , geom2 Geometry ) : Integer</td>");
        15967  +  html +=
        15968  +    wxT
        15969  +    ("<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>");
        15970  +  html +=
        15971  +    wxT
        15972  +    ("TRUE if the only Points in common between g1 and g2 lie in the union of the boundaries of g1 and g2</td></tr>");
        15973  +  html +=
        15974  +    wxT
        15975  +    ("<tr><td bgcolor=\"#fffff0\">Within( geom1 Geometry , geom2 Geometry ) : Integer<hr>");
        15976  +  html += wxT("ST_Within( geom1 Geometry , geom2 Geometry ) : Integer</td>");
        15977  +  html +=
        15978  +    wxT
        15979  +    ("<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>");
        15980  +  html += wxT("TRUE if g1 is completely contained in g2</td></tr>");
        15981  +  html +=
        15982  +    wxT
        15983  +    ("<tr><td bgcolor=\"#fffff0\">Overlaps( geom1 Geometry , geom2 Geometry ) : Integer<hr>");
        15984  +  html += wxT("ST_Overlaps( geom1 Geometry , geom2 Geometry ) : Integer</td>");
        15985  +  html +=
        15986  +    wxT
        15987  +    ("<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>");
        15988  +  html +=
        15989  +    wxT
        15990  +    ("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>");
        15991  +  html +=
        15992  +    wxT
        15993  +    ("<tr><td bgcolor=\"#fffff0\">Crosses( geom1 Geometry , geom2 Geometry ) : Integer<hr>");
        15994  +  html += wxT("ST_Crosses( geom1 Geometry , geom2 Geometry ) : Integer</td>");
        15995  +  html +=
        15996  +    wxT
        15997  +    ("<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>");
        15998  +  html +=
        15999  +    wxT
        16000  +    ("TRUE if the intersection of g1 and g2 results in a value whose dimension is less than the maximum dimension of g1 and g2 ");
        16001  +  html +=
        16002  +    wxT
        16003  +    ("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>");
        16004  +  html +=
        16005  +    wxT
        16006  +    ("<tr><td bgcolor=\"#fffff0\">Intersects( geom1 Geometry , geom2 Geometry ) : Integer<hr>");
        16007  +  html +=
        16008  +    wxT("ST_Intersects( geom1 Geometry , geom2 Geometry ) : Integer</td>");
        16009  +  html +=
        16010  +    wxT
        16011  +    ("<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>");
        16012  +  html +=
        16013  +    wxT
        16014  +    ("convenience predicate: TRUE if the intersection of g1 and g2 is not empty</td></tr>");
        16015  +  html +=
        16016  +    wxT
        16017  +    ("<tr><td bgcolor=\"#fffff0\">Contains( geom1 Geometry , geom2 Geometry ) : Integer<hr>");
        16018  +  html += wxT("ST_Contains( geom1 Geometry , geom2 Geometry ) : Integer</td>");
        16019  +  html +=
        16020  +    wxT
        16021  +    ("<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>");
        16022  +  html +=
        16023  +    wxT
        16024  +    ("convenience predicate: TRUE if g2 is completely contained in g1</td></tr>");
        16025  +  html +=
        16026  +    wxT
        16027  +    ("<tr><td bgcolor=\"#fffff0\">Covers( geom1 Geometry , geom2 Geometry ) : Integer</td>");
        16028  +  html +=
        16029  +    wxT
        16030  +    ("<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>");
        16031  +  html +=
        16032  +    wxT("convenience predicate: TRUE if g1 completely covers g2</td></tr>");
        16033  +  html +=
        16034  +    wxT
        16035  +    ("<tr><td bgcolor=\"#fffff0\">CoveredBy( geom1 Geometry , geom2 Geometry ) : Integer</td>");
        16036  +  html +=
        16037  +    wxT
        16038  +    ("<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>");
        16039  +  html +=
        16040  +    wxT
        16041  +    ("convenience predicate: TRUE if g1 is completely covered by g2</td></tr>");
        16042  +  html +=
        16043  +    wxT
        16044  +    ("<tr><td bgcolor=\"#fffff0\">Relate( geom1 Geometry , geom2 Geometry , patternMatrix String ) : Integer<hr>");
        16045  +  html +=
        16046  +    wxT
        16047  +    ("ST_Relate( geom1 Geometry , geom2 Geometry , patternMatrix String ) : Integer</td>");
        16048  +  html +=
        16049  +    wxT
        16050  +    ("<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>");
        16051  +  html +=
        16052  +    wxT
        16053  +    ("return TRUE if the spatial relationship specified by the patternMatrix holds</td></tr>");
        16054  +  html +=
        16055  +    wxT
        16056  +    ("<tr><td bgcolor=\"#fffff0\">Distance( geom1 Geometry , geom2 Geometry [ , use_ellipsoid Boolean ] ) : Double precision<hr>");
        16057  +  html +=
        16058  +    wxT
        16059  +    ("ST_Distance( geom1 Geometry , geom2 Geometry [ , use_ellipsoid Boolean ] ) : Double precision</td>");
        16060  +  html +=
        16061  +    wxT
        16062  +    ("<td bgcolor=\"#f0fff0\">return the distance between geom1 and geom2</td></tr>");
        16063  +  html +=
        16064  +    wxT
        16065  +    ("<tr><td bgcolor=\"#fffff0\">HausdorffDistance( geom1 Geometry , geom2 Geometry ) : Double precision<hr>");
        16066  +  html +=
        16067  +    wxT
        16068  +    ("ST_HausdorffDistance( geom1 Geometry , geom2 Geometry ) : Double precision</td>");
        16069  +  html +=
        16070  +    wxT
        16071  +    ("<td bgcolor=\"#f0fff0\">return the Hausdorff Distance between geom1 and geom2</td></tr>");
        16072  +  html +=
        16073  +    wxT
        16074  +    ("<tr><td bgcolor=\"#fffff0\">PtDistWithin( geom1 Geometry , geom2 Geometry , range Double precision [ , use_spheroid Integer ] ) : Integer</td>");
        16075  +  html +=
        16076  +    wxT
        16077  +    ("<td bgcolor=\"#f0fff0\">checks if the distance between geom1 and geom2 is within the given range.<br>");
        16078  +  html +=
        16079  +    wxT
        16080  +    ("As a special case if both geoms are simple WGS84 POINTs (SRID=4326) distances are expessed in meters.</td></tr>");
        16081  +  html +=
        16082  +    wxT
        16083  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c41\">functions implementing spatial operators</a>");
        16084  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        16085  +  html +=
        16086  +    wxT
        16087  +    ("<tr><td bgcolor=\"#fffff0\">Intersection( geom1 Geometry , geom2 Geometry ) : Geometry<hr>");
        16088  +  html +=
        16089  +    wxT("ST_Intersection( geom1 Geometry , geom2 Geometry ) : Geometry</td>");
        16090  +  html +=
        16091  +    wxT
        16092  +    ("<td bgcolor=\"#f0fff0\">return a geometric object that is the intersection of geometric objects geom1 and geom2</td></tr>");
        16093  +  html +=
        16094  +    wxT
        16095  +    ("<tr><td bgcolor=\"#fffff0\">Difference( geom1 Geometry , geom2 Geometry ) : Geometry<hr>");
        16096  +  html +=
        16097  +    wxT("ST_Difference( geom1 Geometry , geom2 Geometry ) : Geometry</td>");
        16098  +  html +=
        16099  +    wxT
        16100  +    ("<td bgcolor=\"#f0fff0\">return a geometric object that is the closure of the set difference of geom1 and geom2</td></tr>");
        16101  +  html +=
        16102  +    wxT
        16103  +    ("<tr><td bgcolor=\"#fffff0\">GUnion( geom1 Geometry , geom2 Geometry ) : Geometry<hr>");
        16104  +  html += wxT("ST_Union( geom1 Geometry , geom2 Geometry ) : Geometry</td>");
        16105  +  html +=
        16106  +    wxT
        16107  +    ("<td bgcolor=\"#f0fff0\">return a geometric object that is the set union of geom1 and geom2</td></tr>");
        16108  +  html +=
        16109  +    wxT("<tr><td bgcolor=\"#fffff0\">GUnion( geom Geometry ) : Geometry<hr>");
        16110  +  html += wxT("ST_Union( geom Geometry ) : Geometry</td>");
        16111  +  html +=
        16112  +    wxT
        16113  +    ("<td bgcolor=\"#f0fff0\">return a geometric object that is the set union of input values<br>");
        16114  +  html += wxT("<b><u>aggregate function</u></b></td></tr>");
        16115  +  html +=
        16116  +    wxT
        16117  +    ("<tr><td bgcolor=\"#fffff0\">SymDifference( geom1 Geometry , geom2 Geometry ) : Geometry<hr>");
        16118  +  html +=
        16119  +    wxT("ST_SymDifference( geom1 Geometry , geom2 Geometry ) : Geometry</td>");
        16120  +  html +=
        16121  +    wxT
        16122  +    ("<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>");
        16123  +  html +=
        16124  +    wxT
        16125  +    ("<tr><td bgcolor=\"#fffff0\">Buffer( geom Geometry , dist Double precision ) : Geometry<hr>");
        16126  +  html +=
        16127  +    wxT("ST_Buffer( geom Geometry , dist Double precision ) : Geometry</td>");
        16128  +  html +=
        16129  +    wxT
        16130  +    ("<td bgcolor=\"#f0fff0\">return a geometric object defined by buffering a distance d around geom, ");
        16131  +  html +=
        16132  +    wxT
        16133  +    ("where dist is in the distance units for the Spatial Reference of geom</td></tr>");
        16134  +  html +=
        16135  +    wxT
        16136  +    ("<tr><td bgcolor=\"#fffff0\">ConvexHull( geom Geometry ) : Geometry<hr>");
        16137  +  html += wxT("ST_ConvexHull( geom Geometry ) : Geometry</td>");
        16138  +  html +=
        16139  +    wxT
        16140  +    ("<td bgcolor=\"#f0fff0\">return a geometric object that is the convex hull of geom</td></tr>");
        16141  +  html +=
        16142  +    wxT
        16143  +    ("<tr><td bgcolor=\"#fffff0\">OffsetCurve( geom Curve , radius Double precision, left_or_right Integer ) : Curve<hr>");
        16144  +  html +=
        16145  +    wxT
        16146  +    ("ST_OffsetCurve( geom Curve , radius Double precision, left_or_right Integer ) : Curve</td>");
        16147  +  html +=
        16148  +    wxT
        16149  +    ("<td bgcolor=\"#f0fff0\">return a geometric object representing the corresponding left- (or right-sided) offset curve<br>");
        16150  +  html +=
        16151  +    wxT
        16152  +    ("NULL if returned whenever is not possible deriving an offset curve from the original geometry<br>");
        16153  +  html +=
        16154  +    wxT("[a single not-closed LINESTRING is expected as input]</td></tr>");
        16155  +  html +=
        16156  +    wxT
        16157  +    ("<tr><td bgcolor=\"#fffff0\">SingleSidedBuffer( geom Curve , radius Double precision, left_or_right Integer ) : Curve<hr>");
        16158  +  html +=
        16159  +    wxT
        16160  +    ("ST_SingleSidedBuffer( geom Curve , radius Double precision, left_or_right Integer ) : Curve</td>");
        16161  +  html +=
        16162  +    wxT
        16163  +    ("<td bgcolor=\"#f0fff0\">return a geometric object representing the corresponding left- (or right-sided) single-sided buffer<br>");
        16164  +  html +=
        16165  +    wxT
        16166  +    ("NULL if returned whenever is not possible deriving a single-sided buffer from the original geometry<br>");
        16167  +  html +=
        16168  +    wxT("[a single not-closed LINESTRING is expected as input]</td></tr>");
        16169  +  html +=
        16170  +    wxT
        16171  +    ("<tr><td bgcolor=\"#fffff0\">SharedPaths( geom1 Geometry , geom2 Geometry ) : Geometry<hr>");
        16172  +  html +=
        16173  +    wxT("ST_SharedPaths( geom1 Geometry , geom2 Geometry ) : Geometry</td>");
        16174  +  html +=
        16175  +    wxT
        16176  +    ("<td bgcolor=\"#f0fff0\">return a geometric object (of the MULTILINESTRING type) representing any common edge shared by both geometries<br>");
        16177  +  html += wxT("NULL if returned is no common edge exists</td></tr>");
        16178  +  html +=
        16179  +    wxT
        16180  +    ("<tr><td bgcolor=\"#fffff0\">Line_Interpolate_Point( line Curve , fraction Double precision ) : Point<hr>");
        16181  +  html +=
        16182  +    wxT
        16183  +    ("ST_Line_Interpolate_Point( line Curve , fraction Double precision ) : Point</td>");
        16184  +  html +=
        16185  +    wxT
        16186  +    ("<td bgcolor=\"#f0fff0\">return a point interpolated along a line.<br>Second argument (between 0.0 and 1.0) representing fraction");
        16187  +  html += wxT("of total length of linestring the point has to be located.<br>");
        16188  +  html += wxT("NULL if returned for invalid arguments</td></tr>");
        16189  +  html +=
        16190  +    wxT
        16191  +    ("<tr><td bgcolor=\"#fffff0\">Line_Interpolate_Equidistant_Points( line Curve , distance Double precision ) : Point<hr>");
        16192  +  html +=
        16193  +    wxT
        16194  +    ("ST_Line_Interpolate_Equidistant_Points( line Curve , distance Double precision ) : Point</td>");
        16195  +  html +=
        16196  +    wxT
        16197  +    ("<td bgcolor=\"#f0fff0\">return a set of equidistant points interpolated along a line; the returned geometry ");
        16198  +  html +=
        16199  +    wxT
        16200  +    ("always corresponds to a MULTIPOINT supporting the M coordinate (representing the progressive distance for each interpolated Point).<br>");
        16201  +  html +=
        16202  +    wxT
        16203  +    ("Second argument represents the regular distance between interpolated points.<br>");
        16204  +  html += wxT("NULL if returned for invalid arguments</td></tr>");
        16205  +  html +=
        16206  +    wxT
        16207  +    ("<tr><td bgcolor=\"#fffff0\">Line_Locatate_Point( line Curve , point Point ) : Double precision<hr>");
        16208  +  html +=
        16209  +    wxT
        16210  +    ("ST_Line_Locate_Point( line Curve , point Point ) : Double precision</td>");
        16211  +  html +=
        16212  +    wxT
        16213  +    ("<td bgcolor=\"#f0fff0\">return a number (between 0.0 and 1.0) representing the location of the closest point on LineString");
        16214  +  html += wxT("to the given Point, as a fraction of total 2d line length.<br>");
        16215  +  html += wxT("NULL if returned for invalid arguments</td></tr>");
        16216  +  html +=
        16217  +    wxT
        16218  +    ("<tr><td bgcolor=\"#fffff0\">Line_Substring( line Curve , start_fraction Double precision , end_fraction Double precision ) : Curve<hr>");
        16219  +  html +=
        16220  +    wxT
        16221  +    ("ST_Line_Substring( line Curve , start_fraction Double precision , end_fraction Double precision ) : Curve</td>");
        16222  +  html +=
        16223  +    wxT
        16224  +    ("<td bgcolor=\"#f0fff0\">Return a Linestring being a substring of the input one starting and ending at the given fractions of total 2d length.<br>");
        16225  +  html +=
        16226  +    wxT
        16227  +    ("Second and third arguments are expected to be in the range between 0.0 and 1.0.<br>");
        16228  +  html += wxT("NULL if returned for invalid arguments</td></tr>");
        16229  +  html +=
        16230  +    wxT
        16231  +    ("<tr><td bgcolor=\"#fffff0\">ClosestPoint( geom1 Geometry , geom2 Geometry ) : Point<hr>");
        16232  +  html +=
        16233  +    wxT("ST_ClosestPoint( geom1 Geometry , geom2 Geometry ) : Point</td>");
        16234  +  html +=
        16235  +    wxT
        16236  +    ("<td bgcolor=\"#f0fff0\">Returns the Point on geom1 that is closest to geom2.<br>");
        16237  +  html +=
        16238  +    wxT
        16239  +    ("NULL is returned for invalid arguments (or if distance is ZERO)</td></tr>");
        16240  +  html +=
        16241  +    wxT
        16242  +    ("<tr><td bgcolor=\"#fffff0\">ShortestLine( geom1 Geometry , geom2 Geometry ) : Curve<hr>");
        16243  +  html +=
        16244  +    wxT("ST_ShortestLine( geom1 Geometry , geom2 Geometry ) : Curve</td>");
        16245  +  html +=
        16246  +    wxT
        16247  +    ("<td bgcolor=\"#f0fff0\">Returns the shortest line between two geometries.<br>");
        16248  +  html +=
        16249  +    wxT
        16250  +    ("NULL is returned for invalid arguments (or if distance is ZERO)</td></tr>");
        16251  +  html +=
        16252  +    wxT
        16253  +    ("<tr><td bgcolor=\"#fffff0\">Snap( geom1 Geometry , geom2 Geometry , tolerance Double precision ) : Geometry<hr>");
        16254  +  html +=
        16255  +    wxT
        16256  +    ("ST_Snap( geom1 Geometry , geom2 Geometry , tolerance Double precision ) : Geometry</td>");
        16257  +  html +=
        16258  +    wxT
        16259  +    ("<td bgcolor=\"#f0fff0\">Returns a new Geometry representing a modified geom1, so to \"snap\" vertices ");
        16260  +  html +=
        16261  +    wxT
        16262  +    ("and segments to geom2 vertices; a snap distance tolerance is used to control where snapping is performed.<br>");
        16263  +  html += wxT("NULL is returned for invalid arguments</td></tr>");
        16264  +  html +=
        16265  +    wxT
        16266  +    ("<tr><td bgcolor=\"#fffff0\">LineMerge( geom Geometry ) : Geometry<hr>");
        16267  +  html += wxT("ST_LineMerge( geom Geometry ) : Geometry</td>");
        16268  +  html +=
        16269  +    wxT
        16270  +    ("<td bgcolor=\"#f0fff0\">a Geometry (actually corresponding to a LINESTRING or MULTILINESTRING) will be returned.");
        16271  +  html +=
        16272  +    wxT
        16273  +    ("The input Geometry is expected to represent a LINESTRING or a MULTILINESTRING.<br>The input Geometry can be an ");
        16274  +  html +=
        16275  +    wxT
        16276  +    ("arbitrary collection of sparse line fragments: this function will then try to (possibly) reassemble them into one");
        16277  +  html += wxT("(or more) Linestring(s).<br>");
        16278  +  html += wxT("NULL is returned for invalid arguments</td></tr>");
        16279  +  html +=
        16280  +    wxT
        16281  +    ("<tr><td bgcolor=\"#fffff0\">UnaryUnion( geom Geometry ) : Geometry<hr>");
        16282  +  html += wxT("ST_UnaryUnion( geom Geometry ) : Geometry</td>");
        16283  +  html +=
        16284  +    wxT
        16285  +    ("<td bgcolor=\"#f0fff0\">Exactely the same as ST_Union, but applied to a single Geometry.<br>");
        16286  +  html +=
        16287  +    wxT
        16288  +    ("(set union of elementary Geometries within a MULTI- or GEOMETRYCOLLECTION complex Geometry).<br>");
        16289  +  html += wxT("NULL will be returned if any error is encountered</td></tr>");
        16290  +  html +=
        16291  +    wxT
        16292  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c42\">functions for coordinate transformations</a>");
        16293  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        16294  +  html +=
        16295  +    wxT
        16296  +    ("<tr><td bgcolor=\"#fffff0\">Transform( geom Geometry , newSRID Integer ) : Geometry<br>");
        16297  +  html +=
        16298  +    wxT("ST_Transform( geom Geometry , newSRID Integer ) : Geometry</td>");
        16299  +  html +=
        16300  +    wxT
        16301  +    ("<td bgcolor=\"#f0fff0\">return a geometric object obtained by reprojecting coordinates into the Reference System identified by newSRID</td></tr>");
        16302  +  html +=
        16303  +    wxT
        16304  +    ("<tr><td bgcolor=\"#fffff0\">SridFromAuthCRS( auth_name String , auth_SRID Integer ) : Integer</td>");
        16305  +  html +=
        16306  +    wxT
        16307  +    ("<td bgcolor=\"#f0fff0\">return the internal SRID corresponding to auth_name and auth_SRID<br>-1 will be returned if no such CRS is defined</td></tr>");
        16308  +  html +=
        16309  +    wxT
        16310  +    ("<tr><td bgcolor=\"#fffff0\">ShiftCoords( geom Geometry , shiftX Double precision , shiftY Double precision ) : Geometry<hr>");
        16311  +  html +=
        16312  +    wxT
        16313  +    ("ShiftCoordinates( geom Geometry , shiftX Double precision , shiftY Double precision ) : Geometry</td>");
        16314  +  html +=
        16315  +    wxT
        16316  +    ("<td bgcolor=\"#f0fff0\">return a geometric object obtained by translating coordinates according to shiftX and shiftY values</td></tr>");
        16317  +  html +=
        16318  +    wxT
        16319  +    ("<tr><td bgcolor=\"#fffff0\">ST_Translate( geom Geometry , shiftX Double precision , shiftY Double precision , shiftZ Double Precision ) : Geometry</td>");
        16320  +  html +=
        16321  +    wxT
        16322  +    ("<td bgcolor=\"#f0fff0\">return a geometric object obtained by translating coordinates according to shiftX, shiftY and shiftZ values</td></tr>");
        16323  +  html +=
        16324  +    wxT
        16325  +    ("<tr><td bgcolor=\"#fffff0\">ST_Shift_Longitude( geom Geometry ) : Geometry</td>");
        16326  +  html +=
        16327  +    wxT
        16328  +    ("<td bgcolor=\"#f0fff0\">return a geometric object obtained by translating any negative longitude by 360.<hr>");
        16329  +  html +=
        16330  +    wxT
        16331  +    ("Only meaningful for geographic (longitude/latitude) coordinates.</td></tr>");
        16332  +  html +=
        16333  +    wxT
        16334  +    ("<tr><td bgcolor=\"#fffff0\">NormalizeLonLat( geom Geometry ) : Geometry</td>");
        16335  +  html +=
        16336  +    wxT
        16337  +    ("<td bgcolor=\"#f0fff0\">return a geometric object obtained by normalizing any longitude in the range");
        16338  +  html += wxT("[-180 / +180] and any latitude in the range [-90 / + 90].<hr>");
        16339  +  html +=
        16340  +    wxT
        16341  +    ("Only meaningful for geographic (longitude/latitude) coordinates.</td></tr>");
        16342  +  html +=
        16343  +    wxT
        16344  +    ("<tr><td bgcolor=\"#fffff0\">ScaleCoords( geom Geometry , scaleX Double precision [ , scaleY Double precision ] ) : Geometry<hr>");
        16345  +  html +=
        16346  +    wxT
        16347  +    ("ScaleCoordinates( geom Geometry , scaleX Double precision [ , scaleY Double precision ] ) : Geometry</td>");
        16348  +  html +=
        16349  +    wxT
        16350  +    ("<td bgcolor=\"#f0fff0\">return a geometric object obtained by scaling coordinates according to scaleX and scaleY values<br>");
        16351  +  html +=
        16352  +    wxT
        16353  +    ("if only one scale factor is specified, then an isotropic scaling occurs [i.e. the same scale factor is applied to both axis]");
        16354  +  html +=
        16355  +    wxT
        16356  +    ("otherwise an anisotropic scaling occurs [i.e. each axis is scaled according to its own scale factor]</td></tr>");
        16357  +  html +=
        16358  +    wxT
        16359  +    ("<tr><td bgcolor=\"#fffff0\">RotateCoords( geom Geometry , angleInDegrees Double precision ) : Geometry<hr>");
        16360  +  html +=
        16361  +    wxT
        16362  +    ("RotateCoordinates( geom Geometry , angleInDegrees Double precision ) : Geometry</td>");
        16363  +  html +=
        16364  +    wxT
        16365  +    ("<td bgcolor=\"#f0fff0\">return a geometric object obtained by rotating coordinates according to angleInDegrees value<br>");
        16366  +  html += wxT("Positive angle = clockwise rotation</td></tr>");
        16367  +  html +=
        16368  +    wxT
        16369  +    ("<tr><td bgcolor=\"#fffff0\">ReflectCoords( geom Geometry , xAxis Integer , yAxis Integer ) : Geometry<hr>");
        16370  +  html +=
        16371  +    wxT
        16372  +    ("ReflectCoordinates( geom Geometry , xAxis Integer , yAxis Integer ) : Geometry</td>");
        16373  +  html +=
        16374  +    wxT
        16375  +    ("<td bgcolor=\"#f0fff0\">return a geometric object obtained by reflecting coordinates according to xAxis and yAxis switches<br>");
        16376  +  html +=
        16377  +    wxT
        16378  +    ("i.e. if xAxis is 0 (FALSE), then x-coordinates remains untouched; otherwise x-coordinates will be reflected</td></tr>");
        16379  +  html +=
        16380  +    wxT
        16381  +    ("<tr><td bgcolor=\"#fffff0\">SwapCoords( geom Geometry ) : Geometry<hr>SwapCoordinates( geom Geometry ) : Geometry</td>");
        16382  +  html +=
        16383  +    wxT
        16384  +    ("<td bgcolor=\"#f0fff0\">return a geometric object obtained by swapping x- and y-coordinates</td></tr>");
        16385  +  html +=
        16386  +    wxT
        16387  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c43\">functions for Spatial-MetaData and Spatial-Index handling</a>");
        16388  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        16389  +  html += wxT
        16390  +    ("<tr><td bgcolor=\"#fffff0\">InitSpatialMetaData( void ) : Integer<hr>");
        16391  +  html += wxT("InitSpatialMetaData( transaction Integer ) : Integer<hr>");
        16392  +  html += wxT("InitSpatialMetaData( mode String ) : Integer<hr>");
        16393  +  html +=
        16394  +    wxT
        16395  +    ("InitSpatialMetaData( transaction Integer , mode String ) : Integer</td>");
        16396  +  html +=
        16397  +    wxT
        16398  +    ("<td bgcolor=\"#f0fff0\">Creates the geometry_columns and spatial_ref_sys metadata tables");
        16399  +  html +=
        16400  +    wxT
        16401  +    ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE<hr>");
        16402  +  html +=
        16403  +    wxT
        16404  +    ("the first form (no args) will automatically populate spatial_ref_sys inserting any possible ESPG SRID definition<br>");
        16405  +  html +=
        16406  +    wxT
        16407  +    ("if the arg 'WGS84' (alias 'WGS84_ONLY') is specified, then only WGS84-releated EPSG SRIDs will be inserted<br>");
        16408  +  html +=
        16409  +    wxT
        16410  +    ("if the arg 'NONE' (alias 'EMPTY') is specified, no EPSG SRID will be inserted at all</td></tr>");
        16411  +  html +=
        16412  +    wxT
        16413  +    ("<tr><td bgcolor=\"#fffff0\">InsertEpsgSrid( srid <i>Integer</i> ) : Integer</td>");
        16414  +  html +=
        16415  +    wxT
        16416  +    ("<td bgcolor=\"#f0fff0\">Attempts to insert into spatial_ref_sys the EPSG definition uniquely identified by srid<br>");
        16417  +  html +=
        16418  +    wxT
        16419  +    ("[the corresponding EPSG SRID definition will be copied from the inlined dataset defined in libspatialite<hr>");
        16420  +  html +=
        16421  +    wxT
        16422  +    ("the return type is Integer, with a return value of 1 for success or 0 for failure</td></tr>");
        16423  +  html +=
        16424  +    wxT
        16425  +    ("<tr><td bgcolor=\"#fffff0\">AddGeometryColumn( table String , column String , srid Integer , geom_type String , dimension String [ , not_null Integer ] ) : Integer</td>");
        16426  +  html +=
        16427  +    wxT
        16428  +    ("<td bgcolor=\"#f0fff0\">Creates a new geometry column updating the Spatial Metadata tables and creating any required trigger in order to enforce constraints<br>");
        16429  +  html +=
        16430  +    wxT
        16431  +    ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>");
        16432  +  html +=
        16433  +    wxT
        16434  +    ("<tr><td bgcolor=\"#fffff0\">RecoverGeometryColumn( table String , column String , srid Integer , geom_type String , dimension String ) : Integer</td>");
        16435  +  html +=
        16436  +    wxT
        16437  +    ("<td bgcolor=\"#f0fff0\">Validates an existing ordinary column in order to possibly transform it in a real geometry column, ");
        16438  +  html +=
        16439  +    wxT
        16440  +    ("thus updating the Spatial Metadata tables and creating any required trigger in order to enforce constraints<br>");
        16441  +  html +=
        16442  +    wxT
        16443  +    ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>");
        16444  +  html +=
        16445  +    wxT
        16446  +    ("<tr><td bgcolor=\"#fffff0\">DiscardGeometryColumn( table String , column String ) : Integer</td>");
        16447  +  html +=
        16448  +    wxT
        16449  +    ("<td bgcolor=\"#f0fff0\">Removes a geometry column from Spatial MetaData tables and drops any related trigger<br>");
        16450  +  html +=
        16451  +    wxT
        16452  +    ("the column itself still continues to exist untouched as an ordinary, unconstrained column<br>");
        16453  +  html +=
        16454  +    wxT
        16455  +    ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>");
        16456  +  html +=
        16457  +    wxT
        16458  +    ("<tr><td bgcolor=\"#fffff0\">RegisterVirtualGeometry( table String ) : Integer</td>");
        16459  +  html +=
        16460  +    wxT
        16461  +    ("<td bgcolor=\"#f0fff0\">Registers a VirtualShape table into Spatial MetaData tables; the VirtualShape table should be already created in some previous step.<br>");
        16462  +  html +=
        16463  +    wxT
        16464  +    ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>");
        16465  +  html +=
        16466  +    wxT
        16467  +    ("<tr><td bgcolor=\"#fffff0\">DropVirtualGeometry( table String ) : Integer</td>");
        16468  +  html +=
        16469  +    wxT
        16470  +    ("<td bgcolor=\"#f0fff0\">Removes a VirtualShape table from Spatial MetaData tables, dropping the VirtualShape table as well.<br>");
        16471  +  html +=
        16472  +    wxT
        16473  +    ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>");
        16474  +  html +=
        16475  +    wxT
        16476  +    ("<tr><td bgcolor=\"#fffff0\">CreateSpatialIndex( table String , column String ) : Integer</td>");
        16477  +  html +=
        16478  +    wxT
        16479  +    ("<td bgcolor=\"#f0fff0\">Builds an RTree Spatial Index on a geometry column, ");
        16480  +  html +=
        16481  +    wxT
        16482  +    ("creating any required trigger required in order to enforce full data coherency between the main table and Spatial Index<br>");
        16483  +  html +=
        16484  +    wxT
        16485  +    ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>");
        16486  +  html +=
        16487  +    wxT
        16488  +    ("<tr><td bgcolor=\"#fffff0\">DisableSpatialIndex( table String , column String ) : Integer</td>");
        16489  +  html +=
        16490  +    wxT
        16491  +    ("<td bgcolor=\"#f0fff0\">Disables an RTree Spatial Index, removing any related trigger<br>");
        16492  +  html +=
        16493  +    wxT
        16494  +    ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>");
        16495  +  html +=
        16496  +    wxT
        16497  +    ("<tr><td bgcolor=\"#fffff0\">CheckShadowedRowid( table String ) : Integer</td>");
        16498  +  html +=
        16499  +    wxT
        16500  +    ("<td bgcolor=\"#f0fff0\">Checks if some table has a physical column named \"rowid\" (caseless) shadowing the real ROWID.<br>");
        16501  +  html +=
        16502  +    wxT
        16503  +    ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>");
        16504  +  html +=
        16505  +    wxT("<tr><td bgcolor=\"#fffff0\">CheckSpatialIndex( void ) : Integer<hr>");
        16506  +  html +=
        16507  +    wxT("CheckSpatialIndex( table String , column String ) : Integer</td>");
        16508  +  html +=
        16509  +    wxT
        16510  +    ("<td bgcolor=\"#f0fff0\">Checks an RTree Spatial Index for validity and consistency<br>");
        16511  +  html +=
        16512  +    wxT
        16513  +    ("- if no arguments are passed, then any RTree defined into geometry_columns will be checked<br>");
        16514  +  html +=
        16515  +    wxT
        16516  +    ("- otherwise only the RTree corresponding to table and column will be checked<br>");
        16517  +  html +=
        16518  +    wxT
        16519  +    ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>");
        16520  +  html +=
        16521  +    wxT
        16522  +    ("<tr><td bgcolor=\"#fffff0\">RecoverSpatialIndex( [ no_check Integer ] ) : Integer<hr>");
        16523  +  html +=
        16524  +    wxT
        16525  +    ("RecoverSpatialIndex( table String , column String [ , no_check Integer ] ) : Integer</td>");
        16526  +  html +=
        16527  +    wxT
        16528  +    ("<td bgcolor=\"#f0fff0\">Recovers a (possibly broken) RTree Spatial Index<br>");
        16529  +  html +=
        16530  +    wxT
        16531  +    ("- if no arguments are passed, then any RTree defined into geometry_columns will be recovered<br>");
        16532  +  html +=
        16533  +    wxT
        16534  +    ("- otherwise only the RTree corresponding to table and column will be recovered<br>");
        16535  +  html +=
        16536  +    wxT("- the optional argument no_check will be interpreted as follows:<br>");
        16537  +  html +=
        16538  +    wxT
        16539  +    ("&nbsp;&nbsp;* if no_check = FALSE (default) the RTree will be checked first: ");
        16540  +  html += wxT("and only an invalid RTree will be then actually rebuilt<br>");
        16541  +  html +=
        16542  +    wxT
        16543  +    ("&nbsp;&nbsp;* if no_check = TRUE the RTree will be unconditionally rebuilt from scratch anyway<br>");
        16544  +  html +=
        16545  +    wxT
        16546  +    ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>");
        16547  +  html +=
        16548  +    wxT
        16549  +    ("<tr><td bgcolor=\"#fffff0\">InvalidateLayerStatistics( void ) : Integer<hr>");
        16550  +  html +=
        16551  +    wxT
        16552  +    ("InvalidateLayerStatistics( table String [, column String ] ) : Integer</td>");
        16553  +  html +=
        16554  +    wxT
        16555  +    ("<td bgcolor=\"#f0fff0\">Immediately and unconditionally invalidates the internal Layer Statistics<br>");
        16556  +  html +=
        16557  +    wxT
        16558  +    ("- if no arguments are passed, then internal statics will be invalidated for any possible Geometry Column ");
        16559  +  html += wxT("defined in the current DB<br>");
        16560  +  html +=
        16561  +    wxT
        16562  +    ("- otherwise statistics will be invalidated only for Geometry Columns corresponding to the given table<br>");
        16563  +  html +=
        16564  +    wxT
        16565  +    ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>");
        16566  +  html +=
        16567  +    wxT
        16568  +    ("<tr><td bgcolor=\"#fffff0\">UpdateLayerStatistics( void ) : Integer<hr>");
        16569  +  html +=
        16570  +    wxT
        16571  +    ("UpdateLayerStatistics( table String [, column String ] ) : Integer</td>");
        16572  +  html +=
        16573  +    wxT
        16574  +    ("<td bgcolor=\"#f0fff0\">Updates the internal Layer Statistics [Feature Count and Total Extent]<br>");
        16575  +  html +=
        16576  +    wxT
        16577  +    ("- if no arguments are passed, then internal statics will be updated for any possible Geometry Column ");
        16578  +  html += wxT("defined in the current DB<br>");
        16579  +  html +=
        16580  +    wxT
        16581  +    ("- otherwise statistics will be updated only for Geometry Columns corresponding to the given table<br>");
        16582  +  html +=
        16583  +    wxT
        16584  +    ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>");
        16585  +  html +=
        16586  +    wxT
        16587  +    ("<tr><td bgcolor=\"#fffff0\">GetLayerExtent( table String [ , column String [ , mode Boolean] ] ) : Geometry</td>");
        16588  +  html +=
        16589  +    wxT
        16590  +    ("<td bgcolor=\"#f0fff0\">Return the Envelope corresponding to the Total Extent of some Layer; ");
        16591  +  html +=
        16592  +    wxT
        16593  +    ("if the Table/Layer only contains a single Geometry column passing the column name isn't strictly required.<br>");
        16594  +  html +=
        16595  +    wxT
        16596  +    ("NULL will be returned if any error occurs or if the required table isn't a Layer.</td></tr>");
        16597  +  html +=
        16598  +    wxT
        16599  +    ("<tr><td bgcolor=\"#fffff0\">CreateTopologyTables( SRID Integer , dims String ) : Integer<hr>");
        16600  +  html +=
        16601  +    wxT
        16602  +    ("CreateTopologyTables( prefix String , SRID Integer , dims String ) : Integer</td>");
        16603  +  html +=
        16604  +    wxT("<td bgcolor=\"#f0fff0\">Creates a set of <b>Topology</b> tables.<br>");
        16605  +  html +=
        16606  +    wxT
        16607  +    ("<ul><li>the SRIDargument is mandatory</li><li>the dims argument must be 'XY' or 'XYZ': 2 or 3 are valid aliases</li>");
        16608  +  html +=
        16609  +    wxT
        16610  +    ("<li>the optionalargument prefix can be used to support more Topology sets on the same DB: ");
        16611  +  html +=
        16612  +    wxT
        16613  +    ("if omitted a \"topo_\" prefix will be assumed by default</li></ul><hr>");
        16614  +  html +=
        16615  +    wxT
        16616  +    ("the return type is Integer, with a return value of 1 for TRUE (success) or 0 for FALSE (failure).</td></tr>");
        16617  +  html +=
        16618  +    wxT
        16619  +    ("<tr><td bgcolor=\"#fffff0\">CreateRasterCoveragesTable( void ) : Integer</td>");
        16620  +  html +=
        16621  +    wxT
        16622  +    ("<td bgcolor=\"#f0fff0\">Creates the <b>raster_coverages</b> table required by RasterLite-2<hr>");
        16623  +  html +=
        16624  +    wxT
        16625  +    ("the return type is Integer, with a return value of 1 for TRUE (success) or 0 for FALSE (failure).</td></tr>");
        16626  +  html +=
        16627  +    wxT
        16628  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c43metacatalog\">functions for MetaCatalog and related Statistics</a>");
        16629  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        16630  +  html +=
        16631  +    wxT
        16632  +    ("<tr><td bgcolor=\"#fffff0\">CreateMetaCatalogTables( transaction Integer ) : Integer</td>");
        16633  +  html +=
        16634  +    wxT
        16635  +    ("<td bgcolor=\"#f0fff0\">Creates both <b>splite_metacatalog</b> and <b>splite_metacatalog_statistics</b> tables; ");
        16636  +  html +=
        16637  +    wxT
        16638  +    ("<i>splite_metacatalog</i> will be populated so to describe every table/column currently defined within the DB.<br>");
        16639  +  html +=
        16640  +    wxT
        16641  +    ("the return type is Integer, with a return value of 1 for TRUE (success) or 0 for FALSE</td></tr>");
        16642  +  html +=
        16643  +    wxT
        16644  +    ("<tr><td bgcolor=\"#fffff0\">UpdateMetaCatalogTables( transaction Integer , table_name String, column_name String ) : Integer</hr>");
        16645  +  html +=
        16646  +    wxT
        16647  +    ("UpdateMetaCatalogTables( transaction Integer , master_table String , table_name String, column_name String ) : Integer</td>");
        16648  +  html +=
        16649  +    wxT
        16650  +    ("<td bgcolor=\"#f0fff0\">Updates the <b>splite_metacatalog_statistics</b> table by computing the statistic summary for the required table/column.<br>");
        16651  +  html +=
        16652  +    wxT
        16653  +    ("the second form (four args) will use a MasterTable in order to identify all table/columns to be updated.<br>");
        16654  +  html +=
        16655  +    wxT
        16656  +    ("the return type is Integer, with a return value of 1 for TRUE (success) or 0 for FALSE</td></tr>");
        16657  +  html +=
        16658  +    wxT
        16659  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c43style\">functions supporting SLD/SE Styled Layers</a>");
        16660  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        16661  +  html +=
        16662  +    wxT("<tr><td bgcolor=\"#fffff0\">CreateStylingTables( ) : Integer<hr>");
        16663  +  html += wxT("CreateStylingTables( relaxed Integer ) : Integer</td>");
        16664  +  html +=
        16665  +    wxT
        16666  +    ("<td bgcolor=\"#f0fff0\">Creates a set of tables supporting <b>SLD/SE Styled Layers</b>.<br>");
        16667  +  html +=
        16668  +    wxT
        16669  +    ("the return type is Integer, with a return value of 1 for TRUE (success) or 0 for FALSE ");
        16670  +  html += wxT("(failure): -1 will be returned on invalid arguments.</td></tr>");
        16671  +  html +=
        16672  +    wxT
        16673  +    ("<tr><td bgcolor=\"#fffff0\">RegisterExternalGraphic( xlink_href String , resource BLOB ) : Integer<hr>");
        16674  +  html +=
        16675  +    wxT
        16676  +    ("RagisterExternalGraphic( xlink_href String , resource BLOB , title String , abstract String , file_name String ) : Integer</td>");
        16677  +  html +=
        16678  +    wxT
        16679  +    ("<td bgcolor=\"#f0fff0\">Inserts (or updates) an <b>External Graphic Resource</b>.<br>");
        16680  +  html +=
        16681  +    wxT
        16682  +    ("the return type is Integer, with a return value of 1 for TRUE (success) or 0 for FALSE ");
        16683  +  html += wxT("(failure): -1 will be returned on invalid arguments.</td></tr>");
        16684  +  html +=
        16685  +    wxT
        16686  +    ("<tr><td bgcolor=\"#fffff0\">RegisterVectorStyledLayer( f_table_name String , f_geometry_column String , style BLOB ) : Integer<hr>");
        16687  +  html +=
        16688  +    wxT
        16689  +    ("RegisterVectorStyledLayer( f_table_name String , f_geometry_column String , style_id Integer , style BLOB ) : Integer</td>");
        16690  +  html +=
        16691  +    wxT
        16692  +    ("<td bgcolor=\"#f0fff0\">Inserts (or updates) a <b>Vector Styled Layer</b> definition.<br>");
        16693  +  html +=
        16694  +    wxT
        16695  +    ("the return type is Integer, with a return value of 1 for TRUE (success) or 0 for FALSE ");
        16696  +  html += wxT("(failure): -1 will be returned on invalid arguments.</td></tr>");
        16697  +  html +=
        16698  +    wxT
        16699  +    ("<tr><td bgcolor=\"#fffff0\">RegisterRasterStyledLayer( coverage_name String , style BLOB ) : Integer<hr>");
        16700  +  html +=
        16701  +    wxT
        16702  +    ("RegisterRasterStyledLayer( coverage_name String , style_id Integer , style BLOB ) : Integer</td>");
        16703  +  html +=
        16704  +    wxT
        16705  +    ("<td bgcolor=\"#f0fff0\">Inserts (or updates) a <b>Raster Styled Layer</b> definition.<br>");
        16706  +  html +=
        16707  +    wxT
        16708  +    ("the return type is Integer, with a return value of 1 for TRUE (success) or 0 for FALSE ");
        16709  +  html += wxT("(failure): -1 will be returned on invalid arguments.</td></tr>");
        16710  +  html +=
        16711  +    wxT
        16712  +    ("<tr><td bgcolor=\"#fffff0\">RegisterStyledGroup( group_name String , f_table_name String , f_geometry_colum String [ , paint_order Integer ] ) : Integer<hr>");
        16713  +  html +=
        16714  +    wxT
        16715  +    ("RegisterStyledGroup( group_name String, coverage_name String [ , paint_order Integer ] ) : Integer</td>");
        16716  +  html +=
        16717  +    wxT
        16718  +    ("<td bgcolor=\"#f0fff0\">Inserts (or updates) a <b>Styled Group</b> definition.<br>");
        16719  +  html +=
        16720  +    wxT
        16721  +    ("the return type is Integer, with a return value of 1 for TRUE (success) or 0 for FALSE ");
        16722  +  html += wxT("(failure): -1 will be returned on invalid arguments.</td></tr>");
        16723  +  html +=
        16724  +    wxT
        16725  +    ("<tr><td bgcolor=\"#fffff0\">SetStyledGroupInfos( group_name String , title String , abstract String ) : Integer</td>");
        16726  +  html +=
        16727  +    wxT
        16728  +    ("<td bgcolor=\"#f0fff0\">Inserts (or updates) the descriptive infos associated to a <b>Styled Group</b><br>");
        16729  +  html +=
        16730  +    wxT
        16731  +    ("the return type is Integer, with a return value of 1 for TRUE (success) or 0 for FALSE ");
        16732  +  html += wxT("(failure): -1 will be returned on invalid arguments.</td></tr>");
        16733  +  html +=
        16734  +    wxT
        16735  +    ("<tr><td bgcolor=\"#fffff0\">RegisterGroupStyle( group_name String , style BLOB ) : Integer<hr>");
        16736  +  html +=
        16737  +    wxT
        16738  +    ("RegisterGroupStyle( group_name String , style_id Integer , style BLOB ) : Integer</td>");
        16739  +  html +=
        16740  +    wxT
        16741  +    ("<td bgcolor=\"#f0fff0\">Inserts (or updates) a <b>Group Style</b> definition.<br>");
        16742  +  html +=
        16743  +    wxT
        16744  +    ("the return type is Integer, with a return value of 1 for TRUE (success) or 0 for FALSE ");
        16745  +  html += wxT("(failure): -1 will be returned on invalid arguments.</td></tr>");
        16746  +  html +=
        16747  +    wxT
        16748  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c43isometa\">functions implementing ISO Metadata</a>");
        16749  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        16750  +  html +=
        16751  +    wxT("<tr><td bgcolor=\"#fffff0\">CreateIsoMetadataTables( ) : Integer<hr>");
        16752  +  html += wxT("CreateIsoMetadataTables( relaxed Integer ) : Integer</td>");
        16753  +  html +=
        16754  +    wxT
        16755  +    ("<td bgcolor=\"#f0fff0\">Creates a set of tables supporting <b>ISO Metadata</b>.<br>");
        16756  +  html +=
        16757  +    wxT
        16758  +    ("the return type is Integer, with a return value of 1 for TRUE (success) or 0 for FALSE ");
        16759  +  html += wxT("(failure): -1 will be returned on invalid arguments.</td></tr>");
        16760  +  html +=
        16761  +    wxT
        16762  +    ("<tr><td bgcolor=\"#fffff0\">RegisterIsoMetadata( scope String , metadata BLOB ) : Integer<hr>");
        16763  +  html +=
        16764  +    wxT
        16765  +    ("RegisterIsoMetadata( scope String , metadata BLOB , id Integer ) : Integer<hr>");
        16766  +  html +=
        16767  +    wxT
        16768  +    ("RagisterIsoMetadata( scope String , metadata BLOB , fileIdentifier String ) : Integer</td>");
        16769  +  html +=
        16770  +    wxT
        16771  +    ("<td bgcolor=\"#f0fff0\">Inserts (or updates) an <b>ISO Metadata</b> definition.<br>");
        16772  +  html +=
        16773  +    wxT
        16774  +    ("The first form (two arguments only) always performs an INSERT; if one the optional arguments \"id\" or \"fileIdentifier\" an UPDATE could be eventually performed if a corresponding metadata row is already defined.<br>");
        16775  +  html +=
        16776  +    wxT
        16777  +    ("the return type is Integer, with a return value of 1 for TRUE (success) or 0 for FALSE ");
        16778  +  html += wxT("(failure): -1 will be returned on invalid arguments.</td></tr>");
        16779  +  html +=
        16780  +    wxT
        16781  +    ("<tr><td bgcolor=\"#fffff0\">GetIsoMetadataId( fileIdentifier String ) : Integer</td>");
        16782  +  html +=
        16783  +    wxT
        16784  +    ("<td bgcolor=\"#f0fff0\">Return the unique \"id\" corresponding to the ISO Metadata definition identified by <b>fileIdentifier</b>.<hr>");
        16785  +  html +=
        16786  +    wxT
        16787  +    ("If no corresponding ISO Metadata definition exists, this function will always return ZERO; -1 will be returned for invalid arguments.</td></tr>");
        16788  +  html +=
        16789  +    wxT
        16790  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c43fdo\">functions implementing FDO/OGR compatibily</a>");
        16791  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        16792  +  html +=
        16793  +    wxT
        16794  +    ("<tr><td bgcolor=\"#fffff0\">CheckSpatialMetaData( void ) : Integer</td>");
        16795  +  html +=
        16796  +    wxT
        16797  +    ("<td bgcolor=\"#f0fff0\">Checks the Spatial Metadata type, then returning:<br>");
        16798  +  html +=
        16799  +    wxT
        16800  +    ("<b>0</b> if the <i>geometry_columns</i> and <i>spatial_ref_sys</i> table does not exist, ");
        16801  +  html +=
        16802  +    wxT
        16803  +    ("or if their actual layout doesn't corresponds to any known implementation<br>");
        16804  +  html +=
        16805  +    wxT
        16806  +    ("<b>1</b> if both tables exist, and their layout is the one used by <i>SpatiaLite legacy</i> (older versions including 3.0.1)<br>");
        16807  +  html +=
        16808  +    wxT
        16809  +    ("<b>2</b> if both tables exist, and their layout is the one used by <i>FDO/OGR</i><br>");
        16810  +  html +=
        16811  +    wxT
        16812  +    ("<b>3</b> if both tables exist, and their layout is the one currently used by <i>SpatiaLite</i> (3.1.0 or any subsequent version)</td></tr>");
        16813  +  html +=
        16814  +    wxT("<tr><td bgcolor=\"#fffff0\">AutoFDOStart( void ) : Integer</td>");
        16815  +  html +=
        16816  +    wxT
        16817  +    ("<td bgcolor=\"#f0fff0\">This function will inspect the Spatial Metadata, then automatically creating/refreshing a <i>VirtualFDO</i>");
        16818  +  html +=
        16819  +    wxT
        16820  +    (" wrapper for each FDO/OGR geometry table<br>the return type is Integer [how many VirtualFDO tables have been created]</td></tr>");
        16821  +  html += wxT("<tr><td bgcolor=\"#fffff0\">AutoFDOStop( void ) : Integer</td>");
        16822  +  html +=
        16823  +    wxT
        16824  +    ("<td bgcolor=\"#f0fff0\">This function will inspect the Spatial Metadata, then automatically destroying any <i>VirtualFDO</i>");
        16825  +  html +=
        16826  +    wxT
        16827  +    (" wrapper found<br>the return type is Integer [how many VirtualFDO tables have been destroyed]</td></tr>");
        16828  +  html +=
        16829  +    wxT
        16830  +    ("<tr><td bgcolor=\"#fffff0\">InitFDOSpatialMetaData( void ) : Integer</td>");
        16831  +  html +=
        16832  +    wxT
        16833  +    ("<td bgcolor=\"#f0fff0\">Creates the geometry_columns and spatial_ref_sys metadata tables");
        16834  +  html +=
        16835  +    wxT
        16836  +    ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE<br>");
        16837  +  html +=
        16838  +    wxT
        16839  +    ("<u>Please note:</u> Spatial Metadata created using this function will have the FDO/OGR layout, and not the SpatiaLite's own</td></tr>");
        16840  +  html +=
        16841  +    wxT
        16842  +    ("<tr><td bgcolor=\"#fffff0\">AddFDOGeometryColumn( table String , column String , srid Integer , geom_type String , dimension Integer , geometry_type String ) : Integer</td>");
        16843  +  html +=
        16844  +    wxT
        16845  +    ("<td bgcolor=\"#f0fff0\">Creates a new geometry column updating the FDO/OGR Spatial Metadata tables<br>");
        16846  +  html +=
        16847  +    wxT
        16848  +    ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>");
        16849  +  html +=
        16850  +    wxT
        16851  +    ("<tr><td bgcolor=\"#fffff0\">RecoverFDOGeometryColumn( table String , column String , srid Integer , geom_type String , dimension Integer , geometry_type String ) : Integer</td>");
        16852  +  html +=
        16853  +    wxT
        16854  +    ("<td bgcolor=\"#f0fff0\">Validates an existing ordinary column in order to possibly transform it in a real geometry column, ");
        16855  +  html += wxT("thus updating the FDO/OGR Spatial Metadata tables<br>");
        16856  +  html +=
        16857  +    wxT
        16858  +    ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>");
        16859  +  html +=
        16860  +    wxT
        16861  +    ("<tr><td bgcolor=\"#fffff0\">DiscardFDOGeometryColumn( table String , column String ) : Integer</td>");
        16862  +  html +=
        16863  +    wxT
        16864  +    ("<td bgcolor=\"#f0fff0\">Removes a geometry column from FDO/OGR Spatial MetaData tables<br>");
        16865  +  html +=
        16866  +    wxT
        16867  +    ("the column itself still continues to exist untouched as an ordinary column<br>");
        16868  +  html +=
        16869  +    wxT
        16870  +    ("the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>");
        16871  +  html +=
        16872  +    wxT
        16873  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c44\">functions for MbrCache-based queries</a>");
        16874  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        16875  +  html +=
        16876  +    wxT
        16877  +    ("<tr><td bgcolor=\"#fffff0\">FilterMbrWithin( x1 Double precision , y1 Double precision , x2 Double precision , y2 Double precision  ) : Integer</td>");
        16878  +  html +=
        16879  +    wxT
        16880  +    ("<td bgcolor=\"#f0fff0\">Retrieves from an MbrCache any entity whose MBR falls within");
        16881  +  html +=
        16882  +    wxT
        16883  +    (" the rectangle identified by extreme points x1 y1 and x2 y2</td></tr>");
        16884  +  html +=
        16885  +    wxT
        16886  +    ("<tr><td bgcolor=\"#fffff0\">FilterMbrContains( x1 Double precision , y1 Double precision , x2 Double precision , y2 Double precision  ) : Integer</td>");
        16887  +  html +=
        16888  +    wxT
        16889  +    ("<td bgcolor=\"#f0fff0\">Retrieves from an MbrCache any entity whose MBR contains");
        16890  +  html +=
        16891  +    wxT
        16892  +    (" the rectangle identified by extreme points x1 y1 and x2 y2</td></tr>");
        16893  +  html +=
        16894  +    wxT
        16895  +    ("<tr><td bgcolor=\"#fffff0\">FilterMbrIntersects( x1 Double precision , y1 Double precision , x2 Double precision , y2 Double precision  ) : Integer</td>");
        16896  +  html +=
        16897  +    wxT
        16898  +    ("<td bgcolor=\"#f0fff0\">Retrieves from an MbrCache any entity whose MBR intersects");
        16899  +  html +=
        16900  +    wxT
        16901  +    (" the rectangle identified by extreme points x1 y1 and x2 y2</td></tr>");
        16902  +  html +=
        16903  +    wxT
        16904  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"c45\">functions for R*Tree-based queries (Geometry Callbacks)</a>");
        16905  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        16906  +  html +=
        16907  +    wxT
        16908  +    ("<tr><td bgcolor=\"#fffff0\">RTreeWithin( x1 Double precision , y1 Double precision , x2 Double precision , y2 Double precision  ) : Integer</td>");
        16909  +  html +=
        16910  +    wxT
        16911  +    ("<td bgcolor=\"#f0fff0\">*DEPRECATED* (alias-name for RTreeIntersects)</td></tr>");
        16912  +  html +=
        16913  +    wxT
        16914  +    ("<tr><td bgcolor=\"#fffff0\">RTreeContains( x1 Double precision , y1 Double precision , x2 Double precision , y2 Double precision  ) : Integer</td>");
        16915  +  html +=
        16916  +    wxT
        16917  +    ("<td bgcolor=\"#f0fff0\">*DEPRECATED* (alias-name for RTreeIntersects)</td></tr>");
        16918  +  html +=
        16919  +    wxT
        16920  +    ("<tr><td bgcolor=\"#fffff0\">RTreeIntersects( x1 Double precision , y1 Double precision , x2 Double precision , y2 Double precision  ) : Integer</td>");
        16921  +  html +=
        16922  +    wxT
        16923  +    ("<td bgcolor=\"#f0fff0\">Retrieves from an R*Tree any entity whose MBR intersects");
        16924  +  html +=
        16925  +    wxT
        16926  +    (" the rectangle identified by extreme points x1 y1 and x2 y2</td></tr>");
        16927  +  html +=
        16928  +    wxT
        16929  +    ("<tr><td bgcolor=\"#fffff0\">RTreeDistWithin( x Double precision , y Double precision , radius Double precision ) : Integer</td>");
        16930  +  html +=
        16931  +    wxT
        16932  +    ("<td bgcolor=\"#f0fff0\">Retrieves from an R*Tree any entity whose MBR intersects");
        16933  +  html +=
        16934  +    wxT
        16935  +    (" the square square circumscribed on the given circle  (x y center, radius)</td></tr>");
        16936  +  html +=
        16937  +    wxT
        16938  +    ("<tr><td align=\"center\" bgcolor=\"#e0ffe0\" colspan=\"2\"><a name=\"xmlBlob\">SQL functions supporting XmlBLOB</a>");
        16939  +  html += wxT("<br><a href=\"#index\">back to index</a></td></tr>");
        16940  +  html +=
        16941  +    wxT
        16942  +    ("<tr><td bgcolor=\"#fffff0\">XB_Create( xmlPayload BLOB ) : XmlBLOB<hr>");
        16943  +  html +=
        16944  +    wxT("XB_Create( xmlPayload BLOB , compressed Boolean  ) : XmlBLOB<hr>");
        16945  +  html +=
        16946  +    wxT
        16947  +    ("XB_Create( xmlPayload BLOB , compressed Boolean ,  schemaURI Text ) : XmlBLOB<hr>");
        16948  +  html +=
        16949  +    wxT
        16950  +    ("XB_Create( xmlPayload BLOB , compressed Boolean , internalSchemaURI Boolean  ) : XmlBLOB</td>");
        16951  +  html +=
        16952  +    wxT
        16953  +    ("<td bgcolor=\"#f0fff0\">Construct an XmlBLOB object starting from an XmlDocument.<hr>");
        16954  +  html +=
        16955  +    wxT
        16956  +    ("NULL will be returned for not well-formed XmlDocuments, or when XML validation is required but XmlDocument fails to pass validation for any reason.</td></tr>");
        16957  +  html +=
        16958  +    wxT
        16959  +    ("<tr><td bgcolor=\"#fffff0\">XB_GetPayload( xmlObject BLOB [ , indent Integer ]  ) : String</td>");
        16960  +  html +=
        16961  +    wxT
        16962  +    ("<td bgcolor=\"#f0fff0\">Extracts a generic BLOB from an XmlBLOB object, exactly corresponding to the original XmlDocument and fully preserving the original character encoding.</td></tr>");
        16963  +  html +=
        16964  +    wxT
        16965  +    ("<tr><td bgcolor=\"#fffff0\">XB_GetDocument( xmlObject BLOB [ , indent Integer ]  ) : String</td>");
        16966  +  html +=
        16967  +    wxT
        16968  +    ("<td bgcolor=\"#f0fff0\">Extracts an XmlDocument from an XmlBLOB object; the returned XmlDocument will always be UTF-8 encoded (TEXT), irrespectively from the original internal encoding declaration.</td></tr>");
        16969  +  html +=
        16970  +    wxT
        16971  +    ("<tr><td bgcolor=\"#fffff0\">XB_SchemaValidate( xmlObject BLOB , schemaURI Text  [ , compressed Boolean ]  ) : XmlBLOB<hr>");
        16972  +  html +=
        16973  +    wxT
        16974  +    ("XB_SchemaValidate( xmlObject BLOB , internalSchemaURI Boolean  [ , compressed Boolean ]  ) : XmlBLOB</td>");
        16975  +  html +=
        16976  +    wxT
        16977  +    ("<td bgcolor=\"#f0fff0\">Construct an XML validated XmlBLOB object starting from an XmlDocument.<hr>");
        16978  +  html +=
        16979  +    wxT
        16980  +    ("NULL will be returned if the input XmlBLOB fails to pass validation for any reason.</td></tr>");
        16981  +  html +=
        16982  +    wxT
        16983  +    ("<tr><td bgcolor=\"#fffff0\">XB_Compress( xmlObject BLOB ) : XmlBLOB</td>");
        16984  +  html +=
        16985  +    wxT
        16986  +    ("<td bgcolor=\"#f0fff0\">A new compressed XmlBLOB object will be returned.</td></tr>");
        16987  +  html +=
        16988  +    wxT
        16989  +    ("<tr><td bgcolor=\"#fffff0\">XB_Uncompress( xmlObject BLOB ) : XmlBLOB</td>");
        16990  +  html +=
        16991  +    wxT
        16992  +    ("<td bgcolor=\"#f0fff0\">A new uncompressed XmlBLOB object will be returned.</td></tr>");
        16993  +  html +=
        16994  +    wxT
        16995  +    ("<tr><td bgcolor=\"#fffff0\">XB_IsValid( xmlObject BLOB ) : Integer</td>");
        16996  +  html +=
        16997  +    wxT
        16998  +    ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, ");
        16999  +  html +=
        17000  +    wxT
        17001  +    ("and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.</td></tr>");
        17002  +  html +=
        17003  +    wxT
        17004  +    ("<tr><td bgcolor=\"#fffff0\">XB_IsCompressed( xmlObject BLOB ) : Integer</td>");
        17005  +  html +=
        17006  +    wxT
        17007  +    ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, ");
        17008  +  html +=
        17009  +    wxT
        17010  +    ("and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.</td></tr>");
        17011  +  html +=
        17012  +    wxT
        17013  +    ("<tr><td bgcolor=\"#fffff0\">XB_IsSchemaValidated( xmlObject BLOB ) : Integer</td>");
        17014  +  html +=
        17015  +    wxT
        17016  +    ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, ");
        17017  +  html +=
        17018  +    wxT
        17019  +    ("and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.</td></tr>");
        17020  +  html +=
        17021  +    wxT
        17022  +    ("<tr><td bgcolor=\"#fffff0\">XB_IsIsoMetadata( xmlObject BLOB ) : Integer</td>");
        17023  +  html +=
        17024  +    wxT
        17025  +    ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, ");
        17026  +  html +=
        17027  +    wxT
        17028  +    ("and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.</td></tr>");
        17029  +  html +=
        17030  +    wxT
        17031  +    ("<tr><td bgcolor=\"#fffff0\">XB_IsSldSeVectorStyle( xmlObject BLOB ) : Integer</td>");
        17032  +  html +=
        17033  +    wxT
        17034  +    ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, ");
        17035  +  html +=
        17036  +    wxT
        17037  +    ("and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.</td></tr>");
        17038  +  html +=
        17039  +    wxT
        17040  +    ("<tr><td bgcolor=\"#fffff0\">XB_IsSldSeRasterStyle( xmlObject BLOB ) : Integer</td>");
        17041  +  html +=
        17042  +    wxT
        17043  +    ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, ");
        17044  +  html +=
        17045  +    wxT
        17046  +    ("and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.</td></tr>");
        17047  +  html +=
        17048  +    wxT
        17049  +    ("<tr><td bgcolor=\"#fffff0\">XB_IsSvg( xmlObject BLOB ) : Integer</td>");
        17050  +  html +=
        17051  +    wxT
        17052  +    ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, ");
        17053  +  html +=
        17054  +    wxT
        17055  +    ("and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.</td></tr>");
        17056  +  html +=
        17057  +    wxT
        17058  +    ("<tr><td bgcolor=\"#fffff0\">XB_GetDocumentSize( xmlObject BLOB ) : Integer</td>");
        17059  +  html +=
        17060  +    wxT
        17061  +    ("<td bgcolor=\"#f0fff0\">Will return the size in bytes of the corresponding uncompressed XmlDocument.</td></tr>");
        17062  +  html +=
        17063  +    wxT
        17064  +    ("<tr><td bgcolor=\"#fffff0\">XB_GetEncoding( xmlObject BLOB ) : String</td>");
        17065  +  html +=
        17066  +    wxT
        17067  +    ("<td bgcolor=\"#f0fff0\">Will return the character encoding internally declared by the XmlDocument corresponding to the input XmlBLOB.</td></tr>");
        17068  +  html +=
        17069  +    wxT
        17070  +    ("<tr><td bgcolor=\"#fffff0\">XB_GetSchemaURI( xmlObject BLOB ) : String</td>");
        17071  +  html +=
        17072  +    wxT
        17073  +    ("<td bgcolor=\"#f0fff0\">Will return the Schema URI effectively used to validate an XmlBLOB.</td></tr>");
        17074  +  html +=
        17075  +    wxT
        17076  +    ("<tr><td bgcolor=\"#fffff0\">XB_GetInternalSchemaURI( xmlPayload BLOB ) : String</td>");
        17077  +  html +=
        17078  +    wxT
        17079  +    ("<td bgcolor=\"#f0fff0\">Will return the Schema URI internally declared by the input XmlDocument.</td></tr>");
        17080  +  html +=
        17081  +    wxT
        17082  +    ("<tr><td bgcolor=\"#fffff0\">XB_GetFileId( xmlObject BLOB ) : String</td>");
        17083  +  html +=
        17084  +    wxT
        17085  +    ("<td bgcolor=\"#f0fff0\">Will return the FileId defined within the XmlBLOB (if any).</td></tr>");
        17086  +  html +=
        17087  +    wxT
        17088  +    ("<tr><td bgcolor=\"#fffff0\">XB_SetFileId( xmlObject BLOB , fileId String ) : XmlBLOB</td>");
        17089  +  html +=
        17090  +    wxT
        17091  +    ("<td bgcolor=\"#f0fff0\">Will return a new XmlBLOB by replacing the FileIdentifier value.</td></tr>");
        17092  +  html +=
        17093  +    wxT
        17094  +    ("<tr><td bgcolor=\"#fffff0\">XB_AddFileId( xmlObject BLOB , fileId String , IdNameSpacePrefix String , IdNameSpaceURI String , CsNameSpacePrefix String , CsNameSpaceURI String ) : XmlBLOB</td>");
        17095  +  html +=
        17096  +    wxT
        17097  +    ("<td bgcolor=\"#f0fff0\">Will return a new XmlBLOB by inserting a FileIdentifier value.</td></tr>");
        17098  +  html +=
        17099  +    wxT
        17100  +    ("<tr><td bgcolor=\"#fffff0\">XB_GetParentId( xmlObject BLOB ) : String</td>");
        17101  +  html +=
        17102  +    wxT
        17103  +    ("<td bgcolor=\"#f0fff0\">Will return the ParentId defined within the XmlBLOB (if any).</td></tr>");
        17104  +  html +=
        17105  +    wxT
        17106  +    ("<tr><td bgcolor=\"#fffff0\">XB_SetParentId( xmlObject BLOB , parentId String ) : XmlBLOB</td>");
        17107  +  html +=
        17108  +    wxT
        17109  +    ("<td bgcolor=\"#f0fff0\">Will return a new XmlBLOB by replacing the ParentIdentifier value.</td></tr>");
        17110  +  html +=
        17111  +    wxT
        17112  +    ("<tr><td bgcolor=\"#fffff0\">XB_AddParentId( xmlObject BLOB , parentId String , IdNameSpacePrefix String , IdNameSpaceURI String , CsNameSpacePrefix String , CsNameSpaceURI String ) : XmlBLOB</td>");
        17113  +  html +=
        17114  +    wxT
        17115  +    ("<td bgcolor=\"#f0fff0\">Will return a new XmlBLOB by inserting a ParentIdentifier value.</td></tr>");
        17116  +  html +=
        17117  +    wxT
        17118  +    ("<tr><td bgcolor=\"#fffff0\">XB_GetTitle( xmlObject BLOB ) : String</td>");
        17119  +  html +=
        17120  +    wxT
        17121  +    ("<td bgcolor=\"#f0fff0\">Will return the Title defined within the XmlBLOB (if any).</td></tr>");
        17122  +  html +=
        17123  +    wxT
        17124  +    ("<tr><td bgcolor=\"#fffff0\">XB_GetAbstract( xmlObject BLOB ) : String</td>");
        17125  +  html +=
        17126  +    wxT
        17127  +    ("<td bgcolor=\"#f0fff0\">Will return the Abstract defined within the XmlBLOB (if any).</td></tr>");
        17128  +  html +=
        17129  +    wxT
        17130  +    ("<tr><td bgcolor=\"#fffff0\">XB_GetGeometry( xmlObject BLOB ) : Geometry</td>");
        17131  +  html +=
        17132  +    wxT
        17133  +    ("<td bgcolor=\"#f0fff0\">Will return the Geometry defined within the XmlBLOB (if any).</td></tr>");
        17134  +  html +=
        17135  +    wxT
        17136  +    ("<tr><td bgcolor=\"#fffff0\">XB_GetLastParseError( void ) : String</td>");
        17137  +  html +=
        17138  +    wxT
        17139  +    ("<td bgcolor=\"#f0fff0\">Will return the most recent XML parsing error (if any).</td></tr>");
        17140  +  html +=
        17141  +    wxT
        17142  +    ("<tr><td bgcolor=\"#fffff0\">XB_GetLastValidateError( void ) : String</td>");
        17143  +  html +=
        17144  +    wxT
        17145  +    ("<td bgcolor=\"#f0fff0\">Will return the most recent XML validating error (if any).</td></tr>");
        17146  +  html +=
        17147  +    wxT
        17148  +    ("<tr><td bgcolor=\"#fffff0\">XB_IsValidXPathExpression( expr Text ) : Integer</td>");
        17149  +  html +=
        17150  +    wxT
        17151  +    ("<td bgcolor=\"#f0fff0\">The return type is Integer, with a return value of 1 for TRUE, 0 for FALSE, ");
        17152  +  html +=
        17153  +    wxT
        17154  +    ("and -1 for UNKNOWN corresponding to a function invocation on NULL arguments.</td></tr>");
        17155  +  html +=
        17156  +    wxT
        17157  +    ("<tr><td bgcolor=\"#fffff0\">XB_GetLastXPathError( void ) : String</td>");
        17158  +  html +=
        17159  +    wxT
        17160  +    ("<td bgcolor=\"#f0fff0\">Will return the most recent XPath error (if any).</td></tr>");
        17161  +  html +=
        17162  +    wxT("<tr><td bgcolor=\"#fffff0\">XB_CacheFlush( void ) : Boolean</td>");
        17163  +  html +=
        17164  +    wxT
        17165  +    ("<td bgcolor=\"#f0fff0\">Reset the internal XML Schema cache to its initial empty state.</td></tr>");
        17166  +  html +=
        17167  +    wxT("<tr><td bgcolor=\"#fffff0\">XB_CacheFlush( void ) : Boolean</td>");
        17168  +  html +=
        17169  +    wxT
        17170  +    ("<td bgcolor=\"#f0fff0\">Reset the internal XML Schema cache to its initial empty state.</td></tr>");
        17171  +  html +=
        17172  +    wxT
        17173  +    ("<tr><td bgcolor=\"#fffff0\">XB_LoadXML( filepath-or-URL String ) : BLOB</td>");
        17174  +  html +=
        17175  +    wxT
        17176  +    ("<td bgcolor=\"#f0fff0\">If \"filepath-or-URL\" corresponds to some valid local pathname, and the corresponding file (expected to contain a well-formed XML Document) ");
        17177  +  html +=
        17178  +    wxT
        17179  +    ("can be actually accessed in read mode, then the whole file content will be returned as a BLOB value.<br>");
        17180  +  html +=
        17181  +    wxT
        17182  +    ("This function is even able to acces a remote XML Document identified by an URL.<br>Otherwise NULL will be returned.<br>");
        17183  +  html +=
        17184  +    wxT
        17185  +    ("<u>Please note:</u> SQLite doesn't support BLOB values bigger than SQLITE_MAX_LENGTH (usually, 1 GB).<hr>");
        17186  +  html +=
        17187  +    wxT
        17188  +    ("<u>Please note well</u>: this SQL function open the doors to many potential security issues, and thus is always disabled by default.<br>");
        17189  +  html +=
        17190  +    wxT
        17191  +    ("Explicitly setting the environment variable \"SPATIALITE_SECURITY=relaxed\" is absolutely required in order to effectively enable this function.<br>");
        17192  +  html += wxT("Please see: CountUnsafeTriggers().</td></tr>");
        17193  +  html +=
        17194  +    wxT
        17195  +    ("<tr><td bgcolor=\"#fffff0\">XB_StoreXML( XmlObject XmlBLOB , filepath String ) : Integer<hr>");
        17196  +  html +=
        17197  +    wxT
        17198  +    ("XB_StoreXML( XmlObject XmlBLOB , filepath String , indent Integer ) : Integer</td>");
        17199  +  html +=
        17200  +    wxT
        17201  +    ("<td bgcolor=\"#f0fff0\">If \"XmlObject\" is of the XmlBLOB-type, and if \"filepath\" corresponds to some valid pathname ");
        17202  +  html +=
        17203  +    wxT
        17204  +    ("(accessible in write/create mode), then the corresponding file will be created/overwritten so to ");
        17205  +  html +=
        17206  +    wxT
        17207  +    ("contain the corresponding XML Document (fully preserving the original character encoding).<br>");
        17208  +  html +=
        17209  +    wxT
        17210  +    ("If the optional argument \"indent\" is set to some positive value then the returned XmlDocument will be nicely formatted and properly indented by the required factor; ");
        17211  +  html +=
        17212  +    wxT
        17213  +    ("ZERO will cause the whole XmlDocument to be returned as a single line. (default setting is <i>negative</i> indenting, i.e. not reformatting at all).<hr>");
        17214  +  html +=
        17215  +    wxT
        17216  +    ("The return type is Integer, with a return value of 1 for success, 0 for failure and -1 for invalid arguments.<hr>");
        17217  +  html +=
        17218  +    wxT
        17219  +    ("<u>Please note well</u>: this SQL function open the doors to many potential security issues, and thus is always disabled by default.<br>");
        17220  +  html +=
        17221  +    wxT
        17222  +    ("Explicitly setting the environment variable \"SPATIALITE_SECURITY=relaxed\" is absolutely required in order to effectively enable this function.<br>");
        17223  +  html += wxT("Please see: CountUnsafeTriggers().</td></tr>");
        17224  +  html += wxT("</table>");
        17225  +  html += wxT("<a href=\"#index\">back to index</a>");
        17226  +  html += wxT("</body>");
        17227  +  html += wxT("</html>");
        17228  +}

Changes to Makefile-static-mingw32.

     1      1   # SandroFurieri (c) 2008
     2      2   # Makefile ( Mingw & wxwidgets) for spatialite-GUI
     3      3   
     4      4   SRC = Main.cpp TableTree.cpp QueryView.cpp ResultSetView.cpp BlobExplorer.cpp \
     5         -	Dialogs.cpp Shapefiles.cpp Exif.cpp TextCsv.cpp Postgres.cpp \
            5  +	Dialogs.cpp Shapefiles.cpp Network.cpp Exif.cpp TextCsv.cpp \
     6      6   	Objects.cpp QueryViewComposer.cpp MalformedGeoms.cpp DialogsGraph.cpp \
     7      7   	Raster.cpp Styles.cpp RasterSymbolizers.cpp VectorSymbolizers1.cpp \
     8      8   	VectorSymbolizers2.cpp Wfs.cpp SqlFilterComposer.cpp \
     9      9   	WmsDialog.cpp LayerTree.cpp MapPanel.cpp MapView.cpp \
    10         -	QuickStylesVector.cpp QuickStylesTopology.cpp QuickStylesRaster.cpp \
    11         -	HtmlHelp.cpp \
           10  +	QuickStyles.cpp \
    12     11   	win_resource/resource.rc
    13     12   OBJ = Main.o TableTree.o QueryView.o ResultSetView.o BlobExplorer.o \
    14         -	Dialogs.o Shapefiles.o Exif.o TextCsv.o Objects.o Postgres.o \
           13  +	Dialogs.o Shapefiles.o Network.o Exif.o TextCsv.o Objects.o \
    15     14   	QueryViewComposer.o MalformedGeoms.o DialogsGraph.o \
    16     15   	Raster.o Styles.o RasterSymbolizers.o VectorSymbolizers1.o \
    17         -	VectorSymbolizers2.o Wfs.o SqlFiltersComposer.o HtmlHelp.o \
    18         -	WmsDialog.o LayerTree.o MapPanel.o MapView.o QuickStylesVector.o \
    19         -	QuickStylesTopology.o QuickStylesRaster.o \
           16  +	VectorSymbolizers2.o Wfs.o SqlFiltersComposer.o \
           17  +	WmsDialog.o LayerTree.o MapPanel.o MapView.o QuickStyles.o \
    20     18   	win_resource/resource.o 
    21     19   EXE = ./static_bin/spatialite_gui.exe
    22     20   INCLUDE = Classdef.h 
    23     21   
    24     22   # Define default flags:
    25     23   CXXFLAGS = $(shell /mingw32/local/bin/wx-config --cxxflags)
    26     24   LIB = -Wl,--subsystem,windows /mingw32/local/lib/libwx_mswu-3.0.a \
................................................................................
    38     36   	/mingw32/local/lib/libfreetype.a /mingw32/local/lib/libexpat.a \
    39     37   	/mingw32/local/lib/libgeotiff.a /mingw32/local/lib/libtiff.a \
    40     38   	/mingw32/local/lib/libpng.a /mingw32/local/lib/libjpeg.a \
    41     39   	/mingw32/local/lib/libsqlite3.a /mingw32/local/lib/libcurl.a \
    42     40   	/mingw32/local/lib/libwebp.a /mingw32/local/lib/libgif.a \
    43     41   	/mingw32/local/lib/libssl.a /mingw32/local/lib/libcrypto.a \
    44     42   	/mingw32/local/lib/libz.a /mingw32/local/lib/liblzma.a \
    45         -	/mingw32/local/lib/libCharLS.a /mingw32/local/lib/libopenjp2.a \
    46         -	/mingw32/local/lib/libvirtualpg.a
           43  +	/mingw32/local/lib/libCharLS.a /mingw32/local/lib/libopenjp2.a
    47     44   EXTRALIB2 = -lgdi32 -lmsimg32 -lws2_32 -lwldap32
    48     45   
    49     46   CXX = g++ -static
    50     47   REZ = $(shell /mingw32/local/bin/wx-config --rescomp)
    51     48   
    52     49   
    53     50   all: $(EXE)
................................................................................
    95     92   
    96     93   DialogsGraph.o: DialogsGraph.cpp $(INCLUDE)
    97     94   	$(CXX) -c DialogsGraph.cpp $(CXXFLAGS) $(EXTRAFLAGS)
    98     95   
    99     96   Shapefiles.o: Shapefiles.cpp $(INCLUDE)
   100     97   	$(CXX) -c Shapefiles.cpp $(CXXFLAGS) $(EXTRAFLAGS)
   101     98   
           99  +Network.o: Network.cpp $(INCLUDE)
          100  +	$(CXX) -c Network.cpp $(CXXFLAGS) $(EXTRAFLAGS)
          101  +
   102    102   Exif.o: Exif.cpp $(INCLUDE)
   103    103   	$(CXX) -c Exif.cpp $(CXXFLAGS) $(EXTRAFLAGS)
   104    104   
   105    105   TextCsv.o: TextCsv.cpp $(INCLUDE)
   106    106   	$(CXX) -c TextCsv.cpp $(CXXFLAGS) $(EXTRAFLAGS)
   107    107   
   108    108   Objects.o: Objects.cpp $(INCLUDE)
................................................................................
   122    122   
   123    123   MapPanel.o: MapPanel.cpp $(INCLUDE)
   124    124   	$(CXX) -c MapPanel.cpp $(CXXFLAGS) $(EXTRAFLAGS)
   125    125   
   126    126   MapView.o: MapView.cpp $(INCLUDE)
   127    127   	$(CXX) -c MapView.cpp $(CXXFLAGS) $(EXTRAFLAGS)
   128    128   
   129         -QuickStylesVector.o: QuickStylesVector.cpp $(INCLUDE)
   130         -	$(CXX) -c QuickStylesVector.cpp $(CXXFLAGS) $(EXTRAFLAGS)
   131         -	
   132         -QuickStylesTopology.o: QuickStylesTopology.cpp $(INCLUDE)
   133         -	$(CXX) -c QuickStylesTopology.cpp $(CXXFLAGS) $(EXTRAFLAGS)
   134         -	
   135         -QuickStylesRaster.o: QuickStylesRaster.cpp $(INCLUDE)
   136         -	$(CXX) -c QuickStylesRaster.cpp $(CXXFLAGS) $(EXTRAFLAGS)
   137         -
   138         -Postgres.o: Postgres.cpp $(INCLUDE)
   139         -	$(CXX) -c Postgres.cpp $(CXXFLAGS) $(EXTRAFLAGS)
   140         -
   141         -HtmlHelp.o: HtmlHelp.cpp $(INCLUDE)
   142         -	$(CXX) -c HtmlHelp.cpp $(CXXFLAGS) $(EXTRAFLAGS)
          129  +QuickStyles.o: QuickStyles.cpp $(INCLUDE)
          130  +	$(CXX) -c QuickStyles.cpp $(CXXFLAGS) $(EXTRAFLAGS)
   143    131   
   144    132   win_resource/resource.o: win_resource/resource.rc
   145    133   	echo $(CXXFLAGS)
   146    134   	$(REZ) $(CXXFLAGS) -i win_resource/resource.rc -o win_resource/resource.o 

Changes to Makefile-static-mingw64.

     1      1   # SandroFurieri (c) 2008
     2      2   # Makefile ( Mingw & wxwidgets) for spatialite-GUI
     3      3   
     4      4   SRC = Main.cpp TableTree.cpp QueryView.cpp ResultSetView.cpp BlobExplorer.cpp \
     5         -	Dialogs.cpp Shapefiles.cpp Exif.cpp TextCsv.cpp Postgres.cpp \
            5  +	Dialogs.cpp Shapefiles.cpp Network.cpp Exif.cpp TextCsv.cpp \
     6      6   	Objects.cpp QueryViewComposer.cpp MalformedGeoms.cpp DialogsGraph.cpp \
     7      7   	Raster.cpp Styles.cpp RasterSymbolizers.cpp VectorSymbolizers1.cpp \
     8      8   	VectorSymbolizers2.cpp Wfs.cpp SqlFilterComposer.cpp \
     9      9   	WmsDialog.cpp LayerTree.cpp MapPanel.cpp MapView.cpp \
    10         -	QuickStylesVector.cpp QuickStylesTopology.cpp QuickStylesRaster.cpp \
    11         -	HtmlHelp.cpp \
           10  +	QuickStyles.cpp \
    12     11   	win_resource/resource.rc
    13     12   OBJ = Main.o TableTree.o QueryView.o ResultSetView.o BlobExplorer.o \
    14         -	Dialogs.o Shapefiles.o Exif.o TextCsv.o Objects.o Postgres.o \
           13  +	Dialogs.o Shapefiles.o Network.o Exif.o TextCsv.o Objects.o \
    15     14   	QueryViewComposer.o MalformedGeoms.o DialogsGraph.o \
    16     15   	Raster.o Styles.o RasterSymbolizers.o VectorSymbolizers1.o \
    17         -	VectorSymbolizers2.o Wfs.o SqlFiltersComposer.o HtmlHelp.o \
    18         -	WmsDialog.o LayerTree.o MapPanel.o MapView.o QuickStylesVector.o \
    19         -	QuickStylesTopology.o QuickStylesRaster.o \
           16  +	VectorSymbolizers2.o Wfs.o SqlFiltersComposer.o \
           17  +	WmsDialog.o LayerTree.o MapPanel.o MapView.o QuickStyles.o \
    20     18   	win_resource/resource.o 
    21     19   EXE = ./static_bin/spatialite_gui.exe
    22     20   INCLUDE = Classdef.h 
    23     21   
    24     22   # Define default flags:
    25     23   CXXFLAGS = $(shell /mingw64/local/bin/wx-config --cxxflags)
    26     24   LIB = -Wl,--subsystem,windows /mingw64/local/lib/libwx_mswu-3.0.a \
................................................................................
    38     36   	/mingw64/local/lib/libfreetype.a /mingw64/local/lib/libexpat.a \
    39     37   	/mingw64/local/lib/libgeotiff.a /mingw64/local/lib/libtiff.a \
    40     38   	/mingw64/local/lib/libpng.a /mingw64/local/lib/libjpeg.a \
    41     39   	/mingw64/local/lib/libsqlite3.a /mingw64/local/lib/libcurl.a \
    42     40   	/mingw64/local/lib/libwebp.a /mingw64/local/lib/libgif.a \
    43     41   	/mingw64/local/lib/libssl.a /mingw64/local/lib/libcrypto.a \
    44     42   	/mingw64/local/lib/libz.a /mingw64/local/lib/liblzma.a \
    45         -	/mingw64/local/lib/libCharLS.a /mingw64/local/lib/libopenjp2.a \
    46         -	/mingw64/local/lib/libvirtualpg.a
           43  +	/mingw64/local/lib/libCharLS.a /mingw64/local/lib/libopenjp2.a
    47     44   EXTRALIB2 = -lgdi32 -lmsimg32 -lws2_32 -lwldap32
    48     45   
    49     46   CXX = g++ -static
    50     47   REZ = $(shell /mingw64/local/bin/wx-config --rescomp)
    51     48   
    52     49   
    53     50   all: $(EXE)
................................................................................
    95     92   
    96     93   DialogsGraph.o: DialogsGraph.cpp $(INCLUDE)
    97     94   	$(CXX) -c DialogsGraph.cpp $(CXXFLAGS) $(EXTRAFLAGS)
    98     95   
    99     96   Shapefiles.o: Shapefiles.cpp $(INCLUDE)
   100     97   	$(CXX) -c Shapefiles.cpp $(CXXFLAGS) $(EXTRAFLAGS)
   101     98   
           99  +Network.o: Network.cpp $(INCLUDE)
          100  +	$(CXX) -c Network.cpp $(CXXFLAGS) $(EXTRAFLAGS)
          101  +
   102    102   Exif.o: Exif.cpp $(INCLUDE)
   103    103   	$(CXX) -c Exif.cpp $(CXXFLAGS) $(EXTRAFLAGS)
   104    104   
   105    105   TextCsv.o: TextCsv.cpp $(INCLUDE)
   106    106   	$(CXX) -c TextCsv.cpp $(CXXFLAGS) $(EXTRAFLAGS)
   107    107   
   108    108   Objects.o: Objects.cpp $(INCLUDE)
................................................................................
   122    122   
   123    123   MapPanel.o: MapPanel.cpp $(INCLUDE)
   124    124   	$(CXX) -c MapPanel.cpp $(CXXFLAGS) $(EXTRAFLAGS)
   125    125   
   126    126   MapView.o: MapView.cpp $(INCLUDE)
   127    127   	$(CXX) -c MapView.cpp $(CXXFLAGS) $(EXTRAFLAGS)
   128    128   
   129         -QuickStylesVector.o: QuickStylesVector.cpp $(INCLUDE)
   130         -	$(CXX) -c QuickStylesVector.cpp $(CXXFLAGS) $(EXTRAFLAGS)
   131         -	
   132         -QuickStylesTopology.o: QuickStylesTopology.cpp $(INCLUDE)
   133         -	$(CXX) -c QuickStylesTopology.cpp $(CXXFLAGS) $(EXTRAFLAGS)
   134         -	
   135         -QuickStylesRaster.o: QuickStylesRaster.cpp $(INCLUDE)
   136         -	$(CXX) -c QuickStylesRaster.cpp $(CXXFLAGS) $(EXTRAFLAGS)
   137         -
   138         -Postgres.o: Postgres.cpp $(INCLUDE)
   139         -	$(CXX) -c Postgres.cpp $(CXXFLAGS) $(EXTRAFLAGS)
   140         -
   141         -HtmlHelp.o: HtmlHelp.cpp $(INCLUDE)
   142         -	$(CXX) -c HtmlHelp.cpp $(CXXFLAGS) $(EXTRAFLAGS)
          129  +QuickStyles.o: QuickStyles.cpp $(INCLUDE)
          130  +	$(CXX) -c QuickStyles.cpp $(CXXFLAGS) $(EXTRAFLAGS)
   143    131   
   144    132   win_resource/resource.o: win_resource/resource.rc
   145    133   	echo $(CXXFLAGS)
   146    134   	$(REZ) $(CXXFLAGS) -i win_resource/resource.rc -o win_resource/resource.o 

Changes to Makefile.am.

     3      3   bin_PROGRAMS = spatialite_gui
     4      4   
     5      5   AM_CPPFLAGS = @CFLAGS@ @CPPFLAGS@
     6      6   AM_CPPFLAGS += -I$(top_srcdir)
     7      7   
     8      8   spatialite_gui_SOURCES = Classdef.h BlobExplorer.cpp \
     9      9   	Dialogs.cpp DialogsGraph.cpp WmsDialog.cpp Exif.cpp \
    10         -	Main.cpp MalformedGeoms.cpp \
           10  +	Main.cpp MalformedGeoms.cpp Network.cpp \
    11     11   	Objects.cpp QueryView.cpp QueryViewComposer.cpp \
    12     12   	ResultSetView.cpp Shapefiles.cpp TableTree.cpp \
    13     13   	TextCsv.cpp Wfs.cpp Raster.cpp Styles.cpp \
    14     14   	RasterSymbolizers.cpp VectorSymbolizers1.cpp \
    15     15   	VectorSymbolizers2.cpp SqlFiltersComposer.cpp \
    16     16   	MapPanel.cpp MapView.cpp LayerTree.cpp \
    17         -	QuickStylesVector.cpp QuickStylesTopology.cpp \
    18         -	QuickStylesRaster.cpp HtmlHelp.cpp Postgres.cpp
           17  +	QuickStyles.cpp
    19     18   
    20     19   LDADD = @WX_LIBS@ @LIBSPATIALITE_LIBS@ \
    21         -	@LIBRASTERLITE2_LIBS@ @LIBFREEXL_LIBS@ \
    22         -	@LIBVIRTUALPG_LIBS@ @LIBXML2_LIBS@ \
    23         -	@PG_LDFLAGS@ @PG_LIB@ -lgeos_c
           20  +	@LIBRASTERLITE2_LIBS@ @LIBFREEXL_LIBS@ @LIBXML2_LIBS@ -lgeos_c
    24     21   
    25         -EXTRA_DIST = Makefile-static-mingw32 \
    26         -	Makefile-static-mingw64 \
    27         -    helpgen/helpgen.c \
    28         -    helpgen/READ_ME.txt \
    29         -    indent_me
           22  +EXTRA_DIST = Makefile-static-MinGW \
           23  +		Makefile-static-mingw32 \
           24  +		Makefile-static-mingw64 \
           25  +        Makefile-static-Linux \
           26  +        Makefile-static-MacOsX \
           27  +        indent_me
    30     28   
    31     29   AUTOMAKE_OPTIONS = dist-zip foreign
    32     30   
    33     31   SUBDIRS = icons win_resource mac_resource gnome_resource
    34     32   

Changes to Makefile.in.

     1         -# Makefile.in generated by automake 1.15.1 from Makefile.am.
            1  +# Makefile.in generated by automake 1.15 from Makefile.am.
     2      2   # @configure_input@
     3      3   
     4         -# Copyright (C) 1994-2017 Free Software Foundation, Inc.
            4  +# Copyright (C) 1994-2014 Free Software Foundation, Inc.
     5      5   
     6      6   # This Makefile.in is free software; the Free Software Foundation
     7      7   # gives unlimited permission to copy and/or distribute it,
     8      8   # with or without modifications, as long as this notice is preserved.
     9      9   
    10     10   # This program is distributed in the hope that it will be useful,
    11     11   # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
................................................................................
   105    105   CONFIG_HEADER = config.h
   106    106   CONFIG_CLEAN_FILES =
   107    107   CONFIG_CLEAN_VPATH_FILES =
   108    108   am__installdirs = "$(DESTDIR)$(bindir)"
   109    109   PROGRAMS = $(bin_PROGRAMS)
   110    110   am_spatialite_gui_OBJECTS = BlobExplorer.$(OBJEXT) Dialogs.$(OBJEXT) \
   111    111   	DialogsGraph.$(OBJEXT) WmsDialog.$(OBJEXT) Exif.$(OBJEXT) \
   112         -	Main.$(OBJEXT) MalformedGeoms.$(OBJEXT) Objects.$(OBJEXT) \
   113         -	QueryView.$(OBJEXT) QueryViewComposer.$(OBJEXT) \
   114         -	ResultSetView.$(OBJEXT) Shapefiles.$(OBJEXT) \
   115         -	TableTree.$(OBJEXT) TextCsv.$(OBJEXT) Wfs.$(OBJEXT) \
   116         -	Raster.$(OBJEXT) Styles.$(OBJEXT) RasterSymbolizers.$(OBJEXT) \
   117         -	VectorSymbolizers1.$(OBJEXT) VectorSymbolizers2.$(OBJEXT) \
   118         -	SqlFiltersComposer.$(OBJEXT) MapPanel.$(OBJEXT) \
   119         -	MapView.$(OBJEXT) LayerTree.$(OBJEXT) \
   120         -	QuickStylesVector.$(OBJEXT) QuickStylesTopology.$(OBJEXT) \
   121         -	QuickStylesRaster.$(OBJEXT) HtmlHelp.$(OBJEXT) \
   122         -	Postgres.$(OBJEXT)
          112  +	Main.$(OBJEXT) MalformedGeoms.$(OBJEXT) Network.$(OBJEXT) \
          113  +	Objects.$(OBJEXT) QueryView.$(OBJEXT) \
          114  +	QueryViewComposer.$(OBJEXT) ResultSetView.$(OBJEXT) \
          115  +	Shapefiles.$(OBJEXT) TableTree.$(OBJEXT) TextCsv.$(OBJEXT) \
          116  +	Wfs.$(OBJEXT) Raster.$(OBJEXT) Styles.$(OBJEXT) \
          117  +	RasterSymbolizers.$(OBJEXT) VectorSymbolizers1.$(OBJEXT) \
          118  +	VectorSymbolizers2.$(OBJEXT) SqlFiltersComposer.$(OBJEXT) \
          119  +	MapPanel.$(OBJEXT) MapView.$(OBJEXT) LayerTree.$(OBJEXT) \
          120  +	QuickStyles.$(OBJEXT)
   123    121   spatialite_gui_OBJECTS = $(am_spatialite_gui_OBJECTS)
   124    122   spatialite_gui_LDADD = $(LDADD)
   125    123   spatialite_gui_DEPENDENCIES =
   126    124   AM_V_lt = $(am__v_lt_@AM_V@)
   127    125   am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
   128    126   am__v_lt_0 = --silent
   129    127   am__v_lt_1 = 
................................................................................
   317    315   LIBOBJS = @LIBOBJS@
   318    316   LIBRASTERLITE2_CFLAGS = @LIBRASTERLITE2_CFLAGS@
   319    317   LIBRASTERLITE2_LIBS = @LIBRASTERLITE2_LIBS@
   320    318   LIBS = @LIBS@
   321    319   LIBSPATIALITE_CFLAGS = @LIBSPATIALITE_CFLAGS@
   322    320   LIBSPATIALITE_LIBS = @LIBSPATIALITE_LIBS@
   323    321   LIBTOOL = @LIBTOOL@
   324         -LIBVIRTUALPG_CFLAGS = @LIBVIRTUALPG_CFLAGS@
   325         -LIBVIRTUALPG_LIBS = @LIBVIRTUALPG_LIBS@
   326    322   LIBWEBP_CFLAGS = @LIBWEBP_CFLAGS@
   327    323   LIBWEBP_LIBS = @LIBWEBP_LIBS@
   328    324   LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
   329    325   LIBXML2_LIBS = @LIBXML2_LIBS@
   330    326   LIPO = @LIPO@
   331    327   LN_S = @LN_S@
   332    328   LTLIBOBJS = @LTLIBOBJS@
................................................................................
   345    341   PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
   346    342   PACKAGE_NAME = @PACKAGE_NAME@
   347    343   PACKAGE_STRING = @PACKAGE_STRING@
   348    344   PACKAGE_TARNAME = @PACKAGE_TARNAME@
   349    345   PACKAGE_URL = @PACKAGE_URL@
   350    346   PACKAGE_VERSION = @PACKAGE_VERSION@
   351    347   PATH_SEPARATOR = @PATH_SEPARATOR@
   352         -PGCONFIG = @PGCONFIG@
   353         -PG_CFLAGS = @PG_CFLAGS@
   354         -PG_LDFLAGS = @PG_LDFLAGS@
   355         -PG_LIB = @PG_LIB@
   356    348   PKG_CONFIG = @PKG_CONFIG@
   357    349   PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
   358    350   PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
   359    351   RANLIB = @RANLIB@
   360    352   SED = @SED@
   361    353   SET_MAKE = @SET_MAKE@
   362    354   SHELL = @SHELL@
................................................................................
   417    409   top_build_prefix = @top_build_prefix@
   418    410   top_builddir = @top_builddir@
   419    411   top_srcdir = @top_srcdir@
   420    412   ACLOCAL_AMFLAGS = -I m4
   421    413   AM_CPPFLAGS = @CFLAGS@ @CPPFLAGS@ -I$(top_srcdir)
   422    414   spatialite_gui_SOURCES = Classdef.h BlobExplorer.cpp \
   423    415   	Dialogs.cpp DialogsGraph.cpp WmsDialog.cpp Exif.cpp \
   424         -	Main.cpp MalformedGeoms.cpp \
          416  +	Main.cpp MalformedGeoms.cpp Network.cpp \
   425    417   	Objects.cpp QueryView.cpp QueryViewComposer.cpp \
   426    418   	ResultSetView.cpp Shapefiles.cpp TableTree.cpp \
   427    419   	TextCsv.cpp Wfs.cpp Raster.cpp Styles.cpp \
   428    420   	RasterSymbolizers.cpp VectorSymbolizers1.cpp \
   429    421   	VectorSymbolizers2.cpp SqlFiltersComposer.cpp \
   430    422   	MapPanel.cpp MapView.cpp LayerTree.cpp \
   431         -	QuickStylesVector.cpp QuickStylesTopology.cpp \
   432         -	QuickStylesRaster.cpp HtmlHelp.cpp Postgres.cpp
          423  +	QuickStyles.cpp
   433    424   
   434    425   LDADD = @WX_LIBS@ @LIBSPATIALITE_LIBS@ \
   435         -	@LIBRASTERLITE2_LIBS@ @LIBFREEXL_LIBS@ \
   436         -	@LIBVIRTUALPG_LIBS@ @LIBXML2_LIBS@ \
   437         -	@PG_LDFLAGS@ @PG_LIB@ -lgeos_c
          426  +	@LIBRASTERLITE2_LIBS@ @LIBFREEXL_LIBS@ @LIBXML2_LIBS@ -lgeos_c
   438    427   
   439         -EXTRA_DIST = Makefile-static-mingw32 \
   440         -	Makefile-static-mingw64 \
   441         -    helpgen/helpgen.c \
   442         -    helpgen/READ_ME.txt \
   443         -    indent_me
          428  +EXTRA_DIST = Makefile-static-MinGW \
          429  +		Makefile-static-mingw32 \
          430  +		Makefile-static-mingw64 \
          431  +        Makefile-static-Linux \
          432  +        Makefile-static-MacOsX \
          433  +        indent_me
   444    434   
   445    435   AUTOMAKE_OPTIONS = dist-zip foreign
   446    436   SUBDIRS = icons win_resource mac_resource gnome_resource
   447    437   all: config.h
   448    438   	$(MAKE) $(AM_MAKEFLAGS) all-recursive
   449    439   
   450    440   .SUFFIXES:
................................................................................
   557    547   distclean-compile:
   558    548   	-rm -f *.tab.c
   559    549   
   560    550   @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BlobExplorer.Po@am__quote@
   561    551   @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Dialogs.Po@am__quote@
   562    552   @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DialogsGraph.Po@am__quote@
   563    553   @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Exif.Po@am__quote@
   564         -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HtmlHelp.Po@am__quote@
   565    554   @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LayerTree.Po@am__quote@
   566    555   @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Main.Po@am__quote@
   567    556   @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MalformedGeoms.Po@am__quote@
   568    557   @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MapPanel.Po@am__quote@
   569    558   @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MapView.Po@am__quote@
          559  +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Network.Po@am__quote@
   570    560   @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Objects.Po@am__quote@
   571         -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Postgres.Po@am__quote@
   572    561   @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QueryView.Po@am__quote@
   573    562   @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QueryViewComposer.Po@am__quote@
   574         -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QuickStylesRaster.Po@am__quote@
   575         -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QuickStylesTopology.Po@am__quote@
   576         -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QuickStylesVector.Po@am__quote@
          563  +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QuickStyles.Po@am__quote@
   577    564   @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Raster.Po@am__quote@
   578    565   @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RasterSymbolizers.Po@am__quote@
   579    566   @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ResultSetView.Po@am__quote@
   580    567   @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Shapefiles.Po@am__quote@
   581    568   @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SqlFiltersComposer.Po@am__quote@
   582    569   @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Styles.Po@am__quote@
   583    570   @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TableTree.Po@am__quote@

Changes to MalformedGeoms.cpp.

     1      1   /*
     2      2   / MalformedGeoms.cpp
     3      3   / identifying malformed geometries
     4      4   /
     5      5   / version 1.7, 2013 May 8
     6      6   /
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
     8      8   /
     9      9   / Copyright (C) 2008-2013  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
    13     13   /    the Free Software Foundation, either version 3 of the License, or
    14     14   /    (at your option) any later version.

Changes to MapPanel.cpp.

     1      1   /*
     2      2   / MapPanel.cpp
     3      3   / the Map Panel of spatialite_gui  - a SQLite /SpatiaLite GUI tool
     4      4   /
     5      5   / version 2.0, 2017 January 8
     6      6   /
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
     8      8   /
     9      9   / Copyright (C) 2017  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
    13     13   /    the Free Software Foundation, either version 3 of the License, or
    14     14   /    (at your option) any later version.
................................................................................
    31     31   #include "wx/spinctrl.h"
    32     32   #include "wx/colordlg.h"
    33     33   
    34     34   #include <float.h>
    35     35   
    36     36   #include "icons/icon_map.xpm"
    37     37   #include "icons/linestrings_on.xpm"
           38  +#include "icons/linestrings_off.xpm"
    38     39   #include "icons/points_on.xpm"
           40  +#include "icons/points_off.xpm"
    39     41   #include "icons/polygons_on.xpm"
           42  +#include "icons/polygons_off.xpm"
    40     43   #include "icons/vector.xpm"
           44  +#include "icons/vector_off.xpm"
    41     45   #include "icons/topo_geo.xpm"
           46  +#include "icons/topo_geo_off.xpm"
    42     47   #include "icons/topo_net.xpm"
           48  +#include "icons/topo_net_off.xpm"
    43     49   #include "icons/coverage.xpm"
           50  +#include "icons/coverage_off.xpm"
    44     51   #include "icons/wms.xpm"
           52  +#include "icons/wms_off.xpm"
    45     53   #include "icons/icon_info.xpm"
    46     54   #include "icons/map_add.xpm"
    47     55   #include "icons/map_table.xpm"
    48     56   #include "icons/identify.xpm"
    49     57   #include "icons/zoom_in.xpm"
    50     58   #include "icons/zoom_out.xpm"
    51     59   #include "icons/pan.xpm"
................................................................................
   774    782           color = wxColour(192, 192, 192);
   775    783         MyBitmapCellRenderer *renderer = new MyBitmapCellRenderer;
   776    784         wxBitmap bmp;
   777    785         switch (pL->GetLayerType())
   778    786           {
   779    787             case MAP_LAYER_VECTOR:
   780    788             case MAP_LAYER_VECTOR_VIEW:
   781         -          case MAP_LAYER_VECTOR_SHP:
   782    789               switch (pL->GetGeometryType())
   783    790                 {
   784    791                   case 1:
   785    792                   case 1001:
   786    793                   case 2001:
   787    794                   case 3001:
   788    795                   case 4:
................................................................................
   832    839               pL = pL->GetNext();
   833    840               continue;
   834    841           };
   835    842         renderer->SetGraphic(bmp);
   836    843         Layers->SetCellValue(count, 0, pL->GetDbPrefix());
   837    844         Layers->SetCellTextColour(count, 0, color);
   838    845         Layers->SetCellRenderer(count, 1, renderer);
   839         -      if (pL->GetLayerType() == MAP_LAYER_VECTOR
   840         -          || pL->GetLayerType() == MAP_LAYER_VECTOR_VIEW
   841         -          || pL->GetLayerType() == MAP_LAYER_VECTOR_SHP)
          846  +      if (pL->GetLayerType() == MAP_LAYER_VECTOR)
   842    847           {
   843    848             wxString prefixName = pL->GetLayerPrefix();
   844    849             prefixName += wxT(".");
   845    850             prefixName += pL->GetLayerName();
   846    851             Layers->SetCellValue(count, 2, prefixName);
   847    852         } else
   848    853           Layers->SetCellValue(count, 2, pL->GetLayerName());
................................................................................
  2588   2593   // first row: Layer's fully qualified name
  2589   2594     wxBoxSizer *nameSizer = new wxBoxSizer(wxHORIZONTAL);
  2590   2595     boxSizer->Add(nameSizer, 0, wxALIGN_RIGHT | wxALL, 0);
  2591   2596     wxStaticText *nameLabel =
  2592   2597       new wxStaticText(this, wxID_STATIC, wxT("&Full Name:"));
  2593   2598     nameSizer->Add(nameLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2594   2599     wxString name = Layer->GetDbPrefix();
  2595         -  if (Layer->GetType() == MAP_LAYER_VECTOR
  2596         -      || Layer->GetType() == MAP_LAYER_VECTOR_VIEW
  2597         -      || Layer->GetType() == MAP_LAYER_VECTOR_SHP)
         2600  +  if (Layer->GetType() == MAP_LAYER_VECTOR)
  2598   2601       name += wxT(".") + Layer->GetVectorPrefix();
  2599   2602     name += wxT(".") + Layer->GetName();
  2600   2603     wxTextCtrl *nameCtrl = new wxTextCtrl(this, ID_MAPLAYER_NAME, name,
  2601   2604                                           wxDefaultPosition, wxSize(550, 22),
  2602   2605                                           wxTE_READONLY);
  2603   2606     nameSizer->Add(nameCtrl, 0, wxALIGN_RIGHT | wxALL, 5);
  2604   2607   // second row: Title
................................................................................
  2658   2661     switch (Layer->GetType())
  2659   2662       {
  2660   2663         case MAP_LAYER_WMS:
  2661   2664           datasource = wxT("WMS Layer    GetMap URL:\n");
  2662   2665           datasource += wxString::FromUTF8(Layer->GetWmsGetMapURL());
  2663   2666           break;
  2664   2667         case MAP_LAYER_VECTOR:
  2665         -      case MAP_LAYER_VECTOR_VIEW:
  2666         -      case MAP_LAYER_VECTOR_SHP:
  2667   2668           datasource = wxT("Vector Coverage\n");
  2668   2669           datasource += wxT("SpatiaLite ");
  2669   2670           if (Layer->GetVectorPrefix().IsSameAs(wxT("table")) == true)
  2670   2671             datasource +=
  2671   2672               wxT("GeoTable: ") + wxString::FromUTF8(Layer->GetTableName()) +
  2672   2673               wxT(" / ") + wxString::FromUTF8(Layer->GetGeometryColumn()) +
  2673   2674               wxT("\n");
................................................................................
  3757   3758       {
  3758   3759         CachedNodes = new CachedFrame();
  3759   3760         CachedLinks = new CachedFrame();
  3760   3761         CachedLinkSeeds = new CachedFrame();
  3761   3762       }
  3762   3763     QuickStyle = NULL;
  3763   3764     QuickStyleTopology = NULL;
  3764         -  QuickStyleRaster = NULL;
  3765   3765     Prev = NULL;
  3766   3766     Next = NULL;
  3767   3767   }
  3768   3768   
  3769   3769   MapLayer::~MapLayer()
  3770   3770   {
  3771   3771   //
................................................................................
  3811   3811       delete CachedLinkSeeds;
  3812   3812     if (CachedFaceSeeds != NULL)
  3813   3813       delete CachedFaceSeeds;
  3814   3814     if (QuickStyle != NULL)
  3815   3815       delete QuickStyle;
  3816   3816     if (QuickStyleTopology != NULL)
  3817   3817       delete QuickStyleTopology;
  3818         -  if (QuickStyleRaster != NULL)
  3819         -    delete QuickStyleRaster;
  3820   3818   }
  3821   3819   
  3822   3820   void MapLayer::Invalidate()
  3823   3821   {
  3824   3822   //
  3825   3823   // the Style changed: invalidating all Caches
  3826   3824   //
................................................................................
  3889   3887             Invalidate();
  3890   3888             return true;
  3891   3889           }
  3892   3890       }
  3893   3891     return false;
  3894   3892   }
  3895   3893   
  3896         -bool MapLayer::UpdateQuickStyle(QuickStyleRasterObj * style)
  3897         -{
  3898         -//
  3899         -// updating the current Quick Syle
  3900         -//
  3901         -  bool ret;
  3902         -  if (QuickStyleRaster == NULL)
  3903         -    {
  3904         -      QuickStyleRaster = style->Clone();
  3905         -      QuickStyleRaster->UpdateXmlStyle();
  3906         -      Invalidate();
  3907         -      return true;
  3908         -  } else
  3909         -    {
  3910         -      ret = style->Compare(QuickStyleRaster);
  3911         -      if (ret == false)
  3912         -        {
  3913         -          if (QuickStyleRaster != NULL)
  3914         -            delete QuickStyleRaster;
  3915         -          QuickStyleRaster = style->Clone();
  3916         -          QuickStyleRaster->UpdateXmlStyle();
  3917         -          Invalidate();
  3918         -          return true;
  3919         -        }
  3920         -    }
  3921         -  return false;
  3922         -}
  3923         -
  3924   3894   void MapLayer::PrepareGraphicsContext(int width, int height, double minx,
  3925   3895                                         double miny, double maxx, double maxy,
  3926   3896                                         const char *style)
  3927   3897   {
  3928   3898   //
  3929   3899   // initializing the Graphics Context
  3930   3900   //
................................................................................
  3956   3926         if (CachedLinks->IsValid(width, height, minx, miny, maxx, maxy, style) !=
  3957   3927             true)
  3958   3928           CachedLinks->Reset(width, height, minx, miny, maxx, maxy, style);
  3959   3929         if (CachedLinkSeeds->IsValid(width, height, minx, miny, maxx, maxy, style)
  3960   3930             != true)
  3961   3931           CachedLinkSeeds->Reset(width, height, minx, miny, maxx, maxy, style);
  3962   3932       }
  3963         -  if (Type == MAP_LAYER_VECTOR || Type == MAP_LAYER_VECTOR_VIEW
  3964         -      || Type == MAP_LAYER_VECTOR_SHP || Type == MAP_LAYER_TOPOLOGY
         3933  +  if (Type == MAP_LAYER_VECTOR || Type == MAP_LAYER_TOPOLOGY
  3965   3934         || Type == MAP_LAYER_NETWORK)
  3966   3935       {
  3967   3936         // Labels
  3968   3937         if (CachedLabels->IsValid(width, height, minx, miny, maxx, maxy, style) !=
  3969   3938             true)
  3970   3939           CachedLabels->Reset(width, height, minx, miny, maxx, maxy, style);
  3971   3940       }

Changes to MapView.cpp.

     1      1   /*
     2      2   / MapView.cpp
     3      3   / the Map View of spatialite_gui  - a SQLite /SpatiaLite GUI tool
     4      4   /
     5      5   / version 2.0, 2017 January 8
     6      6   /
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
     8      8   /
     9      9   / Copyright (C) 2017  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
    13     13   /    the Free Software Foundation, either version 3 of the License, or
    14     14   /    (at your option) any later version.
................................................................................
   200    200   {
   201    201   //
   202    202   // this window has changed its size
   203    203   //
   204    204     PrepareMap();
   205    205   }
   206    206   
   207         -int MyMapView::GetImageWidth()
   208         -{
   209         -// will return the current image Width
   210         -  wxSize sz = GetClientSize();
   211         -  return sz.GetWidth();
   212         -}
   213         -
   214         -int MyMapView::GetImageHeight()
   215         -{
   216         -// will return the current image Width
   217         -  wxSize sz = GetClientSize();
   218         -  return sz.GetHeight();
   219         -}
   220         -
   221    207   void MyMapView::OnPaint(wxPaintEvent & WXUNUSED(event))
   222    208   {
   223    209   //
   224    210   // this window needs to be repainted
   225    211   //
   226    212     wxPaintDC dc(this);
   227    213     if (ValidMap == false)
................................................................................
   555    541     sqlite3_free(dummy);
   556    542   
   557    543     MapPanel->UpdateMapScale();
   558    544     MapPanel->UpdateMapCoords(coords);
   559    545     MapPanel->UpdateMapSRID();
   560    546   }
   561    547   
   562         -void MyMapView::DoPrepareBBox(wxString & bbox)
   563         -{
   564         -// preparing the current frame BBOX
   565         -  char *buf =
   566         -    sqlite3_mprintf("BuildMBR(%f, %f, %f, %f, %d), ", FrameMinX, FrameMinY,
   567         -                    FrameMaxX, FrameMaxY, MapSRID);
   568         -  bbox = wxString::FromUTF8(buf);
   569         -  sqlite3_free(buf);
   570         -}
   571         -
   572         -void MyMapView::GetBBox(int *srid, double *minx, double *miny, double *maxx, double *maxy)
   573         -{
   574         -// returning the current fram BBOX
   575         -*srid = MapSRID;
   576         -  *minx = FrameMinX;
   577         -  *miny = FrameMinY;
   578         -  *maxx = FrameMaxX;
   579         -  *maxy = FrameMaxY;
   580         -}
   581         -
   582    548   void MyMapView::Invalidate()
   583    549   {
   584    550   // resetting to initial state
   585    551     ValidMap = false;
   586    552     MapMinX = DBL_MAX;
   587    553     MapMinY = DBL_MAX;
   588    554     MapMaxX = -DBL_MAX;
................................................................................
  2343   2309             nice(10);
  2344   2310           }
  2345   2311       }
  2346   2312   #endif
  2347   2313   
  2348   2314     lyr->IncrementRetryCount();
  2349   2315     view->DoPaintLayer(lyr);
  2350         -  mother->ReleaseThread(index);
         2316  +  mother->ReleaseThread(index, lyr);
  2351   2317     lyr->SetLocked(false);
  2352   2318     if (lyr->IsReady() == true)
  2353   2319       {
  2354   2320         canvas->SetChanged(true);
  2355   2321         wxCommandEvent evt_step(wxEVT_COMMAND_BUTTON_CLICKED, ID_PAINT_MAP_STEP);
  2356   2322         view->GetEventHandler()->AddPendingEvent(evt_step);
  2357   2323       }
................................................................................
  2899   2865     char *db_prefix;
  2900   2866     char *layer_name = NULL;
  2901   2867     int len;
  2902   2868     rl2CanvasPtr canvas;
  2903   2869     sqlite3_stmt *stmt = NULL;
  2904   2870     const char *sql;
  2905   2871     int ret;
  2906         -  unsigned char *quickStyle = NULL;
  2907   2872   
  2908   2873     if (lyr == NULL)
  2909   2874       return;
  2910   2875     layer = lyr->GetLayer();
  2911   2876     if (layer == NULL)
  2912   2877       return;
  2913   2878     config = layer->GetRasterConfig();
  2914   2879     if (config == NULL)
  2915   2880       return;
  2916   2881   
  2917         -// attempting to apply a QuickStyle
  2918         -  if (layer->GetQuickStyleRaster() != NULL)
  2919         -    {
  2920         -      if (strcasecmp
  2921         -          (layer->GetQuickStyleRaster()->GetUUID(), config->GetStyle()) == 0)
  2922         -        {
  2923         -          // applying the Quick Style
  2924         -          quickStyle = layer->GetQuickStyleRaster()->CloneXmlStyle();
  2925         -        }
  2926         -    }
  2927         -
  2928   2882     wxString prefix = layer->GetDbPrefix();
  2929   2883     len = prefix.Len();
  2930   2884     if (len == 0)
  2931   2885       db_prefix = NULL;
  2932   2886     else
  2933   2887       {
  2934   2888         db_prefix = (char *) malloc((len * 4) + 1);
................................................................................
  2971   2925                   (unsigned char *) sqlite3_column_blob(stmt, 0);
  2972   2926                 int blob_sz = sqlite3_column_bytes(stmt, 0);
  2973   2927                 canvas = layer->CreateCanvas();
  2974   2928                 rl2_map_image_paint_from_raster(MapPanel->GetSqlite(),
  2975   2929                                                 MapPanel->GetRL2PrivateData(),
  2976   2930                                                 canvas, db_prefix, layer_name,
  2977   2931                                                 blob, blob_sz,
  2978         -                                              config->GetStyle(), quickStyle);
         2932  +                                              config->GetStyle());
  2979   2933                 layer->Validate(canvas);
  2980   2934                 rl2_destroy_canvas(canvas);
  2981   2935               }
  2982   2936           }
  2983   2937       }
  2984   2938     sqlite3_finalize(stmt);
  2985   2939     if (db_prefix != NULL)
................................................................................
  3091   3045                   (unsigned char *) sqlite3_column_blob(stmt, 0);
  3092   3046                 int blob_sz = sqlite3_column_bytes(stmt, 0);
  3093   3047                 canvas = layer->CreateCanvas();
  3094   3048                 const void *data = MapPanel->GetRL2PrivateData();
  3095   3049                 if (layer->GetType() == MAP_LAYER_TOPOLOGY)
  3096   3050                   rl2_map_image_paint_from_vector_ex(MapPanel->GetSqlite(), data,
  3097   3051                                                      canvas, db_prefix,
  3098         -                                                   layer_name, blob, blob_sz, 0,
         3052  +                                                   layer_name, blob, blob_sz,
  3099   3053                                                      styleName, quickStyle,
  3100   3054                                                      config->AreNodesVisible(),
  3101   3055                                                      config->AreEdgesVisible(),
  3102   3056                                                      config->AreFacesVisible(),
  3103   3057                                                      config->AreEdgeSeedsVisible
  3104   3058                                                      (),
  3105   3059                                                      config->AreFaceSeedsVisible
  3106   3060                                                      ());
  3107   3061                 else if (layer->GetType() == MAP_LAYER_NETWORK)
  3108   3062                   rl2_map_image_paint_from_vector_ex(MapPanel->GetSqlite(), data,
  3109   3063                                                      canvas, db_prefix,
  3110         -                                                   layer_name, blob, blob_sz, 0,
         3064  +                                                   layer_name, blob, blob_sz,
  3111   3065                                                      styleName, quickStyle,
  3112   3066                                                      config->AreNodesVisible(),
  3113   3067                                                      config->AreLinksVisible(), 0,
  3114   3068                                                      config->AreLinkSeedsVisible
  3115   3069                                                      (), 0);
  3116   3070                 else
  3117   3071                   rl2_map_image_paint_from_vector(MapPanel->GetSqlite(), data,
  3118   3072                                                   canvas, db_prefix, layer_name,
  3119         -                                                blob, blob_sz, 0,
         3073  +                                                blob, blob_sz,
  3120   3074                                                   styleName, quickStyle);
  3121   3075                 layer->Validate(canvas);
  3122   3076                 rl2_destroy_canvas(canvas);
  3123   3077               }
  3124   3078           }
  3125   3079       }
  3126   3080     sqlite3_finalize(stmt);
................................................................................
  3330   3284       rl2_graph_get_context_alpha_array(ctx, &half_transparent);
  3331   3285     rl2_graph_destroy_context(ctx);
  3332   3286   
  3333   3287   // updating the Screen
  3334   3288     wxImage img = wxImage(FrameWidth, FrameHeight);
  3335   3289     img.SetData(rgb, false);
  3336   3290     img.SetAlpha(alpha, false);
  3337         -  BlinkBitmap = wxBitmap(img);
         3291  +  BlinkBitmap = img;
  3338   3292     DynamicBlink = true;
  3339   3293     ResetScreenBitmap();
  3340   3294     DynamicBlink = false;
  3341   3295   }
  3342   3296   
  3343   3297   void MyMapView::ResetMapBitmap(wxImage & img, unsigned int width,
  3344   3298                                  unsigned int height)
................................................................................
  3387   3341   }
  3388   3342   
  3389   3343   void MyMapView::RebuildLayerTree(MyLayerTree * LayerTree)
  3390   3344   {
  3391   3345   //
  3392   3346   // rebuilding from scratch the Map Layers Tree
  3393   3347   //
         3348  +  MapLayerObject *obj;
  3394   3349     wxTreeItemId layer;
  3395   3350     ::wxBeginBusyCursor();
  3396   3351     LayerTree->Hide();
  3397   3352     LayerTree->DeleteChildren(LayerTree->GetRoot());
  3398   3353   
  3399   3354     int count_rasters = 0;
  3400   3355     MapLayer *pL = FirstLayer;
................................................................................
  4529   4484             *(UnusedThreads + i) = false;
  4530   4485             return i;
  4531   4486           }
  4532   4487       }
  4533   4488     return -1;
  4534   4489   }
  4535   4490   
  4536         -void MapViewPaintParams::ReleaseThread(int index)
         4491  +void MapViewPaintParams::ReleaseThread(int index, SingleLayerPainter * lyr)
  4537   4492   {
  4538   4493   // releasing a Thread slot
  4539   4494     if (UnusedThreads == NULL)
  4540   4495       return;
  4541   4496     if (index >= 0 && index < NumThreads)
  4542   4497       {
  4543   4498         // unlocking the Thread slot

Added Network.cpp.

            1  +/*
            2  +/ Network.cpp
            3  +/ methods related to Network building
            4  +/
            5  +/ version 1.7, 2013 May 8
            6  +/
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
            8  +/
            9  +/ Copyright (C) 2008-2013  Alessandro Furieri
           10  +/
           11  +/    This program is free software: you can redistribute it and/or modify
           12  +/    it under the terms of the GNU General Public License as published by
           13  +/    the Free Software Foundation, either version 3 of the License, or
           14  +/    (at your option) any later version.
           15  +/
           16  +/    This program is distributed in the hope that it will be useful,
           17  +/    but WITHOUT ANY WARRANTY; without even the implied warranty of
           18  +/    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
           19  +/    GNU General Public License for more details.
           20  +/
           21  +/    You should have received a copy of the GNU General Public License
           22  +/    along with this program.  If not, see <http://www.gnu.org/licenses/>.
           23  +/
           24  +*/
           25  +
           26  +#include "Classdef.h"
           27  +#include <float.h>
           28  +
           29  +#if defined(_WIN32) && !defined(__MINGW32__)
           30  +#define strcasecmp	_stricmp
           31  +#endif
           32  +
           33  +#define MAX_BLOCK	1048576
           34  +
           35  +void
           36  +  MyFrame::BuildNetwork(wxString & table, wxString & from, wxString & to,
           37  +                        bool isNoGeometry, wxString & geometry, wxString & name,
           38  +                        bool cost_length, wxString & cost, bool bidirectional,
           39  +                        bool one_way, wxString & one_way_from_to,
           40  +                        wxString & one_way_to_from, bool aStarSupported,
           41  +                        wxString & dataTableName, wxString & virtualTableName)
           42  +{
           43  +//
           44  +// trying to build a Network
           45  +// 
           46  +  int ret;
           47  +  sqlite3_stmt *stmt;
           48  +  Network *p_graph = NULL;
           49  +  wxString sql;
           50  +  char xsql[2048];
           51  +  char **results;
           52  +  int n_rows;
           53  +  int n_columns;
           54  +  int i;
           55  +  char *errMsg = NULL;
           56  +  char *col_name;
           57  +  int type;
           58  +  bool ok_from_column = false;
           59  +  bool ok_to_column = false;
           60  +  bool ok_cost_column = false;
           61  +  bool ok_geom_column = false;
           62  +  bool ok_name_column = false;
           63  +  bool ok_oneway_tofrom = false;
           64  +  bool ok_oneway_fromto = false;
           65  +  bool from_null = false;
           66  +  bool from_int = false;
           67  +  bool from_double = false;
           68  +  bool from_text = false;
           69  +  bool from_blob = false;
           70  +  bool to_null = false;
           71  +  bool to_int = false;
           72  +  bool to_double = false;
           73  +  bool to_text = false;
           74  +  bool to_blob = false;
           75  +  bool cost_null = false;
           76  +  bool cost_text = false;
           77  +  bool cost_blob = false;
           78  +  bool tofrom_null = false;
           79  +  bool tofrom_double = false;
           80  +  bool tofrom_text = false;
           81  +  bool tofrom_blob = false;
           82  +  bool fromto_null = false;
           83  +  bool fromto_double = false;
           84  +  bool fromto_text = false;
           85  +  bool fromto_blob = false;
           86  +  bool geom_null = false;
           87  +  bool geom_not_linestring = false;
           88  +  int col_n;
           89  +  int fromto_n = 0;
           90  +  int tofrom_n = 0;
           91  +  sqlite3_int64 rowid;
           92  +  sqlite3_int64 id_from = -1;
           93  +  sqlite3_int64 id_to = -1;
           94  +  char code_from[1024];
           95  +  char code_to[1024];
           96  +  double node_from_x;
           97  +  double node_from_y;
           98  +  double node_to_x;
           99  +  double node_to_y;
          100  +  double cost_val;
          101  +  int fromto;
          102  +  int tofrom;
          103  +  wxString endMsg;
          104  +  wxString msg;
          105  +  bool wr;
          106  +  bool aStarLength;
          107  +  double a_star_length;
          108  +  double a_star_coeff;
          109  +  double min_a_star_coeff = DBL_MAX;
          110  +  char *xname;
          111  +  char *xname2;
          112  +
          113  +  if (isNoGeometry == true)
          114  +    {
          115  +      BuildNetwork(table, from, to, name, cost, bidirectional, one_way,
          116  +                   one_way_from_to, one_way_to_from, dataTableName,
          117  +                   virtualTableName);
          118  +      return;
          119  +    }
          120  +
          121  +  ::wxBeginBusyCursor();
          122  +// checking for table existence
          123  +  sql =
          124  +    wxT("SELECT tbl_name FROM sqlite_master WHERE Lower(tbl_name) = Lower('");
          125  +  xname = (char *) malloc((table.Len() * 4) + 1);
          126  +  strcpy(xname, table.ToUTF8());
          127  +  xname2 = gaiaSingleQuotedSql(xname);
          128  +  free(xname);
          129  +  sql += wxString::FromUTF8(xname2);
          130  +  free(xname2);
          131  +  sql += wxT("') AND type = 'table'");
          132  +  strcpy(xsql, sql.ToUTF8());
          133  +  ret =
          134  +    sqlite3_get_table(SqliteHandle, xsql, &results, &n_rows, &n_columns,
          135  +                      &errMsg);
          136  +  if (ret != SQLITE_OK)
          137  +    {
          138  +// some error occurred 
          139  +      wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg),
          140  +                   wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
          141  +      sqlite3_free(errMsg);
          142  +      goto abort;
          143  +    }
          144  +  if (n_rows == 0)
          145  +    {
          146  +      // required table does not exists 
          147  +      wxMessageBox(wxT("ERROR: table ") + table + wxT(" does not exists"),
          148  +                   wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
          149  +      goto abort;
          150  +  } else
          151  +    sqlite3_free_table(results);
          152  +// checking for columns existence
          153  +  sql = wxT("PRAGMA table_info(");
          154  +  xname = (char *) malloc((table.Len() * 4) + 1);
          155  +  strcpy(xname, table.ToUTF8());
          156  +  xname2 = gaiaDoubleQuotedSql(xname);
          157  +  free(xname);
          158  +  sql += wxString::FromUTF8(xname2);
          159  +  free(xname2);
          160  +  sql += wxT(")");
          161  +  strcpy(xsql, sql.ToUTF8());
          162  +  ret =
          163  +    sqlite3_get_table(SqliteHandle, xsql, &results, &n_rows, &n_columns,
          164  +                      &errMsg);
          165  +  if (ret != SQLITE_OK)
          166  +    {
          167  +// some error occurred 
          168  +      wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg),
          169  +                   wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
          170  +      sqlite3_free(errMsg);
          171  +      goto abort;
          172  +    }
          173  +  if (n_rows > 1)
          174  +    {
          175  +      for (i = 1; i <= n_rows; i++)
          176  +        {
          177  +          char xcol[256];
          178  +          col_name = results[(i * n_columns) + 1];
          179  +          strcpy(xcol, from.ToUTF8());
          180  +          if (strcasecmp(xcol, col_name) == 0)
          181  +            ok_from_column = true;
          182  +          strcpy(xcol, to.ToUTF8());
          183  +          if (strcasecmp(xcol, col_name) == 0)
          184  +            ok_to_column = true;
          185  +          if (cost_length == false)
          186  +            {
          187  +              strcpy(xcol, cost.ToUTF8());
          188  +              if (strcasecmp(xcol, col_name) == 0)
          189  +                ok_cost_column = true;
          190  +            }
          191  +          strcpy(xcol, geometry.ToUTF8());
          192  +          if (strcasecmp(xcol, col_name) == 0)
          193  +            ok_geom_column = true;
          194  +          if (name.Len() > 0)
          195  +            {
          196  +              strcpy(xcol, name.ToUTF8());
          197  +              if (strcasecmp(xcol, col_name) == 0)
          198  +                ok_name_column = true;
          199  +            }
          200  +          if (one_way == true)
          201  +            {
          202  +              strcpy(xcol, one_way_from_to.ToUTF8());
          203  +              if (strcasecmp(xcol, col_name) == 0)
          204  +                ok_oneway_tofrom = true;
          205  +            }
          206  +          if (one_way == true)
          207  +            {
          208  +              strcpy(xcol, one_way_to_from.ToUTF8());
          209  +              if (strcasecmp(xcol, col_name) == 0)
          210  +                ok_oneway_fromto = true;
          211  +            }
          212  +        }
          213  +      sqlite3_free_table(results);
          214  +    }
          215  +  if (ok_from_column == true && ok_to_column == true && ok_geom_column == true)
          216  +    ;
          217  +  else
          218  +    goto abort;
          219  +  if (name.Len() > 0 && ok_name_column == false)
          220  +    goto abort;
          221  +  if (cost_length == false && ok_cost_column == false)
          222  +    goto abort;
          223  +  if (one_way == true && ok_oneway_tofrom == false)
          224  +    goto abort;
          225  +  if (one_way == true && ok_oneway_fromto == false)
          226  +    goto abort;
          227  +// checking column types
          228  +  p_graph = new Network();
          229  +  xname = (char *) malloc((from.Len() * 4) + 1);
          230  +  strcpy(xname, from.ToUTF8());
          231  +  xname2 = gaiaDoubleQuotedSql(xname);
          232  +  free(xname);
          233  +  sql = wxT("SELECT ") + wxString::FromUTF8(xname2);
          234  +  free(xname2);
          235  +  xname = (char *) malloc((to.Len() * 4) + 1);
          236  +  strcpy(xname, to.ToUTF8());
          237  +  xname2 = gaiaDoubleQuotedSql(xname);
          238  +  free(xname);
          239  +  sql += wxT(", ") + wxString::FromUTF8(xname2);
          240  +  free(xname2);
          241  +  xname = (char *) malloc((geometry.Len() * 4) + 1);
          242  +  strcpy(xname, geometry.ToUTF8());
          243  +  xname2 = gaiaDoubleQuotedSql(xname);
          244  +  free(xname);
          245  +  sql += wxT(", GeometryType(") + wxString::FromUTF8(xname2) + wxT(")");
          246  +  free(xname2);
          247  +  col_n = 3;
          248  +  if (cost_length == false)
          249  +    {
          250  +      xname = (char *) malloc((cost.Len() * 4) + 1);
          251  +      strcpy(xname, cost.ToUTF8());
          252  +      xname2 = gaiaDoubleQuotedSql(xname);
          253  +      free(xname);
          254  +      sql += wxT(", ") + wxString::FromUTF8(xname2);
          255  +      free(xname2);
          256  +      col_n++;
          257  +    }
          258  +  if (one_way == true)
          259  +    {
          260  +      xname = (char *) malloc((one_way_to_from.Len() * 4) + 1);
          261  +      strcpy(xname, one_way_to_from.ToUTF8());
          262  +      xname2 = gaiaDoubleQuotedSql(xname);
          263  +      free(xname);
          264  +      sql += wxT(", ") + wxString::FromUTF8(xname2);
          265  +      free(xname2);
          266  +      tofrom_n = col_n;
          267  +      col_n++;
          268  +      xname = (char *) malloc((one_way_from_to.Len() * 4) + 1);
          269  +      strcpy(xname, one_way_from_to.ToUTF8());
          270  +      xname2 = gaiaDoubleQuotedSql(xname);
          271  +      free(xname);
          272  +      sql += wxT(", ") + wxString::FromUTF8(xname2);
          273  +      free(xname2);
          274  +      fromto_n = col_n;
          275  +      col_n++;
          276  +    }
          277  +  xname = (char *) malloc((table.Len() * 4) + 1);
          278  +  strcpy(xname, table.ToUTF8());
          279  +  xname2 = gaiaDoubleQuotedSql(xname);
          280  +  free(xname);
          281  +  sql += wxT(" FROM ") + wxString::FromUTF8(xname2);
          282  +  free(xname2);
          283  +  strcpy(xsql, sql.ToUTF8());
          284  +  ret = sqlite3_prepare_v2(SqliteHandle, xsql, strlen(xsql), &stmt, NULL);
          285  +  if (ret != SQLITE_OK)
          286  +    {
          287  +      wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle));
          288  +      wxMessageBox(wxT("SQL error: ") + err, wxT("spatialite_gui"),
          289  +                   wxOK | wxICON_ERROR, this);
          290  +      goto abort;
          291  +    }
          292  +  n_columns = sqlite3_column_count(stmt);
          293  +  while (1)
          294  +    {
          295  +      ret = sqlite3_step(stmt);
          296  +      if (ret == SQLITE_DONE)
          297  +        break;
          298  +      if (ret == SQLITE_ROW)
          299  +        {
          300  +          // the NodeFrom type 
          301  +          type = sqlite3_column_type(stmt, 0);
          302  +          if (type == SQLITE_NULL)
          303  +            from_null = true;
          304  +          if (type == SQLITE_INTEGER)
          305  +            {
          306  +              from_int = true;
          307  +              id_from = sqlite3_column_int64(stmt, 0);
          308  +              p_graph->InsertNode(id_from);
          309  +            }
          310  +          if (type == SQLITE_FLOAT)
          311  +            from_double = true;
          312  +          if (type == SQLITE_TEXT)
          313  +            {
          314  +              from_text = true;
          315  +              strcpy(code_from, (char *) sqlite3_column_text(stmt, 0));
          316  +              p_graph->InsertNode(code_from);
          317  +            }
          318  +          if (type == SQLITE_BLOB)
          319  +            from_blob = true;
          320  +          // the NodeTo type 
          321  +          type = sqlite3_column_type(stmt, 1);
          322  +          if (type == SQLITE_NULL)
          323  +            to_null = true;
          324  +          if (type == SQLITE_INTEGER)
          325  +            {
          326  +              to_int = true;
          327  +              id_to = sqlite3_column_int64(stmt, 1);
          328  +              p_graph->InsertNode(id_to);
          329  +            }
          330  +          if (type == SQLITE_FLOAT)
          331  +            to_double = true;
          332  +          if (type == SQLITE_TEXT)
          333  +            {
          334  +              to_text = true;
          335  +              strcpy(code_to, (char *) sqlite3_column_text(stmt, 1));
          336  +              p_graph->InsertNode(code_to);
          337  +            }
          338  +          if (type == SQLITE_BLOB)
          339  +            to_blob = true;
          340  +          // the Geometry type 
          341  +          type = sqlite3_column_type(stmt, 2);
          342  +          if (type == SQLITE_NULL)
          343  +            geom_null = true;
          344  +          else if (strcmp("LINESTRING", (char *) sqlite3_column_text(stmt, 2))
          345  +                   != 0)
          346  +            geom_not_linestring = true;
          347  +          col_n = 3;
          348  +          if (cost_length == false)
          349  +            {
          350  +              // the Cost type 
          351  +              type = sqlite3_column_type(stmt, col_n);
          352  +              col_n++;
          353  +              if (type == SQLITE_NULL)
          354  +                cost_null = true;
          355  +              if (type == SQLITE_TEXT)
          356  +                cost_text = true;
          357  +              if (type == SQLITE_BLOB)
          358  +                cost_blob = true;
          359  +            }
          360  +          if (one_way == true)
          361  +            {
          362  +              // the FromTo type
          363  +              type = sqlite3_column_type(stmt, col_n);
          364  +              col_n++;
          365  +              if (type == SQLITE_NULL)
          366  +                fromto_null = true;
          367  +              if (type == SQLITE_FLOAT)
          368  +                fromto_double = true;
          369  +              if (type == SQLITE_TEXT)
          370  +                fromto_text = true;
          371  +              if (type == SQLITE_BLOB)
          372  +                fromto_blob = true;
          373  +              // the ToFrom type 
          374  +              type = sqlite3_column_type(stmt, col_n);
          375  +              col_n++;
          376  +              if (type == SQLITE_NULL)
          377  +                tofrom_null = true;
          378  +              if (type == SQLITE_FLOAT)
          379  +                tofrom_double = true;
          380  +              if (type == SQLITE_TEXT)
          381  +                tofrom_text = true;
          382  +              if (type == SQLITE_BLOB)
          383  +                tofrom_blob = true;
          384  +            }
          385  +      } else
          386  +        {
          387  +          wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle));
          388  +          wxMessageBox(wxT("sqlite3_step error: ") + err, wxT("spatialite_gui"),
          389  +                       wxOK | wxICON_ERROR, this);
          390  +          sqlite3_finalize(stmt);
          391  +          goto abort;
          392  +        }
          393  +    }
          394  +  sqlite3_finalize(stmt);
          395  +  ret = 1;
          396  +  if (from_null == true)
          397  +    ret = 0;
          398  +  if (from_blob == true)
          399  +    ret = 0;
          400  +  if (from_double == true)
          401  +    ret = 0;
          402  +  if (to_null == true)
          403  +    ret = 0;
          404  +  if (to_blob == true)
          405  +    ret = 0;
          406  +  if (to_double == true)
          407  +    ret = 0;
          408  +  if (geom_null == true)
          409  +    ret = 0;
          410  +  if (geom_not_linestring == true)
          411  +    ret = 0;
          412  +  if (cost_length == false)
          413  +    {
          414  +      if (cost_null == true)
          415  +        ret = 0;
          416  +      if (cost_blob == true)
          417  +        ret = 0;
          418  +      if (cost_text == true)
          419  +        ret = 0;
          420  +    }
          421  +  if (one_way == true)
          422  +    {
          423  +      if (fromto_null == true)
          424  +        ret = 0;
          425  +      if (fromto_blob == true)
          426  +        ret = 0;
          427  +      if (fromto_text == true)
          428  +        ret = 0;
          429  +      if (fromto_double == true)
          430  +        ret = 0;
          431  +      if (tofrom_null == true)
          432  +        ret = 0;
          433  +      if (tofrom_blob == true)
          434  +        ret = 0;
          435  +      if (tofrom_text == true)
          436  +        ret = 0;
          437  +      if (tofrom_double == true)
          438  +        ret = 0;
          439  +    }
          440  +  if (!ret)
          441  +    goto abort;
          442  +  if (from_int == true && to_int == true)
          443  +    {
          444  +      // each node is identified by an INTEGER id 
          445  +      p_graph->SetNodeCode(false);
          446  +  } else if (from_text == true && to_text == true)
          447  +    {
          448  +      // each node is identified by a TEXT code
          449  +      p_graph->SetNodeCode(true);
          450  +  } else
          451  +    goto abort;
          452  +  p_graph->InitNodes();
          453  +// checking topologic consistency 
          454  +  xname = (char *) malloc((from.Len() * 4) + 1);
          455  +  strcpy(xname, from.ToUTF8());
          456  +  xname2 = gaiaDoubleQuotedSql(xname);
          457  +  free(xname);
          458  +  sql = wxT("SELECT ROWID, ") + wxString::FromUTF8(xname2);
          459  +  free(xname2);
          460  +  xname = (char *) malloc((to.Len() * 4) + 1);
          461  +  strcpy(xname, to.ToUTF8());
          462  +  xname2 = gaiaDoubleQuotedSql(xname);
          463  +  free(xname);
          464  +  sql += wxT(", ") + wxString::FromUTF8(xname2) + wxT(", ");
          465  +  free(xname2);
          466  +  xname = (char *) malloc((geometry.Len() * 4) + 1);
          467  +  strcpy(xname, geometry.ToUTF8());
          468  +  xname2 = gaiaDoubleQuotedSql(xname);
          469  +  free(xname);
          470  +  sql +=
          471  +    wxT("X(StartPoint(") + wxString::FromUTF8(xname2) +
          472  +    wxT(")), Y(StartPoint(");
          473  +  sql += wxString::FromUTF8(xname2) + wxT(")), ");
          474  +  sql +=
          475  +    wxT("X(EndPoint(") + wxString::FromUTF8(xname2) + wxT(")), Y(EndPoint(");
          476  +  sql += wxString::FromUTF8(xname2) + wxT("))");
          477  +  free(xname2);
          478  +  if (aStarSupported == true)
          479  +    {
          480  +      // supporting A* algorithm
          481  +      if (cost_length == false)
          482  +        {
          483  +          xname = (char *) malloc((cost.Len() * 4) + 1);
          484  +          strcpy(xname, cost.ToUTF8());
          485  +          xname2 = gaiaDoubleQuotedSql(xname);
          486  +          free(xname);
          487  +          sql += wxT(", ") + wxString::FromUTF8(xname2);
          488  +          free(xname2);
          489  +          xname = (char *) malloc((geometry.Len() * 4) + 1);
          490  +          strcpy(xname, geometry.ToUTF8());
          491  +          xname2 = gaiaDoubleQuotedSql(xname);
          492  +          free(xname);
          493  +          sql += wxT(", GLength(") + wxString::FromUTF8(xname2) + wxT(")");
          494  +          free(xname2);
          495  +          col_n = 9;
          496  +          aStarLength = true;
          497  +      } else
          498  +        {
          499  +          xname = (char *) malloc((geometry.Len() * 4) + 1);
          500  +          strcpy(xname, geometry.ToUTF8());
          501  +          xname2 = gaiaDoubleQuotedSql(xname);
          502  +          free(xname);
          503  +          sql += wxT(", GLength(") + wxString::FromUTF8(xname2) + wxT(")");
          504  +          free(xname2);
          505  +          col_n = 9;
          506  +          aStarLength = false;
          507  +          min_a_star_coeff = 1.0;
          508  +        }
          509  +  } else
          510  +    {
          511  +      // A* algorithm unsupported
          512  +      if (cost_length == false)
          513  +        {
          514  +          xname = (char *) malloc((cost.Len() * 4) + 1);
          515  +          strcpy(xname, cost.ToUTF8());
          516  +          xname2 = gaiaDoubleQuotedSql(xname);
          517  +          free(xname);
          518  +          sql += wxT(", ") + wxString::FromUTF8(xname2);
          519  +          free(xname2);
          520  +          col_n = 8;
          521  +      } else
          522  +        {
          523  +          xname = (char *) malloc((geometry.Len() * 4) + 1);
          524  +          strcpy(xname, geometry.ToUTF8());
          525  +          xname2 = gaiaDoubleQuotedSql(xname);
          526  +          free(xname);
          527  +          sql += wxT(", GLength(") + wxString::FromUTF8(xname2) + wxT(")");
          528  +          free(xname2);
          529  +          col_n = 9;
          530  +        }
          531  +      aStarLength = false;
          532  +    }
          533  +  if (one_way == true)
          534  +    {
          535  +      xname = (char *) malloc((one_way_to_from.Len() * 4) + 1);
          536  +      strcpy(xname, one_way_to_from.ToUTF8());
          537  +      xname2 = gaiaDoubleQuotedSql(xname);
          538  +      free(xname);
          539  +      sql += wxT(", ") + wxString::FromUTF8(xname2);
          540  +      free(xname2);
          541  +      tofrom_n = col_n;
          542  +      col_n++;
          543  +      xname = (char *) malloc((one_way_from_to.Len() * 4) + 1);
          544  +      strcpy(xname, one_way_from_to.ToUTF8());
          545  +      xname2 = gaiaDoubleQuotedSql(xname);
          546  +      free(xname);
          547  +      sql += wxT(", ") + wxString::FromUTF8(xname2);
          548  +      free(xname2);
          549  +      fromto_n = col_n;
          550  +      col_n++;
          551  +    }
          552  +  xname = (char *) malloc((table.Len() * 4) + 1);
          553  +  strcpy(xname, table.ToUTF8());
          554  +  xname2 = gaiaDoubleQuotedSql(xname);
          555  +  free(xname);
          556  +  sql += wxT(" FROM ") + wxString::FromUTF8(xname2);
          557  +  free(xname2);
          558  +  strcpy(xsql, sql.ToUTF8());
          559  +  ret = sqlite3_prepare_v2(SqliteHandle, xsql, strlen(xsql), &stmt, NULL);
          560  +  if (ret != SQLITE_OK)
          561  +    {
          562  +      wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle));
          563  +      wxMessageBox(wxT("SQL error: ") + err, wxT("spatialite_gui"),
          564  +                   wxOK | wxICON_ERROR, this);
          565  +      goto abort;
          566  +    }
          567  +  n_columns = sqlite3_column_count(stmt);
          568  +  while (1)
          569  +    {
          570  +      ret = sqlite3_step(stmt);
          571  +      if (ret == SQLITE_DONE)
          572  +        break;
          573  +      if (ret == SQLITE_ROW)
          574  +        {
          575  +          fromto = true;
          576  +          tofrom = true;
          577  +          if (p_graph->IsNodeCode() == true)
          578  +            {
          579  +              id_from = -1;
          580  +              id_to = -1;
          581  +          } else
          582  +            {
          583  +              *code_from = '\0';
          584  +              *code_to = '\0';
          585  +            }
          586  +          // fetching the ROWID 
          587  +          rowid = sqlite3_column_int64(stmt, 0);
          588  +          // fetching the NodeFrom value
          589  +          if (p_graph->IsNodeCode() == true)
          590  +            strcpy(code_from, (char *) sqlite3_column_text(stmt, 1));
          591  +          else
          592  +            id_from = sqlite3_column_int64(stmt, 1);
          593  +          // fetching the NodeTo value
          594  +          if (p_graph->IsNodeCode() == true)
          595  +            strcpy(code_to, (char *) sqlite3_column_text(stmt, 2));
          596  +          else
          597  +            id_to = sqlite3_column_int64(stmt, 2);
          598  +          // fetching the NodeFromX value
          599  +          node_from_x = sqlite3_column_double(stmt, 3);
          600  +          // fetching the NodeFromY value 
          601  +          node_from_y = sqlite3_column_double(stmt, 4);
          602  +          // fetching the NodeFromX value 
          603  +          node_to_x = sqlite3_column_double(stmt, 5);
          604  +          // fetching the NodeFromY value 
          605  +          node_to_y = sqlite3_column_double(stmt, 6);
          606  +          // fetching the Cost value 
          607  +          cost_val = sqlite3_column_double(stmt, 7);
          608  +          if (one_way == true)
          609  +            {
          610  +              // fetching the OneWay-FromTo value
          611  +              fromto = sqlite3_column_int(stmt, fromto_n);
          612  +              // fetching the OneWay-ToFrom value
          613  +              tofrom = sqlite3_column_int(stmt, tofrom_n);
          614  +            }
          615  +          if (cost_val <= 0.0)
          616  +            p_graph->SetError();
          617  +          if (aStarLength == true)
          618  +            {
          619  +              // supporting A* - fetching the arc length
          620  +              a_star_length = sqlite3_column_double(stmt, 8);
          621  +              a_star_coeff = cost_val / a_star_length;
          622  +              if (a_star_coeff < min_a_star_coeff)
          623  +                min_a_star_coeff = a_star_coeff;
          624  +            }
          625  +          if (bidirectional == true)
          626  +            {
          627  +              if (fromto)
          628  +                {
          629  +                  if (p_graph->IsNodeCode() == true)
          630  +                    p_graph->AddArc(rowid, code_from, code_to, node_from_x,
          631  +                                    node_from_y, node_to_x, node_to_y,
          632  +                                    cost_val);
          633  +                  else
          634  +                    p_graph->AddArc(rowid, id_from, id_to, node_from_x,
          635  +                                    node_from_y, node_to_x, node_to_y,
          636  +                                    cost_val);
          637  +                }
          638  +              if (tofrom)
          639  +                {
          640  +                  if (p_graph->IsNodeCode() == true)
          641  +                    p_graph->AddArc(rowid, code_to, code_from, node_to_x,
          642  +                                    node_to_y, node_from_x, node_from_y,
          643  +                                    cost_val);
          644  +                  else
          645  +                    p_graph->AddArc(rowid, id_to, id_from, node_to_x, node_to_y,
          646  +                                    node_from_x, node_from_y, cost_val);
          647  +                }
          648  +          } else
          649  +            {
          650  +              if (p_graph->IsNodeCode() == true)
          651  +                p_graph->AddArc(rowid, code_from, code_to, node_from_x,
          652  +                                node_from_y, node_to_x, node_to_y, cost_val);
          653  +              else
          654  +                p_graph->AddArc(rowid, id_from, id_to, node_from_x, node_from_y,
          655  +                                node_to_x, node_to_y, cost_val);
          656  +            }
          657  +          if (p_graph->IsError() == true)
          658  +            {
          659  +              sqlite3_finalize(stmt);
          660  +              goto abort;
          661  +            }
          662  +      } else
          663  +        {
          664  +          wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle));
          665  +          wxMessageBox(wxT("sqlite3_step error: ") + err, wxT("spatialite_gui"),
          666  +                       wxOK | wxICON_ERROR, this);
          667  +          sqlite3_finalize(stmt);
          668  +          goto abort;
          669  +        }
          670  +    }
          671  +  sqlite3_finalize(stmt);
          672  +  ::wxEndBusyCursor();
          673  +  wr =
          674  +    CreateNetwork(p_graph, table, from, to, geometry, name,
          675  +                  aStarSupported, min_a_star_coeff, dataTableName,
          676  +                  virtualTableName);
          677  +  if (wr == true)
          678  +    {
          679  +      endMsg =
          680  +        wxT("OK: VirtualNetwork table '") + table +
          681  +        wxT("_net' successfully created");
          682  +      wxMessageBox(endMsg, wxT("spatialite_gui"), wxOK | wxICON_INFORMATION,
          683  +                   this);
          684  +  } else
          685  +    {
          686  +      endMsg =
          687  +        wxT("DB ERROR: VirtualNetwork table '") + table +
          688  +        wxT("_net' was not created");
          689  +      wxMessageBox(endMsg, wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
          690  +    }
          691  +  if (p_graph)
          692  +    delete p_graph;
          693  +  InitTableTree();
          694  +  return;
          695  +abort:
          696  +  ::wxEndBusyCursor();
          697  +  msg =
          698  +    wxT
          699  +    ("It's impossible to build a Network using the given configuration;\nsome fatal error occurred\n\n");
          700  +  msg += wxT("please note: using the 'spatialite_network' command-line tool\n");
          701  +  msg +=
          702  +    wxT
          703  +    ("you can obtain a full detailed report explaining causes for this failure");
          704  +  wxMessageBox(msg, wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
          705  +  if (p_graph)
          706  +    delete p_graph;
          707  +}
          708  +
          709  +void
          710  +  MyFrame::BuildNetwork(wxString & table, wxString & from, wxString & to,
          711  +                        wxString & name, wxString & cost, bool bidirectional,
          712  +                        bool one_way, wxString & one_way_from_to,
          713  +                        wxString & one_way_to_from, wxString & dataTableName,
          714  +                        wxString & virtualTableName)
          715  +{
          716  +//
          717  +// trying to build a Network - NO-GEOMETRY
          718  +// 
          719  +  int ret;
          720  +  sqlite3_stmt *stmt;
          721  +  Network *p_graph = NULL;
          722  +  wxString sql;
          723  +  char xsql[2048];
          724  +  char **results;
          725  +  int n_rows;
          726  +  int n_columns;
          727  +  int i;
          728  +  char *errMsg = NULL;
          729  +  char *col_name;
          730  +  int type;
          731  +  bool ok_from_column = false;
          732  +  bool ok_to_column = false;
          733  +  bool ok_cost_column = false;
          734  +  bool ok_name_column = false;
          735  +  bool ok_oneway_tofrom = false;
          736  +  bool ok_oneway_fromto = false;
          737  +  bool from_null = false;
          738  +  bool from_int = false;
          739  +  bool from_double = false;
          740  +  bool from_text = false;
          741  +  bool from_blob = false;
          742  +  bool to_null = false;
          743  +  bool to_int = false;
          744  +  bool to_double = false;
          745  +  bool to_text = false;
          746  +  bool to_blob = false;
          747  +  bool cost_null = false;
          748  +  bool cost_text = false;
          749  +  bool cost_blob = false;
          750  +  bool tofrom_null = false;
          751  +  bool tofrom_double = false;
          752  +  bool tofrom_text = false;
          753  +  bool tofrom_blob = false;
          754  +  bool fromto_null = false;
          755  +  bool fromto_double = false;
          756  +  bool fromto_text = false;
          757  +  bool fromto_blob = false;
          758  +  int col_n;
          759  +  int fromto_n = 0;
          760  +  int tofrom_n = 0;
          761  +  sqlite3_int64 rowid;
          762  +  sqlite3_int64 id_from = -1;
          763  +  sqlite3_int64 id_to = -1;
          764  +  char code_from[1024];
          765  +  char code_to[1024];
          766  +  double cost_val;
          767  +  int fromto;
          768  +  int tofrom;
          769  +  wxString endMsg;
          770  +  wxString msg;
          771  +  bool wr;
          772  +  char *xname;
          773  +  char *xname2;
          774  +
          775  +  ::wxBeginBusyCursor();
          776  +// checking for table existence
          777  +  sql =
          778  +    wxT("SELECT tbl_name FROM sqlite_master WHERE Lower(tbl_name) = Lower('");
          779  +  xname = (char *) malloc((table.Len() * 4) + 1);
          780  +  strcpy(xname, table.ToUTF8());
          781  +  xname2 = gaiaSingleQuotedSql(xname);
          782  +  free(xname);
          783  +  sql += wxString::FromUTF8(xname2);
          784  +  free(xname2);
          785  +  sql += wxT("') AND type = 'table'");
          786  +  strcpy(xsql, sql.ToUTF8());
          787  +  ret =
          788  +    sqlite3_get_table(SqliteHandle, xsql, &results, &n_rows, &n_columns,
          789  +                      &errMsg);
          790  +  if (ret != SQLITE_OK)
          791  +    {
          792  +// some error occurred 
          793  +      wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg),
          794  +                   wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
          795  +      sqlite3_free(errMsg);
          796  +      goto abort;
          797  +    }
          798  +  if (n_rows == 0)
          799  +    {
          800  +      // required table does not exists 
          801  +      wxMessageBox(wxT("ERROR: table ") + table + wxT(" does not exists"),
          802  +                   wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
          803  +      goto abort;
          804  +  } else
          805  +    sqlite3_free_table(results);
          806  +// checking for columns existence
          807  +  sql = wxT("PRAGMA table_info(");
          808  +  xname = (char *) malloc((table.Len() * 4) + 1);
          809  +  strcpy(xname, table.ToUTF8());
          810  +  xname2 = gaiaDoubleQuotedSql(xname);
          811  +  free(xname);
          812  +  sql += wxString::FromUTF8(xname2);
          813  +  free(xname2);
          814  +  sql += wxT(")");
          815  +  strcpy(xsql, sql.ToUTF8());
          816  +  ret =
          817  +    sqlite3_get_table(SqliteHandle, xsql, &results, &n_rows, &n_columns,
          818  +                      &errMsg);
          819  +  if (ret != SQLITE_OK)
          820  +    {
          821  +// some error occurred 
          822  +      wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg),
          823  +                   wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
          824  +      sqlite3_free(errMsg);
          825  +      goto abort;
          826  +    }
          827  +  if (n_rows > 1)
          828  +    {
          829  +      for (i = 1; i <= n_rows; i++)
          830  +        {
          831  +          char xcol[256];
          832  +          col_name = results[(i * n_columns) + 1];
          833  +          strcpy(xcol, from.ToUTF8());
          834  +          if (strcasecmp(xcol, col_name) == 0)
          835  +            ok_from_column = true;
          836  +          strcpy(xcol, to.ToUTF8());
          837  +          if (strcasecmp(xcol, col_name) == 0)
          838  +            ok_to_column = true;
          839  +          strcpy(xcol, cost.ToUTF8());
          840  +          if (strcasecmp(xcol, col_name) == 0)
          841  +            ok_cost_column = true;
          842  +          if (name.Len() > 0)
          843  +            {
          844  +              strcpy(xcol, name.ToUTF8());
          845  +              if (strcasecmp(xcol, col_name) == 0)
          846  +                ok_name_column = true;
          847  +            }
          848  +          if (one_way == true)
          849  +            {
          850  +              strcpy(xcol, one_way_from_to.ToUTF8());
          851  +              if (strcasecmp(xcol, col_name) == 0)
          852  +                ok_oneway_tofrom = true;
          853  +            }
          854  +          if (one_way == true)
          855  +            {
          856  +              strcpy(xcol, one_way_to_from.ToUTF8());
          857  +              if (strcasecmp(xcol, col_name) == 0)
          858  +                ok_oneway_fromto = true;
          859  +            }
          860  +        }
          861  +      sqlite3_free_table(results);
          862  +    }
          863  +  if (ok_from_column == true && ok_to_column == true)
          864  +    ;
          865  +  else
          866  +    goto abort;
          867  +  if (name.Len() > 0 && ok_name_column == false)
          868  +    goto abort;
          869  +  if (ok_cost_column == false)
          870  +    goto abort;
          871  +  if (one_way == true && ok_oneway_tofrom == false)
          872  +    goto abort;
          873  +  if (one_way == true && ok_oneway_fromto == false)
          874  +    goto abort;
          875  +// checking column types
          876  +  p_graph = new Network();
          877  +  xname = (char *) malloc((from.Len() * 4) + 1);
          878  +  strcpy(xname, from.ToUTF8());
          879  +  xname2 = gaiaDoubleQuotedSql(xname);
          880  +  free(xname);
          881  +  sql = wxT("SELECT ") + wxString::FromUTF8(xname2);
          882  +  free(xname2);
          883  +  xname = (char *) malloc((to.Len() * 4) + 1);
          884  +  strcpy(xname, to.ToUTF8());
          885  +  xname2 = gaiaDoubleQuotedSql(xname);
          886  +  free(xname);
          887  +  sql += wxT(", ") + wxString::FromUTF8(xname2);
          888  +  free(xname2);
          889  +  xname = (char *) malloc((cost.Len() * 4) + 1);
          890  +  strcpy(xname, cost.ToUTF8());
          891  +  xname2 = gaiaDoubleQuotedSql(xname);
          892  +  free(xname);
          893  +  sql += wxT(", ") + wxString::FromUTF8(xname2);
          894  +  free(xname2);
          895  +  col_n = 3;
          896  +  if (one_way == true)
          897  +    {
          898  +      xname = (char *) malloc((one_way_to_from.Len() * 4) + 1);
          899  +      strcpy(xname, one_way_to_from.ToUTF8());
          900  +      xname2 = gaiaDoubleQuotedSql(xname);
          901  +      free(xname);
          902  +      sql += wxT(", ") + wxString::FromUTF8(xname2);
          903  +      free(xname2);
          904  +      tofrom_n = col_n;
          905  +      col_n++;
          906  +      xname = (char *) malloc((one_way_from_to.Len() * 4) + 1);
          907  +      strcpy(xname, one_way_from_to.ToUTF8());
          908  +      xname2 = gaiaDoubleQuotedSql(xname);
          909  +      free(xname);
          910  +      sql += wxT(", ") + wxString::FromUTF8(xname2);
          911  +      free(xname2);
          912  +      fromto_n = col_n;
          913  +      col_n++;
          914  +    }
          915  +  xname = (char *) malloc((table.Len() * 4) + 1);
          916  +  strcpy(xname, table.ToUTF8());
          917  +  xname2 = gaiaDoubleQuotedSql(xname);
          918  +  free(xname);
          919  +  sql += wxT(" FROM ") + wxString::FromUTF8(xname2);
          920  +  free(xname2);
          921  +  strcpy(xsql, sql.ToUTF8());
          922  +  ret = sqlite3_prepare_v2(SqliteHandle, xsql, strlen(xsql), &stmt, NULL);
          923  +  if (ret != SQLITE_OK)
          924  +    {
          925  +      wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle));
          926  +      wxMessageBox(wxT("SQL error: ") + err, wxT("spatialite_gui"),
          927  +                   wxOK | wxICON_ERROR, this);
          928  +      goto abort;
          929  +    }
          930  +  n_columns = sqlite3_column_count(stmt);
          931  +  while (1)
          932  +    {
          933  +      ret = sqlite3_step(stmt);
          934  +      if (ret == SQLITE_DONE)
          935  +        break;
          936  +      if (ret == SQLITE_ROW)
          937  +        {
          938  +          // the NodeFrom type 
          939  +          type = sqlite3_column_type(stmt, 0);
          940  +          if (type == SQLITE_NULL)
          941  +            from_null = true;
          942  +          if (type == SQLITE_INTEGER)
          943  +            {
          944  +              from_int = true;
          945  +              id_from = sqlite3_column_int64(stmt, 0);
          946  +              p_graph->InsertNode(id_from);
          947  +            }
          948  +          if (type == SQLITE_FLOAT)
          949  +            from_double = true;
          950  +          if (type == SQLITE_TEXT)
          951  +            {
          952  +              from_text = true;
          953  +              strcpy(code_from, (char *) sqlite3_column_text(stmt, 0));
          954  +              p_graph->InsertNode(code_from);
          955  +            }
          956  +          if (type == SQLITE_BLOB)
          957  +            from_blob = true;
          958  +          // the NodeTo type 
          959  +          type = sqlite3_column_type(stmt, 1);
          960  +          if (type == SQLITE_NULL)
          961  +            to_null = true;
          962  +          if (type == SQLITE_INTEGER)
          963  +            {
          964  +              to_int = true;
          965  +              id_to = sqlite3_column_int64(stmt, 1);
          966  +              p_graph->InsertNode(id_to);
          967  +            }
          968  +          if (type == SQLITE_FLOAT)
          969  +            to_double = true;
          970  +          if (type == SQLITE_TEXT)
          971  +            {
          972  +              to_text = true;
          973  +              strcpy(code_to, (char *) sqlite3_column_text(stmt, 1));
          974  +              p_graph->InsertNode(code_to);
          975  +            }
          976  +          if (type == SQLITE_BLOB)
          977  +            to_blob = true;
          978  +          // the Cost type 
          979  +          type = sqlite3_column_type(stmt, 2);
          980  +          if (type == SQLITE_NULL)
          981  +            cost_null = true;
          982  +          if (type == SQLITE_TEXT)
          983  +            cost_text = true;
          984  +          if (type == SQLITE_BLOB)
          985  +            cost_blob = true;
          986  +          col_n = 3;
          987  +          if (one_way == true)
          988  +            {
          989  +              // the FromTo type
          990  +              type = sqlite3_column_type(stmt, col_n);
          991  +              col_n++;
          992  +              if (type == SQLITE_NULL)
          993  +                fromto_null = true;
          994  +              if (type == SQLITE_FLOAT)
          995  +                fromto_double = true;
          996  +              if (type == SQLITE_TEXT)
          997  +                fromto_text = true;
          998  +              if (type == SQLITE_BLOB)
          999  +                fromto_blob = true;
         1000  +              // the ToFrom type 
         1001  +              type = sqlite3_column_type(stmt, col_n);
         1002  +              col_n++;
         1003  +              if (type == SQLITE_NULL)
         1004  +                tofrom_null = true;
         1005  +              if (type == SQLITE_FLOAT)
         1006  +                tofrom_double = true;
         1007  +              if (type == SQLITE_TEXT)
         1008  +                tofrom_text = true;
         1009  +              if (type == SQLITE_BLOB)
         1010  +                tofrom_blob = true;
         1011  +            }
         1012  +      } else
         1013  +        {
         1014  +          wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle));
         1015  +          wxMessageBox(wxT("sqlite3_step error: ") + err, wxT("spatialite_gui"),
         1016  +                       wxOK | wxICON_ERROR, this);
         1017  +          sqlite3_finalize(stmt);
         1018  +          goto abort;
         1019  +        }
         1020  +    }
         1021  +  sqlite3_finalize(stmt);
         1022  +  ret = 1;
         1023  +  if (from_null == true)
         1024  +    ret = 0;
         1025  +  if (from_blob == true)
         1026  +    ret = 0;
         1027  +  if (from_double == true)
         1028  +    ret = 0;
         1029  +  if (to_null == true)
         1030  +    ret = 0;
         1031  +  if (to_blob == true)
         1032  +    ret = 0;
         1033  +  if (to_double == true)
         1034  +    ret = 0;
         1035  +  if (cost_null == true)
         1036  +    ret = 0;
         1037  +  if (cost_blob == true)
         1038  +    ret = 0;
         1039  +  if (cost_text == true)
         1040  +    ret = 0;
         1041  +  if (one_way == true)
         1042  +    {
         1043  +      if (fromto_null == true)
         1044  +        ret = 0;
         1045  +      if (fromto_blob == true)
         1046  +        ret = 0;
         1047  +      if (fromto_text == true)
         1048  +        ret = 0;
         1049  +      if (fromto_double == true)
         1050  +        ret = 0;
         1051  +      if (tofrom_null == true)
         1052  +        ret = 0;
         1053  +      if (tofrom_blob == true)
         1054  +        ret = 0;
         1055  +      if (tofrom_text == true)
         1056  +        ret = 0;
         1057  +      if (tofrom_double == true)
         1058  +        ret = 0;
         1059  +    }
         1060  +  if (!ret)
         1061  +    goto abort;
         1062  +  if (from_int == true && to_int == true)
         1063  +    {
         1064  +      // each node is identified by an INTEGER id 
         1065  +      p_graph->SetNodeCode(false);
         1066  +  } else if (from_text == true && to_text == true)
         1067  +    {
         1068  +      // each node is identified by a TEXT code
         1069  +      p_graph->SetNodeCode(true);
         1070  +  } else
         1071  +    goto abort;
         1072  +  p_graph->InitNodes();
         1073  +// checking topological consistency 
         1074  +  xname = (char *) malloc((from.Len() * 4) + 1);
         1075  +  strcpy(xname, from.ToUTF8());
         1076  +  xname2 = gaiaDoubleQuotedSql(xname);
         1077  +  free(xname);
         1078  +  sql = wxT("SELECT ROWID, ") + wxString::FromUTF8(xname2);
         1079  +  free(xname2);
         1080  +  xname = (char *) malloc((to.Len() * 4) + 1);
         1081  +  strcpy(xname, to.ToUTF8());
         1082  +  xname2 = gaiaDoubleQuotedSql(xname);
         1083  +  free(xname);
         1084  +  sql += wxT(", ") + wxString::FromUTF8(xname2);
         1085  +  free(xname2);
         1086  +  xname = (char *) malloc((cost.Len() * 4) + 1);
         1087  +  strcpy(xname, cost.ToUTF8());
         1088  +  xname2 = gaiaDoubleQuotedSql(xname);
         1089  +  free(xname);
         1090  +  sql += wxT(", ") + wxString::FromUTF8(xname2);
         1091  +  free(xname2);
         1092  +  col_n = 4;
         1093  +  if (one_way == true)
         1094  +    {
         1095  +      xname = (char *) malloc((one_way_to_from.Len() * 4) + 1);
         1096  +      strcpy(xname, one_way_to_from.ToUTF8());
         1097  +      xname2 = gaiaDoubleQuotedSql(xname);
         1098  +      free(xname);
         1099  +      sql += wxT(", ") + wxString::FromUTF8(xname2);
         1100  +      free(xname2);
         1101  +      tofrom_n = col_n;
         1102  +      col_n++;
         1103  +      xname = (char *) malloc((one_way_from_to.Len() * 4) + 1);
         1104  +      strcpy(xname, one_way_from_to.ToUTF8());
         1105  +      xname2 = gaiaDoubleQuotedSql(xname);
         1106  +      free(xname);
         1107  +      sql += wxT(", ") + wxString::FromUTF8(xname2);
         1108  +      free(xname2);
         1109  +      fromto_n = col_n;
         1110  +      col_n++;
         1111  +    }
         1112  +  xname = (char *) malloc((table.Len() * 4) + 1);
         1113  +  strcpy(xname, table.ToUTF8());
         1114  +  xname2 = gaiaDoubleQuotedSql(xname);
         1115  +  free(xname);
         1116  +  sql += wxT(" FROM ") + wxString::FromUTF8(xname2);
         1117  +  free(xname2);
         1118  +  strcpy(xsql, sql.ToUTF8());
         1119  +  ret = sqlite3_prepare_v2(SqliteHandle, xsql, strlen(xsql), &stmt, NULL);
         1120  +  if (ret != SQLITE_OK)
         1121  +    {
         1122  +      wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle));
         1123  +      wxMessageBox(wxT("SQL error: ") + err, wxT("spatialite_gui"),
         1124  +                   wxOK | wxICON_ERROR, this);
         1125  +      goto abort;
         1126  +    }
         1127  +  n_columns = sqlite3_column_count(stmt);
         1128  +  while (1)
         1129  +    {
         1130  +      ret = sqlite3_step(stmt);
         1131  +      if (ret == SQLITE_DONE)
         1132  +        break;
         1133  +      if (ret == SQLITE_ROW)
         1134  +        {
         1135  +          fromto = true;
         1136  +          tofrom = true;
         1137  +          if (p_graph->IsNodeCode() == true)
         1138  +            {
         1139  +              id_from = -1;
         1140  +              id_to = -1;
         1141  +          } else
         1142  +            {
         1143  +              *code_from = '\0';
         1144  +              *code_to = '\0';
         1145  +            }
         1146  +          // fetching the ROWID 
         1147  +          rowid = sqlite3_column_int64(stmt, 0);
         1148  +          // fetching the NodeFrom value
         1149  +          if (p_graph->IsNodeCode() == true)
         1150  +            strcpy(code_from, (char *) sqlite3_column_text(stmt, 1));
         1151  +          else
         1152  +            id_from = sqlite3_column_int64(stmt, 1);
         1153  +          // fetching the NodeTo value
         1154  +          if (p_graph->IsNodeCode() == true)
         1155  +            strcpy(code_to, (char *) sqlite3_column_text(stmt, 2));
         1156  +          else
         1157  +            id_to = sqlite3_column_int64(stmt, 2);
         1158  +          // fetching the Cost value 
         1159  +          cost_val = sqlite3_column_double(stmt, 3);
         1160  +          if (one_way == true)
         1161  +            {
         1162  +              // fetching the OneWay-FromTo value
         1163  +              fromto = sqlite3_column_int(stmt, fromto_n);
         1164  +              // fetching the OneWay-ToFrom value
         1165  +              tofrom = sqlite3_column_int(stmt, tofrom_n);
         1166  +            }
         1167  +          if (cost_val <= 0.0)
         1168  +            p_graph->SetError();
         1169  +          if (bidirectional == true)
         1170  +            {
         1171  +              if (fromto)
         1172  +                {
         1173  +                  if (p_graph->IsNodeCode() == true)
         1174  +                    p_graph->AddArc(rowid, code_from, code_to, cost_val);
         1175  +                  else
         1176  +                    p_graph->AddArc(rowid, id_from, id_to, cost_val);
         1177  +                }
         1178  +              if (tofrom)
         1179  +                {
         1180  +                  if (p_graph->IsNodeCode() == true)
         1181  +                    p_graph->AddArc(rowid, code_to, code_from, cost_val);
         1182  +                  else
         1183  +                    p_graph->AddArc(rowid, id_to, id_from, cost_val);
         1184  +                }
         1185  +          } else
         1186  +            {
         1187  +              if (p_graph->IsNodeCode() == true)
         1188  +                p_graph->AddArc(rowid, code_from, code_to, cost_val);
         1189  +              else
         1190  +                p_graph->AddArc(rowid, id_from, id_to, cost_val);
         1191  +            }
         1192  +          if (p_graph->IsError() == true)
         1193  +            {
         1194  +              sqlite3_finalize(stmt);
         1195  +              goto abort;
         1196  +            }
         1197  +      } else
         1198  +        {
         1199  +          wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle));
         1200  +          wxMessageBox(wxT("sqlite3_step error: ") + err, wxT("spatialite_gui"),
         1201  +                       wxOK | wxICON_ERROR, this);
         1202  +          sqlite3_finalize(stmt);
         1203  +          goto abort;
         1204  +        }
         1205  +    }
         1206  +  sqlite3_finalize(stmt);
         1207  +  ::wxEndBusyCursor();
         1208  +  wr =
         1209  +    CreateNetwork(p_graph, table, from, to, name, dataTableName,
         1210  +                  virtualTableName);
         1211  +  if (wr == true)
         1212  +    {
         1213  +      endMsg =
         1214  +        wxT("OK: VirtualNetwork table '") + table +
         1215  +        wxT("_net' successfully created");
         1216  +      wxMessageBox(endMsg, wxT("spatialite_gui"), wxOK | wxICON_INFORMATION,
         1217  +                   this);
         1218  +  } else
         1219  +    {
         1220  +      endMsg =
         1221  +        wxT("DB ERROR: VirtualNetwork table '") + table +
         1222  +        wxT("_net' was not created");
         1223  +      wxMessageBox(endMsg, wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
         1224  +    }
         1225  +  if (p_graph)
         1226  +    delete p_graph;
         1227  +  InitTableTree();
         1228  +  return;
         1229  +abort:
         1230  +  ::wxEndBusyCursor();
         1231  +  msg =
         1232  +    wxT
         1233  +    ("It's impossible to build a Network using the given configuration;\nsome fatal error occurred\n\n");
         1234  +  msg += wxT("please note: using the 'spatialite_network' command-line tool\n");
         1235  +  msg +=
         1236  +    wxT
         1237  +    ("you can obtain a full detailed report explaining causes for this failure");
         1238  +  wxMessageBox(msg, wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
         1239  +  if (p_graph)
         1240  +    delete p_graph;
         1241  +}
         1242  +
         1243  +void
         1244  +  MyFrame::OutputNetNode(unsigned char *auxbuf, int *size, int ind,
         1245  +                         bool node_code, int max_node_length, NetNode * pN,
         1246  +                         int endian_arch, bool aStarSupported)
         1247  +{
         1248  +//
         1249  +// exporting a Node into NETWORK-DATA
         1250  +//
         1251  +  int n_star;
         1252  +  int i;
         1253  +  NetArc **arc_array;
         1254  +  NetArc *pA;
         1255  +  unsigned char *out = auxbuf;
         1256  +  *out++ = GAIA_NET_NODE;
         1257  +  gaiaExport32(out, ind, 1, endian_arch); // the Node internal index 
         1258  +  out += 4;
         1259  +  if (node_code)
         1260  +    {
         1261  +      // Nodes are identified by a TEXT Code 
         1262  +      memset(out, '\0', max_node_length);
         1263  +      strcpy((char *) out, pN->GetCode().ToUTF8());
         1264  +      out += max_node_length;
         1265  +  } else
         1266  +    {
         1267  +      // Nodes are identified by an INTEGER Id 
         1268  +      gaiaExportI64(out, pN->GetId(), 1, endian_arch);
         1269  +      out += 8;
         1270  +    }
         1271  +  if (aStarSupported)
         1272  +    {
         1273  +      // in order to support the A* algorithm [X,Y] are required for each node
         1274  +      gaiaExport64(out, pN->GetX(), 1, endian_arch);
         1275  +      out += 8;
         1276  +      gaiaExport64(out, pN->GetY(), 1, endian_arch);
         1277  +      out += 8;
         1278  +    }
         1279  +  arc_array = pN->PrepareOutcomings(&n_star);
         1280  +  gaiaExport16(out, n_star, 1, endian_arch);  // # of outcoming arcs
         1281  +  out += 2;
         1282  +  for (i = 0; i < n_star; i++)
         1283  +    {
         1284  +      // exporting the outcoming arcs 
         1285  +      pA = *(arc_array + i);
         1286  +      *out++ = GAIA_NET_ARC;
         1287  +      gaiaExportI64(out, pA->GetRowId(), 1, endian_arch); // the Arc rowid
         1288  +      out += 8;
         1289  +      gaiaExport32(out, pA->GetTo()->GetInternalIndex(), 1, endian_arch); // the ToNode internal index
         1290  +      out += 4;
         1291  +      gaiaExport64(out, pA->GetCost(), 1, endian_arch); // the Arc Cost 
         1292  +      out += 8;
         1293  +      *out++ = GAIA_NET_END;
         1294  +    }
         1295  +  if (arc_array)
         1296  +    delete[]arc_array;
         1297  +  *out++ = GAIA_NET_END;
         1298  +  *size = out - auxbuf;
         1299  +}
         1300  +
         1301  +bool MyFrame::CreateNetwork(Network * p_graph, wxString & table,
         1302  +                            wxString & from, wxString & to,
         1303  +                            wxString & geometry, wxString & name,
         1304  +                            bool aStarSupported, double aStarCoeff,
         1305  +                            wxString & dataTableName,
         1306  +                            wxString & virtualTableName)
         1307  +{
         1308  +//
         1309  +// creates the NETWORK-DATA table 
         1310  +//
         1311  +  int ret;
         1312  +  wxString sql;
         1313  +  char xsql[1024];
         1314  +  char *errMsg = NULL;
         1315  +  unsigned char *auxbuf = new unsigned char[MAX_BLOCK];
         1316  +  unsigned char *buf = new unsigned char[MAX_BLOCK];
         1317  +  unsigned char *out;
         1318  +  sqlite3_stmt *stmt;
         1319  +  int i;
         1320  +  int size;
         1321  +  int endian_arch = gaiaEndianArch();
         1322  +  NetNode *pN;
         1323  +  int pk = 0;
         1324  +  int nodes_cnt = 0;
         1325  +  int len;
         1326  +  bool net_data_exists = false;
         1327  +  bool net_exists = false;
         1328  +  bool delete_existing = false;
         1329  +  char *xname;
         1330  +  char *xname2;
         1331  +  net_data_exists = TableAlreadyExists(dataTableName);
         1332  +  net_exists = TableAlreadyExists(virtualTableName);
         1333  +  if (net_data_exists == true || net_exists == true)
         1334  +    {
         1335  +      // asking permission to overwrite existing tables
         1336  +      wxString msg;
         1337  +      if (net_data_exists == true)
         1338  +        msg +=
         1339  +          wxT("A table named '") + dataTableName + wxT("' already exists\n");
         1340  +      if (net_exists == true)
         1341  +        msg +=
         1342  +          wxT("A table named '") + virtualTableName + wxT("' already exists\n");
         1343  +      msg += wxT("\nDo you allow DROPping existing table(s) ?");
         1344  +      wxMessageDialog confirm(this, msg, wxT("Confirm overwrite"),
         1345  +                              wxYES_NO | wxICON_QUESTION);
         1346  +      ret = confirm.ShowModal();
         1347  +      if (ret == wxID_YES)
         1348  +        delete_existing = true;
         1349  +    }
         1350  +  ::wxBeginBusyCursor();
         1351  +  for (i = 0; i < p_graph->GetNumNodes(); i++)
         1352  +    {
         1353  +      // setting the internal index to each Node 
         1354  +      pN = p_graph->GetSortedNode(i);
         1355  +      pN->SetInternalIndex(i);
         1356  +    }
         1357  +// starts a transaction 
         1358  +  ret = sqlite3_exec(SqliteHandle, "BEGIN", NULL, NULL, &errMsg);
         1359  +  if (ret != SQLITE_OK)
         1360  +    {
         1361  +      wxMessageBox(wxT("BEGIN error: ") + wxString::FromUTF8(errMsg),
         1362  +                   wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
         1363  +      sqlite3_free(errMsg);
         1364  +      goto abort;
         1365  +    }
         1366  +  if (delete_existing == true)
         1367  +    {
         1368  +      xname = (char *) malloc((virtualTableName.Len() * 4) + 1);
         1369  +      strcpy(xname, virtualTableName.ToUTF8());
         1370  +      xname2 = gaiaDoubleQuotedSql(xname);
         1371  +      free(xname);
         1372  +      sql = wxT("DROP TABLE IF EXISTS ") + wxString::FromUTF8(xname2);
         1373  +      free(xname2);
         1374  +      strcpy(xsql, sql.ToUTF8());
         1375  +      ret = sqlite3_exec(SqliteHandle, xsql, NULL, NULL, &errMsg);
         1376  +      if (ret != SQLITE_OK)
         1377  +        {
         1378  +          wxMessageBox(wxT("DROP TABLE error: ") + wxString::FromUTF8(errMsg),
         1379  +                       wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
         1380  +          sqlite3_free(errMsg);
         1381  +          goto abort;
         1382  +        }
         1383  +      xname = (char *) malloc((dataTableName.Len() * 4) + 1);
         1384  +      strcpy(xname, dataTableName.ToUTF8());
         1385  +      xname2 = gaiaDoubleQuotedSql(xname);
         1386  +      free(xname);
         1387  +      sql = wxT("DROP TABLE IF EXISTS ") + wxString::FromUTF8(xname2);
         1388  +      free(xname2);
         1389  +      strcpy(xsql, sql.ToUTF8());
         1390  +      ret = sqlite3_exec(SqliteHandle, xsql, NULL, NULL, &errMsg);
         1391  +      if (ret != SQLITE_OK)
         1392  +        {
         1393  +          wxMessageBox(wxT("DROP TABLE error: ") + wxString::FromUTF8(errMsg),
         1394  +                       wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
         1395  +          sqlite3_free(errMsg);
         1396  +          goto abort;
         1397  +        }
         1398  +    }
         1399  +// creating the NETWORK-DATA table 
         1400  +  xname = (char *) malloc((dataTableName.Len() * 4) + 1);
         1401  +  strcpy(xname, dataTableName.ToUTF8());
         1402  +  xname2 = gaiaDoubleQuotedSql(xname);
         1403  +  free(xname);
         1404  +  sql = wxT("CREATE TABLE ") + wxString::FromUTF8(xname2);
         1405  +  free(xname2);
         1406  +  sql += wxT(" (Id INTEGER PRIMARY KEY, NetworkData BLOB NOT NULL)");
         1407  +  strcpy(xsql, sql.ToUTF8());
         1408  +  ret = sqlite3_exec(SqliteHandle, xsql, NULL, NULL, &errMsg);
         1409  +  if (ret != SQLITE_OK)
         1410  +    {
         1411  +      wxMessageBox(wxT("CREATE TABLE error: ") + wxString::FromUTF8(errMsg),
         1412  +                   wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
         1413  +      sqlite3_free(errMsg);
         1414  +      goto abort;
         1415  +    }
         1416  +// preparing the SQL statement
         1417  +  xname = (char *) malloc((dataTableName.Len() * 4) + 1);
         1418  +  strcpy(xname, dataTableName.ToUTF8());
         1419  +  xname2 = gaiaDoubleQuotedSql(xname);
         1420  +  free(xname);
         1421  +  sql =
         1422  +    wxT("INSERT INTO ") + wxString::FromUTF8(xname2) +
         1423  +    wxT(" (Id, NetworkData) VALUES (?, ?)");
         1424  +  free(xname2);
         1425  +  strcpy(xsql, sql.ToUTF8());
         1426  +  ret = sqlite3_prepare_v2(SqliteHandle, xsql, strlen(xsql), &stmt, NULL);
         1427  +  if (ret != SQLITE_OK)
         1428  +    {
         1429  +      wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle));
         1430  +      wxMessageBox(wxT("INSERT error: ") + err, wxT("spatialite_gui"),
         1431  +                   wxOK | wxICON_ERROR, this);
         1432  +      goto abort;
         1433  +    }
         1434  +  if (pk == 0)
         1435  +    {
         1436  +      // preparing the HEADER block 
         1437  +      out = buf;
         1438  +      if (aStarSupported)
         1439  +        *out++ = GAIA_NET64_A_STAR_START;
         1440  +      else
         1441  +        *out++ = GAIA_NET64_START;
         1442  +      *out++ = GAIA_NET_HEADER;
         1443  +      gaiaExport32(out, p_graph->GetNumNodes(), 1, endian_arch);  // how many Nodes are there
         1444  +      out += 4;
         1445  +      if (p_graph->IsNodeCode() == true)
         1446  +        *out++ = GAIA_NET_CODE; // Nodes are identified by a TEXT code 
         1447  +      else
         1448  +        *out++ = GAIA_NET_ID;   // Nodes are identified by an INTEGER id 
         1449  +      if (p_graph->IsNodeCode() == true)
         1450  +        *out++ = p_graph->GetMaxCodeLength(); // max TEXT code length
         1451  +      else
         1452  +        *out++ = 0x00;
         1453  +      // inserting the main Table name 
         1454  +      *out++ = GAIA_NET_TABLE;
         1455  +      len = table.Len() + 1;
         1456  +      gaiaExport16(out, len, 1, endian_arch); // the Table Name length, including last '\0'
         1457  +      out += 2;
         1458  +      memset(out, '\0', len);
         1459  +      strcpy((char *) out, table.ToUTF8());
         1460  +      out += len;
         1461  +      // inserting the NodeFrom column name 
         1462  +      *out++ = GAIA_NET_FROM;
         1463  +      len = from.Len() + 1;
         1464  +      gaiaExport16(out, len, 1, endian_arch); // the NodeFrom column Name length, including last '\0'
         1465  +      out += 2;
         1466  +      memset(out, '\0', len);
         1467  +      strcpy((char *) out, from.ToUTF8());
         1468  +      out += len;
         1469  +      // inserting the NodeTo column name
         1470  +      *out++ = GAIA_NET_TO;
         1471  +      len = to.Len() + 1;
         1472  +      gaiaExport16(out, len, 1, endian_arch); // the NodeTo column Name length, including last '\0'
         1473  +      out += 2;
         1474  +      memset(out, '\0', len);
         1475  +      strcpy((char *) out, to.ToUTF8());
         1476  +      out += len;
         1477  +      // inserting the Geometry column name
         1478  +      *out++ = GAIA_NET_GEOM;
         1479  +      len = geometry.Len() + 1;
         1480  +      gaiaExport16(out, len, 1, endian_arch); // the Geometry column Name length, including last '\0'
         1481  +      out += 2;
         1482  +      memset(out, '\0', len);
         1483  +      strcpy((char *) out, geometry.ToUTF8());
         1484  +      out += len;
         1485  +      // inserting the Name column name - may be empty
         1486  +      *out++ = GAIA_NET_NAME;
         1487  +      if (name.Len() == 0)
         1488  +        len = 1;
         1489  +      else
         1490  +        len = name.Len() + 1;
         1491  +      gaiaExport16(out, len, 1, endian_arch); // the Name column Name length, including last '\0'
         1492  +      out += 2;
         1493  +      memset(out, '\0', len);
         1494  +      if (name.Len() > 0)
         1495  +        strcpy((char *) out, name.ToUTF8());
         1496  +      out += len;
         1497  +      if (aStarSupported)
         1498  +        {
         1499  +          // inserting the A* Heuristic Coeff
         1500  +          *out++ = GAIA_NET_A_STAR_COEFF;
         1501  +          gaiaExport64(out, aStarCoeff, 1, endian_arch);
         1502  +          out += 8;
         1503  +        }
         1504  +      *out++ = GAIA_NET_END;
         1505  +      // INSERTing the Header block 
         1506  +      sqlite3_reset(stmt);
         1507  +      sqlite3_clear_bindings(stmt);
         1508  +      sqlite3_bind_int64(stmt, 1, pk);
         1509  +      sqlite3_bind_blob(stmt, 2, buf, out - buf, SQLITE_STATIC);
         1510  +      ret = sqlite3_step(stmt);
         1511  +      if (ret == SQLITE_DONE || ret == SQLITE_ROW)
         1512  +        ;
         1513  +      else
         1514  +        {
         1515  +          wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle));
         1516  +          wxMessageBox(wxT("sqlite3_step error: ") + err, wxT("spatialite_gui"),
         1517  +                       wxOK | wxICON_ERROR, this);
         1518  +          sqlite3_finalize(stmt);
         1519  +          goto abort;
         1520  +        }
         1521  +      pk++;
         1522  +      // preparing a new block 
         1523  +      out = buf;
         1524  +      *out++ = GAIA_NET_BLOCK;
         1525  +      gaiaExport16(out, 0, 1, endian_arch); // how many Nodes are into this block 
         1526  +      out += 2;
         1527  +      nodes_cnt = 0;
         1528  +    }
         1529  +  for (i = 0; i < p_graph->GetNumNodes(); i++)
         1530  +    {
         1531  +      // looping on each Node 
         1532  +      pN = p_graph->GetSortedNode(i);
         1533  +      OutputNetNode(auxbuf, &size, i, p_graph->IsNodeCode(),
         1534  +                    p_graph->GetMaxCodeLength(), pN, endian_arch,
         1535  +                    aStarSupported);
         1536  +      if (size >= (MAX_BLOCK - (out - buf)))
         1537  +        {
         1538  +          // inserting the last block 
         1539  +          gaiaExport16(buf + 1, nodes_cnt, 1, endian_arch); // how many Nodes are into this block
         1540  +          sqlite3_reset(stmt);
         1541  +          sqlite3_clear_bindings(stmt);
         1542  +          sqlite3_bind_int64(stmt, 1, pk);
         1543  +          sqlite3_bind_blob(stmt, 2, buf, out - buf, SQLITE_STATIC);
         1544  +          ret = sqlite3_step(stmt);
         1545  +          if (ret == SQLITE_DONE || ret == SQLITE_ROW)
         1546  +            ;
         1547  +          else
         1548  +            {
         1549  +              wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle));
         1550  +              wxMessageBox(wxT("sqlite3_step error: ") + err,
         1551  +                           wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
         1552  +              sqlite3_finalize(stmt);
         1553  +              goto abort;
         1554  +            }
         1555  +          pk++;
         1556  +          // preparing a new block 
         1557  +          out = buf;
         1558  +          *out++ = GAIA_NET_BLOCK;
         1559  +          gaiaExport16(out, 0, 1, endian_arch); // how many Nodes are into this block
         1560  +          out += 2;
         1561  +          nodes_cnt = 0;
         1562  +        }
         1563  +      // inserting the current Node into the block 
         1564  +      nodes_cnt++;
         1565  +      memcpy(out, auxbuf, size);
         1566  +      out += size;
         1567  +    }
         1568  +  if (nodes_cnt)
         1569  +    {
         1570  +      // inserting the last block
         1571  +      gaiaExport16(buf + 1, nodes_cnt, 1, endian_arch); // how many Nodes are into this block
         1572  +      sqlite3_reset(stmt);
         1573  +      sqlite3_clear_bindings(stmt);
         1574  +      sqlite3_bind_int64(stmt, 1, pk);
         1575  +      sqlite3_bind_blob(stmt, 2, buf, out - buf, SQLITE_STATIC);
         1576  +      ret = sqlite3_step(stmt);
         1577  +      if (ret == SQLITE_DONE || ret == SQLITE_ROW)
         1578  +        ;
         1579  +      else
         1580  +        {
         1581  +          wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle));
         1582  +          wxMessageBox(wxT("sqlite3_step error: ") + err, wxT("spatialite_gui"),
         1583  +                       wxOK | wxICON_ERROR, this);
         1584  +          sqlite3_finalize(stmt);
         1585  +          goto abort;
         1586  +        }
         1587  +    }
         1588  +  sqlite3_finalize(stmt);
         1589  +// creating the VirtualNetwork NET-table
         1590  +  xname = (char *) malloc((virtualTableName.Len() * 4) + 1);
         1591  +  strcpy(xname, virtualTableName.ToUTF8());
         1592  +  xname2 = gaiaDoubleQuotedSql(xname);
         1593  +  free(xname);
         1594  +  sql = wxT("CREATE VIRTUAL TABLE ") + wxString::FromUTF8(xname2);
         1595  +  free(xname2);
         1596  +  sql += wxT(" USING VirtualNetwork(");
         1597  +  xname = (char *) malloc((dataTableName.Len() * 4) + 1);
         1598  +  strcpy(xname, dataTableName.ToUTF8());
         1599  +  xname2 = gaiaDoubleQuotedSql(xname);
         1600  +  free(xname);
         1601  +  sql += wxString::FromUTF8(xname2) + wxT(")");
         1602  +  free(xname2);
         1603  +  strcpy(xsql, sql.ToUTF8());
         1604  +  ret = sqlite3_exec(SqliteHandle, xsql, NULL, NULL, &errMsg);
         1605  +  if (ret != SQLITE_OK)
         1606  +    {
         1607  +      wxMessageBox(wxT("CREATE VIRTUAL TABLE error: ") +
         1608  +                   wxString::FromUTF8(errMsg), wxT("spatialite_gui"),
         1609  +                   wxOK | wxICON_ERROR, this);
         1610  +      sqlite3_free(errMsg);
         1611  +      goto abort;
         1612  +    }
         1613  +// commits the transaction 
         1614  +  ret = sqlite3_exec(SqliteHandle, "COMMIT", NULL, NULL, &errMsg);
         1615  +  if (ret != SQLITE_OK)
         1616  +    {
         1617  +      wxMessageBox(wxT("COMMIT error: ") + wxString::FromUTF8(errMsg),
         1618  +                   wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
         1619  +      sqlite3_free(errMsg);
         1620  +      goto abort;
         1621  +    }
         1622  +  if (buf)
         1623  +    delete[]buf;
         1624  +  if (auxbuf)
         1625  +    delete[]auxbuf;
         1626  +  ::wxEndBusyCursor();
         1627  +  return true;
         1628  +abort:
         1629  +  ::wxEndBusyCursor();
         1630  +  if (buf)
         1631  +    delete[]buf;
         1632  +  if (auxbuf)
         1633  +    delete[]auxbuf;
         1634  +  return true;
         1635  +  return false;
         1636  +}
         1637  +
         1638  +bool MyFrame::CreateNetwork(Network * p_graph, wxString & table,
         1639  +                            wxString & from, wxString & to, wxString & name,
         1640  +                            wxString & dataTableName,
         1641  +                            wxString & virtualTableName)
         1642  +{
         1643  +//
         1644  +// creates the NETWORK-DATA table . NO-GEOMETRY
         1645  +//
         1646  +  int ret;
         1647  +  wxString sql;
         1648  +  char xsql[1024];
         1649  +  char *errMsg = NULL;
         1650  +  unsigned char *auxbuf = new unsigned char[MAX_BLOCK];
         1651  +  unsigned char *buf = new unsigned char[MAX_BLOCK];
         1652  +  unsigned char *out;
         1653  +  sqlite3_stmt *stmt;
         1654  +  int i;
         1655  +  int size;
         1656  +  int endian_arch = gaiaEndianArch();
         1657  +  NetNode *pN;
         1658  +  int pk = 0;
         1659  +  int nodes_cnt = 0;
         1660  +  int len;
         1661  +  bool net_data_exists = false;
         1662  +  bool net_exists = false;
         1663  +  bool delete_existing = false;
         1664  +  char *xname;
         1665  +  char *xname2;
         1666  +  net_data_exists = TableAlreadyExists(dataTableName);
         1667  +  net_exists = TableAlreadyExists(virtualTableName);
         1668  +  if (net_data_exists == true || net_exists == true)
         1669  +    {
         1670  +      // asking permission to overwrite existing tables
         1671  +      wxString msg;
         1672  +      if (net_data_exists == true)
         1673  +        msg +=
         1674  +          wxT("A table named '") + dataTableName + wxT("' already exists\n");
         1675  +      if (net_exists == true)
         1676  +        msg +=
         1677  +          wxT("A table named '") + virtualTableName + wxT("' already exists\n");
         1678  +      msg += wxT("\nDo you allow DROPping existing table(s) ?");
         1679  +      wxMessageDialog confirm(this, msg, wxT("Confirm overwrite"),
         1680  +                              wxYES_NO | wxICON_QUESTION);
         1681  +      ret = confirm.ShowModal();
         1682  +      if (ret == wxID_YES)
         1683  +        delete_existing = true;
         1684  +    }
         1685  +  ::wxBeginBusyCursor();
         1686  +  for (i = 0; i < p_graph->GetNumNodes(); i++)
         1687  +    {
         1688  +      // setting the internal index to each Node 
         1689  +      pN = p_graph->GetSortedNode(i);
         1690  +      pN->SetInternalIndex(i);
         1691  +    }
         1692  +// starts a transaction 
         1693  +  ret = sqlite3_exec(SqliteHandle, "BEGIN", NULL, NULL, &errMsg);
         1694  +  if (ret != SQLITE_OK)
         1695  +    {
         1696  +      wxMessageBox(wxT("BEGIN error: ") + wxString::FromUTF8(errMsg),
         1697  +                   wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
         1698  +      sqlite3_free(errMsg);
         1699  +      goto abort;
         1700  +    }
         1701  +  if (delete_existing == true)
         1702  +    {
         1703  +      xname = (char *) malloc((virtualTableName.Len() * 4) + 1);
         1704  +      strcpy(xname, virtualTableName.ToUTF8());
         1705  +      xname2 = gaiaDoubleQuotedSql(xname);
         1706  +      free(xname);
         1707  +      sql = wxT("DROP TABLE IF EXISTS ") + wxString::FromUTF8(xname2);
         1708  +      free(xname2);
         1709  +      strcpy(xsql, sql.ToUTF8());
         1710  +      ret = sqlite3_exec(SqliteHandle, xsql, NULL, NULL, &errMsg);
         1711  +      if (ret != SQLITE_OK)
         1712  +        {
         1713  +          wxMessageBox(wxT("DROP TABLE error: ") + wxString::FromUTF8(errMsg),
         1714  +                       wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
         1715  +          sqlite3_free(errMsg);
         1716  +          goto abort;
         1717  +        }
         1718  +      xname = (char *) malloc((dataTableName.Len() * 4) + 1);
         1719  +      strcpy(xname, dataTableName.ToUTF8());
         1720  +      xname2 = gaiaDoubleQuotedSql(xname);
         1721  +      free(xname);
         1722  +      sql = wxT("DROP TABLE IF EXISTS ") + wxString::FromUTF8(xname2);
         1723  +      free(xname2);
         1724  +      strcpy(xsql, sql.ToUTF8());
         1725  +      ret = sqlite3_exec(SqliteHandle, xsql, NULL, NULL, &errMsg);
         1726  +      if (ret != SQLITE_OK)
         1727  +        {
         1728  +          wxMessageBox(wxT("DROP TABLE error: ") + wxString::FromUTF8(errMsg),
         1729  +                       wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
         1730  +          sqlite3_free(errMsg);
         1731  +          goto abort;
         1732  +        }
         1733  +    }
         1734  +// creating the NETWORK-DATA table 
         1735  +  xname = (char *) malloc((dataTableName.Len() * 4) + 1);
         1736  +  strcpy(xname, dataTableName.ToUTF8());
         1737  +  xname2 = gaiaDoubleQuotedSql(xname);
         1738  +  free(xname);
         1739  +  sql = wxT("CREATE TABLE ") + wxString::FromUTF8(xname2);
         1740  +  free(xname2);
         1741  +  sql += wxT(" (Id INTEGER PRIMARY KEY, NetworkData BLOB NOT NULL)");
         1742  +  strcpy(xsql, sql.ToUTF8());
         1743  +  ret = sqlite3_exec(SqliteHandle, xsql, NULL, NULL, &errMsg);
         1744  +  if (ret != SQLITE_OK)
         1745  +    {
         1746  +      wxMessageBox(wxT("CREATE TABLE error: ") + wxString::FromUTF8(errMsg),
         1747  +                   wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
         1748  +      sqlite3_free(errMsg);
         1749  +      goto abort;
         1750  +    }
         1751  +// preparing the SQL statement
         1752  +  xname = (char *) malloc((dataTableName.Len() * 4) + 1);
         1753  +  strcpy(xname, dataTableName.ToUTF8());
         1754  +  xname2 = gaiaDoubleQuotedSql(xname);
         1755  +  free(xname);
         1756  +  sql =
         1757  +    wxT("INSERT INTO ") + wxString::FromUTF8(xname2) +
         1758  +    wxT(" (Id, NetworkData) VALUES (?, ?)");
         1759  +  free(xname2);
         1760  +  strcpy(xsql, sql.ToUTF8());
         1761  +  ret = sqlite3_prepare_v2(SqliteHandle, xsql, strlen(xsql), &stmt, NULL);
         1762  +  if (ret != SQLITE_OK)
         1763  +    {
         1764  +      wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle));
         1765  +      wxMessageBox(wxT("INSERT error: ") + err, wxT("spatialite_gui"),
         1766  +                   wxOK | wxICON_ERROR, this);
         1767  +      goto abort;
         1768  +    }
         1769  +  if (pk == 0)
         1770  +    {
         1771  +      // preparing the HEADER block 
         1772  +      out = buf;
         1773  +      *out++ = GAIA_NET64_START;
         1774  +      *out++ = GAIA_NET_HEADER;
         1775  +      gaiaExport32(out, p_graph->GetNumNodes(), 1, endian_arch);  // how many Nodes are there
         1776  +      out += 4;
         1777  +      if (p_graph->IsNodeCode() == true)
         1778  +        *out++ = GAIA_NET_CODE; // Nodes are identified by a TEXT code 
         1779  +      else
         1780  +        *out++ = GAIA_NET_ID;   // Nodes are identified by an INTEGER id 
         1781  +      if (p_graph->IsNodeCode() == true)
         1782  +        *out++ = p_graph->GetMaxCodeLength(); // max TEXT code length
         1783  +      else
         1784  +        *out++ = 0x00;
         1785  +      // inserting the main Table name 
         1786  +      *out++ = GAIA_NET_TABLE;
         1787  +      len = table.Len() + 1;
         1788  +      gaiaExport16(out, len, 1, endian_arch); // the Table Name length, including last '\0'
         1789  +      out += 2;
         1790  +      memset(out, '\0', len);
         1791  +      strcpy((char *) out, table.ToUTF8());
         1792  +      out += len;
         1793  +      // inserting the NodeFrom column name 
         1794  +      *out++ = GAIA_NET_FROM;
         1795  +      len = from.Len() + 1;
         1796  +      gaiaExport16(out, len, 1, endian_arch); // the NodeFrom column Name length, including last '\0'
         1797  +      out += 2;
         1798  +      memset(out, '\0', len);
         1799  +      strcpy((char *) out, from.ToUTF8());
         1800  +      out += len;
         1801  +      // inserting the NodeTo column name
         1802  +      *out++ = GAIA_NET_TO;
         1803  +      len = to.Len() + 1;
         1804  +      gaiaExport16(out, len, 1, endian_arch); // the NodeTo column Name length, including last '\0'
         1805  +      out += 2;
         1806  +      memset(out, '\0', len);
         1807  +      strcpy((char *) out, to.ToUTF8());
         1808  +      out += len;
         1809  +      // inserting the Geometry column name
         1810  +      *out++ = GAIA_NET_GEOM;
         1811  +      len = 1;
         1812  +      gaiaExport16(out, len, 1, endian_arch); // the Geometry column Name length, including last '\0'
         1813  +      out += 2;
         1814  +      memset(out, '\0', len);
         1815  +      out += len;
         1816  +      // inserting the Name column name - may be empty
         1817  +      *out++ = GAIA_NET_NAME;
         1818  +      if (name.Len() == 0)
         1819  +        len = 1;
         1820  +      else
         1821  +        len = name.Len() + 1;
         1822  +      gaiaExport16(out, len, 1, endian_arch); // the Name column Name length, including last '\0'
         1823  +      out += 2;
         1824  +      memset(out, '\0', len);
         1825  +      if (name.Len() > 0)
         1826  +        strcpy((char *) out, name.ToUTF8());
         1827  +      out += len;
         1828  +      *out++ = GAIA_NET_END;
         1829  +      // INSERTing the Header block 
         1830  +      sqlite3_reset(stmt);
         1831  +      sqlite3_clear_bindings(stmt);
         1832  +      sqlite3_bind_int64(stmt, 1, pk);
         1833  +      sqlite3_bind_blob(stmt, 2, buf, out - buf, SQLITE_STATIC);
         1834  +      ret = sqlite3_step(stmt);
         1835  +      if (ret == SQLITE_DONE || ret == SQLITE_ROW)
         1836  +        ;
         1837  +      else
         1838  +        {
         1839  +          wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle));
         1840  +          wxMessageBox(wxT("sqlite3_step error: ") + err, wxT("spatialite_gui"),
         1841  +                       wxOK | wxICON_ERROR, this);
         1842  +          sqlite3_finalize(stmt);
         1843  +          goto abort;
         1844  +        }
         1845  +      pk++;
         1846  +      // preparing a new block 
         1847  +      out = buf;
         1848  +      *out++ = GAIA_NET_BLOCK;
         1849  +      gaiaExport16(out, 0, 1, endian_arch); // how many Nodes are into this block 
         1850  +      out += 2;
         1851  +      nodes_cnt = 0;
         1852  +    }
         1853  +  for (i = 0; i < p_graph->GetNumNodes(); i++)
         1854  +    {
         1855  +      // looping on each Node 
         1856  +      pN = p_graph->GetSortedNode(i);
         1857  +      OutputNetNode(auxbuf, &size, i, p_graph->IsNodeCode(),
         1858  +                    p_graph->GetMaxCodeLength(), pN, endian_arch, 0);
         1859  +      if (size >= (MAX_BLOCK - (out - buf)))
         1860  +        {
         1861  +          // inserting the last block 
         1862  +          gaiaExport16(buf + 1, nodes_cnt, 1, endian_arch); // how many Nodes are into this block
         1863  +          sqlite3_reset(stmt);
         1864  +          sqlite3_clear_bindings(stmt);
         1865  +          sqlite3_bind_int64(stmt, 1, pk);
         1866  +          sqlite3_bind_blob(stmt, 2, buf, out - buf, SQLITE_STATIC);
         1867  +          ret = sqlite3_step(stmt);
         1868  +          if (ret == SQLITE_DONE || ret == SQLITE_ROW)
         1869  +            ;
         1870  +          else
         1871  +            {
         1872  +              wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle));
         1873  +              wxMessageBox(wxT("sqlite3_step error: ") + err,
         1874  +                           wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
         1875  +              sqlite3_finalize(stmt);
         1876  +              goto abort;
         1877  +            }
         1878  +          pk++;
         1879  +          // preparing a new block 
         1880  +          out = buf;
         1881  +          *out++ = GAIA_NET_BLOCK;
         1882  +          gaiaExport16(out, 0, 1, endian_arch); // how many Nodes are into this block
         1883  +          out += 2;
         1884  +          nodes_cnt = 0;
         1885  +        }
         1886  +      // inserting the current Node into the block 
         1887  +      nodes_cnt++;
         1888  +      memcpy(out, auxbuf, size);
         1889  +      out += size;
         1890  +    }
         1891  +  if (nodes_cnt)
         1892  +    {
         1893  +      // inserting the last block
         1894  +      gaiaExport16(buf + 1, nodes_cnt, 1, endian_arch); // how many Nodes are into this block
         1895  +      sqlite3_reset(stmt);
         1896  +      sqlite3_clear_bindings(stmt);
         1897  +      sqlite3_bind_int64(stmt, 1, pk);
         1898  +      sqlite3_bind_blob(stmt, 2, buf, out - buf, SQLITE_STATIC);
         1899  +      ret = sqlite3_step(stmt);
         1900  +      if (ret == SQLITE_DONE || ret == SQLITE_ROW)
         1901  +        ;
         1902  +      else
         1903  +        {
         1904  +          wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle));
         1905  +          wxMessageBox(wxT("sqlite3_step error: ") + err, wxT("spatialite_gui"),
         1906  +                       wxOK | wxICON_ERROR, this);
         1907  +          sqlite3_finalize(stmt);
         1908  +          goto abort;
         1909  +        }
         1910  +    }
         1911  +  sqlite3_finalize(stmt);
         1912  +// creating the VirtualNetwork NET-table
         1913  +  xname = (char *) malloc((virtualTableName.Len() * 4) + 1);
         1914  +  strcpy(xname, virtualTableName.ToUTF8());
         1915  +  xname2 = gaiaDoubleQuotedSql(xname);
         1916  +  free(xname);
         1917  +  sql = wxT("CREATE VIRTUAL TABLE ") + wxString::FromUTF8(xname2);
         1918  +  free(xname2);
         1919  +  sql += wxT(" USING VirtualNetwork(");
         1920  +  xname = (char *) malloc((dataTableName.Len() * 4) + 1);
         1921  +  strcpy(xname, dataTableName.ToUTF8());
         1922  +  xname2 = gaiaDoubleQuotedSql(xname);
         1923  +  free(xname);
         1924  +  sql += wxString::FromUTF8(xname2) + wxT(")");
         1925  +  free(xname2);
         1926  +  strcpy(xsql, sql.ToUTF8());
         1927  +  ret = sqlite3_exec(SqliteHandle, xsql, NULL, NULL, &errMsg);
         1928  +  if (ret != SQLITE_OK)
         1929  +    {
         1930  +      wxMessageBox(wxT("CREATE VIRTUAL TABLE error: ") +
         1931  +                   wxString::FromUTF8(errMsg), wxT("spatialite_gui"),
         1932  +                   wxOK | wxICON_ERROR, this);
         1933  +      sqlite3_free(errMsg);
         1934  +      goto abort;
         1935  +    }
         1936  +// commits the transaction 
         1937  +  ret = sqlite3_exec(SqliteHandle, "COMMIT", NULL, NULL, &errMsg);
         1938  +  if (ret != SQLITE_OK)
         1939  +    {
         1940  +      wxMessageBox(wxT("COMMIT error: ") + wxString::FromUTF8(errMsg),
         1941  +                   wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
         1942  +      sqlite3_free(errMsg);
         1943  +      goto abort;
         1944  +    }
         1945  +  if (buf)
         1946  +    delete[]buf;
         1947  +  if (auxbuf)
         1948  +    delete[]auxbuf;
         1949  +  ::wxEndBusyCursor();
         1950  +  return true;
         1951  +abort:
         1952  +  ::wxEndBusyCursor();
         1953  +  if (buf)
         1954  +    delete[]buf;
         1955  +  if (auxbuf)
         1956  +    delete[]auxbuf;
         1957  +  return true;
         1958  +  return false;
         1959  +}
         1960  +
         1961  +int cmp_prenodes_code(const void *p1, const void *p2)
         1962  +{
         1963  +//
         1964  +// compares two preliminary nodes  by CODE [for QSORT] 
         1965  +//
         1966  +  NetNodePre *pP1 = *((NetNodePre **) p1);
         1967  +  NetNodePre *pP2 = *((NetNodePre **) p2);
         1968  +  return pP1->GetCode().Cmp(pP2->GetCode());
         1969  +}
         1970  +
         1971  +int cmp_prenodes_id(const void *p1, const void *p2)
         1972  +{
         1973  +//
         1974  +// compares two preliminary nodes  by ID [for QSORT] 
         1975  +//
         1976  +  NetNodePre *pP1 = *((NetNodePre **) p1);
         1977  +  NetNodePre *pP2 = *((NetNodePre **) p2);
         1978  +  if (pP1->GetId() == pP2->GetId())
         1979  +    return 0;
         1980  +  if (pP1->GetId() > pP2->GetId())
         1981  +    return 1;
         1982  +  return -1;
         1983  +}
         1984  +
         1985  +int cmp_nodes2_code(const void *p1, const void *p2)
         1986  +{
         1987  +//
         1988  +// compares two nodes  by CODE [for BSEARCH] 
         1989  +//
         1990  +  NetNode *pN1 = (NetNode *) p1;
         1991  +  NetNode *pN2 = *((NetNode **) p2);
         1992  +  return pN1->GetCode().Cmp(pN2->GetCode());
         1993  +}
         1994  +
         1995  +int cmp_nodes2_id(const void *p1, const void *p2)
         1996  +{
         1997  +//
         1998  +// compares two nodes  by ID [for BSEARCH] 
         1999  +//
         2000  +  NetNode *pN1 = (NetNode *) p1;
         2001  +  NetNode *pN2 = *((NetNode **) p2);
         2002  +  if (pN1->GetId() == pN2->GetId())
         2003  +    return 0;
         2004  +  if (pN1->GetId() > pN2->GetId())
         2005  +    return 1;
         2006  +  return -1;
         2007  +}
         2008  +
         2009  +int cmp_nodes1_code(const void *p1, const void *p2)
         2010  +{
         2011  +//
         2012  +// compares two nodes  by CODE [for QSORT] 
         2013  +//
         2014  +  NetNode *pN1 = *((NetNode **) p1);
         2015  +  NetNode *pN2 = *((NetNode **) p2);
         2016  +  return pN1->GetCode().Cmp(pN2->GetCode());
         2017  +}
         2018  +
         2019  +int cmp_nodes1_id(const void *p1, const void *p2)
         2020  +{
         2021  +//
         2022  +// compares two nodes  by ID [for QSORT ]
         2023  +//
         2024  +  NetNode *pN1 = *((NetNode **) p1);
         2025  +  NetNode *pN2 = *((NetNode **) p2);
         2026  +  if (pN1->GetId() == pN2->GetId())
         2027  +    return 0;
         2028  +  if (pN1->GetId() > pN2->GetId())
         2029  +    return 1;
         2030  +  return -1;
         2031  +}
         2032  +
         2033  +NetNodePre::NetNodePre(sqlite3_int64 id)
         2034  +{
         2035  +//
         2036  +// Network Node [preliminary] constructor
         2037  +//
         2038  +  Id = id;
         2039  +  Code = wxT("");
         2040  +  Next = NULL;
         2041  +}
         2042  +
         2043  +NetNodePre::NetNodePre(const char *code)
         2044  +{
         2045  +//
         2046  +// Network Node [preliminary] constructor
         2047  +//
         2048  +  Id = -1;
         2049  +  Code = wxString::FromUTF8(code);
         2050  +  Code.Truncate(30);
         2051  +  Next = NULL;
         2052  +}
         2053  +
         2054  +NetNode::NetNode(sqlite3_int64 id)
         2055  +{
         2056  +//
         2057  +// Network Node [final] constructor
         2058  +//
         2059  +  InternalIndex = -1;
         2060  +  Id = id;
         2061  +  Code = wxT("");
         2062  +  X = DBL_MAX;
         2063  +  Y = DBL_MAX;
         2064  +  First = NULL;
         2065  +  Last = NULL;
         2066  +  Next = NULL;
         2067  +}
         2068  +
         2069  +NetNode::NetNode(wxString & code)
         2070  +{
         2071  +//
         2072  +// Network Node [final] constructor
         2073  +//
         2074  +  InternalIndex = -1;
         2075  +  Id = -1;
         2076  +  Code = code;
         2077  +  X = DBL_MAX;
         2078  +  Y = DBL_MAX;
         2079  +  First = NULL;
         2080  +  Last = NULL;
         2081  +  Next = NULL;
         2082  +}
         2083  +
         2084  +NetNode::~NetNode()
         2085  +{
         2086  +// Network Node [final] destructor
         2087  +  NetArcRef *pAR;
         2088  +  NetArcRef *pARn;
         2089  +  pAR = First;
         2090  +  while (pAR)
         2091  +    {
         2092  +      pARn = pAR->GetNext();
         2093  +      delete pAR;
         2094  +      pAR = pARn;
         2095  +    }
         2096  +}
         2097  +
         2098  +void NetNode::AddOutcoming(NetArc * pA)
         2099  +{
         2100  +//
         2101  +// adds an outcoming Arc to a Node 
         2102  +//
         2103  +  NetArcRef *pAR = new NetArcRef(pA);
         2104  +  if (!First)
         2105  +    First = pAR;
         2106  +  if (Last)
         2107  +    Last->SetNext(pAR);
         2108  +  Last = pAR;
         2109  +}
         2110  +
         2111  +NetArc **NetNode::PrepareOutcomings(int *count)
         2112  +{
         2113  +//
         2114  +// preparing the outcoming arc array 
         2115  +//
         2116  +  NetArc **arc_array;
         2117  +  int n = 0;
         2118  +  int i;
         2119  +  bool ok;
         2120  +  NetArcRef *pAR;
         2121  +  NetArc *pA0;
         2122  +  NetArc *pA1;
         2123  +  pAR = First;
         2124  +  while (pAR)
         2125  +    {
         2126  +      // counting how many outcoming arcs are there 
         2127  +      n++;
         2128  +      pAR = pAR->GetNext();
         2129  +    }
         2130  +  if (!n)
         2131  +    {
         2132  +      *count = 0;
         2133  +      return NULL;
         2134  +    }
         2135  +  arc_array = new NetArc *[n];
         2136  +  i = 0;
         2137  +  pAR = First;
         2138  +  while (pAR)
         2139  +    {
         2140  +      // populating the arcs array 
         2141  +      *(arc_array + i++) = pAR->GetReference();
         2142  +      pAR = pAR->GetNext();
         2143  +    }
         2144  +  ok = true;
         2145  +  while (ok == true)
         2146  +    {
         2147  +      // bubble sorting the arcs by Cost 
         2148  +      ok = false;
         2149  +      for (i = 1; i < n; i++)
         2150  +        {
         2151  +          pA0 = *(arc_array + i - 1);
         2152  +          pA1 = *(arc_array + i);
         2153  +          if (pA0->GetCost() > pA1->GetCost())
         2154  +            {
         2155  +              // swapping the arcs 
         2156  +              *(arc_array + i - 1) = pA1;
         2157  +              *(arc_array + i) = pA0;
         2158  +              ok = true;
         2159  +            }
         2160  +        }
         2161  +    }
         2162  +  *count = n;
         2163  +  return arc_array;
         2164  +}
         2165  +
         2166  +NetArc::NetArc(sqlite3_int64 rowid, NetNode * from, NetNode * to, double cost)
         2167  +{
         2168  +//
         2169  +// Network Arc constructor
         2170  +//
         2171  +  RowId = rowid;
         2172  +  From = from;
         2173  +  To = to;
         2174  +  Cost = cost;
         2175  +  Next = NULL;
         2176  +}
         2177  +
         2178  +Network::Network()
         2179  +{
         2180  +//
         2181  +// Network constructor
         2182  +//
         2183  +  FirstPre = NULL;
         2184  +  LastPre = NULL;
         2185  +  NumPreNodes = 0;
         2186  +  SortedPreNodes = NULL;
         2187  +  NumPreNodes = 0;
         2188  +  SortedPreNodes = NULL;
         2189  +  FirstArc = NULL;
         2190  +  LastArc = NULL;
         2191  +  FirstNode = NULL;
         2192  +  LastNode = NULL;
         2193  +  NumNodes = 0;
         2194  +  SortedNodes = NULL;
         2195  +  Error = false;
         2196  +  NodeCode = false;
         2197  +  MaxCodeLength = 0;
         2198  +}
         2199  +
         2200  +Network::~Network()
         2201  +{
         2202  +//
         2203  +// Network destructor
         2204  +//
         2205  +  NetArc *pA;
         2206  +  NetArc *pAn;
         2207  +  NetNode *pN;
         2208  +  NetNode *pNn;
         2209  +  CleanPreNodes();
         2210  +  pA = FirstArc;
         2211  +  while (pA)
         2212  +    {
         2213  +      pAn = pA->GetNext();
         2214  +      delete pA;
         2215  +      pA = pAn;
         2216  +    }
         2217  +  pN = FirstNode;
         2218  +  while (pN)
         2219  +    {
         2220  +      pNn = pN->GetNext();
         2221  +      delete pN;
         2222  +      pN = pNn;
         2223  +    }
         2224  +  if (SortedNodes)
         2225  +    delete[]SortedNodes;
         2226  +}
         2227  +
         2228  +void Network::CleanPreNodes()
         2229  +{
         2230  +//
         2231  +// cleaning up the preliminary Nodes list
         2232  +//
         2233  +  NetNodePre *pP;
         2234  +  NetNodePre *pPn;
         2235  +  pP = FirstPre;
         2236  +  while (pP)
         2237  +    {
         2238  +      pPn = pP->GetNext();
         2239  +      delete pP;
         2240  +      pP = pPn;
         2241  +    }
         2242  +  FirstPre = NULL;
         2243  +  LastPre = NULL;
         2244  +  NumPreNodes = 0;
         2245  +  if (SortedPreNodes)
         2246  +    delete[]SortedPreNodes;
         2247  +  SortedPreNodes = NULL;
         2248  +}
         2249  +
         2250  +void Network::InsertNode(sqlite3_int64 id)
         2251  +{
         2252  +//
         2253  +// inserts a Node into the preliminary list 
         2254  +//
         2255  +  NetNodePre *pP = new NetNodePre(id);
         2256  +  if (!FirstPre)
         2257  +    FirstPre = pP;
         2258  +  if (LastPre)
         2259  +    LastPre->SetNext(pP);
         2260  +  LastPre = pP;
         2261  +}
         2262  +
         2263  +void Network::InsertNode(const char *code)
         2264  +{
         2265  +//
         2266  +// inserts a Node into the preliminary list 
         2267  +//
         2268  +  NetNodePre *pP = new NetNodePre(code);
         2269  +  if (!FirstPre)
         2270  +    FirstPre = pP;
         2271  +  if (LastPre)
         2272  +    LastPre->SetNext(pP);
         2273  +  LastPre = pP;
         2274  +}
         2275  +
         2276  +void Network::AddNode(sqlite3_int64 id)
         2277  +{
         2278  +//
         2279  +// inserts a Node into the final list 
         2280  +//
         2281  +  NetNode *pN = new NetNode(id);
         2282  +  if (!FirstNode)
         2283  +    FirstNode = pN;
         2284  +  if (LastNode)
         2285  +    LastNode->SetNext(pN);
         2286  +  LastNode = pN;
         2287  +}
         2288  +
         2289  +void Network::AddNode(wxString & code)
         2290  +{
         2291  +//
         2292  +// inserts a Node into the final list 
         2293  +//
         2294  +  int len;
         2295  +  NetNode *pN = new NetNode(code);
         2296  +  len = pN->GetCode().Len() + 1;
         2297  +  if (len > MaxCodeLength)
         2298  +    MaxCodeLength = len;
         2299  +  if (!FirstNode)
         2300  +    FirstNode = pN;
         2301  +  if (LastNode)
         2302  +    LastNode->SetNext(pN);
         2303  +  LastNode = pN;
         2304  +}
         2305  +
         2306  +NetNode *Network::ProcessNode(sqlite3_int64 id, double x, double y,
         2307  +                              NetNode ** pOther)
         2308  +{
         2309  +//
         2310  +// inserts a new node or retrieves an already defined one 
         2311  +//
         2312  +  NetNode *pN = Find(id);
         2313  +  *pOther = NULL;
         2314  +  if (pN)
         2315  +    {
         2316  +      // this Node already exists into the sorted list
         2317  +      if (pN->GetX() == DBL_MAX && pN->GetY() == DBL_MAX)
         2318  +        {
         2319  +          pN->SetX(x);
         2320  +          pN->SetY(y);
         2321  +      } else
         2322  +        {
         2323  +          if (pN->GetX() == x && pN->GetY() == y)
         2324  +            ;
         2325  +          else
         2326  +            *pOther = pN;
         2327  +        }
         2328  +      return pN;
         2329  +    }
         2330  +// unexpected error; undefined Node
         2331  +  return NULL;
         2332  +}
         2333  +
         2334  +NetNode *Network::ProcessNode(wxString & code, double x, double y,
         2335  +                              NetNode ** pOther)
         2336  +{
         2337  +//
         2338  +// inserts a new node or retrieves an already defined one 
         2339  +//
         2340  +  NetNode *pN = Find(code);
         2341  +  *pOther = NULL;
         2342  +  if (pN)
         2343  +    {
         2344  +      // this Node already exists into the sorted list
         2345  +      if (pN->GetX() == DBL_MAX && pN->GetY() == DBL_MAX)
         2346  +        {
         2347  +          pN->SetX(x);
         2348  +          pN->SetY(y);
         2349  +      } else
         2350  +        {
         2351  +          if (pN->GetX() == x && pN->GetY() == y)
         2352  +            ;
         2353  +          else
         2354  +            *pOther = pN;
         2355  +        }
         2356  +      return pN;
         2357  +    }
         2358  +// unexpected error; undefined Node
         2359  +  return NULL;
         2360  +}
         2361  +
         2362  +NetNode *Network::ProcessNode(sqlite3_int64 id, NetNode ** pOther)
         2363  +{
         2364  +//
         2365  +// inserts a new node or retrieves an already defined one 
         2366  +//
         2367  +  NetNode *pN = Find(id);
         2368  +  *pOther = NULL;
         2369  +  return pN;
         2370  +}
         2371  +
         2372  +NetNode *Network::ProcessNode(wxString & code, NetNode ** pOther)
         2373  +{
         2374  +//
         2375  +// inserts a new node or retrieves an already defined one 
         2376  +//
         2377  +  NetNode *pN = Find(code);
         2378  +  *pOther = NULL;
         2379  +  return pN;
         2380  +}
         2381  +
         2382  +void
         2383  +  Network::AddArc(sqlite3_int64 rowid, sqlite3_int64 id_from,
         2384  +                  sqlite3_int64 id_to, double node_from_x, double node_from_y,
         2385  +                  double node_to_x, double node_to_y, double cost)
         2386  +{
         2387  +//
         2388  +// inserting an arc into the memory structures 
         2389  +//
         2390  +  NetNode *pFrom;
         2391  +  NetNode *pTo;
         2392  +  NetNode *pN2;
         2393  +  NetArc *pA;
         2394  +  pFrom = ProcessNode(id_from, node_from_x, node_from_y, &pN2);
         2395  +  if (pN2)
         2396  +    Error = true;
         2397  +  pTo = ProcessNode(id_to, node_to_x, node_to_y, &pN2);
         2398  +  if (pN2)
         2399  +    Error = true;
         2400  +  if (!pFrom)
         2401  +    Error = true;
         2402  +  if (!pTo)
         2403  +    Error = true;
         2404  +  if (pFrom == pTo)
         2405  +    Error = true;
         2406  +  if (Error == true)
         2407  +    return;
         2408  +  pA = new NetArc(rowid, pFrom, pTo, cost);
         2409  +  if (!FirstArc)
         2410  +    FirstArc = pA;
         2411  +  if (LastArc)
         2412  +    LastArc->SetNext(pA);
         2413  +  LastArc = pA;
         2414  +// updating Node connections 
         2415  +  pFrom->AddOutcoming(pA);
         2416  +}
         2417  +
         2418  +void
         2419  +  Network::AddArc(sqlite3_int64 rowid, const char *code_from,
         2420  +                  const char *code_to, double node_from_x, double node_from_y,
         2421  +                  double node_to_x, double node_to_y, double cost)
         2422  +{
         2423  +//
         2424  +// inserting an arc into the memory structures 
         2425  +//
         2426  +  NetNode *pFrom;
         2427  +  NetNode *pTo;
         2428  +  NetNode *pN2;
         2429  +  NetArc *pA;
         2430  +  wxString stCode = wxString::FromUTF8(code_from);
         2431  +  pFrom = ProcessNode(stCode, node_from_x, node_from_y, &pN2);
         2432  +  if (pN2)
         2433  +    Error = true;
         2434  +  stCode = wxString::FromUTF8(code_to);
         2435  +  pTo = ProcessNode(stCode, node_to_x, node_to_y, &pN2);
         2436  +  if (pN2)
         2437  +    Error = true;
         2438  +  if (!pFrom)
         2439  +    Error = true;
         2440  +  if (!pTo)
         2441  +    Error = true;
         2442  +  if (pFrom == pTo)
         2443  +    Error = true;
         2444  +  if (Error == true)
         2445  +    return;
         2446  +  pA = new NetArc(rowid, pFrom, pTo, cost);
         2447  +  if (!FirstArc)
         2448  +    FirstArc = pA;
         2449  +  if (LastArc)
         2450  +    LastArc->SetNext(pA);
         2451  +  LastArc = pA;
         2452  +// updating Node connections 
         2453  +  pFrom->AddOutcoming(pA);
         2454  +}
         2455  +
         2456  +void
         2457  +  Network::AddArc(sqlite3_int64 rowid, sqlite3_int64 id_from,
         2458  +                  sqlite3_int64 id_to, double cost)
         2459  +{
         2460  +//
         2461  +// inserting an arc into the memory structures 
         2462  +//
         2463  +  NetNode *pFrom;
         2464  +  NetNode *pTo;
         2465  +  NetNode *pN2;
         2466  +  NetArc *pA;
         2467  +  pFrom = ProcessNode(id_from, &pN2);
         2468  +  if (pN2)
         2469  +    Error = true;
         2470  +  pTo = ProcessNode(id_to, &pN2);
         2471  +  if (pN2)
         2472  +    Error = true;
         2473  +  if (!pFrom)
         2474  +    Error = true;
         2475  +  if (!pTo)
         2476  +    Error = true;
         2477  +  if (pFrom == pTo)
         2478  +    Error = true;
         2479  +  if (Error == true)
         2480  +    return;
         2481  +  pA = new NetArc(rowid, pFrom, pTo, cost);
         2482  +  if (!FirstArc)
         2483  +    FirstArc = pA;
         2484  +  if (LastArc)
         2485  +    LastArc->SetNext(pA);
         2486  +  LastArc = pA;
         2487  +// updating Node connections 
         2488  +  pFrom->AddOutcoming(pA);
         2489  +}
         2490  +
         2491  +void
         2492  +  Network::AddArc(sqlite3_int64 rowid, const char *code_from,
         2493  +                  const char *code_to, double cost)
         2494  +{
         2495  +//
         2496  +// inserting an arc into the memory structures 
         2497  +//
         2498  +  NetNode *pFrom;
         2499  +  NetNode *pTo;
         2500  +  NetNode *pN2;
         2501  +  NetArc *pA;
         2502  +  wxString stCode = wxString::FromUTF8(code_from);
         2503  +  pFrom = ProcessNode(stCode, &pN2);
         2504  +  if (pN2)
         2505  +    Error = true;
         2506  +  stCode = wxString::FromUTF8(code_to);
         2507  +  pTo = ProcessNode(stCode, &pN2);
         2508  +  if (pN2)
         2509  +    Error = true;
         2510  +  if (!pFrom)
         2511  +    Error = true;
         2512  +  if (!pTo)
         2513  +    Error = true;
         2514  +  if (pFrom == pTo)
         2515  +    Error = true;
         2516  +  if (Error == true)
         2517  +    return;
         2518  +  pA = new NetArc(rowid, pFrom, pTo, cost);
         2519  +  if (!FirstArc)
         2520  +    FirstArc = pA;
         2521  +  if (LastArc)
         2522  +    LastArc->SetNext(pA);
         2523  +  LastArc = pA;
         2524  +// updating Node connections 
         2525  +  pFrom->AddOutcoming(pA);
         2526  +}
         2527  +
         2528  +void Network::Sort()
         2529  +{
         2530  +//
         2531  +// updating the Nodes sorted list 
         2532  +//
         2533  +  int i;
         2534  +  NetNode *pN;
         2535  +  NumNodes = 0;
         2536  +  if (SortedNodes)
         2537  +    {
         2538  +      // we must free the already existent sorted list
         2539  +      delete[]SortedNodes;
         2540  +    }
         2541  +  SortedNodes = NULL;
         2542  +  pN = FirstNode;
         2543  +  while (pN)
         2544  +    {
         2545  +      NumNodes++;
         2546  +      pN = pN->GetNext();
         2547  +    }
         2548  +  if (!NumNodes)
         2549  +    return;
         2550  +  SortedNodes = new NetNode *[NumNodes];
         2551  +  i = 0;
         2552  +  pN = FirstNode;
         2553  +  while (pN)
         2554  +    {
         2555  +      *(SortedNodes + i++) = pN;
         2556  +      pN = pN->GetNext();
         2557  +    }
         2558  +  if (NodeCode == true)
         2559  +    {
         2560  +      // Nodes are identified by a TEXT code 
         2561  +      qsort(SortedNodes, NumNodes, sizeof(NetNode *), cmp_nodes1_code);
         2562  +  } else
         2563  +    {
         2564  +      // Nodes are identified by an INTEGER id 
         2565  +      qsort(SortedNodes, NumNodes, sizeof(NetNode *), cmp_nodes1_id);
         2566  +    }
         2567  +}
         2568  +
         2569  +NetNode *Network::GetSortedNode(sqlite3_int64 x)
         2570  +{
         2571  +//
         2572  +// return a sorted Node [by position]
         2573  +//
         2574  +  if (x >= 0 && x < NumNodes)
         2575  +    return *(SortedNodes + x);
         2576  +  return NULL;
         2577  +}
         2578  +
         2579  +NetNode *Network::Find(sqlite3_int64 id)
         2580  +{
         2581  +//
         2582  +// searching a Node into the sorted list 
         2583  +//
         2584  +  NetNode **ret;
         2585  +  NetNode pN(id);
         2586  +  if (!SortedNodes)
         2587  +    return NULL;
         2588  +// Nodes are identified by an INTEGER id
         2589  +  ret =
         2590  +    (NetNode **) bsearch(&pN, SortedNodes, NumNodes, sizeof(NetNode *),
         2591  +                         cmp_nodes2_id);
         2592  +  if (!ret)
         2593  +    return NULL;
         2594  +  return *ret;
         2595  +}
         2596  +
         2597  +NetNode *Network::Find(wxString & code)
         2598  +{
         2599  +//
         2600  +// searching a Node into the sorted list 
         2601  +//
         2602  +  NetNode **ret;
         2603  +  NetNode pN(code);
         2604  +  if (!SortedNodes)
         2605  +    return NULL;
         2606  +// Nodes are identified by a TEXT code
         2607  +  ret =
         2608  +    (NetNode **) bsearch(&pN, SortedNodes, NumNodes, sizeof(NetNode *),
         2609  +                         cmp_nodes2_code);
         2610  +  if (!ret)
         2611  +    return NULL;
         2612  +  return *ret;
         2613  +}
         2614  +
         2615  +void Network::InitNodes()
         2616  +{
         2617  +//
         2618  +// prepares the final Nodes list 
         2619  +//
         2620  +  sqlite3_int64 last_id;
         2621  +  wxString last_code;
         2622  +  int i;
         2623  +  NetNodePre *pP;
         2624  +  NumPreNodes = 0;
         2625  +// sorting preliminary nodes 
         2626  +  if (SortedPreNodes)
         2627  +    {
         2628  +      // we must free the already existent sorted list
         2629  +      delete[]SortedPreNodes;
         2630  +    }
         2631  +  SortedPreNodes = NULL;
         2632  +  pP = FirstPre;
         2633  +  while (pP)
         2634  +    {
         2635  +      NumPreNodes++;
         2636  +      pP = pP->GetNext();
         2637  +    }
         2638  +  if (!NumPreNodes)
         2639  +    return;
         2640  +  SortedPreNodes = new NetNodePre *[NumPreNodes];
         2641  +  i = 0;
         2642  +  pP = FirstPre;
         2643  +  while (pP)
         2644  +    {
         2645  +      *(SortedPreNodes + i++) = pP;
         2646  +      pP = pP->GetNext();
         2647  +    }
         2648  +  if (NodeCode == true)
         2649  +    {
         2650  +      // Nodes are identified by a TEXT code
         2651  +      qsort(SortedPreNodes, NumPreNodes, sizeof(NetNodePre *),
         2652  +            cmp_prenodes_code);
         2653  +  } else
         2654  +    {
         2655  +      // Nodes are identified by an INTEGER id 
         2656  +      qsort(SortedPreNodes, NumPreNodes, sizeof(NetNodePre *), cmp_prenodes_id);
         2657  +    }
         2658  +// creating the final Nodes linked list 
         2659  +  last_id = -1;
         2660  +  last_code = wxT("");
         2661  +  for (i = 0; i < NumPreNodes; i++)
         2662  +    {
         2663  +      pP = *(SortedPreNodes + i);
         2664  +      if (NodeCode == true)
         2665  +        {
         2666  +          // Nodes are identified by a TEXT code
         2667  +          if (pP->GetCode().Cmp(last_code) != 0)
         2668  +            AddNode(pP->GetCode());
         2669  +      } else
         2670  +        {
         2671  +          // Nodes are identified by an INTEGER id
         2672  +          if (pP->GetId() != last_id)
         2673  +            AddNode(pP->GetId());
         2674  +        }
         2675  +      last_id = pP->GetId();
         2676  +      last_code = pP->GetCode();
         2677  +    }
         2678  +// sorting the final Nodes list 
         2679  +  Sort();
         2680  +// cleaning up the preliminary Nodes structs 
         2681  +  CleanPreNodes();
         2682  +}

Changes to Objects.cpp.

     1      1   /*
     2      2   / Objects.cpp
     3      3   / miscellaneous ancillary classes implementation
     4      4   /
     5      5   / version 1.7, 2013 May 8
     6      6   /
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
     8      8   /
     9      9   / Copyright (C) 2008-2013  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
    13     13   /    the Free Software Foundation, either version 3 of the License, or
    14     14   /    (at your option) any later version.
................................................................................
   107    107     DbAlias = dbAlias;
   108    108     MainName = name;
   109    109     ColName = column;
   110    110     PathOrURL = path_or_url;
   111    111     Restricted = true;
   112    112   }
   113    113   
   114         -MyObject::MyObject(int type, wxString & host, wxString & hostaddr, int port,
   115         -                   wxString & dbname, wxString & user, bool readOnly)
   116         -{
   117         -//
   118         -// constructor - TreeItemData
   119         -//
   120         -  Type = type;
   121         -  Host = host;
   122         -  HostAddr = hostaddr;
   123         -  Port = port;
   124         -  DbName = dbname;
   125         -  User = user;
   126         -  ReadOnly = readOnly;
   127         -}
   128         -
   129         -MyObject::MyObject(int type, wxString & host, wxString & hostaddr, int port,
   130         -                   wxString & dbname, wxString & user, wxString & schema)
   131         -{
   132         -//
   133         -// constructor - TreeItemData
   134         -//
   135         -  Type = type;
   136         -  Host = host;
   137         -  HostAddr = hostaddr;
   138         -  Port = port;
   139         -  DbName = dbname;
   140         -  User = user;
   141         -  Schema = schema;
   142         -}
   143         -
   144         -MyObject::MyObject(int type, wxString & host, wxString & hostaddr, int port,
   145         -                   wxString & dbname, wxString & user, wxString & schema,
   146         -                   wxString & name, wxString & virtName, bool readOnly, bool pk,
   147         -                   bool select, bool insertUpdateDelete)
   148         -{
   149         -//
   150         -// constructor - TreeItemData
   151         -//
   152         -  Type = type;
   153         -  Host = host;
   154         -  HostAddr = hostaddr;
   155         -  Port = port;
   156         -  DbName = dbname;
   157         -  User = user;
   158         -  Schema = schema;
   159         -  Name = name;
   160         -  VirtName = virtName;
   161         -  ReadOnly = readOnly;
   162         -  PK = pk;
   163         -  Select = select;
   164         -  InsertUpdateDelete = insertUpdateDelete;
   165         -}
   166         -
   167         -MyObject::MyObject(int type, wxString & host, wxString & hostaddr, int port,
   168         -                   wxString & dbname, wxString & user, wxString & schema,
   169         -                   wxString & name, wxString & column, wxString & virtName)
   170         -{
   171         -//
   172         -// constructor - TreeItemData
   173         -//
   174         -  Type = type;
   175         -  Host = host;
   176         -  HostAddr = hostaddr;
   177         -  Port = port;
   178         -  DbName = dbname;
   179         -  User = user;
   180         -  Schema = schema;
   181         -  Name = name;
   182         -  Column = column;
   183         -  VirtName = virtName;
   184         -}
   185         -
   186    114   bool MyObject::IsEditable()
   187    115   {
   188    116   //
   189    117   // testing for an EDITABLE TABLE or VIEW object
   190    118   //
   191    119     if (Restricted)
   192    120       return false;
................................................................................
   477    405   // testing for FOREIGN KEY COLUMN nodes
   478    406   //
   479    407     if (Type == MY_FOREIGN_KEY_FLD)
   480    408       return true;
   481    409     return false;
   482    410   }
   483    411   
   484         -bool MyObject::IsPostgreSQL()
   485         -{
   486         -//
   487         -// testing for PostgreSQL related nodes
   488         -//
   489         -  bool ok = false;
   490         -  switch (Type)
   491         -    {
   492         -      case MY_POSTGRES_CONN:
   493         -      case MY_POSTGRES_SCHEMA:
   494         -      case MY_POSTGRES_TABLE:
   495         -      case MY_POSTGRES_VIEW:
   496         -      case MY_POSTGIS_VIEW:
   497         -      case MY_POSTGRES_COLUMN:
   498         -      case MY_POSTGIS_GEOMETRY:
   499         -        ok = true;
   500         -        break;
   501         -      default:
   502         -        ok = false;
   503         -        break;
   504         -    };
   505         -  return ok;
   506         -}
   507         -
   508    412   void MyVariant::Copy(MyVariant * other)
   509    413   {
   510    414   // 
   511    415   // transfers a BLOB value
   512    416   //
   513    417     if (other->Type != MY_BLOB_VARIANT)
   514    418       return;
................................................................................
  1105   1009   // checking for a GPKG Geometry
  1106   1010   //
  1107   1011     int i;
  1108   1012     char **results;
  1109   1013     int rows;
  1110   1014     int columns;
  1111   1015     char *errMsg = NULL;
         1016  +  const char *name;
  1112   1017     wxString Name;
  1113   1018     char *sql;
  1114   1019     char xname[1024];
  1115   1020     int ret;
  1116   1021     int is_virtual = 0;
         1022  +  char *xtable;
  1117   1023   
  1118   1024     if (table.StartsWith(wxT("vgpkg_")) == true)
  1119   1025       {
  1120   1026         wxString clean;
  1121   1027         table.StartsWith(wxT("vgpkg_"), &clean);
  1122   1028         table = clean;
  1123   1029         is_virtual = 1;
................................................................................
  1181   1087   // checking for an FDO/OGR Geometry
  1182   1088   //
  1183   1089     int i;
  1184   1090     char **results;
  1185   1091     int rows;
  1186   1092     int columns;
  1187   1093     char *errMsg = NULL;
         1094  +  const char *name;
  1188   1095     wxString Name;
  1189   1096     char *sql;
  1190   1097     char xname[1024];
  1191   1098     int ret;
  1192   1099     int is_virtual = 0;
         1100  +  char *xtable;
  1193   1101   
  1194   1102     if (table.StartsWith(wxT("fdo_")) == true)
  1195   1103       {
  1196   1104         wxString clean;
  1197   1105         table.StartsWith(wxT("fdo_"), &clean);
  1198   1106         table = clean;
  1199   1107         is_virtual = 1;
................................................................................
  4108   4016     GeoPackageGeometry = false;
  4109   4017     GeoPackageVirtualGeometry = false;
  4110   4018     FdoOgrGeometry = false;
  4111   4019     FdoOgrVirtualGeometry = false;
  4112   4020     Next = NULL;
  4113   4021   }
  4114   4022   
  4115         -TableViewItem::TableViewItem(wxString & db, wxString & name)
  4116         -{
  4117         -// constructor
  4118         -  DbName = db;
  4119         -  Name = name;
  4120         -  View = false;
  4121         -  Virtual = false;
  4122         -  Geometry = false;
  4123         -  GeoPackageGeometry = false;
  4124         -  GeoPackageVirtualGeometry = false;
  4125         -  FdoOgrGeometry = false;
  4126         -  FdoOgrVirtualGeometry = false;
  4127         -  Next = NULL;
  4128         -}
  4129         -
  4130         -bool TableViewItem::IsPostgresTable(MyPostgres * list)
  4131         -{
  4132         -// testing for some PostgreSQL table or view
  4133         -  MyPostgresConn *pC = list->GetFirst();
  4134         -  while (pC != NULL)
  4135         -    {
  4136         -      MyPostgresSchema *pS = pC->GetFirst();
  4137         -      while (pS != NULL)
  4138         -        {
  4139         -          MyPostgresTable *pT = pS->GetFirstTable();
  4140         -          while (pT != NULL)
  4141         -            {
  4142         -              if (Name.Cmp(pT->GetVirtName()) == 0)
  4143         -                return true;
  4144         -              if (Name.Cmp(pT->GetPostGisName()) == 0)
  4145         -                return true;
  4146         -              pT = pT->GetNext();
  4147         -            }
  4148         -          MyPostgresView *pV = pS->GetFirstView();
  4149         -          while (pV != NULL)
  4150         -            {
  4151         -              if (Name.Cmp(pV->GetVirtName()) == 0)
  4152         -                return true;
  4153         -              pV = pV->GetNext();
  4154         -            }
  4155         -          pS = pS->GetNext();
  4156         -        }
  4157         -      pC = pC->GetNext();
  4158         -    }
  4159         -  return false;
  4160         -}
  4161         -
  4162         -bool TableViewItem::IsTmpMetadata()
  4163         -{
  4164         -// testing for some TEMPORARY METADATA TABLE
  4165         -  if (DbName.Cmp(wxT("temp")) == 0
  4166         -      && (Name.Cmp(wxT("postgis_geometry_columns")) == 0
  4167         -          || Name.Cmp(wxT("tmp_vector_coverages")) == 0))
  4168         -    return true;
  4169         -  return false;
  4170         -}
  4171         -
  4172   4023   TableViewList::TableViewList()
  4173   4024   {
  4174   4025   // constructor
  4175   4026     First = NULL;
  4176   4027     Last = NULL;
  4177   4028     Count = 0;
  4178   4029     Sorted = NULL;
................................................................................
  4196   4047   
  4197   4048   void TableViewList::Add(wxString & name, bool isView, bool isVirtual)
  4198   4049   {
  4199   4050   // adding a new item to the list
  4200   4051     TableViewItem *item = new TableViewItem(name, isView, isVirtual);
  4201   4052     if (First == NULL)
  4202   4053       First = item;
  4203         -  if (Last != NULL)
  4204         -    Last->SetNext(item);
  4205         -  Last = item;
  4206         -}
  4207         -
  4208         -void TableViewList::Add(wxString & db, wxString & name)
  4209         -{
  4210         -// adding a new item to the list
  4211         -  TableViewItem *item = new TableViewItem(db, name);
  4212         -  if (First == NULL)
  4213         -    First = item;
  4214   4054     if (Last != NULL)
  4215   4055       Last->SetNext(item);
  4216   4056     Last = item;
  4217   4057   }
  4218   4058   
  4219   4059   static int cmp_tables1(const void *p1, const void *p2)
  4220   4060   {

Deleted Postgres.cpp.

     1         -/*
     2         -/ Postgres.cpp
     3         -/ helper functions for PostgreSQL connections
     4         -/
     5         -/ version 2.1, 2018 May 5
     6         -/
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
     8         -/
     9         -/ Copyright (C) 2018  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/spinctrl.h"
    29         -#include "wx/utils.h"
    30         -#include "wx/filename.h"
    31         -
    32         -void MyFrame::GetPQlibVersion(wxString & ver)
    33         -{
    34         -//
    35         -// returns the PQlib (PostgreSQL client) version
    36         -//
    37         -  int ver_num = vpgPQlibVersion();
    38         -  int major = ver_num / 10000;
    39         -  int minor = (ver_num - (major * 10000)) / 100;
    40         -  int revision = ver_num - (major * 10000) - (minor * 100);
    41         -  char version[128];
    42         -  sprintf(version, "%d.%02d.%02d", major, minor, revision);
    43         -  ver = wxString::FromUTF8(version);
    44         -}
    45         -
    46         -bool MyFrame::HasPostgreSqlConnections()
    47         -{
    48         -// checks for any current PostgreSQL connection
    49         -  if (PostgresList.GetFirst() == NULL)
    50         -    return false;
    51         -  return true;
    52         -}
    53         -
    54         -void MyFrame::DoLoadLibPQ(wxString & path)
    55         -{
    56         -//
    57         -// attempting to load LibPQ - dynamic late binding
    58         -//
    59         -  if (DynamicLibPQ.IsLoaded() == true)
    60         -    DynamicLibPQ.Unload();
    61         -  if (DynamicLibPQ.Load(path, wxDL_QUIET))
    62         -    {
    63         -      //  retievinig the pointers of ALL APIs
    64         -      bool valid = true;
    65         -      bool ok;
    66         -      VirtualPQapi.PQclear =
    67         -        (void (*)(PGresult *)) DynamicLibPQ.GetSymbol(wxT("PQclear"), &ok);
    68         -      if (ok == false)
    69         -        valid = false;
    70         -      VirtualPQapi.PQconnectdb =
    71         -        (PGconn *
    72         -         (*)(const char *conninfo)) DynamicLibPQ.GetSymbol(wxT("PQconnectdb"),
    73         -                                                           &ok);
    74         -      if (ok == false)
    75         -        valid = false;
    76         -      VirtualPQapi.PQerrorMessage =
    77         -        (char *(*)(const PGconn * conn))
    78         -        DynamicLibPQ.GetSymbol(wxT("PQerrorMessage"), &ok);
    79         -      if (ok == false)
    80         -        valid = false;
    81         -      VirtualPQapi.PQexec =
    82         -        (PGresult *
    83         -         (*)(PGconn * conn,
    84         -             const char *command)) DynamicLibPQ.GetSymbol(wxT("PQexec"), &ok);
    85         -      if (ok == false)
    86         -        valid = false;
    87         -      VirtualPQapi.PQfinish =
    88         -        (void (*)(PGconn * conn)) DynamicLibPQ.GetSymbol(wxT("PQfinish"), &ok);
    89         -      if (ok == false)
    90         -        valid = false;
    91         -      VirtualPQapi.PQgetisnull =
    92         -        (int (*)(const PGresult * res, int row_number, int column_number))
    93         -        DynamicLibPQ.GetSymbol(wxT("PQgetisnull"), &ok);
    94         -      if (ok == false)
    95         -        valid = false;
    96         -      VirtualPQapi.PQgetvalue =
    97         -        (char *(*)(const PGresult * res, int row_number, int column_number))
    98         -        DynamicLibPQ.GetSymbol(wxT("PQgetvalue"), &ok);
    99         -      if (ok == false)
   100         -        valid = false;
   101         -      VirtualPQapi.PQlibVersion =
   102         -        (int (*)(void)) DynamicLibPQ.GetSymbol(wxT("PQlibVersion"), &ok);
   103         -      if (ok == false)
   104         -        valid = false;
   105         -      VirtualPQapi.PQnfields =
   106         -        (int (*)(const PGresult * res)) DynamicLibPQ.GetSymbol(wxT("PQnfields"),
   107         -                                                               &ok);
   108         -      if (ok == false)
   109         -        valid = false;
   110         -      VirtualPQapi.PQntuples =
   111         -        (int (*)(const PGresult * res)) DynamicLibPQ.GetSymbol(wxT("PQntuples"),
   112         -                                                               &ok);
   113         -      if (ok == false)
   114         -        valid = false;
   115         -      VirtualPQapi.PQresultStatus =
   116         -        (ExecStatusType(*)(const PGresult * res))
   117         -        DynamicLibPQ.GetSymbol(wxT("PQresultStatus"), &ok);
   118         -      if (ok == false)
   119         -        valid = false;
   120         -      VirtualPQapi.PQstatus =
   121         -        (ConnStatusType(*)(const PGconn * conn))
   122         -        DynamicLibPQ.GetSymbol(wxT("PQstatus"), &ok);
   123         -      if (ok == false)
   124         -        valid = false;
   125         -      if (valid == true)
   126         -        {
   127         -          if (virtualpg_extension_init(SqliteHandle, &VirtualPQapi) ==
   128         -              SQLITE_OK)
   129         -            {
   130         -              // OK, anything is good
   131         -              PathLibPQ = path;
   132         -              VirtualPQapiOK = true;
   133         -              return;
   134         -            }
   135         -        }
   136         -    }
   137         -  PathLibPQ = wxT("");
   138         -}
   139         -
   140         -void MyFrame::DoLocateLibPQ(wxString & extpath)
   141         -{
   142         -//
   143         -// attempting to load LibPQ - path selected by the user
   144         -//
   145         -  int ret;
   146         -  wxString path = wxDynamicLibrary::CanonicalizeName(wxT("libpq"));
   147         -  wxFileName name(path);
   148         -  wxString suffix =
   149         -    wxT("Dynamic Library (*.") + name.GetExt() + wxT(")|*.") + name.GetExt();
   150         -  wxFileDialog fileDialog(this, wxT("libPQ manual search"), wxT(""), path,
   151         -                          suffix, wxFD_OPEN | wxFD_FILE_MUST_EXIST,
   152         -                          wxDefaultPosition, wxDefaultSize, wxT("filedlg"));
   153         -  ret = fileDialog.ShowModal();
   154         -  if (ret == wxID_OK)
   155         -    {
   156         -      path = fileDialog.GetPath();
   157         -      DoLoadLibPQ(path);
   158         -      extpath = path;
   159         -    }
   160         -}
   161         -
   162         -void MyFrame::DoPostgreSqlConnection()
   163         -{
   164         -//
   165         -// establishing a connection to PostgreSQL
   166         -//
   167         -  if (VirtualPQapiOK == false)
   168         -    {
   169         -      //
   170         -      // LibPQ isn't yet loaded
   171         -      //
   172         -      int ret = wxMessageBox(wxT
   173         -                             ("The PostgreSQL client library (LibPQ) isn't yet loaded.\n\n"
   174         -                              "Do you wish to attempt loading it right now ?"),
   175         -                             wxT("spatialite_gui"),
   176         -                             wxYES_NO | wxICON_QUESTION, this);
   177         -      if (ret == wxYES)
   178         -        {
   179         -          // trying to load LibPQ
   180         -          wxString path;
   181         -          DoLocateLibPQ(path);
   182         -          if (VirtualPQapiOK == true)
   183         -            {
   184         -              wxMessageBox(wxT
   185         -                           ("The PostgreSQL client library (LibPQ) has been correctly loaded\n\n"
   186         -                            "Full PostgreSQL support is now available."),
   187         -                           wxT("spatialite_gui"), wxOK | wxICON_INFORMATION,
   188         -                           this);
   189         -              goto ok;
   190         -            }
   191         -          if (path.Len() > 0)
   192         -            wxMessageBox(wxT
   193         -                         ("Unable to load a valid PostgreSQL client library (LibPQ) from:\n\n")
   194         -                         + path +
   195         -                         wxT
   196         -                         ("\n\nFull PostgreSQL support still continues to be disabled."),
   197         -                         wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
   198         -        }
   199         -      return;
   200         -    }
   201         -
   202         -ok:
   203         -  PostgresConnectionDialog dlg;
   204         -  dlg.Create(this);
   205         -  int ret = dlg.ShowModal();
   206         -  if (ret == wxID_OK)
   207         -    {
   208         -      char *conninfo = sqlite3_mprintf(" ");
   209         -      char *prev;
   210         -      if (dlg.GetHost() != NULL)
   211         -        {
   212         -          prev = conninfo;
   213         -          conninfo = sqlite3_mprintf("%s host=%s", prev, dlg.GetHost());
   214         -          sqlite3_free(prev);
   215         -        }
   216         -      if (dlg.GetHostAddr() != NULL)
   217         -        {
   218         -          prev = conninfo;
   219         -          conninfo = sqlite3_mprintf("%s hostaddr=%s", prev, dlg.GetHostAddr());
   220         -          sqlite3_free(prev);
   221         -        }
   222         -      prev = conninfo;
   223         -      conninfo = sqlite3_mprintf("%s port=%d", prev, dlg.GetPort());
   224         -      sqlite3_free(prev);
   225         -      if (dlg.GetDbName() != NULL)
   226         -        {
   227         -          prev = conninfo;
   228         -          conninfo = sqlite3_mprintf("%s dbname=%s", prev, dlg.GetDbName());
   229         -          sqlite3_free(prev);
   230         -        }
   231         -      if (dlg.GetUser() != NULL)
   232         -        {
   233         -          prev = conninfo;
   234         -          conninfo = sqlite3_mprintf("%s user=%s", prev, dlg.GetUser());
   235         -          sqlite3_free(prev);
   236         -        }
   237         -      if (dlg.GetPassword() != NULL)
   238         -        {
   239         -          prev = conninfo;
   240         -          conninfo = sqlite3_mprintf("%s password=%s", prev, dlg.GetPassword());
   241         -          sqlite3_free(prev);
   242         -        }
   243         -      wxString host = wxString::FromUTF8(dlg.GetHost());
   244         -      wxString hostaddr = wxString::FromUTF8(dlg.GetHostAddr());
   245         -      int port = dlg.GetPort();
   246         -      wxString dbname = wxString::FromUTF8(dlg.GetDbName());
   247         -      wxString user = wxString::FromUTF8(dlg.GetUser());
   248         -      bool readOnly = dlg.IsReadOnly();
   249         -      bool textDates = dlg.IsTextDates();
   250         -      bool ret = false;
   251         -      if (DoCheckPostgres(host, hostaddr, port, dbname, user) == true)
   252         -        wxMessageBox(wxT
   253         -                     ("A PostgreSQL Connection with the same arguments alreay exists !!!"),
   254         -                     wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
   255         -      else
   256         -        ret =
   257         -          DoInitPostgres(host, hostaddr, dlg.GetPort(), dbname, user, readOnly,
   258         -                         textDates, conninfo + 2);
   259         -      sqlite3_free(conninfo);
   260         -      if (ret)
   261         -        InitTableTree();
   262         -    }
   263         -}
   264         -
   265         -bool MyFrame::DoCheckPostgres(wxString & host, wxString & hostaddr, int port,
   266         -                              wxString & dbname, wxString & user)
   267         -{
   268         -//
   269         -// testing for already existing PostgreSQL connections
   270         -//
   271         -  MyPostgresConn *pC = PostgresList.GetFirst();
   272         -  while (pC != NULL)
   273         -    {
   274         -      if (pC->GetHost().Cmp(host) == 0 && pC->GetHostAddr().Cmp(hostaddr) == 0
   275         -          && pC->GetPort() == port && pC->GetDbName().Cmp(dbname) == 0
   276         -          && pC->GetUser().Cmp(user) == 0)
   277         -        return true;
   278         -      pC = pC->GetNext();
   279         -    }
   280         -  return false;
   281         -}
   282         -
   283         -void MyFrame::DoInitVirtualPQapi()
   284         -{
   285         -//
   286         -// initializing the Virtual LibPQ API
   287         -//
   288         -#ifdef LIBPQ_DEFERRED
   289         -/*
   290         -/ not directly linked to libpq
   291         -/ libpq will be eventually loaded only when required (late binding)
   292         -*/
   293         -  VirtualPQapi.PQclear = NULL;
   294         -  VirtualPQapi.PQconnectdb = NULL;
   295         -  VirtualPQapi.PQerrorMessage = NULL;
   296         -  VirtualPQapi.PQexec = NULL;
   297         -  VirtualPQapi.PQfinish = NULL;
   298         -  VirtualPQapi.PQgetisnull = NULL;
   299         -  VirtualPQapi.PQgetvalue = NULL;
   300         -  VirtualPQapi.PQlibVersion = NULL;
   301         -  VirtualPQapi.PQnfields = NULL;
   302         -  VirtualPQapi.PQntuples = NULL;
   303         -  VirtualPQapi.PQresultStatus = NULL;
   304         -  VirtualPQapi.PQstatus = NULL;
   305         -  VirtualPQapiOK = false;
   306         -#else
   307         -/* directly linked to libpq */
   308         -  VirtualPQapi.PQclear = PQclear;
   309         -  VirtualPQapi.PQconnectdb = PQconnectdb;
   310         -  VirtualPQapi.PQerrorMessage = PQerrorMessage;
   311         -  VirtualPQapi.PQexec = PQexec;
   312         -  VirtualPQapi.PQfinish = PQfinish;
   313         -  VirtualPQapi.PQgetisnull = PQgetisnull;
   314         -  VirtualPQapi.PQgetvalue = PQgetvalue;
   315         -  VirtualPQapi.PQlibVersion = PQlibVersion;
   316         -  VirtualPQapi.PQnfields = PQnfields;
   317         -  VirtualPQapi.PQntuples = PQntuples;
   318         -  VirtualPQapi.PQresultStatus = PQresultStatus;
   319         -  VirtualPQapi.PQstatus = PQstatus;
   320         -  VirtualPQapiOK = false;
   321         -#endif
   322         -}
   323         -
   324         -void MyFrame::DoInitVirtualPG()
   325         -{
   326         -//
   327         -// attempting to initialize the VirtalPG extension 
   328         -//
   329         -  if (virtualpg_extension_init(SqliteHandle, &VirtualPQapi) == SQLITE_OK)
   330         -    VirtualPQapiOK = true;
   331         -}
   332         -
   333         -bool MyFrame::DoInitPostgres(wxString & host, wxString & hostaddr, int port,
   334         -                             wxString & dbname, wxString & user, bool readOnly,
   335         -                             bool textDates, const char *conninfo)
   336         -{
   337         -//
   338         -// attempting to initialize a PostgreSQL connection
   339         -//
   340         -  PGconn *pg_conn;
   341         -  PGresult *res;
   342         -  int nRows;
   343         -  int nFields;
   344         -  const char *obj;
   345         -  const char *schema_name;
   346         -  const char *table_name;
   347         -  const char *geometry;
   348         -  const char *type;
   349         -  int srid;
   350         -  int dims;
   351         -  int r;
   352         -  MyPostgresConn *conn;
   353         -  MyPostgresSchema *pS;
   354         -
   355         -  ::wxBeginBusyCursor();
   356         -  pg_conn = vpgPQconnectdb(conninfo);
   357         -  if (vpgPQstatus(pg_conn) != CONNECTION_OK)
   358         -    {
   359         -      char *msg = sqlite3_mprintf("Connection to Postgres failed: %s",
   360         -                                  vpgPQerrorMessage(pg_conn));
   361         -      wxMessageBox(wxString::FromUTF8(msg),
   362         -                   wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
   363         -      sqlite3_free(msg);
   364         -      vpgPQfinish(pg_conn);
   365         -      ::wxEndBusyCursor();
   366         -      return false;
   367         -    }
   368         -
   369         -  conn =
   370         -    PostgresList.Insert(host, hostaddr, port, dbname, user, readOnly,
   371         -                        textDates);
   372         -
   373         -// retrieving all PosgreSQL Tables and Views
   374         -  const char *sql =
   375         -    "SELECT 'table' AS obj, t.schemaname, t.tablename, g.f_geometry_column, "
   376         -    "g.type, g.srid, g.coord_dimension "
   377         -    "FROM pg_tables AS t LEFT JOIN geometry_columns AS g ON "
   378         -    "(g.f_table_schema = t.schemaname AND g.f_table_name = t.tablename) "
   379         -    "WHERE t.schemaname NOT IN ('information_schema', 'pg_catalog') "
   380         -    "UNION SELECT 'view' AS obj, schemaname, viewname, '', '', -1, -1 FROM pg_views "
   381         -    "WHERE schemaname NOT IN ('information_schema', 'pg_catalog') "
   382         -    "ORDER BY 1, 2, 3";
   383         -  res = vpgPQexec(pg_conn, sql);
   384         -  if (vpgPQresultStatus(res) != PGRES_TUPLES_OK)
   385         -    goto err;
   386         -  nRows = vpgPQntuples(res);
   387         -  nFields = vpgPQnfields(res);
   388         -  if (nRows > 0 && nFields == 7)
   389         -    {
   390         -      for (r = 0; r < nRows; r++)
   391         -        {
   392         -          obj = vpgPQgetvalue(res, r, 0);
   393         -          schema_name = vpgPQgetvalue(res, r, 1);
   394         -          table_name = vpgPQgetvalue(res, r, 2);
   395         -          geometry = vpgPQgetvalue(res, r, 3);
   396         -          type = vpgPQgetvalue(res, r, 4);
   397         -          srid = atoi(vpgPQgetvalue(res, r, 5));
   398         -          dims = atoi(vpgPQgetvalue(res, r, 6));
   399         -          wxString Schema = wxString::FromUTF8(schema_name);
   400         -          wxString Table = wxString::FromUTF8(table_name);
   401         -          wxString Geometry = wxString::FromUTF8(geometry);
   402         -          wxString Type = wxString::FromUTF8(type);
   403         -          if (strcmp(obj, "view") == 0)
   404         -            conn->Add(Schema, Table);
   405         -          else
   406         -            conn->Add(Schema, Table, Geometry, Type, srid, dims);
   407         -        }
   408         -    }
   409         -  vpgPQclear(res);
   410         -
   411         -  pS = conn->GetFirst();
   412         -  while (pS != NULL)
   413         -    {
   414         -      MyPostgresTable *pT = pS->GetFirstTable();
   415         -      while (pT != NULL)
   416         -        {
   417         -          InitPostgresPks(pg_conn, pS, pT);
   418         -          DoCheckGrantPermissions(pg_conn, conn->GetUser(), pS, pT);
   419         -          pT = pT->GetNext();
   420         -        }
   421         -      MyPostgresView *pV = pS->GetFirstView();
   422         -      while (pV != NULL)
   423         -        {
   424         -          DoCheckGrantPermissions(pg_conn, conn->GetUser(), pS, pV);
   425         -          pV = pV->GetNext();
   426         -        }
   427         -      pS = pS->GetNext();
   428         -    }
   429         -  vpgPQfinish(pg_conn);
   430         -
   431         -  conn->SetConnectionString(conninfo);
   432         -  DoSetUniqueVirtNames();
   433         -  DoCreatePostgresTables();
   434         -  ::wxEndBusyCursor();
   435         -  return true;
   436         -
   437         -err:
   438         -// something has gone the wrong way
   439         -  if (res != NULL)
   440         -    vpgPQclear(res);
   441         -  vpgPQfinish(pg_conn);
   442         -  ::wxEndBusyCursor();
   443         -  return false;
   444         -}
   445         -
   446         -void MyFrame::DoSetUniqueVirtNames()
   447         -{
   448         -//
   449         -// ensuring to set Unique Names to all PostgreSQL Tables and Views
   450         -//
   451         -  wxString baseName;
   452         -  wxString uniqueName;
   453         -  MyPostgresConn *pC = PostgresList.GetFirst();
   454         -  while (pC != NULL)
   455         -    {
   456         -      MyPostgresSchema *pS = pC->GetFirst();
   457         -      while (pS != NULL)
   458         -        {
   459         -          MyPostgresTable *pT = pS->GetFirstTable();
   460         -          while (pT != NULL)
   461         -            {
   462         -              if (pT->GetVirtName().Len() == 0)
   463         -                {
   464         -                  baseName = wxT("vpg_") + pT->GetName();
   465         -                  PostgresList.MakeUniqueVirtName(baseName, uniqueName);
   466         -                  pT->SetVirtName(uniqueName);
   467         -                }
   468         -              if (pT->GetFirst() != NULL)
   469         -                {
   470         -                  if (pT->GetPostGisName().Len() == 0)
   471         -                    {
   472         -                      baseName = wxT("vpg_") + pT->GetName() + wxT("_postgis");
   473         -                      PostgresList.MakeUniqueVirtName(baseName, uniqueName);
   474         -                      pT->SetPostGisName(uniqueName);
   475         -                    }
   476         -                }
   477         -              pT = pT->GetNext();
   478         -            }
   479         -          MyPostgresView *pV = pS->GetFirstView();
   480         -          while (pV != NULL)
   481         -            {
   482         -              if (pV->GetVirtName().Len() == 0)
   483         -                {
   484         -                  baseName = wxT("vpg_") + pV->GetName();
   485         -                  PostgresList.MakeUniqueVirtName(baseName, uniqueName);
   486         -                  pV->SetVirtName(uniqueName);
   487         -                }
   488         -              pV = pV->GetNext();
   489         -            }
   490         -          pS = pS->GetNext();
   491         -        }
   492         -      pC = pC->GetNext();
   493         -    }
   494         -}
   495         -
   496         -void MyFrame::DoCreatePostgresTables()
   497         -{
   498         -//
   499         -// attempting to create any required PostgreSQL/PostGIS table
   500         -//
   501         -  char *sql;
   502         -  char *virt_name;
   503         -  char *xvirt_name;
   504         -  char *geom_name;
   505         -  char *geo_type;
   506         -  char *connection_string;
   507         -  char *schema;
   508         -  char *table;
   509         -  int ret;
   510         -  char *errMsg = NULL;
   511         -  MyPostgresConn *pC = PostgresList.GetFirst();
   512         -  while (pC != NULL)
   513         -    {
   514         -      const char *readOnly = "-";
   515         -      const char *textDates = "-";
   516         -      if (pC->IsReadOnly() == false)
   517         -        readOnly = "W";
   518         -      if (pC->IsTextDates() == false)
   519         -        textDates = "J";
   520         -      MyPostgresSchema *pS = pC->GetFirst();
   521         -      while (pS != NULL)
   522         -        {
   523         -          MyPostgresTable *pT = pS->GetFirstTable();
   524         -          while (pT != NULL)
   525         -            {
   526         -              // creating some VirtualPG Table
   527         -              virt_name = (char *) malloc((pT->GetVirtName().Len() * 4) + 1);
   528         -              strcpy(virt_name, pT->GetVirtName().ToUTF8());
   529         -              xvirt_name = gaiaDoubleQuotedSql(virt_name);
   530         -              free(virt_name);
   531         -              connection_string =
   532         -                (char *) malloc((pC->GetConnectionString().Len() * 4) + 1);
   533         -              strcpy(connection_string, pC->GetConnectionString().ToUTF8());
   534         -              schema = (char *) malloc((pS->GetName().Len() * 4) + 1);
   535         -              strcpy(schema, pS->GetName().ToUTF8());
   536         -              table = (char *) malloc((pT->GetName().Len() * 4) + 1);
   537         -              strcpy(table, pT->GetName().ToUTF8());
   538         -              sql =
   539         -                sqlite3_mprintf
   540         -                ("CREATE VIRTUAL TABLE IF NOT EXISTS main.\"%s\" "
   541         -                 "USING VirtualPostgres(%Q, %Q, %Q, %Q, %Q)", xvirt_name,
   542         -                 connection_string, schema, table, readOnly, textDates);
   543         -              free(xvirt_name);
   544         -              free(connection_string);
   545         -              free(schema);
   546         -              free(table);
   547         -              ret = sqlite3_exec(SqliteHandle, sql, NULL, 0, &errMsg);
   548         -              sqlite3_free(sql);
   549         -              if (ret != SQLITE_OK)
   550         -                {
   551         -                  wxMessageBox(wxT("PostgreSQL wrapper: ") +
   552         -                               wxString::FromUTF8(errMsg),
   553         -                               wxT("spatialite_gui"), wxOK | wxICON_ERROR,
   554         -                               this);
   555         -                  sqlite3_free(errMsg);
   556         -                }
   557         -              if (pT->GetFirst() != NULL)
   558         -                {
   559         -                  // creating some SpatiaLite-like Spatial View based on a PostgreSQL Table
   560         -                  virt_name =
   561         -                    (char *) malloc((pT->GetPostGisName().Len() * 4) + 1);
   562         -                  strcpy(virt_name, pT->GetPostGisName().ToUTF8());
   563         -                  xvirt_name = gaiaDoubleQuotedSql(virt_name);
   564         -                  free(virt_name);
   565         -                  sql =
   566         -                    sqlite3_mprintf
   567         -                    ("CREATE VIEW IF NOT EXISTS main.\"%s\" AS\n", xvirt_name);
   568         -                  free(xvirt_name);
   569         -                  sql = DoCreatePostGisSpatialView(pT, sql);
   570         -                  ret = sqlite3_exec(SqliteHandle, sql, NULL, 0, &errMsg);
   571         -                  sqlite3_free(sql);
   572         -                  if (ret != SQLITE_OK)
   573         -                    {
   574         -                      wxMessageBox(wxT("PostGIS wrapper: ") +
   575         -                                   wxString::FromUTF8(errMsg),
   576         -                                   wxT("spatialite_gui"), wxOK | wxICON_ERROR,
   577         -                                   this);
   578         -                      sqlite3_free(errMsg);
   579         -                    }
   580         -                  char a[1024];
   581         -                  char b[1024];
   582         -                  strcpy(a, pS->GetName().ToUTF8());
   583         -                  strcpy(b, pT->GetPostGisName().ToUTF8());
   584         -                  if (pC->IsReadOnly() == false && pT->HasPK() == true
   585         -                      && pT->CanInsertUpdateDelete() == true)
   586         -                    {
   587         -                      // creating all required Triggers so to get a Writable View
   588         -                      DoCreatePostGisSpatialViewTriggers(pC, pS, pT);
   589         -                    }
   590         -                  // registering all Spatial Views
   591         -                  MyPostGisGeometry *pG = pT->GetFirst();
   592         -                  while (pG != NULL)
   593         -                    {
   594         -                      // registering a Spatial View
   595         -                      virt_name =
   596         -                        (char *) malloc((pT->GetPostGisName().Len() * 4) + 1);
   597         -                      strcpy(virt_name, pT->GetPostGisName().ToUTF8());
   598         -                      geom_name =
   599         -                        (char *) malloc((pG->GetName().Len() * 4) + 1);
   600         -                      strcpy(geom_name, pG->GetName().ToUTF8());
   601         -                      geo_type =
   602         -                        (char *) malloc((pG->GetGeomType().Len() * 4) + 1);
   603         -                      strcpy(geo_type, pG->GetGeomType().ToUTF8());
   604         -                      sql =
   605         -                        sqlite3_mprintf
   606         -                        ("INSERT INTO temp.postgis_geometry_columns "
   607         -                         "(f_table_name, f_geometry_column, coord_dimension, srid, geometry_type) "
   608         -                         "VALUES (%Q, %Q, %d, %d, %Q)", virt_name, geom_name,
   609         -                         pG->GetDims(), pG->GetSrid(), geo_type);
   610         -                      free(virt_name);
   611         -                      free(geom_name);
   612         -                      free(geo_type);
   613         -                      ret = sqlite3_exec(SqliteHandle, sql, NULL, 0, &errMsg);
   614         -                      sqlite3_free(sql);
   615         -                      if (ret != SQLITE_OK)
   616         -                        {
   617         -                          wxMessageBox(wxT("PostgreSQL wrapper: ") +
   618         -                                       wxString::FromUTF8(errMsg),
   619         -                                       wxT("spatialite_gui"),
   620         -                                       wxOK | wxICON_ERROR, this);
   621         -                          sqlite3_free(errMsg);
   622         -                        }
   623         -                      pG = pG->GetNext();
   624         -                    }
   625         -                }
   626         -              pT = pT->GetNext();
   627         -            }
   628         -          MyPostgresView *pV = pS->GetFirstView();
   629         -          while (pV != NULL)
   630         -            {
   631         -              // creating some VirtualPG View
   632         -              virt_name = (char *) malloc((pV->GetVirtName().Len() * 4) + 1);
   633         -              strcpy(virt_name, pV->GetVirtName().ToUTF8());
   634         -              xvirt_name = gaiaDoubleQuotedSql(virt_name);
   635         -              free(virt_name);
   636         -              connection_string =
   637         -                (char *) malloc((pC->GetConnectionString().Len() * 4) + 1);
   638         -              strcpy(connection_string, pC->GetConnectionString().ToUTF8());
   639         -              schema = (char *) malloc((pS->GetName().Len() * 4) + 1);
   640         -              strcpy(schema, pS->GetName().ToUTF8());
   641         -              table = (char *) malloc((pV->GetName().Len() * 4) + 1);
   642         -              strcpy(table, pV->GetName().ToUTF8());
   643         -              sql =
   644         -                sqlite3_mprintf
   645         -                ("CREATE VIRTUAL TABLE IF NOT EXISTS main.\"%s\" "
   646         -                 "USING VirtualPostgres(%Q, %Q, %Q, '-', textDates)",
   647         -                 xvirt_name, connection_string, schema, table, textDates);
   648         -              free(xvirt_name);
   649         -              free(connection_string);
   650         -              free(schema);
   651         -              free(table);
   652         -              ret = sqlite3_exec(SqliteHandle, sql, NULL, 0, &errMsg);
   653         -              sqlite3_free(sql);
   654         -              if (ret != SQLITE_OK)
   655         -                {
   656         -                  wxMessageBox(wxT("PostgreSQL wrapper: ") +
   657         -                               wxString::FromUTF8(errMsg),
   658         -                               wxT("spatialite_gui"), wxOK | wxICON_ERROR,
   659         -                               this);
   660         -                  sqlite3_free(errMsg);
   661         -                }
   662         -              pV = pV->GetNext();
   663         -            }
   664         -          pS = pS->GetNext();
   665         -        }
   666         -      pC = pC->GetNext();
   667         -    }
   668         -}
   669         -
   670         -char *MyFrame::DoCreatePostGisSpatialView(MyPostgresTable * table,
   671         -                                          char *prev_sql)
   672         -{
   673         -//
   674         -// auto-writing the CREATE VIEW for some PostGIS geometry
   675         -//
   676         -  int ret;
   677         -  int i;
   678         -  char **results;
   679         -  int rows;
   680         -  int columns;
   681         -  char *sql = prev_sql;
   682         -  char *prev;
   683         -  char *xtable = (char *) malloc((table->GetVirtName().Len() * 4) + 1);
   684         -  strcpy(xtable, table->GetVirtName().ToUTF8());
   685         -  char *sql2 = sqlite3_mprintf("PRAGMA table_info(%Q)", xtable);
   686         -  free(xtable);
   687         -  ret = sqlite3_get_table(SqliteHandle, sql2, &results, &rows, &columns, NULL);
   688         -  sqlite3_free(sql2);
   689         -  if (ret != SQLITE_OK)
   690         -    return sql;
   691         -  if (rows < 1)
   692         -    ;
   693         -  else
   694         -    {
   695         -      prev = sql;
   696         -      sql = sqlite3_mprintf("%sSELECT ROWID AS ROWID", prev);
   697         -      sqlite3_free(prev);
   698         -      for (i = 1; i <= rows; i++)
   699         -        {
   700         -          prev = sql;
   701         -          const char *name = results[(i * columns) + 1];
   702         -          char *xname = gaiaDoubleQuotedSql(name);
   703         -          wxString col = wxString::FromUTF8(name);
   704         -          MyPostGisGeometry *geom = table->Find(col);
   705         -          if (geom != NULL)
   706         -            {
   707         -              if (geom->IsMultiType() == true)
   708         -                sql =
   709         -                  sqlite3_mprintf
   710         -                  ("%s, CastToMulti(GeomFromEWKB(\"%s\")) AS \"%s\"", prev,
   711         -                   xname, xname);
   712         -              else
   713         -                sql =
   714         -                  sqlite3_mprintf("%s, GeomFromEWKB(\"%s\") AS \"%s\"",
   715         -                                  prev, xname, xname);
   716         -          } else
   717         -            {
   718         -              sql = sqlite3_mprintf("%s, \"%s\" AS \"%s\"", prev, xname, xname);
   719         -            }
   720         -          free(xname);
   721         -          sqlite3_free(prev);
   722         -        }
   723         -    }
   724         -  sqlite3_free_table(results);
   725         -
   726         -  prev = sql;
   727         -  xtable = (char *) malloc((table->GetVirtName().Len() * 4) + 1);
   728         -  strcpy(xtable, table->GetVirtName().ToUTF8());
   729         -  char *xxtable = gaiaDoubleQuotedSql(xtable);
   730         -  free(xtable);
   731         -  sql = sqlite3_mprintf("%s\nFROM MAIN.\"%s\"", prev, xxtable);
   732         -  free(xxtable);
   733         -  sqlite3_free(prev);
   734         -  return sql;
   735         -}
   736         -
   737         -void MyFrame::DoCheckGrantPermissions(void *conn, wxString & user,
   738         -                                      MyPostgresSchema * schema,
   739         -                                      MyPostgresTable * table)
   740         -{
   741         -//
   742         -// testing Grant permissions for some PostgreSQL Table or View
   743         -//
   744         -  PGconn *pg_conn = (PGconn *) conn;
   745         -  PGresult *res;
   746         -  int nRows;
   747         -  int nFields;
   748         -  int r;
   749         -  bool canSelect = false;
   750         -  bool canInsert = false;
   751         -  bool canUpdate = false;
   752         -  bool canDelete = false;
   753         -  bool canInsertUpdateDelete = false;
   754         -  char *cuser = (char *) malloc(user.Len() * 4 + 1);
   755         -  strcpy(cuser, user.ToUTF8());
   756         -  char *cschema = (char *) malloc(schema->GetName().Len() * 4 + 1);
   757         -  strcpy(cschema, schema->GetName().ToUTF8());
   758         -  char *ctable = (char *) malloc(table->GetName().Len() * 4 + 1);
   759         -  strcpy(ctable, table->GetName().ToUTF8());
   760         -  char *name = sqlite3_mprintf("%s.%s", cschema, ctable);
   761         -// testing for SELECT
   762         -  char *sql =
   763         -    sqlite3_mprintf("SELECT has_table_privilege(%Q, %Q, 'select')", cuser,
   764         -                    name);
   765         -  res = vpgPQexec(pg_conn, sql);
   766         -  sqlite3_free(sql);
   767         -  if (vpgPQresultStatus(res) != PGRES_TUPLES_OK)
   768         -    goto end;
   769         -  nRows = vpgPQntuples(res);
   770         -  nFields = vpgPQnfields(res);
   771         -  if (nRows > 0 && nFields == 1)
   772         -    {
   773         -      for (r = 0; r < nRows; r++)
   774         -        {
   775         -          const char *permission = vpgPQgetvalue(res, r, 0);
   776         -          if (strcmp(permission, "t") == 0)
   777         -            canSelect = true;
   778         -        }
   779         -    }
   780         -  vpgPQclear(res);
   781         -  res = NULL;
   782         -// testing for INSERT
   783         -  sql =
   784         -    sqlite3_mprintf("SELECT has_table_privilege(%Q, %Q, 'insert')", cuser,
   785         -                    name);
   786         -  res = vpgPQexec(pg_conn, sql);
   787         -  sqlite3_free(sql);
   788         -  if (vpgPQresultStatus(res) != PGRES_TUPLES_OK)
   789         -    goto end;
   790         -  nRows = vpgPQntuples(res);
   791         -  nFields = vpgPQnfields(res);
   792         -  if (nRows > 0 && nFields == 1)
   793         -    {
   794         -      for (r = 0; r < nRows; r++)
   795         -        {
   796         -          const char *permission = vpgPQgetvalue(res, r, 0);
   797         -          if (strcmp(permission, "t") == 0)
   798         -            canInsert = true;
   799         -        }
   800         -    }
   801         -  vpgPQclear(res);
   802         -  res = NULL;
   803         -// testing for UPDATE
   804         -  sql =
   805         -    sqlite3_mprintf("SELECT has_table_privilege(%Q, %Q, 'update')", cuser,
   806         -                    name);
   807         -  res = vpgPQexec(pg_conn, sql);
   808         -  sqlite3_free(sql);
   809         -  if (vpgPQresultStatus(res) != PGRES_TUPLES_OK)
   810         -    goto end;
   811         -  nRows = vpgPQntuples(res);
   812         -  nFields = vpgPQnfields(res);
   813         -  if (nRows > 0 && nFields == 1)
   814         -    {
   815         -      for (r = 0; r < nRows; r++)
   816         -        {
   817         -          const char *permission = vpgPQgetvalue(res, r, 0);
   818         -          if (strcmp(permission, "t") == 0)
   819         -            canUpdate = true;
   820         -        }
   821         -    }
   822         -  vpgPQclear(res);
   823         -  res = NULL;
   824         -// testing for DELETE
   825         -  sql =
   826         -    sqlite3_mprintf("SELECT has_table_privilege(%Q, %Q, 'delete')", cuser,
   827         -                    name);
   828         -  res = vpgPQexec(pg_conn, sql);
   829         -  sqlite3_free(sql);
   830         -  if (vpgPQresultStatus(res) != PGRES_TUPLES_OK)
   831         -    goto end;
   832         -  nRows = vpgPQntuples(res);
   833         -  nFields = vpgPQnfields(res);
   834         -  if (nRows > 0 && nFields == 1)
   835         -    {
   836         -      for (r = 0; r < nRows; r++)
   837         -        {
   838         -          const char *permission = vpgPQgetvalue(res, r, 0);
   839         -          if (strcmp(permission, "t") == 0)
   840         -            canDelete = true;
   841         -        }
   842         -    }
   843         -  vpgPQclear(res);
   844         -  res = NULL;
   845         -
   846         -  if (canInsert == true && canUpdate == true && canDelete == true)
   847         -    canInsertUpdateDelete = true;
   848         -  table->SetGrants(canSelect, canInsertUpdateDelete);
   849         -end:
   850         -  if (res != NULL)
   851         -    vpgPQclear(res);
   852         -  free(cuser);
   853         -  free(cschema);
   854         -  free(ctable);
   855         -  sqlite3_free(name);
   856         -}
   857         -
   858         -void MyFrame::DoCheckGrantPermissions(void *conn, wxString & user,
   859         -                                      MyPostgresSchema * schema,
   860         -                                      MyPostgresView * view)
   861         -{
   862         -//
   863         -// testing Grant permissions for some PostgreSQL Table or View
   864         -//
   865         -  PGconn *pg_conn = (PGconn *) conn;
   866         -  PGresult *res;
   867         -  int nRows;
   868         -  int nFields;
   869         -  int r;
   870         -  bool canSelect = false;
   871         -  bool canInsert = false;
   872         -  bool canUpdate = false;
   873         -  bool canDelete = false;
   874         -  bool canInsertUpdateDelete = false;
   875         -  char *cuser = (char *) malloc(user.Len() * 4 + 1);
   876         -  strcpy(cuser, user.ToUTF8());
   877         -  char *cschema = (char *) malloc(schema->GetName().Len() * 4 + 1);
   878         -  strcpy(cschema, schema->GetName().ToUTF8());
   879         -  char *ctable = (char *) malloc(view->GetName().Len() * 4 + 1);
   880         -  strcpy(ctable, view->GetName().ToUTF8());
   881         -  char *name = sqlite3_mprintf("%s.%s", cschema, ctable);
   882         -// testing for SELECT
   883         -  char *sql =
   884         -    sqlite3_mprintf("SELECT has_table_privilege(%Q, %Q, 'select')", cuser,
   885         -                    name);
   886         -  res = vpgPQexec(pg_conn, sql);
   887         -  sqlite3_free(sql);
   888         -  if (vpgPQresultStatus(res) != PGRES_TUPLES_OK)
   889         -    goto end;
   890         -  nRows = vpgPQntuples(res);
   891         -  nFields = vpgPQnfields(res);
   892         -  if (nRows > 0 && nFields == 1)
   893         -    {
   894         -      for (r = 0; r < nRows; r++)
   895         -        {
   896         -          const char *permission = vpgPQgetvalue(res, r, 0);
   897         -          if (strcmp(permission, "t") == 0)
   898         -            canSelect = true;
   899         -        }
   900         -    }
   901         -  vpgPQclear(res);
   902         -  res = NULL;
   903         -// testing for INSERT
   904         -  sql =
   905         -    sqlite3_mprintf("SELECT has_table_privilege(%Q, %Q, 'insert')", cuser,
   906         -                    name);
   907         -  res = vpgPQexec(pg_conn, sql);
   908         -  sqlite3_free(sql);
   909         -  if (vpgPQresultStatus(res) != PGRES_TUPLES_OK)
   910         -    goto end;
   911         -  nRows = vpgPQntuples(res);
   912         -  nFields = vpgPQnfields(res);
   913         -  if (nRows > 0 && nFields == 1)
   914         -    {
   915         -      for (r = 0; r < nRows; r++)
   916         -        {
   917         -          const char *permission = vpgPQgetvalue(res, r, 0);
   918         -          if (strcmp(permission, "t") == 0)
   919         -            canInsert = true;
   920         -        }
   921         -    }
   922         -  vpgPQclear(res);
   923         -  res = NULL;
   924         -// testing for UPDATE
   925         -  sql =
   926         -    sqlite3_mprintf("SELECT has_table_privilege(%Q, %Q, 'update')", cuser,
   927         -                    name);
   928         -  res = vpgPQexec(pg_conn, sql);
   929         -  sqlite3_free(sql);
   930         -  if (vpgPQresultStatus(res) != PGRES_TUPLES_OK)
   931         -    goto end;
   932         -  nRows = vpgPQntuples(res);
   933         -  nFields = vpgPQnfields(res);
   934         -  if (nRows > 0 && nFields == 1)
   935         -    {
   936         -      for (r = 0; r < nRows; r++)
   937         -        {
   938         -          const char *permission = vpgPQgetvalue(res, r, 0);
   939         -          if (strcmp(permission, "t") == 0)
   940         -            canUpdate = true;
   941         -        }
   942         -    }
   943         -  vpgPQclear(res);
   944         -  res = NULL;
   945         -// testing for DELETE
   946         -  sql =
   947         -    sqlite3_mprintf("SELECT has_table_privilege(%Q, %Q, 'delete')", cuser,
   948         -                    name);
   949         -  res = vpgPQexec(pg_conn, sql);
   950         -  sqlite3_free(sql);
   951         -  if (vpgPQresultStatus(res) != PGRES_TUPLES_OK)
   952         -    goto end;
   953         -  nRows = vpgPQntuples(res);
   954         -  nFields = vpgPQnfields(res);
   955         -  if (nRows > 0 && nFields == 1)
   956         -    {
   957         -      for (r = 0; r < nRows; r++)
   958         -        {
   959         -          const char *permission = vpgPQgetvalue(res, r, 0);
   960         -          if (strcmp(permission, "t") == 0)
   961         -            canDelete = true;
   962         -        }
   963         -    }
   964         -  vpgPQclear(res);
   965         -  res = NULL;
   966         -
   967         -  if (canInsert == true && canUpdate == true && canDelete == true)
   968         -    canInsertUpdateDelete = true;
   969         -  view->SetGrants(canSelect, canInsertUpdateDelete);
   970         -end:
   971         -  if (res != NULL)
   972         -    vpgPQclear(res);
   973         -  free(cuser);
   974         -  free(cschema);
   975         -  free(ctable);
   976         -  sqlite3_free(name);
   977         -}
   978         -
   979         -void MyFrame::DoCreatePostGisSpatialViewTriggers(MyPostgresConn * conn,
   980         -                                                 MyPostgresSchema * schema,
   981         -                                                 MyPostgresTable * table)
   982         -{
   983         -//
   984         -// auto-writing the CREATE TRIGGERS for some PostGIS geometry (writable view)
   985         -//
   986         -  char *sql;
   987         -  char *prev;
   988         -  char *ctrigger;
   989         -  char *xtrigger;
   990         -  char *ctable;
   991         -  char *xtable;
   992         -  char *cview;
   993         -  char *xview;
   994         -  char name[1024];
   995         -  char *xname;
   996         -  char *where;
   997         -  int first;
   998         -  MyPostgresCol *pC;
   999         -  MyPostgresColumns *cols;
  1000         -  char *errMsg = NULL;
  1001         -  int ret;
  1002         -
  1003         -  InitPostgresPkColumns(conn, schema, table);
  1004         -  cols = DoGetPostgresColumns(table);
  1005         -
  1006         -// preparing the INSERT Trigger
  1007         -  ctable = (char *) malloc(table->GetVirtName().Len() * 4 + 1);
  1008         -  strcpy(ctable, table->GetVirtName().ToUTF8());
  1009         -  xtable = gaiaDoubleQuotedSql(ctable);
  1010         -  free(ctable);
  1011         -  cview = (char *) malloc(table->GetPostGisName().Len() * 4 + 1);
  1012         -  strcpy(cview, table->GetPostGisName().ToUTF8());
  1013         -  xview = gaiaDoubleQuotedSql(cview);
  1014         -  ctrigger = sqlite3_mprintf("%s_trgins", cview);
  1015         -  free(cview);
  1016         -  xtrigger = gaiaDoubleQuotedSql(ctrigger);
  1017         -  sqlite3_free(ctrigger);
  1018         -  sql = sqlite3_mprintf("CREATE TRIGGER \"%s\"\n\tINSTEAD OF "
  1019         -                        "INSERT ON \"%s\"\nBEGIN\n\tINSERT OR REPLACE INTO \"%s\"\n\t\t(",
  1020         -                        xtrigger, xview, xtable);
  1021         -  free(xtrigger);
  1022         -  free(xtable);
  1023         -  free(xview);
  1024         -  pC = cols->GetFirst();
  1025         -  first = 1;
  1026         -  while (pC != NULL)
  1027         -    {
  1028         -      prev = sql;
  1029         -      if (first)
  1030         -        {
  1031         -          first = 0;
  1032         -          strcpy(name, pC->GetName().ToUTF8());
  1033         -          xname = gaiaDoubleQuotedSql(name);
  1034         -          sql = sqlite3_mprintf("%s\"%s\"", prev, xname);
  1035         -          free(xname);
  1036         -      } else
  1037         -        {
  1038         -          strcpy(name, pC->GetName().ToUTF8());
  1039         -          xname = gaiaDoubleQuotedSql(name);
  1040         -          sql = sqlite3_mprintf("%s, \"%s\"", prev, xname);
  1041         -          free(xname);
  1042         -        }
  1043         -      sqlite3_free(prev);
  1044         -      pC = pC->GetNext();
  1045         -    }
  1046         -  prev = sql;
  1047         -  sql = sqlite3_mprintf("%s)\n\tVALUES (", prev);
  1048         -  sqlite3_free(prev);
  1049         -  pC = cols->GetFirst();
  1050         -  first = 1;
  1051         -  while (pC != NULL)
  1052         -    {
  1053         -      strcpy(name, pC->GetName().ToUTF8());
  1054         -      xname = gaiaDoubleQuotedSql(name);
  1055         -      MyPostGisGeometry *geom = table->Find(pC->GetName());
  1056         -      prev = sql;
  1057         -      if (first)
  1058         -        {
  1059         -          first = 0;
  1060         -          if (geom != NULL)
  1061         -            sql = sqlite3_mprintf("%sAsEWKB(NEW.\"%s\")", prev, xname);
  1062         -          else
  1063         -            sql = sqlite3_mprintf("%sNEW.\"%s\"", prev, xname);
  1064         -      } else
  1065         -        {
  1066         -          if (geom != NULL)
  1067         -            sql = sqlite3_mprintf("%s, AsEWKB(NEW.\"%s\")", prev, xname);
  1068         -          else
  1069         -            sql = sqlite3_mprintf("%s, NEW.\"%s\"", prev, xname);
  1070         -        }
  1071         -      free(xname);
  1072         -      sqlite3_free(prev);
  1073         -      pC = pC->GetNext();
  1074         -    }
  1075         -  prev = sql;
  1076         -  sql = sqlite3_mprintf("%s);\nEND", prev);
  1077         -  sqlite3_free(prev);
  1078         -  ret = sqlite3_exec(SqliteHandle, sql, NULL, 0, &errMsg);
  1079         -  sqlite3_free(sql);
  1080         -  if (ret != SQLITE_OK)
  1081         -    {
  1082         -      wxMessageBox(wxT("CREATE TRIGGER error: ") + wxString::FromUTF8(errMsg),
  1083         -                   wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
  1084         -      sqlite3_free(errMsg);
  1085         -    }
  1086         -// preparing the UPDATE Trigger
  1087         -  ctable = (char *) malloc(table->GetVirtName().Len() * 4 + 1);
  1088         -  strcpy(ctable, table->GetVirtName().ToUTF8());
  1089         -  xtable = gaiaDoubleQuotedSql(ctable);
  1090         -  free(ctable);
  1091         -  cview = (char *) malloc(table->GetPostGisName().Len() * 4 + 1);
  1092         -  strcpy(cview, table->GetPostGisName().ToUTF8());
  1093         -  xview = gaiaDoubleQuotedSql(cview);
  1094         -  ctrigger = sqlite3_mprintf("%s_trgupd", cview);
  1095         -  free(cview);
  1096         -  xtrigger = gaiaDoubleQuotedSql(ctrigger);
  1097         -  sqlite3_free(ctrigger);
  1098         -  sql = sqlite3_mprintf("CREATE TRIGGER \"%s\"\n\tINSTEAD OF "
  1099         -                        "UPDATE OF ", xtrigger);
  1100         -  free(xtrigger);
  1101         -  pC = cols->GetFirst();
  1102         -  first = 1;
  1103         -  while (pC != NULL)
  1104         -    {
  1105         -      strcpy(name, pC->GetName().ToUTF8());
  1106         -      xname = gaiaDoubleQuotedSql(name);
  1107         -      prev = sql;
  1108         -      if (first)
  1109         -        {
  1110         -          first = 0;
  1111         -          sql = sqlite3_mprintf("%s\"%s\"", prev, xname);
  1112         -      } else
  1113         -        sql = sqlite3_mprintf("%s, \"%s\"", prev, xname);
  1114         -      free(xname);
  1115         -      sqlite3_free(prev);
  1116         -      pC = pC->GetNext();
  1117         -    }
  1118         -  prev = sql;
  1119         -  sql =
  1120         -    sqlite3_mprintf("%s\n\tON \"%s\"\nBEGIN\n\tUPDATE \"%s\" SET ", prev, xview,
  1121         -                    xtable);
  1122         -  sqlite3_free(prev);
  1123         -  free(xtable);
  1124         -  free(xview);
  1125         -  pC = cols->GetFirst();
  1126         -  first = 1;
  1127         -  while (pC != NULL)
  1128         -    {
  1129         -      strcpy(name, pC->GetName().ToUTF8());
  1130         -      xname = gaiaDoubleQuotedSql(name);
  1131         -      MyPostGisGeometry *geom = table->Find(pC->GetName());
  1132         -      prev = sql;
  1133         -      if (first)
  1134         -        {
  1135         -          first = 0;
  1136         -          if (geom != NULL)
  1137         -            sql =
  1138         -              sqlite3_mprintf("%s\"%s\" = AsEWKB(NEW.\"%s\")", prev, xname,
  1139         -                              xname);
  1140         -          else
  1141         -            sql = sqlite3_mprintf("%s\"%s\" = NEW.\"%s\"", prev, xname, xname);
  1142         -      } else
  1143         -        {
  1144         -          if (geom != NULL)
  1145         -            sql =
  1146         -              sqlite3_mprintf("%s, \"%s\" = AsEWKB(NEW.\"%s\")", prev, xname,
  1147         -                              xname);
  1148         -          else
  1149         -            sql =
  1150         -              sqlite3_mprintf("%s, \"%s\" = NEW.\"%s\"", prev, xname, xname);
  1151         -        }
  1152         -      free(xname);
  1153         -      sqlite3_free(prev);
  1154         -      pC = pC->GetNext();
  1155         -    }
  1156         -  prev = sql;
  1157         -  where = cols->BuildWhere();
  1158         -  sql = sqlite3_mprintf("%s\n\t%s;\nEND", prev, where);
  1159         -  sqlite3_free(prev);
  1160         -  sqlite3_free(where);
  1161         -  ret = sqlite3_exec(SqliteHandle, sql, NULL, 0, &errMsg);
  1162         -  sqlite3_free(sql);
  1163         -  if (ret != SQLITE_OK)
  1164         -    {
  1165         -      wxMessageBox(wxT("CREATE TRIGGER error: ") + wxString::FromUTF8(errMsg),
  1166         -                   wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
  1167         -      sqlite3_free(errMsg);
  1168         -    }
  1169         -// preparing the DELETE Trigger
  1170         -  ctable = (char *) malloc(table->GetVirtName().Len() * 4 + 1);
  1171         -  strcpy(ctable, table->GetVirtName().ToUTF8());
  1172         -  xtable = gaiaDoubleQuotedSql(ctable);
  1173         -  free(ctable);
  1174         -  cview = (char *) malloc(table->GetPostGisName().Len() * 4 + 1);
  1175         -  strcpy(cview, table->GetPostGisName().ToUTF8());
  1176         -  xview = gaiaDoubleQuotedSql(cview);
  1177         -  ctrigger = sqlite3_mprintf("%s_trgdel", cview);
  1178         -  free(cview);
  1179         -  xtrigger = gaiaDoubleQuotedSql(ctrigger);
  1180         -  sqlite3_free(ctrigger);
  1181         -  where = cols->BuildWhere();
  1182         -  sql = sqlite3_mprintf("CREATE TRIGGER \"%s\"\n\tINSTEAD OF "
  1183         -                        "DELETE ON \"%s\"\nBEGIN\n\tDELETE FROM \"%s\" %s;\nEND",
  1184         -                        xtrigger, xview, xtable, where);
  1185         -  sqlite3_free(where);
  1186         -  free(xtrigger);
  1187         -  free(xtable);
  1188         -  free(xview);
  1189         -  ret = sqlite3_exec(SqliteHandle, sql, NULL, 0, &errMsg);
  1190         -  sqlite3_free(sql);
  1191         -  if (ret != SQLITE_OK)
  1192         -    {
  1193         -      wxMessageBox(wxT("CREATE TRIGGER error: ") + wxString::FromUTF8(errMsg),
  1194         -                   wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
  1195         -      sqlite3_free(errMsg);
  1196         -    }
  1197         -
  1198         -  delete cols;
  1199         -}
  1200         -
  1201         -MyPostgresColumns *MyFrame::DoGetPostgresColumns(MyPostgresTable * table)
  1202         -{
  1203         -//
  1204         -// fetching all Columns for a given VirtualPG Table
  1205         -//  
  1206         -  MyPostgresColumns *cols = NULL;
  1207         -  int ret;
  1208         -  int i;
  1209         -  char **results;
  1210         -  int rows;
  1211         -  int columns;
  1212         -  char *xtable = (char *) malloc((table->GetVirtName().Len() * 4) + 1);
  1213         -  strcpy(xtable, table->GetVirtName().ToUTF8());
  1214         -  char *sql = sqlite3_mprintf("PRAGMA table_info(%Q)", xtable);
  1215         -  free(xtable);
  1216         -  ret = sqlite3_get_table(SqliteHandle, sql, &results, &rows, &columns, NULL);
  1217         -  sqlite3_free(sql);
  1218         -  if (ret != SQLITE_OK)
  1219         -    return NULL;
  1220         -  if (rows < 1)
  1221         -    ;
  1222         -  else
  1223         -    {
  1224         -      cols = new MyPostgresColumns();
  1225         -      for (i = 1; i <= rows; i++)
  1226         -        {
  1227         -          const char *name = results[(i * columns) + 1];
  1228         -          wxString sName = wxString::FromUTF8(name);
  1229         -          cols->Add(sName);
  1230         -        }
  1231         -    }
  1232         -  sqlite3_free_table(results);
  1233         -
  1234         -  MyPostgresPK *pK = table->GetFirstPK();
  1235         -  while (pK != NULL)
  1236         -    {
  1237         -      // marking all PK Columns
  1238         -      cols->SetPK(pK->GetName());
  1239         -      pK = pK->GetNext();
  1240         -    }
  1241         -
  1242         -  if (cols->GetFirst() == NULL)
  1243         -    {
  1244         -      // empyt list !!!
  1245         -      delete cols;
  1246         -      return NULL;
  1247         -    }
  1248         -  return cols;
  1249         -}
  1250         -
  1251         -void MyFrame::DoDropPostgresTables()
  1252         -{
  1253         -//
  1254         -// attempting to drop any PostgreSQL/PostGIS table
  1255         -//
  1256         -  char *sql;
  1257         -  char *virt_name;
  1258         -  char *xvirt_name;
  1259         -  char *geom_name;
  1260         -  int ret;
  1261         -  char *errMsg = NULL;
  1262         -  MyPostgresConn *pC = PostgresList.GetFirst();
  1263         -  while (pC != NULL)
  1264         -    {
  1265         -      MyPostgresSchema *pS = pC->GetFirst();
  1266         -      while (pS != NULL)
  1267         -        {
  1268         -          MyPostgresTable *pT = pS->GetFirstTable();
  1269         -          while (pT != NULL)
  1270         -            {
  1271         -              if (pT->GetFirst() != NULL)
  1272         -                {
  1273         -                  // dropping some SpatiaLite-like Spatial View based on a PostgreSQL Table
  1274         -                  virt_name =
  1275         -                    (char *) malloc((pT->GetPostGisName().Len() * 4) + 1);
  1276         -                  strcpy(virt_name, pT->GetPostGisName().ToUTF8());
  1277         -                  xvirt_name = gaiaDoubleQuotedSql(virt_name);
  1278         -                  free(virt_name);
  1279         -                  sql =
  1280         -                    sqlite3_mprintf("DROP VIEW IF EXISTS main.\"%s\"",
  1281         -                                    xvirt_name);
  1282         -                  free(xvirt_name);
  1283         -                  ret = sqlite3_exec(SqliteHandle, sql, NULL, 0, &errMsg);
  1284         -                  sqlite3_free(sql);
  1285         -                  if (ret != SQLITE_OK)
  1286         -                    {
  1287         -                      wxMessageBox(wxT("PostGIS wrapper: ") +
  1288         -                                   wxString::FromUTF8(errMsg),
  1289         -                                   wxT("spatialite_gui"), wxOK | wxICON_ERROR,
  1290         -                                   this);
  1291         -                      sqlite3_free(errMsg);
  1292         -                    }
  1293         -                  MyPostGisGeometry *pG = pT->GetFirst();
  1294         -                  while (pG != NULL)
  1295         -                    {
  1296         -                      // removing from POSTGIS_GEOMETRY_COLUMNS
  1297         -                      virt_name =
  1298         -                        (char *) malloc((pT->GetPostGisName().Len() * 4) + 1);
  1299         -                      strcpy(virt_name, pT->GetPostGisName().ToUTF8());
  1300         -                      geom_name =
  1301         -                        (char *) malloc((pG->GetName().Len() * 4) + 1);
  1302         -                      strcpy(geom_name, pG->GetName().ToUTF8());
  1303         -                      sql =
  1304         -                        sqlite3_mprintf
  1305         -                        ("DELETE FROM temp.postgis_geometry_columns "
  1306         -                         "WHERE f_table_name = %Q AND f_geometry_column = %Q",
  1307         -                         virt_name, geom_name);
  1308         -                      free(virt_name);
  1309         -                      free(geom_name);
  1310         -                      ret = sqlite3_exec(SqliteHandle, sql, NULL, 0, &errMsg);
  1311         -                      sqlite3_free(sql);
  1312         -                      if (ret != SQLITE_OK)
  1313         -                        {
  1314         -                          wxMessageBox(wxT("PostGIS wrapper: ") +
  1315         -                                       wxString::FromUTF8(errMsg),
  1316         -                                       wxT("spatialite_gui"),
  1317         -                                       wxOK | wxICON_ERROR, this);
  1318         -                          sqlite3_free(errMsg);
  1319         -                        }
  1320         -                      pG = pG->GetNext();
  1321         -                    }
  1322         -                }
  1323         -              // dropping some VirtualPG Table
  1324         -              virt_name = (char *) malloc((pT->GetVirtName().Len() * 4) + 1);
  1325         -              strcpy(virt_name, pT->GetVirtName().ToUTF8());
  1326         -              xvirt_name = gaiaDoubleQuotedSql(virt_name);
  1327         -              free(virt_name);
  1328         -              sql =
  1329         -                sqlite3_mprintf("DROP TABLE IF EXISTS main.\"%s\"", xvirt_name);
  1330         -              free(xvirt_name);
  1331         -              ret = sqlite3_exec(SqliteHandle, sql, NULL, 0, &errMsg);
  1332         -              sqlite3_free(sql);
  1333         -              if (ret != SQLITE_OK)
  1334         -                {
  1335         -                  wxMessageBox(wxT("PostgreSQL wrapper: ") +
  1336         -                               wxString::FromUTF8(errMsg),
  1337         -                               wxT("spatialite_gui"), wxOK | wxICON_ERROR,
  1338         -                               this);
  1339         -                  sqlite3_free(errMsg);
  1340         -                }
  1341         -              pT = pT->GetNext();
  1342         -            }
  1343         -          MyPostgresView *pV = pS->GetFirstView();
  1344         -          while (pV != NULL)
  1345         -            {
  1346         -              // dropping some VirtualPG View
  1347         -              virt_name = (char *) malloc((pV->GetVirtName().Len() * 4) + 1);
  1348         -              strcpy(virt_name, pV->GetVirtName().ToUTF8());
  1349         -              xvirt_name = gaiaDoubleQuotedSql(virt_name);
  1350         -              free(virt_name);
  1351         -              sql =
  1352         -                sqlite3_mprintf("DROP TABLE IF EXISTS main.\"%s\"", xvirt_name);
  1353         -              free(xvirt_name);
  1354         -              ret = sqlite3_exec(SqliteHandle, sql, NULL, 0, &errMsg);
  1355         -              sqlite3_free(sql);
  1356         -              if (ret != SQLITE_OK)
  1357         -                {
  1358         -                  wxMessageBox(wxT("PostgreSQL wrapper: ") +
  1359         -                               wxString::FromUTF8(errMsg),
  1360         -                               wxT("spatialite_gui"), wxOK | wxICON_ERROR,
  1361         -                               this);
  1362         -                  sqlite3_free(errMsg);
  1363         -                }
  1364         -              pV = pV->GetNext();
  1365         -            }
  1366         -          pS = pS->GetNext();
  1367         -        }
  1368         -      pC = pC->GetNext();
  1369         -    }
  1370         -}
  1371         -
  1372         -bool MyFrame::DoClosePostgreSqlConn(wxString & host, wxString & hostaddr,
  1373         -                                    int port, wxString & dbname,
  1374         -                                    wxString & user)
  1375         -{
  1376         -//
  1377         -// attempting to close a single connection to PostgreSQL
  1378         -//
  1379         -  char *sql;
  1380         -  char *virt_name;
  1381         -  char *xvirt_name;
  1382         -  char *geom_name;
  1383         -  int ret;
  1384         -  char *errMsg = NULL;
  1385         -  MyPostgresConn *conn = NULL;
  1386         -  MyPostgresConn *pC = PostgresList.GetFirst();
  1387         -  while (pC != NULL)
  1388         -    {
  1389         -      if (pC->GetHost().Cmp(host) == 0 && pC->GetHostAddr().Cmp(hostaddr) == 0
  1390         -          && pC->GetPort() == port && pC->GetDbName().Cmp(dbname) == 0
  1391         -          && pC->GetUser().Cmp(user) == 0)
  1392         -        conn = pC;
  1393         -      pC = pC->GetNext();
  1394         -    }
  1395         -  if (conn == NULL)
  1396         -    return false;
  1397         -
  1398         -  pC = conn;
  1399         -  MyPostgresSchema *pS = pC->GetFirst();
  1400         -  while (pS != NULL)
  1401         -    {
  1402         -      MyPostgresTable *pT = pS->GetFirstTable();
  1403         -      while (pT != NULL)
  1404         -        {
  1405         -          if (pT->GetFirst() != NULL)
  1406         -            {
  1407         -              // dropping some SpatiaLite-like Spatial View based on a PostgreSQL Table
  1408         -              virt_name = (char *) malloc((pT->GetPostGisName().Len() * 4) + 1);
  1409         -              strcpy(virt_name, pT->GetPostGisName().ToUTF8());
  1410         -              xvirt_name = gaiaDoubleQuotedSql(virt_name);
  1411         -              free(virt_name);
  1412         -              sql =
  1413         -                sqlite3_mprintf("DROP VIEW IF EXISTS main.\"%s\"", xvirt_name);
  1414         -              free(xvirt_name);
  1415         -              ret = sqlite3_exec(SqliteHandle, sql, NULL, 0, &errMsg);
  1416         -              sqlite3_free(sql);
  1417         -              if (ret != SQLITE_OK)
  1418         -                {
  1419         -                  wxMessageBox(wxT("PostGIS wrapper: ") +
  1420         -                               wxString::FromUTF8(errMsg),
  1421         -                               wxT("spatialite_gui"), wxOK | wxICON_ERROR,
  1422         -                               this);
  1423         -                  sqlite3_free(errMsg);
  1424         -                }
  1425         -              MyPostGisGeometry *pG = pT->GetFirst();
  1426         -              while (pG != NULL)
  1427         -                {
  1428         -                  // removing from POSTGIS_GEOMETRY_COLUMNS
  1429         -                  virt_name =
  1430         -                    (char *) malloc((pT->GetPostGisName().Len() * 4) + 1);
  1431         -                  strcpy(virt_name, pT->GetPostGisName().ToUTF8());
  1432         -                  geom_name = (char *) malloc((pG->GetName().Len() * 4) + 1);
  1433         -                  strcpy(geom_name, pG->GetName().ToUTF8());
  1434         -                  sql =
  1435         -                    sqlite3_mprintf("DELETE FROM temp.postgis_geometry_columns "
  1436         -                                    "WHERE f_table_name = %Q AND f_geometry_column = %Q",
  1437         -                                    virt_name, geom_name);
  1438         -                  free(virt_name);
  1439         -                  free(geom_name);
  1440         -                  ret = sqlite3_exec(SqliteHandle, sql, NULL, 0, &errMsg);
  1441         -                  sqlite3_free(sql);
  1442         -                  if (ret != SQLITE_OK)
  1443         -                    {
  1444         -                      wxMessageBox(wxT("PostGIS wrapper: ") +
  1445         -                                   wxString::FromUTF8(errMsg),
  1446         -                                   wxT("spatialite_gui"), wxOK | wxICON_ERROR,
  1447         -                                   this);
  1448         -                      sqlite3_free(errMsg);
  1449         -                    }
  1450         -                  pG = pG->GetNext();
  1451         -                }
  1452         -            }
  1453         -          // dropping some VirtualPG Table
  1454         -          virt_name = (char *) malloc((pT->GetVirtName().Len() * 4) + 1);
  1455         -          strcpy(virt_name, pT->GetVirtName().ToUTF8());
  1456         -          xvirt_name = gaiaDoubleQuotedSql(virt_name);
  1457         -          free(virt_name);
  1458         -          sql = sqlite3_mprintf("DROP TABLE IF EXISTS main.\"%s\"", xvirt_name);
  1459         -          free(xvirt_name);
  1460         -          ret = sqlite3_exec(SqliteHandle, sql, NULL, 0, &errMsg);
  1461         -          sqlite3_free(sql);
  1462         -          if (ret != SQLITE_OK)
  1463         -            {
  1464         -              wxMessageBox(wxT("PostgreSQL wrapper: ") +
  1465         -                           wxString::FromUTF8(errMsg),
  1466         -                           wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
  1467         -              sqlite3_free(errMsg);
  1468         -            }
  1469         -          pT = pT->GetNext();
  1470         -        }
  1471         -      MyPostgresView *pV = pS->GetFirstView();
  1472         -      while (pV != NULL)
  1473         -        {
  1474         -          // dropping some VirtualPG View
  1475         -          virt_name = (char *) malloc((pV->GetVirtName().Len() * 4) + 1);
  1476         -          strcpy(virt_name, pV->GetVirtName().ToUTF8());
  1477         -          xvirt_name = gaiaDoubleQuotedSql(virt_name);
  1478         -          free(virt_name);
  1479         -          sql = sqlite3_mprintf("DROP TABLE IF EXISTS main.\"%s\"", xvirt_name);
  1480         -          free(xvirt_name);
  1481         -          ret = sqlite3_exec(SqliteHandle, sql, NULL, 0, &errMsg);
  1482         -          sqlite3_free(sql);
  1483         -          if (ret != SQLITE_OK)
  1484         -            {
  1485         -              wxMessageBox(wxT("PostgreSQL wrapper: ") +
  1486         -                           wxString::FromUTF8(errMsg),
  1487         -                           wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
  1488         -              sqlite3_free(errMsg);
  1489         -            }
  1490         -          pV = pV->GetNext();
  1491         -        }
  1492         -      pS = pS->GetNext();
  1493         -    }
  1494         -// removing the connection from the list
  1495         -  PostgresList.Remove(conn);
  1496         -  return true;
  1497         -}
  1498         -
  1499         -bool MyFrame::DoCheckPostGisGeometry(wxString & virtName, wxString & columnName)
  1500         -{
  1501         -//
  1502         -// checking for a PostGIS Geometry column (wrapping View)
  1503         -//
  1504         -  MyPostgresConn *pC = PostgresList.GetFirst();
  1505         -  while (pC != NULL)
  1506         -    {
  1507         -      MyPostgresSchema *pS = pC->GetFirst();
  1508         -      while (pS != NULL)
  1509         -        {
  1510         -          MyPostgresTable *pT = pS->GetFirstTable();
  1511         -          while (pT != NULL)
  1512         -            {
  1513         -              if (pT->GetPostGisName().Cmp(virtName) == 0)
  1514         -                {
  1515         -                  MyPostGisGeometry *pG = pT->GetFirst();
  1516         -                  while (pG != NULL)
  1517         -                    {
  1518         -                      if (pG->GetName().Cmp(columnName) == 0)
  1519         -                        return true;
  1520         -                      pG = pG->GetNext();
  1521         -                    }
  1522         -                }
  1523         -              pT = pT->GetNext();
  1524         -            }
  1525         -          pS = pS->GetNext();
  1526         -        }
  1527         -      pC = pC->GetNext();
  1528         -    }
  1529         -  return false;
  1530         -}
  1531         -
  1532         -void MyFrame::InitPostgresPkColumns(MyPostgresConn * conn,
  1533         -                                    MyPostgresSchema * schema,
  1534         -                                    MyPostgresTable * table)
  1535         -{
  1536         -//
  1537         -// attempting to initialize the PK columns for a PostgreSQL Table
  1538         -//  
  1539         -  PGconn *pg_conn;
  1540         -  PGresult *res;
  1541         -  int nRows;
  1542         -  int nFields;
  1543         -  const char *obj;
  1544         -  const char *schema_name;
  1545         -  const char *table_name;
  1546         -  const char *geometry;
  1547         -  const char *type;
  1548         -  int r;
  1549         -  char *connection_string;
  1550         -
  1551         -  if (table->IsPkAlreadyChecked() == true)
  1552         -    return;                     // already initialized  
  1553         -
  1554         -// attempting to establish a connection to Postgres
  1555         -  connection_string =
  1556         -    (char *) malloc((conn->GetConnectionString().Len() * 4) + 1);
  1557         -  strcpy(connection_string, conn->GetConnectionString().ToUTF8());
  1558         -
  1559         -  pg_conn = vpgPQconnectdb(connection_string);
  1560         -  if (vpgPQstatus(pg_conn) != CONNECTION_OK)
  1561         -    {
  1562         -      char *msg = sqlite3_mprintf("Connection to Postgres failed: %s",
  1563         -                                  vpgPQerrorMessage(pg_conn));
  1564         -      wxMessageBox(wxString::FromUTF8(msg),
  1565         -                   wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
  1566         -      sqlite3_free(msg);
  1567         -      vpgPQfinish(pg_conn);
  1568         -      free(connection_string);
  1569         -      return;
  1570         -    }
  1571         -  free(connection_string);
  1572         -
  1573         -// querying the PK columns
  1574         -  char *pg_schema = (char *) malloc(schema->GetName().Len() * 4 + 1);
  1575         -  strcpy(pg_schema, schema->GetName().ToUTF8());
  1576         -  char *pg_table = (char *) malloc(table->GetName().Len() * 4 + 1);
  1577         -  strcpy(pg_table, table->GetName().ToUTF8());
  1578         -  char *sql =
  1579         -    sqlite3_mprintf
  1580         -    ("SELECT a.attname FROM pg_index AS i "
  1581         -     "JOIN pg_attribute AS a ON (a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)) "
  1582         -     "WHERE i.indrelid = '%s.%s'::regclass AND i.indisprimary", pg_schema,
  1583         -     pg_table);
  1584         -  free(pg_schema);
  1585         -  free(pg_table);
  1586         -  res = vpgPQexec(pg_conn, sql);
  1587         -  sqlite3_free(sql);
  1588         -  if (vpgPQresultStatus(res) != PGRES_TUPLES_OK)
  1589         -    goto err;
  1590         -  nRows = vpgPQntuples(res);
  1591         -  nFields = vpgPQnfields(res);
  1592         -  if (nRows > 0 && nFields == 1)
  1593         -    {
  1594         -      for (r = 0; r < nRows; r++)
  1595         -        {
  1596         -          const char *col_name = vpgPQgetvalue(res, r, 0);
  1597         -          wxString column = wxString::FromUTF8(col_name);
  1598         -          table->AddPK(column);
  1599         -        }
  1600         -    }
  1601         -  vpgPQclear(res);
  1602         -  vpgPQfinish(pg_conn);
  1603         -  table->SetPkChecked();
  1604         -  return;
  1605         -
  1606         -err:
  1607         -// something has gone the wrong way
  1608         -  if (res != NULL)
  1609         -    vpgPQclear(res);
  1610         -  vpgPQfinish(pg_conn);
  1611         -}
  1612         -
  1613         -void MyFrame::InitPostgresPks(void *conn,
  1614         -                              MyPostgresSchema * schema,
  1615         -                              MyPostgresTable * table)
  1616         -{
  1617         -//
  1618         -// attempting to initialize the PK columns for a PostgreSQL Table
  1619         -//  
  1620         -  PGconn *pg_conn = (PGconn *) conn;
  1621         -  PGresult *res;
  1622         -  int nRows;
  1623         -  int nFields;
  1624         -  const char *obj;
  1625         -  const char *schema_name;
  1626         -  const char *table_name;
  1627         -  const char *geometry;
  1628         -  const char *type;
  1629         -  int r;
  1630         -  char *connection_string;
  1631         -
  1632         -  if (table->IsPkAlreadyChecked() == true)
  1633         -    return;                     // already initialized
  1634         -
  1635         -// querying the PK columns
  1636         -  char *pg_schema = (char *) malloc(schema->GetName().Len() * 4 + 1);
  1637         -  strcpy(pg_schema, schema->GetName().ToUTF8());
  1638         -  char *pg_table = (char *) malloc(table->GetName().Len() * 4 + 1);
  1639         -  strcpy(pg_table, table->GetName().ToUTF8());
  1640         -  char *sql =
  1641         -    sqlite3_mprintf
  1642         -    ("SELECT a.attname FROM pg_index AS i "
  1643         -     "JOIN pg_attribute AS a ON (a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)) "
  1644         -     "WHERE i.indrelid = '%s.%s'::regclass AND i.indisprimary", pg_schema,
  1645         -     pg_table);
  1646         -  free(pg_schema);
  1647         -  free(pg_table);
  1648         -  res = vpgPQexec(pg_conn, sql);
  1649         -  sqlite3_free(sql);
  1650         -  if (vpgPQresultStatus(res) != PGRES_TUPLES_OK)
  1651         -    return;
  1652         -  nRows = vpgPQntuples(res);
  1653         -  nFields = vpgPQnfields(res);
  1654         -  if (nRows > 0 && nFields == 1)
  1655         -    {
  1656         -      for (r = 0; r < nRows; r++)
  1657         -        {
  1658         -          const char *col_name = vpgPQgetvalue(res, r, 0);
  1659         -          wxString column = wxString::FromUTF8(col_name);
  1660         -          table->AddPK(column);
  1661         -        }
  1662         -    }
  1663         -  vpgPQclear(res);
  1664         -  table->SetPkChecked();
  1665         -}
  1666         -
  1667         -char *MyFrame::DropPostgreSqlOrphans()
  1668         -{
  1669         -//
  1670         -// attempting to Drop all PostgreSql Orphans
  1671         -//
  1672         -  int ret;
  1673         -  int i;
  1674         -  char **results;
  1675         -  int rows;
  1676         -  int columns;
  1677         -  char *errMsg = NULL;
  1678         -  int first = 1;
  1679         -  char *sql_statement = NULL;
  1680         -  char *prev;
  1681         -  bool ok = false;
  1682         -
  1683         -// fetching all candidate Tables
  1684         -  const char *sql = "SELECT name FROM sqlite_master "
  1685         -    "WHERE type = 'table' AND name LIKE 'vpg_%' AND sql LIKE '%Using VirtualPostgres%'";
  1686         -  ret =
  1687         -    sqlite3_get_table(SqliteHandle, sql, &results, &rows, &columns, &errMsg);
  1688         -  if (ret != SQLITE_OK)
  1689         -    goto error;
  1690         -  if (rows < 1)
  1691         -    ;
  1692         -  else
  1693         -    {
  1694         -      for (i = 1; i <= rows; i++)
  1695         -        {
  1696         -          const char *name = results[(i * columns) + 0];
  1697         -          wxString xName = wxString::FromUTF8(name);
  1698         -          if (PostgresList.FindTable(NULL, xName) == NULL)
  1699         -            {
  1700         -              // found an Orphan Table - to be dropped
  1701         -              char *x_name = gaiaDoubleQuotedSql(name);
  1702         -              if (first)
  1703         -                {
  1704         -                  first = 0;
  1705         -                  sql_statement =
  1706         -                    sqlite3_mprintf("BEGIN;\n;DROP TABLE MAIN.\"%s\";\n",
  1707         -                                    x_name);
  1708         -              } else
  1709         -                {
  1710         -                  prev = sql_statement;
  1711         -                  sql_statement =
  1712         -                    sqlite3_mprintf("%sDROP TABLE MAIN.\"%s\";\n", prev,
  1713         -                                    x_name);
  1714         -                  sqlite3_free(prev);
  1715         -                }
  1716         -              free(x_name);
  1717         -              ok = true;
  1718         -            }
  1719         -        }
  1720         -    }
  1721         -  sqlite3_free_table(results);
  1722         -
  1723         -
  1724         -// fetching all candidate Views
  1725         -  sql = "SELECT name FROM sqlite_master "
  1726         -    "WHERE type = 'view' AND name LIKE 'vpg_%' AND sql LIKE '%GeomFromEWKB%'";
  1727         -  ret =
  1728         -    sqlite3_get_table(SqliteHandle, sql, &results, &rows, &columns, &errMsg);
  1729         -  if (ret != SQLITE_OK)
  1730         -    goto error;
  1731         -  if (rows < 1)
  1732         -    ;
  1733         -  else
  1734         -    {
  1735         -      for (i = 1; i <= rows; i++)
  1736         -        {
  1737         -          const char *name = results[(i * columns) + 0];
  1738         -          wxString xName = wxString::FromUTF8(name);
  1739         -          if (PostgresList.FindPostGisView(NULL, xName) == NULL)
  1740         -            {
  1741         -              // found an Orphan View - to be dropped
  1742         -              char *x_name = gaiaDoubleQuotedSql(name);
  1743         -              if (first)
  1744         -                {
  1745         -                  first = 0;
  1746         -                  sql_statement =
  1747         -                    sqlite3_mprintf("BEGIN;\n;DROP VIEW MAIN.\"%s\";\n",
  1748         -                                    x_name);
  1749         -              } else
  1750         -                {
  1751         -                  prev = sql_statement;
  1752         -                  sql_statement =
  1753         -                    sqlite3_mprintf("%sDROP VIEW MAIN.\"%s\";\n", prev, x_name);
  1754         -                  sqlite3_free(prev);
  1755         -                }
  1756         -              free(x_name);
  1757         -              ok = true;
  1758         -            }
  1759         -        }
  1760         -    }
  1761         -  sqlite3_free_table(results);
  1762         -  if (ok == false)
  1763         -    return NULL;
  1764         -// committing the transaction
  1765         -  prev = sql_statement;
  1766         -  sql_statement = sqlite3_mprintf("%sCOMMIT;\n", prev);
  1767         -  sqlite3_free(prev);
  1768         -  return sql_statement;
  1769         -
  1770         -error:
  1771         -  wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg),
  1772         -               wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
  1773         -  sqlite3_free(errMsg);
  1774         -  return NULL;
  1775         -}
  1776         -
  1777         -bool PostgresConnectionDialog::Create(MyFrame * parent)
  1778         -{
  1779         -//
  1780         -// creating the dialog
  1781         -//
  1782         -  MainFrame = parent;
  1783         -  if (wxDialog::Create(parent, wxID_ANY, wxT("Connecting to PostgreSQL")) ==
  1784         -      false)
  1785         -    return false;
  1786         -// populates individual controls
  1787         -  CreateControls();
  1788         -// sets dialog sizer
  1789         -  GetSizer()->Fit(this);
  1790         -  GetSizer()->SetSizeHints(this);
  1791         -// centers the dialog window
  1792         -  Centre();
  1793         -  return true;
  1794         -}
  1795         -
  1796         -void PostgresConnectionDialog::CreateControls()
  1797         -{
  1798         -//
  1799         -// creating individual control and setting initial values
  1800         -//
  1801         -  wxString user = wxGetUserId();
  1802         -  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
  1803         -  this->SetSizer(topSizer);
  1804         -  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
  1805         -  topSizer->Add(boxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  1806         -// first row: HOST
  1807         -  wxBoxSizer *hostSizer = new wxBoxSizer(wxHORIZONTAL);
  1808         -  boxSizer->Add(hostSizer, 0, wxALIGN_RIGHT | wxALL, 5);
  1809         -  wxStaticText *hostLabel =
  1810         -    new wxStaticText(this, wxID_STATIC, wxT("Host Name"));
  1811         -  hostSizer->Add(hostLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1812         -  wxTextCtrl *hostCtrl = new wxTextCtrl(this, ID_POSTGRES_HOST,
  1813         -                                        wxT("localhost"), wxDefaultPosition,
  1814         -                                        wxSize(250, 22));
  1815         -  hostSizer->Add(hostCtrl, 0, wxALIGN_RIGHT | wxALL, 0);
  1816         -// second row: HOSTADDR
  1817         -  wxBoxSizer *addrSizer = new wxBoxSizer(wxHORIZONTAL);
  1818         -  boxSizer->Add(addrSizer, 0, wxALIGN_RIGHT | wxALL, 5);
  1819         -  wxStaticText *addrLabel =
  1820         -    new wxStaticText(this, wxID_STATIC, wxT("Host Address"));
  1821         -  addrSizer->Add(addrLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1822         -  wxTextCtrl *addrCtrl = new wxTextCtrl(this, ID_POSTGRES_HOSTADDR,
  1823         -                                        wxT("127.0.0.1"), wxDefaultPosition,
  1824         -                                        wxSize(250, 22));
  1825         -  addrSizer->Add(addrCtrl, 0, wxALIGN_RIGHT | wxALL, 0);
  1826         -// third row: PORT
  1827         -  wxBoxSizer *portSizer = new wxBoxSizer(wxHORIZONTAL);
  1828         -  boxSizer->Add(portSizer, 0, wxALIGN_RIGHT | wxALL, 5);
  1829         -  wxStaticText *portLabel = new wxStaticText(this, wxID_STATIC, wxT("Port:"));
  1830         -  portSizer->Add(portLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1831         -  wxSpinCtrl *portCtrl = new wxSpinCtrl(this, ID_POSTGRES_PORT, wxT("5432"),
  1832         -                                        wxDefaultPosition, wxSize(80, 20),
  1833         -                                        wxSP_ARROW_KEYS,
  1834         -                                        0, 65535, 5432);
  1835         -  portSizer->Add(portCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1836         -// fourth row: DBNAME
  1837         -  wxBoxSizer *dbSizer = new wxBoxSizer(wxHORIZONTAL);
  1838         -  boxSizer->Add(dbSizer, 0, wxALIGN_RIGHT | wxALL, 5);
  1839         -  wxStaticText *dbLabel = new wxStaticText(this, wxID_STATIC, wxT("DB Name"));
  1840         -  dbSizer->Add(dbLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1841         -  wxTextCtrl *dbCtrl = new wxTextCtrl(this, ID_POSTGRES_DBNAME,
  1842         -                                      user, wxDefaultPosition,
  1843         -                                      wxSize(250, 22));
  1844         -  dbSizer->Add(dbCtrl, 0, wxALIGN_RIGHT | wxALL, 0);
  1845         -// fifth row: USER
  1846         -  wxBoxSizer *userSizer = new wxBoxSizer(wxHORIZONTAL);
  1847         -  boxSizer->Add(userSizer, 0, wxALIGN_RIGHT | wxALL, 5);
  1848         -  wxStaticText *userLabel = new wxStaticText(this, wxID_STATIC, wxT("User"));
  1849         -  userSizer->Add(userLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1850         -  wxTextCtrl *userCtrl = new wxTextCtrl(this, ID_POSTGRES_USER,
  1851         -                                        user, wxDefaultPosition,
  1852         -                                        wxSize(250, 22));
  1853         -  userSizer->Add(userCtrl, 0, wxALIGN_RIGHT | wxALL, 0);
  1854         -// sixth row: PASSWORD
  1855         -  wxBoxSizer *pwdSizer = new wxBoxSizer(wxHORIZONTAL);
  1856         -  boxSizer->Add(pwdSizer, 0, wxALIGN_RIGHT | wxALL, 5);
  1857         -  wxStaticText *pwdLabel = new wxStaticText(this, wxID_STATIC, wxT("Password"));
  1858         -  pwdSizer->Add(pwdLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1859         -  wxTextCtrl *pwdCtrl = new wxTextCtrl(this, ID_POSTGRES_PASSWORD,
  1860         -                                       wxT(""), wxDefaultPosition,
  1861         -                                       wxSize(250, 22), wxTE_PASSWORD);
  1862         -  pwdSizer->Add(pwdCtrl, 0, wxALIGN_RIGHT | wxALL, 0);
  1863         -// seventh row: Options
  1864         -  wxBoxSizer *optSizer = new wxBoxSizer(wxHORIZONTAL);
  1865         -  boxSizer->Add(optSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1866         -  wxString rdonly[2];
  1867         -  rdonly[0] = wxT("Read Only");
  1868         -  rdonly[1] = wxT("Read && Write");
  1869         -  wxRadioBox *rdonly_sel = new wxRadioBox(this, ID_POSTGRES_RDONLY,
  1870         -                                          wxT("Connection Mode"),
  1871         -                                          wxDefaultPosition,
  1872         -                                          wxDefaultSize, 2,
  1873         -                                          rdonly, 2,
  1874         -                                          wxRA_SPECIFY_ROWS);
  1875         -  rdonly_sel->SetSelection(0);
  1876         -  optSizer->Add(rdonly_sel, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  1877         -
  1878         -
  1879         -  wxString textdates[2];
  1880         -  textdates[0] = wxT("as Julian Day numbers");
  1881         -  textdates[1] = wxT("as PlainText strings");
  1882         -  wxRadioBox *textdates_sel = new wxRadioBox(this, ID_POSTGRES_TEXTDATES,
  1883         -                                             wxT("&DATE/TIME values"),
  1884         -                                             wxDefaultPosition,
  1885         -                                             wxDefaultSize, 2,
  1886         -                                             textdates, 2,
  1887         -                                             wxRA_SPECIFY_ROWS);
  1888         -  textdates_sel->SetSelection(1);
  1889         -  optSizer->Add(textdates_sel, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  1890         -// OK - CANCEL buttons
  1891         -  wxBoxSizer *okCancelBox = new wxBoxSizer(wxHORIZONTAL);
  1892         -  boxSizer->Add(okCancelBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1893         -  wxButton *ok = new wxButton(this, wxID_OK, wxT("&Connect"));
  1894         -  okCancelBox->Add(ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1895         -  wxButton *cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel"));
  1896         -  okCancelBox->Add(cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1897         -// appends event handler for OK button
  1898         -  Connect(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED,
  1899         -          (wxObjectEventFunction) & PostgresConnectionDialog::OnOk);
  1900         -}
  1901         -
  1902         -void PostgresConnectionDialog::OnOk(wxCommandEvent & WXUNUSED(event))
  1903         -{
  1904         -//
  1905         -// all done: 
  1906         -//
  1907         -  wxTextCtrl *hostCtrl = (wxTextCtrl *) FindWindow(ID_POSTGRES_HOST);
  1908         -  wxTextCtrl *addrCtrl = (wxTextCtrl *) FindWindow(ID_POSTGRES_HOSTADDR);
  1909         -  wxSpinCtrl *portCtrl = (wxSpinCtrl *) FindWindow(ID_POSTGRES_PORT);
  1910         -  wxTextCtrl *dbCtrl = (wxTextCtrl *) FindWindow(ID_POSTGRES_DBNAME);
  1911         -  wxTextCtrl *userCtrl = (wxTextCtrl *) FindWindow(ID_POSTGRES_USER);
  1912         -  wxTextCtrl *pwdCtrl = (wxTextCtrl *) FindWindow(ID_POSTGRES_PASSWORD);
  1913         -  wxRadioBox *rdonly_sel = (wxRadioBox *) FindWindow(ID_POSTGRES_RDONLY);
  1914         -  wxRadioBox *textdates_sel = (wxRadioBox *) FindWindow(ID_POSTGRES_TEXTDATES);
  1915         -  wxString value = hostCtrl->GetValue();
  1916         -  if (host != NULL)
  1917         -    free(host);
  1918         -  if (value.Len() == 0)
  1919         -    host = NULL;
  1920         -  else
  1921         -    {
  1922         -      host = (char *) malloc(value.Len() * 4 + 1);
  1923         -      strcpy(host, value.ToUTF8());
  1924         -    }
  1925         -  value = addrCtrl->GetValue();
  1926         -  if (hostaddr != NULL)
  1927         -    free(hostaddr);
  1928         -  if (value.Len() == 0)
  1929         -    hostaddr = NULL;
  1930         -  else
  1931         -    {
  1932         -      hostaddr = (char *) malloc(value.Len() * 4 + 1);
  1933         -      strcpy(hostaddr, value.ToUTF8());
  1934         -    }
  1935         -  port = portCtrl->GetValue();
  1936         -  value = dbCtrl->GetValue();
  1937         -  if (dbname != NULL)
  1938         -    free(dbname);
  1939         -  if (value.Len() == 0)
  1940         -    dbname = NULL;
  1941         -  else
  1942         -    {
  1943         -      dbname = (char *) malloc(value.Len() * 4 + 1);
  1944         -      strcpy(dbname, value.ToUTF8());
  1945         -    }
  1946         -  value = userCtrl->GetValue();
  1947         -  if (user != NULL)
  1948         -    free(user);
  1949         -  if (value.Len() == 0)
  1950         -    user = NULL;
  1951         -  else
  1952         -    {
  1953         -      user = (char *) malloc(value.Len() * 4 + 1);
  1954         -      strcpy(user, value.ToUTF8());
  1955         -    }
  1956         -  value = pwdCtrl->GetValue();
  1957         -  if (password != NULL)
  1958         -    free(password);
  1959         -  if (value.Len() == 0)
  1960         -    password = NULL;
  1961         -  else
  1962         -    {
  1963         -      password = (char *) malloc(value.Len() * 4 + 1);
  1964         -      strcpy(password, value.ToUTF8());
  1965         -    }
  1966         -  if (rdonly_sel->GetSelection() == 0)
  1967         -    ReadOnly = true;
  1968         -  else
  1969         -    ReadOnly = false;
  1970         -  if (textdates_sel->GetSelection() == 0)
  1971         -    TextDates = false;
  1972         -  else
  1973         -    TextDates = true;
  1974         -  wxDialog::EndModal(wxID_OK);
  1975         -}
  1976         -
  1977         -MyPostGisGeometry::MyPostGisGeometry(wxString & name, wxString & type, int srid,
  1978         -                                     int dims)
  1979         -{
  1980         -// ctor
  1981         -  Name = name;
  1982         -  GeomType = type;
  1983         -  MultiType = false;
  1984         -  Srid = srid;
  1985         -  Dims = dims;
  1986         -  if (type.Len() == 0)
  1987         -    return;
  1988         -  if (type.Cmp(wxT("MULTIPOINT")) == 0)
  1989         -    MultiType = true;
  1990         -  if (type.Cmp(wxT("MULTILINESTRING")) == 0)
  1991         -    MultiType = true;
  1992         -  if (type.Cmp(wxT("MULTIPOLYGON")) == 0)
  1993         -    MultiType = true;
  1994         -  Next = NULL;
  1995         -}
  1996         -
  1997         -MyPostgresTable::MyPostgresTable(wxString & name)
  1998         -{
  1999         -// ctor
  2000         -  Name = name;
  2001         -  PkChecked = false;
  2002         -  GrantSelect = false;
  2003         -  GrantInsertUpdateDelete = false;
  2004         -  FirstPK = NULL;
  2005         -  LastPK = NULL;
  2006         -  First = NULL;
  2007         -  Last = NULL;
  2008         -  Next = NULL;
  2009         -}
  2010         -
  2011         -MyPostgresTable::~MyPostgresTable()
  2012         -{
  2013         -// dtor
  2014         -  MyPostGisGeometry *pG;
  2015         -  MyPostGisGeometry *pGn;
  2016         -  MyPostgresPK *pK;
  2017         -  MyPostgresPK *pKn;
  2018         -  pG = First;
  2019         -  while (pG != NULL)
  2020         -    {
  2021         -      pGn = pG->GetNext();
  2022         -      delete pG;
  2023         -      pG = pGn;
  2024         -    }
  2025         -  pK = FirstPK;
  2026         -  while (pK != NULL)
  2027         -    {
  2028         -      pKn = pK->GetNext();
  2029         -      delete pK;
  2030         -      pK = pKn;
  2031         -    }
  2032         -}
  2033         -
  2034         -void MyPostgresTable::AddPK(wxString & name)
  2035         -{
  2036         -// adding a PostgreSQL PK column
  2037         -  MyPostgresPK *pK = FirstPK;
  2038         -  while (pK != NULL)
  2039         -    {
  2040         -      if (pK->GetName().Cmp(name) == 0)
  2041         -        return;                 // already defined
  2042         -      pK = pK->GetNext();
  2043         -    }
  2044         -
  2045         -// inserting a new PostgreSQL PK column
  2046         -  pK = new MyPostgresPK(name);
  2047         -  if (FirstPK == NULL)
  2048         -    FirstPK = pK;
  2049         -  if (LastPK != NULL)
  2050         -    LastPK->SetNext(pK);
  2051         -  LastPK = pK;
  2052         -}
  2053         -
  2054         -void MyPostgresTable::Add(wxString & geometry, wxString & type, int srid,
  2055         -                          int dims)
  2056         -{
  2057         -//
  2058         -// adding a PostGIS geometry to a Table
  2059         -//
  2060         -  bool is_multi = false;
  2061         -  if (type.Len() == 0)
  2062         -    return;
  2063         -  if (type.Cmp(wxT("MULTIPOINT")) == 0)
  2064         -    is_multi = true;
  2065         -  if (type.Cmp(wxT("MULTILINESTRING")) == 0)
  2066         -    is_multi = true;
  2067         -  if (type.Cmp(wxT("MULTIPOLYGON")) == 0)
  2068         -    is_multi = true;
  2069         -
  2070         -  if (geometry.Len() == 0)
  2071         -    return;
  2072         -
  2073         -  MyPostGisGeometry *pG = First;
  2074         -  while (pG != NULL)
  2075         -    {
  2076         -      if (pG->GetName().Cmp(geometry) == 0)
  2077         -        return;                 // already defined
  2078         -      pG = pG->GetNext();
  2079         -    }
  2080         -
  2081         -// inserting a new PostGIS geometry
  2082         -  pG = new MyPostGisGeometry(geometry, type, srid, dims);
  2083         -  if (First == NULL)
  2084         -    First = pG;
  2085         -  if (Last != NULL)
  2086         -    Last->SetNext(pG);
  2087         -  Last = pG;
  2088         -}
  2089         -
  2090         -bool MyPostgresTable::IsPkColumn(wxString & name)
  2091         -{
  2092         -// checks if a PostgreSQL Column is a PK column
  2093         -  MyPostgresPK *pK = FirstPK;
  2094         -  while (pK != NULL)
  2095         -    {
  2096         -      if (pK->GetName().Cmp(name) == 0)
  2097         -        return true;
  2098         -      pK = pK->GetNext();
  2099         -    }
  2100         -  return false;
  2101         -}
  2102         -
  2103         -bool MyPostgresTable::HasPK()
  2104         -{
  2105         -// checks if a PostgreSQL Table has any PK column
  2106         -  if (FirstPK == NULL)
  2107         -    return false;
  2108         -  return true;
  2109         -}
  2110         -
  2111         -MyPostGisGeometry *MyPostgresTable::Find(wxString & name)
  2112         -{
  2113         -// attempting to find a Geometry Column
  2114         -  MyPostGisGeometry *pG = First;
  2115         -  while (pG != NULL)
  2116         -    {
  2117         -      if (pG->GetName().Cmp(name) == 0)
  2118         -        return pG;
  2119         -      pG = pG->GetNext();
  2120         -    }
  2121         -  return NULL;
  2122         -}
  2123         -
  2124         -MyPostgresView::MyPostgresView(wxString & name)
  2125         -{
  2126         -// ctor
  2127         -  Name = name;
  2128         -  GrantSelect = false;
  2129         -  GrantInsertUpdateDelete = false;
  2130         -  Next = NULL;
  2131         -}
  2132         -
  2133         -MyPostgresSchema::MyPostgresSchema(wxString & name)
  2134         -{
  2135         -// ctor
  2136         -  Name = name;
  2137         -  FirstTable = NULL;
  2138         -  LastTable = NULL;
  2139         -  CurrentTable = NULL;
  2140         -  FirstView = NULL;
  2141         -  LastView = NULL;
  2142         -  Next = NULL;
  2143         -}
  2144         -
  2145         -MyPostgresSchema::~MyPostgresSchema()
  2146         -{
  2147         -// dtor
  2148         -  MyPostgresTable *pT;
  2149         -  MyPostgresTable *pTn;
  2150         -  MyPostgresView *pV;
  2151         -  MyPostgresView *pVn;
  2152         -  pT = FirstTable;
  2153         -  while (pT != NULL)
  2154         -    {
  2155         -      pTn = pT->GetNext();
  2156         -      delete pT;
  2157         -      pT = pTn;
  2158         -    }
  2159         -  pV = FirstView;
  2160         -  while (pV != NULL)
  2161         -    {
  2162         -      pVn = pV->GetNext();
  2163         -      delete pV;
  2164         -      pV = pVn;
  2165         -    }
  2166         -}
  2167         -
  2168         -void MyPostgresSchema::Add(wxString & name, wxString & geometry,
  2169         -                           wxString & type, int srid, int dims)
  2170         -{
  2171         -//
  2172         -// adding a Table to a Schema
  2173         -//
  2174         -  MyPostgresTable *pT = CurrentTable;
  2175         -  if (pT != NULL)
  2176         -    {
  2177         -      if (pT->GetName().Cmp(name) == 0)
  2178         -        {
  2179         -          // continuing with the current table
  2180         -          if (geometry.Len() > 0 && type.Len() > 0)
  2181         -            pT->Add(geometry, type, srid, dims);
  2182         -          return;
  2183         -        }
  2184         -    }
  2185         -
  2186         -  pT = FirstTable;
  2187         -  while (pT != NULL)
  2188         -    {
  2189         -      if (pT->GetName().Cmp(name) == 0)
  2190         -        {
  2191         -          // already defined
  2192         -          if (geometry.Len() > 0 && type.Len() > 0)
  2193         -            pT->Add(geometry, type, srid, dims);
  2194         -          return;
  2195         -        }
  2196         -      pT = pT->GetNext();
  2197         -    }
  2198         -
  2199         -// adding a new Table
  2200         -  pT = new MyPostgresTable(name);
  2201         -  if (geometry.Len() > 0 && type.Len() > 0)
  2202         -    pT->Add(geometry, type, srid, dims);
  2203         -  if (FirstTable == NULL)
  2204         -    FirstTable = pT;
  2205         -  if (LastTable != NULL)
  2206         -    LastTable->SetNext(pT);
  2207         -  LastTable = pT;
  2208         -  CurrentTable = pT;
  2209         -}
  2210         -
  2211         -void MyPostgresSchema::Add(wxString & name)
  2212         -{
  2213         -//
  2214         -// adding a View to a Schema
  2215         -//
  2216         -  MyPostgresView *pV = FirstView;
  2217         -  while (pV != NULL)
  2218         -    {
  2219         -      if (pV->GetName().Cmp(name) == 0)
  2220         -        return;                 // already defined
  2221         -      pV = pV->GetNext();
  2222         -    }
  2223         -
  2224         -// adding a new View
  2225         -  pV = new MyPostgresView(name);
  2226         -  if (FirstView == NULL)
  2227         -    FirstView = pV;
  2228         -  if (LastView != NULL)
  2229         -    LastView->SetNext(pV);
  2230         -  LastView = pV;
  2231         -}
  2232         -
  2233         -MyPostgresConn::MyPostgresConn(wxString & host, wxString & hostaddr, int port,
  2234         -                               wxString & dbname, wxString & user,
  2235         -                               bool readOnly, bool textDates)
  2236         -{
  2237         -// ctor
  2238         -  Host = host;
  2239         -  HostAddr = hostaddr;
  2240         -  Port = port;
  2241         -  DbName = dbname;
  2242         -  User = user;
  2243         -  ReadOnly = readOnly;
  2244         -  TextDates = textDates;
  2245         -  First = NULL;
  2246         -  Last = NULL;
  2247         -  Current = NULL;
  2248         -  Prev = NULL;
  2249         -  Next = NULL;
  2250         -}
  2251         -
  2252         -MyPostgresConn::~MyPostgresConn()
  2253         -{
  2254         -// dtor
  2255         -  MyPostgresSchema *pS;
  2256         -  MyPostgresSchema *pSn;
  2257         -  pS = First;
  2258         -  while (pS != NULL)
  2259         -    {
  2260         -      pSn = pS->GetNext();
  2261         -      delete pS;
  2262         -      pS = pSn;
  2263         -    }
  2264         -}
  2265         -
  2266         -void MyPostgresConn::Add(wxString & schema, wxString & table,
  2267         -                         wxString & geometry, wxString & type, int srid,
  2268         -                         int dims)
  2269         -{
  2270         -//
  2271         -// adding a Table to a PostgreSQL connection
  2272         -//
  2273         -  MyPostgresSchema *pS = Current;
  2274         -  if (pS != NULL)
  2275         -    {
  2276         -      if (pS->GetName().Cmp(schema) == 0)
  2277         -        {
  2278         -          // continuing with the current Schema
  2279         -          pS->Add(table, geometry, type, srid, dims);
  2280         -          return;
  2281         -        }
  2282         -    }
  2283         -
  2284         -  pS = First;
  2285         -  while (pS != NULL)
  2286         -    {
  2287         -      if (pS->GetName().Cmp(schema) == 0)
  2288         -        {
  2289         -          // the Schema is already defined
  2290         -          pS->Add(table, geometry, type, srid, dims);
  2291         -          return;
  2292         -        }
  2293         -      pS = pS->GetNext();
  2294         -    }
  2295         -
  2296         -// adding a new Schema
  2297         -  pS = new MyPostgresSchema(schema);
  2298         -  pS->Add(table, geometry, type, srid, dims);
  2299         -  if (First == NULL)
  2300         -    First = pS;
  2301         -  if (Last != NULL)
  2302         -    Last->SetNext(pS);
  2303         -  Last = pS;
  2304         -  Current = pS;
  2305         -}
  2306         -
  2307         -void MyPostgresConn::Add(wxString & schema, wxString & view)
  2308         -{
  2309         -//
  2310         -// adding a View to a PostgreSQL connection
  2311         -//
  2312         -  MyPostgresSchema *pS = Current;
  2313         -  if (pS != NULL)
  2314         -    {
  2315         -      if (pS->GetName().Cmp(schema) == 0)
  2316         -        {
  2317         -          // continuing with the current Schema
  2318         -          pS->Add(view);
  2319         -          return;
  2320         -        }
  2321         -      pS = pS->GetNext();
  2322         -    }
  2323         -
  2324         -  pS = First;
  2325         -  while (pS != NULL)
  2326         -    {
  2327         -      if (pS->GetName().Cmp(schema) == 0)
  2328         -        {
  2329         -          // the Schema is already defined
  2330         -          pS->Add(view);
  2331         -          return;
  2332         -        }
  2333         -      pS = pS->GetNext();
  2334         -    }
  2335         -
  2336         -// adding a new Schema
  2337         -  pS = new MyPostgresSchema(schema);
  2338         -  pS->Add(view);
  2339         -  if (First == NULL)
  2340         -    First = pS;
  2341         -  if (Last != NULL)
  2342         -    Last->SetNext(pS);
  2343         -  Last = pS;
  2344         -  Current = pS;
  2345         -}
  2346         -
  2347         -void MyPostgres::Clear()
  2348         -{
  2349         -//
  2350         -// memory cleanup - clearing a MyPostgres object
  2351         -//
  2352         -  MyPostgresConn *pC;
  2353         -  MyPostgresConn *pCn;
  2354         -  pC = First;
  2355         -  while (pC != NULL)
  2356         -    {
  2357         -      pCn = pC->GetNext();
  2358         -      delete pC;
  2359         -      pC = pCn;
  2360         -    }
  2361         -  First = NULL;
  2362         -  Last = NULL;
  2363         -  Current = NULL;
  2364         -}
  2365         -
  2366         -MyPostgresConn *MyPostgres::Insert(wxString & host, wxString & hostaddr,
  2367         -                                   int port, wxString & dbname, wxString & user,
  2368         -                                   bool readOnly, bool textDates)
  2369         -{
  2370         -//
  2371         -// inserting into the list a new connection to PostgreSQL
  2372         -// (or returning an already existing one)
  2373         -//
  2374         -  MyPostgresConn *pC = Current;
  2375         -  if (pC != NULL)
  2376         -    {
  2377         -      if (pC->GetHost().Cmp(host) == 0 && pC->GetHostAddr().Cmp(hostaddr) == 0
  2378         -          && pC->GetPort() == port && pC->GetDbName().Cmp(dbname) == 0
  2379         -          && pC->GetUser().Cmp(user) == 0)
  2380         -        return pC;              // continuing with the current connection
  2381         -    }
  2382         -
  2383         -  pC = Find(host, hostaddr, port, dbname, user);
  2384         -  if (pC != NULL)
  2385         -    return pC;                  // already defined
  2386         -
  2387         -// adding a new connection
  2388         -  pC =
  2389         -    new MyPostgresConn(host, hostaddr, port, dbname, user, readOnly, textDates);
  2390         -  if (First == NULL)
  2391         -    First = pC;
  2392         -  pC->SetPrev(Last);
  2393         -  if (Last != NULL)
  2394         -    Last->SetNext(pC);
  2395         -  Last = pC;
  2396         -  Current = pC;
  2397         -  return pC;
  2398         -}
  2399         -
  2400         -MyPostgresConn *MyPostgres::Find(wxString & host, wxString & hostaddr, int port,
  2401         -                                 wxString & dbname, wxString & user)
  2402         -{
  2403         -//
  2404         -// searching for a given connection
  2405         -//
  2406         -  MyPostgresConn *pC = First;
  2407         -  while (pC != NULL)
  2408         -    {
  2409         -      if (pC->GetHost().Cmp(host) == 0 && pC->GetHostAddr().Cmp(hostaddr) == 0
  2410         -          && pC->GetPort() == port && pC->GetDbName().Cmp(dbname) == 0
  2411         -          && pC->GetUser().Cmp(user) == 0)
  2412         -        return pC;
  2413         -      pC = pC->GetNext();
  2414         -    }
  2415         -  return NULL;
  2416         -}
  2417         -
  2418         -void MyPostgres::Remove(MyPostgresConn * conn)
  2419         -{
  2420         -//
  2421         -// removing a connection from the list 
  2422         -//
  2423         -  MyPostgresConn *pC = First;
  2424         -  while (pC != NULL)
  2425         -    {
  2426         -      if (pC == conn)
  2427         -        {
  2428         -          MyPostgresConn *x = pC->GetPrev();
  2429         -          if (x != NULL)
  2430         -            x->SetNext(pC->GetNext());
  2431         -          x = pC->GetNext();
  2432         -          if (x != NULL)
  2433         -            x->SetPrev(pC->GetPrev());
  2434         -          if (pC == First)
  2435         -            First = pC->GetNext();
  2436         -          if (pC == Last)
  2437         -            Last = pC->GetPrev();
  2438         -          if (pC == Current)
  2439         -            Current = Last;
  2440         -          delete pC;
  2441         -          return;
  2442         -        }
  2443         -      pC = pC->GetNext();
  2444         -    }
  2445         -}
  2446         -
  2447         -bool MyPostgres::CheckUniqueVirtName(wxString & virtName)
  2448         -{
  2449         -//
  2450         -// testing for PostgreSQL unique virtual names
  2451         -//
  2452         -  MyPostgresConn *pC = First;
  2453         -  while (pC != NULL)
  2454         -    {
  2455         -      MyPostgresSchema *pS = pC->GetFirst();
  2456         -      while (pS != NULL)
  2457         -        {
  2458         -          MyPostgresTable *pT = pS->GetFirstTable();
  2459         -          while (pT != NULL)
  2460         -            {
  2461         -              if (virtName.Cmp(pT->GetVirtName()) == 0)
  2462         -                return false;
  2463         -              if (virtName.Cmp(pT->GetPostGisName()) == 0)
  2464         -                return false;
  2465         -              pT = pT->GetNext();
  2466         -            }
  2467         -          MyPostgresView *pV = pS->GetFirstView();
  2468         -          while (pV != NULL)
  2469         -            {
  2470         -              if (virtName.Cmp(pV->GetVirtName()) == 0)
  2471         -                return false;
  2472         -              pV = pV->GetNext();
  2473         -            }
  2474         -          pS = pS->GetNext();
  2475         -        }
  2476         -      pC = pC->GetNext();
  2477         -    }
  2478         -  return true;
  2479         -}
  2480         -
  2481         -void MyPostgres::MakeUniqueVirtName(wxString & baseName, wxString & uniqueName)
  2482         -{
  2483         -//
  2484         -// ensuring to create PostgreSQL unique virtual names
  2485         -//
  2486         -  if (CheckUniqueVirtName(baseName) == true)
  2487         -    {
  2488         -      uniqueName = baseName;
  2489         -      return;
  2490         -    }
  2491         -
  2492         -  int alias = 0;
  2493         -  while (1)
  2494         -    {
  2495         -      wxString suffix;
  2496         -      suffix.Printf(wxT("_%d"), alias);
  2497         -      wxString test = baseName + suffix;
  2498         -      if (CheckUniqueVirtName(test) == true)
  2499         -        {
  2500         -          uniqueName = test;
  2501         -          return;
  2502         -        }
  2503         -      alias++;
  2504         -    }
  2505         -}
  2506         -
  2507         -MyPostgresTable *MyPostgres::FindTable(MyFrame * parent, wxString & virtName)
  2508         -{
  2509         -// attempting to retrieve a PostgreSQL Table
  2510         -  MyPostgresConn *pC = First;
  2511         -  while (pC != NULL)
  2512         -    {
  2513         -      MyPostgresSchema *pS = pC->GetFirst();
  2514         -      while (pS != NULL)
  2515         -        {
  2516         -          MyPostgresTable *pT = pS->GetFirstTable();
  2517         -          while (pT != NULL)
  2518         -            {
  2519         -              if (virtName.Cmp(pT->GetVirtName()) == 0)
  2520         -                {
  2521         -                  if (parent != NULL)
  2522         -                    parent->InitPostgresPkColumns(pC, pS, pT);
  2523         -                  return pT;
  2524         -                }
  2525         -              pT = pT->GetNext();
  2526         -            }
  2527         -          pS = pS->GetNext();
  2528         -        }
  2529         -      pC = pC->GetNext();
  2530         -    }
  2531         -  return NULL;
  2532         -}
  2533         -
  2534         -MyPostgresTable *MyPostgres::FindPostGisView(MyFrame * parent,
  2535         -                                             wxString & virtName)
  2536         -{
  2537         -// attempting to retrieve the PostgreSQL Table supporting a PostGIS View (wrapper)
  2538         -  MyPostgresConn *pC = First;
  2539         -  while (pC != NULL)
  2540         -    {
  2541         -      MyPostgresSchema *pS = pC->GetFirst();
  2542         -      while (pS != NULL)
  2543         -        {
  2544         -          MyPostgresTable *pT = pS->GetFirstTable();
  2545         -          while (pT != NULL)
  2546         -            {
  2547         -              if (virtName.Cmp(pT->GetPostGisName()) == 0)
  2548         -                {
  2549         -                  if (parent != NULL)
  2550         -                    parent->InitPostgresPkColumns(pC, pS, pT);
  2551         -                  return pT;
  2552         -                }
  2553         -              pT = pT->GetNext();
  2554         -            }
  2555         -          pS = pS->GetNext();
  2556         -        }
  2557         -      pC = pC->GetNext();
  2558         -    }
  2559         -  return NULL;
  2560         -}
  2561         -
  2562         -MyPostgresColumns::~MyPostgresColumns()
  2563         -{
  2564         -// dtor
  2565         -  MyPostgresCol *pC;
  2566         -  MyPostgresCol *pCn;
  2567         -  pC = First;
  2568         -  while (pC != NULL)
  2569         -    {
  2570         -      pCn = pC->GetNext();
  2571         -      delete pC;
  2572         -      pC = pCn;
  2573         -    }
  2574         -}
  2575         -
  2576         -void MyPostgresColumns::Add(wxString & name)
  2577         -{
  2578         -// adding a Column into the list
  2579         -  MyPostgresCol *col = new MyPostgresCol(name);
  2580         -  if (First == NULL)
  2581         -    First = col;
  2582         -  if (Last != NULL)
  2583         -    Last->SetNext(col);
  2584         -  Last = col;
  2585         -}
  2586         -
  2587         -void MyPostgresColumns::SetPK(wxString & name)
  2588         -{
  2589         -// setting a PK Column
  2590         -  MyPostgresCol *pC;
  2591         -  pC = First;
  2592         -  while (pC != NULL)
  2593         -    {
  2594         -      if (pC->GetName().Cmp(name) == 0)
  2595         -        {
  2596         -          pC->SetPK();
  2597         -          return;
  2598         -        }
  2599         -      pC = pC->GetNext();
  2600         -    }
  2601         -}
  2602         -
  2603         -char *MyPostgresColumns::BuildWhere()
  2604         -{
  2605         -// building a WHERE clause
  2606         -  char *where = NULL;
  2607         -  char *prev;
  2608         -  int first = 1;
  2609         -  char name[1024];
  2610         -  char *xname;
  2611         -  MyPostgresCol *pC = First;
  2612         -  while (pC != NULL)
  2613         -    {
  2614         -      if (pC->IsPK() == false)
  2615         -        {
  2616         -          pC = pC->GetNext();
  2617         -          continue;
  2618         -        }
  2619         -      if (first)
  2620         -        {
  2621         -          first = 0;
  2622         -          strcpy(name, pC->GetName().ToUTF8());
  2623         -          xname = gaiaDoubleQuotedSql(name);
  2624         -          where = sqlite3_mprintf("WHERE \"%s\" = OLD.\"%s\"", xname, xname);
  2625         -          free(xname);
  2626         -      } else
  2627         -        {
  2628         -          prev = where;
  2629         -          strcpy(name, pC->GetName().ToUTF8());
  2630         -          xname = gaiaDoubleQuotedSql(name);
  2631         -          where = sqlite3_mprintf("%s AND \"%s\" = OLD.\"%s\"", xname, xname);
  2632         -          free(xname);
  2633         -          sqlite3_free(prev);
  2634         -        }
  2635         -      pC = pC->GetNext();
  2636         -    }
  2637         -  return where;
  2638         -
  2639         -}

Changes to QueryView.cpp.

     1      1   /*
     2      2   / QueryView.cpp
     3      3   / a panel to set SQL queries
     4      4   /
     5      5   / version 1.7, 2013 May 8
     6      6   /
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
     8      8   /
     9      9   / Copyright (C) 2008-2013  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
    13     13   /    the Free Software Foundation, either version 3 of the License, or
    14     14   /    (at your option) any later version.
................................................................................
   533    533       return true;
   534    534     if (str.CmpNoCase(wxT("hasGeoCallbacks")) == 0)
   535    535       return true;
   536    536     if (str.CmpNoCase(wxT("hasGeos")) == 0)
   537    537       return true;
   538    538     if (str.CmpNoCase(wxT("hasProj")) == 0)
   539    539       return true;
   540         -  if (str.CmpNoCase(wxT("hasProjGeodesic")) == 0)
   541         -    return true;
   542    540     if (str.CmpNoCase(wxT("hasGeosAdvanced")) == 0)
   543    541       return true;
   544    542     if (str.CmpNoCase(wxT("hasGeosTrunk")) == 0)
   545    543       return true;
   546    544     if (str.CmpNoCase(wxT("hasGeosReentrant")) == 0)
   547    545       return true;
   548    546     if (str.CmpNoCase(wxT("hasGeosOnlyReentrant")) == 0)
................................................................................
   559    557       return true;
   560    558     if (str.CmpNoCase(wxT("hasGGP")) == 0)
   561    559       return true;
   562    560     if (str.CmpNoCase(wxT("hasGroundControlPoints")) == 0)
   563    561       return true;
   564    562     if (str.CmpNoCase(wxT("hasTopology")) == 0)
   565    563       return true;
   566         -  if (str.CmpNoCase(wxT("hasKNN")) == 0)
   567         -    return true;
   568         -  if (str.CmpNoCase(wxT("hasRouting")) == 0)
   569         -    return true;
   570    564   
   571    565     if (str.CmpNoCase(wxT("EnableGpkgAmphibiousMode")) == 0)
   572    566       return true;
   573    567     if (str.CmpNoCase(wxT("DisableGpkgAmphibiousMode")) == 0)
   574    568       return true;
   575    569     if (str.CmpNoCase(wxT("GetGpkgAmphibiousMode")) == 0)
   576    570       return true;
   577    571     if (str.CmpNoCase(wxT("EnableGpkgMode")) == 0)
   578    572       return true;
   579    573     if (str.CmpNoCase(wxT("DisableGpkgMode")) == 0)
   580    574       return true;
   581    575     if (str.CmpNoCase(wxT("GetGpkgMode")) == 0)
   582    576       return true;
   583         -  if (str.CmpNoCase(wxT("EnableTinyPoint")) == 0)
   584         -    return true;
   585         -  if (str.CmpNoCase(wxT("DisableTInyPoint")) == 0)
   586         -    return true;
   587         -  if (str.CmpNoCase(wxT("IsTinyPointEnabled")) == 0)
   588         -    return true;
   589    577     if (str.CmpNoCase(wxT("SetDecimalPrecision")) == 0)
   590    578       return true;
   591    579     if (str.CmpNoCase(wxT("GetDecimalPrecision")) == 0)
   592    580       return true;
   593    581     if (str.CmpNoCase(wxT("GetShapefileExtent")) == 0)
   594    582       return true;
   595    583     if (str.CmpNoCase(wxT("IsLowASCII")) == 0)
................................................................................
   650    638       return true;
   651    639     if (str.CmpNoCase(wxT("RecoverFDOGeometryColumn")) == 0)
   652    640       return true;
   653    641     if (str.CmpNoCase(wxT("DiscardFDOGeometryColumn")) == 0)
   654    642       return true;
   655    643     if (str.CmpNoCase(wxT("InitSpatialMetaData")) == 0)
   656    644       return true;
   657         -  if (str.CmpNoCase(wxT("InitSpatialMetaDataFull")) == 0)
   658         -    return true;
   659    645     if (str.CmpNoCase(wxT("AddGeometryColumn")) == 0)
   660    646       return true;
   661    647     if (str.CmpNoCase(wxT("RecoverGeometryColumn")) == 0)
   662    648       return true;
   663    649     if (str.CmpNoCase(wxT("DiscardGeometryColumn")) == 0)
   664    650       return true;
   665    651     if (str.CmpNoCase(wxT("RegisterVirtualGeometry")) == 0)
................................................................................
   682    668       return true;
   683    669     if (str.CmpNoCase(wxT("UpgradeGeometryTriggers")) == 0)
   684    670       return true;
   685    671     if (str.CmpNoCase(wxT("CheckSpatialIndex")) == 0)
   686    672       return true;
   687    673     if (str.CmpNoCase(wxT("RecoverSpatialIndex")) == 0)
   688    674       return true;
   689         -  if (str.CmpNoCase(wxT("GetSpatialIndexExtent")) == 0)
   690         -    return true;
   691    675     if (str.CmpNoCase(wxT("CheckShadowedRowid")) == 0)
   692    676       return true;
   693    677     if (str.CmpNoCase(wxT("CheckWithoutRowid")) == 0)
   694    678       return true;
   695    679     if (str.CmpNoCase(wxT("CreateMetaCatalogTables")) == 0)
   696    680       return true;
   697    681     if (str.CmpNoCase(wxT("UpdateMetaCatalogStatistics")) == 0)
................................................................................
   796    780       return true;
   797    781     if (str.CmpNoCase(wxT("XB_LoadXML")) == 0)
   798    782       return true;
   799    783     if (str.CmpNoCase(wxT("XB_StoreXML")) == 0)
   800    784       return true;
   801    785     if (str.CmpNoCase(wxT("CountUnsafeTriggers")) == 0)
   802    786       return true;
   803         -  if (str.CmpNoCase(wxT("IsInteger")) == 0)
   804         -    return true;
   805         -  if (str.CmpNoCase(wxT("IsDecimalNumber")) == 0)
   806         -    return true;
   807         -  if (str.CmpNoCase(wxT("IsNumber")) == 0)
   808         -    return true;
   809    787     if (str.CmpNoCase(wxT("CastToInteger")) == 0)
   810    788       return true;
   811    789     if (str.CmpNoCase(wxT("CastToDouble")) == 0)
   812    790       return true;
   813    791     if (str.CmpNoCase(wxT("CastToText")) == 0)
   814    792       return true;
   815    793     if (str.CmpNoCase(wxT("CastToBlob")) == 0)
................................................................................
   830    808       return true;
   831    809     if (str.CmpNoCase(wxT("FullFileNameFromPath")) == 0)
   832    810       return true;
   833    811     if (str.CmpNoCase(wxT("FileNameFromPath")) == 0)
   834    812       return true;
   835    813     if (str.CmpNoCase(wxT("FileExtFromPath")) == 0)
   836    814       return true;
   837         -  if (str.CmpNoCase(wxT("MakeStringList")) == 0)
   838         -    return true;
   839    815     if (str.CmpNoCase(wxT("ATM_Create")) == 0)
   840    816       return true;
   841    817     if (str.CmpNoCase(wxT("ATM_CreateTranslate")) == 0)
   842    818       return true;
   843    819     if (str.CmpNoCase(wxT("ATM_CreateScale")) == 0)
   844    820       return true;
   845    821     if (str.CmpNoCase(wxT("ATM_CreateRotate")) == 0)
................................................................................
   892    868       return true;
   893    869     if (str.CmpNoCase(wxT("CreateRasterCoveragesTable")) == 0)
   894    870       return true;
   895    871     if (str.CmpNoCase(wxT("CreateVectorCoveragesTables")) == 0)
   896    872       return true;
   897    873     if (str.CmpNoCase(wxT("CloneTable")) == 0)
   898    874       return true;
   899         -  if (str.CmpNoCase(wxT("CreateClonedTable")) == 0)
   900         -    return true;
   901    875     if (str.CmpNoCase(wxT("CheckDuplicateRows")) == 0)
   902    876       return true;
   903    877     if (str.CmpNoCase(wxT("RemoveDuplicateRows")) == 0)
   904    878       return true;
   905    879     if (str.CmpNoCase(wxT("ElementaryGeometries")) == 0)
   906    880       return true;
   907    881     if (str.CmpNoCase(wxT("DropGeoTable")) == 0)
................................................................................
   923    897     if (str.CmpNoCase(wxT("ImportWFS")) == 0)
   924    898       return true;
   925    899     if (str.CmpNoCase(wxT("ImportDXF")) == 0)
   926    900       return true;
   927    901     if (str.CmpNoCase(wxT("ImportDXFfromDir")) == 0)
   928    902       return true;
   929    903   
   930         -  if (str.CmpNoCase(wxT("SqlProc_GetLastError")) == 0)
   931         -    return true;
   932         -  if (str.CmpNoCase(wxT("SqlProc_SetLogfile")) == 0)
   933         -    return true;
   934         -  if (str.CmpNoCase(wxT("SqlProc_GetLogfile")) == 0)
   935         -    return true;
   936         -  if (str.CmpNoCase(wxT("SqlProc_FromFile")) == 0)
   937         -    return true;
   938         -  if (str.CmpNoCase(wxT("SqlProc_FromText")) == 0)
   939         -    return true;
   940         -  if (str.CmpNoCase(wxT("SqlProc_IsValid")) == 0)
   941         -    return true;
   942         -  if (str.CmpNoCase(wxT("SqlProc_NumVariables")) == 0)
   943         -    return true;
   944         -  if (str.CmpNoCase(wxT("SqlProc_VariableN")) == 0)
   945         -    return true;
   946         -  if (str.CmpNoCase(wxT("SqlProc_AllVariables")) == 0)
   947         -    return true;
   948         -  if (str.CmpNoCase(wxT("SqlProc_RawSQL")) == 0)
   949         -    return true;
   950         -  if (str.CmpNoCase(wxT("SqlProc_VarValue")) == 0)
   951         -    return true;
   952         -  if (str.CmpNoCase(wxT("SqlProc_IsValidVarValue")) == 0)
   953         -    return true;
   954         -  if (str.CmpNoCase(wxT("SqlProc_CookedSQL")) == 0)
   955         -    return true;
   956         -  if (str.CmpNoCase(wxT("SqlProc_Execute")) == 0)
   957         -    return true;
   958         -  if (str.CmpNoCase(wxT("SqlProc_Exit")) == 0)
   959         -    return true;
   960         -  if (str.CmpNoCase(wxT("StoredProc_CreateTables")) == 0)
   961         -    return true;
   962         -  if (str.CmpNoCase(wxT("StoredProc_Register")) == 0)
   963         -    return true;
   964         -  if (str.CmpNoCase(wxT("StoredProc_Get")) == 0)
   965         -    return true;
   966         -  if (str.CmpNoCase(wxT("StoredProc_Delete")) == 0)
   967         -    return true;
   968         -  if (str.CmpNoCase(wxT("StoredProc_UpdateTitle")) == 0)
   969         -    return true;
   970         -  if (str.CmpNoCase(wxT("StoredProc_UpdateSqlBody")) == 0)
   971         -    return true;
   972         -  if (str.CmpNoCase(wxT("StoredProc_Execute")) == 0)
   973         -    return true;
   974         -  if (str.CmpNoCase(wxT("StoredProc_Exit")) == 0)
   975         -    return true;
   976         -  if (str.CmpNoCase(wxT("StoredVar_Register")) == 0)
   977         -    return true;
   978         -  if (str.CmpNoCase(wxT("StoredVar_Get")) == 0)
   979         -    return true;
   980         -  if (str.CmpNoCase(wxT("StoredVar_GetValue")) == 0)
   981         -    return true;
   982         -  if (str.CmpNoCase(wxT("StoredVar_Delete")) == 0)
   983         -    return true;
   984         -  if (str.CmpNoCase(wxT("StoredVar_UpdateTitle")) == 0)
   985         -    return true;
   986         -  if (str.CmpNoCase(wxT("StoredVar_UpdateValue")) == 0)
   987         -    return true;
   988         -
   989         -  if (str.CmpNoCase(wxT("PostgreSql_ResetLastError")) == 0)
   990         -    return true;
   991         -  if (str.CmpNoCase(wxT("PostgreSql_SetLastError")) == 0)
   992         -    return true;
   993         -  if (str.CmpNoCase(wxT("PostgreSql_GetLastError")) == 0)
   994         -    return true;
   995         -
   996         -  if (str.CmpNoCase(wxT("CreateRoutingNodes")) == 0)
   997         -    return true;
   998         -  if (str.CmpNoCase(wxT("CreateRouting")) == 0)
   999         -    return true;
  1000         -  if (str.CmpNoCase(wxT("CreateRouting_GetLastError")) == 0)
  1001         -    return true;
  1002         -
  1003    904     if (str.CmpNoCase(wxT("sequence_nextval")) == 0)
  1004    905       return true;
  1005    906     if (str.CmpNoCase(wxT("sequence_currval")) == 0)
  1006    907       return true;
  1007    908     if (str.CmpNoCase(wxT("sequence_lastval")) == 0)
  1008    909       return true;
  1009    910     if (str.CmpNoCase(wxT("sequence_setval")) == 0)
................................................................................
  1065    966       return true;
  1066    967     if (str.CmpNoCase(wxT("Var_pop")) == 0)
  1067    968       return true;
  1068    969     if (str.CmpNoCase(wxT("Var_samp")) == 0)
  1069    970       return true;
  1070    971     if (str.CmpNoCase(wxT("Tan")) == 0)
  1071    972       return true;
  1072         -  if (str.CmpNoCase(wxT("IsGeometryBlob")) == 0)
  1073         -    return true;
  1074         -  if (str.CmpNoCase(wxT("IsTinyPointBlob")) == 0)
  1075         -    return true;
  1076    973     if (str.CmpNoCase(wxT("IsZipBlob")) == 0)
  1077    974       return true;
  1078    975     if (str.CmpNoCase(wxT("IsPdfBlob")) == 0)
  1079    976       return true;
  1080    977     if (str.CmpNoCase(wxT("IsGifBlob")) == 0)
  1081    978       return true;
  1082    979     if (str.CmpNoCase(wxT("IsPngBlob")) == 0)
................................................................................
  1099    996       return true;
  1100    997     if (str.CmpNoCase(wxT("BlobFromFile")) == 0)
  1101    998       return true;
  1102    999     if (str.CmpNoCase(wxT("BlobToFile")) == 0)
  1103   1000       return true;
  1104   1001     if (str.CmpNoCase(wxT("ExportDXF")) == 0)
  1105   1002       return true;
  1106         -  if (str.CmpNoCase(wxT("TinyPointEncode")) == 0)
  1107         -    return true;
  1108         -  if (str.CmpNoCase(wxT("GeometryPointEncode")) == 0)
  1109         -    return true;
  1110   1003     if (str.CmpNoCase(wxT("MakePoint")) == 0)
  1111   1004       return true;
  1112   1005     if (str.CmpNoCase(wxT("ST_Point")) == 0)
  1113   1006       return true;
  1114   1007     if (str.CmpNoCase(wxT("MakePointZ")) == 0)
  1115   1008       return true;
  1116   1009     if (str.CmpNoCase(wxT("ST_PointZ")) == 0)
................................................................................
  1345   1238       return true;
  1346   1239     if (str.CmpNoCase(wxT("GeomFromEWKB")) == 0)
  1347   1240       return true;
  1348   1241     if (str.CmpNoCase(wxT("AsTWKB")) == 0)
  1349   1242       return true;
  1350   1243     if (str.CmpNoCase(wxT("GeomFromTWKB")) == 0)
  1351   1244       return true;
  1352         -  if (str.CmpNoCase(wxT("ST_AsEncodedPolyline")) == 0)
  1353         -    return true;
  1354         -  if (str.CmpNoCase(wxT("ST_LineFromEncodedPolyline")) == 0)
  1355         -    return true;
  1356   1245     if (str.CmpNoCase(wxT("AsEWKT")) == 0)
  1357   1246       return true;
  1358   1247     if (str.CmpNoCase(wxT("GeomFromEWKT")) == 0)
  1359   1248       return true;
  1360   1249     if (str.CmpNoCase(wxT("CompressGeometry")) == 0)
  1361   1250       return true;
  1362   1251     if (str.CmpNoCase(wxT("UncompressGeometry")) == 0)
................................................................................
  1395   1284       return true;
  1396   1285     if (str.CmpNoCase(wxT("CastToXYZM")) == 0)
  1397   1286       return true;
  1398   1287     if (str.CmpNoCase(wxT("ST_Reverse")) == 0)
  1399   1288       return true;
  1400   1289     if (str.CmpNoCase(wxT("ST_ForceLHR")) == 0)
  1401   1290       return true;
  1402         -  if (str.CmpNoCase(wxT("ST_ForcePolygonCW")) == 0)
  1403         -    return true;
  1404         -  if (str.CmpNoCase(wxT("ST_ForcePolygonCCW")) == 0)
  1405         -    return true;
  1406         -  if (str.CmpNoCase(wxT("ST_IsPolygonCW")) == 0)
  1407         -    return true;
  1408         -  if (str.CmpNoCase(wxT("ST_IsPolygonCCW")) == 0)
  1409         -    return true;
  1410   1291     if (str.CmpNoCase(wxT("Dimension")) == 0)
  1411   1292       return true;
  1412   1293     if (str.CmpNoCase(wxT("ST_Dimension")) == 0)
  1413   1294       return true;
  1414   1295     if (str.CmpNoCase(wxT("CoordDimension")) == 0)
  1415   1296       return true;
  1416   1297     if (str.CmpNoCase(wxT("ST_NDims")) == 0)
................................................................................
  1517   1398       return true;
  1518   1399     if (str.CmpNoCase(wxT("ST_SimplifyPreserveTopology")) == 0)
  1519   1400       return true;
  1520   1401     if (str.CmpNoCase(wxT("GeodesicLength")) == 0)
  1521   1402       return true;
  1522   1403     if (str.CmpNoCase(wxT("GreatCircleLength")) == 0)
  1523   1404       return true;
  1524         -  if (str.CmpNoCase(wxT("GeodesicArcLength")) == 0)
  1525         -    return true;
  1526         -  if (str.CmpNoCase(wxT("GeodesicChordLength")) == 0)
  1527         -    return true;
  1528         -  if (str.CmpNoCase(wxT("GeodesicCentralAngle")) == 0)
  1529         -    return true;
  1530         -  if (str.CmpNoCase(wxT("GeodesicArcArea")) == 0)
  1531         -    return true;
  1532         -  if (str.CmpNoCase(wxT("GeodesicArcHeigth")) == 0)
  1533         -    return true;
  1534   1405     if (str.CmpNoCase(wxT("NumPoints")) == 0)
  1535   1406       return true;
  1536   1407     if (str.CmpNoCase(wxT("ST_NumPoints")) == 0)
  1537   1408       return true;
  1538   1409     if (str.CmpNoCase(wxT("PointN")) == 0)
  1539   1410       return true;
  1540   1411     if (str.CmpNoCase(wxT("ST_PointN")) == 0)
................................................................................
  1711   1582       return true;
  1712   1583     if (str.CmpNoCase(wxT("ST_ConvexHull")) == 0)
  1713   1584       return true;
  1714   1585     if (str.CmpNoCase(wxT("Transform")) == 0)
  1715   1586       return true;
  1716   1587     if (str.CmpNoCase(wxT("ST_Transform")) == 0)
  1717   1588       return true;
  1718         -  if (str.CmpNoCase(wxT("TransformXY")) == 0)
  1719         -    return true;
  1720         -  if (str.CmpNoCase(wxT("ST_TransformXY")) == 0)
  1721         -    return true;
  1722   1589     if (str.CmpNoCase(wxT("ST_Shift_Longitude")) == 0)
  1723   1590       return true;
  1724   1591     if (str.CmpNoCase(wxT("NormalizeLonLat")) == 0)
  1725   1592       return true;
  1726   1593     if (str.CmpNoCase(wxT("Line_Interpolate_Point")) == 0)
  1727   1594       return true;
  1728   1595     if (str.CmpNoCase(wxT("ST_Line_Interpolate_Point")) == 0)
................................................................................
  1801   1668       return true;
  1802   1669     if (str.CmpNoCase(wxT("ExtractMultiPoint")) == 0)
  1803   1670       return true;
  1804   1671     if (str.CmpNoCase(wxT("ExtractMultiLinestring")) == 0)
  1805   1672       return true;
  1806   1673     if (str.CmpNoCase(wxT("ExtractMultiPolygon")) == 0)
  1807   1674       return true;
  1808         -  if (str.CmpNoCase(wxT("ST_AddMeasure")) == 0)
  1809         -    return true;
  1810         -  if (str.CmpNoCase(wxT("ST_InterpolatePoint")) == 0)
  1811         -    return true;
  1812   1675     if (str.CmpNoCase(wxT("ST_Locate_Along_Measure")) == 0)
  1813   1676       return true;
  1814         -  if (str.CmpNoCase(wxT("ST_LocateAlong")) == 0)
  1815         -    return true;
  1816   1677     if (str.CmpNoCase(wxT("ST_Locate_Between_Measures")) == 0)
  1817   1678       return true;
  1818         -  if (str.CmpNoCase(wxT("ST_LocateBetween")) == 0)
  1819         -    return true;
  1820         -  if (str.CmpNoCase(wxT("ST_IsValidTrajectory")) == 0)
  1821         -    return true;
  1822         -  if (str.CmpNoCase(wxT("ST_TrajectoryInterpolatePoint")) == 0)
  1823         -    return true;
  1824   1679     if (str.CmpNoCase(wxT("SquareGrid")) == 0)
  1825   1680       return true;
  1826   1681     if (str.CmpNoCase(wxT("ST_SquareGrid")) == 0)
  1827   1682       return true;
  1828   1683     if (str.CmpNoCase(wxT("TriangularGrid")) == 0)
  1829   1684       return true;
  1830   1685     if (str.CmpNoCase(wxT("ST_TriangularGrid")) == 0)
................................................................................
  2287   2142       return true;
  2288   2143     if (str.CmpNoCase(wxT("RL2_SetMaxThreads")) == 0)
  2289   2144       return true;
  2290   2145     if (str.CmpNoCase(wxT("IsValidPixel")) == 0)
  2291   2146       return true;
  2292   2147     if (str.CmpNoCase(wxT("RL2_IsValidPixel")) == 0)
  2293   2148       return true;
  2294         -  if (str.CmpNoCase(wxT("IsPixelNone")) == 0)
  2295         -    return true;
  2296         -  if (str.CmpNoCase(wxT("RL2_IsPixelNone")) == 0)
  2297         -    return true;
  2298   2149     if (str.CmpNoCase(wxT("IsValidRasterPalette")) == 0)
  2299   2150       return true;
  2300   2151     if (str.CmpNoCase(wxT("RL2_IsValidRasterPalette")) == 0)
  2301   2152       return true;
  2302   2153     if (str.CmpNoCase(wxT("IsValidRasterStatistics")) == 0)
  2303   2154       return true;
  2304   2155     if (str.CmpNoCase(wxT("RL2_IsValidRasterStatistics")) == 0)
................................................................................
  2359   2210       return true;
  2360   2211     if (str.CmpNoCase(wxT("RL2_PaletteEquals")) == 0)
  2361   2212       return true;
  2362   2213     if (str.CmpNoCase(wxT("CreatePixel")) == 0)
  2363   2214       return true;
  2364   2215     if (str.CmpNoCase(wxT("RL2_CreatePixel")) == 0)
  2365   2216       return true;
  2366         -  if (str.CmpNoCase(wxT("CreatePixelNone")) == 0)
  2367         -    return true;
  2368         -  if (str.CmpNoCase(wxT("RL2_CreatePixelNone")) == 0)
  2369         -    return true;
  2370   2217     if (str.CmpNoCase(wxT("GetPixelType")) == 0)
  2371   2218       return true;
  2372   2219     if (str.CmpNoCase(wxT("RL2_GetPixelType")) == 0)
  2373   2220       return true;
  2374   2221     if (str.CmpNoCase(wxT("GetPixelSampleType")) == 0)
  2375   2222       return true;
  2376   2223     if (str.CmpNoCase(wxT("RL2_GetPixelSampleType")) == 0)
................................................................................
  2467   2314       return true;
  2468   2315     if (str.CmpNoCase(wxT("RL2_GetMapImageFromRaster")) == 0)
  2469   2316       return true;
  2470   2317     if (str.CmpNoCase(wxT("GetMapImageFromVector")) == 0)
  2471   2318       return true;
  2472   2319     if (str.CmpNoCase(wxT("RL2_GetMapImageFromVector")) == 0)
  2473   2320       return true;
  2474         -  if (str.CmpNoCase(wxT("GetMapImageFromWMS")) == 0)
  2475         -    return true;
  2476         -  if (str.CmpNoCase(wxT("RL2_GetMapImageFromWMS")) == 0)
  2477         -    return true;
  2478   2321     if (str.CmpNoCase(wxT("GetTileImage")) == 0)
  2479   2322       return true;
  2480   2323     if (str.CmpNoCase(wxT("RL2_GetTileImage")) == 0)
  2481   2324       return true;
  2482   2325     if (str.CmpNoCase(wxT("GetTripleBandTileImage")) == 0)
  2483   2326       return true;
  2484   2327     if (str.CmpNoCase(wxT("RL2_GetTripleBandTileImage")) == 0)

Changes to QueryViewComposer.cpp.

     1      1   /*
     2      2   / QueryViewComposer.cpp
     3      3   / Query/View Composer
     4      4   /
     5      5   / version 1.7, 2013 May 8
     6      6   /
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
     8      8   /
     9      9   / Copyright (C) 2009-2013  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
    13     13   /    the Free Software Foundation, either version 3 of the License, or
    14     14   /    (at your option) any later version.

Added QuickStyles.cpp.

            1  +/*
            2  +/ QuickStyles.cpp
            3  +/ Quick Styles wizards
            4  +/
            5  +/ version 2.0, 2017 May 26
            6  +/
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
            8  +/
            9  +/ Copyright (C) 2017  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/imaglist.h"
           29  +#include "wx/colordlg.h"
           30  +#include "wx/filename.h"
           31  +#include "wx/clipbrd.h"
           32  +
           33  +QuickStyleObj::QuickStyleObj(int type)
           34  +{
           35  +// ctor
           36  +  DoGetUUID(UUID);
           37  +  Type = type;
           38  +  MinScaleEnabled = false;
           39  +  MaxScaleEnabled = false;
           40  +  ScaleMin = 0.0;
           41  +  ScaleMax = 0.0;
           42  +  SymbolOpacity = 1.0;
           43  +  SymbolSize = 16;
           44  +  SymbolRotation = 0.0;
           45  +  SymbolAnchorX = 0.5;
           46  +  SymbolAnchorY = 0.5;
           47  +  SymbolDisplacementX = 0.0;
           48  +  SymbolDisplacementY = 0.0;
           49  +  SymbolWellKnownMark = RandomWellKnownMark();
           50  +  RandomColor(SymbolFillColor);
           51  +  RandomColor(SymbolStrokeColor);
           52  +  LineOpacity = 1.0;
           53  +  LinePerpendicularOffset = 0.0;
           54  +  LineStrokeWidth = 1.0;
           55  +  RandomColor(LineStrokeColor);
           56  +  LineDotStyle = QUICK_STYLE_SOLID_LINE;
           57  +  PolygonFill = true;
           58  +  PolygonStroke = true;
           59  +  PolygonDisplacementX = 0.0;
           60  +  PolygonDisplacementY = 0.0;
           61  +  PolygonPerpendicularOffset = 0.0;
           62  +  PolygonFillOpacity = 1.0;
           63  +  RandomColor(PolygonFillColor);
           64  +  PolygonStrokeOpacity = 1.0;
           65  +  PolygonStrokeWidth = 1.0;
           66  +  RandomColor(PolygonStrokeColor);
           67  +  LabelLinePlacement = true;
           68  +  LabelPrint = false;
           69  +  LabelColumn = NULL;
           70  +  FontFacename = NULL;
           71  +  FontSize = 10.0;
           72  +  FontStyle = RL2_FONTSTYLE_NORMAL;
           73  +  FontWeight = RL2_FONTWEIGHT_NORMAL;
           74  +  FontOpacity = 1.0;
           75  +  strcpy(FontColor, "#000000");
           76  +  HasHalo = false;
           77  +  HaloRadius = 1.0;
           78  +  HaloOpacity = 1.0;
           79  +  strcpy(HaloColor, "#ffffff");
           80  +  LabelAnchorX = 0.5;
           81  +  LabelAnchorY = 0.5;
           82  +  LabelDisplacementX = 0.0;
           83  +  LabelDisplacementY = 0.0;
           84  +  LabelRotation = 0.0;
           85  +  LabelPerpendicularOffset = 0.0;
           86  +  RepeatedLabel = false;
           87  +  LabelInitialGap = 0.0;
           88  +  LabelGap = 0.0;
           89  +  LabelIsAligned = false;
           90  +  LabelGeneralizeLine = false;
           91  +  XmlStyle = NULL;
           92  +}
           93  +
           94  +QuickStyleObj *QuickStyleObj::Clone()
           95  +{
           96  +//
           97  +// cloning a Quick Style
           98  +//
           99  +  QuickStyleObj *Style = new QuickStyleObj(this->Type);
          100  +  strcpy(Style->UUID, this->UUID);
          101  +  Style->MinScaleEnabled = this->MinScaleEnabled;
          102  +  Style->MaxScaleEnabled = this->MaxScaleEnabled;
          103  +  Style->ScaleMin = this->ScaleMin;
          104  +  Style->ScaleMax = this->ScaleMax;
          105  +  Style->SymbolOpacity = this->SymbolOpacity;
          106  +  Style->SymbolSize = this->SymbolSize;
          107  +  Style->SymbolRotation = this->SymbolRotation;
          108  +  Style->SymbolAnchorX = this->SymbolAnchorX;
          109  +  Style->SymbolAnchorY = this->SymbolAnchorY;
          110  +  Style->SymbolDisplacementX = this->SymbolDisplacementX;
          111  +  Style->SymbolDisplacementY = this->SymbolDisplacementY;
          112  +  Style->SymbolWellKnownMark = this->SymbolWellKnownMark;
          113  +  strcpy(Style->SymbolFillColor, this->SymbolFillColor);
          114  +  strcpy(Style->SymbolStrokeColor, this->SymbolStrokeColor);
          115  +  Style->LineOpacity = this->LineOpacity;
          116  +  Style->LinePerpendicularOffset = this->LinePerpendicularOffset;
          117  +  Style->LineStrokeWidth = this->LineStrokeWidth;
          118  +  strcpy(Style->LineStrokeColor, this->LineStrokeColor);
          119  +  Style->LineDotStyle = this->LineDotStyle;
          120  +  Style->PolygonFill = this->PolygonFill;
          121  +  Style->PolygonStroke = this->PolygonStroke;
          122  +  Style->PolygonDisplacementX = this->PolygonDisplacementX;
          123  +  Style->PolygonDisplacementY = this->PolygonDisplacementY;
          124  +  Style->PolygonPerpendicularOffset = this->PolygonPerpendicularOffset;
          125  +  Style->PolygonFillOpacity = this->PolygonFillOpacity;
          126  +  strcpy(Style->PolygonFillColor, this->PolygonFillColor);
          127  +  Style->PolygonStrokeOpacity = this->PolygonStrokeOpacity;
          128  +  Style->PolygonStrokeWidth = this->PolygonStrokeWidth;
          129  +  strcpy(Style->PolygonStrokeColor, this->PolygonStrokeColor);
          130  +  Style->LabelLinePlacement = this->LabelLinePlacement;
          131  +  Style->LabelPrint = this->LabelPrint;
          132  +  if (this->LabelColumn == NULL)
          133  +    Style->LabelColumn = NULL;
          134  +  else
          135  +    {
          136  +      int len = strlen(this->LabelColumn);
          137  +      Style->LabelColumn = (char *) malloc(len + 1);
          138  +      strcpy(Style->LabelColumn, this->LabelColumn);
          139  +    }
          140  +  if (this->FontFacename == NULL)
          141  +    Style->FontFacename = NULL;
          142  +  else
          143  +    {
          144  +      int len = strlen(this->FontFacename);
          145  +      Style->FontFacename = (char *) malloc(len + 1);
          146  +      strcpy(Style->FontFacename, this->FontFacename);
          147  +    }
          148  +  Style->FontSize = this->FontSize;
          149  +  Style->FontStyle = this->FontStyle;
          150  +  Style->FontWeight = this->FontWeight;
          151  +  Style->FontOpacity = this->FontOpacity;
          152  +  strcpy(Style->FontColor, this->FontColor);
          153  +  Style->HasHalo = this->HasHalo;
          154  +  Style->HaloRadius = this->HaloRadius;
          155  +  Style->HaloOpacity = this->HaloOpacity;
          156  +  strcpy(Style->HaloColor, this->HaloColor);
          157  +  Style->LabelAnchorX = this->LabelAnchorX;
          158  +  Style->LabelAnchorY = this->LabelAnchorY;
          159  +  Style->LabelDisplacementX = this->LabelDisplacementX;
          160  +  Style->LabelDisplacementY = this->LabelDisplacementY;
          161  +  Style->LabelRotation = this->LabelRotation;
          162  +  Style->LabelPerpendicularOffset = this->LabelPerpendicularOffset;
          163  +  Style->RepeatedLabel = this->RepeatedLabel;
          164  +  Style->LabelInitialGap = this->LabelInitialGap;
          165  +  Style->LabelGap = this->LabelGap;
          166  +  Style->LabelIsAligned = this->LabelIsAligned;
          167  +  Style->LabelGeneralizeLine = this->LabelGeneralizeLine;
          168  +  Style->XmlStyle = NULL;
          169  +  return Style;
          170  +}
          171  +
          172  +bool QuickStyleObj::Compare(QuickStyleObj * Style)
          173  +{
          174  +//
          175  +// comparing two Quick Style objects
          176  +//
          177  +  if (Style == NULL)
          178  +    return false;
          179  +  if (strcmp(Style->UUID, this->UUID) != 0)
          180  +    return false;
          181  +  if (Style->MinScaleEnabled != this->MinScaleEnabled)
          182  +    return false;
          183  +  if (Style->MaxScaleEnabled != this->MaxScaleEnabled)
          184  +    return false;
          185  +  if (Style->ScaleMin != this->ScaleMin)
          186  +    return false;
          187  +  if (Style->ScaleMax != this->ScaleMax)
          188  +    return false;
          189  +  if (Style->SymbolOpacity != this->SymbolOpacity)
          190  +    return false;
          191  +  if (Style->SymbolSize != this->SymbolSize)
          192  +    return false;
          193  +  if (Style->SymbolRotation != this->SymbolRotation)
          194  +    return false;
          195  +  if (Style->SymbolAnchorX != this->SymbolAnchorX)
          196  +    return false;
          197  +  if (Style->SymbolAnchorY != this->SymbolAnchorY)
          198  +    return false;
          199  +  if (Style->SymbolDisplacementX != this->SymbolDisplacementX)
          200  +    return false;
          201  +  if (Style->SymbolDisplacementY != this->SymbolDisplacementY)
          202  +    return false;
          203  +  if (Style->SymbolWellKnownMark != this->SymbolWellKnownMark)
          204  +    return false;
          205  +  if (strcmp(Style->SymbolFillColor, this->SymbolFillColor) != 0)
          206  +    return false;
          207  +  if (strcmp(Style->SymbolStrokeColor, this->SymbolStrokeColor) != 0)
          208  +    return false;
          209  +  if (Style->LineOpacity != this->LineOpacity)
          210  +    return false;
          211  +  if (Style->LinePerpendicularOffset != this->LinePerpendicularOffset)
          212  +    return false;
          213  +  if (Style->LineStrokeWidth != this->LineStrokeWidth)
          214  +    return false;
          215  +  if (strcmp(Style->LineStrokeColor, this->LineStrokeColor) != 0)
          216  +    return false;
          217  +  if (Style->LineDotStyle != this->LineDotStyle)
          218  +    return false;
          219  +  if (Style->PolygonFill != this->PolygonFill)
          220  +    return false;
          221  +  if (Style->PolygonStroke != this->PolygonStroke)
          222  +    return false;
          223  +  if (Style->PolygonDisplacementX != this->PolygonDisplacementX)
          224  +    return false;
          225  +  if (Style->PolygonDisplacementY != this->PolygonDisplacementY)
          226  +    return false;
          227  +  if (Style->PolygonPerpendicularOffset != this->PolygonPerpendicularOffset)
          228  +    return false;
          229  +  if (Style->PolygonFillOpacity != this->PolygonFillOpacity)
          230  +    return false;
          231  +  if (strcmp(Style->PolygonFillColor, this->PolygonFillColor) != 0)
          232  +    return false;
          233  +  if (Style->PolygonStrokeOpacity != this->PolygonStrokeOpacity)
          234  +    return false;
          235  +  if (Style->PolygonStrokeWidth != this->PolygonStrokeWidth)
          236  +    return false;
          237  +  if (strcmp(Style->PolygonStrokeColor, this->PolygonStrokeColor) != 0)
          238  +    return false;
          239  +  if (Style->LabelLinePlacement != this->LabelLinePlacement)
          240  +    return false;
          241  +  if (Style->LabelPrint != this->LabelPrint)
          242  +    return false;
          243  +  if (Style->LabelColumn == NULL && this->LabelColumn == NULL)
          244  +    ;
          245  +  else if (Style->LabelColumn == NULL && this->LabelColumn != NULL)
          246  +    return false;
          247  +  else if (Style->LabelColumn != NULL && this->LabelColumn == NULL)
          248  +    return false;
          249  +  else if (strcmp(Style->LabelColumn, this->LabelColumn) != 0)
          250  +    return false;
          251  +  if (Style->FontFacename == NULL && this->FontFacename == NULL)
          252  +    ;
          253  +  else if (Style->FontFacename == NULL && this->FontFacename != NULL)
          254  +    return false;
          255  +  else if (Style->FontFacename != NULL && this->FontFacename == NULL)
          256  +    return false;
          257  +  else if (strcmp(Style->FontFacename, this->FontFacename) != 0)
          258  +    return false;
          259  +  if (Style->FontSize != this->FontSize)
          260  +    return false;
          261  +  if (Style->FontStyle != this->FontStyle)
          262  +    return false;
          263  +  if (Style->FontWeight != this->FontWeight)
          264  +    return false;
          265  +  if (Style->FontOpacity != this->FontOpacity)
          266  +    return false;
          267  +  if (strcmp(Style->FontColor, this->FontColor) != 0)
          268  +    return false;
          269  +  if (Style->HasHalo != this->HasHalo)
          270  +    return false;
          271  +  if (Style->HaloRadius != this->HaloRadius)
          272  +    return false;
          273  +  if (Style->HaloOpacity != this->HaloOpacity)
          274  +    return false;
          275  +  if (strcmp(Style->HaloColor, this->HaloColor) != 0)
          276  +    return false;
          277  +  if (Style->LabelAnchorX != this->LabelAnchorX)
          278  +    return false;
          279  +  if (Style->LabelAnchorY != this->LabelAnchorY)
          280  +    return false;
          281  +  if (Style->LabelDisplacementX != this->LabelDisplacementX)
          282  +    return false;
          283  +  if (Style->LabelDisplacementY != this->LabelDisplacementY)
          284  +    return false;
          285  +  if (Style->LabelRotation != this->LabelRotation)
          286  +    return false;
          287  +  if (Style->LabelPerpendicularOffset != this->LabelPerpendicularOffset)
          288  +    return false;
          289  +  if (Style->RepeatedLabel != this->RepeatedLabel)
          290  +    return false;
          291  +  if (Style->LabelInitialGap != this->LabelInitialGap)
          292  +    return false;
          293  +  if (Style->LabelGap != this->LabelGap)
          294  +    return false;
          295  +  if (Style->LabelIsAligned != this->LabelIsAligned)
          296  +    return false;
          297  +  if (Style->LabelGeneralizeLine != this->LabelGeneralizeLine)
          298  +    return false;
          299  +  return true;
          300  +}
          301  +
          302  +void QuickStyleObj::SetLabelColumn(const char *x)
          303  +{
          304  +//
          305  +// setting the Label Column
          306  +//
          307  +  int len;
          308  +  if (LabelColumn != NULL)
          309  +    free(LabelColumn);
          310  +  LabelColumn = NULL;
          311  +  if (x == NULL)
          312  +    return;
          313  +  len = strlen(x);
          314  +  LabelColumn = (char *) malloc(len + 1);
          315  +  strcpy(LabelColumn, x);
          316  +}
          317  +
          318  +void QuickStyleObj::SetFontFacename(const char *x)
          319  +{
          320  +//
          321  +// setting the Font Facename
          322  +//
          323  +  int len;
          324  +  if (FontFacename != NULL)
          325  +    free(FontFacename);
          326  +  FontFacename = NULL;
          327  +  if (x == NULL)
          328  +    return;
          329  +  len = strlen(x);
          330  +  FontFacename = (char *) malloc(len + 1);
          331  +  strcpy(FontFacename, x);
          332  +}
          333  +
          334  +void QuickStyleObj::UpdateXmlStyle()
          335  +{
          336  +//
          337  +// updating the XML Style
          338  +//
          339  +  if (XmlStyle != NULL)
          340  +    sqlite3_free(XmlStyle);
          341  +  XmlStyle = CreateXmlStyle();
          342  +}
          343  +
          344  +char *QuickStyleObj::CreateXmlStyle()
          345  +{
          346  +//
          347  +// creating the XML Style
          348  +//
          349  +  char *xml;
          350  +  if ((MinScaleEnabled == true || MaxScaleEnabled == true) || LabelPrint == true
          351  +      || Type == QUICK_STYLE_GEOMETRY)
          352  +    xml = DoCreateFeatureTypeXML();
          353  +  else
          354  +    xml = DoCreateSymbolizerXML(false);
          355  +  return xml;
          356  +
          357  +}
          358  +
          359  +char *QuickStyleObj::DoCreateFeatureTypeXML()
          360  +{
          361  +//
          362  +// creating a FeatureType XML Style
          363  +//
          364  +  const char *cstr;
          365  +  char *prev;
          366  +  char *xml2;
          367  +  char *xml = sqlite3_mprintf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
          368  +  prev = xml;
          369  +  xml = sqlite3_mprintf("%s<FeatureTypeStyle version=\"1.1.0\" ", prev);
          370  +  sqlite3_free(prev);
          371  +  prev = xml;
          372  +  xml =
          373  +    sqlite3_mprintf
          374  +    ("%sxsi:schemaLocation=\"http://www.opengis.net/se http://schemas.opengis.net/se/1.1.0/FeatureStyle.xsd\" ",
          375  +     prev);
          376  +  sqlite3_free(prev);
          377  +  prev = xml;
          378  +  xml = sqlite3_mprintf
          379  +    ("%sxmlns=\"http://www.opengis.net/se\" xmlns:ogc=\"http://www.opengis.net/ogc\" ",
          380  +     prev);
          381  +  sqlite3_free(prev);
          382  +  prev = xml;
          383  +  xml =
          384  +    sqlite3_mprintf("%sxmlns:xlink=\"http://www.w3.org/1999/xlink\" ", prev);
          385  +  sqlite3_free(prev);
          386  +  prev = xml;
          387  +  xml =
          388  +    sqlite3_mprintf
          389  +    ("%sxmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\r\n", prev);
          390  +  sqlite3_free(prev);
          391  +  prev = xml;
          392  +  xml = sqlite3_mprintf("%s\t<Name>%s</Name>\r\n", prev, UUID);
          393  +  sqlite3_free(prev);
          394  +  prev = xml;
          395  +  xml = sqlite3_mprintf("%s\t<Description>\r\n", prev);
          396  +  sqlite3_free(prev);
          397  +  prev = xml;
          398  +  xml = sqlite3_mprintf("%s\t\t<Title>%s</Title>\r\n", prev, "Quick Style");
          399  +  sqlite3_free(prev);
          400  +  prev = xml;
          401  +  xml =
          402  +    sqlite3_mprintf("%s\t\t<Abstract>%s</Abstract>\r\n", prev,
          403  +                    "Created by SpatialiteGUI");
          404  +  sqlite3_free(prev);
          405  +  prev = xml;
          406  +  xml = sqlite3_mprintf("%s\t</Description>\r\n", prev);
          407  +  sqlite3_free(prev);
          408  +  prev = xml;
          409  +  xml = sqlite3_mprintf("%s\t<Rule>\r\n", prev);
          410  +  sqlite3_free(prev);
          411  +  prev = xml;
          412  +  if (MinScaleEnabled == true)
          413  +    {
          414  +      xml =
          415  +        sqlite3_mprintf
          416  +        ("%s\t\t<MinScaleDenominator>%1.2f</MinScaleDenominator>\r\n", prev,
          417  +         ScaleMin);
          418  +      sqlite3_free(prev);
          419  +      prev = xml;
          420  +    }
          421  +  if (MaxScaleEnabled == true)
          422  +    {
          423  +      xml =
          424  +        sqlite3_mprintf
          425  +        ("%s\t\t<MaxScaleDenominator>%1.2f</MaxScaleDenominator>\r\n", prev,
          426  +         ScaleMax);
          427  +      sqlite3_free(prev);
          428  +      prev = xml;
          429  +    }
          430  +  xml2 = NULL;
          431  +  if (Type == QUICK_STYLE_POINT)
          432  +    xml2 = DoCreatePointSymbolizerXML(true);
          433  +  if (Type == QUICK_STYLE_LINE)
          434  +    xml2 = DoCreateLineSymbolizerXML(true);
          435  +  if (Type == QUICK_STYLE_POLYGON)
          436  +    xml2 = DoCreatePolygonSymbolizerXML(true);
          437  +  else
          438  +    {
          439  +      // mixed-type Symbolizers
          440  +      xml2 = DoCreatePointSymbolizerXML(true);
          441  +      if (xml2 != NULL)
          442  +        {
          443  +          xml = sqlite3_mprintf("%s%s", prev, xml2);
          444  +          sqlite3_free(prev);
          445  +          sqlite3_free(xml2);
          446  +          prev = xml;
          447  +        }
          448  +      xml2 = DoCreateLineSymbolizerXML(true);
          449  +      if (xml2 != NULL)
          450  +        {
          451  +          xml = sqlite3_mprintf("%s%s", prev, xml2);
          452  +          sqlite3_free(prev);
          453  +          sqlite3_free(xml2);
          454  +          prev = xml;
          455  +        }
          456  +      xml2 = DoCreatePolygonSymbolizerXML(true);
          457  +      if (xml2 != NULL)
          458  +        {
          459  +          xml = sqlite3_mprintf("%s%s", prev, xml2);
          460  +          sqlite3_free(prev);
          461  +          sqlite3_free(xml2);
          462  +          xml2 = NULL;
          463  +          prev = xml;
          464  +        }
          465  +    }
          466  +  if (xml2 != NULL)
          467  +    {
          468  +      xml = sqlite3_mprintf("%s%s", prev, xml2);
          469  +      sqlite3_free(prev);
          470  +      sqlite3_free(xml2);
          471  +      prev = xml;
          472  +    }
          473  +  if (LabelPrint == true)
          474  +    {
          475  +      // adding a Text Symbolizer
          476  +      xml2 = NULL;
          477  +      if (Type == QUICK_STYLE_POINT || QUICK_STYLE_POLYGON)
          478  +        xml2 = DoCreateTextPointSymbolizerXML();
          479  +      if (Type == QUICK_STYLE_LINE)
          480  +        xml2 = DoCreateTextLineSymbolizerXML();
          481  +      if (xml2 != NULL)
          482  +        {
          483  +          xml = sqlite3_mprintf("%s%s", prev, xml2);
          484  +          sqlite3_free(prev);
          485  +          sqlite3_free(xml2);
          486  +          prev = xml;
          487  +        }
          488  +    }
          489  +  xml = sqlite3_mprintf("%s\t</Rule>\r\n</FeatureTypeStyle>\r\n", prev);
          490  +  sqlite3_free(prev);
          491  +  return xml;
          492  +}
          493  +
          494  +char *QuickStyleObj::DoCreateSymbolizerXML(bool subordered)
          495  +{
          496  +//
          497  +// creating a Symbolizer XML Style
          498  +//
          499  +  if (Type == QUICK_STYLE_POINT)
          500  +    return DoCreatePointSymbolizerXML(subordered);
          501  +  if (Type == QUICK_STYLE_LINE)
          502  +    return DoCreateLineSymbolizerXML(subordered);
          503  +  if (Type == QUICK_STYLE_POLYGON)
          504  +    return DoCreatePolygonSymbolizerXML(subordered);
          505  +  return NULL;
          506  +}
          507  +
          508  +char *QuickStyleObj::DoCreatePointSymbolizerXML(bool subordered)
          509  +{
          510  +//
          511  +// creating a Point Symbolizer XML Style
          512  +//
          513  +  const char *cstr;
          514  +  char *prev;
          515  +  const char *extra = "";
          516  +  char *xml = sqlite3_mprintf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
          517  +  if (subordered == true)
          518  +    {
          519  +      extra = "\t\t";
          520  +      sqlite3_free(xml);
          521  +      prev = (char *) "";
          522  +      xml = sqlite3_mprintf("%s%s<PointSymbolizer>\r\n", prev, extra);
          523  +  } else
          524  +    {
          525  +      prev = xml;
          526  +      xml = sqlite3_mprintf("%s<PointSymbolizer version=\"1.1.0\" ", prev);
          527  +      sqlite3_free(prev);
          528  +      prev = xml;
          529  +      xml =
          530  +        sqlite3_mprintf
          531  +        ("%sxsi:schemaLocation=\"http://www.opengis.net/se http://schemas.opengis.net/se/1.1.0/Symbolizer.xsd\" ",
          532  +         prev);
          533  +      sqlite3_free(prev);
          534  +      prev = xml;
          535  +      xml = sqlite3_mprintf
          536  +        ("%sxmlns=\"http://www.opengis.net/se\" xmlns:ogc=\"http://www.opengis.net/ogc\" ",
          537  +         prev);
          538  +      sqlite3_free(prev);
          539  +      prev = xml;
          540  +      xml =
          541  +        sqlite3_mprintf("%sxmlns:xlink=\"http://www.w3.org/1999/xlink\" ",
          542  +                        prev);
          543  +      sqlite3_free(prev);
          544  +      prev = xml;
          545  +      cstr = "http://www.opengeospatial.org/se/units/pixel";
          546  +      xml =
          547  +        sqlite3_mprintf
          548  +        ("%sxmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" uom=\"%s\">\r\n",
          549  +         prev, cstr);
          550  +      sqlite3_free(prev);
          551  +    }
          552  +  prev = xml;
          553  +  if (subordered != true)
          554  +    {
          555  +      xml = sqlite3_mprintf("%s\t<Name>%s</Name>\r\n", prev, UUID);
          556  +      sqlite3_free(prev);
          557  +      prev = xml;
          558  +      xml = sqlite3_mprintf("%s\t<Description>\r\n", prev);
          559  +      sqlite3_free(prev);
          560  +      prev = xml;
          561  +      xml =
          562  +        sqlite3_mprintf("%s\t\t<Title>%s</Title>\r\n", prev,
          563  +                        "Quick Style - PointSymbolizer");
          564  +      sqlite3_free(prev);
          565  +      prev = xml;
          566  +      xml =
          567  +        sqlite3_mprintf("%s\t\t<Abstract>%s</Abstract>\r\n", prev,
          568  +                        "Created by SpatialiteGUI");
          569  +      sqlite3_free(prev);
          570  +      prev = xml;
          571  +      xml = sqlite3_mprintf("%s\t</Description>\r\n", prev);
          572  +      sqlite3_free(prev);
          573  +      prev = xml;
          574  +    }
          575  +  xml = sqlite3_mprintf("%s%s\t<Graphic>\r\n", prev, extra);
          576  +  sqlite3_free(prev);
          577  +  prev = xml;
          578  +// mark symbol
          579  +  xml = sqlite3_mprintf("%s%s\t\t<Mark>\r\n", prev, extra);
          580  +  sqlite3_free(prev);
          581  +  prev = xml;
          582  +  switch (SymbolWellKnownMark)
          583  +    {
          584  +      case RL2_GRAPHIC_MARK_CIRCLE:
          585  +        cstr = "circle";
          586  +        break;
          587  +      case RL2_GRAPHIC_MARK_TRIANGLE:
          588  +        cstr = "triangle";
          589  +        break;
          590  +      case RL2_GRAPHIC_MARK_STAR:
          591  +        cstr = "star";
          592  +        break;
          593  +      case RL2_GRAPHIC_MARK_CROSS:
          594  +        cstr = "cross";
          595  +        break;
          596  +      case RL2_GRAPHIC_MARK_X:
          597  +        cstr = "x";
          598  +        break;
          599  +      default:
          600  +        cstr = "square";
          601  +        break;
          602  +    };
          603  +  xml =
          604  +    sqlite3_mprintf("%s%s\t\t\t<WellKnownName>%s</WellKnownName>\r\n", prev,
          605  +                    extra, cstr);
          606  +  sqlite3_free(prev);
          607  +  prev = xml;
          608  +// Mark Fill
          609  +  xml = sqlite3_mprintf("%s%s\t\t\t<Fill>\r\n", prev, extra);
          610  +  sqlite3_free(prev);
          611  +  prev = xml;
          612  +  xml =
          613  +    sqlite3_mprintf
          614  +    ("%s%s\t\t\t\t<SvgParameter name=\"fill\">%s</SvgParameter>\r\n",
          615  +     prev, extra, SymbolFillColor);
          616  +  sqlite3_free(prev);
          617  +  prev = xml;
          618  +  xml = sqlite3_mprintf("%s%s\t\t\t</Fill>\r\n", prev, extra);
          619  +  sqlite3_free(prev);
          620  +  prev = xml;
          621  +// Mark Stroke
          622  +  xml = sqlite3_mprintf("%s%s\t\t\t<Stroke>\r\n", prev, extra);
          623  +  sqlite3_free(prev);
          624  +  prev = xml;
          625  +  xml =
          626  +    sqlite3_mprintf
          627  +    ("%s%s\t\t\t\t<SvgParameter name=\"stroke\">%s</SvgParameter>\r\n",
          628  +     prev, extra, SymbolStrokeColor);
          629  +  sqlite3_free(prev);
          630  +  prev = xml;
          631  +  xml =
          632  +    sqlite3_mprintf
          633  +    ("%s%s\t\t\t\t<SvgParameter name=\"stroke-width\">%1.2f</SvgParameter>\r\n",
          634  +     prev, extra, 1.0);
          635  +  sqlite3_free(prev);
          636  +  prev = xml;
          637  +  xml =
          638  +    sqlite3_mprintf
          639  +    ("%s%s\t\t\t\t<SvgParameter name=\"stroke-linejoin\">round</SvgParameter>\r\n",
          640  +     prev, extra);
          641  +  sqlite3_free(prev);
          642  +  prev = xml;
          643  +  xml =
          644  +    sqlite3_mprintf
          645  +    ("%s%s\t\t\t\t<SvgParameter name=\"stroke-linecap\">round</SvgParameter>\r\n",
          646  +     prev, extra);
          647  +  sqlite3_free(prev);
          648  +  prev = xml;
          649  +  xml = sqlite3_mprintf("%s%s\t\t\t</Stroke>\r\n", prev, extra);
          650  +  sqlite3_free(prev);
          651  +  prev = xml;
          652  +  xml = sqlite3_mprintf("%s%s\t\t</Mark>\r\n", prev, extra);
          653  +  sqlite3_free(prev);
          654  +  prev = xml;
          655  +  if (SymbolOpacity != 1.0)
          656  +    {
          657  +      xml =
          658  +        sqlite3_mprintf("%s%s\t\t<Opacity>%1.2f</Opacity>\r\n", prev, extra,
          659  +                        SymbolOpacity);
          660  +      sqlite3_free(prev);
          661  +      prev = xml;
          662  +    }
          663  +  xml =
          664  +    sqlite3_mprintf("%s%s\t\t<Size>%1.2f</Size>\r\n", prev, extra, SymbolSize);
          665  +  sqlite3_free(prev);
          666  +  prev = xml;
          667  +  if (SymbolRotation != 0.0)
          668  +    {
          669  +      xml =
          670  +        sqlite3_mprintf("%s%s\t\t<Rotation>%1.2f</Rotation>\r\n", prev, extra,
          671  +                        SymbolRotation);
          672  +      sqlite3_free(prev);
          673  +      prev = xml;
          674  +    }
          675  +  if (SymbolAnchorX != 0.5 || SymbolAnchorY != 0.5)
          676  +    {
          677  +      xml = sqlite3_mprintf("%s%s\t\t<AnchorPoint>\r\n", prev, extra);
          678  +      sqlite3_free(prev);
          679  +      prev = xml;
          680  +      xml =
          681  +        sqlite3_mprintf("%s%s\t\t\t<AnchorPointX>%1.4f</AnchorPointX>\r\n",
          682  +                        prev, extra, SymbolAnchorX);
          683  +      sqlite3_free(prev);
          684  +      prev = xml;
          685  +      xml =
          686  +        sqlite3_mprintf("%s%s\t\t\t<AnchorPointY>%1.4f</AnchorPointY>\r\n",
          687  +                        prev, extra, SymbolAnchorY);
          688  +      sqlite3_free(prev);
          689  +      prev = xml;
          690  +      xml = sqlite3_mprintf("%s%s\t\t</AnchorPoint>\r\n", prev, extra);
          691  +      sqlite3_free(prev);
          692  +      prev = xml;
          693  +    }
          694  +  if (SymbolDisplacementX != 0.0 || SymbolDisplacementY != 0.0)
          695  +    {
          696  +      xml = sqlite3_mprintf("%s%s\t\t<Displacement>\r\n", prev, extra);
          697  +      sqlite3_free(prev);
          698  +      prev = xml;
          699  +      xml =
          700  +        sqlite3_mprintf("%s%s\t\t\t<DisplacementX>%1.4f</DisplacementX>\r\n",
          701  +                        prev, extra, SymbolDisplacementX);
          702  +      sqlite3_free(prev);
          703  +      prev = xml;
          704  +      xml =
          705  +        sqlite3_mprintf("%s%s\t\t\t<DisplacementY>%1.4f</DisplacementY>\r\n",
          706  +                        prev, extra, SymbolDisplacementY);
          707  +      sqlite3_free(prev);
          708  +      prev = xml;
          709  +      xml = sqlite3_mprintf("%s%s\t\t</Displacement>\r\n", prev, extra);
          710  +      sqlite3_free(prev);
          711  +      prev = xml;
          712  +    }
          713  +  xml = sqlite3_mprintf("%s%s\t</Graphic>\r\n", prev, extra);
          714  +  sqlite3_free(prev);
          715  +  prev = xml;
          716  +  xml = sqlite3_mprintf("%s%s</PointSymbolizer>\r\n", prev, extra);
          717  +  sqlite3_free(prev);
          718  +  return xml;
          719  +}
          720  +
          721  +char *QuickStyleObj::DoCreateLineSymbolizerXML(bool subordered)
          722  +{
          723  +//
          724  +// creating a Line Symbolizer XML Style
          725  +//
          726  +  const char *cstr;
          727  +  char *prev;
          728  +  const char *extra = "";
          729  +  char *xml = sqlite3_mprintf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
          730  +  prev = xml;
          731  +  if (subordered == true)
          732  +    {
          733  +      extra = "\t\t";
          734  +      sqlite3_free(xml);
          735  +      prev = (char *) "";
          736  +      xml = sqlite3_mprintf("%s%s<LineSymbolizer>\r\n", prev, extra);
          737  +  } else
          738  +    {
          739  +      xml = sqlite3_mprintf("%s<LineSymbolizer version=\"1.1.0\" ", prev);
          740  +      sqlite3_free(prev);
          741  +      prev = xml;
          742  +      xml =
          743  +        sqlite3_mprintf
          744  +        ("%sxsi:schemaLocation=\"http://www.opengis.net/se http://schemas.opengis.net/se/1.1.0/Symbolizer.xsd\" ",
          745  +         prev);
          746  +      sqlite3_free(prev);
          747  +      prev = xml;
          748  +      xml = sqlite3_mprintf
          749  +        ("%sxmlns=\"http://www.opengis.net/se\" xmlns:ogc=\"http://www.opengis.net/ogc\" ",
          750  +         prev);
          751  +      sqlite3_free(prev);
          752  +      prev = xml;
          753  +      xml =
          754  +        sqlite3_mprintf("%sxmlns:xlink=\"http://www.w3.org/1999/xlink\" ",
          755  +                        prev);
          756  +      sqlite3_free(prev);
          757  +      prev = xml;
          758  +      cstr = "http://www.opengeospatial.org/se/units/pixel";
          759  +      xml =
          760  +        sqlite3_mprintf
          761  +        ("%sxmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" uom=\"%s\">\r\n",
          762  +         prev, cstr);
          763  +      sqlite3_free(prev);
          764  +    }
          765  +  prev = xml;
          766  +  if (subordered != true)
          767  +    {
          768  +      xml = sqlite3_mprintf("%s\t<Name>%s</Name>\r\n", prev, UUID);
          769  +      sqlite3_free(prev);
          770  +      prev = xml;
          771  +      xml = sqlite3_mprintf("%s\t<Description>\r\n", prev);
          772  +      sqlite3_free(prev);
          773  +      prev = xml;
          774  +      xml =
          775  +        sqlite3_mprintf("%s\t\t<Title>%s</Title>\r\n", prev,
          776  +                        "Quick Style - LineSymbolizer");
          777  +      sqlite3_free(prev);
          778  +      prev = xml;
          779  +      xml =
          780  +        sqlite3_mprintf("%s\t\t<Abstract>%s</Abstract>\r\n", prev,
          781  +                        "Created by SpatialiteGUI");
          782  +      sqlite3_free(prev);
          783  +      prev = xml;
          784  +      xml = sqlite3_mprintf("%s\t</Description>\r\n", prev);
          785  +      sqlite3_free(prev);
          786  +      prev = xml;
          787  +    }
          788  +  xml = sqlite3_mprintf("%s%s\t<Stroke>\r\n", prev, extra);
          789  +  sqlite3_free(prev);
          790  +  prev = xml;
          791  +// using a Solid Color
          792  +  xml =
          793  +    sqlite3_mprintf
          794  +    ("%s%s\t\t<SvgParameter name=\"stroke\">%s</SvgParameter>\r\n", prev, extra,
          795  +     LineStrokeColor);
          796  +  sqlite3_free(prev);
          797  +  prev = xml;
          798  +  xml =
          799  +    sqlite3_mprintf
          800  +    ("%s%s\t\t<SvgParameter name=\"stroke-opacity\">%1.2f</SvgParameter>\r\n",
          801  +     prev, extra, LineOpacity);
          802  +  sqlite3_free(prev);
          803  +  prev = xml;
          804  +  xml =
          805  +    sqlite3_mprintf
          806  +    ("%s%s\t\t<SvgParameter name=\"stroke-width\">%1.2f</SvgParameter>\r\n",
          807  +     prev, extra, LineStrokeWidth);
          808  +  sqlite3_free(prev);
          809  +  prev = xml;
          810  +  xml =
          811  +    sqlite3_mprintf
          812  +    ("%s%s\t\t<SvgParameter name=\"stroke-linejoin\">round</SvgParameter>\r\n",
          813  +     prev, extra);
          814  +  sqlite3_free(prev);
          815  +  prev = xml;
          816  +  xml =
          817  +    sqlite3_mprintf
          818  +    ("%s%s\t\t<SvgParameter name=\"stroke-linecap\">round</SvgParameter>\r\n",
          819  +     prev, extra);
          820  +  sqlite3_free(prev);
          821  +  prev = xml;
          822  +  const char *dashArray;
          823  +  switch (LineDotStyle)
          824  +    {
          825  +      case QUICK_STYLE_DOT_LINE:
          826  +        dashArray = "5.0, 10.0";
          827  +        break;
          828  +      case QUICK_STYLE_DASH_LINE:
          829  +        dashArray = "20.0, 20.0";
          830  +        break;
          831  +      case QUICK_STYLE_DASH_DOT_LINE:
          832  +        dashArray = "20.0, 10.0, 5.0, 10.0";
          833  +        break;
          834  +      default:
          835  +        dashArray = NULL;
          836  +        break;
          837  +    };
          838  +  if (dashArray != NULL)
          839  +    {
          840  +      xml =
          841  +        sqlite3_mprintf
          842  +        ("%s%s\t\t<SvgParameter name=\"stroke-dasharray\">%s</SvgParameter>\r\n",
          843  +         prev, extra, dashArray);
          844  +      sqlite3_free(prev);
          845  +      prev = xml;
          846  +    }
          847  +  xml = sqlite3_mprintf("%s%s\t</Stroke>\r\n", prev, extra);
          848  +  sqlite3_free(prev);
          849  +  prev = xml;
          850  +  if (LinePerpendicularOffset != 0.0)
          851  +    {
          852  +      xml =
          853  +        sqlite3_mprintf
          854  +        ("%s%s\t<PerpendicularOffset>%1.2f</PerpendicularOffset>\r\n", prev,
          855  +         extra, LinePerpendicularOffset);
          856  +      sqlite3_free(prev);
          857  +      prev = xml;
          858  +    }
          859  +  xml = sqlite3_mprintf("%s%s</LineSymbolizer>\r\n", prev, extra);
          860  +  sqlite3_free(prev);
          861  +  return xml;
          862  +}
          863  +
          864  +char *QuickStyleObj::DoCreatePolygonSymbolizerXML(bool subordered)
          865  +{
          866  +//
          867  +// creating a Polygon Symbolizer XML Style
          868  +//
          869  +  const char *cstr;
          870  +  char *prev;
          871  +  const char *extra = "";
          872  +  char *xml = sqlite3_mprintf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
          873  +  prev = xml;
          874  +  if (subordered == true)
          875  +    {
          876  +      extra = "\t\t";
          877  +      sqlite3_free(xml);
          878  +      prev = (char *) "";
          879  +      xml = sqlite3_mprintf("%s%s<PolygonSymbolizer>\r\n", prev, extra);
          880  +  } else
          881  +    {
          882  +      xml = sqlite3_mprintf("%s<PolygonSymbolizer version=\"1.1.0\" ", prev);
          883  +      sqlite3_free(prev);
          884  +      prev = xml;
          885  +      xml =
          886  +        sqlite3_mprintf
          887  +        ("%sxsi:schemaLocation=\"http://www.opengis.net/se http://schemas.opengis.net/se/1.1.0/Symbolizer.xsd\" ",
          888  +         prev);
          889  +      sqlite3_free(prev);
          890  +      prev = xml;
          891  +      xml = sqlite3_mprintf
          892  +        ("%sxmlns=\"http://www.opengis.net/se\" xmlns:ogc=\"http://www.opengis.net/ogc\" ",
          893  +         prev);
          894  +      sqlite3_free(prev);
          895  +      prev = xml;
          896  +      xml =
          897  +        sqlite3_mprintf("%sxmlns:xlink=\"http://www.w3.org/1999/xlink\" ",
          898  +                        prev);
          899  +      sqlite3_free(prev);
          900  +      prev = xml;
          901  +      cstr = "http://www.opengeospatial.org/se/units/pixel";
          902  +      xml =
          903  +        sqlite3_mprintf
          904  +        ("%sxmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" uom=\"%s\">\r\n",
          905  +         prev, cstr);
          906  +      sqlite3_free(prev);
          907  +    }
          908  +  prev = xml;
          909  +  if (subordered != true)
          910  +    {
          911  +      xml = sqlite3_mprintf("%s\t<Name>%s</Name>\r\n", prev, UUID);
          912  +      sqlite3_free(prev);
          913  +      prev = xml;
          914  +      xml = sqlite3_mprintf("%s\t<Description>\r\n", prev);
          915  +      sqlite3_free(prev);
          916  +      prev = xml;
          917  +      xml =
          918  +        sqlite3_mprintf("%s\t\t<Title>%s</Title>\r\n", prev,
          919  +                        "Quick Style - Polygon Symbolizer");
          920  +      sqlite3_free(prev);
          921  +      prev = xml;
          922  +      xml =
          923  +        sqlite3_mprintf("%s\t\t<Abstract>%s</Abstract>\r\n", prev,
          924  +                        "Created by SpatialiteGUI");
          925  +      sqlite3_free(prev);
          926  +      prev = xml;
          927  +      xml = sqlite3_mprintf("%s\t</Description>\r\n", prev);
          928  +      sqlite3_free(prev);
          929  +      prev = xml;
          930  +    }
          931  +  if (PolygonFill == true)
          932  +    {
          933  +      // Polygon Fill
          934  +      xml = sqlite3_mprintf("%s%s\t<Fill>\r\n", prev, extra);
          935  +      sqlite3_free(prev);
          936  +      prev = xml;
          937  +      // using a Solid Color
          938  +      xml =
          939  +        sqlite3_mprintf
          940  +        ("%s%s\t\t<SvgParameter name=\"fill\">%s</SvgParameter>\r\n", prev,
          941  +         extra, PolygonFillColor);
          942  +      sqlite3_free(prev);
          943  +      prev = xml;
          944  +      xml =
          945  +        sqlite3_mprintf
          946  +        ("%s%s\t\t<SvgParameter name=\"fill-opacity\">%1.2f</SvgParameter>\r\n",
          947  +         prev, extra, PolygonFillOpacity);
          948  +      sqlite3_free(prev);
          949  +      prev = xml;
          950  +      xml = sqlite3_mprintf("%s%s\t</Fill>\r\n", prev, extra);
          951  +      sqlite3_free(prev);
          952  +      prev = xml;
          953  +    }
          954  +  if (PolygonStroke == true)
          955  +    {
          956  +      // Polygon Stroke
          957  +      xml = sqlite3_mprintf("%s%s\t<Stroke>\r\n", prev, extra);
          958  +      sqlite3_free(prev);
          959  +      prev = xml;
          960  +      // using a Solid Color
          961  +      xml =
          962  +        sqlite3_mprintf
          963  +        ("%s%s\t\t<SvgParameter name=\"stroke\">%s</SvgParameter>\r\n", prev,
          964  +         extra, PolygonStrokeColor);
          965  +      sqlite3_free(prev);
          966  +      prev = xml;
          967  +      xml =
          968  +        sqlite3_mprintf
          969  +        ("%s%s\t\t<SvgParameter name=\"stroke-opacity\">%1.2f</SvgParameter>\r\n",
          970  +         prev, extra, PolygonStrokeOpacity);
          971  +      sqlite3_free(prev);
          972  +      prev = xml;
          973  +      xml =
          974  +        sqlite3_mprintf
          975  +        ("%s%s\t\t<SvgParameter name=\"stroke-width\">%1.2f</SvgParameter>\r\n",
          976  +         prev, extra, PolygonStrokeWidth);
          977  +      sqlite3_free(prev);
          978  +      prev = xml;
          979  +      xml =
          980  +        sqlite3_mprintf
          981  +        ("%s%s\t\t<SvgParameter name=\"stroke-linejoin\">round</SvgParameter>\r\n",
          982  +         prev, extra);
          983  +      sqlite3_free(prev);
          984  +      prev = xml;
          985  +      xml =
          986  +        sqlite3_mprintf
          987  +        ("%s%s\t\t<SvgParameter name=\"stroke-linecap\">round</SvgParameter>\r\n",
          988  +         prev, extra);
          989  +      sqlite3_free(prev);
          990  +      prev = xml;
          991  +      xml = sqlite3_mprintf("%s%s\t</Stroke>\r\n", prev, extra);
          992  +      sqlite3_free(prev);
          993  +      prev = xml;
          994  +    }
          995  +  if (PolygonDisplacementX != 0.0 || PolygonDisplacementY != 0.0)
          996  +    {
          997  +      xml = sqlite3_mprintf("%s%s\t<Displacement>\r\n", prev, extra);
          998  +      sqlite3_free(prev);
          999  +      prev = xml;
         1000  +      xml =
         1001  +        sqlite3_mprintf("%s%s\t\t<DisplacementX>%1.4f</DisplacementX>\r\n",
         1002  +                        prev, extra, PolygonDisplacementX);
         1003  +      sqlite3_free(prev);
         1004  +      prev = xml;
         1005  +      xml =
         1006  +        sqlite3_mprintf("%s%s\t\t<DisplacementY>%1.4f</DisplacementY>\r\n",
         1007  +                        prev, extra, PolygonDisplacementY);
         1008  +      sqlite3_free(prev);
         1009  +      prev = xml;
         1010  +      xml = sqlite3_mprintf("%s%s\t</Displacement>\r\n", prev, extra);
         1011  +      sqlite3_free(prev);
         1012  +      prev = xml;
         1013  +    }
         1014  +  if (PolygonPerpendicularOffset != 0.0)
         1015  +    {
         1016  +      xml =
         1017  +        sqlite3_mprintf
         1018  +        ("%s%s\t<PerpendicularOffset>%1.4f</PerpendicularOffset>\r\n", prev,
         1019  +         extra, PolygonPerpendicularOffset);
         1020  +      sqlite3_free(prev);
         1021  +      prev = xml;
         1022  +    }
         1023  +  xml = sqlite3_mprintf("%s%s</PolygonSymbolizer>\r\n", prev, extra);
         1024  +  sqlite3_free(prev);
         1025  +  return xml;
         1026  +}
         1027  +
         1028  +char *QuickStyleObj::DoCreateTextPointSymbolizerXML()
         1029  +{
         1030  +//
         1031  +// creating a Text Symbolizer (Point Placement)
         1032  +//
         1033  +  const char *cstr;
         1034  +  char *xml;
         1035  +  char *prev;
         1036  +  xml = sqlite3_mprintf("\t\t<TextSymbolizer>\r\n");
         1037  +  prev = xml;
         1038  +  xml = sqlite3_mprintf("%s\t\t\t<Label>%s</Label>\r\n", prev, LabelColumn);
         1039  +  sqlite3_free(prev);
         1040  +  prev = xml;
         1041  +  xml = sqlite3_mprintf("%s\t\t\t<Font>\r\n", prev);
         1042  +  sqlite3_free(prev);
         1043  +  prev = xml;
         1044  +  xml =
         1045  +    sqlite3_mprintf
         1046  +    ("%s\t\t\t\t<SvgParameter name=\"font-family\">%s</SvgParameter>\r\n", prev,
         1047  +     FontFacename);
         1048  +  sqlite3_free(prev);
         1049  +  prev = xml;
         1050  +  if (FontStyle == RL2_FONTSTYLE_ITALIC)
         1051  +    xml =
         1052  +      sqlite3_mprintf
         1053  +      ("%s\t\t\t\t<SvgParameter name=\"font-style\">italic</SvgParameter>\r\n",
         1054  +       prev);
         1055  +  else if (FontStyle == RL2_FONTSTYLE_OBLIQUE)
         1056  +    xml =
         1057  +      sqlite3_mprintf
         1058  +      ("%s\t\t\t\t<SvgParameter name=\"font-style\">oblique</SvgParameter>\r\n",
         1059  +       prev);
         1060  +  else
         1061  +    xml =
         1062  +      sqlite3_mprintf
         1063  +      ("%s\t\t\t\t<SvgParameter name=\"font-style\">normal</SvgParameter>\r\n",
         1064  +       prev);
         1065  +  sqlite3_free(prev);
         1066  +  prev = xml;
         1067  +  if (FontWeight == RL2_FONTWEIGHT_BOLD)
         1068  +    xml =
         1069  +      sqlite3_mprintf
         1070  +      ("%s\t\t\t\t<SvgParameter name=\"font-weight\">bold</SvgParameter>\r\n",
         1071  +       prev);
         1072  +  else
         1073  +    xml =
         1074  +      sqlite3_mprintf
         1075  +      ("%s\t\t\t\t<SvgParameter name=\"font-weight\">normal</SvgParameter>\r\n",
         1076  +       prev);
         1077  +  sqlite3_free(prev);
         1078  +  prev = xml;
         1079  +  xml =
         1080  +    sqlite3_mprintf
         1081  +    ("%s\t\t\t\t<SvgParameter name=\"font-size\">%1.2f</SvgParameter>\r\n",
         1082  +     prev, FontSize);
         1083  +  sqlite3_free(prev);
         1084  +  prev = xml;
         1085  +  xml = sqlite3_mprintf("%s\t\t\t</Font>\r\n", prev);
         1086  +  sqlite3_free(prev);
         1087  +  prev = xml;
         1088  +  xml = sqlite3_mprintf("%s\t\t\t<LabelPlacement>\n", prev);
         1089  +  sqlite3_free(prev);
         1090  +  prev = xml;
         1091  +// PointPlacement
         1092  +  xml = sqlite3_mprintf("%s\t\t\t\t<PointPlacement>\n", prev);
         1093  +  sqlite3_free(prev);
         1094  +  prev = xml;
         1095  +  if (LabelAnchorX != 0.5 || LabelAnchorY != 0.5)
         1096  +    {
         1097  +      xml = sqlite3_mprintf("%s\t\t\t\t\t<AnchorPoint>\r\n", prev);
         1098  +      sqlite3_free(prev);
         1099  +      prev = xml;
         1100  +      xml =
         1101  +        sqlite3_mprintf
         1102  +        ("%s\t\t\t\t\t\t<AnchorPointX>%1.4f</AnchorPointX>\r\n", prev,
         1103  +         LabelAnchorX);
         1104  +      sqlite3_free(prev);
         1105  +      prev = xml;
         1106  +      xml =
         1107  +        sqlite3_mprintf
         1108  +        ("%s\t\t\t\t\t\t<AnchorPointY>%1.4f</AnchorPointY>\r\n", prev,
         1109  +         LabelAnchorY);
         1110  +      sqlite3_free(prev);
         1111  +      prev = xml;
         1112  +      xml = sqlite3_mprintf("%s\t\t\t\t\t</AnchorPoint>\r\n", prev);
         1113  +      sqlite3_free(prev);
         1114  +      prev = xml;
         1115  +    }
         1116  +  if (LabelDisplacementX != 0.0 || LabelDisplacementY != 0.0)
         1117  +    {
         1118  +      xml = sqlite3_mprintf("%s\t\t\t\t\t<Displacement>\r\n", prev);
         1119  +      sqlite3_free(prev);
         1120  +      prev = xml;
         1121  +      xml =
         1122  +        sqlite3_mprintf
         1123  +        ("%s\t\t\t\t\t\t<DisplacementX>%1.4f</DisplacementX>\r\n", prev,
         1124  +         LabelDisplacementX);
         1125  +      sqlite3_free(prev);
         1126  +      prev = xml;
         1127  +      xml =
         1128  +        sqlite3_mprintf
         1129  +        ("%s\t\t\t\t\t\t<DisplacementY>%1.4f</DisplacementY>\r\n", prev,
         1130  +         LabelDisplacementY);
         1131  +      sqlite3_free(prev);
         1132  +      prev = xml;
         1133  +      xml = sqlite3_mprintf("%s\t\t\t\t\t</Displacement>\r\n", prev);
         1134  +      sqlite3_free(prev);
         1135  +      prev = xml;
         1136  +    }
         1137  +  if (LabelRotation != 0.0)
         1138  +    {
         1139  +      xml =
         1140  +        sqlite3_mprintf
         1141  +        ("%s\t\t\t\t\t<Rotation>%1.2f</Rotation>\r\n", prev, LabelRotation);
         1142  +      sqlite3_free(prev);
         1143  +      prev = xml;
         1144  +    }
         1145  +  xml = sqlite3_mprintf("%s\t\t\t\t</PointPlacement>\r\n", prev);
         1146  +  sqlite3_free(prev);
         1147  +  prev = xml;
         1148  +  xml = sqlite3_mprintf("%s\t\t\t</LabelPlacement>\r\n", prev);
         1149  +  sqlite3_free(prev);
         1150  +  prev = xml;
         1151  +  if (HasHalo == true)
         1152  +    {
         1153  +      // Halo
         1154  +      xml = sqlite3_mprintf("%s\t\t\t<Halo>\r\n", prev);
         1155  +      sqlite3_free(prev);
         1156  +      prev = xml;
         1157  +      xml =
         1158  +        sqlite3_mprintf("%s\t\t\t\t<Radius>%1.2f</Radius>\r\n", prev,
         1159  +                        HaloRadius);
         1160  +      sqlite3_free(prev);
         1161  +      prev = xml;
         1162  +      xml = sqlite3_mprintf("%s\t\t\t\t<Fill>\r\n", prev);
         1163  +      sqlite3_free(prev);
         1164  +      prev = xml;
         1165  +      xml =
         1166  +        sqlite3_mprintf
         1167  +        ("%s\t\t\t\t\t<SvgParameter name=\"fill\">%s</SvgParameter>\r\n",
         1168  +         prev, HaloColor);
         1169  +      sqlite3_free(prev);
         1170  +      prev = xml;
         1171  +      xml =
         1172  +        sqlite3_mprintf
         1173  +        ("%s\t\t\t\t\t<SvgParameter name=\"fill-opacity\">%1.2f</SvgParameter>\r\n",
         1174  +         prev, HaloOpacity);
         1175  +      sqlite3_free(prev);
         1176  +      prev = xml;
         1177  +      xml = sqlite3_mprintf("%s\t\t\t\t</Fill>\r\n", prev);
         1178  +      sqlite3_free(prev);
         1179  +      prev = xml;
         1180  +      xml = sqlite3_mprintf("%s\t\t\t</Halo>\r\n", prev);
         1181  +      sqlite3_free(prev);
         1182  +      prev = xml;
         1183  +    }
         1184  +  xml = sqlite3_mprintf("%s\t\t\t<Fill>\r\n", prev);
         1185  +  sqlite3_free(prev);
         1186  +  prev = xml;
         1187  +  xml =
         1188  +    sqlite3_mprintf
         1189  +    ("%s\t\t\t\t<SvgParameter name=\"fill\">%s</SvgParameter>\r\n", prev,
         1190  +     FontColor);
         1191  +  sqlite3_free(prev);
         1192  +  prev = xml;
         1193  +  xml =
         1194  +    sqlite3_mprintf
         1195  +    ("%s\t\t\t\t<SvgParameter name=\"fill-opacity\">%1.2f</SvgParameter>\r\n",
         1196  +     prev, FontOpacity);
         1197  +  sqlite3_free(prev);
         1198  +  prev = xml;
         1199  +  xml = sqlite3_mprintf("%s\t\t\t</Fill>\r\n", prev);
         1200  +  sqlite3_free(prev);
         1201  +  prev = xml;
         1202  +  xml = sqlite3_mprintf("%s\t\t</TextSymbolizer>\r\n", prev);
         1203  +  sqlite3_free(prev);
         1204  +  return xml;
         1205  +}
         1206  +
         1207  +char *QuickStyleObj::DoCreateTextLineSymbolizerXML()
         1208  +{
         1209  +//
         1210  +// creating a Text Symbolizer (Line Placement)
         1211  +//
         1212  +  const char *cstr;
         1213  +  char *xml;
         1214  +  char *prev;
         1215  +  xml = sqlite3_mprintf("\t\t<TextSymbolizer>\r\n");
         1216  +  prev = xml;
         1217  +  xml = sqlite3_mprintf("%s\t\t\t<Label>%s</Label>\r\n", prev, LabelColumn);
         1218  +  sqlite3_free(prev);
         1219  +  prev = xml;
         1220  +  xml = sqlite3_mprintf("%s\t\t\t<Font>\r\n", prev);
         1221  +  sqlite3_free(prev);
         1222  +  prev = xml;
         1223  +  xml =
         1224  +    sqlite3_mprintf
         1225  +    ("%s\t\t\t\t<SvgParameter name=\"font-family\">%s</SvgParameter>\r\n", prev,
         1226  +     FontFacename);
         1227  +  sqlite3_free(prev);
         1228  +  prev = xml;
         1229  +  if (FontStyle == RL2_FONTSTYLE_ITALIC)
         1230  +    xml =
         1231  +      sqlite3_mprintf
         1232  +      ("%s\t\t\t\t<SvgParameter name=\"font-style\">italic</SvgParameter>\r\n",
         1233  +       prev);
         1234  +  else if (FontStyle == RL2_FONTSTYLE_OBLIQUE)
         1235  +    xml =
         1236  +      sqlite3_mprintf
         1237  +      ("%s\t\t\t\t<SvgParameter name=\"font-style\">oblique</SvgParameter>\r\n",
         1238  +       prev);
         1239  +  else
         1240  +    xml =
         1241  +      sqlite3_mprintf
         1242  +      ("%s\t\t\t\t<SvgParameter name=\"font-style\">normal</SvgParameter>\r\n",
         1243  +       prev);
         1244  +  sqlite3_free(prev);
         1245  +  prev = xml;
         1246  +  if (FontWeight == RL2_FONTWEIGHT_BOLD)
         1247  +    xml =
         1248  +      sqlite3_mprintf
         1249  +      ("%s\t\t\t\t<SvgParameter name=\"font-weight\">bold</SvgParameter>\r\n",
         1250  +       prev);
         1251  +  else
         1252  +    xml =
         1253  +      sqlite3_mprintf
         1254  +      ("%s\t\t\t\t<SvgParameter name=\"font-weight\">normal</SvgParameter>\r\n",
         1255  +       prev);
         1256  +  sqlite3_free(prev);
         1257  +  prev = xml;
         1258  +  xml =
         1259  +    sqlite3_mprintf
         1260  +    ("%s\t\t\t\t<SvgParameter name=\"font-size\">%1.2f</SvgParameter>\r\n",
         1261  +     prev, FontSize);
         1262  +  sqlite3_free(prev);
         1263  +  prev = xml;
         1264  +  xml = sqlite3_mprintf("%s%s\t\t\t</Font>\r\n", prev);
         1265  +  sqlite3_free(prev);
         1266  +  prev = xml;
         1267  +  xml = sqlite3_mprintf("%s\t\t\t<LabelPlacement>\n", prev);
         1268  +  sqlite3_free(prev);
         1269  +  prev = xml;
         1270  +// LinePlacement
         1271  +  xml = sqlite3_mprintf("%s\t\t\t\t<LinePlacement>\n", prev);
         1272  +  sqlite3_free(prev);
         1273  +  prev = xml;
         1274  +  if (LabelPerpendicularOffset != 0.0)
         1275  +    {
         1276  +      xml =
         1277  +        sqlite3_mprintf
         1278  +        ("%s\t\t\t\t\t<PerpendicularOffset>%1.4f</PerpendicularOffset>\r\n",
         1279  +         prev, LabelPerpendicularOffset);
         1280  +      sqlite3_free(prev);
         1281  +      prev = xml;
         1282  +    }
         1283  +  if (RepeatedLabel == true)
         1284  +    {
         1285  +      // Repeated: InitialGap and Gap
         1286  +      xml =
         1287  +        sqlite3_mprintf("%s\t\t\t\t\t<IsRepeated>true</IsRepeated>\r\n", prev);
         1288  +      sqlite3_free(prev);
         1289  +      prev = xml;
         1290  +      xml =
         1291  +        sqlite3_mprintf
         1292  +        ("%s\t\t\t\t\t<InitialGap>%1.4f</InitialGap>\r\n", prev,
         1293  +         LabelInitialGap);
         1294  +      sqlite3_free(prev);
         1295  +      prev = xml;
         1296  +      xml = sqlite3_mprintf("%s\t\t\t\t\t<Gap>%1.4f</Gap>\r\n", prev, LabelGap);
         1297  +      sqlite3_free(prev);
         1298  +      prev = xml;
         1299  +    }
         1300  +  if (LabelIsAligned == true)
         1301  +    {
         1302  +      xml =
         1303  +        sqlite3_mprintf("%s\t\t\t\t\t<IsAligned>true</IsAligned>\r\n", prev);
         1304  +      sqlite3_free(prev);
         1305  +      prev = xml;
         1306  +    }
         1307  +  if (LabelGeneralizeLine == true)
         1308  +    {
         1309  +      xml =
         1310  +        sqlite3_mprintf
         1311  +        ("%s\t\t\t\t\t<GeneralizeLine>true</GeneralizeLine>\r\n", prev);
         1312  +      sqlite3_free(prev);
         1313  +      prev = xml;
         1314  +    }
         1315  +  xml = sqlite3_mprintf("%s\t\t\t\t</LinePlacement>\r\n", prev);
         1316  +  sqlite3_free(prev);
         1317  +  prev = xml;
         1318  +  xml = sqlite3_mprintf("%s\t\t\t</LabelPlacement>\r\n", prev);
         1319  +  sqlite3_free(prev);
         1320  +  prev = xml;
         1321  +  if (HasHalo == true)
         1322  +    {
         1323  +      // Halo
         1324  +      xml = sqlite3_mprintf("%s\t\t\t<Halo>\r\n", prev);
         1325  +      sqlite3_free(prev);
         1326  +      prev = xml;
         1327  +      xml =
         1328  +        sqlite3_mprintf("%s\t\t\t\t<Radius>%1.2f</Radius>\r\n", prev,
         1329  +                        HaloRadius);
         1330  +      sqlite3_free(prev);
         1331  +      prev = xml;
         1332  +      xml = sqlite3_mprintf("%s\t\t\t\t<Fill>\r\n", prev);
         1333  +      sqlite3_free(prev);
         1334  +      prev = xml;
         1335  +      xml =
         1336  +        sqlite3_mprintf
         1337  +        ("%s\t\t\t\t\t<SvgParameter name=\"fill\">%s</SvgParameter>\r\n",
         1338  +         prev, HaloColor);
         1339  +      sqlite3_free(prev);
         1340  +      prev = xml;
         1341  +      xml =
         1342  +        sqlite3_mprintf
         1343  +        ("%s\t\t\t\t\t<SvgParameter name=\"fill-opacity\">%1.2f</SvgParameter>\r\n",
         1344  +         prev, HaloOpacity);
         1345  +      sqlite3_free(prev);
         1346  +      prev = xml;
         1347  +      xml = sqlite3_mprintf("%s\t\t\t\t</Fill>\r\n", prev);
         1348  +      sqlite3_free(prev);
         1349  +      prev = xml;
         1350  +      xml = sqlite3_mprintf("%s\t\t\t</Halo>\r\n", prev);
         1351  +      sqlite3_free(prev);
         1352  +      prev = xml;
         1353  +    }
         1354  +  xml = sqlite3_mprintf("%s\t\t\t<Fill>\r\n", prev);
         1355  +  sqlite3_free(prev);
         1356  +  prev = xml;
         1357  +  xml =
         1358  +    sqlite3_mprintf
         1359  +    ("%s\t\t\t\t<SvgParameter name=\"fill\">%s</SvgParameter>\r\n", prev,
         1360  +     FontColor);
         1361  +  sqlite3_free(prev);
         1362  +  prev = xml;
         1363  +  xml =
         1364  +    sqlite3_mprintf
         1365  +    ("%s\t\t\t\t<SvgParameter name=\"fill-opacity\">%1.2f</SvgParameter>\r\n",
         1366  +     prev, FontOpacity);
         1367  +  sqlite3_free(prev);
         1368  +  prev = xml;
         1369  +  xml = sqlite3_mprintf("%s\t\t\t</Fill>\r\n", prev);
         1370  +  sqlite3_free(prev);
         1371  +  prev = xml;
         1372  +  xml = sqlite3_mprintf("%s\t\t</TextSymbolizer>\r\n", prev);
         1373  +  sqlite3_free(prev);
         1374  +  return xml;
         1375  +}
         1376  +
         1377  +const unsigned char *QuickStyleObj::CloneXmlStyle()
         1378  +{
         1379  +//
         1380  +// cloning the XML Style definition
         1381  +//
         1382  +  if (XmlStyle == NULL)
         1383  +    XmlStyle = CreateXmlStyle();
         1384  +  if (XmlStyle == NULL)
         1385  +    return NULL;
         1386  +  int len = strlen(XmlStyle);
         1387  +  char *cloned = (char *) malloc(len + 1);
         1388  +  strcpy(cloned, XmlStyle);
         1389  +  return (const unsigned char *) cloned;
         1390  +}
         1391  +
         1392  +void QuickStyleObj::DoGetUUID(char *uuid)
         1393  +{
         1394  +//
         1395  +// creating an UUID value
         1396  +//
         1397  +  unsigned char rnd[16];
         1398  +  char *p = uuid;
         1399  +  int i;
         1400  +  sqlite3_randomness(16, rnd);
         1401  +  for (i = 0; i < 16; i++)
         1402  +    {
         1403  +      if (i == 4 || i == 6 || i == 8 || i == 10)
         1404  +        *p++ = '-';
         1405  +      sprintf(p, "%02x", rnd[i]);
         1406  +      p += 2;
         1407  +    }
         1408  +  *p = '\0';
         1409  +  uuid[14] = '4';
         1410  +  uuid[19] = '8';
         1411  +}
         1412  +
         1413  +int QuickStyleObj::RandomWellKnownMark()
         1414  +{
         1415  +//
         1416  +// returning a random Symbol Well Known Mark
         1417  +//
         1418  +  int wkt;
         1419  +  int mod = rand() % 6;
         1420  +  switch (mod)
         1421  +    {
         1422  +      case 0:
         1423  +        wkt = RL2_GRAPHIC_MARK_SQUARE;
         1424  +        break;
         1425  +      case 1:
         1426  +        wkt = RL2_GRAPHIC_MARK_CIRCLE;
         1427  +        break;
         1428  +      case 2:
         1429  +        wkt = RL2_GRAPHIC_MARK_TRIANGLE;
         1430  +        break;
         1431  +      case 3:
         1432  +        wkt = RL2_GRAPHIC_MARK_STAR;
         1433  +        break;
         1434  +      case 4:
         1435  +        wkt = RL2_GRAPHIC_MARK_CROSS;
         1436  +        break;
         1437  +      default:
         1438  +        wkt = RL2_GRAPHIC_MARK_X;
         1439  +        break;
         1440  +    };
         1441  +  return wkt;
         1442  +}
         1443  +
         1444  +void QuickStyleObj::RandomColor(char *color)
         1445  +{
         1446  +//
         1447  +// setting a random Color
         1448  +//
         1449  +  unsigned char red = rand() % 256;
         1450  +  unsigned char green = rand() % 256;
         1451  +  unsigned char blue = rand() % 256;
         1452  +  sprintf(color, "#%02x%02x%02x", red, green, blue);
         1453  +}
         1454  +
         1455  +QuickStyleTopologyObj::QuickStyleTopologyObj(int type)
         1456  +{
         1457  +// ctor
         1458  +  QuickStyleObj::DoGetUUID(UUID);
         1459  +  Type = type;
         1460  +  MinScaleEnabled = false;
         1461  +  MaxScaleEnabled = false;
         1462  +  ScaleMin = 0.0;
         1463  +  ScaleMax = 0.0;
         1464  +  NodeOpacity = 1.0;
         1465  +  NodeSize = 16;
         1466  +  NodeRotation = 0.0;
         1467  +  NodeAnchorX = 0.5;
         1468  +  NodeAnchorY = 0.5;
         1469  +  NodeDisplacementX = 0.0;
         1470  +  NodeDisplacementY = 0.0;
         1471  +  NodeWellKnownMark = QuickStyleObj::RandomWellKnownMark();
         1472  +  QuickStyleObj::RandomColor(NodeFillColor);
         1473  +  QuickStyleObj::RandomColor(NodeStrokeColor);
         1474  +  EdgeLinkOpacity = 1.0;
         1475  +  EdgeLinkPerpendicularOffset = 0.0;
         1476  +  EdgeLinkStrokeWidth = 1.0;
         1477  +  QuickStyleObj::RandomColor(EdgeLinkStrokeColor);
         1478  +  EdgeLinkDotStyle = QUICK_STYLE_SOLID_LINE;
         1479  +  FaceFill = true;
         1480  +  FaceStroke = true;
         1481  +  FaceDisplacementX = 0.0;
         1482  +  FaceDisplacementY = 0.0;
         1483  +  FacePerpendicularOffset = 0.0;
         1484  +  FaceFillOpacity = 1.0;
         1485  +  QuickStyleObj::RandomColor(FaceFillColor);
         1486  +  FaceStrokeOpacity = 1.0;
         1487  +  FaceStrokeWidth = 1.0;
         1488  +  QuickStyleObj::RandomColor(FaceStrokeColor);
         1489  +  EdgeLinkSeedOpacity = 1.0;
         1490  +  EdgeLinkSeedSize = 16;
         1491  +  EdgeLinkSeedRotation = 0.0;
         1492  +  EdgeLinkSeedAnchorX = 0.5;
         1493  +  EdgeLinkSeedAnchorY = 0.5;
         1494  +  EdgeLinkSeedDisplacementX = 0.0;
         1495  +  EdgeLinkSeedDisplacementY = 0.0;
         1496  +  EdgeLinkSeedWellKnownMark = QuickStyleObj::RandomWellKnownMark();
         1497  +  QuickStyleObj::RandomColor(EdgeLinkSeedFillColor);
         1498  +  QuickStyleObj::RandomColor(EdgeLinkSeedStrokeColor);
         1499  +  FaceSeedOpacity = 1.0;
         1500  +  FaceSeedSize = 16;
         1501  +  FaceSeedRotation = 0.0;
         1502  +  FaceSeedAnchorX = 0.5;
         1503  +  FaceSeedAnchorY = 0.5;
         1504  +  FaceSeedDisplacementX = 0.0;
         1505  +  FaceSeedDisplacementY = 0.0;
         1506  +  FaceSeedWellKnownMark = QuickStyleObj::RandomWellKnownMark();
         1507  +  QuickStyleObj::RandomColor(FaceSeedFillColor);
         1508  +  QuickStyleObj::RandomColor(FaceSeedStrokeColor);
         1509  +  XmlStyle = NULL;
         1510  +}
         1511  +
         1512  +QuickStyleTopologyObj *QuickStyleTopologyObj::Clone()
         1513  +{
         1514  +//
         1515  +// cloning a Quick Style Topology
         1516  +//
         1517  +  QuickStyleTopologyObj *Style = new QuickStyleTopologyObj(this->Type);
         1518  +  strcpy(Style->UUID, this->UUID);
         1519  +  Style->MinScaleEnabled = this->MinScaleEnabled;
         1520  +  Style->MaxScaleEnabled = this->MaxScaleEnabled;
         1521  +  Style->ScaleMin = this->ScaleMin;
         1522  +  Style->ScaleMax = this->ScaleMax;
         1523  +  Style->NodeOpacity = this->NodeOpacity;
         1524  +  Style->NodeSize = this->NodeSize;
         1525  +  Style->NodeRotation = this->NodeRotation;
         1526  +  Style->NodeAnchorX = this->NodeAnchorX;
         1527  +  Style->NodeAnchorY = this->NodeAnchorY;
         1528  +  Style->NodeDisplacementX = this->NodeDisplacementX;
         1529  +  Style->NodeDisplacementY = this->NodeDisplacementY;
         1530  +  Style->NodeWellKnownMark = this->NodeWellKnownMark;
         1531  +  strcpy(Style->NodeFillColor, this->NodeFillColor);
         1532  +  strcpy(Style->NodeStrokeColor, this->NodeStrokeColor);
         1533  +  Style->EdgeLinkOpacity = this->EdgeLinkOpacity;
         1534  +  Style->EdgeLinkPerpendicularOffset = this->EdgeLinkPerpendicularOffset;
         1535  +  Style->EdgeLinkStrokeWidth = this->EdgeLinkStrokeWidth;
         1536  +  strcpy(Style->EdgeLinkStrokeColor, this->EdgeLinkStrokeColor);
         1537  +  Style->EdgeLinkDotStyle = this->EdgeLinkDotStyle;
         1538  +  Style->FaceFill = this->FaceFill;
         1539  +  Style->FaceStroke = this->FaceStroke;
         1540  +  Style->FaceDisplacementX = this->FaceDisplacementX;
         1541  +  Style->FaceDisplacementY = this->FaceDisplacementY;
         1542  +  Style->FacePerpendicularOffset = this->FacePerpendicularOffset;
         1543  +  Style->FaceFillOpacity = this->FaceFillOpacity;
         1544  +  strcpy(Style->FaceFillColor, this->FaceFillColor);
         1545  +  Style->FaceStrokeOpacity = this->FaceStrokeOpacity;
         1546  +  Style->FaceStrokeWidth = this->FaceStrokeWidth;
         1547  +  strcpy(Style->FaceStrokeColor, this->FaceStrokeColor);
         1548  +  Style->EdgeLinkSeedOpacity = this->EdgeLinkSeedOpacity;
         1549  +  Style->EdgeLinkSeedSize = this->EdgeLinkSeedSize;
         1550  +  Style->EdgeLinkSeedRotation = this->EdgeLinkSeedRotation;
         1551  +  Style->EdgeLinkSeedAnchorX = this->EdgeLinkSeedAnchorX;
         1552  +  Style->EdgeLinkSeedAnchorY = this->EdgeLinkSeedAnchorY;
         1553  +  Style->EdgeLinkSeedDisplacementX = this->EdgeLinkSeedDisplacementX;
         1554  +  Style->EdgeLinkSeedDisplacementY = this->EdgeLinkSeedDisplacementY;
         1555  +  Style->EdgeLinkSeedWellKnownMark = this->EdgeLinkSeedWellKnownMark;
         1556  +  strcpy(Style->EdgeLinkSeedFillColor, this->EdgeLinkSeedFillColor);
         1557  +  strcpy(Style->EdgeLinkSeedStrokeColor, this->EdgeLinkSeedStrokeColor);
         1558  +  Style->FaceSeedOpacity = this->FaceSeedOpacity;
         1559  +  Style->FaceSeedSize = this->FaceSeedSize;
         1560  +  Style->FaceSeedRotation = this->FaceSeedRotation;
         1561  +  Style->FaceSeedAnchorX = this->FaceSeedAnchorX;
         1562  +  Style->FaceSeedAnchorY = this->FaceSeedAnchorY;
         1563  +  Style->FaceSeedDisplacementX = this->FaceSeedDisplacementX;
         1564  +  Style->FaceSeedDisplacementY = this->FaceSeedDisplacementY;
         1565  +  Style->FaceSeedWellKnownMark = this->FaceSeedWellKnownMark;
         1566  +  strcpy(Style->FaceSeedFillColor, this->FaceSeedFillColor);
         1567  +  strcpy(Style->FaceSeedStrokeColor, this->FaceSeedStrokeColor);
         1568  +  Style->XmlStyle = NULL;
         1569  +  return Style;
         1570  +}
         1571  +
         1572  +bool QuickStyleTopologyObj::Compare(QuickStyleTopologyObj * Style)
         1573  +{
         1574  +//
         1575  +// comparing two Quick Style objects (Topology)
         1576  +//
         1577  +  if (strcmp(Style->UUID, this->UUID) != 0)
         1578  +    return false;
         1579  +  if (Style->MinScaleEnabled != this->MinScaleEnabled)
         1580  +    return false;
         1581  +  if (Style->MaxScaleEnabled != this->MaxScaleEnabled)
         1582  +    return false;
         1583  +  if (Style->ScaleMin != this->ScaleMin)
         1584  +    return false;
         1585  +  if (Style->ScaleMax != this->ScaleMax)
         1586  +    return false;
         1587  +  if (Style->NodeOpacity != this->NodeOpacity)
         1588  +    return false;
         1589  +  if (Style->NodeSize != this->NodeSize)
         1590  +    return false;
         1591  +  if (Style->NodeRotation != this->NodeRotation)
         1592  +    return false;
         1593  +  if (Style->NodeAnchorX != this->NodeAnchorX)
         1594  +    return false;
         1595  +  if (Style->NodeAnchorY != this->NodeAnchorY)
         1596  +    return false;
         1597  +  if (Style->NodeDisplacementX != this->NodeDisplacementX)
         1598  +    return false;
         1599  +  if (Style->NodeDisplacementY != this->NodeDisplacementY)
         1600  +    return false;
         1601  +  if (Style->NodeWellKnownMark != this->NodeWellKnownMark)
         1602  +    return false;
         1603  +  if (strcmp(Style->NodeFillColor, this->NodeFillColor) != 0)
         1604  +    return false;
         1605  +  if (strcmp(Style->NodeStrokeColor, this->NodeStrokeColor) != 0)
         1606  +    return false;
         1607  +  if (Style->EdgeLinkOpacity != this->EdgeLinkOpacity)
         1608  +    return false;
         1609  +  if (Style->EdgeLinkPerpendicularOffset != this->EdgeLinkPerpendicularOffset)
         1610  +    return false;
         1611  +  if (Style->EdgeLinkStrokeWidth != this->EdgeLinkStrokeWidth)
         1612  +    return false;
         1613  +  if (strcmp(Style->EdgeLinkStrokeColor, this->EdgeLinkStrokeColor) != 0)
         1614  +    return false;
         1615  +  if (Style->EdgeLinkDotStyle != this->EdgeLinkDotStyle)
         1616  +    return false;
         1617  +  if (Style->FaceFill != this->FaceFill)
         1618  +    return false;
         1619  +  if (Style->FaceStroke != this->FaceStroke)
         1620  +    return false;
         1621  +  if (Style->FaceDisplacementX != this->FaceDisplacementX)
         1622  +    return false;
         1623  +  if (Style->FaceDisplacementY != this->FaceDisplacementY)
         1624  +    return false;
         1625  +  if (Style->FacePerpendicularOffset != this->FacePerpendicularOffset)
         1626  +    return false;
         1627  +  if (Style->FaceFillOpacity != this->FaceFillOpacity)
         1628  +    return false;
         1629  +  if (strcmp(Style->FaceFillColor, this->FaceFillColor) != 0)
         1630  +    return false;
         1631  +  if (Style->FaceStrokeOpacity != this->FaceStrokeOpacity)
         1632  +    return false;
         1633  +  if (Style->FaceStrokeWidth != this->FaceStrokeWidth)
         1634  +    return false;
         1635  +  if (strcmp(Style->FaceStrokeColor, this->FaceStrokeColor) != 0)
         1636  +    return false;
         1637  +  if (Style->EdgeLinkSeedOpacity != this->EdgeLinkSeedOpacity)
         1638  +    return false;
         1639  +  if (Style->EdgeLinkSeedSize != this->EdgeLinkSeedSize)
         1640  +    return false;
         1641  +  if (Style->EdgeLinkSeedRotation != this->EdgeLinkSeedRotation)
         1642  +    return false;
         1643  +  if (Style->EdgeLinkSeedAnchorX != this->EdgeLinkSeedAnchorX)
         1644  +    return false;
         1645  +  if (Style->EdgeLinkSeedAnchorY != this->EdgeLinkSeedAnchorY)
         1646  +    return false;
         1647  +  if (Style->EdgeLinkSeedDisplacementX != this->EdgeLinkSeedDisplacementX)
         1648  +    return false;
         1649  +  if (Style->EdgeLinkSeedDisplacementY != this->EdgeLinkSeedDisplacementY)
         1650  +    return false;
         1651  +  if (Style->EdgeLinkSeedWellKnownMark != this->EdgeLinkSeedWellKnownMark)
         1652  +    return false;
         1653  +  if (strcmp(Style->EdgeLinkSeedFillColor, this->EdgeLinkSeedFillColor) != 0)
         1654  +    return false;
         1655  +  if (strcmp(Style->EdgeLinkSeedStrokeColor, this->EdgeLinkSeedStrokeColor) !=
         1656  +      0)
         1657  +    return false;
         1658  +  if (Style->FaceSeedOpacity != this->FaceSeedOpacity)
         1659  +    return false;
         1660  +  if (Style->FaceSeedSize != this->FaceSeedSize)
         1661  +    return false;
         1662  +  if (Style->FaceSeedRotation != this->FaceSeedRotation)
         1663  +    return false;
         1664  +  if (Style->FaceSeedAnchorX != this->FaceSeedAnchorX)
         1665  +    return false;
         1666  +  if (Style->FaceSeedAnchorY != this->FaceSeedAnchorY)
         1667  +    return false;
         1668  +  if (Style->FaceSeedDisplacementX != this->FaceSeedDisplacementX)
         1669  +    return false;
         1670  +  if (Style->FaceSeedDisplacementY != this->FaceSeedDisplacementY)
         1671  +    return false;
         1672  +  if (Style->FaceSeedWellKnownMark != this->FaceSeedWellKnownMark)
         1673  +    return false;
         1674  +  if (strcmp(Style->FaceSeedFillColor, this->FaceSeedFillColor) != 0)
         1675  +    return false;
         1676  +  if (strcmp(Style->FaceSeedStrokeColor, this->FaceSeedStrokeColor) != 0)
         1677  +    return false;
         1678  +  return true;
         1679  +}
         1680  +
         1681  +void QuickStyleTopologyObj::UpdateXmlStyle()
         1682  +{
         1683  +//
         1684  +// updating the XML Style
         1685  +//
         1686  +  if (XmlStyle != NULL)
         1687  +    sqlite3_free(XmlStyle);
         1688  +  XmlStyle = CreateXmlStyle();
         1689  +}
         1690  +
         1691  +char *QuickStyleTopologyObj::CreateXmlStyle()
         1692  +{
         1693  +//
         1694  +// creating the XML Style
         1695  +//
         1696  +  const char *cstr;
         1697  +  char *prev;
         1698  +  char *xml2;
         1699  +  char *xml = sqlite3_mprintf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
         1700  +  prev = xml;
         1701  +  xml = sqlite3_mprintf("%s<FeatureTypeStyle version=\"1.1.0\" ", prev);
         1702  +  sqlite3_free(prev);
         1703  +  prev = xml;
         1704  +  xml =
         1705  +    sqlite3_mprintf
         1706  +    ("%sxsi:schemaLocation=\"http://www.opengis.net/se http://schemas.opengis.net/se/1.1.0/FeatureStyle.xsd\" ",
         1707  +     prev);
         1708  +  sqlite3_free(prev);
         1709  +  prev = xml;
         1710  +  xml = sqlite3_mprintf
         1711  +    ("%sxmlns=\"http://www.opengis.net/se\" xmlns:ogc=\"http://www.opengis.net/ogc\" ",
         1712  +     prev);
         1713  +  sqlite3_free(prev);
         1714  +  prev = xml;
         1715  +  xml =
         1716  +    sqlite3_mprintf("%sxmlns:xlink=\"http://www.w3.org/1999/xlink\" ", prev);
         1717  +  sqlite3_free(prev);
         1718  +  prev = xml;
         1719  +  xml =
         1720  +    sqlite3_mprintf
         1721  +    ("%sxmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\r\n", prev);
         1722  +  sqlite3_free(prev);
         1723  +  prev = xml;
         1724  +  xml = sqlite3_mprintf("%s\t<Name>%s</Name>\r\n", prev, UUID);
         1725  +  sqlite3_free(prev);
         1726  +  prev = xml;
         1727  +  xml = sqlite3_mprintf("%s\t<Description>\r\n", prev);
         1728  +  sqlite3_free(prev);
         1729  +  prev = xml;
         1730  +  xml =
         1731  +    sqlite3_mprintf("%s\t\t<Title>%s</Title>\r\n", prev,
         1732  +                    "Quick Style - Topology");
         1733  +  sqlite3_free(prev);
         1734  +  prev = xml;
         1735  +  xml =
         1736  +    sqlite3_mprintf("%s\t\t<Abstract>%s</Abstract>\r\n", prev,
         1737  +                    "Created by SpatialiteGUI");
         1738  +  sqlite3_free(prev);
         1739  +  prev = xml;
         1740  +  xml = sqlite3_mprintf("%s\t</Description>\r\n", prev);
         1741  +  sqlite3_free(prev);
         1742  +  prev = xml;
         1743  +  if (Type == MAP_LAYER_NETWORK)
         1744  +    {
         1745  +      // Links
         1746  +      xml2 = DoCreateEdgeLinkXML();
         1747  +      if (xml2 != NULL)
         1748  +        {
         1749  +          xml = sqlite3_mprintf("%s%s", prev, xml2);
         1750  +          sqlite3_free(prev);
         1751  +          sqlite3_free(xml2);
         1752  +          prev = xml;
         1753  +        }
         1754  +      // Nodes
         1755  +      xml2 = DoCreateNodeXML();
         1756  +      if (xml2 != NULL)
         1757  +        {
         1758  +          xml = sqlite3_mprintf("%s%s", prev, xml2);
         1759  +          sqlite3_free(prev);
         1760  +          sqlite3_free(xml2);
         1761  +          prev = xml;
         1762  +        }
         1763  +      // LinkSeeds
         1764  +      xml2 = DoCreateEdgeLinkSeedXML();
         1765  +      if (xml2 != NULL)
         1766  +        {
         1767  +          xml = sqlite3_mprintf("%s%s", prev, xml2);
         1768  +          sqlite3_free(prev);
         1769  +          sqlite3_free(xml2);
         1770  +          prev = xml;
         1771  +        }
         1772  +  } else
         1773  +    {
         1774  +      // Faces
         1775  +      xml2 = DoCreateFaceXML();
         1776  +      if (xml2 != NULL)
         1777  +        {
         1778  +          xml = sqlite3_mprintf("%s%s", prev, xml2);
         1779  +          sqlite3_free(prev);
         1780  +          sqlite3_free(xml2);
         1781  +          prev = xml;
         1782  +        }
         1783  +      // Edges
         1784  +      xml2 = DoCreateEdgeLinkXML();
         1785  +      if (xml2 != NULL)
         1786  +        {
         1787  +          xml = sqlite3_mprintf("%s%s", prev, xml2);
         1788  +          sqlite3_free(prev);
         1789  +          sqlite3_free(xml2);
         1790  +          prev = xml;
         1791  +        }
         1792  +      // Nodes
         1793  +      xml2 = DoCreateNodeXML();
         1794  +      if (xml2 != NULL)
         1795  +        {
         1796  +          xml = sqlite3_mprintf("%s%s", prev, xml2);
         1797  +          sqlite3_free(prev);
         1798  +          sqlite3_free(xml2);
         1799  +          prev = xml;
         1800  +        }
         1801  +      // EdgeSeeds
         1802  +      xml2 = DoCreateEdgeLinkSeedXML();
         1803  +      if (xml2 != NULL)
         1804  +        {
         1805  +          xml = sqlite3_mprintf("%s%s", prev, xml2);
         1806  +          sqlite3_free(prev);
         1807  +          sqlite3_free(xml2);
         1808  +          prev = xml;
         1809  +        }
         1810  +      // EdgeSeeds
         1811  +      xml2 = DoCreateFaceSeedXML();
         1812  +      if (xml2 != NULL)
         1813  +        {
         1814  +          xml = sqlite3_mprintf("%s%s", prev, xml2);
         1815  +          sqlite3_free(prev);
         1816  +          sqlite3_free(xml2);
         1817  +          prev = xml;
         1818  +        }
         1819  +    }
         1820  +  xml = sqlite3_mprintf("%s</FeatureTypeStyle>\r\n", prev);
         1821  +  sqlite3_free(prev);
         1822  +  return xml;
         1823  +}
         1824  +
         1825  +char *QuickStyleTopologyObj::DoCreateFaceXML()
         1826  +{
         1827  +//
         1828  +// creating the XML Style - Face
         1829  +//
         1830  +  const char *cstr;
         1831  +  char *prev;
         1832  +  char *xml = sqlite3_mprintf("\t<Rule>\r\n");
         1833  +  prev = xml;
         1834  +  if (MinScaleEnabled == true)
         1835  +    {
         1836  +      xml =
         1837  +        sqlite3_mprintf
         1838  +        ("%s\t\t<MinScaleDenominator>%1.2f</MinScaleDenominator>\r\n", prev,
         1839  +         ScaleMin);
         1840  +      sqlite3_free(prev);
         1841  +      prev = xml;
         1842  +    }
         1843  +  if (MaxScaleEnabled == true)
         1844  +    {
         1845  +      xml =
         1846  +        sqlite3_mprintf
         1847  +        ("%s\t\t<MaxScaleDenominator>%1.2f</MaxScaleDenominator>\r\n", prev,
         1848  +         ScaleMax);
         1849  +      sqlite3_free(prev);
         1850  +      prev = xml;
         1851  +    }
         1852  +  xml = sqlite3_mprintf("%s\t\t<Name>Face</Name>\r\n", prev);
         1853  +  sqlite3_free(prev);
         1854  +  prev = xml;
         1855  +  xml =
         1856  +    sqlite3_mprintf("%s\t\t<ogc:Filter>\r\n\t\t\t<ogc:PropertyIsEqualTo>\r\n",
         1857  +                    prev);
         1858  +  sqlite3_free(prev);
         1859  +  prev = xml;
         1860  +  xml =
         1861  +    sqlite3_mprintf
         1862  +    ("%s\t\t\t\t<ogc:PropertyName>topoclass</ogc:PropertyName>\r\n", prev);
         1863  +  sqlite3_free(prev);
         1864  +  prev = xml;
         1865  +  xml = sqlite3_mprintf("%s\t\t\t\t<ogc:Literal>face</ogc:Literal>\r\n", prev);
         1866  +  sqlite3_free(prev);
         1867  +  prev = xml;
         1868  +  xml =
         1869  +    sqlite3_mprintf("%s\t\t\t</ogc:PropertyIsEqualTo>\r\n\t\t</ogc:Filter>\r\n",
         1870  +                    prev);
         1871  +  sqlite3_free(prev);
         1872  +  prev = xml;
         1873  +
         1874  +  const char *extra = "\t\t";
         1875  +  xml = sqlite3_mprintf("%s%s<PolygonSymbolizer>\r\n", prev, extra);
         1876  +  prev = xml;
         1877  +  if (FaceFill == true)
         1878  +    {
         1879  +      // Polygon Fill
         1880  +      xml = sqlite3_mprintf("%s%s\t<Fill>\r\n", prev, extra);
         1881  +      sqlite3_free(prev);
         1882  +      prev = xml;
         1883  +      // using a Solid Color
         1884  +      xml =
         1885  +        sqlite3_mprintf
         1886  +        ("%s%s\t\t<SvgParameter name=\"fill\">%s</SvgParameter>\r\n", prev,
         1887  +         extra, FaceFillColor);
         1888  +      sqlite3_free(prev);
         1889  +      prev = xml;
         1890  +      xml =
         1891  +        sqlite3_mprintf
         1892  +        ("%s%s\t\t<SvgParameter name=\"fill-opacity\">%1.2f</SvgParameter>\r\n",
         1893  +         prev, extra, FaceFillOpacity);
         1894  +      sqlite3_free(prev);
         1895  +      prev = xml;
         1896  +      xml = sqlite3_mprintf("%s%s\t</Fill>\r\n", prev, extra);
         1897  +      sqlite3_free(prev);
         1898  +      prev = xml;
         1899  +    }
         1900  +  if (FaceStroke == true)
         1901  +    {
         1902  +      // Polygon Stroke
         1903  +      xml = sqlite3_mprintf("%s%s\t<Stroke>\r\n", prev, extra);
         1904  +      sqlite3_free(prev);
         1905  +      prev = xml;
         1906  +      // using a Solid Color
         1907  +      xml =
         1908  +        sqlite3_mprintf
         1909  +        ("%s%s\t\t<SvgParameter name=\"stroke\">%s</SvgParameter>\r\n", prev,
         1910  +         extra, FaceStrokeColor);
         1911  +      sqlite3_free(prev);
         1912  +      prev = xml;
         1913  +      xml =
         1914  +        sqlite3_mprintf
         1915  +        ("%s%s\t\t<SvgParameter name=\"stroke-opacity\">%1.2f</SvgParameter>\r\n",
         1916  +         prev, extra, FaceStrokeOpacity);
         1917  +      sqlite3_free(prev);
         1918  +      prev = xml;
         1919  +      xml =
         1920  +        sqlite3_mprintf
         1921  +        ("%s%s\t\t<SvgParameter name=\"stroke-width\">%1.2f</SvgParameter>\r\n",
         1922  +         prev, extra, FaceStrokeWidth);
         1923  +      sqlite3_free(prev);
         1924  +      prev = xml;
         1925  +      xml =
         1926  +        sqlite3_mprintf
         1927  +        ("%s%s\t\t<SvgParameter name=\"stroke-linejoin\">round</SvgParameter>\r\n",
         1928  +         prev, extra);
         1929  +      sqlite3_free(prev);
         1930  +      prev = xml;
         1931  +      xml =
         1932  +        sqlite3_mprintf
         1933  +        ("%s%s\t\t<SvgParameter name=\"stroke-linecap\">round</SvgParameter>\r\n",
         1934  +         prev, extra);
         1935  +      sqlite3_free(prev);
         1936  +      prev = xml;
         1937  +      xml = sqlite3_mprintf("%s%s\t</Stroke>\r\n", prev, extra);
         1938  +      sqlite3_free(prev);
         1939  +      prev = xml;
         1940  +    }
         1941  +  if (FaceDisplacementX != 0.0 || FaceDisplacementY != 0.0)
         1942  +    {
         1943  +      xml = sqlite3_mprintf("%s%s\t<Displacement>\r\n", prev, extra);
         1944  +      sqlite3_free(prev);
         1945  +      prev = xml;
         1946  +      xml =
         1947  +        sqlite3_mprintf("%s%s\t\t<DisplacementX>%1.4f</DisplacementX>\r\n",
         1948  +                        prev, extra, FaceDisplacementX);
         1949  +      sqlite3_free(prev);
         1950  +      prev = xml;
         1951  +      xml =
         1952  +        sqlite3_mprintf("%s%s\t\t<DisplacementY>%1.4f</DisplacementY>\r\n",
         1953  +                        prev, extra, FaceDisplacementY);
         1954  +      sqlite3_free(prev);
         1955  +      prev = xml;
         1956  +      xml = sqlite3_mprintf("%s%s\t</Displacement>\r\n", prev, extra);
         1957  +      sqlite3_free(prev);
         1958  +      prev = xml;
         1959  +    }
         1960  +  if (FacePerpendicularOffset != 0.0)
         1961  +    {
         1962  +      xml =
         1963  +        sqlite3_mprintf
         1964  +        ("%s%s\t<PerpendicularOffset>%1.4f</PerpendicularOffset>\r\n", prev,
         1965  +         extra, FacePerpendicularOffset);
         1966  +      sqlite3_free(prev);
         1967  +      prev = xml;
         1968  +    }
         1969  +  xml = sqlite3_mprintf("%s%s</PolygonSymbolizer>\r\n", prev, extra);
         1970  +  sqlite3_free(prev);
         1971  +  prev = xml;
         1972  +  xml = sqlite3_mprintf("%s\t</Rule>\r\n", prev);
         1973  +  sqlite3_free(prev);
         1974  +  return xml;
         1975  +}
         1976  +
         1977  +char *QuickStyleTopologyObj::DoCreateEdgeLinkXML()
         1978  +{
         1979  +//
         1980  +// creating the XML Style - Edge or Link
         1981  +//
         1982  +  const char *cstr;
         1983  +  char *prev;
         1984  +  char *xml = sqlite3_mprintf("\t<Rule>\r\n");
         1985  +  prev = xml;
         1986  +  if (MinScaleEnabled == true)
         1987  +    {
         1988  +      xml =
         1989  +        sqlite3_mprintf
         1990  +        ("%s\t\t<MinScaleDenominator>%1.2f</MinScaleDenominator>\r\n", prev,
         1991  +         ScaleMin);
         1992  +      sqlite3_free(prev);
         1993  +      prev = xml;
         1994  +    }
         1995  +  if (MaxScaleEnabled == true)
         1996  +    {
         1997  +      xml =
         1998  +        sqlite3_mprintf
         1999  +        ("%s\t\t<MaxScaleDenominator>%1.2f</MaxScaleDenominator>\r\n", prev,
         2000  +         ScaleMax);
         2001  +      sqlite3_free(prev);
         2002  +      prev = xml;
         2003  +    }
         2004  +  if (Type == MAP_LAYER_NETWORK)
         2005  +    xml = sqlite3_mprintf("%s\t\t<Name>Link</Name>\r\n", prev);
         2006  +  else
         2007  +    xml = sqlite3_mprintf("%s\t\t<Name>Edge</Name>\r\n", prev);
         2008  +  sqlite3_free(prev);
         2009  +  prev = xml;
         2010  +  xml =
         2011  +    sqlite3_mprintf("%s\t\t<ogc:Filter>\r\n\t\t\t<ogc:PropertyIsEqualTo>\r\n",
         2012  +                    prev);
         2013  +  sqlite3_free(prev);
         2014  +  prev = xml;
         2015  +  xml =
         2016  +    sqlite3_mprintf
         2017  +    ("%s\t\t\t\t<ogc:PropertyName>topoclass</ogc:PropertyName>\r\n", prev);
         2018  +  sqlite3_free(prev);
         2019  +  prev = xml;
         2020  +  if (Type == MAP_LAYER_NETWORK)
         2021  +    xml =
         2022  +      sqlite3_mprintf("%s\t\t\t\t<ogc:Literal>link</ogc:Literal>\r\n", prev);
         2023  +  else
         2024  +    xml =
         2025  +      sqlite3_mprintf("%s\t\t\t\t<ogc:Literal>edge</ogc:Literal>\r\n", prev);
         2026  +  sqlite3_free(prev);
         2027  +  prev = xml;
         2028  +  xml =
         2029  +    sqlite3_mprintf("%s\t\t\t</ogc:PropertyIsEqualTo>\r\n\t\t</ogc:Filter>\r\n",
         2030  +                    prev);
         2031  +  sqlite3_free(prev);
         2032  +  prev = xml;
         2033  +
         2034  +  const char *extra = "\t\t";
         2035  +  xml = sqlite3_mprintf("%s%s<LineSymbolizer>\r\n", prev, extra);
         2036  +  prev = xml;
         2037  +  xml = sqlite3_mprintf("%s%s\t<Stroke>\r\n", prev, extra);
         2038  +  sqlite3_free(prev);
         2039  +  prev = xml;
         2040  +// using a Solid Color
         2041  +  xml =
         2042  +    sqlite3_mprintf
         2043  +    ("%s%s\t\t<SvgParameter name=\"stroke\">%s</SvgParameter>\r\n", prev, extra,
         2044  +     EdgeLinkStrokeColor);
         2045  +  sqlite3_free(prev);
         2046  +  prev = xml;
         2047  +  xml =
         2048  +    sqlite3_mprintf
         2049  +    ("%s%s\t\t<SvgParameter name=\"stroke-opacity\">%1.2f</SvgParameter>\r\n",
         2050  +     prev, extra, EdgeLinkOpacity);
         2051  +  sqlite3_free(prev);
         2052  +  prev = xml;
         2053  +  xml =
         2054  +    sqlite3_mprintf
         2055  +    ("%s%s\t\t<SvgParameter name=\"stroke-width\">%1.2f</SvgParameter>\r\n",
         2056  +     prev, extra, EdgeLinkStrokeWidth);
         2057  +  sqlite3_free(prev);
         2058  +  prev = xml;
         2059  +  xml =
         2060  +    sqlite3_mprintf
         2061  +    ("%s%s\t\t<SvgParameter name=\"stroke-linejoin\">round</SvgParameter>\r\n",
         2062  +     prev, extra);
         2063  +  sqlite3_free(prev);
         2064  +  prev = xml;
         2065  +  xml =
         2066  +    sqlite3_mprintf
         2067  +    ("%s%s\t\t<SvgParameter name=\"stroke-linecap\">round</SvgParameter>\r\n",
         2068  +     prev, extra);
         2069  +  sqlite3_free(prev);
         2070  +  prev = xml;
         2071  +  const char *dashArray;
         2072  +  switch (EdgeLinkDotStyle)
         2073  +    {
         2074  +      case QUICK_STYLE_DOT_LINE:
         2075  +        dashArray = "5.0, 10.0";
         2076  +        break;
         2077  +      case QUICK_STYLE_DASH_LINE:
         2078  +        dashArray = "20.0, 20.0";
         2079  +        break;
         2080  +      case QUICK_STYLE_DASH_DOT_LINE:
         2081  +        dashArray = "20.0, 10.0, 5.0, 10.0";
         2082  +        break;
         2083  +      default:
         2084  +        dashArray = NULL;
         2085  +        break;
         2086  +    };
         2087  +  if (dashArray != NULL)
         2088  +    {
         2089  +      xml =
         2090  +        sqlite3_mprintf
         2091  +        ("%s%s\t\t<SvgParameter name=\"stroke-dasharray\">%s</SvgParameter>\r\n",
         2092  +         prev, extra, dashArray);
         2093  +      sqlite3_free(prev);
         2094  +      prev = xml;
         2095  +    }
         2096  +  xml = sqlite3_mprintf("%s%s\t</Stroke>\r\n", prev, extra);
         2097  +  sqlite3_free(prev);
         2098  +  prev = xml;
         2099  +  if (EdgeLinkPerpendicularOffset != 0.0)
         2100  +    {
         2101  +      xml =
         2102  +        sqlite3_mprintf
         2103  +        ("%s%s\t<PerpendicularOffset>%1.2f</PerpendicularOffset>\r\n", prev,
         2104  +         extra, EdgeLinkPerpendicularOffset);
         2105  +      sqlite3_free(prev);
         2106  +      prev = xml;
         2107  +    }
         2108  +  xml = sqlite3_mprintf("%s%s</LineSymbolizer>\r\n", prev, extra);
         2109  +  sqlite3_free(prev);
         2110  +  prev = xml;
         2111  +  xml = sqlite3_mprintf("%s\t</Rule>\r\n", prev);
         2112  +  sqlite3_free(prev);
         2113  +  return xml;
         2114  +}
         2115  +
         2116  +char *QuickStyleTopologyObj::DoCreateNodeXML()
         2117  +{
         2118  +//
         2119  +// creating the XML Style - Node
         2120  +//
         2121  +  const char *cstr;
         2122  +  char *prev;
         2123  +  char *xml = sqlite3_mprintf("\t<Rule>\r\n");
         2124  +  prev = xml;
         2125  +  if (MinScaleEnabled == true)
         2126  +    {
         2127  +      xml =
         2128  +        sqlite3_mprintf
         2129  +        ("%s\t\t<MinScaleDenominator>%1.2f</MinScaleDenominator>\r\n", prev,
         2130  +         ScaleMin);
         2131  +      sqlite3_free(prev);
         2132  +      prev = xml;
         2133  +    }
         2134  +  if (MaxScaleEnabled == true)
         2135  +    {
         2136  +      xml =
         2137  +        sqlite3_mprintf
         2138  +        ("%s\t\t<MaxScaleDenominator>%1.2f</MaxScaleDenominator>\r\n", prev,
         2139  +         ScaleMax);
         2140  +      sqlite3_free(prev);
         2141  +      prev = xml;
         2142  +    }
         2143  +  xml = sqlite3_mprintf("%s\t\t<Name>Node</Name>\r\n", prev);
         2144  +  sqlite3_free(prev);
         2145  +  prev = xml;
         2146  +  xml =
         2147  +    sqlite3_mprintf("%s\t\t<ogc:Filter>\r\n\t\t\t<ogc:PropertyIsEqualTo>\r\n",
         2148  +                    prev);
         2149  +  sqlite3_free(prev);
         2150  +  prev = xml;
         2151  +  xml =
         2152  +    sqlite3_mprintf
         2153  +    ("%s\t\t\t\t<ogc:PropertyName>topoclass</ogc:PropertyName>\r\n", prev);
         2154  +  sqlite3_free(prev);
         2155  +  prev = xml;
         2156  +  xml = sqlite3_mprintf("%s\t\t\t\t<ogc:Literal>node</ogc:Literal>\r\n", prev);
         2157  +  sqlite3_free(prev);
         2158  +  prev = xml;
         2159  +  xml =
         2160  +    sqlite3_mprintf("%s\t\t\t</ogc:PropertyIsEqualTo>\r\n\t\t</ogc:Filter>\r\n",
         2161  +                    prev);
         2162  +  sqlite3_free(prev);
         2163  +  prev = xml;
         2164  +
         2165  +  const char *extra = "\t\t";
         2166  +  xml = sqlite3_mprintf("%s%s<PointSymbolizer>\r\n", prev, extra);
         2167  +  prev = xml;
         2168  +  xml = sqlite3_mprintf("%s%s\t<Graphic>\r\n", prev, extra);
         2169  +  sqlite3_free(prev);
         2170  +  prev = xml;
         2171  +// mark symbol
         2172  +  xml = sqlite3_mprintf("%s%s\t\t<Mark>\r\n", prev, extra);
         2173  +  sqlite3_free(prev);
         2174  +  prev = xml;
         2175  +  switch (NodeWellKnownMark)
         2176  +    {
         2177  +      case RL2_GRAPHIC_MARK_CIRCLE:
         2178  +        cstr = "circle";
         2179  +        break;
         2180  +      case RL2_GRAPHIC_MARK_TRIANGLE:
         2181  +        cstr = "triangle";
         2182  +        break;
         2183  +      case RL2_GRAPHIC_MARK_STAR:
         2184  +        cstr = "star";
         2185  +        break;
         2186  +      case RL2_GRAPHIC_MARK_CROSS:
         2187  +        cstr = "cross";
         2188  +        break;
         2189  +      case RL2_GRAPHIC_MARK_X:
         2190  +        cstr = "x";
         2191  +        break;
         2192  +      default:
         2193  +        cstr = "square";
         2194  +        break;
         2195  +    };
         2196  +  xml =
         2197  +    sqlite3_mprintf("%s%s\t\t\t<WellKnownName>%s</WellKnownName>\r\n", prev,
         2198  +                    extra, cstr);
         2199  +  sqlite3_free(prev);
         2200  +  prev = xml;
         2201  +// Mark Fill
         2202  +  xml = sqlite3_mprintf("%s%s\t\t\t<Fill>\r\n", prev, extra);
         2203  +  sqlite3_free(prev);
         2204  +  prev = xml;
         2205  +  xml =
         2206  +    sqlite3_mprintf
         2207  +    ("%s%s\t\t\t\t<SvgParameter name=\"fill\">%s</SvgParameter>\r\n",
         2208  +     prev, extra, NodeFillColor);
         2209  +  sqlite3_free(prev);
         2210  +  prev = xml;
         2211  +  xml = sqlite3_mprintf("%s%s\t\t\t</Fill>\r\n", prev, extra);
         2212  +  sqlite3_free(prev);
         2213  +  prev = xml;
         2214  +// Mark Stroke
         2215  +  xml = sqlite3_mprintf("%s%s\t\t\t<Stroke>\r\n", prev, extra);
         2216  +  sqlite3_free(prev);
         2217  +  prev = xml;
         2218  +  xml =
         2219  +    sqlite3_mprintf
         2220  +    ("%s%s\t\t\t\t<SvgParameter name=\"stroke\">%s</SvgParameter>\r\n",
         2221  +     prev, extra, NodeStrokeColor);
         2222  +  sqlite3_free(prev);
         2223  +  prev = xml;
         2224  +  xml =
         2225  +    sqlite3_mprintf
         2226  +    ("%s%s\t\t\t\t<SvgParameter name=\"stroke-width\">%1.2f</SvgParameter>\r\n",
         2227  +     prev, extra, 1.0);
         2228  +  sqlite3_free(prev);
         2229  +  prev = xml;
         2230  +  xml =
         2231  +    sqlite3_mprintf
         2232  +    ("%s%s\t\t\t\t<SvgParameter name=\"stroke-linejoin\">round</SvgParameter>\r\n",
         2233  +     prev, extra);
         2234  +  sqlite3_free(prev);
         2235  +  prev = xml;
         2236  +  xml =
         2237  +    sqlite3_mprintf
         2238  +    ("%s%s\t\t\t\t<SvgParameter name=\"stroke-linecap\">round</SvgParameter>\r\n",
         2239  +     prev, extra);
         2240  +  sqlite3_free(prev);
         2241  +  prev = xml;
         2242  +  xml = sqlite3_mprintf("%s%s\t\t\t</Stroke>\r\n", prev, extra);
         2243  +  sqlite3_free(prev);
         2244  +  prev = xml;
         2245  +  xml = sqlite3_mprintf("%s%s\t\t</Mark>\r\n", prev, extra);
         2246  +  sqlite3_free(prev);
         2247  +  prev = xml;
         2248  +  if (NodeOpacity != 1.0)
         2249  +    {
         2250  +      xml =
         2251  +        sqlite3_mprintf("%s%s\t\t<Opacity>%1.2f</Opacity>\r\n", prev, extra,
         2252  +                        NodeOpacity);
         2253  +      sqlite3_free(prev);
         2254  +      prev = xml;
         2255  +    }
         2256  +  xml =
         2257  +    sqlite3_mprintf("%s%s\t\t<Size>%1.2f</Size>\r\n", prev, extra, NodeSize);
         2258  +  sqlite3_free(prev);
         2259  +  prev = xml;
         2260  +  if (NodeRotation != 0.0)
         2261  +    {
         2262  +      xml =
         2263  +        sqlite3_mprintf("%s%s\t\t<Rotation>%1.2f</Rotation>\r\n", prev, extra,
         2264  +                        NodeRotation);
         2265  +      sqlite3_free(prev);
         2266  +      prev = xml;
         2267  +    }
         2268  +  if (NodeAnchorX != 0.5 || NodeAnchorY != 0.5)
         2269  +    {
         2270  +      xml = sqlite3_mprintf("%s%s\t\t<AnchorPoint>\r\n", prev, extra);
         2271  +      sqlite3_free(prev);
         2272  +      prev = xml;
         2273  +      xml =
         2274  +        sqlite3_mprintf("%s%s\t\t\t<AnchorPointX>%1.4f</AnchorPointX>\r\n",
         2275  +                        prev, extra, NodeAnchorX);
         2276  +      sqlite3_free(prev);
         2277  +      prev = xml;
         2278  +      xml =
         2279  +        sqlite3_mprintf("%s%s\t\t\t<AnchorPointY>%1.4f</AnchorPointY>\r\n",
         2280  +                        prev, extra, NodeAnchorY);
         2281  +      sqlite3_free(prev);
         2282  +      prev = xml;
         2283  +      xml = sqlite3_mprintf("%s%s\t\t</AnchorPoint>\r\n", prev, extra);
         2284  +      sqlite3_free(prev);
         2285  +      prev = xml;
         2286  +    }
         2287  +  if (NodeDisplacementX != 0.0 || NodeDisplacementY != 0.0)
         2288  +    {
         2289  +      xml = sqlite3_mprintf("%s%s\t\t<Displacement>\r\n", prev, extra);
         2290  +      sqlite3_free(prev);
         2291  +      prev = xml;
         2292  +      xml =
         2293  +        sqlite3_mprintf("%s%s\t\t\t<DisplacementX>%1.4f</DisplacementX>\r\n",
         2294  +                        prev, extra, NodeDisplacementX);
         2295  +      sqlite3_free(prev);
         2296  +      prev = xml;
         2297  +      xml =
         2298  +        sqlite3_mprintf("%s%s\t\t\t<DisplacementY>%1.4f</DisplacementY>\r\n",
         2299  +                        prev, extra, NodeDisplacementY);
         2300  +      sqlite3_free(prev);
         2301  +      prev = xml;
         2302  +      xml = sqlite3_mprintf("%s%s\t\t</Displacement>\r\n", prev, extra);
         2303  +      sqlite3_free(prev);
         2304  +      prev = xml;
         2305  +    }
         2306  +  xml = sqlite3_mprintf("%s%s\t</Graphic>\r\n", prev, extra);
         2307  +  sqlite3_free(prev);
         2308  +  prev = xml;
         2309  +  xml = sqlite3_mprintf("%s%s</PointSymbolizer>\r\n", prev, extra);
         2310  +  sqlite3_free(prev);
         2311  +  prev = xml;
         2312  +  xml = sqlite3_mprintf("%s\t</Rule>\r\n", prev);
         2313  +  sqlite3_free(prev);
         2314  +  return xml;
         2315  +}
         2316  +
         2317  +char *QuickStyleTopologyObj::DoCreateEdgeLinkSeedXML()
         2318  +{
         2319  +//
         2320  +// creating the XML Style - Edge or Link Seed
         2321  +//
         2322  +  const char *cstr;
         2323  +  char *prev;
         2324  +  char *xml = sqlite3_mprintf("\t<Rule>\r\n");
         2325  +  prev = xml;
         2326  +  if (MinScaleEnabled == true)
         2327  +    {
         2328  +      xml =
         2329  +        sqlite3_mprintf
         2330  +        ("%s\t\t<MinScaleDenominator>%1.2f</MinScaleDenominator>\r\n", prev,
         2331  +         ScaleMin);
         2332  +      sqlite3_free(prev);
         2333  +      prev = xml;
         2334  +    }
         2335  +  if (MaxScaleEnabled == true)
         2336  +    {
         2337  +      xml =
         2338  +        sqlite3_mprintf
         2339  +        ("%s\t\t<MaxScaleDenominator>%1.2f</MaxScaleDenominator>\r\n", prev,
         2340  +         ScaleMax);
         2341  +      sqlite3_free(prev);
         2342  +      prev = xml;
         2343  +    }
         2344  +  if (Type == MAP_LAYER_NETWORK)
         2345  +    xml = sqlite3_mprintf("%s\t\t<Name>LinkSeed</Name>\r\n", prev);
         2346  +  else
         2347  +    xml = sqlite3_mprintf("%s\t\t<Name>EdgeSeed</Name>\r\n", prev);
         2348  +  sqlite3_free(prev);
         2349  +  prev = xml;
         2350  +  xml =
         2351  +    sqlite3_mprintf("%s\t\t<ogc:Filter>\r\n\t\t\t<ogc:PropertyIsEqualTo>\r\n",
         2352  +                    prev);
         2353  +  sqlite3_free(prev);
         2354  +  prev = xml;
         2355  +  xml =
         2356  +    sqlite3_mprintf
         2357  +    ("%s\t\t\t\t<ogc:PropertyName>topoclass</ogc:PropertyName>\r\n", prev);
         2358  +  sqlite3_free(prev);
         2359  +  prev = xml;
         2360  +  if (Type == MAP_LAYER_NETWORK)
         2361  +    xml =
         2362  +      sqlite3_mprintf("%s\t\t\t\t<ogc:Literal>link_seed</ogc:Literal>\r\n",
         2363  +                      prev);
         2364  +  else
         2365  +    xml =
         2366  +      sqlite3_mprintf("%s\t\t\t\t<ogc:Literal>edge_seed</ogc:Literal>\r\n",
         2367  +                      prev);
         2368  +  sqlite3_free(prev);
         2369  +  prev = xml;
         2370  +  xml =
         2371  +    sqlite3_mprintf("%s\t\t\t</ogc:PropertyIsEqualTo>\r\n\t\t</ogc:Filter>\r\n",
         2372  +                    prev);
         2373  +  sqlite3_free(prev);
         2374  +  prev = xml;
         2375  +
         2376  +  const char *extra = "\t\t";
         2377  +  xml = sqlite3_mprintf("%s%s<PointSymbolizer>\r\n", prev, extra);
         2378  +  prev = xml;
         2379  +  xml = sqlite3_mprintf("%s%s\t<Graphic>\r\n", prev, extra);
         2380  +  sqlite3_free(prev);
         2381  +  prev = xml;
         2382  +// mark symbol
         2383  +  xml = sqlite3_mprintf("%s%s\t\t<Mark>\r\n", prev, extra);
         2384  +  sqlite3_free(prev);
         2385  +  prev = xml;
         2386  +  switch (EdgeLinkSeedWellKnownMark)
         2387  +    {
         2388  +      case RL2_GRAPHIC_MARK_CIRCLE:
         2389  +        cstr = "circle";
         2390  +        break;
         2391  +      case RL2_GRAPHIC_MARK_TRIANGLE:
         2392  +        cstr = "triangle";
         2393  +        break;
         2394  +      case RL2_GRAPHIC_MARK_STAR:
         2395  +        cstr = "star";
         2396  +        break;
         2397  +      case RL2_GRAPHIC_MARK_CROSS:
         2398  +        cstr = "cross";
         2399  +        break;
         2400  +      case RL2_GRAPHIC_MARK_X:
         2401  +        cstr = "x";
         2402  +        break;
         2403  +      default:
         2404  +        cstr = "square";
         2405  +        break;
         2406  +    };
         2407  +  xml =
         2408  +    sqlite3_mprintf("%s%s\t\t\t<WellKnownName>%s</WellKnownName>\r\n", prev,
         2409  +                    extra, cstr);
         2410  +  sqlite3_free(prev);
         2411  +  prev = xml;
         2412  +// Mark Fill
         2413  +  xml = sqlite3_mprintf("%s%s\t\t\t<Fill>\r\n", prev, extra);
         2414  +  sqlite3_free(prev);
         2415  +  prev = xml;
         2416  +  xml =
         2417  +    sqlite3_mprintf
         2418  +    ("%s%s\t\t\t\t<SvgParameter name=\"fill\">%s</SvgParameter>\r\n",
         2419  +     prev, extra, EdgeLinkSeedFillColor);
         2420  +  sqlite3_free(prev);
         2421  +  prev = xml;
         2422  +  xml = sqlite3_mprintf("%s%s\t\t\t</Fill>\r\n", prev, extra);
         2423  +  sqlite3_free(prev);
         2424  +  prev = xml;
         2425  +// Mark Stroke
         2426  +  xml = sqlite3_mprintf("%s%s\t\t\t<Stroke>\r\n", prev, extra);
         2427  +  sqlite3_free(prev);
         2428  +  prev = xml;
         2429  +  xml =
         2430  +    sqlite3_mprintf
         2431  +    ("%s%s\t\t\t\t<SvgParameter name=\"stroke\">%s</SvgParameter>\r\n",
         2432  +     prev, extra, EdgeLinkSeedStrokeColor);
         2433  +  sqlite3_free(prev);
         2434  +  prev = xml;
         2435  +  xml =
         2436  +    sqlite3_mprintf
         2437  +    ("%s%s\t\t\t\t<SvgParameter name=\"stroke-width\">%1.2f</SvgParameter>\r\n",
         2438  +     prev, extra, 1.0);
         2439  +  sqlite3_free(prev);
         2440  +  prev = xml;
         2441  +  xml =
         2442  +    sqlite3_mprintf
         2443  +    ("%s%s\t\t\t\t<SvgParameter name=\"stroke-linejoin\">round</SvgParameter>\r\n",
         2444  +     prev, extra);
         2445  +  sqlite3_free(prev);
         2446  +  prev = xml;
         2447  +  xml =
         2448  +    sqlite3_mprintf
         2449  +    ("%s%s\t\t\t\t<SvgParameter name=\"stroke-linecap\">round</SvgParameter>\r\n",
         2450  +     prev, extra);
         2451  +  sqlite3_free(prev);
         2452  +  prev = xml;
         2453  +  xml = sqlite3_mprintf("%s%s\t\t\t</Stroke>\r\n", prev, extra);
         2454  +  sqlite3_free(prev);
         2455  +  prev = xml;
         2456  +  xml = sqlite3_mprintf("%s%s\t\t</Mark>\r\n", prev, extra);
         2457  +  sqlite3_free(prev);
         2458  +  prev = xml;
         2459  +  if (EdgeLinkSeedOpacity != 1.0)
         2460  +    {
         2461  +      xml =
         2462  +        sqlite3_mprintf("%s%s\t\t<Opacity>%1.2f</Opacity>\r\n", prev, extra,
         2463  +                        EdgeLinkSeedOpacity);
         2464  +      sqlite3_free(prev);
         2465  +      prev = xml;
         2466  +    }
         2467  +  xml =
         2468  +    sqlite3_mprintf("%s%s\t\t<Size>%1.2f</Size>\r\n", prev, extra,
         2469  +                    EdgeLinkSeedSize);
         2470  +  sqlite3_free(prev);
         2471  +  prev = xml;
         2472  +  if (EdgeLinkSeedRotation != 0.0)
         2473  +    {
         2474  +      xml =
         2475  +        sqlite3_mprintf("%s%s\t\t<Rotation>%1.2f</Rotation>\r\n", prev, extra,
         2476  +                        EdgeLinkSeedRotation);
         2477  +      sqlite3_free(prev);
         2478  +      prev = xml;
         2479  +    }
         2480  +  if (EdgeLinkSeedAnchorX != 0.5 || EdgeLinkSeedAnchorY != 0.5)
         2481  +    {
         2482  +      xml = sqlite3_mprintf("%s%s\t\t<AnchorPoint>\r\n", prev, extra);
         2483  +      sqlite3_free(prev);
         2484  +      prev = xml;
         2485  +      xml =
         2486  +        sqlite3_mprintf("%s%s\t\t\t<AnchorPointX>%1.4f</AnchorPointX>\r\n",
         2487  +                        prev, extra, EdgeLinkSeedAnchorX);
         2488  +      sqlite3_free(prev);
         2489  +      prev = xml;
         2490  +      xml =
         2491  +        sqlite3_mprintf("%s%s\t\t\t<AnchorPointY>%1.4f</AnchorPointY>\r\n",
         2492  +                        prev, extra, EdgeLinkSeedAnchorY);
         2493  +      sqlite3_free(prev);
         2494  +      prev = xml;
         2495  +      xml = sqlite3_mprintf("%s%s\t\t</AnchorPoint>\r\n", prev, extra);
         2496  +      sqlite3_free(prev);
         2497  +      prev = xml;
         2498  +    }
         2499  +  if (EdgeLinkSeedDisplacementX != 0.0 || EdgeLinkSeedDisplacementY != 0.0)
         2500  +    {
         2501  +      xml = sqlite3_mprintf("%s%s\t\t<Displacement>\r\n", prev, extra);
         2502  +      sqlite3_free(prev);
         2503  +      prev = xml;
         2504  +      xml =
         2505  +        sqlite3_mprintf("%s%s\t\t\t<DisplacementX>%1.4f</DisplacementX>\r\n",
         2506  +                        prev, extra, EdgeLinkSeedDisplacementX);
         2507  +      sqlite3_free(prev);
         2508  +      prev = xml;
         2509  +      xml =
         2510  +        sqlite3_mprintf("%s%s\t\t\t<DisplacementY>%1.4f</DisplacementY>\r\n",
         2511  +                        prev, extra, EdgeLinkSeedDisplacementY);
         2512  +      sqlite3_free(prev);
         2513  +      prev = xml;
         2514  +      xml = sqlite3_mprintf("%s%s\t\t</Displacement>\r\n", prev, extra);
         2515  +      sqlite3_free(prev);
         2516  +      prev = xml;
         2517  +    }
         2518  +  xml = sqlite3_mprintf("%s%s\t</Graphic>\r\n", prev, extra);
         2519  +  sqlite3_free(prev);
         2520  +  prev = xml;
         2521  +  xml = sqlite3_mprintf("%s%s</PointSymbolizer>\r\n", prev, extra);
         2522  +  sqlite3_free(prev);
         2523  +  prev = xml;
         2524  +  xml = sqlite3_mprintf("%s\t</Rule>\r\n", prev);
         2525  +  sqlite3_free(prev);
         2526  +  return xml;
         2527  +}
         2528  +
         2529  +char *QuickStyleTopologyObj::DoCreateFaceSeedXML()
         2530  +{
         2531  +//
         2532  +// creating the XML Style - FaceSeed
         2533  +//
         2534  +  const char *cstr;
         2535  +  char *prev;
         2536  +  char *xml = sqlite3_mprintf("\t<Rule>\r\n");
         2537  +  prev = xml;
         2538  +  if (MinScaleEnabled == true)
         2539  +    {
         2540  +      xml =
         2541  +        sqlite3_mprintf
         2542  +        ("%s\t\t<MinScaleDenominator>%1.2f</MinScaleDenominator>\r\n", prev,
         2543  +         ScaleMin);
         2544  +      sqlite3_free(prev);
         2545  +      prev = xml;
         2546  +    }
         2547  +  if (MaxScaleEnabled == true)
         2548  +    {
         2549  +      xml =
         2550  +        sqlite3_mprintf
         2551  +        ("%s\t\t<MaxScaleDenominator>%1.2f</MaxScaleDenominator>\r\n", prev,
         2552  +         ScaleMax);
         2553  +      sqlite3_free(prev);
         2554  +      prev = xml;
         2555  +    }
         2556  +  xml = sqlite3_mprintf("%s\t\t<Name>FaceSeed</Name>\r\n", prev);
         2557  +  sqlite3_free(prev);
         2558  +  prev = xml;
         2559  +  xml =
         2560  +    sqlite3_mprintf("%s\t\t<ogc:Filter>\r\n\t\t\t<ogc:PropertyIsEqualTo>\r\n",
         2561  +                    prev);
         2562  +  sqlite3_free(prev);
         2563  +  prev = xml;
         2564  +  xml =
         2565  +    sqlite3_mprintf
         2566  +    ("%s\t\t\t\t<ogc:PropertyName>topoclass</ogc:PropertyName>\r\n", prev);
         2567  +  sqlite3_free(prev);
         2568  +  prev = xml;
         2569  +  xml =
         2570  +    sqlite3_mprintf("%s\t\t\t\t<ogc:Literal>face_seed</ogc:Literal>\r\n", prev);
         2571  +  sqlite3_free(prev);
         2572  +  prev = xml;
         2573  +  xml =
         2574  +    sqlite3_mprintf("%s\t\t\t</ogc:PropertyIsEqualTo>\r\n\t\t</ogc:Filter>\r\n",
         2575  +                    prev);
         2576  +  sqlite3_free(prev);
         2577  +  prev = xml;
         2578  +
         2579  +  const char *extra = "\t\t";
         2580  +  xml = sqlite3_mprintf("%s%s<PointSymbolizer>\r\n", prev, extra);
         2581  +  prev = xml;
         2582  +  xml = sqlite3_mprintf("%s%s\t<Graphic>\r\n", prev, extra);
         2583  +  sqlite3_free(prev);
         2584  +  prev = xml;
         2585  +// mark symbol
         2586  +  xml = sqlite3_mprintf("%s%s\t\t<Mark>\r\n", prev, extra);
         2587  +  sqlite3_free(prev);
         2588  +  prev = xml;
         2589  +  switch (FaceSeedWellKnownMark)
         2590  +    {
         2591  +      case RL2_GRAPHIC_MARK_CIRCLE:
         2592  +        cstr = "circle";
         2593  +        break;
         2594  +      case RL2_GRAPHIC_MARK_TRIANGLE:
         2595  +        cstr = "triangle";
         2596  +        break;
         2597  +      case RL2_GRAPHIC_MARK_STAR:
         2598  +        cstr = "star";
         2599  +        break;
         2600  +      case RL2_GRAPHIC_MARK_CROSS:
         2601  +        cstr = "cross";
         2602  +        break;
         2603  +      case RL2_GRAPHIC_MARK_X:
         2604  +        cstr = "x";
         2605  +        break;
         2606  +      default:
         2607  +        cstr = "square";
         2608  +        break;
         2609  +    };
         2610  +  xml =
         2611  +    sqlite3_mprintf("%s%s\t\t\t<WellKnownName>%s</WellKnownName>\r\n", prev,
         2612  +                    extra, cstr);
         2613  +  sqlite3_free(prev);
         2614  +  prev = xml;
         2615  +// Mark Fill
         2616  +  xml = sqlite3_mprintf("%s%s\t\t\t<Fill>\r\n", prev, extra);
         2617  +  sqlite3_free(prev);
         2618  +  prev = xml;
         2619  +  xml =
         2620  +    sqlite3_mprintf
         2621  +    ("%s%s\t\t\t\t<SvgParameter name=\"fill\">%s</SvgParameter>\r\n",
         2622  +     prev, extra, FaceSeedFillColor);
         2623  +  sqlite3_free(prev);
         2624  +  prev = xml;
         2625  +  xml = sqlite3_mprintf("%s%s\t\t\t</Fill>\r\n", prev, extra);
         2626  +  sqlite3_free(prev);
         2627  +  prev = xml;
         2628  +// Mark Stroke
         2629  +  xml = sqlite3_mprintf("%s%s\t\t\t<Stroke>\r\n", prev, extra);
         2630  +  sqlite3_free(prev);
         2631  +  prev = xml;
         2632  +  xml =
         2633  +    sqlite3_mprintf
         2634  +    ("%s%s\t\t\t\t<SvgParameter name=\"stroke\">%s</SvgParameter>\r\n",
         2635  +     prev, extra, FaceSeedStrokeColor);
         2636  +  sqlite3_free(prev);
         2637  +  prev = xml;
         2638  +  xml =
         2639  +    sqlite3_mprintf
         2640  +    ("%s%s\t\t\t\t<SvgParameter name=\"stroke-width\">%1.2f</SvgParameter>\r\n",
         2641  +     prev, extra, 1.0);
         2642  +  sqlite3_free(prev);
         2643  +  prev = xml;
         2644  +  xml =
         2645  +    sqlite3_mprintf
         2646  +    ("%s%s\t\t\t\t<SvgParameter name=\"stroke-linejoin\">round</SvgParameter>\r\n",
         2647  +     prev, extra);
         2648  +  sqlite3_free(prev);
         2649  +  prev = xml;
         2650  +  xml =
         2651  +    sqlite3_mprintf
         2652  +    ("%s%s\t\t\t\t<SvgParameter name=\"stroke-linecap\">round</SvgParameter>\r\n",
         2653  +     prev, extra);
         2654  +  sqlite3_free(prev);
         2655  +  prev = xml;
         2656  +  xml = sqlite3_mprintf("%s%s\t\t\t</Stroke>\r\n", prev, extra);
         2657  +  sqlite3_free(prev);
         2658  +  prev = xml;
         2659  +  xml = sqlite3_mprintf("%s%s\t\t</Mark>\r\n", prev, extra);
         2660  +  sqlite3_free(prev);
         2661  +  prev = xml;
         2662  +  if (FaceSeedOpacity != 1.0)
         2663  +    {
         2664  +      xml =
         2665  +        sqlite3_mprintf("%s%s\t\t<Opacity>%1.2f</Opacity>\r\n", prev, extra,
         2666  +                        FaceSeedOpacity);
         2667  +      sqlite3_free(prev);
         2668  +      prev = xml;
         2669  +    }
         2670  +  xml =
         2671  +    sqlite3_mprintf("%s%s\t\t<Size>%1.2f</Size>\r\n", prev, extra,
         2672  +                    FaceSeedSize);
         2673  +  sqlite3_free(prev);
         2674  +  prev = xml;
         2675  +  if (FaceSeedRotation != 0.0)
         2676  +    {
         2677  +      xml =
         2678  +        sqlite3_mprintf("%s%s\t\t<Rotation>%1.2f</Rotation>\r\n", prev, extra,
         2679  +                        FaceSeedRotation);
         2680  +      sqlite3_free(prev);
         2681  +      prev = xml;
         2682  +    }
         2683  +  if (FaceSeedAnchorX != 0.5 || FaceSeedAnchorY != 0.5)
         2684  +    {
         2685  +      xml = sqlite3_mprintf("%s%s\t\t<AnchorPoint>\r\n", prev, extra);
         2686  +      sqlite3_free(prev);
         2687  +      prev = xml;
         2688  +      xml =
         2689  +        sqlite3_mprintf("%s%s\t\t\t<AnchorPointX>%1.4f</AnchorPointX>\r\n",
         2690  +                        prev, extra, FaceSeedAnchorX);
         2691  +      sqlite3_free(prev);
         2692  +      prev = xml;
         2693  +      xml =
         2694  +        sqlite3_mprintf("%s%s\t\t\t<AnchorPointY>%1.4f</AnchorPointY>\r\n",
         2695  +                        prev, extra, FaceSeedAnchorY);
         2696  +      sqlite3_free(prev);
         2697  +      prev = xml;
         2698  +      xml = sqlite3_mprintf("%s%s\t\t</AnchorPoint>\r\n", prev, extra);
         2699  +      sqlite3_free(prev);
         2700  +      prev = xml;
         2701  +    }
         2702  +  if (FaceSeedDisplacementX != 0.0 || FaceSeedDisplacementY != 0.0)
         2703  +    {
         2704  +      xml = sqlite3_mprintf("%s%s\t\t<Displacement>\r\n", prev, extra);
         2705  +      sqlite3_free(prev);
         2706  +      prev = xml;
         2707  +      xml =
         2708  +        sqlite3_mprintf("%s%s\t\t\t<DisplacementX>%1.4f</DisplacementX>\r\n",
         2709  +                        prev, extra, FaceSeedDisplacementX);
         2710  +      sqlite3_free(prev);
         2711  +      prev = xml;
         2712  +      xml =
         2713  +        sqlite3_mprintf("%s%s\t\t\t<DisplacementY>%1.4f</DisplacementY>\r\n",
         2714  +                        prev, extra, FaceSeedDisplacementY);
         2715  +      sqlite3_free(prev);
         2716  +      prev = xml;
         2717  +      xml = sqlite3_mprintf("%s%s\t\t</Displacement>\r\n", prev, extra);
         2718  +      sqlite3_free(prev);
         2719  +      prev = xml;
         2720  +    }
         2721  +  xml = sqlite3_mprintf("%s%s\t</Graphic>\r\n", prev, extra);
         2722  +  sqlite3_free(prev);
         2723  +  prev = xml;
         2724  +  xml = sqlite3_mprintf("%s%s</PointSymbolizer>\r\n", prev, extra);
         2725  +  sqlite3_free(prev);
         2726  +  prev = xml;
         2727  +  xml = sqlite3_mprintf("%s\t</Rule>\r\n", prev);
         2728  +  sqlite3_free(prev);
         2729  +  return xml;
         2730  +}
         2731  +
         2732  +const unsigned char *QuickStyleTopologyObj::CloneXmlStyle()
         2733  +{
         2734  +//
         2735  +// cloning the XML Style definition
         2736  +//
         2737  +  if (XmlStyle == NULL)
         2738  +    XmlStyle = CreateXmlStyle();
         2739  +  if (XmlStyle == NULL)
         2740  +    return NULL;
         2741  +  int len = strlen(XmlStyle);
         2742  +  char *cloned = (char *) malloc(len + 1);
         2743  +  strcpy(cloned, XmlStyle);
         2744  +  return (const unsigned char *) cloned;
         2745  +}
         2746  +
         2747  +bool QuickStyleVectorDialog::Create(MyMapPanel * parent, MapLayer * layer,
         2748  +                                    int type)
         2749  +{
         2750  +//
         2751  +// creating the dialog
         2752  +//
         2753  +  MainFrame = parent->GetParent();
         2754  +  MapPanel = parent;
         2755  +  Layer = layer;
         2756  +  Type = type;
         2757  +  DbPrefix = layer->GetDbPrefix();
         2758  +  LayerName = layer->GetName();
         2759  +  IsConfigChanged = false;
         2760  +
         2761  +  if (wxPropertySheetDialog::Create
         2762  +      (parent, wxID_ANY, wxT("QuickStyle (Vector) Edit")) == false)
         2763  +    return false;
         2764  +  if (Layer->GetQuickStyle() != NULL)
         2765  +    Style = Layer->CloneQuickStyle();
         2766  +  else
         2767  +    Style = new QuickStyleObj(Type);
         2768  +
         2769  +  wxBookCtrlBase *book = GetBookCtrl();
         2770  +// creates individual panels
         2771  +  int next = 1;
         2772  +  PagePointIndex = 0;
         2773  +  PageLineIndex = 0;
         2774  +  PagePolygonIndex = 0;
         2775  +  PageTextPointIndex = 0;
         2776  +  PageTextLineIndex = 0;
         2777  +  wxPanel *mainPage = CreateMainPage(book);
         2778  +  book->AddPage(mainPage, wxT("General"), true);
         2779  +  if (Type == QUICK_STYLE_POINT || Type == QUICK_STYLE_GEOMETRY)
         2780  +    {
         2781  +      wxPanel *pointPage = CreatePointPage(book);
         2782  +      book->AddPage(pointPage, wxT("Point Symbolizer"), false);
         2783  +      PagePointIndex = next++;
         2784  +    }
         2785  +  if (Type == QUICK_STYLE_LINE || Type == QUICK_STYLE_GEOMETRY)
         2786  +    {
         2787  +      wxPanel *linePage = CreateLinePage(book);
         2788  +      book->AddPage(linePage, wxT("Line Symbolyzer"), false);
         2789  +      PageLineIndex = next++;
         2790  +    }
         2791  +  if (Type == QUICK_STYLE_POLYGON || Type == QUICK_STYLE_GEOMETRY)
         2792  +    {
         2793  +      wxPanel *polygonPage = CreatePolygonPage(book);
         2794  +      book->AddPage(polygonPage, wxT("Polygon Symbolizer"), false);
         2795  +      PagePolygonIndex = next++;
         2796  +    }
         2797  +  if (Type == QUICK_STYLE_POINT || Type == QUICK_STYLE_POLYGON)
         2798  +    {
         2799  +      wxPanel *textPointPage = CreateTextPointPage(book);
         2800  +      book->AddPage(textPointPage, wxT("Text Symbolizer"), false);
         2801  +      PageTextPointIndex = next++;
         2802  +    }
         2803  +  if (Type == QUICK_STYLE_LINE)
         2804  +    {
         2805  +      wxPanel *textLinePage = CreateTextLinePage(book);
         2806  +      book->AddPage(textLinePage, wxT("Text Symbolizer"), false);
         2807  +      PageTextLineIndex = next++;
         2808  +    }
         2809  +
         2810  +  CreateButtons();
         2811  +  LayoutDialog();
         2812  +// appends event handler for TAB/PAGE changing
         2813  +  Connect(wxID_ANY, wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING,
         2814  +          (wxObjectEventFunction) & QuickStyleVectorDialog::OnPageChanging);
         2815  +  Connect(wxID_ANY, wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,
         2816  +          (wxObjectEventFunction) & QuickStyleVectorDialog::OnPageChanged);
         2817  +// appends event handler for buttons
         2818  +  Connect(wxID_CANCEL, wxEVT_COMMAND_BUTTON_CLICKED,
         2819  +          (wxObjectEventFunction) & QuickStyleVectorDialog::OnQuit);
         2820  +  Connect(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED,
         2821  +          (wxObjectEventFunction) & QuickStyleVectorDialog::OnOk);
         2822  +  Connect(ID_QUICK_STYLE_APPLY, wxEVT_COMMAND_BUTTON_CLICKED,
         2823  +          (wxObjectEventFunction) & QuickStyleVectorDialog::OnApply);
         2824  +  Connect(ID_QUICK_STYLE_EXPORT, wxEVT_COMMAND_BUTTON_CLICKED,
         2825  +          (wxObjectEventFunction) & QuickStyleVectorDialog::OnExport);
         2826  +  Connect(ID_QUICK_STYLE_COPY, wxEVT_COMMAND_BUTTON_CLICKED,
         2827  +          (wxObjectEventFunction) & QuickStyleVectorDialog::OnCopy);
         2828  +// centers the dialog window
         2829  +  Centre();
         2830  +  UpdateMainPage();
         2831  +  return true;
         2832  +}
         2833  +
         2834  +void QuickStyleVectorDialog::CreateButtons()
         2835  +{
         2836  +// 
         2837  +// adding the common Buttons
         2838  +//
         2839  +  wxBoxSizer *topSizer = (wxBoxSizer *) (this->GetSizer());
         2840  +  wxBoxSizer *btnBox = new wxBoxSizer(wxHORIZONTAL);
         2841  +  topSizer->Add(btnBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         2842  +  wxButton *save = new wxButton(this, ID_QUICK_STYLE_APPLY, wxT("&Apply"));
         2843  +  btnBox->Add(save, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         2844  +  wxButton *exp =
         2845  +    new wxButton(this, ID_QUICK_STYLE_EXPORT, wxT("&Export to file"));
         2846  +  btnBox->Add(exp, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         2847  +  wxButton *copy = new wxButton(this, ID_QUICK_STYLE_COPY, wxT("&Copy"));
         2848  +  btnBox->Add(copy, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         2849  +  btnBox->AddSpacer(100);
         2850  +  wxButton *ok = new wxButton(this, wxID_OK, wxT("&Ok"));
         2851  +  btnBox->Add(ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         2852  +  wxButton *cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel"));
         2853  +  btnBox->Add(cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         2854  +}
         2855  +
         2856  +wxPanel *QuickStyleVectorDialog::CreateMainPage(wxWindow * parent)
         2857  +{
         2858  +//
         2859  +// creating the MAIN page
         2860  +//
         2861  +  wxPanel *panel = new wxPanel(parent, ID_PANE_MAIN);
         2862  +  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
         2863  +  panel->SetSizer(topSizer);
         2864  +  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
         2865  +  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
         2866  +// First row: Layer name
         2867  +  boxSizer->AddSpacer(50);
         2868  +  wxBoxSizer *lyrBoxSizer = new wxBoxSizer(wxVERTICAL);
         2869  +  boxSizer->Add(lyrBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         2870  +  wxBoxSizer *nameSizer = new wxBoxSizer(wxVERTICAL);
         2871  +  lyrBoxSizer->Add(nameSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         2872  +  wxStaticBox *nameBox = new wxStaticBox(panel, wxID_ANY,
         2873  +                                         wxT("Layer FullName"),
         2874  +                                         wxDefaultPosition,
         2875  +                                         wxDefaultSize);
         2876  +  wxBoxSizer *nameBoxSizer = new wxStaticBoxSizer(nameBox, wxHORIZONTAL);
         2877  +  nameSizer->Add(nameBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         2878  +  wxString fullName = DbPrefix + wxT(".") + LayerName;
         2879  +  wxTextCtrl *nameCtrl = new wxTextCtrl(panel, ID_VECTOR_LAYER, fullName,
         2880  +                                        wxDefaultPosition, wxSize(370, 22),
         2881  +                                        wxTE_READONLY);
         2882  +  nameBoxSizer->Add(nameCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         2883  +  wxStaticBox *typeBox = new wxStaticBox(panel, wxID_ANY,
         2884  +                                         wxT("Geometry Type"),
         2885  +                                         wxDefaultPosition,
         2886  +                                         wxDefaultSize);
         2887  +  wxBoxSizer *typeBoxSizer = new wxStaticBoxSizer(typeBox, wxHORIZONTAL);
         2888  +  nameSizer->Add(typeBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         2889  +  wxString typeName = wxT("UNKNOWN");
         2890  +  if (Type == QUICK_STYLE_POINT)
         2891  +    typeName = wxT("POINT-Type Geometries");
         2892  +  if (Type == QUICK_STYLE_LINE)
         2893  +    typeName = wxT("LINE-Type Geometries");
         2894  +  if (Type == QUICK_STYLE_POLYGON)
         2895  +    typeName = wxT("POLYGON-Type Geometries");
         2896  +  if (Type == QUICK_STYLE_GEOMETRY)
         2897  +    typeName = wxT("MIXED-Type Geometries");
         2898  +  wxTextCtrl *typeCtrl = new wxTextCtrl(panel, ID_VECTOR_TYPE, typeName,
         2899  +                                        wxDefaultPosition, wxSize(370, 22),
         2900  +                                        wxTE_READONLY);
         2901  +  typeBoxSizer->Add(typeCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         2902  +  wxStaticBox *uuidBox = new wxStaticBox(panel, wxID_ANY,
         2903  +                                         wxT("QuickStyle Name"),
         2904  +                                         wxDefaultPosition,
         2905  +                                         wxDefaultSize);
         2906  +  wxBoxSizer *uuidBoxSizer = new wxStaticBoxSizer(uuidBox, wxHORIZONTAL);
         2907  +  nameSizer->Add(uuidBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         2908  +  wxString uuid = wxString::FromUTF8(Style->GetUUID());
         2909  +  wxTextCtrl *uuidCtrl = new wxTextCtrl(panel, ID_VECTOR_UUID, uuid,
         2910  +                                        wxDefaultPosition, wxSize(370, 22),
         2911  +                                        wxTE_READONLY);
         2912  +  uuidBoxSizer->Add(uuidCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         2913  +  boxSizer->AddSpacer(25);
         2914  +// second row: Visibility Range
         2915  +  wxBoxSizer *miscSizer = new wxBoxSizer(wxHORIZONTAL);
         2916  +  boxSizer->Add(miscSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         2917  +  wxBoxSizer *visibilityBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         2918  +  miscSizer->Add(visibilityBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         2919  +  wxStaticBox *visibilityBox = new wxStaticBox(panel, wxID_STATIC,
         2920  +                                               wxT("Visibility Range"),
         2921  +                                               wxDefaultPosition,
         2922  +                                               wxDefaultSize);
         2923  +  wxBoxSizer *visibilitySizer =
         2924  +    new wxStaticBoxSizer(visibilityBox, wxHORIZONTAL);
         2925  +  visibilityBoxSizer->Add(visibilitySizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL,
         2926  +                          5);
         2927  +  wxString range[4];
         2928  +  range[0] = wxT("&None");
         2929  +  range[1] = wxT("&Min");
         2930  +  range[2] = wxT("&Max");
         2931  +  range[3] = wxT("&Both");
         2932  +  wxRadioBox *rangeBox = new wxRadioBox(panel, ID_SYMBOLIZER_MINMAX_SCALE,
         2933  +                                        wxT("&Range Type"),
         2934  +                                        wxDefaultPosition,
         2935  +                                        wxDefaultSize, 4,
         2936  +                                        range, 2,
         2937  +                                        wxRA_SPECIFY_COLS);
         2938  +  visibilitySizer->Add(rangeBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         2939  +  rangeBox->SetSelection(0);
         2940  +  visibilitySizer->AddSpacer(20);
         2941  +  wxBoxSizer *scaleBoxSizer = new wxBoxSizer(wxVERTICAL);
         2942  +  visibilitySizer->Add(scaleBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         2943  +  wxBoxSizer *scaleMinSizer = new wxBoxSizer(wxHORIZONTAL);
         2944  +  scaleBoxSizer->Add(scaleMinSizer, 0, wxALIGN_RIGHT | wxALL, 5);
         2945  +  wxStaticText *minScaleLabel =
         2946  +    new wxStaticText(panel, wxID_STATIC, wxT("&Min Scale:"));
         2947  +  scaleMinSizer->Add(minScaleLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         2948  +  wxTextCtrl *minScaleCtrl =
         2949  +    new wxTextCtrl(panel, ID_SYMBOLIZER_MIN_SCALE, wxT("0.0"),
         2950  +                   wxDefaultPosition, wxSize(100, 22));
         2951  +  minScaleCtrl->Enable(false);
         2952  +  scaleMinSizer->Add(minScaleCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         2953  +  wxBoxSizer *scaleMaxSizer = new wxBoxSizer(wxHORIZONTAL);
         2954  +  scaleBoxSizer->Add(scaleMaxSizer, 0, wxALIGN_RIGHT | wxALL, 0);
         2955  +  wxStaticText *maxScaleLabel =
         2956  +    new wxStaticText(panel, wxID_STATIC, wxT("&Max Scale:"));
         2957  +  scaleMaxSizer->Add(maxScaleLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         2958  +  wxTextCtrl *maxScaleCtrl =
         2959  +    new wxTextCtrl(panel, ID_SYMBOLIZER_MAX_SCALE, wxT("+Infinite"),
         2960  +                   wxDefaultPosition, wxSize(100, 22));
         2961  +  maxScaleCtrl->Enable(false);
         2962  +  scaleMaxSizer->Add(maxScaleCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         2963  +  panel->SetSizer(topSizer);
         2964  +  topSizer->Fit(panel);
         2965  +// appends event handlers
         2966  +  Connect(ID_SYMBOLIZER_MINMAX_SCALE, wxEVT_COMMAND_RADIOBOX_SELECTED,
         2967  +          (wxObjectEventFunction) & QuickStyleVectorDialog::OnCmdScaleChanged);
         2968  +  return panel;
         2969  +}
         2970  +
         2971  +void QuickStyleVectorDialog::
         2972  +OnCmdScaleChanged(wxCommandEvent & WXUNUSED(event))
         2973  +{
         2974  +//
         2975  +// Visibility Range selection changed
         2976  +//
         2977  +  wxRadioBox *scaleModeCtrl =
         2978  +    (wxRadioBox *) FindWindow(ID_SYMBOLIZER_MINMAX_SCALE);
         2979  +  wxTextCtrl *minCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MIN_SCALE);
         2980  +  wxTextCtrl *maxCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MAX_SCALE);
         2981  +  switch (scaleModeCtrl->GetSelection())
         2982  +    {
         2983  +      case 0:
         2984  +        Style->EnableMinScale(false);
         2985  +        Style->EnableMaxScale(false);
         2986  +        minCtrl->SetValue(wxT("0.0"));
         2987  +        minCtrl->Enable(false);
         2988  +        maxCtrl->SetValue(wxT("+Infinite"));
         2989  +        maxCtrl->Enable(false);
         2990  +        break;
         2991  +      case 1:
         2992  +        Style->EnableMinScale(true);
         2993  +        Style->EnableMaxScale(false);
         2994  +        minCtrl->SetValue(wxT(""));
         2995  +        minCtrl->Enable(true);
         2996  +        maxCtrl->SetValue(wxT("+Infinite"));
         2997  +        maxCtrl->Enable(false);
         2998  +        break;
         2999  +      case 2:
         3000  +        Style->EnableMinScale(false);
         3001  +        Style->EnableMaxScale(true);
         3002  +        minCtrl->SetValue(wxT("0.0"));
         3003  +        minCtrl->Enable(false);
         3004  +        maxCtrl->SetValue(wxT(""));
         3005  +        maxCtrl->Enable(true);
         3006  +        break;
         3007  +      case 3:
         3008  +        Style->EnableMinScale(true);
         3009  +        Style->EnableMaxScale(true);
         3010  +        minCtrl->SetValue(wxT(""));
         3011  +        minCtrl->Enable(true);
         3012  +        maxCtrl->SetValue(wxT(""));
         3013  +        maxCtrl->Enable(true);
         3014  +        break;
         3015  +    };
         3016  +}
         3017  +
         3018  +wxPanel *QuickStyleVectorDialog::CreatePointPage(wxWindow * parent)
         3019  +{
         3020  +//
         3021  +// creating the Point Symbolizer page
         3022  +//
         3023  +  wxString StrokeColor = wxT("#000000");
         3024  +  wxString FillColor = wxT("#808080");
         3025  +  wxPanel *panel = new wxPanel(parent, ID_PANE_POINT);
         3026  +  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
         3027  +  panel->SetSizer(topSizer);
         3028  +  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
         3029  +  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
         3030  +// first row A: Opacity 
         3031  +  wxBoxSizer *opacityBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         3032  +  boxSizer->Add(opacityBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3033  +  wxStaticBox *opacityBox = new wxStaticBox(panel, wxID_STATIC,
         3034  +                                            wxT("Opacity"),
         3035  +                                            wxDefaultPosition,
         3036  +                                            wxDefaultSize);
         3037  +  wxBoxSizer *opacitySizer = new wxStaticBoxSizer(opacityBox, wxVERTICAL);
         3038  +  opacityBoxSizer->Add(opacitySizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3039  +  wxSlider *opacityCtrl =
         3040  +    new wxSlider(panel, ID_SYMBOLIZER_OPACITY, 100, 0, 100,
         3041  +                 wxDefaultPosition, wxSize(600, 45),
         3042  +                 wxSL_HORIZONTAL | wxSL_LABELS);
         3043  +  opacitySizer->Add(opacityCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3044  +// Well Known Mark Name
         3045  +  wxBoxSizer *box1Sizer = new wxBoxSizer(wxHORIZONTAL);
         3046  +  boxSizer->Add(box1Sizer, 0, wxALIGN_CENTER | wxALL, 5);
         3047  +  wxBoxSizer *markSizer = new wxBoxSizer(wxHORIZONTAL);
         3048  +  box1Sizer->Add(markSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         3049  +  wxString mark[6];
         3050  +  mark[0] = wxT("&Square");
         3051  +  mark[1] = wxT("&Circle");
         3052  +  mark[2] = wxT("&Triangle");
         3053  +  mark[3] = wxT("&Star");
         3054  +  mark[4] = wxT("&Cross");
         3055  +  mark[5] = wxT("&X");
         3056  +  wxRadioBox *markBox = new wxRadioBox(panel, ID_SYMBOLIZER_MARK,
         3057  +                                       wxT("&Mark"),
         3058  +                                       wxDefaultPosition,
         3059  +                                       wxDefaultSize, 6,
         3060  +                                       mark, 1,
         3061  +                                       wxRA_SPECIFY_COLS);
         3062  +  markSizer->Add(markBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3063  +  markBox->SetSelection(0);
         3064  +// second row: Size and Rotation
         3065  +  wxBoxSizer *box2Sizer = new wxBoxSizer(wxVERTICAL);
         3066  +  box1Sizer->Add(box2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3067  +  wxBoxSizer *sizeBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         3068  +  box2Sizer->Add(sizeBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3069  +// second row A: Size
         3070  +  wxStaticBox *sizeBox = new wxStaticBox(panel, wxID_STATIC,
         3071  +                                         wxT("Size"),
         3072  +                                         wxDefaultPosition,
         3073  +                                         wxDefaultSize);
         3074  +  wxBoxSizer *sizeSizer = new wxStaticBoxSizer(sizeBox, wxVERTICAL);
         3075  +  sizeBoxSizer->Add(sizeSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
         3076  +  wxBoxSizer *size1Sizer = new wxBoxSizer(wxHORIZONTAL);
         3077  +  sizeSizer->Add(size1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3078  +  wxTextCtrl *sizeCtrl = new wxTextCtrl(panel, ID_SYMBOLIZER_SIZE, wxT("16.0"),
         3079  +                                        wxDefaultPosition, wxSize(100, 22));
         3080  +  size1Sizer->Add(sizeCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3081  +// second row B: Rotation
         3082  +  wxStaticBox *rotBox = new wxStaticBox(panel, wxID_STATIC,
         3083  +                                        wxT("Rotation"),
         3084  +                                        wxDefaultPosition,
         3085  +                                        wxDefaultSize);
         3086  +  wxBoxSizer *rotSizer = new wxStaticBoxSizer(rotBox, wxVERTICAL);
         3087  +  sizeBoxSizer->Add(rotSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
         3088  +  wxBoxSizer *rot1Sizer = new wxBoxSizer(wxHORIZONTAL);
         3089  +  rotSizer->Add(rot1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3090  +  wxTextCtrl *rotCtrl =
         3091  +    new wxTextCtrl(panel, ID_SYMBOLIZER_ROTATION, wxT("0.0"),
         3092  +                   wxDefaultPosition, wxSize(100, 22));
         3093  +  rot1Sizer->Add(rotCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3094  +// third row: AnchorPoint and Displacement
         3095  +  wxBoxSizer *anchorBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         3096  +  box2Sizer->Add(anchorBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3097  +// third row A: Anchor Point
         3098  +  wxStaticBox *anchorBox = new wxStaticBox(panel, wxID_STATIC,
         3099  +                                           wxT("Anchor Point"),
         3100  +                                           wxDefaultPosition,
         3101  +                                           wxDefaultSize);
         3102  +  wxBoxSizer *anchorSizer = new wxStaticBoxSizer(anchorBox, wxVERTICAL);
         3103  +  anchorBoxSizer->Add(anchorSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
         3104  +  wxBoxSizer *anchor1Sizer = new wxBoxSizer(wxHORIZONTAL);
         3105  +  anchorSizer->Add(anchor1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3106  +  wxStaticText *anchor1Label = new wxStaticText(panel, wxID_STATIC, wxT("X"));
         3107  +  anchor1Sizer->Add(anchor1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3108  +  wxTextCtrl *anchorXCtrl =
         3109  +    new wxTextCtrl(panel, ID_SYMBOLIZER_ANCHOR_X, wxT("0.5"),
         3110  +                   wxDefaultPosition, wxSize(100, 22));
         3111  +  anchor1Sizer->Add(anchorXCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3112  +  wxBoxSizer *anchor2Sizer = new wxBoxSizer(wxHORIZONTAL);
         3113  +  anchorSizer->Add(anchor2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3114  +  wxStaticText *anchor2Label = new wxStaticText(panel, wxID_STATIC, wxT("Y"));
         3115  +  anchor2Sizer->Add(anchor2Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3116  +  wxTextCtrl *anchorYCtrl =
         3117  +    new wxTextCtrl(panel, ID_SYMBOLIZER_ANCHOR_Y, wxT("0.5"),
         3118  +                   wxDefaultPosition, wxSize(100, 22));
         3119  +  anchor2Sizer->Add(anchorYCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3120  +// third row B: Displacement
         3121  +  wxStaticBox *displacementBox = new wxStaticBox(panel, wxID_STATIC,
         3122  +                                                 wxT("Displacement"),
         3123  +                                                 wxDefaultPosition,
         3124  +                                                 wxDefaultSize);
         3125  +  wxBoxSizer *displacementSizer =
         3126  +    new wxStaticBoxSizer(displacementBox, wxVERTICAL);
         3127  +  anchorBoxSizer->Add(displacementSizer, 0,
         3128  +                      wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
         3129  +  wxBoxSizer *displ1Sizer = new wxBoxSizer(wxHORIZONTAL);
         3130  +  displacementSizer->Add(displ1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3131  +  wxStaticText *displ1Label = new wxStaticText(panel, wxID_STATIC, wxT("X"));
         3132  +  displ1Sizer->Add(displ1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3133  +  wxTextCtrl *displacementXCtrl =
         3134  +    new wxTextCtrl(panel, ID_SYMBOLIZER_DISPLACEMENT_X, wxT("0.0"),
         3135  +                   wxDefaultPosition, wxSize(100, 22));
         3136  +  displ1Sizer->Add(displacementXCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3137  +  wxBoxSizer *displ2Sizer = new wxBoxSizer(wxHORIZONTAL);
         3138  +  displacementSizer->Add(displ2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3139  +  wxStaticText *displ2Label = new wxStaticText(panel, wxID_STATIC, wxT("Y"));
         3140  +  displ2Sizer->Add(displ2Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3141  +  wxTextCtrl *displacementYCtrl =
         3142  +    new wxTextCtrl(panel, ID_SYMBOLIZER_DISPLACEMENT_Y, wxT("0.0"),
         3143  +                   wxDefaultPosition, wxSize(100, 22));
         3144  +  displ2Sizer->Add(displacementYCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3145  +// fourth row: colors
         3146  +  wxBoxSizer *box3Sizer = new wxBoxSizer(wxHORIZONTAL);
         3147  +  boxSizer->Add(box3Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3148  +// first row A: Fill Color
         3149  +  wxBoxSizer *fillBoxSizer = new wxBoxSizer(wxVERTICAL);
         3150  +  box3Sizer->Add(fillBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3151  +  wxStaticBox *colorFillBox = new wxStaticBox(panel, wxID_STATIC,
         3152  +                                              wxT("Fill Color"),
         3153  +                                              wxDefaultPosition,
         3154  +                                              wxDefaultSize);
         3155  +  wxBoxSizer *colorFillSizer = new wxStaticBoxSizer(colorFillBox, wxVERTICAL);
         3156  +  box3Sizer->Add(colorFillSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         3157  +  wxBoxSizer *fill1Sizer = new wxBoxSizer(wxHORIZONTAL);
         3158  +  colorFillSizer->Add(fill1Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         3159  +  wxTextCtrl *fillColorCtrl =
         3160  +    new wxTextCtrl(panel, ID_SYMBOLIZER_FILL_COLOR, FillColor,
         3161  +                   wxDefaultPosition, wxSize(80, 22));
         3162  +  fill1Sizer->Add(fillColorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3163  +  wxBitmap bmp;
         3164  +  wxColour color(0, 0, 0);
         3165  +  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
         3166  +  wxStaticBitmap *sampleFillCtrl =
         3167  +    new wxStaticBitmap(panel, ID_SYMBOLIZER_FILL_PICKER_HEX, bmp,
         3168  +                       wxDefaultPosition, wxSize(32, 32));
         3169  +  fill1Sizer->Add(sampleFillCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3170  +  wxButton *pickFill =
         3171  +    new wxButton(panel, ID_SYMBOLIZER_FILL_PICKER_BTN, wxT("&Pick a color"));
         3172  +  fill1Sizer->Add(pickFill, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3173  +// second row B: Stroke Color
         3174  +  box3Sizer->AddSpacer(30);
         3175  +  wxStaticBox *colorStrokeBox = new wxStaticBox(panel, wxID_STATIC,
         3176  +                                                wxT("Stroke Color"),
         3177  +                                                wxDefaultPosition,
         3178  +                                                wxDefaultSize);
         3179  +  wxBoxSizer *colorStrokeSizer =
         3180  +    new wxStaticBoxSizer(colorStrokeBox, wxVERTICAL);
         3181  +  box3Sizer->Add(colorStrokeSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         3182  +  wxBoxSizer *stroke1Sizer = new wxBoxSizer(wxHORIZONTAL);
         3183  +  colorStrokeSizer->Add(stroke1Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         3184  +  wxTextCtrl *strokeColorCtrl =
         3185  +    new wxTextCtrl(panel, ID_SYMBOLIZER_STROKE_COLOR, StrokeColor,
         3186  +                   wxDefaultPosition, wxSize(80, 22));
         3187  +  stroke1Sizer->Add(strokeColorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3188  +  wxStaticBitmap *sampleStrokeCtrl =
         3189  +    new wxStaticBitmap(panel, ID_SYMBOLIZER_STROKE_PICKER_HEX, bmp,
         3190  +                       wxDefaultPosition, wxSize(32, 32));
         3191  +  stroke1Sizer->Add(sampleStrokeCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3192  +  wxButton *pickStroke =
         3193  +    new wxButton(panel, ID_SYMBOLIZER_STROKE_PICKER_BTN, wxT("&Pick a color"));
         3194  +  stroke1Sizer->Add(pickStroke, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3195  +  panel->SetSizer(topSizer);
         3196  +  topSizer->Fit(panel);
         3197  +// appends event handlers
         3198  +  Connect(ID_SYMBOLIZER_MARK, wxEVT_COMMAND_RADIOBOX_SELECTED,
         3199  +          (wxObjectEventFunction) & QuickStyleVectorDialog::OnCmdMarkChanged);
         3200  +  Connect(ID_SYMBOLIZER_FILL_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
         3201  +          (wxObjectEventFunction) &
         3202  +          QuickStyleVectorDialog::OnCmdPointColorFillPicker);
         3203  +  Connect(ID_SYMBOLIZER_FILL_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
         3204  +          (wxObjectEventFunction) &
         3205  +          QuickStyleVectorDialog::OnCmdPointColorFillChanged);
         3206  +  Connect(ID_SYMBOLIZER_STROKE_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
         3207  +          (wxObjectEventFunction) &
         3208  +          QuickStyleVectorDialog::OnCmdPointColorStrokePicker);
         3209  +  Connect(ID_SYMBOLIZER_STROKE_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
         3210  +          (wxObjectEventFunction) &
         3211  +          QuickStyleVectorDialog::OnCmdPointColorStrokeChanged);
         3212  +  return panel;
         3213  +}
         3214  +
         3215  +void QuickStyleVectorDialog::OnCmdMarkChanged(wxCommandEvent & WXUNUSED(event))
         3216  +{
         3217  +//
         3218  +// Mark selection changed
         3219  +//
         3220  +  wxRadioBox *markCtrl = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_MARK);
         3221  +  switch (markCtrl->GetSelection())
         3222  +    {
         3223  +      case 1:
         3224  +        Style->SetSymbolWellKnownMark(RL2_GRAPHIC_MARK_CIRCLE);
         3225  +        break;
         3226  +      case 2:
         3227  +        Style->SetSymbolWellKnownMark(RL2_GRAPHIC_MARK_TRIANGLE);
         3228  +        break;
         3229  +      case 3:
         3230  +        Style->SetSymbolWellKnownMark(RL2_GRAPHIC_MARK_STAR);
         3231  +        break;
         3232  +      case 4:
         3233  +        Style->SetSymbolWellKnownMark(RL2_GRAPHIC_MARK_CROSS);
         3234  +        break;
         3235  +      case 5:
         3236  +        Style->SetSymbolWellKnownMark(RL2_GRAPHIC_MARK_X);
         3237  +        break;
         3238  +      default:
         3239  +        Style->SetSymbolWellKnownMark(RL2_GRAPHIC_MARK_SQUARE);
         3240  +        break;
         3241  +    };
         3242  +}
         3243  +
         3244  +void QuickStyleVectorDialog::
         3245  +OnCmdPointColorFillChanged(wxCommandEvent & WXUNUSED(event))
         3246  +{
         3247  +//
         3248  +// Fill color changed: updating the visual sample
         3249  +//
         3250  +  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FILL_COLOR);
         3251  +  wxStaticBitmap *sampleCtrl =
         3252  +    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_FILL_PICKER_HEX);
         3253  +  wxColour back = wxColour(255, 255, 255);
         3254  +  wxString str = colorCtrl->GetValue();
         3255  +  if (ColorMapEntry::IsValidColor(str) == true)
         3256  +    ColorMapEntry::GetWxColor(str, back);
         3257  +  wxBitmap bmp;
         3258  +  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
         3259  +  sampleCtrl->SetBitmap(bmp);
         3260  +  sampleCtrl->Refresh();
         3261  +  sampleCtrl->Update();
         3262  +}
         3263  +
         3264  +void QuickStyleVectorDialog::
         3265  +OnCmdPointColorFillPicker(wxCommandEvent & WXUNUSED(event))
         3266  +{
         3267  +//
         3268  +// color picker
         3269  +//
         3270  +  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FILL_COLOR);
         3271  +  wxColour clr = wxNullColour;
         3272  +  wxString str = colorCtrl->GetValue();
         3273  +  if (ColorMapEntry::IsValidColor(str) == true)
         3274  +    ColorMapEntry::GetWxColor(str, clr);
         3275  +  wxColour color = wxGetColourFromUser(this, clr);
         3276  +  if (color.IsOk() == true)
         3277  +    {
         3278  +      char hex[16];
         3279  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         3280  +      wxString str = wxString::FromUTF8(hex);
         3281  +      colorCtrl->SetValue(str);
         3282  +    }
         3283  +}
         3284  +
         3285  +void QuickStyleVectorDialog::
         3286  +OnCmdPointColorStrokeChanged(wxCommandEvent & WXUNUSED(event))
         3287  +{
         3288  +//
         3289  +// Stroke color changed: updating the visual sample
         3290  +//
         3291  +  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE_COLOR);
         3292  +  wxStaticBitmap *sampleCtrl =
         3293  +    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_STROKE_PICKER_HEX);
         3294  +  wxColour back = wxColour(255, 255, 255);
         3295  +  wxString str = colorCtrl->GetValue();
         3296  +  if (ColorMapEntry::IsValidColor(str) == true)
         3297  +    ColorMapEntry::GetWxColor(str, back);
         3298  +  wxBitmap bmp;
         3299  +  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
         3300  +  sampleCtrl->SetBitmap(bmp);
         3301  +  sampleCtrl->Refresh();
         3302  +  sampleCtrl->Update();
         3303  +}
         3304  +
         3305  +void QuickStyleVectorDialog::
         3306  +OnCmdPointColorStrokePicker(wxCommandEvent & WXUNUSED(event))
         3307  +{
         3308  +//
         3309  +// color picker
         3310  +//
         3311  +  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE_COLOR);
         3312  +  wxColour clr = wxNullColour;
         3313  +  wxString str = colorCtrl->GetValue();
         3314  +  if (ColorMapEntry::IsValidColor(str) == true)
         3315  +    ColorMapEntry::GetWxColor(str, clr);
         3316  +  wxColour color = wxGetColourFromUser(this, clr);
         3317  +  if (color.IsOk() == true)
         3318  +    {
         3319  +      char hex[16];
         3320  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         3321  +      wxString str = wxString::FromUTF8(hex);
         3322  +      colorCtrl->SetValue(str);
         3323  +    }
         3324  +}
         3325  +
         3326  +wxPanel *QuickStyleVectorDialog::CreateLinePage(wxWindow * parent)
         3327  +{
         3328  +//
         3329  +// creating the Line Symbolizer page
         3330  +//
         3331  +  wxString StrokeColor = wxT("#000000");
         3332  +  wxPanel *panel = new wxPanel(parent, ID_PANE_LINE);
         3333  +  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
         3334  +  panel->SetSizer(topSizer);
         3335  +  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
         3336  +  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
         3337  +// first row A: the Stroke #1 Opacity and Perpendicular Offset
         3338  +  boxSizer->AddSpacer(50);
         3339  +  wxBoxSizer *opacityBoxSizer = new wxBoxSizer(wxVERTICAL);
         3340  +  boxSizer->Add(opacityBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3341  +  wxStaticBox *opacityBox = new wxStaticBox(panel, wxID_STATIC,
         3342  +                                            wxT("Opacity"),
         3343  +                                            wxDefaultPosition,
         3344  +                                            wxDefaultSize);
         3345  +  wxBoxSizer *opacitySizer = new wxStaticBoxSizer(opacityBox, wxHORIZONTAL);
         3346  +  opacityBoxSizer->Add(opacitySizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3347  +  wxSlider *opacityCtrl =
         3348  +    new wxSlider(panel, ID_SYMBOLIZER_STROKE1_OPACITY, 100, 0, 100,
         3349  +                 wxDefaultPosition, wxSize(600, 45),
         3350  +                 wxSL_HORIZONTAL | wxSL_LABELS);
         3351  +  opacitySizer->Add(opacityCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3352  +// first row B: PerpendicularOffset
         3353  +  wxBoxSizer *perpendicularBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         3354  +  opacityBoxSizer->Add(perpendicularBoxSizer, 0,
         3355  +                       wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3356  +  wxStaticBox *perpendicularBox = new wxStaticBox(panel, wxID_STATIC,
         3357  +                                                  wxT("Perpendicular Offset"),
         3358  +                                                  wxDefaultPosition,
         3359  +                                                  wxDefaultSize);
         3360  +  wxBoxSizer *perpendicularSizer =
         3361  +    new wxStaticBoxSizer(perpendicularBox, wxVERTICAL);
         3362  +  perpendicularBoxSizer->Add(perpendicularSizer, 0,
         3363  +                             wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         3364  +  wxBoxSizer *perp1Sizer = new wxBoxSizer(wxHORIZONTAL);
         3365  +  perpendicularSizer->Add(perp1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3366  +  wxTextCtrl *perpendicularCtrl =
         3367  +    new wxTextCtrl(panel, ID_SYMBOLIZER_STROKE1_PERPENDICULAR, wxT("0.0"),
         3368  +                   wxDefaultPosition, wxSize(100, 22));
         3369  +  perp1Sizer->Add(perpendicularCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         3370  +  wxStaticText *perp1Label = new wxStaticText(panel, wxID_STATIC,
         3371  +                                              wxT
         3372  +                                              ("Draw lines in parallel to the original geometry."));
         3373  +  perp1Sizer->Add(perp1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         3374  +  wxStaticText *perp2Label = new wxStaticText(panel, wxID_STATIC,
         3375  +                                              wxT
         3376  +                                              ("Positive to the left-hand side. Negative numbers mean right."));
         3377  +  perpendicularSizer->Add(perp2Label, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3378  +// second row: Stroke color or Graphic
         3379  +  wxBoxSizer *strokeSizer = new wxBoxSizer(wxHORIZONTAL);
         3380  +  boxSizer->Add(strokeSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3381  +// second row B: Stroke Color
         3382  +  wxBoxSizer *colorBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         3383  +  strokeSizer->Add(colorBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         3384  +  wxStaticBox *colorBox = new wxStaticBox(panel, wxID_STATIC,
         3385  +                                          wxT("Stroke Color"),
         3386  +                                          wxDefaultPosition,
         3387  +                                          wxDefaultSize);
         3388  +  wxBoxSizer *colorSizer = new wxStaticBoxSizer(colorBox, wxVERTICAL);
         3389  +  colorBoxSizer->Add(colorSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3390  +  wxBoxSizer *color1Sizer = new wxBoxSizer(wxHORIZONTAL);
         3391  +  colorSizer->Add(color1Sizer, 0, wxALIGN_RIGHT | wxALL, 0);
         3392  +  wxTextCtrl *colorCtrl =
         3393  +    new wxTextCtrl(panel, ID_SYMBOLIZER_STROKE1_COLOR, StrokeColor,
         3394  +                   wxDefaultPosition, wxSize(80, 22));
         3395  +  color1Sizer->Add(colorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3396  +  wxBitmap bmp;
         3397  +  wxColour color(0, 0, 0);
         3398  +  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
         3399  +  wxStaticBitmap *sampleCtrl =
         3400  +    new wxStaticBitmap(panel, ID_SYMBOLIZER_STROKE1_PICKER_HEX, bmp,
         3401  +                       wxDefaultPosition, wxSize(32, 32));
         3402  +  color1Sizer->Add(sampleCtrl, 0, wxALIGN_RIGHT | wxALL, 5);
         3403  +  wxBoxSizer *pickerSizer = new wxBoxSizer(wxHORIZONTAL);
         3404  +  colorSizer->Add(pickerSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3405  +  wxButton *pick =
         3406  +    new wxButton(panel, ID_SYMBOLIZER_STROKE1_PICKER_BTN, wxT("&Pick a color"));
         3407  +  pickerSizer->Add(pick, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         3408  +// third row: Stroke-Width 
         3409  +  wxBoxSizer *miscSizer = new wxBoxSizer(wxHORIZONTAL);
         3410  +  colorBoxSizer->Add(miscSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         3411  +// third row A: StrokeWidth
         3412  +  wxBoxSizer *widthBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         3413  +  miscSizer->Add(widthBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         3414  +  wxStaticBox *widthBox = new wxStaticBox(panel, wxID_STATIC,
         3415  +                                          wxT("Stroke Width"),
         3416  +                                          wxDefaultPosition,
         3417  +                                          wxDefaultSize);
         3418  +  wxBoxSizer *widthSizer = new wxStaticBoxSizer(widthBox, wxVERTICAL);
         3419  +  widthBoxSizer->Add(widthSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         3420  +  wxTextCtrl *widthCtrl =
         3421  +    new wxTextCtrl(panel, ID_SYMBOLIZER_STROKE1_WIDTH, wxT("1.0"),
         3422  +                   wxDefaultPosition, wxSize(100, 22));
         3423  +  widthSizer->Add(widthCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3424  +// third row D: DashArray and DashOffset
         3425  +  wxBoxSizer *dashBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         3426  +  miscSizer->Add(dashBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         3427  +  wxString dot[4];
         3428  +  dot[0] = wxT("&Solid Line");
         3429  +  dot[1] = wxT("&Dotted Line");
         3430  +  dot[2] = wxT("&Dashed Line");
         3431  +  dot[3] = wxT("&Dashed/Dotted Line");
         3432  +  wxRadioBox *dotBox = new wxRadioBox(panel, ID_SYMBOLIZER_DASH_DOT,
         3433  +                                      wxT("&Dash/Dot Style"),
         3434  +                                      wxDefaultPosition,
         3435  +                                      wxDefaultSize, 4,
         3436  +                                      dot, 1,
         3437  +                                      wxRA_SPECIFY_COLS);
         3438  +  dotBox->SetSelection(0);
         3439  +  dashBoxSizer->Add(dotBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3440  +  panel->SetSizer(topSizer);
         3441  +  topSizer->Fit(panel);
         3442  +// appends event handlers
         3443  +  Connect(ID_SYMBOLIZER_STROKE1_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
         3444  +          (wxObjectEventFunction) &
         3445  +          QuickStyleVectorDialog::OnCmdLineColorChanged);
         3446  +  Connect(ID_SYMBOLIZER_STROKE1_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
         3447  +          (wxObjectEventFunction) &
         3448  +          QuickStyleVectorDialog::OnCmdLineColorPicker);
         3449  +  return panel;
         3450  +}
         3451  +
         3452  +void QuickStyleVectorDialog::
         3453  +OnCmdLineColorChanged(wxCommandEvent & WXUNUSED(event))
         3454  +{
         3455  +//
         3456  +// Stroke color changed: updating the visual sample
         3457  +//
         3458  +  wxTextCtrl *colorCtrl =
         3459  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_COLOR);
         3460  +  wxStaticBitmap *sampleCtrl =
         3461  +    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_STROKE1_PICKER_HEX);
         3462  +  wxColour back = wxColour(255, 255, 255);
         3463  +  wxString str = colorCtrl->GetValue();
         3464  +  if (ColorMapEntry::IsValidColor(str) == true)
         3465  +    ColorMapEntry::GetWxColor(str, back);
         3466  +  wxBitmap bmp;
         3467  +  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
         3468  +  sampleCtrl->SetBitmap(bmp);
         3469  +  sampleCtrl->Refresh();
         3470  +  sampleCtrl->Update();
         3471  +}
         3472  +
         3473  +void QuickStyleVectorDialog::
         3474  +OnCmdLineColorPicker(wxCommandEvent & WXUNUSED(event))
         3475  +{
         3476  +//
         3477  +// color picker
         3478  +//
         3479  +  wxTextCtrl *colorCtrl =
         3480  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_COLOR);
         3481  +  wxColour clr = wxNullColour;
         3482  +  wxString str = colorCtrl->GetValue();
         3483  +  if (ColorMapEntry::IsValidColor(str) == true)
         3484  +    ColorMapEntry::GetWxColor(str, clr);
         3485  +  wxColour color = wxGetColourFromUser(this, clr);
         3486  +  if (color.IsOk() == true)
         3487  +    {
         3488  +      char hex[16];
         3489  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         3490  +      wxString str = wxString::FromUTF8(hex);
         3491  +      colorCtrl->SetValue(str);
         3492  +    }
         3493  +}
         3494  +
         3495  +wxPanel *QuickStyleVectorDialog::CreatePolygonPage(wxWindow * parent)
         3496  +{
         3497  +//
         3498  +// creating the Polygon Symbolizer page
         3499  +//
         3500  +  wxString StrokeColor = wxT("#000000");
         3501  +  wxString FillColor = wxT("#808080");
         3502  +  wxPanel *panel = new wxPanel(parent, ID_PANE_FILL2);
         3503  +  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
         3504  +  panel->SetSizer(topSizer);
         3505  +  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
         3506  +  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
         3507  +// first row: the Polygon Displacement and Perpendicular Offset
         3508  +  wxBoxSizer *polygonBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         3509  +  boxSizer->Add(polygonBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         3510  +// first row A: Displacement
         3511  +  wxBoxSizer *displacementBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         3512  +  polygonBoxSizer->Add(displacementBoxSizer, 0,
         3513  +                       wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3514  +  wxStaticBox *displacementBox = new wxStaticBox(panel, wxID_STATIC,
         3515  +                                                 wxT("Displacement"),
         3516  +                                                 wxDefaultPosition,
         3517  +                                                 wxDefaultSize);
         3518  +  wxBoxSizer *displacementSizer =
         3519  +    new wxStaticBoxSizer(displacementBox, wxVERTICAL);
         3520  +  displacementBoxSizer->Add(displacementSizer, 0,
         3521  +                            wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         3522  +  wxBoxSizer *displ1Sizer = new wxBoxSizer(wxHORIZONTAL);
         3523  +  displacementSizer->Add(displ1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3524  +  wxStaticText *displ1Label = new wxStaticText(panel, wxID_STATIC, wxT("X"));
         3525  +  displ1Sizer->Add(displ1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         3526  +  wxTextCtrl *displacementXCtrl =
         3527  +    new wxTextCtrl(panel, ID_SYMBOLIZER_POLYGON1_DISPLACEMENT_X, wxT("0.0"),
         3528  +                   wxDefaultPosition, wxSize(100, 22));
         3529  +  displ1Sizer->Add(displacementXCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         3530  +  wxBoxSizer *displ2Sizer = new wxBoxSizer(wxHORIZONTAL);
         3531  +  displacementSizer->Add(displ2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3532  +  wxStaticText *displ2Label = new wxStaticText(panel, wxID_STATIC, wxT("Y"));
         3533  +  displ2Sizer->Add(displ2Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         3534  +  wxTextCtrl *displacementYCtrl =
         3535  +    new wxTextCtrl(panel, ID_SYMBOLIZER_POLYGON1_DISPLACEMENT_Y, wxT("0.0"),
         3536  +                   wxDefaultPosition, wxSize(100, 22));
         3537  +  displ2Sizer->Add(displacementYCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         3538  +// first row B: PerpendicularOffset
         3539  +  wxBoxSizer *perpendicularBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         3540  +  polygonBoxSizer->Add(perpendicularBoxSizer, 0,
         3541  +                       wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3542  +  wxStaticBox *perpendicularBox = new wxStaticBox(panel, wxID_STATIC,
         3543  +                                                  wxT("Perpendicular Offset"),
         3544  +                                                  wxDefaultPosition,
         3545  +                                                  wxDefaultSize);
         3546  +  wxBoxSizer *perpendicularSizer =
         3547  +    new wxStaticBoxSizer(perpendicularBox, wxVERTICAL);
         3548  +  perpendicularBoxSizer->Add(perpendicularSizer, 0,
         3549  +                             wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3550  +  wxBoxSizer *perp1Sizer = new wxBoxSizer(wxHORIZONTAL);
         3551  +  perpendicularSizer->Add(perp1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3552  +  wxTextCtrl *perpendicularCtrl =
         3553  +    new wxTextCtrl(panel, ID_SYMBOLIZER_POLYGON1_PERPENDICULAR, wxT("0.0"),
         3554  +                   wxDefaultPosition, wxSize(100, 22));
         3555  +  perp1Sizer->Add(perpendicularCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         3556  +  wxStaticText *perp1Label = new wxStaticText(panel, wxID_STATIC,
         3557  +                                              wxT
         3558  +                                              ("Positive: larger. / Negative: smaller."));
         3559  +  perp1Sizer->Add(perp1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         3560  +  wxStaticText *perp2Label = new wxStaticText(panel, wxID_STATIC,
         3561  +                                              wxT
         3562  +                                              ("Drawing polygons smaller or larger than their actual geometry (Buffer)."));
         3563  +  perpendicularSizer->Add(perp2Label, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3564  +// second row: Fill Opacity
         3565  +  wxBoxSizer *auxBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         3566  +  boxSizer->Add(auxBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3567  +  wxStaticBox *auxBox = new wxStaticBox(panel, wxID_STATIC,
         3568  +                                        wxT("Polygon Fill"),
         3569  +                                        wxDefaultPosition,
         3570  +                                        wxDefaultSize);
         3571  +  wxBoxSizer *auxSizer = new wxStaticBoxSizer(auxBox, wxHORIZONTAL);
         3572  +  auxBoxSizer->Add(auxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3573  +  wxBoxSizer *enableSizer = new wxBoxSizer(wxHORIZONTAL);
         3574  +  auxSizer->Add(enableSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         3575  +  wxCheckBox *enableCtrl = new wxCheckBox(panel, ID_SYMBOLIZER_FILL2_ENABLE,
         3576  +                                          wxT("Enable"),
         3577  +                                          wxDefaultPosition, wxDefaultSize);
         3578  +  enableCtrl->SetValue(Style->IsPolygonFill());
         3579  +  enableSizer->Add(enableCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3580  +  wxBoxSizer *opacityBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         3581  +  enableSizer->Add(opacityBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         3582  +  wxStaticBox *opacityBox = new wxStaticBox(panel, wxID_STATIC,
         3583  +                                            wxT("Opacity"),
         3584  +                                            wxDefaultPosition,
         3585  +                                            wxDefaultSize);
         3586  +  wxBoxSizer *opacitySizer = new wxStaticBoxSizer(opacityBox, wxVERTICAL);
         3587  +  opacityBoxSizer->Add(opacitySizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3588  +  wxSlider *opacityCtrl =
         3589  +    new wxSlider(panel, ID_SYMBOLIZER_FILL2_OPACITY, 100, 0, 100,
         3590  +                 wxDefaultPosition, wxSize(400, 45),
         3591  +                 wxSL_HORIZONTAL | wxSL_LABELS);
         3592  +  opacityCtrl->Enable(Style->IsPolygonFill());
         3593  +  opacitySizer->Add(opacityCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3594  +// third row B: Fill Color
         3595  +  wxBoxSizer *colorBoxSizer = new wxBoxSizer(wxVERTICAL);
         3596  +  auxSizer->Add(colorBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3597  +  wxStaticBox *colorBox = new wxStaticBox(panel, wxID_STATIC,
         3598  +                                          wxT("Fill Color"),
         3599  +                                          wxDefaultPosition,
         3600  +                                          wxDefaultSize);
         3601  +  wxBoxSizer *colorSizer = new wxStaticBoxSizer(colorBox, wxVERTICAL);
         3602  +  colorBoxSizer->Add(colorSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3603  +  wxBoxSizer *color1Sizer = new wxBoxSizer(wxHORIZONTAL);
         3604  +  colorSizer->Add(color1Sizer, 0, wxALIGN_RIGHT | wxALL, 0);
         3605  +  wxTextCtrl *colorCtrl =
         3606  +    new wxTextCtrl(panel, ID_SYMBOLIZER_FILL2_COLOR, FillColor,
         3607  +                   wxDefaultPosition, wxSize(80, 22));
         3608  +  color1Sizer->Add(colorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3609  +  wxBitmap bmp;
         3610  +  wxColour color(0, 0, 0);
         3611  +  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
         3612  +  wxStaticBitmap *sampleCtrl =
         3613  +    new wxStaticBitmap(panel, ID_SYMBOLIZER_FILL2_PICKER_HEX, bmp,
         3614  +                       wxDefaultPosition, wxSize(32, 32));
         3615  +  sampleCtrl->Enable(Style->IsPolygonFill());
         3616  +  color1Sizer->Add(sampleCtrl, 0, wxALIGN_RIGHT | wxALL, 5);
         3617  +  wxBoxSizer *pickerSizer = new wxBoxSizer(wxHORIZONTAL);
         3618  +  colorSizer->Add(pickerSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3619  +  wxButton *pick =
         3620  +    new wxButton(panel, ID_SYMBOLIZER_FILL2_PICKER_BTN, wxT("&Pick a color"));
         3621  +  pick->Enable(Style->IsPolygonFill());
         3622  +  pickerSizer->Add(pick, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         3623  +// first row A: the Stroke #1 Opacity 
         3624  +  wxBoxSizer *opacity2BoxSizer = new wxBoxSizer(wxHORIZONTAL);
         3625  +  boxSizer->Add(opacity2BoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         3626  +  wxStaticBox *enableBox = new wxStaticBox(panel, wxID_STATIC,
         3627  +                                           wxT("Polygon Stroke"),
         3628  +                                           wxDefaultPosition,
         3629  +                                           wxDefaultSize);
         3630  +  wxBoxSizer *enable2Sizer = new wxStaticBoxSizer(enableBox, wxHORIZONTAL);
         3631  +  opacity2BoxSizer->Add(enable2Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3632  +  wxCheckBox *enable2Ctrl = new wxCheckBox(panel, ID_SYMBOLIZER_STROKE2_ENABLE,
         3633  +                                           wxT("Enable"),
         3634  +                                           wxDefaultPosition, wxDefaultSize);
         3635  +  enable2Ctrl->SetValue(Style->IsPolygonStroke());
         3636  +  enable2Sizer->Add(enable2Ctrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3637  +  wxStaticBox *opacity2Box = new wxStaticBox(panel, wxID_STATIC,
         3638  +                                             wxT("Opacity"),
         3639  +                                             wxDefaultPosition,
         3640  +                                             wxDefaultSize);
         3641  +  wxBoxSizer *opacity2Sizer = new wxStaticBoxSizer(opacity2Box, wxVERTICAL);
         3642  +  enable2Sizer->Add(opacity2Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3643  +  wxSlider *opacity2Ctrl =
         3644  +    new wxSlider(panel, ID_SYMBOLIZER_STROKE2_OPACITY, 100, 0, 100,
         3645  +                 wxDefaultPosition, wxSize(250, 45),
         3646  +                 wxSL_HORIZONTAL | wxSL_LABELS);
         3647  +  opacity2Ctrl->Enable(Style->IsPolygonStroke());
         3648  +  opacity2Sizer->Add(opacity2Ctrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3649  +// second row B: Stroke Color
         3650  +  wxStaticBox *color2Box = new wxStaticBox(panel, wxID_STATIC,
         3651  +                                           wxT("Stroke Color"),
         3652  +                                           wxDefaultPosition,
         3653  +                                           wxDefaultSize);
         3654  +  wxBoxSizer *color2Sizer = new wxStaticBoxSizer(color2Box, wxVERTICAL);
         3655  +  enable2Sizer->Add(color2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         3656  +  wxBoxSizer *color3Sizer = new wxBoxSizer(wxHORIZONTAL);
         3657  +  color2Sizer->Add(color3Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3658  +  wxTextCtrl *color2Ctrl =
         3659  +    new wxTextCtrl(panel, ID_SYMBOLIZER_STROKE2_COLOR, StrokeColor,
         3660  +                   wxDefaultPosition, wxSize(80, 22));
         3661  +  color2Ctrl->Enable(Style->IsPolygonStroke());
         3662  +  color3Sizer->Add(color2Ctrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3663  +  wxStaticBitmap *sample2Ctrl =
         3664  +    new wxStaticBitmap(panel, ID_SYMBOLIZER_STROKE2_PICKER_HEX, bmp,
         3665  +                       wxDefaultPosition, wxSize(32, 32));
         3666  +  sample2Ctrl->Enable(Style->IsPolygonStroke());
         3667  +  color3Sizer->Add(sample2Ctrl, 0, wxALIGN_RIGHT | wxALL, 5);
         3668  +  wxBoxSizer *picker2Sizer = new wxBoxSizer(wxHORIZONTAL);
         3669  +  color2Sizer->Add(picker2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         3670  +  wxButton *pick2 =
         3671  +    new wxButton(panel, ID_SYMBOLIZER_STROKE2_PICKER_BTN, wxT("&Pick a color"));
         3672  +  pick2->Enable(Style->IsPolygonStroke());
         3673  +  picker2Sizer->Add(pick2, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         3674  +// third row: Stroke-Width,
         3675  +  wxBoxSizer *miscSizer = new wxBoxSizer(wxHORIZONTAL);
         3676  +  enable2Sizer->Add(miscSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         3677  +// third row A: StrokeWidth
         3678  +  wxBoxSizer *widthBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         3679  +  miscSizer->Add(widthBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         3680  +  wxStaticBox *widthBox = new wxStaticBox(panel, wxID_STATIC,
         3681  +                                          wxT("Stroke Width"),
         3682  +                                          wxDefaultPosition,
         3683  +                                          wxDefaultSize);
         3684  +  wxBoxSizer *widthSizer = new wxStaticBoxSizer(widthBox, wxVERTICAL);
         3685  +  widthBoxSizer->Add(widthSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3686  +  wxTextCtrl *widthCtrl =
         3687  +    new wxTextCtrl(panel, ID_SYMBOLIZER_STROKE2_WIDTH, wxT("1.0"),
         3688  +                   wxDefaultPosition, wxSize(100, 22));
         3689  +  widthCtrl->Enable(false);
         3690  +  widthSizer->Add(widthCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         3691  +
         3692  +  panel->SetSizer(topSizer);
         3693  +  topSizer->Fit(panel);
         3694  +// appends event handlers
         3695  +  Connect(ID_SYMBOLIZER_STROKE2_ENABLE, wxEVT_COMMAND_CHECKBOX_CLICKED,
         3696  +          (wxObjectEventFunction) &
         3697  +          QuickStyleVectorDialog::OnCmdPolygonStrokeChanged);
         3698  +  Connect(ID_SYMBOLIZER_FILL2_ENABLE, wxEVT_COMMAND_CHECKBOX_CLICKED,
         3699  +          (wxObjectEventFunction) &
         3700  +          QuickStyleVectorDialog::OnCmdPolygonFillChanged);
         3701  +  Connect(ID_SYMBOLIZER_FILL2_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
         3702  +          (wxObjectEventFunction) &
         3703  +          QuickStyleVectorDialog::OnCmdPolygonColorFillChanged);
         3704  +  Connect(ID_SYMBOLIZER_FILL2_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
         3705  +          (wxObjectEventFunction) &
         3706  +          QuickStyleVectorDialog::OnCmdPolygonColorFillPicker);
         3707  +  Connect(ID_SYMBOLIZER_STROKE2_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
         3708  +          (wxObjectEventFunction) &
         3709  +          QuickStyleVectorDialog::OnCmdPolygonColorStrokeChanged);
         3710  +  Connect(ID_SYMBOLIZER_STROKE2_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
         3711  +          (wxObjectEventFunction) &
         3712  +          QuickStyleVectorDialog::OnCmdPolygonColorStrokePicker);
         3713  +  return panel;
         3714  +}
         3715  +
         3716  +void QuickStyleVectorDialog::
         3717  +OnCmdPolygonStrokeChanged(wxCommandEvent & WXUNUSED(event))
         3718  +{
         3719  +//
         3720  +// Stroke enable/disable 
         3721  +//
         3722  +  wxCheckBox *enableCtrl =
         3723  +    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_STROKE2_ENABLE);
         3724  +  if (enableCtrl->IsChecked() == true)
         3725  +    Style->SetPolygonStroke(true);
         3726  +  else
         3727  +    Style->SetPolygonStroke(false);
         3728  +  RetrievePolygonPage(false);
         3729  +  UpdatePolygonPage();
         3730  +}
         3731  +
         3732  +void QuickStyleVectorDialog::
         3733  +OnCmdPolygonFillChanged(wxCommandEvent & WXUNUSED(event))
         3734  +{
         3735  +//
         3736  +// Fill enable/disable 
         3737  +//
         3738  +  wxCheckBox *enableCtrl =
         3739  +    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_FILL2_ENABLE);
         3740  +  if (enableCtrl->IsChecked() == true)
         3741  +    Style->SetPolygonFill(true);
         3742  +  else
         3743  +    Style->SetPolygonFill(false);
         3744  +  RetrievePolygonPage(false);
         3745  +  UpdatePolygonPage();
         3746  +}
         3747  +
         3748  +void QuickStyleVectorDialog::
         3749  +OnCmdPolygonColorFillChanged(wxCommandEvent & WXUNUSED(event))
         3750  +{
         3751  +//
         3752  +// Fill color changed: updating the visual sample
         3753  +//
         3754  +  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FILL2_COLOR);
         3755  +  wxStaticBitmap *sampleCtrl =
         3756  +    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_FILL2_PICKER_HEX);
         3757  +  wxColour back = wxColour(255, 255, 255);
         3758  +  wxString str = colorCtrl->GetValue();
         3759  +  if (ColorMapEntry::IsValidColor(str) == true)
         3760  +    ColorMapEntry::GetWxColor(str, back);
         3761  +  wxBitmap bmp;
         3762  +  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
         3763  +  sampleCtrl->SetBitmap(bmp);
         3764  +  sampleCtrl->Refresh();
         3765  +  sampleCtrl->Update();
         3766  +}
         3767  +
         3768  +void QuickStyleVectorDialog::
         3769  +OnCmdPolygonColorFillPicker(wxCommandEvent & WXUNUSED(event))
         3770  +{
         3771  +//
         3772  +// color picker
         3773  +//
         3774  +  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FILL2_COLOR);
         3775  +  wxColour clr = wxNullColour;
         3776  +  wxString str = colorCtrl->GetValue();
         3777  +  if (ColorMapEntry::IsValidColor(str) == true)
         3778  +    ColorMapEntry::GetWxColor(str, clr);
         3779  +  wxColour color = wxGetColourFromUser(this, clr);
         3780  +  if (color.IsOk() == true)
         3781  +    {
         3782  +      char hex[16];
         3783  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         3784  +      wxString str = wxString::FromUTF8(hex);
         3785  +      colorCtrl->SetValue(str);
         3786  +    }
         3787  +}
         3788  +
         3789  +void QuickStyleVectorDialog::
         3790  +OnCmdPolygonColorStrokeChanged(wxCommandEvent & WXUNUSED(event))
         3791  +{
         3792  +//
         3793  +// Stroke color changed: updating the visual sample
         3794  +//
         3795  +  wxTextCtrl *colorCtrl =
         3796  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE2_COLOR);
         3797  +  wxStaticBitmap *sampleCtrl =
         3798  +    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_STROKE2_PICKER_HEX);
         3799  +  wxColour back = wxColour(255, 255, 255);
         3800  +  wxString str = colorCtrl->GetValue();
         3801  +  if (ColorMapEntry::IsValidColor(str) == true)
         3802  +    ColorMapEntry::GetWxColor(str, back);
         3803  +  wxBitmap bmp;
         3804  +  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
         3805  +  sampleCtrl->SetBitmap(bmp);
         3806  +  sampleCtrl->Refresh();
         3807  +  sampleCtrl->Update();
         3808  +}
         3809  +
         3810  +void QuickStyleVectorDialog::
         3811  +OnCmdPolygonColorStrokePicker(wxCommandEvent & WXUNUSED(event))
         3812  +{
         3813  +//
         3814  +// color picker
         3815  +//
         3816  +  wxTextCtrl *colorCtrl =
         3817  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE2_COLOR);
         3818  +  wxColour clr = wxNullColour;
         3819  +  wxString str = colorCtrl->GetValue();
         3820  +  if (ColorMapEntry::IsValidColor(str) == true)
         3821  +    ColorMapEntry::GetWxColor(str, clr);
         3822  +  wxColour color = wxGetColourFromUser(this, clr);
         3823  +  if (color.IsOk() == true)
         3824  +    {
         3825  +      char hex[16];
         3826  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         3827  +      wxString str = wxString::FromUTF8(hex);
         3828  +      colorCtrl->SetValue(str);
         3829  +    }
         3830  +}
         3831  +
         3832  +bool QuickStyleVectorDialog::DoCheckDatasource(const char *prefix,
         3833  +                                               const char *coverage,
         3834  +                                               char *table, char *geometry)
         3835  +{
         3836  +//
         3837  +// retrieving the real table and geometry column names
         3838  +//
         3839  +  sqlite3 *sqlite = MainFrame->GetSqlite();
         3840  +  char *sql;
         3841  +  int ret;
         3842  +  char **results;
         3843  +  int rows;
         3844  +  int columns;
         3845  +  int i;
         3846  +  char *qprefix;
         3847  +  bool ok = false;
         3848  +
         3849  +  qprefix = gaiaDoubleQuotedSql(prefix);
         3850  +  sql = sqlite3_mprintf("SELECT f_table_name, f_geometry_column, view_name, "
         3851  +                        "view_geometry, virt_name, virt_geometry "
         3852  +                        "FROM \"%s\".vector_coverages WHERE coverage_name = %Q",
         3853  +                        qprefix, coverage);
         3854  +  free(qprefix);
         3855  +  ret = sqlite3_get_table(sqlite, sql, &results, &rows, &columns, NULL);
         3856  +  sqlite3_free(sql);
         3857  +  if (ret != SQLITE_OK)
         3858  +    return false;
         3859  +  if (rows < 1)
         3860  +    ;
         3861  +  else
         3862  +    {
         3863  +      for (i = 1; i <= rows; i++)
         3864  +        {
         3865  +          const char *t = results[(i * columns) + 0];
         3866  +          const char *g = results[(i * columns) + 1];
         3867  +          if (t != NULL && g != NULL)
         3868  +            {
         3869  +              strcpy(table, t);
         3870  +              strcpy(geometry, g);
         3871  +              ok = true;
         3872  +            }
         3873  +          t = results[(i * columns) + 2];
         3874  +          g = results[(i * columns) + 3];
         3875  +          if (t != NULL && g != NULL)
         3876  +            {
         3877  +              strcpy(table, t);
         3878  +              strcpy(geometry, g);
         3879  +              ok = true;
         3880  +            }
         3881  +          t = results[(i * columns) + 4];
         3882  +          g = results[(i * columns) + 5];
         3883  +          if (t != NULL && g != NULL)
         3884  +            {
         3885  +              strcpy(table, t);
         3886  +              strcpy(geometry, g);
         3887  +              ok = true;
         3888  +            }
         3889  +        }
         3890  +    }
         3891  +  sqlite3_free_table(results);
         3892  +  return ok;
         3893  +}
         3894  +
         3895  +void QuickStyleVectorDialog::InitializeComboColumns(wxComboBox * ctrl)
         3896  +{
         3897  +//
         3898  +// initializing a Column list ComboBox
         3899  +//
         3900  +  sqlite3 *sqlite = MainFrame->GetSqlite();
         3901  +  char *sql;
         3902  +  int ret;
         3903  +  char **results;
         3904  +  int rows;
         3905  +  int columns;
         3906  +  int i;
         3907  +  char prefix[1024];
         3908  +  char coverage[1024];
         3909  +  char table[1024];
         3910  +  char geometry[1024];
         3911  +  char *qprefix;
         3912  +  char *qtable;
         3913  +  char *qgeometry;
         3914  +
         3915  +  if (DbPrefix.Len() == 0)
         3916  +    strcpy(prefix, "MAIN");
         3917  +  else
         3918  +    strcpy(prefix, DbPrefix.ToUTF8());
         3919  +  strcpy(coverage, LayerName.ToUTF8());
         3920  +  if (DoCheckDatasource(prefix, coverage, table, geometry) != true)
         3921  +    return;
         3922  +
         3923  +  qprefix = gaiaDoubleQuotedSql(prefix);
         3924  +  qtable = gaiaDoubleQuotedSql(table);
         3925  +  sql = sqlite3_mprintf("PRAGMA \"%s\".table_info(\"%s\")", qprefix, qtable);
         3926  +  free(qprefix);
         3927  +  free(qtable);
         3928  +  ret = sqlite3_get_table(sqlite, sql, &results, &rows, &columns, NULL);
         3929  +  sqlite3_free(sql);
         3930  +  if (ret != SQLITE_OK)
         3931  +    return;
         3932  +  if (rows < 1)
         3933  +    ;
         3934  +  else
         3935  +    {
         3936  +      for (i = 1; i <= rows; i++)
         3937  +        {
         3938  +          const char *value = results[(i * columns) + 1];
         3939  +          if (strcasecmp(value, geometry) == 0)
         3940  +            continue;           // skipping the Geometry column
         3941  +          wxString col = wxString::FromUTF8(value);
         3942  +          ctrl->Append(col);
         3943  +        }
         3944  +    }
         3945  +  sqlite3_free_table(results);
         3946  +}
         3947  +
         3948  +void QuickStyleVectorDialog::InitializeComboFonts(wxComboBox * ctrl)
         3949  +{
         3950  +//
         3951  +// initializing a Font list ComboBox
         3952  +//
         3953  +  sqlite3 *sqlite = MainFrame->GetSqlite();
         3954  +  char *sql;
         3955  +  int ret;
         3956  +  char **results;
         3957  +  int rows;
         3958  +  int columns;
         3959  +  int i;
         3960  +  char prefix[1024];
         3961  +  char *qprefix;
         3962  +
         3963  +// inserting the default TOY FONTS
         3964  +  wxString font = wxT("ToyFont: serif");
         3965  +  ctrl->Append(font);
         3966  +  font = wxT("ToyFont: sans-serif");
         3967  +  ctrl->Append(font);
         3968  +  font = wxT("ToyFont: monospace");
         3969  +  ctrl->Append(font);
         3970  +
         3971  +  if (DbPrefix.Len() == 0)
         3972  +    strcpy(prefix, "MAIN");
         3973  +  else
         3974  +    strcpy(prefix, DbPrefix.ToUTF8());
         3975  +  qprefix = gaiaDoubleQuotedSql(prefix);
         3976  +  sql =
         3977  +    sqlite3_mprintf
         3978  +    ("SELECT font_facename FROM \"%s\".SE_fonts ORDER BY font_facename",
         3979  +     qprefix);
         3980  +  free(qprefix);
         3981  +  ret = sqlite3_get_table(sqlite, sql, &results, &rows, &columns, NULL);
         3982  +  sqlite3_free(sql);
         3983  +  if (ret != SQLITE_OK)
         3984  +    return;
         3985  +  if (rows < 1)
         3986  +    ;
         3987  +  else
         3988  +    {
         3989  +      for (i = 1; i <= rows; i++)
         3990  +        {
         3991  +          const char *value = results[(i * columns) + 0];
         3992  +          wxString col = wxString::FromUTF8(value);
         3993  +          ctrl->Append(col);
         3994  +        }
         3995  +    }
         3996  +  sqlite3_free_table(results);
         3997  +}
         3998  +
         3999  +wxPanel *QuickStyleVectorDialog::CreateTextPointPage(wxWindow * parent)
         4000  +{
         4001  +//
         4002  +// creating the Text Symbolizer page (Point Placement)
         4003  +//
         4004  +  wxString FillColor = wxT("#808080");
         4005  +  wxPanel *panel = new wxPanel(parent, ID_PANE_TEXT1);
         4006  +  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
         4007  +  panel->SetSizer(topSizer);
         4008  +  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
         4009  +  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
         4010  +// enable/disable Labels
         4011  +  wxBoxSizer *auxBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         4012  +  boxSizer->Add(auxBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4013  +  wxStaticBox *auxBox = new wxStaticBox(panel, wxID_STATIC,
         4014  +                                        wxT("Labels"),
         4015  +                                        wxDefaultPosition,
         4016  +                                        wxDefaultSize);
         4017  +  wxBoxSizer *auxSizer = new wxStaticBoxSizer(auxBox, wxVERTICAL);
         4018  +  auxBoxSizer->Add(auxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         4019  +  wxBoxSizer *enableSizer = new wxBoxSizer(wxHORIZONTAL);
         4020  +  auxSizer->Add(enableSizer, 0, wxALIGN_LEFT | wxALL, 5);
         4021  +  wxCheckBox *enableCtrl = new wxCheckBox(panel, ID_SYMBOLIZER_TEXT1_ENABLE,
         4022  +                                          wxT("Enable"),
         4023  +                                          wxDefaultPosition, wxDefaultSize);
         4024  +  enableCtrl->SetValue(Style->IsLabelPrint());
         4025  +  enableSizer->Add(enableCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         4026  +  enableSizer->AddSpacer(20);
         4027  +  enableSizer->AddSpacer(20);
         4028  +  enableSizer->AddSpacer(20);
         4029  +  enableSizer->AddSpacer(20);
         4030  +  wxStaticText *columnLabel =
         4031  +    new wxStaticText(panel, wxID_STATIC, wxT("&Column:"));
         4032  +  enableSizer->Add(columnLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         4033  +  wxComboBox *columnList =
         4034  +    new wxComboBox(panel, ID_SYMBOLIZER_TEXT1_LABEL, wxT(""), wxDefaultPosition,
         4035  +                   wxSize(400, 22), 0, NULL, wxCB_DROPDOWN | wxCB_READONLY);
         4036  +  InitializeComboColumns(columnList);
         4037  +  enableSizer->Add(columnList, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         4038  +
         4039  +
         4040  +  wxStaticBox *fontBox = new wxStaticBox(panel, wxID_STATIC,
         4041  +                                         wxT("Font"),
         4042  +                                         wxDefaultPosition,
         4043  +                                         wxDefaultSize);
         4044  +  wxBoxSizer *font9Sizer = new wxStaticBoxSizer(fontBox, wxHORIZONTAL);
         4045  +  auxSizer->Add(font9Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4046  +// Second row: Font Name, Size and Fill 
         4047  +  wxBoxSizer *fontSizer = new wxBoxSizer(wxHORIZONTAL);
         4048  +  font9Sizer->Add(fontSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         4049  +  wxBoxSizer *font0Sizer = new wxBoxSizer(wxHORIZONTAL);
         4050  +  fontSizer->Add(font0Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         4051  +// Font Name
         4052  +  wxBoxSizer *fontXSizer = new wxBoxSizer(wxVERTICAL);
         4053  +  font0Sizer->Add(fontXSizer, 0, wxALIGN_LEFT | wxALL, 0);
         4054  +  wxComboBox *fontList =
         4055  +    new wxComboBox(panel, ID_SYMBOLIZER_FONT1_NAME, wxT(""), wxDefaultPosition,
         4056  +                   wxSize(250, 21), 0, NULL, wxCB_DROPDOWN | wxCB_READONLY);
         4057  +  InitializeComboFonts(fontList);
         4058  +  fontList->Select(0);
         4059  +  fontXSizer->Add(fontList, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4060  +// Font Size
         4061  +  wxBoxSizer *fontYSizer = new wxBoxSizer(wxHORIZONTAL);
         4062  +  fontXSizer->Add(fontYSizer, 0, wxALIGN_LEFT | wxALL, 0);
         4063  +  wxStaticBox *sizeBox = new wxStaticBox(panel, wxID_STATIC,
         4064  +                                         wxT("Font Size"),
         4065  +                                         wxDefaultPosition,
         4066  +                                         wxDefaultSize);
         4067  +  wxBoxSizer *sizeSizer = new wxStaticBoxSizer(sizeBox, wxHORIZONTAL);
         4068  +  fontYSizer->Add(sizeSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4069  +  wxTextCtrl *sizeCtrl =
         4070  +    new wxTextCtrl(panel, ID_SYMBOLIZER_FONT1_SIZE, wxT("15.0"),
         4071  +                   wxDefaultPosition, wxSize(100, 22));
         4072  +  sizeSizer->Add(sizeCtrl, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         4073  +  wxBoxSizer *boldBoxSizer = new wxBoxSizer(wxVERTICAL);
         4074  +  fontYSizer->Add(boldBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4075  +  wxStaticBox *boldBox = new wxStaticBox(panel, wxID_STATIC,
         4076  +                                         wxT("Font Style"),
         4077  +                                         wxDefaultPosition,
         4078  +                                         wxDefaultSize);
         4079  +  wxBoxSizer *boldSizer = new wxStaticBoxSizer(boldBox, wxVERTICAL);
         4080  +  boldBoxSizer->Add(boldSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         4081  +  wxBoxSizer *italicSizer = new wxBoxSizer(wxVERTICAL);
         4082  +  boldSizer->Add(italicSizer, 0, wxALIGN_LEFT | wxALL, 5);
         4083  +  wxCheckBox *italicCtrl = new wxCheckBox(panel, ID_SYMBOLIZER_TEXT1_ITALIC,
         4084  +                                          wxT("Italic"),
         4085  +                                          wxDefaultPosition, wxDefaultSize);
         4086  +  italicCtrl->SetValue(false);
         4087  +  italicCtrl->Enable(false);
         4088  +  italicSizer->Add(italicCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         4089  +  wxCheckBox *boldCtrl = new wxCheckBox(panel, ID_SYMBOLIZER_TEXT1_BOLD,
         4090  +                                        wxT("Bold"),
         4091  +                                        wxDefaultPosition, wxDefaultSize);
         4092  +  boldCtrl->SetValue(false);
         4093  +  boldCtrl->Enable(false);
         4094  +  italicSizer->Add(boldCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         4095  +// Font Opacity
         4096  +  wxStaticBox *opacityFontBox = new wxStaticBox(panel, wxID_STATIC,
         4097  +                                                wxT("Opacity"),
         4098  +                                                wxDefaultPosition,
         4099  +                                                wxDefaultSize);
         4100  +  wxBoxSizer *opacityFontSizer =
         4101  +    new wxStaticBoxSizer(opacityFontBox, wxVERTICAL);
         4102  +  fontSizer->Add(opacityFontSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4103  +  wxSlider *opacityFontCtrl =
         4104  +    new wxSlider(panel, ID_SYMBOLIZER_FONT1_OPACITY, 100, 0, 100,
         4105  +                 wxDefaultPosition, wxSize(150, 45),
         4106  +                 wxSL_HORIZONTAL | wxSL_LABELS);
         4107  +  opacityFontSizer->Add(opacityFontCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4108  +// Font color
         4109  +  wxStaticBox *fontColorBox = new wxStaticBox(panel, wxID_STATIC,
         4110  +                                              wxT("Color"),
         4111  +                                              wxDefaultPosition,
         4112  +                                              wxDefaultSize);
         4113  +  wxBoxSizer *fontColorSizer = new wxStaticBoxSizer(fontColorBox, wxVERTICAL);
         4114  +  fontSizer->Add(fontColorSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4115  +  wxBoxSizer *font2Sizer = new wxBoxSizer(wxHORIZONTAL);
         4116  +  fontColorSizer->Add(font2Sizer, 0, wxALIGN_RIGHT | wxALL, 0);
         4117  +  wxTextCtrl *fontCtrl = new wxTextCtrl(panel, ID_SYMBOLIZER_FONT1_COLOR,
         4118  +                                        FillColor,
         4119  +                                        wxDefaultPosition, wxSize(80, 22));
         4120  +  font2Sizer->Add(fontCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4121  +  wxBitmap bmp;
         4122  +  wxColour color(0, 0, 0);
         4123  +  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
         4124  +  wxStaticBitmap *sampleFontCtrl =
         4125  +    new wxStaticBitmap(panel, ID_SYMBOLIZER_FONT1_PICKER_HEX, bmp,
         4126  +                       wxDefaultPosition, wxSize(32, 32));
         4127  +  font2Sizer->Add(sampleFontCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         4128  +  wxButton *pickFont = new wxButton(panel, ID_SYMBOLIZER_FONT1_PICKER_BTN,
         4129  +                                    wxT("&Pick a color"));
         4130  +  fontColorSizer->Add(pickFont, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         4131  +// first row: PointPlacement
         4132  +  wxBoxSizer *pointBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         4133  +  auxSizer->Add(pointBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         4134  +  wxStaticBox *pointBox = new wxStaticBox(panel, wxID_STATIC,
         4135  +                                          wxT("Label Point Placement"),
         4136  +                                          wxDefaultPosition,
         4137  +                                          wxDefaultSize);
         4138  +  wxBoxSizer *pointSizer = new wxStaticBoxSizer(pointBox, wxHORIZONTAL);
         4139  +  pointBoxSizer->Add(pointSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4140  +// first row A: Anchor Point
         4141  +  wxStaticBox *anchorBox = new wxStaticBox(panel, wxID_STATIC,
         4142  +                                           wxT("Anchor Point"),
         4143  +                                           wxDefaultPosition,
         4144  +                                           wxDefaultSize);
         4145  +  wxBoxSizer *anchorSizer = new wxStaticBoxSizer(anchorBox, wxVERTICAL);
         4146  +  pointSizer->Add(anchorSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         4147  +  wxBoxSizer *anchor1Sizer = new wxBoxSizer(wxHORIZONTAL);
         4148  +  anchorSizer->Add(anchor1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         4149  +  wxStaticText *anchor1Label = new wxStaticText(panel, wxID_STATIC, wxT("X"));
         4150  +  anchor1Sizer->Add(anchor1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4151  +  wxTextCtrl *anchorXCtrl =
         4152  +    new wxTextCtrl(panel, ID_SYMBOLIZER_TEXT_ANCHOR_X, wxT("0.5"),
         4153  +                   wxDefaultPosition, wxSize(60, 22));
         4154  +  anchor1Sizer->Add(anchorXCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4155  +  wxBoxSizer *anchor2Sizer = new wxBoxSizer(wxHORIZONTAL);
         4156  +  anchorSizer->Add(anchor2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         4157  +  wxStaticText *anchor2Label = new wxStaticText(panel, wxID_STATIC, wxT("Y"));
         4158  +  anchor2Sizer->Add(anchor2Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4159  +  wxTextCtrl *anchorYCtrl =
         4160  +    new wxTextCtrl(panel, ID_SYMBOLIZER_TEXT_ANCHOR_Y, wxT("0.5"),
         4161  +                   wxDefaultPosition, wxSize(60, 22));
         4162  +  anchor2Sizer->Add(anchorYCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4163  +// first row B: Displacement
         4164  +  wxStaticBox *displacementBox = new wxStaticBox(panel, wxID_STATIC,
         4165  +                                                 wxT("Displacement"),
         4166  +                                                 wxDefaultPosition,
         4167  +                                                 wxDefaultSize);
         4168  +  wxBoxSizer *displacementSizer =
         4169  +    new wxStaticBoxSizer(displacementBox, wxVERTICAL);
         4170  +  pointSizer->Add(displacementSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         4171  +  wxBoxSizer *displ1Sizer = new wxBoxSizer(wxHORIZONTAL);
         4172  +  displacementSizer->Add(displ1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         4173  +  wxStaticText *displ1Label = new wxStaticText(panel, wxID_STATIC, wxT("X"));
         4174  +  displ1Sizer->Add(displ1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4175  +  wxTextCtrl *displacementXCtrl =
         4176  +    new wxTextCtrl(panel, ID_SYMBOLIZER_TEXT_DISPLACEMENT_X, wxT("0.0"),
         4177  +                   wxDefaultPosition, wxSize(60, 22));
         4178  +  displ1Sizer->Add(displacementXCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4179  +  wxBoxSizer *displ2Sizer = new wxBoxSizer(wxHORIZONTAL);
         4180  +  displacementSizer->Add(displ2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         4181  +  wxStaticText *displ2Label = new wxStaticText(panel, wxID_STATIC, wxT("Y"));
         4182  +  displ2Sizer->Add(displ2Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4183  +  wxTextCtrl *displacementYCtrl =
         4184  +    new wxTextCtrl(panel, ID_SYMBOLIZER_TEXT_DISPLACEMENT_Y, wxT("0.0"),
         4185  +                   wxDefaultPosition, wxSize(60, 22));
         4186  +  displ2Sizer->Add(displacementYCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4187  +// first row C: Rotation
         4188  +  wxStaticBox *rotBox = new wxStaticBox(panel, wxID_STATIC,
         4189  +                                        wxT("Rotation"),
         4190  +                                        wxDefaultPosition,
         4191  +                                        wxDefaultSize);
         4192  +  wxBoxSizer *rotSizer = new wxStaticBoxSizer(rotBox, wxVERTICAL);
         4193  +  pointSizer->Add(rotSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4194  +  wxBoxSizer *rot1Sizer = new wxBoxSizer(wxHORIZONTAL);
         4195  +  rotSizer->Add(rot1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         4196  +  wxTextCtrl *rotCtrl =
         4197  +    new wxTextCtrl(panel, ID_SYMBOLIZER_TEXT_ROTATION, wxT("0.0"),
         4198  +                   wxDefaultPosition, wxSize(60, 22));
         4199  +  rot1Sizer->Add(rotCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4200  +// Font Halo
         4201  +  wxStaticBox *haloBox = new wxStaticBox(panel, wxID_STATIC,
         4202  +                                         wxT("Font Halo"),
         4203  +                                         wxDefaultPosition,
         4204  +                                         wxDefaultSize);
         4205  +  wxBoxSizer *haloSizer = new wxStaticBoxSizer(haloBox, wxVERTICAL);
         4206  +  pointBoxSizer->Add(haloSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4207  +  wxBoxSizer *halo1Sizer = new wxBoxSizer(wxHORIZONTAL);
         4208  +  haloSizer->Add(halo1Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4209  +  wxCheckBox *enableHaloCtrl = new wxCheckBox(panel, ID_SYMBOLIZER_HALO1_ENABLE,
         4210  +                                              wxT("Enable"),
         4211  +                                              wxDefaultPosition, wxDefaultSize);
         4212  +  enableHaloCtrl->SetValue(Style->IsHaloEnabled());
         4213  +  enableHaloCtrl->Enable(false);
         4214  +  halo1Sizer->Add(enableHaloCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4215  +// Halo Radius
         4216  +  wxStaticBox *radiusBox = new wxStaticBox(panel, wxID_STATIC,
         4217  +                                           wxT("Radius"),
         4218  +                                           wxDefaultPosition,
         4219  +                                           wxDefaultSize);
         4220  +  wxBoxSizer *radiusSizer = new wxStaticBoxSizer(radiusBox, wxVERTICAL);
         4221  +  halo1Sizer->Add(radiusSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4222  +  wxTextCtrl *radiusCtrl =
         4223  +    new wxTextCtrl(panel, ID_SYMBOLIZER_HALO1_RADIUS, wxT("1.0"),
         4224  +                   wxDefaultPosition, wxSize(50, 22));
         4225  +  radiusCtrl->Enable(false);
         4226  +  radiusSizer->Add(radiusCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4227  +// Halo Opacity
         4228  +  wxStaticBox *opacityHaloBox = new wxStaticBox(panel, wxID_STATIC,
         4229  +                                                wxT("Opacity"),
         4230  +                                                wxDefaultPosition,
         4231  +                                                wxDefaultSize);
         4232  +  wxBoxSizer *opacityHaloSizer =
         4233  +    new wxStaticBoxSizer(opacityHaloBox, wxVERTICAL);
         4234  +  halo1Sizer->Add(opacityHaloSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         4235  +  wxSlider *opacityHaloCtrl =
         4236  +    new wxSlider(panel, ID_SYMBOLIZER_HALO1_OPACITY, 100, 0, 100,
         4237  +                 wxDefaultPosition, wxSize(75, 45),
         4238  +                 wxSL_HORIZONTAL | wxSL_LABELS);
         4239  +  opacityHaloSizer->Add(opacityHaloCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         4240  +  opacityHaloCtrl->Enable(false);
         4241  +// Halo color
         4242  +  wxStaticBox *haloColorBox = new wxStaticBox(panel, wxID_STATIC,
         4243  +                                              wxT("Color"),
         4244  +                                              wxDefaultPosition,
         4245  +                                              wxDefaultSize);
         4246  +  wxBoxSizer *haloColorSizer = new wxStaticBoxSizer(haloColorBox, wxHORIZONTAL);
         4247  +  haloSizer->Add(haloColorSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         4248  +  wxTextCtrl *haloCtrl = new wxTextCtrl(panel, ID_SYMBOLIZER_HALO1_COLOR,
         4249  +                                        FillColor,
         4250  +                                        wxDefaultPosition, wxSize(80, 22));
         4251  +  haloColorSizer->Add(haloCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4252  +  haloCtrl->Enable(false);
         4253  +  color = wxColour(0, 0, 0);
         4254  +  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
         4255  +  wxStaticBitmap *sampleHaloCtrl =
         4256  +    new wxStaticBitmap(panel, ID_SYMBOLIZER_HALO1_PICKER_HEX, bmp,
         4257  +                       wxDefaultPosition, wxSize(32, 32));
         4258  +  haloColorSizer->Add(sampleHaloCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         4259  +  wxButton *pickHalo = new wxButton(panel, ID_SYMBOLIZER_HALO1_PICKER_BTN,
         4260  +                                    wxT("&Pick a color"));
         4261  +  haloColorSizer->Add(pickHalo, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4262  +  pickHalo->Enable(false);
         4263  +
         4264  +  panel->SetSizer(topSizer);
         4265  +  topSizer->Fit(panel);
         4266  +// appends event handlers
         4267  +  Connect(ID_SYMBOLIZER_TEXT1_ENABLE,
         4268  +          wxEVT_COMMAND_CHECKBOX_CLICKED,
         4269  +          (wxObjectEventFunction) & QuickStyleVectorDialog::OnCmdLabel1Changed);
         4270  +  Connect(ID_SYMBOLIZER_FONT1_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
         4271  +          (wxObjectEventFunction) &
         4272  +          QuickStyleVectorDialog::OnCmdFont1ColorPicker);
         4273  +  Connect(ID_SYMBOLIZER_FONT1_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
         4274  +          (wxObjectEventFunction) &
         4275  +          QuickStyleVectorDialog::OnCmdFont1ColorChanged);
         4276  +  Connect(ID_SYMBOLIZER_FONT1_NAME, wxEVT_COMMAND_COMBOBOX_SELECTED,
         4277  +          (wxObjectEventFunction) & QuickStyleVectorDialog::OnFont1Changed);
         4278  +  Connect(ID_SYMBOLIZER_HALO1_ENABLE,
         4279  +          wxEVT_COMMAND_CHECKBOX_CLICKED,
         4280  +          (wxObjectEventFunction) &
         4281  +          QuickStyleVectorDialog::OnCmdHalo1EnableChanged);
         4282  +  Connect(ID_SYMBOLIZER_HALO1_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
         4283  +          (wxObjectEventFunction) &
         4284  +          QuickStyleVectorDialog::OnCmdColorHalo1Picker);
         4285  +  Connect(ID_SYMBOLIZER_HALO1_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
         4286  +          (wxObjectEventFunction) &
         4287  +          QuickStyleVectorDialog::OnCmdColorHalo1Changed);
         4288  +  return panel;
         4289  +}
         4290  +
         4291  +void QuickStyleVectorDialog::
         4292  +OnCmdLabel1Changed(wxCommandEvent & WXUNUSED(event))
         4293  +{
         4294  +//
         4295  +// Label enable/disable 
         4296  +//
         4297  +  wxCheckBox *enableCtrl =
         4298  +    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT1_ENABLE);
         4299  +  if (enableCtrl->IsChecked() == true)
         4300  +    {
         4301  +      Style->SetLabelPrint(true);
         4302  +      Style->SetLabelLinePlacement(false);
         4303  +  } else
         4304  +    Style->SetLabelPrint(false);
         4305  +  RetrieveTextPointPage(false);
         4306  +  UpdateTextPointPage();
         4307  +}
         4308  +
         4309  +void QuickStyleVectorDialog::OnFont1Changed(wxCommandEvent & WXUNUSED(event))
         4310  +{
         4311  +//
         4312  +// the Font is changed
         4313  +//
         4314  +  wxCheckBox *boldCtrl = (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT1_BOLD);
         4315  +  wxCheckBox *italicCtrl =
         4316  +    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT1_ITALIC);
         4317  +  wxComboBox *fontList = (wxComboBox *) FindWindow(ID_SYMBOLIZER_FONT1_NAME);
         4318  +  wxString font = fontList->GetValue();
         4319  +  char facename[1024];
         4320  +  strcpy(facename, font.ToUTF8());
         4321  +  if (strncmp(facename, "ToyFont: ", 9) == 0)
         4322  +    {
         4323  +      boldCtrl->Enable(true);
         4324  +      italicCtrl->Enable(true);
         4325  +  } else
         4326  +    {
         4327  +      bool bold = false;
         4328  +      bool italic = false;
         4329  +      MainFrame->CheckTTFont(facename, &bold, &italic);
         4330  +      boldCtrl->SetValue(bold);
         4331  +      italicCtrl->SetValue(italic);
         4332  +      boldCtrl->Enable(false);
         4333  +      italicCtrl->Enable(false);
         4334  +    }
         4335  +}
         4336  +
         4337  +void QuickStyleVectorDialog::
         4338  +OnCmdFont1ColorPicker(wxCommandEvent & WXUNUSED(event))
         4339  +{
         4340  +//
         4341  +// color picker
         4342  +//
         4343  +  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FONT1_COLOR);
         4344  +  wxColour clr = wxNullColour;
         4345  +  wxString str = colorCtrl->GetValue();
         4346  +  if (ColorMapEntry::IsValidColor(str) == true)
         4347  +    ColorMapEntry::GetWxColor(str, clr);
         4348  +  wxColour color = wxGetColourFromUser(this, clr);
         4349  +  if (color.IsOk() == true)
         4350  +    {
         4351  +      char hex[16];
         4352  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         4353  +      wxString str = wxString::FromUTF8(hex);
         4354  +      colorCtrl->SetValue(str);
         4355  +    }
         4356  +}
         4357  +
         4358  +void QuickStyleVectorDialog::
         4359  +OnCmdFont1ColorChanged(wxCommandEvent & WXUNUSED(event))
         4360  +{
         4361  +//
         4362  +// Font Color changed: updating the visual sample
         4363  +//
         4364  +  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FONT1_COLOR);
         4365  +  wxStaticBitmap *sampleCtrl =
         4366  +    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_FONT1_PICKER_HEX);
         4367  +  wxColour back = wxColour(255, 255, 255);
         4368  +  wxString str = colorCtrl->GetValue();
         4369  +  if (ColorMapEntry::IsValidColor(str) == true)
         4370  +    ColorMapEntry::GetWxColor(str, back);
         4371  +  wxBitmap bmp;
         4372  +  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
         4373  +  sampleCtrl->SetBitmap(bmp);
         4374  +  sampleCtrl->Refresh();
         4375  +  sampleCtrl->Update();
         4376  +}
         4377  +
         4378  +void QuickStyleVectorDialog::
         4379  +OnCmdColorHalo1Picker(wxCommandEvent & WXUNUSED(event))
         4380  +{
         4381  +//
         4382  +// color picker
         4383  +//
         4384  +  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_HALO1_COLOR);
         4385  +  wxColour clr = wxNullColour;
         4386  +  wxString str = colorCtrl->GetValue();
         4387  +  if (ColorMapEntry::IsValidColor(str) == true)
         4388  +    ColorMapEntry::GetWxColor(str, clr);
         4389  +  wxColour color = wxGetColourFromUser(this, clr);
         4390  +  if (color.IsOk() == true)
         4391  +    {
         4392  +      char hex[16];
         4393  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         4394  +      wxString str = wxString::FromUTF8(hex);
         4395  +      colorCtrl->SetValue(str);
         4396  +    }
         4397  +}
         4398  +
         4399  +void QuickStyleVectorDialog::
         4400  +OnCmdColorHalo1Changed(wxCommandEvent & WXUNUSED(event))
         4401  +{
         4402  +//
         4403  +// Halo Color changed: updating the visual sample
         4404  +//
         4405  +  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_HALO1_COLOR);
         4406  +  wxStaticBitmap *sampleCtrl =
         4407  +    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_HALO1_PICKER_HEX);
         4408  +  wxColour back = wxColour(255, 255, 255);
         4409  +  wxString str = colorCtrl->GetValue();
         4410  +  if (ColorMapEntry::IsValidColor(str) == true)
         4411  +    ColorMapEntry::GetWxColor(str, back);
         4412  +  wxBitmap bmp;
         4413  +  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
         4414  +  sampleCtrl->SetBitmap(bmp);
         4415  +  sampleCtrl->Refresh();
         4416  +  sampleCtrl->Update();
         4417  +}
         4418  +
         4419  +void QuickStyleVectorDialog::
         4420  +OnCmdHalo1EnableChanged(wxCommandEvent & WXUNUSED(event))
         4421  +{
         4422  +//
         4423  +// Graphic Halo enable/disable 
         4424  +//
         4425  +  wxCheckBox *enableCtrl =
         4426  +    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_HALO1_ENABLE);
         4427  +  if (enableCtrl->IsChecked() == true)
         4428  +    Style->EnableHalo(true);
         4429  +  else
         4430  +    Style->EnableHalo(false);
         4431  +  RetrieveTextPointPage(false);
         4432  +  UpdateTextPointPage();
         4433  +}
         4434  +
         4435  +wxPanel *QuickStyleVectorDialog::CreateTextLinePage(wxWindow * parent)
         4436  +{
         4437  +//
         4438  +// creating the Text Symbolizer page (Line Placement)
         4439  +//
         4440  +  wxString FillColor = wxT("#808080");
         4441  +  wxPanel *panel = new wxPanel(parent, ID_PANE_TEXT1);
         4442  +  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
         4443  +  panel->SetSizer(topSizer);
         4444  +  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
         4445  +  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
         4446  +// enable/disable Labels
         4447  +  wxBoxSizer *auxBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         4448  +  boxSizer->Add(auxBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4449  +  wxStaticBox *auxBox = new wxStaticBox(panel, wxID_STATIC,
         4450  +                                        wxT("Labels"),
         4451  +                                        wxDefaultPosition,
         4452  +                                        wxDefaultSize);
         4453  +  wxBoxSizer *auxSizer = new wxStaticBoxSizer(auxBox, wxVERTICAL);
         4454  +  auxBoxSizer->Add(auxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         4455  +  wxBoxSizer *enableSizer = new wxBoxSizer(wxHORIZONTAL);
         4456  +  auxSizer->Add(enableSizer, 0, wxALIGN_LEFT | wxALL, 5);
         4457  +  wxCheckBox *enableCtrl = new wxCheckBox(panel, ID_SYMBOLIZER_TEXT2_ENABLE,
         4458  +                                          wxT("Enable"),
         4459  +                                          wxDefaultPosition, wxDefaultSize);
         4460  +  enableCtrl->SetValue(Style->IsLabelPrint());
         4461  +  enableSizer->Add(enableCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         4462  +  enableSizer->AddSpacer(20);
         4463  +  enableSizer->AddSpacer(20);
         4464  +  enableSizer->AddSpacer(20);
         4465  +  enableSizer->AddSpacer(20);
         4466  +  wxStaticText *columnLabel =
         4467  +    new wxStaticText(panel, wxID_STATIC, wxT("&Column:"));
         4468  +  enableSizer->Add(columnLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         4469  +  wxComboBox *columnList =
         4470  +    new wxComboBox(panel, ID_SYMBOLIZER_TEXT2_LABEL, wxT(""), wxDefaultPosition,
         4471  +                   wxSize(400, 22), 0, NULL, wxCB_DROPDOWN | wxCB_READONLY);
         4472  +  InitializeComboColumns(columnList);
         4473  +  enableSizer->Add(columnList, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         4474  +
         4475  +
         4476  +  wxStaticBox *fontBox = new wxStaticBox(panel, wxID_STATIC,
         4477  +                                         wxT("Font"),
         4478  +                                         wxDefaultPosition,
         4479  +                                         wxDefaultSize);
         4480  +  wxBoxSizer *font9Sizer = new wxStaticBoxSizer(fontBox, wxHORIZONTAL);
         4481  +  auxSizer->Add(font9Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4482  +// Second row: Font Name, Size and Fill 
         4483  +  wxBoxSizer *fontSizer = new wxBoxSizer(wxHORIZONTAL);
         4484  +  font9Sizer->Add(fontSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         4485  +  wxBoxSizer *font0Sizer = new wxBoxSizer(wxHORIZONTAL);
         4486  +  fontSizer->Add(font0Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         4487  +// Font Name
         4488  +  wxBoxSizer *fontXSizer = new wxBoxSizer(wxVERTICAL);
         4489  +  font0Sizer->Add(fontXSizer, 0, wxALIGN_LEFT | wxALL, 0);
         4490  +  wxComboBox *fontList =
         4491  +    new wxComboBox(panel, ID_SYMBOLIZER_FONT2_NAME, wxT(""), wxDefaultPosition,
         4492  +                   wxSize(250, 21), 0, NULL, wxCB_DROPDOWN | wxCB_READONLY);
         4493  +  InitializeComboFonts(fontList);
         4494  +  fontList->Select(0);
         4495  +  fontXSizer->Add(fontList, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4496  +// Font Size
         4497  +  wxBoxSizer *fontYSizer = new wxBoxSizer(wxHORIZONTAL);
         4498  +  fontXSizer->Add(fontYSizer, 0, wxALIGN_LEFT | wxALL, 0);
         4499  +  wxStaticBox *sizeBox = new wxStaticBox(panel, wxID_STATIC,
         4500  +                                         wxT("Font Size"),
         4501  +                                         wxDefaultPosition,
         4502  +                                         wxDefaultSize);
         4503  +  wxBoxSizer *sizeSizer = new wxStaticBoxSizer(sizeBox, wxVERTICAL);
         4504  +  fontYSizer->Add(sizeSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4505  +  wxTextCtrl *sizeCtrl =
         4506  +    new wxTextCtrl(panel, ID_SYMBOLIZER_FONT2_SIZE, wxT("15.0"),
         4507  +                   wxDefaultPosition, wxSize(100, 22));
         4508  +  sizeSizer->Add(sizeCtrl, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         4509  +  wxBoxSizer *boldBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         4510  +  fontYSizer->Add(boldBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4511  +  wxStaticBox *boldBox = new wxStaticBox(panel, wxID_STATIC,
         4512  +                                         wxT("Font Style"),
         4513  +                                         wxDefaultPosition,
         4514  +                                         wxDefaultSize);
         4515  +  wxBoxSizer *boldSizer = new wxStaticBoxSizer(boldBox, wxHORIZONTAL);
         4516  +  boldBoxSizer->Add(boldSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         4517  +  wxBoxSizer *italicSizer = new wxBoxSizer(wxHORIZONTAL);
         4518  +  boldSizer->Add(italicSizer, 0, wxALIGN_LEFT | wxALL, 5);
         4519  +  wxCheckBox *italicCtrl = new wxCheckBox(panel, ID_SYMBOLIZER_TEXT2_ITALIC,
         4520  +                                          wxT("Italic"),
         4521  +                                          wxDefaultPosition, wxDefaultSize);
         4522  +  italicCtrl->SetValue(false);
         4523  +  italicCtrl->Enable(false);
         4524  +  italicSizer->Add(italicCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         4525  +  wxCheckBox *boldCtrl = new wxCheckBox(panel, ID_SYMBOLIZER_TEXT2_BOLD,
         4526  +                                        wxT("Bold"),
         4527  +                                        wxDefaultPosition, wxDefaultSize);
         4528  +  boldCtrl->SetValue(false);
         4529  +  boldCtrl->Enable(false);
         4530  +  italicSizer->Add(boldCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         4531  +// Font Opacity
         4532  +  wxStaticBox *opacityFontBox = new wxStaticBox(panel, wxID_STATIC,
         4533  +                                                wxT("Opacity"),
         4534  +                                                wxDefaultPosition,
         4535  +                                                wxDefaultSize);
         4536  +  wxBoxSizer *opacityFontSizer =
         4537  +    new wxStaticBoxSizer(opacityFontBox, wxVERTICAL);
         4538  +  fontSizer->Add(opacityFontSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4539  +  wxSlider *opacityFontCtrl =
         4540  +    new wxSlider(panel, ID_SYMBOLIZER_FONT2_OPACITY, 100, 0, 100,
         4541  +                 wxDefaultPosition, wxSize(150, 35),
         4542  +                 wxSL_HORIZONTAL | wxSL_LABELS);
         4543  +  opacityFontSizer->Add(opacityFontCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4544  +// Font color
         4545  +  wxStaticBox *fontColorBox = new wxStaticBox(panel, wxID_STATIC,
         4546  +                                              wxT("Color"),
         4547  +                                              wxDefaultPosition,
         4548  +                                              wxDefaultSize);
         4549  +  wxBoxSizer *fontColorSizer = new wxStaticBoxSizer(fontColorBox, wxHORIZONTAL);
         4550  +  fontSizer->Add(fontColorSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         4551  +  wxBoxSizer *font2Sizer = new wxBoxSizer(wxVERTICAL);
         4552  +  fontColorSizer->Add(font2Sizer, 0, wxALIGN_RIGHT | wxALL, 0);
         4553  +  wxTextCtrl *fontCtrl = new wxTextCtrl(panel, ID_SYMBOLIZER_FONT2_COLOR,
         4554  +                                        FillColor,
         4555  +                                        wxDefaultPosition, wxSize(80, 22));
         4556  +  font2Sizer->Add(fontCtrl, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 2);
         4557  +  wxBitmap bmp;
         4558  +  wxColour color(0, 0, 0);
         4559  +  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
         4560  +  wxStaticBitmap *sampleFontCtrl =
         4561  +    new wxStaticBitmap(panel, ID_SYMBOLIZER_FONT2_PICKER_HEX, bmp,
         4562  +                       wxDefaultPosition, wxSize(32, 32));
         4563  +  fontColorSizer->Add(sampleFontCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         4564  +  wxButton *pickFont = new wxButton(panel, ID_SYMBOLIZER_FONT2_PICKER_BTN,
         4565  +                                    wxT("&Pick a color"));
         4566  +  font2Sizer->Add(pickFont, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 2);
         4567  +// second row: LinePlacement
         4568  +  wxBoxSizer *lineBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         4569  +  auxSizer->Add(lineBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         4570  +  wxStaticBox *lineBox = new wxStaticBox(panel, wxID_STATIC,
         4571  +                                         wxT("Label Line Placement"),
         4572  +                                         wxDefaultPosition,
         4573  +                                         wxDefaultSize);
         4574  +  wxBoxSizer *lineSizer = new wxStaticBoxSizer(lineBox, wxVERTICAL);
         4575  +  lineBoxSizer->Add(lineSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4576  +// second row A: PerpendicularOffset
         4577  +  wxBoxSizer *perpendicularBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         4578  +  lineSizer->Add(perpendicularBoxSizer, 0,
         4579  +                 wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         4580  +  wxStaticBox *perpendicularBox = new wxStaticBox(panel, wxID_STATIC,
         4581  +                                                  wxT("Perpendicular Offset"),
         4582  +                                                  wxDefaultPosition,
         4583  +                                                  wxDefaultSize);
         4584  +  wxBoxSizer *perpendicularSizer =
         4585  +    new wxStaticBoxSizer(perpendicularBox, wxVERTICAL);
         4586  +  perpendicularBoxSizer->Add(perpendicularSizer, 0,
         4587  +                             wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         4588  +  wxBoxSizer *perp1Sizer = new wxBoxSizer(wxHORIZONTAL);
         4589  +  perpendicularSizer->Add(perp1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         4590  +  wxTextCtrl *perpendicularCtrl =
         4591  +    new wxTextCtrl(panel, ID_SYMBOLIZER_TEXT_PERPENDICULAR, wxT("0.0"),
         4592  +                   wxDefaultPosition, wxSize(100, 22));
         4593  +  perp1Sizer->Add(perpendicularCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         4594  +  perpendicularCtrl->Enable(false);
         4595  +  wxStaticText *perp1Label = new wxStaticText(panel, wxID_STATIC,
         4596  +                                              wxT
         4597  +                                              ("Draw lines in parallel to the original geometry."));
         4598  +  perp1Sizer->Add(perp1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         4599  +  wxStaticText *perp2Label = new wxStaticText(panel, wxID_STATIC,
         4600  +                                              wxT
         4601  +                                              ("Positive to the left-hand side. Negative numbers mean right."));
         4602  +  perpendicularSizer->Add(perp2Label, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         4603  +// second row B: IsRepeated, InitialGap and Gap
         4604  +  wxBoxSizer *repeatedBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         4605  +  lineSizer->Add(repeatedBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         4606  +  wxStaticBox *repeatedBox = new wxStaticBox(panel, wxID_STATIC,
         4607  +                                             wxT("Repeated Label"),
         4608  +                                             wxDefaultPosition,
         4609  +                                             wxDefaultSize);
         4610  +  wxBoxSizer *repeatedSizer = new wxStaticBoxSizer(repeatedBox, wxHORIZONTAL);
         4611  +  repeatedBoxSizer->Add(repeatedSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         4612  +  wxCheckBox *isRepeatedCtrl =
         4613  +    new wxCheckBox(panel, ID_SYMBOLIZER_TEXT_IS_REPEATED,
         4614  +                   wxT("Repeated"),
         4615  +                   wxDefaultPosition, wxDefaultSize);
         4616  +  isRepeatedCtrl->SetValue(false);
         4617  +  isRepeatedCtrl->Enable(false);
         4618  +  repeatedSizer->Add(isRepeatedCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4619  +  wxStaticBox *inigapBox = new wxStaticBox(panel, wxID_STATIC,
         4620  +                                           wxT("Initial Gap"),
         4621  +                                           wxDefaultPosition,
         4622  +                                           wxDefaultSize);
         4623  +  wxBoxSizer *inigapSizer = new wxStaticBoxSizer(inigapBox, wxVERTICAL);
         4624  +  repeatedSizer->Add(inigapSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         4625  +  wxTextCtrl *inigapCtrl =
         4626  +    new wxTextCtrl(panel, ID_SYMBOLIZER_TEXT_INITIAL_GAP, wxT("0.0"),
         4627  +                   wxDefaultPosition, wxSize(60, 22));
         4628  +  inigapCtrl->Enable(false);
         4629  +  inigapSizer->Add(inigapCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4630  +  wxStaticBox *gapBox = new wxStaticBox(panel, wxID_STATIC,
         4631  +                                        wxT("Gap"),
         4632  +                                        wxDefaultPosition,
         4633  +                                        wxDefaultSize);
         4634  +  wxBoxSizer *gapSizer = new wxStaticBoxSizer(gapBox, wxVERTICAL);
         4635  +  repeatedSizer->Add(gapSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         4636  +  wxTextCtrl *gapCtrl =
         4637  +    new wxTextCtrl(panel, ID_SYMBOLIZER_TEXT_GAP, wxT("0.0"),
         4638  +                   wxDefaultPosition, wxSize(60, 22));
         4639  +  gapCtrl->Enable(false);
         4640  +  gapSizer->Add(gapCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4641  +// second row C: IsAligned and Generalize
         4642  +  wxBoxSizer *optBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         4643  +  repeatedBoxSizer->Add(optBoxSizer, 0, wxALIGN_LEFT | wxALL, 0);
         4644  +  wxStaticBox *optBox = new wxStaticBox(panel, wxID_STATIC,
         4645  +                                        wxT("Options"),
         4646  +                                        wxDefaultPosition,
         4647  +                                        wxDefaultSize);
         4648  +  wxBoxSizer *optSizer = new wxStaticBoxSizer(optBox, wxVERTICAL);
         4649  +  optBoxSizer->Add(optSizer, 0, wxALIGN_LEFT | wxALL, 5);
         4650  +  wxCheckBox *isAlignedCtrl =
         4651  +    new wxCheckBox(panel, ID_SYMBOLIZER_TEXT_IS_ALIGNED,
         4652  +                   wxT("Aligned"),
         4653  +                   wxDefaultPosition, wxDefaultSize);
         4654  +  isAlignedCtrl->SetValue(false);
         4655  +  isAlignedCtrl->Enable(false);
         4656  +  optSizer->Add(isAlignedCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4657  +  wxCheckBox *generalizeCtrl =
         4658  +    new wxCheckBox(panel, ID_SYMBOLIZER_TEXT_GENERALIZE,
         4659  +                   wxT("Generalize"),
         4660  +                   wxDefaultPosition, wxDefaultSize);
         4661  +  generalizeCtrl->SetValue(false);
         4662  +  generalizeCtrl->Enable(false);
         4663  +  optSizer->Add(generalizeCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4664  +// Halo 
         4665  +  wxBoxSizer *haloBoxSizer = new wxBoxSizer(wxVERTICAL);
         4666  +  lineBoxSizer->Add(haloBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         4667  +  wxStaticBox *haloBox = new wxStaticBox(panel, wxID_STATIC,
         4668  +                                         wxT("Font Halo"),
         4669  +                                         wxDefaultPosition,
         4670  +                                         wxDefaultSize);
         4671  +  wxBoxSizer *haloSizer = new wxStaticBoxSizer(haloBox, wxVERTICAL);
         4672  +  haloBoxSizer->Add(haloSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         4673  +  wxBoxSizer *halo0Sizer = new wxBoxSizer(wxHORIZONTAL);
         4674  +  haloSizer->Add(halo0Sizer, 0, wxALIGN_LEFT | wxALL, 0);
         4675  +  wxCheckBox *enableHaloCtrl = new wxCheckBox(panel, ID_SYMBOLIZER_HALO2_ENABLE,
         4676  +                                              wxT("Enable"),
         4677  +                                              wxDefaultPosition, wxDefaultSize);
         4678  +  enableHaloCtrl->SetValue(Style->IsHaloEnabled());
         4679  +  enableHaloCtrl->Enable(false);
         4680  +  halo0Sizer->Add(enableHaloCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         4681  +// Halo Radius
         4682  +  wxStaticBox *radiusBox = new wxStaticBox(panel, wxID_STATIC,
         4683  +                                           wxT("Radius"),
         4684  +                                           wxDefaultPosition,
         4685  +                                           wxDefaultSize);
         4686  +  wxBoxSizer *radiusSizer = new wxStaticBoxSizer(radiusBox, wxVERTICAL);
         4687  +  halo0Sizer->Add(radiusSizer, 0, wxALIGN_RIGHT | wxALL, 2);
         4688  +  wxTextCtrl *radiusCtrl =
         4689  +    new wxTextCtrl(panel, ID_SYMBOLIZER_HALO2_RADIUS, wxT("1.0"),
         4690  +                   wxDefaultPosition, wxSize(50, 22));
         4691  +  radiusCtrl->Enable(false);
         4692  +  radiusSizer->Add(radiusCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         4693  +// Halo Opacity
         4694  +  wxStaticBox *opacityHaloBox = new wxStaticBox(panel, wxID_STATIC,
         4695  +                                                wxT("Opacity"),
         4696  +                                                wxDefaultPosition,
         4697  +                                                wxDefaultSize);
         4698  +  wxBoxSizer *opacityHaloSizer =
         4699  +    new wxStaticBoxSizer(opacityHaloBox, wxVERTICAL);
         4700  +  haloSizer->Add(opacityHaloSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 2);
         4701  +  wxSlider *opacityHaloCtrl =
         4702  +    new wxSlider(panel, ID_SYMBOLIZER_HALO2_OPACITY, 100, 0, 100,
         4703  +                 wxDefaultPosition, wxSize(130, 35),
         4704  +                 wxSL_HORIZONTAL | wxSL_LABELS);
         4705  +  opacityHaloSizer->Add(opacityHaloCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         4706  +  opacityHaloCtrl->Enable(false);
         4707  +// Halo color
         4708  +  wxStaticBox *haloColorBox = new wxStaticBox(panel, wxID_STATIC,
         4709  +                                              wxT("Color"),
         4710  +                                              wxDefaultPosition,
         4711  +                                              wxDefaultSize);
         4712  +  wxBoxSizer *haloColorSizer = new wxStaticBoxSizer(haloColorBox, wxHORIZONTAL);
         4713  +  haloSizer->Add(haloColorSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 2);
         4714  +  wxBoxSizer *halo2Sizer = new wxBoxSizer(wxVERTICAL);
         4715  +  haloColorSizer->Add(halo2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         4716  +  wxTextCtrl *haloCtrl = new wxTextCtrl(panel, ID_SYMBOLIZER_HALO2_COLOR,
         4717  +                                        FillColor,
         4718  +                                        wxDefaultPosition, wxSize(80, 22));
         4719  +  halo2Sizer->Add(haloCtrl, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 2);
         4720  +  haloCtrl->Enable(false);
         4721  +  color = wxColour(0, 0, 0);
         4722  +  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
         4723  +  wxStaticBitmap *sampleHaloCtrl =
         4724  +    new wxStaticBitmap(panel, ID_SYMBOLIZER_HALO2_PICKER_HEX, bmp,
         4725  +                       wxDefaultPosition, wxSize(32, 32));
         4726  +  haloColorSizer->Add(sampleHaloCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         4727  +  wxButton *pickHalo = new wxButton(panel, ID_SYMBOLIZER_HALO2_PICKER_BTN,
         4728  +                                    wxT("&Pick a color"));
         4729  +  halo2Sizer->Add(pickHalo, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 2);
         4730  +  pickHalo->Enable(false);
         4731  +
         4732  +  panel->SetSizer(topSizer);
         4733  +  topSizer->Fit(panel);
         4734  +// appends event handlers
         4735  +  Connect(ID_SYMBOLIZER_TEXT2_ENABLE,
         4736  +          wxEVT_COMMAND_CHECKBOX_CLICKED,
         4737  +          (wxObjectEventFunction) & QuickStyleVectorDialog::OnCmdLabel2Changed);
         4738  +  Connect(ID_SYMBOLIZER_FONT2_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
         4739  +          (wxObjectEventFunction) &
         4740  +          QuickStyleVectorDialog::OnCmdFont2ColorPicker);
         4741  +  Connect(ID_SYMBOLIZER_FONT2_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
         4742  +          (wxObjectEventFunction) &
         4743  +          QuickStyleVectorDialog::OnCmdFont2ColorChanged);
         4744  +  Connect(ID_SYMBOLIZER_TEXT_IS_REPEATED,
         4745  +          wxEVT_COMMAND_CHECKBOX_CLICKED,
         4746  +          (wxObjectEventFunction) &
         4747  +          QuickStyleVectorDialog::OnCmdIsRepeatedChanged);
         4748  +  Connect(ID_SYMBOLIZER_TEXT_IS_ALIGNED,
         4749  +          wxEVT_COMMAND_CHECKBOX_CLICKED,
         4750  +          (wxObjectEventFunction) &
         4751  +          QuickStyleVectorDialog::OnCmdIsAlignedChanged);
         4752  +  Connect(ID_SYMBOLIZER_TEXT_GENERALIZE,
         4753  +          wxEVT_COMMAND_CHECKBOX_CLICKED,
         4754  +          (wxObjectEventFunction) &
         4755  +          QuickStyleVectorDialog::OnCmdGeneralizeLineChanged);
         4756  +  Connect(ID_SYMBOLIZER_FONT2_NAME, wxEVT_COMMAND_COMBOBOX_SELECTED,
         4757  +          (wxObjectEventFunction) & QuickStyleVectorDialog::OnFont2Changed);
         4758  +  Connect(ID_SYMBOLIZER_HALO2_ENABLE,
         4759  +          wxEVT_COMMAND_CHECKBOX_CLICKED,
         4760  +          (wxObjectEventFunction) &
         4761  +          QuickStyleVectorDialog::OnCmdHalo2EnableChanged);
         4762  +  Connect(ID_SYMBOLIZER_HALO2_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
         4763  +          (wxObjectEventFunction) &
         4764  +          QuickStyleVectorDialog::OnCmdColorHalo2Picker);
         4765  +  Connect(ID_SYMBOLIZER_HALO2_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
         4766  +          (wxObjectEventFunction) &
         4767  +          QuickStyleVectorDialog::OnCmdColorHalo2Changed);
         4768  +  return panel;
         4769  +}
         4770  +
         4771  +void QuickStyleVectorDialog::
         4772  +OnCmdLabel2Changed(wxCommandEvent & WXUNUSED(event))
         4773  +{
         4774  +//
         4775  +// Label enable/disable 
         4776  +//
         4777  +  wxCheckBox *enableCtrl =
         4778  +    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT2_ENABLE);
         4779  +  if (enableCtrl->IsChecked() == true)
         4780  +    {
         4781  +      Style->SetLabelPrint(true);
         4782  +      Style->SetLabelLinePlacement(true);
         4783  +  } else
         4784  +    Style->SetLabelPrint(false);
         4785  +  RetrieveTextLinePage(false);
         4786  +  UpdateTextLinePage();
         4787  +}
         4788  +
         4789  +void QuickStyleVectorDialog::OnFont2Changed(wxCommandEvent & WXUNUSED(event))
         4790  +{
         4791  +//
         4792  +// the Font is changed
         4793  +//
         4794  +  wxCheckBox *boldCtrl = (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT2_BOLD);
         4795  +  wxCheckBox *italicCtrl =
         4796  +    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT2_ITALIC);
         4797  +  wxComboBox *fontList = (wxComboBox *) FindWindow(ID_SYMBOLIZER_FONT2_NAME);
         4798  +  wxString font = fontList->GetValue();
         4799  +  char facename[1024];
         4800  +  strcpy(facename, font.ToUTF8());
         4801  +  if (strncmp(facename, "ToyFont: ", 9) == 0)
         4802  +    {
         4803  +      boldCtrl->Enable(true);
         4804  +      italicCtrl->Enable(true);
         4805  +  } else
         4806  +    {
         4807  +      bool bold = false;
         4808  +      bool italic = false;
         4809  +      MainFrame->CheckTTFont(facename, &bold, &italic);
         4810  +      boldCtrl->SetValue(bold);
         4811  +      italicCtrl->SetValue(italic);
         4812  +      boldCtrl->Enable(false);
         4813  +      italicCtrl->Enable(false);
         4814  +    }
         4815  +}
         4816  +
         4817  +void QuickStyleVectorDialog::
         4818  +OnCmdFont2ColorPicker(wxCommandEvent & WXUNUSED(event))
         4819  +{
         4820  +//
         4821  +// color picker
         4822  +//
         4823  +  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FONT2_COLOR);
         4824  +  wxColour clr = wxNullColour;
         4825  +  wxString str = colorCtrl->GetValue();
         4826  +  if (ColorMapEntry::IsValidColor(str) == true)
         4827  +    ColorMapEntry::GetWxColor(str, clr);
         4828  +  wxColour color = wxGetColourFromUser(this, clr);
         4829  +  if (color.IsOk() == true)
         4830  +    {
         4831  +      char hex[16];
         4832  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         4833  +      wxString str = wxString::FromUTF8(hex);
         4834  +      colorCtrl->SetValue(str);
         4835  +    }
         4836  +}
         4837  +
         4838  +void QuickStyleVectorDialog::
         4839  +OnCmdFont2ColorChanged(wxCommandEvent & WXUNUSED(event))
         4840  +{
         4841  +//
         4842  +// Font Color changed: updating the visual sample
         4843  +//
         4844  +  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FONT2_COLOR);
         4845  +  wxStaticBitmap *sampleCtrl =
         4846  +    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_FONT2_PICKER_HEX);
         4847  +  wxColour back = wxColour(255, 255, 255);
         4848  +  wxString str = colorCtrl->GetValue();
         4849  +  if (ColorMapEntry::IsValidColor(str) == true)
         4850  +    ColorMapEntry::GetWxColor(str, back);
         4851  +  wxBitmap bmp;
         4852  +  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
         4853  +  sampleCtrl->SetBitmap(bmp);
         4854  +  sampleCtrl->Refresh();
         4855  +  sampleCtrl->Update();
         4856  +}
         4857  +
         4858  +void QuickStyleVectorDialog::
         4859  +OnCmdIsRepeatedChanged(wxCommandEvent & WXUNUSED(event))
         4860  +{
         4861  +//
         4862  +// Label IsRepeated enable/disable 
         4863  +//
         4864  +  wxCheckBox *repeatedCtrl =
         4865  +    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT_IS_REPEATED);
         4866  +  if (repeatedCtrl->IsChecked() == true)
         4867  +    Style->SetRepeatedLabel(true);
         4868  +  else
         4869  +    Style->SetRepeatedLabel(false);
         4870  +  RetrieveTextLinePage(false);
         4871  +  UpdateTextLinePage();
         4872  +}
         4873  +
         4874  +void QuickStyleVectorDialog::
         4875  +OnCmdIsAlignedChanged(wxCommandEvent & WXUNUSED(event))
         4876  +{
         4877  +//
         4878  +// Label IsAligned enable/disable 
         4879  +//
         4880  +  wxCheckBox *alignedCtrl =
         4881  +    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT_IS_ALIGNED);
         4882  +  if (alignedCtrl->IsChecked() == true)
         4883  +    Style->SetLabelIsAligned(true);
         4884  +  else
         4885  +    Style->SetLabelIsAligned(false);
         4886  +}
         4887  +
         4888  +void QuickStyleVectorDialog::
         4889  +OnCmdGeneralizeLineChanged(wxCommandEvent & WXUNUSED(event))
         4890  +{
         4891  +//
         4892  +// Label GeneralizeLine enable/disable 
         4893  +//
         4894  +  wxCheckBox *generalizeCtrl =
         4895  +    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT_GENERALIZE);
         4896  +  if (generalizeCtrl->IsChecked() == true)
         4897  +    Style->SetLabelGeneralizeLine(true);
         4898  +  else
         4899  +    Style->SetLabelGeneralizeLine(false);
         4900  +}
         4901  +
         4902  +void QuickStyleVectorDialog::
         4903  +OnCmdColorHalo2Picker(wxCommandEvent & WXUNUSED(event))
         4904  +{
         4905  +//
         4906  +// color picker
         4907  +//
         4908  +  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_HALO2_COLOR);
         4909  +  wxColour clr = wxNullColour;
         4910  +  wxString str = colorCtrl->GetValue();
         4911  +  if (ColorMapEntry::IsValidColor(str) == true)
         4912  +    ColorMapEntry::GetWxColor(str, clr);
         4913  +  wxColour color = wxGetColourFromUser(this, clr);
         4914  +  if (color.IsOk() == true)
         4915  +    {
         4916  +      char hex[16];
         4917  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         4918  +      wxString str = wxString::FromUTF8(hex);
         4919  +      colorCtrl->SetValue(str);
         4920  +    }
         4921  +}
         4922  +
         4923  +void QuickStyleVectorDialog::
         4924  +OnCmdColorHalo2Changed(wxCommandEvent & WXUNUSED(event))
         4925  +{
         4926  +//
         4927  +// Halo Color changed: updating the visual sample
         4928  +//
         4929  +  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_HALO2_COLOR);
         4930  +  wxStaticBitmap *sampleCtrl =
         4931  +    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_HALO2_PICKER_HEX);
         4932  +  wxColour back = wxColour(255, 255, 255);
         4933  +  wxString str = colorCtrl->GetValue();
         4934  +  if (ColorMapEntry::IsValidColor(str) == true)
         4935  +    ColorMapEntry::GetWxColor(str, back);
         4936  +  wxBitmap bmp;
         4937  +  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
         4938  +  sampleCtrl->SetBitmap(bmp);
         4939  +  sampleCtrl->Refresh();
         4940  +  sampleCtrl->Update();
         4941  +}
         4942  +
         4943  +void QuickStyleVectorDialog::
         4944  +OnCmdHalo2EnableChanged(wxCommandEvent & WXUNUSED(event))
         4945  +{
         4946  +//
         4947  +// Graphic Halo enable/disable 
         4948  +//
         4949  +  wxCheckBox *enableCtrl =
         4950  +    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_HALO2_ENABLE);
         4951  +  if (enableCtrl->IsChecked() == true)
         4952  +    Style->EnableHalo(true);
         4953  +  else
         4954  +    Style->EnableHalo(false);
         4955  +  RetrieveTextLinePage(false);
         4956  +  UpdateTextLinePage();
         4957  +}
         4958  +
         4959  +bool QuickStyleVectorDialog::RetrieveMainPage()
         4960  +{
         4961  +//
         4962  +// retrieving params from the MAIN page
         4963  +//
         4964  +  double min = Style->GetScaleMin();
         4965  +  double max = Style->GetScaleMax();
         4966  +  if (Style->IsMinScaleEnabled() == true)
         4967  +    {
         4968  +      wxTextCtrl *minCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MIN_SCALE);
         4969  +      wxString value = minCtrl->GetValue();
         4970  +      if (value.ToDouble(&min) != true)
         4971  +        {
         4972  +          wxMessageBox(wxT
         4973  +                       ("MIN_SCALE isn't a valid decimal number !!!"),
         4974  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         4975  +          return false;
         4976  +        }
         4977  +      if (min < 0.0)
         4978  +        {
         4979  +          wxMessageBox(wxT
         4980  +                       ("MIN_SCALE must be a positive number !!!"),
         4981  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         4982  +          return false;
         4983  +        }
         4984  +    }
         4985  +  if (Style->IsMaxScaleEnabled() == true)
         4986  +    {
         4987  +      wxTextCtrl *maxCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MAX_SCALE);
         4988  +      wxString value = maxCtrl->GetValue();
         4989  +      if (value.ToDouble(&max) != true)
         4990  +        {
         4991  +          wxMessageBox(wxT
         4992  +                       ("MAX_SCALE isn't a valid decimal number !!!"),
         4993  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         4994  +          return false;
         4995  +        }
         4996  +      if (max < 0.0)
         4997  +        {
         4998  +          wxMessageBox(wxT
         4999  +                       ("MAX_SCALE must be a positive number !!!"),
         5000  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5001  +          return false;
         5002  +        }
         5003  +    }
         5004  +  if (Style->IsMinScaleEnabled() == true && Style->IsMaxScaleEnabled() == true)
         5005  +    {
         5006  +      if (min >= max)
         5007  +        {
         5008  +          wxMessageBox(wxT
         5009  +                       ("MAX_SCALE is always expected to be greater than MIN_SCALE !!!"),
         5010  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5011  +          return false;
         5012  +        }
         5013  +    }
         5014  +  Style->SetScaleMin(min);
         5015  +  Style->SetScaleMax(max);
         5016  +  return true;
         5017  +}
         5018  +
         5019  +void QuickStyleVectorDialog::UpdateMainPage()
         5020  +{
         5021  +//
         5022  +// updating the MAIN page
         5023  +//
         5024  +  wxRadioBox *rangeBox = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_MINMAX_SCALE);
         5025  +  if (Style->IsMinScaleEnabled() != true && Style->IsMaxScaleEnabled() != true)
         5026  +    rangeBox->SetSelection(0);
         5027  +  else if (Style->IsMinScaleEnabled() == true
         5028  +           && Style->IsMaxScaleEnabled() != true)
         5029  +    rangeBox->SetSelection(1);
         5030  +  else if (Style->IsMinScaleEnabled() != true
         5031  +           && Style->IsMaxScaleEnabled() == true)
         5032  +    rangeBox->SetSelection(2);
         5033  +  else
         5034  +    rangeBox->SetSelection(3);
         5035  +  wxTextCtrl *minCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MIN_SCALE);
         5036  +  char dummy[64];
         5037  +  wxString str;
         5038  +  if (Style->IsMinScaleEnabled() == true)
         5039  +    {
         5040  +      sprintf(dummy, "%1.2f", Style->GetScaleMin());
         5041  +      str = wxString::FromUTF8(dummy);
         5042  +      minCtrl->SetValue(str);
         5043  +      minCtrl->Enable(true);
         5044  +  } else
         5045  +    {
         5046  +      str = wxT("0.0");
         5047  +      minCtrl->SetValue(str);
         5048  +      minCtrl->Enable(false);
         5049  +    }
         5050  +  wxTextCtrl *maxCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MAX_SCALE);
         5051  +  if (Style->IsMaxScaleEnabled() == true)
         5052  +    {
         5053  +      sprintf(dummy, "%1.2f", Style->GetScaleMax());
         5054  +      str = wxString::FromUTF8(dummy);
         5055  +      maxCtrl->SetValue(str);
         5056  +      maxCtrl->Enable(true);
         5057  +  } else
         5058  +    {
         5059  +      str = wxT("+Infinite");
         5060  +      maxCtrl->SetValue(str);
         5061  +      maxCtrl->Enable(false);
         5062  +    }
         5063  +}
         5064  +
         5065  +bool QuickStyleVectorDialog::RetrievePointPage(bool check)
         5066  +{
         5067  +//
         5068  +// retrieving params from the Point Symbolizer page
         5069  +//
         5070  +  double opacity;
         5071  +  double size;
         5072  +  double rotation;
         5073  +  double anchorPointX;
         5074  +  double anchorPointY;
         5075  +  double displacementX;
         5076  +  double displacementY;
         5077  +  char fillColor[8];
         5078  +  char strokeColor[8];
         5079  +  wxSlider *opacityCtrl = (wxSlider *) FindWindow(ID_SYMBOLIZER_OPACITY);
         5080  +  opacity = opacityCtrl->GetValue() / 100.0;
         5081  +  wxTextCtrl *sizeCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_SIZE);
         5082  +  wxString value = sizeCtrl->GetValue();
         5083  +  if (value.ToDouble(&size) != true)
         5084  +    {
         5085  +      if (check == true)
         5086  +        {
         5087  +          wxMessageBox(wxT
         5088  +                       ("SIZE isn't a valid decimal number !!!"),
         5089  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5090  +          return false;
         5091  +        }
         5092  +    }
         5093  +  if (size < 0.0)
         5094  +    {
         5095  +      if (check == true)
         5096  +        {
         5097  +          wxMessageBox(wxT
         5098  +                       ("SIZE must be a positive number !!!"),
         5099  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5100  +          return false;
         5101  +        }
         5102  +    }
         5103  +  wxTextCtrl *rotationCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_ROTATION);
         5104  +  value = rotationCtrl->GetValue();
         5105  +  if (value.ToDouble(&rotation) != true)
         5106  +    {
         5107  +      if (check == true)
         5108  +        {
         5109  +          wxMessageBox(wxT
         5110  +                       ("ROTATION isn't a valid decimal number !!!"),
         5111  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5112  +          return false;
         5113  +        }
         5114  +    }
         5115  +  wxTextCtrl *anchorXCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_ANCHOR_X);
         5116  +  value = anchorXCtrl->GetValue();
         5117  +  if (value.ToDouble(&anchorPointX) != true)
         5118  +    {
         5119  +      if (check == true)
         5120  +        {
         5121  +          wxMessageBox(wxT
         5122  +                       ("ANCHOR-POINT-X isn't a valid decimal number !!!"),
         5123  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5124  +          return false;
         5125  +        }
         5126  +    }
         5127  +  if (anchorPointX < 0.0 || anchorPointX > 1.0)
         5128  +    {
         5129  +      if (check == true)
         5130  +        {
         5131  +          wxMessageBox(wxT
         5132  +                       ("ANCHOR-POINT-X must be between 0.0 and 1.0 !!!"),
         5133  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5134  +          return false;
         5135  +        }
         5136  +    }
         5137  +  wxTextCtrl *anchorYCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_ANCHOR_Y);
         5138  +  value = anchorYCtrl->GetValue();
         5139  +  if (value.ToDouble(&anchorPointY) != true)
         5140  +    {
         5141  +      if (check == true)
         5142  +        {
         5143  +          wxMessageBox(wxT
         5144  +                       ("ANCHOR-POINT-Y isn't a valid decimal number !!!"),
         5145  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5146  +          return false;
         5147  +        }
         5148  +    }
         5149  +  if (anchorPointY < 0.0 || anchorPointY > 1.0)
         5150  +    {
         5151  +      if (check == true)
         5152  +        {
         5153  +          wxMessageBox(wxT
         5154  +                       ("ANCHOR-POINT-Y must be between 0.0 and 1.0 !!!"),
         5155  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5156  +          return false;
         5157  +        }
         5158  +    }
         5159  +  wxTextCtrl *displXCtrl =
         5160  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_DISPLACEMENT_X);
         5161  +  value = displXCtrl->GetValue();
         5162  +  if (value.ToDouble(&displacementX) != true)
         5163  +    {
         5164  +      if (check == true)
         5165  +        {
         5166  +          wxMessageBox(wxT
         5167  +                       ("DISPLACEMENT-X isn't a valid decimal number !!!"),
         5168  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5169  +          return false;
         5170  +        }
         5171  +    }
         5172  +  wxTextCtrl *displYCtrl =
         5173  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_DISPLACEMENT_Y);
         5174  +  value = displYCtrl->GetValue();
         5175  +  if (value.ToDouble(&displacementY) != true)
         5176  +    {
         5177  +      if (check == true)
         5178  +        {
         5179  +          wxMessageBox(wxT
         5180  +                       ("DISPLACEMENT-Y isn't a valid decimal number !!!"),
         5181  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5182  +          return false;
         5183  +        }
         5184  +    }
         5185  +  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FILL_COLOR);
         5186  +  wxString color = colorCtrl->GetValue();
         5187  +  if (ColorMapEntry::IsValidColor(color) != true)
         5188  +    {
         5189  +      if (check == true)
         5190  +        {
         5191  +          wxMessageBox(wxT
         5192  +                       ("FILL-COLOR isn't a valid HexRGB color !!!"),
         5193  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5194  +          return false;
         5195  +        }
         5196  +    }
         5197  +  strcpy(fillColor, color.ToUTF8());
         5198  +  colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE_COLOR);
         5199  +  color = colorCtrl->GetValue();
         5200  +  if (ColorMapEntry::IsValidColor(color) != true)
         5201  +    {
         5202  +      if (check == true)
         5203  +        {
         5204  +          wxMessageBox(wxT
         5205  +                       ("STROKE-COLOR isn't a valid HexRGB color !!!"),
         5206  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5207  +          return false;
         5208  +        }
         5209  +    }
         5210  +  strcpy(strokeColor, color.ToUTF8());
         5211  +
         5212  +  Style->SetSymbolOpacity(opacity);
         5213  +  Style->SetSymbolSize(size);
         5214  +  Style->SetSymbolAnchorX(anchorPointX);
         5215  +  Style->SetSymbolAnchorY(anchorPointY);
         5216  +  Style->SetSymbolRotation(rotation);
         5217  +  Style->SetSymbolDisplacementX(displacementX);
         5218  +  Style->SetSymbolDisplacementY(displacementY);
         5219  +  Style->SetSymbolFillColor(fillColor);
         5220  +  Style->SetSymbolStrokeColor(strokeColor);
         5221  +  return true;
         5222  +}
         5223  +
         5224  +void QuickStyleVectorDialog::UpdatePointPage()
         5225  +{
         5226  +//
         5227  +// updating the Point Symbolizer page
         5228  +//
         5229  +  wxSlider *opacityCtrl = (wxSlider *) FindWindow(ID_SYMBOLIZER_OPACITY);
         5230  +  opacityCtrl->SetValue(Style->GetSymbolOpacity() * 100.0);
         5231  +  wxTextCtrl *sizeCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_SIZE);
         5232  +  char dummy[64];
         5233  +  sprintf(dummy, "%1.2f", Style->GetSymbolSize());
         5234  +  wxString str = wxString::FromUTF8(dummy);
         5235  +  sizeCtrl->SetValue(str);
         5236  +  wxTextCtrl *rotationCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_ROTATION);
         5237  +  sprintf(dummy, "%1.2f", Style->GetSymbolRotation());
         5238  +  str = wxString::FromUTF8(dummy);
         5239  +  rotationCtrl->SetValue(str);
         5240  +  wxTextCtrl *anchorXCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_ANCHOR_X);
         5241  +  sprintf(dummy, "%1.2f", Style->GetSymbolAnchorX());
         5242  +  str = wxString::FromUTF8(dummy);
         5243  +  anchorXCtrl->SetValue(str);
         5244  +  wxTextCtrl *anchorYCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_ANCHOR_Y);
         5245  +  sprintf(dummy, "%1.2f", Style->GetSymbolAnchorY());
         5246  +  str = wxString::FromUTF8(dummy);
         5247  +  anchorYCtrl->SetValue(str);
         5248  +  wxTextCtrl *displXCtrl =
         5249  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_DISPLACEMENT_X);
         5250  +  sprintf(dummy, "%1.2f", Style->GetSymbolDisplacementX());
         5251  +  str = wxString::FromUTF8(dummy);
         5252  +  displXCtrl->SetValue(str);
         5253  +  wxTextCtrl *displYCtrl =
         5254  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_DISPLACEMENT_Y);
         5255  +  sprintf(dummy, "%1.2f", Style->GetSymbolDisplacementY());
         5256  +  str = wxString::FromUTF8(dummy);
         5257  +  displYCtrl->SetValue(str);
         5258  +  wxRadioBox *markCtrl = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_MARK);
         5259  +  switch (Style->GetSymbolWellKnownMark())
         5260  +    {
         5261  +      case RL2_GRAPHIC_MARK_CIRCLE:
         5262  +        markCtrl->SetSelection(1);
         5263  +        break;
         5264  +      case RL2_GRAPHIC_MARK_TRIANGLE:
         5265  +        markCtrl->SetSelection(2);
         5266  +        break;
         5267  +      case RL2_GRAPHIC_MARK_STAR:
         5268  +        markCtrl->SetSelection(3);
         5269  +        break;
         5270  +      case RL2_GRAPHIC_MARK_CROSS:
         5271  +        markCtrl->SetSelection(4);
         5272  +        break;
         5273  +      case RL2_GRAPHIC_MARK_X:
         5274  +        markCtrl->SetSelection(5);
         5275  +        break;
         5276  +      default:
         5277  +        markCtrl->SetSelection(0);
         5278  +        break;
         5279  +    };
         5280  +  wxTextCtrl *colorFillCtrl =
         5281  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FILL_COLOR);
         5282  +  wxString fillColor = wxString::FromUTF8(Style->GetSymbolFillColor());
         5283  +  colorFillCtrl->SetValue(fillColor);
         5284  +  wxTextCtrl *colorStrokeCtrl =
         5285  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE_COLOR);
         5286  +  wxString strokeColor = wxString::FromUTF8(Style->GetSymbolStrokeColor());
         5287  +  colorStrokeCtrl->SetValue(strokeColor);
         5288  +}
         5289  +
         5290  +bool QuickStyleVectorDialog::RetrieveLinePage(bool check)
         5291  +{
         5292  +//
         5293  +// retrieving params from the Line Symbolizer page
         5294  +//
         5295  +  double opacity;
         5296  +  double perpendicularOffset;
         5297  +  char strokeColor[8];
         5298  +  double strokeWidth;
         5299  +  wxSlider *opacityCtrl =
         5300  +    (wxSlider *) FindWindow(ID_SYMBOLIZER_STROKE1_OPACITY);
         5301  +  opacity = opacityCtrl->GetValue() / 100.0;
         5302  +  wxTextCtrl *perpCtrl =
         5303  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_PERPENDICULAR);
         5304  +  wxString value = perpCtrl->GetValue();
         5305  +  if (value.ToDouble(&perpendicularOffset) != true)
         5306  +    {
         5307  +      if (check == true)
         5308  +        {
         5309  +          wxMessageBox(wxT
         5310  +                       ("PERPENDICULAR-OFFSET isn't a valid decimal number !!!"),
         5311  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5312  +          return false;
         5313  +        }
         5314  +    }
         5315  +  wxTextCtrl *colorCtrl =
         5316  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_COLOR);
         5317  +  wxString color = colorCtrl->GetValue();
         5318  +  if (ColorMapEntry::IsValidColor(color) != true)
         5319  +    {
         5320  +      if (check == true)
         5321  +        {
         5322  +          wxMessageBox(wxT
         5323  +                       ("STROKE-COLOR isn't a valid HexRGB color !!!"),
         5324  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5325  +          return false;
         5326  +        }
         5327  +    }
         5328  +  strcpy(strokeColor, color.ToUTF8());
         5329  +  wxTextCtrl *widthCtrl =
         5330  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_WIDTH);
         5331  +  value = widthCtrl->GetValue();
         5332  +  if (value.ToDouble(&strokeWidth) != true)
         5333  +    {
         5334  +      if (check == true)
         5335  +        {
         5336  +          wxMessageBox(wxT
         5337  +                       ("STROKE-WIDTH isn't a valid decimal number !!!"),
         5338  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5339  +          return false;
         5340  +        }
         5341  +    }
         5342  +  if (strokeWidth <= 0.0)
         5343  +    {
         5344  +      if (check == true)
         5345  +        {
         5346  +          wxMessageBox(wxT
         5347  +                       ("STROKE-WIDTH must be a positive number !!!"),
         5348  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5349  +          return false;
         5350  +        }
         5351  +    }
         5352  +  wxRadioBox *dotCtrl = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_DASH_DOT);
         5353  +  switch (dotCtrl->GetSelection())
         5354  +    {
         5355  +      case 1:
         5356  +        Style->SetLineDotStyle(QUICK_STYLE_DOT_LINE);
         5357  +        break;
         5358  +      case 2:
         5359  +        Style->SetLineDotStyle(QUICK_STYLE_DASH_LINE);
         5360  +        break;
         5361  +      case 3:
         5362  +        Style->SetLineDotStyle(QUICK_STYLE_DASH_DOT_LINE);
         5363  +        break;
         5364  +      default:
         5365  +        Style->SetLineDotStyle(QUICK_STYLE_SOLID_LINE);
         5366  +        break;
         5367  +    };
         5368  +  Style->SetLineOpacity(opacity);
         5369  +  Style->SetLinePerpendicularOffset(perpendicularOffset);
         5370  +  Style->SetLineStrokeWidth(strokeWidth);
         5371  +  Style->SetLineStrokeColor(strokeColor);
         5372  +  return true;
         5373  +}
         5374  +
         5375  +void QuickStyleVectorDialog::UpdateLinePage()
         5376  +{
         5377  +//
         5378  +// updating the Line Symbolizer page
         5379  +//
         5380  +  wxSlider *opacityCtrl =
         5381  +    (wxSlider *) FindWindow(ID_SYMBOLIZER_STROKE1_OPACITY);
         5382  +  opacityCtrl->SetValue(Style->GetLineOpacity() * 100.0);
         5383  +  wxTextCtrl *perpCtrl =
         5384  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_PERPENDICULAR);
         5385  +  char dummy[64];
         5386  +  sprintf(dummy, "%1.2f", Style->GetLinePerpendicularOffset());
         5387  +  wxString str = wxString::FromUTF8(dummy);
         5388  +  perpCtrl->SetValue(str);
         5389  +  wxTextCtrl *colorCtrl =
         5390  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_COLOR);
         5391  +  wxButton *pick = (wxButton *) FindWindow(ID_SYMBOLIZER_STROKE1_PICKER_BTN);
         5392  +  colorCtrl->Enable(true);
         5393  +  pick->Enable(true);
         5394  +  wxString strokeColor = wxString::FromUTF8(Style->GetLineStrokeColor());
         5395  +  colorCtrl->SetValue(strokeColor);
         5396  +  wxTextCtrl *widthCtrl =
         5397  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_WIDTH);
         5398  +  sprintf(dummy, "%1.2f", Style->GetLineStrokeWidth());
         5399  +  str = wxString::FromUTF8(dummy);
         5400  +  wxRadioBox *dotCtrl = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_DASH_DOT);
         5401  +  switch (Style->GetLineDotStyle())
         5402  +    {
         5403  +      case QUICK_STYLE_DOT_LINE:
         5404  +        dotCtrl->SetSelection(1);
         5405  +        break;
         5406  +      case QUICK_STYLE_DASH_LINE:
         5407  +        dotCtrl->SetSelection(2);
         5408  +        break;
         5409  +      case QUICK_STYLE_DASH_DOT_LINE:
         5410  +        dotCtrl->SetSelection(3);
         5411  +        break;
         5412  +      default:
         5413  +        dotCtrl->SetSelection(0);
         5414  +        break;
         5415  +    };
         5416  +  widthCtrl->SetValue(str);
         5417  +}
         5418  +
         5419  +bool QuickStyleVectorDialog::RetrievePolygonPage(bool check)
         5420  +{
         5421  +//
         5422  +// retrieving params from the Polygon Synbolizer page
         5423  +//
         5424  +  double fillOpacity;
         5425  +  double displacementX;
         5426  +  double displacementY;
         5427  +  double perpendicularOffset;
         5428  +  char fillColor[8];
         5429  +  double strokeOpacity;
         5430  +  char strokeColor[8];
         5431  +  double strokeWidth;
         5432  +  wxSlider *opacityCtrl = (wxSlider *) FindWindow(ID_SYMBOLIZER_FILL2_OPACITY);
         5433  +  fillOpacity = opacityCtrl->GetValue() / 100.0;
         5434  +  wxTextCtrl *displXCtrl =
         5435  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_POLYGON1_DISPLACEMENT_X);
         5436  +  wxString value = displXCtrl->GetValue();
         5437  +  if (Style->IsPolygonFill() != true && Style->IsPolygonStroke() != true)
         5438  +    {
         5439  +      if (check == true)
         5440  +        {
         5441  +          wxMessageBox(wxT
         5442  +                       ("You can't disable both FILL and STROKE at the same time !!!"),
         5443  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5444  +          return false;
         5445  +        }
         5446  +    }
         5447  +  if (value.ToDouble(&displacementX) != true)
         5448  +    {
         5449  +      if (check == true)
         5450  +        {
         5451  +          wxMessageBox(wxT
         5452  +                       ("DISPLACEMENT-X isn't a valid decimal number !!!"),
         5453  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5454  +          return false;
         5455  +        }
         5456  +    }
         5457  +  wxTextCtrl *displYCtrl =
         5458  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_POLYGON1_DISPLACEMENT_Y);
         5459  +  value = displYCtrl->GetValue();
         5460  +  if (value.ToDouble(&displacementY) != true)
         5461  +    {
         5462  +      if (check == true)
         5463  +        {
         5464  +          wxMessageBox(wxT
         5465  +                       ("DISPLACEMENT-Y isn't a valid decimal number !!!"),
         5466  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5467  +          return false;
         5468  +        }
         5469  +    }
         5470  +  wxTextCtrl *perpCtrl =
         5471  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_POLYGON1_PERPENDICULAR);
         5472  +  value = perpCtrl->GetValue();
         5473  +  if (value.ToDouble(&perpendicularOffset) != true)
         5474  +    {
         5475  +      if (check == true)
         5476  +        {
         5477  +          wxMessageBox(wxT
         5478  +                       ("PERPENDICULAR-OFFSET isn't a valid decimal number !!!"),
         5479  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5480  +          return false;
         5481  +        }
         5482  +    }
         5483  +  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FILL2_COLOR);
         5484  +  wxString color = colorCtrl->GetValue();
         5485  +  if (ColorMapEntry::IsValidColor(color) != true)
         5486  +    {
         5487  +      if (check == true)
         5488  +        {
         5489  +          wxMessageBox(wxT
         5490  +                       ("FILL-COLOR isn't a valid HexRGB color !!!"),
         5491  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5492  +          return false;
         5493  +        }
         5494  +    }
         5495  +  strcpy(fillColor, color.ToUTF8());
         5496  +  wxSlider *opacity2Ctrl =
         5497  +    (wxSlider *) FindWindow(ID_SYMBOLIZER_STROKE2_OPACITY);
         5498  +  strokeOpacity = opacity2Ctrl->GetValue() / 100.0;
         5499  +  wxTextCtrl *color2Ctrl =
         5500  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE2_COLOR);
         5501  +  color = color2Ctrl->GetValue();
         5502  +  if (ColorMapEntry::IsValidColor(color) != true)
         5503  +    {
         5504  +      if (check == true)
         5505  +        {
         5506  +          wxMessageBox(wxT
         5507  +                       ("STROKE-COLOR isn't a valid HexRGB color !!!"),
         5508  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5509  +          return false;
         5510  +        }
         5511  +    }
         5512  +  strcpy(strokeColor, color.ToUTF8());
         5513  +  wxTextCtrl *widthCtrl =
         5514  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE2_WIDTH);
         5515  +  value = widthCtrl->GetValue();
         5516  +  if (value.ToDouble(&strokeWidth) != true)
         5517  +    {
         5518  +      if (check == true)
         5519  +        {
         5520  +          wxMessageBox(wxT
         5521  +                       ("STROKE-WIDTH isn't a valid decimal number !!!"),
         5522  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5523  +          return false;
         5524  +        }
         5525  +    }
         5526  +  if (strokeWidth <= 0.0)
         5527  +    {
         5528  +      if (check == true)
         5529  +        {
         5530  +          wxMessageBox(wxT
         5531  +                       ("STROKE-WIDTH must be a positive number !!!"),
         5532  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5533  +          return false;
         5534  +        }
         5535  +    }
         5536  +
         5537  +  Style->SetPolygonFillOpacity(fillOpacity);
         5538  +  Style->SetPolygonDisplacementX(displacementX);
         5539  +  Style->SetPolygonDisplacementY(displacementY);
         5540  +  Style->SetPolygonPerpendicularOffset(perpendicularOffset);
         5541  +  Style->SetPolygonFillColor(fillColor);
         5542  +  Style->SetPolygonStrokeOpacity(strokeOpacity);
         5543  +  Style->SetPolygonStrokeColor(strokeColor);
         5544  +  Style->SetPolygonStrokeWidth(strokeWidth);
         5545  +  return true;
         5546  +}
         5547  +
         5548  +void QuickStyleVectorDialog::UpdatePolygonPage()
         5549  +{
         5550  +//
         5551  +// updating the Polygon Symbolizer page
         5552  +//
         5553  +  wxCheckBox *enableBox = (wxCheckBox *) FindWindow(ID_SYMBOLIZER_FILL2_ENABLE);
         5554  +  enableBox->SetValue(Style->IsPolygonFill());
         5555  +  wxTextCtrl *displXCtrl =
         5556  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_POLYGON1_DISPLACEMENT_X);
         5557  +  char dummy[64];
         5558  +  sprintf(dummy, "%1.2f", Style->GetPolygonDisplacementX());
         5559  +  wxString str = wxString::FromUTF8(dummy);
         5560  +  displXCtrl->SetValue(str);
         5561  +  wxTextCtrl *displYCtrl =
         5562  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_POLYGON1_DISPLACEMENT_Y);
         5563  +  sprintf(dummy, "%1.2f", Style->GetPolygonDisplacementY());
         5564  +  str = wxString::FromUTF8(dummy);
         5565  +  displYCtrl->SetValue(str);
         5566  +  wxTextCtrl *perpCtrl =
         5567  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_POLYGON1_PERPENDICULAR);
         5568  +  sprintf(dummy, "%1.2f", Style->GetPolygonPerpendicularOffset());
         5569  +  str = wxString::FromUTF8(dummy);
         5570  +  perpCtrl->SetValue(str);
         5571  +  wxSlider *opacityCtrl = (wxSlider *) FindWindow(ID_SYMBOLIZER_FILL2_OPACITY);
         5572  +  opacityCtrl->SetValue(Style->GetPolygonFillOpacity() * 100.0);
         5573  +  opacityCtrl->Enable(Style->IsPolygonFill());
         5574  +  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FILL2_COLOR);
         5575  +  wxButton *pick = (wxButton *) FindWindow(ID_SYMBOLIZER_FILL2_PICKER_BTN);
         5576  +  wxColour color = wxNullColour;
         5577  +  str = wxString::FromUTF8(Style->GetPolygonFillColor());
         5578  +  ColorMapEntry::GetWxColor(str, color);
         5579  +  if (color.IsOk() == true)
         5580  +    {
         5581  +      char hex[16];
         5582  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         5583  +      wxString str = wxString::FromUTF8(hex);
         5584  +      colorCtrl->SetValue(str);
         5585  +    }
         5586  +  colorCtrl->Enable(Style->IsPolygonFill());
         5587  +  pick->Enable(Style->IsPolygonFill());
         5588  +  wxCheckBox *enable2Box =
         5589  +    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_STROKE2_ENABLE);
         5590  +  enable2Box->SetValue(Style->IsPolygonStroke());
         5591  +  wxSlider *opacity2Ctrl =
         5592  +    (wxSlider *) FindWindow(ID_SYMBOLIZER_STROKE2_OPACITY);
         5593  +  opacity2Ctrl->SetValue(Style->GetPolygonStrokeOpacity() * 100.0);
         5594  +  opacity2Ctrl->Enable(Style->IsPolygonStroke());
         5595  +  wxTextCtrl *color2Ctrl =
         5596  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE2_COLOR);
         5597  +  wxButton *pick2 = (wxButton *) FindWindow(ID_SYMBOLIZER_STROKE2_PICKER_BTN);
         5598  +  color = wxNullColour;
         5599  +  str = wxString::FromUTF8(Style->GetPolygonStrokeColor());
         5600  +  ColorMapEntry::GetWxColor(str, color);
         5601  +  if (color.IsOk() == true)
         5602  +    {
         5603  +      char hex[16];
         5604  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         5605  +      wxString str = wxString::FromUTF8(hex);
         5606  +      color2Ctrl->SetValue(str);
         5607  +    }
         5608  +  color2Ctrl->Enable(Style->IsPolygonStroke());
         5609  +  pick2->Enable(Style->IsPolygonStroke());
         5610  +  wxTextCtrl *widthCtrl =
         5611  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE2_WIDTH);
         5612  +  sprintf(dummy, "%1.2f", Style->GetPolygonStrokeWidth());
         5613  +  str = wxString::FromUTF8(dummy);
         5614  +  widthCtrl->SetValue(str);
         5615  +  widthCtrl->Enable(Style->IsPolygonStroke());
         5616  +}
         5617  +
         5618  +bool QuickStyleVectorDialog::RetrieveTextPointPage(bool check)
         5619  +{
         5620  +//
         5621  +// retrieving params from the Text Symbolizer page - Point Placement
         5622  +//
         5623  +  wxString column;
         5624  +  wxString font;
         5625  +  double fontSize;
         5626  +  int fontStyle;
         5627  +  int fontWeight;
         5628  +  double opacity;
         5629  +  char fontColor[8];
         5630  +  double haloRadius;
         5631  +  double haloOpacity;
         5632  +  char haloColor[8];
         5633  +  double rotation;
         5634  +  double anchorPointX;
         5635  +  double anchorPointY;
         5636  +  double displacementX;
         5637  +  double displacementY;
         5638  +
         5639  +  if (Style->IsLabelPrint() == false)
         5640  +    return true;
         5641  +
         5642  +  wxComboBox *columnCtrl = (wxComboBox *) FindWindow(ID_SYMBOLIZER_TEXT1_LABEL);
         5643  +  int idSel = columnCtrl->GetSelection();
         5644  +  if (idSel == wxNOT_FOUND)
         5645  +    {
         5646  +      if (check == true)
         5647  +        {
         5648  +          wxMessageBox(wxT
         5649  +                       ("You must select some Column !!!"),
         5650  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5651  +          return false;
         5652  +        }
         5653  +    }
         5654  +  column = columnCtrl->GetValue();
         5655  +  wxComboBox *fontCtrl = (wxComboBox *) FindWindow(ID_SYMBOLIZER_FONT1_NAME);
         5656  +  idSel = fontCtrl->GetSelection();
         5657  +  if (idSel == wxNOT_FOUND)
         5658  +    {
         5659  +      if (check == true)
         5660  +        {
         5661  +          wxMessageBox(wxT
         5662  +                       ("You must select some Font !!!"),
         5663  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5664  +          return false;
         5665  +        }
         5666  +    }
         5667  +  font = fontCtrl->GetValue();
         5668  +  wxTextCtrl *sizeCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FONT1_SIZE);
         5669  +  wxString value = sizeCtrl->GetValue();
         5670  +  if (value.ToDouble(&fontSize) != true)
         5671  +    {
         5672  +      if (check == true)
         5673  +        {
         5674  +          wxMessageBox(wxT
         5675  +                       ("FONT-SIZE isn't a valid decimal number !!!"),
         5676  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5677  +          return false;
         5678  +        }
         5679  +    }
         5680  +  if (fontSize <= 0.0)
         5681  +    {
         5682  +      if (check == true)
         5683  +        {
         5684  +          wxMessageBox(wxT
         5685  +                       ("FONT-SIZE should be a positive numberr !!!"),
         5686  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5687  +          return false;
         5688  +        }
         5689  +    }
         5690  +  wxCheckBox *boldCtrl = (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT1_BOLD);
         5691  +  wxCheckBox *italicCtrl =
         5692  +    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT1_ITALIC);
         5693  +  if (boldCtrl->GetValue() == true)
         5694  +    fontWeight = RL2_FONTWEIGHT_BOLD;
         5695  +  else
         5696  +    fontWeight = RL2_FONTWEIGHT_NORMAL;
         5697  +  if (italicCtrl->GetValue() == true)
         5698  +    fontStyle = RL2_FONTSTYLE_ITALIC;
         5699  +  else
         5700  +    fontStyle = RL2_FONTSTYLE_NORMAL;
         5701  +  wxSlider *opacityFontCtrl =
         5702  +    (wxSlider *) FindWindow(ID_SYMBOLIZER_FONT1_OPACITY);
         5703  +  opacity = opacityFontCtrl->GetValue() / 100.0;
         5704  +  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FONT1_COLOR);
         5705  +  wxString color = colorCtrl->GetValue();
         5706  +  if (ColorMapEntry::IsValidColor(color) != true)
         5707  +    {
         5708  +      if (check == true)
         5709  +        {
         5710  +          wxMessageBox(wxT
         5711  +                       ("FONT-COLOR isn't a valid HexRGB color !!!"),
         5712  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5713  +          return false;
         5714  +        }
         5715  +    }
         5716  +  strcpy(fontColor, color.ToUTF8());
         5717  +// Point Placement
         5718  +  wxTextCtrl *rotationCtrl =
         5719  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_ROTATION);
         5720  +  value = rotationCtrl->GetValue();
         5721  +  if (value.ToDouble(&rotation) != true)
         5722  +    {
         5723  +      if (check == true)
         5724  +        {
         5725  +          wxMessageBox(wxT
         5726  +                       ("ROTATION isn't a valid decimal number !!!"),
         5727  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5728  +          return false;
         5729  +        }
         5730  +    }
         5731  +  wxTextCtrl *anchorXCtrl =
         5732  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_ANCHOR_X);
         5733  +  value = anchorXCtrl->GetValue();
         5734  +  if (value.ToDouble(&anchorPointX) != true)
         5735  +    {
         5736  +      if (check == true)
         5737  +        {
         5738  +          wxMessageBox(wxT
         5739  +                       ("ANCHOR-POINT-X isn't a valid decimal number !!!"),
         5740  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5741  +          return false;
         5742  +        }
         5743  +    }
         5744  +  if (anchorPointX < 0.0 || anchorPointX > 1.0)
         5745  +    {
         5746  +      if (check == true)
         5747  +        {
         5748  +          wxMessageBox(wxT
         5749  +                       ("ANCHOR-POINT-X must be between 0.0 and 1.0 !!!"),
         5750  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5751  +          return false;
         5752  +        }
         5753  +    }
         5754  +  wxTextCtrl *anchorYCtrl =
         5755  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_ANCHOR_Y);
         5756  +  value = anchorYCtrl->GetValue();
         5757  +  if (value.ToDouble(&anchorPointY) != true)
         5758  +    {
         5759  +      if (check == true)
         5760  +        {
         5761  +          wxMessageBox(wxT
         5762  +                       ("ANCHOR-POINT-Y isn't a valid decimal number !!!"),
         5763  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5764  +          return false;
         5765  +        }
         5766  +    }
         5767  +  if (anchorPointY < 0.0 || anchorPointY > 1.0)
         5768  +    {
         5769  +      if (check == true)
         5770  +        {
         5771  +          wxMessageBox(wxT
         5772  +                       ("ANCHOR-POINT-Y must be between 0.0 and 1.0 !!!"),
         5773  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5774  +          return false;
         5775  +        }
         5776  +    }
         5777  +  wxTextCtrl *displXCtrl =
         5778  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_DISPLACEMENT_X);
         5779  +  value = displXCtrl->GetValue();
         5780  +  if (value.ToDouble(&displacementX) != true)
         5781  +    {
         5782  +      if (check == true)
         5783  +        {
         5784  +          wxMessageBox(wxT
         5785  +                       ("DISPLACEMENT-X isn't a valid decimal number !!!"),
         5786  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5787  +          return false;
         5788  +        }
         5789  +    }
         5790  +  wxTextCtrl *displYCtrl =
         5791  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_DISPLACEMENT_Y);
         5792  +  value = displYCtrl->GetValue();
         5793  +  if (value.ToDouble(&displacementY) != true)
         5794  +    {
         5795  +      if (check == true)
         5796  +        {
         5797  +          wxMessageBox(wxT
         5798  +                       ("DISPLACEMENT-Y isn't a valid decimal number !!!"),
         5799  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5800  +          return false;
         5801  +        }
         5802  +    }
         5803  +  if (Style->IsHaloEnabled() == true)
         5804  +    {
         5805  +      wxSlider *opacityHaloCtrl =
         5806  +        (wxSlider *) FindWindow(ID_SYMBOLIZER_HALO1_OPACITY);
         5807  +      haloOpacity = opacityHaloCtrl->GetValue() / 100.0;
         5808  +      wxTextCtrl *radiusCtrl =
         5809  +        (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_HALO1_RADIUS);
         5810  +      wxString value = radiusCtrl->GetValue();
         5811  +      if (value.ToDouble(&haloRadius) != true)
         5812  +        {
         5813  +          if (check == true)
         5814  +            {
         5815  +              wxMessageBox(wxT
         5816  +                           ("HALO-RADIUS isn't a valid decimal number !!!"),
         5817  +                           wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5818  +              return false;
         5819  +            }
         5820  +        }
         5821  +      if (haloRadius <= 0.0)
         5822  +        {
         5823  +          if (check == true)
         5824  +            {
         5825  +              wxMessageBox(wxT
         5826  +                           ("HALO-RADIUS should be a positive number !!!"),
         5827  +                           wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5828  +              return false;
         5829  +            }
         5830  +        }
         5831  +      wxTextCtrl *colorHaloCtrl =
         5832  +        (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_HALO1_COLOR);
         5833  +      wxString color = colorHaloCtrl->GetValue();
         5834  +      if (ColorMapEntry::IsValidColor(color) != true)
         5835  +        {
         5836  +          if (check == true)
         5837  +            {
         5838  +              wxMessageBox(wxT
         5839  +                           ("HALO-COLOR isn't a valid HexRGB color !!!"),
         5840  +                           wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         5841  +              return false;
         5842  +            }
         5843  +        }
         5844  +      strcpy(haloColor, color.ToUTF8());
         5845  +    }
         5846  +
         5847  +  Style->SetLabelColumn(column.ToUTF8());
         5848  +  Style->SetFontFacename(font.ToUTF8());
         5849  +  Style->SetFontOpacity(opacity);
         5850  +  Style->SetFontSize(fontSize);
         5851  +  Style->SetFontStyle(fontStyle);
         5852  +  Style->SetFontWeight(fontWeight);
         5853  +  Style->SetFontColor(fontColor);
         5854  +  Style->SetLabelRotation(rotation);
         5855  +  Style->SetLabelAnchorX(anchorPointX);
         5856  +  Style->SetLabelAnchorY(anchorPointY);
         5857  +  Style->SetLabelDisplacementX(displacementX);
         5858  +  Style->SetLabelDisplacementY(displacementY);
         5859  +  if (Style->IsHaloEnabled() == true)
         5860  +    {
         5861  +      Style->SetHaloRadius(haloRadius);
         5862  +      Style->SetHaloOpacity(haloOpacity);
         5863  +      Style->SetHaloColor(haloColor);
         5864  +    }
         5865  +  return true;
         5866  +}
         5867  +
         5868  +void QuickStyleVectorDialog::UpdateTextPointPage()
         5869  +{
         5870  +//
         5871  +// updating the Text Symbolizer page - Point Placement
         5872  +//
         5873  +  wxCheckBox *enableCtrl =
         5874  +    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT1_ENABLE);
         5875  +  enableCtrl->SetValue(Style->IsLabelPrint());
         5876  +  wxComboBox *columnCtrl = (wxComboBox *) FindWindow(ID_SYMBOLIZER_TEXT1_LABEL);
         5877  +  wxString str = wxString::FromUTF8(Style->GetLabelColumn());
         5878  +  int idSel = columnCtrl->FindString(str);
         5879  +  columnCtrl->SetSelection(idSel);
         5880  +  columnCtrl->Enable(Style->IsLabelPrint());
         5881  +  wxComboBox *fontCtrl = (wxComboBox *) FindWindow(ID_SYMBOLIZER_FONT1_NAME);
         5882  +  str = wxString::FromUTF8(Style->GetFontFacename());
         5883  +  idSel = fontCtrl->FindString(str);
         5884  +  fontCtrl->SetSelection(idSel);
         5885  +  fontCtrl->Enable(Style->IsLabelPrint());
         5886  +  wxSlider *opacityFontCtrl =
         5887  +    (wxSlider *) FindWindow(ID_SYMBOLIZER_FONT1_OPACITY);
         5888  +  opacityFontCtrl->SetValue(Style->GetFontOpacity() * 100.0);
         5889  +  opacityFontCtrl->Enable(Style->IsLabelPrint());
         5890  +  wxTextCtrl *colorFontCtrl =
         5891  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FONT1_COLOR);
         5892  +  wxButton *pickFont = (wxButton *) FindWindow(ID_SYMBOLIZER_FONT1_PICKER_BTN);
         5893  +  wxColour color = wxNullColour;
         5894  +  str = wxString::FromUTF8(Style->GetFontColor());
         5895  +  ColorMapEntry::GetWxColor(str, color);
         5896  +  if (color.IsOk() == true)
         5897  +    {
         5898  +      char hex[16];
         5899  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         5900  +      wxString str = wxString::FromUTF8(hex);
         5901  +      colorFontCtrl->SetValue(str);
         5902  +    }
         5903  +  colorFontCtrl->Enable(Style->IsLabelPrint());
         5904  +  pickFont->Enable(Style->IsLabelPrint());
         5905  +  wxTextCtrl *sizeCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FONT1_SIZE);
         5906  +  char dummy[64];
         5907  +  sprintf(dummy, "%1.2f", Style->GetFontSize());
         5908  +  str = wxString::FromUTF8(dummy);
         5909  +  sizeCtrl->SetValue(str);
         5910  +  sizeCtrl->Enable(Style->IsLabelPrint());
         5911  +  wxCheckBox *boldCtrl = (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT1_BOLD);
         5912  +  wxCheckBox *italicCtrl =
         5913  +    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT1_ITALIC);
         5914  +  if (Style->GetFontWeight() == RL2_FONTWEIGHT_BOLD)
         5915  +    boldCtrl->SetValue(true);
         5916  +  else
         5917  +    boldCtrl->SetValue(false);
         5918  +  if (Style->GetFontStyle() == RL2_FONTSTYLE_ITALIC)
         5919  +    italicCtrl->SetValue(true);
         5920  +  else
         5921  +    italicCtrl->SetValue(false);
         5922  +  boldCtrl->Enable(false);
         5923  +  italicCtrl->Enable(false);
         5924  +  if (Style->GetFontFacename() != NULL)
         5925  +    {
         5926  +      if (strncmp(Style->GetFontFacename(), "ToyFont: ", 9) == 0)
         5927  +        {
         5928  +          boldCtrl->Enable(Style->IsLabelPrint());
         5929  +          italicCtrl->Enable(Style->IsLabelPrint());
         5930  +      } else
         5931  +        {
         5932  +          bool bold = false;
         5933  +          bool italic = false;
         5934  +          MainFrame->CheckTTFont(Style->GetFontFacename(), &bold, &italic);
         5935  +          boldCtrl->SetValue(bold);
         5936  +          italicCtrl->SetValue(italic);
         5937  +          boldCtrl->Enable(false);
         5938  +          italicCtrl->Enable(false);
         5939  +        }
         5940  +    }
         5941  +// Point Placement
         5942  +  wxTextCtrl *rotationCtrl =
         5943  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_ROTATION);
         5944  +  sprintf(dummy, "%1.2f", Style->GetLabelRotation());
         5945  +  str = wxString::FromUTF8(dummy);
         5946  +  rotationCtrl->SetValue(str);
         5947  +  rotationCtrl->Enable(Style->IsLabelPrint());
         5948  +  wxTextCtrl *anchorXCtrl =
         5949  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_ANCHOR_X);
         5950  +  sprintf(dummy, "%1.2f", Style->GetLabelAnchorX());
         5951  +  str = wxString::FromUTF8(dummy);
         5952  +  anchorXCtrl->SetValue(str);
         5953  +  anchorXCtrl->Enable(Style->IsLabelPrint());
         5954  +  wxTextCtrl *anchorYCtrl =
         5955  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_ANCHOR_Y);
         5956  +  sprintf(dummy, "%1.2f", Style->GetLabelAnchorY());
         5957  +  str = wxString::FromUTF8(dummy);
         5958  +  anchorYCtrl->SetValue(str);
         5959  +  anchorYCtrl->Enable(Style->IsLabelPrint());
         5960  +  wxTextCtrl *displXCtrl =
         5961  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_DISPLACEMENT_X);
         5962  +  sprintf(dummy, "%1.2f", Style->GetLabelDisplacementX());
         5963  +  str = wxString::FromUTF8(dummy);
         5964  +  displXCtrl->SetValue(str);
         5965  +  displXCtrl->Enable(Style->IsLabelPrint());
         5966  +  wxTextCtrl *displYCtrl =
         5967  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_DISPLACEMENT_Y);
         5968  +  sprintf(dummy, "%1.2f", Style->GetLabelDisplacementY());
         5969  +  str = wxString::FromUTF8(dummy);
         5970  +  displYCtrl->SetValue(str);
         5971  +  displYCtrl->Enable(Style->IsLabelPrint());
         5972  +  wxCheckBox *enableHaloBox =
         5973  +    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_HALO1_ENABLE);
         5974  +  if (Style->IsHaloEnabled() == true)
         5975  +    enableHaloBox->SetValue(true);
         5976  +  else
         5977  +    enableHaloBox->SetValue(false);
         5978  +  enableHaloBox->Enable(Style->IsLabelPrint());
         5979  +  bool enable = false;
         5980  +  if (Style->IsLabelPrint() == true)
         5981  +    enable = Style->IsHaloEnabled();
         5982  +  wxTextCtrl *radiusCtrl =
         5983  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_HALO1_RADIUS);
         5984  +  radiusCtrl->Enable(enable);
         5985  +  wxTextCtrl *colorHaloCtrl =
         5986  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_HALO1_COLOR);
         5987  +  colorHaloCtrl->Enable(enable);
         5988  +  wxButton *pickHalo = (wxButton *) FindWindow(ID_SYMBOLIZER_HALO1_PICKER_BTN);
         5989  +  pickHalo->Enable(enable);
         5990  +  wxSlider *opacityHaloCtrl =
         5991  +    (wxSlider *) FindWindow(ID_SYMBOLIZER_HALO1_OPACITY);
         5992  +  opacityHaloCtrl->Enable(enable);
         5993  +  opacityHaloCtrl->SetValue(Style->GetHaloOpacity() * 100.0);
         5994  +  sprintf(dummy, "%1.2f", Style->GetHaloRadius());
         5995  +  str = wxString::FromUTF8(dummy);
         5996  +  radiusCtrl->SetValue(str);
         5997  +  color = wxNullColour;
         5998  +  str = wxString::FromUTF8(Style->GetHaloColor());
         5999  +  ColorMapEntry::GetWxColor(str, color);
         6000  +  if (color.IsOk() == true)
         6001  +    {
         6002  +      char hex[16];
         6003  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         6004  +      wxString str = wxString::FromUTF8(hex);
         6005  +      colorHaloCtrl->SetValue(str);
         6006  +    }
         6007  +  if (Style->IsHaloEnabled() == false)
         6008  +    {
         6009  +      opacityHaloCtrl->Enable(false);
         6010  +      pickHalo->Enable(false);
         6011  +      colorHaloCtrl->Enable(false);
         6012  +      radiusCtrl->Enable(false);
         6013  +  } else
         6014  +    {
         6015  +      opacityHaloCtrl->Enable(true);
         6016  +      pickHalo->Enable(true);
         6017  +      colorHaloCtrl->Enable(true);
         6018  +      radiusCtrl->Enable(true);
         6019  +    }
         6020  +}
         6021  +
         6022  +bool QuickStyleVectorDialog::RetrieveTextLinePage(bool check)
         6023  +{
         6024  +//
         6025  +// retrieving params from the Text Symbolizer page - Line Placement
         6026  +//
         6027  +  wxString column;
         6028  +  wxString font;
         6029  +  double fontSize;
         6030  +  int fontStyle;
         6031  +  int fontWeight;
         6032  +  double opacity;
         6033  +  char fontColor[8];
         6034  +  double haloRadius;
         6035  +  double haloOpacity;
         6036  +  char haloColor[8];
         6037  +  double perpendicularOffset;
         6038  +  double initialGap;
         6039  +  double gap;
         6040  +
         6041  +  if (Style->IsLabelPrint() == false)
         6042  +    return true;
         6043  +
         6044  +  wxComboBox *columnCtrl = (wxComboBox *) FindWindow(ID_SYMBOLIZER_TEXT2_LABEL);
         6045  +  int idSel = columnCtrl->GetSelection();
         6046  +  if (idSel == wxNOT_FOUND)
         6047  +    {
         6048  +      if (check == true)
         6049  +        {
         6050  +          wxMessageBox(wxT
         6051  +                       ("You must select some Column !!!"),
         6052  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         6053  +          return false;
         6054  +        }
         6055  +    }
         6056  +  column = columnCtrl->GetValue();
         6057  +  wxComboBox *fontCtrl = (wxComboBox *) FindWindow(ID_SYMBOLIZER_FONT2_NAME);
         6058  +  idSel = fontCtrl->GetSelection();
         6059  +  if (idSel == wxNOT_FOUND)
         6060  +    {
         6061  +      if (check == true)
         6062  +        {
         6063  +          wxMessageBox(wxT
         6064  +                       ("You must select some Font !!!"),
         6065  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         6066  +          return false;
         6067  +        }
         6068  +    }
         6069  +  font = fontCtrl->GetValue();
         6070  +  wxTextCtrl *sizeCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FONT2_SIZE);
         6071  +  wxString value = sizeCtrl->GetValue();
         6072  +  if (value.ToDouble(&fontSize) != true)
         6073  +    {
         6074  +      if (check == true)
         6075  +        {
         6076  +          wxMessageBox(wxT
         6077  +                       ("FONT-SIZE isn't a valid decimal number !!!"),
         6078  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         6079  +          return false;
         6080  +        }
         6081  +    }
         6082  +  if (fontSize <= 0.0)
         6083  +    {
         6084  +      if (check == true)
         6085  +        {
         6086  +          wxMessageBox(wxT
         6087  +                       ("FONT-SIZE should be a positive numberr !!!"),
         6088  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         6089  +          return false;
         6090  +        }
         6091  +    }
         6092  +  wxCheckBox *boldCtrl = (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT2_BOLD);
         6093  +  wxCheckBox *italicCtrl =
         6094  +    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT2_ITALIC);
         6095  +  if (boldCtrl->GetValue() == true)
         6096  +    fontWeight = RL2_FONTWEIGHT_BOLD;
         6097  +  else
         6098  +    fontWeight = RL2_FONTWEIGHT_NORMAL;
         6099  +  if (italicCtrl->GetValue() == true)
         6100  +    fontStyle = RL2_FONTSTYLE_ITALIC;
         6101  +  else
         6102  +    fontStyle = RL2_FONTSTYLE_NORMAL;
         6103  +  wxSlider *opacityFontCtrl =
         6104  +    (wxSlider *) FindWindow(ID_SYMBOLIZER_FONT2_OPACITY);
         6105  +  opacity = opacityFontCtrl->GetValue() / 100.0;
         6106  +  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FONT2_COLOR);
         6107  +  wxString color = colorCtrl->GetValue();
         6108  +  if (ColorMapEntry::IsValidColor(color) != true)
         6109  +    {
         6110  +      if (check == true)
         6111  +        {
         6112  +          wxMessageBox(wxT
         6113  +                       ("FONT-COLOR isn't a valid HexRGB color !!!"),
         6114  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         6115  +          return false;
         6116  +        }
         6117  +    }
         6118  +  strcpy(fontColor, color.ToUTF8());
         6119  +// Line Placement
         6120  +  wxTextCtrl *perpCtrl =
         6121  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_PERPENDICULAR);
         6122  +  value = perpCtrl->GetValue();
         6123  +  if (value.ToDouble(&perpendicularOffset) != true)
         6124  +    {
         6125  +      if (check == true)
         6126  +        {
         6127  +          wxMessageBox(wxT
         6128  +                       ("PERPENDICULAR-OFFSET isn't a valid decimal number !!!"),
         6129  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         6130  +          return false;
         6131  +        }
         6132  +    }
         6133  +  wxTextCtrl *inigapCtrl =
         6134  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_INITIAL_GAP);
         6135  +  value = inigapCtrl->GetValue();
         6136  +  if (value.ToDouble(&initialGap) != true)
         6137  +    {
         6138  +      if (check == true)
         6139  +        {
         6140  +          wxMessageBox(wxT
         6141  +                       ("INITIAL-GAP isn't a valid decimal number !!!"),
         6142  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         6143  +          return false;
         6144  +        }
         6145  +    }
         6146  +  if (initialGap < 0.0)
         6147  +    {
         6148  +      if (check == true)
         6149  +        {
         6150  +          wxMessageBox(wxT
         6151  +                       ("INITIAL-GAP should be a positive number !!!"),
         6152  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         6153  +          return false;
         6154  +        }
         6155  +    }
         6156  +  wxTextCtrl *gapCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_GAP);
         6157  +  value = gapCtrl->GetValue();
         6158  +  if (value.ToDouble(&gap) != true)
         6159  +    {
         6160  +      if (check == true)
         6161  +        {
         6162  +          wxMessageBox(wxT
         6163  +                       ("GAP isn't a valid decimal number !!!"),
         6164  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         6165  +          return false;
         6166  +        }
         6167  +    }
         6168  +  if (gap < 0.0)
         6169  +    {
         6170  +      if (check == true)
         6171  +        {
         6172  +          wxMessageBox(wxT
         6173  +                       ("GAP should be a positive number !!!"),
         6174  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         6175  +          return false;
         6176  +        }
         6177  +    }
         6178  +  if (Style->IsHaloEnabled() == true)
         6179  +    {
         6180  +      wxSlider *opacityHaloCtrl =
         6181  +        (wxSlider *) FindWindow(ID_SYMBOLIZER_HALO2_OPACITY);
         6182  +      haloOpacity = opacityHaloCtrl->GetValue() / 100.0;
         6183  +      wxTextCtrl *radiusCtrl =
         6184  +        (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_HALO2_RADIUS);
         6185  +      wxString value = radiusCtrl->GetValue();
         6186  +      if (value.ToDouble(&haloRadius) != true)
         6187  +        {
         6188  +          if (check == true)
         6189  +            {
         6190  +              wxMessageBox(wxT
         6191  +                           ("HALO-RADIUS isn't a valid decimal number !!!"),
         6192  +                           wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         6193  +              return false;
         6194  +            }
         6195  +        }
         6196  +      if (haloRadius <= 0.0)
         6197  +        {
         6198  +          if (check == true)
         6199  +            {
         6200  +              wxMessageBox(wxT
         6201  +                           ("HALO-RADIUS should be a positive number !!!"),
         6202  +                           wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         6203  +              return false;
         6204  +            }
         6205  +        }
         6206  +      wxTextCtrl *colorHaloCtrl =
         6207  +        (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_HALO2_COLOR);
         6208  +      wxString color = colorHaloCtrl->GetValue();
         6209  +      if (ColorMapEntry::IsValidColor(color) != true)
         6210  +        {
         6211  +          if (check == true)
         6212  +            {
         6213  +              wxMessageBox(wxT
         6214  +                           ("HALO-COLOR isn't a valid HexRGB color !!!"),
         6215  +                           wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         6216  +              return false;
         6217  +            }
         6218  +        }
         6219  +      strcpy(haloColor, color.ToUTF8());
         6220  +    }
         6221  +  Style->SetLabelColumn(column.ToUTF8());
         6222  +  Style->SetFontFacename(font.ToUTF8());
         6223  +  Style->SetFontOpacity(opacity);
         6224  +  Style->SetFontSize(fontSize);
         6225  +  Style->SetFontStyle(fontStyle);
         6226  +  Style->SetFontWeight(fontWeight);
         6227  +  Style->SetFontColor(fontColor);
         6228  +  Style->SetLabelPerpendicularOffset(perpendicularOffset);
         6229  +  Style->SetLabelInitialGap(initialGap);
         6230  +  Style->SetLabelGap(gap);
         6231  +  if (Style->IsHaloEnabled() == true)
         6232  +    {
         6233  +      Style->SetHaloRadius(haloRadius);
         6234  +      Style->SetHaloOpacity(haloOpacity);
         6235  +      Style->SetHaloColor(haloColor);
         6236  +    }
         6237  +  return true;
         6238  +}
         6239  +
         6240  +void QuickStyleVectorDialog::UpdateTextLinePage()
         6241  +{
         6242  +//
         6243  +// updating the Text Symbolizer page - Line Placement
         6244  +//
         6245  +  wxCheckBox *enableCtrl =
         6246  +    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT2_ENABLE);
         6247  +  enableCtrl->SetValue(Style->IsLabelPrint());
         6248  +  wxComboBox *columnCtrl = (wxComboBox *) FindWindow(ID_SYMBOLIZER_TEXT2_LABEL);
         6249  +  wxString str = wxString::FromUTF8(Style->GetLabelColumn());
         6250  +  int idSel = columnCtrl->FindString(str);
         6251  +  columnCtrl->SetSelection(idSel);
         6252  +  columnCtrl->Enable(Style->IsLabelPrint());
         6253  +  wxComboBox *fontCtrl = (wxComboBox *) FindWindow(ID_SYMBOLIZER_FONT2_NAME);
         6254  +  str = wxString::FromUTF8(Style->GetFontFacename());
         6255  +  idSel = fontCtrl->FindString(str);
         6256  +  fontCtrl->SetSelection(idSel);
         6257  +  fontCtrl->Enable(Style->IsLabelPrint());
         6258  +  wxSlider *opacityFontCtrl =
         6259  +    (wxSlider *) FindWindow(ID_SYMBOLIZER_FONT2_OPACITY);
         6260  +  opacityFontCtrl->SetValue(Style->GetFontOpacity() * 100.0);
         6261  +  opacityFontCtrl->Enable(Style->IsLabelPrint());
         6262  +  wxTextCtrl *colorFontCtrl =
         6263  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FONT2_COLOR);
         6264  +  wxButton *pickFont = (wxButton *) FindWindow(ID_SYMBOLIZER_FONT2_PICKER_BTN);
         6265  +  wxColour color = wxNullColour;
         6266  +  str = wxString::FromUTF8(Style->GetFontColor());
         6267  +  ColorMapEntry::GetWxColor(str, color);
         6268  +  if (color.IsOk() == true)
         6269  +    {
         6270  +      char hex[16];
         6271  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         6272  +      wxString str = wxString::FromUTF8(hex);
         6273  +      colorFontCtrl->SetValue(str);
         6274  +    }
         6275  +  colorFontCtrl->Enable(Style->IsLabelPrint());
         6276  +  pickFont->Enable(Style->IsLabelPrint());
         6277  +  wxTextCtrl *sizeCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FONT2_SIZE);
         6278  +  char dummy[64];
         6279  +  sprintf(dummy, "%1.2f", Style->GetFontSize());
         6280  +  str = wxString::FromUTF8(dummy);
         6281  +  sizeCtrl->SetValue(str);
         6282  +  sizeCtrl->Enable(Style->IsLabelPrint());
         6283  +  wxCheckBox *boldCtrl = (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT2_BOLD);
         6284  +  wxCheckBox *italicCtrl =
         6285  +    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT2_ITALIC);
         6286  +  if (Style->GetFontWeight() == RL2_FONTWEIGHT_BOLD)
         6287  +    boldCtrl->SetValue(true);
         6288  +  else
         6289  +    boldCtrl->SetValue(false);
         6290  +  if (Style->GetFontStyle() == RL2_FONTSTYLE_ITALIC)
         6291  +    italicCtrl->SetValue(true);
         6292  +  else
         6293  +    italicCtrl->SetValue(false);
         6294  +  italicCtrl->Enable(Style->IsLabelPrint());
         6295  +  boldCtrl->Enable(false);
         6296  +  italicCtrl->Enable(false);
         6297  +  if (Style->GetFontFacename() != NULL)
         6298  +    {
         6299  +      if (strncmp(Style->GetFontFacename(), "ToyFont: ", 9) == 0)
         6300  +        {
         6301  +          boldCtrl->Enable(Style->IsLabelPrint());
         6302  +          italicCtrl->Enable(Style->IsLabelPrint());
         6303  +      } else
         6304  +        {
         6305  +          bool bold = false;
         6306  +          bool italic = false;
         6307  +          MainFrame->CheckTTFont(Style->GetFontFacename(), &bold, &italic);
         6308  +          boldCtrl->SetValue(bold);
         6309  +          italicCtrl->SetValue(italic);
         6310  +          boldCtrl->Enable(false);
         6311  +          italicCtrl->Enable(false);
         6312  +        }
         6313  +    }
         6314  +// Line Placement
         6315  +  wxTextCtrl *perpCtrl =
         6316  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_PERPENDICULAR);
         6317  +  sprintf(dummy, "%1.2f", Style->GetLabelPerpendicularOffset());
         6318  +  str = wxString::FromUTF8(dummy);
         6319  +  perpCtrl->SetValue(str);
         6320  +  perpCtrl->Enable(Style->IsLabelPrint());
         6321  +  wxCheckBox *repeatBox =
         6322  +    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT_IS_REPEATED);
         6323  +  repeatBox->SetValue(Style->IsRepeatedLabel());
         6324  +  repeatBox->Enable(Style->IsLabelPrint());
         6325  +  wxTextCtrl *inigapCtrl =
         6326  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_INITIAL_GAP);
         6327  +  sprintf(dummy, "%1.2f", Style->GetLabelInitialGap());
         6328  +  str = wxString::FromUTF8(dummy);
         6329  +  inigapCtrl->SetValue(str);
         6330  +  wxTextCtrl *gapCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_GAP);
         6331  +  sprintf(dummy, "%1.2f", Style->GetLabelGap());
         6332  +  str = wxString::FromUTF8(dummy);
         6333  +  gapCtrl->SetValue(str);
         6334  +  if (Style->IsLabelPrint() && Style->IsRepeatedLabel())
         6335  +    {
         6336  +      inigapCtrl->Enable(true);
         6337  +      gapCtrl->Enable(true);
         6338  +  } else
         6339  +    {
         6340  +      inigapCtrl->Enable(false);
         6341  +      gapCtrl->Enable(false);
         6342  +    }
         6343  +  wxCheckBox *alignBox =
         6344  +    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT_IS_ALIGNED);
         6345  +  alignBox->SetValue(Style->IsLabelAligned());
         6346  +  alignBox->Enable(Style->IsLabelPrint());
         6347  +  wxCheckBox *generalizeBox =
         6348  +    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT_GENERALIZE);
         6349  +  generalizeBox->SetValue(Style->IsLabelGeneralizeLine());
         6350  +  generalizeBox->Enable(Style->IsLabelPrint());
         6351  +  wxCheckBox *enableHaloBox =
         6352  +    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_HALO2_ENABLE);
         6353  +  if (Style->IsHaloEnabled() == true)
         6354  +    enableHaloBox->SetValue(true);
         6355  +  else
         6356  +    enableHaloBox->SetValue(false);
         6357  +  enableHaloBox->Enable(Style->IsLabelPrint());
         6358  +  bool enable = false;
         6359  +  if (Style->IsLabelPrint() == true)
         6360  +    enable = Style->IsHaloEnabled();
         6361  +  wxTextCtrl *radiusCtrl =
         6362  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_HALO2_RADIUS);
         6363  +  radiusCtrl->Enable(enable);
         6364  +  wxTextCtrl *colorHaloCtrl =
         6365  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_HALO2_COLOR);
         6366  +  colorHaloCtrl->Enable(enable);
         6367  +  wxButton *pickHalo = (wxButton *) FindWindow(ID_SYMBOLIZER_HALO2_PICKER_BTN);
         6368  +  pickHalo->Enable(enable);
         6369  +  wxSlider *opacityHaloCtrl =
         6370  +    (wxSlider *) FindWindow(ID_SYMBOLIZER_HALO2_OPACITY);
         6371  +  opacityHaloCtrl->Enable(enable);
         6372  +  opacityHaloCtrl->SetValue(Style->GetHaloOpacity() * 100.0);
         6373  +  sprintf(dummy, "%1.2f", Style->GetHaloRadius());
         6374  +  str = wxString::FromUTF8(dummy);
         6375  +  radiusCtrl->SetValue(str);
         6376  +  color = wxNullColour;
         6377  +  str = wxString::FromUTF8(Style->GetHaloColor());
         6378  +  ColorMapEntry::GetWxColor(str, color);
         6379  +  if (color.IsOk() == true)
         6380  +    {
         6381  +      char hex[16];
         6382  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         6383  +      wxString str = wxString::FromUTF8(hex);
         6384  +      colorHaloCtrl->SetValue(str);
         6385  +    }
         6386  +  if (Style->IsHaloEnabled() == false)
         6387  +    {
         6388  +      opacityHaloCtrl->Enable(false);
         6389  +      pickHalo->Enable(false);
         6390  +      colorHaloCtrl->Enable(false);
         6391  +      radiusCtrl->Enable(false);
         6392  +  } else
         6393  +    {
         6394  +      opacityHaloCtrl->Enable(true);
         6395  +      pickHalo->Enable(true);
         6396  +      colorHaloCtrl->Enable(true);
         6397  +      radiusCtrl->Enable(true);
         6398  +    }
         6399  +}
         6400  +
         6401  +void QuickStyleVectorDialog::OnPageChanging(wxNotebookEvent & event)
         6402  +{
         6403  +//
         6404  +// TAB/PAGE selection changing
         6405  +//
         6406  +  bool ret = false;
         6407  +  int idx = event.GetOldSelection();
         6408  +  if (idx == 0)
         6409  +    ret = RetrieveMainPage();
         6410  +  else
         6411  +    {
         6412  +      if (idx == PagePointIndex)
         6413  +        ret = RetrievePointPage();
         6414  +      if (idx == PageLineIndex)
         6415  +        ret = RetrieveLinePage();
         6416  +      if (idx == PagePolygonIndex)
         6417  +        ret = RetrievePolygonPage();
         6418  +      if (idx == PageTextPointIndex)
         6419  +        ret = RetrieveTextPointPage();
         6420  +      if (idx == PageTextLineIndex)
         6421  +        ret = RetrieveTextLinePage();
         6422  +    }
         6423  +  if (ret != true)
         6424  +    event.Veto();
         6425  +}
         6426  +
         6427  +void QuickStyleVectorDialog::OnPageChanged(wxNotebookEvent & event)
         6428  +{
         6429  +//
         6430  +// TAB/PAGE selection changed
         6431  +//
         6432  +  int idx = event.GetSelection();
         6433  +  if (idx == 0)
         6434  +    UpdateMainPage();
         6435  +  else
         6436  +    {
         6437  +      if (idx == PagePointIndex)
         6438  +        UpdatePointPage();
         6439  +      if (idx == PageLineIndex)
         6440  +        UpdateLinePage();
         6441  +      if (idx == PagePolygonIndex)
         6442  +        UpdatePolygonPage();
         6443  +      if (idx == PageTextPointIndex)
         6444  +        UpdateTextPointPage();
         6445  +      if (idx == PageTextLineIndex)
         6446  +        UpdateTextLinePage();
         6447  +    }
         6448  +}
         6449  +
         6450  +bool QuickStyleVectorDialog::UpdateStyle()
         6451  +{
         6452  +//
         6453  +// updating the QuickStyle
         6454  +//
         6455  +  bool ret = false;
         6456  +  int idx = GetBookCtrl()->GetSelection();
         6457  +  if (idx == 0)
         6458  +    ret = RetrieveMainPage();
         6459  +  else
         6460  +    {
         6461  +      if (idx == PagePointIndex)
         6462  +        ret = RetrievePointPage();
         6463  +      if (idx == PageLineIndex)
         6464  +        ret = RetrieveLinePage();
         6465  +      if (idx == PagePolygonIndex)
         6466  +        ret = RetrievePolygonPage();
         6467  +      if (idx == PageTextPointIndex)
         6468  +        ret = RetrieveTextPointPage();
         6469  +      if (idx == PageTextLineIndex)
         6470  +        ret = RetrieveTextLinePage();
         6471  +    }
         6472  +  if (ret == false)
         6473  +    return false;
         6474  +
         6475  +  VectorLayerConfig *config = Layer->GetVectorConfig();
         6476  +  bool setCurrentStyle = false;
         6477  +  if (config->GetStyle() == NULL)
         6478  +    setCurrentStyle = true;
         6479  +  else
         6480  +    {
         6481  +      if (strcmp(Style->GetUUID(), config->GetStyle()) != 0)
         6482  +        setCurrentStyle = true;
         6483  +    }
         6484  +  if (setCurrentStyle == true)
         6485  +    {
         6486  +      config->SetStyle(Style->GetUUID());
         6487  +      IsConfigChanged = true;
         6488  +    }
         6489  +  IsConfigChanged = Layer->UpdateQuickStyle(Style);
         6490  +  return true;
         6491  +}
         6492  +
         6493  +void QuickStyleVectorDialog::OnOk(wxCommandEvent & WXUNUSED(event))
         6494  +{
         6495  +//
         6496  +// permanently saving the QuickStyle and quitting
         6497  +//
         6498  +  if (UpdateStyle() == true)
         6499  +    wxDialog::EndModal(wxID_OK);
         6500  +}
         6501  +
         6502  +void QuickStyleVectorDialog::OnApply(wxCommandEvent & WXUNUSED(event))
         6503  +{
         6504  +//
         6505  +// applying the QuickStyle and continuing
         6506  +//
         6507  +  if (UpdateStyle() == true)
         6508  +    {
         6509  +      if (IsConfigChanged == true)
         6510  +        MapPanel->RefreshMap();
         6511  +    }
         6512  +}
         6513  +
         6514  +void QuickStyleVectorDialog::OnExport(wxCommandEvent & WXUNUSED(event))
         6515  +{
         6516  +//
         6517  +// exporting the Quick Style as an external file
         6518  +//
         6519  +  bool xret = false;
         6520  +  int ret;
         6521  +  wxString path;
         6522  +  wxString lastDir;
         6523  +  int idx = GetBookCtrl()->GetSelection();
         6524  +  if (idx == 0)
         6525  +    xret = RetrieveMainPage();
         6526  +  else
         6527  +    {
         6528  +      if (idx == PagePointIndex)
         6529  +        xret = RetrievePointPage();
         6530  +      if (idx == PageLineIndex)
         6531  +        xret = RetrieveLinePage();
         6532  +      if (idx == PagePolygonIndex)
         6533  +        xret = RetrievePolygonPage();
         6534  +      if (idx == PageTextPointIndex)
         6535  +        xret = RetrieveTextPointPage();
         6536  +      if (idx == PageTextLineIndex)
         6537  +        xret = RetrieveTextLinePage();
         6538  +    }
         6539  +  if (xret == false)
         6540  +    return;
         6541  +
         6542  +  wxFileDialog fileDialog(this,
         6543  +                          wxT("Exporting an SLD/SE QuickStyle to a file"),
         6544  +                          wxT(""), wxT("style.xml"),
         6545  +                          wxT("XML Document|*.xml|All files (*.*)|*.*"),
         6546  +                          wxFD_SAVE | wxFD_OVERWRITE_PROMPT, wxDefaultPosition,
         6547  +                          wxDefaultSize, wxT("filedlg"));
         6548  +  lastDir = MainFrame->GetLastDirectory();
         6549  +  if (lastDir.Len() >= 1)
         6550  +    fileDialog.SetDirectory(lastDir);
         6551  +  ret = fileDialog.ShowModal();
         6552  +  if (ret == wxID_OK)
         6553  +    {
         6554  +      wxFileName file(fileDialog.GetPath());
         6555  +      path = file.GetPath();
         6556  +      path += file.GetPathSeparator();
         6557  +      path += file.GetName();
         6558  +      lastDir = file.GetPath();
         6559  +      path = fileDialog.GetPath();
         6560  +      FILE *out = fopen(path.ToUTF8(), "wb");
         6561  +      if (out == NULL)
         6562  +        wxMessageBox(wxT("ERROR: unable to create:\n\n\"") + path + wxT("\""),
         6563  +                     wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
         6564  +      else
         6565  +        {
         6566  +          char *xml = Style->CreateXmlStyle();
         6567  +          fwrite(xml, 1, strlen(xml), out);
         6568  +          sqlite3_free(xml);
         6569  +          fclose(out);
         6570  +          wxMessageBox(wxT
         6571  +                       ("SLD/SE QuickStyle successfully saved into:\n\n\"")
         6572  +                       + path + wxT("\""), wxT("spatialite_gui"),
         6573  +                       wxOK | wxICON_INFORMATION, this);
         6574  +        }
         6575  +    }
         6576  +}
         6577  +
         6578  +void QuickStyleVectorDialog::OnCopy(wxCommandEvent & WXUNUSED(event))
         6579  +{
         6580  +//
         6581  +// Copying the Quick Style into the Clipboard 
         6582  +//
         6583  +  bool ret = false;
         6584  +  int idx = GetBookCtrl()->GetSelection();
         6585  +  if (idx == 0)
         6586  +    ret = RetrieveMainPage();
         6587  +  else
         6588  +    {
         6589  +      if (idx == PagePointIndex)
         6590  +        ret = RetrievePointPage();
         6591  +      if (idx == PageLineIndex)
         6592  +        ret = RetrieveLinePage();
         6593  +      if (idx == PagePolygonIndex)
         6594  +        ret = RetrievePolygonPage();
         6595  +      if (idx == PageTextPointIndex)
         6596  +        ret = RetrieveTextPointPage();
         6597  +      if (idx == PageTextLineIndex)
         6598  +        ret = RetrieveTextLinePage();
         6599  +    }
         6600  +  if (ret == false)
         6601  +    return;
         6602  +
         6603  +  char *xml = Style->CreateXmlStyle();
         6604  +  wxString XMLstring = wxString::FromUTF8(xml);
         6605  +  sqlite3_free(xml);
         6606  +  if (wxTheClipboard->Open())
         6607  +    {
         6608  +      wxTheClipboard->SetData(new wxTextDataObject(XMLstring));
         6609  +      wxTheClipboard->Close();
         6610  +    }
         6611  +}
         6612  +
         6613  +void QuickStyleVectorDialog::OnQuit(wxCommandEvent & WXUNUSED(event))
         6614  +{
         6615  +//
         6616  +// all done: 
         6617  +//
         6618  +  wxDialog::EndModal(wxID_CANCEL);
         6619  +}
         6620  +
         6621  +bool QuickStyleTopologyDialog::Create(MyMapPanel * parent, MapLayer * layer)
         6622  +{
         6623  +//
         6624  +// creating the dialog
         6625  +//
         6626  +  MainFrame = parent->GetParent();
         6627  +  MapPanel = parent;
         6628  +  Layer = layer;
         6629  +  Type = Layer->GetType();
         6630  +  DbPrefix = layer->GetDbPrefix();
         6631  +  LayerName = layer->GetName();
         6632  +  IsConfigChanged = false;
         6633  +
         6634  +  wxString title = wxT("QuickStyle (Topology) Edit");
         6635  +  if (Type == MAP_LAYER_NETWORK)
         6636  +    title = wxT("QuickStyle (Network) Edit");
         6637  +  if (wxPropertySheetDialog::Create(parent, wxID_ANY, title) == false)
         6638  +    return false;
         6639  +  if (Layer->GetQuickStyleTopology() != NULL)
         6640  +    Style = Layer->CloneQuickStyleTopology();
         6641  +  else
         6642  +    Style = new QuickStyleTopologyObj(Type);
         6643  +
         6644  +  wxBookCtrlBase *book = GetBookCtrl();
         6645  +// creates individual panels
         6646  +  wxPanel *mainPage = CreateMainPage(book);
         6647  +  book->AddPage(mainPage, wxT("General"), true);
         6648  +  if (Type == MAP_LAYER_NETWORK)
         6649  +    {
         6650  +      wxPanel *nodePage = CreateNodePage(book);
         6651  +      book->AddPage(nodePage, wxT("Nodes"), false);
         6652  +      wxPanel *edgeLinkPage = CreateEdgeLinkPage(book);
         6653  +      book->AddPage(edgeLinkPage, wxT("Links"), false);
         6654  +      wxPanel *edgeLinkSeedPage = CreateEdgeLinkSeedPage(book);
         6655  +      book->AddPage(edgeLinkSeedPage, wxT("Link Seeds"), false);
         6656  +  } else
         6657  +    {
         6658  +      wxPanel *nodePage = CreateNodePage(book);
         6659  +      book->AddPage(nodePage, wxT("Nodes"), false);
         6660  +      wxPanel *edgeLinkPage = CreateEdgeLinkPage(book);
         6661  +      book->AddPage(edgeLinkPage, wxT("Edges"), false);
         6662  +      wxPanel *facePage = CreateFacePage(book);
         6663  +      book->AddPage(facePage, wxT("Faces"), false);
         6664  +      wxPanel *edgeLinkSeedPage = CreateEdgeLinkSeedPage(book);
         6665  +      book->AddPage(edgeLinkSeedPage, wxT("Edge Seeds"), false);
         6666  +      wxPanel *faceSeedPage = CreateFaceSeedPage(book);
         6667  +      book->AddPage(faceSeedPage, wxT("Face Seeds"), false);
         6668  +    }
         6669  +
         6670  +  CreateButtons();
         6671  +  LayoutDialog();
         6672  +// appends event handler for TAB/PAGE changing
         6673  +  Connect(wxID_ANY, wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING,
         6674  +          (wxObjectEventFunction) & QuickStyleTopologyDialog::OnPageChanging);
         6675  +  Connect(wxID_ANY, wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,
         6676  +          (wxObjectEventFunction) & QuickStyleTopologyDialog::OnPageChanged);
         6677  +// appends event handler for buttons
         6678  +  Connect(wxID_CANCEL, wxEVT_COMMAND_BUTTON_CLICKED,
         6679  +          (wxObjectEventFunction) & QuickStyleTopologyDialog::OnQuit);
         6680  +  Connect(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED,
         6681  +          (wxObjectEventFunction) & QuickStyleTopologyDialog::OnOk);
         6682  +  Connect(ID_QUICK_STYLE_APPLY, wxEVT_COMMAND_BUTTON_CLICKED,
         6683  +          (wxObjectEventFunction) & QuickStyleTopologyDialog::OnApply);
         6684  +  Connect(ID_QUICK_STYLE_EXPORT, wxEVT_COMMAND_BUTTON_CLICKED,
         6685  +          (wxObjectEventFunction) & QuickStyleTopologyDialog::OnExport);
         6686  +  Connect(ID_QUICK_STYLE_COPY, wxEVT_COMMAND_BUTTON_CLICKED,
         6687  +          (wxObjectEventFunction) & QuickStyleTopologyDialog::OnCopy);
         6688  +// centers the dialog window
         6689  +  Centre();
         6690  +  UpdateMainPage();
         6691  +  return true;
         6692  +}
         6693  +
         6694  +void QuickStyleTopologyDialog::CreateButtons()
         6695  +{
         6696  +// 
         6697  +// adding the common Buttons
         6698  +//
         6699  +  wxBoxSizer *topSizer = (wxBoxSizer *) (this->GetSizer());
         6700  +  wxBoxSizer *btnBox = new wxBoxSizer(wxHORIZONTAL);
         6701  +  topSizer->Add(btnBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         6702  +  wxButton *save = new wxButton(this, ID_QUICK_STYLE_APPLY, wxT("&Apply"));
         6703  +  btnBox->Add(save, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6704  +  wxButton *exp =
         6705  +    new wxButton(this, ID_QUICK_STYLE_EXPORT, wxT("&Export to file"));
         6706  +  btnBox->Add(exp, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6707  +  wxButton *copy = new wxButton(this, ID_QUICK_STYLE_COPY, wxT("&Copy"));
         6708  +  btnBox->Add(copy, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6709  +  btnBox->AddSpacer(100);
         6710  +  wxButton *ok = new wxButton(this, wxID_OK, wxT("&Ok"));
         6711  +  btnBox->Add(ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6712  +  wxButton *cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel"));
         6713  +  btnBox->Add(cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6714  +}
         6715  +
         6716  +wxPanel *QuickStyleTopologyDialog::CreateMainPage(wxWindow * parent)
         6717  +{
         6718  +//
         6719  +// creating the MAIN page
         6720  +//
         6721  +  wxPanel *panel = new wxPanel(parent, ID_PANE_MAIN);
         6722  +  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
         6723  +  panel->SetSizer(topSizer);
         6724  +  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
         6725  +  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
         6726  +// First row: Layer name
         6727  +  boxSizer->AddSpacer(50);
         6728  +  wxBoxSizer *lyrBoxSizer = new wxBoxSizer(wxVERTICAL);
         6729  +  boxSizer->Add(lyrBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6730  +  wxBoxSizer *nameSizer = new wxBoxSizer(wxVERTICAL);
         6731  +  lyrBoxSizer->Add(nameSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6732  +  wxStaticBox *nameBox = new wxStaticBox(panel, wxID_ANY,
         6733  +                                         wxT("Layer FullName"),
         6734  +                                         wxDefaultPosition,
         6735  +                                         wxDefaultSize);
         6736  +  wxBoxSizer *nameBoxSizer = new wxStaticBoxSizer(nameBox, wxHORIZONTAL);
         6737  +  nameSizer->Add(nameBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6738  +  wxString fullName = DbPrefix + wxT(".") + LayerName;
         6739  +  wxTextCtrl *nameCtrl = new wxTextCtrl(panel, ID_VECTOR_LAYER, fullName,
         6740  +                                        wxDefaultPosition, wxSize(370, 22),
         6741  +                                        wxTE_READONLY);
         6742  +  nameBoxSizer->Add(nameCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6743  +  wxStaticBox *typeBox = new wxStaticBox(panel, wxID_ANY,
         6744  +                                         wxT("Geometry Type"),
         6745  +                                         wxDefaultPosition,
         6746  +                                         wxDefaultSize);
         6747  +  wxBoxSizer *typeBoxSizer = new wxStaticBoxSizer(typeBox, wxHORIZONTAL);
         6748  +  nameSizer->Add(typeBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6749  +  wxString typeName = wxT("UNKNOWN");
         6750  +  if (Type == MAP_LAYER_NETWORK)
         6751  +    typeName = wxT("Network (ISO TopoNet)");
         6752  +  if (Type == MAP_LAYER_TOPOLOGY)
         6753  +    typeName = wxT("Topology (ISO TopoGeo)");
         6754  +  wxTextCtrl *typeCtrl = new wxTextCtrl(panel, ID_VECTOR_TYPE, typeName,
         6755  +                                        wxDefaultPosition, wxSize(370, 22),
         6756  +                                        wxTE_READONLY);
         6757  +  typeBoxSizer->Add(typeCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6758  +  wxStaticBox *uuidBox = new wxStaticBox(panel, wxID_ANY,
         6759  +                                         wxT("QuickStyle Name"),
         6760  +                                         wxDefaultPosition,
         6761  +                                         wxDefaultSize);
         6762  +  wxBoxSizer *uuidBoxSizer = new wxStaticBoxSizer(uuidBox, wxHORIZONTAL);
         6763  +  nameSizer->Add(uuidBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6764  +  wxString uuid = wxString::FromUTF8(Style->GetUUID());
         6765  +  wxTextCtrl *uuidCtrl = new wxTextCtrl(panel, ID_VECTOR_UUID, uuid,
         6766  +                                        wxDefaultPosition, wxSize(370, 22),
         6767  +                                        wxTE_READONLY);
         6768  +  uuidBoxSizer->Add(uuidCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6769  +  boxSizer->AddSpacer(25);
         6770  +// second row: Visibility Range
         6771  +  wxBoxSizer *miscSizer = new wxBoxSizer(wxHORIZONTAL);
         6772  +  boxSizer->Add(miscSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         6773  +  wxBoxSizer *visibilityBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         6774  +  miscSizer->Add(visibilityBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         6775  +  wxStaticBox *visibilityBox = new wxStaticBox(panel, wxID_STATIC,
         6776  +                                               wxT("Visibility Range"),
         6777  +                                               wxDefaultPosition,
         6778  +                                               wxDefaultSize);
         6779  +  wxBoxSizer *visibilitySizer =
         6780  +    new wxStaticBoxSizer(visibilityBox, wxHORIZONTAL);
         6781  +  visibilityBoxSizer->Add(visibilitySizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL,
         6782  +                          5);
         6783  +  wxString range[4];
         6784  +  range[0] = wxT("&None");
         6785  +  range[1] = wxT("&Min");
         6786  +  range[2] = wxT("&Max");
         6787  +  range[3] = wxT("&Both");
         6788  +  wxRadioBox *rangeBox = new wxRadioBox(panel, ID_SYMBOLIZER_MINMAX_SCALE,
         6789  +                                        wxT("&Range Type"),
         6790  +                                        wxDefaultPosition,
         6791  +                                        wxDefaultSize, 4,
         6792  +                                        range, 2,
         6793  +                                        wxRA_SPECIFY_COLS);
         6794  +  visibilitySizer->Add(rangeBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6795  +  rangeBox->SetSelection(0);
         6796  +  visibilitySizer->AddSpacer(20);
         6797  +  wxBoxSizer *scaleBoxSizer = new wxBoxSizer(wxVERTICAL);
         6798  +  visibilitySizer->Add(scaleBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6799  +  wxBoxSizer *scaleMinSizer = new wxBoxSizer(wxHORIZONTAL);
         6800  +  scaleBoxSizer->Add(scaleMinSizer, 0, wxALIGN_RIGHT | wxALL, 5);
         6801  +  wxStaticText *minScaleLabel =
         6802  +    new wxStaticText(panel, wxID_STATIC, wxT("&Min Scale:"));
         6803  +  scaleMinSizer->Add(minScaleLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6804  +  wxTextCtrl *minScaleCtrl =
         6805  +    new wxTextCtrl(panel, ID_SYMBOLIZER_MIN_SCALE, wxT("0.0"),
         6806  +                   wxDefaultPosition, wxSize(100, 22));
         6807  +  minScaleCtrl->Enable(false);
         6808  +  scaleMinSizer->Add(minScaleCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6809  +  wxBoxSizer *scaleMaxSizer = new wxBoxSizer(wxHORIZONTAL);
         6810  +  scaleBoxSizer->Add(scaleMaxSizer, 0, wxALIGN_RIGHT | wxALL, 0);
         6811  +  wxStaticText *maxScaleLabel =
         6812  +    new wxStaticText(panel, wxID_STATIC, wxT("&Max Scale:"));
         6813  +  scaleMaxSizer->Add(maxScaleLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6814  +  wxTextCtrl *maxScaleCtrl =
         6815  +    new wxTextCtrl(panel, ID_SYMBOLIZER_MAX_SCALE, wxT("+Infinite"),
         6816  +                   wxDefaultPosition, wxSize(100, 22));
         6817  +  maxScaleCtrl->Enable(false);
         6818  +  scaleMaxSizer->Add(maxScaleCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6819  +  panel->SetSizer(topSizer);
         6820  +  topSizer->Fit(panel);
         6821  +// appends event handlers
         6822  +  Connect(ID_SYMBOLIZER_MINMAX_SCALE, wxEVT_COMMAND_RADIOBOX_SELECTED,
         6823  +          (wxObjectEventFunction) &
         6824  +          QuickStyleTopologyDialog::OnCmdScaleChanged);
         6825  +  return panel;
         6826  +}
         6827  +
         6828  +void QuickStyleTopologyDialog::
         6829  +OnCmdScaleChanged(wxCommandEvent & WXUNUSED(event))
         6830  +{
         6831  +//
         6832  +// Visibility Range selection changed
         6833  +//
         6834  +  wxRadioBox *scaleModeCtrl =
         6835  +    (wxRadioBox *) FindWindow(ID_SYMBOLIZER_MINMAX_SCALE);
         6836  +  wxTextCtrl *minCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MIN_SCALE);
         6837  +  wxTextCtrl *maxCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MAX_SCALE);
         6838  +  switch (scaleModeCtrl->GetSelection())
         6839  +    {
         6840  +      case 0:
         6841  +        Style->EnableMinScale(false);
         6842  +        Style->EnableMaxScale(false);
         6843  +        minCtrl->SetValue(wxT("0.0"));
         6844  +        minCtrl->Enable(false);
         6845  +        maxCtrl->SetValue(wxT("+Infinite"));
         6846  +        maxCtrl->Enable(false);
         6847  +        break;
         6848  +      case 1:
         6849  +        Style->EnableMinScale(true);
         6850  +        Style->EnableMaxScale(false);
         6851  +        minCtrl->SetValue(wxT(""));
         6852  +        minCtrl->Enable(true);
         6853  +        maxCtrl->SetValue(wxT("+Infinite"));
         6854  +        maxCtrl->Enable(false);
         6855  +        break;
         6856  +      case 2:
         6857  +        Style->EnableMinScale(false);
         6858  +        Style->EnableMaxScale(true);
         6859  +        minCtrl->SetValue(wxT("0.0"));
         6860  +        minCtrl->Enable(false);
         6861  +        maxCtrl->SetValue(wxT(""));
         6862  +        maxCtrl->Enable(true);
         6863  +        break;
         6864  +      case 3:
         6865  +        Style->EnableMinScale(true);
         6866  +        Style->EnableMaxScale(true);
         6867  +        minCtrl->SetValue(wxT(""));
         6868  +        minCtrl->Enable(true);
         6869  +        maxCtrl->SetValue(wxT(""));
         6870  +        maxCtrl->Enable(true);
         6871  +        break;
         6872  +    };
         6873  +}
         6874  +
         6875  +wxPanel *QuickStyleTopologyDialog::CreateNodePage(wxWindow * parent)
         6876  +{
         6877  +//
         6878  +// creating the Node Symbolizer page
         6879  +//
         6880  +  wxString StrokeColor = wxT("#000000");
         6881  +  wxString FillColor = wxT("#808080");
         6882  +  wxPanel *panel = new wxPanel(parent, ID_PANE_POINT);
         6883  +  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
         6884  +  panel->SetSizer(topSizer);
         6885  +  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
         6886  +  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
         6887  +// first row A: Opacity 
         6888  +  wxBoxSizer *opacityBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         6889  +  boxSizer->Add(opacityBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         6890  +  wxStaticBox *opacityBox = new wxStaticBox(panel, wxID_STATIC,
         6891  +                                            wxT("Opacity"),
         6892  +                                            wxDefaultPosition,
         6893  +                                            wxDefaultSize);
         6894  +  wxBoxSizer *opacitySizer = new wxStaticBoxSizer(opacityBox, wxVERTICAL);
         6895  +  opacityBoxSizer->Add(opacitySizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         6896  +  wxSlider *opacityCtrl =
         6897  +    new wxSlider(panel, ID_SYMBOLIZER_NODE_OPACITY, 100, 0, 100,
         6898  +                 wxDefaultPosition, wxSize(600, 45),
         6899  +                 wxSL_HORIZONTAL | wxSL_LABELS);
         6900  +  opacitySizer->Add(opacityCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6901  +// Well Known Mark Name
         6902  +  wxBoxSizer *box1Sizer = new wxBoxSizer(wxHORIZONTAL);
         6903  +  boxSizer->Add(box1Sizer, 0, wxALIGN_CENTER | wxALL, 5);
         6904  +  wxBoxSizer *markSizer = new wxBoxSizer(wxHORIZONTAL);
         6905  +  box1Sizer->Add(markSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         6906  +  wxString mark[6];
         6907  +  mark[0] = wxT("&Square");
         6908  +  mark[1] = wxT("&Circle");
         6909  +  mark[2] = wxT("&Triangle");
         6910  +  mark[3] = wxT("&Star");
         6911  +  mark[4] = wxT("&Cross");
         6912  +  mark[5] = wxT("&X");
         6913  +  wxRadioBox *markBox = new wxRadioBox(panel, ID_SYMBOLIZER_NODE_MARK,
         6914  +                                       wxT("&Mark"),
         6915  +                                       wxDefaultPosition,
         6916  +                                       wxDefaultSize, 6,
         6917  +                                       mark, 1,
         6918  +                                       wxRA_SPECIFY_COLS);
         6919  +  markSizer->Add(markBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6920  +  markBox->SetSelection(0);
         6921  +// second row: Size and Rotation
         6922  +  wxBoxSizer *box2Sizer = new wxBoxSizer(wxVERTICAL);
         6923  +  box1Sizer->Add(box2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         6924  +  wxBoxSizer *sizeBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         6925  +  box2Sizer->Add(sizeBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         6926  +// second row A: Size
         6927  +  wxStaticBox *sizeBox = new wxStaticBox(panel, wxID_STATIC,
         6928  +                                         wxT("Size"),
         6929  +                                         wxDefaultPosition,
         6930  +                                         wxDefaultSize);
         6931  +  wxBoxSizer *sizeSizer = new wxStaticBoxSizer(sizeBox, wxVERTICAL);
         6932  +  sizeBoxSizer->Add(sizeSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
         6933  +  wxBoxSizer *size1Sizer = new wxBoxSizer(wxHORIZONTAL);
         6934  +  sizeSizer->Add(size1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         6935  +  wxTextCtrl *sizeCtrl =
         6936  +    new wxTextCtrl(panel, ID_SYMBOLIZER_NODE_SIZE, wxT("16.0"),
         6937  +                   wxDefaultPosition, wxSize(100, 22));
         6938  +  size1Sizer->Add(sizeCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6939  +// second row B: Rotation
         6940  +  wxStaticBox *rotBox = new wxStaticBox(panel, wxID_STATIC,
         6941  +                                        wxT("Rotation"),
         6942  +                                        wxDefaultPosition,
         6943  +                                        wxDefaultSize);
         6944  +  wxBoxSizer *rotSizer = new wxStaticBoxSizer(rotBox, wxVERTICAL);
         6945  +  sizeBoxSizer->Add(rotSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
         6946  +  wxBoxSizer *rot1Sizer = new wxBoxSizer(wxHORIZONTAL);
         6947  +  rotSizer->Add(rot1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         6948  +  wxTextCtrl *rotCtrl =
         6949  +    new wxTextCtrl(panel, ID_SYMBOLIZER_NODE_ROTATION, wxT("0.0"),
         6950  +                   wxDefaultPosition, wxSize(100, 22));
         6951  +  rot1Sizer->Add(rotCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6952  +// third row: AnchorNode and Displacement
         6953  +  wxBoxSizer *anchorBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         6954  +  box2Sizer->Add(anchorBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         6955  +// third row A: Anchor Node
         6956  +  wxStaticBox *anchorBox = new wxStaticBox(panel, wxID_STATIC,
         6957  +                                           wxT("Anchor Node"),
         6958  +                                           wxDefaultPosition,
         6959  +                                           wxDefaultSize);
         6960  +  wxBoxSizer *anchorSizer = new wxStaticBoxSizer(anchorBox, wxVERTICAL);
         6961  +  anchorBoxSizer->Add(anchorSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
         6962  +  wxBoxSizer *anchor1Sizer = new wxBoxSizer(wxHORIZONTAL);
         6963  +  anchorSizer->Add(anchor1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         6964  +  wxStaticText *anchor1Label = new wxStaticText(panel, wxID_STATIC, wxT("X"));
         6965  +  anchor1Sizer->Add(anchor1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6966  +  wxTextCtrl *anchorXCtrl =
         6967  +    new wxTextCtrl(panel, ID_SYMBOLIZER_NODE_ANCHOR_X, wxT("0.5"),
         6968  +                   wxDefaultPosition, wxSize(100, 22));
         6969  +  anchor1Sizer->Add(anchorXCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6970  +  wxBoxSizer *anchor2Sizer = new wxBoxSizer(wxHORIZONTAL);
         6971  +  anchorSizer->Add(anchor2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         6972  +  wxStaticText *anchor2Label = new wxStaticText(panel, wxID_STATIC, wxT("Y"));
         6973  +  anchor2Sizer->Add(anchor2Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6974  +  wxTextCtrl *anchorYCtrl =
         6975  +    new wxTextCtrl(panel, ID_SYMBOLIZER_NODE_ANCHOR_Y, wxT("0.5"),
         6976  +                   wxDefaultPosition, wxSize(100, 22));
         6977  +  anchor2Sizer->Add(anchorYCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6978  +// third row B: Displacement
         6979  +  wxStaticBox *displacementBox = new wxStaticBox(panel, wxID_STATIC,
         6980  +                                                 wxT("Displacement"),
         6981  +                                                 wxDefaultPosition,
         6982  +                                                 wxDefaultSize);
         6983  +  wxBoxSizer *displacementSizer =
         6984  +    new wxStaticBoxSizer(displacementBox, wxVERTICAL);
         6985  +  anchorBoxSizer->Add(displacementSizer, 0,
         6986  +                      wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
         6987  +  wxBoxSizer *displ1Sizer = new wxBoxSizer(wxHORIZONTAL);
         6988  +  displacementSizer->Add(displ1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         6989  +  wxStaticText *displ1Label = new wxStaticText(panel, wxID_STATIC, wxT("X"));
         6990  +  displ1Sizer->Add(displ1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6991  +  wxTextCtrl *displacementXCtrl =
         6992  +    new wxTextCtrl(panel, ID_SYMBOLIZER_NODE_DISPLACEMENT_X, wxT("0.0"),
         6993  +                   wxDefaultPosition, wxSize(100, 22));
         6994  +  displ1Sizer->Add(displacementXCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6995  +  wxBoxSizer *displ2Sizer = new wxBoxSizer(wxHORIZONTAL);
         6996  +  displacementSizer->Add(displ2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         6997  +  wxStaticText *displ2Label = new wxStaticText(panel, wxID_STATIC, wxT("Y"));
         6998  +  displ2Sizer->Add(displ2Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         6999  +  wxTextCtrl *displacementYCtrl =
         7000  +    new wxTextCtrl(panel, ID_SYMBOLIZER_NODE_DISPLACEMENT_Y, wxT("0.0"),
         7001  +                   wxDefaultPosition, wxSize(100, 22));
         7002  +  displ2Sizer->Add(displacementYCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7003  +// fourth row: colors
         7004  +  wxBoxSizer *box3Sizer = new wxBoxSizer(wxHORIZONTAL);
         7005  +  boxSizer->Add(box3Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7006  +// first row A: Fill Color
         7007  +  wxBoxSizer *fillBoxSizer = new wxBoxSizer(wxVERTICAL);
         7008  +  box3Sizer->Add(fillBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7009  +  wxStaticBox *colorFillBox = new wxStaticBox(panel, wxID_STATIC,
         7010  +                                              wxT("Fill Color"),
         7011  +                                              wxDefaultPosition,
         7012  +                                              wxDefaultSize);
         7013  +  wxBoxSizer *colorFillSizer = new wxStaticBoxSizer(colorFillBox, wxVERTICAL);
         7014  +  box3Sizer->Add(colorFillSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         7015  +  wxBoxSizer *fill1Sizer = new wxBoxSizer(wxHORIZONTAL);
         7016  +  colorFillSizer->Add(fill1Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         7017  +  wxTextCtrl *fillColorCtrl =
         7018  +    new wxTextCtrl(panel, ID_SYMBOLIZER_NODE_FILL_COLOR, FillColor,
         7019  +                   wxDefaultPosition, wxSize(80, 22));
         7020  +  fill1Sizer->Add(fillColorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7021  +  wxBitmap bmp;
         7022  +  wxColour color(0, 0, 0);
         7023  +  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
         7024  +  wxStaticBitmap *sampleFillCtrl =
         7025  +    new wxStaticBitmap(panel, ID_SYMBOLIZER_NODE_FILL_PICKER_HEX, bmp,
         7026  +                       wxDefaultPosition, wxSize(32, 32));
         7027  +  fill1Sizer->Add(sampleFillCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7028  +  wxButton *pickFill = new wxButton(panel, ID_SYMBOLIZER_NODE_FILL_PICKER_BTN,
         7029  +                                    wxT("&Pick a color"));
         7030  +  fill1Sizer->Add(pickFill, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7031  +// second row B: Stroke Color
         7032  +  box3Sizer->AddSpacer(30);
         7033  +  wxStaticBox *colorStrokeBox = new wxStaticBox(panel, wxID_STATIC,
         7034  +                                                wxT("Stroke Color"),
         7035  +                                                wxDefaultPosition,
         7036  +                                                wxDefaultSize);
         7037  +  wxBoxSizer *colorStrokeSizer =
         7038  +    new wxStaticBoxSizer(colorStrokeBox, wxVERTICAL);
         7039  +  box3Sizer->Add(colorStrokeSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         7040  +  wxBoxSizer *stroke1Sizer = new wxBoxSizer(wxHORIZONTAL);
         7041  +  colorStrokeSizer->Add(stroke1Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         7042  +  wxTextCtrl *strokeColorCtrl =
         7043  +    new wxTextCtrl(panel, ID_SYMBOLIZER_NODE_STROKE_COLOR, StrokeColor,
         7044  +                   wxDefaultPosition, wxSize(80, 22));
         7045  +  stroke1Sizer->Add(strokeColorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7046  +  wxStaticBitmap *sampleStrokeCtrl =
         7047  +    new wxStaticBitmap(panel, ID_SYMBOLIZER_NODE_STROKE_PICKER_HEX, bmp,
         7048  +                       wxDefaultPosition, wxSize(32, 32));
         7049  +  stroke1Sizer->Add(sampleStrokeCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7050  +  wxButton *pickStroke =
         7051  +    new wxButton(panel, ID_SYMBOLIZER_NODE_STROKE_PICKER_BTN,
         7052  +                 wxT("&Pick a color"));
         7053  +  stroke1Sizer->Add(pickStroke, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7054  +  panel->SetSizer(topSizer);
         7055  +  topSizer->Fit(panel);
         7056  +// appends event handlers
         7057  +  Connect(ID_SYMBOLIZER_NODE_MARK, wxEVT_COMMAND_RADIOBOX_SELECTED,
         7058  +          (wxObjectEventFunction) &
         7059  +          QuickStyleTopologyDialog::OnCmdNodeMarkChanged);
         7060  +  Connect(ID_SYMBOLIZER_NODE_FILL_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
         7061  +          (wxObjectEventFunction) &
         7062  +          QuickStyleTopologyDialog::OnCmdNodeColorFillPicker);
         7063  +  Connect(ID_SYMBOLIZER_NODE_FILL_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
         7064  +          (wxObjectEventFunction) &
         7065  +          QuickStyleTopologyDialog::OnCmdNodeColorFillChanged);
         7066  +  Connect(ID_SYMBOLIZER_NODE_STROKE_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
         7067  +          (wxObjectEventFunction) &
         7068  +          QuickStyleTopologyDialog::OnCmdNodeColorStrokePicker);
         7069  +  Connect(ID_SYMBOLIZER_NODE_STROKE_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
         7070  +          (wxObjectEventFunction) &
         7071  +          QuickStyleTopologyDialog::OnCmdNodeColorStrokeChanged);
         7072  +  return panel;
         7073  +}
         7074  +
         7075  +void QuickStyleTopologyDialog::
         7076  +OnCmdNodeMarkChanged(wxCommandEvent & WXUNUSED(event))
         7077  +{
         7078  +//
         7079  +// Mark selection changed
         7080  +//
         7081  +  wxRadioBox *markCtrl = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_NODE_MARK);
         7082  +  switch (markCtrl->GetSelection())
         7083  +    {
         7084  +      case 1:
         7085  +        Style->SetNodeWellKnownMark(RL2_GRAPHIC_MARK_CIRCLE);
         7086  +        break;
         7087  +      case 2:
         7088  +        Style->SetNodeWellKnownMark(RL2_GRAPHIC_MARK_TRIANGLE);
         7089  +        break;
         7090  +      case 3:
         7091  +        Style->SetNodeWellKnownMark(RL2_GRAPHIC_MARK_STAR);
         7092  +        break;
         7093  +      case 4:
         7094  +        Style->SetNodeWellKnownMark(RL2_GRAPHIC_MARK_CROSS);
         7095  +        break;
         7096  +      case 5:
         7097  +        Style->SetNodeWellKnownMark(RL2_GRAPHIC_MARK_X);
         7098  +        break;
         7099  +      default:
         7100  +        Style->SetNodeWellKnownMark(RL2_GRAPHIC_MARK_SQUARE);
         7101  +        break;
         7102  +    };
         7103  +}
         7104  +
         7105  +void QuickStyleTopologyDialog::
         7106  +OnCmdNodeColorFillChanged(wxCommandEvent & WXUNUSED(event))
         7107  +{
         7108  +//
         7109  +// Fill color changed: updating the visual sample
         7110  +//
         7111  +  wxTextCtrl *colorCtrl =
         7112  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_FILL_COLOR);
         7113  +  wxStaticBitmap *sampleCtrl =
         7114  +    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_NODE_FILL_PICKER_HEX);
         7115  +  wxColour back = wxColour(255, 255, 255);
         7116  +  wxString str = colorCtrl->GetValue();
         7117  +  if (ColorMapEntry::IsValidColor(str) == true)
         7118  +    ColorMapEntry::GetWxColor(str, back);
         7119  +  wxBitmap bmp;
         7120  +  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
         7121  +  sampleCtrl->SetBitmap(bmp);
         7122  +  sampleCtrl->Refresh();
         7123  +  sampleCtrl->Update();
         7124  +}
         7125  +
         7126  +void QuickStyleTopologyDialog::
         7127  +OnCmdNodeColorFillPicker(wxCommandEvent & WXUNUSED(event))
         7128  +{
         7129  +//
         7130  +// color picker
         7131  +//
         7132  +  wxTextCtrl *colorCtrl =
         7133  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_FILL_COLOR);
         7134  +  wxColour clr = wxNullColour;
         7135  +  wxString str = colorCtrl->GetValue();
         7136  +  if (ColorMapEntry::IsValidColor(str) == true)
         7137  +    ColorMapEntry::GetWxColor(str, clr);
         7138  +  wxColour color = wxGetColourFromUser(this, clr);
         7139  +  if (color.IsOk() == true)
         7140  +    {
         7141  +      char hex[16];
         7142  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         7143  +      wxString str = wxString::FromUTF8(hex);
         7144  +      colorCtrl->SetValue(str);
         7145  +    }
         7146  +}
         7147  +
         7148  +void QuickStyleTopologyDialog::
         7149  +OnCmdNodeColorStrokeChanged(wxCommandEvent & WXUNUSED(event))
         7150  +{
         7151  +//
         7152  +// Stroke color changed: updating the visual sample
         7153  +//
         7154  +  wxTextCtrl *colorCtrl =
         7155  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_STROKE_COLOR);
         7156  +  wxStaticBitmap *sampleCtrl =
         7157  +    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_NODE_STROKE_PICKER_HEX);
         7158  +  wxColour back = wxColour(255, 255, 255);
         7159  +  wxString str = colorCtrl->GetValue();
         7160  +  if (ColorMapEntry::IsValidColor(str) == true)
         7161  +    ColorMapEntry::GetWxColor(str, back);
         7162  +  wxBitmap bmp;
         7163  +  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
         7164  +  sampleCtrl->SetBitmap(bmp);
         7165  +  sampleCtrl->Refresh();
         7166  +  sampleCtrl->Update();
         7167  +}
         7168  +
         7169  +void QuickStyleTopologyDialog::
         7170  +OnCmdNodeColorStrokePicker(wxCommandEvent & WXUNUSED(event))
         7171  +{
         7172  +//
         7173  +// color picker
         7174  +//
         7175  +  wxTextCtrl *colorCtrl =
         7176  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_STROKE_COLOR);
         7177  +  wxColour clr = wxNullColour;
         7178  +  wxString str = colorCtrl->GetValue();
         7179  +  if (ColorMapEntry::IsValidColor(str) == true)
         7180  +    ColorMapEntry::GetWxColor(str, clr);
         7181  +  wxColour color = wxGetColourFromUser(this, clr);
         7182  +  if (color.IsOk() == true)
         7183  +    {
         7184  +      char hex[16];
         7185  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         7186  +      wxString str = wxString::FromUTF8(hex);
         7187  +      colorCtrl->SetValue(str);
         7188  +    }
         7189  +}
         7190  +
         7191  +wxPanel *QuickStyleTopologyDialog::CreateEdgeLinkPage(wxWindow * parent)
         7192  +{
         7193  +//
         7194  +// creating the EdgeLink Symbolizer page
         7195  +//
         7196  +  wxString StrokeColor = wxT("#000000");
         7197  +  wxPanel *panel = new wxPanel(parent, ID_PANE_LINE);
         7198  +  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
         7199  +  panel->SetSizer(topSizer);
         7200  +  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
         7201  +  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
         7202  +// first row A: the Stroke #1 Opacity and Perpendicular Offset
         7203  +  boxSizer->AddSpacer(50);
         7204  +  wxBoxSizer *opacityBoxSizer = new wxBoxSizer(wxVERTICAL);
         7205  +  boxSizer->Add(opacityBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7206  +  wxStaticBox *opacityBox = new wxStaticBox(panel, wxID_STATIC,
         7207  +                                            wxT("Opacity"),
         7208  +                                            wxDefaultPosition,
         7209  +                                            wxDefaultSize);
         7210  +  wxBoxSizer *opacitySizer = new wxStaticBoxSizer(opacityBox, wxHORIZONTAL);
         7211  +  opacityBoxSizer->Add(opacitySizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7212  +  wxSlider *opacityCtrl =
         7213  +    new wxSlider(panel, ID_SYMBOLIZER_STROKE1_OPACITY, 100, 0, 100,
         7214  +                 wxDefaultPosition, wxSize(600, 45),
         7215  +                 wxSL_HORIZONTAL | wxSL_LABELS);
         7216  +  opacitySizer->Add(opacityCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7217  +// first row B: PerpendicularOffset
         7218  +  wxBoxSizer *perpendicularBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         7219  +  opacityBoxSizer->Add(perpendicularBoxSizer, 0,
         7220  +                       wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7221  +  wxStaticBox *perpendicularBox = new wxStaticBox(panel, wxID_STATIC,
         7222  +                                                  wxT("Perpendicular Offset"),
         7223  +                                                  wxDefaultPosition,
         7224  +                                                  wxDefaultSize);
         7225  +  wxBoxSizer *perpendicularSizer =
         7226  +    new wxStaticBoxSizer(perpendicularBox, wxVERTICAL);
         7227  +  perpendicularBoxSizer->Add(perpendicularSizer, 0,
         7228  +                             wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         7229  +  wxBoxSizer *perp1Sizer = new wxBoxSizer(wxHORIZONTAL);
         7230  +  perpendicularSizer->Add(perp1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7231  +  wxTextCtrl *perpendicularCtrl =
         7232  +    new wxTextCtrl(panel, ID_SYMBOLIZER_STROKE1_PERPENDICULAR, wxT("0.0"),
         7233  +                   wxDefaultPosition, wxSize(100, 22));
         7234  +  perp1Sizer->Add(perpendicularCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         7235  +  wxStaticText *perp1Label = new wxStaticText(panel, wxID_STATIC,
         7236  +                                              wxT
         7237  +                                              ("Draw lines in parallel to the original geometry."));
         7238  +  perp1Sizer->Add(perp1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         7239  +  wxStaticText *perp2Label = new wxStaticText(panel, wxID_STATIC,
         7240  +                                              wxT
         7241  +                                              ("Positive to the left-hand side. Negative numbers mean right."));
         7242  +  perpendicularSizer->Add(perp2Label, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7243  +// second row: Stroke color or Graphic
         7244  +  wxBoxSizer *strokeSizer = new wxBoxSizer(wxHORIZONTAL);
         7245  +  boxSizer->Add(strokeSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7246  +// second row B: Stroke Color
         7247  +  wxBoxSizer *colorBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         7248  +  strokeSizer->Add(colorBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         7249  +  wxStaticBox *colorBox = new wxStaticBox(panel, wxID_STATIC,
         7250  +                                          wxT("Stroke Color"),
         7251  +                                          wxDefaultPosition,
         7252  +                                          wxDefaultSize);
         7253  +  wxBoxSizer *colorSizer = new wxStaticBoxSizer(colorBox, wxVERTICAL);
         7254  +  colorBoxSizer->Add(colorSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7255  +  wxBoxSizer *color1Sizer = new wxBoxSizer(wxHORIZONTAL);
         7256  +  colorSizer->Add(color1Sizer, 0, wxALIGN_RIGHT | wxALL, 0);
         7257  +  wxTextCtrl *colorCtrl =
         7258  +    new wxTextCtrl(panel, ID_SYMBOLIZER_STROKE1_COLOR, StrokeColor,
         7259  +                   wxDefaultPosition, wxSize(80, 22));
         7260  +  color1Sizer->Add(colorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7261  +  wxBitmap bmp;
         7262  +  wxColour color(0, 0, 0);
         7263  +  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
         7264  +  wxStaticBitmap *sampleCtrl =
         7265  +    new wxStaticBitmap(panel, ID_SYMBOLIZER_STROKE1_PICKER_HEX, bmp,
         7266  +                       wxDefaultPosition, wxSize(32, 32));
         7267  +  color1Sizer->Add(sampleCtrl, 0, wxALIGN_RIGHT | wxALL, 5);
         7268  +  wxBoxSizer *pickerSizer = new wxBoxSizer(wxHORIZONTAL);
         7269  +  colorSizer->Add(pickerSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7270  +  wxButton *pick =
         7271  +    new wxButton(panel, ID_SYMBOLIZER_STROKE1_PICKER_BTN, wxT("&Pick a color"));
         7272  +  pickerSizer->Add(pick, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         7273  +// third row: Stroke-Width 
         7274  +  wxBoxSizer *miscSizer = new wxBoxSizer(wxHORIZONTAL);
         7275  +  colorBoxSizer->Add(miscSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         7276  +// third row A: StrokeWidth
         7277  +  wxBoxSizer *widthBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         7278  +  miscSizer->Add(widthBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         7279  +  wxStaticBox *widthBox = new wxStaticBox(panel, wxID_STATIC,
         7280  +                                          wxT("Stroke Width"),
         7281  +                                          wxDefaultPosition,
         7282  +                                          wxDefaultSize);
         7283  +  wxBoxSizer *widthSizer = new wxStaticBoxSizer(widthBox, wxVERTICAL);
         7284  +  widthBoxSizer->Add(widthSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         7285  +  wxTextCtrl *widthCtrl =
         7286  +    new wxTextCtrl(panel, ID_SYMBOLIZER_STROKE1_WIDTH, wxT("1.0"),
         7287  +                   wxDefaultPosition, wxSize(100, 22));
         7288  +  widthSizer->Add(widthCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7289  +// third row D: DashArray and DashOffset
         7290  +  wxBoxSizer *dashBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         7291  +  miscSizer->Add(dashBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         7292  +  wxString dot[4];
         7293  +  if (Type == MAP_LAYER_NETWORK)
         7294  +    {
         7295  +      dot[0] = wxT("&Solid Link");
         7296  +      dot[1] = wxT("&Dotted Link");
         7297  +      dot[2] = wxT("&Dashed Link");
         7298  +      dot[3] = wxT("&Dashed/Dotted Link");
         7299  +  } else
         7300  +    {
         7301  +      dot[0] = wxT("&Solid Edge");
         7302  +      dot[1] = wxT("&Dotted Edge");
         7303  +      dot[2] = wxT("&Dashed Edge");
         7304  +      dot[3] = wxT("&Dashed/Dotted Edge");
         7305  +    }
         7306  +  wxRadioBox *dotBox = new wxRadioBox(panel, ID_SYMBOLIZER_DASH_DOT,
         7307  +                                      wxT("&Dash/Dot Style"),
         7308  +                                      wxDefaultPosition,
         7309  +                                      wxDefaultSize, 4,
         7310  +                                      dot, 1,
         7311  +                                      wxRA_SPECIFY_COLS);
         7312  +  dotBox->SetSelection(0);
         7313  +  dashBoxSizer->Add(dotBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7314  +  panel->SetSizer(topSizer);
         7315  +  topSizer->Fit(panel);
         7316  +// appends event handlers
         7317  +  Connect(ID_SYMBOLIZER_STROKE1_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
         7318  +          (wxObjectEventFunction) &
         7319  +          QuickStyleTopologyDialog::OnCmdEdgeLinkColorChanged);
         7320  +  Connect(ID_SYMBOLIZER_STROKE1_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
         7321  +          (wxObjectEventFunction) &
         7322  +          QuickStyleTopologyDialog::OnCmdEdgeLinkColorPicker);
         7323  +  return panel;
         7324  +}
         7325  +
         7326  +void QuickStyleTopologyDialog::
         7327  +OnCmdEdgeLinkColorChanged(wxCommandEvent & WXUNUSED(event))
         7328  +{
         7329  +//
         7330  +// Stroke color changed: updating the visual sample
         7331  +//
         7332  +  wxTextCtrl *colorCtrl =
         7333  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_COLOR);
         7334  +  wxStaticBitmap *sampleCtrl =
         7335  +    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_STROKE1_PICKER_HEX);
         7336  +  wxColour back = wxColour(255, 255, 255);
         7337  +  wxString str = colorCtrl->GetValue();
         7338  +  if (ColorMapEntry::IsValidColor(str) == true)
         7339  +    ColorMapEntry::GetWxColor(str, back);
         7340  +  wxBitmap bmp;
         7341  +  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
         7342  +  sampleCtrl->SetBitmap(bmp);
         7343  +  sampleCtrl->Refresh();
         7344  +  sampleCtrl->Update();
         7345  +}
         7346  +
         7347  +void QuickStyleTopologyDialog::
         7348  +OnCmdEdgeLinkColorPicker(wxCommandEvent & WXUNUSED(event))
         7349  +{
         7350  +//
         7351  +// color picker
         7352  +//
         7353  +  wxTextCtrl *colorCtrl =
         7354  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_COLOR);
         7355  +  wxColour clr = wxNullColour;
         7356  +  wxString str = colorCtrl->GetValue();
         7357  +  if (ColorMapEntry::IsValidColor(str) == true)
         7358  +    ColorMapEntry::GetWxColor(str, clr);
         7359  +  wxColour color = wxGetColourFromUser(this, clr);
         7360  +  if (color.IsOk() == true)
         7361  +    {
         7362  +      char hex[16];
         7363  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         7364  +      wxString str = wxString::FromUTF8(hex);
         7365  +      colorCtrl->SetValue(str);
         7366  +    }
         7367  +}
         7368  +
         7369  +wxPanel *QuickStyleTopologyDialog::CreateFacePage(wxWindow * parent)
         7370  +{
         7371  +//
         7372  +// creating the Face Symbolizer page
         7373  +//
         7374  +  wxString StrokeColor = wxT("#000000");
         7375  +  wxString FillColor = wxT("#808080");
         7376  +  wxPanel *panel = new wxPanel(parent, ID_PANE_FILL2);
         7377  +  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
         7378  +  panel->SetSizer(topSizer);
         7379  +  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
         7380  +  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
         7381  +// first row: the Face Displacement and Perpendicular Offset
         7382  +  wxBoxSizer *polygonBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         7383  +  boxSizer->Add(polygonBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         7384  +// first row A: Displacement
         7385  +  wxBoxSizer *displacementBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         7386  +  polygonBoxSizer->Add(displacementBoxSizer, 0,
         7387  +                       wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7388  +  wxStaticBox *displacementBox = new wxStaticBox(panel, wxID_STATIC,
         7389  +                                                 wxT("Displacement"),
         7390  +                                                 wxDefaultPosition,
         7391  +                                                 wxDefaultSize);
         7392  +  wxBoxSizer *displacementSizer =
         7393  +    new wxStaticBoxSizer(displacementBox, wxVERTICAL);
         7394  +  displacementBoxSizer->Add(displacementSizer, 0,
         7395  +                            wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         7396  +  wxBoxSizer *displ1Sizer = new wxBoxSizer(wxHORIZONTAL);
         7397  +  displacementSizer->Add(displ1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7398  +  wxStaticText *displ1Label = new wxStaticText(panel, wxID_STATIC, wxT("X"));
         7399  +  displ1Sizer->Add(displ1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         7400  +  wxTextCtrl *displacementXCtrl =
         7401  +    new wxTextCtrl(panel, ID_SYMBOLIZER_POLYGON1_DISPLACEMENT_X, wxT("0.0"),
         7402  +                   wxDefaultPosition, wxSize(100, 22));
         7403  +  displ1Sizer->Add(displacementXCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         7404  +  wxBoxSizer *displ2Sizer = new wxBoxSizer(wxHORIZONTAL);
         7405  +  displacementSizer->Add(displ2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7406  +  wxStaticText *displ2Label = new wxStaticText(panel, wxID_STATIC, wxT("Y"));
         7407  +  displ2Sizer->Add(displ2Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         7408  +  wxTextCtrl *displacementYCtrl =
         7409  +    new wxTextCtrl(panel, ID_SYMBOLIZER_POLYGON1_DISPLACEMENT_Y, wxT("0.0"),
         7410  +                   wxDefaultPosition, wxSize(100, 22));
         7411  +  displ2Sizer->Add(displacementYCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         7412  +// first row B: PerpendicularOffset
         7413  +  wxBoxSizer *perpendicularBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         7414  +  polygonBoxSizer->Add(perpendicularBoxSizer, 0,
         7415  +                       wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7416  +  wxStaticBox *perpendicularBox = new wxStaticBox(panel, wxID_STATIC,
         7417  +                                                  wxT("Perpendicular Offset"),
         7418  +                                                  wxDefaultPosition,
         7419  +                                                  wxDefaultSize);
         7420  +  wxBoxSizer *perpendicularSizer =
         7421  +    new wxStaticBoxSizer(perpendicularBox, wxVERTICAL);
         7422  +  perpendicularBoxSizer->Add(perpendicularSizer, 0,
         7423  +                             wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7424  +  wxBoxSizer *perp1Sizer = new wxBoxSizer(wxHORIZONTAL);
         7425  +  perpendicularSizer->Add(perp1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7426  +  wxTextCtrl *perpendicularCtrl =
         7427  +    new wxTextCtrl(panel, ID_SYMBOLIZER_POLYGON1_PERPENDICULAR, wxT("0.0"),
         7428  +                   wxDefaultPosition, wxSize(100, 22));
         7429  +  perp1Sizer->Add(perpendicularCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         7430  +  wxStaticText *perp1Label = new wxStaticText(panel, wxID_STATIC,
         7431  +                                              wxT
         7432  +                                              ("Positive: larger. / Negative: smaller."));
         7433  +  perp1Sizer->Add(perp1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         7434  +  wxStaticText *perp2Label = new wxStaticText(panel, wxID_STATIC,
         7435  +                                              wxT
         7436  +                                              ("Drawing polygons smaller or larger than their actual geometry (Buffer)."));
         7437  +  perpendicularSizer->Add(perp2Label, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7438  +// second row: Fill Opacity
         7439  +  wxBoxSizer *auxBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         7440  +  boxSizer->Add(auxBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7441  +  wxStaticBox *auxBox = new wxStaticBox(panel, wxID_STATIC,
         7442  +                                        wxT("Face Fill"),
         7443  +                                        wxDefaultPosition,
         7444  +                                        wxDefaultSize);
         7445  +  wxBoxSizer *auxSizer = new wxStaticBoxSizer(auxBox, wxHORIZONTAL);
         7446  +  auxBoxSizer->Add(auxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7447  +  wxBoxSizer *enableSizer = new wxBoxSizer(wxHORIZONTAL);
         7448  +  auxSizer->Add(enableSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         7449  +  wxCheckBox *enableCtrl = new wxCheckBox(panel, ID_SYMBOLIZER_FILL2_ENABLE,
         7450  +                                          wxT("Enable"),
         7451  +                                          wxDefaultPosition, wxDefaultSize);
         7452  +  enableCtrl->SetValue(Style->IsFaceFill());
         7453  +  enableSizer->Add(enableCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7454  +  wxBoxSizer *opacityBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         7455  +  enableSizer->Add(opacityBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         7456  +  wxStaticBox *opacityBox = new wxStaticBox(panel, wxID_STATIC,
         7457  +                                            wxT("Opacity"),
         7458  +                                            wxDefaultPosition,
         7459  +                                            wxDefaultSize);
         7460  +  wxBoxSizer *opacitySizer = new wxStaticBoxSizer(opacityBox, wxVERTICAL);
         7461  +  opacityBoxSizer->Add(opacitySizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7462  +  wxSlider *opacityCtrl =
         7463  +    new wxSlider(panel, ID_SYMBOLIZER_FILL2_OPACITY, 100, 0, 100,
         7464  +                 wxDefaultPosition, wxSize(400, 45),
         7465  +                 wxSL_HORIZONTAL | wxSL_LABELS);
         7466  +  opacityCtrl->Enable(Style->IsFaceFill());
         7467  +  opacitySizer->Add(opacityCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7468  +// third row B: Fill Color
         7469  +  wxBoxSizer *colorBoxSizer = new wxBoxSizer(wxVERTICAL);
         7470  +  auxSizer->Add(colorBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7471  +  wxStaticBox *colorBox = new wxStaticBox(panel, wxID_STATIC,
         7472  +                                          wxT("Fill Color"),
         7473  +                                          wxDefaultPosition,
         7474  +                                          wxDefaultSize);
         7475  +  wxBoxSizer *colorSizer = new wxStaticBoxSizer(colorBox, wxVERTICAL);
         7476  +  colorBoxSizer->Add(colorSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7477  +  wxBoxSizer *color1Sizer = new wxBoxSizer(wxHORIZONTAL);
         7478  +  colorSizer->Add(color1Sizer, 0, wxALIGN_RIGHT | wxALL, 0);
         7479  +  wxTextCtrl *colorCtrl =
         7480  +    new wxTextCtrl(panel, ID_SYMBOLIZER_FILL2_COLOR, FillColor,
         7481  +                   wxDefaultPosition, wxSize(80, 22));
         7482  +  color1Sizer->Add(colorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7483  +  wxBitmap bmp;
         7484  +  wxColour color(0, 0, 0);
         7485  +  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
         7486  +  wxStaticBitmap *sampleCtrl =
         7487  +    new wxStaticBitmap(panel, ID_SYMBOLIZER_FILL2_PICKER_HEX, bmp,
         7488  +                       wxDefaultPosition, wxSize(32, 32));
         7489  +  sampleCtrl->Enable(Style->IsFaceFill());
         7490  +  color1Sizer->Add(sampleCtrl, 0, wxALIGN_RIGHT | wxALL, 5);
         7491  +  wxBoxSizer *pickerSizer = new wxBoxSizer(wxHORIZONTAL);
         7492  +  colorSizer->Add(pickerSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7493  +  wxButton *pick =
         7494  +    new wxButton(panel, ID_SYMBOLIZER_FILL2_PICKER_BTN, wxT("&Pick a color"));
         7495  +  pick->Enable(Style->IsFaceFill());
         7496  +  pickerSizer->Add(pick, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         7497  +// first row A: the Stroke #1 Opacity 
         7498  +  wxBoxSizer *opacity2BoxSizer = new wxBoxSizer(wxHORIZONTAL);
         7499  +  boxSizer->Add(opacity2BoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         7500  +  wxStaticBox *enableBox = new wxStaticBox(panel, wxID_STATIC,
         7501  +                                           wxT("Face Stroke"),
         7502  +                                           wxDefaultPosition,
         7503  +                                           wxDefaultSize);
         7504  +  wxBoxSizer *enable2Sizer = new wxStaticBoxSizer(enableBox, wxHORIZONTAL);
         7505  +  opacity2BoxSizer->Add(enable2Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7506  +  wxCheckBox *enable2Ctrl = new wxCheckBox(panel, ID_SYMBOLIZER_STROKE2_ENABLE,
         7507  +                                           wxT("Enable"),
         7508  +                                           wxDefaultPosition, wxDefaultSize);
         7509  +  enable2Ctrl->SetValue(Style->IsFaceStroke());
         7510  +  enable2Sizer->Add(enable2Ctrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7511  +  wxStaticBox *opacity2Box = new wxStaticBox(panel, wxID_STATIC,
         7512  +                                             wxT("Opacity"),
         7513  +                                             wxDefaultPosition,
         7514  +                                             wxDefaultSize);
         7515  +  wxBoxSizer *opacity2Sizer = new wxStaticBoxSizer(opacity2Box, wxVERTICAL);
         7516  +  enable2Sizer->Add(opacity2Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7517  +  wxSlider *opacity2Ctrl =
         7518  +    new wxSlider(panel, ID_SYMBOLIZER_STROKE2_OPACITY, 100, 0, 100,
         7519  +                 wxDefaultPosition, wxSize(250, 45),
         7520  +                 wxSL_HORIZONTAL | wxSL_LABELS);
         7521  +  opacity2Ctrl->Enable(Style->IsFaceStroke());
         7522  +  opacity2Sizer->Add(opacity2Ctrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7523  +// second row B: Stroke Color
         7524  +  wxStaticBox *color2Box = new wxStaticBox(panel, wxID_STATIC,
         7525  +                                           wxT("Stroke Color"),
         7526  +                                           wxDefaultPosition,
         7527  +                                           wxDefaultSize);
         7528  +  wxBoxSizer *color2Sizer = new wxStaticBoxSizer(color2Box, wxVERTICAL);
         7529  +  enable2Sizer->Add(color2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         7530  +  wxBoxSizer *color3Sizer = new wxBoxSizer(wxHORIZONTAL);
         7531  +  color2Sizer->Add(color3Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7532  +  wxTextCtrl *color2Ctrl =
         7533  +    new wxTextCtrl(panel, ID_SYMBOLIZER_STROKE2_COLOR, StrokeColor,
         7534  +                   wxDefaultPosition, wxSize(80, 22));
         7535  +  color2Ctrl->Enable(Style->IsFaceStroke());
         7536  +  color3Sizer->Add(color2Ctrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7537  +  wxStaticBitmap *sample2Ctrl =
         7538  +    new wxStaticBitmap(panel, ID_SYMBOLIZER_STROKE2_PICKER_HEX, bmp,
         7539  +                       wxDefaultPosition, wxSize(32, 32));
         7540  +  sample2Ctrl->Enable(Style->IsFaceStroke());
         7541  +  color3Sizer->Add(sample2Ctrl, 0, wxALIGN_RIGHT | wxALL, 5);
         7542  +  wxBoxSizer *picker2Sizer = new wxBoxSizer(wxHORIZONTAL);
         7543  +  color2Sizer->Add(picker2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7544  +  wxButton *pick2 =
         7545  +    new wxButton(panel, ID_SYMBOLIZER_STROKE2_PICKER_BTN, wxT("&Pick a color"));
         7546  +  pick2->Enable(Style->IsFaceStroke());
         7547  +  picker2Sizer->Add(pick2, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         7548  +// third row: Stroke-Width,
         7549  +  wxBoxSizer *miscSizer = new wxBoxSizer(wxHORIZONTAL);
         7550  +  enable2Sizer->Add(miscSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         7551  +// third row A: StrokeWidth
         7552  +  wxBoxSizer *widthBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         7553  +  miscSizer->Add(widthBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         7554  +  wxStaticBox *widthBox = new wxStaticBox(panel, wxID_STATIC,
         7555  +                                          wxT("Stroke Width"),
         7556  +                                          wxDefaultPosition,
         7557  +                                          wxDefaultSize);
         7558  +  wxBoxSizer *widthSizer = new wxStaticBoxSizer(widthBox, wxVERTICAL);
         7559  +  widthBoxSizer->Add(widthSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7560  +  wxTextCtrl *widthCtrl =
         7561  +    new wxTextCtrl(panel, ID_SYMBOLIZER_STROKE2_WIDTH, wxT("1.0"),
         7562  +                   wxDefaultPosition, wxSize(100, 22));
         7563  +  widthCtrl->Enable(false);
         7564  +  widthSizer->Add(widthCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7565  +
         7566  +  panel->SetSizer(topSizer);
         7567  +  topSizer->Fit(panel);
         7568  +// appends event handlers
         7569  +  Connect(ID_SYMBOLIZER_STROKE2_ENABLE, wxEVT_COMMAND_CHECKBOX_CLICKED,
         7570  +          (wxObjectEventFunction) &
         7571  +          QuickStyleTopologyDialog::OnCmdFaceStrokeChanged);
         7572  +  Connect(ID_SYMBOLIZER_FILL2_ENABLE, wxEVT_COMMAND_CHECKBOX_CLICKED,
         7573  +          (wxObjectEventFunction) &
         7574  +          QuickStyleTopologyDialog::OnCmdFaceFillChanged);
         7575  +  Connect(ID_SYMBOLIZER_FILL2_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
         7576  +          (wxObjectEventFunction) &
         7577  +          QuickStyleTopologyDialog::OnCmdFaceColorFillChanged);
         7578  +  Connect(ID_SYMBOLIZER_FILL2_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
         7579  +          (wxObjectEventFunction) &
         7580  +          QuickStyleTopologyDialog::OnCmdFaceColorFillPicker);
         7581  +  Connect(ID_SYMBOLIZER_STROKE2_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
         7582  +          (wxObjectEventFunction) &
         7583  +          QuickStyleTopologyDialog::OnCmdFaceColorStrokeChanged);
         7584  +  Connect(ID_SYMBOLIZER_STROKE2_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
         7585  +          (wxObjectEventFunction) &
         7586  +          QuickStyleTopologyDialog::OnCmdFaceColorStrokePicker);
         7587  +  return panel;
         7588  +}
         7589  +
         7590  +void QuickStyleTopologyDialog::
         7591  +OnCmdFaceStrokeChanged(wxCommandEvent & WXUNUSED(event))
         7592  +{
         7593  +//
         7594  +// Stroke enable/disable 
         7595  +//
         7596  +  wxCheckBox *enableCtrl =
         7597  +    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_STROKE2_ENABLE);
         7598  +  if (enableCtrl->IsChecked() == true)
         7599  +    Style->SetFaceStroke(true);
         7600  +  else
         7601  +    Style->SetFaceStroke(false);
         7602  +  RetrieveFacePage(false);
         7603  +  UpdateFacePage();
         7604  +}
         7605  +
         7606  +void QuickStyleTopologyDialog::
         7607  +OnCmdFaceFillChanged(wxCommandEvent & WXUNUSED(event))
         7608  +{
         7609  +//
         7610  +// Fill enable/disable 
         7611  +//
         7612  +  wxCheckBox *enableCtrl =
         7613  +    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_FILL2_ENABLE);
         7614  +  if (enableCtrl->IsChecked() == true)
         7615  +    Style->SetFaceFill(true);
         7616  +  else
         7617  +    Style->SetFaceFill(false);
         7618  +  RetrieveFacePage(false);
         7619  +  UpdateFacePage();
         7620  +}
         7621  +
         7622  +void QuickStyleTopologyDialog::
         7623  +OnCmdFaceColorFillChanged(wxCommandEvent & WXUNUSED(event))
         7624  +{
         7625  +//
         7626  +// Fill color changed: updating the visual sample
         7627  +//
         7628  +  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FILL2_COLOR);
         7629  +  wxStaticBitmap *sampleCtrl =
         7630  +    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_FILL2_PICKER_HEX);
         7631  +  wxColour back = wxColour(255, 255, 255);
         7632  +  wxString str = colorCtrl->GetValue();
         7633  +  if (ColorMapEntry::IsValidColor(str) == true)
         7634  +    ColorMapEntry::GetWxColor(str, back);
         7635  +  wxBitmap bmp;
         7636  +  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
         7637  +  sampleCtrl->SetBitmap(bmp);
         7638  +  sampleCtrl->Refresh();
         7639  +  sampleCtrl->Update();
         7640  +}
         7641  +
         7642  +void QuickStyleTopologyDialog::
         7643  +OnCmdFaceColorFillPicker(wxCommandEvent & WXUNUSED(event))
         7644  +{
         7645  +//
         7646  +// color picker
         7647  +//
         7648  +  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FILL2_COLOR);
         7649  +  wxColour clr = wxNullColour;
         7650  +  wxString str = colorCtrl->GetValue();
         7651  +  if (ColorMapEntry::IsValidColor(str) == true)
         7652  +    ColorMapEntry::GetWxColor(str, clr);
         7653  +  wxColour color = wxGetColourFromUser(this, clr);
         7654  +  if (color.IsOk() == true)
         7655  +    {
         7656  +      char hex[16];
         7657  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         7658  +      wxString str = wxString::FromUTF8(hex);
         7659  +      colorCtrl->SetValue(str);
         7660  +    }
         7661  +}
         7662  +
         7663  +void QuickStyleTopologyDialog::
         7664  +OnCmdFaceColorStrokeChanged(wxCommandEvent & WXUNUSED(event))
         7665  +{
         7666  +//
         7667  +// Stroke color changed: updating the visual sample
         7668  +//
         7669  +  wxTextCtrl *colorCtrl =
         7670  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE2_COLOR);
         7671  +  wxStaticBitmap *sampleCtrl =
         7672  +    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_STROKE2_PICKER_HEX);
         7673  +  wxColour back = wxColour(255, 255, 255);
         7674  +  wxString str = colorCtrl->GetValue();
         7675  +  if (ColorMapEntry::IsValidColor(str) == true)
         7676  +    ColorMapEntry::GetWxColor(str, back);
         7677  +  wxBitmap bmp;
         7678  +  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
         7679  +  sampleCtrl->SetBitmap(bmp);
         7680  +  sampleCtrl->Refresh();
         7681  +  sampleCtrl->Update();
         7682  +}
         7683  +
         7684  +void QuickStyleTopologyDialog::
         7685  +OnCmdFaceColorStrokePicker(wxCommandEvent & WXUNUSED(event))
         7686  +{
         7687  +//
         7688  +// color picker
         7689  +//
         7690  +  wxTextCtrl *colorCtrl =
         7691  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE2_COLOR);
         7692  +  wxColour clr = wxNullColour;
         7693  +  wxString str = colorCtrl->GetValue();
         7694  +  if (ColorMapEntry::IsValidColor(str) == true)
         7695  +    ColorMapEntry::GetWxColor(str, clr);
         7696  +  wxColour color = wxGetColourFromUser(this, clr);
         7697  +  if (color.IsOk() == true)
         7698  +    {
         7699  +      char hex[16];
         7700  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         7701  +      wxString str = wxString::FromUTF8(hex);
         7702  +      colorCtrl->SetValue(str);
         7703  +    }
         7704  +}
         7705  +
         7706  +wxPanel *QuickStyleTopologyDialog::CreateEdgeLinkSeedPage(wxWindow * parent)
         7707  +{
         7708  +//
         7709  +// creating the EdgeLinkSeed Symbolizer page
         7710  +//
         7711  +  wxString StrokeColor = wxT("#000000");
         7712  +  wxString FillColor = wxT("#808080");
         7713  +  wxPanel *panel = new wxPanel(parent, ID_PANE_POINT);
         7714  +  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
         7715  +  panel->SetSizer(topSizer);
         7716  +  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
         7717  +  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
         7718  +// first row A: Opacity 
         7719  +  wxBoxSizer *opacityBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         7720  +  boxSizer->Add(opacityBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7721  +  wxStaticBox *opacityBox = new wxStaticBox(panel, wxID_STATIC,
         7722  +                                            wxT("Opacity"),
         7723  +                                            wxDefaultPosition,
         7724  +                                            wxDefaultSize);
         7725  +  wxBoxSizer *opacitySizer = new wxStaticBoxSizer(opacityBox, wxVERTICAL);
         7726  +  opacityBoxSizer->Add(opacitySizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7727  +  wxSlider *opacityCtrl =
         7728  +    new wxSlider(panel, ID_SYMBOLIZER_EDGELINK_SEED_OPACITY, 100, 0, 100,
         7729  +                 wxDefaultPosition, wxSize(600, 45),
         7730  +                 wxSL_HORIZONTAL | wxSL_LABELS);
         7731  +  opacitySizer->Add(opacityCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7732  +// Well Known Mark Name
         7733  +  wxBoxSizer *box1Sizer = new wxBoxSizer(wxHORIZONTAL);
         7734  +  boxSizer->Add(box1Sizer, 0, wxALIGN_CENTER | wxALL, 5);
         7735  +  wxBoxSizer *markSizer = new wxBoxSizer(wxHORIZONTAL);
         7736  +  box1Sizer->Add(markSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         7737  +  wxString mark[6];
         7738  +  mark[0] = wxT("&Square");
         7739  +  mark[1] = wxT("&Circle");
         7740  +  mark[2] = wxT("&Triangle");
         7741  +  mark[3] = wxT("&Star");
         7742  +  mark[4] = wxT("&Cross");
         7743  +  mark[5] = wxT("&X");
         7744  +  wxRadioBox *markBox = new wxRadioBox(panel, ID_SYMBOLIZER_EDGELINK_SEED_MARK,
         7745  +                                       wxT("&Mark"),
         7746  +                                       wxDefaultPosition,
         7747  +                                       wxDefaultSize, 6,
         7748  +                                       mark, 1,
         7749  +                                       wxRA_SPECIFY_COLS);
         7750  +  markSizer->Add(markBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7751  +  markBox->SetSelection(0);
         7752  +// second row: Size and Rotation
         7753  +  wxBoxSizer *box2Sizer = new wxBoxSizer(wxVERTICAL);
         7754  +  box1Sizer->Add(box2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7755  +  wxBoxSizer *sizeBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         7756  +  box2Sizer->Add(sizeBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7757  +// second row A: Size
         7758  +  wxStaticBox *sizeBox = new wxStaticBox(panel, wxID_STATIC,
         7759  +                                         wxT("Size"),
         7760  +                                         wxDefaultPosition,
         7761  +                                         wxDefaultSize);
         7762  +  wxBoxSizer *sizeSizer = new wxStaticBoxSizer(sizeBox, wxVERTICAL);
         7763  +  sizeBoxSizer->Add(sizeSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
         7764  +  wxBoxSizer *size1Sizer = new wxBoxSizer(wxHORIZONTAL);
         7765  +  sizeSizer->Add(size1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7766  +  wxTextCtrl *sizeCtrl =
         7767  +    new wxTextCtrl(panel, ID_SYMBOLIZER_EDGELINK_SEED_SIZE, wxT("16.0"),
         7768  +                   wxDefaultPosition, wxSize(100, 22));
         7769  +  size1Sizer->Add(sizeCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7770  +// second row B: Rotation
         7771  +  wxStaticBox *rotBox = new wxStaticBox(panel, wxID_STATIC,
         7772  +                                        wxT("Rotation"),
         7773  +                                        wxDefaultPosition,
         7774  +                                        wxDefaultSize);
         7775  +  wxBoxSizer *rotSizer = new wxStaticBoxSizer(rotBox, wxVERTICAL);
         7776  +  sizeBoxSizer->Add(rotSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
         7777  +  wxBoxSizer *rot1Sizer = new wxBoxSizer(wxHORIZONTAL);
         7778  +  rotSizer->Add(rot1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7779  +  wxTextCtrl *rotCtrl =
         7780  +    new wxTextCtrl(panel, ID_SYMBOLIZER_EDGELINK_SEED_ROTATION, wxT("0.0"),
         7781  +                   wxDefaultPosition, wxSize(100, 22));
         7782  +  rot1Sizer->Add(rotCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7783  +// third row: AnchorEdgeLinkSeed and Displacement
         7784  +  wxBoxSizer *anchorBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         7785  +  box2Sizer->Add(anchorBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7786  +// third row A: Anchor EdgeLinkSeed
         7787  +  wxStaticBox *anchorBox = new wxStaticBox(panel, wxID_STATIC,
         7788  +                                           wxT("Anchor EdgeLinkSeed"),
         7789  +                                           wxDefaultPosition,
         7790  +                                           wxDefaultSize);
         7791  +  wxBoxSizer *anchorSizer = new wxStaticBoxSizer(anchorBox, wxVERTICAL);
         7792  +  anchorBoxSizer->Add(anchorSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
         7793  +  wxBoxSizer *anchor1Sizer = new wxBoxSizer(wxHORIZONTAL);
         7794  +  anchorSizer->Add(anchor1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7795  +  wxStaticText *anchor1Label = new wxStaticText(panel, wxID_STATIC, wxT("X"));
         7796  +  anchor1Sizer->Add(anchor1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7797  +  wxTextCtrl *anchorXCtrl =
         7798  +    new wxTextCtrl(panel, ID_SYMBOLIZER_EDGELINK_SEED_ANCHOR_X, wxT("0.5"),
         7799  +                   wxDefaultPosition, wxSize(100, 22));
         7800  +  anchor1Sizer->Add(anchorXCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7801  +  wxBoxSizer *anchor2Sizer = new wxBoxSizer(wxHORIZONTAL);
         7802  +  anchorSizer->Add(anchor2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7803  +  wxStaticText *anchor2Label = new wxStaticText(panel, wxID_STATIC, wxT("Y"));
         7804  +  anchor2Sizer->Add(anchor2Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7805  +  wxTextCtrl *anchorYCtrl =
         7806  +    new wxTextCtrl(panel, ID_SYMBOLIZER_EDGELINK_SEED_ANCHOR_Y, wxT("0.5"),
         7807  +                   wxDefaultPosition, wxSize(100, 22));
         7808  +  anchor2Sizer->Add(anchorYCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7809  +// third row B: Displacement
         7810  +  wxStaticBox *displacementBox = new wxStaticBox(panel, wxID_STATIC,
         7811  +                                                 wxT("Displacement"),
         7812  +                                                 wxDefaultPosition,
         7813  +                                                 wxDefaultSize);
         7814  +  wxBoxSizer *displacementSizer =
         7815  +    new wxStaticBoxSizer(displacementBox, wxVERTICAL);
         7816  +  anchorBoxSizer->Add(displacementSizer, 0,
         7817  +                      wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
         7818  +  wxBoxSizer *displ1Sizer = new wxBoxSizer(wxHORIZONTAL);
         7819  +  displacementSizer->Add(displ1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7820  +  wxStaticText *displ1Label = new wxStaticText(panel, wxID_STATIC, wxT("X"));
         7821  +  displ1Sizer->Add(displ1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7822  +  wxTextCtrl *displacementXCtrl =
         7823  +    new wxTextCtrl(panel, ID_SYMBOLIZER_EDGELINK_SEED_DISPLACEMENT_X,
         7824  +                   wxT("0.0"),
         7825  +                   wxDefaultPosition, wxSize(100, 22));
         7826  +  displ1Sizer->Add(displacementXCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7827  +  wxBoxSizer *displ2Sizer = new wxBoxSizer(wxHORIZONTAL);
         7828  +  displacementSizer->Add(displ2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7829  +  wxStaticText *displ2Label = new wxStaticText(panel, wxID_STATIC, wxT("Y"));
         7830  +  displ2Sizer->Add(displ2Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7831  +  wxTextCtrl *displacementYCtrl =
         7832  +    new wxTextCtrl(panel, ID_SYMBOLIZER_EDGELINK_SEED_DISPLACEMENT_Y,
         7833  +                   wxT("0.0"),
         7834  +                   wxDefaultPosition, wxSize(100, 22));
         7835  +  displ2Sizer->Add(displacementYCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7836  +// fourth row: colors
         7837  +  wxBoxSizer *box3Sizer = new wxBoxSizer(wxHORIZONTAL);
         7838  +  boxSizer->Add(box3Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         7839  +// first row A: Fill Color
         7840  +  wxBoxSizer *fillBoxSizer = new wxBoxSizer(wxVERTICAL);
         7841  +  box3Sizer->Add(fillBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7842  +  wxStaticBox *colorFillBox = new wxStaticBox(panel, wxID_STATIC,
         7843  +                                              wxT("Fill Color"),
         7844  +                                              wxDefaultPosition,
         7845  +                                              wxDefaultSize);
         7846  +  wxBoxSizer *colorFillSizer = new wxStaticBoxSizer(colorFillBox, wxVERTICAL);
         7847  +  box3Sizer->Add(colorFillSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         7848  +  wxBoxSizer *fill1Sizer = new wxBoxSizer(wxHORIZONTAL);
         7849  +  colorFillSizer->Add(fill1Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         7850  +  wxTextCtrl *fillColorCtrl =
         7851  +    new wxTextCtrl(panel, ID_SYMBOLIZER_EDGELINK_SEED_FILL_COLOR, FillColor,
         7852  +                   wxDefaultPosition, wxSize(80, 22));
         7853  +  fill1Sizer->Add(fillColorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7854  +  wxBitmap bmp;
         7855  +  wxColour color(0, 0, 0);
         7856  +  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
         7857  +  wxStaticBitmap *sampleFillCtrl =
         7858  +    new wxStaticBitmap(panel, ID_SYMBOLIZER_EDGELINK_SEED_FILL_PICKER_HEX, bmp,
         7859  +                       wxDefaultPosition, wxSize(32, 32));
         7860  +  fill1Sizer->Add(sampleFillCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7861  +  wxButton *pickFill =
         7862  +    new wxButton(panel, ID_SYMBOLIZER_EDGELINK_SEED_FILL_PICKER_BTN,
         7863  +                 wxT("&Pick a color"));
         7864  +  fill1Sizer->Add(pickFill, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7865  +// second row B: Stroke Color
         7866  +  box3Sizer->AddSpacer(30);
         7867  +  wxStaticBox *colorStrokeBox = new wxStaticBox(panel, wxID_STATIC,
         7868  +                                                wxT("Stroke Color"),
         7869  +                                                wxDefaultPosition,
         7870  +                                                wxDefaultSize);
         7871  +  wxBoxSizer *colorStrokeSizer =
         7872  +    new wxStaticBoxSizer(colorStrokeBox, wxVERTICAL);
         7873  +  box3Sizer->Add(colorStrokeSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         7874  +  wxBoxSizer *stroke1Sizer = new wxBoxSizer(wxHORIZONTAL);
         7875  +  colorStrokeSizer->Add(stroke1Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         7876  +  wxTextCtrl *strokeColorCtrl =
         7877  +    new wxTextCtrl(panel, ID_SYMBOLIZER_EDGELINK_SEED_STROKE_COLOR, StrokeColor,
         7878  +                   wxDefaultPosition, wxSize(80, 22));
         7879  +  stroke1Sizer->Add(strokeColorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7880  +  wxStaticBitmap *sampleStrokeCtrl =
         7881  +    new wxStaticBitmap(panel, ID_SYMBOLIZER_EDGELINK_SEED_STROKE_PICKER_HEX,
         7882  +                       bmp,
         7883  +                       wxDefaultPosition, wxSize(32, 32));
         7884  +  stroke1Sizer->Add(sampleStrokeCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7885  +  wxButton *pickStroke =
         7886  +    new wxButton(panel, ID_SYMBOLIZER_EDGELINK_SEED_STROKE_PICKER_BTN,
         7887  +                 wxT("&Pick a color"));
         7888  +  stroke1Sizer->Add(pickStroke, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         7889  +  panel->SetSizer(topSizer);
         7890  +  topSizer->Fit(panel);
         7891  +// appends event handlers
         7892  +  Connect(ID_SYMBOLIZER_EDGELINK_SEED_MARK, wxEVT_COMMAND_RADIOBOX_SELECTED,
         7893  +          (wxObjectEventFunction) &
         7894  +          QuickStyleTopologyDialog::OnCmdEdgeLinkSeedMarkChanged);
         7895  +  Connect(ID_SYMBOLIZER_EDGELINK_SEED_FILL_PICKER_BTN,
         7896  +          wxEVT_COMMAND_BUTTON_CLICKED,
         7897  +          (wxObjectEventFunction) &
         7898  +          QuickStyleTopologyDialog::OnCmdEdgeLinkSeedColorFillPicker);
         7899  +  Connect(ID_SYMBOLIZER_EDGELINK_SEED_FILL_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
         7900  +          (wxObjectEventFunction) &
         7901  +          QuickStyleTopologyDialog::OnCmdEdgeLinkSeedColorFillChanged);
         7902  +  Connect(ID_SYMBOLIZER_EDGELINK_SEED_STROKE_PICKER_BTN,
         7903  +          wxEVT_COMMAND_BUTTON_CLICKED,
         7904  +          (wxObjectEventFunction) &
         7905  +          QuickStyleTopologyDialog::OnCmdEdgeLinkSeedColorStrokePicker);
         7906  +  Connect(ID_SYMBOLIZER_EDGELINK_SEED_STROKE_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
         7907  +          (wxObjectEventFunction) &
         7908  +          QuickStyleTopologyDialog::OnCmdEdgeLinkSeedColorStrokeChanged);
         7909  +  return panel;
         7910  +}
         7911  +
         7912  +void QuickStyleTopologyDialog::
         7913  +OnCmdEdgeLinkSeedMarkChanged(wxCommandEvent & WXUNUSED(event))
         7914  +{
         7915  +//
         7916  +// Mark selection changed
         7917  +//
         7918  +  wxRadioBox *markCtrl =
         7919  +    (wxRadioBox *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_MARK);
         7920  +  switch (markCtrl->GetSelection())
         7921  +    {
         7922  +      case 1:
         7923  +        Style->SetEdgeLinkSeedWellKnownMark(RL2_GRAPHIC_MARK_CIRCLE);
         7924  +        break;
         7925  +      case 2:
         7926  +        Style->SetEdgeLinkSeedWellKnownMark(RL2_GRAPHIC_MARK_TRIANGLE);
         7927  +        break;
         7928  +      case 3:
         7929  +        Style->SetEdgeLinkSeedWellKnownMark(RL2_GRAPHIC_MARK_STAR);
         7930  +        break;
         7931  +      case 4:
         7932  +        Style->SetEdgeLinkSeedWellKnownMark(RL2_GRAPHIC_MARK_CROSS);
         7933  +        break;
         7934  +      case 5:
         7935  +        Style->SetEdgeLinkSeedWellKnownMark(RL2_GRAPHIC_MARK_X);
         7936  +        break;
         7937  +      default:
         7938  +        Style->SetEdgeLinkSeedWellKnownMark(RL2_GRAPHIC_MARK_SQUARE);
         7939  +        break;
         7940  +    };
         7941  +}
         7942  +
         7943  +void QuickStyleTopologyDialog::
         7944  +OnCmdEdgeLinkSeedColorFillChanged(wxCommandEvent & WXUNUSED(event))
         7945  +{
         7946  +//
         7947  +// Fill color changed: updating the visual sample
         7948  +//
         7949  +  wxTextCtrl *colorCtrl =
         7950  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_FILL_COLOR);
         7951  +  wxStaticBitmap *sampleCtrl =
         7952  +    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_FILL_PICKER_HEX);
         7953  +  wxColour back = wxColour(255, 255, 255);
         7954  +  wxString str = colorCtrl->GetValue();
         7955  +  if (ColorMapEntry::IsValidColor(str) == true)
         7956  +    ColorMapEntry::GetWxColor(str, back);
         7957  +  wxBitmap bmp;
         7958  +  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
         7959  +  sampleCtrl->SetBitmap(bmp);
         7960  +  sampleCtrl->Refresh();
         7961  +  sampleCtrl->Update();
         7962  +}
         7963  +
         7964  +void QuickStyleTopologyDialog::
         7965  +OnCmdEdgeLinkSeedColorFillPicker(wxCommandEvent & WXUNUSED(event))
         7966  +{
         7967  +//
         7968  +// color picker
         7969  +//
         7970  +  wxTextCtrl *colorCtrl =
         7971  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_FILL_COLOR);
         7972  +  wxColour clr = wxNullColour;
         7973  +  wxString str = colorCtrl->GetValue();
         7974  +  if (ColorMapEntry::IsValidColor(str) == true)
         7975  +    ColorMapEntry::GetWxColor(str, clr);
         7976  +  wxColour color = wxGetColourFromUser(this, clr);
         7977  +  if (color.IsOk() == true)
         7978  +    {
         7979  +      char hex[16];
         7980  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         7981  +      wxString str = wxString::FromUTF8(hex);
         7982  +      colorCtrl->SetValue(str);
         7983  +    }
         7984  +}
         7985  +
         7986  +void QuickStyleTopologyDialog::
         7987  +OnCmdEdgeLinkSeedColorStrokeChanged(wxCommandEvent & WXUNUSED(event))
         7988  +{
         7989  +//
         7990  +// Stroke color changed: updating the visual sample
         7991  +//
         7992  +  wxTextCtrl *colorCtrl =
         7993  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_STROKE_COLOR);
         7994  +  wxStaticBitmap *sampleCtrl =
         7995  +    (wxStaticBitmap *)
         7996  +    FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_STROKE_PICKER_HEX);
         7997  +  wxColour back = wxColour(255, 255, 255);
         7998  +  wxString str = colorCtrl->GetValue();
         7999  +  if (ColorMapEntry::IsValidColor(str) == true)
         8000  +    ColorMapEntry::GetWxColor(str, back);
         8001  +  wxBitmap bmp;
         8002  +  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
         8003  +  sampleCtrl->SetBitmap(bmp);
         8004  +  sampleCtrl->Refresh();
         8005  +  sampleCtrl->Update();
         8006  +}
         8007  +
         8008  +void QuickStyleTopologyDialog::
         8009  +OnCmdEdgeLinkSeedColorStrokePicker(wxCommandEvent & WXUNUSED(event))
         8010  +{
         8011  +//
         8012  +// color picker
         8013  +//
         8014  +  wxTextCtrl *colorCtrl =
         8015  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_STROKE_COLOR);
         8016  +  wxColour clr = wxNullColour;
         8017  +  wxString str = colorCtrl->GetValue();
         8018  +  if (ColorMapEntry::IsValidColor(str) == true)
         8019  +    ColorMapEntry::GetWxColor(str, clr);
         8020  +  wxColour color = wxGetColourFromUser(this, clr);
         8021  +  if (color.IsOk() == true)
         8022  +    {
         8023  +      char hex[16];
         8024  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         8025  +      wxString str = wxString::FromUTF8(hex);
         8026  +      colorCtrl->SetValue(str);
         8027  +    }
         8028  +}
         8029  +
         8030  +wxPanel *QuickStyleTopologyDialog::CreateFaceSeedPage(wxWindow * parent)
         8031  +{
         8032  +//
         8033  +// creating the FaceSeed Symbolizer page
         8034  +//
         8035  +  wxString StrokeColor = wxT("#000000");
         8036  +  wxString FillColor = wxT("#808080");
         8037  +  wxPanel *panel = new wxPanel(parent, ID_PANE_POINT);
         8038  +  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
         8039  +  panel->SetSizer(topSizer);
         8040  +  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
         8041  +  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
         8042  +// first row A: Opacity 
         8043  +  wxBoxSizer *opacityBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         8044  +  boxSizer->Add(opacityBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         8045  +  wxStaticBox *opacityBox = new wxStaticBox(panel, wxID_STATIC,
         8046  +                                            wxT("Opacity"),
         8047  +                                            wxDefaultPosition,
         8048  +                                            wxDefaultSize);
         8049  +  wxBoxSizer *opacitySizer = new wxStaticBoxSizer(opacityBox, wxVERTICAL);
         8050  +  opacityBoxSizer->Add(opacitySizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         8051  +  wxSlider *opacityCtrl =
         8052  +    new wxSlider(panel, ID_SYMBOLIZER_FACE_SEED_OPACITY, 100, 0, 100,
         8053  +                 wxDefaultPosition, wxSize(600, 45),
         8054  +                 wxSL_HORIZONTAL | wxSL_LABELS);
         8055  +  opacitySizer->Add(opacityCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         8056  +// Well Known Mark Name
         8057  +  wxBoxSizer *box1Sizer = new wxBoxSizer(wxHORIZONTAL);
         8058  +  boxSizer->Add(box1Sizer, 0, wxALIGN_CENTER | wxALL, 5);
         8059  +  wxBoxSizer *markSizer = new wxBoxSizer(wxHORIZONTAL);
         8060  +  box1Sizer->Add(markSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         8061  +  wxString mark[6];
         8062  +  mark[0] = wxT("&Square");
         8063  +  mark[1] = wxT("&Circle");
         8064  +  mark[2] = wxT("&Triangle");
         8065  +  mark[3] = wxT("&Star");
         8066  +  mark[4] = wxT("&Cross");
         8067  +  mark[5] = wxT("&X");
         8068  +  wxRadioBox *markBox = new wxRadioBox(panel, ID_SYMBOLIZER_FACE_SEED_MARK,
         8069  +                                       wxT("&Mark"),
         8070  +                                       wxDefaultPosition,
         8071  +                                       wxDefaultSize, 6,
         8072  +                                       mark, 1,
         8073  +                                       wxRA_SPECIFY_COLS);
         8074  +  markSizer->Add(markBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         8075  +  markBox->SetSelection(0);
         8076  +// second row: Size and Rotation
         8077  +  wxBoxSizer *box2Sizer = new wxBoxSizer(wxVERTICAL);
         8078  +  box1Sizer->Add(box2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         8079  +  wxBoxSizer *sizeBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         8080  +  box2Sizer->Add(sizeBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         8081  +// second row A: Size
         8082  +  wxStaticBox *sizeBox = new wxStaticBox(panel, wxID_STATIC,
         8083  +                                         wxT("Size"),
         8084  +                                         wxDefaultPosition,
         8085  +                                         wxDefaultSize);
         8086  +  wxBoxSizer *sizeSizer = new wxStaticBoxSizer(sizeBox, wxVERTICAL);
         8087  +  sizeBoxSizer->Add(sizeSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
         8088  +  wxBoxSizer *size1Sizer = new wxBoxSizer(wxHORIZONTAL);
         8089  +  sizeSizer->Add(size1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         8090  +  wxTextCtrl *sizeCtrl =
         8091  +    new wxTextCtrl(panel, ID_SYMBOLIZER_FACE_SEED_SIZE, wxT("16.0"),
         8092  +                   wxDefaultPosition, wxSize(100, 22));
         8093  +  size1Sizer->Add(sizeCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         8094  +// second row B: Rotation
         8095  +  wxStaticBox *rotBox = new wxStaticBox(panel, wxID_STATIC,
         8096  +                                        wxT("Rotation"),
         8097  +                                        wxDefaultPosition,
         8098  +                                        wxDefaultSize);
         8099  +  wxBoxSizer *rotSizer = new wxStaticBoxSizer(rotBox, wxVERTICAL);
         8100  +  sizeBoxSizer->Add(rotSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
         8101  +  wxBoxSizer *rot1Sizer = new wxBoxSizer(wxHORIZONTAL);
         8102  +  rotSizer->Add(rot1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         8103  +  wxTextCtrl *rotCtrl =
         8104  +    new wxTextCtrl(panel, ID_SYMBOLIZER_FACE_SEED_ROTATION, wxT("0.0"),
         8105  +                   wxDefaultPosition, wxSize(100, 22));
         8106  +  rot1Sizer->Add(rotCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         8107  +// third row: AnchorFaceSeed and Displacement
         8108  +  wxBoxSizer *anchorBoxSizer = new wxBoxSizer(wxHORIZONTAL);
         8109  +  box2Sizer->Add(anchorBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         8110  +// third row A: Anchor FaceSeed
         8111  +  wxStaticBox *anchorBox = new wxStaticBox(panel, wxID_STATIC,
         8112  +                                           wxT("Anchor FaceSeed"),
         8113  +                                           wxDefaultPosition,
         8114  +                                           wxDefaultSize);
         8115  +  wxBoxSizer *anchorSizer = new wxStaticBoxSizer(anchorBox, wxVERTICAL);
         8116  +  anchorBoxSizer->Add(anchorSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
         8117  +  wxBoxSizer *anchor1Sizer = new wxBoxSizer(wxHORIZONTAL);
         8118  +  anchorSizer->Add(anchor1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         8119  +  wxStaticText *anchor1Label = new wxStaticText(panel, wxID_STATIC, wxT("X"));
         8120  +  anchor1Sizer->Add(anchor1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         8121  +  wxTextCtrl *anchorXCtrl =
         8122  +    new wxTextCtrl(panel, ID_SYMBOLIZER_FACE_SEED_ANCHOR_X, wxT("0.5"),
         8123  +                   wxDefaultPosition, wxSize(100, 22));
         8124  +  anchor1Sizer->Add(anchorXCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         8125  +  wxBoxSizer *anchor2Sizer = new wxBoxSizer(wxHORIZONTAL);
         8126  +  anchorSizer->Add(anchor2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         8127  +  wxStaticText *anchor2Label = new wxStaticText(panel, wxID_STATIC, wxT("Y"));
         8128  +  anchor2Sizer->Add(anchor2Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         8129  +  wxTextCtrl *anchorYCtrl =
         8130  +    new wxTextCtrl(panel, ID_SYMBOLIZER_FACE_SEED_ANCHOR_Y, wxT("0.5"),
         8131  +                   wxDefaultPosition, wxSize(100, 22));
         8132  +  anchor2Sizer->Add(anchorYCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         8133  +// third row B: Displacement
         8134  +  wxStaticBox *displacementBox = new wxStaticBox(panel, wxID_STATIC,
         8135  +                                                 wxT("Displacement"),
         8136  +                                                 wxDefaultPosition,
         8137  +                                                 wxDefaultSize);
         8138  +  wxBoxSizer *displacementSizer =
         8139  +    new wxStaticBoxSizer(displacementBox, wxVERTICAL);
         8140  +  anchorBoxSizer->Add(displacementSizer, 0,
         8141  +                      wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
         8142  +  wxBoxSizer *displ1Sizer = new wxBoxSizer(wxHORIZONTAL);
         8143  +  displacementSizer->Add(displ1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         8144  +  wxStaticText *displ1Label = new wxStaticText(panel, wxID_STATIC, wxT("X"));
         8145  +  displ1Sizer->Add(displ1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         8146  +  wxTextCtrl *displacementXCtrl =
         8147  +    new wxTextCtrl(panel, ID_SYMBOLIZER_FACE_SEED_DISPLACEMENT_X, wxT("0.0"),
         8148  +                   wxDefaultPosition, wxSize(100, 22));
         8149  +  displ1Sizer->Add(displacementXCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         8150  +  wxBoxSizer *displ2Sizer = new wxBoxSizer(wxHORIZONTAL);
         8151  +  displacementSizer->Add(displ2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         8152  +  wxStaticText *displ2Label = new wxStaticText(panel, wxID_STATIC, wxT("Y"));
         8153  +  displ2Sizer->Add(displ2Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         8154  +  wxTextCtrl *displacementYCtrl =
         8155  +    new wxTextCtrl(panel, ID_SYMBOLIZER_FACE_SEED_DISPLACEMENT_Y, wxT("0.0"),
         8156  +                   wxDefaultPosition, wxSize(100, 22));
         8157  +  displ2Sizer->Add(displacementYCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         8158  +// fourth row: colors
         8159  +  wxBoxSizer *box3Sizer = new wxBoxSizer(wxHORIZONTAL);
         8160  +  boxSizer->Add(box3Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         8161  +// first row A: Fill Color
         8162  +  wxBoxSizer *fillBoxSizer = new wxBoxSizer(wxVERTICAL);
         8163  +  box3Sizer->Add(fillBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         8164  +  wxStaticBox *colorFillBox = new wxStaticBox(panel, wxID_STATIC,
         8165  +                                              wxT("Fill Color"),
         8166  +                                              wxDefaultPosition,
         8167  +                                              wxDefaultSize);
         8168  +  wxBoxSizer *colorFillSizer = new wxStaticBoxSizer(colorFillBox, wxVERTICAL);
         8169  +  box3Sizer->Add(colorFillSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         8170  +  wxBoxSizer *fill1Sizer = new wxBoxSizer(wxHORIZONTAL);
         8171  +  colorFillSizer->Add(fill1Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         8172  +  wxTextCtrl *fillColorCtrl =
         8173  +    new wxTextCtrl(panel, ID_SYMBOLIZER_FACE_SEED_FILL_COLOR, FillColor,
         8174  +                   wxDefaultPosition, wxSize(80, 22));
         8175  +  fill1Sizer->Add(fillColorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         8176  +  wxBitmap bmp;
         8177  +  wxColour color(0, 0, 0);
         8178  +  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
         8179  +  wxStaticBitmap *sampleFillCtrl =
         8180  +    new wxStaticBitmap(panel, ID_SYMBOLIZER_FACE_SEED_FILL_PICKER_HEX, bmp,
         8181  +                       wxDefaultPosition, wxSize(32, 32));
         8182  +  fill1Sizer->Add(sampleFillCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         8183  +  wxButton *pickFill =
         8184  +    new wxButton(panel, ID_SYMBOLIZER_FACE_SEED_FILL_PICKER_BTN,
         8185  +                 wxT("&Pick a color"));
         8186  +  fill1Sizer->Add(pickFill, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         8187  +// second row B: Stroke Color
         8188  +  box3Sizer->AddSpacer(30);
         8189  +  wxStaticBox *colorStrokeBox = new wxStaticBox(panel, wxID_STATIC,
         8190  +                                                wxT("Stroke Color"),
         8191  +                                                wxDefaultPosition,
         8192  +                                                wxDefaultSize);
         8193  +  wxBoxSizer *colorStrokeSizer =
         8194  +    new wxStaticBoxSizer(colorStrokeBox, wxVERTICAL);
         8195  +  box3Sizer->Add(colorStrokeSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
         8196  +  wxBoxSizer *stroke1Sizer = new wxBoxSizer(wxHORIZONTAL);
         8197  +  colorStrokeSizer->Add(stroke1Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
         8198  +  wxTextCtrl *strokeColorCtrl =
         8199  +    new wxTextCtrl(panel, ID_SYMBOLIZER_FACE_SEED_STROKE_COLOR, StrokeColor,
         8200  +                   wxDefaultPosition, wxSize(80, 22));
         8201  +  stroke1Sizer->Add(strokeColorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         8202  +  wxStaticBitmap *sampleStrokeCtrl =
         8203  +    new wxStaticBitmap(panel, ID_SYMBOLIZER_FACE_SEED_STROKE_PICKER_HEX, bmp,
         8204  +                       wxDefaultPosition, wxSize(32, 32));
         8205  +  stroke1Sizer->Add(sampleStrokeCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         8206  +  wxButton *pickStroke =
         8207  +    new wxButton(panel, ID_SYMBOLIZER_FACE_SEED_STROKE_PICKER_BTN,
         8208  +                 wxT("&Pick a color"));
         8209  +  stroke1Sizer->Add(pickStroke, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         8210  +  panel->SetSizer(topSizer);
         8211  +  topSizer->Fit(panel);
         8212  +// appends event handlers
         8213  +  Connect(ID_SYMBOLIZER_FACE_SEED_MARK, wxEVT_COMMAND_RADIOBOX_SELECTED,
         8214  +          (wxObjectEventFunction) &
         8215  +          QuickStyleTopologyDialog::OnCmdFaceSeedMarkChanged);
         8216  +  Connect(ID_SYMBOLIZER_FACE_SEED_FILL_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
         8217  +          (wxObjectEventFunction) &
         8218  +          QuickStyleTopologyDialog::OnCmdFaceSeedColorFillPicker);
         8219  +  Connect(ID_SYMBOLIZER_FACE_SEED_FILL_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
         8220  +          (wxObjectEventFunction) &
         8221  +          QuickStyleTopologyDialog::OnCmdFaceSeedColorFillChanged);
         8222  +  Connect(ID_SYMBOLIZER_FACE_SEED_STROKE_PICKER_BTN,
         8223  +          wxEVT_COMMAND_BUTTON_CLICKED,
         8224  +          (wxObjectEventFunction) &
         8225  +          QuickStyleTopologyDialog::OnCmdFaceSeedColorStrokePicker);
         8226  +  Connect(ID_SYMBOLIZER_FACE_SEED_STROKE_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
         8227  +          (wxObjectEventFunction) &
         8228  +          QuickStyleTopologyDialog::OnCmdFaceSeedColorStrokeChanged);
         8229  +  return panel;
         8230  +}
         8231  +
         8232  +void QuickStyleTopologyDialog::
         8233  +OnCmdFaceSeedMarkChanged(wxCommandEvent & WXUNUSED(event))
         8234  +{
         8235  +//
         8236  +// Mark selection changed
         8237  +//
         8238  +  wxRadioBox *markCtrl =
         8239  +    (wxRadioBox *) FindWindow(ID_SYMBOLIZER_FACE_SEED_MARK);
         8240  +  switch (markCtrl->GetSelection())
         8241  +    {
         8242  +      case 1:
         8243  +        Style->SetFaceSeedWellKnownMark(RL2_GRAPHIC_MARK_CIRCLE);
         8244  +        break;
         8245  +      case 2:
         8246  +        Style->SetFaceSeedWellKnownMark(RL2_GRAPHIC_MARK_TRIANGLE);
         8247  +        break;
         8248  +      case 3:
         8249  +        Style->SetFaceSeedWellKnownMark(RL2_GRAPHIC_MARK_STAR);
         8250  +        break;
         8251  +      case 4:
         8252  +        Style->SetFaceSeedWellKnownMark(RL2_GRAPHIC_MARK_CROSS);
         8253  +        break;
         8254  +      case 5:
         8255  +        Style->SetFaceSeedWellKnownMark(RL2_GRAPHIC_MARK_X);
         8256  +        break;
         8257  +      default:
         8258  +        Style->SetFaceSeedWellKnownMark(RL2_GRAPHIC_MARK_SQUARE);
         8259  +        break;
         8260  +    };
         8261  +}
         8262  +
         8263  +void QuickStyleTopologyDialog::
         8264  +OnCmdFaceSeedColorFillChanged(wxCommandEvent & WXUNUSED(event))
         8265  +{
         8266  +//
         8267  +// Fill color changed: updating the visual sample
         8268  +//
         8269  +  wxTextCtrl *colorCtrl =
         8270  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_FILL_COLOR);
         8271  +  wxStaticBitmap *sampleCtrl =
         8272  +    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_FACE_SEED_FILL_PICKER_HEX);
         8273  +  wxColour back = wxColour(255, 255, 255);
         8274  +  wxString str = colorCtrl->GetValue();
         8275  +  if (ColorMapEntry::IsValidColor(str) == true)
         8276  +    ColorMapEntry::GetWxColor(str, back);
         8277  +  wxBitmap bmp;
         8278  +  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
         8279  +  sampleCtrl->SetBitmap(bmp);
         8280  +  sampleCtrl->Refresh();
         8281  +  sampleCtrl->Update();
         8282  +}
         8283  +
         8284  +void QuickStyleTopologyDialog::
         8285  +OnCmdFaceSeedColorFillPicker(wxCommandEvent & WXUNUSED(event))
         8286  +{
         8287  +//
         8288  +// color picker
         8289  +//
         8290  +  wxTextCtrl *colorCtrl =
         8291  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_FILL_COLOR);
         8292  +  wxColour clr = wxNullColour;
         8293  +  wxString str = colorCtrl->GetValue();
         8294  +  if (ColorMapEntry::IsValidColor(str) == true)
         8295  +    ColorMapEntry::GetWxColor(str, clr);
         8296  +  wxColour color = wxGetColourFromUser(this, clr);
         8297  +  if (color.IsOk() == true)
         8298  +    {
         8299  +      char hex[16];
         8300  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         8301  +      wxString str = wxString::FromUTF8(hex);
         8302  +      colorCtrl->SetValue(str);
         8303  +    }
         8304  +}
         8305  +
         8306  +void QuickStyleTopologyDialog::
         8307  +OnCmdFaceSeedColorStrokeChanged(wxCommandEvent & WXUNUSED(event))
         8308  +{
         8309  +//
         8310  +// Stroke color changed: updating the visual sample
         8311  +//
         8312  +  wxTextCtrl *colorCtrl =
         8313  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_STROKE_COLOR);
         8314  +  wxStaticBitmap *sampleCtrl =
         8315  +    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_FACE_SEED_STROKE_PICKER_HEX);
         8316  +  wxColour back = wxColour(255, 255, 255);
         8317  +  wxString str = colorCtrl->GetValue();
         8318  +  if (ColorMapEntry::IsValidColor(str) == true)
         8319  +    ColorMapEntry::GetWxColor(str, back);
         8320  +  wxBitmap bmp;
         8321  +  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
         8322  +  sampleCtrl->SetBitmap(bmp);
         8323  +  sampleCtrl->Refresh();
         8324  +  sampleCtrl->Update();
         8325  +}
         8326  +
         8327  +void QuickStyleTopologyDialog::
         8328  +OnCmdFaceSeedColorStrokePicker(wxCommandEvent & WXUNUSED(event))
         8329  +{
         8330  +//
         8331  +// color picker
         8332  +//
         8333  +  wxTextCtrl *colorCtrl =
         8334  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_STROKE_COLOR);
         8335  +  wxColour clr = wxNullColour;
         8336  +  wxString str = colorCtrl->GetValue();
         8337  +  if (ColorMapEntry::IsValidColor(str) == true)
         8338  +    ColorMapEntry::GetWxColor(str, clr);
         8339  +  wxColour color = wxGetColourFromUser(this, clr);
         8340  +  if (color.IsOk() == true)
         8341  +    {
         8342  +      char hex[16];
         8343  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         8344  +      wxString str = wxString::FromUTF8(hex);
         8345  +      colorCtrl->SetValue(str);
         8346  +    }
         8347  +}
         8348  +
         8349  +
         8350  +
         8351  +
         8352  +
         8353  +bool QuickStyleTopologyDialog::RetrieveMainPage()
         8354  +{
         8355  +//
         8356  +// retrieving params from the MAIN page
         8357  +//
         8358  +  double min = Style->GetScaleMin();
         8359  +  double max = Style->GetScaleMax();
         8360  +  if (Style->IsMinScaleEnabled() == true)
         8361  +    {
         8362  +      wxTextCtrl *minCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MIN_SCALE);
         8363  +      wxString value = minCtrl->GetValue();
         8364  +      if (value.ToDouble(&min) != true)
         8365  +        {
         8366  +          wxMessageBox(wxT
         8367  +                       ("MIN_SCALE isn't a valid decimal number !!!"),
         8368  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8369  +          return false;
         8370  +        }
         8371  +      if (min < 0.0)
         8372  +        {
         8373  +          wxMessageBox(wxT
         8374  +                       ("MIN_SCALE must be a positive number !!!"),
         8375  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8376  +          return false;
         8377  +        }
         8378  +    }
         8379  +  if (Style->IsMaxScaleEnabled() == true)
         8380  +    {
         8381  +      wxTextCtrl *maxCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MAX_SCALE);
         8382  +      wxString value = maxCtrl->GetValue();
         8383  +      if (value.ToDouble(&max) != true)
         8384  +        {
         8385  +          wxMessageBox(wxT
         8386  +                       ("MAX_SCALE isn't a valid decimal number !!!"),
         8387  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8388  +          return false;
         8389  +        }
         8390  +      if (max < 0.0)
         8391  +        {
         8392  +          wxMessageBox(wxT
         8393  +                       ("MAX_SCALE must be a positive number !!!"),
         8394  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8395  +          return false;
         8396  +        }
         8397  +    }
         8398  +  if (Style->IsMinScaleEnabled() == true && Style->IsMaxScaleEnabled() == true)
         8399  +    {
         8400  +      if (min >= max)
         8401  +        {
         8402  +          wxMessageBox(wxT
         8403  +                       ("MAX_SCALE is always expected to be greater than MIN_SCALE !!!"),
         8404  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8405  +          return false;
         8406  +        }
         8407  +    }
         8408  +  Style->SetScaleMin(min);
         8409  +  Style->SetScaleMax(max);
         8410  +  return true;
         8411  +}
         8412  +
         8413  +void QuickStyleTopologyDialog::UpdateMainPage()
         8414  +{
         8415  +//
         8416  +// updating the MAIN page
         8417  +//
         8418  +  wxRadioBox *rangeBox = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_MINMAX_SCALE);
         8419  +  if (Style->IsMinScaleEnabled() != true && Style->IsMaxScaleEnabled() != true)
         8420  +    rangeBox->SetSelection(0);
         8421  +  else if (Style->IsMinScaleEnabled() == true
         8422  +           && Style->IsMaxScaleEnabled() != true)
         8423  +    rangeBox->SetSelection(1);
         8424  +  else if (Style->IsMinScaleEnabled() != true
         8425  +           && Style->IsMaxScaleEnabled() == true)
         8426  +    rangeBox->SetSelection(2);
         8427  +  else
         8428  +    rangeBox->SetSelection(3);
         8429  +  wxTextCtrl *minCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MIN_SCALE);
         8430  +  char dummy[64];
         8431  +  wxString str;
         8432  +  if (Style->IsMinScaleEnabled() == true)
         8433  +    {
         8434  +      sprintf(dummy, "%1.2f", Style->GetScaleMin());
         8435  +      str = wxString::FromUTF8(dummy);
         8436  +      minCtrl->SetValue(str);
         8437  +      minCtrl->Enable(true);
         8438  +  } else
         8439  +    {
         8440  +      str = wxT("0.0");
         8441  +      minCtrl->SetValue(str);
         8442  +      minCtrl->Enable(false);
         8443  +    }
         8444  +  wxTextCtrl *maxCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MAX_SCALE);
         8445  +  if (Style->IsMaxScaleEnabled() == true)
         8446  +    {
         8447  +      sprintf(dummy, "%1.2f", Style->GetScaleMax());
         8448  +      str = wxString::FromUTF8(dummy);
         8449  +      maxCtrl->SetValue(str);
         8450  +      maxCtrl->Enable(true);
         8451  +  } else
         8452  +    {
         8453  +      str = wxT("+Infinite");
         8454  +      maxCtrl->SetValue(str);
         8455  +      maxCtrl->Enable(false);
         8456  +    }
         8457  +}
         8458  +
         8459  +bool QuickStyleTopologyDialog::RetrieveNodePage(bool check)
         8460  +{
         8461  +//
         8462  +// retrieving params from the Node Nodeizer page
         8463  +//
         8464  +  double opacity;
         8465  +  double size;
         8466  +  double rotation;
         8467  +  double anchorNodeX;
         8468  +  double anchorNodeY;
         8469  +  double displacementX;
         8470  +  double displacementY;
         8471  +  char fillColor[8];
         8472  +  char strokeColor[8];
         8473  +  wxSlider *opacityCtrl = (wxSlider *) FindWindow(ID_SYMBOLIZER_NODE_OPACITY);
         8474  +  opacity = opacityCtrl->GetValue() / 100.0;
         8475  +  wxTextCtrl *sizeCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_SIZE);
         8476  +  wxString value = sizeCtrl->GetValue();
         8477  +  if (value.ToDouble(&size) != true)
         8478  +    {
         8479  +      if (check == true)
         8480  +        {
         8481  +          wxMessageBox(wxT
         8482  +                       ("SIZE isn't a valid decimal number !!!"),
         8483  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8484  +          return false;
         8485  +        }
         8486  +    }
         8487  +  if (size < 0.0)
         8488  +    {
         8489  +      if (check == true)
         8490  +        {
         8491  +          wxMessageBox(wxT
         8492  +                       ("SIZE must be a positive number !!!"),
         8493  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8494  +          return false;
         8495  +        }
         8496  +    }
         8497  +  wxTextCtrl *rotationCtrl =
         8498  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_ROTATION);
         8499  +  value = rotationCtrl->GetValue();
         8500  +  if (value.ToDouble(&rotation) != true)
         8501  +    {
         8502  +      if (check == true)
         8503  +        {
         8504  +          wxMessageBox(wxT
         8505  +                       ("ROTATION isn't a valid decimal number !!!"),
         8506  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8507  +          return false;
         8508  +        }
         8509  +    }
         8510  +  wxTextCtrl *anchorXCtrl =
         8511  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_ANCHOR_X);
         8512  +  value = anchorXCtrl->GetValue();
         8513  +  if (value.ToDouble(&anchorNodeX) != true)
         8514  +    {
         8515  +      if (check == true)
         8516  +        {
         8517  +          wxMessageBox(wxT
         8518  +                       ("ANCHOR-POINT-X isn't a valid decimal number !!!"),
         8519  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8520  +          return false;
         8521  +        }
         8522  +    }
         8523  +  if (anchorNodeX < 0.0 || anchorNodeX > 1.0)
         8524  +    {
         8525  +      if (check == true)
         8526  +        {
         8527  +          wxMessageBox(wxT
         8528  +                       ("ANCHOR-POINT-X must be between 0.0 and 1.0 !!!"),
         8529  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8530  +          return false;
         8531  +        }
         8532  +    }
         8533  +  wxTextCtrl *anchorYCtrl =
         8534  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_ANCHOR_Y);
         8535  +  value = anchorYCtrl->GetValue();
         8536  +  if (value.ToDouble(&anchorNodeY) != true)
         8537  +    {
         8538  +      if (check == true)
         8539  +        {
         8540  +          wxMessageBox(wxT
         8541  +                       ("ANCHOR-POINT-Y isn't a valid decimal number !!!"),
         8542  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8543  +          return false;
         8544  +        }
         8545  +    }
         8546  +  if (anchorNodeY < 0.0 || anchorNodeY > 1.0)
         8547  +    {
         8548  +      if (check == true)
         8549  +        {
         8550  +          wxMessageBox(wxT
         8551  +                       ("ANCHOR-POINT-Y must be between 0.0 and 1.0 !!!"),
         8552  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8553  +          return false;
         8554  +        }
         8555  +    }
         8556  +  wxTextCtrl *displXCtrl =
         8557  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_DISPLACEMENT_X);
         8558  +  value = displXCtrl->GetValue();
         8559  +  if (value.ToDouble(&displacementX) != true)
         8560  +    {
         8561  +      if (check == true)
         8562  +        {
         8563  +          wxMessageBox(wxT
         8564  +                       ("DISPLACEMENT-X isn't a valid decimal number !!!"),
         8565  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8566  +          return false;
         8567  +        }
         8568  +    }
         8569  +  wxTextCtrl *displYCtrl =
         8570  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_DISPLACEMENT_Y);
         8571  +  value = displYCtrl->GetValue();
         8572  +  if (value.ToDouble(&displacementY) != true)
         8573  +    {
         8574  +      if (check == true)
         8575  +        {
         8576  +          wxMessageBox(wxT
         8577  +                       ("DISPLACEMENT-Y isn't a valid decimal number !!!"),
         8578  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8579  +          return false;
         8580  +        }
         8581  +    }
         8582  +  wxTextCtrl *colorCtrl =
         8583  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_FILL_COLOR);
         8584  +  wxString color = colorCtrl->GetValue();
         8585  +  if (ColorMapEntry::IsValidColor(color) != true)
         8586  +    {
         8587  +      if (check == true)
         8588  +        {
         8589  +          wxMessageBox(wxT
         8590  +                       ("FILL-COLOR isn't a valid HexRGB color !!!"),
         8591  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8592  +          return false;
         8593  +        }
         8594  +    }
         8595  +  strcpy(fillColor, color.ToUTF8());
         8596  +  colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_STROKE_COLOR);
         8597  +  color = colorCtrl->GetValue();
         8598  +  if (ColorMapEntry::IsValidColor(color) != true)
         8599  +    {
         8600  +      if (check == true)
         8601  +        {
         8602  +          wxMessageBox(wxT
         8603  +                       ("STROKE-COLOR isn't a valid HexRGB color !!!"),
         8604  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8605  +          return false;
         8606  +        }
         8607  +    }
         8608  +  strcpy(strokeColor, color.ToUTF8());
         8609  +  Style->SetNodeOpacity(opacity);
         8610  +  Style->SetNodeSize(size);
         8611  +  Style->SetNodeRotation(rotation);
         8612  +  Style->SetNodeAnchorX(anchorNodeX);
         8613  +  Style->SetNodeAnchorY(anchorNodeY);
         8614  +  Style->SetNodeDisplacementX(displacementX);
         8615  +  Style->SetNodeDisplacementY(displacementY);
         8616  +  Style->SetNodeFillColor(fillColor);
         8617  +  Style->SetNodeStrokeColor(strokeColor);
         8618  +  return true;
         8619  +}
         8620  +
         8621  +void QuickStyleTopologyDialog::UpdateNodePage()
         8622  +{
         8623  +//
         8624  +// updating the Node Nodeizer page
         8625  +//
         8626  +  wxSlider *opacityCtrl = (wxSlider *) FindWindow(ID_SYMBOLIZER_NODE_OPACITY);
         8627  +  opacityCtrl->SetValue(Style->GetNodeOpacity() * 100.0);
         8628  +  wxTextCtrl *sizeCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_SIZE);
         8629  +  char dummy[64];
         8630  +  sprintf(dummy, "%1.2f", Style->GetNodeSize());
         8631  +  wxString str = wxString::FromUTF8(dummy);
         8632  +  sizeCtrl->SetValue(str);
         8633  +  wxTextCtrl *rotationCtrl =
         8634  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_ROTATION);
         8635  +  sprintf(dummy, "%1.2f", Style->GetNodeRotation());
         8636  +  str = wxString::FromUTF8(dummy);
         8637  +  rotationCtrl->SetValue(str);
         8638  +  wxTextCtrl *anchorXCtrl =
         8639  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_ANCHOR_X);
         8640  +  sprintf(dummy, "%1.2f", Style->GetNodeAnchorX());
         8641  +  str = wxString::FromUTF8(dummy);
         8642  +  anchorXCtrl->SetValue(str);
         8643  +  wxTextCtrl *anchorYCtrl =
         8644  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_ANCHOR_Y);
         8645  +  sprintf(dummy, "%1.2f", Style->GetNodeAnchorY());
         8646  +  str = wxString::FromUTF8(dummy);
         8647  +  anchorYCtrl->SetValue(str);
         8648  +  wxTextCtrl *displXCtrl =
         8649  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_DISPLACEMENT_X);
         8650  +  sprintf(dummy, "%1.2f", Style->GetNodeDisplacementX());
         8651  +  str = wxString::FromUTF8(dummy);
         8652  +  displXCtrl->SetValue(str);
         8653  +  wxTextCtrl *displYCtrl =
         8654  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_DISPLACEMENT_Y);
         8655  +  sprintf(dummy, "%1.2f", Style->GetNodeDisplacementY());
         8656  +  str = wxString::FromUTF8(dummy);
         8657  +  displYCtrl->SetValue(str);
         8658  +  wxRadioBox *markCtrl = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_NODE_MARK);
         8659  +  switch (Style->GetNodeWellKnownMark())
         8660  +    {
         8661  +      case RL2_GRAPHIC_MARK_CIRCLE:
         8662  +        markCtrl->SetSelection(1);
         8663  +        break;
         8664  +      case RL2_GRAPHIC_MARK_TRIANGLE:
         8665  +        markCtrl->SetSelection(2);
         8666  +        break;
         8667  +      case RL2_GRAPHIC_MARK_STAR:
         8668  +        markCtrl->SetSelection(3);
         8669  +        break;
         8670  +      case RL2_GRAPHIC_MARK_CROSS:
         8671  +        markCtrl->SetSelection(4);
         8672  +        break;
         8673  +      case RL2_GRAPHIC_MARK_X:
         8674  +        markCtrl->SetSelection(5);
         8675  +        break;
         8676  +      default:
         8677  +        markCtrl->SetSelection(0);
         8678  +        break;
         8679  +    };
         8680  +  wxTextCtrl *colorFillCtrl =
         8681  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_FILL_COLOR);
         8682  +  wxString fillColor = wxString::FromUTF8(Style->GetNodeFillColor());
         8683  +  colorFillCtrl->SetValue(fillColor);
         8684  +  wxTextCtrl *colorStrokeCtrl =
         8685  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_STROKE_COLOR);
         8686  +  wxString strokeColor = wxString::FromUTF8(Style->GetNodeStrokeColor());
         8687  +  colorStrokeCtrl->SetValue(strokeColor);
         8688  +}
         8689  +
         8690  +bool QuickStyleTopologyDialog::RetrieveEdgeLinkPage(bool check)
         8691  +{
         8692  +//
         8693  +// retrieving params from the EdgeLink Symbolizer page
         8694  +//
         8695  +  double opacity;
         8696  +  double perpendicularOffset;
         8697  +  char strokeColor[8];
         8698  +  double strokeWidth;
         8699  +  wxSlider *opacityCtrl =
         8700  +    (wxSlider *) FindWindow(ID_SYMBOLIZER_STROKE1_OPACITY);
         8701  +  opacity = opacityCtrl->GetValue() / 100.0;
         8702  +  wxTextCtrl *perpCtrl =
         8703  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_PERPENDICULAR);
         8704  +  wxString value = perpCtrl->GetValue();
         8705  +  if (value.ToDouble(&perpendicularOffset) != true)
         8706  +    {
         8707  +      if (check == true)
         8708  +        {
         8709  +          wxMessageBox(wxT
         8710  +                       ("PERPENDICULAR-OFFSET isn't a valid decimal number !!!"),
         8711  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8712  +          return false;
         8713  +        }
         8714  +    }
         8715  +  wxTextCtrl *colorCtrl =
         8716  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_COLOR);
         8717  +  wxString color = colorCtrl->GetValue();
         8718  +  if (ColorMapEntry::IsValidColor(color) != true)
         8719  +    {
         8720  +      if (check == true)
         8721  +        {
         8722  +          wxMessageBox(wxT
         8723  +                       ("STROKE-COLOR isn't a valid HexRGB color !!!"),
         8724  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8725  +          return false;
         8726  +        }
         8727  +    }
         8728  +  strcpy(strokeColor, color.ToUTF8());
         8729  +  wxTextCtrl *widthCtrl =
         8730  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_WIDTH);
         8731  +  value = widthCtrl->GetValue();
         8732  +  if (value.ToDouble(&strokeWidth) != true)
         8733  +    {
         8734  +      if (check == true)
         8735  +        {
         8736  +          wxMessageBox(wxT
         8737  +                       ("STROKE-WIDTH isn't a valid decimal number !!!"),
         8738  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8739  +          return false;
         8740  +        }
         8741  +    }
         8742  +  if (strokeWidth <= 0.0)
         8743  +    {
         8744  +      if (check == true)
         8745  +        {
         8746  +          wxMessageBox(wxT
         8747  +                       ("STROKE-WIDTH must be a positive number !!!"),
         8748  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8749  +          return false;
         8750  +        }
         8751  +    }
         8752  +  wxRadioBox *dotCtrl = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_DASH_DOT);
         8753  +  switch (dotCtrl->GetSelection())
         8754  +    {
         8755  +      case 1:
         8756  +        Style->SetEdgeLinkDotStyle(QUICK_STYLE_DOT_LINE);
         8757  +        break;
         8758  +      case 2:
         8759  +        Style->SetEdgeLinkDotStyle(QUICK_STYLE_DASH_LINE);
         8760  +        break;
         8761  +      case 3:
         8762  +        Style->SetEdgeLinkDotStyle(QUICK_STYLE_DASH_DOT_LINE);
         8763  +        break;
         8764  +      default:
         8765  +        Style->SetEdgeLinkDotStyle(QUICK_STYLE_SOLID_LINE);
         8766  +        break;
         8767  +    };
         8768  +  Style->SetEdgeLinkOpacity(opacity);
         8769  +  Style->SetEdgeLinkPerpendicularOffset(perpendicularOffset);
         8770  +  Style->SetEdgeLinkStrokeWidth(strokeWidth);
         8771  +  Style->SetEdgeLinkStrokeColor(strokeColor);
         8772  +  return true;
         8773  +}
         8774  +
         8775  +void QuickStyleTopologyDialog::UpdateEdgeLinkPage()
         8776  +{
         8777  +//
         8778  +// updating the EdgeLink Symbolizer page
         8779  +//
         8780  +  wxSlider *opacityCtrl =
         8781  +    (wxSlider *) FindWindow(ID_SYMBOLIZER_STROKE1_OPACITY);
         8782  +  opacityCtrl->SetValue(Style->GetEdgeLinkOpacity() * 100.0);
         8783  +  wxTextCtrl *perpCtrl =
         8784  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_PERPENDICULAR);
         8785  +  char dummy[64];
         8786  +  sprintf(dummy, "%1.2f", Style->GetEdgeLinkPerpendicularOffset());
         8787  +  wxString str = wxString::FromUTF8(dummy);
         8788  +  perpCtrl->SetValue(str);
         8789  +  wxTextCtrl *colorCtrl =
         8790  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_COLOR);
         8791  +  wxButton *pick = (wxButton *) FindWindow(ID_SYMBOLIZER_STROKE1_PICKER_BTN);
         8792  +  colorCtrl->Enable(true);
         8793  +  pick->Enable(true);
         8794  +  wxString strokeColor = wxString::FromUTF8(Style->GetEdgeLinkStrokeColor());
         8795  +  colorCtrl->SetValue(strokeColor);
         8796  +  wxTextCtrl *widthCtrl =
         8797  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_WIDTH);
         8798  +  sprintf(dummy, "%1.2f", Style->GetEdgeLinkStrokeWidth());
         8799  +  str = wxString::FromUTF8(dummy);
         8800  +  wxRadioBox *dotCtrl = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_DASH_DOT);
         8801  +  switch (Style->GetEdgeLinkDotStyle())
         8802  +    {
         8803  +      case QUICK_STYLE_DOT_LINE:
         8804  +        dotCtrl->SetSelection(1);
         8805  +        break;
         8806  +      case QUICK_STYLE_DASH_LINE:
         8807  +        dotCtrl->SetSelection(2);
         8808  +        break;
         8809  +      case QUICK_STYLE_DASH_DOT_LINE:
         8810  +        dotCtrl->SetSelection(3);
         8811  +        break;
         8812  +      default:
         8813  +        dotCtrl->SetSelection(0);
         8814  +        break;
         8815  +    };
         8816  +  widthCtrl->SetValue(str);
         8817  +}
         8818  +
         8819  +bool QuickStyleTopologyDialog::RetrieveFacePage(bool check)
         8820  +{
         8821  +//
         8822  +// retrieving params from the Face Synbolizer page
         8823  +//
         8824  +  double fillOpacity;
         8825  +  double displacementX;
         8826  +  double displacementY;
         8827  +  double perpendicularOffset;
         8828  +  char fillColor[8];
         8829  +  wxSlider *opacityCtrl = (wxSlider *) FindWindow(ID_SYMBOLIZER_FILL2_OPACITY);
         8830  +  fillOpacity = opacityCtrl->GetValue() / 100.0;
         8831  +  wxTextCtrl *displXCtrl =
         8832  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_POLYGON1_DISPLACEMENT_X);
         8833  +  wxString value = displXCtrl->GetValue();
         8834  +  if (Style->IsFaceFill() != true && Style->IsFaceStroke() != true)
         8835  +    {
         8836  +      if (check == true)
         8837  +        {
         8838  +          wxMessageBox(wxT
         8839  +                       ("You can't disable both FILL and STROKE at the same time !!!"),
         8840  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8841  +          return false;
         8842  +        }
         8843  +    }
         8844  +  if (value.ToDouble(&displacementX) != true)
         8845  +    {
         8846  +      if (check == true)
         8847  +        {
         8848  +          wxMessageBox(wxT
         8849  +                       ("DISPLACEMENT-X isn't a valid decimal number !!!"),
         8850  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8851  +          return false;
         8852  +        }
         8853  +    }
         8854  +  wxTextCtrl *displYCtrl =
         8855  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_POLYGON1_DISPLACEMENT_Y);
         8856  +  value = displYCtrl->GetValue();
         8857  +  if (value.ToDouble(&displacementY) != true)
         8858  +    {
         8859  +      if (check == true)
         8860  +        {
         8861  +          wxMessageBox(wxT
         8862  +                       ("DISPLACEMENT-Y isn't a valid decimal number !!!"),
         8863  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8864  +          return false;
         8865  +        }
         8866  +    }
         8867  +  wxTextCtrl *perpCtrl =
         8868  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_POLYGON1_PERPENDICULAR);
         8869  +  value = perpCtrl->GetValue();
         8870  +  if (value.ToDouble(&perpendicularOffset) != true)
         8871  +    {
         8872  +      if (check == true)
         8873  +        {
         8874  +          wxMessageBox(wxT
         8875  +                       ("PERPENDICULAR-OFFSET isn't a valid decimal number !!!"),
         8876  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8877  +          return false;
         8878  +        }
         8879  +    }
         8880  +  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FILL2_COLOR);
         8881  +  wxString color = colorCtrl->GetValue();
         8882  +  if (ColorMapEntry::IsValidColor(color) != true)
         8883  +    {
         8884  +      if (check == true)
         8885  +        {
         8886  +          wxMessageBox(wxT
         8887  +                       ("FILL-COLOR isn't a valid HexRGB color !!!"),
         8888  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8889  +          return false;
         8890  +        }
         8891  +    }
         8892  +  strcpy(fillColor, color.ToUTF8());
         8893  +  Style->SetFaceFillOpacity(fillOpacity);
         8894  +  Style->SetFaceDisplacementX(displacementX);
         8895  +  Style->SetFaceDisplacementY(displacementY);
         8896  +  Style->SetFacePerpendicularOffset(perpendicularOffset);
         8897  +  Style->SetFaceFillColor(fillColor);
         8898  +  return true;
         8899  +}
         8900  +
         8901  +void QuickStyleTopologyDialog::UpdateFacePage()
         8902  +{
         8903  +//
         8904  +// updating the Face Symbolizer page
         8905  +//
         8906  +  wxCheckBox *enableBox = (wxCheckBox *) FindWindow(ID_SYMBOLIZER_FILL2_ENABLE);
         8907  +  enableBox->SetValue(Style->IsFaceFill());
         8908  +  wxTextCtrl *displXCtrl =
         8909  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_POLYGON1_DISPLACEMENT_X);
         8910  +  char dummy[64];
         8911  +  sprintf(dummy, "%1.2f", Style->GetFaceDisplacementX());
         8912  +  wxString str = wxString::FromUTF8(dummy);
         8913  +  displXCtrl->SetValue(str);
         8914  +  wxTextCtrl *displYCtrl =
         8915  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_POLYGON1_DISPLACEMENT_Y);
         8916  +  sprintf(dummy, "%1.2f", Style->GetFaceDisplacementY());
         8917  +  str = wxString::FromUTF8(dummy);
         8918  +  displYCtrl->SetValue(str);
         8919  +  wxTextCtrl *perpCtrl =
         8920  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_POLYGON1_PERPENDICULAR);
         8921  +  sprintf(dummy, "%1.2f", Style->GetFacePerpendicularOffset());
         8922  +  str = wxString::FromUTF8(dummy);
         8923  +  perpCtrl->SetValue(str);
         8924  +  wxSlider *opacityCtrl = (wxSlider *) FindWindow(ID_SYMBOLIZER_FILL2_OPACITY);
         8925  +  opacityCtrl->SetValue(Style->GetFaceFillOpacity() * 100.0);
         8926  +  opacityCtrl->Enable(Style->IsFaceFill());
         8927  +  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FILL2_COLOR);
         8928  +  wxButton *pick = (wxButton *) FindWindow(ID_SYMBOLIZER_FILL2_PICKER_BTN);
         8929  +  wxColour color = wxNullColour;
         8930  +  str = wxString::FromUTF8(Style->GetFaceFillColor());
         8931  +  ColorMapEntry::GetWxColor(str, color);
         8932  +  if (color.IsOk() == true)
         8933  +    {
         8934  +      char hex[16];
         8935  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         8936  +      wxString str = wxString::FromUTF8(hex);
         8937  +      colorCtrl->SetValue(str);
         8938  +    }
         8939  +  colorCtrl->Enable(Style->IsFaceFill());
         8940  +  pick->Enable(Style->IsFaceFill());
         8941  +  wxSlider *opacity2Ctrl =
         8942  +    (wxSlider *) FindWindow(ID_SYMBOLIZER_STROKE2_OPACITY);
         8943  +  opacity2Ctrl->SetValue(Style->GetFaceStrokeOpacity() * 100.0);
         8944  +  opacity2Ctrl->Enable(Style->IsFaceStroke());
         8945  +  wxTextCtrl *color2Ctrl =
         8946  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE2_COLOR);
         8947  +  wxButton *pick2 = (wxButton *) FindWindow(ID_SYMBOLIZER_STROKE2_PICKER_BTN);
         8948  +  color = wxNullColour;
         8949  +  str = wxString::FromUTF8(Style->GetFaceStrokeColor());
         8950  +  ColorMapEntry::GetWxColor(str, color);
         8951  +  if (color.IsOk() == true)
         8952  +    {
         8953  +      char hex[16];
         8954  +      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
         8955  +      wxString str = wxString::FromUTF8(hex);
         8956  +      color2Ctrl->SetValue(str);
         8957  +    }
         8958  +  color2Ctrl->Enable(Style->IsFaceStroke());
         8959  +  pick2->Enable(Style->IsFaceStroke());
         8960  +  wxTextCtrl *widthCtrl =
         8961  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE2_WIDTH);
         8962  +  sprintf(dummy, "%1.2f", Style->GetFaceStrokeWidth());
         8963  +  str = wxString::FromUTF8(dummy);
         8964  +  widthCtrl->SetValue(str);
         8965  +  widthCtrl->Enable(Style->IsFaceStroke());
         8966  +}
         8967  +
         8968  +bool QuickStyleTopologyDialog::RetrieveEdgeLinkSeedPage(bool check)
         8969  +{
         8970  +//
         8971  +// retrieving params from the EdgeLinkSeed EdgeLinkSeedizer page
         8972  +//
         8973  +  double opacity;
         8974  +  double size;
         8975  +  double rotation;
         8976  +  double anchorEdgeLinkSeedX;
         8977  +  double anchorEdgeLinkSeedY;
         8978  +  double displacementX;
         8979  +  double displacementY;
         8980  +  char fillColor[8];
         8981  +  char strokeColor[8];
         8982  +  wxSlider *opacityCtrl =
         8983  +    (wxSlider *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_OPACITY);
         8984  +  opacity = opacityCtrl->GetValue() / 100.0;
         8985  +  wxTextCtrl *sizeCtrl =
         8986  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_SIZE);
         8987  +  wxString value = sizeCtrl->GetValue();
         8988  +  if (value.ToDouble(&size) != true)
         8989  +    {
         8990  +      if (check == true)
         8991  +        {
         8992  +          wxMessageBox(wxT
         8993  +                       ("SIZE isn't a valid decimal number !!!"),
         8994  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         8995  +          return false;
         8996  +        }
         8997  +    }
         8998  +  if (size < 0.0)
         8999  +    {
         9000  +      if (check == true)
         9001  +        {
         9002  +          wxMessageBox(wxT
         9003  +                       ("SIZE must be a positive number !!!"),
         9004  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         9005  +          return false;
         9006  +        }
         9007  +    }
         9008  +  wxTextCtrl *rotationCtrl =
         9009  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_ROTATION);
         9010  +  value = rotationCtrl->GetValue();
         9011  +  if (value.ToDouble(&rotation) != true)
         9012  +    {
         9013  +      if (check == true)
         9014  +        {
         9015  +          wxMessageBox(wxT
         9016  +                       ("ROTATION isn't a valid decimal number !!!"),
         9017  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         9018  +          return false;
         9019  +        }
         9020  +    }
         9021  +  wxTextCtrl *anchorXCtrl =
         9022  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_ANCHOR_X);
         9023  +  value = anchorXCtrl->GetValue();
         9024  +  if (value.ToDouble(&anchorEdgeLinkSeedX) != true)
         9025  +    {
         9026  +      if (check == true)
         9027  +        {
         9028  +          wxMessageBox(wxT
         9029  +                       ("ANCHOR-POINT-X isn't a valid decimal number !!!"),
         9030  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         9031  +          return false;
         9032  +        }
         9033  +    }
         9034  +  if (anchorEdgeLinkSeedX < 0.0 || anchorEdgeLinkSeedX > 1.0)
         9035  +    {
         9036  +      if (check == true)
         9037  +        {
         9038  +          wxMessageBox(wxT
         9039  +                       ("ANCHOR-POINT-X must be between 0.0 and 1.0 !!!"),
         9040  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         9041  +          return false;
         9042  +        }
         9043  +    }
         9044  +  wxTextCtrl *anchorYCtrl =
         9045  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_ANCHOR_Y);
         9046  +  value = anchorYCtrl->GetValue();
         9047  +  if (value.ToDouble(&anchorEdgeLinkSeedY) != true)
         9048  +    {
         9049  +      if (check == true)
         9050  +        {
         9051  +          wxMessageBox(wxT
         9052  +                       ("ANCHOR-POINT-Y isn't a valid decimal number !!!"),
         9053  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         9054  +          return false;
         9055  +        }
         9056  +    }
         9057  +  if (anchorEdgeLinkSeedY < 0.0 || anchorEdgeLinkSeedY > 1.0)
         9058  +    {
         9059  +      if (check == true)
         9060  +        {
         9061  +          wxMessageBox(wxT
         9062  +                       ("ANCHOR-POINT-Y must be between 0.0 and 1.0 !!!"),
         9063  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         9064  +          return false;
         9065  +        }
         9066  +    }
         9067  +  wxTextCtrl *displXCtrl =
         9068  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_DISPLACEMENT_X);
         9069  +  value = displXCtrl->GetValue();
         9070  +  if (value.ToDouble(&displacementX) != true)
         9071  +    {
         9072  +      if (check == true)
         9073  +        {
         9074  +          wxMessageBox(wxT
         9075  +                       ("DISPLACEMENT-X isn't a valid decimal number !!!"),
         9076  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         9077  +          return false;
         9078  +        }
         9079  +    }
         9080  +  wxTextCtrl *displYCtrl =
         9081  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_DISPLACEMENT_Y);
         9082  +  value = displYCtrl->GetValue();
         9083  +  if (value.ToDouble(&displacementY) != true)
         9084  +    {
         9085  +      if (check == true)
         9086  +        {
         9087  +          wxMessageBox(wxT
         9088  +                       ("DISPLACEMENT-Y isn't a valid decimal number !!!"),
         9089  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         9090  +          return false;
         9091  +        }
         9092  +    }
         9093  +  wxTextCtrl *colorCtrl =
         9094  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_FILL_COLOR);
         9095  +  wxString color = colorCtrl->GetValue();
         9096  +  if (ColorMapEntry::IsValidColor(color) != true)
         9097  +    {
         9098  +      if (check == true)
         9099  +        {
         9100  +          wxMessageBox(wxT
         9101  +                       ("FILL-COLOR isn't a valid HexRGB color !!!"),
         9102  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         9103  +          return false;
         9104  +        }
         9105  +    }
         9106  +  strcpy(fillColor, color.ToUTF8());
         9107  +  colorCtrl =
         9108  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_STROKE_COLOR);
         9109  +  color = colorCtrl->GetValue();
         9110  +  if (ColorMapEntry::IsValidColor(color) != true)
         9111  +    {
         9112  +      if (check == true)
         9113  +        {
         9114  +          wxMessageBox(wxT
         9115  +                       ("STROKE-COLOR isn't a valid HexRGB color !!!"),
         9116  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         9117  +          return false;
         9118  +        }
         9119  +    }
         9120  +  strcpy(strokeColor, color.ToUTF8());
         9121  +  Style->SetEdgeLinkSeedOpacity(opacity);
         9122  +  Style->SetEdgeLinkSeedSize(size);
         9123  +  Style->SetEdgeLinkSeedRotation(rotation);
         9124  +  Style->SetEdgeLinkSeedAnchorX(anchorEdgeLinkSeedX);
         9125  +  Style->SetEdgeLinkSeedAnchorY(anchorEdgeLinkSeedY);
         9126  +  Style->SetEdgeLinkSeedDisplacementX(displacementX);
         9127  +  Style->SetEdgeLinkSeedDisplacementY(displacementY);
         9128  +  Style->SetEdgeLinkSeedFillColor(fillColor);
         9129  +  Style->SetEdgeLinkSeedStrokeColor(strokeColor);
         9130  +  return true;
         9131  +}
         9132  +
         9133  +void QuickStyleTopologyDialog::UpdateEdgeLinkSeedPage()
         9134  +{
         9135  +//
         9136  +// updating the EdgeLinkSeed EdgeLinkSeedizer page
         9137  +//
         9138  +  wxSlider *opacityCtrl =
         9139  +    (wxSlider *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_OPACITY);
         9140  +  opacityCtrl->SetValue(Style->GetEdgeLinkSeedOpacity() * 100.0);
         9141  +  wxTextCtrl *sizeCtrl =
         9142  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_SIZE);
         9143  +  char dummy[64];
         9144  +  sprintf(dummy, "%1.2f", Style->GetEdgeLinkSeedSize());
         9145  +  wxString str = wxString::FromUTF8(dummy);
         9146  +  sizeCtrl->SetValue(str);
         9147  +  wxTextCtrl *rotationCtrl =
         9148  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_ROTATION);
         9149  +  sprintf(dummy, "%1.2f", Style->GetEdgeLinkSeedRotation());
         9150  +  str = wxString::FromUTF8(dummy);
         9151  +  rotationCtrl->SetValue(str);
         9152  +  wxTextCtrl *anchorXCtrl =
         9153  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_ANCHOR_X);
         9154  +  sprintf(dummy, "%1.2f", Style->GetEdgeLinkSeedAnchorX());
         9155  +  str = wxString::FromUTF8(dummy);
         9156  +  anchorXCtrl->SetValue(str);
         9157  +  wxTextCtrl *anchorYCtrl =
         9158  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_ANCHOR_Y);
         9159  +  sprintf(dummy, "%1.2f", Style->GetEdgeLinkSeedAnchorY());
         9160  +  str = wxString::FromUTF8(dummy);
         9161  +  anchorYCtrl->SetValue(str);
         9162  +  wxTextCtrl *displXCtrl =
         9163  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_DISPLACEMENT_X);
         9164  +  sprintf(dummy, "%1.2f", Style->GetEdgeLinkSeedDisplacementX());
         9165  +  str = wxString::FromUTF8(dummy);
         9166  +  displXCtrl->SetValue(str);
         9167  +  wxTextCtrl *displYCtrl =
         9168  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_DISPLACEMENT_Y);
         9169  +  sprintf(dummy, "%1.2f", Style->GetEdgeLinkSeedDisplacementY());
         9170  +  str = wxString::FromUTF8(dummy);
         9171  +  displYCtrl->SetValue(str);
         9172  +  wxRadioBox *markCtrl =
         9173  +    (wxRadioBox *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_MARK);
         9174  +  switch (Style->GetEdgeLinkSeedWellKnownMark())
         9175  +    {
         9176  +      case RL2_GRAPHIC_MARK_CIRCLE:
         9177  +        markCtrl->SetSelection(1);
         9178  +        break;
         9179  +      case RL2_GRAPHIC_MARK_TRIANGLE:
         9180  +        markCtrl->SetSelection(2);
         9181  +        break;
         9182  +      case RL2_GRAPHIC_MARK_STAR:
         9183  +        markCtrl->SetSelection(3);
         9184  +        break;
         9185  +      case RL2_GRAPHIC_MARK_CROSS:
         9186  +        markCtrl->SetSelection(4);
         9187  +        break;
         9188  +      case RL2_GRAPHIC_MARK_X:
         9189  +        markCtrl->SetSelection(5);
         9190  +        break;
         9191  +      default:
         9192  +        markCtrl->SetSelection(0);
         9193  +        break;
         9194  +    };
         9195  +  wxTextCtrl *colorFillCtrl =
         9196  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_FILL_COLOR);
         9197  +  wxString fillColor = wxString::FromUTF8(Style->GetEdgeLinkSeedFillColor());
         9198  +  colorFillCtrl->SetValue(fillColor);
         9199  +  wxTextCtrl *colorStrokeCtrl =
         9200  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_STROKE_COLOR);
         9201  +  wxString strokeColor =
         9202  +    wxString::FromUTF8(Style->GetEdgeLinkSeedStrokeColor());
         9203  +  colorStrokeCtrl->SetValue(strokeColor);
         9204  +}
         9205  +
         9206  +bool QuickStyleTopologyDialog::RetrieveFaceSeedPage(bool check)
         9207  +{
         9208  +//
         9209  +// retrieving params from the FaceSeed FaceSeedizer page
         9210  +//
         9211  +  double opacity;
         9212  +  double size;
         9213  +  double rotation;
         9214  +  double anchorFaceSeedX;
         9215  +  double anchorFaceSeedY;
         9216  +  double displacementX;
         9217  +  double displacementY;
         9218  +  char fillColor[8];
         9219  +  char strokeColor[8];
         9220  +  wxSlider *opacityCtrl =
         9221  +    (wxSlider *) FindWindow(ID_SYMBOLIZER_FACE_SEED_OPACITY);
         9222  +  opacity = opacityCtrl->GetValue() / 100.0;
         9223  +  wxTextCtrl *sizeCtrl =
         9224  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_SIZE);
         9225  +  wxString value = sizeCtrl->GetValue();
         9226  +  if (value.ToDouble(&size) != true)
         9227  +    {
         9228  +      if (check == true)
         9229  +        {
         9230  +          wxMessageBox(wxT
         9231  +                       ("SIZE isn't a valid decimal number !!!"),
         9232  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         9233  +          return false;
         9234  +        }
         9235  +    }
         9236  +  if (size < 0.0)
         9237  +    {
         9238  +      if (check == true)
         9239  +        {
         9240  +          wxMessageBox(wxT
         9241  +                       ("SIZE must be a positive number !!!"),
         9242  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         9243  +          return false;
         9244  +        }
         9245  +    }
         9246  +  wxTextCtrl *rotationCtrl =
         9247  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_ROTATION);
         9248  +  value = rotationCtrl->GetValue();
         9249  +  if (value.ToDouble(&rotation) != true)
         9250  +    {
         9251  +      if (check == true)
         9252  +        {
         9253  +          wxMessageBox(wxT
         9254  +                       ("ROTATION isn't a valid decimal number !!!"),
         9255  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         9256  +          return false;
         9257  +        }
         9258  +    }
         9259  +  wxTextCtrl *anchorXCtrl =
         9260  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_ANCHOR_X);
         9261  +  value = anchorXCtrl->GetValue();
         9262  +  if (value.ToDouble(&anchorFaceSeedX) != true)
         9263  +    {
         9264  +      if (check == true)
         9265  +        {
         9266  +          wxMessageBox(wxT
         9267  +                       ("ANCHOR-POINT-X isn't a valid decimal number !!!"),
         9268  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         9269  +          return false;
         9270  +        }
         9271  +    }
         9272  +  if (anchorFaceSeedX < 0.0 || anchorFaceSeedX > 1.0)
         9273  +    {
         9274  +      if (check == true)
         9275  +        {
         9276  +          wxMessageBox(wxT
         9277  +                       ("ANCHOR-POINT-X must be between 0.0 and 1.0 !!!"),
         9278  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         9279  +          return false;
         9280  +        }
         9281  +    }
         9282  +  wxTextCtrl *anchorYCtrl =
         9283  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_ANCHOR_Y);
         9284  +  value = anchorYCtrl->GetValue();
         9285  +  if (value.ToDouble(&anchorFaceSeedY) != true)
         9286  +    {
         9287  +      if (check == true)
         9288  +        {
         9289  +          wxMessageBox(wxT
         9290  +                       ("ANCHOR-POINT-Y isn't a valid decimal number !!!"),
         9291  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         9292  +          return false;
         9293  +        }
         9294  +    }
         9295  +  if (anchorFaceSeedY < 0.0 || anchorFaceSeedY > 1.0)
         9296  +    {
         9297  +      if (check == true)
         9298  +        {
         9299  +          wxMessageBox(wxT
         9300  +                       ("ANCHOR-POINT-Y must be between 0.0 and 1.0 !!!"),
         9301  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         9302  +          return false;
         9303  +        }
         9304  +    }
         9305  +  wxTextCtrl *displXCtrl =
         9306  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_DISPLACEMENT_X);
         9307  +  value = displXCtrl->GetValue();
         9308  +  if (value.ToDouble(&displacementX) != true)
         9309  +    {
         9310  +      if (check == true)
         9311  +        {
         9312  +          wxMessageBox(wxT
         9313  +                       ("DISPLACEMENT-X isn't a valid decimal number !!!"),
         9314  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         9315  +          return false;
         9316  +        }
         9317  +    }
         9318  +  wxTextCtrl *displYCtrl =
         9319  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_DISPLACEMENT_Y);
         9320  +  value = displYCtrl->GetValue();
         9321  +  if (value.ToDouble(&displacementY) != true)
         9322  +    {
         9323  +      if (check == true)
         9324  +        {
         9325  +          wxMessageBox(wxT
         9326  +                       ("DISPLACEMENT-Y isn't a valid decimal number !!!"),
         9327  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         9328  +          return false;
         9329  +        }
         9330  +    }
         9331  +  wxTextCtrl *colorCtrl =
         9332  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_FILL_COLOR);
         9333  +  wxString color = colorCtrl->GetValue();
         9334  +  if (ColorMapEntry::IsValidColor(color) != true)
         9335  +    {
         9336  +      if (check == true)
         9337  +        {
         9338  +          wxMessageBox(wxT
         9339  +                       ("FILL-COLOR isn't a valid HexRGB color !!!"),
         9340  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         9341  +          return false;
         9342  +        }
         9343  +    }
         9344  +  strcpy(fillColor, color.ToUTF8());
         9345  +  colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_STROKE_COLOR);
         9346  +  color = colorCtrl->GetValue();
         9347  +  if (ColorMapEntry::IsValidColor(color) != true)
         9348  +    {
         9349  +      if (check == true)
         9350  +        {
         9351  +          wxMessageBox(wxT
         9352  +                       ("STROKE-COLOR isn't a valid HexRGB color !!!"),
         9353  +                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
         9354  +          return false;
         9355  +        }
         9356  +    }
         9357  +  strcpy(strokeColor, color.ToUTF8());
         9358  +  Style->SetFaceSeedOpacity(opacity);
         9359  +  Style->SetFaceSeedSize(size);
         9360  +  Style->SetFaceSeedRotation(rotation);
         9361  +  Style->SetFaceSeedAnchorX(anchorFaceSeedX);
         9362  +  Style->SetFaceSeedAnchorY(anchorFaceSeedY);
         9363  +  Style->SetFaceSeedDisplacementX(displacementX);
         9364  +  Style->SetFaceSeedDisplacementY(displacementY);
         9365  +  Style->SetFaceSeedFillColor(fillColor);
         9366  +  Style->SetFaceSeedStrokeColor(strokeColor);
         9367  +  return true;
         9368  +}
         9369  +
         9370  +void QuickStyleTopologyDialog::UpdateFaceSeedPage()
         9371  +{
         9372  +//
         9373  +// updating the FaceSeed FaceSeedizer page
         9374  +//
         9375  +  wxSlider *opacityCtrl =
         9376  +    (wxSlider *) FindWindow(ID_SYMBOLIZER_FACE_SEED_OPACITY);
         9377  +  opacityCtrl->SetValue(Style->GetFaceSeedOpacity() * 100.0);
         9378  +  wxTextCtrl *sizeCtrl =
         9379  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_SIZE);
         9380  +  char dummy[64];
         9381  +  sprintf(dummy, "%1.2f", Style->GetFaceSeedSize());
         9382  +  wxString str = wxString::FromUTF8(dummy);
         9383  +  sizeCtrl->SetValue(str);
         9384  +  wxTextCtrl *rotationCtrl =
         9385  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_ROTATION);
         9386  +  sprintf(dummy, "%1.2f", Style->GetFaceSeedRotation());
         9387  +  str = wxString::FromUTF8(dummy);
         9388  +  rotationCtrl->SetValue(str);
         9389  +  wxTextCtrl *anchorXCtrl =
         9390  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_ANCHOR_X);
         9391  +  sprintf(dummy, "%1.2f", Style->GetFaceSeedAnchorX());
         9392  +  str = wxString::FromUTF8(dummy);
         9393  +  anchorXCtrl->SetValue(str);
         9394  +  wxTextCtrl *anchorYCtrl =
         9395  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_ANCHOR_Y);
         9396  +  sprintf(dummy, "%1.2f", Style->GetFaceSeedAnchorY());
         9397  +  str = wxString::FromUTF8(dummy);
         9398  +  anchorYCtrl->SetValue(str);
         9399  +  wxTextCtrl *displXCtrl =
         9400  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_DISPLACEMENT_X);
         9401  +  sprintf(dummy, "%1.2f", Style->GetFaceSeedDisplacementX());
         9402  +  str = wxString::FromUTF8(dummy);
         9403  +  displXCtrl->SetValue(str);
         9404  +  wxTextCtrl *displYCtrl =
         9405  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_DISPLACEMENT_Y);
         9406  +  sprintf(dummy, "%1.2f", Style->GetFaceSeedDisplacementY());
         9407  +  str = wxString::FromUTF8(dummy);
         9408  +  displYCtrl->SetValue(str);
         9409  +  wxRadioBox *markCtrl =
         9410  +    (wxRadioBox *) FindWindow(ID_SYMBOLIZER_FACE_SEED_MARK);
         9411  +  switch (Style->GetFaceSeedWellKnownMark())
         9412  +    {
         9413  +      case RL2_GRAPHIC_MARK_CIRCLE:
         9414  +        markCtrl->SetSelection(1);
         9415  +        break;
         9416  +      case RL2_GRAPHIC_MARK_TRIANGLE:
         9417  +        markCtrl->SetSelection(2);
         9418  +        break;
         9419  +      case RL2_GRAPHIC_MARK_STAR:
         9420  +        markCtrl->SetSelection(3);
         9421  +        break;
         9422  +      case RL2_GRAPHIC_MARK_CROSS:
         9423  +        markCtrl->SetSelection(4);
         9424  +        break;
         9425  +      case RL2_GRAPHIC_MARK_X:
         9426  +        markCtrl->SetSelection(5);
         9427  +        break;
         9428  +      default:
         9429  +        markCtrl->SetSelection(0);
         9430  +        break;
         9431  +    };
         9432  +  wxTextCtrl *colorFillCtrl =
         9433  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_FILL_COLOR);
         9434  +  wxString fillColor = wxString::FromUTF8(Style->GetFaceSeedFillColor());
         9435  +  colorFillCtrl->SetValue(fillColor);
         9436  +  wxTextCtrl *colorStrokeCtrl =
         9437  +    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_STROKE_COLOR);
         9438  +  wxString strokeColor = wxString::FromUTF8(Style->GetFaceSeedStrokeColor());
         9439  +  colorStrokeCtrl->SetValue(strokeColor);
         9440  +}
         9441  +
         9442  +void QuickStyleTopologyDialog::OnPageChanging(wxNotebookEvent & event)
         9443  +{
         9444  +//
         9445  +// TAB/PAGE selection changing
         9446  +//
         9447  +  bool ret = false;
         9448  +  int idx = event.GetOldSelection();
         9449  +  if (idx == 0)
         9450  +    ret = RetrieveMainPage();
         9451  +  else if (idx == 1)
         9452  +    ret = RetrieveNodePage();
         9453  +  else if (idx == 2)
         9454  +    ret = RetrieveEdgeLinkPage();
         9455  +  else
         9456  +    {
         9457  +      if (Type == MAP_LAYER_NETWORK)
         9458  +        {
         9459  +          if (idx == 3)
         9460  +            ret = RetrieveEdgeLinkSeedPage();
         9461  +      } else
         9462  +        {
         9463  +          if (idx == 3)
         9464  +            ret = RetrieveFacePage();
         9465  +          if (idx == 4)
         9466  +            ret = RetrieveEdgeLinkSeedPage();
         9467  +          if (idx == 5)
         9468  +            ret = RetrieveFaceSeedPage();
         9469  +        }
         9470  +    }
         9471  +  if (ret != true)
         9472  +    event.Veto();
         9473  +}
         9474  +
         9475  +void QuickStyleTopologyDialog::OnPageChanged(wxNotebookEvent & event)
         9476  +{
         9477  +//
         9478  +// TAB/PAGE selection changed
         9479  +//
         9480  +  int idx = event.GetSelection();
         9481  +  if (idx == 0)
         9482  +    UpdateMainPage();
         9483  +  else if (idx == 1)
         9484  +    UpdateNodePage();
         9485  +  else if (idx == 2)
         9486  +    UpdateEdgeLinkPage();
         9487  +  else
         9488  +    {
         9489  +      if (Type == MAP_LAYER_NETWORK)
         9490  +        {
         9491  +          if (idx == 3)
         9492  +            UpdateEdgeLinkSeedPage();
         9493  +      } else
         9494  +        {
         9495  +          if (idx == 3)
         9496  +            UpdateFacePage();
         9497  +          if (idx == 4)
         9498  +            UpdateEdgeLinkSeedPage();
         9499  +          if (idx == 5)
         9500  +            UpdateFaceSeedPage();
         9501  +        }
         9502  +    }
         9503  +}
         9504  +
         9505  +bool QuickStyleTopologyDialog::UpdateStyle()
         9506  +{
         9507  +//
         9508  +// updating the QuickStyle
         9509  +//
         9510  +  bool ret = false;
         9511  +  int idx = GetBookCtrl()->GetSelection();
         9512  +  if (idx == 0)
         9513  +    ret = RetrieveMainPage();
         9514  +  else if (idx == 1)
         9515  +    ret = RetrieveNodePage();
         9516  +  else if (idx == 2)
         9517  +    ret = RetrieveEdgeLinkPage();
         9518  +  else
         9519  +    {
         9520  +      if (Type == MAP_LAYER_NETWORK)
         9521  +        {
         9522  +          if (idx == 3)
         9523  +            ret = RetrieveEdgeLinkSeedPage();
         9524  +      } else
         9525  +        {
         9526  +          if (idx == 3)
         9527  +            ret = RetrieveFacePage();
         9528  +          if (idx == 4)
         9529  +            ret = RetrieveEdgeLinkSeedPage();
         9530  +          if (idx == 5)
         9531  +            ret = RetrieveFaceSeedPage();
         9532  +        }
         9533  +    }
         9534  +  if (ret == false)
         9535  +    return false;
         9536  +
         9537  +  VectorLayerConfig *config = Layer->GetVectorConfig();
         9538  +  bool setCurrentStyle = false;
         9539  +  if (config->GetStyle() == NULL)
         9540  +    setCurrentStyle = true;
         9541  +  else
         9542  +    {
         9543  +      if (strcmp(Style->GetUUID(), config->GetStyle()) != 0)
         9544  +        setCurrentStyle = true;
         9545  +    }
         9546  +  if (setCurrentStyle == true)
         9547  +    {
         9548  +      config->SetStyle(Style->GetUUID());
         9549  +      IsConfigChanged = true;
         9550  +    }
         9551  +  IsConfigChanged = Layer->UpdateQuickStyle(Style);
         9552  +  return true;
         9553  +}
         9554  +
         9555  +void QuickStyleTopologyDialog::OnOk(wxCommandEvent & WXUNUSED(event))
         9556  +{
         9557  +//
         9558  +// permanently saving the QuickStyle and quitting
         9559  +//
         9560  +  if (UpdateStyle() == true)
         9561  +    wxDialog::EndModal(wxID_OK);
         9562  +}
         9563  +
         9564  +void QuickStyleTopologyDialog::OnApply(wxCommandEvent & WXUNUSED(event))
         9565  +{
         9566  +//
         9567  +// applying the QuickStyle and continuing
         9568  +//
         9569  +  if (UpdateStyle() == true)
         9570  +    {
         9571  +      if (IsConfigChanged == true)
         9572  +        MapPanel->RefreshMap();
         9573  +    }
         9574  +}
         9575  +
         9576  +void QuickStyleTopologyDialog::OnExport(wxCommandEvent & WXUNUSED(event))
         9577  +{
         9578  +//
         9579  +// exporting the Quick Style as an external file
         9580  +//
         9581  +  bool xret = false;
         9582  +  int ret;
         9583  +  wxString path;
         9584  +  wxString lastDir;
         9585  +  int idx = GetBookCtrl()->GetSelection();
         9586  +  if (idx == 0)
         9587  +    xret = RetrieveMainPage();
         9588  +  else if (idx == 1)
         9589  +    xret = RetrieveNodePage();
         9590  +  else if (idx == 2)
         9591  +    xret = RetrieveEdgeLinkPage();
         9592  +  else
         9593  +    {
         9594  +      if (Type == MAP_LAYER_NETWORK)
         9595  +        {
         9596  +          if (idx == 3)
         9597  +            xret = RetrieveEdgeLinkSeedPage();
         9598  +      } else
         9599  +        {
         9600  +          if (idx == 3)
         9601  +            xret = RetrieveFacePage();
         9602  +          if (idx == 4)
         9603  +            xret = RetrieveEdgeLinkSeedPage();
         9604  +          if (idx == 5)
         9605  +            xret = RetrieveFaceSeedPage();
         9606  +        }
         9607  +    }
         9608  +  if (xret == false)
         9609  +    return;
         9610  +
         9611  +  wxFileDialog fileDialog(this,
         9612  +                          wxT("Exporting an SLD/SE QuickStyle to a file"),
         9613  +                          wxT(""), wxT("style.xml"),
         9614  +                          wxT("XML Document|*.xml|All files (*.*)|*.*"),
         9615  +                          wxFD_SAVE | wxFD_OVERWRITE_PROMPT, wxDefaultPosition,
         9616  +                          wxDefaultSize, wxT("filedlg"));
         9617  +  lastDir = MainFrame->GetLastDirectory();
         9618  +  if (lastDir.Len() >= 1)
         9619  +    fileDialog.SetDirectory(lastDir);
         9620  +  ret = fileDialog.ShowModal();
         9621  +  if (ret == wxID_OK)
         9622  +    {
         9623  +      wxFileName file(fileDialog.GetPath());
         9624  +      path = file.GetPath();
         9625  +      path += file.GetPathSeparator();
         9626  +      path += file.GetName();
         9627  +      lastDir = file.GetPath();
         9628  +      path = fileDialog.GetPath();
         9629  +      FILE *out = fopen(path.ToUTF8(), "wb");
         9630  +      if (out == NULL)
         9631  +        wxMessageBox(wxT("ERROR: unable to create:\n\n\"") + path + wxT("\""),
         9632  +                     wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
         9633  +      else
         9634  +        {
         9635  +          char *xml = Style->CreateXmlStyle();
         9636  +          fwrite(xml, 1, strlen(xml), out);
         9637  +          sqlite3_free(xml);
         9638  +          fclose(out);
         9639  +          wxMessageBox(wxT
         9640  +                       ("SLD/SE QuickStyle successfully saved into:\n\n\"")
         9641  +                       + path + wxT("\""), wxT("spatialite_gui"),
         9642  +                       wxOK | wxICON_INFORMATION, this);
         9643  +        }
         9644  +    }
         9645  +}
         9646  +
         9647  +void QuickStyleTopologyDialog::OnCopy(wxCommandEvent & WXUNUSED(event))
         9648  +{
         9649  +//
         9650  +// Copying the Quick Style into the Clipboard 
         9651  +//
         9652  +  bool ret = false;
         9653  +  int idx = GetBookCtrl()->GetSelection();
         9654  +  if (idx == 0)
         9655  +    ret = RetrieveMainPage();
         9656  +  else if (idx == 1)
         9657  +    ret = RetrieveNodePage();
         9658  +  else if (idx == 2)
         9659  +    ret = RetrieveEdgeLinkPage();
         9660  +  else
         9661  +    {
         9662  +      if (Type == MAP_LAYER_NETWORK)
         9663  +        {
         9664  +          if (idx == 3)
         9665  +            ret = RetrieveEdgeLinkSeedPage();
         9666  +      } else
         9667  +        {
         9668  +          if (idx == 3)
         9669  +            ret = RetrieveFacePage();
         9670  +          if (idx == 4)
         9671  +            ret = RetrieveEdgeLinkSeedPage();
         9672  +          if (idx == 5)
         9673  +            ret = RetrieveFaceSeedPage();
         9674  +        }
         9675  +    }
         9676  +  if (ret == false)
         9677  +    return;
         9678  +
         9679  +  char *xml = Style->CreateXmlStyle();
         9680  +  wxString XMLstring = wxString::FromUTF8(xml);
         9681  +  sqlite3_free(xml);
         9682  +  if (wxTheClipboard->Open())
         9683  +    {
         9684  +      wxTheClipboard->SetData(new wxTextDataObject(XMLstring));
         9685  +      wxTheClipboard->Close();
         9686  +    }
         9687  +}
         9688  +
         9689  +void QuickStyleTopologyDialog::OnQuit(wxCommandEvent & WXUNUSED(event))
         9690  +{
         9691  +//
         9692  +// all done: 
         9693  +//
         9694  +  wxDialog::EndModal(wxID_CANCEL);
         9695  +}

Deleted QuickStylesRaster.cpp.

     1         -/*
     2         -/ QuickStylesRaster.cpp
     3         -/ Quick Styles wizards (Raster layers)
     4         -/
     5         -/ version 2.0, 2018 June 7
     6         -/
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
     8         -/
     9         -/ Copyright (C) 2017  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/spinctrl.h"
    29         -#include "wx/imaglist.h"
    30         -#include "wx/colordlg.h"
    31         -#include "wx/filename.h"
    32         -#include "wx/clipbrd.h"
    33         -
    34         -QuickStyleRasterObj::QuickStyleRasterObj()
    35         -{
    36         -// ctor
    37         -  QuickStyleObj::DoGetUUID(UUID);
    38         -  MinScaleEnabled = false;
    39         -  MaxScaleEnabled = false;
    40         -  ScaleMin = 0.0;
    41         -  ScaleMax = 0.0;
    42         -  Opacity = 1.0;
    43         -  Normalize = false;
    44         -  Histogram = false;
    45         -  Gamma = false;
    46         -  GammaValue = 1.0;
    47         -  TripleBand = false;
    48         -  SingleBand = false;
    49         -  RedBand = 0;
    50         -  GreenBand = 0;
    51         -  BlueBand = 0;
    52         -  GrayBand = 0;
    53         -  SrtmColorMap = false;
    54         -  TerrainColorMap = false;
    55         -  NdviColorMap = false;
    56         -  ColorRamp = false;
    57         -  MinValue = 0.0;
    58         -  ShadedRelief = false;
    59         -  ShadedReliefFactor = 0.0;
    60         -  QuickStyleObj::RandomColor(MinValueColor);
    61         -  MaxValue = 0.0;
    62         -  QuickStyleObj::RandomColor(MaxValueColor);
    63         -  XmlStyle = NULL;
    64         -}
    65         -
    66         -QuickStyleRasterObj *QuickStyleRasterObj::Clone()
    67         -{
    68         -//
    69         -// cloning a Quick Style - Raster
    70         -//
    71         -  QuickStyleRasterObj *Style = new QuickStyleRasterObj();
    72         -  strcpy(Style->UUID, this->UUID);
    73         -  Style->MinScaleEnabled = this->MinScaleEnabled;
    74         -  Style->MaxScaleEnabled = this->MaxScaleEnabled;
    75         -  Style->ScaleMin = this->ScaleMin;
    76         -  Style->ScaleMax = this->ScaleMax;
    77         -  Style->Opacity = this->Opacity;
    78         -  Style->Normalize = this->Normalize;
    79         -  Style->Histogram = this->Histogram;
    80         -  Style->Gamma = this->Gamma;
    81         -  Style->GammaValue = this->GammaValue;
    82         -  Style->TripleBand = this->TripleBand;
    83         -  Style->SingleBand = this->SingleBand;
    84         -  Style->RedBand = this->RedBand;
    85         -  Style->GreenBand = this->GreenBand;
    86         -  Style->BlueBand = this->BlueBand;
    87         -  Style->GrayBand = this->GrayBand;
    88         -  Style->SrtmColorMap = this->SrtmColorMap;
    89         -  Style->TerrainColorMap = this->TerrainColorMap;
    90         -  Style->NdviColorMap = this->NdviColorMap;
    91         -  Style->ColorRamp = this->ColorRamp;
    92         -  Style->MinValue = this->MinValue;
    93         -  strcpy(Style->MinValueColor, this->MinValueColor);
    94         -  Style->MaxValue = this->MaxValue;
    95         -  strcpy(Style->MaxValueColor, this->MaxValueColor);
    96         -  Style->ShadedRelief = this->ShadedRelief;
    97         -  Style->ShadedReliefFactor = this->ShadedReliefFactor;
    98         -  Style->XmlStyle = NULL;
    99         -  return Style;
   100         -}
   101         -
   102         -bool QuickStyleRasterObj::Compare(QuickStyleRasterObj * Style)
   103         -{
   104         -//
   105         -// comparing two Quick Style objects - Raster
   106         -//
   107         -  if (Style == NULL)
   108         -    return false;
   109         -  if (strcmp(Style->UUID, this->UUID) != 0)
   110         -    return false;
   111         -  if (Style->MinScaleEnabled != this->MinScaleEnabled)
   112         -    return false;
   113         -  if (Style->MaxScaleEnabled != this->MaxScaleEnabled)
   114         -    return false;
   115         -  if (Style->ScaleMin != this->ScaleMin)
   116         -    return false;
   117         -  if (Style->ScaleMax != this->ScaleMax)
   118         -    return false;
   119         -  if (Style->Opacity != this->Opacity)
   120         -    return false;
   121         -  if (Style->Normalize != this->Normalize)
   122         -    return false;
   123         -  if (Style->Histogram != this->Histogram)
   124         -    return false;
   125         -  if (Style->Gamma != this->Gamma)
   126         -    return false;
   127         -  if (Style->GammaValue != this->GammaValue)
   128         -    return false;
   129         -  if (Style->TripleBand != this->TripleBand)
   130         -    return false;
   131         -  if (Style->SingleBand != this->SingleBand)
   132         -    return false;
   133         -  if (Style->RedBand != this->RedBand)
   134         -    return false;
   135         -  if (Style->GreenBand != this->GreenBand)
   136         -    return false;
   137         -  if (Style->BlueBand != this->BlueBand)
   138         -    return false;
   139         -  if (Style->GrayBand != this->GrayBand)
   140         -    return false;
   141         -  if (Style->SrtmColorMap != this->SrtmColorMap)
   142         -    return false;
   143         -  if (Style->TerrainColorMap != this->TerrainColorMap)
   144         -    return false;
   145         -  if (Style->NdviColorMap != this->NdviColorMap)
   146         -    return false;
   147         -  if (Style->ColorRamp != this->ColorRamp)
   148         -    return false;
   149         -  if (Style->MinValue != this->MinValue)
   150         -    return false;
   151         -  if (strcmp(Style->MinValueColor, this->MinValueColor) != 0)
   152         -    return false;
   153         -  if (Style->MaxValue != this->MaxValue)
   154         -    return false;
   155         -  if (strcmp(Style->MaxValueColor, this->MaxValueColor) != 0)
   156         -    return false;
   157         -  if (Style->ShadedRelief != this->ShadedRelief)
   158         -    return false;
   159         -  if (Style->ShadedReliefFactor != this->ShadedReliefFactor)
   160         -    return false;
   161         -  return true;
   162         -}
   163         -
   164         -char *QuickStyleRasterObj::DoCreatePredefinedSrtmStyle(char *base_xml)
   165         -{
   166         -//
   167         -// creating the predefined SRTM Style
   168         -//
   169         -  char *prev = base_xml;
   170         -  char *xml = sqlite3_mprintf("%s\t\t\t<ColorMap>\r\n", prev);
   171         -  sqlite3_free(prev);
   172         -  prev = xml;
   173         -  xml =
   174         -    sqlite3_mprintf("%s\t\t\t\t<Interpolate fallbackValue=\"#ffffff\">\r\n",
   175         -                    prev);
   176         -  sqlite3_free(prev);
   177         -  prev = xml;
   178         -  xml =
   179         -    sqlite3_mprintf("%s\t\t\t\t\t<LookupValue>Rasterdata</LookupValue>\r\n",
   180         -                    prev);
   181         -  sqlite3_free(prev);
   182         -  prev = xml;
   183         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   184         -  sqlite3_free(prev);
   185         -  prev = xml;
   186         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>-11000.00000000</Data>\r\n", prev);
   187         -  sqlite3_free(prev);
   188         -  prev = xml;
   189         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#000000</Value>\r\n", prev);
   190         -  sqlite3_free(prev);
   191         -  prev = xml;
   192         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   193         -  sqlite3_free(prev);
   194         -  prev = xml;
   195         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   196         -  sqlite3_free(prev);
   197         -  prev = xml;
   198         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>-8000.00000000</Data>\r\n", prev);
   199         -  sqlite3_free(prev);
   200         -  prev = xml;
   201         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#000032</Value>\r\n", prev);
   202         -  sqlite3_free(prev);
   203         -  prev = xml;
   204         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   205         -  sqlite3_free(prev);
   206         -  prev = xml;
   207         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   208         -  sqlite3_free(prev);
   209         -  prev = xml;
   210         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>-5000.00000000</Data>\r\n", prev);
   211         -  sqlite3_free(prev);
   212         -  prev = xml;
   213         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#0a0a64</Value>\r\n", prev);
   214         -  sqlite3_free(prev);
   215         -  prev = xml;
   216         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   217         -  sqlite3_free(prev);
   218         -  prev = xml;
   219         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   220         -  sqlite3_free(prev);
   221         -  prev = xml;
   222         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>-3000.00000000</Data>\r\n", prev);
   223         -  sqlite3_free(prev);
   224         -  prev = xml;
   225         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#1e1e96</Value>\r\n", prev);
   226         -  sqlite3_free(prev);
   227         -  prev = xml;
   228         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   229         -  sqlite3_free(prev);
   230         -  prev = xml;
   231         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   232         -  sqlite3_free(prev);
   233         -  prev = xml;
   234         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>-1000.00000000</Data>\r\n", prev);
   235         -  sqlite3_free(prev);
   236         -  prev = xml;
   237         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#4646c8</Value>\r\n", prev);
   238         -  sqlite3_free(prev);
   239         -  prev = xml;
   240         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   241         -  sqlite3_free(prev);
   242         -  prev = xml;
   243         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   244         -  sqlite3_free(prev);
   245         -  prev = xml;
   246         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>-100.00000000</Data>\r\n", prev);
   247         -  sqlite3_free(prev);
   248         -  prev = xml;
   249         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#6464e1</Value>\r\n", prev);
   250         -  sqlite3_free(prev);
   251         -  prev = xml;
   252         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   253         -  sqlite3_free(prev);
   254         -  prev = xml;
   255         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   256         -  sqlite3_free(prev);
   257         -  prev = xml;
   258         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>0.00000000</Data>\r\n", prev);
   259         -  sqlite3_free(prev);
   260         -  prev = xml;
   261         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#aaaaff</Value>\r\n", prev);
   262         -  sqlite3_free(prev);
   263         -  prev = xml;
   264         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   265         -  sqlite3_free(prev);
   266         -  prev = xml;
   267         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   268         -  sqlite3_free(prev);
   269         -  prev = xml;
   270         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>0.10000000</Data>\r\n", prev);
   271         -  sqlite3_free(prev);
   272         -  prev = xml;
   273         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#399769</Value>\r\n", prev);
   274         -  sqlite3_free(prev);
   275         -  prev = xml;
   276         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   277         -  sqlite3_free(prev);
   278         -  prev = xml;
   279         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   280         -  sqlite3_free(prev);
   281         -  prev = xml;
   282         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>100.00000000</Data>\r\n", prev);
   283         -  sqlite3_free(prev);
   284         -  prev = xml;
   285         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#75c25d</Value>\r\n", prev);
   286         -  sqlite3_free(prev);
   287         -  prev = xml;
   288         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   289         -  sqlite3_free(prev);
   290         -  prev = xml;
   291         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   292         -  sqlite3_free(prev);
   293         -  prev = xml;
   294         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>500.00000000</Data>\r\n", prev);
   295         -  sqlite3_free(prev);
   296         -  prev = xml;
   297         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#e6e680</Value>\r\n", prev);
   298         -  sqlite3_free(prev);
   299         -  prev = xml;
   300         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   301         -  sqlite3_free(prev);
   302         -  prev = xml;
   303         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   304         -  sqlite3_free(prev);
   305         -  prev = xml;
   306         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>1000.00000000</Data>\r\n", prev);
   307         -  sqlite3_free(prev);
   308         -  prev = xml;
   309         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#ca9e4b</Value>\r\n", prev);
   310         -  sqlite3_free(prev);
   311         -  prev = xml;
   312         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   313         -  sqlite3_free(prev);
   314         -  prev = xml;
   315         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   316         -  sqlite3_free(prev);
   317         -  prev = xml;
   318         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>2000.00000000</Data>\r\n", prev);
   319         -  sqlite3_free(prev);
   320         -  prev = xml;
   321         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#b99a64</Value>\r\n", prev);
   322         -  sqlite3_free(prev);
   323         -  prev = xml;
   324         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   325         -  sqlite3_free(prev);
   326         -  prev = xml;
   327         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   328         -  sqlite3_free(prev);
   329         -  prev = xml;
   330         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>3000.00000000</Data>\r\n", prev);
   331         -  sqlite3_free(prev);
   332         -  prev = xml;
   333         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#dcdcdc</Value>\r\n", prev);
   334         -  sqlite3_free(prev);
   335         -  prev = xml;
   336         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   337         -  sqlite3_free(prev);
   338         -  prev = xml;
   339         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   340         -  sqlite3_free(prev);
   341         -  prev = xml;
   342         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>5000.00000000</Data>\r\n", prev);
   343         -  sqlite3_free(prev);
   344         -  prev = xml;
   345         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#ffffff</Value>\r\n", prev);
   346         -  sqlite3_free(prev);
   347         -  prev = xml;
   348         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   349         -  sqlite3_free(prev);
   350         -  prev = xml;
   351         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   352         -  sqlite3_free(prev);
   353         -  prev = xml;
   354         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>8850.00000000</Data>\r\n", prev);
   355         -  sqlite3_free(prev);
   356         -  prev = xml;
   357         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#6464c8</Value>\r\n", prev);
   358         -  sqlite3_free(prev);
   359         -  prev = xml;
   360         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   361         -  sqlite3_free(prev);
   362         -  prev = xml;
   363         -  xml = sqlite3_mprintf("%s\t\t\t\t</Interpolate>\r\n", prev);
   364         -  sqlite3_free(prev);
   365         -  prev = xml;
   366         -  xml = sqlite3_mprintf("%s\t\t\t</ColorMap>\r\n", prev);
   367         -  sqlite3_free(prev);
   368         -  return xml;
   369         -}
   370         -
   371         -char *QuickStyleRasterObj::DoCreatePredefinedTerrainStyle(char *base_xml)
   372         -{
   373         -//
   374         -// creating the predefined Terrain Style
   375         -//
   376         -  char *prev = base_xml;
   377         -  char *xml = sqlite3_mprintf("%s\t\t\t<ColorMap>\r\n", prev);
   378         -  sqlite3_free(prev);
   379         -  prev = xml;
   380         -  xml =
   381         -    sqlite3_mprintf("%s\t\t\t\t<Interpolate fallbackValue=\"#ffffff\">\r\n",
   382         -                    prev);
   383         -  sqlite3_free(prev);
   384         -  prev = xml;
   385         -  xml =
   386         -    sqlite3_mprintf("%s\t\t\t\t\t<LookupValue>Rasterdata</LookupValue>\r\n",
   387         -                    prev);
   388         -  sqlite3_free(prev);
   389         -  prev = xml;
   390         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   391         -  sqlite3_free(prev);
   392         -  prev = xml;
   393         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>-11000.00000000</Data>\r\n", prev);
   394         -  sqlite3_free(prev);
   395         -  prev = xml;
   396         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#000000</Value>\r\n", prev);
   397         -  sqlite3_free(prev);
   398         -  prev = xml;
   399         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   400         -  sqlite3_free(prev);
   401         -  prev = xml;
   402         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   403         -  sqlite3_free(prev);
   404         -  prev = xml;
   405         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>-500.00000000</Data>\r\n", prev);
   406         -  sqlite3_free(prev);
   407         -  prev = xml;
   408         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#00001e</Value>\r\n", prev);
   409         -  sqlite3_free(prev);
   410         -  prev = xml;
   411         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   412         -  sqlite3_free(prev);
   413         -  prev = xml;
   414         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   415         -  sqlite3_free(prev);
   416         -  prev = xml;
   417         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>-100.00000000</Data>\r\n", prev);
   418         -  sqlite3_free(prev);
   419         -  prev = xml;
   420         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#0000c8</Value>\r\n", prev);
   421         -  sqlite3_free(prev);
   422         -  prev = xml;
   423         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   424         -  sqlite3_free(prev);
   425         -  prev = xml;
   426         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   427         -  sqlite3_free(prev);
   428         -  prev = xml;
   429         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>-1.00000000</Data>\r\n", prev);
   430         -  sqlite3_free(prev);
   431         -  prev = xml;
   432         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#9696ff</Value>\r\n", prev);
   433         -  sqlite3_free(prev);
   434         -  prev = xml;
   435         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   436         -  sqlite3_free(prev);
   437         -  prev = xml;
   438         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   439         -  sqlite3_free(prev);
   440         -  prev = xml;
   441         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>0.00000000</Data>\r\n", prev);
   442         -  sqlite3_free(prev);
   443         -  prev = xml;
   444         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#007800</Value>\r\n", prev);
   445         -  sqlite3_free(prev);
   446         -  prev = xml;
   447         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   448         -  sqlite3_free(prev);
   449         -  prev = xml;
   450         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   451         -  sqlite3_free(prev);
   452         -  prev = xml;
   453         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>100.00000000</Data>\r\n", prev);
   454         -  sqlite3_free(prev);
   455         -  prev = xml;
   456         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#009600</Value>\r\n", prev);
   457         -  sqlite3_free(prev);
   458         -  prev = xml;
   459         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   460         -  sqlite3_free(prev);
   461         -  prev = xml;
   462         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   463         -  sqlite3_free(prev);
   464         -  prev = xml;
   465         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>270.00000000</Data>\r\n", prev);
   466         -  sqlite3_free(prev);
   467         -  prev = xml;
   468         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#5aa55a</Value>\r\n", prev);
   469         -  sqlite3_free(prev);
   470         -  prev = xml;
   471         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   472         -  sqlite3_free(prev);
   473         -  prev = xml;
   474         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   475         -  sqlite3_free(prev);
   476         -  prev = xml;
   477         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>300.00000000</Data>\r\n", prev);
   478         -  sqlite3_free(prev);
   479         -  prev = xml;
   480         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#5aaf5a</Value>\r\n", prev);
   481         -  sqlite3_free(prev);
   482         -  prev = xml;
   483         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   484         -  sqlite3_free(prev);
   485         -  prev = xml;
   486         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   487         -  sqlite3_free(prev);
   488         -  prev = xml;
   489         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>500.00000000</Data>\r\n", prev);
   490         -  sqlite3_free(prev);
   491         -  prev = xml;
   492         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#32b432</Value>\r\n", prev);
   493         -  sqlite3_free(prev);
   494         -  prev = xml;
   495         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   496         -  sqlite3_free(prev);
   497         -  prev = xml;
   498         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   499         -  sqlite3_free(prev);
   500         -  prev = xml;
   501         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>500.00000000</Data>\r\n", prev);
   502         -  sqlite3_free(prev);
   503         -  prev = xml;
   504         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#46aa46</Value>\r\n", prev);
   505         -  sqlite3_free(prev);
   506         -  prev = xml;
   507         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   508         -  sqlite3_free(prev);
   509         -  prev = xml;
   510         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   511         -  sqlite3_free(prev);
   512         -  prev = xml;
   513         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>1000.00000000</Data>\r\n", prev);
   514         -  sqlite3_free(prev);
   515         -  prev = xml;
   516         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#46914b</Value>\r\n", prev);
   517         -  sqlite3_free(prev);
   518         -  prev = xml;
   519         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   520         -  sqlite3_free(prev);
   521         -  prev = xml;
   522         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   523         -  sqlite3_free(prev);
   524         -  prev = xml;
   525         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>1000.00000000</Data>\r\n", prev);
   526         -  sqlite3_free(prev);
   527         -  prev = xml;
   528         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#469b4b</Value>\r\n", prev);
   529         -  sqlite3_free(prev);
   530         -  prev = xml;
   531         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   532         -  sqlite3_free(prev);
   533         -  prev = xml;
   534         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   535         -  sqlite3_free(prev);
   536         -  prev = xml;
   537         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>2000.00000000</Data>\r\n", prev);
   538         -  sqlite3_free(prev);
   539         -  prev = xml;
   540         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#969c64</Value>\r\n", prev);
   541         -  sqlite3_free(prev);
   542         -  prev = xml;
   543         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   544         -  sqlite3_free(prev);
   545         -  prev = xml;
   546         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   547         -  sqlite3_free(prev);
   548         -  prev = xml;
   549         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>2800.00000000</Data>\r\n", prev);
   550         -  sqlite3_free(prev);
   551         -  prev = xml;
   552         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#dcdcdc</Value>\r\n", prev);
   553         -  sqlite3_free(prev);
   554         -  prev = xml;
   555         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   556         -  sqlite3_free(prev);
   557         -  prev = xml;
   558         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   559         -  sqlite3_free(prev);
   560         -  prev = xml;
   561         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>3000.00000000</Data>\r\n", prev);
   562         -  sqlite3_free(prev);
   563         -  prev = xml;
   564         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#ffffff</Value>\r\n", prev);
   565         -  sqlite3_free(prev);
   566         -  prev = xml;
   567         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   568         -  sqlite3_free(prev);
   569         -  prev = xml;
   570         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   571         -  sqlite3_free(prev);
   572         -  prev = xml;
   573         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>8850.00000000</Data>\r\n", prev);
   574         -  sqlite3_free(prev);
   575         -  prev = xml;
   576         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#ffffff</Value>\r\n", prev);
   577         -  sqlite3_free(prev);
   578         -  prev = xml;
   579         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   580         -  sqlite3_free(prev);
   581         -  prev = xml;
   582         -  xml = sqlite3_mprintf("%s\t\t\t\t</Interpolate>\r\n", prev);
   583         -  sqlite3_free(prev);
   584         -  prev = xml;
   585         -  xml = sqlite3_mprintf("%s\t\t\t</ColorMap>\r\n", prev);
   586         -  sqlite3_free(prev);
   587         -  return xml;
   588         -}
   589         -
   590         -char *QuickStyleRasterObj::DoCreatePredefinedNdviStyle(char *base_xml)
   591         -{
   592         -//
   593         -// creating the predefined NDVI Style
   594         -//
   595         -  char *prev = base_xml;
   596         -  char *xml = sqlite3_mprintf("%s\t\t\t<ColorMap>\r\n", prev);
   597         -  sqlite3_free(prev);
   598         -  prev = xml;
   599         -  xml =
   600         -    sqlite3_mprintf("%s\t\t\t\t<Interpolate fallbackValue=\"#ffffff\">\r\n",
   601         -                    prev);
   602         -  sqlite3_free(prev);
   603         -  prev = xml;
   604         -  xml =
   605         -    sqlite3_mprintf("%s\t\t\t\t\t<LookupValue>Rasterdata</LookupValue>\r\n",
   606         -                    prev);
   607         -  sqlite3_free(prev);
   608         -  prev = xml;
   609         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   610         -  sqlite3_free(prev);
   611         -  prev = xml;
   612         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>-1.00000000</Data>\r\n", prev);
   613         -  sqlite3_free(prev);
   614         -  prev = xml;
   615         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#051852</Value>\r\n", prev);
   616         -  sqlite3_free(prev);
   617         -  prev = xml;
   618         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   619         -  sqlite3_free(prev);
   620         -  prev = xml;
   621         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   622         -  sqlite3_free(prev);
   623         -  prev = xml;
   624         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>-0.30000000</Data>\r\n", prev);
   625         -  sqlite3_free(prev);
   626         -  prev = xml;
   627         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#051852</Value>\r\n", prev);
   628         -  sqlite3_free(prev);
   629         -  prev = xml;
   630         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   631         -  sqlite3_free(prev);
   632         -  prev = xml;
   633         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   634         -  sqlite3_free(prev);
   635         -  prev = xml;
   636         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>-0.18000000</Data>\r\n", prev);
   637         -  sqlite3_free(prev);
   638         -  prev = xml;
   639         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#ffffff</Value>\r\n", prev);
   640         -  sqlite3_free(prev);
   641         -  prev = xml;
   642         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   643         -  sqlite3_free(prev);
   644         -  prev = xml;
   645         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   646         -  sqlite3_free(prev);
   647         -  prev = xml;
   648         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>0.00000000</Data>\r\n", prev);
   649         -  sqlite3_free(prev);
   650         -  prev = xml;
   651         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#ffffff</Value>\r\n", prev);
   652         -  sqlite3_free(prev);
   653         -  prev = xml;
   654         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   655         -  sqlite3_free(prev);
   656         -  prev = xml;
   657         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   658         -  sqlite3_free(prev);
   659         -  prev = xml;
   660         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>0.02500000</Data>\r\n", prev);
   661         -  sqlite3_free(prev);
   662         -  prev = xml;
   663         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#cec5b4</Value>\r\n", prev);
   664         -  sqlite3_free(prev);
   665         -  prev = xml;
   666         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   667         -  sqlite3_free(prev);
   668         -  prev = xml;
   669         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   670         -  sqlite3_free(prev);
   671         -  prev = xml;
   672         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>0.07500000</Data>\r\n", prev);
   673         -  sqlite3_free(prev);
   674         -  prev = xml;
   675         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#bfa37c</Value>\r\n", prev);
   676         -  sqlite3_free(prev);
   677         -  prev = xml;
   678         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   679         -  sqlite3_free(prev);
   680         -  prev = xml;
   681         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   682         -  sqlite3_free(prev);
   683         -  prev = xml;
   684         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>0.12500000</Data>\r\n", prev);
   685         -  sqlite3_free(prev);
   686         -  prev = xml;
   687         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#b3ae60</Value>\r\n", prev);
   688         -  sqlite3_free(prev);
   689         -  prev = xml;
   690         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   691         -  sqlite3_free(prev);
   692         -  prev = xml;
   693         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   694         -  sqlite3_free(prev);
   695         -  prev = xml;
   696         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>0.15000000</Data>\r\n", prev);
   697         -  sqlite3_free(prev);
   698         -  prev = xml;
   699         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#a3b550</Value>\r\n", prev);
   700         -  sqlite3_free(prev);
   701         -  prev = xml;
   702         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   703         -  sqlite3_free(prev);
   704         -  prev = xml;
   705         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   706         -  sqlite3_free(prev);
   707         -  prev = xml;
   708         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>0.17500000</Data>\r\n", prev);
   709         -  sqlite3_free(prev);
   710         -  prev = xml;
   711         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#90aa3c</Value>\r\n", prev);
   712         -  sqlite3_free(prev);
   713         -  prev = xml;
   714         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   715         -  sqlite3_free(prev);
   716         -  prev = xml;
   717         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   718         -  sqlite3_free(prev);
   719         -  prev = xml;
   720         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>0.23300000</Data>\r\n", prev);
   721         -  sqlite3_free(prev);
   722         -  prev = xml;
   723         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#a6c31d</Value>\r\n", prev);
   724         -  sqlite3_free(prev);
   725         -  prev = xml;
   726         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   727         -  sqlite3_free(prev);
   728         -  prev = xml;
   729         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   730         -  sqlite3_free(prev);
   731         -  prev = xml;
   732         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>0.26600000</Data>\r\n", prev);
   733         -  sqlite3_free(prev);
   734         -  prev = xml;
   735         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#87b703</Value>\r\n", prev);
   736         -  sqlite3_free(prev);
   737         -  prev = xml;
   738         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   739         -  sqlite3_free(prev);
   740         -  prev = xml;
   741         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   742         -  sqlite3_free(prev);
   743         -  prev = xml;
   744         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>0.33300000</Data>\r\n", prev);
   745         -  sqlite3_free(prev);
   746         -  prev = xml;
   747         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#79af01</Value>\r\n", prev);
   748         -  sqlite3_free(prev);
   749         -  prev = xml;
   750         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   751         -  sqlite3_free(prev);
   752         -  prev = xml;
   753         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   754         -  sqlite3_free(prev);
   755         -  prev = xml;
   756         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>0.36600000</Data>\r\n", prev);
   757         -  sqlite3_free(prev);
   758         -  prev = xml;
   759         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#65a300</Value>\r\n", prev);
   760         -  sqlite3_free(prev);
   761         -  prev = xml;
   762         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   763         -  sqlite3_free(prev);
   764         -  prev = xml;
   765         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   766         -  sqlite3_free(prev);
   767         -  prev = xml;
   768         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>0.43300000</Data>\r\n", prev);
   769         -  sqlite3_free(prev);
   770         -  prev = xml;
   771         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#4e9700</Value>\r\n", prev);
   772         -  sqlite3_free(prev);
   773         -  prev = xml;
   774         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   775         -  sqlite3_free(prev);
   776         -  prev = xml;
   777         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   778         -  sqlite3_free(prev);
   779         -  prev = xml;
   780         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>0.46600000</Data>\r\n", prev);
   781         -  sqlite3_free(prev);
   782         -  prev = xml;
   783         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#2b8404</Value>\r\n", prev);
   784         -  sqlite3_free(prev);
   785         -  prev = xml;
   786         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   787         -  sqlite3_free(prev);
   788         -  prev = xml;
   789         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   790         -  sqlite3_free(prev);
   791         -  prev = xml;
   792         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>0.55000000</Data>\r\n", prev);
   793         -  sqlite3_free(prev);
   794         -  prev = xml;
   795         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#007200</Value>\r\n", prev);
   796         -  sqlite3_free(prev);
   797         -  prev = xml;
   798         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   799         -  sqlite3_free(prev);
   800         -  prev = xml;
   801         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   802         -  sqlite3_free(prev);
   803         -  prev = xml;
   804         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>0.65000000</Data>\r\n", prev);
   805         -  sqlite3_free(prev);
   806         -  prev = xml;
   807         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#005a01</Value>\r\n", prev);
   808         -  sqlite3_free(prev);
   809         -  prev = xml;
   810         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   811         -  sqlite3_free(prev);
   812         -  prev = xml;
   813         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   814         -  sqlite3_free(prev);
   815         -  prev = xml;
   816         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>0.75000000</Data>\r\n", prev);
   817         -  sqlite3_free(prev);
   818         -  prev = xml;
   819         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#004900</Value>\r\n", prev);
   820         -  sqlite3_free(prev);
   821         -  prev = xml;
   822         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   823         -  sqlite3_free(prev);
   824         -  prev = xml;
   825         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   826         -  sqlite3_free(prev);
   827         -  prev = xml;
   828         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>0.85000000</Data>\r\n", prev);
   829         -  sqlite3_free(prev);
   830         -  prev = xml;
   831         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#003800</Value>\r\n", prev);
   832         -  sqlite3_free(prev);
   833         -  prev = xml;
   834         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   835         -  sqlite3_free(prev);
   836         -  prev = xml;
   837         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   838         -  sqlite3_free(prev);
   839         -  prev = xml;
   840         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>0.95000000</Data>\r\n", prev);
   841         -  sqlite3_free(prev);
   842         -  prev = xml;
   843         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#001f00</Value>\r\n", prev);
   844         -  sqlite3_free(prev);
   845         -  prev = xml;
   846         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   847         -  sqlite3_free(prev);
   848         -  prev = xml;
   849         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
   850         -  sqlite3_free(prev);
   851         -  prev = xml;
   852         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Data>1.00000000</Data>\r\n", prev);
   853         -  sqlite3_free(prev);
   854         -  prev = xml;
   855         -  xml = sqlite3_mprintf("%s\t\t\t\t\t\t<Value>#000000</Value>\r\n", prev);
   856         -  sqlite3_free(prev);
   857         -  prev = xml;
   858         -  xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
   859         -  sqlite3_free(prev);
   860         -  prev = xml;
   861         -  xml = sqlite3_mprintf("%s\t\t\t\t</Interpolate>\r\n", prev);
   862         -  sqlite3_free(prev);
   863         -  prev = xml;
   864         -  xml = sqlite3_mprintf("%s\t\t\t</ColorMap>\r\n", prev);
   865         -  sqlite3_free(prev);
   866         -  return xml;
   867         -}
   868         -
   869         -char *QuickStyleRasterObj::CreateXmlStyle()
   870         -{
   871         -//
   872         -// creating the XML Style
   873         -//
   874         -  if (MinScaleEnabled == false && MaxScaleEnabled == false && Opacity == 1.0
   875         -      && Normalize == false && Histogram == false && Gamma == false
   876         -      && TripleBand == false && SingleBand == false && SrtmColorMap == false
   877         -      && TerrainColorMap == false && NdviColorMap == false && ColorRamp == false
   878         -      && ShadedRelief == false)
   879         -    return NULL;                // NULL Raster Style - no option is set
   880         -
   881         -  char *prev;
   882         -  char *xml = sqlite3_mprintf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
   883         -  prev = xml;
   884         -  xml = sqlite3_mprintf("%s<CoverageStyle version=\"1.1.0\" ", prev);
   885         -  sqlite3_free(prev);
   886         -  prev = xml;
   887         -  xml =
   888         -    sqlite3_mprintf
   889         -    ("%sxsi:schemaLocation=\"http://www.opengis.net/se http://schemas.opengis.net/se/1.1.0/FeatureStyle.xsd\" ",
   890         -     prev);
   891         -  sqlite3_free(prev);
   892         -  prev = xml;
   893         -  xml = sqlite3_mprintf
   894         -    ("%sxmlns=\"http://www.opengis.net/se\" xmlns:ogc=\"http://www.opengis.net/ogc\" ",
   895         -     prev);
   896         -  sqlite3_free(prev);
   897         -  prev = xml;
   898         -  xml =
   899         -    sqlite3_mprintf("%sxmlns:xlink=\"http://www.w3.org/1999/xlink\" ", prev);
   900         -  sqlite3_free(prev);
   901         -  prev = xml;
   902         -  xml =
   903         -    sqlite3_mprintf
   904         -    ("%sxmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\r\n", prev);
   905         -  sqlite3_free(prev);
   906         -  prev = xml;
   907         -  xml = sqlite3_mprintf("%s\t<Name>%s</Name>\r\n", prev, UUID);
   908         -  sqlite3_free(prev);
   909         -  prev = xml;
   910         -  xml = sqlite3_mprintf("%s\t<Description>\r\n", prev);
   911         -  sqlite3_free(prev);
   912         -  prev = xml;
   913         -  xml = sqlite3_mprintf("%s\t\t<Title>%s</Title>\r\n", prev, "Quick Style");
   914         -  sqlite3_free(prev);
   915         -  prev = xml;
   916         -  xml =
   917         -    sqlite3_mprintf("%s\t\t<Abstract>%s</Abstract>\r\n", prev,
   918         -                    "Created by SpatialiteGUI");
   919         -  sqlite3_free(prev);
   920         -  prev = xml;
   921         -  xml = sqlite3_mprintf("%s\t</Description>\r\n", prev);
   922         -  sqlite3_free(prev);
   923         -  prev = xml;
   924         -  xml = sqlite3_mprintf("%s\t<Rule>\r\n", prev);
   925         -  sqlite3_free(prev);
   926         -  prev = xml;
   927         -  if (MinScaleEnabled == true)
   928         -    {
   929         -      xml =
   930         -        sqlite3_mprintf
   931         -        ("%s\t\t<MinScaleDenominator>%1.2f</MinScaleDenominator>\r\n", prev,
   932         -         ScaleMin);
   933         -      sqlite3_free(prev);
   934         -      prev = xml;
   935         -    }
   936         -  if (MaxScaleEnabled == true)
   937         -    {
   938         -      xml =
   939         -        sqlite3_mprintf
   940         -        ("%s\t\t<MaxScaleDenominator>%1.2f</MaxScaleDenominator>\r\n", prev,
   941         -         ScaleMax);
   942         -      sqlite3_free(prev);
   943         -      prev = xml;
   944         -    }
   945         -  xml = sqlite3_mprintf("%s\t\t<RasterSymbolizer>\r\n", prev);
   946         -  sqlite3_free(prev);
   947         -  prev = xml;
   948         -  xml = sqlite3_mprintf("%s\t\t\t<Opacity>%1.2f</Opacity>\r\n", prev, Opacity);
   949         -  sqlite3_free(prev);
   950         -  prev = xml;
   951         -  if (SrtmColorMap == true)
   952         -    {
   953         -      // special case: predefined SRTM style
   954         -      xml = DoCreatePredefinedSrtmStyle(prev);
   955         -      prev = xml;
   956         -      goto shaded_relief;
   957         -    }
   958         -  if (TerrainColorMap == true)
   959         -    {
   960         -      // special case: predefined Terrain style
   961         -      xml = DoCreatePredefinedTerrainStyle(prev);
   962         -      prev = xml;
   963         -      goto shaded_relief;
   964         -    }
   965         -  if (NdviColorMap == true)
   966         -    {
   967         -      // special case: predefined NDVI style
   968         -      xml = DoCreatePredefinedNdviStyle(prev);
   969         -      prev = xml;
   970         -      goto foot;
   971         -    }
   972         -  if (TripleBand == true || SingleBand == true)
   973         -    {
   974         -      xml = sqlite3_mprintf("%s\t\t\t<ChannelSelection>\r\n", prev);
   975         -      sqlite3_free(prev);
   976         -      prev = xml;
   977         -      if (TripleBand == true)
   978         -        {
   979         -          xml =
   980         -            sqlite3_mprintf
   981         -            ("%s\t\t\t\t<RedChannel>\r\n\t\t\t\t\t<SourceChannelName>%d", prev,
   982         -             RedBand + 1);
   983         -          sqlite3_free(prev);
   984         -          prev = xml;
   985         -          xml =
   986         -            sqlite3_mprintf
   987         -            ("%s</SourceChannelName>\r\n\t\t\t\t</RedChannel>\r\n", prev);
   988         -          sqlite3_free(prev);
   989         -          prev = xml;
   990         -          xml =
   991         -            sqlite3_mprintf
   992         -            ("%s\t\t\t\t<GreenChannel>\r\n\t\t\t\t\t<SourceChannelName>%d",
   993         -             prev, GreenBand + 1);
   994         -          sqlite3_free(prev);
   995         -          prev = xml;
   996         -          xml =
   997         -            sqlite3_mprintf
   998         -            ("%s</SourceChannelName>\r\n\t\t\t\t</GreenChannel>\r\n", prev);
   999         -          sqlite3_free(prev);
  1000         -          prev = xml;
  1001         -          xml =
  1002         -            sqlite3_mprintf
  1003         -            ("%s\t\t\t\t<BlueChannel>\r\n\t\t\t\t\t<SourceChannelName>%d", prev,
  1004         -             BlueBand + 1);
  1005         -          sqlite3_free(prev);
  1006         -          prev = xml;
  1007         -          xml =
  1008         -            sqlite3_mprintf
  1009         -            ("%s</SourceChannelName>\r\n\t\t\t\t</BlueChannel>\r\n", prev);
  1010         -          sqlite3_free(prev);
  1011         -          prev = xml;
  1012         -        }
  1013         -      if (SingleBand == true)
  1014         -        {
  1015         -          xml =
  1016         -            sqlite3_mprintf
  1017         -            ("%s\t\t\t\t<GrayChannel>\r\n\t\t\t\t\t<SourceChannelName>%d", prev,
  1018         -             GrayBand + 1);
  1019         -          sqlite3_free(prev);
  1020         -          prev = xml;
  1021         -          xml =
  1022         -            sqlite3_mprintf
  1023         -            ("%s</SourceChannelName>\r\n\t\t\t\t</GrayChannel>\r\n", prev);
  1024         -          sqlite3_free(prev);
  1025         -          prev = xml;
  1026         -        }
  1027         -      xml = sqlite3_mprintf("%s\t\t\t</ChannelSelection>\r\n", prev);
  1028         -      sqlite3_free(prev);
  1029         -      prev = xml;
  1030         -    }
  1031         -  if (Normalize == true || Histogram == true || Gamma == true)
  1032         -    {
  1033         -      xml = sqlite3_mprintf("%s\t\t\t<ContrastEnhancement>\r\n", prev);
  1034         -      sqlite3_free(prev);
  1035         -      prev = xml;
  1036         -      if (Histogram == true)
  1037         -        {
  1038         -          xml = sqlite3_mprintf("%s\t\t\t\t<Histogram/>\r\n", prev);
  1039         -          sqlite3_free(prev);
  1040         -          prev = xml;
  1041         -      } else if (Gamma == true)
  1042         -        {
  1043         -          xml =
  1044         -            sqlite3_mprintf("%s\t\t\t\t<GammaValue>%1.2f</GammaValue>\r\n",
  1045         -                            prev, GammaValue);
  1046         -          sqlite3_free(prev);
  1047         -          prev = xml;
  1048         -      } else
  1049         -        {
  1050         -          xml = sqlite3_mprintf("%s\t\t\t\t<Normalize/>\r\n", prev);
  1051         -          sqlite3_free(prev);
  1052         -          prev = xml;
  1053         -        }
  1054         -      xml = sqlite3_mprintf("%s\t\t\t</ContrastEnhancement>\r\n", prev);
  1055         -      sqlite3_free(prev);
  1056         -      prev = xml;
  1057         -    }
  1058         -  if (ColorRamp == true)
  1059         -    {
  1060         -      xml = sqlite3_mprintf("%s\t\t\t<ColorMap>\r\n", prev);
  1061         -      sqlite3_free(prev);
  1062         -      prev = xml;
  1063         -      xml =
  1064         -        sqlite3_mprintf("%s\t\t\t\t<Interpolate fallbackValue=\"%s\">\r\n",
  1065         -                        prev, MinValueColor);
  1066         -      sqlite3_free(prev);
  1067         -      prev = xml;
  1068         -      xml =
  1069         -        sqlite3_mprintf("%s\t\t\t\t\t<LookupValue>Rasterdata</LookupValue>\r\n",
  1070         -                        prev);
  1071         -      sqlite3_free(prev);
  1072         -      prev = xml;
  1073         -      xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
  1074         -      sqlite3_free(prev);
  1075         -      prev = xml;
  1076         -      xml =
  1077         -        sqlite3_mprintf("%s\t\t\t\t\t\t<Data>%1.8f</Data>\r\n", prev, MinValue);
  1078         -      sqlite3_free(prev);
  1079         -      prev = xml;
  1080         -      xml =
  1081         -        sqlite3_mprintf("%s\t\t\t\t\t\t<Value>%s</Value>\r\n", prev,
  1082         -                        MinValueColor);
  1083         -      sqlite3_free(prev);
  1084         -      prev = xml;
  1085         -      xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
  1086         -      sqlite3_free(prev);
  1087         -      prev = xml;
  1088         -      xml = sqlite3_mprintf("%s\t\t\t\t\t<InterpolationPoint>\r\n", prev);
  1089         -      sqlite3_free(prev);
  1090         -      prev = xml;
  1091         -      xml =
  1092         -        sqlite3_mprintf("%s\t\t\t\t\t\t<Data>%1.8f</Data>\r\n", prev, MaxValue);
  1093         -      sqlite3_free(prev);
  1094         -      prev = xml;
  1095         -      xml =
  1096         -        sqlite3_mprintf("%s\t\t\t\t\t\t<Value>%s</Value>\r\n", prev,
  1097         -                        MaxValueColor);
  1098         -      sqlite3_free(prev);
  1099         -      prev = xml;
  1100         -      xml = sqlite3_mprintf("%s\t\t\t\t\t</InterpolationPoint>\r\n", prev);
  1101         -      sqlite3_free(prev);
  1102         -      prev = xml;
  1103         -      xml = sqlite3_mprintf("%s\t\t\t\t</Interpolate>\r\n", prev);
  1104         -      sqlite3_free(prev);
  1105         -      prev = xml;
  1106         -      xml = sqlite3_mprintf("%s\t\t\t</ColorMap>\r\n", prev);
  1107         -      sqlite3_free(prev);
  1108         -      prev = xml;
  1109         -    }
  1110         -shaded_relief:
  1111         -  if (ShadedRelief == true)
  1112         -    {
  1113         -      xml = sqlite3_mprintf("%s\t\t\t<ShadedRelief>\r\n", prev);
  1114         -      sqlite3_free(prev);
  1115         -      prev = xml;
  1116         -      xml =
  1117         -        sqlite3_mprintf("%s\t\t\t\t<ReliefFactor>%1.2f</ReliefFactor>\r\n",
  1118         -                        prev, ShadedReliefFactor);
  1119         -      sqlite3_free(prev);
  1120         -      prev = xml;
  1121         -      xml = sqlite3_mprintf("%s\t\t\t</ShadedRelief>\r\n", prev);
  1122         -      sqlite3_free(prev);
  1123         -      prev = xml;
  1124         -    }
  1125         -foot:
  1126         -  xml = sqlite3_mprintf("%s\t\t</RasterSymbolizer>\r\n", prev);
  1127         -  sqlite3_free(prev);
  1128         -  prev = xml;
  1129         -  xml = sqlite3_mprintf("%s\t</Rule>\r\n</CoverageStyle>\r\n", prev);
  1130         -  sqlite3_free(prev);
  1131         -  return xml;
  1132         -}
  1133         -
  1134         -unsigned char *QuickStyleRasterObj::CloneXmlStyle()
  1135         -{
  1136         -//
  1137         -// cloning the XML Style definition
  1138         -//
  1139         -  if (XmlStyle == NULL)
  1140         -    XmlStyle = CreateXmlStyle();
  1141         -  if (XmlStyle == NULL)
  1142         -    return NULL;
  1143         -  int len = strlen(XmlStyle);
  1144         -  char *cloned = (char *) malloc(len + 1);
  1145         -  strcpy(cloned, XmlStyle);
  1146         -  return (unsigned char *) cloned;
  1147         -}
  1148         -
  1149         -void QuickStyleRasterObj::UpdateXmlStyle()
  1150         -{
  1151         -//
  1152         -// updating the XML Style
  1153         -//
  1154         -  if (XmlStyle != NULL)
  1155         -    sqlite3_free(XmlStyle);
  1156         -  XmlStyle = CreateXmlStyle();
  1157         -}
  1158         -
  1159         -bool QuickStyleRasterDialog::Create(MyMapPanel * parent, MapLayer * layer)
  1160         -{
  1161         -//
  1162         -// creating the dialog
  1163         -//
  1164         -  MainFrame = parent->GetParent();
  1165         -  MapPanel = parent;
  1166         -  Layer = layer;
  1167         -  DbPrefix = layer->GetDbPrefix();
  1168         -  LayerName = layer->GetName();
  1169         -  CanApplyContrastEnhancement = true;
  1170         -  IsMultiband = false;
  1171         -  CanApplyColorMap = false;
  1172         -  CanApplyShadedRelief = false;
  1173         -  RedBand = 0;
  1174         -  GreenBand = 0;
  1175         -  BlueBand = 0;
  1176         -  GrayBand = 0;
  1177         -  MinPixelValue = 0.0;
  1178         -  MaxPixelValue = 0.0;
  1179         -  GetCoverageInfos();
  1180         -  IsConfigChanged = false;
  1181         -
  1182         -  if (wxPropertySheetDialog::Create
  1183         -      (parent, wxID_ANY, wxT("QuickStyle (Raster) Edit")) == false)
  1184         -    return false;
  1185         -  if (Layer->GetQuickStyleRaster() != NULL)
  1186         -    Style = Layer->CloneQuickStyleRaster();
  1187         -  else
  1188         -    Style = new QuickStyleRasterObj();
  1189         -  Style->SetRedBand(RedBand);
  1190         -  Style->SetGreenBand(GreenBand);
  1191         -  Style->SetBlueBand(BlueBand);
  1192         -  Style->SetGrayBand(GrayBand);
  1193         -  Style->SetMinValue(MinPixelValue);
  1194         -  Style->SetMaxValue(MaxPixelValue);
  1195         -
  1196         -  wxBookCtrlBase *book = GetBookCtrl();
  1197         -// creates individual panels
  1198         -  int next = 1;
  1199         -  PageContrastEnhancementIndex = 0;
  1200         -  PageChannelSelectionIndex = 0;
  1201         -  PageColorMapIndex = 0;
  1202         -  wxPanel *mainPage = CreateMainPage(book);
  1203         -  book->AddPage(mainPage, wxT("General"), true);
  1204         -  wxPanel *contrastEnhancementPage = CreateContrastEnhancementPage(book);
  1205         -  book->AddPage(contrastEnhancementPage, wxT("ContrastEnhancement"), false);
  1206         -  PageContrastEnhancementIndex = next++;
  1207         -  wxPanel *channelSelectionPage = CreateChannelSelectionPage(book);
  1208         -  book->AddPage(channelSelectionPage, wxT("ChannelSelection"), false);
  1209         -  PageChannelSelectionIndex = next++;
  1210         -  wxPanel *colorMapPage = CreateColorMapPage(book);
  1211         -  book->AddPage(colorMapPage, wxT("ColorMap"), false);
  1212         -  PageColorMapIndex = next++;
  1213         -
  1214         -  CreateButtons();
  1215         -  LayoutDialog();
  1216         -// appends event handler for TAB/PAGE changing
  1217         -  Connect(wxID_ANY, wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING,
  1218         -          (wxObjectEventFunction) & QuickStyleRasterDialog::OnPageChanging);
  1219         -  Connect(wxID_ANY, wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,
  1220         -          (wxObjectEventFunction) & QuickStyleRasterDialog::OnPageChanged);
  1221         -// appends event handler for buttons
  1222         -  Connect(wxID_CANCEL, wxEVT_COMMAND_BUTTON_CLICKED,
  1223         -          (wxObjectEventFunction) & QuickStyleRasterDialog::OnQuit);
  1224         -  Connect(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED,
  1225         -          (wxObjectEventFunction) & QuickStyleRasterDialog::OnOk);
  1226         -  Connect(ID_QUICK_STYLE_APPLY, wxEVT_COMMAND_BUTTON_CLICKED,
  1227         -          (wxObjectEventFunction) & QuickStyleRasterDialog::OnApply);
  1228         -  Connect(ID_QUICK_STYLE_EXPORT, wxEVT_COMMAND_BUTTON_CLICKED,
  1229         -          (wxObjectEventFunction) & QuickStyleRasterDialog::OnExport);
  1230         -  Connect(ID_QUICK_STYLE_COPY, wxEVT_COMMAND_BUTTON_CLICKED,
  1231         -          (wxObjectEventFunction) & QuickStyleRasterDialog::OnCopy);
  1232         -// centers the dialog window
  1233         -  Centre();
  1234         -  UpdateMainPage();
  1235         -  return true;
  1236         -}
  1237         -
  1238         -void QuickStyleRasterDialog::CreateButtons()
  1239         -{
  1240         -// 
  1241         -// adding the common Buttons
  1242         -//
  1243         -  wxBoxSizer *topSizer = (wxBoxSizer *) (this->GetSizer());
  1244         -  wxBoxSizer *btnBox = new wxBoxSizer(wxHORIZONTAL);
  1245         -  topSizer->Add(btnBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1246         -  wxButton *save = new wxButton(this, ID_QUICK_STYLE_APPLY, wxT("&Apply"));
  1247         -  btnBox->Add(save, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1248         -  wxButton *exp =
  1249         -    new wxButton(this, ID_QUICK_STYLE_EXPORT, wxT("&Export to file"));
  1250         -  btnBox->Add(exp, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1251         -  wxButton *copy = new wxButton(this, ID_QUICK_STYLE_COPY, wxT("&Copy"));
  1252         -  btnBox->Add(copy, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1253         -  btnBox->AddSpacer(100);
  1254         -  wxButton *ok = new wxButton(this, wxID_OK, wxT("&Ok"));
  1255         -  btnBox->Add(ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1256         -  wxButton *cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel"));
  1257         -  btnBox->Add(cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1258         -}
  1259         -
  1260         -wxPanel *QuickStyleRasterDialog::CreateMainPage(wxWindow * parent)
  1261         -{
  1262         -//
  1263         -// creating the MAIN page
  1264         -//
  1265         -  wxPanel *panel = new wxPanel(parent, ID_PANE_MAIN);
  1266         -  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
  1267         -  panel->SetSizer(topSizer);
  1268         -  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
  1269         -  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
  1270         -// First row: Layer name
  1271         -  wxBoxSizer *lyrBoxSizer = new wxBoxSizer(wxVERTICAL);
  1272         -  boxSizer->Add(lyrBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1273         -  wxBoxSizer *nameSizer = new wxBoxSizer(wxVERTICAL);
  1274         -  lyrBoxSizer->Add(nameSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1275         -  wxStaticBox *nameBox = new wxStaticBox(panel, wxID_ANY,
  1276         -                                         wxT("Layer FullName"),
  1277         -                                         wxDefaultPosition,
  1278         -                                         wxDefaultSize);
  1279         -  wxBoxSizer *nameBoxSizer = new wxStaticBoxSizer(nameBox, wxHORIZONTAL);
  1280         -  nameSizer->Add(nameBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1281         -  wxString fullName = DbPrefix + wxT(".") + LayerName;
  1282         -  wxTextCtrl *nameCtrl = new wxTextCtrl(panel, ID_VECTOR_LAYER, fullName,
  1283         -                                        wxDefaultPosition, wxSize(370, 22),
  1284         -                                        wxTE_READONLY);
  1285         -  nameBoxSizer->Add(nameCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1286         -  wxStaticBox *uuidBox = new wxStaticBox(panel, wxID_ANY,
  1287         -                                         wxT("QuickStyle Name"),
  1288         -                                         wxDefaultPosition,
  1289         -                                         wxDefaultSize);
  1290         -  wxBoxSizer *uuidBoxSizer = new wxStaticBoxSizer(uuidBox, wxHORIZONTAL);
  1291         -  nameSizer->Add(uuidBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1292         -  wxString uuid = wxString::FromUTF8(Style->GetUUID());
  1293         -  wxTextCtrl *uuidCtrl = new wxTextCtrl(panel, ID_VECTOR_UUID, uuid,
  1294         -                                        wxDefaultPosition, wxSize(370, 22),
  1295         -                                        wxTE_READONLY);
  1296         -  uuidBoxSizer->Add(uuidCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1297         -// second row: Visibility Range
  1298         -  wxBoxSizer *miscSizer = new wxBoxSizer(wxHORIZONTAL);
  1299         -  boxSizer->Add(miscSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  1300         -  wxBoxSizer *visibilityBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  1301         -  miscSizer->Add(visibilityBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  1302         -  wxStaticBox *visibilityBox = new wxStaticBox(panel, wxID_STATIC,
  1303         -                                               wxT("Visibility Range"),
  1304         -                                               wxDefaultPosition,
  1305         -                                               wxDefaultSize);
  1306         -  wxBoxSizer *visibilitySizer =
  1307         -    new wxStaticBoxSizer(visibilityBox, wxHORIZONTAL);
  1308         -  visibilityBoxSizer->Add(visibilitySizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL,
  1309         -                          5);
  1310         -  wxString range[4];
  1311         -  range[0] = wxT("&None");
  1312         -  range[1] = wxT("&Min");
  1313         -  range[2] = wxT("&Max");
  1314         -  range[3] = wxT("&Both");
  1315         -  wxRadioBox *rangeBox = new wxRadioBox(panel, ID_SYMBOLIZER_MINMAX_SCALE,
  1316         -                                        wxT("&Range Type"),
  1317         -                                        wxDefaultPosition,
  1318         -                                        wxDefaultSize, 4,
  1319         -                                        range, 2,
  1320         -                                        wxRA_SPECIFY_COLS);
  1321         -  visibilitySizer->Add(rangeBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1322         -  rangeBox->SetSelection(0);
  1323         -  wxBoxSizer *scaleBoxSizer = new wxBoxSizer(wxVERTICAL);
  1324         -  visibilitySizer->Add(scaleBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1325         -  wxBoxSizer *scaleMinSizer = new wxBoxSizer(wxHORIZONTAL);
  1326         -  scaleBoxSizer->Add(scaleMinSizer, 0, wxALIGN_RIGHT | wxALL, 5);
  1327         -  wxStaticText *minScaleLabel =
  1328         -    new wxStaticText(panel, wxID_STATIC, wxT("&Min Scale:"));
  1329         -  scaleMinSizer->Add(minScaleLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1330         -  wxTextCtrl *minScaleCtrl =
  1331         -    new wxTextCtrl(panel, ID_SYMBOLIZER_MIN_SCALE, wxT("0.0"),
  1332         -                   wxDefaultPosition, wxSize(100, 22));
  1333         -  minScaleCtrl->Enable(false);
  1334         -  scaleMinSizer->Add(minScaleCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1335         -  wxBoxSizer *scaleMaxSizer = new wxBoxSizer(wxHORIZONTAL);
  1336         -  scaleBoxSizer->Add(scaleMaxSizer, 0, wxALIGN_RIGHT | wxALL, 0);
  1337         -  wxStaticText *maxScaleLabel =
  1338         -    new wxStaticText(panel, wxID_STATIC, wxT("&Max Scale:"));
  1339         -  scaleMaxSizer->Add(maxScaleLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1340         -  wxTextCtrl *maxScaleCtrl =
  1341         -    new wxTextCtrl(panel, ID_SYMBOLIZER_MAX_SCALE, wxT("+Infinite"),
  1342         -                   wxDefaultPosition, wxSize(100, 22));
  1343         -  maxScaleCtrl->Enable(false);
  1344         -  scaleMaxSizer->Add(maxScaleCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1345         -// third row: Opacity 
  1346         -  wxBoxSizer *opacityBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  1347         -  boxSizer->Add(opacityBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1348         -  wxStaticBox *opacityBox = new wxStaticBox(panel, wxID_STATIC,
  1349         -                                            wxT("Opacity"),
  1350         -                                            wxDefaultPosition,
  1351         -                                            wxDefaultSize);
  1352         -  wxBoxSizer *opacitySizer = new wxStaticBoxSizer(opacityBox, wxVERTICAL);
  1353         -  opacityBoxSizer->Add(opacitySizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1354         -  wxSlider *opacityCtrl =
  1355         -    new wxSlider(panel, ID_SYMBOLIZER_OPACITY, 100, 0, 100,
  1356         -                 wxDefaultPosition, wxSize(400, 45),
  1357         -                 wxSL_HORIZONTAL | wxSL_LABELS);
  1358         -  opacitySizer->Add(opacityCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1359         -  panel->SetSizer(topSizer);
  1360         -  topSizer->Fit(panel);
  1361         -// appends event handlers
  1362         -  Connect(ID_SYMBOLIZER_MINMAX_SCALE, wxEVT_COMMAND_RADIOBOX_SELECTED,
  1363         -          (wxObjectEventFunction) & QuickStyleRasterDialog::OnCmdScaleChanged);
  1364         -  return panel;
  1365         -}
  1366         -
  1367         -void QuickStyleRasterDialog::
  1368         -OnCmdScaleChanged(wxCommandEvent & WXUNUSED(event))
  1369         -{
  1370         -//
  1371         -// Visibility Range selection changed
  1372         -//
  1373         -  wxRadioBox *scaleModeCtrl =
  1374         -    (wxRadioBox *) FindWindow(ID_SYMBOLIZER_MINMAX_SCALE);
  1375         -  wxTextCtrl *minCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MIN_SCALE);
  1376         -  wxTextCtrl *maxCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MAX_SCALE);
  1377         -  switch (scaleModeCtrl->GetSelection())
  1378         -    {
  1379         -      case 0:
  1380         -        Style->EnableMinScale(false);
  1381         -        Style->EnableMaxScale(false);
  1382         -        minCtrl->SetValue(wxT("0.0"));
  1383         -        minCtrl->Enable(false);
  1384         -        maxCtrl->SetValue(wxT("+Infinite"));
  1385         -        maxCtrl->Enable(false);
  1386         -        break;
  1387         -      case 1:
  1388         -        Style->EnableMinScale(true);
  1389         -        Style->EnableMaxScale(false);
  1390         -        minCtrl->SetValue(wxT(""));
  1391         -        minCtrl->Enable(true);
  1392         -        maxCtrl->SetValue(wxT("+Infinite"));
  1393         -        maxCtrl->Enable(false);
  1394         -        break;
  1395         -      case 2:
  1396         -        Style->EnableMinScale(false);
  1397         -        Style->EnableMaxScale(true);
  1398         -        minCtrl->SetValue(wxT("0.0"));
  1399         -        minCtrl->Enable(false);
  1400         -        maxCtrl->SetValue(wxT(""));
  1401         -        maxCtrl->Enable(true);
  1402         -        break;
  1403         -      case 3:
  1404         -        Style->EnableMinScale(true);
  1405         -        Style->EnableMaxScale(true);
  1406         -        minCtrl->SetValue(wxT(""));
  1407         -        minCtrl->Enable(true);
  1408         -        maxCtrl->SetValue(wxT(""));
  1409         -        maxCtrl->Enable(true);
  1410         -        break;
  1411         -    };
  1412         -}
  1413         -
  1414         -wxPanel *QuickStyleRasterDialog::CreateContrastEnhancementPage(wxWindow *
  1415         -                                                               parent)
  1416         -{
  1417         -//
  1418         -// creating the Contrast Enhancement page
  1419         -//
  1420         -  wxPanel *panel = new wxPanel(parent, ID_PANE_CONTRAST_ENHANCEMENT);
  1421         -  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
  1422         -  panel->SetSizer(topSizer);
  1423         -  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
  1424         -  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
  1425         -// first row: Contrast Enhancement
  1426         -  boxSizer->AddSpacer(100);
  1427         -  wxBoxSizer *contrastSizer = new wxBoxSizer(wxHORIZONTAL);
  1428         -  boxSizer->Add(contrastSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1429         -  wxString contrast[4];
  1430         -  contrast[0] = wxT("&None");
  1431         -  contrast[1] = wxT("Normalize/&Stretch");
  1432         -  contrast[2] = wxT("&Histogram");
  1433         -  contrast[3] = wxT("&GammaValue");
  1434         -  wxRadioBox *contrastBox = new wxRadioBox(panel, ID_SYMBOLIZER_CONTRAST,
  1435         -                                           wxT("&Contrast Enhancement Method"),
  1436         -                                           wxDefaultPosition,
  1437         -                                           wxDefaultSize, 4,
  1438         -                                           contrast, 1,
  1439         -                                           wxRA_SPECIFY_COLS);
  1440         -  contrastSizer->Add(contrastBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1441         -  contrastBox->SetSelection(0);
  1442         -  if (CanApplyContrastEnhancement == false)
  1443         -    contrastBox->Enable(false);
  1444         -  wxBoxSizer *gammaSizer = new wxBoxSizer(wxHORIZONTAL);
  1445         -  contrastSizer->Add(gammaSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  1446         -  wxStaticText *gammaLabel =
  1447         -    new wxStaticText(panel, wxID_STATIC, wxT("&GammaValue [x100]:"));
  1448         -  gammaSizer->Add(gammaLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1449         -  wxSpinCtrl *gammaCtrl = new wxSpinCtrl(panel, ID_SYMBOLIZER_GAMMA, wxT("100"),
  1450         -                                         wxDefaultPosition, wxSize(80, 22),
  1451         -                                         wxSP_ARROW_KEYS,
  1452         -                                         100, 500, 100);
  1453         -  gammaCtrl->Enable(false);
  1454         -  gammaSizer->Add(gammaCtrl, 0, wxALIGN_RIGHT | wxALL, 5);
  1455         -  panel->SetSizer(topSizer);
  1456         -  topSizer->Fit(panel);
  1457         -// appends event handler for OK button
  1458         -  Connect(ID_SYMBOLIZER_CONTRAST, wxEVT_COMMAND_RADIOBOX_SELECTED,
  1459         -          (wxObjectEventFunction) &
  1460         -          QuickStyleRasterDialog::OnCmdContrastChanged);
  1461         -  return panel;
  1462         -}
  1463         -
  1464         -void QuickStyleRasterDialog::
  1465         -OnCmdContrastChanged(wxCommandEvent & WXUNUSED(event))
  1466         -{
  1467         -//
  1468         -// Contrast Enhancement Method selection changed
  1469         -//
  1470         -  wxRadioBox *contrastCtrl = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_CONTRAST);
  1471         -  wxSpinCtrl *gammaCtrl = (wxSpinCtrl *) FindWindow(ID_SYMBOLIZER_GAMMA);
  1472         -  switch (contrastCtrl->GetSelection())
  1473         -    {
  1474         -      case 1:
  1475         -        Style->SetNormalize(true);
  1476         -        Style->SetHistogram(false);
  1477         -        Style->SetGamma(false);
  1478         -        gammaCtrl->Enable(false);
  1479         -        break;
  1480         -      case 2:
  1481         -        Style->SetNormalize(false);
  1482         -        Style->SetHistogram(true);
  1483         -        Style->SetGamma(false);
  1484         -        gammaCtrl->Enable(false);
  1485         -        break;
  1486         -      case 3:
  1487         -        Style->SetNormalize(false);
  1488         -        Style->SetHistogram(false);
  1489         -        Style->SetGamma(true);
  1490         -        gammaCtrl->Enable(true);
  1491         -        break;
  1492         -      default:
  1493         -        Style->SetNormalize(false);
  1494         -        Style->SetHistogram(false);
  1495         -        Style->SetGamma(false);
  1496         -        gammaCtrl->Enable(false);
  1497         -        break;
  1498         -    };
  1499         -}
  1500         -
  1501         -wxPanel *QuickStyleRasterDialog::CreateChannelSelectionPage(wxWindow * parent)
  1502         -{
  1503         -//
  1504         -// creating the Channel Selection page
  1505         -//
  1506         -  wxPanel *panel = new wxPanel(parent, ID_PANE_CHANNEL_SELECTION);
  1507         -  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
  1508         -  panel->SetSizer(topSizer);
  1509         -  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
  1510         -  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
  1511         -  panel->SetSizer(topSizer);
  1512         -// Left panel: mode selector
  1513         -  boxSizer->AddSpacer(50);
  1514         -  wxBoxSizer *pageSizer = new wxBoxSizer(wxHORIZONTAL);
  1515         -  boxSizer->Add(pageSizer, 0, wxALIGN_CENTER_VERTICAL);
  1516         -  wxBoxSizer *leftSizer = new wxBoxSizer(wxVERTICAL);
  1517         -  pageSizer->Add(leftSizer, 0, wxALIGN_CENTER_VERTICAL);
  1518         -  wxString mode[3];
  1519         -  mode[0] = wxT("&None");
  1520         -  mode[1] = wxT("&Triple Band (RGB Image)");
  1521         -  mode[2] = wxT("&Single Band (Grayscale Image)");
  1522         -  wxRadioBox *bandModeBox = new wxRadioBox(panel, ID_SYMBOLIZER_BAND_MODE,
  1523         -                                           wxT("&Channel Selection Method"),
  1524         -                                           wxDefaultPosition,
  1525         -                                           wxDefaultSize, 3,
  1526         -                                           mode, 1,
  1527         -                                           wxRA_SPECIFY_COLS);
  1528         -  leftSizer->Add(bandModeBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1529         -  bandModeBox->SetSelection(0);
  1530         -  if (IsMultiband == false)
  1531         -    bandModeBox->Enable(false);
  1532         -// First row: ChannelSelection RGB
  1533         -  wxBoxSizer *rightSizer = new wxBoxSizer(wxVERTICAL);
  1534         -  pageSizer->Add(rightSizer, 0, wxALIGN_CENTER_HORIZONTAL);
  1535         -  wxBoxSizer *channelBoxSizer = new wxBoxSizer(wxVERTICAL);
  1536         -  rightSizer->Add(channelBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1537         -  wxStaticBox *channelBox = new wxStaticBox(panel, wxID_STATIC,
  1538         -                                            wxT
  1539         -                                            ("Channel Selection (first Band is #1)"),
  1540         -                                            wxDefaultPosition,
  1541         -                                            wxDefaultSize);
  1542         -  wxBoxSizer *channelSizer = new wxStaticBoxSizer(channelBox, wxVERTICAL);
  1543         -  channelBoxSizer->Add(channelSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  1544         -  wxBoxSizer *bandSizer = new wxBoxSizer(wxVERTICAL);
  1545         -  channelSizer->Add(bandSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1546         -  wxBoxSizer *redSizer = new wxBoxSizer(wxHORIZONTAL);
  1547         -  bandSizer->Add(redSizer, 0, wxALIGN_RIGHT | wxALL, 3);
  1548         -  wxStaticText *redLabel =
  1549         -    new wxStaticText(panel, wxID_STATIC, wxT("&Red Channel is Band #"));
  1550         -  redSizer->Add(redLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1551         -  wxSpinCtrl *redCtrl = new wxSpinCtrl(panel, ID_SYMBOLIZER_RED, wxT("1"),
  1552         -                                       wxDefaultPosition, wxSize(80, 22),
  1553         -                                       wxSP_ARROW_KEYS,
  1554         -                                       1, 256, 1);
  1555         -  redSizer->Add(redCtrl, 0, wxALIGN_RIGHT | wxALL, 0);
  1556         -  redCtrl->Enable(false);
  1557         -  wxBoxSizer *greenSizer = new wxBoxSizer(wxHORIZONTAL);
  1558         -  bandSizer->Add(greenSizer, 0, wxALIGN_RIGHT | wxALL, 3);
  1559         -  wxStaticText *greenLabel =
  1560         -    new wxStaticText(panel, wxID_STATIC, wxT("&Green Channel is Band #"));
  1561         -  greenSizer->Add(greenLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1562         -  wxSpinCtrl *greenCtrl = new wxSpinCtrl(panel, ID_SYMBOLIZER_GREEN, wxT("2"),
  1563         -                                         wxDefaultPosition, wxSize(80, 22),
  1564         -                                         wxSP_ARROW_KEYS,
  1565         -                                         1, 256, 2);
  1566         -  greenSizer->Add(greenCtrl, 0, wxALIGN_RIGHT | wxALL, 0);
  1567         -  greenCtrl->Enable(false);
  1568         -  wxBoxSizer *blueSizer = new wxBoxSizer(wxHORIZONTAL);
  1569         -  bandSizer->Add(blueSizer, 0, wxALIGN_RIGHT | wxALL, 3);
  1570         -  wxStaticText *blueLabel =
  1571         -    new wxStaticText(panel, wxID_STATIC, wxT("&Blue Channel is Band #"));
  1572         -  blueSizer->Add(blueLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1573         -  wxSpinCtrl *blueCtrl = new wxSpinCtrl(panel, ID_SYMBOLIZER_BLUE, wxT("3"),
  1574         -                                        wxDefaultPosition, wxSize(80, 22),
  1575         -                                        wxSP_ARROW_KEYS,
  1576         -                                        1, 256, 3);
  1577         -  blueSizer->Add(blueCtrl, 0, wxALIGN_RIGHT | wxALL, 0);
  1578         -  blueCtrl->Enable(false);
  1579         -// Second row: ChannelSelection Grayscale
  1580         -  rightSizer->AddSpacer(25);
  1581         -  wxBoxSizer *channel2BoxSizer = new wxBoxSizer(wxVERTICAL);
  1582         -  rightSizer->Add(channel2BoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1583         -  wxStaticBox *channel2Box = new wxStaticBox(panel, wxID_STATIC,
  1584         -                                             wxT
  1585         -                                             ("Channel Selection (first Band is #1)"),
  1586         -                                             wxDefaultPosition,
  1587         -                                             wxDefaultSize);
  1588         -  wxBoxSizer *channel2Sizer = new wxStaticBoxSizer(channel2Box, wxVERTICAL);
  1589         -  channel2BoxSizer->Add(channel2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  1590         -  wxBoxSizer *band2Sizer = new wxBoxSizer(wxVERTICAL);
  1591         -  channel2Sizer->Add(band2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1592         -  wxBoxSizer *graySizer = new wxBoxSizer(wxHORIZONTAL);
  1593         -  band2Sizer->Add(graySizer, 0, wxALIGN_RIGHT | wxALL, 3);
  1594         -  wxStaticText *grayLabel =
  1595         -    new wxStaticText(panel, wxID_STATIC, wxT("&Gray Channel is Band #"));
  1596         -  graySizer->Add(grayLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1597         -  wxSpinCtrl *grayCtrl = new wxSpinCtrl(panel, ID_SYMBOLIZER_GRAY, wxT("1"),
  1598         -                                        wxDefaultPosition, wxSize(80, 22),
  1599         -                                        wxSP_ARROW_KEYS,
  1600         -                                        1, 256, 1);
  1601         -  graySizer->Add(grayCtrl, 0, wxALIGN_RIGHT | wxALL, 0);
  1602         -  grayCtrl->Enable(false);
  1603         -  topSizer->Fit(panel);
  1604         -// appends event handlers
  1605         -  Connect(ID_SYMBOLIZER_BAND_MODE, wxEVT_COMMAND_RADIOBOX_SELECTED,
  1606         -          (wxObjectEventFunction) &
  1607         -          QuickStyleRasterDialog::OnCmdBandModeChanged);
  1608         -  return panel;
  1609         -}
  1610         -
  1611         -void QuickStyleRasterDialog::
  1612         -OnCmdBandModeChanged(wxCommandEvent & WXUNUSED(event))
  1613         -{
  1614         -//
  1615         -// Channel Selection Method selection changed
  1616         -//
  1617         -  wxRadioBox *bandModeCtrl = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_BAND_MODE);
  1618         -  wxSpinCtrl *redCtrl = (wxSpinCtrl *) FindWindow(ID_SYMBOLIZER_RED);
  1619         -  wxSpinCtrl *greenCtrl = (wxSpinCtrl *) FindWindow(ID_SYMBOLIZER_GREEN);
  1620         -  wxSpinCtrl *blueCtrl = (wxSpinCtrl *) FindWindow(ID_SYMBOLIZER_BLUE);
  1621         -  wxSpinCtrl *grayCtrl = (wxSpinCtrl *) FindWindow(ID_SYMBOLIZER_GRAY);
  1622         -  switch (bandModeCtrl->GetSelection())
  1623         -    {
  1624         -      case 1:
  1625         -        Style->SetTripleBand(true);
  1626         -        Style->SetSingleBand(false);
  1627         -        redCtrl->Enable(true);
  1628         -        greenCtrl->Enable(true);
  1629         -        blueCtrl->Enable(true);
  1630         -        grayCtrl->Enable(false);
  1631         -        break;
  1632         -      case 2:
  1633         -        Style->SetTripleBand(false);
  1634         -        Style->SetSingleBand(true);
  1635         -        redCtrl->Enable(false);
  1636         -        greenCtrl->Enable(false);
  1637         -        blueCtrl->Enable(false);
  1638         -        grayCtrl->Enable(true);
  1639         -        break;
  1640         -      default:
  1641         -        Style->SetTripleBand(false);
  1642         -        Style->SetSingleBand(false);
  1643         -        redCtrl->Enable(false);
  1644         -        greenCtrl->Enable(false);
  1645         -        blueCtrl->Enable(false);
  1646         -        grayCtrl->Enable(false);
  1647         -        break;
  1648         -    };
  1649         -}
  1650         -
  1651         -wxPanel *QuickStyleRasterDialog::CreateColorMapPage(wxWindow * parent)
  1652         -{
  1653         -//
  1654         -// creating the ColorMap page
  1655         -//
  1656         -  wxPanel *panel = new wxPanel(parent, ID_PANE_COLOR_MAP);
  1657         -  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
  1658         -  panel->SetSizer(topSizer);
  1659         -  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
  1660         -  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
  1661         -  boxSizer->AddSpacer(50);
  1662         -  wxBoxSizer *mainSizer = new wxBoxSizer(wxHORIZONTAL);
  1663         -  boxSizer->Add(mainSizer, 0, wxALIGN_CENTER | wxALL, 5);
  1664         -// left box: mode selector
  1665         -  wxBoxSizer *modeSizer = new wxBoxSizer(wxVERTICAL);
  1666         -  mainSizer->Add(modeSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  1667         -  int max = 4;
  1668         -  if (CanApplyNDVI == true)
  1669         -    max = 2;
  1670         -  wxString mode[max];
  1671         -  mode[0] = wxT("&None");
  1672         -  if (CanApplyNDVI == true)
  1673         -    mode[1] = wxT("&NDVI (predefined style)");
  1674         -  else
  1675         -    {
  1676         -      mode[1] = wxT("&SRTM (predefined style)");
  1677         -      mode[2] = wxT("&Terrain (predefined style)");
  1678         -      mode[3] = wxT("&Color Ramp");
  1679         -    }
  1680         -  wxRadioBox *modeBox = new wxRadioBox(panel, ID_SYMBOLIZER_COLOR_MAP_MODE,
  1681         -                                       wxT("&Color Map Type"),
  1682         -                                       wxDefaultPosition,
  1683         -                                       wxDefaultSize, max,
  1684         -                                       mode, 1,
  1685         -                                       wxRA_SPECIFY_COLS);
  1686         -  modeSizer->Add(modeBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1687         -  modeBox->SetSelection(0);
  1688         -  if (CanApplyColorMap == false && CanApplyNDVI == false)
  1689         -    modeBox->Enable(false);
  1690         -// right box: Color Ramp
  1691         -  wxBoxSizer *rampSizer = new wxBoxSizer(wxVERTICAL);
  1692         -  mainSizer->Add(rampSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  1693         -  wxStaticBox *rampBox = new wxStaticBox(panel, wxID_STATIC,
  1694         -                                         wxT("Color Ramp"),
  1695         -                                         wxDefaultPosition,
  1696         -                                         wxDefaultSize);
  1697         -  wxBoxSizer *ramp2Sizer = new wxStaticBoxSizer(rampBox, wxVERTICAL);
  1698         -  rampSizer->Add(ramp2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  1699         -  wxBoxSizer *minSizer = new wxBoxSizer(wxHORIZONTAL);
  1700         -  ramp2Sizer->Add(minSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 3);
  1701         -// Min Color
  1702         -  wxStaticBox *minBox = new wxStaticBox(panel, wxID_STATIC,
  1703         -                                        wxT("Min Value"),
  1704         -                                        wxDefaultPosition,
  1705         -                                        wxDefaultSize);
  1706         -  wxBoxSizer *min2Sizer = new wxStaticBoxSizer(minBox, wxHORIZONTAL);
  1707         -  minSizer->Add(min2Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1708         -  wxString minColor = wxT("#000000");
  1709         -  wxTextCtrl *colorMinCtrl =
  1710         -    new wxTextCtrl(panel, ID_SYMBOLIZER_MIN_COLOR, minColor,
  1711         -                   wxDefaultPosition, wxSize(80, 22));
  1712         -  min2Sizer->Add(colorMinCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1713         -  colorMinCtrl->Enable(false);
  1714         -  wxBitmap bmp;
  1715         -  wxColour color(0, 0, 0);
  1716         -  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
  1717         -  wxStaticBitmap *sampleMinCtrl =
  1718         -    new wxStaticBitmap(panel, ID_SYMBOLIZER_MIN_PICKER_HEX, bmp,
  1719         -                       wxDefaultPosition, wxSize(32, 32));
  1720         -  min2Sizer->Add(sampleMinCtrl, 0, wxALIGN_RIGHT | wxALL, 5);
  1721         -  wxButton *minPick =
  1722         -    new wxButton(panel, ID_SYMBOLIZER_MIN_PICKER_BTN, wxT("&Pick a color"));
  1723         -  min2Sizer->Add(minPick, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  1724         -  minPick->Enable(false);
  1725         -// Max Color
  1726         -  wxBoxSizer *maxSizer = new wxBoxSizer(wxHORIZONTAL);
  1727         -  ramp2Sizer->Add(maxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 3);
  1728         -  wxStaticBox *maxBox = new wxStaticBox(panel, wxID_STATIC,
  1729         -                                        wxT("Max Value"),
  1730         -                                        wxDefaultPosition,
  1731         -                                        wxDefaultSize);
  1732         -  wxBoxSizer *max2Sizer = new wxStaticBoxSizer(maxBox, wxHORIZONTAL);
  1733         -  maxSizer->Add(max2Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1734         -  wxString maxColor = wxT("#ffffff");
  1735         -  wxTextCtrl *colorMaxCtrl =
  1736         -    new wxTextCtrl(panel, ID_SYMBOLIZER_MAX_COLOR, maxColor,
  1737         -                   wxDefaultPosition, wxSize(80, 22));
  1738         -  max2Sizer->Add(colorMaxCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1739         -  colorMaxCtrl->Enable(false);
  1740         -  wxBitmap bmp2;
  1741         -  wxColour color2(255, 255, 255);
  1742         -  ColorMapEntry::DoPaintColorSample(32, 32, color2, bmp2);
  1743         -  wxStaticBitmap *sampleMaxCtrl =
  1744         -    new wxStaticBitmap(panel, ID_SYMBOLIZER_MAX_PICKER_HEX, bmp2,
  1745         -                       wxDefaultPosition, wxSize(32, 32));
  1746         -  max2Sizer->Add(sampleMaxCtrl, 0, wxALIGN_RIGHT | wxALL, 5);
  1747         -  wxButton *maxPick =
  1748         -    new wxButton(panel, ID_SYMBOLIZER_MAX_PICKER_BTN, wxT("&Pick a color"));
  1749         -  max2Sizer->Add(maxPick, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  1750         -  maxPick->Enable(false);
  1751         -// bottom box: shaded relief
  1752         -  wxBoxSizer *shadedSizer = new wxBoxSizer(wxHORIZONTAL);
  1753         -  boxSizer->Add(shadedSizer, 0, wxALIGN_CENTER_HORIZONTAL);
  1754         -  wxStaticBox *shadedBox = new wxStaticBox(panel, wxID_STATIC,
  1755         -                                           wxT("Shaded Relief"),
  1756         -                                           wxDefaultPosition,
  1757         -                                           wxDefaultSize);
  1758         -  wxBoxSizer *shaded2Sizer = new wxStaticBoxSizer(shadedBox, wxHORIZONTAL);
  1759         -  shadedSizer->Add(shaded2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  1760         -  wxBoxSizer *reliefSizer = new wxBoxSizer(wxHORIZONTAL);
  1761         -  shaded2Sizer->Add(reliefSizer, 0, wxALIGN_RIGHT | wxALL, 0);
  1762         -  wxCheckBox *shadedCtrl = new wxCheckBox(panel, ID_SYMBOLIZER_SHADED,
  1763         -                                          wxT("Enable"),
  1764         -                                          wxDefaultPosition, wxDefaultSize);
  1765         -  reliefSizer->Add(shadedCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1766         -  if (CanApplyShadedRelief == false)
  1767         -    shadedCtrl->Enable(false);
  1768         -  reliefSizer->AddSpacer(25);
  1769         -  wxBoxSizer *relief2Sizer = new wxBoxSizer(wxHORIZONTAL);
  1770         -  reliefSizer->Add(relief2Sizer, 0, wxALIGN_RIGHT | wxALL, 0);
  1771         -  wxStaticText *reliefLabel =
  1772         -    new wxStaticText(panel, wxID_STATIC, wxT("&Relief Factor:"));
  1773         -  relief2Sizer->Add(reliefLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1774         -  wxSpinCtrl *reliefCtrl = new wxSpinCtrl(panel, ID_SYMBOLIZER_RELIEF, wxT(""),
  1775         -                                          wxDefaultPosition, wxSize(80, 22),
  1776         -                                          wxSP_ARROW_KEYS,
  1777         -                                          0, 0, 0);
  1778         -  reliefCtrl->Enable(false);
  1779         -  relief2Sizer->Add(reliefCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1780         -  panel->SetSizer(topSizer);
  1781         -  topSizer->Fit(panel);
  1782         -// appends event handlers
  1783         -  Connect(ID_SYMBOLIZER_COLOR_MAP_MODE, wxEVT_COMMAND_RADIOBOX_SELECTED,
  1784         -          (wxObjectEventFunction) &
  1785         -          QuickStyleRasterDialog::OnCmdColorMapModeChanged);
  1786         -  Connect(ID_SYMBOLIZER_MIN_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
  1787         -          (wxObjectEventFunction) &
  1788         -          QuickStyleRasterDialog::OnCmdColorMinChanged);
  1789         -  Connect(ID_SYMBOLIZER_MIN_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
  1790         -          (wxObjectEventFunction) &
  1791         -          QuickStyleRasterDialog::OnCmdMinColorPicker);
  1792         -  Connect(ID_SYMBOLIZER_MAX_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
  1793         -          (wxObjectEventFunction) &
  1794         -          QuickStyleRasterDialog::OnCmdColorMaxChanged);
  1795         -  Connect(ID_SYMBOLIZER_MAX_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
  1796         -          (wxObjectEventFunction) &
  1797         -          QuickStyleRasterDialog::OnCmdMaxColorPicker);
  1798         -  Connect(ID_SYMBOLIZER_SHADED, wxEVT_COMMAND_CHECKBOX_CLICKED,
  1799         -          (wxObjectEventFunction) & QuickStyleRasterDialog::OnShadedChanged);
  1800         -  return panel;
  1801         -}
  1802         -
  1803         -void QuickStyleRasterDialog::
  1804         -OnCmdColorMapModeChanged(wxCommandEvent & WXUNUSED(event))
  1805         -{
  1806         -//
  1807         -// Color Map Mode selection changed
  1808         -//
  1809         -  wxRadioBox *colorMapModeCtrl =
  1810         -    (wxRadioBox *) FindWindow(ID_SYMBOLIZER_COLOR_MAP_MODE);
  1811         -  wxTextCtrl *colorMinCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MIN_COLOR);
  1812         -  wxButton *minPick = (wxButton *) FindWindow(ID_SYMBOLIZER_MIN_PICKER_BTN);
  1813         -  wxTextCtrl *colorMaxCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MAX_COLOR);
  1814         -  wxButton *maxPick = (wxButton *) FindWindow(ID_SYMBOLIZER_MAX_PICKER_BTN);
  1815         -  wxStaticBitmap *sampleMinCtrl =
  1816         -    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_MIN_PICKER_HEX);
  1817         -  wxStaticBitmap *sampleMaxCtrl =
  1818         -    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_MIN_PICKER_HEX);
  1819         -  if (CanApplyNDVI == true)
  1820         -    {
  1821         -      // special case: NDVI
  1822         -      Style->SetSrtmColorMap(false);
  1823         -      Style->SetTerrainColorMap(false);
  1824         -      Style->SetColorRamp(false);
  1825         -      colorMinCtrl->Enable(false);
  1826         -      minPick->Enable(false);
  1827         -      colorMaxCtrl->Enable(false);
  1828         -      maxPick->Enable(false);
  1829         -      colorMinCtrl->SetValue(wxT("#000000"));
  1830         -      colorMaxCtrl->SetValue(wxT("#ffffff"));
  1831         -      switch (colorMapModeCtrl->GetSelection())
  1832         -        {
  1833         -          case 1:
  1834         -            Style->SetNdviColorMap(true);
  1835         -            break;
  1836         -          default:
  1837         -            Style->SetNdviColorMap(false);
  1838         -            break;
  1839         -        };
  1840         -  } else
  1841         -    {
  1842         -      // ordinary Color Map
  1843         -      Style->SetNdviColorMap(false);
  1844         -      switch (colorMapModeCtrl->GetSelection())
  1845         -        {
  1846         -          case 1:
  1847         -            Style->SetSrtmColorMap(true);
  1848         -            Style->SetTerrainColorMap(false);
  1849         -            Style->SetColorRamp(false);
  1850         -            colorMinCtrl->Enable(false);
  1851         -            minPick->Enable(false);
  1852         -            colorMaxCtrl->Enable(false);
  1853         -            maxPick->Enable(false);
  1854         -            colorMinCtrl->SetValue(wxT("#000000"));
  1855         -            colorMaxCtrl->SetValue(wxT("#ffffff"));
  1856         -            break;
  1857         -          case 2:
  1858         -            Style->SetSrtmColorMap(false);
  1859         -            Style->SetTerrainColorMap(true);
  1860         -            Style->SetColorRamp(false);
  1861         -            colorMinCtrl->Enable(false);
  1862         -            minPick->Enable(false);
  1863         -            colorMaxCtrl->Enable(false);
  1864         -            maxPick->Enable(false);
  1865         -            colorMinCtrl->SetValue(wxT("#000000"));
  1866         -            colorMaxCtrl->SetValue(wxT("#ffffff"));
  1867         -            break;
  1868         -          case 3:
  1869         -            Style->SetSrtmColorMap(false);
  1870         -            Style->SetTerrainColorMap(false);
  1871         -            Style->SetColorRamp(true);
  1872         -            colorMinCtrl->Enable(true);
  1873         -            minPick->Enable(true);
  1874         -            colorMaxCtrl->Enable(true);
  1875         -            maxPick->Enable(true);
  1876         -            colorMinCtrl->
  1877         -              SetValue(wxString::FromUTF8(Style->GetMinValueColor()));
  1878         -            colorMaxCtrl->
  1879         -              SetValue(wxString::FromUTF8(Style->GetMaxValueColor()));
  1880         -            break;
  1881         -          default:
  1882         -            Style->SetSrtmColorMap(false);
  1883         -            Style->SetTerrainColorMap(false);
  1884         -            Style->SetColorRamp(false);
  1885         -            colorMinCtrl->Enable(false);
  1886         -            minPick->Enable(false);
  1887         -            colorMaxCtrl->Enable(false);
  1888         -            maxPick->Enable(false);
  1889         -            colorMinCtrl->SetValue(wxT("#000000"));
  1890         -            colorMaxCtrl->SetValue(wxT("#ffffff"));
  1891         -            break;
  1892         -        };
  1893         -    }
  1894         -}
  1895         -
  1896         -void QuickStyleRasterDialog::
  1897         -OnCmdColorMinChanged(wxCommandEvent & WXUNUSED(event))
  1898         -{
  1899         -//
  1900         -// Min Value color changed: updating the visual sample
  1901         -//
  1902         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MIN_COLOR);
  1903         -  wxStaticBitmap *sampleCtrl =
  1904         -    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_MIN_PICKER_HEX);
  1905         -  wxColour back = wxColour(255, 255, 255);
  1906         -  wxString str = colorCtrl->GetValue();
  1907         -  if (ColorMapEntry::IsValidColor(str) == true)
  1908         -    ColorMapEntry::GetWxColor(str, back);
  1909         -  wxBitmap bmp;
  1910         -  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
  1911         -  sampleCtrl->SetBitmap(bmp);
  1912         -  sampleCtrl->Refresh();
  1913         -  sampleCtrl->Update();
  1914         -}
  1915         -
  1916         -void QuickStyleRasterDialog::
  1917         -OnCmdMinColorPicker(wxCommandEvent & WXUNUSED(event))
  1918         -{
  1919         -//
  1920         -// Min Value color picker
  1921         -//
  1922         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MIN_COLOR);
  1923         -  wxColour clr = wxNullColour;
  1924         -  wxString str = colorCtrl->GetValue();
  1925         -  if (ColorMapEntry::IsValidColor(str) == true)
  1926         -    ColorMapEntry::GetWxColor(str, clr);
  1927         -  wxColour color = wxGetColourFromUser(this, clr);
  1928         -  if (color.IsOk() == true)
  1929         -    {
  1930         -      char hex[16];
  1931         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  1932         -      wxString str = wxString::FromUTF8(hex);
  1933         -      colorCtrl->SetValue(str);
  1934         -    }
  1935         -}
  1936         -
  1937         -void QuickStyleRasterDialog::
  1938         -OnCmdColorMaxChanged(wxCommandEvent & WXUNUSED(event))
  1939         -{
  1940         -//
  1941         -// Max Value color changed: updating the visual sample
  1942         -//
  1943         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MAX_COLOR);
  1944         -  wxStaticBitmap *sampleCtrl =
  1945         -    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_MAX_PICKER_HEX);
  1946         -  wxColour back = wxColour(255, 255, 255);
  1947         -  wxString str = colorCtrl->GetValue();
  1948         -  if (ColorMapEntry::IsValidColor(str) == true)
  1949         -    ColorMapEntry::GetWxColor(str, back);
  1950         -  wxBitmap bmp;
  1951         -  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
  1952         -  sampleCtrl->SetBitmap(bmp);
  1953         -  sampleCtrl->Refresh();
  1954         -  sampleCtrl->Update();
  1955         -}
  1956         -
  1957         -void QuickStyleRasterDialog::
  1958         -OnCmdMaxColorPicker(wxCommandEvent & WXUNUSED(event))
  1959         -{
  1960         -//
  1961         -// Max Value color picker
  1962         -//
  1963         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MAX_COLOR);
  1964         -  wxColour clr = wxNullColour;
  1965         -  wxString str = colorCtrl->GetValue();
  1966         -  if (ColorMapEntry::IsValidColor(str) == true)
  1967         -    ColorMapEntry::GetWxColor(str, clr);
  1968         -  wxColour color = wxGetColourFromUser(this, clr);
  1969         -  if (color.IsOk() == true)
  1970         -    {
  1971         -      char hex[16];
  1972         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  1973         -      wxString str = wxString::FromUTF8(hex);
  1974         -      colorCtrl->SetValue(str);
  1975         -    }
  1976         -}
  1977         -
  1978         -void QuickStyleRasterDialog::OnShadedChanged(wxCommandEvent & WXUNUSED(event))
  1979         -{
  1980         -//
  1981         -// changed Shaded Relief (on/off): 
  1982         -//
  1983         -  wxCheckBox *shadedCtrl = (wxCheckBox *) FindWindow(ID_SYMBOLIZER_SHADED);
  1984         -  wxSpinCtrl *reliefCtrl = (wxSpinCtrl *) FindWindow(ID_SYMBOLIZER_RELIEF);
  1985         -  if (shadedCtrl->IsChecked() == true)
  1986         -    {
  1987         -      reliefCtrl->SetRange(1, 200);
  1988         -      reliefCtrl->SetValue(25);
  1989         -      reliefCtrl->Enable(true);
  1990         -      Style->SetShadedRelief(true);
  1991         -  } else
  1992         -    {
  1993         -      reliefCtrl->SetRange(0, 0);
  1994         -      reliefCtrl->SetValue(0);
  1995         -      reliefCtrl->Enable(false);
  1996         -      Style->SetShadedRelief(false);
  1997         -    }
  1998         -}
  1999         -
  2000         -bool QuickStyleRasterDialog::UpdateStyle()
  2001         -{
  2002         -//
  2003         -// updating the QuickStyle
  2004         -//
  2005         -  bool ret = false;
  2006         -  int idx = GetBookCtrl()->GetSelection();
  2007         -  if (idx == 0)
  2008         -    ret = RetrieveMainPage();
  2009         -  else
  2010         -    {
  2011         -      if (idx == PageContrastEnhancementIndex)
  2012         -        ret = RetrieveContrastEnhancementPage();
  2013         -      if (idx == PageChannelSelectionIndex)
  2014         -        ret = RetrieveChannelSelectionPage();
  2015         -      if (idx == PageColorMapIndex)
  2016         -        ret = RetrieveColorMapPage();
  2017         -    }
  2018         -  if (ret == false)
  2019         -    return false;
  2020         -
  2021         -  RasterLayerConfig *config = Layer->GetRasterConfig();
  2022         -  bool setCurrentStyle = false;
  2023         -  if (config->GetStyle() == NULL)
  2024         -    setCurrentStyle = true;
  2025         -  else
  2026         -    {
  2027         -      if (strcmp(Style->GetUUID(), config->GetStyle()) != 0)
  2028         -        setCurrentStyle = true;
  2029         -    }
  2030         -  if (setCurrentStyle == true)
  2031         -    {
  2032         -      config->SetStyle(Style->GetUUID());
  2033         -      IsConfigChanged = true;
  2034         -    }
  2035         -  IsConfigChanged = Layer->UpdateQuickStyle(Style);
  2036         -  return true;
  2037         -}
  2038         -
  2039         -bool QuickStyleRasterDialog::RetrieveMainPage()
  2040         -{
  2041         -//
  2042         -// retrieving params from the MAIN page
  2043         -//
  2044         -  double min = Style->GetScaleMin();
  2045         -  double max = Style->GetScaleMax();
  2046         -  double opacity = Style->GetOpacity();
  2047         -  if (Style->IsMinScaleEnabled() == true)
  2048         -    {
  2049         -      wxTextCtrl *minCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MIN_SCALE);
  2050         -      wxString value = minCtrl->GetValue();
  2051         -      if (value.ToDouble(&min) != true)
  2052         -        {
  2053         -          wxMessageBox(wxT
  2054         -                       ("MIN_SCALE isn't a valid decimal number !!!"),
  2055         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  2056         -          return false;
  2057         -        }
  2058         -      if (min < 0.0)
  2059         -        {
  2060         -          wxMessageBox(wxT
  2061         -                       ("MIN_SCALE must be a positive number !!!"),
  2062         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  2063         -          return false;
  2064         -        }
  2065         -    }
  2066         -  if (Style->IsMaxScaleEnabled() == true)
  2067         -    {
  2068         -      wxTextCtrl *maxCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MAX_SCALE);
  2069         -      wxString value = maxCtrl->GetValue();
  2070         -      if (value.ToDouble(&max) != true)
  2071         -        {
  2072         -          wxMessageBox(wxT
  2073         -                       ("MAX_SCALE isn't a valid decimal number !!!"),
  2074         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  2075         -          return false;
  2076         -        }
  2077         -      if (max < 0.0)
  2078         -        {
  2079         -          wxMessageBox(wxT
  2080         -                       ("MAX_SCALE must be a positive number !!!"),
  2081         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  2082         -          return false;
  2083         -        }
  2084         -    }
  2085         -  if (Style->IsMinScaleEnabled() == true && Style->IsMaxScaleEnabled() == true)
  2086         -    {
  2087         -      if (min >= max)
  2088         -        {
  2089         -          wxMessageBox(wxT
  2090         -                       ("MAX_SCALE is always expected to be greater than MIN_SCALE !!!"),
  2091         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  2092         -          return false;
  2093         -        }
  2094         -    }
  2095         -  wxSlider *opacityCtrl = (wxSlider *) FindWindow(ID_SYMBOLIZER_OPACITY);
  2096         -  opacity = opacityCtrl->GetValue() / 100.0;
  2097         -  Style->SetScaleMin(min);
  2098         -  Style->SetScaleMax(max);
  2099         -  Style->SetOpacity(opacity);
  2100         -  return true;
  2101         -}
  2102         -
  2103         -void QuickStyleRasterDialog::UpdateMainPage()
  2104         -{
  2105         -//
  2106         -// updating the MAIN page
  2107         -//
  2108         -  wxRadioBox *rangeBox = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_MINMAX_SCALE);
  2109         -  if (Style->IsMinScaleEnabled() != true && Style->IsMaxScaleEnabled() != true)
  2110         -    rangeBox->SetSelection(0);
  2111         -  else if (Style->IsMinScaleEnabled() == true
  2112         -           && Style->IsMaxScaleEnabled() != true)
  2113         -    rangeBox->SetSelection(1);
  2114         -  else if (Style->IsMinScaleEnabled() != true
  2115         -           && Style->IsMaxScaleEnabled() == true)
  2116         -    rangeBox->SetSelection(2);
  2117         -  else
  2118         -    rangeBox->SetSelection(3);
  2119         -  wxTextCtrl *minCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MIN_SCALE);
  2120         -  char dummy[64];
  2121         -  wxString str;
  2122         -  if (Style->IsMinScaleEnabled() == true)
  2123         -    {
  2124         -      sprintf(dummy, "%1.2f", Style->GetScaleMin());
  2125         -      str = wxString::FromUTF8(dummy);
  2126         -      minCtrl->SetValue(str);
  2127         -      minCtrl->Enable(true);
  2128         -  } else
  2129         -    {
  2130         -      str = wxT("0.0");
  2131         -      minCtrl->SetValue(str);
  2132         -      minCtrl->Enable(false);
  2133         -    }
  2134         -  wxTextCtrl *maxCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MAX_SCALE);
  2135         -  if (Style->IsMaxScaleEnabled() == true)
  2136         -    {
  2137         -      sprintf(dummy, "%1.2f", Style->GetScaleMax());
  2138         -      str = wxString::FromUTF8(dummy);
  2139         -      maxCtrl->SetValue(str);
  2140         -      maxCtrl->Enable(true);
  2141         -  } else
  2142         -    {
  2143         -      str = wxT("+Infinite");
  2144         -      maxCtrl->SetValue(str);
  2145         -      maxCtrl->Enable(false);
  2146         -    }
  2147         -  wxSlider *opacityCtrl = (wxSlider *) FindWindow(ID_SYMBOLIZER_OPACITY);
  2148         -  opacityCtrl->SetValue(Style->GetOpacity() * 100.0);
  2149         -}
  2150         -
  2151         -bool QuickStyleRasterDialog::RetrieveContrastEnhancementPage(bool check)
  2152         -{
  2153         -//
  2154         -// retrieving params from the CONTRAST ENHANCEMENT page
  2155         -//
  2156         -  if (Style->IsGamma() == true)
  2157         -    {
  2158         -      wxSpinCtrl *gammaCtrl = (wxSpinCtrl *) FindWindow(ID_SYMBOLIZER_GAMMA);
  2159         -      Style->SetGammaValue(gammaCtrl->GetValue() / 100.0);
  2160         -  } else
  2161         -    Style->SetGammaValue(1.0);
  2162         -  return true;
  2163         -}
  2164         -
  2165         -void QuickStyleRasterDialog::UpdateContrastEnhancementPage()
  2166         -{
  2167         -//
  2168         -// updating the CONTRAST ENHANCEMENT page
  2169         -//
  2170         -  wxRadioBox *contrastCtrl = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_CONTRAST);
  2171         -  wxSpinCtrl *gammaCtrl = (wxSpinCtrl *) FindWindow(ID_SYMBOLIZER_GAMMA);
  2172         -  if (Style->IsNormalize() == true)
  2173         -    {
  2174         -      contrastCtrl->SetSelection(1);
  2175         -      gammaCtrl->Enable(false);
  2176         -  } else if (Style->IsHistogram() == true)
  2177         -    {
  2178         -      contrastCtrl->SetSelection(2);
  2179         -      gammaCtrl->Enable(false);
  2180         -  } else if (Style->IsGamma() == true)
  2181         -    {
  2182         -      contrastCtrl->SetSelection(3);
  2183         -      gammaCtrl->Enable(true);
  2184         -  } else
  2185         -    {
  2186         -      contrastCtrl->SetSelection(0);
  2187         -      gammaCtrl->Enable(false);
  2188         -    }
  2189         -  gammaCtrl->SetValue(Style->GetGammaValue() * 100.0);
  2190         -  if (CanApplyContrastEnhancement == true)
  2191         -    contrastCtrl->Enable(true);
  2192         -  else
  2193         -    contrastCtrl->Enable(false);
  2194         -}
  2195         -
  2196         -bool QuickStyleRasterDialog::RetrieveChannelSelectionPage(bool check)
  2197         -{
  2198         -//
  2199         -// retrieving params from the CHANNEL SELECTION page
  2200         -//
  2201         -  if (Style->IsTripleBand() == true)
  2202         -    {
  2203         -      wxSpinCtrl *redCtrl = (wxSpinCtrl *) FindWindow(ID_SYMBOLIZER_RED);
  2204         -      Style->SetRedBand(redCtrl->GetValue() - 1);
  2205         -      wxSpinCtrl *greenCtrl = (wxSpinCtrl *) FindWindow(ID_SYMBOLIZER_GREEN);
  2206         -      Style->SetGreenBand(greenCtrl->GetValue() - 1);
  2207         -      wxSpinCtrl *blueCtrl = (wxSpinCtrl *) FindWindow(ID_SYMBOLIZER_BLUE);
  2208         -      Style->SetBlueBand(blueCtrl->GetValue() - 1);
  2209         -      Style->SetGrayBand(0);
  2210         -  } else if (Style->IsSingleBand() == true)
  2211         -    {
  2212         -      wxSpinCtrl *grayCtrl = (wxSpinCtrl *) FindWindow(ID_SYMBOLIZER_GRAY);
  2213         -      Style->SetGrayBand(grayCtrl->GetValue() - 1);
  2214         -      Style->SetRedBand(0);
  2215         -      Style->SetGreenBand(0);
  2216         -      Style->SetBlueBand(0);
  2217         -  } else
  2218         -    {
  2219         -      Style->SetRedBand(0);
  2220         -      Style->SetGreenBand(0);
  2221         -      Style->SetBlueBand(0);
  2222         -      Style->SetGrayBand(0);
  2223         -    }
  2224         -  return true;
  2225         -}
  2226         -
  2227         -void QuickStyleRasterDialog::UpdateChannelSelectionPage()
  2228         -{
  2229         -//
  2230         -// updating the CHANNEL SELECTION page
  2231         -//
  2232         -  wxRadioBox *bandModeCtrl = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_BAND_MODE);
  2233         -  wxSpinCtrl *redCtrl = (wxSpinCtrl *) FindWindow(ID_SYMBOLIZER_RED);
  2234         -  wxSpinCtrl *greenCtrl = (wxSpinCtrl *) FindWindow(ID_SYMBOLIZER_GREEN);
  2235         -  wxSpinCtrl *blueCtrl = (wxSpinCtrl *) FindWindow(ID_SYMBOLIZER_BLUE);
  2236         -  wxSpinCtrl *grayCtrl = (wxSpinCtrl *) FindWindow(ID_SYMBOLIZER_GRAY);
  2237         -  if (IsMultiband == false)
  2238         -    {
  2239         -      bandModeCtrl->SetSelection(0);
  2240         -      redCtrl->Enable(false);
  2241         -      greenCtrl->Enable(false);
  2242         -      blueCtrl->Enable(false);
  2243         -      grayCtrl->Enable(false);
  2244         -      redCtrl->SetValue(1);
  2245         -      greenCtrl->SetValue(1);
  2246         -      blueCtrl->SetValue(1);
  2247         -      grayCtrl->SetValue(1);
  2248         -      bandModeCtrl->Enable(false);
  2249         -      return;
  2250         -    }
  2251         -  if (Style->IsTripleBand() == true)
  2252         -    {
  2253         -      bandModeCtrl->SetSelection(1);
  2254         -      redCtrl->Enable(true);
  2255         -      greenCtrl->Enable(true);
  2256         -      blueCtrl->Enable(true);
  2257         -      grayCtrl->Enable(false);
  2258         -  } else if (Style->IsSingleBand() == true)
  2259         -    {
  2260         -      bandModeCtrl->SetSelection(2);
  2261         -      redCtrl->Enable(false);
  2262         -      greenCtrl->Enable(false);
  2263         -      blueCtrl->Enable(false);
  2264         -      grayCtrl->Enable(true);
  2265         -  } else
  2266         -    {
  2267         -      bandModeCtrl->SetSelection(0);
  2268         -      redCtrl->Enable(false);
  2269         -      greenCtrl->Enable(false);
  2270         -      blueCtrl->Enable(false);
  2271         -      grayCtrl->Enable(false);
  2272         -    }
  2273         -  redCtrl->SetRange(1, NumBands);
  2274         -  greenCtrl->SetRange(1, NumBands);
  2275         -  blueCtrl->SetRange(1, NumBands);
  2276         -  grayCtrl->SetRange(1, NumBands);
  2277         -  redCtrl->SetValue(Style->GetRedBand() + 1);
  2278         -  greenCtrl->SetValue(Style->GetGreenBand() + 1);
  2279         -  blueCtrl->SetValue(Style->GetBlueBand() + 1);
  2280         -  grayCtrl->SetValue(Style->GetGrayBand() + 1);
  2281         -  if (IsMultiband == true)
  2282         -    bandModeCtrl->Enable(true);
  2283         -  else
  2284         -    bandModeCtrl->Enable(false);
  2285         -}
  2286         -
  2287         -bool QuickStyleRasterDialog::RetrieveColorMapPage(bool check)
  2288         -{
  2289         -//
  2290         -// retrieving params from the COLOR MAP page
  2291         -//
  2292         -  if (Style->IsShadedRelief() == true)
  2293         -    {
  2294         -      wxSpinCtrl *shadedCtrl = (wxSpinCtrl *) FindWindow(ID_SYMBOLIZER_RELIEF);
  2295         -      Style->SetShadedReliefFactor(shadedCtrl->GetValue());
  2296         -  } else
  2297         -    Style->SetShadedReliefFactor(0.0);
  2298         -  wxTextCtrl *colorMinCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MIN_COLOR);
  2299         -  wxTextCtrl *colorMaxCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MAX_COLOR);
  2300         -  char dummy[64];
  2301         -  strcpy(dummy, colorMinCtrl->GetValue().ToUTF8());
  2302         -  Style->SetMinValueColor(dummy);
  2303         -  strcpy(dummy, colorMaxCtrl->GetValue().ToUTF8());
  2304         -  Style->SetMaxValueColor(dummy);
  2305         -  return true;
  2306         -}
  2307         -
  2308         -void QuickStyleRasterDialog::UpdateColorMapPage()
  2309         -{
  2310         -//
  2311         -// updating the COLOR MAP page
  2312         -//
  2313         -  wxRadioBox *modeBox = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_COLOR_MAP_MODE);
  2314         -  wxTextCtrl *colorMinCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MIN_COLOR);
  2315         -  wxStaticBitmap *sampleMinCtrl =
  2316         -    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_MIN_PICKER_HEX);
  2317         -  wxButton *minPick = (wxButton *) FindWindow(ID_SYMBOLIZER_MIN_PICKER_BTN);
  2318         -  wxTextCtrl *colorMaxCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MAX_COLOR);
  2319         -  wxStaticBitmap *sampleMaxCtrl =
  2320         -    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_MAX_PICKER_HEX);
  2321         -  wxButton *maxPick = (wxButton *) FindWindow(ID_SYMBOLIZER_MAX_PICKER_BTN);
  2322         -  wxCheckBox *shadedCtrl = (wxCheckBox *) FindWindow(ID_SYMBOLIZER_SHADED);
  2323         -  wxSpinCtrl *reliefCtrl = (wxSpinCtrl *) FindWindow(ID_SYMBOLIZER_RELIEF);
  2324         -  if (CanApplyNDVI == true)
  2325         -    {
  2326         -      // special case: NDVI
  2327         -      if (Style->IsNdviColorMap() == true)
  2328         -        modeBox->SetSelection(1);
  2329         -      else
  2330         -        modeBox->SetSelection(0);
  2331         -  } else
  2332         -    {
  2333         -      // ordinary Color Map
  2334         -      if (Style->IsSrtmColorMap() == true)
  2335         -        modeBox->SetSelection(1);
  2336         -      else if (Style->IsTerrainColorMap() == true)
  2337         -        modeBox->SetSelection(2);
  2338         -      else if (Style->IsColorRamp() == true)
  2339         -        modeBox->SetSelection(3);
  2340         -      else
  2341         -        modeBox->SetSelection(0);
  2342         -    }
  2343         -  if (Style->IsColorRamp() == true)
  2344         -    {
  2345         -      colorMinCtrl->Enable(true);
  2346         -      minPick->Enable(true);
  2347         -      colorMaxCtrl->Enable(true);
  2348         -      maxPick->Enable(true);
  2349         -      colorMinCtrl->SetValue(wxString::FromUTF8(Style->GetMinValueColor()));
  2350         -      colorMaxCtrl->SetValue(wxString::FromUTF8(Style->GetMaxValueColor()));
  2351         -  } else
  2352         -    {
  2353         -      colorMinCtrl->Enable(false);
  2354         -      minPick->Enable(false);
  2355         -      colorMaxCtrl->Enable(false);
  2356         -      maxPick->Enable(false);
  2357         -      colorMinCtrl->SetValue(wxT("#000000"));
  2358         -      colorMaxCtrl->SetValue(wxT("#ffffff"));
  2359         -    }
  2360         -  if (Style->IsShadedRelief() == true)
  2361         -    {
  2362         -      reliefCtrl->SetRange(1, 200);
  2363         -      reliefCtrl->SetValue(Style->GetShadedReliefFactor());
  2364         -      reliefCtrl->Enable(true);
  2365         -  } else
  2366         -    {
  2367         -      reliefCtrl->SetRange(0, 0);
  2368         -      reliefCtrl->SetValue(0);
  2369         -      reliefCtrl->Enable(false);
  2370         -    }
  2371         -  if (CanApplyColorMap == true || CanApplyNDVI == true)
  2372         -    modeBox->Enable(true);
  2373         -  else
  2374         -    modeBox->Enable(false);
  2375         -  if (CanApplyShadedRelief == true)
  2376         -    shadedCtrl->Enable(true);
  2377         -  else
  2378         -    shadedCtrl->Enable(false);
  2379         -}
  2380         -
  2381         -
  2382         -void QuickStyleRasterDialog::OnPageChanging(wxNotebookEvent & event)
  2383         -{
  2384         -//
  2385         -// TAB/PAGE selection changing
  2386         -//
  2387         -  bool ret = false;
  2388         -  int idx = event.GetOldSelection();
  2389         -  if (idx == 0)
  2390         -    ret = RetrieveMainPage();
  2391         -  else
  2392         -    {
  2393         -      if (idx == PageContrastEnhancementIndex)
  2394         -        ret = RetrieveContrastEnhancementPage();
  2395         -      if (idx == PageChannelSelectionIndex)
  2396         -        ret = RetrieveChannelSelectionPage();
  2397         -      if (idx == PageColorMapIndex)
  2398         -        ret = RetrieveColorMapPage();
  2399         -    }
  2400         -  if (ret != true)
  2401         -    event.Veto();
  2402         -}
  2403         -
  2404         -void QuickStyleRasterDialog::OnPageChanged(wxNotebookEvent & event)
  2405         -{
  2406         -//
  2407         -// TAB/PAGE selection changed
  2408         -//
  2409         -  int idx = event.GetSelection();
  2410         -  if (idx == 0)
  2411         -    UpdateMainPage();
  2412         -  else
  2413         -    {
  2414         -      if (idx == PageContrastEnhancementIndex)
  2415         -        UpdateContrastEnhancementPage();
  2416         -      if (idx == PageChannelSelectionIndex)
  2417         -        UpdateChannelSelectionPage();
  2418         -      if (idx == PageColorMapIndex)
  2419         -        UpdateColorMapPage();
  2420         -    }
  2421         -}
  2422         -
  2423         -void QuickStyleRasterDialog::OnOk(wxCommandEvent & WXUNUSED(event))
  2424         -{
  2425         -//
  2426         -// permanently saving the QuickStyle and quitting
  2427         -//
  2428         -  if (UpdateStyle() == true)
  2429         -    wxDialog::EndModal(wxID_OK);
  2430         -}
  2431         -
  2432         -void QuickStyleRasterDialog::OnApply(wxCommandEvent & WXUNUSED(event))
  2433         -{
  2434         -//
  2435         -// applying the QuickStyle and continuing
  2436         -//
  2437         -  if (UpdateStyle() == true)
  2438         -    {
  2439         -      if (IsConfigChanged == true)
  2440         -        MapPanel->RefreshMap();
  2441         -    }
  2442         -}
  2443         -
  2444         -void QuickStyleRasterDialog::OnExport(wxCommandEvent & WXUNUSED(event))
  2445         -{
  2446         -//
  2447         -// exporting the Quick Style as an external file
  2448         -//
  2449         -  bool xret = false;
  2450         -  int ret;
  2451         -  wxString path;
  2452         -  wxString lastDir;
  2453         -  int idx = GetBookCtrl()->GetSelection();
  2454         -  if (idx == 0)
  2455         -    xret = RetrieveMainPage();
  2456         -  else
  2457         -    {
  2458         -      if (idx == PageContrastEnhancementIndex)
  2459         -        xret = RetrieveContrastEnhancementPage();
  2460         -      if (idx == PageChannelSelectionIndex)
  2461         -        xret = RetrieveChannelSelectionPage();
  2462         -      if (idx == PageColorMapIndex)
  2463         -        xret = RetrieveColorMapPage();
  2464         -    }
  2465         -  if (xret == false)
  2466         -    return;
  2467         -
  2468         -  wxFileDialog fileDialog(this,
  2469         -                          wxT("Exporting an SLD/SE QuickStyle to a file"),
  2470         -                          wxT(""), wxT("style.xml"),
  2471         -                          wxT("XML Document|*.xml|All files (*.*)|*.*"),
  2472         -                          wxFD_SAVE | wxFD_OVERWRITE_PROMPT, wxDefaultPosition,
  2473         -                          wxDefaultSize, wxT("filedlg"));
  2474         -  lastDir = MainFrame->GetLastDirectory();
  2475         -  if (lastDir.Len() >= 1)
  2476         -    fileDialog.SetDirectory(lastDir);
  2477         -  ret = fileDialog.ShowModal();
  2478         -  if (ret == wxID_OK)
  2479         -    {
  2480         -      wxFileName file(fileDialog.GetPath());
  2481         -      path = file.GetPath();
  2482         -      path += file.GetPathSeparator();
  2483         -      path += file.GetName();
  2484         -      lastDir = file.GetPath();
  2485         -      path = fileDialog.GetPath();
  2486         -      FILE *out = fopen(path.ToUTF8(), "wb");
  2487         -      if (out == NULL)
  2488         -        wxMessageBox(wxT("ERROR: unable to create:\n\n\"") + path + wxT("\""),
  2489         -                     wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
  2490         -      else
  2491         -        {
  2492         -          char *xml = Style->CreateXmlStyle();
  2493         -          fwrite(xml, 1, strlen(xml), out);
  2494         -          sqlite3_free(xml);
  2495         -          fclose(out);
  2496         -          wxMessageBox(wxT
  2497         -                       ("SLD/SE QuickStyle successfully saved into:\n\n\"")
  2498         -                       + path + wxT("\""), wxT("spatialite_gui"),
  2499         -                       wxOK | wxICON_INFORMATION, this);
  2500         -        }
  2501         -    }
  2502         -}
  2503         -
  2504         -void QuickStyleRasterDialog::OnCopy(wxCommandEvent & WXUNUSED(event))
  2505         -{
  2506         -//
  2507         -// Copying the Quick Style into the Clipboard 
  2508         -//
  2509         -  bool ret = false;
  2510         -  int idx = GetBookCtrl()->GetSelection();
  2511         -  if (idx == 0)
  2512         -    ret = RetrieveMainPage();
  2513         -  else
  2514         -    {
  2515         -      if (idx == PageContrastEnhancementIndex)
  2516         -        ret = RetrieveContrastEnhancementPage();
  2517         -      if (idx == PageChannelSelectionIndex)
  2518         -        ret = RetrieveChannelSelectionPage();
  2519         -      if (idx == PageColorMapIndex)
  2520         -        ret = RetrieveColorMapPage();
  2521         -    }
  2522         -  if (ret == false)
  2523         -    return;
  2524         -
  2525         -  char *xml = Style->CreateXmlStyle();
  2526         -  wxString XMLstring = wxString::FromUTF8(xml);
  2527         -  sqlite3_free(xml);
  2528         -  if (wxTheClipboard->Open())
  2529         -    {
  2530         -      wxTheClipboard->SetData(new wxTextDataObject(XMLstring));
  2531         -      wxTheClipboard->Close();
  2532         -    }
  2533         -}
  2534         -
  2535         -void QuickStyleRasterDialog::OnQuit(wxCommandEvent & WXUNUSED(event))
  2536         -{
  2537         -//
  2538         -// all done: 
  2539         -//
  2540         -  wxDialog::EndModal(wxID_CANCEL);
  2541         -}
  2542         -
  2543         -void QuickStyleRasterDialog::GetCoverageInfos()
  2544         -{
  2545         -//
  2546         -// attempting to get the basic Coverage Infos
  2547         -//
  2548         -  char *prefix;
  2549         -  char *xprefix;
  2550         -  char *name;
  2551         -  char *sql;
  2552         -  int ret;
  2553         -  char **results;
  2554         -  int rows;
  2555         -  int columns;
  2556         -  wxString pixelType;
  2557         -  wxString sampleType;
  2558         -  int numBands;
  2559         -  bool ok_min = false;
  2560         -  bool ok_max = false;
  2561         -  double min = 0.0;
  2562         -  double max = 0.0;
  2563         -
  2564         -  if (DbPrefix.Len() == 0)
  2565         -    {
  2566         -      prefix = (char *) malloc(5);
  2567         -      strcpy(prefix, "MAIN");
  2568         -  } else
  2569         -    {
  2570         -      prefix = (char *) malloc(DbPrefix.Len() * 4);
  2571         -      strcpy(prefix, DbPrefix.ToUTF8());
  2572         -    }
  2573         -  xprefix = gaiaDoubleQuotedSql(prefix);
  2574         -  free(prefix);
  2575         -  name = (char *) malloc(LayerName.Len() * 4);
  2576         -  strcpy(name, LayerName.ToUTF8());
  2577         -  sql =
  2578         -    sqlite3_mprintf
  2579         -    ("SELECT pixel_type, sample_type, num_bands, enable_auto_ndvi, "
  2580         -     "RL2_GetBandStatistics_Min(statistics, 0), RL2_GetBandStatistics_Max(statistics, 0) "
  2581         -     "FROM \"%s\".raster_coverages WHERE Upper(coverage_name) = Upper(%Q)",
  2582         -     xprefix, name);
  2583         -  free(xprefix);
  2584         -  free(name);
  2585         -  ret =
  2586         -    sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows, &columns,
  2587         -                      NULL);
  2588         -  sqlite3_free(sql);
  2589         -  if (ret != SQLITE_OK)
  2590         -    return;
  2591         -
  2592         -  for (int i = 1; i <= rows; i++)
  2593         -    {
  2594         -      // retrieving the basic Coverage Infos
  2595         -      pixelType = wxString::FromUTF8(results[(i * columns) + 0]);
  2596         -      sampleType = wxString::FromUTF8(results[(i * columns) + 1]);
  2597         -      numBands = atoi(results[(i * columns) + 2]);
  2598         -      if (results[(i * columns) + 3] == NULL)
  2599         -        CanApplyNDVI = false;
  2600         -      else
  2601         -        {
  2602         -          if (atoi(results[(i * columns) + 3]) == 0)
  2603         -            CanApplyNDVI = false;
  2604         -          else
  2605         -            CanApplyNDVI = true;
  2606         -        }
  2607         -      if (results[(i * columns) + 4] == NULL)
  2608         -        ok_min = false;
  2609         -      else
  2610         -        {
  2611         -          ok_min = true;
  2612         -          min = atof(results[(i * columns) + 4]);
  2613         -        }
  2614         -      if (results[(i * columns) + 5] == NULL)
  2615         -        ok_max = false;
  2616         -      else
  2617         -        {
  2618         -          ok_max = true;
  2619         -          max = atof(results[(i * columns) + 5]);
  2620         -        }
  2621         -
  2622         -    }
  2623         -  sqlite3_free_table(results);
  2624         -
  2625         -  if (pixelType.Cmp(wxT("RGB")) == 0 || pixelType.Cmp(wxT("GRAYSCALE")) == 0
  2626         -      || pixelType.Cmp(wxT("MULTIBAND")) == 0
  2627         -      || (pixelType.Cmp(wxT("DATAGRID")) == 0
  2628         -          && sampleType.Cmp(wxT("UINT16")) == 0))
  2629         -    CanApplyContrastEnhancement = true;
  2630         -  else
  2631         -    CanApplyContrastEnhancement = false;
  2632         -  if (pixelType.Cmp(wxT("MULTIBAND")) == 0)
  2633         -    {
  2634         -      IsMultiband = true;
  2635         -      NumBands = numBands;
  2636         -      RedBand = 0;
  2637         -      GreenBand = 1;
  2638         -      BlueBand = 2;
  2639         -  } else
  2640         -    IsMultiband = false;
  2641         -  if (ok_min == true && ok_max == true)
  2642         -    {
  2643         -      CanApplyColorMap = true;
  2644         -      MinPixelValue = min;
  2645         -      MaxPixelValue = max;
  2646         -  } else
  2647         -    CanApplyColorMap = false;
  2648         -  if (pixelType.Cmp(wxT("DATAGRID")) == 0
  2649         -      || pixelType.Cmp(wxT("MONOCHROME")) == 0)
  2650         -    ;
  2651         -  else
  2652         -    CanApplyColorMap = false;
  2653         -  if (pixelType.Cmp(wxT("DATAGRID")) == 0)
  2654         -    CanApplyShadedRelief = true;
  2655         -  else
  2656         -    CanApplyShadedRelief = false;
  2657         -}

Deleted QuickStylesTopology.cpp.

     1         -/*
     2         -/ QuickStylesTopology.cpp
     3         -/ Quick Styles wizards (Topology layers)
     4         -/
     5         -/ version 2.0, 2017 May 26
     6         -/
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
     8         -/
     9         -/ Copyright (C) 2017  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/spinctrl.h"
    29         -#include "wx/imaglist.h"
    30         -#include "wx/colordlg.h"
    31         -#include "wx/filename.h"
    32         -#include "wx/clipbrd.h"
    33         -
    34         -QuickStyleTopologyObj::QuickStyleTopologyObj(int type)
    35         -{
    36         -// ctor
    37         -  QuickStyleObj::DoGetUUID(UUID);
    38         -  Type = type;
    39         -  MinScaleEnabled = false;
    40         -  MaxScaleEnabled = false;
    41         -  ScaleMin = 0.0;
    42         -  ScaleMax = 0.0;
    43         -  NodeOpacity = 1.0;
    44         -  NodeSize = 16;
    45         -  NodeRotation = 0.0;
    46         -  NodeAnchorX = 0.5;
    47         -  NodeAnchorY = 0.5;
    48         -  NodeDisplacementX = 0.0;
    49         -  NodeDisplacementY = 0.0;
    50         -  NodeWellKnownMark = QuickStyleObj::RandomWellKnownMark();
    51         -  QuickStyleObj::RandomColor(NodeFillColor);
    52         -  QuickStyleObj::RandomColor(NodeStrokeColor);
    53         -  EdgeLinkOpacity = 1.0;
    54         -  EdgeLinkPerpendicularOffset = 0.0;
    55         -  EdgeLinkStrokeWidth = 1.0;
    56         -  QuickStyleObj::RandomColor(EdgeLinkStrokeColor);
    57         -  EdgeLinkDotStyle = QUICK_STYLE_SOLID_LINE;
    58         -  FaceFill = true;
    59         -  FaceStroke = true;
    60         -  FaceDisplacementX = 0.0;
    61         -  FaceDisplacementY = 0.0;
    62         -  FacePerpendicularOffset = 0.0;
    63         -  FaceFillOpacity = 1.0;
    64         -  QuickStyleObj::RandomColor(FaceFillColor);
    65         -  FaceStrokeOpacity = 1.0;
    66         -  FaceStrokeWidth = 1.0;
    67         -  QuickStyleObj::RandomColor(FaceStrokeColor);
    68         -  EdgeLinkSeedOpacity = 1.0;
    69         -  EdgeLinkSeedSize = 16;
    70         -  EdgeLinkSeedRotation = 0.0;
    71         -  EdgeLinkSeedAnchorX = 0.5;
    72         -  EdgeLinkSeedAnchorY = 0.5;
    73         -  EdgeLinkSeedDisplacementX = 0.0;
    74         -  EdgeLinkSeedDisplacementY = 0.0;
    75         -  EdgeLinkSeedWellKnownMark = QuickStyleObj::RandomWellKnownMark();
    76         -  QuickStyleObj::RandomColor(EdgeLinkSeedFillColor);
    77         -  QuickStyleObj::RandomColor(EdgeLinkSeedStrokeColor);
    78         -  FaceSeedOpacity = 1.0;
    79         -  FaceSeedSize = 16;
    80         -  FaceSeedRotation = 0.0;
    81         -  FaceSeedAnchorX = 0.5;
    82         -  FaceSeedAnchorY = 0.5;
    83         -  FaceSeedDisplacementX = 0.0;
    84         -  FaceSeedDisplacementY = 0.0;
    85         -  FaceSeedWellKnownMark = QuickStyleObj::RandomWellKnownMark();
    86         -  QuickStyleObj::RandomColor(FaceSeedFillColor);
    87         -  QuickStyleObj::RandomColor(FaceSeedStrokeColor);
    88         -  XmlStyle = NULL;
    89         -}
    90         -
    91         -QuickStyleTopologyObj *QuickStyleTopologyObj::Clone()
    92         -{
    93         -//
    94         -// cloning a Quick Style Topology
    95         -//
    96         -  QuickStyleTopologyObj *Style = new QuickStyleTopologyObj(this->Type);
    97         -  strcpy(Style->UUID, this->UUID);
    98         -  Style->MinScaleEnabled = this->MinScaleEnabled;
    99         -  Style->MaxScaleEnabled = this->MaxScaleEnabled;
   100         -  Style->ScaleMin = this->ScaleMin;
   101         -  Style->ScaleMax = this->ScaleMax;
   102         -  Style->NodeOpacity = this->NodeOpacity;
   103         -  Style->NodeSize = this->NodeSize;
   104         -  Style->NodeRotation = this->NodeRotation;
   105         -  Style->NodeAnchorX = this->NodeAnchorX;
   106         -  Style->NodeAnchorY = this->NodeAnchorY;
   107         -  Style->NodeDisplacementX = this->NodeDisplacementX;
   108         -  Style->NodeDisplacementY = this->NodeDisplacementY;
   109         -  Style->NodeWellKnownMark = this->NodeWellKnownMark;
   110         -  strcpy(Style->NodeFillColor, this->NodeFillColor);
   111         -  strcpy(Style->NodeStrokeColor, this->NodeStrokeColor);
   112         -  Style->EdgeLinkOpacity = this->EdgeLinkOpacity;
   113         -  Style->EdgeLinkPerpendicularOffset = this->EdgeLinkPerpendicularOffset;
   114         -  Style->EdgeLinkStrokeWidth = this->EdgeLinkStrokeWidth;
   115         -  strcpy(Style->EdgeLinkStrokeColor, this->EdgeLinkStrokeColor);
   116         -  Style->EdgeLinkDotStyle = this->EdgeLinkDotStyle;
   117         -  Style->FaceFill = this->FaceFill;
   118         -  Style->FaceStroke = this->FaceStroke;
   119         -  Style->FaceDisplacementX = this->FaceDisplacementX;
   120         -  Style->FaceDisplacementY = this->FaceDisplacementY;
   121         -  Style->FacePerpendicularOffset = this->FacePerpendicularOffset;
   122         -  Style->FaceFillOpacity = this->FaceFillOpacity;
   123         -  strcpy(Style->FaceFillColor, this->FaceFillColor);
   124         -  Style->FaceStrokeOpacity = this->FaceStrokeOpacity;
   125         -  Style->FaceStrokeWidth = this->FaceStrokeWidth;
   126         -  strcpy(Style->FaceStrokeColor, this->FaceStrokeColor);
   127         -  Style->EdgeLinkSeedOpacity = this->EdgeLinkSeedOpacity;
   128         -  Style->EdgeLinkSeedSize = this->EdgeLinkSeedSize;
   129         -  Style->EdgeLinkSeedRotation = this->EdgeLinkSeedRotation;
   130         -  Style->EdgeLinkSeedAnchorX = this->EdgeLinkSeedAnchorX;
   131         -  Style->EdgeLinkSeedAnchorY = this->EdgeLinkSeedAnchorY;
   132         -  Style->EdgeLinkSeedDisplacementX = this->EdgeLinkSeedDisplacementX;
   133         -  Style->EdgeLinkSeedDisplacementY = this->EdgeLinkSeedDisplacementY;
   134         -  Style->EdgeLinkSeedWellKnownMark = this->EdgeLinkSeedWellKnownMark;
   135         -  strcpy(Style->EdgeLinkSeedFillColor, this->EdgeLinkSeedFillColor);
   136         -  strcpy(Style->EdgeLinkSeedStrokeColor, this->EdgeLinkSeedStrokeColor);
   137         -  Style->FaceSeedOpacity = this->FaceSeedOpacity;
   138         -  Style->FaceSeedSize = this->FaceSeedSize;
   139         -  Style->FaceSeedRotation = this->FaceSeedRotation;
   140         -  Style->FaceSeedAnchorX = this->FaceSeedAnchorX;
   141         -  Style->FaceSeedAnchorY = this->FaceSeedAnchorY;
   142         -  Style->FaceSeedDisplacementX = this->FaceSeedDisplacementX;
   143         -  Style->FaceSeedDisplacementY = this->FaceSeedDisplacementY;
   144         -  Style->FaceSeedWellKnownMark = this->FaceSeedWellKnownMark;
   145         -  strcpy(Style->FaceSeedFillColor, this->FaceSeedFillColor);
   146         -  strcpy(Style->FaceSeedStrokeColor, this->FaceSeedStrokeColor);
   147         -  Style->XmlStyle = NULL;
   148         -  return Style;
   149         -}
   150         -
   151         -bool QuickStyleTopologyObj::Compare(QuickStyleTopologyObj * Style)
   152         -{
   153         -//
   154         -// comparing two Quick Style objects (Topology)
   155         -//
   156         -  if (strcmp(Style->UUID, this->UUID) != 0)
   157         -    return false;
   158         -  if (Style->MinScaleEnabled != this->MinScaleEnabled)
   159         -    return false;
   160         -  if (Style->MaxScaleEnabled != this->MaxScaleEnabled)
   161         -    return false;
   162         -  if (Style->ScaleMin != this->ScaleMin)
   163         -    return false;
   164         -  if (Style->ScaleMax != this->ScaleMax)
   165         -    return false;
   166         -  if (Style->NodeOpacity != this->NodeOpacity)
   167         -    return false;
   168         -  if (Style->NodeSize != this->NodeSize)
   169         -    return false;
   170         -  if (Style->NodeRotation != this->NodeRotation)
   171         -    return false;
   172         -  if (Style->NodeAnchorX != this->NodeAnchorX)
   173         -    return false;
   174         -  if (Style->NodeAnchorY != this->NodeAnchorY)
   175         -    return false;
   176         -  if (Style->NodeDisplacementX != this->NodeDisplacementX)
   177         -    return false;
   178         -  if (Style->NodeDisplacementY != this->NodeDisplacementY)
   179         -    return false;
   180         -  if (Style->NodeWellKnownMark != this->NodeWellKnownMark)
   181         -    return false;
   182         -  if (strcmp(Style->NodeFillColor, this->NodeFillColor) != 0)
   183         -    return false;
   184         -  if (strcmp(Style->NodeStrokeColor, this->NodeStrokeColor) != 0)
   185         -    return false;
   186         -  if (Style->EdgeLinkOpacity != this->EdgeLinkOpacity)
   187         -    return false;
   188         -  if (Style->EdgeLinkPerpendicularOffset != this->EdgeLinkPerpendicularOffset)
   189         -    return false;
   190         -  if (Style->EdgeLinkStrokeWidth != this->EdgeLinkStrokeWidth)
   191         -    return false;
   192         -  if (strcmp(Style->EdgeLinkStrokeColor, this->EdgeLinkStrokeColor) != 0)
   193         -    return false;
   194         -  if (Style->EdgeLinkDotStyle != this->EdgeLinkDotStyle)
   195         -    return false;
   196         -  if (Style->FaceFill != this->FaceFill)
   197         -    return false;
   198         -  if (Style->FaceStroke != this->FaceStroke)
   199         -    return false;
   200         -  if (Style->FaceDisplacementX != this->FaceDisplacementX)
   201         -    return false;
   202         -  if (Style->FaceDisplacementY != this->FaceDisplacementY)
   203         -    return false;
   204         -  if (Style->FacePerpendicularOffset != this->FacePerpendicularOffset)
   205         -    return false;
   206         -  if (Style->FaceFillOpacity != this->FaceFillOpacity)
   207         -    return false;
   208         -  if (strcmp(Style->FaceFillColor, this->FaceFillColor) != 0)
   209         -    return false;
   210         -  if (Style->FaceStrokeOpacity != this->FaceStrokeOpacity)
   211         -    return false;
   212         -  if (Style->FaceStrokeWidth != this->FaceStrokeWidth)
   213         -    return false;
   214         -  if (strcmp(Style->FaceStrokeColor, this->FaceStrokeColor) != 0)
   215         -    return false;
   216         -  if (Style->EdgeLinkSeedOpacity != this->EdgeLinkSeedOpacity)
   217         -    return false;
   218         -  if (Style->EdgeLinkSeedSize != this->EdgeLinkSeedSize)
   219         -    return false;
   220         -  if (Style->EdgeLinkSeedRotation != this->EdgeLinkSeedRotation)
   221         -    return false;
   222         -  if (Style->EdgeLinkSeedAnchorX != this->EdgeLinkSeedAnchorX)
   223         -    return false;
   224         -  if (Style->EdgeLinkSeedAnchorY != this->EdgeLinkSeedAnchorY)
   225         -    return false;
   226         -  if (Style->EdgeLinkSeedDisplacementX != this->EdgeLinkSeedDisplacementX)
   227         -    return false;
   228         -  if (Style->EdgeLinkSeedDisplacementY != this->EdgeLinkSeedDisplacementY)
   229         -    return false;
   230         -  if (Style->EdgeLinkSeedWellKnownMark != this->EdgeLinkSeedWellKnownMark)
   231         -    return false;
   232         -  if (strcmp(Style->EdgeLinkSeedFillColor, this->EdgeLinkSeedFillColor) != 0)
   233         -    return false;
   234         -  if (strcmp(Style->EdgeLinkSeedStrokeColor, this->EdgeLinkSeedStrokeColor) !=
   235         -      0)
   236         -    return false;
   237         -  if (Style->FaceSeedOpacity != this->FaceSeedOpacity)
   238         -    return false;
   239         -  if (Style->FaceSeedSize != this->FaceSeedSize)
   240         -    return false;
   241         -  if (Style->FaceSeedRotation != this->FaceSeedRotation)
   242         -    return false;
   243         -  if (Style->FaceSeedAnchorX != this->FaceSeedAnchorX)
   244         -    return false;
   245         -  if (Style->FaceSeedAnchorY != this->FaceSeedAnchorY)
   246         -    return false;
   247         -  if (Style->FaceSeedDisplacementX != this->FaceSeedDisplacementX)
   248         -    return false;
   249         -  if (Style->FaceSeedDisplacementY != this->FaceSeedDisplacementY)
   250         -    return false;
   251         -  if (Style->FaceSeedWellKnownMark != this->FaceSeedWellKnownMark)
   252         -    return false;
   253         -  if (strcmp(Style->FaceSeedFillColor, this->FaceSeedFillColor) != 0)
   254         -    return false;
   255         -  if (strcmp(Style->FaceSeedStrokeColor, this->FaceSeedStrokeColor) != 0)
   256         -    return false;
   257         -  return true;
   258         -}
   259         -
   260         -void QuickStyleTopologyObj::UpdateXmlStyle()
   261         -{
   262         -//
   263         -// updating the XML Style
   264         -//
   265         -  if (XmlStyle != NULL)
   266         -    sqlite3_free(XmlStyle);
   267         -  XmlStyle = CreateXmlStyle();
   268         -}
   269         -
   270         -char *QuickStyleTopologyObj::CreateXmlStyle()
   271         -{
   272         -//
   273         -// creating the XML Style
   274         -//
   275         -  char *prev;
   276         -  char *xml2;
   277         -  char *xml = sqlite3_mprintf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
   278         -  prev = xml;
   279         -  xml = sqlite3_mprintf("%s<FeatureTypeStyle version=\"1.1.0\" ", prev);
   280         -  sqlite3_free(prev);
   281         -  prev = xml;
   282         -  xml =
   283         -    sqlite3_mprintf
   284         -    ("%sxsi:schemaLocation=\"http://www.opengis.net/se http://schemas.opengis.net/se/1.1.0/FeatureStyle.xsd\" ",
   285         -     prev);
   286         -  sqlite3_free(prev);
   287         -  prev = xml;
   288         -  xml = sqlite3_mprintf
   289         -    ("%sxmlns=\"http://www.opengis.net/se\" xmlns:ogc=\"http://www.opengis.net/ogc\" ",
   290         -     prev);
   291         -  sqlite3_free(prev);
   292         -  prev = xml;
   293         -  xml =
   294         -    sqlite3_mprintf("%sxmlns:xlink=\"http://www.w3.org/1999/xlink\" ", prev);
   295         -  sqlite3_free(prev);
   296         -  prev = xml;
   297         -  xml =
   298         -    sqlite3_mprintf
   299         -    ("%sxmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\r\n", prev);
   300         -  sqlite3_free(prev);
   301         -  prev = xml;
   302         -  xml = sqlite3_mprintf("%s\t<Name>%s</Name>\r\n", prev, UUID);
   303         -  sqlite3_free(prev);
   304         -  prev = xml;
   305         -  xml = sqlite3_mprintf("%s\t<Description>\r\n", prev);
   306         -  sqlite3_free(prev);
   307         -  prev = xml;
   308         -  xml =
   309         -    sqlite3_mprintf("%s\t\t<Title>%s</Title>\r\n", prev,
   310         -                    "Quick Style - Topology");
   311         -  sqlite3_free(prev);
   312         -  prev = xml;
   313         -  xml =
   314         -    sqlite3_mprintf("%s\t\t<Abstract>%s</Abstract>\r\n", prev,
   315         -                    "Created by SpatialiteGUI");
   316         -  sqlite3_free(prev);
   317         -  prev = xml;
   318         -  xml = sqlite3_mprintf("%s\t</Description>\r\n", prev);
   319         -  sqlite3_free(prev);
   320         -  prev = xml;
   321         -  if (Type == MAP_LAYER_NETWORK)
   322         -    {
   323         -      // Links
   324         -      xml2 = DoCreateEdgeLinkXML();
   325         -      if (xml2 != NULL)
   326         -        {
   327         -          xml = sqlite3_mprintf("%s%s", prev, xml2);
   328         -          sqlite3_free(prev);
   329         -          sqlite3_free(xml2);
   330         -          prev = xml;
   331         -        }
   332         -      // Nodes
   333         -      xml2 = DoCreateNodeXML();
   334         -      if (xml2 != NULL)
   335         -        {
   336         -          xml = sqlite3_mprintf("%s%s", prev, xml2);
   337         -          sqlite3_free(prev);
   338         -          sqlite3_free(xml2);
   339         -          prev = xml;
   340         -        }
   341         -      // LinkSeeds
   342         -      xml2 = DoCreateEdgeLinkSeedXML();
   343         -      if (xml2 != NULL)
   344         -        {
   345         -          xml = sqlite3_mprintf("%s%s", prev, xml2);
   346         -          sqlite3_free(prev);
   347         -          sqlite3_free(xml2);
   348         -          prev = xml;
   349         -        }
   350         -  } else
   351         -    {
   352         -      // Faces
   353         -      xml2 = DoCreateFaceXML();
   354         -      if (xml2 != NULL)
   355         -        {
   356         -          xml = sqlite3_mprintf("%s%s", prev, xml2);
   357         -          sqlite3_free(prev);
   358         -          sqlite3_free(xml2);
   359         -          prev = xml;
   360         -        }
   361         -      // Edges
   362         -      xml2 = DoCreateEdgeLinkXML();
   363         -      if (xml2 != NULL)
   364         -        {
   365         -          xml = sqlite3_mprintf("%s%s", prev, xml2);
   366         -          sqlite3_free(prev);
   367         -          sqlite3_free(xml2);
   368         -          prev = xml;
   369         -        }
   370         -      // Nodes
   371         -      xml2 = DoCreateNodeXML();
   372         -      if (xml2 != NULL)
   373         -        {
   374         -          xml = sqlite3_mprintf("%s%s", prev, xml2);
   375         -          sqlite3_free(prev);
   376         -          sqlite3_free(xml2);
   377         -          prev = xml;
   378         -        }
   379         -      // EdgeSeeds
   380         -      xml2 = DoCreateEdgeLinkSeedXML();
   381         -      if (xml2 != NULL)
   382         -        {
   383         -          xml = sqlite3_mprintf("%s%s", prev, xml2);
   384         -          sqlite3_free(prev);
   385         -          sqlite3_free(xml2);
   386         -          prev = xml;
   387         -        }
   388         -      // EdgeSeeds
   389         -      xml2 = DoCreateFaceSeedXML();
   390         -      if (xml2 != NULL)
   391         -        {
   392         -          xml = sqlite3_mprintf("%s%s", prev, xml2);
   393         -          sqlite3_free(prev);
   394         -          sqlite3_free(xml2);
   395         -          prev = xml;
   396         -        }
   397         -    }
   398         -  xml = sqlite3_mprintf("%s</FeatureTypeStyle>\r\n", prev);
   399         -  sqlite3_free(prev);
   400         -  return xml;
   401         -}
   402         -
   403         -char *QuickStyleTopologyObj::DoCreateFaceXML()
   404         -{
   405         -//
   406         -// creating the XML Style - Face
   407         -//
   408         -  char *prev;
   409         -  char *xml = sqlite3_mprintf("\t<Rule>\r\n");
   410         -  prev = xml;
   411         -  if (MinScaleEnabled == true)
   412         -    {
   413         -      xml =
   414         -        sqlite3_mprintf
   415         -        ("%s\t\t<MinScaleDenominator>%1.2f</MinScaleDenominator>\r\n", prev,
   416         -         ScaleMin);
   417         -      sqlite3_free(prev);
   418         -      prev = xml;
   419         -    }
   420         -  if (MaxScaleEnabled == true)
   421         -    {
   422         -      xml =
   423         -        sqlite3_mprintf
   424         -        ("%s\t\t<MaxScaleDenominator>%1.2f</MaxScaleDenominator>\r\n", prev,
   425         -         ScaleMax);
   426         -      sqlite3_free(prev);
   427         -      prev = xml;
   428         -    }
   429         -  xml = sqlite3_mprintf("%s\t\t<Name>Face</Name>\r\n", prev);
   430         -  sqlite3_free(prev);
   431         -  prev = xml;
   432         -  xml =
   433         -    sqlite3_mprintf("%s\t\t<ogc:Filter>\r\n\t\t\t<ogc:PropertyIsEqualTo>\r\n",
   434         -                    prev);
   435         -  sqlite3_free(prev);
   436         -  prev = xml;
   437         -  xml =
   438         -    sqlite3_mprintf
   439         -    ("%s\t\t\t\t<ogc:PropertyName>topoclass</ogc:PropertyName>\r\n", prev);
   440         -  sqlite3_free(prev);
   441         -  prev = xml;
   442         -  xml = sqlite3_mprintf("%s\t\t\t\t<ogc:Literal>face</ogc:Literal>\r\n", prev);
   443         -  sqlite3_free(prev);
   444         -  prev = xml;
   445         -  xml =
   446         -    sqlite3_mprintf("%s\t\t\t</ogc:PropertyIsEqualTo>\r\n\t\t</ogc:Filter>\r\n",
   447         -                    prev);
   448         -  sqlite3_free(prev);
   449         -  prev = xml;
   450         -
   451         -  const char *extra = "\t\t";
   452         -  xml = sqlite3_mprintf("%s%s<PolygonSymbolizer>\r\n", prev, extra);
   453         -  prev = xml;
   454         -  if (FaceFill == true)
   455         -    {
   456         -      // Polygon Fill
   457         -      xml = sqlite3_mprintf("%s%s\t<Fill>\r\n", prev, extra);
   458         -      sqlite3_free(prev);
   459         -      prev = xml;
   460         -      // using a Solid Color
   461         -      xml =
   462         -        sqlite3_mprintf
   463         -        ("%s%s\t\t<SvgParameter name=\"fill\">%s</SvgParameter>\r\n", prev,
   464         -         extra, FaceFillColor);
   465         -      sqlite3_free(prev);
   466         -      prev = xml;
   467         -      xml =
   468         -        sqlite3_mprintf
   469         -        ("%s%s\t\t<SvgParameter name=\"fill-opacity\">%1.2f</SvgParameter>\r\n",
   470         -         prev, extra, FaceFillOpacity);
   471         -      sqlite3_free(prev);
   472         -      prev = xml;
   473         -      xml = sqlite3_mprintf("%s%s\t</Fill>\r\n", prev, extra);
   474         -      sqlite3_free(prev);
   475         -      prev = xml;
   476         -    }
   477         -  if (FaceStroke == true)
   478         -    {
   479         -      // Polygon Stroke
   480         -      xml = sqlite3_mprintf("%s%s\t<Stroke>\r\n", prev, extra);
   481         -      sqlite3_free(prev);
   482         -      prev = xml;
   483         -      // using a Solid Color
   484         -      xml =
   485         -        sqlite3_mprintf
   486         -        ("%s%s\t\t<SvgParameter name=\"stroke\">%s</SvgParameter>\r\n", prev,
   487         -         extra, FaceStrokeColor);
   488         -      sqlite3_free(prev);
   489         -      prev = xml;
   490         -      xml =
   491         -        sqlite3_mprintf
   492         -        ("%s%s\t\t<SvgParameter name=\"stroke-opacity\">%1.2f</SvgParameter>\r\n",
   493         -         prev, extra, FaceStrokeOpacity);
   494         -      sqlite3_free(prev);
   495         -      prev = xml;
   496         -      xml =
   497         -        sqlite3_mprintf
   498         -        ("%s%s\t\t<SvgParameter name=\"stroke-width\">%1.2f</SvgParameter>\r\n",
   499         -         prev, extra, FaceStrokeWidth);
   500         -      sqlite3_free(prev);
   501         -      prev = xml;
   502         -      xml =
   503         -        sqlite3_mprintf
   504         -        ("%s%s\t\t<SvgParameter name=\"stroke-linejoin\">round</SvgParameter>\r\n",
   505         -         prev, extra);
   506         -      sqlite3_free(prev);
   507         -      prev = xml;
   508         -      xml =
   509         -        sqlite3_mprintf
   510         -        ("%s%s\t\t<SvgParameter name=\"stroke-linecap\">round</SvgParameter>\r\n",
   511         -         prev, extra);
   512         -      sqlite3_free(prev);
   513         -      prev = xml;
   514         -      xml = sqlite3_mprintf("%s%s\t</Stroke>\r\n", prev, extra);
   515         -      sqlite3_free(prev);
   516         -      prev = xml;
   517         -    }
   518         -  if (FaceDisplacementX != 0.0 || FaceDisplacementY != 0.0)
   519         -    {
   520         -      xml = sqlite3_mprintf("%s%s\t<Displacement>\r\n", prev, extra);
   521         -      sqlite3_free(prev);
   522         -      prev = xml;
   523         -      xml =
   524         -        sqlite3_mprintf("%s%s\t\t<DisplacementX>%1.4f</DisplacementX>\r\n",
   525         -                        prev, extra, FaceDisplacementX);
   526         -      sqlite3_free(prev);
   527         -      prev = xml;
   528         -      xml =
   529         -        sqlite3_mprintf("%s%s\t\t<DisplacementY>%1.4f</DisplacementY>\r\n",
   530         -                        prev, extra, FaceDisplacementY);
   531         -      sqlite3_free(prev);
   532         -      prev = xml;
   533         -      xml = sqlite3_mprintf("%s%s\t</Displacement>\r\n", prev, extra);
   534         -      sqlite3_free(prev);
   535         -      prev = xml;
   536         -    }
   537         -  if (FacePerpendicularOffset != 0.0)
   538         -    {
   539         -      xml =
   540         -        sqlite3_mprintf
   541         -        ("%s%s\t<PerpendicularOffset>%1.4f</PerpendicularOffset>\r\n", prev,
   542         -         extra, FacePerpendicularOffset);
   543         -      sqlite3_free(prev);
   544         -      prev = xml;
   545         -    }
   546         -  xml = sqlite3_mprintf("%s%s</PolygonSymbolizer>\r\n", prev, extra);
   547         -  sqlite3_free(prev);
   548         -  prev = xml;
   549         -  xml = sqlite3_mprintf("%s\t</Rule>\r\n", prev);
   550         -  sqlite3_free(prev);
   551         -  return xml;
   552         -}
   553         -
   554         -char *QuickStyleTopologyObj::DoCreateEdgeLinkXML()
   555         -{
   556         -//
   557         -// creating the XML Style - Edge or Link
   558         -//
   559         -  char *prev;
   560         -  char *xml = sqlite3_mprintf("\t<Rule>\r\n");
   561         -  prev = xml;
   562         -  if (MinScaleEnabled == true)
   563         -    {
   564         -      xml =
   565         -        sqlite3_mprintf
   566         -        ("%s\t\t<MinScaleDenominator>%1.2f</MinScaleDenominator>\r\n", prev,
   567         -         ScaleMin);
   568         -      sqlite3_free(prev);
   569         -      prev = xml;
   570         -    }
   571         -  if (MaxScaleEnabled == true)
   572         -    {
   573         -      xml =
   574         -        sqlite3_mprintf
   575         -        ("%s\t\t<MaxScaleDenominator>%1.2f</MaxScaleDenominator>\r\n", prev,
   576         -         ScaleMax);
   577         -      sqlite3_free(prev);
   578         -      prev = xml;
   579         -    }
   580         -  if (Type == MAP_LAYER_NETWORK)
   581         -    xml = sqlite3_mprintf("%s\t\t<Name>Link</Name>\r\n", prev);
   582         -  else
   583         -    xml = sqlite3_mprintf("%s\t\t<Name>Edge</Name>\r\n", prev);
   584         -  sqlite3_free(prev);
   585         -  prev = xml;
   586         -  xml =
   587         -    sqlite3_mprintf("%s\t\t<ogc:Filter>\r\n\t\t\t<ogc:PropertyIsEqualTo>\r\n",
   588         -                    prev);
   589         -  sqlite3_free(prev);
   590         -  prev = xml;
   591         -  xml =
   592         -    sqlite3_mprintf
   593         -    ("%s\t\t\t\t<ogc:PropertyName>topoclass</ogc:PropertyName>\r\n", prev);
   594         -  sqlite3_free(prev);
   595         -  prev = xml;
   596         -  if (Type == MAP_LAYER_NETWORK)
   597         -    xml =
   598         -      sqlite3_mprintf("%s\t\t\t\t<ogc:Literal>link</ogc:Literal>\r\n", prev);
   599         -  else
   600         -    xml =
   601         -      sqlite3_mprintf("%s\t\t\t\t<ogc:Literal>edge</ogc:Literal>\r\n", prev);
   602         -  sqlite3_free(prev);
   603         -  prev = xml;
   604         -  xml =
   605         -    sqlite3_mprintf("%s\t\t\t</ogc:PropertyIsEqualTo>\r\n\t\t</ogc:Filter>\r\n",
   606         -                    prev);
   607         -  sqlite3_free(prev);
   608         -  prev = xml;
   609         -
   610         -  const char *extra = "\t\t";
   611         -  xml = sqlite3_mprintf("%s%s<LineSymbolizer>\r\n", prev, extra);
   612         -  prev = xml;
   613         -  xml = sqlite3_mprintf("%s%s\t<Stroke>\r\n", prev, extra);
   614         -  sqlite3_free(prev);
   615         -  prev = xml;
   616         -// using a Solid Color
   617         -  xml =
   618         -    sqlite3_mprintf
   619         -    ("%s%s\t\t<SvgParameter name=\"stroke\">%s</SvgParameter>\r\n", prev, extra,
   620         -     EdgeLinkStrokeColor);
   621         -  sqlite3_free(prev);
   622         -  prev = xml;
   623         -  xml =
   624         -    sqlite3_mprintf
   625         -    ("%s%s\t\t<SvgParameter name=\"stroke-opacity\">%1.2f</SvgParameter>\r\n",
   626         -     prev, extra, EdgeLinkOpacity);
   627         -  sqlite3_free(prev);
   628         -  prev = xml;
   629         -  xml =
   630         -    sqlite3_mprintf
   631         -    ("%s%s\t\t<SvgParameter name=\"stroke-width\">%1.2f</SvgParameter>\r\n",
   632         -     prev, extra, EdgeLinkStrokeWidth);
   633         -  sqlite3_free(prev);
   634         -  prev = xml;
   635         -  xml =
   636         -    sqlite3_mprintf
   637         -    ("%s%s\t\t<SvgParameter name=\"stroke-linejoin\">round</SvgParameter>\r\n",
   638         -     prev, extra);
   639         -  sqlite3_free(prev);
   640         -  prev = xml;
   641         -  xml =
   642         -    sqlite3_mprintf
   643         -    ("%s%s\t\t<SvgParameter name=\"stroke-linecap\">round</SvgParameter>\r\n",
   644         -     prev, extra);
   645         -  sqlite3_free(prev);
   646         -  prev = xml;
   647         -  const char *dashArray;
   648         -  switch (EdgeLinkDotStyle)
   649         -    {
   650         -      case QUICK_STYLE_DOT_LINE:
   651         -        dashArray = "5.0, 10.0";
   652         -        break;
   653         -      case QUICK_STYLE_DASH_LINE:
   654         -        dashArray = "20.0, 20.0";
   655         -        break;
   656         -      case QUICK_STYLE_DASH_DOT_LINE:
   657         -        dashArray = "20.0, 10.0, 5.0, 10.0";
   658         -        break;
   659         -      default:
   660         -        dashArray = NULL;
   661         -        break;
   662         -    };
   663         -  if (dashArray != NULL)
   664         -    {
   665         -      xml =
   666         -        sqlite3_mprintf
   667         -        ("%s%s\t\t<SvgParameter name=\"stroke-dasharray\">%s</SvgParameter>\r\n",
   668         -         prev, extra, dashArray);
   669         -      sqlite3_free(prev);
   670         -      prev = xml;
   671         -    }
   672         -  xml = sqlite3_mprintf("%s%s\t</Stroke>\r\n", prev, extra);
   673         -  sqlite3_free(prev);
   674         -  prev = xml;
   675         -  if (EdgeLinkPerpendicularOffset != 0.0)
   676         -    {
   677         -      xml =
   678         -        sqlite3_mprintf
   679         -        ("%s%s\t<PerpendicularOffset>%1.2f</PerpendicularOffset>\r\n", prev,
   680         -         extra, EdgeLinkPerpendicularOffset);
   681         -      sqlite3_free(prev);
   682         -      prev = xml;
   683         -    }
   684         -  xml = sqlite3_mprintf("%s%s</LineSymbolizer>\r\n", prev, extra);
   685         -  sqlite3_free(prev);
   686         -  prev = xml;
   687         -  xml = sqlite3_mprintf("%s\t</Rule>\r\n", prev);
   688         -  sqlite3_free(prev);
   689         -  return xml;
   690         -}
   691         -
   692         -char *QuickStyleTopologyObj::DoCreateNodeXML()
   693         -{
   694         -//
   695         -// creating the XML Style - Node
   696         -//
   697         -  const char *cstr;
   698         -  char *prev;
   699         -  char *xml = sqlite3_mprintf("\t<Rule>\r\n");
   700         -  prev = xml;
   701         -  if (MinScaleEnabled == true)
   702         -    {
   703         -      xml =
   704         -        sqlite3_mprintf
   705         -        ("%s\t\t<MinScaleDenominator>%1.2f</MinScaleDenominator>\r\n", prev,
   706         -         ScaleMin);
   707         -      sqlite3_free(prev);
   708         -      prev = xml;
   709         -    }
   710         -  if (MaxScaleEnabled == true)
   711         -    {
   712         -      xml =
   713         -        sqlite3_mprintf
   714         -        ("%s\t\t<MaxScaleDenominator>%1.2f</MaxScaleDenominator>\r\n", prev,
   715         -         ScaleMax);
   716         -      sqlite3_free(prev);
   717         -      prev = xml;
   718         -    }
   719         -  xml = sqlite3_mprintf("%s\t\t<Name>Node</Name>\r\n", prev);
   720         -  sqlite3_free(prev);
   721         -  prev = xml;
   722         -  xml =
   723         -    sqlite3_mprintf("%s\t\t<ogc:Filter>\r\n\t\t\t<ogc:PropertyIsEqualTo>\r\n",
   724         -                    prev);
   725         -  sqlite3_free(prev);
   726         -  prev = xml;
   727         -  xml =
   728         -    sqlite3_mprintf
   729         -    ("%s\t\t\t\t<ogc:PropertyName>topoclass</ogc:PropertyName>\r\n", prev);
   730         -  sqlite3_free(prev);
   731         -  prev = xml;
   732         -  xml = sqlite3_mprintf("%s\t\t\t\t<ogc:Literal>node</ogc:Literal>\r\n", prev);
   733         -  sqlite3_free(prev);
   734         -  prev = xml;
   735         -  xml =
   736         -    sqlite3_mprintf("%s\t\t\t</ogc:PropertyIsEqualTo>\r\n\t\t</ogc:Filter>\r\n",
   737         -                    prev);
   738         -  sqlite3_free(prev);
   739         -  prev = xml;
   740         -
   741         -  const char *extra = "\t\t";
   742         -  xml = sqlite3_mprintf("%s%s<PointSymbolizer>\r\n", prev, extra);
   743         -  prev = xml;
   744         -  xml = sqlite3_mprintf("%s%s\t<Graphic>\r\n", prev, extra);
   745         -  sqlite3_free(prev);
   746         -  prev = xml;
   747         -// mark symbol
   748         -  xml = sqlite3_mprintf("%s%s\t\t<Mark>\r\n", prev, extra);
   749         -  sqlite3_free(prev);
   750         -  prev = xml;
   751         -  switch (NodeWellKnownMark)
   752         -    {
   753         -      case RL2_GRAPHIC_MARK_CIRCLE:
   754         -        cstr = "circle";
   755         -        break;
   756         -      case RL2_GRAPHIC_MARK_TRIANGLE:
   757         -        cstr = "triangle";
   758         -        break;
   759         -      case RL2_GRAPHIC_MARK_STAR:
   760         -        cstr = "star";
   761         -        break;
   762         -      case RL2_GRAPHIC_MARK_CROSS:
   763         -        cstr = "cross";
   764         -        break;
   765         -      case RL2_GRAPHIC_MARK_X:
   766         -        cstr = "x";
   767         -        break;
   768         -      default:
   769         -        cstr = "square";
   770         -        break;
   771         -    };
   772         -  xml =
   773         -    sqlite3_mprintf("%s%s\t\t\t<WellKnownName>%s</WellKnownName>\r\n", prev,
   774         -                    extra, cstr);
   775         -  sqlite3_free(prev);
   776         -  prev = xml;
   777         -// Mark Fill
   778         -  xml = sqlite3_mprintf("%s%s\t\t\t<Fill>\r\n", prev, extra);
   779         -  sqlite3_free(prev);
   780         -  prev = xml;
   781         -  xml =
   782         -    sqlite3_mprintf
   783         -    ("%s%s\t\t\t\t<SvgParameter name=\"fill\">%s</SvgParameter>\r\n",
   784         -     prev, extra, NodeFillColor);
   785         -  sqlite3_free(prev);
   786         -  prev = xml;
   787         -  xml = sqlite3_mprintf("%s%s\t\t\t</Fill>\r\n", prev, extra);
   788         -  sqlite3_free(prev);
   789         -  prev = xml;
   790         -// Mark Stroke
   791         -  xml = sqlite3_mprintf("%s%s\t\t\t<Stroke>\r\n", prev, extra);
   792         -  sqlite3_free(prev);
   793         -  prev = xml;
   794         -  xml =
   795         -    sqlite3_mprintf
   796         -    ("%s%s\t\t\t\t<SvgParameter name=\"stroke\">%s</SvgParameter>\r\n",
   797         -     prev, extra, NodeStrokeColor);
   798         -  sqlite3_free(prev);
   799         -  prev = xml;
   800         -  xml =
   801         -    sqlite3_mprintf
   802         -    ("%s%s\t\t\t\t<SvgParameter name=\"stroke-width\">%1.2f</SvgParameter>\r\n",
   803         -     prev, extra, 1.0);
   804         -  sqlite3_free(prev);
   805         -  prev = xml;
   806         -  xml =
   807         -    sqlite3_mprintf
   808         -    ("%s%s\t\t\t\t<SvgParameter name=\"stroke-linejoin\">round</SvgParameter>\r\n",
   809         -     prev, extra);
   810         -  sqlite3_free(prev);
   811         -  prev = xml;
   812         -  xml =
   813         -    sqlite3_mprintf
   814         -    ("%s%s\t\t\t\t<SvgParameter name=\"stroke-linecap\">round</SvgParameter>\r\n",
   815         -     prev, extra);
   816         -  sqlite3_free(prev);
   817         -  prev = xml;
   818         -  xml = sqlite3_mprintf("%s%s\t\t\t</Stroke>\r\n", prev, extra);
   819         -  sqlite3_free(prev);
   820         -  prev = xml;
   821         -  xml = sqlite3_mprintf("%s%s\t\t</Mark>\r\n", prev, extra);
   822         -  sqlite3_free(prev);
   823         -  prev = xml;
   824         -  if (NodeOpacity != 1.0)
   825         -    {
   826         -      xml =
   827         -        sqlite3_mprintf("%s%s\t\t<Opacity>%1.2f</Opacity>\r\n", prev, extra,
   828         -                        NodeOpacity);
   829         -      sqlite3_free(prev);
   830         -      prev = xml;
   831         -    }
   832         -  xml =
   833         -    sqlite3_mprintf("%s%s\t\t<Size>%1.2f</Size>\r\n", prev, extra, NodeSize);
   834         -  sqlite3_free(prev);
   835         -  prev = xml;
   836         -  if (NodeRotation != 0.0)
   837         -    {
   838         -      xml =
   839         -        sqlite3_mprintf("%s%s\t\t<Rotation>%1.2f</Rotation>\r\n", prev, extra,
   840         -                        NodeRotation);
   841         -      sqlite3_free(prev);
   842         -      prev = xml;
   843         -    }
   844         -  if (NodeAnchorX != 0.5 || NodeAnchorY != 0.5)
   845         -    {
   846         -      xml = sqlite3_mprintf("%s%s\t\t<AnchorPoint>\r\n", prev, extra);
   847         -      sqlite3_free(prev);
   848         -      prev = xml;
   849         -      xml =
   850         -        sqlite3_mprintf("%s%s\t\t\t<AnchorPointX>%1.4f</AnchorPointX>\r\n",
   851         -                        prev, extra, NodeAnchorX);
   852         -      sqlite3_free(prev);
   853         -      prev = xml;
   854         -      xml =
   855         -        sqlite3_mprintf("%s%s\t\t\t<AnchorPointY>%1.4f</AnchorPointY>\r\n",
   856         -                        prev, extra, NodeAnchorY);
   857         -      sqlite3_free(prev);
   858         -      prev = xml;
   859         -      xml = sqlite3_mprintf("%s%s\t\t</AnchorPoint>\r\n", prev, extra);
   860         -      sqlite3_free(prev);
   861         -      prev = xml;
   862         -    }
   863         -  if (NodeDisplacementX != 0.0 || NodeDisplacementY != 0.0)
   864         -    {
   865         -      xml = sqlite3_mprintf("%s%s\t\t<Displacement>\r\n", prev, extra);
   866         -      sqlite3_free(prev);
   867         -      prev = xml;
   868         -      xml =
   869         -        sqlite3_mprintf("%s%s\t\t\t<DisplacementX>%1.4f</DisplacementX>\r\n",
   870         -                        prev, extra, NodeDisplacementX);
   871         -      sqlite3_free(prev);
   872         -      prev = xml;
   873         -      xml =
   874         -        sqlite3_mprintf("%s%s\t\t\t<DisplacementY>%1.4f</DisplacementY>\r\n",
   875         -                        prev, extra, NodeDisplacementY);
   876         -      sqlite3_free(prev);
   877         -      prev = xml;
   878         -      xml = sqlite3_mprintf("%s%s\t\t</Displacement>\r\n", prev, extra);
   879         -      sqlite3_free(prev);
   880         -      prev = xml;
   881         -    }
   882         -  xml = sqlite3_mprintf("%s%s\t</Graphic>\r\n", prev, extra);
   883         -  sqlite3_free(prev);
   884         -  prev = xml;
   885         -  xml = sqlite3_mprintf("%s%s</PointSymbolizer>\r\n", prev, extra);
   886         -  sqlite3_free(prev);
   887         -  prev = xml;
   888         -  xml = sqlite3_mprintf("%s\t</Rule>\r\n", prev);
   889         -  sqlite3_free(prev);
   890         -  return xml;
   891         -}
   892         -
   893         -char *QuickStyleTopologyObj::DoCreateEdgeLinkSeedXML()
   894         -{
   895         -//
   896         -// creating the XML Style - Edge or Link Seed
   897         -//
   898         -  const char *cstr;
   899         -  char *prev;
   900         -  char *xml = sqlite3_mprintf("\t<Rule>\r\n");
   901         -  prev = xml;
   902         -  if (MinScaleEnabled == true)
   903         -    {
   904         -      xml =
   905         -        sqlite3_mprintf
   906         -        ("%s\t\t<MinScaleDenominator>%1.2f</MinScaleDenominator>\r\n", prev,
   907         -         ScaleMin);
   908         -      sqlite3_free(prev);
   909         -      prev = xml;
   910         -    }
   911         -  if (MaxScaleEnabled == true)
   912         -    {
   913         -      xml =
   914         -        sqlite3_mprintf
   915         -        ("%s\t\t<MaxScaleDenominator>%1.2f</MaxScaleDenominator>\r\n", prev,
   916         -         ScaleMax);
   917         -      sqlite3_free(prev);
   918         -      prev = xml;
   919         -    }
   920         -  if (Type == MAP_LAYER_NETWORK)
   921         -    xml = sqlite3_mprintf("%s\t\t<Name>LinkSeed</Name>\r\n", prev);
   922         -  else
   923         -    xml = sqlite3_mprintf("%s\t\t<Name>EdgeSeed</Name>\r\n", prev);
   924         -  sqlite3_free(prev);
   925         -  prev = xml;
   926         -  xml =
   927         -    sqlite3_mprintf("%s\t\t<ogc:Filter>\r\n\t\t\t<ogc:PropertyIsEqualTo>\r\n",
   928         -                    prev);
   929         -  sqlite3_free(prev);
   930         -  prev = xml;
   931         -  xml =
   932         -    sqlite3_mprintf
   933         -    ("%s\t\t\t\t<ogc:PropertyName>topoclass</ogc:PropertyName>\r\n", prev);
   934         -  sqlite3_free(prev);
   935         -  prev = xml;
   936         -  if (Type == MAP_LAYER_NETWORK)
   937         -    xml =
   938         -      sqlite3_mprintf("%s\t\t\t\t<ogc:Literal>link_seed</ogc:Literal>\r\n",
   939         -                      prev);
   940         -  else
   941         -    xml =
   942         -      sqlite3_mprintf("%s\t\t\t\t<ogc:Literal>edge_seed</ogc:Literal>\r\n",
   943         -                      prev);
   944         -  sqlite3_free(prev);
   945         -  prev = xml;
   946         -  xml =
   947         -    sqlite3_mprintf("%s\t\t\t</ogc:PropertyIsEqualTo>\r\n\t\t</ogc:Filter>\r\n",
   948         -                    prev);
   949         -  sqlite3_free(prev);
   950         -  prev = xml;
   951         -
   952         -  const char *extra = "\t\t";
   953         -  xml = sqlite3_mprintf("%s%s<PointSymbolizer>\r\n", prev, extra);
   954         -  prev = xml;
   955         -  xml = sqlite3_mprintf("%s%s\t<Graphic>\r\n", prev, extra);
   956         -  sqlite3_free(prev);
   957         -  prev = xml;
   958         -// mark symbol
   959         -  xml = sqlite3_mprintf("%s%s\t\t<Mark>\r\n", prev, extra);
   960         -  sqlite3_free(prev);
   961         -  prev = xml;
   962         -  switch (EdgeLinkSeedWellKnownMark)
   963         -    {
   964         -      case RL2_GRAPHIC_MARK_CIRCLE:
   965         -        cstr = "circle";
   966         -        break;
   967         -      case RL2_GRAPHIC_MARK_TRIANGLE:
   968         -        cstr = "triangle";
   969         -        break;
   970         -      case RL2_GRAPHIC_MARK_STAR:
   971         -        cstr = "star";
   972         -        break;
   973         -      case RL2_GRAPHIC_MARK_CROSS:
   974         -        cstr = "cross";
   975         -        break;
   976         -      case RL2_GRAPHIC_MARK_X:
   977         -        cstr = "x";
   978         -        break;
   979         -      default:
   980         -        cstr = "square";
   981         -        break;
   982         -    };
   983         -  xml =
   984         -    sqlite3_mprintf("%s%s\t\t\t<WellKnownName>%s</WellKnownName>\r\n", prev,
   985         -                    extra, cstr);
   986         -  sqlite3_free(prev);
   987         -  prev = xml;
   988         -// Mark Fill
   989         -  xml = sqlite3_mprintf("%s%s\t\t\t<Fill>\r\n", prev, extra);
   990         -  sqlite3_free(prev);
   991         -  prev = xml;
   992         -  xml =
   993         -    sqlite3_mprintf
   994         -    ("%s%s\t\t\t\t<SvgParameter name=\"fill\">%s</SvgParameter>\r\n",
   995         -     prev, extra, EdgeLinkSeedFillColor);
   996         -  sqlite3_free(prev);
   997         -  prev = xml;
   998         -  xml = sqlite3_mprintf("%s%s\t\t\t</Fill>\r\n", prev, extra);
   999         -  sqlite3_free(prev);
  1000         -  prev = xml;
  1001         -// Mark Stroke
  1002         -  xml = sqlite3_mprintf("%s%s\t\t\t<Stroke>\r\n", prev, extra);
  1003         -  sqlite3_free(prev);
  1004         -  prev = xml;
  1005         -  xml =
  1006         -    sqlite3_mprintf
  1007         -    ("%s%s\t\t\t\t<SvgParameter name=\"stroke\">%s</SvgParameter>\r\n",
  1008         -     prev, extra, EdgeLinkSeedStrokeColor);
  1009         -  sqlite3_free(prev);
  1010         -  prev = xml;
  1011         -  xml =
  1012         -    sqlite3_mprintf
  1013         -    ("%s%s\t\t\t\t<SvgParameter name=\"stroke-width\">%1.2f</SvgParameter>\r\n",
  1014         -     prev, extra, 1.0);
  1015         -  sqlite3_free(prev);
  1016         -  prev = xml;
  1017         -  xml =
  1018         -    sqlite3_mprintf
  1019         -    ("%s%s\t\t\t\t<SvgParameter name=\"stroke-linejoin\">round</SvgParameter>\r\n",
  1020         -     prev, extra);
  1021         -  sqlite3_free(prev);
  1022         -  prev = xml;
  1023         -  xml =
  1024         -    sqlite3_mprintf
  1025         -    ("%s%s\t\t\t\t<SvgParameter name=\"stroke-linecap\">round</SvgParameter>\r\n",
  1026         -     prev, extra);
  1027         -  sqlite3_free(prev);
  1028         -  prev = xml;
  1029         -  xml = sqlite3_mprintf("%s%s\t\t\t</Stroke>\r\n", prev, extra);
  1030         -  sqlite3_free(prev);
  1031         -  prev = xml;
  1032         -  xml = sqlite3_mprintf("%s%s\t\t</Mark>\r\n", prev, extra);
  1033         -  sqlite3_free(prev);
  1034         -  prev = xml;
  1035         -  if (EdgeLinkSeedOpacity != 1.0)
  1036         -    {
  1037         -      xml =
  1038         -        sqlite3_mprintf("%s%s\t\t<Opacity>%1.2f</Opacity>\r\n", prev, extra,
  1039         -                        EdgeLinkSeedOpacity);
  1040         -      sqlite3_free(prev);
  1041         -      prev = xml;
  1042         -    }
  1043         -  xml =
  1044         -    sqlite3_mprintf("%s%s\t\t<Size>%1.2f</Size>\r\n", prev, extra,
  1045         -                    EdgeLinkSeedSize);
  1046         -  sqlite3_free(prev);
  1047         -  prev = xml;
  1048         -  if (EdgeLinkSeedRotation != 0.0)
  1049         -    {
  1050         -      xml =
  1051         -        sqlite3_mprintf("%s%s\t\t<Rotation>%1.2f</Rotation>\r\n", prev, extra,
  1052         -                        EdgeLinkSeedRotation);
  1053         -      sqlite3_free(prev);
  1054         -      prev = xml;
  1055         -    }
  1056         -  if (EdgeLinkSeedAnchorX != 0.5 || EdgeLinkSeedAnchorY != 0.5)
  1057         -    {
  1058         -      xml = sqlite3_mprintf("%s%s\t\t<AnchorPoint>\r\n", prev, extra);
  1059         -      sqlite3_free(prev);
  1060         -      prev = xml;
  1061         -      xml =
  1062         -        sqlite3_mprintf("%s%s\t\t\t<AnchorPointX>%1.4f</AnchorPointX>\r\n",
  1063         -                        prev, extra, EdgeLinkSeedAnchorX);
  1064         -      sqlite3_free(prev);
  1065         -      prev = xml;
  1066         -      xml =
  1067         -        sqlite3_mprintf("%s%s\t\t\t<AnchorPointY>%1.4f</AnchorPointY>\r\n",
  1068         -                        prev, extra, EdgeLinkSeedAnchorY);
  1069         -      sqlite3_free(prev);
  1070         -      prev = xml;
  1071         -      xml = sqlite3_mprintf("%s%s\t\t</AnchorPoint>\r\n", prev, extra);
  1072         -      sqlite3_free(prev);
  1073         -      prev = xml;
  1074         -    }
  1075         -  if (EdgeLinkSeedDisplacementX != 0.0 || EdgeLinkSeedDisplacementY != 0.0)
  1076         -    {
  1077         -      xml = sqlite3_mprintf("%s%s\t\t<Displacement>\r\n", prev, extra);
  1078         -      sqlite3_free(prev);
  1079         -      prev = xml;
  1080         -      xml =
  1081         -        sqlite3_mprintf("%s%s\t\t\t<DisplacementX>%1.4f</DisplacementX>\r\n",
  1082         -                        prev, extra, EdgeLinkSeedDisplacementX);
  1083         -      sqlite3_free(prev);
  1084         -      prev = xml;
  1085         -      xml =
  1086         -        sqlite3_mprintf("%s%s\t\t\t<DisplacementY>%1.4f</DisplacementY>\r\n",
  1087         -                        prev, extra, EdgeLinkSeedDisplacementY);
  1088         -      sqlite3_free(prev);
  1089         -      prev = xml;
  1090         -      xml = sqlite3_mprintf("%s%s\t\t</Displacement>\r\n", prev, extra);
  1091         -      sqlite3_free(prev);
  1092         -      prev = xml;
  1093         -    }
  1094         -  xml = sqlite3_mprintf("%s%s\t</Graphic>\r\n", prev, extra);
  1095         -  sqlite3_free(prev);
  1096         -  prev = xml;
  1097         -  xml = sqlite3_mprintf("%s%s</PointSymbolizer>\r\n", prev, extra);
  1098         -  sqlite3_free(prev);
  1099         -  prev = xml;
  1100         -  xml = sqlite3_mprintf("%s\t</Rule>\r\n", prev);
  1101         -  sqlite3_free(prev);
  1102         -  return xml;
  1103         -}
  1104         -
  1105         -char *QuickStyleTopologyObj::DoCreateFaceSeedXML()
  1106         -{
  1107         -//
  1108         -// creating the XML Style - FaceSeed
  1109         -//
  1110         -  const char *cstr;
  1111         -  char *prev;
  1112         -  char *xml = sqlite3_mprintf("\t<Rule>\r\n");
  1113         -  prev = xml;
  1114         -  if (MinScaleEnabled == true)
  1115         -    {
  1116         -      xml =
  1117         -        sqlite3_mprintf
  1118         -        ("%s\t\t<MinScaleDenominator>%1.2f</MinScaleDenominator>\r\n", prev,
  1119         -         ScaleMin);
  1120         -      sqlite3_free(prev);
  1121         -      prev = xml;
  1122         -    }
  1123         -  if (MaxScaleEnabled == true)
  1124         -    {
  1125         -      xml =
  1126         -        sqlite3_mprintf
  1127         -        ("%s\t\t<MaxScaleDenominator>%1.2f</MaxScaleDenominator>\r\n", prev,
  1128         -         ScaleMax);
  1129         -      sqlite3_free(prev);
  1130         -      prev = xml;
  1131         -    }
  1132         -  xml = sqlite3_mprintf("%s\t\t<Name>FaceSeed</Name>\r\n", prev);
  1133         -  sqlite3_free(prev);
  1134         -  prev = xml;
  1135         -  xml =
  1136         -    sqlite3_mprintf("%s\t\t<ogc:Filter>\r\n\t\t\t<ogc:PropertyIsEqualTo>\r\n",
  1137         -                    prev);
  1138         -  sqlite3_free(prev);
  1139         -  prev = xml;
  1140         -  xml =
  1141         -    sqlite3_mprintf
  1142         -    ("%s\t\t\t\t<ogc:PropertyName>topoclass</ogc:PropertyName>\r\n", prev);
  1143         -  sqlite3_free(prev);
  1144         -  prev = xml;
  1145         -  xml =
  1146         -    sqlite3_mprintf("%s\t\t\t\t<ogc:Literal>face_seed</ogc:Literal>\r\n", prev);
  1147         -  sqlite3_free(prev);
  1148         -  prev = xml;
  1149         -  xml =
  1150         -    sqlite3_mprintf("%s\t\t\t</ogc:PropertyIsEqualTo>\r\n\t\t</ogc:Filter>\r\n",
  1151         -                    prev);
  1152         -  sqlite3_free(prev);
  1153         -  prev = xml;
  1154         -
  1155         -  const char *extra = "\t\t";
  1156         -  xml = sqlite3_mprintf("%s%s<PointSymbolizer>\r\n", prev, extra);
  1157         -  prev = xml;
  1158         -  xml = sqlite3_mprintf("%s%s\t<Graphic>\r\n", prev, extra);
  1159         -  sqlite3_free(prev);
  1160         -  prev = xml;
  1161         -// mark symbol
  1162         -  xml = sqlite3_mprintf("%s%s\t\t<Mark>\r\n", prev, extra);
  1163         -  sqlite3_free(prev);
  1164         -  prev = xml;
  1165         -  switch (FaceSeedWellKnownMark)
  1166         -    {
  1167         -      case RL2_GRAPHIC_MARK_CIRCLE:
  1168         -        cstr = "circle";
  1169         -        break;
  1170         -      case RL2_GRAPHIC_MARK_TRIANGLE:
  1171         -        cstr = "triangle";
  1172         -        break;
  1173         -      case RL2_GRAPHIC_MARK_STAR:
  1174         -        cstr = "star";
  1175         -        break;
  1176         -      case RL2_GRAPHIC_MARK_CROSS:
  1177         -        cstr = "cross";
  1178         -        break;
  1179         -      case RL2_GRAPHIC_MARK_X:
  1180         -        cstr = "x";
  1181         -        break;
  1182         -      default:
  1183         -        cstr = "square";
  1184         -        break;
  1185         -    };
  1186         -  xml =
  1187         -    sqlite3_mprintf("%s%s\t\t\t<WellKnownName>%s</WellKnownName>\r\n", prev,
  1188         -                    extra, cstr);
  1189         -  sqlite3_free(prev);
  1190         -  prev = xml;
  1191         -// Mark Fill
  1192         -  xml = sqlite3_mprintf("%s%s\t\t\t<Fill>\r\n", prev, extra);
  1193         -  sqlite3_free(prev);
  1194         -  prev = xml;
  1195         -  xml =
  1196         -    sqlite3_mprintf
  1197         -    ("%s%s\t\t\t\t<SvgParameter name=\"fill\">%s</SvgParameter>\r\n",
  1198         -     prev, extra, FaceSeedFillColor);
  1199         -  sqlite3_free(prev);
  1200         -  prev = xml;
  1201         -  xml = sqlite3_mprintf("%s%s\t\t\t</Fill>\r\n", prev, extra);
  1202         -  sqlite3_free(prev);
  1203         -  prev = xml;
  1204         -// Mark Stroke
  1205         -  xml = sqlite3_mprintf("%s%s\t\t\t<Stroke>\r\n", prev, extra);
  1206         -  sqlite3_free(prev);
  1207         -  prev = xml;
  1208         -  xml =
  1209         -    sqlite3_mprintf
  1210         -    ("%s%s\t\t\t\t<SvgParameter name=\"stroke\">%s</SvgParameter>\r\n",
  1211         -     prev, extra, FaceSeedStrokeColor);
  1212         -  sqlite3_free(prev);
  1213         -  prev = xml;
  1214         -  xml =
  1215         -    sqlite3_mprintf
  1216         -    ("%s%s\t\t\t\t<SvgParameter name=\"stroke-width\">%1.2f</SvgParameter>\r\n",
  1217         -     prev, extra, 1.0);
  1218         -  sqlite3_free(prev);
  1219         -  prev = xml;
  1220         -  xml =
  1221         -    sqlite3_mprintf
  1222         -    ("%s%s\t\t\t\t<SvgParameter name=\"stroke-linejoin\">round</SvgParameter>\r\n",
  1223         -     prev, extra);
  1224         -  sqlite3_free(prev);
  1225         -  prev = xml;
  1226         -  xml =
  1227         -    sqlite3_mprintf
  1228         -    ("%s%s\t\t\t\t<SvgParameter name=\"stroke-linecap\">round</SvgParameter>\r\n",
  1229         -     prev, extra);
  1230         -  sqlite3_free(prev);
  1231         -  prev = xml;
  1232         -  xml = sqlite3_mprintf("%s%s\t\t\t</Stroke>\r\n", prev, extra);
  1233         -  sqlite3_free(prev);
  1234         -  prev = xml;
  1235         -  xml = sqlite3_mprintf("%s%s\t\t</Mark>\r\n", prev, extra);
  1236         -  sqlite3_free(prev);
  1237         -  prev = xml;
  1238         -  if (FaceSeedOpacity != 1.0)
  1239         -    {
  1240         -      xml =
  1241         -        sqlite3_mprintf("%s%s\t\t<Opacity>%1.2f</Opacity>\r\n", prev, extra,
  1242         -                        FaceSeedOpacity);
  1243         -      sqlite3_free(prev);
  1244         -      prev = xml;
  1245         -    }
  1246         -  xml =
  1247         -    sqlite3_mprintf("%s%s\t\t<Size>%1.2f</Size>\r\n", prev, extra,
  1248         -                    FaceSeedSize);
  1249         -  sqlite3_free(prev);
  1250         -  prev = xml;
  1251         -  if (FaceSeedRotation != 0.0)
  1252         -    {
  1253         -      xml =
  1254         -        sqlite3_mprintf("%s%s\t\t<Rotation>%1.2f</Rotation>\r\n", prev, extra,
  1255         -                        FaceSeedRotation);
  1256         -      sqlite3_free(prev);
  1257         -      prev = xml;
  1258         -    }
  1259         -  if (FaceSeedAnchorX != 0.5 || FaceSeedAnchorY != 0.5)
  1260         -    {
  1261         -      xml = sqlite3_mprintf("%s%s\t\t<AnchorPoint>\r\n", prev, extra);
  1262         -      sqlite3_free(prev);
  1263         -      prev = xml;
  1264         -      xml =
  1265         -        sqlite3_mprintf("%s%s\t\t\t<AnchorPointX>%1.4f</AnchorPointX>\r\n",
  1266         -                        prev, extra, FaceSeedAnchorX);
  1267         -      sqlite3_free(prev);
  1268         -      prev = xml;
  1269         -      xml =
  1270         -        sqlite3_mprintf("%s%s\t\t\t<AnchorPointY>%1.4f</AnchorPointY>\r\n",
  1271         -                        prev, extra, FaceSeedAnchorY);
  1272         -      sqlite3_free(prev);
  1273         -      prev = xml;
  1274         -      xml = sqlite3_mprintf("%s%s\t\t</AnchorPoint>\r\n", prev, extra);
  1275         -      sqlite3_free(prev);
  1276         -      prev = xml;
  1277         -    }
  1278         -  if (FaceSeedDisplacementX != 0.0 || FaceSeedDisplacementY != 0.0)
  1279         -    {
  1280         -      xml = sqlite3_mprintf("%s%s\t\t<Displacement>\r\n", prev, extra);
  1281         -      sqlite3_free(prev);
  1282         -      prev = xml;
  1283         -      xml =
  1284         -        sqlite3_mprintf("%s%s\t\t\t<DisplacementX>%1.4f</DisplacementX>\r\n",
  1285         -                        prev, extra, FaceSeedDisplacementX);
  1286         -      sqlite3_free(prev);
  1287         -      prev = xml;
  1288         -      xml =
  1289         -        sqlite3_mprintf("%s%s\t\t\t<DisplacementY>%1.4f</DisplacementY>\r\n",
  1290         -                        prev, extra, FaceSeedDisplacementY);
  1291         -      sqlite3_free(prev);
  1292         -      prev = xml;
  1293         -      xml = sqlite3_mprintf("%s%s\t\t</Displacement>\r\n", prev, extra);
  1294         -      sqlite3_free(prev);
  1295         -      prev = xml;
  1296         -    }
  1297         -  xml = sqlite3_mprintf("%s%s\t</Graphic>\r\n", prev, extra);
  1298         -  sqlite3_free(prev);
  1299         -  prev = xml;
  1300         -  xml = sqlite3_mprintf("%s%s</PointSymbolizer>\r\n", prev, extra);
  1301         -  sqlite3_free(prev);
  1302         -  prev = xml;
  1303         -  xml = sqlite3_mprintf("%s\t</Rule>\r\n", prev);
  1304         -  sqlite3_free(prev);
  1305         -  return xml;
  1306         -}
  1307         -
  1308         -const unsigned char *QuickStyleTopologyObj::CloneXmlStyle()
  1309         -{
  1310         -//
  1311         -// cloning the XML Style definition
  1312         -//
  1313         -  if (XmlStyle == NULL)
  1314         -    XmlStyle = CreateXmlStyle();
  1315         -  if (XmlStyle == NULL)
  1316         -    return NULL;
  1317         -  int len = strlen(XmlStyle);
  1318         -  char *cloned = (char *) malloc(len + 1);
  1319         -  strcpy(cloned, XmlStyle);
  1320         -  return (const unsigned char *) cloned;
  1321         -}
  1322         -
  1323         -bool QuickStyleTopologyDialog::Create(MyMapPanel * parent, MapLayer * layer)
  1324         -{
  1325         -//
  1326         -// creating the dialog
  1327         -//
  1328         -  MainFrame = parent->GetParent();
  1329         -  MapPanel = parent;
  1330         -  Layer = layer;
  1331         -  Type = Layer->GetType();
  1332         -  DbPrefix = layer->GetDbPrefix();
  1333         -  LayerName = layer->GetName();
  1334         -  IsConfigChanged = false;
  1335         -
  1336         -  wxString title = wxT("QuickStyle (Topology) Edit");
  1337         -  if (Type == MAP_LAYER_NETWORK)
  1338         -    title = wxT("QuickStyle (Network) Edit");
  1339         -  if (wxPropertySheetDialog::Create(parent, wxID_ANY, title) == false)
  1340         -    return false;
  1341         -  if (Layer->GetQuickStyleTopology() != NULL)
  1342         -    Style = Layer->CloneQuickStyleTopology();
  1343         -  else
  1344         -    Style = new QuickStyleTopologyObj(Type);
  1345         -
  1346         -  wxBookCtrlBase *book = GetBookCtrl();
  1347         -// creates individual panels
  1348         -  wxPanel *mainPage = CreateMainPage(book);
  1349         -  book->AddPage(mainPage, wxT("General"), true);
  1350         -  if (Type == MAP_LAYER_NETWORK)
  1351         -    {
  1352         -      wxPanel *nodePage = CreateNodePage(book);
  1353         -      book->AddPage(nodePage, wxT("Nodes"), false);
  1354         -      wxPanel *edgeLinkPage = CreateEdgeLinkPage(book);
  1355         -      book->AddPage(edgeLinkPage, wxT("Links"), false);
  1356         -      wxPanel *edgeLinkSeedPage = CreateEdgeLinkSeedPage(book);
  1357         -      book->AddPage(edgeLinkSeedPage, wxT("Link Seeds"), false);
  1358         -  } else
  1359         -    {
  1360         -      wxPanel *nodePage = CreateNodePage(book);
  1361         -      book->AddPage(nodePage, wxT("Nodes"), false);
  1362         -      wxPanel *edgeLinkPage = CreateEdgeLinkPage(book);
  1363         -      book->AddPage(edgeLinkPage, wxT("Edges"), false);
  1364         -      wxPanel *facePage = CreateFacePage(book);
  1365         -      book->AddPage(facePage, wxT("Faces"), false);
  1366         -      wxPanel *edgeLinkSeedPage = CreateEdgeLinkSeedPage(book);
  1367         -      book->AddPage(edgeLinkSeedPage, wxT("Edge Seeds"), false);
  1368         -      wxPanel *faceSeedPage = CreateFaceSeedPage(book);
  1369         -      book->AddPage(faceSeedPage, wxT("Face Seeds"), false);
  1370         -    }
  1371         -
  1372         -  CreateButtons();
  1373         -  LayoutDialog();
  1374         -// appends event handler for TAB/PAGE changing
  1375         -  Connect(wxID_ANY, wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING,
  1376         -          (wxObjectEventFunction) & QuickStyleTopologyDialog::OnPageChanging);
  1377         -  Connect(wxID_ANY, wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,
  1378         -          (wxObjectEventFunction) & QuickStyleTopologyDialog::OnPageChanged);
  1379         -// appends event handler for buttons
  1380         -  Connect(wxID_CANCEL, wxEVT_COMMAND_BUTTON_CLICKED,
  1381         -          (wxObjectEventFunction) & QuickStyleTopologyDialog::OnQuit);
  1382         -  Connect(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED,
  1383         -          (wxObjectEventFunction) & QuickStyleTopologyDialog::OnOk);
  1384         -  Connect(ID_QUICK_STYLE_APPLY, wxEVT_COMMAND_BUTTON_CLICKED,
  1385         -          (wxObjectEventFunction) & QuickStyleTopologyDialog::OnApply);
  1386         -  Connect(ID_QUICK_STYLE_EXPORT, wxEVT_COMMAND_BUTTON_CLICKED,
  1387         -          (wxObjectEventFunction) & QuickStyleTopologyDialog::OnExport);
  1388         -  Connect(ID_QUICK_STYLE_COPY, wxEVT_COMMAND_BUTTON_CLICKED,
  1389         -          (wxObjectEventFunction) & QuickStyleTopologyDialog::OnCopy);
  1390         -// centers the dialog window
  1391         -  Centre();
  1392         -  UpdateMainPage();
  1393         -  return true;
  1394         -}
  1395         -
  1396         -void QuickStyleTopologyDialog::CreateButtons()
  1397         -{
  1398         -// 
  1399         -// adding the common Buttons
  1400         -//
  1401         -  wxBoxSizer *topSizer = (wxBoxSizer *) (this->GetSizer());
  1402         -  wxBoxSizer *btnBox = new wxBoxSizer(wxHORIZONTAL);
  1403         -  topSizer->Add(btnBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1404         -  wxButton *save = new wxButton(this, ID_QUICK_STYLE_APPLY, wxT("&Apply"));
  1405         -  btnBox->Add(save, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1406         -  wxButton *exp =
  1407         -    new wxButton(this, ID_QUICK_STYLE_EXPORT, wxT("&Export to file"));
  1408         -  btnBox->Add(exp, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1409         -  wxButton *copy = new wxButton(this, ID_QUICK_STYLE_COPY, wxT("&Copy"));
  1410         -  btnBox->Add(copy, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1411         -  btnBox->AddSpacer(100);
  1412         -  wxButton *ok = new wxButton(this, wxID_OK, wxT("&Ok"));
  1413         -  btnBox->Add(ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1414         -  wxButton *cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel"));
  1415         -  btnBox->Add(cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1416         -}
  1417         -
  1418         -wxPanel *QuickStyleTopologyDialog::CreateMainPage(wxWindow * parent)
  1419         -{
  1420         -//
  1421         -// creating the MAIN page
  1422         -//
  1423         -  wxPanel *panel = new wxPanel(parent, ID_PANE_MAIN);
  1424         -  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
  1425         -  panel->SetSizer(topSizer);
  1426         -  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
  1427         -  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
  1428         -// First row: Layer name
  1429         -  boxSizer->AddSpacer(50);
  1430         -  wxBoxSizer *lyrBoxSizer = new wxBoxSizer(wxVERTICAL);
  1431         -  boxSizer->Add(lyrBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1432         -  wxBoxSizer *nameSizer = new wxBoxSizer(wxVERTICAL);
  1433         -  lyrBoxSizer->Add(nameSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1434         -  wxStaticBox *nameBox = new wxStaticBox(panel, wxID_ANY,
  1435         -                                         wxT("Layer FullName"),
  1436         -                                         wxDefaultPosition,
  1437         -                                         wxDefaultSize);
  1438         -  wxBoxSizer *nameBoxSizer = new wxStaticBoxSizer(nameBox, wxHORIZONTAL);
  1439         -  nameSizer->Add(nameBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1440         -  wxString fullName = DbPrefix + wxT(".") + LayerName;
  1441         -  wxTextCtrl *nameCtrl = new wxTextCtrl(panel, ID_VECTOR_LAYER, fullName,
  1442         -                                        wxDefaultPosition, wxSize(370, 22),
  1443         -                                        wxTE_READONLY);
  1444         -  nameBoxSizer->Add(nameCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1445         -  wxStaticBox *typeBox = new wxStaticBox(panel, wxID_ANY,
  1446         -                                         wxT("Geometry Type"),
  1447         -                                         wxDefaultPosition,
  1448         -                                         wxDefaultSize);
  1449         -  wxBoxSizer *typeBoxSizer = new wxStaticBoxSizer(typeBox, wxHORIZONTAL);
  1450         -  nameSizer->Add(typeBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1451         -  wxString typeName = wxT("UNKNOWN");
  1452         -  if (Type == MAP_LAYER_NETWORK)
  1453         -    typeName = wxT("Network (ISO TopoNet)");
  1454         -  if (Type == MAP_LAYER_TOPOLOGY)
  1455         -    typeName = wxT("Topology (ISO TopoGeo)");
  1456         -  wxTextCtrl *typeCtrl = new wxTextCtrl(panel, ID_VECTOR_TYPE, typeName,
  1457         -                                        wxDefaultPosition, wxSize(370, 22),
  1458         -                                        wxTE_READONLY);
  1459         -  typeBoxSizer->Add(typeCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1460         -  wxStaticBox *uuidBox = new wxStaticBox(panel, wxID_ANY,
  1461         -                                         wxT("QuickStyle Name"),
  1462         -                                         wxDefaultPosition,
  1463         -                                         wxDefaultSize);
  1464         -  wxBoxSizer *uuidBoxSizer = new wxStaticBoxSizer(uuidBox, wxHORIZONTAL);
  1465         -  nameSizer->Add(uuidBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1466         -  wxString uuid = wxString::FromUTF8(Style->GetUUID());
  1467         -  wxTextCtrl *uuidCtrl = new wxTextCtrl(panel, ID_VECTOR_UUID, uuid,
  1468         -                                        wxDefaultPosition, wxSize(370, 22),
  1469         -                                        wxTE_READONLY);
  1470         -  uuidBoxSizer->Add(uuidCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1471         -  boxSizer->AddSpacer(25);
  1472         -// second row: Visibility Range
  1473         -  wxBoxSizer *miscSizer = new wxBoxSizer(wxHORIZONTAL);
  1474         -  boxSizer->Add(miscSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  1475         -  wxBoxSizer *visibilityBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  1476         -  miscSizer->Add(visibilityBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  1477         -  wxStaticBox *visibilityBox = new wxStaticBox(panel, wxID_STATIC,
  1478         -                                               wxT("Visibility Range"),
  1479         -                                               wxDefaultPosition,
  1480         -                                               wxDefaultSize);
  1481         -  wxBoxSizer *visibilitySizer =
  1482         -    new wxStaticBoxSizer(visibilityBox, wxHORIZONTAL);
  1483         -  visibilityBoxSizer->Add(visibilitySizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL,
  1484         -                          5);
  1485         -  wxString range[4];
  1486         -  range[0] = wxT("&None");
  1487         -  range[1] = wxT("&Min");
  1488         -  range[2] = wxT("&Max");
  1489         -  range[3] = wxT("&Both");
  1490         -  wxRadioBox *rangeBox = new wxRadioBox(panel, ID_SYMBOLIZER_MINMAX_SCALE,
  1491         -                                        wxT("&Range Type"),
  1492         -                                        wxDefaultPosition,
  1493         -                                        wxDefaultSize, 4,
  1494         -                                        range, 2,
  1495         -                                        wxRA_SPECIFY_COLS);
  1496         -  visibilitySizer->Add(rangeBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1497         -  rangeBox->SetSelection(0);
  1498         -  visibilitySizer->AddSpacer(20);
  1499         -  wxBoxSizer *scaleBoxSizer = new wxBoxSizer(wxVERTICAL);
  1500         -  visibilitySizer->Add(scaleBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1501         -  wxBoxSizer *scaleMinSizer = new wxBoxSizer(wxHORIZONTAL);
  1502         -  scaleBoxSizer->Add(scaleMinSizer, 0, wxALIGN_RIGHT | wxALL, 5);
  1503         -  wxStaticText *minScaleLabel =
  1504         -    new wxStaticText(panel, wxID_STATIC, wxT("&Min Scale:"));
  1505         -  scaleMinSizer->Add(minScaleLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1506         -  wxTextCtrl *minScaleCtrl =
  1507         -    new wxTextCtrl(panel, ID_SYMBOLIZER_MIN_SCALE, wxT("0.0"),
  1508         -                   wxDefaultPosition, wxSize(100, 22));
  1509         -  minScaleCtrl->Enable(false);
  1510         -  scaleMinSizer->Add(minScaleCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1511         -  wxBoxSizer *scaleMaxSizer = new wxBoxSizer(wxHORIZONTAL);
  1512         -  scaleBoxSizer->Add(scaleMaxSizer, 0, wxALIGN_RIGHT | wxALL, 0);
  1513         -  wxStaticText *maxScaleLabel =
  1514         -    new wxStaticText(panel, wxID_STATIC, wxT("&Max Scale:"));
  1515         -  scaleMaxSizer->Add(maxScaleLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1516         -  wxTextCtrl *maxScaleCtrl =
  1517         -    new wxTextCtrl(panel, ID_SYMBOLIZER_MAX_SCALE, wxT("+Infinite"),
  1518         -                   wxDefaultPosition, wxSize(100, 22));
  1519         -  maxScaleCtrl->Enable(false);
  1520         -  scaleMaxSizer->Add(maxScaleCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1521         -  panel->SetSizer(topSizer);
  1522         -  topSizer->Fit(panel);
  1523         -// appends event handlers
  1524         -  Connect(ID_SYMBOLIZER_MINMAX_SCALE, wxEVT_COMMAND_RADIOBOX_SELECTED,
  1525         -          (wxObjectEventFunction) &
  1526         -          QuickStyleTopologyDialog::OnCmdScaleChanged);
  1527         -  return panel;
  1528         -}
  1529         -
  1530         -void QuickStyleTopologyDialog::
  1531         -OnCmdScaleChanged(wxCommandEvent & WXUNUSED(event))
  1532         -{
  1533         -//
  1534         -// Visibility Range selection changed
  1535         -//
  1536         -  wxRadioBox *scaleModeCtrl =
  1537         -    (wxRadioBox *) FindWindow(ID_SYMBOLIZER_MINMAX_SCALE);
  1538         -  wxTextCtrl *minCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MIN_SCALE);
  1539         -  wxTextCtrl *maxCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MAX_SCALE);
  1540         -  switch (scaleModeCtrl->GetSelection())
  1541         -    {
  1542         -      case 0:
  1543         -        Style->EnableMinScale(false);
  1544         -        Style->EnableMaxScale(false);
  1545         -        minCtrl->SetValue(wxT("0.0"));
  1546         -        minCtrl->Enable(false);
  1547         -        maxCtrl->SetValue(wxT("+Infinite"));
  1548         -        maxCtrl->Enable(false);
  1549         -        break;
  1550         -      case 1:
  1551         -        Style->EnableMinScale(true);
  1552         -        Style->EnableMaxScale(false);
  1553         -        minCtrl->SetValue(wxT(""));
  1554         -        minCtrl->Enable(true);
  1555         -        maxCtrl->SetValue(wxT("+Infinite"));
  1556         -        maxCtrl->Enable(false);
  1557         -        break;
  1558         -      case 2:
  1559         -        Style->EnableMinScale(false);
  1560         -        Style->EnableMaxScale(true);
  1561         -        minCtrl->SetValue(wxT("0.0"));
  1562         -        minCtrl->Enable(false);
  1563         -        maxCtrl->SetValue(wxT(""));
  1564         -        maxCtrl->Enable(true);
  1565         -        break;
  1566         -      case 3:
  1567         -        Style->EnableMinScale(true);
  1568         -        Style->EnableMaxScale(true);
  1569         -        minCtrl->SetValue(wxT(""));
  1570         -        minCtrl->Enable(true);
  1571         -        maxCtrl->SetValue(wxT(""));
  1572         -        maxCtrl->Enable(true);
  1573         -        break;
  1574         -    };
  1575         -}
  1576         -
  1577         -wxPanel *QuickStyleTopologyDialog::CreateNodePage(wxWindow * parent)
  1578         -{
  1579         -//
  1580         -// creating the Node Symbolizer page
  1581         -//
  1582         -  wxString StrokeColor = wxT("#000000");
  1583         -  wxString FillColor = wxT("#808080");
  1584         -  wxPanel *panel = new wxPanel(parent, ID_PANE_POINT);
  1585         -  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
  1586         -  panel->SetSizer(topSizer);
  1587         -  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
  1588         -  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
  1589         -// first row A: Opacity 
  1590         -  wxBoxSizer *opacityBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  1591         -  boxSizer->Add(opacityBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1592         -  wxStaticBox *opacityBox = new wxStaticBox(panel, wxID_STATIC,
  1593         -                                            wxT("Opacity"),
  1594         -                                            wxDefaultPosition,
  1595         -                                            wxDefaultSize);
  1596         -  wxBoxSizer *opacitySizer = new wxStaticBoxSizer(opacityBox, wxVERTICAL);
  1597         -  opacityBoxSizer->Add(opacitySizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1598         -  wxSlider *opacityCtrl =
  1599         -    new wxSlider(panel, ID_SYMBOLIZER_NODE_OPACITY, 100, 0, 100,
  1600         -                 wxDefaultPosition, wxSize(600, 45),
  1601         -                 wxSL_HORIZONTAL | wxSL_LABELS);
  1602         -  opacitySizer->Add(opacityCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1603         -// Well Known Mark Name
  1604         -  wxBoxSizer *box1Sizer = new wxBoxSizer(wxHORIZONTAL);
  1605         -  boxSizer->Add(box1Sizer, 0, wxALIGN_CENTER | wxALL, 5);
  1606         -  wxBoxSizer *markSizer = new wxBoxSizer(wxHORIZONTAL);
  1607         -  box1Sizer->Add(markSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  1608         -  wxString mark[6];
  1609         -  mark[0] = wxT("&Square");
  1610         -  mark[1] = wxT("&Circle");
  1611         -  mark[2] = wxT("&Triangle");
  1612         -  mark[3] = wxT("&Star");
  1613         -  mark[4] = wxT("&Cross");
  1614         -  mark[5] = wxT("&X");
  1615         -  wxRadioBox *markBox = new wxRadioBox(panel, ID_SYMBOLIZER_NODE_MARK,
  1616         -                                       wxT("&Mark"),
  1617         -                                       wxDefaultPosition,
  1618         -                                       wxDefaultSize, 6,
  1619         -                                       mark, 1,
  1620         -                                       wxRA_SPECIFY_COLS);
  1621         -  markSizer->Add(markBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1622         -  markBox->SetSelection(0);
  1623         -// second row: Size and Rotation
  1624         -  wxBoxSizer *box2Sizer = new wxBoxSizer(wxVERTICAL);
  1625         -  box1Sizer->Add(box2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1626         -  wxBoxSizer *sizeBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  1627         -  box2Sizer->Add(sizeBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1628         -// second row A: Size
  1629         -  wxStaticBox *sizeBox = new wxStaticBox(panel, wxID_STATIC,
  1630         -                                         wxT("Size"),
  1631         -                                         wxDefaultPosition,
  1632         -                                         wxDefaultSize);
  1633         -  wxBoxSizer *sizeSizer = new wxStaticBoxSizer(sizeBox, wxVERTICAL);
  1634         -  sizeBoxSizer->Add(sizeSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
  1635         -  wxBoxSizer *size1Sizer = new wxBoxSizer(wxHORIZONTAL);
  1636         -  sizeSizer->Add(size1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1637         -  wxTextCtrl *sizeCtrl =
  1638         -    new wxTextCtrl(panel, ID_SYMBOLIZER_NODE_SIZE, wxT("16.0"),
  1639         -                   wxDefaultPosition, wxSize(100, 22));
  1640         -  size1Sizer->Add(sizeCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1641         -// second row B: Rotation
  1642         -  wxStaticBox *rotBox = new wxStaticBox(panel, wxID_STATIC,
  1643         -                                        wxT("Rotation"),
  1644         -                                        wxDefaultPosition,
  1645         -                                        wxDefaultSize);
  1646         -  wxBoxSizer *rotSizer = new wxStaticBoxSizer(rotBox, wxVERTICAL);
  1647         -  sizeBoxSizer->Add(rotSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
  1648         -  wxBoxSizer *rot1Sizer = new wxBoxSizer(wxHORIZONTAL);
  1649         -  rotSizer->Add(rot1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1650         -  wxTextCtrl *rotCtrl =
  1651         -    new wxTextCtrl(panel, ID_SYMBOLIZER_NODE_ROTATION, wxT("0.0"),
  1652         -                   wxDefaultPosition, wxSize(100, 22));
  1653         -  rot1Sizer->Add(rotCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1654         -// third row: AnchorNode and Displacement
  1655         -  wxBoxSizer *anchorBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  1656         -  box2Sizer->Add(anchorBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1657         -// third row A: Anchor Node
  1658         -  wxStaticBox *anchorBox = new wxStaticBox(panel, wxID_STATIC,
  1659         -                                           wxT("Anchor Node"),
  1660         -                                           wxDefaultPosition,
  1661         -                                           wxDefaultSize);
  1662         -  wxBoxSizer *anchorSizer = new wxStaticBoxSizer(anchorBox, wxVERTICAL);
  1663         -  anchorBoxSizer->Add(anchorSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
  1664         -  wxBoxSizer *anchor1Sizer = new wxBoxSizer(wxHORIZONTAL);
  1665         -  anchorSizer->Add(anchor1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1666         -  wxStaticText *anchor1Label = new wxStaticText(panel, wxID_STATIC, wxT("X"));
  1667         -  anchor1Sizer->Add(anchor1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1668         -  wxTextCtrl *anchorXCtrl =
  1669         -    new wxTextCtrl(panel, ID_SYMBOLIZER_NODE_ANCHOR_X, wxT("0.5"),
  1670         -                   wxDefaultPosition, wxSize(100, 22));
  1671         -  anchor1Sizer->Add(anchorXCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1672         -  wxBoxSizer *anchor2Sizer = new wxBoxSizer(wxHORIZONTAL);
  1673         -  anchorSizer->Add(anchor2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1674         -  wxStaticText *anchor2Label = new wxStaticText(panel, wxID_STATIC, wxT("Y"));
  1675         -  anchor2Sizer->Add(anchor2Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1676         -  wxTextCtrl *anchorYCtrl =
  1677         -    new wxTextCtrl(panel, ID_SYMBOLIZER_NODE_ANCHOR_Y, wxT("0.5"),
  1678         -                   wxDefaultPosition, wxSize(100, 22));
  1679         -  anchor2Sizer->Add(anchorYCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1680         -// third row B: Displacement
  1681         -  wxStaticBox *displacementBox = new wxStaticBox(panel, wxID_STATIC,
  1682         -                                                 wxT("Displacement"),
  1683         -                                                 wxDefaultPosition,
  1684         -                                                 wxDefaultSize);
  1685         -  wxBoxSizer *displacementSizer =
  1686         -    new wxStaticBoxSizer(displacementBox, wxVERTICAL);
  1687         -  anchorBoxSizer->Add(displacementSizer, 0,
  1688         -                      wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
  1689         -  wxBoxSizer *displ1Sizer = new wxBoxSizer(wxHORIZONTAL);
  1690         -  displacementSizer->Add(displ1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1691         -  wxStaticText *displ1Label = new wxStaticText(panel, wxID_STATIC, wxT("X"));
  1692         -  displ1Sizer->Add(displ1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1693         -  wxTextCtrl *displacementXCtrl =
  1694         -    new wxTextCtrl(panel, ID_SYMBOLIZER_NODE_DISPLACEMENT_X, wxT("0.0"),
  1695         -                   wxDefaultPosition, wxSize(100, 22));
  1696         -  displ1Sizer->Add(displacementXCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1697         -  wxBoxSizer *displ2Sizer = new wxBoxSizer(wxHORIZONTAL);
  1698         -  displacementSizer->Add(displ2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1699         -  wxStaticText *displ2Label = new wxStaticText(panel, wxID_STATIC, wxT("Y"));
  1700         -  displ2Sizer->Add(displ2Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1701         -  wxTextCtrl *displacementYCtrl =
  1702         -    new wxTextCtrl(panel, ID_SYMBOLIZER_NODE_DISPLACEMENT_Y, wxT("0.0"),
  1703         -                   wxDefaultPosition, wxSize(100, 22));
  1704         -  displ2Sizer->Add(displacementYCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1705         -// fourth row: colors
  1706         -  wxBoxSizer *box3Sizer = new wxBoxSizer(wxHORIZONTAL);
  1707         -  boxSizer->Add(box3Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1708         -// first row A: Fill Color
  1709         -  wxBoxSizer *fillBoxSizer = new wxBoxSizer(wxVERTICAL);
  1710         -  box3Sizer->Add(fillBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1711         -  wxStaticBox *colorFillBox = new wxStaticBox(panel, wxID_STATIC,
  1712         -                                              wxT("Fill Color"),
  1713         -                                              wxDefaultPosition,
  1714         -                                              wxDefaultSize);
  1715         -  wxBoxSizer *colorFillSizer = new wxStaticBoxSizer(colorFillBox, wxVERTICAL);
  1716         -  box3Sizer->Add(colorFillSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  1717         -  wxBoxSizer *fill1Sizer = new wxBoxSizer(wxHORIZONTAL);
  1718         -  colorFillSizer->Add(fill1Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  1719         -  wxTextCtrl *fillColorCtrl =
  1720         -    new wxTextCtrl(panel, ID_SYMBOLIZER_NODE_FILL_COLOR, FillColor,
  1721         -                   wxDefaultPosition, wxSize(80, 22));
  1722         -  fill1Sizer->Add(fillColorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1723         -  wxBitmap bmp;
  1724         -  wxColour color(0, 0, 0);
  1725         -  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
  1726         -  wxStaticBitmap *sampleFillCtrl =
  1727         -    new wxStaticBitmap(panel, ID_SYMBOLIZER_NODE_FILL_PICKER_HEX, bmp,
  1728         -                       wxDefaultPosition, wxSize(32, 32));
  1729         -  fill1Sizer->Add(sampleFillCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1730         -  wxButton *pickFill = new wxButton(panel, ID_SYMBOLIZER_NODE_FILL_PICKER_BTN,
  1731         -                                    wxT("&Pick a color"));
  1732         -  fill1Sizer->Add(pickFill, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1733         -// second row B: Stroke Color
  1734         -  box3Sizer->AddSpacer(30);
  1735         -  wxStaticBox *colorStrokeBox = new wxStaticBox(panel, wxID_STATIC,
  1736         -                                                wxT("Stroke Color"),
  1737         -                                                wxDefaultPosition,
  1738         -                                                wxDefaultSize);
  1739         -  wxBoxSizer *colorStrokeSizer =
  1740         -    new wxStaticBoxSizer(colorStrokeBox, wxVERTICAL);
  1741         -  box3Sizer->Add(colorStrokeSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  1742         -  wxBoxSizer *stroke1Sizer = new wxBoxSizer(wxHORIZONTAL);
  1743         -  colorStrokeSizer->Add(stroke1Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  1744         -  wxTextCtrl *strokeColorCtrl =
  1745         -    new wxTextCtrl(panel, ID_SYMBOLIZER_NODE_STROKE_COLOR, StrokeColor,
  1746         -                   wxDefaultPosition, wxSize(80, 22));
  1747         -  stroke1Sizer->Add(strokeColorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1748         -  wxStaticBitmap *sampleStrokeCtrl =
  1749         -    new wxStaticBitmap(panel, ID_SYMBOLIZER_NODE_STROKE_PICKER_HEX, bmp,
  1750         -                       wxDefaultPosition, wxSize(32, 32));
  1751         -  stroke1Sizer->Add(sampleStrokeCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1752         -  wxButton *pickStroke =
  1753         -    new wxButton(panel, ID_SYMBOLIZER_NODE_STROKE_PICKER_BTN,
  1754         -                 wxT("&Pick a color"));
  1755         -  stroke1Sizer->Add(pickStroke, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1756         -  panel->SetSizer(topSizer);
  1757         -  topSizer->Fit(panel);
  1758         -// appends event handlers
  1759         -  Connect(ID_SYMBOLIZER_NODE_MARK, wxEVT_COMMAND_RADIOBOX_SELECTED,
  1760         -          (wxObjectEventFunction) &
  1761         -          QuickStyleTopologyDialog::OnCmdNodeMarkChanged);
  1762         -  Connect(ID_SYMBOLIZER_NODE_FILL_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
  1763         -          (wxObjectEventFunction) &
  1764         -          QuickStyleTopologyDialog::OnCmdNodeColorFillPicker);
  1765         -  Connect(ID_SYMBOLIZER_NODE_FILL_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
  1766         -          (wxObjectEventFunction) &
  1767         -          QuickStyleTopologyDialog::OnCmdNodeColorFillChanged);
  1768         -  Connect(ID_SYMBOLIZER_NODE_STROKE_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
  1769         -          (wxObjectEventFunction) &
  1770         -          QuickStyleTopologyDialog::OnCmdNodeColorStrokePicker);
  1771         -  Connect(ID_SYMBOLIZER_NODE_STROKE_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
  1772         -          (wxObjectEventFunction) &
  1773         -          QuickStyleTopologyDialog::OnCmdNodeColorStrokeChanged);
  1774         -  return panel;
  1775         -}
  1776         -
  1777         -void QuickStyleTopologyDialog::
  1778         -OnCmdNodeMarkChanged(wxCommandEvent & WXUNUSED(event))
  1779         -{
  1780         -//
  1781         -// Mark selection changed
  1782         -//
  1783         -  wxRadioBox *markCtrl = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_NODE_MARK);
  1784         -  switch (markCtrl->GetSelection())
  1785         -    {
  1786         -      case 1:
  1787         -        Style->SetNodeWellKnownMark(RL2_GRAPHIC_MARK_CIRCLE);
  1788         -        break;
  1789         -      case 2:
  1790         -        Style->SetNodeWellKnownMark(RL2_GRAPHIC_MARK_TRIANGLE);
  1791         -        break;
  1792         -      case 3:
  1793         -        Style->SetNodeWellKnownMark(RL2_GRAPHIC_MARK_STAR);
  1794         -        break;
  1795         -      case 4:
  1796         -        Style->SetNodeWellKnownMark(RL2_GRAPHIC_MARK_CROSS);
  1797         -        break;
  1798         -      case 5:
  1799         -        Style->SetNodeWellKnownMark(RL2_GRAPHIC_MARK_X);
  1800         -        break;
  1801         -      default:
  1802         -        Style->SetNodeWellKnownMark(RL2_GRAPHIC_MARK_SQUARE);
  1803         -        break;
  1804         -    };
  1805         -}
  1806         -
  1807         -void QuickStyleTopologyDialog::
  1808         -OnCmdNodeColorFillChanged(wxCommandEvent & WXUNUSED(event))
  1809         -{
  1810         -//
  1811         -// Fill color changed: updating the visual sample
  1812         -//
  1813         -  wxTextCtrl *colorCtrl =
  1814         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_FILL_COLOR);
  1815         -  wxStaticBitmap *sampleCtrl =
  1816         -    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_NODE_FILL_PICKER_HEX);
  1817         -  wxColour back = wxColour(255, 255, 255);
  1818         -  wxString str = colorCtrl->GetValue();
  1819         -  if (ColorMapEntry::IsValidColor(str) == true)
  1820         -    ColorMapEntry::GetWxColor(str, back);
  1821         -  wxBitmap bmp;
  1822         -  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
  1823         -  sampleCtrl->SetBitmap(bmp);
  1824         -  sampleCtrl->Refresh();
  1825         -  sampleCtrl->Update();
  1826         -}
  1827         -
  1828         -void QuickStyleTopologyDialog::
  1829         -OnCmdNodeColorFillPicker(wxCommandEvent & WXUNUSED(event))
  1830         -{
  1831         -//
  1832         -// color picker
  1833         -//
  1834         -  wxTextCtrl *colorCtrl =
  1835         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_FILL_COLOR);
  1836         -  wxColour clr = wxNullColour;
  1837         -  wxString str = colorCtrl->GetValue();
  1838         -  if (ColorMapEntry::IsValidColor(str) == true)
  1839         -    ColorMapEntry::GetWxColor(str, clr);
  1840         -  wxColour color = wxGetColourFromUser(this, clr);
  1841         -  if (color.IsOk() == true)
  1842         -    {
  1843         -      char hex[16];
  1844         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  1845         -      wxString str = wxString::FromUTF8(hex);
  1846         -      colorCtrl->SetValue(str);
  1847         -    }
  1848         -}
  1849         -
  1850         -void QuickStyleTopologyDialog::
  1851         -OnCmdNodeColorStrokeChanged(wxCommandEvent & WXUNUSED(event))
  1852         -{
  1853         -//
  1854         -// Stroke color changed: updating the visual sample
  1855         -//
  1856         -  wxTextCtrl *colorCtrl =
  1857         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_STROKE_COLOR);
  1858         -  wxStaticBitmap *sampleCtrl =
  1859         -    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_NODE_STROKE_PICKER_HEX);
  1860         -  wxColour back = wxColour(255, 255, 255);
  1861         -  wxString str = colorCtrl->GetValue();
  1862         -  if (ColorMapEntry::IsValidColor(str) == true)
  1863         -    ColorMapEntry::GetWxColor(str, back);
  1864         -  wxBitmap bmp;
  1865         -  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
  1866         -  sampleCtrl->SetBitmap(bmp);
  1867         -  sampleCtrl->Refresh();
  1868         -  sampleCtrl->Update();
  1869         -}
  1870         -
  1871         -void QuickStyleTopologyDialog::
  1872         -OnCmdNodeColorStrokePicker(wxCommandEvent & WXUNUSED(event))
  1873         -{
  1874         -//
  1875         -// color picker
  1876         -//
  1877         -  wxTextCtrl *colorCtrl =
  1878         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_STROKE_COLOR);
  1879         -  wxColour clr = wxNullColour;
  1880         -  wxString str = colorCtrl->GetValue();
  1881         -  if (ColorMapEntry::IsValidColor(str) == true)
  1882         -    ColorMapEntry::GetWxColor(str, clr);
  1883         -  wxColour color = wxGetColourFromUser(this, clr);
  1884         -  if (color.IsOk() == true)
  1885         -    {
  1886         -      char hex[16];
  1887         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  1888         -      wxString str = wxString::FromUTF8(hex);
  1889         -      colorCtrl->SetValue(str);
  1890         -    }
  1891         -}
  1892         -
  1893         -wxPanel *QuickStyleTopologyDialog::CreateEdgeLinkPage(wxWindow * parent)
  1894         -{
  1895         -//
  1896         -// creating the EdgeLink Symbolizer page
  1897         -//
  1898         -  wxString StrokeColor = wxT("#000000");
  1899         -  wxPanel *panel = new wxPanel(parent, ID_PANE_LINE);
  1900         -  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
  1901         -  panel->SetSizer(topSizer);
  1902         -  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
  1903         -  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
  1904         -// first row A: the Stroke #1 Opacity and Perpendicular Offset
  1905         -  boxSizer->AddSpacer(50);
  1906         -  wxBoxSizer *opacityBoxSizer = new wxBoxSizer(wxVERTICAL);
  1907         -  boxSizer->Add(opacityBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1908         -  wxStaticBox *opacityBox = new wxStaticBox(panel, wxID_STATIC,
  1909         -                                            wxT("Opacity"),
  1910         -                                            wxDefaultPosition,
  1911         -                                            wxDefaultSize);
  1912         -  wxBoxSizer *opacitySizer = new wxStaticBoxSizer(opacityBox, wxHORIZONTAL);
  1913         -  opacityBoxSizer->Add(opacitySizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1914         -  wxSlider *opacityCtrl =
  1915         -    new wxSlider(panel, ID_SYMBOLIZER_STROKE1_OPACITY, 100, 0, 100,
  1916         -                 wxDefaultPosition, wxSize(600, 45),
  1917         -                 wxSL_HORIZONTAL | wxSL_LABELS);
  1918         -  opacitySizer->Add(opacityCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1919         -// first row B: PerpendicularOffset
  1920         -  wxBoxSizer *perpendicularBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  1921         -  opacityBoxSizer->Add(perpendicularBoxSizer, 0,
  1922         -                       wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1923         -  wxStaticBox *perpendicularBox = new wxStaticBox(panel, wxID_STATIC,
  1924         -                                                  wxT("Perpendicular Offset"),
  1925         -                                                  wxDefaultPosition,
  1926         -                                                  wxDefaultSize);
  1927         -  wxBoxSizer *perpendicularSizer =
  1928         -    new wxStaticBoxSizer(perpendicularBox, wxVERTICAL);
  1929         -  perpendicularBoxSizer->Add(perpendicularSizer, 0,
  1930         -                             wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  1931         -  wxBoxSizer *perp1Sizer = new wxBoxSizer(wxHORIZONTAL);
  1932         -  perpendicularSizer->Add(perp1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1933         -  wxTextCtrl *perpendicularCtrl =
  1934         -    new wxTextCtrl(panel, ID_SYMBOLIZER_STROKE1_PERPENDICULAR, wxT("0.0"),
  1935         -                   wxDefaultPosition, wxSize(100, 22));
  1936         -  perp1Sizer->Add(perpendicularCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  1937         -  wxStaticText *perp1Label = new wxStaticText(panel, wxID_STATIC,
  1938         -                                              wxT
  1939         -                                              ("Draw lines in parallel to the original geometry."));
  1940         -  perp1Sizer->Add(perp1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  1941         -  wxStaticText *perp2Label = new wxStaticText(panel, wxID_STATIC,
  1942         -                                              wxT
  1943         -                                              ("Positive to the left-hand side. Negative numbers mean right."));
  1944         -  perpendicularSizer->Add(perp2Label, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1945         -// second row: Stroke color or Graphic
  1946         -  wxBoxSizer *strokeSizer = new wxBoxSizer(wxHORIZONTAL);
  1947         -  boxSizer->Add(strokeSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1948         -// second row B: Stroke Color
  1949         -  wxBoxSizer *colorBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  1950         -  strokeSizer->Add(colorBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  1951         -  wxStaticBox *colorBox = new wxStaticBox(panel, wxID_STATIC,
  1952         -                                          wxT("Stroke Color"),
  1953         -                                          wxDefaultPosition,
  1954         -                                          wxDefaultSize);
  1955         -  wxBoxSizer *colorSizer = new wxStaticBoxSizer(colorBox, wxVERTICAL);
  1956         -  colorBoxSizer->Add(colorSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1957         -  wxBoxSizer *color1Sizer = new wxBoxSizer(wxHORIZONTAL);
  1958         -  colorSizer->Add(color1Sizer, 0, wxALIGN_RIGHT | wxALL, 0);
  1959         -  wxTextCtrl *colorCtrl =
  1960         -    new wxTextCtrl(panel, ID_SYMBOLIZER_STROKE1_COLOR, StrokeColor,
  1961         -                   wxDefaultPosition, wxSize(80, 22));
  1962         -  color1Sizer->Add(colorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1963         -  wxBitmap bmp;
  1964         -  wxColour color(0, 0, 0);
  1965         -  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
  1966         -  wxStaticBitmap *sampleCtrl =
  1967         -    new wxStaticBitmap(panel, ID_SYMBOLIZER_STROKE1_PICKER_HEX, bmp,
  1968         -                       wxDefaultPosition, wxSize(32, 32));
  1969         -  color1Sizer->Add(sampleCtrl, 0, wxALIGN_RIGHT | wxALL, 5);
  1970         -  wxBoxSizer *pickerSizer = new wxBoxSizer(wxHORIZONTAL);
  1971         -  colorSizer->Add(pickerSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1972         -  wxButton *pick =
  1973         -    new wxButton(panel, ID_SYMBOLIZER_STROKE1_PICKER_BTN, wxT("&Pick a color"));
  1974         -  pickerSizer->Add(pick, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  1975         -// third row: Stroke-Width 
  1976         -  wxBoxSizer *miscSizer = new wxBoxSizer(wxHORIZONTAL);
  1977         -  colorBoxSizer->Add(miscSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  1978         -// third row A: StrokeWidth
  1979         -  wxBoxSizer *widthBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  1980         -  miscSizer->Add(widthBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  1981         -  wxStaticBox *widthBox = new wxStaticBox(panel, wxID_STATIC,
  1982         -                                          wxT("Stroke Width"),
  1983         -                                          wxDefaultPosition,
  1984         -                                          wxDefaultSize);
  1985         -  wxBoxSizer *widthSizer = new wxStaticBoxSizer(widthBox, wxVERTICAL);
  1986         -  widthBoxSizer->Add(widthSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  1987         -  wxTextCtrl *widthCtrl =
  1988         -    new wxTextCtrl(panel, ID_SYMBOLIZER_STROKE1_WIDTH, wxT("1.0"),
  1989         -                   wxDefaultPosition, wxSize(100, 22));
  1990         -  widthSizer->Add(widthCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1991         -// third row D: DashArray and DashOffset
  1992         -  wxBoxSizer *dashBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  1993         -  miscSizer->Add(dashBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  1994         -  wxString dot[4];
  1995         -  if (Type == MAP_LAYER_NETWORK)
  1996         -    {
  1997         -      dot[0] = wxT("&Solid Link");
  1998         -      dot[1] = wxT("&Dotted Link");
  1999         -      dot[2] = wxT("&Dashed Link");
  2000         -      dot[3] = wxT("&Dashed/Dotted Link");
  2001         -  } else
  2002         -    {
  2003         -      dot[0] = wxT("&Solid Edge");
  2004         -      dot[1] = wxT("&Dotted Edge");
  2005         -      dot[2] = wxT("&Dashed Edge");
  2006         -      dot[3] = wxT("&Dashed/Dotted Edge");
  2007         -    }
  2008         -  wxRadioBox *dotBox = new wxRadioBox(panel, ID_SYMBOLIZER_DASH_DOT,
  2009         -                                      wxT("&Dash/Dot Style"),
  2010         -                                      wxDefaultPosition,
  2011         -                                      wxDefaultSize, 4,
  2012         -                                      dot, 1,
  2013         -                                      wxRA_SPECIFY_COLS);
  2014         -  dotBox->SetSelection(0);
  2015         -  dashBoxSizer->Add(dotBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2016         -  panel->SetSizer(topSizer);
  2017         -  topSizer->Fit(panel);
  2018         -// appends event handlers
  2019         -  Connect(ID_SYMBOLIZER_STROKE1_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
  2020         -          (wxObjectEventFunction) &
  2021         -          QuickStyleTopologyDialog::OnCmdEdgeLinkColorChanged);
  2022         -  Connect(ID_SYMBOLIZER_STROKE1_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
  2023         -          (wxObjectEventFunction) &
  2024         -          QuickStyleTopologyDialog::OnCmdEdgeLinkColorPicker);
  2025         -  return panel;
  2026         -}
  2027         -
  2028         -void QuickStyleTopologyDialog::
  2029         -OnCmdEdgeLinkColorChanged(wxCommandEvent & WXUNUSED(event))
  2030         -{
  2031         -//
  2032         -// Stroke color changed: updating the visual sample
  2033         -//
  2034         -  wxTextCtrl *colorCtrl =
  2035         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_COLOR);
  2036         -  wxStaticBitmap *sampleCtrl =
  2037         -    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_STROKE1_PICKER_HEX);
  2038         -  wxColour back = wxColour(255, 255, 255);
  2039         -  wxString str = colorCtrl->GetValue();
  2040         -  if (ColorMapEntry::IsValidColor(str) == true)
  2041         -    ColorMapEntry::GetWxColor(str, back);
  2042         -  wxBitmap bmp;
  2043         -  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
  2044         -  sampleCtrl->SetBitmap(bmp);
  2045         -  sampleCtrl->Refresh();
  2046         -  sampleCtrl->Update();
  2047         -}
  2048         -
  2049         -void QuickStyleTopologyDialog::
  2050         -OnCmdEdgeLinkColorPicker(wxCommandEvent & WXUNUSED(event))
  2051         -{
  2052         -//
  2053         -// color picker
  2054         -//
  2055         -  wxTextCtrl *colorCtrl =
  2056         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_COLOR);
  2057         -  wxColour clr = wxNullColour;
  2058         -  wxString str = colorCtrl->GetValue();
  2059         -  if (ColorMapEntry::IsValidColor(str) == true)
  2060         -    ColorMapEntry::GetWxColor(str, clr);
  2061         -  wxColour color = wxGetColourFromUser(this, clr);
  2062         -  if (color.IsOk() == true)
  2063         -    {
  2064         -      char hex[16];
  2065         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  2066         -      wxString str = wxString::FromUTF8(hex);
  2067         -      colorCtrl->SetValue(str);
  2068         -    }
  2069         -}
  2070         -
  2071         -wxPanel *QuickStyleTopologyDialog::CreateFacePage(wxWindow * parent)
  2072         -{
  2073         -//
  2074         -// creating the Face Symbolizer page
  2075         -//
  2076         -  wxString StrokeColor = wxT("#000000");
  2077         -  wxString FillColor = wxT("#808080");
  2078         -  wxPanel *panel = new wxPanel(parent, ID_PANE_FILL2);
  2079         -  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
  2080         -  panel->SetSizer(topSizer);
  2081         -  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
  2082         -  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
  2083         -// first row: the Face Displacement and Perpendicular Offset
  2084         -  wxBoxSizer *polygonBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2085         -  boxSizer->Add(polygonBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2086         -// first row A: Displacement
  2087         -  wxBoxSizer *displacementBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2088         -  polygonBoxSizer->Add(displacementBoxSizer, 0,
  2089         -                       wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2090         -  wxStaticBox *displacementBox = new wxStaticBox(panel, wxID_STATIC,
  2091         -                                                 wxT("Displacement"),
  2092         -                                                 wxDefaultPosition,
  2093         -                                                 wxDefaultSize);
  2094         -  wxBoxSizer *displacementSizer =
  2095         -    new wxStaticBoxSizer(displacementBox, wxVERTICAL);
  2096         -  displacementBoxSizer->Add(displacementSizer, 0,
  2097         -                            wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2098         -  wxBoxSizer *displ1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2099         -  displacementSizer->Add(displ1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2100         -  wxStaticText *displ1Label = new wxStaticText(panel, wxID_STATIC, wxT("X"));
  2101         -  displ1Sizer->Add(displ1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2102         -  wxTextCtrl *displacementXCtrl =
  2103         -    new wxTextCtrl(panel, ID_SYMBOLIZER_POLYGON1_DISPLACEMENT_X, wxT("0.0"),
  2104         -                   wxDefaultPosition, wxSize(100, 22));
  2105         -  displ1Sizer->Add(displacementXCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2106         -  wxBoxSizer *displ2Sizer = new wxBoxSizer(wxHORIZONTAL);
  2107         -  displacementSizer->Add(displ2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2108         -  wxStaticText *displ2Label = new wxStaticText(panel, wxID_STATIC, wxT("Y"));
  2109         -  displ2Sizer->Add(displ2Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2110         -  wxTextCtrl *displacementYCtrl =
  2111         -    new wxTextCtrl(panel, ID_SYMBOLIZER_POLYGON1_DISPLACEMENT_Y, wxT("0.0"),
  2112         -                   wxDefaultPosition, wxSize(100, 22));
  2113         -  displ2Sizer->Add(displacementYCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2114         -// first row B: PerpendicularOffset
  2115         -  wxBoxSizer *perpendicularBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2116         -  polygonBoxSizer->Add(perpendicularBoxSizer, 0,
  2117         -                       wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2118         -  wxStaticBox *perpendicularBox = new wxStaticBox(panel, wxID_STATIC,
  2119         -                                                  wxT("Perpendicular Offset"),
  2120         -                                                  wxDefaultPosition,
  2121         -                                                  wxDefaultSize);
  2122         -  wxBoxSizer *perpendicularSizer =
  2123         -    new wxStaticBoxSizer(perpendicularBox, wxVERTICAL);
  2124         -  perpendicularBoxSizer->Add(perpendicularSizer, 0,
  2125         -                             wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2126         -  wxBoxSizer *perp1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2127         -  perpendicularSizer->Add(perp1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2128         -  wxTextCtrl *perpendicularCtrl =
  2129         -    new wxTextCtrl(panel, ID_SYMBOLIZER_POLYGON1_PERPENDICULAR, wxT("0.0"),
  2130         -                   wxDefaultPosition, wxSize(100, 22));
  2131         -  perp1Sizer->Add(perpendicularCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2132         -  wxStaticText *perp1Label = new wxStaticText(panel, wxID_STATIC,
  2133         -                                              wxT
  2134         -                                              ("Positive: larger. / Negative: smaller."));
  2135         -  perp1Sizer->Add(perp1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2136         -  wxStaticText *perp2Label = new wxStaticText(panel, wxID_STATIC,
  2137         -                                              wxT
  2138         -                                              ("Drawing polygons smaller or larger than their actual geometry (Buffer)."));
  2139         -  perpendicularSizer->Add(perp2Label, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2140         -// second row: Fill Opacity
  2141         -  wxBoxSizer *auxBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2142         -  boxSizer->Add(auxBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2143         -  wxStaticBox *auxBox = new wxStaticBox(panel, wxID_STATIC,
  2144         -                                        wxT("Face Fill"),
  2145         -                                        wxDefaultPosition,
  2146         -                                        wxDefaultSize);
  2147         -  wxBoxSizer *auxSizer = new wxStaticBoxSizer(auxBox, wxHORIZONTAL);
  2148         -  auxBoxSizer->Add(auxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2149         -  wxBoxSizer *enableSizer = new wxBoxSizer(wxHORIZONTAL);
  2150         -  auxSizer->Add(enableSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2151         -  wxCheckBox *enableCtrl = new wxCheckBox(panel, ID_SYMBOLIZER_FILL2_ENABLE,
  2152         -                                          wxT("Enable"),
  2153         -                                          wxDefaultPosition, wxDefaultSize);
  2154         -  enableCtrl->SetValue(Style->IsFaceFill());
  2155         -  enableSizer->Add(enableCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2156         -  wxBoxSizer *opacityBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2157         -  enableSizer->Add(opacityBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2158         -  wxStaticBox *opacityBox = new wxStaticBox(panel, wxID_STATIC,
  2159         -                                            wxT("Opacity"),
  2160         -                                            wxDefaultPosition,
  2161         -                                            wxDefaultSize);
  2162         -  wxBoxSizer *opacitySizer = new wxStaticBoxSizer(opacityBox, wxVERTICAL);
  2163         -  opacityBoxSizer->Add(opacitySizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2164         -  wxSlider *opacityCtrl =
  2165         -    new wxSlider(panel, ID_SYMBOLIZER_FILL2_OPACITY, 100, 0, 100,
  2166         -                 wxDefaultPosition, wxSize(400, 45),
  2167         -                 wxSL_HORIZONTAL | wxSL_LABELS);
  2168         -  opacityCtrl->Enable(Style->IsFaceFill());
  2169         -  opacitySizer->Add(opacityCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2170         -// third row B: Fill Color
  2171         -  wxBoxSizer *colorBoxSizer = new wxBoxSizer(wxVERTICAL);
  2172         -  auxSizer->Add(colorBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2173         -  wxStaticBox *colorBox = new wxStaticBox(panel, wxID_STATIC,
  2174         -                                          wxT("Fill Color"),
  2175         -                                          wxDefaultPosition,
  2176         -                                          wxDefaultSize);
  2177         -  wxBoxSizer *colorSizer = new wxStaticBoxSizer(colorBox, wxVERTICAL);
  2178         -  colorBoxSizer->Add(colorSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2179         -  wxBoxSizer *color1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2180         -  colorSizer->Add(color1Sizer, 0, wxALIGN_RIGHT | wxALL, 0);
  2181         -  wxTextCtrl *colorCtrl =
  2182         -    new wxTextCtrl(panel, ID_SYMBOLIZER_FILL2_COLOR, FillColor,
  2183         -                   wxDefaultPosition, wxSize(80, 22));
  2184         -  color1Sizer->Add(colorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2185         -  wxBitmap bmp;
  2186         -  wxColour color(0, 0, 0);
  2187         -  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
  2188         -  wxStaticBitmap *sampleCtrl =
  2189         -    new wxStaticBitmap(panel, ID_SYMBOLIZER_FILL2_PICKER_HEX, bmp,
  2190         -                       wxDefaultPosition, wxSize(32, 32));
  2191         -  sampleCtrl->Enable(Style->IsFaceFill());
  2192         -  color1Sizer->Add(sampleCtrl, 0, wxALIGN_RIGHT | wxALL, 5);
  2193         -  wxBoxSizer *pickerSizer = new wxBoxSizer(wxHORIZONTAL);
  2194         -  colorSizer->Add(pickerSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2195         -  wxButton *pick =
  2196         -    new wxButton(panel, ID_SYMBOLIZER_FILL2_PICKER_BTN, wxT("&Pick a color"));
  2197         -  pick->Enable(Style->IsFaceFill());
  2198         -  pickerSizer->Add(pick, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2199         -// first row A: the Stroke #1 Opacity 
  2200         -  wxBoxSizer *opacity2BoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2201         -  boxSizer->Add(opacity2BoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2202         -  wxStaticBox *enableBox = new wxStaticBox(panel, wxID_STATIC,
  2203         -                                           wxT("Face Stroke"),
  2204         -                                           wxDefaultPosition,
  2205         -                                           wxDefaultSize);
  2206         -  wxBoxSizer *enable2Sizer = new wxStaticBoxSizer(enableBox, wxHORIZONTAL);
  2207         -  opacity2BoxSizer->Add(enable2Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2208         -  wxCheckBox *enable2Ctrl = new wxCheckBox(panel, ID_SYMBOLIZER_STROKE2_ENABLE,
  2209         -                                           wxT("Enable"),
  2210         -                                           wxDefaultPosition, wxDefaultSize);
  2211         -  enable2Ctrl->SetValue(Style->IsFaceStroke());
  2212         -  enable2Sizer->Add(enable2Ctrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2213         -  wxStaticBox *opacity2Box = new wxStaticBox(panel, wxID_STATIC,
  2214         -                                             wxT("Opacity"),
  2215         -                                             wxDefaultPosition,
  2216         -                                             wxDefaultSize);
  2217         -  wxBoxSizer *opacity2Sizer = new wxStaticBoxSizer(opacity2Box, wxVERTICAL);
  2218         -  enable2Sizer->Add(opacity2Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2219         -  wxSlider *opacity2Ctrl =
  2220         -    new wxSlider(panel, ID_SYMBOLIZER_STROKE2_OPACITY, 100, 0, 100,
  2221         -                 wxDefaultPosition, wxSize(250, 45),
  2222         -                 wxSL_HORIZONTAL | wxSL_LABELS);
  2223         -  opacity2Ctrl->Enable(Style->IsFaceStroke());
  2224         -  opacity2Sizer->Add(opacity2Ctrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2225         -// second row B: Stroke Color
  2226         -  wxStaticBox *color2Box = new wxStaticBox(panel, wxID_STATIC,
  2227         -                                           wxT("Stroke Color"),
  2228         -                                           wxDefaultPosition,
  2229         -                                           wxDefaultSize);
  2230         -  wxBoxSizer *color2Sizer = new wxStaticBoxSizer(color2Box, wxVERTICAL);
  2231         -  enable2Sizer->Add(color2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2232         -  wxBoxSizer *color3Sizer = new wxBoxSizer(wxHORIZONTAL);
  2233         -  color2Sizer->Add(color3Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2234         -  wxTextCtrl *color2Ctrl =
  2235         -    new wxTextCtrl(panel, ID_SYMBOLIZER_STROKE2_COLOR, StrokeColor,
  2236         -                   wxDefaultPosition, wxSize(80, 22));
  2237         -  color2Ctrl->Enable(Style->IsFaceStroke());
  2238         -  color3Sizer->Add(color2Ctrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2239         -  wxStaticBitmap *sample2Ctrl =
  2240         -    new wxStaticBitmap(panel, ID_SYMBOLIZER_STROKE2_PICKER_HEX, bmp,
  2241         -                       wxDefaultPosition, wxSize(32, 32));
  2242         -  sample2Ctrl->Enable(Style->IsFaceStroke());
  2243         -  color3Sizer->Add(sample2Ctrl, 0, wxALIGN_RIGHT | wxALL, 5);
  2244         -  wxBoxSizer *picker2Sizer = new wxBoxSizer(wxHORIZONTAL);
  2245         -  color2Sizer->Add(picker2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2246         -  wxButton *pick2 =
  2247         -    new wxButton(panel, ID_SYMBOLIZER_STROKE2_PICKER_BTN, wxT("&Pick a color"));
  2248         -  pick2->Enable(Style->IsFaceStroke());
  2249         -  picker2Sizer->Add(pick2, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2250         -// third row: Stroke-Width,
  2251         -  wxBoxSizer *miscSizer = new wxBoxSizer(wxHORIZONTAL);
  2252         -  enable2Sizer->Add(miscSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2253         -// third row A: StrokeWidth
  2254         -  wxBoxSizer *widthBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2255         -  miscSizer->Add(widthBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2256         -  wxStaticBox *widthBox = new wxStaticBox(panel, wxID_STATIC,
  2257         -                                          wxT("Stroke Width"),
  2258         -                                          wxDefaultPosition,
  2259         -                                          wxDefaultSize);
  2260         -  wxBoxSizer *widthSizer = new wxStaticBoxSizer(widthBox, wxVERTICAL);
  2261         -  widthBoxSizer->Add(widthSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2262         -  wxTextCtrl *widthCtrl =
  2263         -    new wxTextCtrl(panel, ID_SYMBOLIZER_STROKE2_WIDTH, wxT("1.0"),
  2264         -                   wxDefaultPosition, wxSize(100, 22));
  2265         -  widthCtrl->Enable(false);
  2266         -  widthSizer->Add(widthCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2267         -
  2268         -  panel->SetSizer(topSizer);
  2269         -  topSizer->Fit(panel);
  2270         -// appends event handlers
  2271         -  Connect(ID_SYMBOLIZER_STROKE2_ENABLE, wxEVT_COMMAND_CHECKBOX_CLICKED,
  2272         -          (wxObjectEventFunction) &
  2273         -          QuickStyleTopologyDialog::OnCmdFaceStrokeChanged);
  2274         -  Connect(ID_SYMBOLIZER_FILL2_ENABLE, wxEVT_COMMAND_CHECKBOX_CLICKED,
  2275         -          (wxObjectEventFunction) &
  2276         -          QuickStyleTopologyDialog::OnCmdFaceFillChanged);
  2277         -  Connect(ID_SYMBOLIZER_FILL2_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
  2278         -          (wxObjectEventFunction) &
  2279         -          QuickStyleTopologyDialog::OnCmdFaceColorFillChanged);
  2280         -  Connect(ID_SYMBOLIZER_FILL2_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
  2281         -          (wxObjectEventFunction) &
  2282         -          QuickStyleTopologyDialog::OnCmdFaceColorFillPicker);
  2283         -  Connect(ID_SYMBOLIZER_STROKE2_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
  2284         -          (wxObjectEventFunction) &
  2285         -          QuickStyleTopologyDialog::OnCmdFaceColorStrokeChanged);
  2286         -  Connect(ID_SYMBOLIZER_STROKE2_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
  2287         -          (wxObjectEventFunction) &
  2288         -          QuickStyleTopologyDialog::OnCmdFaceColorStrokePicker);
  2289         -  return panel;
  2290         -}
  2291         -
  2292         -void QuickStyleTopologyDialog::
  2293         -OnCmdFaceStrokeChanged(wxCommandEvent & WXUNUSED(event))
  2294         -{
  2295         -//
  2296         -// Stroke enable/disable 
  2297         -//
  2298         -  wxCheckBox *enableCtrl =
  2299         -    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_STROKE2_ENABLE);
  2300         -  if (enableCtrl->IsChecked() == true)
  2301         -    Style->SetFaceStroke(true);
  2302         -  else
  2303         -    Style->SetFaceStroke(false);
  2304         -  RetrieveFacePage(false);
  2305         -  UpdateFacePage();
  2306         -}
  2307         -
  2308         -void QuickStyleTopologyDialog::
  2309         -OnCmdFaceFillChanged(wxCommandEvent & WXUNUSED(event))
  2310         -{
  2311         -//
  2312         -// Fill enable/disable 
  2313         -//
  2314         -  wxCheckBox *enableCtrl =
  2315         -    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_FILL2_ENABLE);
  2316         -  if (enableCtrl->IsChecked() == true)
  2317         -    Style->SetFaceFill(true);
  2318         -  else
  2319         -    Style->SetFaceFill(false);
  2320         -  RetrieveFacePage(false);
  2321         -  UpdateFacePage();
  2322         -}
  2323         -
  2324         -void QuickStyleTopologyDialog::
  2325         -OnCmdFaceColorFillChanged(wxCommandEvent & WXUNUSED(event))
  2326         -{
  2327         -//
  2328         -// Fill color changed: updating the visual sample
  2329         -//
  2330         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FILL2_COLOR);
  2331         -  wxStaticBitmap *sampleCtrl =
  2332         -    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_FILL2_PICKER_HEX);
  2333         -  wxColour back = wxColour(255, 255, 255);
  2334         -  wxString str = colorCtrl->GetValue();
  2335         -  if (ColorMapEntry::IsValidColor(str) == true)
  2336         -    ColorMapEntry::GetWxColor(str, back);
  2337         -  wxBitmap bmp;
  2338         -  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
  2339         -  sampleCtrl->SetBitmap(bmp);
  2340         -  sampleCtrl->Refresh();
  2341         -  sampleCtrl->Update();
  2342         -}
  2343         -
  2344         -void QuickStyleTopologyDialog::
  2345         -OnCmdFaceColorFillPicker(wxCommandEvent & WXUNUSED(event))
  2346         -{
  2347         -//
  2348         -// color picker
  2349         -//
  2350         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FILL2_COLOR);
  2351         -  wxColour clr = wxNullColour;
  2352         -  wxString str = colorCtrl->GetValue();
  2353         -  if (ColorMapEntry::IsValidColor(str) == true)
  2354         -    ColorMapEntry::GetWxColor(str, clr);
  2355         -  wxColour color = wxGetColourFromUser(this, clr);
  2356         -  if (color.IsOk() == true)
  2357         -    {
  2358         -      char hex[16];
  2359         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  2360         -      wxString str = wxString::FromUTF8(hex);
  2361         -      colorCtrl->SetValue(str);
  2362         -    }
  2363         -}
  2364         -
  2365         -void QuickStyleTopologyDialog::
  2366         -OnCmdFaceColorStrokeChanged(wxCommandEvent & WXUNUSED(event))
  2367         -{
  2368         -//
  2369         -// Stroke color changed: updating the visual sample
  2370         -//
  2371         -  wxTextCtrl *colorCtrl =
  2372         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE2_COLOR);
  2373         -  wxStaticBitmap *sampleCtrl =
  2374         -    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_STROKE2_PICKER_HEX);
  2375         -  wxColour back = wxColour(255, 255, 255);
  2376         -  wxString str = colorCtrl->GetValue();
  2377         -  if (ColorMapEntry::IsValidColor(str) == true)
  2378         -    ColorMapEntry::GetWxColor(str, back);
  2379         -  wxBitmap bmp;
  2380         -  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
  2381         -  sampleCtrl->SetBitmap(bmp);
  2382         -  sampleCtrl->Refresh();
  2383         -  sampleCtrl->Update();
  2384         -}
  2385         -
  2386         -void QuickStyleTopologyDialog::
  2387         -OnCmdFaceColorStrokePicker(wxCommandEvent & WXUNUSED(event))
  2388         -{
  2389         -//
  2390         -// color picker
  2391         -//
  2392         -  wxTextCtrl *colorCtrl =
  2393         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE2_COLOR);
  2394         -  wxColour clr = wxNullColour;
  2395         -  wxString str = colorCtrl->GetValue();
  2396         -  if (ColorMapEntry::IsValidColor(str) == true)
  2397         -    ColorMapEntry::GetWxColor(str, clr);
  2398         -  wxColour color = wxGetColourFromUser(this, clr);
  2399         -  if (color.IsOk() == true)
  2400         -    {
  2401         -      char hex[16];
  2402         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  2403         -      wxString str = wxString::FromUTF8(hex);
  2404         -      colorCtrl->SetValue(str);
  2405         -    }
  2406         -}
  2407         -
  2408         -wxPanel *QuickStyleTopologyDialog::CreateEdgeLinkSeedPage(wxWindow * parent)
  2409         -{
  2410         -//
  2411         -// creating the EdgeLinkSeed Symbolizer page
  2412         -//
  2413         -  wxString StrokeColor = wxT("#000000");
  2414         -  wxString FillColor = wxT("#808080");
  2415         -  wxPanel *panel = new wxPanel(parent, ID_PANE_POINT);
  2416         -  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
  2417         -  panel->SetSizer(topSizer);
  2418         -  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
  2419         -  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
  2420         -// first row A: Opacity 
  2421         -  wxBoxSizer *opacityBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2422         -  boxSizer->Add(opacityBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2423         -  wxStaticBox *opacityBox = new wxStaticBox(panel, wxID_STATIC,
  2424         -                                            wxT("Opacity"),
  2425         -                                            wxDefaultPosition,
  2426         -                                            wxDefaultSize);
  2427         -  wxBoxSizer *opacitySizer = new wxStaticBoxSizer(opacityBox, wxVERTICAL);
  2428         -  opacityBoxSizer->Add(opacitySizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2429         -  wxSlider *opacityCtrl =
  2430         -    new wxSlider(panel, ID_SYMBOLIZER_EDGELINK_SEED_OPACITY, 100, 0, 100,
  2431         -                 wxDefaultPosition, wxSize(600, 45),
  2432         -                 wxSL_HORIZONTAL | wxSL_LABELS);
  2433         -  opacitySizer->Add(opacityCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2434         -// Well Known Mark Name
  2435         -  wxBoxSizer *box1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2436         -  boxSizer->Add(box1Sizer, 0, wxALIGN_CENTER | wxALL, 5);
  2437         -  wxBoxSizer *markSizer = new wxBoxSizer(wxHORIZONTAL);
  2438         -  box1Sizer->Add(markSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2439         -  wxString mark[6];
  2440         -  mark[0] = wxT("&Square");
  2441         -  mark[1] = wxT("&Circle");
  2442         -  mark[2] = wxT("&Triangle");
  2443         -  mark[3] = wxT("&Star");
  2444         -  mark[4] = wxT("&Cross");
  2445         -  mark[5] = wxT("&X");
  2446         -  wxRadioBox *markBox = new wxRadioBox(panel, ID_SYMBOLIZER_EDGELINK_SEED_MARK,
  2447         -                                       wxT("&Mark"),
  2448         -                                       wxDefaultPosition,
  2449         -                                       wxDefaultSize, 6,
  2450         -                                       mark, 1,
  2451         -                                       wxRA_SPECIFY_COLS);
  2452         -  markSizer->Add(markBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2453         -  markBox->SetSelection(0);
  2454         -// second row: Size and Rotation
  2455         -  wxBoxSizer *box2Sizer = new wxBoxSizer(wxVERTICAL);
  2456         -  box1Sizer->Add(box2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2457         -  wxBoxSizer *sizeBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2458         -  box2Sizer->Add(sizeBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2459         -// second row A: Size
  2460         -  wxStaticBox *sizeBox = new wxStaticBox(panel, wxID_STATIC,
  2461         -                                         wxT("Size"),
  2462         -                                         wxDefaultPosition,
  2463         -                                         wxDefaultSize);
  2464         -  wxBoxSizer *sizeSizer = new wxStaticBoxSizer(sizeBox, wxVERTICAL);
  2465         -  sizeBoxSizer->Add(sizeSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
  2466         -  wxBoxSizer *size1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2467         -  sizeSizer->Add(size1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2468         -  wxTextCtrl *sizeCtrl =
  2469         -    new wxTextCtrl(panel, ID_SYMBOLIZER_EDGELINK_SEED_SIZE, wxT("16.0"),
  2470         -                   wxDefaultPosition, wxSize(100, 22));
  2471         -  size1Sizer->Add(sizeCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2472         -// second row B: Rotation
  2473         -  wxStaticBox *rotBox = new wxStaticBox(panel, wxID_STATIC,
  2474         -                                        wxT("Rotation"),
  2475         -                                        wxDefaultPosition,
  2476         -                                        wxDefaultSize);
  2477         -  wxBoxSizer *rotSizer = new wxStaticBoxSizer(rotBox, wxVERTICAL);
  2478         -  sizeBoxSizer->Add(rotSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
  2479         -  wxBoxSizer *rot1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2480         -  rotSizer->Add(rot1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2481         -  wxTextCtrl *rotCtrl =
  2482         -    new wxTextCtrl(panel, ID_SYMBOLIZER_EDGELINK_SEED_ROTATION, wxT("0.0"),
  2483         -                   wxDefaultPosition, wxSize(100, 22));
  2484         -  rot1Sizer->Add(rotCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2485         -// third row: AnchorEdgeLinkSeed and Displacement
  2486         -  wxBoxSizer *anchorBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2487         -  box2Sizer->Add(anchorBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2488         -// third row A: Anchor EdgeLinkSeed
  2489         -  wxStaticBox *anchorBox = new wxStaticBox(panel, wxID_STATIC,
  2490         -                                           wxT("Anchor EdgeLinkSeed"),
  2491         -                                           wxDefaultPosition,
  2492         -                                           wxDefaultSize);
  2493         -  wxBoxSizer *anchorSizer = new wxStaticBoxSizer(anchorBox, wxVERTICAL);
  2494         -  anchorBoxSizer->Add(anchorSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
  2495         -  wxBoxSizer *anchor1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2496         -  anchorSizer->Add(anchor1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2497         -  wxStaticText *anchor1Label = new wxStaticText(panel, wxID_STATIC, wxT("X"));
  2498         -  anchor1Sizer->Add(anchor1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2499         -  wxTextCtrl *anchorXCtrl =
  2500         -    new wxTextCtrl(panel, ID_SYMBOLIZER_EDGELINK_SEED_ANCHOR_X, wxT("0.5"),
  2501         -                   wxDefaultPosition, wxSize(100, 22));
  2502         -  anchor1Sizer->Add(anchorXCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2503         -  wxBoxSizer *anchor2Sizer = new wxBoxSizer(wxHORIZONTAL);
  2504         -  anchorSizer->Add(anchor2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2505         -  wxStaticText *anchor2Label = new wxStaticText(panel, wxID_STATIC, wxT("Y"));
  2506         -  anchor2Sizer->Add(anchor2Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2507         -  wxTextCtrl *anchorYCtrl =
  2508         -    new wxTextCtrl(panel, ID_SYMBOLIZER_EDGELINK_SEED_ANCHOR_Y, wxT("0.5"),
  2509         -                   wxDefaultPosition, wxSize(100, 22));
  2510         -  anchor2Sizer->Add(anchorYCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2511         -// third row B: Displacement
  2512         -  wxStaticBox *displacementBox = new wxStaticBox(panel, wxID_STATIC,
  2513         -                                                 wxT("Displacement"),
  2514         -                                                 wxDefaultPosition,
  2515         -                                                 wxDefaultSize);
  2516         -  wxBoxSizer *displacementSizer =
  2517         -    new wxStaticBoxSizer(displacementBox, wxVERTICAL);
  2518         -  anchorBoxSizer->Add(displacementSizer, 0,
  2519         -                      wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
  2520         -  wxBoxSizer *displ1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2521         -  displacementSizer->Add(displ1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2522         -  wxStaticText *displ1Label = new wxStaticText(panel, wxID_STATIC, wxT("X"));
  2523         -  displ1Sizer->Add(displ1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2524         -  wxTextCtrl *displacementXCtrl =
  2525         -    new wxTextCtrl(panel, ID_SYMBOLIZER_EDGELINK_SEED_DISPLACEMENT_X,
  2526         -                   wxT("0.0"),
  2527         -                   wxDefaultPosition, wxSize(100, 22));
  2528         -  displ1Sizer->Add(displacementXCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2529         -  wxBoxSizer *displ2Sizer = new wxBoxSizer(wxHORIZONTAL);
  2530         -  displacementSizer->Add(displ2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2531         -  wxStaticText *displ2Label = new wxStaticText(panel, wxID_STATIC, wxT("Y"));
  2532         -  displ2Sizer->Add(displ2Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2533         -  wxTextCtrl *displacementYCtrl =
  2534         -    new wxTextCtrl(panel, ID_SYMBOLIZER_EDGELINK_SEED_DISPLACEMENT_Y,
  2535         -                   wxT("0.0"),
  2536         -                   wxDefaultPosition, wxSize(100, 22));
  2537         -  displ2Sizer->Add(displacementYCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2538         -// fourth row: colors
  2539         -  wxBoxSizer *box3Sizer = new wxBoxSizer(wxHORIZONTAL);
  2540         -  boxSizer->Add(box3Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2541         -// first row A: Fill Color
  2542         -  wxBoxSizer *fillBoxSizer = new wxBoxSizer(wxVERTICAL);
  2543         -  box3Sizer->Add(fillBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2544         -  wxStaticBox *colorFillBox = new wxStaticBox(panel, wxID_STATIC,
  2545         -                                              wxT("Fill Color"),
  2546         -                                              wxDefaultPosition,
  2547         -                                              wxDefaultSize);
  2548         -  wxBoxSizer *colorFillSizer = new wxStaticBoxSizer(colorFillBox, wxVERTICAL);
  2549         -  box3Sizer->Add(colorFillSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2550         -  wxBoxSizer *fill1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2551         -  colorFillSizer->Add(fill1Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2552         -  wxTextCtrl *fillColorCtrl =
  2553         -    new wxTextCtrl(panel, ID_SYMBOLIZER_EDGELINK_SEED_FILL_COLOR, FillColor,
  2554         -                   wxDefaultPosition, wxSize(80, 22));
  2555         -  fill1Sizer->Add(fillColorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2556         -  wxBitmap bmp;
  2557         -  wxColour color(0, 0, 0);
  2558         -  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
  2559         -  wxStaticBitmap *sampleFillCtrl =
  2560         -    new wxStaticBitmap(panel, ID_SYMBOLIZER_EDGELINK_SEED_FILL_PICKER_HEX, bmp,
  2561         -                       wxDefaultPosition, wxSize(32, 32));
  2562         -  fill1Sizer->Add(sampleFillCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2563         -  wxButton *pickFill =
  2564         -    new wxButton(panel, ID_SYMBOLIZER_EDGELINK_SEED_FILL_PICKER_BTN,
  2565         -                 wxT("&Pick a color"));
  2566         -  fill1Sizer->Add(pickFill, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2567         -// second row B: Stroke Color
  2568         -  box3Sizer->AddSpacer(30);
  2569         -  wxStaticBox *colorStrokeBox = new wxStaticBox(panel, wxID_STATIC,
  2570         -                                                wxT("Stroke Color"),
  2571         -                                                wxDefaultPosition,
  2572         -                                                wxDefaultSize);
  2573         -  wxBoxSizer *colorStrokeSizer =
  2574         -    new wxStaticBoxSizer(colorStrokeBox, wxVERTICAL);
  2575         -  box3Sizer->Add(colorStrokeSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2576         -  wxBoxSizer *stroke1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2577         -  colorStrokeSizer->Add(stroke1Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2578         -  wxTextCtrl *strokeColorCtrl =
  2579         -    new wxTextCtrl(panel, ID_SYMBOLIZER_EDGELINK_SEED_STROKE_COLOR, StrokeColor,
  2580         -                   wxDefaultPosition, wxSize(80, 22));
  2581         -  stroke1Sizer->Add(strokeColorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2582         -  wxStaticBitmap *sampleStrokeCtrl =
  2583         -    new wxStaticBitmap(panel, ID_SYMBOLIZER_EDGELINK_SEED_STROKE_PICKER_HEX,
  2584         -                       bmp,
  2585         -                       wxDefaultPosition, wxSize(32, 32));
  2586         -  stroke1Sizer->Add(sampleStrokeCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2587         -  wxButton *pickStroke =
  2588         -    new wxButton(panel, ID_SYMBOLIZER_EDGELINK_SEED_STROKE_PICKER_BTN,
  2589         -                 wxT("&Pick a color"));
  2590         -  stroke1Sizer->Add(pickStroke, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2591         -  panel->SetSizer(topSizer);
  2592         -  topSizer->Fit(panel);
  2593         -// appends event handlers
  2594         -  Connect(ID_SYMBOLIZER_EDGELINK_SEED_MARK, wxEVT_COMMAND_RADIOBOX_SELECTED,
  2595         -          (wxObjectEventFunction) &
  2596         -          QuickStyleTopologyDialog::OnCmdEdgeLinkSeedMarkChanged);
  2597         -  Connect(ID_SYMBOLIZER_EDGELINK_SEED_FILL_PICKER_BTN,
  2598         -          wxEVT_COMMAND_BUTTON_CLICKED,
  2599         -          (wxObjectEventFunction) &
  2600         -          QuickStyleTopologyDialog::OnCmdEdgeLinkSeedColorFillPicker);
  2601         -  Connect(ID_SYMBOLIZER_EDGELINK_SEED_FILL_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
  2602         -          (wxObjectEventFunction) &
  2603         -          QuickStyleTopologyDialog::OnCmdEdgeLinkSeedColorFillChanged);
  2604         -  Connect(ID_SYMBOLIZER_EDGELINK_SEED_STROKE_PICKER_BTN,
  2605         -          wxEVT_COMMAND_BUTTON_CLICKED,
  2606         -          (wxObjectEventFunction) &
  2607         -          QuickStyleTopologyDialog::OnCmdEdgeLinkSeedColorStrokePicker);
  2608         -  Connect(ID_SYMBOLIZER_EDGELINK_SEED_STROKE_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
  2609         -          (wxObjectEventFunction) &
  2610         -          QuickStyleTopologyDialog::OnCmdEdgeLinkSeedColorStrokeChanged);
  2611         -  return panel;
  2612         -}
  2613         -
  2614         -void QuickStyleTopologyDialog::
  2615         -OnCmdEdgeLinkSeedMarkChanged(wxCommandEvent & WXUNUSED(event))
  2616         -{
  2617         -//
  2618         -// Mark selection changed
  2619         -//
  2620         -  wxRadioBox *markCtrl =
  2621         -    (wxRadioBox *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_MARK);
  2622         -  switch (markCtrl->GetSelection())
  2623         -    {
  2624         -      case 1:
  2625         -        Style->SetEdgeLinkSeedWellKnownMark(RL2_GRAPHIC_MARK_CIRCLE);
  2626         -        break;
  2627         -      case 2:
  2628         -        Style->SetEdgeLinkSeedWellKnownMark(RL2_GRAPHIC_MARK_TRIANGLE);
  2629         -        break;
  2630         -      case 3:
  2631         -        Style->SetEdgeLinkSeedWellKnownMark(RL2_GRAPHIC_MARK_STAR);
  2632         -        break;
  2633         -      case 4:
  2634         -        Style->SetEdgeLinkSeedWellKnownMark(RL2_GRAPHIC_MARK_CROSS);
  2635         -        break;
  2636         -      case 5:
  2637         -        Style->SetEdgeLinkSeedWellKnownMark(RL2_GRAPHIC_MARK_X);
  2638         -        break;
  2639         -      default:
  2640         -        Style->SetEdgeLinkSeedWellKnownMark(RL2_GRAPHIC_MARK_SQUARE);
  2641         -        break;
  2642         -    };
  2643         -}
  2644         -
  2645         -void QuickStyleTopologyDialog::
  2646         -OnCmdEdgeLinkSeedColorFillChanged(wxCommandEvent & WXUNUSED(event))
  2647         -{
  2648         -//
  2649         -// Fill color changed: updating the visual sample
  2650         -//
  2651         -  wxTextCtrl *colorCtrl =
  2652         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_FILL_COLOR);
  2653         -  wxStaticBitmap *sampleCtrl =
  2654         -    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_FILL_PICKER_HEX);
  2655         -  wxColour back = wxColour(255, 255, 255);
  2656         -  wxString str = colorCtrl->GetValue();
  2657         -  if (ColorMapEntry::IsValidColor(str) == true)
  2658         -    ColorMapEntry::GetWxColor(str, back);
  2659         -  wxBitmap bmp;
  2660         -  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
  2661         -  sampleCtrl->SetBitmap(bmp);
  2662         -  sampleCtrl->Refresh();
  2663         -  sampleCtrl->Update();
  2664         -}
  2665         -
  2666         -void QuickStyleTopologyDialog::
  2667         -OnCmdEdgeLinkSeedColorFillPicker(wxCommandEvent & WXUNUSED(event))
  2668         -{
  2669         -//
  2670         -// color picker
  2671         -//
  2672         -  wxTextCtrl *colorCtrl =
  2673         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_FILL_COLOR);
  2674         -  wxColour clr = wxNullColour;
  2675         -  wxString str = colorCtrl->GetValue();
  2676         -  if (ColorMapEntry::IsValidColor(str) == true)
  2677         -    ColorMapEntry::GetWxColor(str, clr);
  2678         -  wxColour color = wxGetColourFromUser(this, clr);
  2679         -  if (color.IsOk() == true)
  2680         -    {
  2681         -      char hex[16];
  2682         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  2683         -      wxString str = wxString::FromUTF8(hex);
  2684         -      colorCtrl->SetValue(str);
  2685         -    }
  2686         -}
  2687         -
  2688         -void QuickStyleTopologyDialog::
  2689         -OnCmdEdgeLinkSeedColorStrokeChanged(wxCommandEvent & WXUNUSED(event))
  2690         -{
  2691         -//
  2692         -// Stroke color changed: updating the visual sample
  2693         -//
  2694         -  wxTextCtrl *colorCtrl =
  2695         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_STROKE_COLOR);
  2696         -  wxStaticBitmap *sampleCtrl =
  2697         -    (wxStaticBitmap *)
  2698         -    FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_STROKE_PICKER_HEX);
  2699         -  wxColour back = wxColour(255, 255, 255);
  2700         -  wxString str = colorCtrl->GetValue();
  2701         -  if (ColorMapEntry::IsValidColor(str) == true)
  2702         -    ColorMapEntry::GetWxColor(str, back);
  2703         -  wxBitmap bmp;
  2704         -  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
  2705         -  sampleCtrl->SetBitmap(bmp);
  2706         -  sampleCtrl->Refresh();
  2707         -  sampleCtrl->Update();
  2708         -}
  2709         -
  2710         -void QuickStyleTopologyDialog::
  2711         -OnCmdEdgeLinkSeedColorStrokePicker(wxCommandEvent & WXUNUSED(event))
  2712         -{
  2713         -//
  2714         -// color picker
  2715         -//
  2716         -  wxTextCtrl *colorCtrl =
  2717         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_STROKE_COLOR);
  2718         -  wxColour clr = wxNullColour;
  2719         -  wxString str = colorCtrl->GetValue();
  2720         -  if (ColorMapEntry::IsValidColor(str) == true)
  2721         -    ColorMapEntry::GetWxColor(str, clr);
  2722         -  wxColour color = wxGetColourFromUser(this, clr);
  2723         -  if (color.IsOk() == true)
  2724         -    {
  2725         -      char hex[16];
  2726         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  2727         -      wxString str = wxString::FromUTF8(hex);
  2728         -      colorCtrl->SetValue(str);
  2729         -    }
  2730         -}
  2731         -
  2732         -wxPanel *QuickStyleTopologyDialog::CreateFaceSeedPage(wxWindow * parent)
  2733         -{
  2734         -//
  2735         -// creating the FaceSeed Symbolizer page
  2736         -//
  2737         -  wxString StrokeColor = wxT("#000000");
  2738         -  wxString FillColor = wxT("#808080");
  2739         -  wxPanel *panel = new wxPanel(parent, ID_PANE_POINT);
  2740         -  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
  2741         -  panel->SetSizer(topSizer);
  2742         -  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
  2743         -  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
  2744         -// first row A: Opacity 
  2745         -  wxBoxSizer *opacityBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2746         -  boxSizer->Add(opacityBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2747         -  wxStaticBox *opacityBox = new wxStaticBox(panel, wxID_STATIC,
  2748         -                                            wxT("Opacity"),
  2749         -                                            wxDefaultPosition,
  2750         -                                            wxDefaultSize);
  2751         -  wxBoxSizer *opacitySizer = new wxStaticBoxSizer(opacityBox, wxVERTICAL);
  2752         -  opacityBoxSizer->Add(opacitySizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2753         -  wxSlider *opacityCtrl =
  2754         -    new wxSlider(panel, ID_SYMBOLIZER_FACE_SEED_OPACITY, 100, 0, 100,
  2755         -                 wxDefaultPosition, wxSize(600, 45),
  2756         -                 wxSL_HORIZONTAL | wxSL_LABELS);
  2757         -  opacitySizer->Add(opacityCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2758         -// Well Known Mark Name
  2759         -  wxBoxSizer *box1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2760         -  boxSizer->Add(box1Sizer, 0, wxALIGN_CENTER | wxALL, 5);
  2761         -  wxBoxSizer *markSizer = new wxBoxSizer(wxHORIZONTAL);
  2762         -  box1Sizer->Add(markSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2763         -  wxString mark[6];
  2764         -  mark[0] = wxT("&Square");
  2765         -  mark[1] = wxT("&Circle");
  2766         -  mark[2] = wxT("&Triangle");
  2767         -  mark[3] = wxT("&Star");
  2768         -  mark[4] = wxT("&Cross");
  2769         -  mark[5] = wxT("&X");
  2770         -  wxRadioBox *markBox = new wxRadioBox(panel, ID_SYMBOLIZER_FACE_SEED_MARK,
  2771         -                                       wxT("&Mark"),
  2772         -                                       wxDefaultPosition,
  2773         -                                       wxDefaultSize, 6,
  2774         -                                       mark, 1,
  2775         -                                       wxRA_SPECIFY_COLS);
  2776         -  markSizer->Add(markBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2777         -  markBox->SetSelection(0);
  2778         -// second row: Size and Rotation
  2779         -  wxBoxSizer *box2Sizer = new wxBoxSizer(wxVERTICAL);
  2780         -  box1Sizer->Add(box2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2781         -  wxBoxSizer *sizeBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2782         -  box2Sizer->Add(sizeBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2783         -// second row A: Size
  2784         -  wxStaticBox *sizeBox = new wxStaticBox(panel, wxID_STATIC,
  2785         -                                         wxT("Size"),
  2786         -                                         wxDefaultPosition,
  2787         -                                         wxDefaultSize);
  2788         -  wxBoxSizer *sizeSizer = new wxStaticBoxSizer(sizeBox, wxVERTICAL);
  2789         -  sizeBoxSizer->Add(sizeSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
  2790         -  wxBoxSizer *size1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2791         -  sizeSizer->Add(size1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2792         -  wxTextCtrl *sizeCtrl =
  2793         -    new wxTextCtrl(panel, ID_SYMBOLIZER_FACE_SEED_SIZE, wxT("16.0"),
  2794         -                   wxDefaultPosition, wxSize(100, 22));
  2795         -  size1Sizer->Add(sizeCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2796         -// second row B: Rotation
  2797         -  wxStaticBox *rotBox = new wxStaticBox(panel, wxID_STATIC,
  2798         -                                        wxT("Rotation"),
  2799         -                                        wxDefaultPosition,
  2800         -                                        wxDefaultSize);
  2801         -  wxBoxSizer *rotSizer = new wxStaticBoxSizer(rotBox, wxVERTICAL);
  2802         -  sizeBoxSizer->Add(rotSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
  2803         -  wxBoxSizer *rot1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2804         -  rotSizer->Add(rot1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2805         -  wxTextCtrl *rotCtrl =
  2806         -    new wxTextCtrl(panel, ID_SYMBOLIZER_FACE_SEED_ROTATION, wxT("0.0"),
  2807         -                   wxDefaultPosition, wxSize(100, 22));
  2808         -  rot1Sizer->Add(rotCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2809         -// third row: AnchorFaceSeed and Displacement
  2810         -  wxBoxSizer *anchorBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2811         -  box2Sizer->Add(anchorBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2812         -// third row A: Anchor FaceSeed
  2813         -  wxStaticBox *anchorBox = new wxStaticBox(panel, wxID_STATIC,
  2814         -                                           wxT("Anchor FaceSeed"),
  2815         -                                           wxDefaultPosition,
  2816         -                                           wxDefaultSize);
  2817         -  wxBoxSizer *anchorSizer = new wxStaticBoxSizer(anchorBox, wxVERTICAL);
  2818         -  anchorBoxSizer->Add(anchorSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
  2819         -  wxBoxSizer *anchor1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2820         -  anchorSizer->Add(anchor1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2821         -  wxStaticText *anchor1Label = new wxStaticText(panel, wxID_STATIC, wxT("X"));
  2822         -  anchor1Sizer->Add(anchor1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2823         -  wxTextCtrl *anchorXCtrl =
  2824         -    new wxTextCtrl(panel, ID_SYMBOLIZER_FACE_SEED_ANCHOR_X, wxT("0.5"),
  2825         -                   wxDefaultPosition, wxSize(100, 22));
  2826         -  anchor1Sizer->Add(anchorXCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2827         -  wxBoxSizer *anchor2Sizer = new wxBoxSizer(wxHORIZONTAL);
  2828         -  anchorSizer->Add(anchor2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2829         -  wxStaticText *anchor2Label = new wxStaticText(panel, wxID_STATIC, wxT("Y"));
  2830         -  anchor2Sizer->Add(anchor2Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2831         -  wxTextCtrl *anchorYCtrl =
  2832         -    new wxTextCtrl(panel, ID_SYMBOLIZER_FACE_SEED_ANCHOR_Y, wxT("0.5"),
  2833         -                   wxDefaultPosition, wxSize(100, 22));
  2834         -  anchor2Sizer->Add(anchorYCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2835         -// third row B: Displacement
  2836         -  wxStaticBox *displacementBox = new wxStaticBox(panel, wxID_STATIC,
  2837         -                                                 wxT("Displacement"),
  2838         -                                                 wxDefaultPosition,
  2839         -                                                 wxDefaultSize);
  2840         -  wxBoxSizer *displacementSizer =
  2841         -    new wxStaticBoxSizer(displacementBox, wxVERTICAL);
  2842         -  anchorBoxSizer->Add(displacementSizer, 0,
  2843         -                      wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
  2844         -  wxBoxSizer *displ1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2845         -  displacementSizer->Add(displ1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2846         -  wxStaticText *displ1Label = new wxStaticText(panel, wxID_STATIC, wxT("X"));
  2847         -  displ1Sizer->Add(displ1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2848         -  wxTextCtrl *displacementXCtrl =
  2849         -    new wxTextCtrl(panel, ID_SYMBOLIZER_FACE_SEED_DISPLACEMENT_X, wxT("0.0"),
  2850         -                   wxDefaultPosition, wxSize(100, 22));
  2851         -  displ1Sizer->Add(displacementXCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2852         -  wxBoxSizer *displ2Sizer = new wxBoxSizer(wxHORIZONTAL);
  2853         -  displacementSizer->Add(displ2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2854         -  wxStaticText *displ2Label = new wxStaticText(panel, wxID_STATIC, wxT("Y"));
  2855         -  displ2Sizer->Add(displ2Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2856         -  wxTextCtrl *displacementYCtrl =
  2857         -    new wxTextCtrl(panel, ID_SYMBOLIZER_FACE_SEED_DISPLACEMENT_Y, wxT("0.0"),
  2858         -                   wxDefaultPosition, wxSize(100, 22));
  2859         -  displ2Sizer->Add(displacementYCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2860         -// fourth row: colors
  2861         -  wxBoxSizer *box3Sizer = new wxBoxSizer(wxHORIZONTAL);
  2862         -  boxSizer->Add(box3Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2863         -// first row A: Fill Color
  2864         -  wxBoxSizer *fillBoxSizer = new wxBoxSizer(wxVERTICAL);
  2865         -  box3Sizer->Add(fillBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2866         -  wxStaticBox *colorFillBox = new wxStaticBox(panel, wxID_STATIC,
  2867         -                                              wxT("Fill Color"),
  2868         -                                              wxDefaultPosition,
  2869         -                                              wxDefaultSize);
  2870         -  wxBoxSizer *colorFillSizer = new wxStaticBoxSizer(colorFillBox, wxVERTICAL);
  2871         -  box3Sizer->Add(colorFillSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2872         -  wxBoxSizer *fill1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2873         -  colorFillSizer->Add(fill1Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2874         -  wxTextCtrl *fillColorCtrl =
  2875         -    new wxTextCtrl(panel, ID_SYMBOLIZER_FACE_SEED_FILL_COLOR, FillColor,
  2876         -                   wxDefaultPosition, wxSize(80, 22));
  2877         -  fill1Sizer->Add(fillColorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2878         -  wxBitmap bmp;
  2879         -  wxColour color(0, 0, 0);
  2880         -  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
  2881         -  wxStaticBitmap *sampleFillCtrl =
  2882         -    new wxStaticBitmap(panel, ID_SYMBOLIZER_FACE_SEED_FILL_PICKER_HEX, bmp,
  2883         -                       wxDefaultPosition, wxSize(32, 32));
  2884         -  fill1Sizer->Add(sampleFillCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2885         -  wxButton *pickFill =
  2886         -    new wxButton(panel, ID_SYMBOLIZER_FACE_SEED_FILL_PICKER_BTN,
  2887         -                 wxT("&Pick a color"));
  2888         -  fill1Sizer->Add(pickFill, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2889         -// second row B: Stroke Color
  2890         -  box3Sizer->AddSpacer(30);
  2891         -  wxStaticBox *colorStrokeBox = new wxStaticBox(panel, wxID_STATIC,
  2892         -                                                wxT("Stroke Color"),
  2893         -                                                wxDefaultPosition,
  2894         -                                                wxDefaultSize);
  2895         -  wxBoxSizer *colorStrokeSizer =
  2896         -    new wxStaticBoxSizer(colorStrokeBox, wxVERTICAL);
  2897         -  box3Sizer->Add(colorStrokeSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2898         -  wxBoxSizer *stroke1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2899         -  colorStrokeSizer->Add(stroke1Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2900         -  wxTextCtrl *strokeColorCtrl =
  2901         -    new wxTextCtrl(panel, ID_SYMBOLIZER_FACE_SEED_STROKE_COLOR, StrokeColor,
  2902         -                   wxDefaultPosition, wxSize(80, 22));
  2903         -  stroke1Sizer->Add(strokeColorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2904         -  wxStaticBitmap *sampleStrokeCtrl =
  2905         -    new wxStaticBitmap(panel, ID_SYMBOLIZER_FACE_SEED_STROKE_PICKER_HEX, bmp,
  2906         -                       wxDefaultPosition, wxSize(32, 32));
  2907         -  stroke1Sizer->Add(sampleStrokeCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2908         -  wxButton *pickStroke =
  2909         -    new wxButton(panel, ID_SYMBOLIZER_FACE_SEED_STROKE_PICKER_BTN,
  2910         -                 wxT("&Pick a color"));
  2911         -  stroke1Sizer->Add(pickStroke, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2912         -  panel->SetSizer(topSizer);
  2913         -  topSizer->Fit(panel);
  2914         -// appends event handlers
  2915         -  Connect(ID_SYMBOLIZER_FACE_SEED_MARK, wxEVT_COMMAND_RADIOBOX_SELECTED,
  2916         -          (wxObjectEventFunction) &
  2917         -          QuickStyleTopologyDialog::OnCmdFaceSeedMarkChanged);
  2918         -  Connect(ID_SYMBOLIZER_FACE_SEED_FILL_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
  2919         -          (wxObjectEventFunction) &
  2920         -          QuickStyleTopologyDialog::OnCmdFaceSeedColorFillPicker);
  2921         -  Connect(ID_SYMBOLIZER_FACE_SEED_FILL_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
  2922         -          (wxObjectEventFunction) &
  2923         -          QuickStyleTopologyDialog::OnCmdFaceSeedColorFillChanged);
  2924         -  Connect(ID_SYMBOLIZER_FACE_SEED_STROKE_PICKER_BTN,
  2925         -          wxEVT_COMMAND_BUTTON_CLICKED,
  2926         -          (wxObjectEventFunction) &
  2927         -          QuickStyleTopologyDialog::OnCmdFaceSeedColorStrokePicker);
  2928         -  Connect(ID_SYMBOLIZER_FACE_SEED_STROKE_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
  2929         -          (wxObjectEventFunction) &
  2930         -          QuickStyleTopologyDialog::OnCmdFaceSeedColorStrokeChanged);
  2931         -  return panel;
  2932         -}
  2933         -
  2934         -void QuickStyleTopologyDialog::
  2935         -OnCmdFaceSeedMarkChanged(wxCommandEvent & WXUNUSED(event))
  2936         -{
  2937         -//
  2938         -// Mark selection changed
  2939         -//
  2940         -  wxRadioBox *markCtrl =
  2941         -    (wxRadioBox *) FindWindow(ID_SYMBOLIZER_FACE_SEED_MARK);
  2942         -  switch (markCtrl->GetSelection())
  2943         -    {
  2944         -      case 1:
  2945         -        Style->SetFaceSeedWellKnownMark(RL2_GRAPHIC_MARK_CIRCLE);
  2946         -        break;
  2947         -      case 2:
  2948         -        Style->SetFaceSeedWellKnownMark(RL2_GRAPHIC_MARK_TRIANGLE);
  2949         -        break;
  2950         -      case 3:
  2951         -        Style->SetFaceSeedWellKnownMark(RL2_GRAPHIC_MARK_STAR);
  2952         -        break;
  2953         -      case 4:
  2954         -        Style->SetFaceSeedWellKnownMark(RL2_GRAPHIC_MARK_CROSS);
  2955         -        break;
  2956         -      case 5:
  2957         -        Style->SetFaceSeedWellKnownMark(RL2_GRAPHIC_MARK_X);
  2958         -        break;
  2959         -      default:
  2960         -        Style->SetFaceSeedWellKnownMark(RL2_GRAPHIC_MARK_SQUARE);
  2961         -        break;
  2962         -    };
  2963         -}
  2964         -
  2965         -void QuickStyleTopologyDialog::
  2966         -OnCmdFaceSeedColorFillChanged(wxCommandEvent & WXUNUSED(event))
  2967         -{
  2968         -//
  2969         -// Fill color changed: updating the visual sample
  2970         -//
  2971         -  wxTextCtrl *colorCtrl =
  2972         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_FILL_COLOR);
  2973         -  wxStaticBitmap *sampleCtrl =
  2974         -    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_FACE_SEED_FILL_PICKER_HEX);
  2975         -  wxColour back = wxColour(255, 255, 255);
  2976         -  wxString str = colorCtrl->GetValue();
  2977         -  if (ColorMapEntry::IsValidColor(str) == true)
  2978         -    ColorMapEntry::GetWxColor(str, back);
  2979         -  wxBitmap bmp;
  2980         -  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
  2981         -  sampleCtrl->SetBitmap(bmp);
  2982         -  sampleCtrl->Refresh();
  2983         -  sampleCtrl->Update();
  2984         -}
  2985         -
  2986         -void QuickStyleTopologyDialog::
  2987         -OnCmdFaceSeedColorFillPicker(wxCommandEvent & WXUNUSED(event))
  2988         -{
  2989         -//
  2990         -// color picker
  2991         -//
  2992         -  wxTextCtrl *colorCtrl =
  2993         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_FILL_COLOR);
  2994         -  wxColour clr = wxNullColour;
  2995         -  wxString str = colorCtrl->GetValue();
  2996         -  if (ColorMapEntry::IsValidColor(str) == true)
  2997         -    ColorMapEntry::GetWxColor(str, clr);
  2998         -  wxColour color = wxGetColourFromUser(this, clr);
  2999         -  if (color.IsOk() == true)
  3000         -    {
  3001         -      char hex[16];
  3002         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  3003         -      wxString str = wxString::FromUTF8(hex);
  3004         -      colorCtrl->SetValue(str);
  3005         -    }
  3006         -}
  3007         -
  3008         -void QuickStyleTopologyDialog::
  3009         -OnCmdFaceSeedColorStrokeChanged(wxCommandEvent & WXUNUSED(event))
  3010         -{
  3011         -//
  3012         -// Stroke color changed: updating the visual sample
  3013         -//
  3014         -  wxTextCtrl *colorCtrl =
  3015         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_STROKE_COLOR);
  3016         -  wxStaticBitmap *sampleCtrl =
  3017         -    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_FACE_SEED_STROKE_PICKER_HEX);
  3018         -  wxColour back = wxColour(255, 255, 255);
  3019         -  wxString str = colorCtrl->GetValue();
  3020         -  if (ColorMapEntry::IsValidColor(str) == true)
  3021         -    ColorMapEntry::GetWxColor(str, back);
  3022         -  wxBitmap bmp;
  3023         -  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
  3024         -  sampleCtrl->SetBitmap(bmp);
  3025         -  sampleCtrl->Refresh();
  3026         -  sampleCtrl->Update();
  3027         -}
  3028         -
  3029         -void QuickStyleTopologyDialog::
  3030         -OnCmdFaceSeedColorStrokePicker(wxCommandEvent & WXUNUSED(event))
  3031         -{
  3032         -//
  3033         -// color picker
  3034         -//
  3035         -  wxTextCtrl *colorCtrl =
  3036         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_STROKE_COLOR);
  3037         -  wxColour clr = wxNullColour;
  3038         -  wxString str = colorCtrl->GetValue();
  3039         -  if (ColorMapEntry::IsValidColor(str) == true)
  3040         -    ColorMapEntry::GetWxColor(str, clr);
  3041         -  wxColour color = wxGetColourFromUser(this, clr);
  3042         -  if (color.IsOk() == true)
  3043         -    {
  3044         -      char hex[16];
  3045         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  3046         -      wxString str = wxString::FromUTF8(hex);
  3047         -      colorCtrl->SetValue(str);
  3048         -    }
  3049         -}
  3050         -
  3051         -
  3052         -
  3053         -
  3054         -
  3055         -bool QuickStyleTopologyDialog::RetrieveMainPage()
  3056         -{
  3057         -//
  3058         -// retrieving params from the MAIN page
  3059         -//
  3060         -  double min = Style->GetScaleMin();
  3061         -  double max = Style->GetScaleMax();
  3062         -  if (Style->IsMinScaleEnabled() == true)
  3063         -    {
  3064         -      wxTextCtrl *minCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MIN_SCALE);
  3065         -      wxString value = minCtrl->GetValue();
  3066         -      if (value.ToDouble(&min) != true)
  3067         -        {
  3068         -          wxMessageBox(wxT
  3069         -                       ("MIN_SCALE isn't a valid decimal number !!!"),
  3070         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3071         -          return false;
  3072         -        }
  3073         -      if (min < 0.0)
  3074         -        {
  3075         -          wxMessageBox(wxT
  3076         -                       ("MIN_SCALE must be a positive number !!!"),
  3077         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3078         -          return false;
  3079         -        }
  3080         -    }
  3081         -  if (Style->IsMaxScaleEnabled() == true)
  3082         -    {
  3083         -      wxTextCtrl *maxCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MAX_SCALE);
  3084         -      wxString value = maxCtrl->GetValue();
  3085         -      if (value.ToDouble(&max) != true)
  3086         -        {
  3087         -          wxMessageBox(wxT
  3088         -                       ("MAX_SCALE isn't a valid decimal number !!!"),
  3089         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3090         -          return false;
  3091         -        }
  3092         -      if (max < 0.0)
  3093         -        {
  3094         -          wxMessageBox(wxT
  3095         -                       ("MAX_SCALE must be a positive number !!!"),
  3096         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3097         -          return false;
  3098         -        }
  3099         -    }
  3100         -  if (Style->IsMinScaleEnabled() == true && Style->IsMaxScaleEnabled() == true)
  3101         -    {
  3102         -      if (min >= max)
  3103         -        {
  3104         -          wxMessageBox(wxT
  3105         -                       ("MAX_SCALE is always expected to be greater than MIN_SCALE !!!"),
  3106         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3107         -          return false;
  3108         -        }
  3109         -    }
  3110         -  Style->SetScaleMin(min);
  3111         -  Style->SetScaleMax(max);
  3112         -  return true;
  3113         -}
  3114         -
  3115         -void QuickStyleTopologyDialog::UpdateMainPage()
  3116         -{
  3117         -//
  3118         -// updating the MAIN page
  3119         -//
  3120         -  wxRadioBox *rangeBox = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_MINMAX_SCALE);
  3121         -  if (Style->IsMinScaleEnabled() != true && Style->IsMaxScaleEnabled() != true)
  3122         -    rangeBox->SetSelection(0);
  3123         -  else if (Style->IsMinScaleEnabled() == true
  3124         -           && Style->IsMaxScaleEnabled() != true)
  3125         -    rangeBox->SetSelection(1);
  3126         -  else if (Style->IsMinScaleEnabled() != true
  3127         -           && Style->IsMaxScaleEnabled() == true)
  3128         -    rangeBox->SetSelection(2);
  3129         -  else
  3130         -    rangeBox->SetSelection(3);
  3131         -  wxTextCtrl *minCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MIN_SCALE);
  3132         -  char dummy[64];
  3133         -  wxString str;
  3134         -  if (Style->IsMinScaleEnabled() == true)
  3135         -    {
  3136         -      sprintf(dummy, "%1.2f", Style->GetScaleMin());
  3137         -      str = wxString::FromUTF8(dummy);
  3138         -      minCtrl->SetValue(str);
  3139         -      minCtrl->Enable(true);
  3140         -  } else
  3141         -    {
  3142         -      str = wxT("0.0");
  3143         -      minCtrl->SetValue(str);
  3144         -      minCtrl->Enable(false);
  3145         -    }
  3146         -  wxTextCtrl *maxCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MAX_SCALE);
  3147         -  if (Style->IsMaxScaleEnabled() == true)
  3148         -    {
  3149         -      sprintf(dummy, "%1.2f", Style->GetScaleMax());
  3150         -      str = wxString::FromUTF8(dummy);
  3151         -      maxCtrl->SetValue(str);
  3152         -      maxCtrl->Enable(true);
  3153         -  } else
  3154         -    {
  3155         -      str = wxT("+Infinite");
  3156         -      maxCtrl->SetValue(str);
  3157         -      maxCtrl->Enable(false);
  3158         -    }
  3159         -}
  3160         -
  3161         -bool QuickStyleTopologyDialog::RetrieveNodePage(bool check)
  3162         -{
  3163         -//
  3164         -// retrieving params from the Node Nodeizer page
  3165         -//
  3166         -  double opacity;
  3167         -  double size;
  3168         -  double rotation;
  3169         -  double anchorNodeX;
  3170         -  double anchorNodeY;
  3171         -  double displacementX;
  3172         -  double displacementY;
  3173         -  char fillColor[8];
  3174         -  char strokeColor[8];
  3175         -  wxSlider *opacityCtrl = (wxSlider *) FindWindow(ID_SYMBOLIZER_NODE_OPACITY);
  3176         -  opacity = opacityCtrl->GetValue() / 100.0;
  3177         -  wxTextCtrl *sizeCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_SIZE);
  3178         -  wxString value = sizeCtrl->GetValue();
  3179         -  if (value.ToDouble(&size) != true)
  3180         -    {
  3181         -      if (check == true)
  3182         -        {
  3183         -          wxMessageBox(wxT
  3184         -                       ("SIZE isn't a valid decimal number !!!"),
  3185         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3186         -          return false;
  3187         -        }
  3188         -    }
  3189         -  if (size < 0.0)
  3190         -    {
  3191         -      if (check == true)
  3192         -        {
  3193         -          wxMessageBox(wxT
  3194         -                       ("SIZE must be a positive number !!!"),
  3195         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3196         -          return false;
  3197         -        }
  3198         -    }
  3199         -  wxTextCtrl *rotationCtrl =
  3200         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_ROTATION);
  3201         -  value = rotationCtrl->GetValue();
  3202         -  if (value.ToDouble(&rotation) != true)
  3203         -    {
  3204         -      if (check == true)
  3205         -        {
  3206         -          wxMessageBox(wxT
  3207         -                       ("ROTATION isn't a valid decimal number !!!"),
  3208         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3209         -          return false;
  3210         -        }
  3211         -    }
  3212         -  wxTextCtrl *anchorXCtrl =
  3213         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_ANCHOR_X);
  3214         -  value = anchorXCtrl->GetValue();
  3215         -  if (value.ToDouble(&anchorNodeX) != true)
  3216         -    {
  3217         -      if (check == true)
  3218         -        {
  3219         -          wxMessageBox(wxT
  3220         -                       ("ANCHOR-POINT-X isn't a valid decimal number !!!"),
  3221         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3222         -          return false;
  3223         -        }
  3224         -    }
  3225         -  if (anchorNodeX < 0.0 || anchorNodeX > 1.0)
  3226         -    {
  3227         -      if (check == true)
  3228         -        {
  3229         -          wxMessageBox(wxT
  3230         -                       ("ANCHOR-POINT-X must be between 0.0 and 1.0 !!!"),
  3231         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3232         -          return false;
  3233         -        }
  3234         -    }
  3235         -  wxTextCtrl *anchorYCtrl =
  3236         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_ANCHOR_Y);
  3237         -  value = anchorYCtrl->GetValue();
  3238         -  if (value.ToDouble(&anchorNodeY) != true)
  3239         -    {
  3240         -      if (check == true)
  3241         -        {
  3242         -          wxMessageBox(wxT
  3243         -                       ("ANCHOR-POINT-Y isn't a valid decimal number !!!"),
  3244         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3245         -          return false;
  3246         -        }
  3247         -    }
  3248         -  if (anchorNodeY < 0.0 || anchorNodeY > 1.0)
  3249         -    {
  3250         -      if (check == true)
  3251         -        {
  3252         -          wxMessageBox(wxT
  3253         -                       ("ANCHOR-POINT-Y must be between 0.0 and 1.0 !!!"),
  3254         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3255         -          return false;
  3256         -        }
  3257         -    }
  3258         -  wxTextCtrl *displXCtrl =
  3259         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_DISPLACEMENT_X);
  3260         -  value = displXCtrl->GetValue();
  3261         -  if (value.ToDouble(&displacementX) != true)
  3262         -    {
  3263         -      if (check == true)
  3264         -        {
  3265         -          wxMessageBox(wxT
  3266         -                       ("DISPLACEMENT-X isn't a valid decimal number !!!"),
  3267         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3268         -          return false;
  3269         -        }
  3270         -    }
  3271         -  wxTextCtrl *displYCtrl =
  3272         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_DISPLACEMENT_Y);
  3273         -  value = displYCtrl->GetValue();
  3274         -  if (value.ToDouble(&displacementY) != true)
  3275         -    {
  3276         -      if (check == true)
  3277         -        {
  3278         -          wxMessageBox(wxT
  3279         -                       ("DISPLACEMENT-Y isn't a valid decimal number !!!"),
  3280         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3281         -          return false;
  3282         -        }
  3283         -    }
  3284         -  wxTextCtrl *colorCtrl =
  3285         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_FILL_COLOR);
  3286         -  wxString color = colorCtrl->GetValue();
  3287         -  if (ColorMapEntry::IsValidColor(color) != true)
  3288         -    {
  3289         -      if (check == true)
  3290         -        {
  3291         -          wxMessageBox(wxT
  3292         -                       ("FILL-COLOR isn't a valid HexRGB color !!!"),
  3293         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3294         -          return false;
  3295         -        }
  3296         -    }
  3297         -  strcpy(fillColor, color.ToUTF8());
  3298         -  colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_STROKE_COLOR);
  3299         -  color = colorCtrl->GetValue();
  3300         -  if (ColorMapEntry::IsValidColor(color) != true)
  3301         -    {
  3302         -      if (check == true)
  3303         -        {
  3304         -          wxMessageBox(wxT
  3305         -                       ("STROKE-COLOR isn't a valid HexRGB color !!!"),
  3306         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3307         -          return false;
  3308         -        }
  3309         -    }
  3310         -  strcpy(strokeColor, color.ToUTF8());
  3311         -  Style->SetNodeOpacity(opacity);
  3312         -  Style->SetNodeSize(size);
  3313         -  Style->SetNodeRotation(rotation);
  3314         -  Style->SetNodeAnchorX(anchorNodeX);
  3315         -  Style->SetNodeAnchorY(anchorNodeY);
  3316         -  Style->SetNodeDisplacementX(displacementX);
  3317         -  Style->SetNodeDisplacementY(displacementY);
  3318         -  Style->SetNodeFillColor(fillColor);
  3319         -  Style->SetNodeStrokeColor(strokeColor);
  3320         -  return true;
  3321         -}
  3322         -
  3323         -void QuickStyleTopologyDialog::UpdateNodePage()
  3324         -{
  3325         -//
  3326         -// updating the Node Nodeizer page
  3327         -//
  3328         -  wxSlider *opacityCtrl = (wxSlider *) FindWindow(ID_SYMBOLIZER_NODE_OPACITY);
  3329         -  opacityCtrl->SetValue(Style->GetNodeOpacity() * 100.0);
  3330         -  wxTextCtrl *sizeCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_SIZE);
  3331         -  char dummy[64];
  3332         -  sprintf(dummy, "%1.2f", Style->GetNodeSize());
  3333         -  wxString str = wxString::FromUTF8(dummy);
  3334         -  sizeCtrl->SetValue(str);
  3335         -  wxTextCtrl *rotationCtrl =
  3336         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_ROTATION);
  3337         -  sprintf(dummy, "%1.2f", Style->GetNodeRotation());
  3338         -  str = wxString::FromUTF8(dummy);
  3339         -  rotationCtrl->SetValue(str);
  3340         -  wxTextCtrl *anchorXCtrl =
  3341         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_ANCHOR_X);
  3342         -  sprintf(dummy, "%1.2f", Style->GetNodeAnchorX());
  3343         -  str = wxString::FromUTF8(dummy);
  3344         -  anchorXCtrl->SetValue(str);
  3345         -  wxTextCtrl *anchorYCtrl =
  3346         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_ANCHOR_Y);
  3347         -  sprintf(dummy, "%1.2f", Style->GetNodeAnchorY());
  3348         -  str = wxString::FromUTF8(dummy);
  3349         -  anchorYCtrl->SetValue(str);
  3350         -  wxTextCtrl *displXCtrl =
  3351         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_DISPLACEMENT_X);
  3352         -  sprintf(dummy, "%1.2f", Style->GetNodeDisplacementX());
  3353         -  str = wxString::FromUTF8(dummy);
  3354         -  displXCtrl->SetValue(str);
  3355         -  wxTextCtrl *displYCtrl =
  3356         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_DISPLACEMENT_Y);
  3357         -  sprintf(dummy, "%1.2f", Style->GetNodeDisplacementY());
  3358         -  str = wxString::FromUTF8(dummy);
  3359         -  displYCtrl->SetValue(str);
  3360         -  wxRadioBox *markCtrl = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_NODE_MARK);
  3361         -  switch (Style->GetNodeWellKnownMark())
  3362         -    {
  3363         -      case RL2_GRAPHIC_MARK_CIRCLE:
  3364         -        markCtrl->SetSelection(1);
  3365         -        break;
  3366         -      case RL2_GRAPHIC_MARK_TRIANGLE:
  3367         -        markCtrl->SetSelection(2);
  3368         -        break;
  3369         -      case RL2_GRAPHIC_MARK_STAR:
  3370         -        markCtrl->SetSelection(3);
  3371         -        break;
  3372         -      case RL2_GRAPHIC_MARK_CROSS:
  3373         -        markCtrl->SetSelection(4);
  3374         -        break;
  3375         -      case RL2_GRAPHIC_MARK_X:
  3376         -        markCtrl->SetSelection(5);
  3377         -        break;
  3378         -      default:
  3379         -        markCtrl->SetSelection(0);
  3380         -        break;
  3381         -    };
  3382         -  wxTextCtrl *colorFillCtrl =
  3383         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_FILL_COLOR);
  3384         -  wxString fillColor = wxString::FromUTF8(Style->GetNodeFillColor());
  3385         -  colorFillCtrl->SetValue(fillColor);
  3386         -  wxTextCtrl *colorStrokeCtrl =
  3387         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_NODE_STROKE_COLOR);
  3388         -  wxString strokeColor = wxString::FromUTF8(Style->GetNodeStrokeColor());
  3389         -  colorStrokeCtrl->SetValue(strokeColor);
  3390         -}
  3391         -
  3392         -bool QuickStyleTopologyDialog::RetrieveEdgeLinkPage(bool check)
  3393         -{
  3394         -//
  3395         -// retrieving params from the EdgeLink Symbolizer page
  3396         -//
  3397         -  double opacity;
  3398         -  double perpendicularOffset;
  3399         -  char strokeColor[8];
  3400         -  double strokeWidth;
  3401         -  wxSlider *opacityCtrl =
  3402         -    (wxSlider *) FindWindow(ID_SYMBOLIZER_STROKE1_OPACITY);
  3403         -  opacity = opacityCtrl->GetValue() / 100.0;
  3404         -  wxTextCtrl *perpCtrl =
  3405         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_PERPENDICULAR);
  3406         -  wxString value = perpCtrl->GetValue();
  3407         -  if (value.ToDouble(&perpendicularOffset) != true)
  3408         -    {
  3409         -      if (check == true)
  3410         -        {
  3411         -          wxMessageBox(wxT
  3412         -                       ("PERPENDICULAR-OFFSET isn't a valid decimal number !!!"),
  3413         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3414         -          return false;
  3415         -        }
  3416         -    }
  3417         -  wxTextCtrl *colorCtrl =
  3418         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_COLOR);
  3419         -  wxString color = colorCtrl->GetValue();
  3420         -  if (ColorMapEntry::IsValidColor(color) != true)
  3421         -    {
  3422         -      if (check == true)
  3423         -        {
  3424         -          wxMessageBox(wxT
  3425         -                       ("STROKE-COLOR isn't a valid HexRGB color !!!"),
  3426         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3427         -          return false;
  3428         -        }
  3429         -    }
  3430         -  strcpy(strokeColor, color.ToUTF8());
  3431         -  wxTextCtrl *widthCtrl =
  3432         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_WIDTH);
  3433         -  value = widthCtrl->GetValue();
  3434         -  if (value.ToDouble(&strokeWidth) != true)
  3435         -    {
  3436         -      if (check == true)
  3437         -        {
  3438         -          wxMessageBox(wxT
  3439         -                       ("STROKE-WIDTH isn't a valid decimal number !!!"),
  3440         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3441         -          return false;
  3442         -        }
  3443         -    }
  3444         -  if (strokeWidth <= 0.0)
  3445         -    {
  3446         -      if (check == true)
  3447         -        {
  3448         -          wxMessageBox(wxT
  3449         -                       ("STROKE-WIDTH must be a positive number !!!"),
  3450         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3451         -          return false;
  3452         -        }
  3453         -    }
  3454         -  wxRadioBox *dotCtrl = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_DASH_DOT);
  3455         -  switch (dotCtrl->GetSelection())
  3456         -    {
  3457         -      case 1:
  3458         -        Style->SetEdgeLinkDotStyle(QUICK_STYLE_DOT_LINE);
  3459         -        break;
  3460         -      case 2:
  3461         -        Style->SetEdgeLinkDotStyle(QUICK_STYLE_DASH_LINE);
  3462         -        break;
  3463         -      case 3:
  3464         -        Style->SetEdgeLinkDotStyle(QUICK_STYLE_DASH_DOT_LINE);
  3465         -        break;
  3466         -      default:
  3467         -        Style->SetEdgeLinkDotStyle(QUICK_STYLE_SOLID_LINE);
  3468         -        break;
  3469         -    };
  3470         -  Style->SetEdgeLinkOpacity(opacity);
  3471         -  Style->SetEdgeLinkPerpendicularOffset(perpendicularOffset);
  3472         -  Style->SetEdgeLinkStrokeWidth(strokeWidth);
  3473         -  Style->SetEdgeLinkStrokeColor(strokeColor);
  3474         -  return true;
  3475         -}
  3476         -
  3477         -void QuickStyleTopologyDialog::UpdateEdgeLinkPage()
  3478         -{
  3479         -//
  3480         -// updating the EdgeLink Symbolizer page
  3481         -//
  3482         -  wxSlider *opacityCtrl =
  3483         -    (wxSlider *) FindWindow(ID_SYMBOLIZER_STROKE1_OPACITY);
  3484         -  opacityCtrl->SetValue(Style->GetEdgeLinkOpacity() * 100.0);
  3485         -  wxTextCtrl *perpCtrl =
  3486         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_PERPENDICULAR);
  3487         -  char dummy[64];
  3488         -  sprintf(dummy, "%1.2f", Style->GetEdgeLinkPerpendicularOffset());
  3489         -  wxString str = wxString::FromUTF8(dummy);
  3490         -  perpCtrl->SetValue(str);
  3491         -  wxTextCtrl *colorCtrl =
  3492         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_COLOR);
  3493         -  wxButton *pick = (wxButton *) FindWindow(ID_SYMBOLIZER_STROKE1_PICKER_BTN);
  3494         -  colorCtrl->Enable(true);
  3495         -  pick->Enable(true);
  3496         -  wxString strokeColor = wxString::FromUTF8(Style->GetEdgeLinkStrokeColor());
  3497         -  colorCtrl->SetValue(strokeColor);
  3498         -  wxTextCtrl *widthCtrl =
  3499         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_WIDTH);
  3500         -  sprintf(dummy, "%1.2f", Style->GetEdgeLinkStrokeWidth());
  3501         -  str = wxString::FromUTF8(dummy);
  3502         -  wxRadioBox *dotCtrl = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_DASH_DOT);
  3503         -  switch (Style->GetEdgeLinkDotStyle())
  3504         -    {
  3505         -      case QUICK_STYLE_DOT_LINE:
  3506         -        dotCtrl->SetSelection(1);
  3507         -        break;
  3508         -      case QUICK_STYLE_DASH_LINE:
  3509         -        dotCtrl->SetSelection(2);
  3510         -        break;
  3511         -      case QUICK_STYLE_DASH_DOT_LINE:
  3512         -        dotCtrl->SetSelection(3);
  3513         -        break;
  3514         -      default:
  3515         -        dotCtrl->SetSelection(0);
  3516         -        break;
  3517         -    };
  3518         -  widthCtrl->SetValue(str);
  3519         -}
  3520         -
  3521         -bool QuickStyleTopologyDialog::RetrieveFacePage(bool check)
  3522         -{
  3523         -//
  3524         -// retrieving params from the Face Synbolizer page
  3525         -//
  3526         -  double fillOpacity;
  3527         -  double displacementX;
  3528         -  double displacementY;
  3529         -  double perpendicularOffset;
  3530         -  char fillColor[8];
  3531         -  wxSlider *opacityCtrl = (wxSlider *) FindWindow(ID_SYMBOLIZER_FILL2_OPACITY);
  3532         -  fillOpacity = opacityCtrl->GetValue() / 100.0;
  3533         -  wxTextCtrl *displXCtrl =
  3534         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_POLYGON1_DISPLACEMENT_X);
  3535         -  wxString value = displXCtrl->GetValue();
  3536         -  if (Style->IsFaceFill() != true && Style->IsFaceStroke() != true)
  3537         -    {
  3538         -      if (check == true)
  3539         -        {
  3540         -          wxMessageBox(wxT
  3541         -                       ("You can't disable both FILL and STROKE at the same time !!!"),
  3542         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3543         -          return false;
  3544         -        }
  3545         -    }
  3546         -  if (value.ToDouble(&displacementX) != true)
  3547         -    {
  3548         -      if (check == true)
  3549         -        {
  3550         -          wxMessageBox(wxT
  3551         -                       ("DISPLACEMENT-X isn't a valid decimal number !!!"),
  3552         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3553         -          return false;
  3554         -        }
  3555         -    }
  3556         -  wxTextCtrl *displYCtrl =
  3557         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_POLYGON1_DISPLACEMENT_Y);
  3558         -  value = displYCtrl->GetValue();
  3559         -  if (value.ToDouble(&displacementY) != true)
  3560         -    {
  3561         -      if (check == true)
  3562         -        {
  3563         -          wxMessageBox(wxT
  3564         -                       ("DISPLACEMENT-Y isn't a valid decimal number !!!"),
  3565         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3566         -          return false;
  3567         -        }
  3568         -    }
  3569         -  wxTextCtrl *perpCtrl =
  3570         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_POLYGON1_PERPENDICULAR);
  3571         -  value = perpCtrl->GetValue();
  3572         -  if (value.ToDouble(&perpendicularOffset) != true)
  3573         -    {
  3574         -      if (check == true)
  3575         -        {
  3576         -          wxMessageBox(wxT
  3577         -                       ("PERPENDICULAR-OFFSET isn't a valid decimal number !!!"),
  3578         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3579         -          return false;
  3580         -        }
  3581         -    }
  3582         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FILL2_COLOR);
  3583         -  wxString color = colorCtrl->GetValue();
  3584         -  if (ColorMapEntry::IsValidColor(color) != true)
  3585         -    {
  3586         -      if (check == true)
  3587         -        {
  3588         -          wxMessageBox(wxT
  3589         -                       ("FILL-COLOR isn't a valid HexRGB color !!!"),
  3590         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3591         -          return false;
  3592         -        }
  3593         -    }
  3594         -  strcpy(fillColor, color.ToUTF8());
  3595         -  Style->SetFaceFillOpacity(fillOpacity);
  3596         -  Style->SetFaceDisplacementX(displacementX);
  3597         -  Style->SetFaceDisplacementY(displacementY);
  3598         -  Style->SetFacePerpendicularOffset(perpendicularOffset);
  3599         -  Style->SetFaceFillColor(fillColor);
  3600         -  return true;
  3601         -}
  3602         -
  3603         -void QuickStyleTopologyDialog::UpdateFacePage()
  3604         -{
  3605         -//
  3606         -// updating the Face Symbolizer page
  3607         -//
  3608         -  wxCheckBox *enableBox = (wxCheckBox *) FindWindow(ID_SYMBOLIZER_FILL2_ENABLE);
  3609         -  enableBox->SetValue(Style->IsFaceFill());
  3610         -  wxTextCtrl *displXCtrl =
  3611         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_POLYGON1_DISPLACEMENT_X);
  3612         -  char dummy[64];
  3613         -  sprintf(dummy, "%1.2f", Style->GetFaceDisplacementX());
  3614         -  wxString str = wxString::FromUTF8(dummy);
  3615         -  displXCtrl->SetValue(str);
  3616         -  wxTextCtrl *displYCtrl =
  3617         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_POLYGON1_DISPLACEMENT_Y);
  3618         -  sprintf(dummy, "%1.2f", Style->GetFaceDisplacementY());
  3619         -  str = wxString::FromUTF8(dummy);
  3620         -  displYCtrl->SetValue(str);
  3621         -  wxTextCtrl *perpCtrl =
  3622         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_POLYGON1_PERPENDICULAR);
  3623         -  sprintf(dummy, "%1.2f", Style->GetFacePerpendicularOffset());
  3624         -  str = wxString::FromUTF8(dummy);
  3625         -  perpCtrl->SetValue(str);
  3626         -  wxSlider *opacityCtrl = (wxSlider *) FindWindow(ID_SYMBOLIZER_FILL2_OPACITY);
  3627         -  opacityCtrl->SetValue(Style->GetFaceFillOpacity() * 100.0);
  3628         -  opacityCtrl->Enable(Style->IsFaceFill());
  3629         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FILL2_COLOR);
  3630         -  wxButton *pick = (wxButton *) FindWindow(ID_SYMBOLIZER_FILL2_PICKER_BTN);
  3631         -  wxColour color = wxNullColour;
  3632         -  str = wxString::FromUTF8(Style->GetFaceFillColor());
  3633         -  ColorMapEntry::GetWxColor(str, color);
  3634         -  if (color.IsOk() == true)
  3635         -    {
  3636         -      char hex[16];
  3637         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  3638         -      wxString str = wxString::FromUTF8(hex);
  3639         -      colorCtrl->SetValue(str);
  3640         -    }
  3641         -  colorCtrl->Enable(Style->IsFaceFill());
  3642         -  pick->Enable(Style->IsFaceFill());
  3643         -  wxSlider *opacity2Ctrl =
  3644         -    (wxSlider *) FindWindow(ID_SYMBOLIZER_STROKE2_OPACITY);
  3645         -  opacity2Ctrl->SetValue(Style->GetFaceStrokeOpacity() * 100.0);
  3646         -  opacity2Ctrl->Enable(Style->IsFaceStroke());
  3647         -  wxTextCtrl *color2Ctrl =
  3648         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE2_COLOR);
  3649         -  wxButton *pick2 = (wxButton *) FindWindow(ID_SYMBOLIZER_STROKE2_PICKER_BTN);
  3650         -  color = wxNullColour;
  3651         -  str = wxString::FromUTF8(Style->GetFaceStrokeColor());
  3652         -  ColorMapEntry::GetWxColor(str, color);
  3653         -  if (color.IsOk() == true)
  3654         -    {
  3655         -      char hex[16];
  3656         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  3657         -      wxString str = wxString::FromUTF8(hex);
  3658         -      color2Ctrl->SetValue(str);
  3659         -    }
  3660         -  color2Ctrl->Enable(Style->IsFaceStroke());
  3661         -  pick2->Enable(Style->IsFaceStroke());
  3662         -  wxTextCtrl *widthCtrl =
  3663         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE2_WIDTH);
  3664         -  sprintf(dummy, "%1.2f", Style->GetFaceStrokeWidth());
  3665         -  str = wxString::FromUTF8(dummy);
  3666         -  widthCtrl->SetValue(str);
  3667         -  widthCtrl->Enable(Style->IsFaceStroke());
  3668         -}
  3669         -
  3670         -bool QuickStyleTopologyDialog::RetrieveEdgeLinkSeedPage(bool check)
  3671         -{
  3672         -//
  3673         -// retrieving params from the EdgeLinkSeed EdgeLinkSeedizer page
  3674         -//
  3675         -  double opacity;
  3676         -  double size;
  3677         -  double rotation;
  3678         -  double anchorEdgeLinkSeedX;
  3679         -  double anchorEdgeLinkSeedY;
  3680         -  double displacementX;
  3681         -  double displacementY;
  3682         -  char fillColor[8];
  3683         -  char strokeColor[8];
  3684         -  wxSlider *opacityCtrl =
  3685         -    (wxSlider *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_OPACITY);
  3686         -  opacity = opacityCtrl->GetValue() / 100.0;
  3687         -  wxTextCtrl *sizeCtrl =
  3688         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_SIZE);
  3689         -  wxString value = sizeCtrl->GetValue();
  3690         -  if (value.ToDouble(&size) != true)
  3691         -    {
  3692         -      if (check == true)
  3693         -        {
  3694         -          wxMessageBox(wxT
  3695         -                       ("SIZE isn't a valid decimal number !!!"),
  3696         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3697         -          return false;
  3698         -        }
  3699         -    }
  3700         -  if (size < 0.0)
  3701         -    {
  3702         -      if (check == true)
  3703         -        {
  3704         -          wxMessageBox(wxT
  3705         -                       ("SIZE must be a positive number !!!"),
  3706         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3707         -          return false;
  3708         -        }
  3709         -    }
  3710         -  wxTextCtrl *rotationCtrl =
  3711         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_ROTATION);
  3712         -  value = rotationCtrl->GetValue();
  3713         -  if (value.ToDouble(&rotation) != true)
  3714         -    {
  3715         -      if (check == true)
  3716         -        {
  3717         -          wxMessageBox(wxT
  3718         -                       ("ROTATION isn't a valid decimal number !!!"),
  3719         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3720         -          return false;
  3721         -        }
  3722         -    }
  3723         -  wxTextCtrl *anchorXCtrl =
  3724         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_ANCHOR_X);
  3725         -  value = anchorXCtrl->GetValue();
  3726         -  if (value.ToDouble(&anchorEdgeLinkSeedX) != true)
  3727         -    {
  3728         -      if (check == true)
  3729         -        {
  3730         -          wxMessageBox(wxT
  3731         -                       ("ANCHOR-POINT-X isn't a valid decimal number !!!"),
  3732         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3733         -          return false;
  3734         -        }
  3735         -    }
  3736         -  if (anchorEdgeLinkSeedX < 0.0 || anchorEdgeLinkSeedX > 1.0)
  3737         -    {
  3738         -      if (check == true)
  3739         -        {
  3740         -          wxMessageBox(wxT
  3741         -                       ("ANCHOR-POINT-X must be between 0.0 and 1.0 !!!"),
  3742         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3743         -          return false;
  3744         -        }
  3745         -    }
  3746         -  wxTextCtrl *anchorYCtrl =
  3747         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_ANCHOR_Y);
  3748         -  value = anchorYCtrl->GetValue();
  3749         -  if (value.ToDouble(&anchorEdgeLinkSeedY) != true)
  3750         -    {
  3751         -      if (check == true)
  3752         -        {
  3753         -          wxMessageBox(wxT
  3754         -                       ("ANCHOR-POINT-Y isn't a valid decimal number !!!"),
  3755         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3756         -          return false;
  3757         -        }
  3758         -    }
  3759         -  if (anchorEdgeLinkSeedY < 0.0 || anchorEdgeLinkSeedY > 1.0)
  3760         -    {
  3761         -      if (check == true)
  3762         -        {
  3763         -          wxMessageBox(wxT
  3764         -                       ("ANCHOR-POINT-Y must be between 0.0 and 1.0 !!!"),
  3765         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3766         -          return false;
  3767         -        }
  3768         -    }
  3769         -  wxTextCtrl *displXCtrl =
  3770         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_DISPLACEMENT_X);
  3771         -  value = displXCtrl->GetValue();
  3772         -  if (value.ToDouble(&displacementX) != true)
  3773         -    {
  3774         -      if (check == true)
  3775         -        {
  3776         -          wxMessageBox(wxT
  3777         -                       ("DISPLACEMENT-X isn't a valid decimal number !!!"),
  3778         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3779         -          return false;
  3780         -        }
  3781         -    }
  3782         -  wxTextCtrl *displYCtrl =
  3783         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_DISPLACEMENT_Y);
  3784         -  value = displYCtrl->GetValue();
  3785         -  if (value.ToDouble(&displacementY) != true)
  3786         -    {
  3787         -      if (check == true)
  3788         -        {
  3789         -          wxMessageBox(wxT
  3790         -                       ("DISPLACEMENT-Y isn't a valid decimal number !!!"),
  3791         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3792         -          return false;
  3793         -        }
  3794         -    }
  3795         -  wxTextCtrl *colorCtrl =
  3796         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_FILL_COLOR);
  3797         -  wxString color = colorCtrl->GetValue();
  3798         -  if (ColorMapEntry::IsValidColor(color) != true)
  3799         -    {
  3800         -      if (check == true)
  3801         -        {
  3802         -          wxMessageBox(wxT
  3803         -                       ("FILL-COLOR isn't a valid HexRGB color !!!"),
  3804         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3805         -          return false;
  3806         -        }
  3807         -    }
  3808         -  strcpy(fillColor, color.ToUTF8());
  3809         -  colorCtrl =
  3810         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_STROKE_COLOR);
  3811         -  color = colorCtrl->GetValue();
  3812         -  if (ColorMapEntry::IsValidColor(color) != true)
  3813         -    {
  3814         -      if (check == true)
  3815         -        {
  3816         -          wxMessageBox(wxT
  3817         -                       ("STROKE-COLOR isn't a valid HexRGB color !!!"),
  3818         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3819         -          return false;
  3820         -        }
  3821         -    }
  3822         -  strcpy(strokeColor, color.ToUTF8());
  3823         -  Style->SetEdgeLinkSeedOpacity(opacity);
  3824         -  Style->SetEdgeLinkSeedSize(size);
  3825         -  Style->SetEdgeLinkSeedRotation(rotation);
  3826         -  Style->SetEdgeLinkSeedAnchorX(anchorEdgeLinkSeedX);
  3827         -  Style->SetEdgeLinkSeedAnchorY(anchorEdgeLinkSeedY);
  3828         -  Style->SetEdgeLinkSeedDisplacementX(displacementX);
  3829         -  Style->SetEdgeLinkSeedDisplacementY(displacementY);
  3830         -  Style->SetEdgeLinkSeedFillColor(fillColor);
  3831         -  Style->SetEdgeLinkSeedStrokeColor(strokeColor);
  3832         -  return true;
  3833         -}
  3834         -
  3835         -void QuickStyleTopologyDialog::UpdateEdgeLinkSeedPage()
  3836         -{
  3837         -//
  3838         -// updating the EdgeLinkSeed EdgeLinkSeedizer page
  3839         -//
  3840         -  wxSlider *opacityCtrl =
  3841         -    (wxSlider *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_OPACITY);
  3842         -  opacityCtrl->SetValue(Style->GetEdgeLinkSeedOpacity() * 100.0);
  3843         -  wxTextCtrl *sizeCtrl =
  3844         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_SIZE);
  3845         -  char dummy[64];
  3846         -  sprintf(dummy, "%1.2f", Style->GetEdgeLinkSeedSize());
  3847         -  wxString str = wxString::FromUTF8(dummy);
  3848         -  sizeCtrl->SetValue(str);
  3849         -  wxTextCtrl *rotationCtrl =
  3850         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_ROTATION);
  3851         -  sprintf(dummy, "%1.2f", Style->GetEdgeLinkSeedRotation());
  3852         -  str = wxString::FromUTF8(dummy);
  3853         -  rotationCtrl->SetValue(str);
  3854         -  wxTextCtrl *anchorXCtrl =
  3855         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_ANCHOR_X);
  3856         -  sprintf(dummy, "%1.2f", Style->GetEdgeLinkSeedAnchorX());
  3857         -  str = wxString::FromUTF8(dummy);
  3858         -  anchorXCtrl->SetValue(str);
  3859         -  wxTextCtrl *anchorYCtrl =
  3860         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_ANCHOR_Y);
  3861         -  sprintf(dummy, "%1.2f", Style->GetEdgeLinkSeedAnchorY());
  3862         -  str = wxString::FromUTF8(dummy);
  3863         -  anchorYCtrl->SetValue(str);
  3864         -  wxTextCtrl *displXCtrl =
  3865         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_DISPLACEMENT_X);
  3866         -  sprintf(dummy, "%1.2f", Style->GetEdgeLinkSeedDisplacementX());
  3867         -  str = wxString::FromUTF8(dummy);
  3868         -  displXCtrl->SetValue(str);
  3869         -  wxTextCtrl *displYCtrl =
  3870         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_DISPLACEMENT_Y);
  3871         -  sprintf(dummy, "%1.2f", Style->GetEdgeLinkSeedDisplacementY());
  3872         -  str = wxString::FromUTF8(dummy);
  3873         -  displYCtrl->SetValue(str);
  3874         -  wxRadioBox *markCtrl =
  3875         -    (wxRadioBox *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_MARK);
  3876         -  switch (Style->GetEdgeLinkSeedWellKnownMark())
  3877         -    {
  3878         -      case RL2_GRAPHIC_MARK_CIRCLE:
  3879         -        markCtrl->SetSelection(1);
  3880         -        break;
  3881         -      case RL2_GRAPHIC_MARK_TRIANGLE:
  3882         -        markCtrl->SetSelection(2);
  3883         -        break;
  3884         -      case RL2_GRAPHIC_MARK_STAR:
  3885         -        markCtrl->SetSelection(3);
  3886         -        break;
  3887         -      case RL2_GRAPHIC_MARK_CROSS:
  3888         -        markCtrl->SetSelection(4);
  3889         -        break;
  3890         -      case RL2_GRAPHIC_MARK_X:
  3891         -        markCtrl->SetSelection(5);
  3892         -        break;
  3893         -      default:
  3894         -        markCtrl->SetSelection(0);
  3895         -        break;
  3896         -    };
  3897         -  wxTextCtrl *colorFillCtrl =
  3898         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_FILL_COLOR);
  3899         -  wxString fillColor = wxString::FromUTF8(Style->GetEdgeLinkSeedFillColor());
  3900         -  colorFillCtrl->SetValue(fillColor);
  3901         -  wxTextCtrl *colorStrokeCtrl =
  3902         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_EDGELINK_SEED_STROKE_COLOR);
  3903         -  wxString strokeColor =
  3904         -    wxString::FromUTF8(Style->GetEdgeLinkSeedStrokeColor());
  3905         -  colorStrokeCtrl->SetValue(strokeColor);
  3906         -}
  3907         -
  3908         -bool QuickStyleTopologyDialog::RetrieveFaceSeedPage(bool check)
  3909         -{
  3910         -//
  3911         -// retrieving params from the FaceSeed FaceSeedizer page
  3912         -//
  3913         -  double opacity;
  3914         -  double size;
  3915         -  double rotation;
  3916         -  double anchorFaceSeedX;
  3917         -  double anchorFaceSeedY;
  3918         -  double displacementX;
  3919         -  double displacementY;
  3920         -  char fillColor[8];
  3921         -  char strokeColor[8];
  3922         -  wxSlider *opacityCtrl =
  3923         -    (wxSlider *) FindWindow(ID_SYMBOLIZER_FACE_SEED_OPACITY);
  3924         -  opacity = opacityCtrl->GetValue() / 100.0;
  3925         -  wxTextCtrl *sizeCtrl =
  3926         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_SIZE);
  3927         -  wxString value = sizeCtrl->GetValue();
  3928         -  if (value.ToDouble(&size) != true)
  3929         -    {
  3930         -      if (check == true)
  3931         -        {
  3932         -          wxMessageBox(wxT
  3933         -                       ("SIZE isn't a valid decimal number !!!"),
  3934         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3935         -          return false;
  3936         -        }
  3937         -    }
  3938         -  if (size < 0.0)
  3939         -    {
  3940         -      if (check == true)
  3941         -        {
  3942         -          wxMessageBox(wxT
  3943         -                       ("SIZE must be a positive number !!!"),
  3944         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3945         -          return false;
  3946         -        }
  3947         -    }
  3948         -  wxTextCtrl *rotationCtrl =
  3949         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_ROTATION);
  3950         -  value = rotationCtrl->GetValue();
  3951         -  if (value.ToDouble(&rotation) != true)
  3952         -    {
  3953         -      if (check == true)
  3954         -        {
  3955         -          wxMessageBox(wxT
  3956         -                       ("ROTATION isn't a valid decimal number !!!"),
  3957         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3958         -          return false;
  3959         -        }
  3960         -    }
  3961         -  wxTextCtrl *anchorXCtrl =
  3962         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_ANCHOR_X);
  3963         -  value = anchorXCtrl->GetValue();
  3964         -  if (value.ToDouble(&anchorFaceSeedX) != true)
  3965         -    {
  3966         -      if (check == true)
  3967         -        {
  3968         -          wxMessageBox(wxT
  3969         -                       ("ANCHOR-POINT-X isn't a valid decimal number !!!"),
  3970         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3971         -          return false;
  3972         -        }
  3973         -    }
  3974         -  if (anchorFaceSeedX < 0.0 || anchorFaceSeedX > 1.0)
  3975         -    {
  3976         -      if (check == true)
  3977         -        {
  3978         -          wxMessageBox(wxT
  3979         -                       ("ANCHOR-POINT-X must be between 0.0 and 1.0 !!!"),
  3980         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3981         -          return false;
  3982         -        }
  3983         -    }
  3984         -  wxTextCtrl *anchorYCtrl =
  3985         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_ANCHOR_Y);
  3986         -  value = anchorYCtrl->GetValue();
  3987         -  if (value.ToDouble(&anchorFaceSeedY) != true)
  3988         -    {
  3989         -      if (check == true)
  3990         -        {
  3991         -          wxMessageBox(wxT
  3992         -                       ("ANCHOR-POINT-Y isn't a valid decimal number !!!"),
  3993         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3994         -          return false;
  3995         -        }
  3996         -    }
  3997         -  if (anchorFaceSeedY < 0.0 || anchorFaceSeedY > 1.0)
  3998         -    {
  3999         -      if (check == true)
  4000         -        {
  4001         -          wxMessageBox(wxT
  4002         -                       ("ANCHOR-POINT-Y must be between 0.0 and 1.0 !!!"),
  4003         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4004         -          return false;
  4005         -        }
  4006         -    }
  4007         -  wxTextCtrl *displXCtrl =
  4008         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_DISPLACEMENT_X);
  4009         -  value = displXCtrl->GetValue();
  4010         -  if (value.ToDouble(&displacementX) != true)
  4011         -    {
  4012         -      if (check == true)
  4013         -        {
  4014         -          wxMessageBox(wxT
  4015         -                       ("DISPLACEMENT-X isn't a valid decimal number !!!"),
  4016         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4017         -          return false;
  4018         -        }
  4019         -    }
  4020         -  wxTextCtrl *displYCtrl =
  4021         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_DISPLACEMENT_Y);
  4022         -  value = displYCtrl->GetValue();
  4023         -  if (value.ToDouble(&displacementY) != true)
  4024         -    {
  4025         -      if (check == true)
  4026         -        {
  4027         -          wxMessageBox(wxT
  4028         -                       ("DISPLACEMENT-Y isn't a valid decimal number !!!"),
  4029         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4030         -          return false;
  4031         -        }
  4032         -    }
  4033         -  wxTextCtrl *colorCtrl =
  4034         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_FILL_COLOR);
  4035         -  wxString color = colorCtrl->GetValue();
  4036         -  if (ColorMapEntry::IsValidColor(color) != true)
  4037         -    {
  4038         -      if (check == true)
  4039         -        {
  4040         -          wxMessageBox(wxT
  4041         -                       ("FILL-COLOR isn't a valid HexRGB color !!!"),
  4042         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4043         -          return false;
  4044         -        }
  4045         -    }
  4046         -  strcpy(fillColor, color.ToUTF8());
  4047         -  colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_STROKE_COLOR);
  4048         -  color = colorCtrl->GetValue();
  4049         -  if (ColorMapEntry::IsValidColor(color) != true)
  4050         -    {
  4051         -      if (check == true)
  4052         -        {
  4053         -          wxMessageBox(wxT
  4054         -                       ("STROKE-COLOR isn't a valid HexRGB color !!!"),
  4055         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4056         -          return false;
  4057         -        }
  4058         -    }
  4059         -  strcpy(strokeColor, color.ToUTF8());
  4060         -  Style->SetFaceSeedOpacity(opacity);
  4061         -  Style->SetFaceSeedSize(size);
  4062         -  Style->SetFaceSeedRotation(rotation);
  4063         -  Style->SetFaceSeedAnchorX(anchorFaceSeedX);
  4064         -  Style->SetFaceSeedAnchorY(anchorFaceSeedY);
  4065         -  Style->SetFaceSeedDisplacementX(displacementX);
  4066         -  Style->SetFaceSeedDisplacementY(displacementY);
  4067         -  Style->SetFaceSeedFillColor(fillColor);
  4068         -  Style->SetFaceSeedStrokeColor(strokeColor);
  4069         -  return true;
  4070         -}
  4071         -
  4072         -void QuickStyleTopologyDialog::UpdateFaceSeedPage()
  4073         -{
  4074         -//
  4075         -// updating the FaceSeed FaceSeedizer page
  4076         -//
  4077         -  wxSlider *opacityCtrl =
  4078         -    (wxSlider *) FindWindow(ID_SYMBOLIZER_FACE_SEED_OPACITY);
  4079         -  opacityCtrl->SetValue(Style->GetFaceSeedOpacity() * 100.0);
  4080         -  wxTextCtrl *sizeCtrl =
  4081         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_SIZE);
  4082         -  char dummy[64];
  4083         -  sprintf(dummy, "%1.2f", Style->GetFaceSeedSize());
  4084         -  wxString str = wxString::FromUTF8(dummy);
  4085         -  sizeCtrl->SetValue(str);
  4086         -  wxTextCtrl *rotationCtrl =
  4087         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_ROTATION);
  4088         -  sprintf(dummy, "%1.2f", Style->GetFaceSeedRotation());
  4089         -  str = wxString::FromUTF8(dummy);
  4090         -  rotationCtrl->SetValue(str);
  4091         -  wxTextCtrl *anchorXCtrl =
  4092         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_ANCHOR_X);
  4093         -  sprintf(dummy, "%1.2f", Style->GetFaceSeedAnchorX());
  4094         -  str = wxString::FromUTF8(dummy);
  4095         -  anchorXCtrl->SetValue(str);
  4096         -  wxTextCtrl *anchorYCtrl =
  4097         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_ANCHOR_Y);
  4098         -  sprintf(dummy, "%1.2f", Style->GetFaceSeedAnchorY());
  4099         -  str = wxString::FromUTF8(dummy);
  4100         -  anchorYCtrl->SetValue(str);
  4101         -  wxTextCtrl *displXCtrl =
  4102         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_DISPLACEMENT_X);
  4103         -  sprintf(dummy, "%1.2f", Style->GetFaceSeedDisplacementX());
  4104         -  str = wxString::FromUTF8(dummy);
  4105         -  displXCtrl->SetValue(str);
  4106         -  wxTextCtrl *displYCtrl =
  4107         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_DISPLACEMENT_Y);
  4108         -  sprintf(dummy, "%1.2f", Style->GetFaceSeedDisplacementY());
  4109         -  str = wxString::FromUTF8(dummy);
  4110         -  displYCtrl->SetValue(str);
  4111         -  wxRadioBox *markCtrl =
  4112         -    (wxRadioBox *) FindWindow(ID_SYMBOLIZER_FACE_SEED_MARK);
  4113         -  switch (Style->GetFaceSeedWellKnownMark())
  4114         -    {
  4115         -      case RL2_GRAPHIC_MARK_CIRCLE:
  4116         -        markCtrl->SetSelection(1);
  4117         -        break;
  4118         -      case RL2_GRAPHIC_MARK_TRIANGLE:
  4119         -        markCtrl->SetSelection(2);
  4120         -        break;
  4121         -      case RL2_GRAPHIC_MARK_STAR:
  4122         -        markCtrl->SetSelection(3);
  4123         -        break;
  4124         -      case RL2_GRAPHIC_MARK_CROSS:
  4125         -        markCtrl->SetSelection(4);
  4126         -        break;
  4127         -      case RL2_GRAPHIC_MARK_X:
  4128         -        markCtrl->SetSelection(5);
  4129         -        break;
  4130         -      default:
  4131         -        markCtrl->SetSelection(0);
  4132         -        break;
  4133         -    };
  4134         -  wxTextCtrl *colorFillCtrl =
  4135         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_FILL_COLOR);
  4136         -  wxString fillColor = wxString::FromUTF8(Style->GetFaceSeedFillColor());
  4137         -  colorFillCtrl->SetValue(fillColor);
  4138         -  wxTextCtrl *colorStrokeCtrl =
  4139         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FACE_SEED_STROKE_COLOR);
  4140         -  wxString strokeColor = wxString::FromUTF8(Style->GetFaceSeedStrokeColor());
  4141         -  colorStrokeCtrl->SetValue(strokeColor);
  4142         -}
  4143         -
  4144         -void QuickStyleTopologyDialog::OnPageChanging(wxNotebookEvent & event)
  4145         -{
  4146         -//
  4147         -// TAB/PAGE selection changing
  4148         -//
  4149         -  bool ret = false;
  4150         -  int idx = event.GetOldSelection();
  4151         -  if (idx == 0)
  4152         -    ret = RetrieveMainPage();
  4153         -  else if (idx == 1)
  4154         -    ret = RetrieveNodePage();
  4155         -  else if (idx == 2)
  4156         -    ret = RetrieveEdgeLinkPage();
  4157         -  else
  4158         -    {
  4159         -      if (Type == MAP_LAYER_NETWORK)
  4160         -        {
  4161         -          if (idx == 3)
  4162         -            ret = RetrieveEdgeLinkSeedPage();
  4163         -      } else
  4164         -        {
  4165         -          if (idx == 3)
  4166         -            ret = RetrieveFacePage();
  4167         -          if (idx == 4)
  4168         -            ret = RetrieveEdgeLinkSeedPage();
  4169         -          if (idx == 5)
  4170         -            ret = RetrieveFaceSeedPage();
  4171         -        }
  4172         -    }
  4173         -  if (ret != true)
  4174         -    event.Veto();
  4175         -}
  4176         -
  4177         -void QuickStyleTopologyDialog::OnPageChanged(wxNotebookEvent & event)
  4178         -{
  4179         -//
  4180         -// TAB/PAGE selection changed
  4181         -//
  4182         -  int idx = event.GetSelection();
  4183         -  if (idx == 0)
  4184         -    UpdateMainPage();
  4185         -  else if (idx == 1)
  4186         -    UpdateNodePage();
  4187         -  else if (idx == 2)
  4188         -    UpdateEdgeLinkPage();
  4189         -  else
  4190         -    {
  4191         -      if (Type == MAP_LAYER_NETWORK)
  4192         -        {
  4193         -          if (idx == 3)
  4194         -            UpdateEdgeLinkSeedPage();
  4195         -      } else
  4196         -        {
  4197         -          if (idx == 3)
  4198         -            UpdateFacePage();
  4199         -          if (idx == 4)
  4200         -            UpdateEdgeLinkSeedPage();
  4201         -          if (idx == 5)
  4202         -            UpdateFaceSeedPage();
  4203         -        }
  4204         -    }
  4205         -}
  4206         -
  4207         -bool QuickStyleTopologyDialog::UpdateStyle()
  4208         -{
  4209         -//
  4210         -// updating the QuickStyle
  4211         -//
  4212         -  bool ret = false;
  4213         -  int idx = GetBookCtrl()->GetSelection();
  4214         -  if (idx == 0)
  4215         -    ret = RetrieveMainPage();
  4216         -  else if (idx == 1)
  4217         -    ret = RetrieveNodePage();
  4218         -  else if (idx == 2)
  4219         -    ret = RetrieveEdgeLinkPage();
  4220         -  else
  4221         -    {
  4222         -      if (Type == MAP_LAYER_NETWORK)
  4223         -        {
  4224         -          if (idx == 3)
  4225         -            ret = RetrieveEdgeLinkSeedPage();
  4226         -      } else
  4227         -        {
  4228         -          if (idx == 3)
  4229         -            ret = RetrieveFacePage();
  4230         -          if (idx == 4)
  4231         -            ret = RetrieveEdgeLinkSeedPage();
  4232         -          if (idx == 5)
  4233         -            ret = RetrieveFaceSeedPage();
  4234         -        }
  4235         -    }
  4236         -  if (ret == false)
  4237         -    return false;
  4238         -
  4239         -  VectorLayerConfig *config = Layer->GetVectorConfig();
  4240         -  bool setCurrentStyle = false;
  4241         -  if (config->GetStyle() == NULL)
  4242         -    setCurrentStyle = true;
  4243         -  else
  4244         -    {
  4245         -      if (strcmp(Style->GetUUID(), config->GetStyle()) != 0)
  4246         -        setCurrentStyle = true;
  4247         -    }
  4248         -  if (setCurrentStyle == true)
  4249         -    {
  4250         -      config->SetStyle(Style->GetUUID());
  4251         -      IsConfigChanged = true;
  4252         -    }
  4253         -  IsConfigChanged = Layer->UpdateQuickStyle(Style);
  4254         -  return true;
  4255         -}
  4256         -
  4257         -void QuickStyleTopologyDialog::OnOk(wxCommandEvent & WXUNUSED(event))
  4258         -{
  4259         -//
  4260         -// permanently saving the QuickStyle and quitting
  4261         -//
  4262         -  if (UpdateStyle() == true)
  4263         -    wxDialog::EndModal(wxID_OK);
  4264         -}
  4265         -
  4266         -void QuickStyleTopologyDialog::OnApply(wxCommandEvent & WXUNUSED(event))
  4267         -{
  4268         -//
  4269         -// applying the QuickStyle and continuing
  4270         -//
  4271         -  if (UpdateStyle() == true)
  4272         -    {
  4273         -      if (IsConfigChanged == true)
  4274         -        MapPanel->RefreshMap();
  4275         -    }
  4276         -}
  4277         -
  4278         -void QuickStyleTopologyDialog::OnExport(wxCommandEvent & WXUNUSED(event))
  4279         -{
  4280         -//
  4281         -// exporting the Quick Style as an external file
  4282         -//
  4283         -  bool xret = false;
  4284         -  int ret;
  4285         -  wxString path;
  4286         -  wxString lastDir;
  4287         -  int idx = GetBookCtrl()->GetSelection();
  4288         -  if (idx == 0)
  4289         -    xret = RetrieveMainPage();
  4290         -  else if (idx == 1)
  4291         -    xret = RetrieveNodePage();
  4292         -  else if (idx == 2)
  4293         -    xret = RetrieveEdgeLinkPage();
  4294         -  else
  4295         -    {
  4296         -      if (Type == MAP_LAYER_NETWORK)
  4297         -        {
  4298         -          if (idx == 3)
  4299         -            xret = RetrieveEdgeLinkSeedPage();
  4300         -      } else
  4301         -        {
  4302         -          if (idx == 3)
  4303         -            xret = RetrieveFacePage();
  4304         -          if (idx == 4)
  4305         -            xret = RetrieveEdgeLinkSeedPage();
  4306         -          if (idx == 5)
  4307         -            xret = RetrieveFaceSeedPage();
  4308         -        }
  4309         -    }
  4310         -  if (xret == false)
  4311         -    return;
  4312         -
  4313         -  wxFileDialog fileDialog(this,
  4314         -                          wxT("Exporting an SLD/SE QuickStyle to a file"),
  4315         -                          wxT(""), wxT("style.xml"),
  4316         -                          wxT("XML Document|*.xml|All files (*.*)|*.*"),
  4317         -                          wxFD_SAVE | wxFD_OVERWRITE_PROMPT, wxDefaultPosition,
  4318         -                          wxDefaultSize, wxT("filedlg"));
  4319         -  lastDir = MainFrame->GetLastDirectory();
  4320         -  if (lastDir.Len() >= 1)
  4321         -    fileDialog.SetDirectory(lastDir);
  4322         -  ret = fileDialog.ShowModal();
  4323         -  if (ret == wxID_OK)
  4324         -    {
  4325         -      wxFileName file(fileDialog.GetPath());
  4326         -      path = file.GetPath();
  4327         -      path += file.GetPathSeparator();
  4328         -      path += file.GetName();
  4329         -      lastDir = file.GetPath();
  4330         -      path = fileDialog.GetPath();
  4331         -      FILE *out = fopen(path.ToUTF8(), "wb");
  4332         -      if (out == NULL)
  4333         -        wxMessageBox(wxT("ERROR: unable to create:\n\n\"") + path + wxT("\""),
  4334         -                     wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
  4335         -      else
  4336         -        {
  4337         -          char *xml = Style->CreateXmlStyle();
  4338         -          fwrite(xml, 1, strlen(xml), out);
  4339         -          sqlite3_free(xml);
  4340         -          fclose(out);
  4341         -          wxMessageBox(wxT
  4342         -                       ("SLD/SE QuickStyle successfully saved into:\n\n\"")
  4343         -                       + path + wxT("\""), wxT("spatialite_gui"),
  4344         -                       wxOK | wxICON_INFORMATION, this);
  4345         -        }
  4346         -    }
  4347         -}
  4348         -
  4349         -void QuickStyleTopologyDialog::OnCopy(wxCommandEvent & WXUNUSED(event))
  4350         -{
  4351         -//
  4352         -// Copying the Quick Style into the Clipboard 
  4353         -//
  4354         -  bool ret = false;
  4355         -  int idx = GetBookCtrl()->GetSelection();
  4356         -  if (idx == 0)
  4357         -    ret = RetrieveMainPage();
  4358         -  else if (idx == 1)
  4359         -    ret = RetrieveNodePage();
  4360         -  else if (idx == 2)
  4361         -    ret = RetrieveEdgeLinkPage();
  4362         -  else
  4363         -    {
  4364         -      if (Type == MAP_LAYER_NETWORK)
  4365         -        {
  4366         -          if (idx == 3)
  4367         -            ret = RetrieveEdgeLinkSeedPage();
  4368         -      } else
  4369         -        {
  4370         -          if (idx == 3)
  4371         -            ret = RetrieveFacePage();
  4372         -          if (idx == 4)
  4373         -            ret = RetrieveEdgeLinkSeedPage();
  4374         -          if (idx == 5)
  4375         -            ret = RetrieveFaceSeedPage();
  4376         -        }
  4377         -    }
  4378         -  if (ret == false)
  4379         -    return;
  4380         -
  4381         -  char *xml = Style->CreateXmlStyle();
  4382         -  wxString XMLstring = wxString::FromUTF8(xml);
  4383         -  sqlite3_free(xml);
  4384         -  if (wxTheClipboard->Open())
  4385         -    {
  4386         -      wxTheClipboard->SetData(new wxTextDataObject(XMLstring));
  4387         -      wxTheClipboard->Close();
  4388         -    }
  4389         -}
  4390         -
  4391         -void QuickStyleTopologyDialog::OnQuit(wxCommandEvent & WXUNUSED(event))
  4392         -{
  4393         -//
  4394         -// all done: 
  4395         -//
  4396         -  wxDialog::EndModal(wxID_CANCEL);
  4397         -}

Deleted QuickStylesVector.cpp.

     1         -/*
     2         -/ QuickStylesVector.cpp
     3         -/ Quick Styles wizards (Vector layers)
     4         -/
     5         -/ version 2.0, 2017 May 26
     6         -/
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
     8         -/
     9         -/ Copyright (C) 2017  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/spinctrl.h"
    29         -#include "wx/imaglist.h"
    30         -#include "wx/colordlg.h"
    31         -#include "wx/filename.h"
    32         -#include "wx/clipbrd.h"
    33         -
    34         -QuickStyleObj::QuickStyleObj(int type)
    35         -{
    36         -// ctor
    37         -  DoGetUUID(UUID);
    38         -  Type = type;
    39         -  MinScaleEnabled = false;
    40         -  MaxScaleEnabled = false;
    41         -  ScaleMin = 0.0;
    42         -  ScaleMax = 0.0;
    43         -  SymbolOpacity = 1.0;
    44         -  SymbolSize = 16;
    45         -  SymbolRotation = 0.0;
    46         -  SymbolAnchorX = 0.5;
    47         -  SymbolAnchorY = 0.5;
    48         -  SymbolDisplacementX = 0.0;
    49         -  SymbolDisplacementY = 0.0;
    50         -  SymbolWellKnownMark = RandomWellKnownMark();
    51         -  RandomColor(SymbolFillColor);
    52         -  RandomColor(SymbolStrokeColor);
    53         -  LineOpacity = 1.0;
    54         -  LinePerpendicularOffset = 0.0;
    55         -  LineStrokeWidth = 1.0;
    56         -  RandomColor(LineStrokeColor);
    57         -  LineDotStyle = QUICK_STYLE_SOLID_LINE;
    58         -  PolygonFill = true;
    59         -  PolygonStroke = true;
    60         -  PolygonDisplacementX = 0.0;
    61         -  PolygonDisplacementY = 0.0;
    62         -  PolygonPerpendicularOffset = 0.0;
    63         -  PolygonFillOpacity = 1.0;
    64         -  RandomColor(PolygonFillColor);
    65         -  PolygonStrokeOpacity = 1.0;
    66         -  PolygonStrokeWidth = 1.0;
    67         -  RandomColor(PolygonStrokeColor);
    68         -  LabelLinePlacement = true;
    69         -  LabelPrint = false;
    70         -  LabelColumn = NULL;
    71         -  FontFacename = NULL;
    72         -  FontSize = 10.0;
    73         -  FontStyle = RL2_FONTSTYLE_NORMAL;
    74         -  FontWeight = RL2_FONTWEIGHT_NORMAL;
    75         -  FontOpacity = 1.0;
    76         -  strcpy(FontColor, "#000000");
    77         -  HasHalo = false;
    78         -  HaloRadius = 1.0;
    79         -  HaloOpacity = 1.0;
    80         -  strcpy(HaloColor, "#ffffff");
    81         -  LabelAnchorX = 0.5;
    82         -  LabelAnchorY = 0.5;
    83         -  LabelDisplacementX = 0.0;
    84         -  LabelDisplacementY = 0.0;
    85         -  LabelRotation = 0.0;
    86         -  LabelPerpendicularOffset = 0.0;
    87         -  RepeatedLabel = false;
    88         -  LabelInitialGap = 0.0;
    89         -  LabelGap = 0.0;
    90         -  LabelIsAligned = false;
    91         -  LabelGeneralizeLine = false;
    92         -  XmlStyle = NULL;
    93         -}
    94         -
    95         -QuickStyleObj *QuickStyleObj::Clone()
    96         -{
    97         -//
    98         -// cloning a Quick Style
    99         -//
   100         -  QuickStyleObj *Style = new QuickStyleObj(this->Type);
   101         -  strcpy(Style->UUID, this->UUID);
   102         -  Style->MinScaleEnabled = this->MinScaleEnabled;
   103         -  Style->MaxScaleEnabled = this->MaxScaleEnabled;
   104         -  Style->ScaleMin = this->ScaleMin;
   105         -  Style->ScaleMax = this->ScaleMax;
   106         -  Style->SymbolOpacity = this->SymbolOpacity;
   107         -  Style->SymbolSize = this->SymbolSize;
   108         -  Style->SymbolRotation = this->SymbolRotation;
   109         -  Style->SymbolAnchorX = this->SymbolAnchorX;
   110         -  Style->SymbolAnchorY = this->SymbolAnchorY;
   111         -  Style->SymbolDisplacementX = this->SymbolDisplacementX;
   112         -  Style->SymbolDisplacementY = this->SymbolDisplacementY;
   113         -  Style->SymbolWellKnownMark = this->SymbolWellKnownMark;
   114         -  strcpy(Style->SymbolFillColor, this->SymbolFillColor);
   115         -  strcpy(Style->SymbolStrokeColor, this->SymbolStrokeColor);
   116         -  Style->LineOpacity = this->LineOpacity;
   117         -  Style->LinePerpendicularOffset = this->LinePerpendicularOffset;
   118         -  Style->LineStrokeWidth = this->LineStrokeWidth;
   119         -  strcpy(Style->LineStrokeColor, this->LineStrokeColor);
   120         -  Style->LineDotStyle = this->LineDotStyle;
   121         -  Style->PolygonFill = this->PolygonFill;
   122         -  Style->PolygonStroke = this->PolygonStroke;
   123         -  Style->PolygonDisplacementX = this->PolygonDisplacementX;
   124         -  Style->PolygonDisplacementY = this->PolygonDisplacementY;
   125         -  Style->PolygonPerpendicularOffset = this->PolygonPerpendicularOffset;
   126         -  Style->PolygonFillOpacity = this->PolygonFillOpacity;
   127         -  strcpy(Style->PolygonFillColor, this->PolygonFillColor);
   128         -  Style->PolygonStrokeOpacity = this->PolygonStrokeOpacity;
   129         -  Style->PolygonStrokeWidth = this->PolygonStrokeWidth;
   130         -  strcpy(Style->PolygonStrokeColor, this->PolygonStrokeColor);
   131         -  Style->LabelLinePlacement = this->LabelLinePlacement;
   132         -  Style->LabelPrint = this->LabelPrint;
   133         -  if (this->LabelColumn == NULL)
   134         -    Style->LabelColumn = NULL;
   135         -  else
   136         -    {
   137         -      int len = strlen(this->LabelColumn);
   138         -      Style->LabelColumn = (char *) malloc(len + 1);
   139         -      strcpy(Style->LabelColumn, this->LabelColumn);
   140         -    }
   141         -  if (this->FontFacename == NULL)
   142         -    Style->FontFacename = NULL;
   143         -  else
   144         -    {
   145         -      int len = strlen(this->FontFacename);
   146         -      Style->FontFacename = (char *) malloc(len + 1);
   147         -      strcpy(Style->FontFacename, this->FontFacename);
   148         -    }
   149         -  Style->FontSize = this->FontSize;
   150         -  Style->FontStyle = this->FontStyle;
   151         -  Style->FontWeight = this->FontWeight;
   152         -  Style->FontOpacity = this->FontOpacity;
   153         -  strcpy(Style->FontColor, this->FontColor);
   154         -  Style->HasHalo = this->HasHalo;
   155         -  Style->HaloRadius = this->HaloRadius;
   156         -  Style->HaloOpacity = this->HaloOpacity;
   157         -  strcpy(Style->HaloColor, this->HaloColor);
   158         -  Style->LabelAnchorX = this->LabelAnchorX;
   159         -  Style->LabelAnchorY = this->LabelAnchorY;
   160         -  Style->LabelDisplacementX = this->LabelDisplacementX;
   161         -  Style->LabelDisplacementY = this->LabelDisplacementY;
   162         -  Style->LabelRotation = this->LabelRotation;
   163         -  Style->LabelPerpendicularOffset = this->LabelPerpendicularOffset;
   164         -  Style->RepeatedLabel = this->RepeatedLabel;
   165         -  Style->LabelInitialGap = this->LabelInitialGap;
   166         -  Style->LabelGap = this->LabelGap;
   167         -  Style->LabelIsAligned = this->LabelIsAligned;
   168         -  Style->LabelGeneralizeLine = this->LabelGeneralizeLine;
   169         -  Style->XmlStyle = NULL;
   170         -  return Style;
   171         -}
   172         -
   173         -bool QuickStyleObj::Compare(QuickStyleObj * Style)
   174         -{
   175         -//
   176         -// comparing two Quick Style objects
   177         -//
   178         -  if (Style == NULL)
   179         -    return false;
   180         -  if (strcmp(Style->UUID, this->UUID) != 0)
   181         -    return false;
   182         -  if (Style->MinScaleEnabled != this->MinScaleEnabled)
   183         -    return false;
   184         -  if (Style->MaxScaleEnabled != this->MaxScaleEnabled)
   185         -    return false;
   186         -  if (Style->ScaleMin != this->ScaleMin)
   187         -    return false;
   188         -  if (Style->ScaleMax != this->ScaleMax)
   189         -    return false;
   190         -  if (Style->SymbolOpacity != this->SymbolOpacity)
   191         -    return false;
   192         -  if (Style->SymbolSize != this->SymbolSize)
   193         -    return false;
   194         -  if (Style->SymbolRotation != this->SymbolRotation)
   195         -    return false;
   196         -  if (Style->SymbolAnchorX != this->SymbolAnchorX)
   197         -    return false;
   198         -  if (Style->SymbolAnchorY != this->SymbolAnchorY)
   199         -    return false;
   200         -  if (Style->SymbolDisplacementX != this->SymbolDisplacementX)
   201         -    return false;
   202         -  if (Style->SymbolDisplacementY != this->SymbolDisplacementY)
   203         -    return false;
   204         -  if (Style->SymbolWellKnownMark != this->SymbolWellKnownMark)
   205         -    return false;
   206         -  if (strcmp(Style->SymbolFillColor, this->SymbolFillColor) != 0)
   207         -    return false;
   208         -  if (strcmp(Style->SymbolStrokeColor, this->SymbolStrokeColor) != 0)
   209         -    return false;
   210         -  if (Style->LineOpacity != this->LineOpacity)
   211         -    return false;
   212         -  if (Style->LinePerpendicularOffset != this->LinePerpendicularOffset)
   213         -    return false;
   214         -  if (Style->LineStrokeWidth != this->LineStrokeWidth)
   215         -    return false;
   216         -  if (strcmp(Style->LineStrokeColor, this->LineStrokeColor) != 0)
   217         -    return false;
   218         -  if (Style->LineDotStyle != this->LineDotStyle)
   219         -    return false;
   220         -  if (Style->PolygonFill != this->PolygonFill)
   221         -    return false;
   222         -  if (Style->PolygonStroke != this->PolygonStroke)
   223         -    return false;
   224         -  if (Style->PolygonDisplacementX != this->PolygonDisplacementX)
   225         -    return false;
   226         -  if (Style->PolygonDisplacementY != this->PolygonDisplacementY)
   227         -    return false;
   228         -  if (Style->PolygonPerpendicularOffset != this->PolygonPerpendicularOffset)
   229         -    return false;
   230         -  if (Style->PolygonFillOpacity != this->PolygonFillOpacity)
   231         -    return false;
   232         -  if (strcmp(Style->PolygonFillColor, this->PolygonFillColor) != 0)
   233         -    return false;
   234         -  if (Style->PolygonStrokeOpacity != this->PolygonStrokeOpacity)
   235         -    return false;
   236         -  if (Style->PolygonStrokeWidth != this->PolygonStrokeWidth)
   237         -    return false;
   238         -  if (strcmp(Style->PolygonStrokeColor, this->PolygonStrokeColor) != 0)
   239         -    return false;
   240         -  if (Style->LabelLinePlacement != this->LabelLinePlacement)
   241         -    return false;
   242         -  if (Style->LabelPrint != this->LabelPrint)
   243         -    return false;
   244         -  if (Style->LabelColumn == NULL && this->LabelColumn == NULL)
   245         -    ;
   246         -  else if (Style->LabelColumn == NULL && this->LabelColumn != NULL)
   247         -    return false;
   248         -  else if (Style->LabelColumn != NULL && this->LabelColumn == NULL)
   249         -    return false;
   250         -  else if (strcmp(Style->LabelColumn, this->LabelColumn) != 0)
   251         -    return false;
   252         -  if (Style->FontFacename == NULL && this->FontFacename == NULL)
   253         -    ;
   254         -  else if (Style->FontFacename == NULL && this->FontFacename != NULL)
   255         -    return false;
   256         -  else if (Style->FontFacename != NULL && this->FontFacename == NULL)
   257         -    return false;
   258         -  else if (strcmp(Style->FontFacename, this->FontFacename) != 0)
   259         -    return false;
   260         -  if (Style->FontSize != this->FontSize)
   261         -    return false;
   262         -  if (Style->FontStyle != this->FontStyle)
   263         -    return false;
   264         -  if (Style->FontWeight != this->FontWeight)
   265         -    return false;
   266         -  if (Style->FontOpacity != this->FontOpacity)
   267         -    return false;
   268         -  if (strcmp(Style->FontColor, this->FontColor) != 0)
   269         -    return false;
   270         -  if (Style->HasHalo != this->HasHalo)
   271         -    return false;
   272         -  if (Style->HaloRadius != this->HaloRadius)
   273         -    return false;
   274         -  if (Style->HaloOpacity != this->HaloOpacity)
   275         -    return false;
   276         -  if (strcmp(Style->HaloColor, this->HaloColor) != 0)
   277         -    return false;
   278         -  if (Style->LabelAnchorX != this->LabelAnchorX)
   279         -    return false;
   280         -  if (Style->LabelAnchorY != this->LabelAnchorY)
   281         -    return false;
   282         -  if (Style->LabelDisplacementX != this->LabelDisplacementX)
   283         -    return false;
   284         -  if (Style->LabelDisplacementY != this->LabelDisplacementY)
   285         -    return false;
   286         -  if (Style->LabelRotation != this->LabelRotation)
   287         -    return false;
   288         -  if (Style->LabelPerpendicularOffset != this->LabelPerpendicularOffset)
   289         -    return false;
   290         -  if (Style->RepeatedLabel != this->RepeatedLabel)
   291         -    return false;
   292         -  if (Style->LabelInitialGap != this->LabelInitialGap)
   293         -    return false;
   294         -  if (Style->LabelGap != this->LabelGap)
   295         -    return false;
   296         -  if (Style->LabelIsAligned != this->LabelIsAligned)
   297         -    return false;
   298         -  if (Style->LabelGeneralizeLine != this->LabelGeneralizeLine)
   299         -    return false;
   300         -  return true;
   301         -}
   302         -
   303         -void QuickStyleObj::SetLabelColumn(const char *x)
   304         -{
   305         -//
   306         -// setting the Label Column
   307         -//
   308         -  int len;
   309         -  if (LabelColumn != NULL)
   310         -    free(LabelColumn);
   311         -  LabelColumn = NULL;
   312         -  if (x == NULL)
   313         -    return;
   314         -  len = strlen(x);
   315         -  LabelColumn = (char *) malloc(len + 1);
   316         -  strcpy(LabelColumn, x);
   317         -}
   318         -
   319         -void QuickStyleObj::SetFontFacename(const char *x)
   320         -{
   321         -//
   322         -// setting the Font Facename
   323         -//
   324         -  int len;
   325         -  if (FontFacename != NULL)
   326         -    free(FontFacename);
   327         -  FontFacename = NULL;
   328         -  if (x == NULL)
   329         -    return;
   330         -  len = strlen(x);
   331         -  FontFacename = (char *) malloc(len + 1);
   332         -  strcpy(FontFacename, x);
   333         -}
   334         -
   335         -void QuickStyleObj::UpdateXmlStyle()
   336         -{
   337         -//
   338         -// updating the XML Style
   339         -//
   340         -  if (XmlStyle != NULL)
   341         -    sqlite3_free(XmlStyle);
   342         -  XmlStyle = CreateXmlStyle();
   343         -}
   344         -
   345         -char *QuickStyleObj::CreateXmlStyle()
   346         -{
   347         -//
   348         -// creating the XML Style
   349         -//
   350         -  char *xml;
   351         -  if ((MinScaleEnabled == true || MaxScaleEnabled == true) || LabelPrint == true
   352         -      || Type == QUICK_STYLE_GEOMETRY)
   353         -    xml = DoCreateFeatureTypeXML();
   354         -  else
   355         -    xml = DoCreateSymbolizerXML(false);
   356         -  return xml;
   357         -
   358         -}
   359         -
   360         -char *QuickStyleObj::DoCreateFeatureTypeXML()
   361         -{
   362         -//
   363         -// creating a FeatureType XML Style
   364         -//
   365         -  char *prev;
   366         -  char *xml2;
   367         -  char *xml = sqlite3_mprintf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
   368         -  prev = xml;
   369         -  xml = sqlite3_mprintf("%s<FeatureTypeStyle version=\"1.1.0\" ", prev);
   370         -  sqlite3_free(prev);
   371         -  prev = xml;
   372         -  xml =
   373         -    sqlite3_mprintf
   374         -    ("%sxsi:schemaLocation=\"http://www.opengis.net/se http://schemas.opengis.net/se/1.1.0/FeatureStyle.xsd\" ",
   375         -     prev);
   376         -  sqlite3_free(prev);
   377         -  prev = xml;
   378         -  xml = sqlite3_mprintf
   379         -    ("%sxmlns=\"http://www.opengis.net/se\" xmlns:ogc=\"http://www.opengis.net/ogc\" ",
   380         -     prev);
   381         -  sqlite3_free(prev);
   382         -  prev = xml;
   383         -  xml =
   384         -    sqlite3_mprintf("%sxmlns:xlink=\"http://www.w3.org/1999/xlink\" ", prev);
   385         -  sqlite3_free(prev);
   386         -  prev = xml;
   387         -  xml =
   388         -    sqlite3_mprintf
   389         -    ("%sxmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\r\n", prev);
   390         -  sqlite3_free(prev);
   391         -  prev = xml;
   392         -  xml = sqlite3_mprintf("%s\t<Name>%s</Name>\r\n", prev, UUID);
   393         -  sqlite3_free(prev);
   394         -  prev = xml;
   395         -  xml = sqlite3_mprintf("%s\t<Description>\r\n", prev);
   396         -  sqlite3_free(prev);
   397         -  prev = xml;
   398         -  xml = sqlite3_mprintf("%s\t\t<Title>%s</Title>\r\n", prev, "Quick Style");
   399         -  sqlite3_free(prev);
   400         -  prev = xml;
   401         -  xml =
   402         -    sqlite3_mprintf("%s\t\t<Abstract>%s</Abstract>\r\n", prev,
   403         -                    "Created by SpatialiteGUI");
   404         -  sqlite3_free(prev);
   405         -  prev = xml;
   406         -  xml = sqlite3_mprintf("%s\t</Description>\r\n", prev);
   407         -  sqlite3_free(prev);
   408         -  prev = xml;
   409         -  xml = sqlite3_mprintf("%s\t<Rule>\r\n", prev);
   410         -  sqlite3_free(prev);
   411         -  prev = xml;
   412         -  if (MinScaleEnabled == true)
   413         -    {
   414         -      xml =
   415         -        sqlite3_mprintf
   416         -        ("%s\t\t<MinScaleDenominator>%1.2f</MinScaleDenominator>\r\n", prev,
   417         -         ScaleMin);
   418         -      sqlite3_free(prev);
   419         -      prev = xml;
   420         -    }
   421         -  if (MaxScaleEnabled == true)
   422         -    {
   423         -      xml =
   424         -        sqlite3_mprintf
   425         -        ("%s\t\t<MaxScaleDenominator>%1.2f</MaxScaleDenominator>\r\n", prev,
   426         -         ScaleMax);
   427         -      sqlite3_free(prev);
   428         -      prev = xml;
   429         -    }
   430         -  xml2 = NULL;
   431         -  if (Type == QUICK_STYLE_POINT)
   432         -    xml2 = DoCreatePointSymbolizerXML(true);
   433         -  if (Type == QUICK_STYLE_LINE)
   434         -    xml2 = DoCreateLineSymbolizerXML(true);
   435         -  if (Type == QUICK_STYLE_POLYGON)
   436         -    xml2 = DoCreatePolygonSymbolizerXML(true);
   437         -  else
   438         -    {
   439         -      // mixed-type Symbolizers
   440         -      xml2 = DoCreatePointSymbolizerXML(true);
   441         -      if (xml2 != NULL)
   442         -        {
   443         -          xml = sqlite3_mprintf("%s%s", prev, xml2);
   444         -          sqlite3_free(prev);
   445         -          sqlite3_free(xml2);
   446         -          prev = xml;
   447         -        }
   448         -      xml2 = DoCreateLineSymbolizerXML(true);
   449         -      if (xml2 != NULL)
   450         -        {
   451         -          xml = sqlite3_mprintf("%s%s", prev, xml2);
   452         -          sqlite3_free(prev);
   453         -          sqlite3_free(xml2);
   454         -          prev = xml;
   455         -        }
   456         -      xml2 = DoCreatePolygonSymbolizerXML(true);
   457         -      if (xml2 != NULL)
   458         -        {
   459         -          xml = sqlite3_mprintf("%s%s", prev, xml2);
   460         -          sqlite3_free(prev);
   461         -          sqlite3_free(xml2);
   462         -          xml2 = NULL;
   463         -          prev = xml;
   464         -        }
   465         -    }
   466         -  if (xml2 != NULL)
   467         -    {
   468         -      xml = sqlite3_mprintf("%s%s", prev, xml2);
   469         -      sqlite3_free(prev);
   470         -      sqlite3_free(xml2);
   471         -      prev = xml;
   472         -    }
   473         -  if (LabelPrint == true)
   474         -    {
   475         -      // adding a Text Symbolizer
   476         -      xml2 = NULL;
   477         -      if (Type == QUICK_STYLE_POINT || Type == QUICK_STYLE_POLYGON)
   478         -        xml2 = DoCreateTextPointSymbolizerXML();
   479         -      if (Type == QUICK_STYLE_LINE)
   480         -        xml2 = DoCreateTextLineSymbolizerXML();
   481         -      if (xml2 != NULL)
   482         -        {
   483         -          xml = sqlite3_mprintf("%s%s", prev, xml2);
   484         -          sqlite3_free(prev);
   485         -          sqlite3_free(xml2);
   486         -          prev = xml;
   487         -        }
   488         -    }
   489         -  xml = sqlite3_mprintf("%s\t</Rule>\r\n</FeatureTypeStyle>\r\n", prev);
   490         -  sqlite3_free(prev);
   491         -  return xml;
   492         -}
   493         -
   494         -char *QuickStyleObj::DoCreateSymbolizerXML(bool subordered)
   495         -{
   496         -//
   497         -// creating a Symbolizer XML Style
   498         -//
   499         -  if (Type == QUICK_STYLE_POINT)
   500         -    return DoCreatePointSymbolizerXML(subordered);
   501         -  if (Type == QUICK_STYLE_LINE)
   502         -    return DoCreateLineSymbolizerXML(subordered);
   503         -  if (Type == QUICK_STYLE_POLYGON)
   504         -    return DoCreatePolygonSymbolizerXML(subordered);
   505         -  return NULL;
   506         -}
   507         -
   508         -char *QuickStyleObj::DoCreatePointSymbolizerXML(bool subordered)
   509         -{
   510         -//
   511         -// creating a Point Symbolizer XML Style
   512         -//
   513         -  const char *cstr;
   514         -  char *prev;
   515         -  const char *extra = "";
   516         -  char *xml = sqlite3_mprintf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
   517         -  if (subordered == true)
   518         -    {
   519         -      extra = "\t\t";
   520         -      sqlite3_free(xml);
   521         -      prev = (char *) "";
   522         -      xml = sqlite3_mprintf("%s%s<PointSymbolizer>\r\n", prev, extra);
   523         -  } else
   524         -    {
   525         -      prev = xml;
   526         -      xml = sqlite3_mprintf("%s<PointSymbolizer version=\"1.1.0\" ", prev);
   527         -      sqlite3_free(prev);
   528         -      prev = xml;
   529         -      xml =
   530         -        sqlite3_mprintf
   531         -        ("%sxsi:schemaLocation=\"http://www.opengis.net/se http://schemas.opengis.net/se/1.1.0/Symbolizer.xsd\" ",
   532         -         prev);
   533         -      sqlite3_free(prev);
   534         -      prev = xml;
   535         -      xml = sqlite3_mprintf
   536         -        ("%sxmlns=\"http://www.opengis.net/se\" xmlns:ogc=\"http://www.opengis.net/ogc\" ",
   537         -         prev);
   538         -      sqlite3_free(prev);
   539         -      prev = xml;
   540         -      xml =
   541         -        sqlite3_mprintf("%sxmlns:xlink=\"http://www.w3.org/1999/xlink\" ",
   542         -                        prev);
   543         -      sqlite3_free(prev);
   544         -      prev = xml;
   545         -      cstr = "http://www.opengeospatial.org/se/units/pixel";
   546         -      xml =
   547         -        sqlite3_mprintf
   548         -        ("%sxmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" uom=\"%s\">\r\n",
   549         -         prev, cstr);
   550         -      sqlite3_free(prev);
   551         -    }
   552         -  prev = xml;
   553         -  if (subordered != true)
   554         -    {
   555         -      xml = sqlite3_mprintf("%s\t<Name>%s</Name>\r\n", prev, UUID);
   556         -      sqlite3_free(prev);
   557         -      prev = xml;
   558         -      xml = sqlite3_mprintf("%s\t<Description>\r\n", prev);
   559         -      sqlite3_free(prev);
   560         -      prev = xml;
   561         -      xml =
   562         -        sqlite3_mprintf("%s\t\t<Title>%s</Title>\r\n", prev,
   563         -                        "Quick Style - PointSymbolizer");
   564         -      sqlite3_free(prev);
   565         -      prev = xml;
   566         -      xml =
   567         -        sqlite3_mprintf("%s\t\t<Abstract>%s</Abstract>\r\n", prev,
   568         -                        "Created by SpatialiteGUI");
   569         -      sqlite3_free(prev);
   570         -      prev = xml;
   571         -      xml = sqlite3_mprintf("%s\t</Description>\r\n", prev);
   572         -      sqlite3_free(prev);
   573         -      prev = xml;
   574         -    }
   575         -  xml = sqlite3_mprintf("%s%s\t<Graphic>\r\n", prev, extra);
   576         -  sqlite3_free(prev);
   577         -  prev = xml;
   578         -// mark symbol
   579         -  xml = sqlite3_mprintf("%s%s\t\t<Mark>\r\n", prev, extra);
   580         -  sqlite3_free(prev);
   581         -  prev = xml;
   582         -  switch (SymbolWellKnownMark)
   583         -    {
   584         -      case RL2_GRAPHIC_MARK_CIRCLE:
   585         -        cstr = "circle";
   586         -        break;
   587         -      case RL2_GRAPHIC_MARK_TRIANGLE:
   588         -        cstr = "triangle";
   589         -        break;
   590         -      case RL2_GRAPHIC_MARK_STAR:
   591         -        cstr = "star";
   592         -        break;
   593         -      case RL2_GRAPHIC_MARK_CROSS:
   594         -        cstr = "cross";
   595         -        break;
   596         -      case RL2_GRAPHIC_MARK_X:
   597         -        cstr = "x";
   598         -        break;
   599         -      default:
   600         -        cstr = "square";
   601         -        break;
   602         -    };
   603         -  xml =
   604         -    sqlite3_mprintf("%s%s\t\t\t<WellKnownName>%s</WellKnownName>\r\n", prev,
   605         -                    extra, cstr);
   606         -  sqlite3_free(prev);
   607         -  prev = xml;
   608         -// Mark Fill
   609         -  xml = sqlite3_mprintf("%s%s\t\t\t<Fill>\r\n", prev, extra);
   610         -  sqlite3_free(prev);
   611         -  prev = xml;
   612         -  xml =
   613         -    sqlite3_mprintf
   614         -    ("%s%s\t\t\t\t<SvgParameter name=\"fill\">%s</SvgParameter>\r\n",
   615         -     prev, extra, SymbolFillColor);
   616         -  sqlite3_free(prev);
   617         -  prev = xml;
   618         -  xml = sqlite3_mprintf("%s%s\t\t\t</Fill>\r\n", prev, extra);
   619         -  sqlite3_free(prev);
   620         -  prev = xml;
   621         -// Mark Stroke
   622         -  xml = sqlite3_mprintf("%s%s\t\t\t<Stroke>\r\n", prev, extra);
   623         -  sqlite3_free(prev);
   624         -  prev = xml;
   625         -  xml =
   626         -    sqlite3_mprintf
   627         -    ("%s%s\t\t\t\t<SvgParameter name=\"stroke\">%s</SvgParameter>\r\n",
   628         -     prev, extra, SymbolStrokeColor);
   629         -  sqlite3_free(prev);
   630         -  prev = xml;
   631         -  xml =
   632         -    sqlite3_mprintf
   633         -    ("%s%s\t\t\t\t<SvgParameter name=\"stroke-width\">%1.2f</SvgParameter>\r\n",
   634         -     prev, extra, 1.0);
   635         -  sqlite3_free(prev);
   636         -  prev = xml;
   637         -  xml =
   638         -    sqlite3_mprintf
   639         -    ("%s%s\t\t\t\t<SvgParameter name=\"stroke-linejoin\">round</SvgParameter>\r\n",
   640         -     prev, extra);
   641         -  sqlite3_free(prev);
   642         -  prev = xml;
   643         -  xml =
   644         -    sqlite3_mprintf
   645         -    ("%s%s\t\t\t\t<SvgParameter name=\"stroke-linecap\">round</SvgParameter>\r\n",
   646         -     prev, extra);
   647         -  sqlite3_free(prev);
   648         -  prev = xml;
   649         -  xml = sqlite3_mprintf("%s%s\t\t\t</Stroke>\r\n", prev, extra);
   650         -  sqlite3_free(prev);
   651         -  prev = xml;
   652         -  xml = sqlite3_mprintf("%s%s\t\t</Mark>\r\n", prev, extra);
   653         -  sqlite3_free(prev);
   654         -  prev = xml;
   655         -  if (SymbolOpacity != 1.0)
   656         -    {
   657         -      xml =
   658         -        sqlite3_mprintf("%s%s\t\t<Opacity>%1.2f</Opacity>\r\n", prev, extra,
   659         -                        SymbolOpacity);
   660         -      sqlite3_free(prev);
   661         -      prev = xml;
   662         -    }
   663         -  xml =
   664         -    sqlite3_mprintf("%s%s\t\t<Size>%1.2f</Size>\r\n", prev, extra, SymbolSize);
   665         -  sqlite3_free(prev);
   666         -  prev = xml;
   667         -  if (SymbolRotation != 0.0)
   668         -    {
   669         -      xml =
   670         -        sqlite3_mprintf("%s%s\t\t<Rotation>%1.2f</Rotation>\r\n", prev, extra,
   671         -                        SymbolRotation);
   672         -      sqlite3_free(prev);
   673         -      prev = xml;
   674         -    }
   675         -  if (SymbolAnchorX != 0.5 || SymbolAnchorY != 0.5)
   676         -    {
   677         -      xml = sqlite3_mprintf("%s%s\t\t<AnchorPoint>\r\n", prev, extra);
   678         -      sqlite3_free(prev);
   679         -      prev = xml;
   680         -      xml =
   681         -        sqlite3_mprintf("%s%s\t\t\t<AnchorPointX>%1.4f</AnchorPointX>\r\n",
   682         -                        prev, extra, SymbolAnchorX);
   683         -      sqlite3_free(prev);
   684         -      prev = xml;
   685         -      xml =
   686         -        sqlite3_mprintf("%s%s\t\t\t<AnchorPointY>%1.4f</AnchorPointY>\r\n",
   687         -                        prev, extra, SymbolAnchorY);
   688         -      sqlite3_free(prev);
   689         -      prev = xml;
   690         -      xml = sqlite3_mprintf("%s%s\t\t</AnchorPoint>\r\n", prev, extra);
   691         -      sqlite3_free(prev);
   692         -      prev = xml;
   693         -    }
   694         -  if (SymbolDisplacementX != 0.0 || SymbolDisplacementY != 0.0)
   695         -    {
   696         -      xml = sqlite3_mprintf("%s%s\t\t<Displacement>\r\n", prev, extra);
   697         -      sqlite3_free(prev);
   698         -      prev = xml;
   699         -      xml =
   700         -        sqlite3_mprintf("%s%s\t\t\t<DisplacementX>%1.4f</DisplacementX>\r\n",
   701         -                        prev, extra, SymbolDisplacementX);
   702         -      sqlite3_free(prev);
   703         -      prev = xml;
   704         -      xml =
   705         -        sqlite3_mprintf("%s%s\t\t\t<DisplacementY>%1.4f</DisplacementY>\r\n",
   706         -                        prev, extra, SymbolDisplacementY);
   707         -      sqlite3_free(prev);
   708         -      prev = xml;
   709         -      xml = sqlite3_mprintf("%s%s\t\t</Displacement>\r\n", prev, extra);
   710         -      sqlite3_free(prev);
   711         -      prev = xml;
   712         -    }
   713         -  xml = sqlite3_mprintf("%s%s\t</Graphic>\r\n", prev, extra);
   714         -  sqlite3_free(prev);
   715         -  prev = xml;
   716         -  xml = sqlite3_mprintf("%s%s</PointSymbolizer>\r\n", prev, extra);
   717         -  sqlite3_free(prev);
   718         -  return xml;
   719         -}
   720         -
   721         -char *QuickStyleObj::DoCreateLineSymbolizerXML(bool subordered)
   722         -{
   723         -//
   724         -// creating a Line Symbolizer XML Style
   725         -//
   726         -  const char *cstr;
   727         -  char *prev;
   728         -  const char *extra = "";
   729         -  char *xml = sqlite3_mprintf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
   730         -  prev = xml;
   731         -  if (subordered == true)
   732         -    {
   733         -      extra = "\t\t";
   734         -      sqlite3_free(xml);
   735         -      prev = (char *) "";
   736         -      xml = sqlite3_mprintf("%s%s<LineSymbolizer>\r\n", prev, extra);
   737         -  } else
   738         -    {
   739         -      xml = sqlite3_mprintf("%s<LineSymbolizer version=\"1.1.0\" ", prev);
   740         -      sqlite3_free(prev);
   741         -      prev = xml;
   742         -      xml =
   743         -        sqlite3_mprintf
   744         -        ("%sxsi:schemaLocation=\"http://www.opengis.net/se http://schemas.opengis.net/se/1.1.0/Symbolizer.xsd\" ",
   745         -         prev);
   746         -      sqlite3_free(prev);
   747         -      prev = xml;
   748         -      xml = sqlite3_mprintf
   749         -        ("%sxmlns=\"http://www.opengis.net/se\" xmlns:ogc=\"http://www.opengis.net/ogc\" ",
   750         -         prev);
   751         -      sqlite3_free(prev);
   752         -      prev = xml;
   753         -      xml =
   754         -        sqlite3_mprintf("%sxmlns:xlink=\"http://www.w3.org/1999/xlink\" ",
   755         -                        prev);
   756         -      sqlite3_free(prev);
   757         -      prev = xml;
   758         -      cstr = "http://www.opengeospatial.org/se/units/pixel";
   759         -      xml =
   760         -        sqlite3_mprintf
   761         -        ("%sxmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" uom=\"%s\">\r\n",
   762         -         prev, cstr);
   763         -      sqlite3_free(prev);
   764         -    }
   765         -  prev = xml;
   766         -  if (subordered != true)
   767         -    {
   768         -      xml = sqlite3_mprintf("%s\t<Name>%s</Name>\r\n", prev, UUID);
   769         -      sqlite3_free(prev);
   770         -      prev = xml;
   771         -      xml = sqlite3_mprintf("%s\t<Description>\r\n", prev);
   772         -      sqlite3_free(prev);
   773         -      prev = xml;
   774         -      xml =
   775         -        sqlite3_mprintf("%s\t\t<Title>%s</Title>\r\n", prev,
   776         -                        "Quick Style - LineSymbolizer");
   777         -      sqlite3_free(prev);
   778         -      prev = xml;
   779         -      xml =
   780         -        sqlite3_mprintf("%s\t\t<Abstract>%s</Abstract>\r\n", prev,
   781         -                        "Created by SpatialiteGUI");
   782         -      sqlite3_free(prev);
   783         -      prev = xml;
   784         -      xml = sqlite3_mprintf("%s\t</Description>\r\n", prev);
   785         -      sqlite3_free(prev);
   786         -      prev = xml;
   787         -    }
   788         -  xml = sqlite3_mprintf("%s%s\t<Stroke>\r\n", prev, extra);
   789         -  sqlite3_free(prev);
   790         -  prev = xml;
   791         -// using a Solid Color
   792         -  xml =
   793         -    sqlite3_mprintf
   794         -    ("%s%s\t\t<SvgParameter name=\"stroke\">%s</SvgParameter>\r\n", prev, extra,
   795         -     LineStrokeColor);
   796         -  sqlite3_free(prev);
   797         -  prev = xml;
   798         -  xml =
   799         -    sqlite3_mprintf
   800         -    ("%s%s\t\t<SvgParameter name=\"stroke-opacity\">%1.2f</SvgParameter>\r\n",
   801         -     prev, extra, LineOpacity);
   802         -  sqlite3_free(prev);
   803         -  prev = xml;
   804         -  xml =
   805         -    sqlite3_mprintf
   806         -    ("%s%s\t\t<SvgParameter name=\"stroke-width\">%1.2f</SvgParameter>\r\n",
   807         -     prev, extra, LineStrokeWidth);
   808         -  sqlite3_free(prev);
   809         -  prev = xml;
   810         -  xml =
   811         -    sqlite3_mprintf
   812         -    ("%s%s\t\t<SvgParameter name=\"stroke-linejoin\">round</SvgParameter>\r\n",
   813         -     prev, extra);
   814         -  sqlite3_free(prev);
   815         -  prev = xml;
   816         -  xml =
   817         -    sqlite3_mprintf
   818         -    ("%s%s\t\t<SvgParameter name=\"stroke-linecap\">round</SvgParameter>\r\n",
   819         -     prev, extra);
   820         -  sqlite3_free(prev);
   821         -  prev = xml;
   822         -  const char *dashArray;
   823         -  switch (LineDotStyle)
   824         -    {
   825         -      case QUICK_STYLE_DOT_LINE:
   826         -        dashArray = "5.0, 10.0";
   827         -        break;
   828         -      case QUICK_STYLE_DASH_LINE:
   829         -        dashArray = "20.0, 20.0";
   830         -        break;
   831         -      case QUICK_STYLE_DASH_DOT_LINE:
   832         -        dashArray = "20.0, 10.0, 5.0, 10.0";
   833         -        break;
   834         -      default:
   835         -        dashArray = NULL;
   836         -        break;
   837         -    };
   838         -  if (dashArray != NULL)
   839         -    {
   840         -      xml =
   841         -        sqlite3_mprintf
   842         -        ("%s%s\t\t<SvgParameter name=\"stroke-dasharray\">%s</SvgParameter>\r\n",
   843         -         prev, extra, dashArray);
   844         -      sqlite3_free(prev);
   845         -      prev = xml;
   846         -    }
   847         -  xml = sqlite3_mprintf("%s%s\t</Stroke>\r\n", prev, extra);
   848         -  sqlite3_free(prev);
   849         -  prev = xml;
   850         -  if (LinePerpendicularOffset != 0.0)
   851         -    {
   852         -      xml =
   853         -        sqlite3_mprintf
   854         -        ("%s%s\t<PerpendicularOffset>%1.2f</PerpendicularOffset>\r\n", prev,
   855         -         extra, LinePerpendicularOffset);
   856         -      sqlite3_free(prev);
   857         -      prev = xml;
   858         -    }
   859         -  xml = sqlite3_mprintf("%s%s</LineSymbolizer>\r\n", prev, extra);
   860         -  sqlite3_free(prev);
   861         -  return xml;
   862         -}
   863         -
   864         -char *QuickStyleObj::DoCreatePolygonSymbolizerXML(bool subordered)
   865         -{
   866         -//
   867         -// creating a Polygon Symbolizer XML Style
   868         -//
   869         -  const char *cstr;
   870         -  char *prev;
   871         -  const char *extra = "";
   872         -  char *xml = sqlite3_mprintf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
   873         -  prev = xml;
   874         -  if (subordered == true)
   875         -    {
   876         -      extra = "\t\t";
   877         -      sqlite3_free(xml);
   878         -      prev = (char *) "";
   879         -      xml = sqlite3_mprintf("%s%s<PolygonSymbolizer>\r\n", prev, extra);
   880         -  } else
   881         -    {
   882         -      xml = sqlite3_mprintf("%s<PolygonSymbolizer version=\"1.1.0\" ", prev);
   883         -      sqlite3_free(prev);
   884         -      prev = xml;
   885         -      xml =
   886         -        sqlite3_mprintf
   887         -        ("%sxsi:schemaLocation=\"http://www.opengis.net/se http://schemas.opengis.net/se/1.1.0/Symbolizer.xsd\" ",
   888         -         prev);
   889         -      sqlite3_free(prev);
   890         -      prev = xml;
   891         -      xml = sqlite3_mprintf
   892         -        ("%sxmlns=\"http://www.opengis.net/se\" xmlns:ogc=\"http://www.opengis.net/ogc\" ",
   893         -         prev);
   894         -      sqlite3_free(prev);
   895         -      prev = xml;
   896         -      xml =
   897         -        sqlite3_mprintf("%sxmlns:xlink=\"http://www.w3.org/1999/xlink\" ",
   898         -                        prev);
   899         -      sqlite3_free(prev);
   900         -      prev = xml;
   901         -      cstr = "http://www.opengeospatial.org/se/units/pixel";
   902         -      xml =
   903         -        sqlite3_mprintf
   904         -        ("%sxmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" uom=\"%s\">\r\n",
   905         -         prev, cstr);
   906         -      sqlite3_free(prev);
   907         -    }
   908         -  prev = xml;
   909         -  if (subordered != true)
   910         -    {
   911         -      xml = sqlite3_mprintf("%s\t<Name>%s</Name>\r\n", prev, UUID);
   912         -      sqlite3_free(prev);
   913         -      prev = xml;
   914         -      xml = sqlite3_mprintf("%s\t<Description>\r\n", prev);
   915         -      sqlite3_free(prev);
   916         -      prev = xml;
   917         -      xml =
   918         -        sqlite3_mprintf("%s\t\t<Title>%s</Title>\r\n", prev,
   919         -                        "Quick Style - Polygon Symbolizer");
   920         -      sqlite3_free(prev);
   921         -      prev = xml;
   922         -      xml =
   923         -        sqlite3_mprintf("%s\t\t<Abstract>%s</Abstract>\r\n", prev,
   924         -                        "Created by SpatialiteGUI");
   925         -      sqlite3_free(prev);
   926         -      prev = xml;
   927         -      xml = sqlite3_mprintf("%s\t</Description>\r\n", prev);
   928         -      sqlite3_free(prev);
   929         -      prev = xml;
   930         -    }
   931         -  if (PolygonFill == true)
   932         -    {
   933         -      // Polygon Fill
   934         -      xml = sqlite3_mprintf("%s%s\t<Fill>\r\n", prev, extra);
   935         -      sqlite3_free(prev);
   936         -      prev = xml;
   937         -      // using a Solid Color
   938         -      xml =
   939         -        sqlite3_mprintf
   940         -        ("%s%s\t\t<SvgParameter name=\"fill\">%s</SvgParameter>\r\n", prev,
   941         -         extra, PolygonFillColor);
   942         -      sqlite3_free(prev);
   943         -      prev = xml;
   944         -      xml =
   945         -        sqlite3_mprintf
   946         -        ("%s%s\t\t<SvgParameter name=\"fill-opacity\">%1.2f</SvgParameter>\r\n",
   947         -         prev, extra, PolygonFillOpacity);
   948         -      sqlite3_free(prev);
   949         -      prev = xml;
   950         -      xml = sqlite3_mprintf("%s%s\t</Fill>\r\n", prev, extra);
   951         -      sqlite3_free(prev);
   952         -      prev = xml;
   953         -    }
   954         -  if (PolygonStroke == true)
   955         -    {
   956         -      // Polygon Stroke
   957         -      xml = sqlite3_mprintf("%s%s\t<Stroke>\r\n", prev, extra);
   958         -      sqlite3_free(prev);
   959         -      prev = xml;
   960         -      // using a Solid Color
   961         -      xml =
   962         -        sqlite3_mprintf
   963         -        ("%s%s\t\t<SvgParameter name=\"stroke\">%s</SvgParameter>\r\n", prev,
   964         -         extra, PolygonStrokeColor);
   965         -      sqlite3_free(prev);
   966         -      prev = xml;
   967         -      xml =
   968         -        sqlite3_mprintf
   969         -        ("%s%s\t\t<SvgParameter name=\"stroke-opacity\">%1.2f</SvgParameter>\r\n",
   970         -         prev, extra, PolygonStrokeOpacity);
   971         -      sqlite3_free(prev);
   972         -      prev = xml;
   973         -      xml =
   974         -        sqlite3_mprintf
   975         -        ("%s%s\t\t<SvgParameter name=\"stroke-width\">%1.2f</SvgParameter>\r\n",
   976         -         prev, extra, PolygonStrokeWidth);
   977         -      sqlite3_free(prev);
   978         -      prev = xml;
   979         -      xml =
   980         -        sqlite3_mprintf
   981         -        ("%s%s\t\t<SvgParameter name=\"stroke-linejoin\">round</SvgParameter>\r\n",
   982         -         prev, extra);
   983         -      sqlite3_free(prev);
   984         -      prev = xml;
   985         -      xml =
   986         -        sqlite3_mprintf
   987         -        ("%s%s\t\t<SvgParameter name=\"stroke-linecap\">round</SvgParameter>\r\n",
   988         -         prev, extra);
   989         -      sqlite3_free(prev);
   990         -      prev = xml;
   991         -      xml = sqlite3_mprintf("%s%s\t</Stroke>\r\n", prev, extra);
   992         -      sqlite3_free(prev);
   993         -      prev = xml;
   994         -    }
   995         -  if (PolygonDisplacementX != 0.0 || PolygonDisplacementY != 0.0)
   996         -    {
   997         -      xml = sqlite3_mprintf("%s%s\t<Displacement>\r\n", prev, extra);
   998         -      sqlite3_free(prev);
   999         -      prev = xml;
  1000         -      xml =
  1001         -        sqlite3_mprintf("%s%s\t\t<DisplacementX>%1.4f</DisplacementX>\r\n",
  1002         -                        prev, extra, PolygonDisplacementX);
  1003         -      sqlite3_free(prev);
  1004         -      prev = xml;
  1005         -      xml =
  1006         -        sqlite3_mprintf("%s%s\t\t<DisplacementY>%1.4f</DisplacementY>\r\n",
  1007         -                        prev, extra, PolygonDisplacementY);
  1008         -      sqlite3_free(prev);
  1009         -      prev = xml;
  1010         -      xml = sqlite3_mprintf("%s%s\t</Displacement>\r\n", prev, extra);
  1011         -      sqlite3_free(prev);
  1012         -      prev = xml;
  1013         -    }
  1014         -  if (PolygonPerpendicularOffset != 0.0)
  1015         -    {
  1016         -      xml =
  1017         -        sqlite3_mprintf
  1018         -        ("%s%s\t<PerpendicularOffset>%1.4f</PerpendicularOffset>\r\n", prev,
  1019         -         extra, PolygonPerpendicularOffset);
  1020         -      sqlite3_free(prev);
  1021         -      prev = xml;
  1022         -    }
  1023         -  xml = sqlite3_mprintf("%s%s</PolygonSymbolizer>\r\n", prev, extra);
  1024         -  sqlite3_free(prev);
  1025         -  return xml;
  1026         -}
  1027         -
  1028         -char *QuickStyleObj::DoCreateTextPointSymbolizerXML()
  1029         -{
  1030         -//
  1031         -// creating a Text Symbolizer (Point Placement)
  1032         -//
  1033         -  char *xml;
  1034         -  char *prev;
  1035         -  xml = sqlite3_mprintf("\t\t<TextSymbolizer>\r\n");
  1036         -  prev = xml;
  1037         -  xml = sqlite3_mprintf("%s\t\t\t<Label>@%s@</Label>\r\n", prev, LabelColumn);
  1038         -  sqlite3_free(prev);
  1039         -  prev = xml;
  1040         -  xml = sqlite3_mprintf("%s\t\t\t<Font>\r\n", prev);
  1041         -  sqlite3_free(prev);
  1042         -  prev = xml;
  1043         -  const char *font;
  1044         -  if (strcmp(FontFacename, "ToyFont: serif") == 0)
  1045         -    font = "serif";
  1046         -  else if (strcmp(FontFacename, "ToyFont: sans-serif") == 0)
  1047         -    font = "sans serif";
  1048         -  else if (strcmp(FontFacename, "ToyFont: monospace") == 0)
  1049         -    font = "monospace";
  1050         -  else
  1051         -    font = FontFacename;
  1052         -  xml =
  1053         -    sqlite3_mprintf
  1054         -    ("%s\t\t\t\t<SvgParameter name=\"font-family\">%s</SvgParameter>\r\n", prev,
  1055         -     font);
  1056         -  sqlite3_free(prev);
  1057         -  prev = xml;
  1058         -  if (FontStyle == RL2_FONTSTYLE_ITALIC)
  1059         -    xml =
  1060         -      sqlite3_mprintf
  1061         -      ("%s\t\t\t\t<SvgParameter name=\"font-style\">italic</SvgParameter>\r\n",
  1062         -       prev);
  1063         -  else if (FontStyle == RL2_FONTSTYLE_OBLIQUE)
  1064         -    xml =
  1065         -      sqlite3_mprintf
  1066         -      ("%s\t\t\t\t<SvgParameter name=\"font-style\">oblique</SvgParameter>\r\n",
  1067         -       prev);
  1068         -  else
  1069         -    xml =
  1070         -      sqlite3_mprintf
  1071         -      ("%s\t\t\t\t<SvgParameter name=\"font-style\">normal</SvgParameter>\r\n",
  1072         -       prev);
  1073         -  sqlite3_free(prev);
  1074         -  prev = xml;
  1075         -  if (FontWeight == RL2_FONTWEIGHT_BOLD)
  1076         -    xml =
  1077         -      sqlite3_mprintf
  1078         -      ("%s\t\t\t\t<SvgParameter name=\"font-weight\">bold</SvgParameter>\r\n",
  1079         -       prev);
  1080         -  else
  1081         -    xml =
  1082         -      sqlite3_mprintf
  1083         -      ("%s\t\t\t\t<SvgParameter name=\"font-weight\">normal</SvgParameter>\r\n",
  1084         -       prev);
  1085         -  sqlite3_free(prev);
  1086         -  prev = xml;
  1087         -  xml =
  1088         -    sqlite3_mprintf
  1089         -    ("%s\t\t\t\t<SvgParameter name=\"font-size\">%1.2f</SvgParameter>\r\n",
  1090         -     prev, FontSize);
  1091         -  sqlite3_free(prev);
  1092         -  prev = xml;
  1093         -  xml = sqlite3_mprintf("%s\t\t\t</Font>\r\n", prev);
  1094         -  sqlite3_free(prev);
  1095         -  prev = xml;
  1096         -  xml = sqlite3_mprintf("%s\t\t\t<LabelPlacement>\n", prev);
  1097         -  sqlite3_free(prev);
  1098         -  prev = xml;
  1099         -// PointPlacement
  1100         -  xml = sqlite3_mprintf("%s\t\t\t\t<PointPlacement>\n", prev);
  1101         -  sqlite3_free(prev);
  1102         -  prev = xml;
  1103         -  if (LabelAnchorX != 0.5 || LabelAnchorY != 0.5)
  1104         -    {
  1105         -      xml = sqlite3_mprintf("%s\t\t\t\t\t<AnchorPoint>\r\n", prev);
  1106         -      sqlite3_free(prev);
  1107         -      prev = xml;
  1108         -      xml =
  1109         -        sqlite3_mprintf
  1110         -        ("%s\t\t\t\t\t\t<AnchorPointX>%1.4f</AnchorPointX>\r\n", prev,
  1111         -         LabelAnchorX);
  1112         -      sqlite3_free(prev);
  1113         -      prev = xml;
  1114         -      xml =
  1115         -        sqlite3_mprintf
  1116         -        ("%s\t\t\t\t\t\t<AnchorPointY>%1.4f</AnchorPointY>\r\n", prev,
  1117         -         LabelAnchorY);
  1118         -      sqlite3_free(prev);
  1119         -      prev = xml;
  1120         -      xml = sqlite3_mprintf("%s\t\t\t\t\t</AnchorPoint>\r\n", prev);
  1121         -      sqlite3_free(prev);
  1122         -      prev = xml;
  1123         -    }
  1124         -  if (LabelDisplacementX != 0.0 || LabelDisplacementY != 0.0)
  1125         -    {
  1126         -      xml = sqlite3_mprintf("%s\t\t\t\t\t<Displacement>\r\n", prev);
  1127         -      sqlite3_free(prev);
  1128         -      prev = xml;
  1129         -      xml =
  1130         -        sqlite3_mprintf
  1131         -        ("%s\t\t\t\t\t\t<DisplacementX>%1.4f</DisplacementX>\r\n", prev,
  1132         -         LabelDisplacementX);
  1133         -      sqlite3_free(prev);
  1134         -      prev = xml;
  1135         -      xml =
  1136         -        sqlite3_mprintf
  1137         -        ("%s\t\t\t\t\t\t<DisplacementY>%1.4f</DisplacementY>\r\n", prev,
  1138         -         LabelDisplacementY);
  1139         -      sqlite3_free(prev);
  1140         -      prev = xml;
  1141         -      xml = sqlite3_mprintf("%s\t\t\t\t\t</Displacement>\r\n", prev);
  1142         -      sqlite3_free(prev);
  1143         -      prev = xml;
  1144         -    }
  1145         -  if (LabelRotation != 0.0)
  1146         -    {
  1147         -      xml =
  1148         -        sqlite3_mprintf
  1149         -        ("%s\t\t\t\t\t<Rotation>%1.2f</Rotation>\r\n", prev, LabelRotation);
  1150         -      sqlite3_free(prev);
  1151         -      prev = xml;
  1152         -    }
  1153         -  xml = sqlite3_mprintf("%s\t\t\t\t</PointPlacement>\r\n", prev);
  1154         -  sqlite3_free(prev);
  1155         -  prev = xml;
  1156         -  xml = sqlite3_mprintf("%s\t\t\t</LabelPlacement>\r\n", prev);
  1157         -  sqlite3_free(prev);
  1158         -  prev = xml;
  1159         -  if (HasHalo == true)
  1160         -    {
  1161         -      // Halo
  1162         -      xml = sqlite3_mprintf("%s\t\t\t<Halo>\r\n", prev);
  1163         -      sqlite3_free(prev);
  1164         -      prev = xml;
  1165         -      xml =
  1166         -        sqlite3_mprintf("%s\t\t\t\t<Radius>%1.2f</Radius>\r\n", prev,
  1167         -                        HaloRadius);
  1168         -      sqlite3_free(prev);
  1169         -      prev = xml;
  1170         -      xml = sqlite3_mprintf("%s\t\t\t\t<Fill>\r\n", prev);
  1171         -      sqlite3_free(prev);
  1172         -      prev = xml;
  1173         -      xml =
  1174         -        sqlite3_mprintf
  1175         -        ("%s\t\t\t\t\t<SvgParameter name=\"fill\">%s</SvgParameter>\r\n",
  1176         -         prev, HaloColor);
  1177         -      sqlite3_free(prev);
  1178         -      prev = xml;
  1179         -      xml =
  1180         -        sqlite3_mprintf
  1181         -        ("%s\t\t\t\t\t<SvgParameter name=\"fill-opacity\">%1.2f</SvgParameter>\r\n",
  1182         -         prev, HaloOpacity);
  1183         -      sqlite3_free(prev);
  1184         -      prev = xml;
  1185         -      xml = sqlite3_mprintf("%s\t\t\t\t</Fill>\r\n", prev);
  1186         -      sqlite3_free(prev);
  1187         -      prev = xml;
  1188         -      xml = sqlite3_mprintf("%s\t\t\t</Halo>\r\n", prev);
  1189         -      sqlite3_free(prev);
  1190         -      prev = xml;
  1191         -    }
  1192         -  xml = sqlite3_mprintf("%s\t\t\t<Fill>\r\n", prev);
  1193         -  sqlite3_free(prev);
  1194         -  prev = xml;
  1195         -  xml =
  1196         -    sqlite3_mprintf
  1197         -    ("%s\t\t\t\t<SvgParameter name=\"fill\">%s</SvgParameter>\r\n", prev,
  1198         -     FontColor);
  1199         -  sqlite3_free(prev);
  1200         -  prev = xml;
  1201         -  xml =
  1202         -    sqlite3_mprintf
  1203         -    ("%s\t\t\t\t<SvgParameter name=\"fill-opacity\">%1.2f</SvgParameter>\r\n",
  1204         -     prev, FontOpacity);
  1205         -  sqlite3_free(prev);
  1206         -  prev = xml;
  1207         -  xml = sqlite3_mprintf("%s\t\t\t</Fill>\r\n", prev);
  1208         -  sqlite3_free(prev);
  1209         -  prev = xml;
  1210         -  xml = sqlite3_mprintf("%s\t\t</TextSymbolizer>\r\n", prev);
  1211         -  sqlite3_free(prev);
  1212         -  return xml;
  1213         -}
  1214         -
  1215         -char *QuickStyleObj::DoCreateTextLineSymbolizerXML()
  1216         -{
  1217         -//
  1218         -// creating a Text Symbolizer (Line Placement)
  1219         -//
  1220         -  char *xml;
  1221         -  char *prev;
  1222         -  xml = sqlite3_mprintf("\t\t<TextSymbolizer>\r\n");
  1223         -  prev = xml;
  1224         -  xml = sqlite3_mprintf("%s\t\t\t<Label>@%s@</Label>\r\n", prev, LabelColumn);
  1225         -  sqlite3_free(prev);
  1226         -  prev = xml;
  1227         -  xml = sqlite3_mprintf("%s\t\t\t<Font>\r\n", prev);
  1228         -  sqlite3_free(prev);
  1229         -  prev = xml;
  1230         -  const char *font;
  1231         -  if (strcmp(FontFacename, "ToyFont: serif") == 0)
  1232         -    font = "serif";
  1233         -  else if (strcmp(FontFacename, "ToyFont: sans-serif") == 0)
  1234         -    font = "sans serif";
  1235         -  else if (strcmp(FontFacename, "ToyFont: monospace") == 0)
  1236         -    font = "monospace";
  1237         -  else
  1238         -    font = FontFacename;
  1239         -  xml =
  1240         -    sqlite3_mprintf
  1241         -    ("%s\t\t\t\t<SvgParameter name=\"font-family\">%s</SvgParameter>\r\n", prev,
  1242         -     font);
  1243         -  sqlite3_free(prev);
  1244         -  prev = xml;
  1245         -  if (FontStyle == RL2_FONTSTYLE_ITALIC)
  1246         -    xml =
  1247         -      sqlite3_mprintf
  1248         -      ("%s\t\t\t\t<SvgParameter name=\"font-style\">italic</SvgParameter>\r\n",
  1249         -       prev);
  1250         -  else if (FontStyle == RL2_FONTSTYLE_OBLIQUE)
  1251         -    xml =
  1252         -      sqlite3_mprintf
  1253         -      ("%s\t\t\t\t<SvgParameter name=\"font-style\">oblique</SvgParameter>\r\n",
  1254         -       prev);
  1255         -  else
  1256         -    xml =
  1257         -      sqlite3_mprintf
  1258         -      ("%s\t\t\t\t<SvgParameter name=\"font-style\">normal</SvgParameter>\r\n",
  1259         -       prev);
  1260         -  sqlite3_free(prev);
  1261         -  prev = xml;
  1262         -  if (FontWeight == RL2_FONTWEIGHT_BOLD)
  1263         -    xml =
  1264         -      sqlite3_mprintf
  1265         -      ("%s\t\t\t\t<SvgParameter name=\"font-weight\">bold</SvgParameter>\r\n",
  1266         -       prev);
  1267         -  else
  1268         -    xml =
  1269         -      sqlite3_mprintf
  1270         -      ("%s\t\t\t\t<SvgParameter name=\"font-weight\">normal</SvgParameter>\r\n",
  1271         -       prev);
  1272         -  sqlite3_free(prev);
  1273         -  prev = xml;
  1274         -  xml =
  1275         -    sqlite3_mprintf
  1276         -    ("%s\t\t\t\t<SvgParameter name=\"font-size\">%1.2f</SvgParameter>\r\n",
  1277         -     prev, FontSize);
  1278         -  sqlite3_free(prev);
  1279         -  prev = xml;
  1280         -  xml = sqlite3_mprintf("%s%s\t\t\t</Font>\r\n", prev);
  1281         -  sqlite3_free(prev);
  1282         -  prev = xml;
  1283         -  xml = sqlite3_mprintf("%s\t\t\t<LabelPlacement>\n", prev);
  1284         -  sqlite3_free(prev);
  1285         -  prev = xml;
  1286         -// LinePlacement
  1287         -  xml = sqlite3_mprintf("%s\t\t\t\t<LinePlacement>\n", prev);
  1288         -  sqlite3_free(prev);
  1289         -  prev = xml;
  1290         -  if (LabelPerpendicularOffset != 0.0)
  1291         -    {
  1292         -      xml =
  1293         -        sqlite3_mprintf
  1294         -        ("%s\t\t\t\t\t<PerpendicularOffset>%1.4f</PerpendicularOffset>\r\n",
  1295         -         prev, LabelPerpendicularOffset);
  1296         -      sqlite3_free(prev);
  1297         -      prev = xml;
  1298         -    }
  1299         -  if (RepeatedLabel == true)
  1300         -    {
  1301         -      // Repeated: InitialGap and Gap
  1302         -      xml =
  1303         -        sqlite3_mprintf("%s\t\t\t\t\t<IsRepeated>true</IsRepeated>\r\n", prev);
  1304         -      sqlite3_free(prev);
  1305         -      prev = xml;
  1306         -      xml =
  1307         -        sqlite3_mprintf
  1308         -        ("%s\t\t\t\t\t<InitialGap>%1.4f</InitialGap>\r\n", prev,
  1309         -         LabelInitialGap);
  1310         -      sqlite3_free(prev);
  1311         -      prev = xml;
  1312         -      xml = sqlite3_mprintf("%s\t\t\t\t\t<Gap>%1.4f</Gap>\r\n", prev, LabelGap);
  1313         -      sqlite3_free(prev);
  1314         -      prev = xml;
  1315         -    }
  1316         -  if (LabelIsAligned == true)
  1317         -    {
  1318         -      xml =
  1319         -        sqlite3_mprintf("%s\t\t\t\t\t<IsAligned>true</IsAligned>\r\n", prev);
  1320         -      sqlite3_free(prev);
  1321         -      prev = xml;
  1322         -    }
  1323         -  if (LabelGeneralizeLine == true)
  1324         -    {
  1325         -      xml =
  1326         -        sqlite3_mprintf
  1327         -        ("%s\t\t\t\t\t<GeneralizeLine>true</GeneralizeLine>\r\n", prev);
  1328         -      sqlite3_free(prev);
  1329         -      prev = xml;
  1330         -    }
  1331         -  xml = sqlite3_mprintf("%s\t\t\t\t</LinePlacement>\r\n", prev);
  1332         -  sqlite3_free(prev);
  1333         -  prev = xml;
  1334         -  xml = sqlite3_mprintf("%s\t\t\t</LabelPlacement>\r\n", prev);
  1335         -  sqlite3_free(prev);
  1336         -  prev = xml;
  1337         -  if (HasHalo == true)
  1338         -    {
  1339         -      // Halo
  1340         -      xml = sqlite3_mprintf("%s\t\t\t<Halo>\r\n", prev);
  1341         -      sqlite3_free(prev);
  1342         -      prev = xml;
  1343         -      xml =
  1344         -        sqlite3_mprintf("%s\t\t\t\t<Radius>%1.2f</Radius>\r\n", prev,
  1345         -                        HaloRadius);
  1346         -      sqlite3_free(prev);
  1347         -      prev = xml;
  1348         -      xml = sqlite3_mprintf("%s\t\t\t\t<Fill>\r\n", prev);
  1349         -      sqlite3_free(prev);
  1350         -      prev = xml;
  1351         -      xml =
  1352         -        sqlite3_mprintf
  1353         -        ("%s\t\t\t\t\t<SvgParameter name=\"fill\">%s</SvgParameter>\r\n",
  1354         -         prev, HaloColor);
  1355         -      sqlite3_free(prev);
  1356         -      prev = xml;
  1357         -      xml =
  1358         -        sqlite3_mprintf
  1359         -        ("%s\t\t\t\t\t<SvgParameter name=\"fill-opacity\">%1.2f</SvgParameter>\r\n",
  1360         -         prev, HaloOpacity);
  1361         -      sqlite3_free(prev);
  1362         -      prev = xml;
  1363         -      xml = sqlite3_mprintf("%s\t\t\t\t</Fill>\r\n", prev);
  1364         -      sqlite3_free(prev);
  1365         -      prev = xml;
  1366         -      xml = sqlite3_mprintf("%s\t\t\t</Halo>\r\n", prev);
  1367         -      sqlite3_free(prev);
  1368         -      prev = xml;
  1369         -    }
  1370         -  xml = sqlite3_mprintf("%s\t\t\t<Fill>\r\n", prev);
  1371         -  sqlite3_free(prev);
  1372         -  prev = xml;
  1373         -  xml =
  1374         -    sqlite3_mprintf
  1375         -    ("%s\t\t\t\t<SvgParameter name=\"fill\">%s</SvgParameter>\r\n", prev,
  1376         -     FontColor);
  1377         -  sqlite3_free(prev);
  1378         -  prev = xml;
  1379         -  xml =
  1380         -    sqlite3_mprintf
  1381         -    ("%s\t\t\t\t<SvgParameter name=\"fill-opacity\">%1.2f</SvgParameter>\r\n",
  1382         -     prev, FontOpacity);
  1383         -  sqlite3_free(prev);
  1384         -  prev = xml;
  1385         -  xml = sqlite3_mprintf("%s\t\t\t</Fill>\r\n", prev);
  1386         -  sqlite3_free(prev);
  1387         -  prev = xml;
  1388         -  xml = sqlite3_mprintf("%s\t\t</TextSymbolizer>\r\n", prev);
  1389         -  sqlite3_free(prev);
  1390         -  return xml;
  1391         -}
  1392         -
  1393         -const unsigned char *QuickStyleObj::CloneXmlStyle()
  1394         -{
  1395         -//
  1396         -// cloning the XML Style definition
  1397         -//
  1398         -  if (XmlStyle == NULL)
  1399         -    XmlStyle = CreateXmlStyle();
  1400         -  if (XmlStyle == NULL)
  1401         -    return NULL;
  1402         -  int len = strlen(XmlStyle);
  1403         -  char *cloned = (char *) malloc(len + 1);
  1404         -  strcpy(cloned, XmlStyle);
  1405         -  return (const unsigned char *) cloned;
  1406         -}
  1407         -
  1408         -void QuickStyleObj::DoGetUUID(char *uuid)
  1409         -{
  1410         -//
  1411         -// creating an UUID value
  1412         -//
  1413         -  unsigned char rnd[16];
  1414         -  char *p = uuid;
  1415         -  int i;
  1416         -  sqlite3_randomness(16, rnd);
  1417         -  for (i = 0; i < 16; i++)
  1418         -    {
  1419         -      if (i == 4 || i == 6 || i == 8 || i == 10)
  1420         -        *p++ = '-';
  1421         -      sprintf(p, "%02x", rnd[i]);
  1422         -      p += 2;
  1423         -    }
  1424         -  *p = '\0';
  1425         -  uuid[14] = '4';
  1426         -  uuid[19] = '8';
  1427         -}
  1428         -
  1429         -int QuickStyleObj::RandomWellKnownMark()
  1430         -{
  1431         -//
  1432         -// returning a random Symbol Well Known Mark
  1433         -//
  1434         -  int wkt;
  1435         -  int mod = rand() % 6;
  1436         -  switch (mod)
  1437         -    {
  1438         -      case 0:
  1439         -        wkt = RL2_GRAPHIC_MARK_SQUARE;
  1440         -        break;
  1441         -      case 1:
  1442         -        wkt = RL2_GRAPHIC_MARK_CIRCLE;
  1443         -        break;
  1444         -      case 2:
  1445         -        wkt = RL2_GRAPHIC_MARK_TRIANGLE;
  1446         -        break;
  1447         -      case 3:
  1448         -        wkt = RL2_GRAPHIC_MARK_STAR;
  1449         -        break;
  1450         -      case 4:
  1451         -        wkt = RL2_GRAPHIC_MARK_CROSS;
  1452         -        break;
  1453         -      default:
  1454         -        wkt = RL2_GRAPHIC_MARK_X;
  1455         -        break;
  1456         -    };
  1457         -  return wkt;
  1458         -}
  1459         -
  1460         -void QuickStyleObj::RandomColor(char *color)
  1461         -{
  1462         -//
  1463         -// setting a random Color
  1464         -//
  1465         -  unsigned char red = rand() % 256;
  1466         -  unsigned char green = rand() % 256;
  1467         -  unsigned char blue = rand() % 256;
  1468         -  sprintf(color, "#%02x%02x%02x", red, green, blue);
  1469         -}
  1470         -
  1471         -bool QuickStyleVectorDialog::Create(MyMapPanel * parent, MapLayer * layer,
  1472         -                                    int type)
  1473         -{
  1474         -//
  1475         -// creating the dialog
  1476         -//
  1477         -  MainFrame = parent->GetParent();
  1478         -  MapPanel = parent;
  1479         -  Layer = layer;
  1480         -  Type = type;
  1481         -  DbPrefix = layer->GetDbPrefix();
  1482         -  LayerName = layer->GetName();
  1483         -  IsConfigChanged = false;
  1484         -
  1485         -  if (wxPropertySheetDialog::Create
  1486         -      (parent, wxID_ANY, wxT("QuickStyle (Vector) Edit")) == false)
  1487         -    return false;
  1488         -  if (Layer->GetQuickStyle() != NULL)
  1489         -    Style = Layer->CloneQuickStyle();
  1490         -  else
  1491         -    Style = new QuickStyleObj(Type);
  1492         -
  1493         -  wxBookCtrlBase *book = GetBookCtrl();
  1494         -// creates individual panels
  1495         -  int next = 1;
  1496         -  PagePointIndex = 0;
  1497         -  PageLineIndex = 0;
  1498         -  PagePolygonIndex = 0;
  1499         -  PageTextPointIndex = 0;
  1500         -  PageTextLineIndex = 0;
  1501         -  wxPanel *mainPage = CreateMainPage(book);
  1502         -  book->AddPage(mainPage, wxT("General"), true);
  1503         -  if (Type == QUICK_STYLE_POINT || Type == QUICK_STYLE_GEOMETRY)
  1504         -    {
  1505         -      wxPanel *pointPage = CreatePointPage(book);
  1506         -      book->AddPage(pointPage, wxT("Point Symbolizer"), false);
  1507         -      PagePointIndex = next++;
  1508         -    }
  1509         -  if (Type == QUICK_STYLE_LINE || Type == QUICK_STYLE_GEOMETRY)
  1510         -    {
  1511         -      wxPanel *linePage = CreateLinePage(book);
  1512         -      book->AddPage(linePage, wxT("Line Symbolyzer"), false);
  1513         -      PageLineIndex = next++;
  1514         -    }
  1515         -  if (Type == QUICK_STYLE_POLYGON || Type == QUICK_STYLE_GEOMETRY)
  1516         -    {
  1517         -      wxPanel *polygonPage = CreatePolygonPage(book);
  1518         -      book->AddPage(polygonPage, wxT("Polygon Symbolizer"), false);
  1519         -      PagePolygonIndex = next++;
  1520         -    }
  1521         -  if (Type == QUICK_STYLE_POINT || Type == QUICK_STYLE_POLYGON)
  1522         -    {
  1523         -      wxPanel *textPointPage = CreateTextPointPage(book);
  1524         -      book->AddPage(textPointPage, wxT("Text Symbolizer"), false);
  1525         -      PageTextPointIndex = next++;
  1526         -    }
  1527         -  if (Type == QUICK_STYLE_LINE)
  1528         -    {
  1529         -      wxPanel *textLinePage = CreateTextLinePage(book);
  1530         -      book->AddPage(textLinePage, wxT("Text Symbolizer"), false);
  1531         -      PageTextLineIndex = next++;
  1532         -    }
  1533         -
  1534         -  CreateButtons();
  1535         -  LayoutDialog();
  1536         -// appends event handler for TAB/PAGE changing
  1537         -  Connect(wxID_ANY, wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING,
  1538         -          (wxObjectEventFunction) & QuickStyleVectorDialog::OnPageChanging);
  1539         -  Connect(wxID_ANY, wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED,
  1540         -          (wxObjectEventFunction) & QuickStyleVectorDialog::OnPageChanged);
  1541         -// appends event handler for buttons
  1542         -  Connect(wxID_CANCEL, wxEVT_COMMAND_BUTTON_CLICKED,
  1543         -          (wxObjectEventFunction) & QuickStyleVectorDialog::OnQuit);
  1544         -  Connect(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED,
  1545         -          (wxObjectEventFunction) & QuickStyleVectorDialog::OnOk);
  1546         -  Connect(ID_QUICK_STYLE_APPLY, wxEVT_COMMAND_BUTTON_CLICKED,
  1547         -          (wxObjectEventFunction) & QuickStyleVectorDialog::OnApply);
  1548         -  Connect(ID_QUICK_STYLE_EXPORT, wxEVT_COMMAND_BUTTON_CLICKED,
  1549         -          (wxObjectEventFunction) & QuickStyleVectorDialog::OnExport);
  1550         -  Connect(ID_QUICK_STYLE_COPY, wxEVT_COMMAND_BUTTON_CLICKED,
  1551         -          (wxObjectEventFunction) & QuickStyleVectorDialog::OnCopy);
  1552         -// centers the dialog window
  1553         -  Centre();
  1554         -  UpdateMainPage();
  1555         -  return true;
  1556         -}
  1557         -
  1558         -void QuickStyleVectorDialog::CreateButtons()
  1559         -{
  1560         -// 
  1561         -// adding the common Buttons
  1562         -//
  1563         -  wxBoxSizer *topSizer = (wxBoxSizer *) (this->GetSizer());
  1564         -  wxBoxSizer *btnBox = new wxBoxSizer(wxHORIZONTAL);
  1565         -  topSizer->Add(btnBox, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1566         -  wxButton *save = new wxButton(this, ID_QUICK_STYLE_APPLY, wxT("&Apply"));
  1567         -  btnBox->Add(save, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1568         -  wxButton *exp =
  1569         -    new wxButton(this, ID_QUICK_STYLE_EXPORT, wxT("&Export to file"));
  1570         -  btnBox->Add(exp, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1571         -  wxButton *copy = new wxButton(this, ID_QUICK_STYLE_COPY, wxT("&Copy"));
  1572         -  btnBox->Add(copy, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1573         -  btnBox->AddSpacer(100);
  1574         -  wxButton *ok = new wxButton(this, wxID_OK, wxT("&Ok"));
  1575         -  btnBox->Add(ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1576         -  wxButton *cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel"));
  1577         -  btnBox->Add(cancel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1578         -}
  1579         -
  1580         -wxPanel *QuickStyleVectorDialog::CreateMainPage(wxWindow * parent)
  1581         -{
  1582         -//
  1583         -// creating the MAIN page
  1584         -//
  1585         -  wxPanel *panel = new wxPanel(parent, ID_PANE_MAIN);
  1586         -  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
  1587         -  panel->SetSizer(topSizer);
  1588         -  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
  1589         -  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
  1590         -// First row: Layer name
  1591         -  boxSizer->AddSpacer(50);
  1592         -  wxBoxSizer *lyrBoxSizer = new wxBoxSizer(wxVERTICAL);
  1593         -  boxSizer->Add(lyrBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1594         -  wxBoxSizer *nameSizer = new wxBoxSizer(wxVERTICAL);
  1595         -  lyrBoxSizer->Add(nameSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1596         -  wxStaticBox *nameBox = new wxStaticBox(panel, wxID_ANY,
  1597         -                                         wxT("Layer FullName"),
  1598         -                                         wxDefaultPosition,
  1599         -                                         wxDefaultSize);
  1600         -  wxBoxSizer *nameBoxSizer = new wxStaticBoxSizer(nameBox, wxHORIZONTAL);
  1601         -  nameSizer->Add(nameBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1602         -  wxString fullName = DbPrefix + wxT(".") + LayerName;
  1603         -  wxTextCtrl *nameCtrl = new wxTextCtrl(panel, ID_VECTOR_LAYER, fullName,
  1604         -                                        wxDefaultPosition, wxSize(370, 22),
  1605         -                                        wxTE_READONLY);
  1606         -  nameBoxSizer->Add(nameCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1607         -  wxStaticBox *typeBox = new wxStaticBox(panel, wxID_ANY,
  1608         -                                         wxT("Geometry Type"),
  1609         -                                         wxDefaultPosition,
  1610         -                                         wxDefaultSize);
  1611         -  wxBoxSizer *typeBoxSizer = new wxStaticBoxSizer(typeBox, wxHORIZONTAL);
  1612         -  nameSizer->Add(typeBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1613         -  wxString typeName = wxT("UNKNOWN");
  1614         -  if (Type == QUICK_STYLE_POINT)
  1615         -    typeName = wxT("POINT-Type Geometries");
  1616         -  if (Type == QUICK_STYLE_LINE)
  1617         -    typeName = wxT("LINE-Type Geometries");
  1618         -  if (Type == QUICK_STYLE_POLYGON)
  1619         -    typeName = wxT("POLYGON-Type Geometries");
  1620         -  if (Type == QUICK_STYLE_GEOMETRY)
  1621         -    typeName = wxT("MIXED-Type Geometries");
  1622         -  wxTextCtrl *typeCtrl = new wxTextCtrl(panel, ID_VECTOR_TYPE, typeName,
  1623         -                                        wxDefaultPosition, wxSize(370, 22),
  1624         -                                        wxTE_READONLY);
  1625         -  typeBoxSizer->Add(typeCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1626         -  wxStaticBox *uuidBox = new wxStaticBox(panel, wxID_ANY,
  1627         -                                         wxT("QuickStyle Name"),
  1628         -                                         wxDefaultPosition,
  1629         -                                         wxDefaultSize);
  1630         -  wxBoxSizer *uuidBoxSizer = new wxStaticBoxSizer(uuidBox, wxHORIZONTAL);
  1631         -  nameSizer->Add(uuidBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1632         -  wxString uuid = wxString::FromUTF8(Style->GetUUID());
  1633         -  wxTextCtrl *uuidCtrl = new wxTextCtrl(panel, ID_VECTOR_UUID, uuid,
  1634         -                                        wxDefaultPosition, wxSize(370, 22),
  1635         -                                        wxTE_READONLY);
  1636         -  uuidBoxSizer->Add(uuidCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1637         -  boxSizer->AddSpacer(25);
  1638         -// second row: Visibility Range
  1639         -  wxBoxSizer *miscSizer = new wxBoxSizer(wxHORIZONTAL);
  1640         -  boxSizer->Add(miscSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  1641         -  wxBoxSizer *visibilityBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  1642         -  miscSizer->Add(visibilityBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  1643         -  wxStaticBox *visibilityBox = new wxStaticBox(panel, wxID_STATIC,
  1644         -                                               wxT("Visibility Range"),
  1645         -                                               wxDefaultPosition,
  1646         -                                               wxDefaultSize);
  1647         -  wxBoxSizer *visibilitySizer =
  1648         -    new wxStaticBoxSizer(visibilityBox, wxHORIZONTAL);
  1649         -  visibilityBoxSizer->Add(visibilitySizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL,
  1650         -                          5);
  1651         -  wxString range[4];
  1652         -  range[0] = wxT("&None");
  1653         -  range[1] = wxT("&Min");
  1654         -  range[2] = wxT("&Max");
  1655         -  range[3] = wxT("&Both");
  1656         -  wxRadioBox *rangeBox = new wxRadioBox(panel, ID_SYMBOLIZER_MINMAX_SCALE,
  1657         -                                        wxT("&Range Type"),
  1658         -                                        wxDefaultPosition,
  1659         -                                        wxDefaultSize, 4,
  1660         -                                        range, 2,
  1661         -                                        wxRA_SPECIFY_COLS);
  1662         -  visibilitySizer->Add(rangeBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1663         -  rangeBox->SetSelection(0);
  1664         -  visibilitySizer->AddSpacer(20);
  1665         -  wxBoxSizer *scaleBoxSizer = new wxBoxSizer(wxVERTICAL);
  1666         -  visibilitySizer->Add(scaleBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1667         -  wxBoxSizer *scaleMinSizer = new wxBoxSizer(wxHORIZONTAL);
  1668         -  scaleBoxSizer->Add(scaleMinSizer, 0, wxALIGN_RIGHT | wxALL, 5);
  1669         -  wxStaticText *minScaleLabel =
  1670         -    new wxStaticText(panel, wxID_STATIC, wxT("&Min Scale:"));
  1671         -  scaleMinSizer->Add(minScaleLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1672         -  wxTextCtrl *minScaleCtrl =
  1673         -    new wxTextCtrl(panel, ID_SYMBOLIZER_MIN_SCALE, wxT("0.0"),
  1674         -                   wxDefaultPosition, wxSize(100, 22));
  1675         -  minScaleCtrl->Enable(false);
  1676         -  scaleMinSizer->Add(minScaleCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1677         -  wxBoxSizer *scaleMaxSizer = new wxBoxSizer(wxHORIZONTAL);
  1678         -  scaleBoxSizer->Add(scaleMaxSizer, 0, wxALIGN_RIGHT | wxALL, 0);
  1679         -  wxStaticText *maxScaleLabel =
  1680         -    new wxStaticText(panel, wxID_STATIC, wxT("&Max Scale:"));
  1681         -  scaleMaxSizer->Add(maxScaleLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1682         -  wxTextCtrl *maxScaleCtrl =
  1683         -    new wxTextCtrl(panel, ID_SYMBOLIZER_MAX_SCALE, wxT("+Infinite"),
  1684         -                   wxDefaultPosition, wxSize(100, 22));
  1685         -  maxScaleCtrl->Enable(false);
  1686         -  scaleMaxSizer->Add(maxScaleCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1687         -  panel->SetSizer(topSizer);
  1688         -  topSizer->Fit(panel);
  1689         -// appends event handlers
  1690         -  Connect(ID_SYMBOLIZER_MINMAX_SCALE, wxEVT_COMMAND_RADIOBOX_SELECTED,
  1691         -          (wxObjectEventFunction) & QuickStyleVectorDialog::OnCmdScaleChanged);
  1692         -  return panel;
  1693         -}
  1694         -
  1695         -void QuickStyleVectorDialog::
  1696         -OnCmdScaleChanged(wxCommandEvent & WXUNUSED(event))
  1697         -{
  1698         -//
  1699         -// Visibility Range selection changed
  1700         -//
  1701         -  wxRadioBox *scaleModeCtrl =
  1702         -    (wxRadioBox *) FindWindow(ID_SYMBOLIZER_MINMAX_SCALE);
  1703         -  wxTextCtrl *minCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MIN_SCALE);
  1704         -  wxTextCtrl *maxCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MAX_SCALE);
  1705         -  switch (scaleModeCtrl->GetSelection())
  1706         -    {
  1707         -      case 0:
  1708         -        Style->EnableMinScale(false);
  1709         -        Style->EnableMaxScale(false);
  1710         -        minCtrl->SetValue(wxT("0.0"));
  1711         -        minCtrl->Enable(false);
  1712         -        maxCtrl->SetValue(wxT("+Infinite"));
  1713         -        maxCtrl->Enable(false);
  1714         -        break;
  1715         -      case 1:
  1716         -        Style->EnableMinScale(true);
  1717         -        Style->EnableMaxScale(false);
  1718         -        minCtrl->SetValue(wxT(""));
  1719         -        minCtrl->Enable(true);
  1720         -        maxCtrl->SetValue(wxT("+Infinite"));
  1721         -        maxCtrl->Enable(false);
  1722         -        break;
  1723         -      case 2:
  1724         -        Style->EnableMinScale(false);
  1725         -        Style->EnableMaxScale(true);
  1726         -        minCtrl->SetValue(wxT("0.0"));
  1727         -        minCtrl->Enable(false);
  1728         -        maxCtrl->SetValue(wxT(""));
  1729         -        maxCtrl->Enable(true);
  1730         -        break;
  1731         -      case 3:
  1732         -        Style->EnableMinScale(true);
  1733         -        Style->EnableMaxScale(true);
  1734         -        minCtrl->SetValue(wxT(""));
  1735         -        minCtrl->Enable(true);
  1736         -        maxCtrl->SetValue(wxT(""));
  1737         -        maxCtrl->Enable(true);
  1738         -        break;
  1739         -    };
  1740         -}
  1741         -
  1742         -wxPanel *QuickStyleVectorDialog::CreatePointPage(wxWindow * parent)
  1743         -{
  1744         -//
  1745         -// creating the Point Symbolizer page
  1746         -//
  1747         -  wxString StrokeColor = wxT("#000000");
  1748         -  wxString FillColor = wxT("#808080");
  1749         -  wxPanel *panel = new wxPanel(parent, ID_PANE_POINT);
  1750         -  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
  1751         -  panel->SetSizer(topSizer);
  1752         -  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
  1753         -  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
  1754         -// first row A: Opacity 
  1755         -  wxBoxSizer *opacityBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  1756         -  boxSizer->Add(opacityBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1757         -  wxStaticBox *opacityBox = new wxStaticBox(panel, wxID_STATIC,
  1758         -                                            wxT("Opacity"),
  1759         -                                            wxDefaultPosition,
  1760         -                                            wxDefaultSize);
  1761         -  wxBoxSizer *opacitySizer = new wxStaticBoxSizer(opacityBox, wxVERTICAL);
  1762         -  opacityBoxSizer->Add(opacitySizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1763         -  wxSlider *opacityCtrl =
  1764         -    new wxSlider(panel, ID_SYMBOLIZER_OPACITY, 100, 0, 100,
  1765         -                 wxDefaultPosition, wxSize(600, 45),
  1766         -                 wxSL_HORIZONTAL | wxSL_LABELS);
  1767         -  opacitySizer->Add(opacityCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1768         -// Well Known Mark Name
  1769         -  wxBoxSizer *box1Sizer = new wxBoxSizer(wxHORIZONTAL);
  1770         -  boxSizer->Add(box1Sizer, 0, wxALIGN_CENTER | wxALL, 5);
  1771         -  wxBoxSizer *markSizer = new wxBoxSizer(wxHORIZONTAL);
  1772         -  box1Sizer->Add(markSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  1773         -  wxString mark[6];
  1774         -  mark[0] = wxT("&Square");
  1775         -  mark[1] = wxT("&Circle");
  1776         -  mark[2] = wxT("&Triangle");
  1777         -  mark[3] = wxT("&Star");
  1778         -  mark[4] = wxT("&Cross");
  1779         -  mark[5] = wxT("&X");
  1780         -  wxRadioBox *markBox = new wxRadioBox(panel, ID_SYMBOLIZER_MARK,
  1781         -                                       wxT("&Mark"),
  1782         -                                       wxDefaultPosition,
  1783         -                                       wxDefaultSize, 6,
  1784         -                                       mark, 1,
  1785         -                                       wxRA_SPECIFY_COLS);
  1786         -  markSizer->Add(markBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1787         -  markBox->SetSelection(0);
  1788         -// second row: Size and Rotation
  1789         -  wxBoxSizer *box2Sizer = new wxBoxSizer(wxVERTICAL);
  1790         -  box1Sizer->Add(box2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1791         -  wxBoxSizer *sizeBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  1792         -  box2Sizer->Add(sizeBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1793         -// second row A: Size
  1794         -  wxStaticBox *sizeBox = new wxStaticBox(panel, wxID_STATIC,
  1795         -                                         wxT("Size"),
  1796         -                                         wxDefaultPosition,
  1797         -                                         wxDefaultSize);
  1798         -  wxBoxSizer *sizeSizer = new wxStaticBoxSizer(sizeBox, wxVERTICAL);
  1799         -  sizeBoxSizer->Add(sizeSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
  1800         -  wxBoxSizer *size1Sizer = new wxBoxSizer(wxHORIZONTAL);
  1801         -  sizeSizer->Add(size1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1802         -  wxTextCtrl *sizeCtrl = new wxTextCtrl(panel, ID_SYMBOLIZER_SIZE, wxT("16.0"),
  1803         -                                        wxDefaultPosition, wxSize(100, 22));
  1804         -  size1Sizer->Add(sizeCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1805         -// second row B: Rotation
  1806         -  wxStaticBox *rotBox = new wxStaticBox(panel, wxID_STATIC,
  1807         -                                        wxT("Rotation"),
  1808         -                                        wxDefaultPosition,
  1809         -                                        wxDefaultSize);
  1810         -  wxBoxSizer *rotSizer = new wxStaticBoxSizer(rotBox, wxVERTICAL);
  1811         -  sizeBoxSizer->Add(rotSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
  1812         -  wxBoxSizer *rot1Sizer = new wxBoxSizer(wxHORIZONTAL);
  1813         -  rotSizer->Add(rot1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1814         -  wxTextCtrl *rotCtrl =
  1815         -    new wxTextCtrl(panel, ID_SYMBOLIZER_ROTATION, wxT("0.0"),
  1816         -                   wxDefaultPosition, wxSize(100, 22));
  1817         -  rot1Sizer->Add(rotCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1818         -// third row: AnchorPoint and Displacement
  1819         -  wxBoxSizer *anchorBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  1820         -  box2Sizer->Add(anchorBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1821         -// third row A: Anchor Point
  1822         -  wxStaticBox *anchorBox = new wxStaticBox(panel, wxID_STATIC,
  1823         -                                           wxT("Anchor Point"),
  1824         -                                           wxDefaultPosition,
  1825         -                                           wxDefaultSize);
  1826         -  wxBoxSizer *anchorSizer = new wxStaticBoxSizer(anchorBox, wxVERTICAL);
  1827         -  anchorBoxSizer->Add(anchorSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
  1828         -  wxBoxSizer *anchor1Sizer = new wxBoxSizer(wxHORIZONTAL);
  1829         -  anchorSizer->Add(anchor1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1830         -  wxStaticText *anchor1Label = new wxStaticText(panel, wxID_STATIC, wxT("X"));
  1831         -  anchor1Sizer->Add(anchor1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1832         -  wxTextCtrl *anchorXCtrl =
  1833         -    new wxTextCtrl(panel, ID_SYMBOLIZER_ANCHOR_X, wxT("0.5"),
  1834         -                   wxDefaultPosition, wxSize(100, 22));
  1835         -  anchor1Sizer->Add(anchorXCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1836         -  wxBoxSizer *anchor2Sizer = new wxBoxSizer(wxHORIZONTAL);
  1837         -  anchorSizer->Add(anchor2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1838         -  wxStaticText *anchor2Label = new wxStaticText(panel, wxID_STATIC, wxT("Y"));
  1839         -  anchor2Sizer->Add(anchor2Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1840         -  wxTextCtrl *anchorYCtrl =
  1841         -    new wxTextCtrl(panel, ID_SYMBOLIZER_ANCHOR_Y, wxT("0.5"),
  1842         -                   wxDefaultPosition, wxSize(100, 22));
  1843         -  anchor2Sizer->Add(anchorYCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1844         -// third row B: Displacement
  1845         -  wxStaticBox *displacementBox = new wxStaticBox(panel, wxID_STATIC,
  1846         -                                                 wxT("Displacement"),
  1847         -                                                 wxDefaultPosition,
  1848         -                                                 wxDefaultSize);
  1849         -  wxBoxSizer *displacementSizer =
  1850         -    new wxStaticBoxSizer(displacementBox, wxVERTICAL);
  1851         -  anchorBoxSizer->Add(displacementSizer, 0,
  1852         -                      wxALIGN_CENTER_HORIZONTAL | wxALL, 20);
  1853         -  wxBoxSizer *displ1Sizer = new wxBoxSizer(wxHORIZONTAL);
  1854         -  displacementSizer->Add(displ1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1855         -  wxStaticText *displ1Label = new wxStaticText(panel, wxID_STATIC, wxT("X"));
  1856         -  displ1Sizer->Add(displ1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1857         -  wxTextCtrl *displacementXCtrl =
  1858         -    new wxTextCtrl(panel, ID_SYMBOLIZER_DISPLACEMENT_X, wxT("0.0"),
  1859         -                   wxDefaultPosition, wxSize(100, 22));
  1860         -  displ1Sizer->Add(displacementXCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1861         -  wxBoxSizer *displ2Sizer = new wxBoxSizer(wxHORIZONTAL);
  1862         -  displacementSizer->Add(displ2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1863         -  wxStaticText *displ2Label = new wxStaticText(panel, wxID_STATIC, wxT("Y"));
  1864         -  displ2Sizer->Add(displ2Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1865         -  wxTextCtrl *displacementYCtrl =
  1866         -    new wxTextCtrl(panel, ID_SYMBOLIZER_DISPLACEMENT_Y, wxT("0.0"),
  1867         -                   wxDefaultPosition, wxSize(100, 22));
  1868         -  displ2Sizer->Add(displacementYCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1869         -// fourth row: colors
  1870         -  wxBoxSizer *box3Sizer = new wxBoxSizer(wxHORIZONTAL);
  1871         -  boxSizer->Add(box3Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  1872         -// first row A: Fill Color
  1873         -  wxBoxSizer *fillBoxSizer = new wxBoxSizer(wxVERTICAL);
  1874         -  box3Sizer->Add(fillBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1875         -  wxStaticBox *colorFillBox = new wxStaticBox(panel, wxID_STATIC,
  1876         -                                              wxT("Fill Color"),
  1877         -                                              wxDefaultPosition,
  1878         -                                              wxDefaultSize);
  1879         -  wxBoxSizer *colorFillSizer = new wxStaticBoxSizer(colorFillBox, wxVERTICAL);
  1880         -  box3Sizer->Add(colorFillSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  1881         -  wxBoxSizer *fill1Sizer = new wxBoxSizer(wxHORIZONTAL);
  1882         -  colorFillSizer->Add(fill1Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  1883         -  wxTextCtrl *fillColorCtrl =
  1884         -    new wxTextCtrl(panel, ID_SYMBOLIZER_FILL_COLOR, FillColor,
  1885         -                   wxDefaultPosition, wxSize(80, 22));
  1886         -  fill1Sizer->Add(fillColorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1887         -  wxBitmap bmp;
  1888         -  wxColour color(0, 0, 0);
  1889         -  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
  1890         -  wxStaticBitmap *sampleFillCtrl =
  1891         -    new wxStaticBitmap(panel, ID_SYMBOLIZER_FILL_PICKER_HEX, bmp,
  1892         -                       wxDefaultPosition, wxSize(32, 32));
  1893         -  fill1Sizer->Add(sampleFillCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1894         -  wxButton *pickFill =
  1895         -    new wxButton(panel, ID_SYMBOLIZER_FILL_PICKER_BTN, wxT("&Pick a color"));
  1896         -  fill1Sizer->Add(pickFill, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1897         -// second row B: Stroke Color
  1898         -  box3Sizer->AddSpacer(30);
  1899         -  wxStaticBox *colorStrokeBox = new wxStaticBox(panel, wxID_STATIC,
  1900         -                                                wxT("Stroke Color"),
  1901         -                                                wxDefaultPosition,
  1902         -                                                wxDefaultSize);
  1903         -  wxBoxSizer *colorStrokeSizer =
  1904         -    new wxStaticBoxSizer(colorStrokeBox, wxVERTICAL);
  1905         -  box3Sizer->Add(colorStrokeSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  1906         -  wxBoxSizer *stroke1Sizer = new wxBoxSizer(wxHORIZONTAL);
  1907         -  colorStrokeSizer->Add(stroke1Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  1908         -  wxTextCtrl *strokeColorCtrl =
  1909         -    new wxTextCtrl(panel, ID_SYMBOLIZER_STROKE_COLOR, StrokeColor,
  1910         -                   wxDefaultPosition, wxSize(80, 22));
  1911         -  stroke1Sizer->Add(strokeColorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1912         -  wxStaticBitmap *sampleStrokeCtrl =
  1913         -    new wxStaticBitmap(panel, ID_SYMBOLIZER_STROKE_PICKER_HEX, bmp,
  1914         -                       wxDefaultPosition, wxSize(32, 32));
  1915         -  stroke1Sizer->Add(sampleStrokeCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1916         -  wxButton *pickStroke =
  1917         -    new wxButton(panel, ID_SYMBOLIZER_STROKE_PICKER_BTN, wxT("&Pick a color"));
  1918         -  stroke1Sizer->Add(pickStroke, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  1919         -  panel->SetSizer(topSizer);
  1920         -  topSizer->Fit(panel);
  1921         -// appends event handlers
  1922         -  Connect(ID_SYMBOLIZER_MARK, wxEVT_COMMAND_RADIOBOX_SELECTED,
  1923         -          (wxObjectEventFunction) & QuickStyleVectorDialog::OnCmdMarkChanged);
  1924         -  Connect(ID_SYMBOLIZER_FILL_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
  1925         -          (wxObjectEventFunction) &
  1926         -          QuickStyleVectorDialog::OnCmdPointColorFillPicker);
  1927         -  Connect(ID_SYMBOLIZER_FILL_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
  1928         -          (wxObjectEventFunction) &
  1929         -          QuickStyleVectorDialog::OnCmdPointColorFillChanged);
  1930         -  Connect(ID_SYMBOLIZER_STROKE_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
  1931         -          (wxObjectEventFunction) &
  1932         -          QuickStyleVectorDialog::OnCmdPointColorStrokePicker);
  1933         -  Connect(ID_SYMBOLIZER_STROKE_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
  1934         -          (wxObjectEventFunction) &
  1935         -          QuickStyleVectorDialog::OnCmdPointColorStrokeChanged);
  1936         -  return panel;
  1937         -}
  1938         -
  1939         -void QuickStyleVectorDialog::OnCmdMarkChanged(wxCommandEvent & WXUNUSED(event))
  1940         -{
  1941         -//
  1942         -// Mark selection changed
  1943         -//
  1944         -  wxRadioBox *markCtrl = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_MARK);
  1945         -  switch (markCtrl->GetSelection())
  1946         -    {
  1947         -      case 1:
  1948         -        Style->SetSymbolWellKnownMark(RL2_GRAPHIC_MARK_CIRCLE);
  1949         -        break;
  1950         -      case 2:
  1951         -        Style->SetSymbolWellKnownMark(RL2_GRAPHIC_MARK_TRIANGLE);
  1952         -        break;
  1953         -      case 3:
  1954         -        Style->SetSymbolWellKnownMark(RL2_GRAPHIC_MARK_STAR);
  1955         -        break;
  1956         -      case 4:
  1957         -        Style->SetSymbolWellKnownMark(RL2_GRAPHIC_MARK_CROSS);
  1958         -        break;
  1959         -      case 5:
  1960         -        Style->SetSymbolWellKnownMark(RL2_GRAPHIC_MARK_X);
  1961         -        break;
  1962         -      default:
  1963         -        Style->SetSymbolWellKnownMark(RL2_GRAPHIC_MARK_SQUARE);
  1964         -        break;
  1965         -    };
  1966         -}
  1967         -
  1968         -void QuickStyleVectorDialog::
  1969         -OnCmdPointColorFillChanged(wxCommandEvent & WXUNUSED(event))
  1970         -{
  1971         -//
  1972         -// Fill color changed: updating the visual sample
  1973         -//
  1974         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FILL_COLOR);
  1975         -  wxStaticBitmap *sampleCtrl =
  1976         -    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_FILL_PICKER_HEX);
  1977         -  wxColour back = wxColour(255, 255, 255);
  1978         -  wxString str = colorCtrl->GetValue();
  1979         -  if (ColorMapEntry::IsValidColor(str) == true)
  1980         -    ColorMapEntry::GetWxColor(str, back);
  1981         -  wxBitmap bmp;
  1982         -  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
  1983         -  sampleCtrl->SetBitmap(bmp);
  1984         -  sampleCtrl->Refresh();
  1985         -  sampleCtrl->Update();
  1986         -}
  1987         -
  1988         -void QuickStyleVectorDialog::
  1989         -OnCmdPointColorFillPicker(wxCommandEvent & WXUNUSED(event))
  1990         -{
  1991         -//
  1992         -// color picker
  1993         -//
  1994         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FILL_COLOR);
  1995         -  wxColour clr = wxNullColour;
  1996         -  wxString str = colorCtrl->GetValue();
  1997         -  if (ColorMapEntry::IsValidColor(str) == true)
  1998         -    ColorMapEntry::GetWxColor(str, clr);
  1999         -  wxColour color = wxGetColourFromUser(this, clr);
  2000         -  if (color.IsOk() == true)
  2001         -    {
  2002         -      char hex[16];
  2003         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  2004         -      wxString str = wxString::FromUTF8(hex);
  2005         -      colorCtrl->SetValue(str);
  2006         -    }
  2007         -}
  2008         -
  2009         -void QuickStyleVectorDialog::
  2010         -OnCmdPointColorStrokeChanged(wxCommandEvent & WXUNUSED(event))
  2011         -{
  2012         -//
  2013         -// Stroke color changed: updating the visual sample
  2014         -//
  2015         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE_COLOR);
  2016         -  wxStaticBitmap *sampleCtrl =
  2017         -    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_STROKE_PICKER_HEX);
  2018         -  wxColour back = wxColour(255, 255, 255);
  2019         -  wxString str = colorCtrl->GetValue();
  2020         -  if (ColorMapEntry::IsValidColor(str) == true)
  2021         -    ColorMapEntry::GetWxColor(str, back);
  2022         -  wxBitmap bmp;
  2023         -  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
  2024         -  sampleCtrl->SetBitmap(bmp);
  2025         -  sampleCtrl->Refresh();
  2026         -  sampleCtrl->Update();
  2027         -}
  2028         -
  2029         -void QuickStyleVectorDialog::
  2030         -OnCmdPointColorStrokePicker(wxCommandEvent & WXUNUSED(event))
  2031         -{
  2032         -//
  2033         -// color picker
  2034         -//
  2035         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE_COLOR);
  2036         -  wxColour clr = wxNullColour;
  2037         -  wxString str = colorCtrl->GetValue();
  2038         -  if (ColorMapEntry::IsValidColor(str) == true)
  2039         -    ColorMapEntry::GetWxColor(str, clr);
  2040         -  wxColour color = wxGetColourFromUser(this, clr);
  2041         -  if (color.IsOk() == true)
  2042         -    {
  2043         -      char hex[16];
  2044         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  2045         -      wxString str = wxString::FromUTF8(hex);
  2046         -      colorCtrl->SetValue(str);
  2047         -    }
  2048         -}
  2049         -
  2050         -wxPanel *QuickStyleVectorDialog::CreateLinePage(wxWindow * parent)
  2051         -{
  2052         -//
  2053         -// creating the Line Symbolizer page
  2054         -//
  2055         -  wxString StrokeColor = wxT("#000000");
  2056         -  wxPanel *panel = new wxPanel(parent, ID_PANE_LINE);
  2057         -  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
  2058         -  panel->SetSizer(topSizer);
  2059         -  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
  2060         -  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
  2061         -// first row A: the Stroke #1 Opacity and Perpendicular Offset
  2062         -  boxSizer->AddSpacer(50);
  2063         -  wxBoxSizer *opacityBoxSizer = new wxBoxSizer(wxVERTICAL);
  2064         -  boxSizer->Add(opacityBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2065         -  wxStaticBox *opacityBox = new wxStaticBox(panel, wxID_STATIC,
  2066         -                                            wxT("Opacity"),
  2067         -                                            wxDefaultPosition,
  2068         -                                            wxDefaultSize);
  2069         -  wxBoxSizer *opacitySizer = new wxStaticBoxSizer(opacityBox, wxHORIZONTAL);
  2070         -  opacityBoxSizer->Add(opacitySizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2071         -  wxSlider *opacityCtrl =
  2072         -    new wxSlider(panel, ID_SYMBOLIZER_STROKE1_OPACITY, 100, 0, 100,
  2073         -                 wxDefaultPosition, wxSize(600, 45),
  2074         -                 wxSL_HORIZONTAL | wxSL_LABELS);
  2075         -  opacitySizer->Add(opacityCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2076         -// first row B: PerpendicularOffset
  2077         -  wxBoxSizer *perpendicularBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2078         -  opacityBoxSizer->Add(perpendicularBoxSizer, 0,
  2079         -                       wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2080         -  wxStaticBox *perpendicularBox = new wxStaticBox(panel, wxID_STATIC,
  2081         -                                                  wxT("Perpendicular Offset"),
  2082         -                                                  wxDefaultPosition,
  2083         -                                                  wxDefaultSize);
  2084         -  wxBoxSizer *perpendicularSizer =
  2085         -    new wxStaticBoxSizer(perpendicularBox, wxVERTICAL);
  2086         -  perpendicularBoxSizer->Add(perpendicularSizer, 0,
  2087         -                             wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2088         -  wxBoxSizer *perp1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2089         -  perpendicularSizer->Add(perp1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2090         -  wxTextCtrl *perpendicularCtrl =
  2091         -    new wxTextCtrl(panel, ID_SYMBOLIZER_STROKE1_PERPENDICULAR, wxT("0.0"),
  2092         -                   wxDefaultPosition, wxSize(100, 22));
  2093         -  perp1Sizer->Add(perpendicularCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2094         -  wxStaticText *perp1Label = new wxStaticText(panel, wxID_STATIC,
  2095         -                                              wxT
  2096         -                                              ("Draw lines in parallel to the original geometry."));
  2097         -  perp1Sizer->Add(perp1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2098         -  wxStaticText *perp2Label = new wxStaticText(panel, wxID_STATIC,
  2099         -                                              wxT
  2100         -                                              ("Positive to the left-hand side. Negative numbers mean right."));
  2101         -  perpendicularSizer->Add(perp2Label, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2102         -// second row: Stroke color or Graphic
  2103         -  wxBoxSizer *strokeSizer = new wxBoxSizer(wxHORIZONTAL);
  2104         -  boxSizer->Add(strokeSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2105         -// second row B: Stroke Color
  2106         -  wxBoxSizer *colorBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2107         -  strokeSizer->Add(colorBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2108         -  wxStaticBox *colorBox = new wxStaticBox(panel, wxID_STATIC,
  2109         -                                          wxT("Stroke Color"),
  2110         -                                          wxDefaultPosition,
  2111         -                                          wxDefaultSize);
  2112         -  wxBoxSizer *colorSizer = new wxStaticBoxSizer(colorBox, wxVERTICAL);
  2113         -  colorBoxSizer->Add(colorSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2114         -  wxBoxSizer *color1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2115         -  colorSizer->Add(color1Sizer, 0, wxALIGN_RIGHT | wxALL, 0);
  2116         -  wxTextCtrl *colorCtrl =
  2117         -    new wxTextCtrl(panel, ID_SYMBOLIZER_STROKE1_COLOR, StrokeColor,
  2118         -                   wxDefaultPosition, wxSize(80, 22));
  2119         -  color1Sizer->Add(colorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2120         -  wxBitmap bmp;
  2121         -  wxColour color(0, 0, 0);
  2122         -  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
  2123         -  wxStaticBitmap *sampleCtrl =
  2124         -    new wxStaticBitmap(panel, ID_SYMBOLIZER_STROKE1_PICKER_HEX, bmp,
  2125         -                       wxDefaultPosition, wxSize(32, 32));
  2126         -  color1Sizer->Add(sampleCtrl, 0, wxALIGN_RIGHT | wxALL, 5);
  2127         -  wxBoxSizer *pickerSizer = new wxBoxSizer(wxHORIZONTAL);
  2128         -  colorSizer->Add(pickerSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2129         -  wxButton *pick =
  2130         -    new wxButton(panel, ID_SYMBOLIZER_STROKE1_PICKER_BTN, wxT("&Pick a color"));
  2131         -  pickerSizer->Add(pick, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2132         -// third row: Stroke-Width 
  2133         -  wxBoxSizer *miscSizer = new wxBoxSizer(wxHORIZONTAL);
  2134         -  colorBoxSizer->Add(miscSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2135         -// third row A: StrokeWidth
  2136         -  wxBoxSizer *widthBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2137         -  miscSizer->Add(widthBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2138         -  wxStaticBox *widthBox = new wxStaticBox(panel, wxID_STATIC,
  2139         -                                          wxT("Stroke Width"),
  2140         -                                          wxDefaultPosition,
  2141         -                                          wxDefaultSize);
  2142         -  wxBoxSizer *widthSizer = new wxStaticBoxSizer(widthBox, wxVERTICAL);
  2143         -  widthBoxSizer->Add(widthSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2144         -  wxTextCtrl *widthCtrl =
  2145         -    new wxTextCtrl(panel, ID_SYMBOLIZER_STROKE1_WIDTH, wxT("1.0"),
  2146         -                   wxDefaultPosition, wxSize(100, 22));
  2147         -  widthSizer->Add(widthCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2148         -// third row D: DashArray and DashOffset
  2149         -  wxBoxSizer *dashBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2150         -  miscSizer->Add(dashBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2151         -  wxString dot[4];
  2152         -  dot[0] = wxT("&Solid Line");
  2153         -  dot[1] = wxT("&Dotted Line");
  2154         -  dot[2] = wxT("&Dashed Line");
  2155         -  dot[3] = wxT("&Dashed/Dotted Line");
  2156         -  wxRadioBox *dotBox = new wxRadioBox(panel, ID_SYMBOLIZER_DASH_DOT,
  2157         -                                      wxT("&Dash/Dot Style"),
  2158         -                                      wxDefaultPosition,
  2159         -                                      wxDefaultSize, 4,
  2160         -                                      dot, 1,
  2161         -                                      wxRA_SPECIFY_COLS);
  2162         -  dotBox->SetSelection(0);
  2163         -  dashBoxSizer->Add(dotBox, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2164         -  panel->SetSizer(topSizer);
  2165         -  topSizer->Fit(panel);
  2166         -// appends event handlers
  2167         -  Connect(ID_SYMBOLIZER_STROKE1_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
  2168         -          (wxObjectEventFunction) &
  2169         -          QuickStyleVectorDialog::OnCmdLineColorChanged);
  2170         -  Connect(ID_SYMBOLIZER_STROKE1_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
  2171         -          (wxObjectEventFunction) &
  2172         -          QuickStyleVectorDialog::OnCmdLineColorPicker);
  2173         -  return panel;
  2174         -}
  2175         -
  2176         -void QuickStyleVectorDialog::
  2177         -OnCmdLineColorChanged(wxCommandEvent & WXUNUSED(event))
  2178         -{
  2179         -//
  2180         -// Stroke color changed: updating the visual sample
  2181         -//
  2182         -  wxTextCtrl *colorCtrl =
  2183         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_COLOR);
  2184         -  wxStaticBitmap *sampleCtrl =
  2185         -    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_STROKE1_PICKER_HEX);
  2186         -  wxColour back = wxColour(255, 255, 255);
  2187         -  wxString str = colorCtrl->GetValue();
  2188         -  if (ColorMapEntry::IsValidColor(str) == true)
  2189         -    ColorMapEntry::GetWxColor(str, back);
  2190         -  wxBitmap bmp;
  2191         -  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
  2192         -  sampleCtrl->SetBitmap(bmp);
  2193         -  sampleCtrl->Refresh();
  2194         -  sampleCtrl->Update();
  2195         -}
  2196         -
  2197         -void QuickStyleVectorDialog::
  2198         -OnCmdLineColorPicker(wxCommandEvent & WXUNUSED(event))
  2199         -{
  2200         -//
  2201         -// color picker
  2202         -//
  2203         -  wxTextCtrl *colorCtrl =
  2204         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_COLOR);
  2205         -  wxColour clr = wxNullColour;
  2206         -  wxString str = colorCtrl->GetValue();
  2207         -  if (ColorMapEntry::IsValidColor(str) == true)
  2208         -    ColorMapEntry::GetWxColor(str, clr);
  2209         -  wxColour color = wxGetColourFromUser(this, clr);
  2210         -  if (color.IsOk() == true)
  2211         -    {
  2212         -      char hex[16];
  2213         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  2214         -      wxString str = wxString::FromUTF8(hex);
  2215         -      colorCtrl->SetValue(str);
  2216         -    }
  2217         -}
  2218         -
  2219         -wxPanel *QuickStyleVectorDialog::CreatePolygonPage(wxWindow * parent)
  2220         -{
  2221         -//
  2222         -// creating the Polygon Symbolizer page
  2223         -//
  2224         -  wxString StrokeColor = wxT("#000000");
  2225         -  wxString FillColor = wxT("#808080");
  2226         -  wxPanel *panel = new wxPanel(parent, ID_PANE_FILL2);
  2227         -  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
  2228         -  panel->SetSizer(topSizer);
  2229         -  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
  2230         -  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
  2231         -// first row: the Polygon Displacement and Perpendicular Offset
  2232         -  wxBoxSizer *polygonBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2233         -  boxSizer->Add(polygonBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2234         -// first row A: Displacement
  2235         -  wxBoxSizer *displacementBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2236         -  polygonBoxSizer->Add(displacementBoxSizer, 0,
  2237         -                       wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2238         -  wxStaticBox *displacementBox = new wxStaticBox(panel, wxID_STATIC,
  2239         -                                                 wxT("Displacement"),
  2240         -                                                 wxDefaultPosition,
  2241         -                                                 wxDefaultSize);
  2242         -  wxBoxSizer *displacementSizer =
  2243         -    new wxStaticBoxSizer(displacementBox, wxVERTICAL);
  2244         -  displacementBoxSizer->Add(displacementSizer, 0,
  2245         -                            wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2246         -  wxBoxSizer *displ1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2247         -  displacementSizer->Add(displ1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2248         -  wxStaticText *displ1Label = new wxStaticText(panel, wxID_STATIC, wxT("X"));
  2249         -  displ1Sizer->Add(displ1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2250         -  wxTextCtrl *displacementXCtrl =
  2251         -    new wxTextCtrl(panel, ID_SYMBOLIZER_POLYGON1_DISPLACEMENT_X, wxT("0.0"),
  2252         -                   wxDefaultPosition, wxSize(100, 22));
  2253         -  displ1Sizer->Add(displacementXCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2254         -  wxBoxSizer *displ2Sizer = new wxBoxSizer(wxHORIZONTAL);
  2255         -  displacementSizer->Add(displ2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2256         -  wxStaticText *displ2Label = new wxStaticText(panel, wxID_STATIC, wxT("Y"));
  2257         -  displ2Sizer->Add(displ2Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2258         -  wxTextCtrl *displacementYCtrl =
  2259         -    new wxTextCtrl(panel, ID_SYMBOLIZER_POLYGON1_DISPLACEMENT_Y, wxT("0.0"),
  2260         -                   wxDefaultPosition, wxSize(100, 22));
  2261         -  displ2Sizer->Add(displacementYCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2262         -// first row B: PerpendicularOffset
  2263         -  wxBoxSizer *perpendicularBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2264         -  polygonBoxSizer->Add(perpendicularBoxSizer, 0,
  2265         -                       wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2266         -  wxStaticBox *perpendicularBox = new wxStaticBox(panel, wxID_STATIC,
  2267         -                                                  wxT("Perpendicular Offset"),
  2268         -                                                  wxDefaultPosition,
  2269         -                                                  wxDefaultSize);
  2270         -  wxBoxSizer *perpendicularSizer =
  2271         -    new wxStaticBoxSizer(perpendicularBox, wxVERTICAL);
  2272         -  perpendicularBoxSizer->Add(perpendicularSizer, 0,
  2273         -                             wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2274         -  wxBoxSizer *perp1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2275         -  perpendicularSizer->Add(perp1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2276         -  wxTextCtrl *perpendicularCtrl =
  2277         -    new wxTextCtrl(panel, ID_SYMBOLIZER_POLYGON1_PERPENDICULAR, wxT("0.0"),
  2278         -                   wxDefaultPosition, wxSize(100, 22));
  2279         -  perp1Sizer->Add(perpendicularCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2280         -  wxStaticText *perp1Label = new wxStaticText(panel, wxID_STATIC,
  2281         -                                              wxT
  2282         -                                              ("Positive: larger. / Negative: smaller."));
  2283         -  perp1Sizer->Add(perp1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2284         -  wxStaticText *perp2Label = new wxStaticText(panel, wxID_STATIC,
  2285         -                                              wxT
  2286         -                                              ("Drawing polygons smaller or larger than their actual geometry (Buffer)."));
  2287         -  perpendicularSizer->Add(perp2Label, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2288         -// second row: Fill Opacity
  2289         -  wxBoxSizer *auxBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2290         -  boxSizer->Add(auxBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2291         -  wxStaticBox *auxBox = new wxStaticBox(panel, wxID_STATIC,
  2292         -                                        wxT("Polygon Fill"),
  2293         -                                        wxDefaultPosition,
  2294         -                                        wxDefaultSize);
  2295         -  wxBoxSizer *auxSizer = new wxStaticBoxSizer(auxBox, wxHORIZONTAL);
  2296         -  auxBoxSizer->Add(auxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2297         -  wxBoxSizer *enableSizer = new wxBoxSizer(wxHORIZONTAL);
  2298         -  auxSizer->Add(enableSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2299         -  wxCheckBox *enableCtrl = new wxCheckBox(panel, ID_SYMBOLIZER_FILL2_ENABLE,
  2300         -                                          wxT("Enable"),
  2301         -                                          wxDefaultPosition, wxDefaultSize);
  2302         -  enableCtrl->SetValue(Style->IsPolygonFill());
  2303         -  enableSizer->Add(enableCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2304         -  wxBoxSizer *opacityBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2305         -  enableSizer->Add(opacityBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2306         -  wxStaticBox *opacityBox = new wxStaticBox(panel, wxID_STATIC,
  2307         -                                            wxT("Opacity"),
  2308         -                                            wxDefaultPosition,
  2309         -                                            wxDefaultSize);
  2310         -  wxBoxSizer *opacitySizer = new wxStaticBoxSizer(opacityBox, wxVERTICAL);
  2311         -  opacityBoxSizer->Add(opacitySizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2312         -  wxSlider *opacityCtrl =
  2313         -    new wxSlider(panel, ID_SYMBOLIZER_FILL2_OPACITY, 100, 0, 100,
  2314         -                 wxDefaultPosition, wxSize(400, 45),
  2315         -                 wxSL_HORIZONTAL | wxSL_LABELS);
  2316         -  opacityCtrl->Enable(Style->IsPolygonFill());
  2317         -  opacitySizer->Add(opacityCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2318         -// third row B: Fill Color
  2319         -  wxBoxSizer *colorBoxSizer = new wxBoxSizer(wxVERTICAL);
  2320         -  auxSizer->Add(colorBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2321         -  wxStaticBox *colorBox = new wxStaticBox(panel, wxID_STATIC,
  2322         -                                          wxT("Fill Color"),
  2323         -                                          wxDefaultPosition,
  2324         -                                          wxDefaultSize);
  2325         -  wxBoxSizer *colorSizer = new wxStaticBoxSizer(colorBox, wxVERTICAL);
  2326         -  colorBoxSizer->Add(colorSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2327         -  wxBoxSizer *color1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2328         -  colorSizer->Add(color1Sizer, 0, wxALIGN_RIGHT | wxALL, 0);
  2329         -  wxTextCtrl *colorCtrl =
  2330         -    new wxTextCtrl(panel, ID_SYMBOLIZER_FILL2_COLOR, FillColor,
  2331         -                   wxDefaultPosition, wxSize(80, 22));
  2332         -  color1Sizer->Add(colorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2333         -  wxBitmap bmp;
  2334         -  wxColour color(0, 0, 0);
  2335         -  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
  2336         -  wxStaticBitmap *sampleCtrl =
  2337         -    new wxStaticBitmap(panel, ID_SYMBOLIZER_FILL2_PICKER_HEX, bmp,
  2338         -                       wxDefaultPosition, wxSize(32, 32));
  2339         -  sampleCtrl->Enable(Style->IsPolygonFill());
  2340         -  color1Sizer->Add(sampleCtrl, 0, wxALIGN_RIGHT | wxALL, 5);
  2341         -  wxBoxSizer *pickerSizer = new wxBoxSizer(wxHORIZONTAL);
  2342         -  colorSizer->Add(pickerSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2343         -  wxButton *pick =
  2344         -    new wxButton(panel, ID_SYMBOLIZER_FILL2_PICKER_BTN, wxT("&Pick a color"));
  2345         -  pick->Enable(Style->IsPolygonFill());
  2346         -  pickerSizer->Add(pick, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2347         -// first row A: the Stroke #1 Opacity 
  2348         -  wxBoxSizer *opacity2BoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2349         -  boxSizer->Add(opacity2BoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2350         -  wxStaticBox *enableBox = new wxStaticBox(panel, wxID_STATIC,
  2351         -                                           wxT("Polygon Stroke"),
  2352         -                                           wxDefaultPosition,
  2353         -                                           wxDefaultSize);
  2354         -  wxBoxSizer *enable2Sizer = new wxStaticBoxSizer(enableBox, wxHORIZONTAL);
  2355         -  opacity2BoxSizer->Add(enable2Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2356         -  wxCheckBox *enable2Ctrl = new wxCheckBox(panel, ID_SYMBOLIZER_STROKE2_ENABLE,
  2357         -                                           wxT("Enable"),
  2358         -                                           wxDefaultPosition, wxDefaultSize);
  2359         -  enable2Ctrl->SetValue(Style->IsPolygonStroke());
  2360         -  enable2Sizer->Add(enable2Ctrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2361         -  wxStaticBox *opacity2Box = new wxStaticBox(panel, wxID_STATIC,
  2362         -                                             wxT("Opacity"),
  2363         -                                             wxDefaultPosition,
  2364         -                                             wxDefaultSize);
  2365         -  wxBoxSizer *opacity2Sizer = new wxStaticBoxSizer(opacity2Box, wxVERTICAL);
  2366         -  enable2Sizer->Add(opacity2Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2367         -  wxSlider *opacity2Ctrl =
  2368         -    new wxSlider(panel, ID_SYMBOLIZER_STROKE2_OPACITY, 100, 0, 100,
  2369         -                 wxDefaultPosition, wxSize(250, 45),
  2370         -                 wxSL_HORIZONTAL | wxSL_LABELS);
  2371         -  opacity2Ctrl->Enable(Style->IsPolygonStroke());
  2372         -  opacity2Sizer->Add(opacity2Ctrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2373         -// second row B: Stroke Color
  2374         -  wxStaticBox *color2Box = new wxStaticBox(panel, wxID_STATIC,
  2375         -                                           wxT("Stroke Color"),
  2376         -                                           wxDefaultPosition,
  2377         -                                           wxDefaultSize);
  2378         -  wxBoxSizer *color2Sizer = new wxStaticBoxSizer(color2Box, wxVERTICAL);
  2379         -  enable2Sizer->Add(color2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2380         -  wxBoxSizer *color3Sizer = new wxBoxSizer(wxHORIZONTAL);
  2381         -  color2Sizer->Add(color3Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2382         -  wxTextCtrl *color2Ctrl =
  2383         -    new wxTextCtrl(panel, ID_SYMBOLIZER_STROKE2_COLOR, StrokeColor,
  2384         -                   wxDefaultPosition, wxSize(80, 22));
  2385         -  color2Ctrl->Enable(Style->IsPolygonStroke());
  2386         -  color3Sizer->Add(color2Ctrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2387         -  wxStaticBitmap *sample2Ctrl =
  2388         -    new wxStaticBitmap(panel, ID_SYMBOLIZER_STROKE2_PICKER_HEX, bmp,
  2389         -                       wxDefaultPosition, wxSize(32, 32));
  2390         -  sample2Ctrl->Enable(Style->IsPolygonStroke());
  2391         -  color3Sizer->Add(sample2Ctrl, 0, wxALIGN_RIGHT | wxALL, 5);
  2392         -  wxBoxSizer *picker2Sizer = new wxBoxSizer(wxHORIZONTAL);
  2393         -  color2Sizer->Add(picker2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2394         -  wxButton *pick2 =
  2395         -    new wxButton(panel, ID_SYMBOLIZER_STROKE2_PICKER_BTN, wxT("&Pick a color"));
  2396         -  pick2->Enable(Style->IsPolygonStroke());
  2397         -  picker2Sizer->Add(pick2, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2398         -// third row: Stroke-Width,
  2399         -  wxBoxSizer *miscSizer = new wxBoxSizer(wxHORIZONTAL);
  2400         -  enable2Sizer->Add(miscSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2401         -// third row A: StrokeWidth
  2402         -  wxBoxSizer *widthBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2403         -  miscSizer->Add(widthBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2404         -  wxStaticBox *widthBox = new wxStaticBox(panel, wxID_STATIC,
  2405         -                                          wxT("Stroke Width"),
  2406         -                                          wxDefaultPosition,
  2407         -                                          wxDefaultSize);
  2408         -  wxBoxSizer *widthSizer = new wxStaticBoxSizer(widthBox, wxVERTICAL);
  2409         -  widthBoxSizer->Add(widthSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2410         -  wxTextCtrl *widthCtrl =
  2411         -    new wxTextCtrl(panel, ID_SYMBOLIZER_STROKE2_WIDTH, wxT("1.0"),
  2412         -                   wxDefaultPosition, wxSize(100, 22));
  2413         -  widthCtrl->Enable(false);
  2414         -  widthSizer->Add(widthCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2415         -
  2416         -  panel->SetSizer(topSizer);
  2417         -  topSizer->Fit(panel);
  2418         -// appends event handlers
  2419         -  Connect(ID_SYMBOLIZER_STROKE2_ENABLE, wxEVT_COMMAND_CHECKBOX_CLICKED,
  2420         -          (wxObjectEventFunction) &
  2421         -          QuickStyleVectorDialog::OnCmdPolygonStrokeChanged);
  2422         -  Connect(ID_SYMBOLIZER_FILL2_ENABLE, wxEVT_COMMAND_CHECKBOX_CLICKED,
  2423         -          (wxObjectEventFunction) &
  2424         -          QuickStyleVectorDialog::OnCmdPolygonFillChanged);
  2425         -  Connect(ID_SYMBOLIZER_FILL2_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
  2426         -          (wxObjectEventFunction) &
  2427         -          QuickStyleVectorDialog::OnCmdPolygonColorFillChanged);
  2428         -  Connect(ID_SYMBOLIZER_FILL2_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
  2429         -          (wxObjectEventFunction) &
  2430         -          QuickStyleVectorDialog::OnCmdPolygonColorFillPicker);
  2431         -  Connect(ID_SYMBOLIZER_STROKE2_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
  2432         -          (wxObjectEventFunction) &
  2433         -          QuickStyleVectorDialog::OnCmdPolygonColorStrokeChanged);
  2434         -  Connect(ID_SYMBOLIZER_STROKE2_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
  2435         -          (wxObjectEventFunction) &
  2436         -          QuickStyleVectorDialog::OnCmdPolygonColorStrokePicker);
  2437         -  return panel;
  2438         -}
  2439         -
  2440         -void QuickStyleVectorDialog::
  2441         -OnCmdPolygonStrokeChanged(wxCommandEvent & WXUNUSED(event))
  2442         -{
  2443         -//
  2444         -// Stroke enable/disable 
  2445         -//
  2446         -  wxCheckBox *enableCtrl =
  2447         -    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_STROKE2_ENABLE);
  2448         -  if (enableCtrl->IsChecked() == true)
  2449         -    Style->SetPolygonStroke(true);
  2450         -  else
  2451         -    Style->SetPolygonStroke(false);
  2452         -  RetrievePolygonPage(false);
  2453         -  UpdatePolygonPage();
  2454         -}
  2455         -
  2456         -void QuickStyleVectorDialog::
  2457         -OnCmdPolygonFillChanged(wxCommandEvent & WXUNUSED(event))
  2458         -{
  2459         -//
  2460         -// Fill enable/disable 
  2461         -//
  2462         -  wxCheckBox *enableCtrl =
  2463         -    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_FILL2_ENABLE);
  2464         -  if (enableCtrl->IsChecked() == true)
  2465         -    Style->SetPolygonFill(true);
  2466         -  else
  2467         -    Style->SetPolygonFill(false);
  2468         -  RetrievePolygonPage(false);
  2469         -  UpdatePolygonPage();
  2470         -}
  2471         -
  2472         -void QuickStyleVectorDialog::
  2473         -OnCmdPolygonColorFillChanged(wxCommandEvent & WXUNUSED(event))
  2474         -{
  2475         -//
  2476         -// Fill color changed: updating the visual sample
  2477         -//
  2478         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FILL2_COLOR);
  2479         -  wxStaticBitmap *sampleCtrl =
  2480         -    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_FILL2_PICKER_HEX);
  2481         -  wxColour back = wxColour(255, 255, 255);
  2482         -  wxString str = colorCtrl->GetValue();
  2483         -  if (ColorMapEntry::IsValidColor(str) == true)
  2484         -    ColorMapEntry::GetWxColor(str, back);
  2485         -  wxBitmap bmp;
  2486         -  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
  2487         -  sampleCtrl->SetBitmap(bmp);
  2488         -  sampleCtrl->Refresh();
  2489         -  sampleCtrl->Update();
  2490         -}
  2491         -
  2492         -void QuickStyleVectorDialog::
  2493         -OnCmdPolygonColorFillPicker(wxCommandEvent & WXUNUSED(event))
  2494         -{
  2495         -//
  2496         -// color picker
  2497         -//
  2498         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FILL2_COLOR);
  2499         -  wxColour clr = wxNullColour;
  2500         -  wxString str = colorCtrl->GetValue();
  2501         -  if (ColorMapEntry::IsValidColor(str) == true)
  2502         -    ColorMapEntry::GetWxColor(str, clr);
  2503         -  wxColour color = wxGetColourFromUser(this, clr);
  2504         -  if (color.IsOk() == true)
  2505         -    {
  2506         -      char hex[16];
  2507         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  2508         -      wxString str = wxString::FromUTF8(hex);
  2509         -      colorCtrl->SetValue(str);
  2510         -    }
  2511         -}
  2512         -
  2513         -void QuickStyleVectorDialog::
  2514         -OnCmdPolygonColorStrokeChanged(wxCommandEvent & WXUNUSED(event))
  2515         -{
  2516         -//
  2517         -// Stroke color changed: updating the visual sample
  2518         -//
  2519         -  wxTextCtrl *colorCtrl =
  2520         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE2_COLOR);
  2521         -  wxStaticBitmap *sampleCtrl =
  2522         -    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_STROKE2_PICKER_HEX);
  2523         -  wxColour back = wxColour(255, 255, 255);
  2524         -  wxString str = colorCtrl->GetValue();
  2525         -  if (ColorMapEntry::IsValidColor(str) == true)
  2526         -    ColorMapEntry::GetWxColor(str, back);
  2527         -  wxBitmap bmp;
  2528         -  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
  2529         -  sampleCtrl->SetBitmap(bmp);
  2530         -  sampleCtrl->Refresh();
  2531         -  sampleCtrl->Update();
  2532         -}
  2533         -
  2534         -void QuickStyleVectorDialog::
  2535         -OnCmdPolygonColorStrokePicker(wxCommandEvent & WXUNUSED(event))
  2536         -{
  2537         -//
  2538         -// color picker
  2539         -//
  2540         -  wxTextCtrl *colorCtrl =
  2541         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE2_COLOR);
  2542         -  wxColour clr = wxNullColour;
  2543         -  wxString str = colorCtrl->GetValue();
  2544         -  if (ColorMapEntry::IsValidColor(str) == true)
  2545         -    ColorMapEntry::GetWxColor(str, clr);
  2546         -  wxColour color = wxGetColourFromUser(this, clr);
  2547         -  if (color.IsOk() == true)
  2548         -    {
  2549         -      char hex[16];
  2550         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  2551         -      wxString str = wxString::FromUTF8(hex);
  2552         -      colorCtrl->SetValue(str);
  2553         -    }
  2554         -}
  2555         -
  2556         -bool QuickStyleVectorDialog::DoCheckDatasource(const char *prefix,
  2557         -                                               const char *coverage,
  2558         -                                               char *table, char *geometry)
  2559         -{
  2560         -//
  2561         -// retrieving the real table and geometry column names
  2562         -//
  2563         -  sqlite3 *sqlite = MainFrame->GetSqlite();
  2564         -  char *sql;
  2565         -  int ret;
  2566         -  char **results;
  2567         -  int rows;
  2568         -  int columns;
  2569         -  int i;
  2570         -  char *qprefix;
  2571         -  bool ok = false;
  2572         -
  2573         -  qprefix = gaiaDoubleQuotedSql(prefix);
  2574         -  sql = sqlite3_mprintf("SELECT f_table_name, f_geometry_column, view_name, "
  2575         -                        "view_geometry, virt_name, virt_geometry "
  2576         -                        "FROM \"%s\".vector_coverages WHERE coverage_name = %Q",
  2577         -                        qprefix, coverage);
  2578         -  free(qprefix);
  2579         -  ret = sqlite3_get_table(sqlite, sql, &results, &rows, &columns, NULL);
  2580         -  sqlite3_free(sql);
  2581         -  if (ret != SQLITE_OK)
  2582         -    return false;
  2583         -  if (rows < 1)
  2584         -    ;
  2585         -  else
  2586         -    {
  2587         -      for (i = 1; i <= rows; i++)
  2588         -        {
  2589         -          const char *t = results[(i * columns) + 0];
  2590         -          const char *g = results[(i * columns) + 1];
  2591         -          if (t != NULL && g != NULL)
  2592         -            {
  2593         -              strcpy(table, t);
  2594         -              strcpy(geometry, g);
  2595         -              ok = true;
  2596         -            }
  2597         -          t = results[(i * columns) + 2];
  2598         -          g = results[(i * columns) + 3];
  2599         -          if (t != NULL && g != NULL)
  2600         -            {
  2601         -              strcpy(table, t);
  2602         -              strcpy(geometry, g);
  2603         -              ok = true;
  2604         -            }
  2605         -          t = results[(i * columns) + 4];
  2606         -          g = results[(i * columns) + 5];
  2607         -          if (t != NULL && g != NULL)
  2608         -            {
  2609         -              strcpy(table, t);
  2610         -              strcpy(geometry, g);
  2611         -              ok = true;
  2612         -            }
  2613         -        }
  2614         -    }
  2615         -  sqlite3_free_table(results);
  2616         -  return ok;
  2617         -}
  2618         -
  2619         -void QuickStyleVectorDialog::InitializeComboColumns(wxComboBox * ctrl)
  2620         -{
  2621         -//
  2622         -// initializing a Column list ComboBox
  2623         -//
  2624         -  sqlite3 *sqlite = MainFrame->GetSqlite();
  2625         -  char *sql;
  2626         -  int ret;
  2627         -  char **results;
  2628         -  int rows;
  2629         -  int columns;
  2630         -  int i;
  2631         -  char prefix[1024];
  2632         -  char coverage[1024];
  2633         -  char table[1024];
  2634         -  char geometry[1024];
  2635         -  char *qprefix;
  2636         -  char *qtable;
  2637         -
  2638         -  if (DbPrefix.Len() == 0)
  2639         -    strcpy(prefix, "MAIN");
  2640         -  else
  2641         -    strcpy(prefix, DbPrefix.ToUTF8());
  2642         -  strcpy(coverage, LayerName.ToUTF8());
  2643         -  if (DoCheckDatasource(prefix, coverage, table, geometry) != true)
  2644         -    return;
  2645         -
  2646         -  qprefix = gaiaDoubleQuotedSql(prefix);
  2647         -  qtable = gaiaDoubleQuotedSql(table);
  2648         -  sql = sqlite3_mprintf("PRAGMA \"%s\".table_info(\"%s\")", qprefix, qtable);
  2649         -  free(qprefix);
  2650         -  free(qtable);
  2651         -  ret = sqlite3_get_table(sqlite, sql, &results, &rows, &columns, NULL);
  2652         -  sqlite3_free(sql);
  2653         -  if (ret != SQLITE_OK)
  2654         -    return;
  2655         -  if (rows < 1)
  2656         -    ;
  2657         -  else
  2658         -    {
  2659         -      for (i = 1; i <= rows; i++)
  2660         -        {
  2661         -          const char *value = results[(i * columns) + 1];
  2662         -          if (strcasecmp(value, geometry) == 0)
  2663         -            continue;           // skipping the Geometry column
  2664         -          wxString col = wxString::FromUTF8(value);
  2665         -          ctrl->Append(col);
  2666         -        }
  2667         -    }
  2668         -  sqlite3_free_table(results);
  2669         -}
  2670         -
  2671         -void QuickStyleVectorDialog::InitializeComboFonts(wxComboBox * ctrl)
  2672         -{
  2673         -//
  2674         -// initializing a Font list ComboBox
  2675         -//
  2676         -  sqlite3 *sqlite = MainFrame->GetSqlite();
  2677         -  char *sql;
  2678         -  int ret;
  2679         -  char **results;
  2680         -  int rows;
  2681         -  int columns;
  2682         -  int i;
  2683         -  char prefix[1024];
  2684         -  char *qprefix;
  2685         -
  2686         -// inserting the default TOY FONTS
  2687         -  wxString font = wxT("ToyFont: serif");
  2688         -  ctrl->Append(font);
  2689         -  font = wxT("ToyFont: sans-serif");
  2690         -  ctrl->Append(font);
  2691         -  font = wxT("ToyFont: monospace");
  2692         -  ctrl->Append(font);
  2693         -
  2694         -  if (DbPrefix.Len() == 0)
  2695         -    strcpy(prefix, "MAIN");
  2696         -  else
  2697         -    strcpy(prefix, DbPrefix.ToUTF8());
  2698         -  qprefix = gaiaDoubleQuotedSql(prefix);
  2699         -  sql =
  2700         -    sqlite3_mprintf
  2701         -    ("SELECT font_facename FROM \"%s\".SE_fonts ORDER BY font_facename",
  2702         -     qprefix);
  2703         -  free(qprefix);
  2704         -  ret = sqlite3_get_table(sqlite, sql, &results, &rows, &columns, NULL);
  2705         -  sqlite3_free(sql);
  2706         -  if (ret != SQLITE_OK)
  2707         -    return;
  2708         -  if (rows < 1)
  2709         -    ;
  2710         -  else
  2711         -    {
  2712         -      for (i = 1; i <= rows; i++)
  2713         -        {
  2714         -          const char *value = results[(i * columns) + 0];
  2715         -          wxString col = wxString::FromUTF8(value);
  2716         -          ctrl->Append(col);
  2717         -        }
  2718         -    }
  2719         -  sqlite3_free_table(results);
  2720         -}
  2721         -
  2722         -wxPanel *QuickStyleVectorDialog::CreateTextPointPage(wxWindow * parent)
  2723         -{
  2724         -//
  2725         -// creating the Text Symbolizer page (Point Placement)
  2726         -//
  2727         -  wxString FillColor = wxT("#808080");
  2728         -  wxPanel *panel = new wxPanel(parent, ID_PANE_TEXT1);
  2729         -  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
  2730         -  panel->SetSizer(topSizer);
  2731         -  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
  2732         -  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
  2733         -// enable/disable Labels
  2734         -  wxBoxSizer *auxBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2735         -  boxSizer->Add(auxBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2736         -  wxStaticBox *auxBox = new wxStaticBox(panel, wxID_STATIC,
  2737         -                                        wxT("Labels"),
  2738         -                                        wxDefaultPosition,
  2739         -                                        wxDefaultSize);
  2740         -  wxBoxSizer *auxSizer = new wxStaticBoxSizer(auxBox, wxVERTICAL);
  2741         -  auxBoxSizer->Add(auxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2742         -  wxBoxSizer *enableSizer = new wxBoxSizer(wxHORIZONTAL);
  2743         -  auxSizer->Add(enableSizer, 0, wxALIGN_LEFT | wxALL, 5);
  2744         -  wxCheckBox *enableCtrl = new wxCheckBox(panel, ID_SYMBOLIZER_TEXT1_ENABLE,
  2745         -                                          wxT("Enable"),
  2746         -                                          wxDefaultPosition, wxDefaultSize);
  2747         -  enableCtrl->SetValue(Style->IsLabelPrint());
  2748         -  enableSizer->Add(enableCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2749         -  enableSizer->AddSpacer(20);
  2750         -  enableSizer->AddSpacer(20);
  2751         -  enableSizer->AddSpacer(20);
  2752         -  enableSizer->AddSpacer(20);
  2753         -  wxStaticText *columnLabel =
  2754         -    new wxStaticText(panel, wxID_STATIC, wxT("&Column:"));
  2755         -  enableSizer->Add(columnLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2756         -  wxComboBox *columnList =
  2757         -    new wxComboBox(panel, ID_SYMBOLIZER_TEXT1_LABEL, wxT(""), wxDefaultPosition,
  2758         -                   wxSize(400, 22), 0, NULL, wxCB_DROPDOWN | wxCB_READONLY);
  2759         -  InitializeComboColumns(columnList);
  2760         -  enableSizer->Add(columnList, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2761         -
  2762         -
  2763         -  wxStaticBox *fontBox = new wxStaticBox(panel, wxID_STATIC,
  2764         -                                         wxT("Font"),
  2765         -                                         wxDefaultPosition,
  2766         -                                         wxDefaultSize);
  2767         -  wxBoxSizer *font9Sizer = new wxStaticBoxSizer(fontBox, wxHORIZONTAL);
  2768         -  auxSizer->Add(font9Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2769         -// Second row: Font Name, Size and Fill 
  2770         -  wxBoxSizer *fontSizer = new wxBoxSizer(wxHORIZONTAL);
  2771         -  font9Sizer->Add(fontSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2772         -  wxBoxSizer *font0Sizer = new wxBoxSizer(wxHORIZONTAL);
  2773         -  fontSizer->Add(font0Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2774         -// Font Name
  2775         -  wxBoxSizer *fontXSizer = new wxBoxSizer(wxVERTICAL);
  2776         -  font0Sizer->Add(fontXSizer, 0, wxALIGN_LEFT | wxALL, 0);
  2777         -  wxComboBox *fontList =
  2778         -    new wxComboBox(panel, ID_SYMBOLIZER_FONT1_NAME, wxT(""), wxDefaultPosition,
  2779         -                   wxSize(250, 21), 0, NULL, wxCB_DROPDOWN | wxCB_READONLY);
  2780         -  InitializeComboFonts(fontList);
  2781         -  fontList->Select(0);
  2782         -  fontXSizer->Add(fontList, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2783         -// Font Size
  2784         -  wxBoxSizer *fontYSizer = new wxBoxSizer(wxHORIZONTAL);
  2785         -  fontXSizer->Add(fontYSizer, 0, wxALIGN_LEFT | wxALL, 0);
  2786         -  wxStaticBox *sizeBox = new wxStaticBox(panel, wxID_STATIC,
  2787         -                                         wxT("Font Size"),
  2788         -                                         wxDefaultPosition,
  2789         -                                         wxDefaultSize);
  2790         -  wxBoxSizer *sizeSizer = new wxStaticBoxSizer(sizeBox, wxHORIZONTAL);
  2791         -  fontYSizer->Add(sizeSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2792         -  wxTextCtrl *sizeCtrl =
  2793         -    new wxTextCtrl(panel, ID_SYMBOLIZER_FONT1_SIZE, wxT("15.0"),
  2794         -                   wxDefaultPosition, wxSize(100, 22));
  2795         -  sizeSizer->Add(sizeCtrl, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2796         -  wxBoxSizer *boldBoxSizer = new wxBoxSizer(wxVERTICAL);
  2797         -  fontYSizer->Add(boldBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2798         -  wxStaticBox *boldBox = new wxStaticBox(panel, wxID_STATIC,
  2799         -                                         wxT("Font Style"),
  2800         -                                         wxDefaultPosition,
  2801         -                                         wxDefaultSize);
  2802         -  wxBoxSizer *boldSizer = new wxStaticBoxSizer(boldBox, wxVERTICAL);
  2803         -  boldBoxSizer->Add(boldSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2804         -  wxBoxSizer *italicSizer = new wxBoxSizer(wxVERTICAL);
  2805         -  boldSizer->Add(italicSizer, 0, wxALIGN_LEFT | wxALL, 5);
  2806         -  wxCheckBox *italicCtrl = new wxCheckBox(panel, ID_SYMBOLIZER_TEXT1_ITALIC,
  2807         -                                          wxT("Italic"),
  2808         -                                          wxDefaultPosition, wxDefaultSize);
  2809         -  italicCtrl->SetValue(false);
  2810         -  italicCtrl->Enable(false);
  2811         -  italicSizer->Add(italicCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2812         -  wxCheckBox *boldCtrl = new wxCheckBox(panel, ID_SYMBOLIZER_TEXT1_BOLD,
  2813         -                                        wxT("Bold"),
  2814         -                                        wxDefaultPosition, wxDefaultSize);
  2815         -  boldCtrl->SetValue(false);
  2816         -  boldCtrl->Enable(false);
  2817         -  italicSizer->Add(boldCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  2818         -// Font Opacity
  2819         -  wxStaticBox *opacityFontBox = new wxStaticBox(panel, wxID_STATIC,
  2820         -                                                wxT("Opacity"),
  2821         -                                                wxDefaultPosition,
  2822         -                                                wxDefaultSize);
  2823         -  wxBoxSizer *opacityFontSizer =
  2824         -    new wxStaticBoxSizer(opacityFontBox, wxVERTICAL);
  2825         -  fontSizer->Add(opacityFontSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2826         -  wxSlider *opacityFontCtrl =
  2827         -    new wxSlider(panel, ID_SYMBOLIZER_FONT1_OPACITY, 100, 0, 100,
  2828         -                 wxDefaultPosition, wxSize(150, 45),
  2829         -                 wxSL_HORIZONTAL | wxSL_LABELS);
  2830         -  opacityFontSizer->Add(opacityFontCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2831         -// Font color
  2832         -  wxStaticBox *fontColorBox = new wxStaticBox(panel, wxID_STATIC,
  2833         -                                              wxT("Color"),
  2834         -                                              wxDefaultPosition,
  2835         -                                              wxDefaultSize);
  2836         -  wxBoxSizer *fontColorSizer = new wxStaticBoxSizer(fontColorBox, wxVERTICAL);
  2837         -  fontSizer->Add(fontColorSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2838         -  wxBoxSizer *font2Sizer = new wxBoxSizer(wxHORIZONTAL);
  2839         -  fontColorSizer->Add(font2Sizer, 0, wxALIGN_RIGHT | wxALL, 0);
  2840         -  wxTextCtrl *fontCtrl = new wxTextCtrl(panel, ID_SYMBOLIZER_FONT1_COLOR,
  2841         -                                        FillColor,
  2842         -                                        wxDefaultPosition, wxSize(80, 22));
  2843         -  font2Sizer->Add(fontCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2844         -  wxBitmap bmp;
  2845         -  wxColour color(0, 0, 0);
  2846         -  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
  2847         -  wxStaticBitmap *sampleFontCtrl =
  2848         -    new wxStaticBitmap(panel, ID_SYMBOLIZER_FONT1_PICKER_HEX, bmp,
  2849         -                       wxDefaultPosition, wxSize(32, 32));
  2850         -  font2Sizer->Add(sampleFontCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2851         -  wxButton *pickFont = new wxButton(panel, ID_SYMBOLIZER_FONT1_PICKER_BTN,
  2852         -                                    wxT("&Pick a color"));
  2853         -  fontColorSizer->Add(pickFont, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2854         -// first row: PointPlacement
  2855         -  wxBoxSizer *pointBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  2856         -  auxSizer->Add(pointBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2857         -  wxStaticBox *pointBox = new wxStaticBox(panel, wxID_STATIC,
  2858         -                                          wxT("Label Point Placement"),
  2859         -                                          wxDefaultPosition,
  2860         -                                          wxDefaultSize);
  2861         -  wxBoxSizer *pointSizer = new wxStaticBoxSizer(pointBox, wxHORIZONTAL);
  2862         -  pointBoxSizer->Add(pointSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2863         -// first row A: Anchor Point
  2864         -  wxStaticBox *anchorBox = new wxStaticBox(panel, wxID_STATIC,
  2865         -                                           wxT("Anchor Point"),
  2866         -                                           wxDefaultPosition,
  2867         -                                           wxDefaultSize);
  2868         -  wxBoxSizer *anchorSizer = new wxStaticBoxSizer(anchorBox, wxVERTICAL);
  2869         -  pointSizer->Add(anchorSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2870         -  wxBoxSizer *anchor1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2871         -  anchorSizer->Add(anchor1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2872         -  wxStaticText *anchor1Label = new wxStaticText(panel, wxID_STATIC, wxT("X"));
  2873         -  anchor1Sizer->Add(anchor1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2874         -  wxTextCtrl *anchorXCtrl =
  2875         -    new wxTextCtrl(panel, ID_SYMBOLIZER_TEXT_ANCHOR_X, wxT("0.5"),
  2876         -                   wxDefaultPosition, wxSize(60, 22));
  2877         -  anchor1Sizer->Add(anchorXCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2878         -  wxBoxSizer *anchor2Sizer = new wxBoxSizer(wxHORIZONTAL);
  2879         -  anchorSizer->Add(anchor2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2880         -  wxStaticText *anchor2Label = new wxStaticText(panel, wxID_STATIC, wxT("Y"));
  2881         -  anchor2Sizer->Add(anchor2Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2882         -  wxTextCtrl *anchorYCtrl =
  2883         -    new wxTextCtrl(panel, ID_SYMBOLIZER_TEXT_ANCHOR_Y, wxT("0.5"),
  2884         -                   wxDefaultPosition, wxSize(60, 22));
  2885         -  anchor2Sizer->Add(anchorYCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2886         -// first row B: Displacement
  2887         -  wxStaticBox *displacementBox = new wxStaticBox(panel, wxID_STATIC,
  2888         -                                                 wxT("Displacement"),
  2889         -                                                 wxDefaultPosition,
  2890         -                                                 wxDefaultSize);
  2891         -  wxBoxSizer *displacementSizer =
  2892         -    new wxStaticBoxSizer(displacementBox, wxVERTICAL);
  2893         -  pointSizer->Add(displacementSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  2894         -  wxBoxSizer *displ1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2895         -  displacementSizer->Add(displ1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2896         -  wxStaticText *displ1Label = new wxStaticText(panel, wxID_STATIC, wxT("X"));
  2897         -  displ1Sizer->Add(displ1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2898         -  wxTextCtrl *displacementXCtrl =
  2899         -    new wxTextCtrl(panel, ID_SYMBOLIZER_TEXT_DISPLACEMENT_X, wxT("0.0"),
  2900         -                   wxDefaultPosition, wxSize(60, 22));
  2901         -  displ1Sizer->Add(displacementXCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2902         -  wxBoxSizer *displ2Sizer = new wxBoxSizer(wxHORIZONTAL);
  2903         -  displacementSizer->Add(displ2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2904         -  wxStaticText *displ2Label = new wxStaticText(panel, wxID_STATIC, wxT("Y"));
  2905         -  displ2Sizer->Add(displ2Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2906         -  wxTextCtrl *displacementYCtrl =
  2907         -    new wxTextCtrl(panel, ID_SYMBOLIZER_TEXT_DISPLACEMENT_Y, wxT("0.0"),
  2908         -                   wxDefaultPosition, wxSize(60, 22));
  2909         -  displ2Sizer->Add(displacementYCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2910         -// first row C: Rotation
  2911         -  wxStaticBox *rotBox = new wxStaticBox(panel, wxID_STATIC,
  2912         -                                        wxT("Rotation"),
  2913         -                                        wxDefaultPosition,
  2914         -                                        wxDefaultSize);
  2915         -  wxBoxSizer *rotSizer = new wxStaticBoxSizer(rotBox, wxVERTICAL);
  2916         -  pointSizer->Add(rotSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2917         -  wxBoxSizer *rot1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2918         -  rotSizer->Add(rot1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  2919         -  wxTextCtrl *rotCtrl =
  2920         -    new wxTextCtrl(panel, ID_SYMBOLIZER_TEXT_ROTATION, wxT("0.0"),
  2921         -                   wxDefaultPosition, wxSize(60, 22));
  2922         -  rot1Sizer->Add(rotCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2923         -// Font Halo
  2924         -  wxStaticBox *haloBox = new wxStaticBox(panel, wxID_STATIC,
  2925         -                                         wxT("Font Halo"),
  2926         -                                         wxDefaultPosition,
  2927         -                                         wxDefaultSize);
  2928         -  wxBoxSizer *haloSizer = new wxStaticBoxSizer(haloBox, wxVERTICAL);
  2929         -  pointBoxSizer->Add(haloSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2930         -  wxBoxSizer *halo1Sizer = new wxBoxSizer(wxHORIZONTAL);
  2931         -  haloSizer->Add(halo1Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2932         -  wxCheckBox *enableHaloCtrl = new wxCheckBox(panel, ID_SYMBOLIZER_HALO1_ENABLE,
  2933         -                                              wxT("Enable"),
  2934         -                                              wxDefaultPosition, wxDefaultSize);
  2935         -  enableHaloCtrl->SetValue(Style->IsHaloEnabled());
  2936         -  enableHaloCtrl->Enable(false);
  2937         -  halo1Sizer->Add(enableHaloCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2938         -// Halo Radius
  2939         -  wxStaticBox *radiusBox = new wxStaticBox(panel, wxID_STATIC,
  2940         -                                           wxT("Radius"),
  2941         -                                           wxDefaultPosition,
  2942         -                                           wxDefaultSize);
  2943         -  wxBoxSizer *radiusSizer = new wxStaticBoxSizer(radiusBox, wxVERTICAL);
  2944         -  halo1Sizer->Add(radiusSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2945         -  wxTextCtrl *radiusCtrl =
  2946         -    new wxTextCtrl(panel, ID_SYMBOLIZER_HALO1_RADIUS, wxT("1.0"),
  2947         -                   wxDefaultPosition, wxSize(50, 22));
  2948         -  radiusCtrl->Enable(false);
  2949         -  radiusSizer->Add(radiusCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2950         -// Halo Opacity
  2951         -  wxStaticBox *opacityHaloBox = new wxStaticBox(panel, wxID_STATIC,
  2952         -                                                wxT("Opacity"),
  2953         -                                                wxDefaultPosition,
  2954         -                                                wxDefaultSize);
  2955         -  wxBoxSizer *opacityHaloSizer =
  2956         -    new wxStaticBoxSizer(opacityHaloBox, wxVERTICAL);
  2957         -  halo1Sizer->Add(opacityHaloSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2958         -  wxSlider *opacityHaloCtrl =
  2959         -    new wxSlider(panel, ID_SYMBOLIZER_HALO1_OPACITY, 100, 0, 100,
  2960         -                 wxDefaultPosition, wxSize(75, 45),
  2961         -                 wxSL_HORIZONTAL | wxSL_LABELS);
  2962         -  opacityHaloSizer->Add(opacityHaloCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2963         -  opacityHaloCtrl->Enable(false);
  2964         -// Halo color
  2965         -  wxStaticBox *haloColorBox = new wxStaticBox(panel, wxID_STATIC,
  2966         -                                              wxT("Color"),
  2967         -                                              wxDefaultPosition,
  2968         -                                              wxDefaultSize);
  2969         -  wxBoxSizer *haloColorSizer = new wxStaticBoxSizer(haloColorBox, wxHORIZONTAL);
  2970         -  haloSizer->Add(haloColorSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2971         -  wxTextCtrl *haloCtrl = new wxTextCtrl(panel, ID_SYMBOLIZER_HALO1_COLOR,
  2972         -                                        FillColor,
  2973         -                                        wxDefaultPosition, wxSize(80, 22));
  2974         -  haloColorSizer->Add(haloCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2975         -  haloCtrl->Enable(false);
  2976         -  color = wxColour(0, 0, 0);
  2977         -  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
  2978         -  wxStaticBitmap *sampleHaloCtrl =
  2979         -    new wxStaticBitmap(panel, ID_SYMBOLIZER_HALO1_PICKER_HEX, bmp,
  2980         -                       wxDefaultPosition, wxSize(32, 32));
  2981         -  haloColorSizer->Add(sampleHaloCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  2982         -  wxButton *pickHalo = new wxButton(panel, ID_SYMBOLIZER_HALO1_PICKER_BTN,
  2983         -                                    wxT("&Pick a color"));
  2984         -  haloColorSizer->Add(pickHalo, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  2985         -  pickHalo->Enable(false);
  2986         -
  2987         -  panel->SetSizer(topSizer);
  2988         -  topSizer->Fit(panel);
  2989         -// appends event handlers
  2990         -  Connect(ID_SYMBOLIZER_TEXT1_ENABLE,
  2991         -          wxEVT_COMMAND_CHECKBOX_CLICKED,
  2992         -          (wxObjectEventFunction) & QuickStyleVectorDialog::OnCmdLabel1Changed);
  2993         -  Connect(ID_SYMBOLIZER_FONT1_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
  2994         -          (wxObjectEventFunction) &
  2995         -          QuickStyleVectorDialog::OnCmdFont1ColorPicker);
  2996         -  Connect(ID_SYMBOLIZER_FONT1_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
  2997         -          (wxObjectEventFunction) &
  2998         -          QuickStyleVectorDialog::OnCmdFont1ColorChanged);
  2999         -  Connect(ID_SYMBOLIZER_FONT1_NAME, wxEVT_COMMAND_COMBOBOX_SELECTED,
  3000         -          (wxObjectEventFunction) & QuickStyleVectorDialog::OnFont1Changed);
  3001         -  Connect(ID_SYMBOLIZER_HALO1_ENABLE,
  3002         -          wxEVT_COMMAND_CHECKBOX_CLICKED,
  3003         -          (wxObjectEventFunction) &
  3004         -          QuickStyleVectorDialog::OnCmdHalo1EnableChanged);
  3005         -  Connect(ID_SYMBOLIZER_HALO1_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
  3006         -          (wxObjectEventFunction) &
  3007         -          QuickStyleVectorDialog::OnCmdColorHalo1Picker);
  3008         -  Connect(ID_SYMBOLIZER_HALO1_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
  3009         -          (wxObjectEventFunction) &
  3010         -          QuickStyleVectorDialog::OnCmdColorHalo1Changed);
  3011         -  return panel;
  3012         -}
  3013         -
  3014         -void QuickStyleVectorDialog::
  3015         -OnCmdLabel1Changed(wxCommandEvent & WXUNUSED(event))
  3016         -{
  3017         -//
  3018         -// Label enable/disable 
  3019         -//
  3020         -  wxCheckBox *enableCtrl =
  3021         -    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT1_ENABLE);
  3022         -  if (enableCtrl->IsChecked() == true)
  3023         -    {
  3024         -      Style->SetLabelPrint(true);
  3025         -      Style->SetLabelLinePlacement(false);
  3026         -  } else
  3027         -    Style->SetLabelPrint(false);
  3028         -  RetrieveTextPointPage(false);
  3029         -  UpdateTextPointPage();
  3030         -}
  3031         -
  3032         -void QuickStyleVectorDialog::OnFont1Changed(wxCommandEvent & WXUNUSED(event))
  3033         -{
  3034         -//
  3035         -// the Font is changed
  3036         -//
  3037         -  wxCheckBox *boldCtrl = (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT1_BOLD);
  3038         -  wxCheckBox *italicCtrl =
  3039         -    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT1_ITALIC);
  3040         -  wxComboBox *fontList = (wxComboBox *) FindWindow(ID_SYMBOLIZER_FONT1_NAME);
  3041         -  wxString font = fontList->GetValue();
  3042         -  char facename[1024];
  3043         -  strcpy(facename, font.ToUTF8());
  3044         -  if (strncmp(facename, "ToyFont: ", 9) == 0)
  3045         -    {
  3046         -      boldCtrl->Enable(true);
  3047         -      italicCtrl->Enable(true);
  3048         -  } else
  3049         -    {
  3050         -      bool bold = false;
  3051         -      bool italic = false;
  3052         -      MainFrame->CheckTTFont(facename, &bold, &italic);
  3053         -      boldCtrl->SetValue(bold);
  3054         -      italicCtrl->SetValue(italic);
  3055         -      boldCtrl->Enable(false);
  3056         -      italicCtrl->Enable(false);
  3057         -    }
  3058         -}
  3059         -
  3060         -void QuickStyleVectorDialog::
  3061         -OnCmdFont1ColorPicker(wxCommandEvent & WXUNUSED(event))
  3062         -{
  3063         -//
  3064         -// color picker
  3065         -//
  3066         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FONT1_COLOR);
  3067         -  wxColour clr = wxNullColour;
  3068         -  wxString str = colorCtrl->GetValue();
  3069         -  if (ColorMapEntry::IsValidColor(str) == true)
  3070         -    ColorMapEntry::GetWxColor(str, clr);
  3071         -  wxColour color = wxGetColourFromUser(this, clr);
  3072         -  if (color.IsOk() == true)
  3073         -    {
  3074         -      char hex[16];
  3075         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  3076         -      wxString str = wxString::FromUTF8(hex);
  3077         -      colorCtrl->SetValue(str);
  3078         -    }
  3079         -}
  3080         -
  3081         -void QuickStyleVectorDialog::
  3082         -OnCmdFont1ColorChanged(wxCommandEvent & WXUNUSED(event))
  3083         -{
  3084         -//
  3085         -// Font Color changed: updating the visual sample
  3086         -//
  3087         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FONT1_COLOR);
  3088         -  wxStaticBitmap *sampleCtrl =
  3089         -    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_FONT1_PICKER_HEX);
  3090         -  wxColour back = wxColour(255, 255, 255);
  3091         -  wxString str = colorCtrl->GetValue();
  3092         -  if (ColorMapEntry::IsValidColor(str) == true)
  3093         -    ColorMapEntry::GetWxColor(str, back);
  3094         -  wxBitmap bmp;
  3095         -  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
  3096         -  sampleCtrl->SetBitmap(bmp);
  3097         -  sampleCtrl->Refresh();
  3098         -  sampleCtrl->Update();
  3099         -}
  3100         -
  3101         -void QuickStyleVectorDialog::
  3102         -OnCmdColorHalo1Picker(wxCommandEvent & WXUNUSED(event))
  3103         -{
  3104         -//
  3105         -// color picker
  3106         -//
  3107         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_HALO1_COLOR);
  3108         -  wxColour clr = wxNullColour;
  3109         -  wxString str = colorCtrl->GetValue();
  3110         -  if (ColorMapEntry::IsValidColor(str) == true)
  3111         -    ColorMapEntry::GetWxColor(str, clr);
  3112         -  wxColour color = wxGetColourFromUser(this, clr);
  3113         -  if (color.IsOk() == true)
  3114         -    {
  3115         -      char hex[16];
  3116         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  3117         -      wxString str = wxString::FromUTF8(hex);
  3118         -      colorCtrl->SetValue(str);
  3119         -    }
  3120         -}
  3121         -
  3122         -void QuickStyleVectorDialog::
  3123         -OnCmdColorHalo1Changed(wxCommandEvent & WXUNUSED(event))
  3124         -{
  3125         -//
  3126         -// Halo Color changed: updating the visual sample
  3127         -//
  3128         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_HALO1_COLOR);
  3129         -  wxStaticBitmap *sampleCtrl =
  3130         -    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_HALO1_PICKER_HEX);
  3131         -  wxColour back = wxColour(255, 255, 255);
  3132         -  wxString str = colorCtrl->GetValue();
  3133         -  if (ColorMapEntry::IsValidColor(str) == true)
  3134         -    ColorMapEntry::GetWxColor(str, back);
  3135         -  wxBitmap bmp;
  3136         -  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
  3137         -  sampleCtrl->SetBitmap(bmp);
  3138         -  sampleCtrl->Refresh();
  3139         -  sampleCtrl->Update();
  3140         -}
  3141         -
  3142         -void QuickStyleVectorDialog::
  3143         -OnCmdHalo1EnableChanged(wxCommandEvent & WXUNUSED(event))
  3144         -{
  3145         -//
  3146         -// Graphic Halo enable/disable 
  3147         -//
  3148         -  wxCheckBox *enableCtrl =
  3149         -    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_HALO1_ENABLE);
  3150         -  if (enableCtrl->IsChecked() == true)
  3151         -    Style->EnableHalo(true);
  3152         -  else
  3153         -    Style->EnableHalo(false);
  3154         -  RetrieveTextPointPage(false);
  3155         -  UpdateTextPointPage();
  3156         -}
  3157         -
  3158         -wxPanel *QuickStyleVectorDialog::CreateTextLinePage(wxWindow * parent)
  3159         -{
  3160         -//
  3161         -// creating the Text Symbolizer page (Line Placement)
  3162         -//
  3163         -  wxString FillColor = wxT("#808080");
  3164         -  wxPanel *panel = new wxPanel(parent, ID_PANE_TEXT1);
  3165         -  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
  3166         -  panel->SetSizer(topSizer);
  3167         -  wxBoxSizer *boxSizer = new wxBoxSizer(wxVERTICAL);
  3168         -  topSizer->Add(boxSizer, 0, wxALIGN_CENTER | wxALL, 5);
  3169         -// enable/disable Labels
  3170         -  wxBoxSizer *auxBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  3171         -  boxSizer->Add(auxBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  3172         -  wxStaticBox *auxBox = new wxStaticBox(panel, wxID_STATIC,
  3173         -                                        wxT("Labels"),
  3174         -                                        wxDefaultPosition,
  3175         -                                        wxDefaultSize);
  3176         -  wxBoxSizer *auxSizer = new wxStaticBoxSizer(auxBox, wxVERTICAL);
  3177         -  auxBoxSizer->Add(auxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  3178         -  wxBoxSizer *enableSizer = new wxBoxSizer(wxHORIZONTAL);
  3179         -  auxSizer->Add(enableSizer, 0, wxALIGN_LEFT | wxALL, 5);
  3180         -  wxCheckBox *enableCtrl = new wxCheckBox(panel, ID_SYMBOLIZER_TEXT2_ENABLE,
  3181         -                                          wxT("Enable"),
  3182         -                                          wxDefaultPosition, wxDefaultSize);
  3183         -  enableCtrl->SetValue(Style->IsLabelPrint());
  3184         -  enableSizer->Add(enableCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  3185         -  enableSizer->AddSpacer(20);
  3186         -  enableSizer->AddSpacer(20);
  3187         -  enableSizer->AddSpacer(20);
  3188         -  enableSizer->AddSpacer(20);
  3189         -  wxStaticText *columnLabel =
  3190         -    new wxStaticText(panel, wxID_STATIC, wxT("&Column:"));
  3191         -  enableSizer->Add(columnLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  3192         -  wxComboBox *columnList =
  3193         -    new wxComboBox(panel, ID_SYMBOLIZER_TEXT2_LABEL, wxT(""), wxDefaultPosition,
  3194         -                   wxSize(400, 22), 0, NULL, wxCB_DROPDOWN | wxCB_READONLY);
  3195         -  InitializeComboColumns(columnList);
  3196         -  enableSizer->Add(columnList, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  3197         -
  3198         -
  3199         -  wxStaticBox *fontBox = new wxStaticBox(panel, wxID_STATIC,
  3200         -                                         wxT("Font"),
  3201         -                                         wxDefaultPosition,
  3202         -                                         wxDefaultSize);
  3203         -  wxBoxSizer *font9Sizer = new wxStaticBoxSizer(fontBox, wxHORIZONTAL);
  3204         -  auxSizer->Add(font9Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  3205         -// Second row: Font Name, Size and Fill 
  3206         -  wxBoxSizer *fontSizer = new wxBoxSizer(wxHORIZONTAL);
  3207         -  font9Sizer->Add(fontSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  3208         -  wxBoxSizer *font0Sizer = new wxBoxSizer(wxHORIZONTAL);
  3209         -  fontSizer->Add(font0Sizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  3210         -// Font Name
  3211         -  wxBoxSizer *fontXSizer = new wxBoxSizer(wxVERTICAL);
  3212         -  font0Sizer->Add(fontXSizer, 0, wxALIGN_LEFT | wxALL, 0);
  3213         -  wxComboBox *fontList =
  3214         -    new wxComboBox(panel, ID_SYMBOLIZER_FONT2_NAME, wxT(""), wxDefaultPosition,
  3215         -                   wxSize(250, 21), 0, NULL, wxCB_DROPDOWN | wxCB_READONLY);
  3216         -  InitializeComboFonts(fontList);
  3217         -  fontList->Select(0);
  3218         -  fontXSizer->Add(fontList, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  3219         -// Font Size
  3220         -  wxBoxSizer *fontYSizer = new wxBoxSizer(wxHORIZONTAL);
  3221         -  fontXSizer->Add(fontYSizer, 0, wxALIGN_LEFT | wxALL, 0);
  3222         -  wxStaticBox *sizeBox = new wxStaticBox(panel, wxID_STATIC,
  3223         -                                         wxT("Font Size"),
  3224         -                                         wxDefaultPosition,
  3225         -                                         wxDefaultSize);
  3226         -  wxBoxSizer *sizeSizer = new wxStaticBoxSizer(sizeBox, wxVERTICAL);
  3227         -  fontYSizer->Add(sizeSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  3228         -  wxTextCtrl *sizeCtrl =
  3229         -    new wxTextCtrl(panel, ID_SYMBOLIZER_FONT2_SIZE, wxT("15.0"),
  3230         -                   wxDefaultPosition, wxSize(100, 22));
  3231         -  sizeSizer->Add(sizeCtrl, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  3232         -  wxBoxSizer *boldBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  3233         -  fontYSizer->Add(boldBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  3234         -  wxStaticBox *boldBox = new wxStaticBox(panel, wxID_STATIC,
  3235         -                                         wxT("Font Style"),
  3236         -                                         wxDefaultPosition,
  3237         -                                         wxDefaultSize);
  3238         -  wxBoxSizer *boldSizer = new wxStaticBoxSizer(boldBox, wxHORIZONTAL);
  3239         -  boldBoxSizer->Add(boldSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  3240         -  wxBoxSizer *italicSizer = new wxBoxSizer(wxHORIZONTAL);
  3241         -  boldSizer->Add(italicSizer, 0, wxALIGN_LEFT | wxALL, 5);
  3242         -  wxCheckBox *italicCtrl = new wxCheckBox(panel, ID_SYMBOLIZER_TEXT2_ITALIC,
  3243         -                                          wxT("Italic"),
  3244         -                                          wxDefaultPosition, wxDefaultSize);
  3245         -  italicCtrl->SetValue(false);
  3246         -  italicCtrl->Enable(false);
  3247         -  italicSizer->Add(italicCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  3248         -  wxCheckBox *boldCtrl = new wxCheckBox(panel, ID_SYMBOLIZER_TEXT2_BOLD,
  3249         -                                        wxT("Bold"),
  3250         -                                        wxDefaultPosition, wxDefaultSize);
  3251         -  boldCtrl->SetValue(false);
  3252         -  boldCtrl->Enable(false);
  3253         -  italicSizer->Add(boldCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  3254         -// Font Opacity
  3255         -  wxStaticBox *opacityFontBox = new wxStaticBox(panel, wxID_STATIC,
  3256         -                                                wxT("Opacity"),
  3257         -                                                wxDefaultPosition,
  3258         -                                                wxDefaultSize);
  3259         -  wxBoxSizer *opacityFontSizer =
  3260         -    new wxStaticBoxSizer(opacityFontBox, wxVERTICAL);
  3261         -  fontSizer->Add(opacityFontSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  3262         -  wxSlider *opacityFontCtrl =
  3263         -    new wxSlider(panel, ID_SYMBOLIZER_FONT2_OPACITY, 100, 0, 100,
  3264         -                 wxDefaultPosition, wxSize(150, 35),
  3265         -                 wxSL_HORIZONTAL | wxSL_LABELS);
  3266         -  opacityFontSizer->Add(opacityFontCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  3267         -// Font color
  3268         -  wxStaticBox *fontColorBox = new wxStaticBox(panel, wxID_STATIC,
  3269         -                                              wxT("Color"),
  3270         -                                              wxDefaultPosition,
  3271         -                                              wxDefaultSize);
  3272         -  wxBoxSizer *fontColorSizer = new wxStaticBoxSizer(fontColorBox, wxHORIZONTAL);
  3273         -  fontSizer->Add(fontColorSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  3274         -  wxBoxSizer *font2Sizer = new wxBoxSizer(wxVERTICAL);
  3275         -  fontColorSizer->Add(font2Sizer, 0, wxALIGN_RIGHT | wxALL, 0);
  3276         -  wxTextCtrl *fontCtrl = new wxTextCtrl(panel, ID_SYMBOLIZER_FONT2_COLOR,
  3277         -                                        FillColor,
  3278         -                                        wxDefaultPosition, wxSize(80, 22));
  3279         -  font2Sizer->Add(fontCtrl, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 2);
  3280         -  wxBitmap bmp;
  3281         -  wxColour color(0, 0, 0);
  3282         -  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
  3283         -  wxStaticBitmap *sampleFontCtrl =
  3284         -    new wxStaticBitmap(panel, ID_SYMBOLIZER_FONT2_PICKER_HEX, bmp,
  3285         -                       wxDefaultPosition, wxSize(32, 32));
  3286         -  fontColorSizer->Add(sampleFontCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  3287         -  wxButton *pickFont = new wxButton(panel, ID_SYMBOLIZER_FONT2_PICKER_BTN,
  3288         -                                    wxT("&Pick a color"));
  3289         -  font2Sizer->Add(pickFont, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 2);
  3290         -// second row: LinePlacement
  3291         -  wxBoxSizer *lineBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  3292         -  auxSizer->Add(lineBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  3293         -  wxStaticBox *lineBox = new wxStaticBox(panel, wxID_STATIC,
  3294         -                                         wxT("Label Line Placement"),
  3295         -                                         wxDefaultPosition,
  3296         -                                         wxDefaultSize);
  3297         -  wxBoxSizer *lineSizer = new wxStaticBoxSizer(lineBox, wxVERTICAL);
  3298         -  lineBoxSizer->Add(lineSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  3299         -// second row A: PerpendicularOffset
  3300         -  wxBoxSizer *perpendicularBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  3301         -  lineSizer->Add(perpendicularBoxSizer, 0,
  3302         -                 wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  3303         -  wxStaticBox *perpendicularBox = new wxStaticBox(panel, wxID_STATIC,
  3304         -                                                  wxT("Perpendicular Offset"),
  3305         -                                                  wxDefaultPosition,
  3306         -                                                  wxDefaultSize);
  3307         -  wxBoxSizer *perpendicularSizer =
  3308         -    new wxStaticBoxSizer(perpendicularBox, wxVERTICAL);
  3309         -  perpendicularBoxSizer->Add(perpendicularSizer, 0,
  3310         -                             wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  3311         -  wxBoxSizer *perp1Sizer = new wxBoxSizer(wxHORIZONTAL);
  3312         -  perpendicularSizer->Add(perp1Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  3313         -  wxTextCtrl *perpendicularCtrl =
  3314         -    new wxTextCtrl(panel, ID_SYMBOLIZER_TEXT_PERPENDICULAR, wxT("0.0"),
  3315         -                   wxDefaultPosition, wxSize(100, 22));
  3316         -  perp1Sizer->Add(perpendicularCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  3317         -  perpendicularCtrl->Enable(false);
  3318         -  wxStaticText *perp1Label = new wxStaticText(panel, wxID_STATIC,
  3319         -                                              wxT
  3320         -                                              ("Draw lines in parallel to the original geometry."));
  3321         -  perp1Sizer->Add(perp1Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  3322         -  wxStaticText *perp2Label = new wxStaticText(panel, wxID_STATIC,
  3323         -                                              wxT
  3324         -                                              ("Positive to the left-hand side. Negative numbers mean right."));
  3325         -  perpendicularSizer->Add(perp2Label, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  3326         -// second row B: IsRepeated, InitialGap and Gap
  3327         -  wxBoxSizer *repeatedBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  3328         -  lineSizer->Add(repeatedBoxSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  3329         -  wxStaticBox *repeatedBox = new wxStaticBox(panel, wxID_STATIC,
  3330         -                                             wxT("Repeated Label"),
  3331         -                                             wxDefaultPosition,
  3332         -                                             wxDefaultSize);
  3333         -  wxBoxSizer *repeatedSizer = new wxStaticBoxSizer(repeatedBox, wxHORIZONTAL);
  3334         -  repeatedBoxSizer->Add(repeatedSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  3335         -  wxCheckBox *isRepeatedCtrl =
  3336         -    new wxCheckBox(panel, ID_SYMBOLIZER_TEXT_IS_REPEATED,
  3337         -                   wxT("Repeated"),
  3338         -                   wxDefaultPosition, wxDefaultSize);
  3339         -  isRepeatedCtrl->SetValue(false);
  3340         -  isRepeatedCtrl->Enable(false);
  3341         -  repeatedSizer->Add(isRepeatedCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  3342         -  wxStaticBox *inigapBox = new wxStaticBox(panel, wxID_STATIC,
  3343         -                                           wxT("Initial Gap"),
  3344         -                                           wxDefaultPosition,
  3345         -                                           wxDefaultSize);
  3346         -  wxBoxSizer *inigapSizer = new wxStaticBoxSizer(inigapBox, wxVERTICAL);
  3347         -  repeatedSizer->Add(inigapSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  3348         -  wxTextCtrl *inigapCtrl =
  3349         -    new wxTextCtrl(panel, ID_SYMBOLIZER_TEXT_INITIAL_GAP, wxT("0.0"),
  3350         -                   wxDefaultPosition, wxSize(60, 22));
  3351         -  inigapCtrl->Enable(false);
  3352         -  inigapSizer->Add(inigapCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  3353         -  wxStaticBox *gapBox = new wxStaticBox(panel, wxID_STATIC,
  3354         -                                        wxT("Gap"),
  3355         -                                        wxDefaultPosition,
  3356         -                                        wxDefaultSize);
  3357         -  wxBoxSizer *gapSizer = new wxStaticBoxSizer(gapBox, wxVERTICAL);
  3358         -  repeatedSizer->Add(gapSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  3359         -  wxTextCtrl *gapCtrl =
  3360         -    new wxTextCtrl(panel, ID_SYMBOLIZER_TEXT_GAP, wxT("0.0"),
  3361         -                   wxDefaultPosition, wxSize(60, 22));
  3362         -  gapCtrl->Enable(false);
  3363         -  gapSizer->Add(gapCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  3364         -// second row C: IsAligned and Generalize
  3365         -  wxBoxSizer *optBoxSizer = new wxBoxSizer(wxHORIZONTAL);
  3366         -  repeatedBoxSizer->Add(optBoxSizer, 0, wxALIGN_LEFT | wxALL, 0);
  3367         -  wxStaticBox *optBox = new wxStaticBox(panel, wxID_STATIC,
  3368         -                                        wxT("Options"),
  3369         -                                        wxDefaultPosition,
  3370         -                                        wxDefaultSize);
  3371         -  wxBoxSizer *optSizer = new wxStaticBoxSizer(optBox, wxVERTICAL);
  3372         -  optBoxSizer->Add(optSizer, 0, wxALIGN_LEFT | wxALL, 5);
  3373         -  wxCheckBox *isAlignedCtrl =
  3374         -    new wxCheckBox(panel, ID_SYMBOLIZER_TEXT_IS_ALIGNED,
  3375         -                   wxT("Aligned"),
  3376         -                   wxDefaultPosition, wxDefaultSize);
  3377         -  isAlignedCtrl->SetValue(false);
  3378         -  isAlignedCtrl->Enable(false);
  3379         -  optSizer->Add(isAlignedCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  3380         -  wxCheckBox *generalizeCtrl =
  3381         -    new wxCheckBox(panel, ID_SYMBOLIZER_TEXT_GENERALIZE,
  3382         -                   wxT("Generalize"),
  3383         -                   wxDefaultPosition, wxDefaultSize);
  3384         -  generalizeCtrl->SetValue(false);
  3385         -  generalizeCtrl->Enable(false);
  3386         -  optSizer->Add(generalizeCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  3387         -// Halo 
  3388         -  wxBoxSizer *haloBoxSizer = new wxBoxSizer(wxVERTICAL);
  3389         -  lineBoxSizer->Add(haloBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  3390         -  wxStaticBox *haloBox = new wxStaticBox(panel, wxID_STATIC,
  3391         -                                         wxT("Font Halo"),
  3392         -                                         wxDefaultPosition,
  3393         -                                         wxDefaultSize);
  3394         -  wxBoxSizer *haloSizer = new wxStaticBoxSizer(haloBox, wxVERTICAL);
  3395         -  haloBoxSizer->Add(haloSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  3396         -  wxBoxSizer *halo0Sizer = new wxBoxSizer(wxHORIZONTAL);
  3397         -  haloSizer->Add(halo0Sizer, 0, wxALIGN_LEFT | wxALL, 0);
  3398         -  wxCheckBox *enableHaloCtrl = new wxCheckBox(panel, ID_SYMBOLIZER_HALO2_ENABLE,
  3399         -                                              wxT("Enable"),
  3400         -                                              wxDefaultPosition, wxDefaultSize);
  3401         -  enableHaloCtrl->SetValue(Style->IsHaloEnabled());
  3402         -  enableHaloCtrl->Enable(false);
  3403         -  halo0Sizer->Add(enableHaloCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  3404         -// Halo Radius
  3405         -  wxStaticBox *radiusBox = new wxStaticBox(panel, wxID_STATIC,
  3406         -                                           wxT("Radius"),
  3407         -                                           wxDefaultPosition,
  3408         -                                           wxDefaultSize);
  3409         -  wxBoxSizer *radiusSizer = new wxStaticBoxSizer(radiusBox, wxVERTICAL);
  3410         -  halo0Sizer->Add(radiusSizer, 0, wxALIGN_RIGHT | wxALL, 2);
  3411         -  wxTextCtrl *radiusCtrl =
  3412         -    new wxTextCtrl(panel, ID_SYMBOLIZER_HALO2_RADIUS, wxT("1.0"),
  3413         -                   wxDefaultPosition, wxSize(50, 22));
  3414         -  radiusCtrl->Enable(false);
  3415         -  radiusSizer->Add(radiusCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  3416         -// Halo Opacity
  3417         -  wxStaticBox *opacityHaloBox = new wxStaticBox(panel, wxID_STATIC,
  3418         -                                                wxT("Opacity"),
  3419         -                                                wxDefaultPosition,
  3420         -                                                wxDefaultSize);
  3421         -  wxBoxSizer *opacityHaloSizer =
  3422         -    new wxStaticBoxSizer(opacityHaloBox, wxVERTICAL);
  3423         -  haloSizer->Add(opacityHaloSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 2);
  3424         -  wxSlider *opacityHaloCtrl =
  3425         -    new wxSlider(panel, ID_SYMBOLIZER_HALO2_OPACITY, 100, 0, 100,
  3426         -                 wxDefaultPosition, wxSize(130, 35),
  3427         -                 wxSL_HORIZONTAL | wxSL_LABELS);
  3428         -  opacityHaloSizer->Add(opacityHaloCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  3429         -  opacityHaloCtrl->Enable(false);
  3430         -// Halo color
  3431         -  wxStaticBox *haloColorBox = new wxStaticBox(panel, wxID_STATIC,
  3432         -                                              wxT("Color"),
  3433         -                                              wxDefaultPosition,
  3434         -                                              wxDefaultSize);
  3435         -  wxBoxSizer *haloColorSizer = new wxStaticBoxSizer(haloColorBox, wxHORIZONTAL);
  3436         -  haloSizer->Add(haloColorSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 2);
  3437         -  wxBoxSizer *halo2Sizer = new wxBoxSizer(wxVERTICAL);
  3438         -  haloColorSizer->Add(halo2Sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
  3439         -  wxTextCtrl *haloCtrl = new wxTextCtrl(panel, ID_SYMBOLIZER_HALO2_COLOR,
  3440         -                                        FillColor,
  3441         -                                        wxDefaultPosition, wxSize(80, 22));
  3442         -  halo2Sizer->Add(haloCtrl, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 2);
  3443         -  haloCtrl->Enable(false);
  3444         -  color = wxColour(0, 0, 0);
  3445         -  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
  3446         -  wxStaticBitmap *sampleHaloCtrl =
  3447         -    new wxStaticBitmap(panel, ID_SYMBOLIZER_HALO2_PICKER_HEX, bmp,
  3448         -                       wxDefaultPosition, wxSize(32, 32));
  3449         -  haloColorSizer->Add(sampleHaloCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  3450         -  wxButton *pickHalo = new wxButton(panel, ID_SYMBOLIZER_HALO2_PICKER_BTN,
  3451         -                                    wxT("&Pick a color"));
  3452         -  halo2Sizer->Add(pickHalo, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 2);
  3453         -  pickHalo->Enable(false);
  3454         -
  3455         -  panel->SetSizer(topSizer);
  3456         -  topSizer->Fit(panel);
  3457         -// appends event handlers
  3458         -  Connect(ID_SYMBOLIZER_TEXT2_ENABLE,
  3459         -          wxEVT_COMMAND_CHECKBOX_CLICKED,
  3460         -          (wxObjectEventFunction) & QuickStyleVectorDialog::OnCmdLabel2Changed);
  3461         -  Connect(ID_SYMBOLIZER_FONT2_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
  3462         -          (wxObjectEventFunction) &
  3463         -          QuickStyleVectorDialog::OnCmdFont2ColorPicker);
  3464         -  Connect(ID_SYMBOLIZER_FONT2_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
  3465         -          (wxObjectEventFunction) &
  3466         -          QuickStyleVectorDialog::OnCmdFont2ColorChanged);
  3467         -  Connect(ID_SYMBOLIZER_TEXT_IS_REPEATED,
  3468         -          wxEVT_COMMAND_CHECKBOX_CLICKED,
  3469         -          (wxObjectEventFunction) &
  3470         -          QuickStyleVectorDialog::OnCmdIsRepeatedChanged);
  3471         -  Connect(ID_SYMBOLIZER_TEXT_IS_ALIGNED,
  3472         -          wxEVT_COMMAND_CHECKBOX_CLICKED,
  3473         -          (wxObjectEventFunction) &
  3474         -          QuickStyleVectorDialog::OnCmdIsAlignedChanged);
  3475         -  Connect(ID_SYMBOLIZER_TEXT_GENERALIZE,
  3476         -          wxEVT_COMMAND_CHECKBOX_CLICKED,
  3477         -          (wxObjectEventFunction) &
  3478         -          QuickStyleVectorDialog::OnCmdGeneralizeLineChanged);
  3479         -  Connect(ID_SYMBOLIZER_FONT2_NAME, wxEVT_COMMAND_COMBOBOX_SELECTED,
  3480         -          (wxObjectEventFunction) & QuickStyleVectorDialog::OnFont2Changed);
  3481         -  Connect(ID_SYMBOLIZER_HALO2_ENABLE,
  3482         -          wxEVT_COMMAND_CHECKBOX_CLICKED,
  3483         -          (wxObjectEventFunction) &
  3484         -          QuickStyleVectorDialog::OnCmdHalo2EnableChanged);
  3485         -  Connect(ID_SYMBOLIZER_HALO2_PICKER_BTN, wxEVT_COMMAND_BUTTON_CLICKED,
  3486         -          (wxObjectEventFunction) &
  3487         -          QuickStyleVectorDialog::OnCmdColorHalo2Picker);
  3488         -  Connect(ID_SYMBOLIZER_HALO2_COLOR, wxEVT_COMMAND_TEXT_UPDATED,
  3489         -          (wxObjectEventFunction) &
  3490         -          QuickStyleVectorDialog::OnCmdColorHalo2Changed);
  3491         -  return panel;
  3492         -}
  3493         -
  3494         -void QuickStyleVectorDialog::
  3495         -OnCmdLabel2Changed(wxCommandEvent & WXUNUSED(event))
  3496         -{
  3497         -//
  3498         -// Label enable/disable 
  3499         -//
  3500         -  wxCheckBox *enableCtrl =
  3501         -    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT2_ENABLE);
  3502         -  if (enableCtrl->IsChecked() == true)
  3503         -    {
  3504         -      Style->SetLabelPrint(true);
  3505         -      Style->SetLabelLinePlacement(true);
  3506         -  } else
  3507         -    Style->SetLabelPrint(false);
  3508         -  RetrieveTextLinePage(false);
  3509         -  UpdateTextLinePage();
  3510         -}
  3511         -
  3512         -void QuickStyleVectorDialog::OnFont2Changed(wxCommandEvent & WXUNUSED(event))
  3513         -{
  3514         -//
  3515         -// the Font is changed
  3516         -//
  3517         -  wxCheckBox *boldCtrl = (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT2_BOLD);
  3518         -  wxCheckBox *italicCtrl =
  3519         -    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT2_ITALIC);
  3520         -  wxComboBox *fontList = (wxComboBox *) FindWindow(ID_SYMBOLIZER_FONT2_NAME);
  3521         -  wxString font = fontList->GetValue();
  3522         -  char facename[1024];
  3523         -  strcpy(facename, font.ToUTF8());
  3524         -  if (strncmp(facename, "ToyFont: ", 9) == 0)
  3525         -    {
  3526         -      boldCtrl->Enable(true);
  3527         -      italicCtrl->Enable(true);
  3528         -  } else
  3529         -    {
  3530         -      bool bold = false;
  3531         -      bool italic = false;
  3532         -      MainFrame->CheckTTFont(facename, &bold, &italic);
  3533         -      boldCtrl->SetValue(bold);
  3534         -      italicCtrl->SetValue(italic);
  3535         -      boldCtrl->Enable(false);
  3536         -      italicCtrl->Enable(false);
  3537         -    }
  3538         -}
  3539         -
  3540         -void QuickStyleVectorDialog::
  3541         -OnCmdFont2ColorPicker(wxCommandEvent & WXUNUSED(event))
  3542         -{
  3543         -//
  3544         -// color picker
  3545         -//
  3546         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FONT2_COLOR);
  3547         -  wxColour clr = wxNullColour;
  3548         -  wxString str = colorCtrl->GetValue();
  3549         -  if (ColorMapEntry::IsValidColor(str) == true)
  3550         -    ColorMapEntry::GetWxColor(str, clr);
  3551         -  wxColour color = wxGetColourFromUser(this, clr);
  3552         -  if (color.IsOk() == true)
  3553         -    {
  3554         -      char hex[16];
  3555         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  3556         -      wxString str = wxString::FromUTF8(hex);
  3557         -      colorCtrl->SetValue(str);
  3558         -    }
  3559         -}
  3560         -
  3561         -void QuickStyleVectorDialog::
  3562         -OnCmdFont2ColorChanged(wxCommandEvent & WXUNUSED(event))
  3563         -{
  3564         -//
  3565         -// Font Color changed: updating the visual sample
  3566         -//
  3567         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FONT2_COLOR);
  3568         -  wxStaticBitmap *sampleCtrl =
  3569         -    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_FONT2_PICKER_HEX);
  3570         -  wxColour back = wxColour(255, 255, 255);
  3571         -  wxString str = colorCtrl->GetValue();
  3572         -  if (ColorMapEntry::IsValidColor(str) == true)
  3573         -    ColorMapEntry::GetWxColor(str, back);
  3574         -  wxBitmap bmp;
  3575         -  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
  3576         -  sampleCtrl->SetBitmap(bmp);
  3577         -  sampleCtrl->Refresh();
  3578         -  sampleCtrl->Update();
  3579         -}
  3580         -
  3581         -void QuickStyleVectorDialog::
  3582         -OnCmdIsRepeatedChanged(wxCommandEvent & WXUNUSED(event))
  3583         -{
  3584         -//
  3585         -// Label IsRepeated enable/disable 
  3586         -//
  3587         -  wxCheckBox *repeatedCtrl =
  3588         -    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT_IS_REPEATED);
  3589         -  if (repeatedCtrl->IsChecked() == true)
  3590         -    Style->SetRepeatedLabel(true);
  3591         -  else
  3592         -    Style->SetRepeatedLabel(false);
  3593         -  RetrieveTextLinePage(false);
  3594         -  UpdateTextLinePage();
  3595         -}
  3596         -
  3597         -void QuickStyleVectorDialog::
  3598         -OnCmdIsAlignedChanged(wxCommandEvent & WXUNUSED(event))
  3599         -{
  3600         -//
  3601         -// Label IsAligned enable/disable 
  3602         -//
  3603         -  wxCheckBox *alignedCtrl =
  3604         -    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT_IS_ALIGNED);
  3605         -  if (alignedCtrl->IsChecked() == true)
  3606         -    Style->SetLabelIsAligned(true);
  3607         -  else
  3608         -    Style->SetLabelIsAligned(false);
  3609         -}
  3610         -
  3611         -void QuickStyleVectorDialog::
  3612         -OnCmdGeneralizeLineChanged(wxCommandEvent & WXUNUSED(event))
  3613         -{
  3614         -//
  3615         -// Label GeneralizeLine enable/disable 
  3616         -//
  3617         -  wxCheckBox *generalizeCtrl =
  3618         -    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT_GENERALIZE);
  3619         -  if (generalizeCtrl->IsChecked() == true)
  3620         -    Style->SetLabelGeneralizeLine(true);
  3621         -  else
  3622         -    Style->SetLabelGeneralizeLine(false);
  3623         -}
  3624         -
  3625         -void QuickStyleVectorDialog::
  3626         -OnCmdColorHalo2Picker(wxCommandEvent & WXUNUSED(event))
  3627         -{
  3628         -//
  3629         -// color picker
  3630         -//
  3631         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_HALO2_COLOR);
  3632         -  wxColour clr = wxNullColour;
  3633         -  wxString str = colorCtrl->GetValue();
  3634         -  if (ColorMapEntry::IsValidColor(str) == true)
  3635         -    ColorMapEntry::GetWxColor(str, clr);
  3636         -  wxColour color = wxGetColourFromUser(this, clr);
  3637         -  if (color.IsOk() == true)
  3638         -    {
  3639         -      char hex[16];
  3640         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  3641         -      wxString str = wxString::FromUTF8(hex);
  3642         -      colorCtrl->SetValue(str);
  3643         -    }
  3644         -}
  3645         -
  3646         -void QuickStyleVectorDialog::
  3647         -OnCmdColorHalo2Changed(wxCommandEvent & WXUNUSED(event))
  3648         -{
  3649         -//
  3650         -// Halo Color changed: updating the visual sample
  3651         -//
  3652         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_HALO2_COLOR);
  3653         -  wxStaticBitmap *sampleCtrl =
  3654         -    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_HALO2_PICKER_HEX);
  3655         -  wxColour back = wxColour(255, 255, 255);
  3656         -  wxString str = colorCtrl->GetValue();
  3657         -  if (ColorMapEntry::IsValidColor(str) == true)
  3658         -    ColorMapEntry::GetWxColor(str, back);
  3659         -  wxBitmap bmp;
  3660         -  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
  3661         -  sampleCtrl->SetBitmap(bmp);
  3662         -  sampleCtrl->Refresh();
  3663         -  sampleCtrl->Update();
  3664         -}
  3665         -
  3666         -void QuickStyleVectorDialog::
  3667         -OnCmdHalo2EnableChanged(wxCommandEvent & WXUNUSED(event))
  3668         -{
  3669         -//
  3670         -// Graphic Halo enable/disable 
  3671         -//
  3672         -  wxCheckBox *enableCtrl =
  3673         -    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_HALO2_ENABLE);
  3674         -  if (enableCtrl->IsChecked() == true)
  3675         -    Style->EnableHalo(true);
  3676         -  else
  3677         -    Style->EnableHalo(false);
  3678         -  RetrieveTextLinePage(false);
  3679         -  UpdateTextLinePage();
  3680         -}
  3681         -
  3682         -bool QuickStyleVectorDialog::RetrieveMainPage()
  3683         -{
  3684         -//
  3685         -// retrieving params from the MAIN page
  3686         -//
  3687         -  double min = Style->GetScaleMin();
  3688         -  double max = Style->GetScaleMax();
  3689         -  if (Style->IsMinScaleEnabled() == true)
  3690         -    {
  3691         -      wxTextCtrl *minCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MIN_SCALE);
  3692         -      wxString value = minCtrl->GetValue();
  3693         -      if (value.ToDouble(&min) != true)
  3694         -        {
  3695         -          wxMessageBox(wxT
  3696         -                       ("MIN_SCALE isn't a valid decimal number !!!"),
  3697         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3698         -          return false;
  3699         -        }
  3700         -      if (min < 0.0)
  3701         -        {
  3702         -          wxMessageBox(wxT
  3703         -                       ("MIN_SCALE must be a positive number !!!"),
  3704         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3705         -          return false;
  3706         -        }
  3707         -    }
  3708         -  if (Style->IsMaxScaleEnabled() == true)
  3709         -    {
  3710         -      wxTextCtrl *maxCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MAX_SCALE);
  3711         -      wxString value = maxCtrl->GetValue();
  3712         -      if (value.ToDouble(&max) != true)
  3713         -        {
  3714         -          wxMessageBox(wxT
  3715         -                       ("MAX_SCALE isn't a valid decimal number !!!"),
  3716         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3717         -          return false;
  3718         -        }
  3719         -      if (max < 0.0)
  3720         -        {
  3721         -          wxMessageBox(wxT
  3722         -                       ("MAX_SCALE must be a positive number !!!"),
  3723         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3724         -          return false;
  3725         -        }
  3726         -    }
  3727         -  if (Style->IsMinScaleEnabled() == true && Style->IsMaxScaleEnabled() == true)
  3728         -    {
  3729         -      if (min >= max)
  3730         -        {
  3731         -          wxMessageBox(wxT
  3732         -                       ("MAX_SCALE is always expected to be greater than MIN_SCALE !!!"),
  3733         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3734         -          return false;
  3735         -        }
  3736         -    }
  3737         -  Style->SetScaleMin(min);
  3738         -  Style->SetScaleMax(max);
  3739         -  return true;
  3740         -}
  3741         -
  3742         -void QuickStyleVectorDialog::UpdateMainPage()
  3743         -{
  3744         -//
  3745         -// updating the MAIN page
  3746         -//
  3747         -  wxRadioBox *rangeBox = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_MINMAX_SCALE);
  3748         -  if (Style->IsMinScaleEnabled() != true && Style->IsMaxScaleEnabled() != true)
  3749         -    rangeBox->SetSelection(0);
  3750         -  else if (Style->IsMinScaleEnabled() == true
  3751         -           && Style->IsMaxScaleEnabled() != true)
  3752         -    rangeBox->SetSelection(1);
  3753         -  else if (Style->IsMinScaleEnabled() != true
  3754         -           && Style->IsMaxScaleEnabled() == true)
  3755         -    rangeBox->SetSelection(2);
  3756         -  else
  3757         -    rangeBox->SetSelection(3);
  3758         -  wxTextCtrl *minCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MIN_SCALE);
  3759         -  char dummy[64];
  3760         -  wxString str;
  3761         -  if (Style->IsMinScaleEnabled() == true)
  3762         -    {
  3763         -      sprintf(dummy, "%1.2f", Style->GetScaleMin());
  3764         -      str = wxString::FromUTF8(dummy);
  3765         -      minCtrl->SetValue(str);
  3766         -      minCtrl->Enable(true);
  3767         -  } else
  3768         -    {
  3769         -      str = wxT("0.0");
  3770         -      minCtrl->SetValue(str);
  3771         -      minCtrl->Enable(false);
  3772         -    }
  3773         -  wxTextCtrl *maxCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_MAX_SCALE);
  3774         -  if (Style->IsMaxScaleEnabled() == true)
  3775         -    {
  3776         -      sprintf(dummy, "%1.2f", Style->GetScaleMax());
  3777         -      str = wxString::FromUTF8(dummy);
  3778         -      maxCtrl->SetValue(str);
  3779         -      maxCtrl->Enable(true);
  3780         -  } else
  3781         -    {
  3782         -      str = wxT("+Infinite");
  3783         -      maxCtrl->SetValue(str);
  3784         -      maxCtrl->Enable(false);
  3785         -    }
  3786         -}
  3787         -
  3788         -bool QuickStyleVectorDialog::RetrievePointPage(bool check)
  3789         -{
  3790         -//
  3791         -// retrieving params from the Point Symbolizer page
  3792         -//
  3793         -  double opacity;
  3794         -  double size;
  3795         -  double rotation;
  3796         -  double anchorPointX;
  3797         -  double anchorPointY;
  3798         -  double displacementX;
  3799         -  double displacementY;
  3800         -  char fillColor[8];
  3801         -  char strokeColor[8];
  3802         -  wxSlider *opacityCtrl = (wxSlider *) FindWindow(ID_SYMBOLIZER_OPACITY);
  3803         -  opacity = opacityCtrl->GetValue() / 100.0;
  3804         -  wxTextCtrl *sizeCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_SIZE);
  3805         -  wxString value = sizeCtrl->GetValue();
  3806         -  if (value.ToDouble(&size) != true)
  3807         -    {
  3808         -      if (check == true)
  3809         -        {
  3810         -          wxMessageBox(wxT
  3811         -                       ("SIZE isn't a valid decimal number !!!"),
  3812         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3813         -          return false;
  3814         -        }
  3815         -    }
  3816         -  if (size < 0.0)
  3817         -    {
  3818         -      if (check == true)
  3819         -        {
  3820         -          wxMessageBox(wxT
  3821         -                       ("SIZE must be a positive number !!!"),
  3822         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3823         -          return false;
  3824         -        }
  3825         -    }
  3826         -  wxTextCtrl *rotationCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_ROTATION);
  3827         -  value = rotationCtrl->GetValue();
  3828         -  if (value.ToDouble(&rotation) != true)
  3829         -    {
  3830         -      if (check == true)
  3831         -        {
  3832         -          wxMessageBox(wxT
  3833         -                       ("ROTATION isn't a valid decimal number !!!"),
  3834         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3835         -          return false;
  3836         -        }
  3837         -    }
  3838         -  wxTextCtrl *anchorXCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_ANCHOR_X);
  3839         -  value = anchorXCtrl->GetValue();
  3840         -  if (value.ToDouble(&anchorPointX) != true)
  3841         -    {
  3842         -      if (check == true)
  3843         -        {
  3844         -          wxMessageBox(wxT
  3845         -                       ("ANCHOR-POINT-X isn't a valid decimal number !!!"),
  3846         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3847         -          return false;
  3848         -        }
  3849         -    }
  3850         -  if (anchorPointX < 0.0 || anchorPointX > 1.0)
  3851         -    {
  3852         -      if (check == true)
  3853         -        {
  3854         -          wxMessageBox(wxT
  3855         -                       ("ANCHOR-POINT-X must be between 0.0 and 1.0 !!!"),
  3856         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3857         -          return false;
  3858         -        }
  3859         -    }
  3860         -  wxTextCtrl *anchorYCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_ANCHOR_Y);
  3861         -  value = anchorYCtrl->GetValue();
  3862         -  if (value.ToDouble(&anchorPointY) != true)
  3863         -    {
  3864         -      if (check == true)
  3865         -        {
  3866         -          wxMessageBox(wxT
  3867         -                       ("ANCHOR-POINT-Y isn't a valid decimal number !!!"),
  3868         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3869         -          return false;
  3870         -        }
  3871         -    }
  3872         -  if (anchorPointY < 0.0 || anchorPointY > 1.0)
  3873         -    {
  3874         -      if (check == true)
  3875         -        {
  3876         -          wxMessageBox(wxT
  3877         -                       ("ANCHOR-POINT-Y must be between 0.0 and 1.0 !!!"),
  3878         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3879         -          return false;
  3880         -        }
  3881         -    }
  3882         -  wxTextCtrl *displXCtrl =
  3883         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_DISPLACEMENT_X);
  3884         -  value = displXCtrl->GetValue();
  3885         -  if (value.ToDouble(&displacementX) != true)
  3886         -    {
  3887         -      if (check == true)
  3888         -        {
  3889         -          wxMessageBox(wxT
  3890         -                       ("DISPLACEMENT-X isn't a valid decimal number !!!"),
  3891         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3892         -          return false;
  3893         -        }
  3894         -    }
  3895         -  wxTextCtrl *displYCtrl =
  3896         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_DISPLACEMENT_Y);
  3897         -  value = displYCtrl->GetValue();
  3898         -  if (value.ToDouble(&displacementY) != true)
  3899         -    {
  3900         -      if (check == true)
  3901         -        {
  3902         -          wxMessageBox(wxT
  3903         -                       ("DISPLACEMENT-Y isn't a valid decimal number !!!"),
  3904         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3905         -          return false;
  3906         -        }
  3907         -    }
  3908         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FILL_COLOR);
  3909         -  wxString color = colorCtrl->GetValue();
  3910         -  if (ColorMapEntry::IsValidColor(color) != true)
  3911         -    {
  3912         -      if (check == true)
  3913         -        {
  3914         -          wxMessageBox(wxT
  3915         -                       ("FILL-COLOR isn't a valid HexRGB color !!!"),
  3916         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3917         -          return false;
  3918         -        }
  3919         -    }
  3920         -  strcpy(fillColor, color.ToUTF8());
  3921         -  colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE_COLOR);
  3922         -  color = colorCtrl->GetValue();
  3923         -  if (ColorMapEntry::IsValidColor(color) != true)
  3924         -    {
  3925         -      if (check == true)
  3926         -        {
  3927         -          wxMessageBox(wxT
  3928         -                       ("STROKE-COLOR isn't a valid HexRGB color !!!"),
  3929         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  3930         -          return false;
  3931         -        }
  3932         -    }
  3933         -  strcpy(strokeColor, color.ToUTF8());
  3934         -
  3935         -  Style->SetSymbolOpacity(opacity);
  3936         -  Style->SetSymbolSize(size);
  3937         -  Style->SetSymbolAnchorX(anchorPointX);
  3938         -  Style->SetSymbolAnchorY(anchorPointY);
  3939         -  Style->SetSymbolRotation(rotation);
  3940         -  Style->SetSymbolDisplacementX(displacementX);
  3941         -  Style->SetSymbolDisplacementY(displacementY);
  3942         -  Style->SetSymbolFillColor(fillColor);
  3943         -  Style->SetSymbolStrokeColor(strokeColor);
  3944         -  return true;
  3945         -}
  3946         -
  3947         -void QuickStyleVectorDialog::UpdatePointPage()
  3948         -{
  3949         -//
  3950         -// updating the Point Symbolizer page
  3951         -//
  3952         -  wxSlider *opacityCtrl = (wxSlider *) FindWindow(ID_SYMBOLIZER_OPACITY);
  3953         -  opacityCtrl->SetValue(Style->GetSymbolOpacity() * 100.0);
  3954         -  wxTextCtrl *sizeCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_SIZE);
  3955         -  char dummy[64];
  3956         -  sprintf(dummy, "%1.2f", Style->GetSymbolSize());
  3957         -  wxString str = wxString::FromUTF8(dummy);
  3958         -  sizeCtrl->SetValue(str);
  3959         -  wxTextCtrl *rotationCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_ROTATION);
  3960         -  sprintf(dummy, "%1.2f", Style->GetSymbolRotation());
  3961         -  str = wxString::FromUTF8(dummy);
  3962         -  rotationCtrl->SetValue(str);
  3963         -  wxTextCtrl *anchorXCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_ANCHOR_X);
  3964         -  sprintf(dummy, "%1.2f", Style->GetSymbolAnchorX());
  3965         -  str = wxString::FromUTF8(dummy);
  3966         -  anchorXCtrl->SetValue(str);
  3967         -  wxTextCtrl *anchorYCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_ANCHOR_Y);
  3968         -  sprintf(dummy, "%1.2f", Style->GetSymbolAnchorY());
  3969         -  str = wxString::FromUTF8(dummy);
  3970         -  anchorYCtrl->SetValue(str);
  3971         -  wxTextCtrl *displXCtrl =
  3972         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_DISPLACEMENT_X);
  3973         -  sprintf(dummy, "%1.2f", Style->GetSymbolDisplacementX());
  3974         -  str = wxString::FromUTF8(dummy);
  3975         -  displXCtrl->SetValue(str);
  3976         -  wxTextCtrl *displYCtrl =
  3977         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_DISPLACEMENT_Y);
  3978         -  sprintf(dummy, "%1.2f", Style->GetSymbolDisplacementY());
  3979         -  str = wxString::FromUTF8(dummy);
  3980         -  displYCtrl->SetValue(str);
  3981         -  wxRadioBox *markCtrl = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_MARK);
  3982         -  switch (Style->GetSymbolWellKnownMark())
  3983         -    {
  3984         -      case RL2_GRAPHIC_MARK_CIRCLE:
  3985         -        markCtrl->SetSelection(1);
  3986         -        break;
  3987         -      case RL2_GRAPHIC_MARK_TRIANGLE:
  3988         -        markCtrl->SetSelection(2);
  3989         -        break;
  3990         -      case RL2_GRAPHIC_MARK_STAR:
  3991         -        markCtrl->SetSelection(3);
  3992         -        break;
  3993         -      case RL2_GRAPHIC_MARK_CROSS:
  3994         -        markCtrl->SetSelection(4);
  3995         -        break;
  3996         -      case RL2_GRAPHIC_MARK_X:
  3997         -        markCtrl->SetSelection(5);
  3998         -        break;
  3999         -      default:
  4000         -        markCtrl->SetSelection(0);
  4001         -        break;
  4002         -    };
  4003         -  wxTextCtrl *colorFillCtrl =
  4004         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FILL_COLOR);
  4005         -  wxString fillColor = wxString::FromUTF8(Style->GetSymbolFillColor());
  4006         -  colorFillCtrl->SetValue(fillColor);
  4007         -  wxTextCtrl *colorStrokeCtrl =
  4008         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE_COLOR);
  4009         -  wxString strokeColor = wxString::FromUTF8(Style->GetSymbolStrokeColor());
  4010         -  colorStrokeCtrl->SetValue(strokeColor);
  4011         -}
  4012         -
  4013         -bool QuickStyleVectorDialog::RetrieveLinePage(bool check)
  4014         -{
  4015         -//
  4016         -// retrieving params from the Line Symbolizer page
  4017         -//
  4018         -  double opacity;
  4019         -  double perpendicularOffset;
  4020         -  char strokeColor[8];
  4021         -  double strokeWidth;
  4022         -  wxSlider *opacityCtrl =
  4023         -    (wxSlider *) FindWindow(ID_SYMBOLIZER_STROKE1_OPACITY);
  4024         -  opacity = opacityCtrl->GetValue() / 100.0;
  4025         -  wxTextCtrl *perpCtrl =
  4026         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_PERPENDICULAR);
  4027         -  wxString value = perpCtrl->GetValue();
  4028         -  if (value.ToDouble(&perpendicularOffset) != true)
  4029         -    {
  4030         -      if (check == true)
  4031         -        {
  4032         -          wxMessageBox(wxT
  4033         -                       ("PERPENDICULAR-OFFSET isn't a valid decimal number !!!"),
  4034         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4035         -          return false;
  4036         -        }
  4037         -    }
  4038         -  wxTextCtrl *colorCtrl =
  4039         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_COLOR);
  4040         -  wxString color = colorCtrl->GetValue();
  4041         -  if (ColorMapEntry::IsValidColor(color) != true)
  4042         -    {
  4043         -      if (check == true)
  4044         -        {
  4045         -          wxMessageBox(wxT
  4046         -                       ("STROKE-COLOR isn't a valid HexRGB color !!!"),
  4047         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4048         -          return false;
  4049         -        }
  4050         -    }
  4051         -  strcpy(strokeColor, color.ToUTF8());
  4052         -  wxTextCtrl *widthCtrl =
  4053         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_WIDTH);
  4054         -  value = widthCtrl->GetValue();
  4055         -  if (value.ToDouble(&strokeWidth) != true)
  4056         -    {
  4057         -      if (check == true)
  4058         -        {
  4059         -          wxMessageBox(wxT
  4060         -                       ("STROKE-WIDTH isn't a valid decimal number !!!"),
  4061         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4062         -          return false;
  4063         -        }
  4064         -    }
  4065         -  if (strokeWidth <= 0.0)
  4066         -    {
  4067         -      if (check == true)
  4068         -        {
  4069         -          wxMessageBox(wxT
  4070         -                       ("STROKE-WIDTH must be a positive number !!!"),
  4071         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4072         -          return false;
  4073         -        }
  4074         -    }
  4075         -  wxRadioBox *dotCtrl = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_DASH_DOT);
  4076         -  switch (dotCtrl->GetSelection())
  4077         -    {
  4078         -      case 1:
  4079         -        Style->SetLineDotStyle(QUICK_STYLE_DOT_LINE);
  4080         -        break;
  4081         -      case 2:
  4082         -        Style->SetLineDotStyle(QUICK_STYLE_DASH_LINE);
  4083         -        break;
  4084         -      case 3:
  4085         -        Style->SetLineDotStyle(QUICK_STYLE_DASH_DOT_LINE);
  4086         -        break;
  4087         -      default:
  4088         -        Style->SetLineDotStyle(QUICK_STYLE_SOLID_LINE);
  4089         -        break;
  4090         -    };
  4091         -  Style->SetLineOpacity(opacity);
  4092         -  Style->SetLinePerpendicularOffset(perpendicularOffset);
  4093         -  Style->SetLineStrokeWidth(strokeWidth);
  4094         -  Style->SetLineStrokeColor(strokeColor);
  4095         -  return true;
  4096         -}
  4097         -
  4098         -void QuickStyleVectorDialog::UpdateLinePage()
  4099         -{
  4100         -//
  4101         -// updating the Line Symbolizer page
  4102         -//
  4103         -  wxSlider *opacityCtrl =
  4104         -    (wxSlider *) FindWindow(ID_SYMBOLIZER_STROKE1_OPACITY);
  4105         -  opacityCtrl->SetValue(Style->GetLineOpacity() * 100.0);
  4106         -  wxTextCtrl *perpCtrl =
  4107         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_PERPENDICULAR);
  4108         -  char dummy[64];
  4109         -  sprintf(dummy, "%1.2f", Style->GetLinePerpendicularOffset());
  4110         -  wxString str = wxString::FromUTF8(dummy);
  4111         -  perpCtrl->SetValue(str);
  4112         -  wxTextCtrl *colorCtrl =
  4113         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_COLOR);
  4114         -  wxButton *pick = (wxButton *) FindWindow(ID_SYMBOLIZER_STROKE1_PICKER_BTN);
  4115         -  colorCtrl->Enable(true);
  4116         -  pick->Enable(true);
  4117         -  wxString strokeColor = wxString::FromUTF8(Style->GetLineStrokeColor());
  4118         -  colorCtrl->SetValue(strokeColor);
  4119         -  wxTextCtrl *widthCtrl =
  4120         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE1_WIDTH);
  4121         -  sprintf(dummy, "%1.2f", Style->GetLineStrokeWidth());
  4122         -  str = wxString::FromUTF8(dummy);
  4123         -  wxRadioBox *dotCtrl = (wxRadioBox *) FindWindow(ID_SYMBOLIZER_DASH_DOT);
  4124         -  switch (Style->GetLineDotStyle())
  4125         -    {
  4126         -      case QUICK_STYLE_DOT_LINE:
  4127         -        dotCtrl->SetSelection(1);
  4128         -        break;
  4129         -      case QUICK_STYLE_DASH_LINE:
  4130         -        dotCtrl->SetSelection(2);
  4131         -        break;
  4132         -      case QUICK_STYLE_DASH_DOT_LINE:
  4133         -        dotCtrl->SetSelection(3);
  4134         -        break;
  4135         -      default:
  4136         -        dotCtrl->SetSelection(0);
  4137         -        break;
  4138         -    };
  4139         -  widthCtrl->SetValue(str);
  4140         -}
  4141         -
  4142         -bool QuickStyleVectorDialog::RetrievePolygonPage(bool check)
  4143         -{
  4144         -//
  4145         -// retrieving params from the Polygon Synbolizer page
  4146         -//
  4147         -  double fillOpacity;
  4148         -  double displacementX;
  4149         -  double displacementY;
  4150         -  double perpendicularOffset;
  4151         -  char fillColor[8];
  4152         -  double strokeOpacity;
  4153         -  char strokeColor[8];
  4154         -  double strokeWidth;
  4155         -  wxSlider *opacityCtrl = (wxSlider *) FindWindow(ID_SYMBOLIZER_FILL2_OPACITY);
  4156         -  fillOpacity = opacityCtrl->GetValue() / 100.0;
  4157         -  wxTextCtrl *displXCtrl =
  4158         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_POLYGON1_DISPLACEMENT_X);
  4159         -  wxString value = displXCtrl->GetValue();
  4160         -  if (Style->IsPolygonFill() != true && Style->IsPolygonStroke() != true)
  4161         -    {
  4162         -      if (check == true)
  4163         -        {
  4164         -          wxMessageBox(wxT
  4165         -                       ("You can't disable both FILL and STROKE at the same time !!!"),
  4166         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4167         -          return false;
  4168         -        }
  4169         -    }
  4170         -  if (value.ToDouble(&displacementX) != true)
  4171         -    {
  4172         -      if (check == true)
  4173         -        {
  4174         -          wxMessageBox(wxT
  4175         -                       ("DISPLACEMENT-X isn't a valid decimal number !!!"),
  4176         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4177         -          return false;
  4178         -        }
  4179         -    }
  4180         -  wxTextCtrl *displYCtrl =
  4181         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_POLYGON1_DISPLACEMENT_Y);
  4182         -  value = displYCtrl->GetValue();
  4183         -  if (value.ToDouble(&displacementY) != true)
  4184         -    {
  4185         -      if (check == true)
  4186         -        {
  4187         -          wxMessageBox(wxT
  4188         -                       ("DISPLACEMENT-Y isn't a valid decimal number !!!"),
  4189         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4190         -          return false;
  4191         -        }
  4192         -    }
  4193         -  wxTextCtrl *perpCtrl =
  4194         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_POLYGON1_PERPENDICULAR);
  4195         -  value = perpCtrl->GetValue();
  4196         -  if (value.ToDouble(&perpendicularOffset) != true)
  4197         -    {
  4198         -      if (check == true)
  4199         -        {
  4200         -          wxMessageBox(wxT
  4201         -                       ("PERPENDICULAR-OFFSET isn't a valid decimal number !!!"),
  4202         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4203         -          return false;
  4204         -        }
  4205         -    }
  4206         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FILL2_COLOR);
  4207         -  wxString color = colorCtrl->GetValue();
  4208         -  if (ColorMapEntry::IsValidColor(color) != true)
  4209         -    {
  4210         -      if (check == true)
  4211         -        {
  4212         -          wxMessageBox(wxT
  4213         -                       ("FILL-COLOR isn't a valid HexRGB color !!!"),
  4214         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4215         -          return false;
  4216         -        }
  4217         -    }
  4218         -  strcpy(fillColor, color.ToUTF8());
  4219         -  wxSlider *opacity2Ctrl =
  4220         -    (wxSlider *) FindWindow(ID_SYMBOLIZER_STROKE2_OPACITY);
  4221         -  strokeOpacity = opacity2Ctrl->GetValue() / 100.0;
  4222         -  wxTextCtrl *color2Ctrl =
  4223         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE2_COLOR);
  4224         -  color = color2Ctrl->GetValue();
  4225         -  if (ColorMapEntry::IsValidColor(color) != true)
  4226         -    {
  4227         -      if (check == true)
  4228         -        {
  4229         -          wxMessageBox(wxT
  4230         -                       ("STROKE-COLOR isn't a valid HexRGB color !!!"),
  4231         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4232         -          return false;
  4233         -        }
  4234         -    }
  4235         -  strcpy(strokeColor, color.ToUTF8());
  4236         -  wxTextCtrl *widthCtrl =
  4237         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE2_WIDTH);
  4238         -  value = widthCtrl->GetValue();
  4239         -  if (value.ToDouble(&strokeWidth) != true)
  4240         -    {
  4241         -      if (check == true)
  4242         -        {
  4243         -          wxMessageBox(wxT
  4244         -                       ("STROKE-WIDTH isn't a valid decimal number !!!"),
  4245         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4246         -          return false;
  4247         -        }
  4248         -    }
  4249         -  if (strokeWidth <= 0.0)
  4250         -    {
  4251         -      if (check == true)
  4252         -        {
  4253         -          wxMessageBox(wxT
  4254         -                       ("STROKE-WIDTH must be a positive number !!!"),
  4255         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4256         -          return false;
  4257         -        }
  4258         -    }
  4259         -
  4260         -  Style->SetPolygonFillOpacity(fillOpacity);
  4261         -  Style->SetPolygonDisplacementX(displacementX);
  4262         -  Style->SetPolygonDisplacementY(displacementY);
  4263         -  Style->SetPolygonPerpendicularOffset(perpendicularOffset);
  4264         -  Style->SetPolygonFillColor(fillColor);
  4265         -  Style->SetPolygonStrokeOpacity(strokeOpacity);
  4266         -  Style->SetPolygonStrokeColor(strokeColor);
  4267         -  Style->SetPolygonStrokeWidth(strokeWidth);
  4268         -  return true;
  4269         -}
  4270         -
  4271         -void QuickStyleVectorDialog::UpdatePolygonPage()
  4272         -{
  4273         -//
  4274         -// updating the Polygon Symbolizer page
  4275         -//
  4276         -  wxCheckBox *enableBox = (wxCheckBox *) FindWindow(ID_SYMBOLIZER_FILL2_ENABLE);
  4277         -  enableBox->SetValue(Style->IsPolygonFill());
  4278         -  wxTextCtrl *displXCtrl =
  4279         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_POLYGON1_DISPLACEMENT_X);
  4280         -  char dummy[64];
  4281         -  sprintf(dummy, "%1.2f", Style->GetPolygonDisplacementX());
  4282         -  wxString str = wxString::FromUTF8(dummy);
  4283         -  displXCtrl->SetValue(str);
  4284         -  wxTextCtrl *displYCtrl =
  4285         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_POLYGON1_DISPLACEMENT_Y);
  4286         -  sprintf(dummy, "%1.2f", Style->GetPolygonDisplacementY());
  4287         -  str = wxString::FromUTF8(dummy);
  4288         -  displYCtrl->SetValue(str);
  4289         -  wxTextCtrl *perpCtrl =
  4290         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_POLYGON1_PERPENDICULAR);
  4291         -  sprintf(dummy, "%1.2f", Style->GetPolygonPerpendicularOffset());
  4292         -  str = wxString::FromUTF8(dummy);
  4293         -  perpCtrl->SetValue(str);
  4294         -  wxSlider *opacityCtrl = (wxSlider *) FindWindow(ID_SYMBOLIZER_FILL2_OPACITY);
  4295         -  opacityCtrl->SetValue(Style->GetPolygonFillOpacity() * 100.0);
  4296         -  opacityCtrl->Enable(Style->IsPolygonFill());
  4297         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FILL2_COLOR);
  4298         -  wxButton *pick = (wxButton *) FindWindow(ID_SYMBOLIZER_FILL2_PICKER_BTN);
  4299         -  wxColour color = wxNullColour;
  4300         -  str = wxString::FromUTF8(Style->GetPolygonFillColor());
  4301         -  ColorMapEntry::GetWxColor(str, color);
  4302         -  if (color.IsOk() == true)
  4303         -    {
  4304         -      char hex[16];
  4305         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  4306         -      wxString str = wxString::FromUTF8(hex);
  4307         -      colorCtrl->SetValue(str);
  4308         -    }
  4309         -  colorCtrl->Enable(Style->IsPolygonFill());
  4310         -  pick->Enable(Style->IsPolygonFill());
  4311         -  wxCheckBox *enable2Box =
  4312         -    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_STROKE2_ENABLE);
  4313         -  enable2Box->SetValue(Style->IsPolygonStroke());
  4314         -  wxSlider *opacity2Ctrl =
  4315         -    (wxSlider *) FindWindow(ID_SYMBOLIZER_STROKE2_OPACITY);
  4316         -  opacity2Ctrl->SetValue(Style->GetPolygonStrokeOpacity() * 100.0);
  4317         -  opacity2Ctrl->Enable(Style->IsPolygonStroke());
  4318         -  wxTextCtrl *color2Ctrl =
  4319         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE2_COLOR);
  4320         -  wxButton *pick2 = (wxButton *) FindWindow(ID_SYMBOLIZER_STROKE2_PICKER_BTN);
  4321         -  color = wxNullColour;
  4322         -  str = wxString::FromUTF8(Style->GetPolygonStrokeColor());
  4323         -  ColorMapEntry::GetWxColor(str, color);
  4324         -  if (color.IsOk() == true)
  4325         -    {
  4326         -      char hex[16];
  4327         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  4328         -      wxString str = wxString::FromUTF8(hex);
  4329         -      color2Ctrl->SetValue(str);
  4330         -    }
  4331         -  color2Ctrl->Enable(Style->IsPolygonStroke());
  4332         -  pick2->Enable(Style->IsPolygonStroke());
  4333         -  wxTextCtrl *widthCtrl =
  4334         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_STROKE2_WIDTH);
  4335         -  sprintf(dummy, "%1.2f", Style->GetPolygonStrokeWidth());
  4336         -  str = wxString::FromUTF8(dummy);
  4337         -  widthCtrl->SetValue(str);
  4338         -  widthCtrl->Enable(Style->IsPolygonStroke());
  4339         -}
  4340         -
  4341         -bool QuickStyleVectorDialog::RetrieveTextPointPage(bool check)
  4342         -{
  4343         -//
  4344         -// retrieving params from the Text Symbolizer page - Point Placement
  4345         -//
  4346         -  wxString column;
  4347         -  wxString font;
  4348         -  double fontSize;
  4349         -  int fontStyle;
  4350         -  int fontWeight;
  4351         -  double opacity;
  4352         -  char fontColor[8];
  4353         -  double haloRadius;
  4354         -  double haloOpacity;
  4355         -  char haloColor[8];
  4356         -  double rotation;
  4357         -  double anchorPointX;
  4358         -  double anchorPointY;
  4359         -  double displacementX;
  4360         -  double displacementY;
  4361         -
  4362         -  if (Style->IsLabelPrint() == false)
  4363         -    return true;
  4364         -
  4365         -  wxComboBox *columnCtrl = (wxComboBox *) FindWindow(ID_SYMBOLIZER_TEXT1_LABEL);
  4366         -  int idSel = columnCtrl->GetSelection();
  4367         -  if (idSel == wxNOT_FOUND)
  4368         -    {
  4369         -      if (check == true)
  4370         -        {
  4371         -          wxMessageBox(wxT
  4372         -                       ("You must select some Column !!!"),
  4373         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4374         -          return false;
  4375         -        }
  4376         -    }
  4377         -  column = columnCtrl->GetValue();
  4378         -  wxComboBox *fontCtrl = (wxComboBox *) FindWindow(ID_SYMBOLIZER_FONT1_NAME);
  4379         -  idSel = fontCtrl->GetSelection();
  4380         -  if (idSel == wxNOT_FOUND)
  4381         -    {
  4382         -      if (check == true)
  4383         -        {
  4384         -          wxMessageBox(wxT
  4385         -                       ("You must select some Font !!!"),
  4386         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4387         -          return false;
  4388         -        }
  4389         -    }
  4390         -  font = fontCtrl->GetValue();
  4391         -  wxTextCtrl *sizeCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FONT1_SIZE);
  4392         -  wxString value = sizeCtrl->GetValue();
  4393         -  if (value.ToDouble(&fontSize) != true)
  4394         -    {
  4395         -      if (check == true)
  4396         -        {
  4397         -          wxMessageBox(wxT
  4398         -                       ("FONT-SIZE isn't a valid decimal number !!!"),
  4399         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4400         -          return false;
  4401         -        }
  4402         -    }
  4403         -  if (fontSize <= 0.0)
  4404         -    {
  4405         -      if (check == true)
  4406         -        {
  4407         -          wxMessageBox(wxT
  4408         -                       ("FONT-SIZE should be a positive numberr !!!"),
  4409         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4410         -          return false;
  4411         -        }
  4412         -    }
  4413         -  wxCheckBox *boldCtrl = (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT1_BOLD);
  4414         -  wxCheckBox *italicCtrl =
  4415         -    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT1_ITALIC);
  4416         -  if (boldCtrl->GetValue() == true)
  4417         -    fontWeight = RL2_FONTWEIGHT_BOLD;
  4418         -  else
  4419         -    fontWeight = RL2_FONTWEIGHT_NORMAL;
  4420         -  if (italicCtrl->GetValue() == true)
  4421         -    fontStyle = RL2_FONTSTYLE_ITALIC;
  4422         -  else
  4423         -    fontStyle = RL2_FONTSTYLE_NORMAL;
  4424         -  wxSlider *opacityFontCtrl =
  4425         -    (wxSlider *) FindWindow(ID_SYMBOLIZER_FONT1_OPACITY);
  4426         -  opacity = opacityFontCtrl->GetValue() / 100.0;
  4427         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FONT1_COLOR);
  4428         -  wxString color = colorCtrl->GetValue();
  4429         -  if (ColorMapEntry::IsValidColor(color) != true)
  4430         -    {
  4431         -      if (check == true)
  4432         -        {
  4433         -          wxMessageBox(wxT
  4434         -                       ("FONT-COLOR isn't a valid HexRGB color !!!"),
  4435         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4436         -          return false;
  4437         -        }
  4438         -    }
  4439         -  strcpy(fontColor, color.ToUTF8());
  4440         -// Point Placement
  4441         -  wxTextCtrl *rotationCtrl =
  4442         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_ROTATION);
  4443         -  value = rotationCtrl->GetValue();
  4444         -  if (value.ToDouble(&rotation) != true)
  4445         -    {
  4446         -      if (check == true)
  4447         -        {
  4448         -          wxMessageBox(wxT
  4449         -                       ("ROTATION isn't a valid decimal number !!!"),
  4450         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4451         -          return false;
  4452         -        }
  4453         -    }
  4454         -  wxTextCtrl *anchorXCtrl =
  4455         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_ANCHOR_X);
  4456         -  value = anchorXCtrl->GetValue();
  4457         -  if (value.ToDouble(&anchorPointX) != true)
  4458         -    {
  4459         -      if (check == true)
  4460         -        {
  4461         -          wxMessageBox(wxT
  4462         -                       ("ANCHOR-POINT-X isn't a valid decimal number !!!"),
  4463         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4464         -          return false;
  4465         -        }
  4466         -    }
  4467         -  if (anchorPointX < 0.0 || anchorPointX > 1.0)
  4468         -    {
  4469         -      if (check == true)
  4470         -        {
  4471         -          wxMessageBox(wxT
  4472         -                       ("ANCHOR-POINT-X must be between 0.0 and 1.0 !!!"),
  4473         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4474         -          return false;
  4475         -        }
  4476         -    }
  4477         -  wxTextCtrl *anchorYCtrl =
  4478         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_ANCHOR_Y);
  4479         -  value = anchorYCtrl->GetValue();
  4480         -  if (value.ToDouble(&anchorPointY) != true)
  4481         -    {
  4482         -      if (check == true)
  4483         -        {
  4484         -          wxMessageBox(wxT
  4485         -                       ("ANCHOR-POINT-Y isn't a valid decimal number !!!"),
  4486         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4487         -          return false;
  4488         -        }
  4489         -    }
  4490         -  if (anchorPointY < 0.0 || anchorPointY > 1.0)
  4491         -    {
  4492         -      if (check == true)
  4493         -        {
  4494         -          wxMessageBox(wxT
  4495         -                       ("ANCHOR-POINT-Y must be between 0.0 and 1.0 !!!"),
  4496         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4497         -          return false;
  4498         -        }
  4499         -    }
  4500         -  wxTextCtrl *displXCtrl =
  4501         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_DISPLACEMENT_X);
  4502         -  value = displXCtrl->GetValue();
  4503         -  if (value.ToDouble(&displacementX) != true)
  4504         -    {
  4505         -      if (check == true)
  4506         -        {
  4507         -          wxMessageBox(wxT
  4508         -                       ("DISPLACEMENT-X isn't a valid decimal number !!!"),
  4509         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4510         -          return false;
  4511         -        }
  4512         -    }
  4513         -  wxTextCtrl *displYCtrl =
  4514         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_DISPLACEMENT_Y);
  4515         -  value = displYCtrl->GetValue();
  4516         -  if (value.ToDouble(&displacementY) != true)
  4517         -    {
  4518         -      if (check == true)
  4519         -        {
  4520         -          wxMessageBox(wxT
  4521         -                       ("DISPLACEMENT-Y isn't a valid decimal number !!!"),
  4522         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4523         -          return false;
  4524         -        }
  4525         -    }
  4526         -  if (Style->IsHaloEnabled() == true)
  4527         -    {
  4528         -      wxSlider *opacityHaloCtrl =
  4529         -        (wxSlider *) FindWindow(ID_SYMBOLIZER_HALO1_OPACITY);
  4530         -      haloOpacity = opacityHaloCtrl->GetValue() / 100.0;
  4531         -      wxTextCtrl *radiusCtrl =
  4532         -        (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_HALO1_RADIUS);
  4533         -      wxString value = radiusCtrl->GetValue();
  4534         -      if (value.ToDouble(&haloRadius) != true)
  4535         -        {
  4536         -          if (check == true)
  4537         -            {
  4538         -              wxMessageBox(wxT
  4539         -                           ("HALO-RADIUS isn't a valid decimal number !!!"),
  4540         -                           wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4541         -              return false;
  4542         -            }
  4543         -        }
  4544         -      if (haloRadius <= 0.0)
  4545         -        {
  4546         -          if (check == true)
  4547         -            {
  4548         -              wxMessageBox(wxT
  4549         -                           ("HALO-RADIUS should be a positive number !!!"),
  4550         -                           wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4551         -              return false;
  4552         -            }
  4553         -        }
  4554         -      wxTextCtrl *colorHaloCtrl =
  4555         -        (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_HALO1_COLOR);
  4556         -      wxString color = colorHaloCtrl->GetValue();
  4557         -      if (ColorMapEntry::IsValidColor(color) != true)
  4558         -        {
  4559         -          if (check == true)
  4560         -            {
  4561         -              wxMessageBox(wxT
  4562         -                           ("HALO-COLOR isn't a valid HexRGB color !!!"),
  4563         -                           wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4564         -              return false;
  4565         -            }
  4566         -        }
  4567         -      strcpy(haloColor, color.ToUTF8());
  4568         -    }
  4569         -
  4570         -  Style->SetLabelColumn(column.ToUTF8());
  4571         -  Style->SetFontFacename(font.ToUTF8());
  4572         -  Style->SetFontOpacity(opacity);
  4573         -  Style->SetFontSize(fontSize);
  4574         -  Style->SetFontStyle(fontStyle);
  4575         -  Style->SetFontWeight(fontWeight);
  4576         -  Style->SetFontColor(fontColor);
  4577         -  Style->SetLabelRotation(rotation);
  4578         -  Style->SetLabelAnchorX(anchorPointX);
  4579         -  Style->SetLabelAnchorY(anchorPointY);
  4580         -  Style->SetLabelDisplacementX(displacementX);
  4581         -  Style->SetLabelDisplacementY(displacementY);
  4582         -  if (Style->IsHaloEnabled() == true)
  4583         -    {
  4584         -      Style->SetHaloRadius(haloRadius);
  4585         -      Style->SetHaloOpacity(haloOpacity);
  4586         -      Style->SetHaloColor(haloColor);
  4587         -    }
  4588         -  return true;
  4589         -}
  4590         -
  4591         -void QuickStyleVectorDialog::UpdateTextPointPage()
  4592         -{
  4593         -//
  4594         -// updating the Text Symbolizer page - Point Placement
  4595         -//
  4596         -  wxCheckBox *enableCtrl =
  4597         -    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT1_ENABLE);
  4598         -  enableCtrl->SetValue(Style->IsLabelPrint());
  4599         -  wxComboBox *columnCtrl = (wxComboBox *) FindWindow(ID_SYMBOLIZER_TEXT1_LABEL);
  4600         -  wxString str = wxString::FromUTF8(Style->GetLabelColumn());
  4601         -  int idSel = columnCtrl->FindString(str);
  4602         -  columnCtrl->SetSelection(idSel);
  4603         -  columnCtrl->Enable(Style->IsLabelPrint());
  4604         -  wxComboBox *fontCtrl = (wxComboBox *) FindWindow(ID_SYMBOLIZER_FONT1_NAME);
  4605         -  str = wxString::FromUTF8(Style->GetFontFacename());
  4606         -  idSel = fontCtrl->FindString(str);
  4607         -  fontCtrl->SetSelection(idSel);
  4608         -  fontCtrl->Enable(Style->IsLabelPrint());
  4609         -  wxSlider *opacityFontCtrl =
  4610         -    (wxSlider *) FindWindow(ID_SYMBOLIZER_FONT1_OPACITY);
  4611         -  opacityFontCtrl->SetValue(Style->GetFontOpacity() * 100.0);
  4612         -  opacityFontCtrl->Enable(Style->IsLabelPrint());
  4613         -  wxTextCtrl *colorFontCtrl =
  4614         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FONT1_COLOR);
  4615         -  wxButton *pickFont = (wxButton *) FindWindow(ID_SYMBOLIZER_FONT1_PICKER_BTN);
  4616         -  wxColour color = wxNullColour;
  4617         -  str = wxString::FromUTF8(Style->GetFontColor());
  4618         -  ColorMapEntry::GetWxColor(str, color);
  4619         -  if (color.IsOk() == true)
  4620         -    {
  4621         -      char hex[16];
  4622         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  4623         -      wxString str = wxString::FromUTF8(hex);
  4624         -      colorFontCtrl->SetValue(str);
  4625         -    }
  4626         -  colorFontCtrl->Enable(Style->IsLabelPrint());
  4627         -  pickFont->Enable(Style->IsLabelPrint());
  4628         -  wxTextCtrl *sizeCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FONT1_SIZE);
  4629         -  char dummy[64];
  4630         -  sprintf(dummy, "%1.2f", Style->GetFontSize());
  4631         -  str = wxString::FromUTF8(dummy);
  4632         -  sizeCtrl->SetValue(str);
  4633         -  sizeCtrl->Enable(Style->IsLabelPrint());
  4634         -  wxCheckBox *boldCtrl = (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT1_BOLD);
  4635         -  wxCheckBox *italicCtrl =
  4636         -    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT1_ITALIC);
  4637         -  if (Style->GetFontWeight() == RL2_FONTWEIGHT_BOLD)
  4638         -    boldCtrl->SetValue(true);
  4639         -  else
  4640         -    boldCtrl->SetValue(false);
  4641         -  if (Style->GetFontStyle() == RL2_FONTSTYLE_ITALIC)
  4642         -    italicCtrl->SetValue(true);
  4643         -  else
  4644         -    italicCtrl->SetValue(false);
  4645         -  boldCtrl->Enable(false);
  4646         -  italicCtrl->Enable(false);
  4647         -  if (Style->GetFontFacename() != NULL)
  4648         -    {
  4649         -      if (strncmp(Style->GetFontFacename(), "ToyFont: ", 9) == 0)
  4650         -        {
  4651         -          boldCtrl->Enable(Style->IsLabelPrint());
  4652         -          italicCtrl->Enable(Style->IsLabelPrint());
  4653         -      } else
  4654         -        {
  4655         -          bool bold = false;
  4656         -          bool italic = false;
  4657         -          MainFrame->CheckTTFont(Style->GetFontFacename(), &bold, &italic);
  4658         -          boldCtrl->SetValue(bold);
  4659         -          italicCtrl->SetValue(italic);
  4660         -          boldCtrl->Enable(false);
  4661         -          italicCtrl->Enable(false);
  4662         -        }
  4663         -    }
  4664         -// Point Placement
  4665         -  wxTextCtrl *rotationCtrl =
  4666         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_ROTATION);
  4667         -  sprintf(dummy, "%1.2f", Style->GetLabelRotation());
  4668         -  str = wxString::FromUTF8(dummy);
  4669         -  rotationCtrl->SetValue(str);
  4670         -  rotationCtrl->Enable(Style->IsLabelPrint());
  4671         -  wxTextCtrl *anchorXCtrl =
  4672         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_ANCHOR_X);
  4673         -  sprintf(dummy, "%1.2f", Style->GetLabelAnchorX());
  4674         -  str = wxString::FromUTF8(dummy);
  4675         -  anchorXCtrl->SetValue(str);
  4676         -  anchorXCtrl->Enable(Style->IsLabelPrint());
  4677         -  wxTextCtrl *anchorYCtrl =
  4678         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_ANCHOR_Y);
  4679         -  sprintf(dummy, "%1.2f", Style->GetLabelAnchorY());
  4680         -  str = wxString::FromUTF8(dummy);
  4681         -  anchorYCtrl->SetValue(str);
  4682         -  anchorYCtrl->Enable(Style->IsLabelPrint());
  4683         -  wxTextCtrl *displXCtrl =
  4684         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_DISPLACEMENT_X);
  4685         -  sprintf(dummy, "%1.2f", Style->GetLabelDisplacementX());
  4686         -  str = wxString::FromUTF8(dummy);
  4687         -  displXCtrl->SetValue(str);
  4688         -  displXCtrl->Enable(Style->IsLabelPrint());
  4689         -  wxTextCtrl *displYCtrl =
  4690         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_DISPLACEMENT_Y);
  4691         -  sprintf(dummy, "%1.2f", Style->GetLabelDisplacementY());
  4692         -  str = wxString::FromUTF8(dummy);
  4693         -  displYCtrl->SetValue(str);
  4694         -  displYCtrl->Enable(Style->IsLabelPrint());
  4695         -  wxCheckBox *enableHaloBox =
  4696         -    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_HALO1_ENABLE);
  4697         -  if (Style->IsHaloEnabled() == true)
  4698         -    enableHaloBox->SetValue(true);
  4699         -  else
  4700         -    enableHaloBox->SetValue(false);
  4701         -  enableHaloBox->Enable(Style->IsLabelPrint());
  4702         -  bool enable = false;
  4703         -  if (Style->IsLabelPrint() == true)
  4704         -    enable = Style->IsHaloEnabled();
  4705         -  wxTextCtrl *radiusCtrl =
  4706         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_HALO1_RADIUS);
  4707         -  radiusCtrl->Enable(enable);
  4708         -  wxTextCtrl *colorHaloCtrl =
  4709         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_HALO1_COLOR);
  4710         -  colorHaloCtrl->Enable(enable);
  4711         -  wxButton *pickHalo = (wxButton *) FindWindow(ID_SYMBOLIZER_HALO1_PICKER_BTN);
  4712         -  pickHalo->Enable(enable);
  4713         -  wxSlider *opacityHaloCtrl =
  4714         -    (wxSlider *) FindWindow(ID_SYMBOLIZER_HALO1_OPACITY);
  4715         -  opacityHaloCtrl->Enable(enable);
  4716         -  opacityHaloCtrl->SetValue(Style->GetHaloOpacity() * 100.0);
  4717         -  sprintf(dummy, "%1.2f", Style->GetHaloRadius());
  4718         -  str = wxString::FromUTF8(dummy);
  4719         -  radiusCtrl->SetValue(str);
  4720         -  color = wxNullColour;
  4721         -  str = wxString::FromUTF8(Style->GetHaloColor());
  4722         -  ColorMapEntry::GetWxColor(str, color);
  4723         -  if (color.IsOk() == true)
  4724         -    {
  4725         -      char hex[16];
  4726         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  4727         -      wxString str = wxString::FromUTF8(hex);
  4728         -      colorHaloCtrl->SetValue(str);
  4729         -    }
  4730         -  if (Style->IsHaloEnabled() == false)
  4731         -    {
  4732         -      opacityHaloCtrl->Enable(false);
  4733         -      pickHalo->Enable(false);
  4734         -      colorHaloCtrl->Enable(false);
  4735         -      radiusCtrl->Enable(false);
  4736         -  } else
  4737         -    {
  4738         -      opacityHaloCtrl->Enable(true);
  4739         -      pickHalo->Enable(true);
  4740         -      colorHaloCtrl->Enable(true);
  4741         -      radiusCtrl->Enable(true);
  4742         -    }
  4743         -}
  4744         -
  4745         -bool QuickStyleVectorDialog::RetrieveTextLinePage(bool check)
  4746         -{
  4747         -//
  4748         -// retrieving params from the Text Symbolizer page - Line Placement
  4749         -//
  4750         -  wxString column;
  4751         -  wxString font;
  4752         -  double fontSize;
  4753         -  int fontStyle;
  4754         -  int fontWeight;
  4755         -  double opacity;
  4756         -  char fontColor[8];
  4757         -  double haloRadius;
  4758         -  double haloOpacity;
  4759         -  char haloColor[8];
  4760         -  double perpendicularOffset;
  4761         -  double initialGap;
  4762         -  double gap;
  4763         -
  4764         -  if (Style->IsLabelPrint() == false)
  4765         -    return true;
  4766         -
  4767         -  wxComboBox *columnCtrl = (wxComboBox *) FindWindow(ID_SYMBOLIZER_TEXT2_LABEL);
  4768         -  int idSel = columnCtrl->GetSelection();
  4769         -  if (idSel == wxNOT_FOUND)
  4770         -    {
  4771         -      if (check == true)
  4772         -        {
  4773         -          wxMessageBox(wxT
  4774         -                       ("You must select some Column !!!"),
  4775         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4776         -          return false;
  4777         -        }
  4778         -    }
  4779         -  column = columnCtrl->GetValue();
  4780         -  wxComboBox *fontCtrl = (wxComboBox *) FindWindow(ID_SYMBOLIZER_FONT2_NAME);
  4781         -  idSel = fontCtrl->GetSelection();
  4782         -  if (idSel == wxNOT_FOUND)
  4783         -    {
  4784         -      if (check == true)
  4785         -        {
  4786         -          wxMessageBox(wxT
  4787         -                       ("You must select some Font !!!"),
  4788         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4789         -          return false;
  4790         -        }
  4791         -    }
  4792         -  font = fontCtrl->GetValue();
  4793         -  wxTextCtrl *sizeCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FONT2_SIZE);
  4794         -  wxString value = sizeCtrl->GetValue();
  4795         -  if (value.ToDouble(&fontSize) != true)
  4796         -    {
  4797         -      if (check == true)
  4798         -        {
  4799         -          wxMessageBox(wxT
  4800         -                       ("FONT-SIZE isn't a valid decimal number !!!"),
  4801         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4802         -          return false;
  4803         -        }
  4804         -    }
  4805         -  if (fontSize <= 0.0)
  4806         -    {
  4807         -      if (check == true)
  4808         -        {
  4809         -          wxMessageBox(wxT
  4810         -                       ("FONT-SIZE should be a positive numberr !!!"),
  4811         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4812         -          return false;
  4813         -        }
  4814         -    }
  4815         -  wxCheckBox *boldCtrl = (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT2_BOLD);
  4816         -  wxCheckBox *italicCtrl =
  4817         -    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT2_ITALIC);
  4818         -  if (boldCtrl->GetValue() == true)
  4819         -    fontWeight = RL2_FONTWEIGHT_BOLD;
  4820         -  else
  4821         -    fontWeight = RL2_FONTWEIGHT_NORMAL;
  4822         -  if (italicCtrl->GetValue() == true)
  4823         -    fontStyle = RL2_FONTSTYLE_ITALIC;
  4824         -  else
  4825         -    fontStyle = RL2_FONTSTYLE_NORMAL;
  4826         -  wxSlider *opacityFontCtrl =
  4827         -    (wxSlider *) FindWindow(ID_SYMBOLIZER_FONT2_OPACITY);
  4828         -  opacity = opacityFontCtrl->GetValue() / 100.0;
  4829         -  wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FONT2_COLOR);
  4830         -  wxString color = colorCtrl->GetValue();
  4831         -  if (ColorMapEntry::IsValidColor(color) != true)
  4832         -    {
  4833         -      if (check == true)
  4834         -        {
  4835         -          wxMessageBox(wxT
  4836         -                       ("FONT-COLOR isn't a valid HexRGB color !!!"),
  4837         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4838         -          return false;
  4839         -        }
  4840         -    }
  4841         -  strcpy(fontColor, color.ToUTF8());
  4842         -// Line Placement
  4843         -  wxTextCtrl *perpCtrl =
  4844         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_PERPENDICULAR);
  4845         -  value = perpCtrl->GetValue();
  4846         -  if (value.ToDouble(&perpendicularOffset) != true)
  4847         -    {
  4848         -      if (check == true)
  4849         -        {
  4850         -          wxMessageBox(wxT
  4851         -                       ("PERPENDICULAR-OFFSET isn't a valid decimal number !!!"),
  4852         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4853         -          return false;
  4854         -        }
  4855         -    }
  4856         -  wxTextCtrl *inigapCtrl =
  4857         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_INITIAL_GAP);
  4858         -  value = inigapCtrl->GetValue();
  4859         -  if (value.ToDouble(&initialGap) != true)
  4860         -    {
  4861         -      if (check == true)
  4862         -        {
  4863         -          wxMessageBox(wxT
  4864         -                       ("INITIAL-GAP isn't a valid decimal number !!!"),
  4865         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4866         -          return false;
  4867         -        }
  4868         -    }
  4869         -  if (initialGap < 0.0)
  4870         -    {
  4871         -      if (check == true)
  4872         -        {
  4873         -          wxMessageBox(wxT
  4874         -                       ("INITIAL-GAP should be a positive number !!!"),
  4875         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4876         -          return false;
  4877         -        }
  4878         -    }
  4879         -  wxTextCtrl *gapCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_GAP);
  4880         -  value = gapCtrl->GetValue();
  4881         -  if (value.ToDouble(&gap) != true)
  4882         -    {
  4883         -      if (check == true)
  4884         -        {
  4885         -          wxMessageBox(wxT
  4886         -                       ("GAP isn't a valid decimal number !!!"),
  4887         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4888         -          return false;
  4889         -        }
  4890         -    }
  4891         -  if (gap < 0.0)
  4892         -    {
  4893         -      if (check == true)
  4894         -        {
  4895         -          wxMessageBox(wxT
  4896         -                       ("GAP should be a positive number !!!"),
  4897         -                       wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4898         -          return false;
  4899         -        }
  4900         -    }
  4901         -  if (Style->IsHaloEnabled() == true)
  4902         -    {
  4903         -      wxSlider *opacityHaloCtrl =
  4904         -        (wxSlider *) FindWindow(ID_SYMBOLIZER_HALO2_OPACITY);
  4905         -      haloOpacity = opacityHaloCtrl->GetValue() / 100.0;
  4906         -      wxTextCtrl *radiusCtrl =
  4907         -        (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_HALO2_RADIUS);
  4908         -      wxString value = radiusCtrl->GetValue();
  4909         -      if (value.ToDouble(&haloRadius) != true)
  4910         -        {
  4911         -          if (check == true)
  4912         -            {
  4913         -              wxMessageBox(wxT
  4914         -                           ("HALO-RADIUS isn't a valid decimal number !!!"),
  4915         -                           wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4916         -              return false;
  4917         -            }
  4918         -        }
  4919         -      if (haloRadius <= 0.0)
  4920         -        {
  4921         -          if (check == true)
  4922         -            {
  4923         -              wxMessageBox(wxT
  4924         -                           ("HALO-RADIUS should be a positive number !!!"),
  4925         -                           wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4926         -              return false;
  4927         -            }
  4928         -        }
  4929         -      wxTextCtrl *colorHaloCtrl =
  4930         -        (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_HALO2_COLOR);
  4931         -      wxString color = colorHaloCtrl->GetValue();
  4932         -      if (ColorMapEntry::IsValidColor(color) != true)
  4933         -        {
  4934         -          if (check == true)
  4935         -            {
  4936         -              wxMessageBox(wxT
  4937         -                           ("HALO-COLOR isn't a valid HexRGB color !!!"),
  4938         -                           wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  4939         -              return false;
  4940         -            }
  4941         -        }
  4942         -      strcpy(haloColor, color.ToUTF8());
  4943         -    }
  4944         -  Style->SetLabelColumn(column.ToUTF8());
  4945         -  Style->SetFontFacename(font.ToUTF8());
  4946         -  Style->SetFontOpacity(opacity);
  4947         -  Style->SetFontSize(fontSize);
  4948         -  Style->SetFontStyle(fontStyle);
  4949         -  Style->SetFontWeight(fontWeight);
  4950         -  Style->SetFontColor(fontColor);
  4951         -  Style->SetLabelPerpendicularOffset(perpendicularOffset);
  4952         -  Style->SetLabelInitialGap(initialGap);
  4953         -  Style->SetLabelGap(gap);
  4954         -  if (Style->IsHaloEnabled() == true)
  4955         -    {
  4956         -      Style->SetHaloRadius(haloRadius);
  4957         -      Style->SetHaloOpacity(haloOpacity);
  4958         -      Style->SetHaloColor(haloColor);
  4959         -    }
  4960         -  return true;
  4961         -}
  4962         -
  4963         -void QuickStyleVectorDialog::UpdateTextLinePage()
  4964         -{
  4965         -//
  4966         -// updating the Text Symbolizer page - Line Placement
  4967         -//
  4968         -  wxCheckBox *enableCtrl =
  4969         -    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT2_ENABLE);
  4970         -  enableCtrl->SetValue(Style->IsLabelPrint());
  4971         -  wxComboBox *columnCtrl = (wxComboBox *) FindWindow(ID_SYMBOLIZER_TEXT2_LABEL);
  4972         -  wxString str = wxString::FromUTF8(Style->GetLabelColumn());
  4973         -  int idSel = columnCtrl->FindString(str);
  4974         -  columnCtrl->SetSelection(idSel);
  4975         -  columnCtrl->Enable(Style->IsLabelPrint());
  4976         -  wxComboBox *fontCtrl = (wxComboBox *) FindWindow(ID_SYMBOLIZER_FONT2_NAME);
  4977         -  str = wxString::FromUTF8(Style->GetFontFacename());
  4978         -  idSel = fontCtrl->FindString(str);
  4979         -  fontCtrl->SetSelection(idSel);
  4980         -  fontCtrl->Enable(Style->IsLabelPrint());
  4981         -  wxSlider *opacityFontCtrl =
  4982         -    (wxSlider *) FindWindow(ID_SYMBOLIZER_FONT2_OPACITY);
  4983         -  opacityFontCtrl->SetValue(Style->GetFontOpacity() * 100.0);
  4984         -  opacityFontCtrl->Enable(Style->IsLabelPrint());
  4985         -  wxTextCtrl *colorFontCtrl =
  4986         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FONT2_COLOR);
  4987         -  wxButton *pickFont = (wxButton *) FindWindow(ID_SYMBOLIZER_FONT2_PICKER_BTN);
  4988         -  wxColour color = wxNullColour;
  4989         -  str = wxString::FromUTF8(Style->GetFontColor());
  4990         -  ColorMapEntry::GetWxColor(str, color);
  4991         -  if (color.IsOk() == true)
  4992         -    {
  4993         -      char hex[16];
  4994         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  4995         -      wxString str = wxString::FromUTF8(hex);
  4996         -      colorFontCtrl->SetValue(str);
  4997         -    }
  4998         -  colorFontCtrl->Enable(Style->IsLabelPrint());
  4999         -  pickFont->Enable(Style->IsLabelPrint());
  5000         -  wxTextCtrl *sizeCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_FONT2_SIZE);
  5001         -  char dummy[64];
  5002         -  sprintf(dummy, "%1.2f", Style->GetFontSize());
  5003         -  str = wxString::FromUTF8(dummy);
  5004         -  sizeCtrl->SetValue(str);
  5005         -  sizeCtrl->Enable(Style->IsLabelPrint());
  5006         -  wxCheckBox *boldCtrl = (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT2_BOLD);
  5007         -  wxCheckBox *italicCtrl =
  5008         -    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT2_ITALIC);
  5009         -  if (Style->GetFontWeight() == RL2_FONTWEIGHT_BOLD)
  5010         -    boldCtrl->SetValue(true);
  5011         -  else
  5012         -    boldCtrl->SetValue(false);
  5013         -  if (Style->GetFontStyle() == RL2_FONTSTYLE_ITALIC)
  5014         -    italicCtrl->SetValue(true);
  5015         -  else
  5016         -    italicCtrl->SetValue(false);
  5017         -  italicCtrl->Enable(Style->IsLabelPrint());
  5018         -  boldCtrl->Enable(false);
  5019         -  italicCtrl->Enable(false);
  5020         -  if (Style->GetFontFacename() != NULL)
  5021         -    {
  5022         -      if (strncmp(Style->GetFontFacename(), "ToyFont: ", 9) == 0)
  5023         -        {
  5024         -          boldCtrl->Enable(Style->IsLabelPrint());
  5025         -          italicCtrl->Enable(Style->IsLabelPrint());
  5026         -      } else
  5027         -        {
  5028         -          bool bold = false;
  5029         -          bool italic = false;
  5030         -          MainFrame->CheckTTFont(Style->GetFontFacename(), &bold, &italic);
  5031         -          boldCtrl->SetValue(bold);
  5032         -          italicCtrl->SetValue(italic);
  5033         -          boldCtrl->Enable(false);
  5034         -          italicCtrl->Enable(false);
  5035         -        }
  5036         -    }
  5037         -// Line Placement
  5038         -  wxTextCtrl *perpCtrl =
  5039         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_PERPENDICULAR);
  5040         -  sprintf(dummy, "%1.2f", Style->GetLabelPerpendicularOffset());
  5041         -  str = wxString::FromUTF8(dummy);
  5042         -  perpCtrl->SetValue(str);
  5043         -  perpCtrl->Enable(Style->IsLabelPrint());
  5044         -  wxCheckBox *repeatBox =
  5045         -    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT_IS_REPEATED);
  5046         -  repeatBox->SetValue(Style->IsRepeatedLabel());
  5047         -  repeatBox->Enable(Style->IsLabelPrint());
  5048         -  wxTextCtrl *inigapCtrl =
  5049         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_INITIAL_GAP);
  5050         -  sprintf(dummy, "%1.2f", Style->GetLabelInitialGap());
  5051         -  str = wxString::FromUTF8(dummy);
  5052         -  inigapCtrl->SetValue(str);
  5053         -  wxTextCtrl *gapCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_TEXT_GAP);
  5054         -  sprintf(dummy, "%1.2f", Style->GetLabelGap());
  5055         -  str = wxString::FromUTF8(dummy);
  5056         -  gapCtrl->SetValue(str);
  5057         -  if (Style->IsLabelPrint() && Style->IsRepeatedLabel())
  5058         -    {
  5059         -      inigapCtrl->Enable(true);
  5060         -      gapCtrl->Enable(true);
  5061         -  } else
  5062         -    {
  5063         -      inigapCtrl->Enable(false);
  5064         -      gapCtrl->Enable(false);
  5065         -    }
  5066         -  wxCheckBox *alignBox =
  5067         -    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT_IS_ALIGNED);
  5068         -  alignBox->SetValue(Style->IsLabelAligned());
  5069         -  alignBox->Enable(Style->IsLabelPrint());
  5070         -  wxCheckBox *generalizeBox =
  5071         -    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_TEXT_GENERALIZE);
  5072         -  generalizeBox->SetValue(Style->IsLabelGeneralizeLine());
  5073         -  generalizeBox->Enable(Style->IsLabelPrint());
  5074         -  wxCheckBox *enableHaloBox =
  5075         -    (wxCheckBox *) FindWindow(ID_SYMBOLIZER_HALO2_ENABLE);
  5076         -  if (Style->IsHaloEnabled() == true)
  5077         -    enableHaloBox->SetValue(true);
  5078         -  else
  5079         -    enableHaloBox->SetValue(false);
  5080         -  enableHaloBox->Enable(Style->IsLabelPrint());
  5081         -  bool enable = false;
  5082         -  if (Style->IsLabelPrint() == true)
  5083         -    enable = Style->IsHaloEnabled();
  5084         -  wxTextCtrl *radiusCtrl =
  5085         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_HALO2_RADIUS);
  5086         -  radiusCtrl->Enable(enable);
  5087         -  wxTextCtrl *colorHaloCtrl =
  5088         -    (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_HALO2_COLOR);
  5089         -  colorHaloCtrl->Enable(enable);
  5090         -  wxButton *pickHalo = (wxButton *) FindWindow(ID_SYMBOLIZER_HALO2_PICKER_BTN);
  5091         -  pickHalo->Enable(enable);
  5092         -  wxSlider *opacityHaloCtrl =
  5093         -    (wxSlider *) FindWindow(ID_SYMBOLIZER_HALO2_OPACITY);
  5094         -  opacityHaloCtrl->Enable(enable);
  5095         -  opacityHaloCtrl->SetValue(Style->GetHaloOpacity() * 100.0);
  5096         -  sprintf(dummy, "%1.2f", Style->GetHaloRadius());
  5097         -  str = wxString::FromUTF8(dummy);
  5098         -  radiusCtrl->SetValue(str);
  5099         -  color = wxNullColour;
  5100         -  str = wxString::FromUTF8(Style->GetHaloColor());
  5101         -  ColorMapEntry::GetWxColor(str, color);
  5102         -  if (color.IsOk() == true)
  5103         -    {
  5104         -      char hex[16];
  5105         -      sprintf(hex, "#%02x%02x%02x", color.Red(), color.Green(), color.Blue());
  5106         -      wxString str = wxString::FromUTF8(hex);
  5107         -      colorHaloCtrl->SetValue(str);
  5108         -    }
  5109         -  if (Style->IsHaloEnabled() == false)
  5110         -    {
  5111         -      opacityHaloCtrl->Enable(false);
  5112         -      pickHalo->Enable(false);
  5113         -      colorHaloCtrl->Enable(false);
  5114         -      radiusCtrl->Enable(false);
  5115         -  } else
  5116         -    {
  5117         -      opacityHaloCtrl->Enable(true);
  5118         -      pickHalo->Enable(true);
  5119         -      colorHaloCtrl->Enable(true);
  5120         -      radiusCtrl->Enable(true);
  5121         -    }
  5122         -}
  5123         -
  5124         -void QuickStyleVectorDialog::OnPageChanging(wxNotebookEvent & event)
  5125         -{
  5126         -//
  5127         -// TAB/PAGE selection changing
  5128         -//
  5129         -  bool ret = false;
  5130         -  int idx = event.GetOldSelection();
  5131         -  if (idx == 0)
  5132         -    ret = RetrieveMainPage();
  5133         -  else
  5134         -    {
  5135         -      if (idx == PagePointIndex)
  5136         -        ret = RetrievePointPage();
  5137         -      if (idx == PageLineIndex)
  5138         -        ret = RetrieveLinePage();
  5139         -      if (idx == PagePolygonIndex)
  5140         -        ret = RetrievePolygonPage();
  5141         -      if (idx == PageTextPointIndex)
  5142         -        ret = RetrieveTextPointPage();
  5143         -      if (idx == PageTextLineIndex)
  5144         -        ret = RetrieveTextLinePage();
  5145         -    }
  5146         -  if (ret != true)
  5147         -    event.Veto();
  5148         -}
  5149         -
  5150         -void QuickStyleVectorDialog::OnPageChanged(wxNotebookEvent & event)
  5151         -{
  5152         -//
  5153         -// TAB/PAGE selection changed
  5154         -//
  5155         -  int idx = event.GetSelection();
  5156         -  if (idx == 0)
  5157         -    UpdateMainPage();
  5158         -  else
  5159         -    {
  5160         -      if (idx == PagePointIndex)
  5161         -        UpdatePointPage();
  5162         -      if (idx == PageLineIndex)
  5163         -        UpdateLinePage();
  5164         -      if (idx == PagePolygonIndex)
  5165         -        UpdatePolygonPage();
  5166         -      if (idx == PageTextPointIndex)
  5167         -        UpdateTextPointPage();
  5168         -      if (idx == PageTextLineIndex)
  5169         -        UpdateTextLinePage();
  5170         -    }
  5171         -}
  5172         -
  5173         -bool QuickStyleVectorDialog::UpdateStyle()
  5174         -{
  5175         -//
  5176         -// updating the QuickStyle
  5177         -//
  5178         -  bool ret = false;
  5179         -  int idx = GetBookCtrl()->GetSelection();
  5180         -  if (idx == 0)
  5181         -    ret = RetrieveMainPage();
  5182         -  else
  5183         -    {
  5184         -      if (idx == PagePointIndex)
  5185         -        ret = RetrievePointPage();
  5186         -      if (idx == PageLineIndex)
  5187         -        ret = RetrieveLinePage();
  5188         -      if (idx == PagePolygonIndex)
  5189         -        ret = RetrievePolygonPage();
  5190         -      if (idx == PageTextPointIndex)
  5191         -        ret = RetrieveTextPointPage();
  5192         -      if (idx == PageTextLineIndex)
  5193         -        ret = RetrieveTextLinePage();
  5194         -    }
  5195         -  if (ret == false)
  5196         -    return false;
  5197         -
  5198         -  VectorLayerConfig *config = Layer->GetVectorConfig();
  5199         -  bool setCurrentStyle = false;
  5200         -  if (config->GetStyle() == NULL)
  5201         -    setCurrentStyle = true;
  5202         -  else
  5203         -    {
  5204         -      if (strcmp(Style->GetUUID(), config->GetStyle()) != 0)
  5205         -        setCurrentStyle = true;
  5206         -    }
  5207         -  if (setCurrentStyle == true)
  5208         -    {
  5209         -      config->SetStyle(Style->GetUUID());
  5210         -      IsConfigChanged = true;
  5211         -    }
  5212         -  IsConfigChanged = Layer->UpdateQuickStyle(Style);
  5213         -  return true;
  5214         -}
  5215         -
  5216         -void QuickStyleVectorDialog::OnOk(wxCommandEvent & WXUNUSED(event))
  5217         -{
  5218         -//
  5219         -// permanently saving the QuickStyle and quitting
  5220         -//
  5221         -  if (UpdateStyle() == true)
  5222         -    wxDialog::EndModal(wxID_OK);
  5223         -}
  5224         -
  5225         -void QuickStyleVectorDialog::OnApply(wxCommandEvent & WXUNUSED(event))
  5226         -{
  5227         -//
  5228         -// applying the QuickStyle and continuing
  5229         -//
  5230         -  if (UpdateStyle() == true)
  5231         -    {
  5232         -      if (IsConfigChanged == true)
  5233         -        MapPanel->RefreshMap();
  5234         -    }
  5235         -}
  5236         -
  5237         -void QuickStyleVectorDialog::OnExport(wxCommandEvent & WXUNUSED(event))
  5238         -{
  5239         -//
  5240         -// exporting the Quick Style as an external file
  5241         -//
  5242         -  bool xret = false;
  5243         -  int ret;
  5244         -  wxString path;
  5245         -  wxString lastDir;
  5246         -  int idx = GetBookCtrl()->GetSelection();
  5247         -  if (idx == 0)
  5248         -    xret = RetrieveMainPage();
  5249         -  else
  5250         -    {
  5251         -      if (idx == PagePointIndex)
  5252         -        xret = RetrievePointPage();
  5253         -      if (idx == PageLineIndex)
  5254         -        xret = RetrieveLinePage();
  5255         -      if (idx == PagePolygonIndex)
  5256         -        xret = RetrievePolygonPage();
  5257         -      if (idx == PageTextPointIndex)
  5258         -        xret = RetrieveTextPointPage();
  5259         -      if (idx == PageTextLineIndex)
  5260         -        xret = RetrieveTextLinePage();
  5261         -    }
  5262         -  if (xret == false)
  5263         -    return;
  5264         -
  5265         -  wxFileDialog fileDialog(this,
  5266         -                          wxT("Exporting an SLD/SE QuickStyle to a file"),
  5267         -                          wxT(""), wxT("style.xml"),
  5268         -                          wxT("XML Document|*.xml|All files (*.*)|*.*"),
  5269         -                          wxFD_SAVE | wxFD_OVERWRITE_PROMPT, wxDefaultPosition,
  5270         -                          wxDefaultSize, wxT("filedlg"));
  5271         -  lastDir = MainFrame->GetLastDirectory();
  5272         -  if (lastDir.Len() >= 1)
  5273         -    fileDialog.SetDirectory(lastDir);
  5274         -  ret = fileDialog.ShowModal();
  5275         -  if (ret == wxID_OK)
  5276         -    {
  5277         -      wxFileName file(fileDialog.GetPath());
  5278         -      path = file.GetPath();
  5279         -      path += file.GetPathSeparator();
  5280         -      path += file.GetName();
  5281         -      lastDir = file.GetPath();
  5282         -      path = fileDialog.GetPath();
  5283         -      FILE *out = fopen(path.ToUTF8(), "wb");
  5284         -      if (out == NULL)
  5285         -        wxMessageBox(wxT("ERROR: unable to create:\n\n\"") + path + wxT("\""),
  5286         -                     wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
  5287         -      else
  5288         -        {
  5289         -          char *xml = Style->CreateXmlStyle();
  5290         -          fwrite(xml, 1, strlen(xml), out);
  5291         -          sqlite3_free(xml);
  5292         -          fclose(out);
  5293         -          wxMessageBox(wxT
  5294         -                       ("SLD/SE QuickStyle successfully saved into:\n\n\"")
  5295         -                       + path + wxT("\""), wxT("spatialite_gui"),
  5296         -                       wxOK | wxICON_INFORMATION, this);
  5297         -        }
  5298         -    }
  5299         -}
  5300         -
  5301         -void QuickStyleVectorDialog::OnCopy(wxCommandEvent & WXUNUSED(event))
  5302         -{
  5303         -//
  5304         -// Copying the Quick Style into the Clipboard 
  5305         -//
  5306         -  bool ret = false;
  5307         -  int idx = GetBookCtrl()->GetSelection();
  5308         -  if (idx == 0)
  5309         -    ret = RetrieveMainPage();
  5310         -  else
  5311         -    {
  5312         -      if (idx == PagePointIndex)
  5313         -        ret = RetrievePointPage();
  5314         -      if (idx == PageLineIndex)
  5315         -        ret = RetrieveLinePage();
  5316         -      if (idx == PagePolygonIndex)
  5317         -        ret = RetrievePolygonPage();
  5318         -      if (idx == PageTextPointIndex)
  5319         -        ret = RetrieveTextPointPage();
  5320         -      if (idx == PageTextLineIndex)
  5321         -        ret = RetrieveTextLinePage();
  5322         -    }
  5323         -  if (ret == false)
  5324         -    return;
  5325         -
  5326         -  char *xml = Style->CreateXmlStyle();
  5327         -  wxString XMLstring = wxString::FromUTF8(xml);
  5328         -  sqlite3_free(xml);
  5329         -  if (wxTheClipboard->Open())
  5330         -    {
  5331         -      wxTheClipboard->SetData(new wxTextDataObject(XMLstring));
  5332         -      wxTheClipboard->Close();
  5333         -    }
  5334         -}
  5335         -
  5336         -void QuickStyleVectorDialog::OnQuit(wxCommandEvent & WXUNUSED(event))
  5337         -{
  5338         -//
  5339         -// all done: 
  5340         -//
  5341         -  wxDialog::EndModal(wxID_CANCEL);
  5342         -}

Changes to Raster.cpp.

     1      1   /*
     2      2   / Raster.cpp
     3      3   / various dialog classes supporting Raster datasources
     4      4   /
     5      5   / version 1.8, 2015 March 10
     6      6   /
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
     8      8   /
     9      9   / Copyright (C) 2015  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
    13     13   /    the Free Software Foundation, either version 3 of the License, or
    14     14   /    (at your option) any later version.
................................................................................
   292    292                                          wxT("NO-DATA Pixel"),
   293    293                                          wxDefaultPosition,
   294    294                                          wxDefaultSize);
   295    295     wxBoxSizer *ndSizer = new wxStaticBoxSizer(ndBox, wxVERTICAL);
   296    296     ndBoxSizer->Add(ndSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
   297    297     wxBoxSizer *nodataSizer = new wxBoxSizer(wxHORIZONTAL);
   298    298     ndSizer->Add(nodataSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
   299         -  wxTextCtrl *nodataCtrl = new wxTextCtrl(this, ID_CVG_NODATA, wxT("NONE"),
          299  +  wxTextCtrl *nodataCtrl = new wxTextCtrl(this, ID_CVG_NODATA, wxT(""),
   300    300                                             wxDefaultPosition, wxSize(200, 22));
   301    301     nodataSizer->Add(nodataCtrl, 0, wxALIGN_RIGHT | wxALL, 1);
   302    302     wxStaticText *nodataLabel = new wxStaticText(this, wxID_STATIC,
   303    303                                                  wxT
   304         -                                               ("  (list of comma-separated values) e.g.: "));
          304  +                                               ("         (list of comma-separated sample values) e.g.: "));
   305    305     nodataSizer->Add(nodataLabel, 0, wxALIGN_CENTER_VERTICAL | wxALL, 1);
   306    306     wxStaticText *nodata2Label =
   307         -    new wxStaticText(this, wxID_STATIC, wxT("255,255,255"));
          307  +    new wxStaticText(this, wxID_STATIC, wxT("255,255,255  "));
   308    308     nodata2Label->SetForegroundColour(wxColour(255, 0, 0));
   309    309     nodataSizer->Add(nodata2Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 1);
   310         -
   311         -
   312         -  wxStaticText *nodata3Label =
   313         -    new wxStaticText(this, wxID_STATIC, wxT("  or  "));
   314         -  nodataSizer->Add(nodata3Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 1);
   315         -  wxStaticText *nodata4Label = new wxStaticText(this, wxID_STATIC, wxT("NONE"));
   316         -  nodata4Label->SetForegroundColour(wxColour(255, 0, 0));
   317         -  nodataSizer->Add(nodata4Label, 0, wxALIGN_CENTER_VERTICAL | wxALL, 1);
   318    310   // sixth row: other attributes
   319    311     wxBoxSizer *mixSizer = new wxBoxSizer(wxHORIZONTAL);
   320    312     boxSizer->Add(mixSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
   321    313   // sixth row, column #1: Tile Size
   322    314     wxBoxSizer *tileBoxSizer = new wxBoxSizer(wxHORIZONTAL);
   323    315     mixSizer->Add(tileBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
   324    316     wxStaticBox *tileBox = new wxStaticBox(this, wxID_STATIC,
................................................................................
  1684   1676   {
  1685   1677   //
  1686   1678   // checking a NO-DATA value
  1687   1679   //
  1688   1680     int count = 0;
  1689   1681     int error = 0;
  1690   1682     char dummy[128];
  1691         -  if (no_data.CmpNoCase(wxT("NONE")) == 0)
  1692         -    return true;
  1693   1683     if (no_data.Len() == 0)
  1694         -    {
  1695         -      wxMessageBox(wxT("You must specify some NO-DATA value"),
  1696         -                   wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  1697         -      return false;
  1698         -    }
         1684  +    return true;
  1699   1685     wxStringTokenizer tokenizer(no_data, wxT(","));
  1700   1686     while (tokenizer.HasMoreTokens())
  1701   1687       {
  1702   1688         count++;
  1703   1689         wxString token = tokenizer.GetNextToken();
  1704   1690         if (sample == RL2_SAMPLE_FLOAT || sample == RL2_SAMPLE_DOUBLE)
  1705   1691           {
................................................................................
  1885   1871     NumBands = bandsCtrl->GetValue();
  1886   1872     if (PixelType == RL2_PIXEL_MULTIBAND && NumBands < 2)
  1887   1873       {
  1888   1874         wxMessageBox(wxT("Invalid number of Bands"),
  1889   1875                      wxT("spatialite_gui"), wxOK | wxICON_WARNING, this);
  1890   1876         return;
  1891   1877       }
         1878  +  wxRadioBox *pixelCtrl = (wxRadioBox *) FindWindow(ID_CVG_PIXEL);
         1879  +  wxRadioBox *sampleCtrl = (wxRadioBox *) FindWindow(ID_CVG_SAMPLE);
         1880  +  wxRadioBox *compressionCtrl = (wxRadioBox *) FindWindow(ID_CVG_COMPRESSION);
         1881  +  wxSpinCtrl *bandCtrl = (wxSpinCtrl *) FindWindow(ID_CVG_BANDS);
  1892   1882     if (PixelType == RL2_PIXEL_MULTIBAND)
  1893   1883       {
  1894   1884         if (RedBand >= 0)
  1895   1885           {
  1896   1886             if (RedBand >= NumBands)
  1897   1887               {
  1898   1888                 wxMessageBox(wxT("Invalid default Red Band"),
................................................................................
  3252   3242   // populates individual controls
  3253   3243     CreateControls();
  3254   3244   // sets dialog sizer
  3255   3245     GetSizer()->Fit(this);
  3256   3246     GetSizer()->SetSizeHints(this);
  3257   3247   // centers the dialog window
  3258   3248     Centre();
         3249  +  int count = 0;
  3259   3250     return true;
  3260   3251   }
  3261   3252   
  3262   3253   void RasterInfosDialog::CreateControls()
  3263   3254   {
  3264   3255   //
  3265   3256   // creating individual control and setting initial values

Changes to RasterSymbolizers.cpp.

     1      1   /*
     2      2   / RasterSymbolizers.cpp
     3      3   / various dialog classes
     4      4   /
     5      5   / version 1.8, 2015 March 23
     6      6   /
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
     8      8   /
     9      9   / Copyright (C) 2015  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
    13     13   /    the Free Software Foundation, either version 3 of the License, or
    14     14   /    (at your option) any later version.
................................................................................
  3611   3611   
  3612   3612   void RasterSymbolizerCategorizeDialog::RefreshGrid()
  3613   3613   {
  3614   3614   //
  3615   3615   // refreshing the Grid
  3616   3616   //
  3617   3617     int tot_rows = GridCtrl->GetNumberRows();
  3618         -  if (tot_rows > 0)
  3619         -    GridCtrl->DeleteRows(0, tot_rows);
         3618  +  GridCtrl->DeleteRows(0, tot_rows);
  3620   3619     int count = 1;
  3621   3620     ColorMapEntry *pE = Map.GetFirst();
  3622   3621     while (pE)
  3623   3622       {
  3624   3623         // counting how many lines are there
  3625   3624         count++;
  3626   3625         pE = pE->GetNext();
................................................................................
  4712   4711   
  4713   4712   void RasterSymbolizerInterpolateDialog::RefreshGrid()
  4714   4713   {
  4715   4714   //
  4716   4715   // refreshing the Grid
  4717   4716   //
  4718   4717     int tot_rows = GridCtrl->GetNumberRows();
  4719         -  if (tot_rows > 0)
  4720         -    GridCtrl->DeleteRows(0, tot_rows);
         4718  +  GridCtrl->DeleteRows(0, tot_rows);
  4721   4719     int count = 0;
  4722   4720     ColorMapEntry *pE = Map.GetFirst();
  4723   4721     while (pE)
  4724   4722       {
  4725   4723         // counting how many lines are there
  4726   4724         count++;
  4727   4725         pE = pE->GetNext();
................................................................................
  5352   5350   
  5353   5351   bool RasterSymbolizerMonochromeDialog::Create(MyFrame * parent)
  5354   5352   {
  5355   5353   //
  5356   5354   // creating the dialog
  5357   5355   //
  5358   5356     MainFrame = parent;
  5359         -  Color = wxT("#000000");
         5357  +  Color = wxT("#ff0000");
  5360   5358     MinScale = false;
  5361   5359     MaxScale = false;
  5362   5360     if (wxDialog::Create(parent, wxID_ANY,
  5363   5361                          wxT("RasterSymbolizer: Recolored Monochrome")) == false)
  5364   5362       return false;
  5365   5363   // populates individual controls
  5366   5364     CreateControls();
................................................................................
  5425   5423     wxBoxSizer *remapBoxSizer = new wxBoxSizer(wxVERTICAL);
  5426   5424     miscSizer->Add(remapBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  5427   5425     wxStaticBox *remapBox = new wxStaticBox(this, wxID_STATIC,
  5428   5426                                             wxT("Black remapped Color"),
  5429   5427                                             wxDefaultPosition,
  5430   5428                                             wxDefaultSize);
  5431   5429     wxBoxSizer *remapSizer = new wxStaticBoxSizer(remapBox, wxVERTICAL);
  5432         -  remapBoxSizer->Add(remapSizer, 0, wxALIGN_RIGHT | wxALL, 5);
         5430  +  remapBoxSizer->Add(remapSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  5433   5431     wxBoxSizer *colorSizer = new wxBoxSizer(wxHORIZONTAL);
  5434         -  remapSizer->Add(colorSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
         5432  +  remapSizer->Add(colorSizer, 0, wxALIGN_RIGHT | wxALL, 0);
  5435   5433     wxTextCtrl *colorCtrl = new wxTextCtrl(this, ID_SYMBOLIZER_COLOR, Color,
  5436   5434                                            wxDefaultPosition, wxSize(100, 22));
  5437         -  colorSizer->Add(colorCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  5438         -  wxBitmap bmp;
  5439         -  wxColour color(0, 0, 0);
  5440         -  ColorMapEntry::DoPaintColorSample(32, 32, color, bmp);
  5441         -  wxStaticBitmap *sampleCtrl =
  5442         -    new wxStaticBitmap(this, ID_SYMBOLIZER_PICKER_HEX, bmp,
  5443         -                       wxDefaultPosition, wxSize(32, 32));
  5444         -  colorSizer->Add(sampleCtrl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
         5435  +  colorSizer->Add(colorCtrl, 0, wxALIGN_RIGHT | wxALL, 5);
         5436  +  wxTextCtrl *sampleCtrl =
         5437  +    new wxTextCtrl(this, ID_SYMBOLIZER_PICKER_HEX, wxT("          "),
         5438  +                   wxDefaultPosition, wxSize(44, 22), wxTE_READONLY);
         5439  +  wxColour back = wxColour(255, 0, 0);
         5440  +  sampleCtrl->SetBackgroundColour(back);
         5441  +  colorSizer->Add(sampleCtrl, 0, wxALIGN_RIGHT | wxALL, 5);
         5442  +  wxBoxSizer *pickerSizer = new wxBoxSizer(wxHORIZONTAL);
         5443  +  remapSizer->Add(pickerSizer, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);
  5445   5444     wxButton *pick =
  5446   5445       new wxButton(this, ID_SYMBOLIZER_PICKER_BTN, wxT("&Pick a color"));
  5447         -  colorSizer->Add(pick, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
         5446  +  pickerSizer->Add(pick, 0, wxALIGN_CENTER_VERTICAL | wxALL, 2);
  5448   5447   // sixth row: optional Visibility Range
  5449   5448     miscSizer->AddSpacer(75);
  5450   5449     wxBoxSizer *visibilityBoxSizer = new wxBoxSizer(wxVERTICAL);
  5451   5450     miscSizer->Add(visibilityBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0);
  5452   5451     wxStaticBox *visibilityBox = new wxStaticBox(this, wxID_STATIC,
  5453   5452                                                  wxT("Visibility Range"),
  5454   5453                                                  wxDefaultPosition,
................................................................................
  5503   5502       new wxButton(this, ID_SYMBOLIZER_EXPORT, wxT("&Export to file"));
  5504   5503     btnBox->Add(exp, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  5505   5504     wxButton *copy = new wxButton(this, ID_SYMBOLIZER_COPY, wxT("&Copy"));
  5506   5505     btnBox->Add(copy, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  5507   5506     btnBox->AddSpacer(100);
  5508   5507     wxButton *ok = new wxButton(this, wxID_OK, wxT("&Quit"));
  5509   5508     btnBox->Add(ok, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
  5510         -// appends event handler for OK button;
         5509  +// appends event handler for OK button
  5511   5510     Connect(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED,
  5512   5511             (wxObjectEventFunction) & RasterSymbolizerMonochromeDialog::OnQuit);
  5513   5512     Connect(ID_SYMBOLIZER_INSERT, wxEVT_COMMAND_BUTTON_CLICKED,
  5514   5513             (wxObjectEventFunction) & RasterSymbolizerMonochromeDialog::OnInsert);
  5515   5514     Connect(ID_SYMBOLIZER_EXPORT, wxEVT_COMMAND_BUTTON_CLICKED,
  5516   5515             (wxObjectEventFunction) & RasterSymbolizerMonochromeDialog::OnExport);
  5517   5516     Connect(ID_SYMBOLIZER_COPY, wxEVT_COMMAND_BUTTON_CLICKED,
................................................................................
  5530   5529   void RasterSymbolizerMonochromeDialog::
  5531   5530   OnCmdColorChanged(wxCommandEvent & WXUNUSED(event))
  5532   5531   {
  5533   5532   //
  5534   5533   // remapped color changed: updating the visual sample
  5535   5534   //
  5536   5535     wxTextCtrl *colorCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_COLOR);
  5537         -  wxStaticBitmap *sampleCtrl =
  5538         -    (wxStaticBitmap *) FindWindow(ID_SYMBOLIZER_PICKER_HEX);
         5536  +  wxTextCtrl *sampleCtrl = (wxTextCtrl *) FindWindow(ID_SYMBOLIZER_PICKER_HEX);
  5539   5537     wxColour back = wxColour(255, 255, 255);
  5540   5538     wxString str = colorCtrl->GetValue();
  5541   5539     if (ColorMapEntry::IsValidColor(str) == true)
  5542   5540       ColorMapEntry::GetWxColor(str, back);
  5543         -  wxBitmap bmp;
  5544         -  ColorMapEntry::DoPaintColorSample(32, 32, back, bmp);
  5545         -  sampleCtrl->SetBitmap(bmp);
         5541  +  sampleCtrl->SetBackgroundColour(back);
  5546   5542     sampleCtrl->Refresh();
  5547   5543     sampleCtrl->Update();
  5548   5544   }
  5549   5545   
  5550   5546   void RasterSymbolizerMonochromeDialog::
  5551   5547   OnCmdColorPicker(wxCommandEvent & WXUNUSED(event))
  5552   5548   {
................................................................................
  5814   5810     sqlite3_free(prev);
  5815   5811     prev = xml;
  5816   5812     xml =
  5817   5813       sqlite3_mprintf("%s\t\t\t\t\t<LookupValue>Rasterdata</LookupValue>\r\n",
  5818   5814                       prev);
  5819   5815     sqlite3_free(prev);
  5820   5816     prev = xml;
  5821         -  xml = sqlite3_mprintf("%s\t\t\t\t\t<Value>#000000</Value>\r\n", prev);
         5817  +  xml = sqlite3_mprintf("%s\t\t\t\t\t<Value>#ffffff</Value>\r\n", prev);
  5822   5818     sqlite3_free(prev);
  5823   5819     prev = xml;
  5824   5820     str = new char[strlen(Color.ToUTF8()) + 1];
  5825   5821     strcpy(str, Color.ToUTF8());
  5826   5822     xml =
  5827   5823       sqlite3_mprintf
  5828   5824       ("%s\t\t\t\t\t<Threshold>1</Threshold>\r\n\t\t\t\t\t<Value>%s</Value>\r\n",
................................................................................
  5915   5911       ("%s\t<ColorMap>\r\n\t\t<Categorize fallbackValue=\"#ffffff\">\r\n", prev);
  5916   5912     sqlite3_free(prev);
  5917   5913     prev = xml;
  5918   5914     xml =
  5919   5915       sqlite3_mprintf("%s\t\t\t<LookupValue>Rasterdata</LookupValue>\r\n", prev);
  5920   5916     sqlite3_free(prev);
  5921   5917     prev = xml;
  5922         -  xml = sqlite3_mprintf("%s\t\t\t<Value>#000000</Value>\r\n", prev);
         5918  +  xml = sqlite3_mprintf("%s\t\t\t<Value>#ffffff</Value>\r\n", prev);
  5923   5919     sqlite3_free(prev);
  5924   5920     prev = xml;
  5925   5921     str = new char[strlen(Color.ToUTF8()) + 1];
  5926   5922     strcpy(str, Color.ToUTF8());
  5927   5923     xml =
  5928   5924       sqlite3_mprintf
  5929   5925       ("%s\t\t\t<Threshold>1</Threshold>\r\n\t\t\t<Value>%s</Value>\r\n", prev,

Changes to ResultSetView.cpp.

     1      1   /*
     2      2   / ResultSetView.cpp
     3      3   / a panel to show SQL query results
     4      4   /
     5      5   / version 1.7, 2013 May 8
     6      6   /
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
     8      8   /
     9      9   / Copyright (C) 2008-2013  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
    13     13   /    the Free Software Foundation, either version 3 of the License, or
    14     14   /    (at your option) any later version.
................................................................................
   513    513       }
   514    514   
   515    515     params->Finalize();
   516    516     params->SetEndRow(end_row);
   517    517     params->SetMaxRow(i_row);
   518    518     goto ok;
   519    519   error:
   520         -  params->Finalize();
   521    520     params->SetError();
   522    521   ok:
   523    522     wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, ID_RS_THREAD_FINISHED);
   524    523     params->GetMother()->GetEventHandler()->AddPendingEvent(event);
   525    524   #if defined(_WIN32) && !defined(__MINGW32__)
   526    525     return 0;
   527    526   #else
................................................................................
   724    723         TileDataDbPrefix = tile_data_db_prefix;
   725    724         TileDataTable = tile_data_table;
   726    725       }
   727    726     char *xSql = NULL;
   728    727     char err_msg[2048];
   729    728     int i_row;
   730    729     clock_t clock_start;
   731         -  sqlite3_stmt *stmt = NULL;
          730  +  sqlite3_stmt *stmt;
   732    731     sqlite3 *sqlite = MainFrame->GetSqlite();
   733    732     SqlErrorMsg = wxT("");
   734    733     if (TableView)
   735    734       TableView->Destroy();
   736    735     TableView = NULL;
   737    736     if (TableBlobs)
   738    737       delete TableBlobs;
................................................................................
   817    816                 ::wxEndBusyCursor();
   818    817                 sqlite3_finalize(stmt);
   819    818                 delete[]xSql;
   820    819                 return false;
   821    820               }
   822    821           }
   823    822         sqlite3_finalize(stmt);
   824         -      stmt = NULL;
   825    823       }
   826    824     delete[]xSql;
   827    825     CreateStatsGrid();
   828    826     MainFrame->DisableAllTools();
   829    827   
   830    828     ThreadParams.Initialize(this, sql, stmt, from, sqlite, clock_start);
   831    829     if (!ProgressTimer)
................................................................................
   978    976         //
   979    977         if (ReadOnly == false)
   980    978           {
   981    979             // preparing the insert row
   982    980             int numCols = 0;
   983    981             wxString *colNames = MainFrame->GetColumnNames(TableName, &numCols);
   984    982             CreateGrid(0, numCols + 1);
   985         -          if (isView == false)
   986         -            TableView->SetColLabelValue(0, wxT("ROWID"));
          983  +          if (isView == false);
          984  +          TableView->SetColLabelValue(0, wxT("ROWID"));
   987    985             for (i_col = 0; i_col < numCols; i_col++)
   988    986               TableView->SetColLabelValue(i_col + 1, *(colNames + i_col));
   989    987             TableView->EnableEditing(true);
   990    988             delete[]colNames;
   991    989         } else
   992    990           {
   993    991             // simply showing a warning message
................................................................................
  1083   1081                             gaiaGuessBlobType(value->GetBlob(),
  1084   1082                                               value->GetBlobSize());
  1085   1083                           switch (type)
  1086   1084                             {
  1087   1085                               case GAIA_GEOMETRY_BLOB:
  1088   1086                                 blobType = wxT("GEOMETRY");
  1089   1087                                 break;
  1090         -                            case GAIA_TINYPOINT_BLOB:
  1091         -                              blobType = wxT("TinyPoint");
  1092         -                              break;
  1093   1088                               case GAIA_GPB_BLOB:
  1094   1089                                 blobType = wxT("GeoPackageGEOMETRY");
  1095   1090                                 break;
  1096   1091                               case GAIA_XML_BLOB:
  1097   1092                                 blobType = wxT("XmlBLOB");
  1098   1093                                 break;
  1099   1094                               case GAIA_JPEG_BLOB:
................................................................................
  1836   1831                 menu.Append(menuItem);
  1837   1832                 menu.AppendSeparator();
  1838   1833               }
  1839   1834           }
  1840   1835         menuItem = new wxMenuItem(&menu, Grid_Blob, wxT("BLOB &explore"));
  1841   1836         menu.Append(menuItem);
  1842   1837         blob_type = gaiaGuessBlobType(blobVar->GetBlob(), blobVar->GetBlobSize());
  1843         -      if (blob_type == GAIA_GEOMETRY_BLOB || blob_type == GAIA_TINYPOINT_BLOB
  1844         -          || blob_type == GAIA_GPB_BLOB)
         1838  +      if (blob_type == GAIA_GEOMETRY_BLOB)
  1845   1839           ;
  1846   1840         else if (blob_type == GAIA_XML_BLOB)
  1847   1841           {
  1848   1842             menu.AppendSeparator();
  1849   1843             menuItem =
  1850   1844               new wxMenuItem(&menu, Grid_XmlBlobIn, wxT("XmlBLOB &import"));
  1851   1845             menu.Append(menuItem);
................................................................................
  2712   2706                   blobValue += wxT("TIFF image");
  2713   2707                   break;
  2714   2708                 case GAIA_WEBP_BLOB:
  2715   2709                   blobValue += wxT("WEBP image");
  2716   2710                   break;
  2717   2711                 case GAIA_JP2_BLOB:
  2718   2712                   blobValue += wxT("JP2 image (Jpeg2000)");
  2719         -                break;
  2720   2713                 case GAIA_PDF_BLOB:
  2721   2714                   blobValue += wxT("PDF document");
  2722   2715                   break;
  2723   2716                 case GAIA_ZIP_BLOB:
  2724   2717                   blobValue += wxT("ZIP archive");
  2725   2718                   break;
  2726   2719                 default:

Changes to Shapefiles.cpp.

     1      1   /*
     2      2   / Shapefiles.cpp
     3      3   / methods related to Shapefile loading and saving
     4      4   /
     5      5   / version 1.7, 2013 May 8
     6      6   /
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
     8      8   /
     9      9   / Copyright (C) 2008-2013  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
    13     13   /    the Free Software Foundation, either version 3 of the License, or
    14     14   /    (at your option) any later version.

Changes to SqlFiltersComposer.cpp.

     1      1   /*
     2      2   / SqlFiltersComposer.cpp
     3      3   / Sql Filters Composer
     4      4   /
     5      5   / version 2.0, 2016 August 9
     6      6   /
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
     8      8   /
     9      9   / Copyright (C) 2016  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
    13     13   /    the Free Software Foundation, either version 3 of the License, or
    14     14   /    (at your option) any later version.
................................................................................
    26     26   #include "Classdef.h"
    27     27   
    28     28   void MyFrame::SqlFiltersComposer()
    29     29   {
    30     30   //
    31     31   // query/view composer invoked
    32     32   //
           33  +  char *xsql;
           34  +  int ret;
           35  +  char *errMsg = NULL;
    33     36     SqlFiltersDialog dlg;
    34     37   
    35     38     if (SqlFilters.IsValid() == false)
    36     39       return;
    37     40   
    38     41     wxString db_prefix = SqlFilters.GetDbPrefix();
    39     42     wxString table = SqlFilters.GetTableName();
................................................................................
    45     48         int primaryKeys[1024];
    46     49         int blobCols[1024];
    47     50         int pk = 0;
    48     51         int pb = 0;
    49     52         char **results;
    50     53         int rows;
    51     54         int columns;
    52         -      char *xsql;
    53     55         int i;
    54     56         char *errMsg = NULL;
    55     57         wxString sql;
           58  +      char *xsql;
           59  +      char *column;
    56     60         char *type;
    57     61         char *xname;
    58     62         char *xname2;
    59     63   
    60     64         for (i = 0; i < 1024; i++)
    61     65           {
    62     66             primaryKeys[i] = -1;

Changes to Styles.cpp.

     1      1   /*
     2      2   / Styles.cpp
     3      3   / various dialog classes
     4      4   /
     5      5   / version 1.8, 2015 March 13
     6      6   /
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
     8      8   /
     9      9   / Copyright (C) 2015  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
    13     13   /    the Free Software Foundation, either version 3 of the License, or
    14     14   /    (at your option) any later version.
................................................................................
  1282   1282     if (dlg.ShowModal() == wxID_OK)
  1283   1283       {
  1284   1284         // attempting to register the new styles
  1285   1285         DoRegistetRasterCoverageStyles(&dlg);
  1286   1286   
  1287   1287         // updating the Grid
  1288   1288         int tot_rows = GridCtrl->GetNumberRows();
  1289         -      if (tot_rows > 0)
  1290         -        GridCtrl->DeleteRows(0, tot_rows);
         1289  +      GridCtrl->DeleteRows(0, tot_rows);
  1291   1290         if (List != NULL)
  1292   1291           delete List;
  1293   1292         List = MainFrame->FindRasterCoverageStyles(CoverageName);
  1294   1293         int count = 0;
  1295   1294         RasterCoverageStyle *pS = List->GetFirst();
  1296   1295         while (pS)
  1297   1296           {
................................................................................
  3380   3379     if (dlg.ShowModal() == wxID_OK)
  3381   3380       {
  3382   3381         // attempting to register the new styles
  3383   3382         DoRegistetVectorCoverageStyles(&dlg);
  3384   3383   
  3385   3384         // updating the Grid
  3386   3385         int tot_rows = GridCtrl->GetNumberRows();
  3387         -      if (tot_rows > 0)
  3388         -        GridCtrl->DeleteRows(0, tot_rows);
         3386  +      GridCtrl->DeleteRows(0, tot_rows);
  3389   3387         if (List != NULL)
  3390   3388           delete List;
  3391   3389         List = MainFrame->FindVectorCoverageStyles(CoverageName);
  3392   3390         int count = 0;
  3393   3391         VectorCoverageStyle *pS = List->GetFirst();
  3394   3392         while (pS)
  3395   3393           {
................................................................................
  5285   5283   // populates individual controls
  5286   5284     CreateControls();
  5287   5285   // sets dialog sizer
  5288   5286     GetSizer()->Fit(this);
  5289   5287     GetSizer()->SetSizeHints(this);
  5290   5288   // centers the dialog window
  5291   5289     Centre();
         5290  +  int count = 0;
  5292   5291     return true;
  5293   5292   }
  5294   5293   
  5295   5294   void VectorInfosDialog::CreateControls()
  5296   5295   {
  5297   5296   //
  5298   5297   // creating individual control and setting initial values
................................................................................
  6944   6943       }
  6945   6944     // attempting to register the alternative SRID
  6946   6945     if (DoRegistetVectorCoverageSrid(srid) == true)
  6947   6946       {
  6948   6947         // updating the Grid
  6949   6948         GridCtrl->Show(false);
  6950   6949         int tot_rows = GridCtrl->GetNumberRows();
  6951         -      if (tot_rows > 0)
  6952         -        GridCtrl->DeleteRows(0, tot_rows);
         6950  +      GridCtrl->DeleteRows(0, tot_rows);
  6953   6951         if (List != NULL)
  6954   6952           delete List;
  6955   6953         List = MainFrame->FindVectorAlternativeSRIDs(CoverageName);
  6956   6954         int count = 0;
  6957   6955         VectorCoverageSRID *pS = List->GetFirst();
  6958   6956         while (pS)
  6959   6957           {
................................................................................
  7509   7507         return;
  7510   7508       }
  7511   7509     // attempting to register the Keyword
  7512   7510     if (DoRegistetVectorCoverageKeyword(keyword) == true)
  7513   7511       {
  7514   7512         // updating the Grid
  7515   7513         int tot_rows = GridCtrl->GetNumberRows();
  7516         -      if (tot_rows > 0)
  7517         -        GridCtrl->DeleteRows(0, tot_rows);
         7514  +      GridCtrl->DeleteRows(0, tot_rows);
  7518   7515         if (List != NULL)
  7519   7516           delete List;
  7520   7517         List = MainFrame->FindVectorKeywords(CoverageName);
  7521   7518         int count = 0;
  7522   7519         VectorCoverageKeyword *pK = List->GetFirst();
  7523   7520         while (pK)
  7524   7521           {
................................................................................
  8049   8046       }
  8050   8047     // attempting to register the alternative SRID
  8051   8048     if (DoRegistetRasterCoverageSrid(srid) == true)
  8052   8049       {
  8053   8050         // updating the Grid
  8054   8051         GridCtrl->Show(false);
  8055   8052         int tot_rows = GridCtrl->GetNumberRows();
  8056         -      if (tot_rows > 0)
  8057         -        GridCtrl->DeleteRows(0, tot_rows);
         8053  +      GridCtrl->DeleteRows(0, tot_rows);
  8058   8054         if (List != NULL)
  8059   8055           delete List;
  8060   8056         List = MainFrame->FindRasterAlternativeSRIDs(CoverageName);
  8061   8057         int count = 0;
  8062   8058         RasterCoverageSRID *pS = List->GetFirst();
  8063   8059         while (pS)
  8064   8060           {
................................................................................
  8484   8480         return;
  8485   8481       }
  8486   8482     // attempting to register the Keyword
  8487   8483     if (DoRegistetRasterCoverageKeyword(keyword) == true)
  8488   8484       {
  8489   8485         // updating the Grid
  8490   8486         int tot_rows = GridCtrl->GetNumberRows();
  8491         -      if (tot_rows > 0)
  8492         -        GridCtrl->DeleteRows(0, tot_rows);
         8487  +      GridCtrl->DeleteRows(0, tot_rows);
  8493   8488         if (List != NULL)
  8494   8489           delete List;
  8495   8490         List = MainFrame->FindRasterKeywords(CoverageName);
  8496   8491         int count = 0;
  8497   8492         RasterCoverageKeyword *pK = List->GetFirst();
  8498   8493         while (pK)
  8499   8494           {

Changes to TableTree.cpp.

     1      1   /*
     2      2   / TableTree.cpp
     3      3   / tree control to show tables, columns, indices and triggers
     4      4   /
     5      5   / version 1.7, 2013 May 8
     6      6   /
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
     8      8   /
     9      9   / Copyright (C) 2008-2013  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
    13     13   /    the Free Software Foundation, either version 3 of the License, or
    14     14   /    (at your option) any later version.
................................................................................
    77     77   #include "icons/coverage_tiles.xpm"
    78     78   #include "icons/vector.xpm"
    79     79   #include "icons/linestrings_on.xpm"
    80     80   #include "icons/points_on.xpm"
    81     81   #include "icons/polygons_on.xpm"
    82     82   #include "icons/clone.xpm"
    83     83   #include "icons/wms.xpm"
    84         -#include "icons/postgres.xpm"
    85         -#include "icons/postgres_schema.xpm"
    86         -#include "icons/postgres_table.xpm"
    87         -#include "icons/postgres_view.xpm"
    88     84   
    89     85   MyTableTree::MyTableTree(MyFrame * parent, wxWindowID id):wxTreeCtrl(parent, id)
    90     86   {
    91     87   //
    92     88   // constructor: TREE control to show DB objects
    93     89   //
    94     90     MainFrame = parent;
................................................................................
   114    110     SetItemData(RootRasterCoverages,
   115    111                 (wxTreeItemData *) (new MyObject(MY_ROOT_RASTER)));
   116    112     RootVectorCoverages = AppendItem(Root, wxT("Vector Coverages"));
   117    113     SetItemData(RootVectorCoverages,
   118    114                 (wxTreeItemData *) (new MyObject(MY_ROOT_VECTOR)));
   119    115     RootWMS = AppendItem(Root, wxT("Registered WMS layers"));
   120    116     SetItemData(RootWMS, (wxTreeItemData *) (new MyObject(MY_ROOT_WMS)));
   121         -  RootPostgreSQL = AppendItem(Root, wxT("PostgreSQL"));
   122         -  SetItemData(RootPostgreSQL,
   123         -              (wxTreeItemData *) (new MyObject(MY_ROOT_POSTGRESQL)));
   124    117     RootMetadata = AppendItem(Root, wxT("Metadata"));
   125    118     SetItemData(RootMetadata,
   126    119                 (wxTreeItemData *) (new MyObject(MY_ROOT_METADATA)));
   127    120     RootInternal = AppendItem(Root, wxT("Internal Data"));
   128    121     SetItemData(RootInternal,
   129    122                 (wxTreeItemData *) (new MyObject(MY_ROOT_INTERNAL)));
   130    123     RootSpatialIndex = AppendItem(Root, wxT("Spatial Index"));
   131    124     SetItemData(RootSpatialIndex,
   132    125                 (wxTreeItemData *) (new MyObject(MY_ROOT_RTREE)));
   133    126   // setting up icons 
   134    127     Images = new wxImageList(16, 16, true);
   135         -  wxIcon icons[40];
          128  +  wxIcon icons[36];
   136    129     icons[0] = wxIcon(db_xpm);
   137    130     icons[1] = wxIcon(table_xpm);
   138    131     icons[2] = wxIcon(pkey_xpm);
   139    132     icons[3] = wxIcon(column_xpm);
   140    133     icons[4] = wxIcon(index_xpm);
   141    134     icons[5] = wxIcon(trigger_xpm);
   142    135     icons[6] = wxIcon(geometry_xpm);
................................................................................
   165    158     icons[29] = wxIcon(polygons_on_xpm);
   166    159     icons[30] = wxIcon(gpkgvtable_xpm);
   167    160     icons[31] = wxIcon(gpkgtable_xpm);
   168    161     icons[32] = wxIcon(gpkggeom_xpm);
   169    162     icons[33] = wxIcon(virtshp_xpm);
   170    163     icons[34] = wxIcon(virtgpkg_xpm);
   171    164     icons[35] = wxIcon(gpkg_spatialidx_xpm);
   172         -  icons[36] = wxIcon(postgres_xpm);
   173         -  icons[37] = wxIcon(postgres_schema_xpm);
   174         -  icons[38] = wxIcon(postgres_table_xpm);
   175         -  icons[39] = wxIcon(postgres_view_xpm);
   176    165     Images->Add(icons[0]);
   177    166     Images->Add(icons[1]);
   178    167     Images->Add(icons[2]);
   179    168     Images->Add(icons[3]);
   180    169     Images->Add(icons[4]);
   181    170     Images->Add(icons[5]);
   182    171     Images->Add(icons[6]);
................................................................................
   205    194     Images->Add(icons[29]);
   206    195     Images->Add(icons[30]);
   207    196     Images->Add(icons[31]);
   208    197     Images->Add(icons[32]);
   209    198     Images->Add(icons[33]);
   210    199     Images->Add(icons[34]);
   211    200     Images->Add(icons[35]);
   212         -  Images->Add(icons[36]);
   213         -  Images->Add(icons[37]);
   214         -  Images->Add(icons[38]);
   215         -  Images->Add(icons[39]);
   216    201     SetImageList(Images);
   217    202     SetItemImage(Root, 0);
   218    203     SetItemImage(RootUserData, 17);
   219    204     SetItemImage(RootTopologies, 20);
   220    205     SetItemImage(RootNetworks, 25);
   221    206     SetItemImage(RootRasterCoverages, 22);
   222    207     SetItemImage(RootVectorCoverages, 24);
   223    208     SetItemImage(RootWMS, 26);
   224         -  SetItemImage(RootPostgreSQL, 36);
   225    209     SetItemImage(RootStyling, 17);
   226    210     SetItemImage(RootIsoMetadata, 17);
   227    211     SetItemImage(RootMetadata, 17);
   228    212     SetItemImage(RootInternal, 17);
   229    213     SetItemImage(RootSpatialIndex, 17);
   230    214     wxString empty = wxEmptyString;
   231    215   
................................................................................
   448    432             (wxObjectEventFunction) & MyTableTree::OnCmdCreateTopoGeo);
   449    433     Connect(Tree_DropTopoGeo, wxEVT_COMMAND_MENU_SELECTED,
   450    434             (wxObjectEventFunction) & MyTableTree::OnCmdDropTopoGeo);
   451    435     Connect(Tree_CreateTopoNet, wxEVT_COMMAND_MENU_SELECTED,
   452    436             (wxObjectEventFunction) & MyTableTree::OnCmdCreateTopoNet);
   453    437     Connect(Tree_DropTopoNet, wxEVT_COMMAND_MENU_SELECTED,
   454    438             (wxObjectEventFunction) & MyTableTree::OnCmdDropTopoNet);
   455         -  Connect(Tree_CreatePostgreSqlConn, wxEVT_COMMAND_MENU_SELECTED,
   456         -          (wxObjectEventFunction) & MyTableTree::OnCmdCreatePostgreSqlConn);
   457         -  Connect(Tree_CloseAllPostgreSqlConns, wxEVT_COMMAND_MENU_SELECTED,
   458         -          (wxObjectEventFunction) & MyTableTree::OnCmdCloseAllPostgreSqlConns);
   459         -  Connect(Tree_ClosePostgreSqlConn, wxEVT_COMMAND_MENU_SELECTED,
   460         -          (wxObjectEventFunction) & MyTableTree::OnCmdClosePostgreSqlConn);
   461         -  Connect(Tree_PostgreSqlInfos, wxEVT_COMMAND_MENU_SELECTED,
   462         -          (wxObjectEventFunction) & MyTableTree::OnCmdPostgreSqlInfos);
   463         -  Connect(Tree_PostgreSqlDropOrphans, wxEVT_COMMAND_MENU_SELECTED,
   464         -          (wxObjectEventFunction) & MyTableTree::OnCmdPostgreSqlDropOrphans);
   465    439   }
   466    440   
   467    441   MyTableTree::~MyTableTree()
   468    442   {
   469    443     delete Images;
   470    444   }
   471    445   
................................................................................
   478    452     DeleteChildren(RootUserData);
   479    453     DeleteTopologies(RootTopologies);
   480    454     DeleteNetworks(RootNetworks);
   481    455     DeleteRasterCoverages(RootRasterCoverages);
   482    456     DeleteVectorCoverages(RootVectorCoverages);
   483    457     DeleteChildren(RootStyling);
   484    458     DeleteChildren(RootWMS);
   485         -  DeleteChildren(RootPostgreSQL);
   486    459     DeleteChildren(RootIsoMetadata);
   487    460     DeleteChildren(RootMetadata);
   488    461     DeleteChildren(RootInternal);
   489    462     DeleteChildren(RootSpatialIndex);
   490    463     while (ok)
   491    464       {
   492    465         ok = false;
................................................................................
   506    479               kill = false;
   507    480             if (child == RootVectorCoverages)
   508    481               kill = false;
   509    482             if (child == RootStyling)
   510    483               kill = false;
   511    484             if (child == RootWMS)
   512    485               kill = false;
   513         -          if (child == RootPostgreSQL)
   514         -            kill = false;
   515    486             if (child == RootIsoMetadata)
   516    487               kill = false;
   517    488             if (child == RootMetadata)
   518    489               kill = false;
   519    490             if (child == RootInternal)
   520    491               kill = false;
   521    492             if (child == RootSpatialIndex)
................................................................................
   541    512       return;
   542    513     switch (obj->GetType())
   543    514       {
   544    515         case MY_TABLE:
   545    516         case MY_VTABLE:
   546    517         case MY_TILE_DATA:
   547    518         case MY_VIEW:
   548         -      case MY_POSTGRES_TABLE:
   549         -      case MY_POSTGRES_VIEW:
   550         -      case MY_POSTGIS_VIEW:
   551    519           DeleteChildren(item);
   552    520           AppendItem(item, wxT("placeholder"), 0);
   553    521           break;
   554    522       };
   555    523     event.Skip();
   556    524   }
   557    525   
................................................................................
   582    550           DeleteChildren(item);
   583    551           if (obj->GetDbAlias().Len() == 0)
   584    552             ExpandView(item);
   585    553           else
   586    554             ExpandAttachedView(item);
   587    555           EnsureVisible(item);
   588    556           return;
   589         -      case MY_POSTGRES_TABLE:
   590         -      case MY_POSTGRES_VIEW:
   591         -        DeleteChildren(item);
   592         -        ExpandPostgresTable(item);
   593         -        EnsureVisible(item);
   594         -        return;
   595         -      case MY_POSTGIS_VIEW:
   596         -        DeleteChildren(item);
   597         -        ExpandPostGisView(item);
   598         -        EnsureVisible(item);
   599         -        return;
   600    557       };
   601    558     event.Skip();
   602    559   }
   603    560   
   604    561   void MyTableTree::DeleteTopologies(wxTreeItemId & RootTopologies)
   605    562   {
   606    563   // deleting Topology Nodes
................................................................................
   678    635       return RootMetadata;
   679    636     if (tableName == wxT("topologies"))
   680    637       return RootMetadata;
   681    638     if (tableName == wxT("networks"))
   682    639       return RootMetadata;
   683    640     if (tableName == wxT("data_licenses"))
   684    641       return RootMetadata;
   685         -  if (tableName == wxT("stored_procedures"))
   686         -    return RootMetadata;
   687         -  if (tableName == wxT("stored_variables"))
   688         -    return RootMetadata;
   689    642   
   690    643     if (tableName == wxT("wms_getcapabilities"))
   691    644       return RootMetadata;
   692    645     if (tableName == wxT("wms_getmap"))
   693    646       return RootMetadata;
   694    647     if (tableName == wxT("wms_settings"))
   695    648       return RootMetadata;
................................................................................
   910    863       return nodes->GetRootMetadata();
   911    864     if (tableName == wxT("topologies"))
   912    865       return nodes->GetRootMetadata();
   913    866     if (tableName == wxT("networks"))
   914    867       return nodes->GetRootMetadata();
   915    868     if (tableName == wxT("data_licenses"))
   916    869       return nodes->GetRootMetadata();
   917         -  if (tableName == wxT("stored_procedures"))
   918         -    return nodes->GetRootMetadata();
   919         -  if (tableName == wxT("stored_variables"))
   920         -    return nodes->GetRootMetadata();
   921    870   
   922    871     if (tableName == wxT("gpkg_spatial_ref_sys"))
   923    872       return nodes->GetRootMetadata();
   924    873     if (tableName == wxT("gpkg_contents"))
   925    874       return nodes->GetRootMetadata();
   926    875     if (tableName == wxT("gpkg_geometry_columns"))
   927    876       return nodes->GetRootMetadata();
................................................................................
  1150   1099       data = (wxTreeItemData *) (new MyObject(MY_TILE_DATA, dbAlias, tableName));
  1151   1100     else
  1152   1101       data = (wxTreeItemData *) (new MyObject(MY_TABLE, dbAlias, tableName));
  1153   1102     item = AppendItem(rootNode, tableName, icon, -1, data);
  1154   1103     AppendItem(item, wxT("placeholder"), 0);
  1155   1104   }
  1156   1105   
  1157         -void MyTableTree::AddTmpMetadata(wxString & name)
  1158         -{
  1159         -// adding some TEMPORARY Metadata table
  1160         -  wxTreeItemId item;
  1161         -  wxString dbAlias = wxT("temp");
  1162         -  wxTreeItemData *data =
  1163         -    (wxTreeItemData *) (new MyObject(MY_TABLE, dbAlias, name, true));
  1164         -  item = AppendItem(RootMetadata, name, 1, -1, data);
  1165         -  AppendItem(item, wxT("placeholder"), 0);
  1166         -}
  1167         -
  1168   1106   void MyTableTree::AddGeoPackageTable(wxString & tableName)
  1169   1107   {
  1170   1108   //
  1171   1109   // appends a GPKG table to the TREE list
  1172   1110   //
  1173   1111     wxTreeItemId item;
  1174   1112     wxTreeItemData *data;
................................................................................
  1575   1513                     (wxTreeItemData *) (new
  1576   1514                                         MyObject(MY_TRIGGER, empty,
  1577   1515                                                  trgr->GetName())));
  1578   1516         trgr = trgr->GetNext();
  1579   1517       }
  1580   1518   }
  1581   1519   
  1582         -void MyTableTree::ExpandPostgresTable(wxTreeItemId & item)
  1583         -{
  1584         -//
  1585         -// expands a TreeItem of the POSTGRES TABLE type
  1586         -//
  1587         -  MyTableInfo list;
  1588         -  MyColumnInfo *col;
  1589         -  wxString columnInfo;
  1590         -  wxTreeItemId item2;
  1591         -  MyPostgresTable *table = NULL;
  1592         -  MyObject *obj = (MyObject *) GetItemData(item);
  1593         -  if (obj == NULL)
  1594         -    return;
  1595         -  wxString tableName = obj->GetVirtName();
  1596         -  if (obj->GetType() == MY_POSTGRES_TABLE)
  1597         -    table = MainFrame->FindPostgresTable(tableName);
  1598         -
  1599         -  MainFrame->GetTableColumns(tableName, &list);
  1600         -  wxString empty = wxEmptyString;
  1601         -  col = list.GetFirstColumn();
  1602         -  while (col)
  1603         -    {
  1604         -      int icon = 3;
  1605         -      columnInfo = col->GetName();
  1606         -      if (table != NULL)
  1607         -        {
  1608         -          // checking for a PK column
  1609         -          if (table->IsPkColumn(columnInfo) == true)
  1610         -            icon = 2;
  1611         -        }
  1612         -      item2 = AppendItem(item, columnInfo, icon);
  1613         -      SetItemData(item2,
  1614         -                  (wxTreeItemData *) (new
  1615         -                                      MyObject(MY_POSTGRES_COLUMN, empty, empty,
  1616         -                                               -1, empty, empty, empty, empty,
  1617         -                                               columnInfo, tableName)));
  1618         -      col = col->GetNext();
  1619         -    }
  1620         -}
  1621         -
  1622         -void MyTableTree::AddPostgresConnection(int num, MyPostgresConn * conn,
  1623         -                                        wxTreeItemId & connId)
  1624         -{
  1625         -//
  1626         -// appends a PostgreSQL Connection to the TREE list
  1627         -//
  1628         -  wxTreeItemId item;
  1629         -  wxTreeItemData *data;
  1630         -  int icon = 36;
  1631         -  data =
  1632         -    (wxTreeItemData *) (new
  1633         -                        MyObject(MY_POSTGRES_CONN, conn->GetHost(),
  1634         -                                 conn->GetHostAddr(), conn->GetPort(),
  1635         -                                 conn->GetDbName(), conn->GetUser(),
  1636         -                                 conn->IsReadOnly()));
  1637         -  char dummy[128];
  1638         -  sprintf(dummy, "connection #%d", num);
  1639         -  item = AppendItem(RootPostgreSQL, wxString::FromUTF8(dummy), icon, -1, data);
  1640         -  connId = item;
  1641         -}
  1642         -
  1643         -void MyTableTree::AddPostgresSchema(wxTreeItemId & parent,
  1644         -                                    MyPostgresConn * conn, wxString & schema,
  1645         -                                    wxTreeItemId & item)
  1646         -{
  1647         -//
  1648         -// appends a PostgreSQL Schema to the TREE list
  1649         -//
  1650         -  wxTreeItemData *data;
  1651         -  int icon = 37;
  1652         -  data =
  1653         -    (wxTreeItemData *) (new
  1654         -                        MyObject(MY_POSTGRES_SCHEMA, conn->GetHost(),
  1655         -                                 conn->GetHostAddr(), conn->GetPort(),
  1656         -                                 conn->GetDbName(), conn->GetUser(), schema));
  1657         -  item = AppendItem(parent, schema, icon, -1, data);
  1658         -}
  1659         -
  1660         -void MyTableTree::AddPostgresTable(MyPostgres * list, wxString & virtName)
  1661         -{
  1662         -//
  1663         -// appends a PostgreSQL Table or View to the TREE list
  1664         -//
  1665         -  int icon;
  1666         -  int type = -1;
  1667         -  MyPostgresConn *conn;
  1668         -  wxTreeItemId parent;
  1669         -  wxString schema;
  1670         -  wxString table;
  1671         -  bool readOnly;
  1672         -  bool hasPK;
  1673         -  bool canSelect;
  1674         -  bool canInsertUpdateDelete;
  1675         -  MyPostgresConn *pC = list->GetFirst();
  1676         -  while (pC != NULL)
  1677         -    {
  1678         -      readOnly = pC->IsReadOnly();
  1679         -      MyPostgresSchema *pS = pC->GetFirst();
  1680         -      while (pS != NULL)
  1681         -        {
  1682         -          MyPostgresTable *pT = pS->GetFirstTable();
  1683         -          while (pT != NULL)
  1684         -            {
  1685         -              if (pT->GetFirst() != NULL)
  1686         -                {
  1687         -                  if (virtName.Cmp(pT->GetPostGisName()) == 0)
  1688         -                    {
  1689         -                      conn = pC;
  1690         -                      parent = pS->GetTreeNode();
  1691         -                      icon = 12;
  1692         -                      type = MY_POSTGIS_VIEW;
  1693         -                      schema = pS->GetName();
  1694         -                      table = pT->GetName();
  1695         -                      hasPK = pT->HasPK();
  1696         -                      canSelect = pT->CanSelect();
  1697         -                      canInsertUpdateDelete = pT->CanInsertUpdateDelete();
  1698         -                      goto done;
  1699         -                    }
  1700         -                }
  1701         -              if (virtName.Cmp(pT->GetVirtName()) == 0)
  1702         -                {
  1703         -                  MainFrame->InitPostgresPkColumns(pC, pS, pT);
  1704         -                  conn = pC;
  1705         -                  parent = pS->GetTreeNode();
  1706         -                  icon = 38;
  1707         -                  type = MY_POSTGRES_TABLE;
  1708         -                  schema = pS->GetName();
  1709         -                  table = pT->GetName();
  1710         -                  hasPK = pT->HasPK();
  1711         -                  canSelect = pT->CanSelect();
  1712         -                  canInsertUpdateDelete = pT->CanInsertUpdateDelete();
  1713         -                  goto done;
  1714         -                }
  1715         -              pT = pT->GetNext();
  1716         -            }
  1717         -          MyPostgresView *pV = pS->GetFirstView();
  1718         -          while (pV != NULL)
  1719         -            {
  1720         -              if (virtName.Cmp(pV->GetVirtName()) == 0)
  1721         -                {
  1722         -                  conn = pC;
  1723         -                  parent = pS->GetTreeNode();
  1724         -                  icon = 39;
  1725         -                  type = MY_POSTGRES_VIEW;
  1726         -                  schema = pS->GetName();
  1727         -                  table = pV->GetName();
  1728         -                  hasPK = false;
  1729         -                  canSelect = pV->CanSelect();
  1730         -                  canInsertUpdateDelete = pV->CanInsertUpdateDelete();
  1731         -                  goto done;
  1732         -                }
  1733         -              pV = pV->GetNext();
  1734         -            }
  1735         -          pS = pS->GetNext();
  1736         -        }
  1737         -      pC = pC->GetNext();
  1738         -    }
  1739         -done:
  1740         -  if (type == -1)
  1741         -    return;
  1742         -
  1743         -// adding the TREE node
  1744         -  wxTreeItemId item;
  1745         -  wxTreeItemData *data;
  1746         -  if (type == MY_POSTGIS_VIEW)
  1747         -    data =
  1748         -      (wxTreeItemData *) (new
  1749         -                          MyObject(type, conn->GetHost(), conn->GetHostAddr(),
  1750         -                                   conn->GetPort(), conn->GetDbName(),
  1751         -                                   conn->GetUser(), schema, table,
  1752         -                                   virtName, readOnly, hasPK, canSelect,
  1753         -                                   canInsertUpdateDelete));
  1754         -  else
  1755         -    data =
  1756         -      (wxTreeItemData *) (new
  1757         -                          MyObject(type, conn->GetHost(), conn->GetHostAddr(),
  1758         -                                   conn->GetPort(), conn->GetDbName(),
  1759         -                                   conn->GetUser(), schema, table, virtName,
  1760         -                                   readOnly, hasPK, canSelect,
  1761         -                                   canInsertUpdateDelete));
  1762         -  item = AppendItem(parent, virtName, icon, -1, data);
  1763         -  AppendItem(item, wxT("placeholder"), 0);
  1764         -}
  1765         -
  1766   1520   void MyTableTree::AddView(wxString & viewName, bool geometry)
  1767   1521   {
  1768   1522   //
  1769   1523   // appends a view to the TREE list
  1770   1524   //
  1771   1525     wxTreeItemId item;
  1772   1526     wxTreeItemData *data;
................................................................................
  1872   1626                     (wxTreeItemData *) (new
  1873   1627                                         MyObject(MY_TRIGGER, empty,
  1874   1628                                                  trgr->GetName())));
  1875   1629         trgr = trgr->GetNext();
  1876   1630       }
  1877   1631   }
  1878   1632   
  1879         -void MyTableTree::ExpandPostGisView(wxTreeItemId & item)
  1880         -{
  1881         -//
  1882         -// expands a TreeItem of the PostGIS View Type (SpatiaLite wrapper)
  1883         -//
  1884         -  MyViewInfo list;
  1885         -  MyColumnInfo *col;
  1886         -  MyTriggerInfo *trgr;
  1887         -  wxString columnInfo;
  1888         -  wxTreeItemId item2;
  1889         -  wxString empty = wxEmptyString;
  1890         -  MyPostgresTable *table = NULL;
  1891         -  MyObject *obj = (MyObject *) GetItemData(item);
  1892         -  if (obj == NULL)
  1893         -    return;
  1894         -  wxString viewName = obj->GetVirtName();
  1895         -  table = MainFrame->FindPostGisView(viewName);
  1896         -
  1897         -  MainFrame->GetViewColumns(viewName, &list);
  1898         -  MainFrame->GetViewTriggers(viewName, &list);
  1899         -  col = list.GetFirst();
  1900         -  while (col)
  1901         -    {
  1902         -      int icon = 3;
  1903         -      columnInfo = col->GetName();
  1904         -      if (MainFrame->DoCheckPostGisGeometry(viewName, columnInfo) == true)
  1905         -        {
  1906         -          icon = 6;
  1907         -          item2 = AppendItem(item, columnInfo, icon);
  1908         -          SetItemData(item2,
  1909         -                      (wxTreeItemData *) (new
  1910         -                                          MyObject(MY_POSTGIS_GEOMETRY, empty,
  1911         -                                                   empty, -1, empty, empty,
  1912         -                                                   empty, empty, columnInfo,
  1913         -                                                   viewName)));
  1914         -      } else
  1915         -        {
  1916         -          if (table != NULL)
  1917         -            {
  1918         -              // checking for a PK column
  1919         -              if (table->IsPkColumn(columnInfo) == true)
  1920         -                icon = 2;
  1921         -            }
  1922         -          item2 = AppendItem(item, columnInfo, icon);
  1923         -          SetItemData(item2,
  1924         -                      (wxTreeItemData *) (new
  1925         -                                          MyObject(MY_POSTGRES_COLUMN, empty,
  1926         -                                                   empty, -1, empty, empty,
  1927         -                                                   empty, empty, columnInfo,
  1928         -                                                   viewName)));
  1929         -        }
  1930         -      col = col->GetNext();
  1931         -    }
  1932         -  trgr = list.GetFirstTrigger();
  1933         -  while (trgr)
  1934         -    {
  1935         -      // setting up Triggers
  1936         -      wxString triggerInfo = trgr->GetName();
  1937         -      item2 = AppendItem(item, triggerInfo, 5);
  1938         -      SetItemData(item2,
  1939         -                  (wxTreeItemData *) (new
  1940         -                                      MyObject(MY_TRIGGER, empty,
  1941         -                                               trgr->GetName())));
  1942         -      trgr = trgr->GetNext();
  1943         -    }
  1944         -}
  1945         -
  1946   1633   void MyTableTree::AddTable(wxString & dbAlias,
  1947   1634                              wxString & tableName, bool virtualTable,
  1948   1635                              bool geometry, RootNodes * nodes)
  1949   1636   {
  1950   1637   //
  1951   1638   // appends a table to the TREE list [ATTACHED DB]
  1952   1639   //
  1953   1640     wxTreeItemId item;
  1954   1641     wxTreeItemId item2;
  1955   1642     wxTreeItemData *data;
         1643  +  bool isCoverage = false;
  1956   1644     bool isTileData = false;
         1645  +  bool isTopology = false;
  1957   1646     int icon = 1;
  1958   1647     if (virtualTable == true)
  1959   1648       icon = 8;
  1960   1649     if (geometry == true)
  1961   1650       {
  1962   1651         if (virtualTable == false)
  1963   1652           icon = 10;
................................................................................
  2272   1961   //
  2273   1962   // selecting some node [mouse action]
  2274   1963   //
  2275   1964     wxTreeItemId item = event.GetItem();
  2276   1965     if (item == Root || item == RootUserData || item == RootTopologies
  2277   1966         || item == RootNetworks || item == RootRasterCoverages
  2278   1967         || item == RootVectorCoverages || item == RootStyling || item == RootWMS
  2279         -      || item == RootPostgreSQL || item == RootIsoMetadata
  2280         -      || item == RootMetadata || item == RootInternal
         1968  +      || item == RootIsoMetadata || item == RootMetadata || item == RootInternal
  2281   1969         || item == RootSpatialIndex)
  2282   1970       return;
  2283   1971     MyObject *obj = (MyObject *) GetItemData(item);
  2284   1972     if (obj == NULL)
  2285   1973       return;
  2286   1974     CurrentItem = item;
  2287   1975   }
................................................................................
  2533   2221     menuItem =
  2534   2222       new wxMenuItem(&menu, Tree_UpdateLayerStatisticsAll,
  2535   2223                      wxT("Update Layer &Statistics"));
  2536   2224     menu.Append(menuItem);
  2537   2225     PopupMenu(&menu, pt);
  2538   2226   }
  2539   2227   
  2540         -void MyTableTree::DoRootPostgreSqlContextMenu(wxPoint & pt)
  2541         -{
  2542         -// MAIN: ROOT POTGRESQL context menu
  2543         -  wxMenuItem *menuItem;
  2544         -  CurrentItem = wxTreeItemId();
  2545         -  wxMenu menu(wxT("PostgreSQL"));
  2546         -  menuItem = new wxMenuItem(&menu, Tree_Refresh, wxT("&Refresh"));
  2547         -  menu.Append(menuItem);
  2548         -  menu.AppendSeparator();
  2549         -  menuItem =
  2550         -    new wxMenuItem(&menu, Tree_CreatePostgreSqlConn,
  2551         -                   wxT("Connect to a PostgreSQL &DBMS"));
  2552         -  menu.Append(menuItem);
  2553         -  if (MainFrame->HasPostgreSqlConnections() == true)
  2554         -    {
  2555         -      menuItem =
  2556         -        new wxMenuItem(&menu, Tree_CloseAllPostgreSqlConns,
  2557         -                       wxT("Close all connections to &PostgreSQL"));
  2558         -      menu.Append(menuItem);
  2559         -    }
  2560         -  menuItem =
  2561         -    new wxMenuItem(&menu, Tree_PostgreSqlDropOrphans,
  2562         -                   wxT("Drop all PostgreSQL &Orphans"));
  2563         -  menu.Append(menuItem);
  2564         -  PopupMenu(&menu, pt);
  2565         -}
  2566         -
  2567   2228   void MyTableTree::DoRootOthersContextMenu(wxPoint & pt, MyObject * obj)
  2568   2229   {
  2569   2230   // MAIN: OTHER ROOT NODES context menu
  2570   2231     wxMenuItem *menuItem;
  2571   2232     CurrentItem = wxTreeItemId();
  2572   2233     wxString title;
  2573   2234     switch (obj->GetSubType())
................................................................................
  3726   3387     title += obj->GetMainName() + wxT(".") + obj->GetColName();
  3727   3388     wxMenu menu(title);
  3728   3389     menuItem = new wxMenuItem(&menu, Tree_Refresh, wxT("&Refresh"));
  3729   3390     menu.Append(menuItem);
  3730   3391     PopupMenu(&menu, pt);
  3731   3392   }
  3732   3393   
  3733         -void MyTableTree::DoPostgreSqlContextMenu(wxPoint & pt, MyObject * obj)
  3734         -{
  3735         -// PostgreSQL objects: context menu dispatcher
  3736         -  switch (obj->GetType())
  3737         -    {
  3738         -      case MY_POSTGRES_CONN:
  3739         -        DoPostgresConnContextMenu(pt, obj);
  3740         -        break;
  3741         -      case MY_POSTGRES_SCHEMA:
  3742         -        DoPostgresSchemaContextMenu(pt, obj);
  3743         -        break;
  3744         -      case MY_POSTGRES_TABLE:
  3745         -        DoPostgresTableContextMenu(pt, obj);
  3746         -        break;
  3747         -      case MY_POSTGRES_VIEW:
  3748         -        DoPostgresViewContextMenu(pt, obj);
  3749         -        break;
  3750         -      case MY_POSTGIS_VIEW:
  3751         -        DoPostGisViewContextMenu(pt, obj);
  3752         -        break;
  3753         -      case MY_POSTGRES_COLUMN:
  3754         -        DoPostgresColumnContextMenu(pt, obj);
  3755         -        break;
  3756         -      case MY_POSTGIS_GEOMETRY:
  3757         -        DoPostGisGeometryContextMenu(pt, obj);
  3758         -        break;
  3759         -    };
  3760         -}
  3761         -
  3762         -void MyTableTree::DoPostgresConnContextMenu(wxPoint & pt, MyObject * obj)
  3763         -{
  3764         -// POSTGRES CONNECTION NODES context menu
  3765         -  wxMenuItem *menuItem;
  3766         -  wxString title = wxT("PostgreSQL Connection");
  3767         -  wxMenu menu(title);
  3768         -  menuItem = new wxMenuItem(&menu, Tree_Refresh, wxT("&Refresh"));
  3769         -  menu.Append(menuItem);
  3770         -  menu.AppendSeparator();
  3771         -  menuItem =
  3772         -    new wxMenuItem(&menu, Tree_ClosePostgreSqlConn,
  3773         -                   wxT("Close this connection to PostgreSQL"));
  3774         -  menu.Append(menuItem);
  3775         -  menuItem = new wxMenuItem(&menu, Tree_PostgreSqlInfos, wxT("&Infos"));
  3776         -  menu.Append(menuItem);
  3777         -  PopupMenu(&menu, pt);
  3778         -}
  3779         -
  3780         -void MyTableTree::DoPostgresSchemaContextMenu(wxPoint & pt, MyObject * obj)
  3781         -{
  3782         -// POSTGRES SCHEMA NODES context menu
  3783         -  wxMenuItem *menuItem;
  3784         -  wxString title = wxT("PostgreSQL Schema");
  3785         -  wxMenu menu(title);
  3786         -  menuItem = new wxMenuItem(&menu, Tree_Refresh, wxT("&Refresh"));
  3787         -  menu.Append(menuItem);
  3788         -  menu.AppendSeparator();
  3789         -  menuItem = new wxMenuItem(&menu, Tree_PostgreSqlInfos, wxT("&Infos"));
  3790         -  menu.Append(menuItem);
  3791         -  PopupMenu(&menu, pt);
  3792         -}
  3793         -
  3794         -void MyTableTree::DoPostgresTableContextMenu(wxPoint & pt, MyObject * obj)
  3795         -{
  3796         -// POSTGRES TABLE NODES context menu
  3797         -  wxMenuItem *menuItem;
  3798         -  wxString title = wxT("PostgreSQL Table: ") + obj->GetVirtName();
  3799         -  wxMenu menu(title);
  3800         -  menuItem = new wxMenuItem(&menu, Tree_Refresh, wxT("&Refresh"));
  3801         -  menu.Append(menuItem);
  3802         -  menu.AppendSeparator();
  3803         -  if (obj->IsReadOnly() == false && obj->HasPK() == true
  3804         -      && obj->CanInsertUpdateDelete() == true)
  3805         -    {
  3806         -      menuItem = new wxMenuItem(&menu, Tree_Edit, wxT("&Edit table rows"));
  3807         -      menu.Append(menuItem);
  3808         -  } else if (obj->CanSelect() == true)
  3809         -    {
  3810         -      menuItem = new wxMenuItem(&menu, Tree_Select, wxT("&Query table"));
  3811         -      menu.Append(menuItem);
  3812         -    }
  3813         -  menuItem = new wxMenuItem(&menu, Tree_Show, wxT("&Show columns"));
  3814         -  menu.Append(menuItem);
  3815         -  menuItem = new wxMenuItem(&menu, Tree_ShowSql, wxT("&Show CREATE statement"));
  3816         -  menu.Append(menuItem);
  3817         -  menuItem =
  3818         -    new wxMenuItem(&menu, Tree_PostgreSqlInfos, wxT("PostgreSQL &Infos"));
  3819         -  menu.Append(menuItem);
  3820         -  PopupMenu(&menu, pt);
  3821         -}
  3822         -
  3823         -void MyTableTree::DoPostgresViewContextMenu(wxPoint & pt, MyObject * obj)
  3824         -{
  3825         -// POSTGRES VIEW NODES context menu
  3826         -  wxMenuItem *menuItem;
  3827         -  wxString title = wxT("PostgreSQL View: ") + obj->GetVirtName();
  3828         -  wxMenu menu(title);
  3829         -  menuItem = new wxMenuItem(&menu, Tree_Refresh, wxT("&Refresh"));
  3830         -  menu.Append(menuItem);
  3831         -  menu.AppendSeparator();
  3832         -  if (obj->CanSelect() == true)
  3833         -    {
  3834         -      menuItem = new wxMenuItem(&menu, Tree_Select, wxT("&Query View"));
  3835         -      menu.Append(menuItem);
  3836         -    }
  3837         -  menuItem = new wxMenuItem(&menu, Tree_Show, wxT("&Show columns"));
  3838         -  menu.Append(menuItem);
  3839         -  menuItem = new wxMenuItem(&menu, Tree_ShowSql, wxT("&Show CREATE statement"));
  3840         -  menu.Append(menuItem);
  3841         -  menuItem =
  3842         -    new wxMenuItem(&menu, Tree_PostgreSqlInfos, wxT("PostgreSQL &Infos"));
  3843         -  menu.Append(menuItem);
  3844         -  PopupMenu(&menu, pt);
  3845         -}
  3846         -
  3847         -void MyTableTree::DoPostGisViewContextMenu(wxPoint & pt, MyObject * obj)
  3848         -{
  3849         -// POSTGIS VIEW NODES context menu
  3850         -  wxMenuItem *menuItem;
  3851         -  wxString title = wxT("PostGIS-to-SpatiaLite wrapper: ") + obj->GetVirtName();
  3852         -  wxMenu menu(title);
  3853         -  menuItem = new wxMenuItem(&menu, Tree_Refresh, wxT("&Refresh"));
  3854         -  menu.Append(menuItem);
  3855         -  menu.AppendSeparator();
  3856         -  if (obj->IsReadOnly() == false && obj->HasPK() == true
  3857         -      && obj->CanInsertUpdateDelete() == true)
  3858         -    {
  3859         -      menuItem = new wxMenuItem(&menu, Tree_Edit, wxT("&Edit table rows"));
  3860         -      menu.Append(menuItem);
  3861         -  } else if (obj->CanSelect() == true)
  3862         -    {
  3863         -      menuItem = new wxMenuItem(&menu, Tree_Select, wxT("&Query table"));
  3864         -      menu.Append(menuItem);
  3865         -    }
  3866         -  menuItem = new wxMenuItem(&menu, Tree_Show, wxT("&Show columns"));
  3867         -  menu.Append(menuItem);
  3868         -  menuItem = new wxMenuItem(&menu, Tree_ShowSql, wxT("&Show CREATE statement"));
  3869         -  menu.Append(menuItem);
  3870         -  menuItem =
  3871         -    new wxMenuItem(&menu, Tree_PostgreSqlInfos, wxT("PostgreSQL &Infos"));
  3872         -  menu.Append(menuItem);
  3873         -  PopupMenu(&menu, pt);
  3874         -}
  3875         -
  3876         -void MyTableTree::DoPostgresColumnContextMenu(wxPoint & pt, MyObject * obj)
  3877         -{
  3878         -// POSTGRESQL COLUMN NODES context menu
  3879         -  wxMenuItem *menuItem;
  3880         -  wxString title =
  3881         -    wxT("PostgreSQL Column: ") + obj->GetVirtName() + wxT(".") +
  3882         -    obj->GetColumn();
  3883         -  wxMenu menu(title);
  3884         -  menuItem = new wxMenuItem(&menu, Tree_Refresh, wxT("&Refresh"));
  3885         -  menu.Append(menuItem);
  3886         -  PopupMenu(&menu, pt);
  3887         -}
  3888         -
  3889         -void MyTableTree::DoPostGisGeometryContextMenu(wxPoint & pt, MyObject * obj)
  3890         -{
  3891         -// POSTGIS GEOMETRY COLUMN NODES context menu
  3892         -  wxMenuItem *menuItem;
  3893         -  wxString title =
  3894         -    wxT("PostGIS Geometry: ") + obj->GetVirtName() + wxT(".") +
  3895         -    obj->GetColumn();
  3896         -  wxMenu menu(title);
  3897         -  menuItem = new wxMenuItem(&menu, Tree_Refresh, wxT("&Refresh"));
  3898         -  menu.Append(menuItem);
  3899         -  menu.AppendSeparator();
  3900         -  menuItem =
  3901         -    new wxMenuItem(&menu, Tree_CheckGeometry, wxT("&Check geometries"));
  3902         -  menu.Append(menuItem);
  3903         -  menuItem = new wxMenuItem(&menu, Tree_Extent, wxT("&Extent"));
  3904         -  menu.Append(menuItem);
  3905         -  menu.AppendSeparator();
  3906         -  menuItem = new wxMenuItem(&menu, Tree_DumpShp, wxT("Export as &Shapefile"));
  3907         -  menuItem->SetBitmap(wxBitmap(dumpshp_xpm));
  3908         -  menu.Append(menuItem);
  3909         -  menuItem = new wxMenuItem(&menu, Tree_DumpKml, wxT("Export as &KML"));
  3910         -  menu.Append(menuItem);
  3911         -  menu.AppendSeparator();
  3912         -  menuItem = new wxMenuItem(&menu, Tree_MapPreview, wxT("&Map Preview"));
  3913         -  menuItem->SetBitmap(wxBitmap(map_preview_xpm));
  3914         -  menu.Append(menuItem);
  3915         -  PopupMenu(&menu, pt);
  3916         -}
  3917         -
  3918   3394   void MyTableTree::OnRightClick(wxTreeEvent & event)
  3919   3395   {
  3920   3396   //
  3921   3397   // right click on some node [mouse action] Context Menu
  3922   3398   //
         3399  +  wxMenuItem *menuItem;
  3923   3400     if (MainFrame->IsConnected() == false)
  3924   3401       return;
  3925   3402     bool metadata = MainFrame->CheckMetadata();
  3926   3403   
  3927   3404     wxTreeItemId item = event.GetItem();
  3928   3405     SelectItem(item);
  3929   3406     wxPoint pt = event.GetPoint();
................................................................................
  3961   3438       }
  3962   3439     if (item == RootStyling)
  3963   3440       {
  3964   3441         // ROOT STYLING
  3965   3442         DoRootStylingContextMenu(pt);
  3966   3443         return;
  3967   3444       }
  3968         -  if (item == RootPostgreSQL)
  3969         -    {
  3970         -      // ROOT POSTGRESQL
  3971         -      DoRootPostgreSqlContextMenu(pt);
  3972         -      return;
  3973         -    }
  3974   3445   
  3975   3446     MyObject *obj = (MyObject *) GetItemData(item);
  3976   3447     if (obj == NULL)
  3977   3448       return;
  3978   3449     if (item == Root || item == RootUserData || item == RootIsoMetadata
  3979   3450         || item == RootMetadata || item == RootInternal
  3980   3451         || item == RootSpatialIndex)
................................................................................
  3993   3464       }
  3994   3465     if (obj->IsRootAttached())
  3995   3466       {
  3996   3467         // ATTACHED ROOT items
  3997   3468         DoRootAttachedContextMenu(pt, obj);
  3998   3469         return;
  3999   3470       }
  4000         -// special cases: PostgreSQL objects
  4001         -  if (obj->IsPostgreSQL() == true)
  4002         -    {
  4003         -      DoPostgreSqlContextMenu(pt, obj);
  4004         -      return;
  4005         -    }
  4006   3471   // special cases: TOPO-GEO and TOPO-NET objects
  4007   3472     if (obj->GetType() == MY_TOPO_GEO || obj->GetType() == MY_TOPO_NET)
  4008   3473       {
  4009   3474         if (obj->IsAttached() == true)
  4010   3475           {
  4011   3476             wxString title;
  4012   3477             if (obj->GetType() == MY_TOPO_GEO)
................................................................................
  4401   3866     wxString sql;
  4402   3867     wxString dummy;
  4403   3868     char *xname;
  4404   3869     char *xname2;
  4405   3870     MyObject *obj = (MyObject *) GetItemData(CurrentItem);
  4406   3871     if (obj == NULL)
  4407   3872       return;
  4408         -  if (obj->GetType() == MY_POSTGRES_TABLE || obj->GetType() == MY_POSTGRES_VIEW
  4409         -      || obj->GetType() == MY_POSTGIS_VIEW)
  4410         -    {
  4411         -      // special case: PostgreSQL objects
  4412         -      bool hasGeom = false;
  4413         -      wxString viewName;
  4414         -      if (obj->GetType() == MY_POSTGRES_TABLE)
  4415         -        {
  4416         -          MyPostgresTable *table =
  4417         -            MainFrame->FindPostgresTable(obj->GetVirtName());
  4418         -          if (table->GetFirst() != NULL)
  4419         -            hasGeom = true;
  4420         -          viewName = table->GetPostGisName();
  4421         -        }
  4422         -      if (hasGeom == true)
  4423         -        {
  4424         -          int ret = wxMessageBox(wxT
  4425         -                                 ("Directly querying a PostgreSQL table containing PostGIS geometries "
  4426         -                                  "is a strongly discouraged operation.\n\n"
  4427         -                                  "You should instead query the corresponding Spatial View: ")
  4428         -                                 + viewName + wxT("\n\n") +
  4429         -                                 wxT("Do you really intend to continue ?"),
  4430         -                                 wxT("spatialite_gui"),
  4431         -                                 wxYES_NO | wxICON_QUESTION, this);
  4432         -          if (ret != wxYES)
  4433         -            return;
  4434         -        }
  4435         -      sql = wxT("SELECT * FROM \"");
  4436         -      xname = (char *) malloc((obj->GetVirtName().Len() * 4) + 1);
  4437         -      strcpy(xname, obj->GetVirtName().ToUTF8());
  4438         -      xname2 = gaiaDoubleQuotedSql(xname);
  4439         -      free(xname);
  4440         -      sql += wxString::FromUTF8(xname2);
  4441         -      free(xname2);
  4442         -      sql += wxT("\"");
  4443         -      wxString prefix = wxT("MAIN");
  4444         -      wxString noGeom;
  4445         -      MainFrame->InitializeSqlFilters(prefix, obj->GetVirtName(), true, noGeom);
  4446         -      MainFrame->SetSql(sql, true, false, dummy, dummy, true);
  4447         -      MainFrame->GetQueryView()->EnableFilterButton();
  4448         -      return;
  4449         -    }
  4450   3873     sql = wxT("SELECT * FROM \"");
  4451   3874     if (obj->IsAttached() == true)
  4452   3875       {
  4453   3876         wxString dbAlias2 = obj->GetDbAlias();
  4454   3877         MyFrame::DoubleQuoted(dbAlias2);
  4455   3878         sql += dbAlias2 + wxT("\".\"");
  4456   3879       }
................................................................................
  4623   4046         strcpy(xname, obj->GetMainName().ToUTF8());
  4624   4047         xname2 = gaiaSingleQuotedSql(xname);
  4625   4048         free(xname);
  4626   4049         sql += wxString::FromUTF8(xname2);
  4627   4050         free(xname2);
  4628   4051         sql += wxT("'");
  4629   4052       }
  4630         -  if (obj->GetType() == MY_POSTGRES_TABLE || obj->GetType() == MY_POSTGRES_VIEW
  4631         -      || obj->GetType() == MY_POSTGIS_VIEW)
  4632         -    {
  4633         -      sql = wxT("PRAGMA table_info(\"");
  4634         -      xname = (char *) malloc((obj->GetVirtName().Len() * 4) + 1);
  4635         -      strcpy(xname, obj->GetVirtName().ToUTF8());
  4636         -      xname2 = gaiaDoubleQuotedSql(xname);
  4637         -      free(xname);
  4638         -      sql += wxString::FromUTF8(xname2);
  4639         -      free(xname2);
  4640         -      sql += wxT("\")");
  4641         -    }
  4642   4053     if (sql.Len() < 1)
  4643   4054       return;
  4644   4055     MainFrame->GetRsView()->ResetEmpty();
  4645   4056     MainFrame->SetSql(sql, true);
  4646   4057   }
  4647   4058   
  4648   4059   void MyTableTree::OnCmdDrop(wxCommandEvent & WXUNUSED(event))
................................................................................
  5107   4518         else
  5108   4519           sql += wxT("sqlite_master");
  5109   4520         sql += wxT("\nWHERE type = 'view' AND name = '");
  5110   4521         xname = (char *) malloc((obj->GetMainName().Len() * 4) + 1);
  5111   4522         strcpy(xname, obj->GetMainName().ToUTF8());
  5112   4523         xname2 = gaiaSingleQuotedSql(xname);
  5113   4524         free(xname);
  5114         -      sql += wxString::FromUTF8(xname2);
  5115         -      free(xname2);
  5116         -      sql += wxT("'");
  5117         -      MainFrame->GetRsView()->ResetEmpty();
  5118         -      MainFrame->SetSql(sql, true);
  5119         -    }
  5120         -  if (obj->GetType() == MY_POSTGRES_TABLE || obj->GetType() == MY_POSTGRES_VIEW)
  5121         -    {
  5122         -      sql = wxT("SELECT sql FROM ");
  5123         -      sql += wxT("sqlite_master");
  5124         -      sql += wxT("\nWHERE type = 'table' AND name = '");
  5125         -      xname = (char *) malloc((obj->GetVirtName().Len() * 4) + 1);
  5126         -      strcpy(xname, obj->GetVirtName().ToUTF8());
  5127         -      xname2 = gaiaSingleQuotedSql(xname);
  5128         -      free(xname);
  5129         -      sql += wxString::FromUTF8(xname2);
  5130         -      free(xname2);
  5131         -      sql += wxT("'");
  5132         -      MainFrame->GetRsView()->ResetEmpty();
  5133         -      MainFrame->SetSql(sql, true);
  5134         -    }
  5135         -  if (obj->GetType() == MY_POSTGIS_VIEW)
  5136         -    {
  5137         -      sql = wxT("SELECT sql FROM ");
  5138         -      sql += wxT("sqlite_master");
  5139         -      sql += wxT("\nWHERE type = 'view' AND name = '");
  5140         -      xname = (char *) malloc((obj->GetVirtName().Len() * 4) + 1);
  5141         -      strcpy(xname, obj->GetVirtName().ToUTF8());
  5142         -      xname2 = gaiaSingleQuotedSql(xname);
  5143         -      free(xname);
  5144   4525         sql += wxString::FromUTF8(xname2);
  5145   4526         free(xname2);
  5146   4527         sql += wxT("'");
  5147   4528         MainFrame->GetRsView()->ResetEmpty();
  5148   4529         MainFrame->SetSql(sql, true);
  5149   4530       }
  5150   4531   }
................................................................................
  5794   5175     char *xname;
  5795   5176     char *xname2;
  5796   5177     MyObject *obj = (MyObject *) GetItemData(CurrentItem);
  5797   5178     if (obj == NULL)
  5798   5179       return;
  5799   5180     if (obj->GetType() == MY_COLUMN || obj->GetType() == MY_GEOMETRY
  5800   5181         || obj->GetType() == MY_GEOMETRY_INDEX
  5801         -      || obj->GetType() == MY_GEOMETRY_CACHED
  5802         -      || obj->GetType() == MY_POSTGIS_GEOMETRY)
         5182  +      || obj->GetType() == MY_GEOMETRY_CACHED)
  5803   5183       {
  5804   5184         sql = wxT("SELECT Count(*), GeometryType(\"");
  5805         -      if (obj->GetType() == MY_POSTGIS_GEOMETRY)
  5806         -        {
  5807         -          xname = (char *) malloc((obj->GetColumn().Len() * 4) + 1);
  5808         -          strcpy(xname, obj->GetColumn().ToUTF8());
  5809         -      } else
  5810         -        {
  5811         -          xname = (char *) malloc((obj->GetColName().Len() * 4) + 1);
  5812         -          strcpy(xname, obj->GetColName().ToUTF8());
  5813         -        }
         5185  +      xname = (char *) malloc((obj->GetColName().Len() * 4) + 1);
         5186  +      strcpy(xname, obj->GetColName().ToUTF8());
  5814   5187         xname2 = gaiaDoubleQuotedSql(xname);
  5815   5188         free(xname);
  5816   5189         sql += wxString::FromUTF8(xname2);
         5190  +      free(xname2);
  5817   5191         sql += wxT("\"), Srid(\"");
         5192  +      xname = (char *) malloc((obj->GetColName().Len() * 4) + 1);
         5193  +      strcpy(xname, obj->GetColName().ToUTF8());
         5194  +      xname2 = gaiaDoubleQuotedSql(xname);
         5195  +      free(xname);
  5818   5196         sql += wxString::FromUTF8(xname2);
         5197  +      free(xname2);
  5819   5198         sql += wxT("\"), CoordDimension(\"");
         5199  +      xname = (char *) malloc((obj->GetColName().Len() * 4) + 1);
         5200  +      strcpy(xname, obj->GetColName().ToUTF8());
         5201  +      xname2 = gaiaDoubleQuotedSql(xname);
         5202  +      free(xname);
  5820   5203         sql += wxString::FromUTF8(xname2);
  5821   5204         free(xname2);
  5822   5205         sql += wxT("\")\nFROM \"");
  5823         -      if (obj->GetType() == MY_POSTGIS_GEOMETRY)
  5824         -        {
  5825         -          xname = (char *) malloc((obj->GetVirtName().Len() * 4) + 1);
  5826         -          strcpy(xname, obj->GetVirtName().ToUTF8());
  5827         -      } else
  5828         -        {
  5829         -          xname = (char *) malloc((obj->GetMainName().Len() * 4) + 1);
  5830         -          strcpy(xname, obj->GetMainName().ToUTF8());
  5831         -        }
         5206  +      xname = (char *) malloc((obj->GetMainName().Len() * 4) + 1);
         5207  +      strcpy(xname, obj->GetMainName().ToUTF8());
  5832   5208         xname2 = gaiaDoubleQuotedSql(xname);
  5833   5209         free(xname);
  5834   5210         sql += wxString::FromUTF8(xname2);
  5835   5211         free(xname2);
  5836   5212         sql += wxT("\"\nGROUP BY 2, 3, 4");
  5837   5213         MainFrame->GetRsView()->ResetEmpty();
  5838   5214         MainFrame->SetSql(sql, true);
................................................................................
  5853   5229     if (obj->GetType() == MY_COLUMN || obj->GetType() == MY_GEOMETRY
  5854   5230         || obj->GetType() == MY_GEOMETRY_INDEX
  5855   5231         || obj->GetType() == MY_GEOMETRY_CACHED
  5856   5232         || obj->GetType() == MY_VIEW_GEOMETRY
  5857   5233         || obj->GetType() == MY_VIEW_GEOMETRY_INDEX
  5858   5234         || obj->GetType() == MY_VIEW_GEOMETRY_CACHED
  5859   5235         || obj->GetType() == MY_VIRTUAL_COLUMN
  5860         -      || obj->GetType() == MY_VIRTUAL_GEOMETRY
  5861         -      || obj->GetType() == MY_POSTGIS_GEOMETRY)
         5236  +      || obj->GetType() == MY_VIRTUAL_GEOMETRY)
  5862   5237       {
  5863   5238         sql = wxT("SELECT Min(MbrMinX(\"");
  5864         -      if (obj->GetType() == MY_POSTGIS_GEOMETRY)
  5865         -        {
  5866         -          xname = (char *) malloc((obj->GetColumn().Len() * 4) + 1);
  5867         -          strcpy(xname, obj->GetColumn().ToUTF8());
  5868         -      } else
  5869         -        {
  5870         -          xname = (char *) malloc((obj->GetColName().Len() * 4) + 1);
  5871         -          strcpy(xname, obj->GetColName().ToUTF8());
  5872         -        }
         5239  +      xname = (char *) malloc((obj->GetColName().Len() * 4) + 1);
         5240  +      strcpy(xname, obj->GetColName().ToUTF8());
         5241  +      xname2 = gaiaDoubleQuotedSql(xname);
         5242  +      free(xname);
         5243  +      sql += wxString::FromUTF8(xname2);
         5244  +      free(xname2);
         5245  +      sql += wxT("\")), Min(MbrMinY(\"");
         5246  +      xname = (char *) malloc((obj->GetColName().Len() * 4) + 1);
         5247  +      strcpy(xname, obj->GetColName().ToUTF8());
         5248  +      xname2 = gaiaDoubleQuotedSql(xname);
         5249  +      free(xname);
         5250  +      sql += wxString::FromUTF8(xname2);
         5251  +      free(xname2);
         5252  +      sql += wxT("\")), Max(MbrMaxX(\"");
         5253  +      xname = (char *) malloc((obj->GetColName().Len() * 4) + 1);
         5254  +      strcpy(xname, obj->GetColName().ToUTF8());
  5873   5255         xname2 = gaiaDoubleQuotedSql(xname);
  5874   5256         free(xname);
  5875   5257         sql += wxString::FromUTF8(xname2);
  5876         -      sql += wxT("\")), Min(MbrMinY(\"");
  5877         -      sql += wxString::FromUTF8(xname2);
  5878         -      sql += wxT("\")), Max(MbrMaxX(\"");
  5879         -      sql += wxString::FromUTF8(xname2);
         5258  +      free(xname2);
  5880   5259         sql += wxT("\")), Max(MbrMaxY(\"");
         5260  +      xname = (char *) malloc((obj->GetColName().Len() * 4) + 1);
         5261  +      strcpy(xname, obj->GetColName().ToUTF8());
         5262  +      xname2 = gaiaDoubleQuotedSql(xname);
         5263  +      free(xname);
  5881   5264         sql += wxString::FromUTF8(xname2);
  5882   5265         free(xname2);
  5883   5266         sql += wxT("\"))\nFROM \"");
  5884         -      if (obj->GetType() == MY_POSTGIS_GEOMETRY)
  5885         -        {
  5886         -          xname = (char *) malloc((obj->GetVirtName().Len() * 4) + 1);
  5887         -          strcpy(xname, obj->GetVirtName().ToUTF8());
  5888         -      } else
  5889         -        {
  5890         -          xname = (char *) malloc((obj->GetMainName().Len() * 4) + 1);
  5891         -          strcpy(xname, obj->GetMainName().ToUTF8());
  5892         -        }
         5267  +      xname = (char *) malloc((obj->GetMainName().Len() * 4) + 1);
         5268  +      strcpy(xname, obj->GetMainName().ToUTF8());
  5893   5269         xname2 = gaiaDoubleQuotedSql(xname);
  5894   5270         free(xname);
  5895   5271         sql += wxString::FromUTF8(xname2) + wxT("\"");
  5896   5272         free(xname2);
  5897   5273         MainFrame->GetRsView()->ResetEmpty();
  5898   5274         MainFrame->SetSql(sql, true);
  5899   5275       }
................................................................................
  6234   5610   //
  6235   5611   // menu event - dumping as Shapefile
  6236   5612   //
  6237   5613     int ret;
  6238   5614     wxString path;
  6239   5615     wxString lastDir;
  6240   5616     bool isView = false;
  6241         -  bool isPostGIS = false;
  6242   5617     int metadata_type = MainFrame->GetMetaDataType();
  6243   5618     MyObject *obj = (MyObject *) GetItemData(CurrentItem);
  6244   5619     if (obj == NULL)
  6245   5620       return;
  6246         -  if (obj->GetType() == MY_POSTGIS_GEOMETRY)
  6247         -    isPostGIS = true;
  6248   5621     if (obj->GetType() == MY_VIEW_GEOMETRY
  6249   5622         || obj->GetType() == MY_VIEW_GEOMETRY_INDEX
  6250   5623         || obj->GetType() == MY_VIEW_GEOMETRY_CACHED)
  6251   5624       isView = true;
  6252   5625     if (obj->GetType() == MY_GEOMETRY || obj->GetType() == MY_GEOMETRY_INDEX
  6253         -      || obj->GetType() == MY_GEOMETRY_CACHED || isView == true || isPostGIS)
         5626  +      || obj->GetType() == MY_GEOMETRY_CACHED || isView == true)
  6254   5627       {
  6255   5628         wxFileDialog fileDialog(this, wxT("Dump Shapefile"),
  6256   5629                                 wxT(""), wxT("shapefile.shp"),
  6257   5630                                 wxT
  6258   5631                                 ("Shapefile (*.shp)|*.shp|All files (*.*)|*.*"),
  6259   5632                                 wxFD_SAVE | wxFD_OVERWRITE_PROMPT,
  6260   5633                                 wxDefaultPosition, wxDefaultSize, wxT("filedlg"));
................................................................................
  6279   5652             *x_type = '\0';
  6280   5653             wxFileName file(fileDialog.GetPath());
  6281   5654             path = file.GetPath();
  6282   5655             path += file.GetPathSeparator();
  6283   5656             path += file.GetName();
  6284   5657             lastDir = file.GetPath();
  6285   5658             strcpy(x_path, path.ToUTF8());
  6286         -          if (isPostGIS == true)
  6287         -            {
  6288         -              strcpy(x_table, obj->GetVirtName().ToUTF8());
  6289         -              strcpy(x_column, obj->GetColumn().ToUTF8());
  6290         -          } else
  6291         -            {
  6292         -              strcpy(x_table, obj->GetMainName().ToUTF8());
  6293         -              strcpy(x_column, obj->GetColName().ToUTF8());
  6294         -            }
  6295         -          if (isPostGIS == true)
  6296         -            {
  6297         -              char *geom = (char *) malloc(obj->GetColumn().Len() * 4 + 1);
  6298         -              strcpy(geom, obj->GetColumn().ToUTF8());
  6299         -              char *xgeom = gaiaDoubleQuotedSql(geom);
  6300         -              free(geom);
  6301         -              char *view = (char *) malloc(obj->GetVirtName().Len() * 4 + 1);
  6302         -              strcpy(view, obj->GetVirtName().ToUTF8());
  6303         -              char *xview = gaiaDoubleQuotedSql(view);
  6304         -              free(view);
  6305         -              char *sql = sqlite3_mprintf("SELECT GeometryType(\"%s\") "
  6306         -                                          "FROM \"%s\" GROUP BY 1", xgeom,
  6307         -                                          xview);
  6308         -              free(xgeom);
  6309         -              free(xview);
  6310         -              ret =
  6311         -                sqlite3_get_table(MainFrame->GetSqlite(), sql,
  6312         -                                  &results, &rows, &columns, &errMsg);
  6313         -              sqlite3_free(sql);
  6314         -              if (ret != SQLITE_OK)
  6315         -                {
  6316         -                  wxMessageBox(wxT("dump shapefile error:") +
  6317         -                               wxString::FromUTF8(errMsg),
  6318         -                               wxT("spatialite_gui"), wxOK | wxICON_ERROR,
  6319         -                               this);
  6320         -                  sqlite3_free(errMsg);
  6321         -                  return;
  6322         -                }
  6323         -              if (rows < 1)
  6324         -                ;
  6325         -              else
  6326         -                {
  6327         -                  for (i = 1; i <= rows; i++)
  6328         -                    strcpy(x_type, results[(i * columns) + 0]);
  6329         -                }
  6330         -              sqlite3_free_table(results);
  6331         -              if (strcmp(x_type, "MULTILINESTRING") == 0)
  6332         -                strcpy(x_type, "LINESTRING");
  6333         -              if (strcmp(x_type, "MULTIPOLYGON") == 0)
  6334         -                strcpy(x_type, "POLYGON");
  6335         -          } else if (isView == true)
         5659  +          strcpy(x_table, obj->GetMainName().ToUTF8());
         5660  +          strcpy(x_column, obj->GetColName().ToUTF8());
         5661  +          if (isView == true)
  6336   5662               {
  6337   5663                 wxString sql;
  6338   5664                 char *xsql;
  6339   5665                 if (metadata_type == METADATA_CURRENT)
  6340   5666                   sql =
  6341   5667                     wxT("SELECT geometry_type FROM views_geometry_columns AS a ");
  6342   5668                 else if (metadata_type == METADATA_LEGACY)
................................................................................
  6546   5872                   wxMessageBox(wxT("dump shp error:") +
  6547   5873                                wxString::FromUTF8(err_msg), wxT("spatialite_gui"),
  6548   5874                                wxOK | wxICON_ERROR, this);
  6549   5875             } else
  6550   5876               {
  6551   5877                 // asking the charset to be used
  6552   5878                 DumpShpDialog dlg;
  6553         -              if (isPostGIS == true)
  6554         -                dlg.Create(MainFrame, path, obj->GetVirtName(),
  6555         -                           obj->GetColumn(), MainFrame->GetDefaultCharset());
  6556         -              else
  6557         -                dlg.Create(MainFrame, path, obj->GetMainName(),
  6558         -                           obj->GetColName(), MainFrame->GetDefaultCharset());
         5879  +              dlg.Create(MainFrame, path, obj->GetMainName(), obj->GetColName(),
         5880  +                         MainFrame->GetDefaultCharset());
  6559   5881                 ret = dlg.ShowModal();
  6560   5882                 if (ret == wxID_OK)
  6561   5883                   {
  6562   5884                     MainFrame->SetLastDirectory(lastDir);
  6563   5885                     ::wxBeginBusyCursor();
  6564   5886                     strcpy(x_charset, dlg.GetCharset().ToUTF8());
  6565   5887                     rt =
................................................................................
  6589   5911   // menu event - dumping as KML
  6590   5912   //
  6591   5913     int ret;
  6592   5914     wxString path;
  6593   5915     wxString lastDir;
  6594   5916     bool isView = false;
  6595   5917     bool isVirtual = false;
  6596         -  bool isPostGIS = false;
  6597   5918     bool isNameConst = false;
  6598   5919     bool isDescConst = false;
  6599   5920     wxString Name;
  6600   5921     wxString Desc;
  6601   5922     int precision = -1;
  6602   5923     MyObject *obj = (MyObject *) GetItemData(CurrentItem);
  6603   5924     if (obj == NULL)
  6604   5925       return;
  6605         -  if (obj->GetType() == MY_POSTGIS_GEOMETRY)
  6606         -    isPostGIS = true;
  6607   5926     if (obj->GetType() == MY_VIEW_GEOMETRY
  6608   5927         || obj->GetType() == MY_VIEW_GEOMETRY_INDEX
  6609   5928         || obj->GetType() == MY_VIEW_GEOMETRY_CACHED)
  6610   5929       isView = true;
  6611   5930     if (obj->GetType() == MY_VIRTUAL_GEOMETRY)
  6612   5931       isVirtual = true;
  6613   5932     if (obj->GetType() == MY_GEOMETRY || obj->GetType() == MY_GEOMETRY_INDEX
  6614   5933         || obj->GetType() == MY_GEOMETRY_CACHED || isView == true
  6615         -      || isVirtual == true || isPostGIS == true)
         5934  +      || isVirtual == true)
  6616   5935       {
  6617   5936         DumpKmlDialog dlg;
  6618         -      if (isPostGIS == true)
  6619         -        dlg.Create(MainFrame, obj->GetVirtName(), obj->GetColumn());
  6620         -      else
  6621         -        dlg.Create(MainFrame, obj->GetMainName(), obj->GetColName());
         5937  +      dlg.Create(MainFrame, obj->GetMainName(), obj->GetColName());
  6622   5938         ret = dlg.ShowModal();
  6623   5939         if (ret == wxID_OK)
  6624   5940           {
  6625   5941             isNameConst = dlg.IsNameConst();
  6626   5942             Name = dlg.GetName();
  6627   5943             isDescConst = dlg.IsDescConst();
  6628   5944             Desc = dlg.GetDesc();
................................................................................
  6646   5962             path = file.GetPath();
  6647   5963             path += file.GetPathSeparator();
  6648   5964             path += file.GetName();
  6649   5965             path += wxT(".kml");
  6650   5966             lastDir = file.GetPath();
  6651   5967             MainFrame->SetLastDirectory(lastDir);
  6652   5968             ::wxBeginBusyCursor();
  6653         -          if (isPostGIS == true)
  6654         -            MainFrame->DumpKml(path, obj->GetVirtName(), obj->GetColumn(),
  6655         -                               precision, Name, isNameConst, Desc, isDescConst);
  6656         -          else
  6657         -            MainFrame->DumpKml(path, obj->GetMainName(), obj->GetColName(),
  6658         -                               precision, Name, isNameConst, Desc, isDescConst);
         5969  +          MainFrame->DumpKml(path, obj->GetMainName(), obj->GetColName(),
         5970  +                             precision, Name, isNameConst, Desc, isDescConst);
  6659   5971             ::wxEndBusyCursor();
  6660   5972           }
  6661   5973       }
  6662   5974   }
  6663   5975   
  6664   5976   void MyTableTree::OnCmdDumpTxtTab(wxCommandEvent & WXUNUSED(event))
  6665   5977   {
................................................................................
  7624   6936     int ret;
  7625   6937     char err_msg[2048];
  7626   6938     sqlite3_stmt *stmt;
  7627   6939     double minx = DBL_MAX;
  7628   6940     double miny = DBL_MAX;
  7629   6941     double maxx = DBL_MAX;
  7630   6942     double maxy = DBL_MAX;
  7631         -  bool isPostGIS = false;
  7632   6943   
  7633   6944     MyObject *obj = (MyObject *) GetItemData(CurrentItem);
  7634   6945     if (obj == NULL)
  7635   6946       return;
  7636         -  if (obj->GetType() == MY_POSTGIS_GEOMETRY)
  7637         -    isPostGIS = true;
  7638   6947   
  7639   6948     ::wxBeginBusyCursor();
  7640         -  if (isPostGIS == true)
  7641         -    {
  7642         -      table_name = (char *) malloc((obj->GetVirtName().Len() * 4) + 1);
  7643         -      strcpy(table_name, obj->GetVirtName().ToUTF8());
  7644         -      column_name = (char *) malloc((obj->GetColumn().Len() * 4) + 1);
  7645         -      strcpy(column_name, obj->GetColumn().ToUTF8());
  7646         -  } else
  7647         -    {
  7648         -      table_name = (char *) malloc((obj->GetMainName().Len() * 4) + 1);
  7649         -      strcpy(table_name, obj->GetMainName().ToUTF8());
  7650         -      column_name = (char *) malloc((obj->GetColName().Len() * 4) + 1);
  7651         -      strcpy(column_name, obj->GetColName().ToUTF8());
  7652         -    }
         6949  +  table_name = (char *) malloc((obj->GetMainName().Len() * 4) + 1);
         6950  +  strcpy(table_name, obj->GetMainName().ToUTF8());
         6951  +  column_name = (char *) malloc((obj->GetColName().Len() * 4) + 1);
         6952  +  strcpy(column_name, obj->GetColName().ToUTF8());
  7653   6953     table_name2 = gaiaDoubleQuotedSql(table_name);
  7654   6954     column_name2 = gaiaDoubleQuotedSql(column_name);
  7655   6955     free(table_name);
  7656   6956     free(column_name);
  7657   6957     sprintf(sql, "SELECT Min(MbrMinX(\"%s\")), Min(MbrMinY(\"%s\")), ",
  7658   6958             column_name2, column_name2);
  7659   6959     sprintf(sql2, "Max(MbrMaxX(\"%s\")), Max(MbrMaxY(\"%s\")) ", column_name2,
................................................................................
  7713   7013       {
  7714   7014         wxMessageBox(wxT("This Column doesn't contains any Geometry: sorry ..."),
  7715   7015                      wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
  7716   7016         return;
  7717   7017       }
  7718   7018   
  7719   7019     MapPreviewDialog dlg;
  7720         -  if (isPostGIS == true)
  7721         -    dlg.Create(MainFrame, obj->GetVirtName(), obj->GetColumn(), minx, miny,
  7722         -               maxx, maxy);
  7723         -  else
  7724         -    dlg.Create(MainFrame, obj->GetMainName(), obj->GetColName(), minx, miny,
  7725         -               maxx, maxy);
         7020  +  dlg.Create(MainFrame, obj->GetMainName(), obj->GetColName(), minx, miny, maxx,
         7021  +             maxy);
  7726   7022     dlg.ShowModal();
  7727   7023   }
  7728   7024   
  7729   7025   void MyTableTree::OnCmdColumnStats(wxCommandEvent & WXUNUSED(event))
  7730   7026   {
  7731   7027   //
  7732   7028   // menu event - column stats
................................................................................
  9275   8571     char *type;
  9276   8572     int pk = 0;
  9277   8573     int pb = 0;
  9278   8574     int primaryKeys[1024];
  9279   8575     int blobCols[1024];
  9280   8576     char *xname;
  9281   8577     char *xname2;
  9282         -  bool isView = false;
         8578  +  bool isView;
  9283   8579     for (i = 0; i < 1024; i++)
  9284   8580       {
  9285   8581         primaryKeys[i] = -1;
  9286   8582         blobCols[i] = -1;
  9287   8583       }
  9288   8584     primaryKeys[pk++] = 0;
  9289   8585     MyObject *obj = (MyObject *) GetItemData(CurrentItem);
  9290   8586     if (obj == NULL)
  9291   8587       return;
  9292         -  if (obj->GetType() == MY_POSTGRES_TABLE || obj->GetType() == MY_POSTGIS_VIEW)
  9293         -    {
  9294         -      // special case: PostgreSQL table
  9295         -      bool hasGeom = false;
  9296         -      wxString viewName;
  9297         -      if (obj->GetType() == MY_POSTGRES_TABLE)
  9298         -        {
  9299         -          MyPostgresTable *table =
  9300         -            MainFrame->FindPostgresTable(obj->GetVirtName());
  9301         -          if (table->GetFirst() != NULL)
  9302         -            hasGeom = true;
  9303         -          viewName = table->GetPostGisName();
  9304         -        }
  9305         -      if (hasGeom == true)
  9306         -        {
  9307         -          int ret = wxMessageBox(wxT
  9308         -                                 ("Directly editing a PostgreSQL table containing PostGIS geometries "
  9309         -                                  "is a strongly discouraged operation.\n\n"
  9310         -                                  "You should instead edit the corresponding Spatial View: ")
  9311         -                                 + viewName + wxT("\n\n") +
  9312         -                                 wxT("Do you really intend to continue ?"),
  9313         -                                 wxT("spatialite_gui"),
  9314         -                                 wxYES_NO | wxICON_QUESTION, this);
  9315         -          if (ret != wxYES)
  9316         -            return;
  9317         -        }
  9318         -      sql = wxT("PRAGMA table_info(\"");
  9319         -      xname = (char *) malloc((obj->GetVirtName().Len() * 4) + 1);
  9320         -      strcpy(xname, obj->GetVirtName().ToUTF8());
  9321         -      xname2 = gaiaDoubleQuotedSql(xname);
  9322         -      free(xname);
  9323         -      sql += wxString::FromUTF8(xname2);
  9324         -      free(xname2);
  9325         -      sql += wxT("\")");
  9326         -      xsql = (char *) malloc((sql.Len() * 4) + 1);
  9327         -      strcpy(xsql, sql.ToUTF8());
  9328         -      int ret = sqlite3_get_table(MainFrame->GetSqlite(), xsql, &results,
  9329         -                                  &rows, &columns, &errMsg);
  9330         -      free(xsql);
  9331         -      if (ret != SQLITE_OK)
  9332         -        {
  9333         -          wxMessageBox(wxT("SQLite SQL error: ") + wxString::FromUTF8(errMsg),
  9334         -                       wxT("spatialite_gui"), wxOK | wxICON_ERROR, this);
  9335         -          sqlite3_free(errMsg);
  9336         -          return;
  9337         -        }
  9338         -      if (rows < 1)
  9339         -        ;
  9340         -      else
  9341         -        {
  9342         -          sql = wxT("SELECT ROWID, ");
  9343         -          for (i = 1; i <= rows; i++)
  9344         -            {
  9345         -              column = results[(i * columns) + 1];
  9346         -              sql += wxT("\"");
  9347         -              xname = (char *) malloc(strlen(column) + 1);
  9348         -              strcpy(xname, column);
  9349         -              xname2 = gaiaDoubleQuotedSql(xname);
  9350         -              free(xname);
  9351         -              sql += wxString::FromUTF8(xname2);
  9352         -              sql += wxT("\"");
  9353         -              free(xname2);
  9354         -              type = results[(i * columns) + 2];
  9355         -              if (i < rows)
  9356         -                sql += wxT(", ");
  9357         -            }
  9358         -        }
  9359         -      sqlite3_free_table(results);
  9360         -      if (sql.Len() < 1)
  9361         -        return;
  9362         -      sql += wxT("\nFROM \"");
  9363         -      xname = (char *) malloc((obj->GetVirtName().Len() * 4) + 1);
  9364         -      strcpy(xname, obj->GetVirtName().ToUTF8());
  9365         -      xname2 = gaiaDoubleQuotedSql(xname);
  9366         -      free(xname);
  9367         -      sql += wxString::FromUTF8(xname2);
  9368         -      free(xname2);
  9369         -      if (isView != true)
  9370         -        sql += wxT("\"\nORDER BY ROWID");
  9371         -      else
  9372         -        sql += wxT("\"");
  9373         -      wxString prefix = wxT("MAIN");
  9374         -      wxString noGeom;
  9375         -      MainFrame->InitializeSqlFilters(prefix, obj->GetVirtName(), false,
  9376         -                                      noGeom);
  9377         -      MainFrame->EditTable(sql, primaryKeys, blobCols, obj->GetVirtName());
  9378         -      return;
  9379         -    }
  9380   8588     isView = MainFrame->IsView(obj->GetMainName());
  9381   8589     sql = wxT("PRAGMA table_info(\"");
  9382   8590     xname = (char *) malloc((obj->GetMainName().Len() * 4) + 1);
  9383   8591     strcpy(xname, obj->GetMainName().ToUTF8());
  9384   8592     xname2 = gaiaDoubleQuotedSql(xname);
  9385   8593     free(xname);
  9386   8594     sql += wxString::FromUTF8(xname2);
................................................................................
 10911  10119   err:
 10912  10120     ::wxEndBusyCursor();
 10913  10121     wxMessageBox(wxT("Error: unable to remove Topology-Network '") +
 10914  10122                  obj->GetMainName() + wxT("'"), wxT("spatialite_gui"),
 10915  10123                  wxOK | wxICON_WARNING, this);
 10916  10124   }
 10917  10125   
 10918         -void MyTableTree::OnCmdCreatePostgreSqlConn(wxCommandEvent & WXUNUSED(event))
 10919         -{
 10920         -//
 10921         -// menu event - creating a new connection to a PostgreSQL DBMS
 10922         -//
 10923         -  MainFrame->DoPostgreSqlConnection();
 10924         -}
 10925         -
 10926         -void MyTableTree::OnCmdCloseAllPostgreSqlConns(wxCommandEvent & WXUNUSED(event))
 10927         -{
 10928         -//
 10929         -// menu event - closing all connections to PostgreSQL
 10930         -//
 10931         -  ::wxBeginBusyCursor();
 10932         -  MainFrame->AutoPostgresStop();
 10933         -  ::wxEndBusyCursor();
 10934         -  wxCommandEvent evt(wxEVT_COMMAND_MENU_SELECTED, Tree_RefreshDeferred);
 10935         -  AddPendingEvent(evt);
 10936         -}
 10937         -
 10938         -void MyTableTree::OnCmdClosePostgreSqlConn(wxCommandEvent & WXUNUSED(event))
 10939         -{
 10940         -//
 10941         -// menu event - closing a connection to PostgreSQL
 10942         -//
 10943         -  MyObject *obj = (MyObject *) GetItemData(CurrentItem);
 10944         -  ::wxBeginBusyCursor();
 10945         -  bool ret =
 10946         -    MainFrame->DoClosePostgreSqlConn(obj->GetHost(), obj->GetHostAddr(),
 10947         -                                     obj->GetPort(), obj->GetDbName(),
 10948         -                                     obj->GetUser());
 10949         -  ::wxEndBusyCursor();
 10950         -  if (ret == true)
 10951         -    {
 10952         -      wxCommandEvent evt(wxEVT_COMMAND_MENU_SELECTED, Tree_RefreshDeferred);
 10953         -      AddPendingEvent(evt);
 10954         -    }
 10955         -}
 10956         -
 10957         -void MyTableTree::OnCmdPostgreSqlDropOrphans(wxCommandEvent & WXUNUSED(event))
 10958         -{
 10959         -//
 10960         -// menu event - Dropping all PostgreSQL orphans
 10961         -//
 10962         -  bool refresh = false;
 10963         -  int ret;
 10964         -  char *errMsg = NULL;
 10965         -  ::wxBeginBusyCursor();
 10966         -  char *sql = MainFrame->DropPostgreSqlOrphans();
 10967         -  if (sql != NULL)
 10968         -    {
 10969         -      // exec
 10970         -      ret = sqlite3_exec(MainFrame->GetSqlite(), sql, NULL, 0, &errMsg);
 10971         -      sqlite3_free(sql);
 10972         -      if (ret != SQLITE_OK)
 10973         -        {
 10974         -          wxMessageBox(wxT("DropPostgresOrphans: ") +
 10975         -                       wxString::FromUTF8(errMsg), wxT("spatialite_gui"),
 10976         -                       wxOK | wxICON_ERROR, this);
 10977         -          sqlite3_free(errMsg);
 10978         -          return;
 10979         -        }
 10980         -      refresh = true;
 10981         -    }
 10982         -  ::wxEndBusyCursor();
 10983         -  if (refresh == true)
 10984         -    {
 10985         -      wxCommandEvent evt(wxEVT_COMMAND_MENU_SELECTED, Tree_RefreshDeferred);
 10986         -      AddPendingEvent(evt);
 10987         -    }
 10988         -}
 10989         -
 10990         -void MyTableTree::OnCmdPostgreSqlInfos(wxCommandEvent & WXUNUSED(event))
 10991         -{
 10992         -//
 10993         -// menu event - Infos about some PostgreSQL object
 10994         -//
 10995         -  char dummy[128];
 10996         -  wxString msg;
 10997         -  MyPostgresTable *table;
 10998         -  MyObject *obj = (MyObject *) GetItemData(CurrentItem);
 10999         -  switch (obj->GetType())
 11000         -    {
 11001         -      case MY_POSTGRES_CONN:
 11002         -        msg = wxT("Connection to PostgreSQL\n\n");
 11003         -        msg += wxT("Host: ") + obj->GetHost() + wxT("\n");
 11004         -        msg += wxT("HostAddr: ") + obj->GetHostAddr() + wxT("\n");
 11005         -        sprintf(dummy, "%d", obj->GetPort());
 11006         -        msg += wxT("Port: ") + wxString::FromUTF8(dummy) + wxT("\n");
 11007         -        msg += wxT("DbName: ") + obj->GetDbName() + wxT("\n");
 11008         -        msg += wxT("User: ") + obj->GetUser() + wxT("\n\n");
 11009         -        if (obj->IsReadOnly() == true)
 11010         -          msg += wxT("READ-ONLY Connection");
 11011         -        else
 11012         -          msg += wxT("READ-WRITE Connection");
 11013         -        break;
 11014         -      case MY_POSTGRES_SCHEMA:
 11015         -        msg += wxT("Role: PostgreSQL Schema\n");
 11016         -        msg += wxT("PostgreSQL Name: ") + obj->GetSchema() + wxT("\n");
 11017         -        break;
 11018         -      case MY_POSTGRES_TABLE:
 11019         -        msg += wxT("Role: PostgreSQL Table\n");
 11020         -        msg +=
 11021         -          wxT("PostgreSQL Name: ") + obj->GetSchema() + wxT(".") +
 11022         -          obj->GetName() + wxT("\n\n");
 11023         -        table = MainFrame->FindPostgresTable(obj->GetVirtName());
 11024         -        if (table != NULL)
 11025         -          {
 11026         -            MyPostGisGeometry *geom = table->GetFirst();
 11027         -            while (geom != NULL)
 11028         -              {
 11029         -                msg += wxT("PostGIS Geometry: ") + geom->GetName();
 11030         -                msg += wxT(" ") + geom->GetGeomType();
 11031         -                char dummy[64];
 11032         -                sprintf(dummy, "%d", geom->GetSrid());
 11033         -                wxString xSrid = wxString::FromUTF8(dummy);
 11034         -                msg += wxT(" srid=") + xSrid;
 11035         -                sprintf(dummy, "%d", geom->GetDims());
 11036         -                wxString xDims = wxString::FromUTF8(dummy);
 11037         -                msg += wxT(" dims=") + xDims + wxT("\n");
 11038         -                geom = geom->GetNext();
 11039         -              }
 11040         -            if (table->GetFirst() != NULL)
 11041         -              msg += wxT("\n");
 11042         -          }
 11043         -        if (obj->HasPK() == true)
 11044         -          msg += wxT("Primary Key: YES\n");
 11045         -        else
 11046         -          msg += wxT("Primary Key: NO\n");
 11047         -        if (obj->CanSelect() == true)
 11048         -          msg += wxT("Select permission: YES\n");
 11049         -        else
 11050         -          msg += wxT("Select permission: NO\n");
 11051         -        if (obj->CanInsertUpdateDelete() == true)
 11052         -          msg += wxT("Insert/Update/Delete permission: YES\n");
 11053         -        else
 11054         -          msg += wxT("Insert/Update/Delete permission: NO\n");
 11055         -        wxT("\n");
 11056         -        if (obj->IsReadOnly() == true)
 11057         -          msg += wxT("\nREAD-ONLY Connection");
 11058         -        else
 11059         -          msg += wxT("\nREAD-WRITE Connection");
 11060         -        break;
 11061         -      case MY_POSTGRES_VIEW:
 11062         -        msg += wxT("Role: PostgreSQL View\n");
 11063         -        msg +=
 11064         -          wxT("PostgreSQL Name: ") + obj->GetSchema() + wxT(".") +
 11065         -          obj->GetName() + wxT("\n\n");
 11066         -        if (obj->HasPK() == true)
 11067         -          msg += wxT("Primary Key: YES\n");
 11068         -        else
 11069         -          msg += wxT("Primary Key: NO\n");
 11070         -        if (obj->CanSelect() == true)
 11071         -          msg += wxT("Select permission: YES\n");
 11072         -        else
 11073         -          msg += wxT("Select permission: NO\n");
 11074         -        if (obj->CanInsertUpdateDelete() == true)
 11075         -          msg += wxT("Insert/Update/Delete permission: YES\n");
 11076         -        else
 11077         -          msg += wxT("Insert/Update/Delete permission: NO\n");
 11078         -        if (obj->IsReadOnly() == true)
 11079         -          msg += wxT("\nREAD-ONLY Connection");
 11080         -        else
 11081         -          msg += wxT("\nREAD-WRITE Connection");
 11082         -        break;
 11083         -      case MY_POSTGIS_VIEW:
 11084         -        msg += wxT("Role: PostGIS Table wrapper (Spatial View)\n");
 11085         -        msg +=
 11086         -          wxT("PostgreSQL Name: ") + obj->GetSchema() + wxT(".") +
 11087         -          obj->GetName() + wxT("\n\n");
 11088         -        table = MainFrame->FindPostGisView(obj->GetVirtName());
 11089         -        if (table != NULL)
 11090         -          {
 11091         -            MyPostGisGeometry *geom = table->GetFirst();
 11092         -            while (geom != NULL)
 11093         -              {
 11094         -                msg += wxT("PostGIS Geometry: ") + geom->GetName();
 11095         -                msg += wxT(" ") + geom->GetGeomType();
 11096         -                char dummy[64];
 11097         -                sprintf(dummy, "%d", geom->GetSrid());
 11098         -                wxString xSrid = wxString::FromUTF8(dummy);
 11099         -                msg += wxT(" srid=") + xSrid;
 11100         -                sprintf(dummy, "%d", geom->GetDims());
 11101         -                wxString xDims = wxString::FromUTF8(dummy);
 11102         -                msg += wxT(" dims=") + xDims + wxT("\n");
 11103         -                geom = geom->GetNext();
 11104         -              }
 11105         -            if (table->GetFirst() != NULL)
 11106         -              msg += wxT("\n");
 11107         -          }
 11108         -        if (obj->HasPK() == true)
 11109         -          msg += wxT("Primary Key: YES\n");
 11110         -        else
 11111         -          msg += wxT("Primary Key: NO\n");
 11112         -        if (obj->CanSelect() == true)
 11113         -          msg += wxT("Select permission: YES\n");
 11114         -        else
 11115         -          msg += wxT("Select permission: NO\n");
 11116         -        if (obj->CanInsertUpdateDelete() == true)
 11117         -          msg += wxT("Insert/Update/Delete permission: YES\n");
 11118         -        else
 11119         -          msg += wxT("Insert/Update/Delete permission: NO\n");
 11120         -        if (obj->IsReadOnly() == true)
 11121         -          msg += wxT("\nREAD-ONLY Connection");
 11122         -        else
 11123         -          msg += wxT("\nREAD-WRITE Connection");
 11124         -        break;
 11125         -    };
 11126         -  if (msg.Len() > 0)
 11127         -    wxMessageBox(msg, wxT("spatialite_gui"), wxOK | wxICON_INFORMATION, this);
 11128         -}
 11129         -
 11130  10126   sqlite3 *MyTableTree::GetSQLiteHandle()
 11131  10127   {
 11132  10128     return MainFrame->GetSqlite();
 11133  10129   }

Changes to TextCsv.cpp.

     1      1   /*
     2      2   / TextCsv.cpp
     3      3   / methods related to CSV/TXT loading 
     4      4   /
     5      5   / version 1.7, 2013 May 8
     6      6   /
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
     8      8   /
     9      9   / Copyright (C) 2008-2013  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
    13     13   /    the Free Software Foundation, either version 3 of the License, or
    14     14   /    (at your option) any later version.

Changes to VectorSymbolizers1.cpp.

     1      1   /*
     2      2   / VectorSymbolizers1.cpp
     3      3   / various dialog classes
     4      4   /
     5      5   / version 1.8, 2015 March 28
     6      6   /
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
     8      8   /
     9      9   / Copyright (C) 2015  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
    13     13   /    the Free Software Foundation, either version 3 of the License, or
    14     14   /    (at your option) any later version.
................................................................................
 10048  10048       xml = DoCreateSymbolizerXML();
 10049  10049     bool ret = MainFrame->DoInsertVectorSymbolizer(xml);
 10050  10050     sqlite3_free(xml);
 10051  10051     if (ret == true)
 10052  10052       wxMessageBox(wxT
 10053  10053                    ("SLD/SE VectorSymbolizer successfully registered into the DBMS"),
 10054  10054                    wxT("spatialite_gui"), wxOK | wxICON_INFORMATION, this);
        10055  +  wxDialog::EndModal(wxID_OK);
 10055  10056     wxDialog::EndModal(wxID_OK);
 10056  10057   }
 10057  10058   
 10058  10059   void SimplePolygonSymbolizerDialog::OnExport(wxCommandEvent & WXUNUSED(event))
 10059  10060   {
 10060  10061   //
 10061  10062   // exporting the VectorSymbolizer as an external file

Changes to VectorSymbolizers2.cpp.

     1      1   /*
     2      2   / VectorSymbolizers2.cpp
     3      3   / various dialog classes
     4      4   /
     5      5   / version 1.8, 2015 April 21
     6      6   /
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
     8      8   /
     9      9   / Copyright (C) 2015  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
    13     13   /    the Free Software Foundation, either version 3 of the License, or
    14     14   /    (at your option) any later version.
................................................................................
  5496   5496     sqlite3_free(prev);
  5497   5497     prev = xml;
  5498   5498     xml = sqlite3_mprintf("%s\t\t\t<Font>\r\n", prev);
  5499   5499     sqlite3_free(prev);
  5500   5500     prev = xml;
  5501   5501     str = new char[strlen(FontFamily.ToUTF8()) + 1];
  5502   5502     strcpy(str, FontFamily.ToUTF8());
  5503         -  const char *font;
  5504         -  if (strcmp(str, "ToyFont: serif") == 0)
  5505         -    font = "serif";
  5506         -  else if (strcmp(str, "ToyFont: sans-serif") == 0)
  5507         -    font = "sans serif";
  5508         -  else if (strcmp(str, "ToyFont: monospace") == 0)
  5509         -    font = "monospace";
  5510         -  else
  5511         -    font = str;
  5512   5503     xml =
  5513   5504       sqlite3_mprintf
  5514   5505       ("%s\t\t\t\t<SvgParameter name=\"font-family\">%s</SvgParameter>\r\n", prev,
  5515         -     font);
         5506  +     str);
  5516   5507     delete[]str;
  5517   5508     sqlite3_free(prev);
  5518   5509     prev = xml;
  5519   5510     if (FontStyle == RL2_FONTSTYLE_ITALIC)
  5520   5511       xml =
  5521   5512         sqlite3_mprintf
  5522   5513         ("%s\t\t\t\t<SvgParameter name=\"font-style\">italic</SvgParameter>\r\n",
................................................................................
  5823   5814     sqlite3_free(prev);
  5824   5815     prev = xml;
  5825   5816     xml = sqlite3_mprintf("%s\t<Font>\r\n", prev);
  5826   5817     sqlite3_free(prev);
  5827   5818     prev = xml;
  5828   5819     str = new char[strlen(FontFamily.ToUTF8()) + 1];
  5829   5820     strcpy(str, FontFamily.ToUTF8());
  5830         -  const char *font;
  5831         -  if (strcmp(str, "ToyFont: serif") == 0)
  5832         -    font = "serif";
  5833         -  else if (strcmp(str, "ToyFont: sans-serif") == 0)
  5834         -    font = "sans serif";
  5835         -  else if (strcmp(str, "ToyFont: monospace") == 0)
  5836         -    font = "monospace";
  5837         -  else
  5838         -    font = str;
  5839   5821     xml =
  5840   5822       sqlite3_mprintf
  5841   5823       ("%s\t\t<SvgParameter name=\"font-family\">%s</SvgParameter>\r\n", prev,
  5842         -     font);
         5824  +     str);
  5843   5825     delete[]str;
  5844   5826     sqlite3_free(prev);
  5845   5827     prev = xml;
  5846   5828     if (FontStyle == RL2_FONTSTYLE_ITALIC)
  5847   5829       xml =
  5848   5830         sqlite3_mprintf
  5849   5831         ("%s\t\t<SvgParameter name=\"font-style\">italic</SvgParameter>\r\n",

Changes to Wfs.cpp.

     1      1   /*
     2      2   / Wfs.cpp
     3      3   / WFS load data
     4      4   /
     5      5   / version 1.7, 2013 May 8
     6      6   /
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
     8      8   /
     9      9   / Copyright (C) 2008-2013  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
    13     13   /    the Free Software Foundation, either version 3 of the License, or
    14     14   /    (at your option) any later version.

Changes to WmsDialog.cpp.

     1      1   /*
     2      2   / WmsDialog.cpp
     3      3   / various dialog classes supporting WMS datasources
     4      4   /
     5      5   / version 2.0, 2016 December 13
     6      6   /
     7         -/ Author: Sandro Furieri a.furieri@lqt.it
            7  +/ Author: Sandro Furieri a-furieri@lqt.it
     8      8   /
     9      9   / Copyright (C) 2016  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
    13     13   /    the Free Software Foundation, either version 3 of the License, or
    14     14   /    (at your option) any later version.
................................................................................
   697    697   
   698    698   void WmsDialog::OnWmsServer(wxCommandEvent & WXUNUSED(event))
   699    699   {
   700    700   //
   701    701   // searching a registered WMS server
   702    702   //
   703    703     WmsServersDialog dlg;
   704         -  dlg.Create(MainFrame);
          704  +  dlg.Create(this, MainFrame);
   705    705     int ret = dlg.ShowModal();
   706    706     if (ret == wxID_OK)
   707    707       {
   708    708         wxTextCtrl *urlCtrl = (wxTextCtrl *) FindWindow(ID_WMS_URL);
   709    709         urlCtrl->SetValue(dlg.GetURL());
   710    710       }
   711    711   }
................................................................................
  1156   1156     else
  1157   1157       HttpProxy = proxyCtrl->GetValue();
  1158   1158     wxTextCtrl *urlCtrl = (wxTextCtrl *) FindWindow(ID_WMS_URL);
  1159   1159     URL = urlCtrl->GetValue();
  1160   1160     wxDialog::EndModal(wxID_OK);
  1161   1161   }
  1162   1162   
  1163         -bool WmsServersDialog::Create(MyFrame * grandparent)
         1163  +bool WmsServersDialog::Create(WmsDialog * parent, MyFrame * grandparent)
  1164   1164   {
  1165   1165   //
  1166   1166   // creating the dialog
  1167   1167   //
  1168   1168     MainFrame = grandparent;
  1169   1169     List = NULL;
  1170   1170     Count = 0;
................................................................................
  1804   1804   // populates individual controls
  1805   1805     CreateControls();
  1806   1806   // sets dialog sizer
  1807   1807     GetSizer()->Fit(this);
  1808   1808     GetSizer()->SetSizeHints(this);
  1809   1809   // centers the dialog window
  1810   1810     Centre();
         1811  +  int count = 0;
  1811   1812     return true;
  1812   1813   }
  1813   1814   
  1814   1815   void WmsLayerInfosDialog::CreateControls()
  1815   1816   {
  1816   1817   //
  1817   1818   // creating individual control and setting initial values
................................................................................
  2170   2171             return;
  2171   2172           }
  2172   2173       }
  2173   2174     DoUpdateWmsLayer();
  2174   2175     wxDialog::EndModal(wxID_OK);
  2175   2176   }
  2176   2177   
  2177         -WmsLayerConfigDialog::~WmsLayerConfigDialog()
  2178         -{
  2179         -  if (Version != NULL)
  2180         -    free(Version);
  2181         -  if (MaxVersion != NULL)
  2182         -    free(MaxVersion);
  2183         -  if (RefSys != NULL)
  2184         -    free(RefSys);
  2185         -  if (Style != NULL)
  2186         -    free(Style);
  2187         -  if (ImageFormat != NULL)
  2188         -    free(ImageFormat);
  2189         -  if (BgColor != NULL)
  2190         -    free(BgColor);
  2191         -}
  2192         -
  2193   2178   bool WmsLayerConfigDialog::Create(MyFrame * parent, wxString url,
  2194   2179                                     wxString layer)
  2195   2180   {
  2196   2181   //
  2197   2182   // creating the dialog
  2198   2183   //
  2199   2184     MainFrame = parent;
................................................................................
  2753   2738       ("SELECT version, srs, format, style, is_queryable, flip_axes, "
  2754   2739        "is_cached, tiled, tile_width, tile_height, bgcolor, transparent "
  2755   2740        "FROM \"%s\".wms_getmap WHERE url = %Q AND layer_name = %Q",
  2756   2741        xdb_prefix, url, layer);
  2757   2742     free(url);
  2758   2743     free(layer);
  2759   2744     free(xdb_prefix);
         2745  +  fprintf(stderr, "%s\n", sql);
  2760   2746     ret =
  2761   2747       sqlite3_get_table(MainFrame->GetSqlite(), sql, &results, &rows, &columns,
  2762   2748                         NULL);
  2763   2749     sqlite3_free(sql);
  2764   2750     if (ret != SQLITE_OK)
  2765   2751       {
  2766   2752         Version = NULL;
................................................................................
  2838   2824           }
  2839   2825         if (bgcolor == NULL)
  2840   2826           BgColor = NULL;
  2841   2827         else
  2842   2828           {
  2843   2829             if (strlen(bgcolor) == 6)
  2844   2830               {
  2845         -              BgColor = (char *) malloc(7);
  2846         -              strcpy(BgColor, bgcolor);
         2831  +              BgColor = (char *) malloc(6);
         2832  +              memcpy(BgColor, bgcolor, 6);
  2847   2833             } else
  2848   2834               BgColor = NULL;
  2849   2835           }
  2850   2836       }
  2851   2837     sqlite3_free_table(results);
  2852   2838   }
  2853   2839   
................................................................................
  3103   3089   // BgColor Enabled selection changed
  3104   3090   //
  3105   3091     wxBitmapButton *btn = (wxBitmapButton *) FindWindow(ID_WMS_BGCOLOR);
  3106   3092     if (BgColorEnabled == false)
  3107   3093       {
  3108   3094         if (BgColor != NULL)
  3109   3095           free(BgColor);
  3110         -      BgColor = (char *) malloc(7);
  3111         -      strcpy(BgColor, "ffffff");
         3096  +      BgColor = (char *) malloc(6);
         3097  +      memcpy(BgColor, "ffffff", 6);
  3112   3098         wxBitmap bmp;
  3113   3099         GetButtonBitmap(BgColor, bmp);
  3114   3100         btn->SetBitmapLabel(bmp);
  3115   3101         BgColorEnabled = true;
  3116   3102         btn->Enable(true);
  3117   3103     } else
  3118   3104       {
................................................................................
  3147   3133         char byte[3];
  3148   3134         sprintf(byte, "%02x", color.Red());
  3149   3135         memcpy(BgColor, byte, 2);
  3150   3136         sprintf(byte, "%02x", color.Green());
  3151   3137         memcpy(BgColor + 2, byte, 2);
  3152   3138         sprintf(byte, "%02x", color.Blue());
  3153   3139         memcpy(BgColor + 4, byte, 2);
  3154         -      *(BgColor + 6) = '\0';
  3155   3140         wxBitmap bmp;
  3156   3141         GetButtonBitmap(BgColor, bmp);
  3157   3142         wxBitmapButton *bgColorCtrl =
  3158   3143           (wxBitmapButton *) FindWindow(ID_WMS_BGCOLOR);
  3159   3144         bgColorCtrl->SetBitmapLabel(bmp);
  3160   3145       }
  3161   3146   }

Changes to aclocal.m4.

     1         -# generated automatically by aclocal 1.15.1 -*- Autoconf -*-
            1  +# generated automatically by aclocal 1.15 -*- Autoconf -*-
     2      2   
     3         -# Copyright (C) 1996-2017 Free Software Foundation, Inc.
            3  +# Copyright (C) 1996-2014 Free Software Foundation, Inc.
     4      4   
     5      5   # This file is free software; the Free Software Foundation
     6      6   # gives unlimited permission to copy and/or distribute it,
     7      7   # with or without modifications, as long as this notice is preserved.
     8      8   
     9      9   # This program is distributed in the hope that it will be useful,
    10     10   # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
................................................................................
    16     16     [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
    17     17   m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
    18     18   [m4_warning([this file was generated for autoconf 2.69.
    19     19   You have another version of autoconf.  It may work, but is not guaranteed to.
    20     20   If you have problems, you may need to regenerate the build system entirely.
    21     21   To do so, use the procedure documented by the package, typically 'autoreconf'.])])
    22     22   
    23         -# pkg.m4 - Macros to locate and utilise pkg-config.   -*- Autoconf -*-
    24         -# serial 11 (pkg-config-0.29.1)
    25         -
           23  +dnl pkg.m4 - Macros to locate and utilise pkg-config.   -*- Autoconf -*-
           24  +dnl serial 11 (pkg-config-0.29.1)
           25  +dnl
    26     26   dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
    27     27   dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
    28     28   dnl
    29     29   dnl This program is free software; you can redistribute it and/or modify
    30     30   dnl it under the terms of the GNU General Public License as published by
    31     31   dnl the Free Software Foundation; either version 2 of the License, or
    32     32   dnl (at your option) any later version.
................................................................................
   292    292   
   293    293   _PKG_CONFIG([$1], [variable="][$3]["], [$2])
   294    294   AS_VAR_COPY([$1], [pkg_cv_][$1])
   295    295   
   296    296   AS_VAR_IF([$1], [""], [$5], [$4])dnl
   297    297   ])dnl PKG_CHECK_VAR
   298    298   
   299         -dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES,
   300         -dnl   [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND],
   301         -dnl   [DESCRIPTION], [DEFAULT])
   302         -dnl ------------------------------------------
   303         -dnl
   304         -dnl Prepare a "--with-" configure option using the lowercase
   305         -dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and
   306         -dnl PKG_CHECK_MODULES in a single macro.
   307         -AC_DEFUN([PKG_WITH_MODULES],
   308         -[
   309         -m4_pushdef([with_arg], m4_tolower([$1]))
   310         -
   311         -m4_pushdef([description],
   312         -           [m4_default([$5], [build with ]with_arg[ support])])
   313         -
   314         -m4_pushdef([def_arg], [m4_default([$6], [auto])])
   315         -m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes])
   316         -m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no])
   317         -
   318         -m4_case(def_arg,
   319         -            [yes],[m4_pushdef([with_without], [--without-]with_arg)],
   320         -            [m4_pushdef([with_without],[--with-]with_arg)])
   321         -
   322         -AC_ARG_WITH(with_arg,
   323         -     AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),,
   324         -    [AS_TR_SH([with_]with_arg)=def_arg])
   325         -
   326         -AS_CASE([$AS_TR_SH([with_]with_arg)],
   327         -            [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)],
   328         -            [auto],[PKG_CHECK_MODULES([$1],[$2],
   329         -                                        [m4_n([def_action_if_found]) $3],
   330         -                                        [m4_n([def_action_if_not_found]) $4])])
   331         -
   332         -m4_popdef([with_arg])
   333         -m4_popdef([description])
   334         -m4_popdef([def_arg])
   335         -
   336         -])dnl PKG_WITH_MODULES
   337         -
   338         -dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES,
   339         -dnl   [DESCRIPTION], [DEFAULT])
   340         -dnl -----------------------------------------------
   341         -dnl
   342         -dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES
   343         -dnl check._[VARIABLE-PREFIX] is exported as make variable.
   344         -AC_DEFUN([PKG_HAVE_WITH_MODULES],
   345         -[
   346         -PKG_WITH_MODULES([$1],[$2],,,[$3],[$4])
   347         -
   348         -AM_CONDITIONAL([HAVE_][$1],
   349         -               [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"])
   350         -])dnl PKG_HAVE_WITH_MODULES
   351         -
   352         -dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES,
   353         -dnl   [DESCRIPTION], [DEFAULT])
   354         -dnl ------------------------------------------------------
   355         -dnl
   356         -dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after
   357         -dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make
   358         -dnl and preprocessor variable.
   359         -AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES],
   360         -[
   361         -PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4])
   362         -
   363         -AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"],
   364         -        [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])])
   365         -])dnl PKG_HAVE_DEFINE_WITH_MODULES
   366         -
   367         -# Copyright (C) 2002-2017 Free Software Foundation, Inc.
          299  +# Copyright (C) 2002-2014 Free Software Foundation, Inc.
   368    300   #
   369    301   # This file is free software; the Free Software Foundation
   370    302   # gives unlimited permission to copy and/or distribute it,
   371    303   # with or without modifications, as long as this notice is preserved.
   372    304   
   373    305   # AM_AUTOMAKE_VERSION(VERSION)
   374    306   # ----------------------------
................................................................................
   375    307   # Automake X.Y traces this macro to ensure aclocal.m4 has been
   376    308   # generated from the m4 files accompanying Automake X.Y.
   377    309   # (This private macro should not be called outside this file.)
   378    310   AC_DEFUN([AM_AUTOMAKE_VERSION],
   379    311   [am__api_version='1.15'
   380    312   dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
   381    313   dnl require some minimum version.  Point them to the right macro.
   382         -m4_if([$1], [1.15.1], [],
          314  +m4_if([$1], [1.15], [],
   383    315         [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
   384    316   ])
   385    317   
   386    318   # _AM_AUTOCONF_VERSION(VERSION)
   387    319   # -----------------------------
   388    320   # aclocal traces this macro to find the Autoconf version.
   389    321   # This is a private macro too.  Using m4_define simplifies
................................................................................
   391    323   m4_define([_AM_AUTOCONF_VERSION], [])
   392    324   
   393    325   # AM_SET_CURRENT_AUTOMAKE_VERSION
   394    326   # -------------------------------
   395    327   # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
   396    328   # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
   397    329   AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
   398         -[AM_AUTOMAKE_VERSION([1.15.1])dnl
          330  +[AM_AUTOMAKE_VERSION([1.15])dnl
   399    331   m4_ifndef([AC_AUTOCONF_VERSION],
   400    332     [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
   401    333   _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
   402    334   
   403    335   # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
   404    336   
   405         -# Copyright (C) 2001-2017 Free Software Foundation, Inc.
          337  +# Copyright (C) 2001-2014 Free Software Foundation, Inc.
   406    338   #
   407    339   # This file is free software; the Free Software Foundation
   408    340   # gives unlimited permission to copy and/or distribute it,
   409    341   # with or without modifications, as long as this notice is preserved.
   410    342   
   411    343   # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
   412    344   # $ac_aux_dir to '$srcdir/foo'.  In other projects, it is set to
................................................................................
   450    382   [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
   451    383   # Expand $ac_aux_dir to an absolute path.
   452    384   am_aux_dir=`cd "$ac_aux_dir" && pwd`
   453    385   ])
   454    386   
   455    387   # AM_CONDITIONAL                                            -*- Autoconf -*-
   456    388   
   457         -# Copyright (C) 1997-2017 Free Software Foundation, Inc.
          389  +# Copyright (C) 1997-2014 Free Software Foundation, Inc.
   458    390   #
   459    391   # This file is free software; the Free Software Foundation
   460    392   # gives unlimited permission to copy and/or distribute it,
   461    393   # with or without modifications, as long as this notice is preserved.
   462    394   
   463    395   # AM_CONDITIONAL(NAME, SHELL-CONDITION)
   464    396   # -------------------------------------
................................................................................
   481    413   fi
   482    414   AC_CONFIG_COMMANDS_PRE(
   483    415   [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
   484    416     AC_MSG_ERROR([[conditional "$1" was never defined.
   485    417   Usually this means the macro was only invoked conditionally.]])
   486    418   fi])])
   487    419   
   488         -# Copyright (C) 1999-2017 Free Software Foundation, Inc.
          420  +# Copyright (C) 1999-2014 Free Software Foundation, Inc.
   489    421   #
   490    422   # This file is free software; the Free Software Foundation
   491    423   # gives unlimited permission to copy and/or distribute it,
   492    424   # with or without modifications, as long as this notice is preserved.
   493    425   
   494    426   
   495    427   # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
................................................................................
   672    604   _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
   673    605   AC_SUBST([am__nodep])dnl
   674    606   _AM_SUBST_NOTMAKE([am__nodep])dnl
   675    607   ])
   676    608   
   677    609   # Generate code to set up dependency tracking.              -*- Autoconf -*-
   678    610   
   679         -# Copyright (C) 1999-2017 Free Software Foundation, Inc.
          611  +# Copyright (C) 1999-2014 Free Software Foundation, Inc.
   680    612   #
   681    613   # This file is free software; the Free Software Foundation
   682    614   # gives unlimited permission to copy and/or distribute it,
   683    615   # with or without modifications, as long as this notice is preserved.
   684    616   
   685    617   
   686    618   # _AM_OUTPUT_DEPENDENCY_COMMANDS
................................................................................
   748    680   [AC_CONFIG_COMMANDS([depfiles],
   749    681        [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
   750    682        [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
   751    683   ])
   752    684   
   753    685   # Do all the work for Automake.                             -*- Autoconf -*-
   754    686   
   755         -# Copyright (C) 1996-2017 Free Software Foundation, Inc.
          687  +# Copyright (C) 1996-2014 Free Software Foundation, Inc.
   756    688   #
   757    689   # This file is free software; the Free Software Foundation
   758    690   # gives unlimited permission to copy and/or distribute it,
   759    691   # with or without modifications, as long as this notice is preserved.
   760    692   
   761    693   # This macro actually does too much.  Some checks are only needed if
   762    694   # your package does certain things.  But this isn't really a big deal.
................................................................................
   945    877         break ;;
   946    878       * )
   947    879         _am_stamp_count=`expr $_am_stamp_count + 1` ;;
   948    880     esac
   949    881   done
   950    882   echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
   951    883   
   952         -# Copyright (C) 2001-2017 Free Software Foundation, Inc.
          884  +# Copyright (C) 2001-2014 Free Software Foundation, Inc.
   953    885   #
   954    886   # This file is free software; the Free Software Foundation
   955    887   # gives unlimited permission to copy and/or distribute it,
   956    888   # with or without modifications, as long as this notice is preserved.
   957    889   
   958    890   # AM_PROG_INSTALL_SH
   959    891   # ------------------
................................................................................
   966    898       install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
   967    899     *)
   968    900       install_sh="\${SHELL} $am_aux_dir/install-sh"
   969    901     esac
   970    902   fi
   971    903   AC_SUBST([install_sh])])
   972    904   
   973         -# Copyright (C) 2003-2017 Free Software Foundation, Inc.
          905  +# Copyright (C) 2003-2014 Free Software Foundation, Inc.
   974    906   #
   975    907   # This file is free software; the Free Software Foundation
   976    908   # gives unlimited permission to copy and/or distribute it,
   977    909   # with or without modifications, as long as this notice is preserved.
   978    910   
   979    911   # Check whether the underlying file-system supports filenames
   980    912   # with a leading dot.  For instance MS-DOS doesn't.
................................................................................
   988    920   fi
   989    921   rmdir .tst 2>/dev/null
   990    922   AC_SUBST([am__leading_dot])])
   991    923   
   992    924   # Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
   993    925   # From Jim Meyering
   994    926   
   995         -# Copyright (C) 1996-2017 Free Software Foundation, Inc.
          927  +# Copyright (C) 1996-2014 Free Software Foundation, Inc.
   996    928   #
   997    929   # This file is free software; the Free Software Foundation
   998    930   # gives unlimited permission to copy and/or distribute it,
   999    931   # with or without modifications, as long as this notice is preserved.
  1000    932   
  1001    933   # AM_MAINTAINER_MODE([DEFAULT-MODE])
  1002    934   # ----------------------------------
................................................................................
  1023    955     MAINT=$MAINTAINER_MODE_TRUE
  1024    956     AC_SUBST([MAINT])dnl
  1025    957   ]
  1026    958   )
  1027    959   
  1028    960   # Check to see how 'make' treats includes.	            -*- Autoconf -*-
  1029    961   
  1030         -# Copyright (C) 2001-2017 Free Software Foundation, Inc.
          962  +# Copyright (C) 2001-2014 Free Software Foundation, Inc.
  1031    963   #
  1032    964   # This file is free software; the Free Software Foundation
  1033    965   # gives unlimited permission to copy and/or distribute it,
  1034    966   # with or without modifications, as long as this notice is preserved.
  1035    967   
  1036    968   # AM_MAKE_INCLUDE()
  1037    969   # -----------------
................................................................................
  1073   1005   AC_SUBST([am__quote])
  1074   1006   AC_MSG_RESULT([$_am_result])
  1075   1007   rm -f confinc confmf
  1076   1008   ])
  1077   1009   
  1078   1010   # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
  1079   1011   
  1080         -# Copyright (C) 1997-2017 Free Software Foundation, Inc.
         1012  +# Copyright (C) 1997-2014 Free Software Foundation, Inc.
  1081   1013   #
  1082   1014   # This file is free software; the Free Software Foundation
  1083   1015   # gives unlimited permission to copy and/or distribute it,
  1084   1016   # with or without modifications, as long as this notice is preserved.
  1085   1017   
  1086   1018   # AM_MISSING_PROG(NAME, PROGRAM)
  1087   1019   # ------------------------------
................................................................................
  1114   1046   fi
  1115   1047   ])
  1116   1048   
  1117   1049   #  -*- Autoconf -*-
  1118   1050   # Obsolete and "removed" macros, that must however still report explicit
  1119   1051   # error messages when used, to smooth transition.
  1120   1052   #
  1121         -# Copyright (C) 1996-2017 Free Software Foundation, Inc.
         1053  +# Copyright (C) 1996-2014 Free Software Foundation, Inc.
  1122   1054   #
  1123   1055   # This file is free software; the Free Software Foundation
  1124   1056   # gives unlimited permission to copy and/or distribute it,
  1125   1057   # with or without modifications, as long as this notice is preserved.
  1126   1058   
  1127   1059   AC_DEFUN([AM_CONFIG_HEADER],
  1128   1060   [AC_DIAGNOSE([obsolete],
................................................................................
  1141   1073   
  1142   1074   AC_DEFUN([AM_C_PROTOTYPES],
  1143   1075            [AC_FATAL([automatic de-ANSI-fication support has been removed])])
  1144   1076   AU_DEFUN([fp_C_PROTOTYPES], [AM_C_PROTOTYPES])
  1145   1077   
  1146   1078   # Helper functions for option handling.                     -*- Autoconf -*-
  1147   1079   
  1148         -# Copyright (C) 2001-2017 Free Software Foundation, Inc.
         1080  +# Copyright (C) 2001-2014 Free Software Foundation, Inc.
  1149   1081   #
  1150   1082   # This file is free software; the Free Software Foundation
  1151   1083   # gives unlimited permission to copy and/or distribute it,
  1152   1084   # with or without modifications, as long as this notice is preserved.
  1153   1085   
  1154   1086   # _AM_MANGLE_OPTION(NAME)
  1155   1087   # -----------------------
................................................................................
  1170   1102   
  1171   1103   # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
  1172   1104   # -------------------------------------------
  1173   1105   # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
  1174   1106   AC_DEFUN([_AM_IF_OPTION],
  1175   1107   [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
  1176   1108   
  1177         -# Copyright (C) 1999-2017 Free Software Foundation, Inc.
         1109  +# Copyright (C) 1999-2014 Free Software Foundation, Inc.
  1178   1110   #
  1179   1111   # This file is free software; the Free Software Foundation
  1180   1112   # gives unlimited permission to copy and/or distribute it,
  1181   1113   # with or without modifications, as long as this notice is preserved.
  1182   1114   
  1183   1115   # _AM_PROG_CC_C_O
  1184   1116   # ---------------
................................................................................
  1217   1149      CC="$am_aux_dir/compile $CC"
  1218   1150   fi
  1219   1151   AC_LANG_POP([C])])
  1220   1152   
  1221   1153   # For backward compatibility.
  1222   1154   AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
  1223   1155   
  1224         -# Copyright (C) 2001-2017 Free Software Foundation, Inc.
         1156  +# Copyright (C) 2001-2014 Free Software Foundation, Inc.
  1225   1157   #
  1226   1158   # This file is free software; the Free Software Foundation
  1227   1159   # gives unlimited permission to copy and/or distribute it,
  1228   1160   # with or without modifications, as long as this notice is preserved.
  1229   1161   
  1230   1162   # AM_RUN_LOG(COMMAND)
  1231   1163   # -------------------
................................................................................
  1236   1168      ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
  1237   1169      ac_status=$?
  1238   1170      echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
  1239   1171      (exit $ac_status); }])
  1240   1172   
  1241   1173   # Check to make sure that the build environment is sane.    -*- Autoconf -*-
  1242   1174   
  1243         -# Copyright (C) 1996-2017 Free Software Foundation, Inc.
         1175  +# Copyright (C) 1996-2014 Free Software Foundation, Inc.
  1244   1176   #
  1245   1177   # This file is free software; the Free Software Foundation
  1246   1178   # gives unlimited permission to copy and/or distribute it,
  1247   1179   # with or without modifications, as long as this notice is preserved.
  1248   1180   
  1249   1181   # AM_SANITY_CHECK
  1250   1182   # ---------------
................................................................................
  1317   1249        # Hide warnings about reused PIDs.
  1318   1250        wait $am_sleep_pid 2>/dev/null
  1319   1251      fi
  1320   1252      AC_MSG_RESULT([done])])
  1321   1253   rm -f conftest.file
  1322   1254   ])
  1323   1255   
  1324         -# Copyright (C) 2009-2017 Free Software Foundation, Inc.
         1256  +# Copyright (C) 2009-2014 Free Software Foundation, Inc.
  1325   1257   #
  1326   1258   # This file is free software; the Free Software Foundation
  1327   1259   # gives unlimited permission to copy and/or distribute it,
  1328   1260   # with or without modifications, as long as this notice is preserved.
  1329   1261   
  1330   1262   # AM_SILENT_RULES([DEFAULT])
  1331   1263   # --------------------------
................................................................................
  1377   1309   AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
  1378   1310   AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
  1379   1311   AM_BACKSLASH='\'
  1380   1312   AC_SUBST([AM_BACKSLASH])dnl
  1381   1313   _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
  1382   1314   ])
  1383   1315   
  1384         -# Copyright (C) 2001-2017 Free Software Foundation, Inc.
         1316  +# Copyright (C) 2001-2014 Free Software Foundation, Inc.
  1385   1317   #
  1386   1318   # This file is free software; the Free Software Foundation
  1387   1319   # gives unlimited permission to copy and/or distribute it,
  1388   1320   # with or without modifications, as long as this notice is preserved.
  1389   1321   
  1390   1322   # AM_PROG_INSTALL_STRIP
  1391   1323   # ---------------------
................................................................................
  1405   1337   dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
  1406   1338   if test "$cross_compiling" != no; then
  1407   1339     AC_CHECK_TOOL([STRIP], [strip], :)
  1408   1340   fi
  1409   1341   INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
  1410   1342   AC_SUBST([INSTALL_STRIP_PROGRAM])])
  1411   1343   
  1412         -# Copyright (C) 2006-2017 Free Software Foundation, Inc.
         1344  +# Copyright (C) 2006-2014 Free Software Foundation, Inc.
  1413   1345   #
  1414   1346   # This file is free software; the Free Software Foundation
  1415   1347   # gives unlimited permission to copy and/or distribute it,
  1416   1348   # with or without modifications, as long as this notice is preserved.
  1417   1349   
  1418   1350   # _AM_SUBST_NOTMAKE(VARIABLE)
  1419   1351   # ---------------------------
................................................................................
  1424   1356   # AM_SUBST_NOTMAKE(VARIABLE)
  1425   1357   # --------------------------
  1426   1358   # Public sister of _AM_SUBST_NOTMAKE.
  1427   1359   AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
  1428   1360   
  1429   1361   # Check how to create a tarball.                            -*- Autoconf -*-
  1430   1362   
  1431         -# Copyright (C) 2004-2017 Free Software Foundation, Inc.
         1363  +# Copyright (C) 2004-2014 Free Software Foundation, Inc.
  1432   1364   #
  1433   1365   # This file is free software; the Free Software Foundation
  1434   1366   # gives unlimited permission to copy and/or distribute it,
  1435   1367   # with or without modifications, as long as this notice is preserved.
  1436   1368   
  1437   1369   # _AM_PROG_TAR(FORMAT)
  1438   1370   # --------------------

Changes to config.h.

    66     66   
    67     67   /* Define to 1 if you have the `CharLS' library (-lCharLS). */
    68     68   #define HAVE_LIBCHARLS 1
    69     69   
    70     70   /* Define to 1 if you have the `openjp2' library (-lopenjp2). */
    71     71   #define HAVE_LIBOPENJP2 1
    72     72   
    73         -/* Define to 1 if you have the <libpq-fe.h> header file. */
    74         -#define HAVE_LIBPQ_FE_H 1
    75         -
    76     73   /* Define to 1 if you have the `proj' library (-lproj). */
    77     74   #define HAVE_LIBPROJ 1
    78     75   
    79     76   /* Define to 1 if you have the `sqlite3' library (-lsqlite3). */
    80     77   #define HAVE_LIBSQLITE3 1
    81     78   
    82     79   /* Define to 1 if you have the `localtime_r' function. */
................................................................................
    98     95   /* Define to 1 if you have the `memset' function. */
    99     96   #define HAVE_MEMSET 1
   100     97   
   101     98   /* Define to 1 if you have the <openjpeg-2.0/openjpeg.h> header file. */
   102     99   /* #undef HAVE_OPENJPEG_2_0_OPENJPEG_H */
   103    100   
   104    101   /* Define to 1 if you have the <openjpeg-2.1/openjpeg.h> header file. */
   105         -/* #undef HAVE_OPENJPEG_2_1_OPENJPEG_H */
   106         -
   107         -/* Define to 1 if you have the <openjpeg-2.2/openjpeg.h> header file. */
   108         -/* #undef HAVE_OPENJPEG_2_2_OPENJPEG_H */
   109         -
   110         -/* Define to 1 if you have the <openjpeg-2.3/openjpeg.h> header file. */
   111         -#define HAVE_OPENJPEG_2_3_OPENJPEG_H 1
          102  +#define HAVE_OPENJPEG_2_1_OPENJPEG_H 1
   112    103   
   113    104   /* Define to 1 if you have the <sqlite3ext.h> header file. */
   114    105   #define HAVE_SQLITE3EXT_H 1
   115    106   
   116    107   /* Define to 1 if you have the <sqlite3.h> header file. */
   117    108   #define HAVE_SQLITE3_H 1
   118    109   
................................................................................
   164    155   
   165    156   /* Define to 1 if you have the <sys/types.h> header file. */
   166    157   #define HAVE_SYS_TYPES_H 1
   167    158   
   168    159   /* Define to 1 if you have the <unistd.h> header file. */
   169    160   #define HAVE_UNISTD_H 1
   170    161   
   171         -/* Should be defined in order to enable LibPQ late binding. */
   172         -/* #undef LIBPQ_DEFERRED */
   173         -
   174    162   /* Define to 1 if `lstat' dereferences a symlink specified with a trailing
   175    163      slash. */
   176    164   #define LSTAT_FOLLOWS_SLASHED_SYMLINK 1
   177    165   
   178    166   /* Define to the sub-directory in which libtool stores uninstalled libraries.
   179    167      */
   180    168   #define LT_OBJDIR ".libs/"
................................................................................
   186    174   /* #undef OMIT_FREEXL */
   187    175   
   188    176   /* Should be defined in order to disable OpenJpeg support. */
   189    177   /* #undef OMIT_OPENJPEG */
   190    178   
   191    179   /* Should be defined in order to disable WebP support. */
   192    180   /* #undef OMIT_WEBP */
          181  +
          182  +/* testing for OpenJpeg 2.1 */
          183  +#define OPENJPEG_2_1 1
   193    184   
   194    185   /* Name of package */
   195    186   #define PACKAGE "spatialite_gui"
   196    187   
   197    188   /* Define to the address where bug reports for this package should be sent. */
   198    189   #define PACKAGE_BUGREPORT "a.furieri@lqt.it"
   199    190   

Changes to config.h.in.

    65     65   
    66     66   /* Define to 1 if you have the `CharLS' library (-lCharLS). */
    67     67   #undef HAVE_LIBCHARLS
    68     68   
    69     69   /* Define to 1 if you have the `openjp2' library (-lopenjp2). */
    70     70   #undef HAVE_LIBOPENJP2
    71     71   
    72         -/* Define to 1 if you have the <libpq-fe.h> header file. */
    73         -#undef HAVE_LIBPQ_FE_H
    74         -
    75     72   /* Define to 1 if you have the `proj' library (-lproj). */
    76     73   #undef HAVE_LIBPROJ
    77     74   
    78     75   /* Define to 1 if you have the `sqlite3' library (-lsqlite3). */
    79     76   #undef HAVE_LIBSQLITE3
    80     77   
    81     78   /* Define to 1 if you have the `localtime_r' function. */
................................................................................
    99     96   
   100     97   /* Define to 1 if you have the <openjpeg-2.0/openjpeg.h> header file. */
   101     98   #undef HAVE_OPENJPEG_2_0_OPENJPEG_H
   102     99   
   103    100   /* Define to 1 if you have the <openjpeg-2.1/openjpeg.h> header file. */
   104    101   #undef HAVE_OPENJPEG_2_1_OPENJPEG_H
   105    102   
   106         -/* Define to 1 if you have the <openjpeg-2.2/openjpeg.h> header file. */
   107         -#undef HAVE_OPENJPEG_2_2_OPENJPEG_H
   108         -
   109         -/* Define to 1 if you have the <openjpeg-2.3/openjpeg.h> header file. */
   110         -#undef HAVE_OPENJPEG_2_3_OPENJPEG_H
   111         -
   112    103   /* Define to 1 if you have the <sqlite3ext.h> header file. */
   113    104   #undef HAVE_SQLITE3EXT_H
   114    105   
   115    106   /* Define to 1 if you have the <sqlite3.h> header file. */
   116    107   #undef HAVE_SQLITE3_H
   117    108   
   118    109   /* Define to 1 if you have the `sqrt' function. */
................................................................................
   163    154   
   164    155   /* Define to 1 if you have the <sys/types.h> header file. */
   165    156   #undef HAVE_SYS_TYPES_H
   166    157   
   167    158   /* Define to 1 if you have the <unistd.h> header file. */
   168    159   #undef HAVE_UNISTD_H
   169    160   
   170         -/* Should be defined in order to enable LibPQ late binding. */
   171         -#undef LIBPQ_DEFERRED
   172         -
   173    161   /* Define to 1 if `lstat' dereferences a symlink specified with a trailing
   174    162      slash. */
   175    163   #undef LSTAT_FOLLOWS_SLASHED_SYMLINK
   176    164   
   177    165   /* Define to the sub-directory in which libtool stores uninstalled libraries.
   178    166      */
   179    167   #undef LT_OBJDIR
................................................................................
   185    173   #undef OMIT_FREEXL
   186    174   
   187    175   /* Should be defined in order to disable OpenJpeg support. */
   188    176   #undef OMIT_OPENJPEG
   189    177   
   190    178   /* Should be defined in order to disable WebP support. */
   191    179   #undef OMIT_WEBP
          180  +
          181  +/* testing for OpenJpeg 2.1 */
          182  +#undef OPENJPEG_2_1
   192    183   
   193    184   /* Name of package */
   194    185   #undef PACKAGE
   195    186   
   196    187   /* Define to the address where bug reports for this package should be sent. */
   197    188   #undef PACKAGE_BUGREPORT
   198    189   

Changes to configure.

   631    631   # include <unistd.h>
   632    632   #endif"
   633    633   
   634    634   ac_subst_vars='am__EXEEXT_FALSE
   635    635   am__EXEEXT_TRUE
   636    636   LTLIBOBJS
   637    637   OMIT_SQLITE_STMTSTATUS_AUTOINDEX_FLAGS
   638         -PG_LIB
   639         -PG_LDFLAGS
   640         -PG_CFLAGS
   641         -PGCONFIG
   642         -LIBVIRTUALPG_LIBS
   643         -LIBVIRTUALPG_CFLAGS
   644    638   LIBRASTERLITE2_LIBS
   645    639   LIBRASTERLITE2_CFLAGS
   646    640   LIBSPATIALITE_LIBS
   647    641   LIBSPATIALITE_CFLAGS
   648    642   LIBLZMA_LIBS
   649    643   LIBLZMA_CFLAGS
   650    644   LIBWEBP_LIBS
................................................................................
   801    795   with_wxconfig
   802    796   with_geosconfig
   803    797   enable_freexl
   804    798   enable_libxml2
   805    799   enable_openjpeg
   806    800   enable_webp
   807    801   enable_charls
   808         -with_pgconfig
   809         -with_libpq_deferred
   810    802   enable_sqlite_stmtstatus_autoindex
   811    803   '
   812    804         ac_precious_vars='build_alias
   813    805   host_alias
   814    806   target_alias
   815    807   CXX
   816    808   CXXFLAGS
................................................................................
   832    824   LIBWEBP_CFLAGS
   833    825   LIBWEBP_LIBS
   834    826   LIBLZMA_CFLAGS
   835    827   LIBLZMA_LIBS
   836    828   LIBSPATIALITE_CFLAGS
   837    829   LIBSPATIALITE_LIBS
   838    830   LIBRASTERLITE2_CFLAGS
   839         -LIBRASTERLITE2_LIBS
   840         -LIBVIRTUALPG_CFLAGS
   841         -LIBVIRTUALPG_LIBS'
          831  +LIBRASTERLITE2_LIBS'
   842    832   
   843    833   
   844    834   # Initialize some variables set by options.
   845    835   ac_init_help=
   846    836   ac_init_version=false
   847    837   ac_unrecognized_opts=
   848    838   ac_unrecognized_sep=
................................................................................
  1485   1475     --with-pic              try to use only PIC/non-PIC objects [default=use
  1486   1476                             both]
  1487   1477     --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
  1488   1478     --with-sysroot=DIR Search for dependent libraries within DIR
  1489   1479                           (or the compiler's sysroot if not specified).
  1490   1480     --with-wxconfig=FILE    specify an alternative wx-config file
  1491   1481     --with-geosconfig=FILE  specify an alternative geos-config file
  1492         -  --with-pgconfig=FILE    specify an alternative pg_config file
  1493         -  --with-libpq_deferred   enables libpq late binding [default=no]
  1494   1482   
  1495   1483   Some influential environment variables:
  1496   1484     CXX         C++ compiler command
  1497   1485     CXXFLAGS    C++ compiler flags
  1498   1486     LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
  1499   1487                 nonstandard directory <lib dir>
  1500   1488     LIBS        libraries to pass to the linker, e.g. -l<library>
................................................................................
  1529   1517                 C compiler flags for LIBSPATIALITE, overriding pkg-config
  1530   1518     LIBSPATIALITE_LIBS
  1531   1519                 linker flags for LIBSPATIALITE, overriding pkg-config
  1532   1520     LIBRASTERLITE2_CFLAGS
  1533   1521                 C compiler flags for LIBRASTERLITE2, overriding pkg-config
  1534   1522     LIBRASTERLITE2_LIBS
  1535   1523                 linker flags for LIBRASTERLITE2, overriding pkg-config
  1536         -  LIBVIRTUALPG_CFLAGS
  1537         -              C compiler flags for LIBVIRTUALPG, overriding pkg-config
  1538         -  LIBVIRTUALPG_LIBS
  1539         -              linker flags for LIBVIRTUALPG, overriding pkg-config
  1540   1524   
  1541   1525   Use these variables to override the choices made by `configure' or to help
  1542   1526   it to find libraries and programs with nonstandard names/locations.
  1543   1527   
  1544   1528   Report bugs to <a.furieri@lqt.it>.
  1545   1529   _ACEOF
  1546   1530   ac_status=$?
................................................................................
 17080  17064   fi
 17081  17065   
 17082  17066       if test x"$enable_openjpeg" != "xno"; then
 17083  17067       #
 17084  17068       # testing OpenJpeg-2 headers
 17085  17069       # they could be either on -/include/openjpeg-2.0
 17086  17070       #                   or on -/include/openjpeg-2.1
 17087         -    #                   or on -/include/openjpeg-2.2
 17088         -    #                   or on -/include/openjpeg-2.3
 17089  17071       #
 17090  17072       for ac_header in openjpeg-2.0/openjpeg.h
 17091  17073   do :
 17092  17074     ac_fn_c_check_header_mongrel "$LINENO" "openjpeg-2.0/openjpeg.h" "ac_cv_header_openjpeg_2_0_openjpeg_h" "$ac_includes_default"
 17093  17075   if test "x$ac_cv_header_openjpeg_2_0_openjpeg_h" = xyes; then :
 17094  17076     cat >>confdefs.h <<_ACEOF
 17095  17077   #define HAVE_OPENJPEG_2_0_OPENJPEG_H 1
................................................................................
 17107  17089   #define HAVE_OPENJPEG_2_1_OPENJPEG_H 1
 17108  17090   _ACEOF
 17109  17091   
 17110  17092   fi
 17111  17093   
 17112  17094   done
 17113  17095   
 17114         -    for ac_header in openjpeg-2.2/openjpeg.h
 17115         -do :
 17116         -  ac_fn_c_check_header_mongrel "$LINENO" "openjpeg-2.2/openjpeg.h" "ac_cv_header_openjpeg_2_2_openjpeg_h" "$ac_includes_default"
 17117         -if test "x$ac_cv_header_openjpeg_2_2_openjpeg_h" = xyes; then :
 17118         -  cat >>confdefs.h <<_ACEOF
 17119         -#define HAVE_OPENJPEG_2_2_OPENJPEG_H 1
 17120         -_ACEOF
 17121         -
 17122         -fi
 17123         -
 17124         -done
 17125         -
 17126         -    for ac_header in openjpeg-2.3/openjpeg.h
 17127         -do :
 17128         -  ac_fn_c_check_header_mongrel "$LINENO" "openjpeg-2.3/openjpeg.h" "ac_cv_header_openjpeg_2_3_openjpeg_h" "$ac_includes_default"
 17129         -if test "x$ac_cv_header_openjpeg_2_3_openjpeg_h" = xyes; then :
 17130         -  cat >>confdefs.h <<_ACEOF
 17131         -#define HAVE_OPENJPEG_2_3_OPENJPEG_H 1
 17132         -_ACEOF
 17133         -
 17134         -fi
 17135         -
 17136         -done
 17137         -
 17138  17096       if test x"$ac_cv_header_openjpeg_2_0_openjpeg_h" != x"yes" &&
 17139         -        test x"$ac_cv_header_openjpeg_2_1_openjpeg_h" != x"yes" &&
 17140         -        test x"$ac_cv_header_openjpeg_2_2_openjpeg_h" != x"yes" &&
 17141         -        test x"$ac_cv_header_openjpeg_2_3_openjpeg_h" != x"yes";
        17097  +        test x"$ac_cv_header_openjpeg_2_1_openjpeg_h" != x"yes";
 17142  17098       then
 17143  17099           as_fn_error $? "'OpenJpeg-2' is required but the header (openjpeg.h) doesn't seem to be installed on this system" "$LINENO" 5
 17144  17100       fi
 17145  17101       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for opj_create_decompress in -lopenjp2" >&5
 17146  17102   $as_echo_n "checking for opj_create_decompress in -lopenjp2... " >&6; }
 17147  17103   if ${ac_cv_lib_openjp2_opj_create_decompress+:} false; then :
 17148  17104     $as_echo_n "(cached) " >&6
................................................................................
 17185  17141   
 17186  17142     LIBS="-lopenjp2 $LIBS"
 17187  17143   
 17188  17144   else
 17189  17145     as_fn_error $? "'libopenjp2' is required but it doesn't seems to be installed on this system." "$LINENO" 5
 17190  17146   fi
 17191  17147   
        17148  +    # testing for OpenJpeg 2.0 or 2.1
        17149  +    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
        17150  +/* end confdefs.h.  */
        17151  +#ifdef HAVE_OPENJPEG_2_1_OPENJPEG_H
        17152  +                                       #include <openjpeg-2.1/openjpeg.h>
        17153  +                                       #else
        17154  +                                       #include <openjpeg-2.0/openjpeg.h>
        17155  +                                       #endif
        17156  +int
        17157  +main ()
        17158  +{
        17159  +void *d; opj_stream_t *s; opj_stream_set_user_data (s, &d, NULL);
        17160  +  ;
        17161  +  return 0;
        17162  +}
        17163  +_ACEOF
        17164  +if ac_fn_c_try_compile "$LINENO"; then :
        17165  +
        17166  +                      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
        17167  +$as_echo "yes" >&6; }
        17168  +                      $as_echo "#define OPENJPEG_2_1 1" >>confdefs.h
        17169  +
        17170  +
        17171  +else
        17172  +  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
        17173  +$as_echo "no" >&6; }
        17174  +
        17175  +fi
        17176  +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 17192  17177   else
 17193  17178     $as_echo "#define OMIT_OPENJPEG 1" >>confdefs.h
 17194  17179   
 17195  17180   fi
 17196  17181   #-----------------------------------------------------------------------
 17197  17182   
 17198  17183   #-----------------------------------------------------------------------
................................................................................
 17585  17570   	LIBRASTERLITE2_LIBS=$pkg_cv_LIBRASTERLITE2_LIBS
 17586  17571           { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 17587  17572   $as_echo "yes" >&6; }
 17588  17573   
 17589  17574   fi
 17590  17575   
 17591  17576   
 17592         -
 17593         -
 17594         -pkg_failed=no
 17595         -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBVIRTUALPG" >&5
 17596         -$as_echo_n "checking for LIBVIRTUALPG... " >&6; }
 17597         -
 17598         -if test -n "$LIBVIRTUALPG_CFLAGS"; then
 17599         -    pkg_cv_LIBVIRTUALPG_CFLAGS="$LIBVIRTUALPG_CFLAGS"
 17600         - elif test -n "$PKG_CONFIG"; then
 17601         -    if test -n "$PKG_CONFIG" && \
 17602         -    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"virtualpg\""; } >&5
 17603         -  ($PKG_CONFIG --exists --print-errors "virtualpg") 2>&5
 17604         -  ac_status=$?
 17605         -  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
 17606         -  test $ac_status = 0; }; then
 17607         -  pkg_cv_LIBVIRTUALPG_CFLAGS=`$PKG_CONFIG --cflags "virtualpg" 2>/dev/null`
 17608         -		      test "x$?" != "x0" && pkg_failed=yes
 17609         -else
 17610         -  pkg_failed=yes
 17611         -fi
 17612         - else
 17613         -    pkg_failed=untried
 17614         -fi
 17615         -if test -n "$LIBVIRTUALPG_LIBS"; then
 17616         -    pkg_cv_LIBVIRTUALPG_LIBS="$LIBVIRTUALPG_LIBS"
 17617         - elif test -n "$PKG_CONFIG"; then
 17618         -    if test -n "$PKG_CONFIG" && \
 17619         -    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"virtualpg\""; } >&5
 17620         -  ($PKG_CONFIG --exists --print-errors "virtualpg") 2>&5
 17621         -  ac_status=$?
 17622         -  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
 17623         -  test $ac_status = 0; }; then
 17624         -  pkg_cv_LIBVIRTUALPG_LIBS=`$PKG_CONFIG --libs "virtualpg" 2>/dev/null`
 17625         -		      test "x$?" != "x0" && pkg_failed=yes
 17626         -else
 17627         -  pkg_failed=yes
 17628         -fi
 17629         - else
 17630         -    pkg_failed=untried
 17631         -fi
 17632         -
 17633         -
 17634         -
 17635         -if test $pkg_failed = yes; then
 17636         -   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 17637         -$as_echo "no" >&6; }
 17638         -
 17639         -if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
 17640         -        _pkg_short_errors_supported=yes
 17641         -else
 17642         -        _pkg_short_errors_supported=no
 17643         -fi
 17644         -        if test $_pkg_short_errors_supported = yes; then
 17645         -	        LIBVIRTUALPG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "virtualpg" 2>&1`
 17646         -        else
 17647         -	        LIBVIRTUALPG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "virtualpg" 2>&1`
 17648         -        fi
 17649         -	# Put the nasty error message in config.log where it belongs
 17650         -	echo "$LIBVIRTUALPG_PKG_ERRORS" >&5
 17651         -
 17652         -	as_fn_error $? "'libvirtualpg' is required but it doesn't seem to be installed on this system." "$LINENO" 5
 17653         -elif test $pkg_failed = untried; then
 17654         -     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 17655         -$as_echo "no" >&6; }
 17656         -	as_fn_error $? "'libvirtualpg' is required but it doesn't seem to be installed on this system." "$LINENO" 5
 17657         -else
 17658         -	LIBVIRTUALPG_CFLAGS=$pkg_cv_LIBVIRTUALPG_CFLAGS
 17659         -	LIBVIRTUALPG_LIBS=$pkg_cv_LIBVIRTUALPG_LIBS
 17660         -        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 17661         -$as_echo "yes" >&6; }
 17662         -
 17663         -fi
 17664         -
 17665         -
 17666  17577   #-----------------------------------------------------------------------
 17667  17578   
 17668         -#-----------------------------------------------------------------------
 17669         -#   --with-pgconfig
 17670         -#
 17671         -
 17672         -# Check whether --with-pgconfig was given.
 17673         -if test "${with_pgconfig+set}" = set; then :
 17674         -  withval=$with_pgconfig; PGCONFIG="$withval"
 17675         -else
 17676         -  PGCONFIG=""
 17677         -fi
 17678         -
 17679         -if test "x$PGCONFIG" = "x"; then
 17680         -      # PGCONFIG was not specified, so search within the current path
 17681         -      # Extract the first word of "pg_config", so it can be a program name with args.
 17682         -set dummy pg_config; ac_word=$2
 17683         -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 17684         -$as_echo_n "checking for $ac_word... " >&6; }
 17685         -if ${ac_cv_path_PGCONFIG+:} false; then :
 17686         -  $as_echo_n "(cached) " >&6
 17687         -else
 17688         -  case $PGCONFIG in
 17689         -  [\\/]* | ?:[\\/]*)
 17690         -  ac_cv_path_PGCONFIG="$PGCONFIG" # Let the user override the test with a path.
 17691         -  ;;
 17692         -  *)
 17693         -  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 17694         -for as_dir in $PATH
 17695         -do
 17696         -  IFS=$as_save_IFS
 17697         -  test -z "$as_dir" && as_dir=.
 17698         -    for ac_exec_ext in '' $ac_executable_extensions; do
 17699         -  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
 17700         -    ac_cv_path_PGCONFIG="$as_dir/$ac_word$ac_exec_ext"
 17701         -    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
 17702         -    break 2
 17703         -  fi
 17704         -done
 17705         -  done
 17706         -IFS=$as_save_IFS
 17707         -
 17708         -  ;;
 17709         -esac
 17710         -fi
 17711         -PGCONFIG=$ac_cv_path_PGCONFIG
 17712         -if test -n "$PGCONFIG"; then
 17713         -  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PGCONFIG" >&5
 17714         -$as_echo "$PGCONFIG" >&6; }
 17715         -else
 17716         -  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 17717         -$as_echo "no" >&6; }
 17718         -fi
 17719         -
 17720         -
 17721         -      # If we couldn't find pg_config, display an error
 17722         -      if test "x$PGCONFIG" = "x"; then
 17723         -              as_fn_error $? "could not find pg_config within the current path. You may need to try re-running configure with a --with-pgconfig parameter." "$LINENO" 5
 17724         -      fi
 17725         -else
 17726         -      # PGCONFIG was specified; display a message to the user
 17727         -      if test "x$PGSCONFIG" = "xyes"; then
 17728         -              as_fn_error $? "you must specify a parameter to --with-pgconfig, e.g. --with-pgconfig=/path/to/pg_config" "$LINENO" 5
 17729         -      else
 17730         -              if test -f $PGCONFIG; then
 17731         -                      { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using user-specified pg_config file: $PGCONFIG" >&5
 17732         -$as_echo "Using user-specified pg_config file: $PGCONFIG" >&6; }
 17733         -              else
 17734         -                      as_fn_error $? "the user-specified pg_config file $PGCONFIG does not exist" "$LINENO" 5
 17735         -              fi
 17736         -      fi
 17737         -fi
 17738         -PG_CFLAGS=-I`$PGCONFIG --includedir`
 17739         -PG_LDFLAGS=-L`$PGCONFIG --libdir`
 17740         -
 17741         -
 17742         -#-----------------------------------------------------------------------
 17743         -
 17744         -#-----------------------------------------------------------------------
 17745         -#   --with-libpq_deferred
 17746         -#
 17747         -
 17748         -# Check whether --with-libpq_deferred was given.
 17749         -if test "${with_libpq_deferred+set}" = set; then :
 17750         -  withval=$with_libpq_deferred;
 17751         -else
 17752         -  with_libpq_deferred=no
 17753         -fi
 17754         -
 17755         -if test x"$with_libpq_deferred" != "xno"; then
 17756         -	$as_echo "#define LIBPQ_DEFERRED 1" >>confdefs.h
 17757         -
 17758         -	libpq_deferred=1
 17759         -fi
 17760         -#-----------------------------------------------------------------------
 17761         -
 17762         -# Ensure that we can parse libpq-fe.h
 17763         -CFLAGS_SAVE="$CFLAGS"
 17764         -CFLAGS="$PG_CFLAGS"
 17765         -for ac_header in libpq-fe.h
 17766         -do :
 17767         -  ac_fn_c_check_header_mongrel "$LINENO" "libpq-fe.h" "ac_cv_header_libpq_fe_h" "$ac_includes_default"
 17768         -if test "x$ac_cv_header_libpq_fe_h" = xyes; then :
 17769         -  cat >>confdefs.h <<_ACEOF
 17770         -#define HAVE_LIBPQ_FE_H 1
 17771         -_ACEOF
 17772         -
 17773         -else
 17774         -  as_fn_error $? "cannot find libpq-fe.h, bailing out" "$LINENO" 5
 17775         -fi
 17776         -
 17777         -done
 17778         -
 17779         -CFLAGS="$CFLAGS_SAVE"
 17780         -
 17781         -if test x"$libpq_deferred" != "x1"; then
 17782         -	# Ensure we can link against libpq
 17783         -	LDFLAGS_SAVE="$LDFLAGS"
 17784         -	LDFLAGS="$PG_LDFLAGS"
 17785         -	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for PQconnectdb in -lpq" >&5
 17786         -$as_echo_n "checking for PQconnectdb in -lpq... " >&6; }
 17787         -if ${ac_cv_lib_pq_PQconnectdb+:} false; then :
 17788         -  $as_echo_n "(cached) " >&6
 17789         -else
 17790         -  ac_check_lib_save_LIBS=$LIBS
 17791         -LIBS="-lpq  $LIBS"
 17792         -cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 17793         -/* end confdefs.h.  */
 17794         -
 17795         -/* Override any GCC internal prototype to avoid an error.
 17796         -   Use char because int might match the return type of a GCC
 17797         -   builtin and then its argument prototype would still apply.  */
 17798         -#ifdef __cplusplus
 17799         -extern "C"
 17800         -#endif
 17801         -char PQconnectdb ();
 17802         -int
 17803         -main ()
 17804         -{
 17805         -return PQconnectdb ();
 17806         -  ;
 17807         -  return 0;
 17808         -}
 17809         -_ACEOF
 17810         -if ac_fn_c_try_link "$LINENO"; then :
 17811         -  ac_cv_lib_pq_PQconnectdb=yes
 17812         -else
 17813         -  ac_cv_lib_pq_PQconnectdb=no
 17814         -fi
 17815         -rm -f core conftest.err conftest.$ac_objext \
 17816         -    conftest$ac_exeext conftest.$ac_ext
 17817         -LIBS=$ac_check_lib_save_LIBS
 17818         -fi
 17819         -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pq_PQconnectdb" >&5
 17820         -$as_echo "$ac_cv_lib_pq_PQconnectdb" >&6; }
 17821         -if test "x$ac_cv_lib_pq_PQconnectdb" = xyes; then :
 17822         -  PG_LIB=-lpq
 17823         -else
 17824         -  as_fn_error $? "'libpq' is required but it doesn't seem to be installed on this system." "$LINENO" 5
 17825         -fi
 17826         -
 17827         -	LDFLAGS="$LDFLAGS_SAVE"
 17828         -
 17829         -fi
 17830         -
 17831  17579   ac_config_files="$ac_config_files Makefile icons/Makefile win_resource/Makefile gnome_resource/Makefile mac_resource/Makefile"
 17832  17580   
 17833  17581   
 17834  17582   #-----------------------------------------------------------------------
 17835  17583   #   --enable-sqlite_stmtstatus_autoindex
 17836  17584   #
 17837  17585   # Check whether --enable-sqlite_stmtstatus_autoindex was given.

Changes to configure.ac.

    15     15   	    [must be defined when using libspatialite-amalgamation])
    16     16   AH_TEMPLATE([OMIT_FREEXL],
    17     17               [Should be defined in order to disable FREEXL support.])
    18     18   AH_TEMPLATE([ENABLE_LIBXML2],
    19     19               [Should be defined in order to enable LIBXML2 support.])
    20     20   AH_TEMPLATE([OMIT_WEBP],
    21     21               [Should be defined in order to disable WebP support.])
           22  +AH_TEMPLATE([OPENJPEG_2_1],
           23  +            [testing for OpenJpeg 2.1])
    22     24   AH_TEMPLATE([OMIT_OPENJPEG],
    23     25               [Should be defined in order to disable OpenJpeg support.])
    24     26   AH_TEMPLATE([OMIT_CHARLS],
    25     27               [Should be defined in order to disable CharLS support.])
    26         -AH_TEMPLATE([LIBPQ_DEFERRED],
    27         -            [Should be defined in order to enable LibPQ late binding.])
    28     28   AH_TEMPLATE([HAVE_DECL_SQLITE_DBSTATUS_LOOKASIDE_USED],
    29     29               [depending on SQLite library version.])
    30     30   AH_TEMPLATE([HAVE_DECL_SQLITE_DBSTATUS_LOOKASIDE_HIT],
    31     31               [depending on SQLite library version.])
    32     32   AH_TEMPLATE([HAVE_DECL_SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE],
    33     33               [depending on SQLite library version.])
    34     34   AH_TEMPLATE([HAVE_DECL_SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL],
................................................................................
   195    195     [--enable-openjpeg], [enables OpenJpeg inclusion [default=yes]])],
   196    196     [], [enable_openjpeg=yes])
   197    197       if test x"$enable_openjpeg" != "xno"; then
   198    198       #
   199    199       # testing OpenJpeg-2 headers
   200    200       # they could be either on -/include/openjpeg-2.0
   201    201       #                   or on -/include/openjpeg-2.1
   202         -    #                   or on -/include/openjpeg-2.2
   203         -    #                   or on -/include/openjpeg-2.3
   204    202       #
   205    203       AC_CHECK_HEADERS(openjpeg-2.0/openjpeg.h)
   206    204       AC_CHECK_HEADERS(openjpeg-2.1/openjpeg.h)
   207         -    AC_CHECK_HEADERS(openjpeg-2.2/openjpeg.h)
   208         -    AC_CHECK_HEADERS(openjpeg-2.3/openjpeg.h)
   209    205       if test x"$ac_cv_header_openjpeg_2_0_openjpeg_h" != x"yes" &&
   210         -        test x"$ac_cv_header_openjpeg_2_1_openjpeg_h" != x"yes" &&
   211         -        test x"$ac_cv_header_openjpeg_2_2_openjpeg_h" != x"yes" &&
   212         -        test x"$ac_cv_header_openjpeg_2_3_openjpeg_h" != x"yes";
          206  +        test x"$ac_cv_header_openjpeg_2_1_openjpeg_h" != x"yes";
   213    207       then
   214    208           AC_MSG_ERROR(['OpenJpeg-2' is required but the header (openjpeg.h) doesn't seem to be installed on this system])
   215    209       fi 
   216    210       AC_CHECK_LIB(openjp2,opj_create_decompress,,AC_MSG_ERROR(['libopenjp2' is required but it doesn't seems to be installed on this system.]),-lm)
          211  +    # testing for OpenJpeg 2.0 or 2.1
          212  +    AC_COMPILE_IFELSE(  [AC_LANG_PROGRAM([[#ifdef HAVE_OPENJPEG_2_1_OPENJPEG_H
          213  +                                       #include <openjpeg-2.1/openjpeg.h>
          214  +                                       #else
          215  +                                       #include <openjpeg-2.0/openjpeg.h>
          216  +                                       #endif]],
          217  +                                     [[void *d; opj_stream_t *s; opj_stream_set_user_data (s, &d, NULL);]])],
          218  +                    [
          219  +                      AC_MSG_RESULT([yes])
          220  +                      AC_DEFINE(OPENJPEG_2_1)
          221  +                    ],
          222  +                    [AC_MSG_RESULT([no])]
          223  +                 )
   217    224   else
   218    225     AC_DEFINE(OMIT_OPENJPEG)
   219    226   fi
   220    227   #-----------------------------------------------------------------------
   221    228   
   222    229   #-----------------------------------------------------------------------
   223    230   #   --enable-webp
................................................................................
   259    266     AC_DEFINE(SPATIALITE_AMALGAMATION, 1)
   260    267   fi
   261    268   AC_SUBST(LIBSPATIALITE_LIBS)
   262    269   
   263    270   PKG_CHECK_MODULES([LIBRASTERLITE2], [rasterlite2], , AC_MSG_ERROR(['librasterlite2' is required but it doesn't seem to be installed on this system.]))
   264    271   AC_SUBST(LIBRASTERLITE2_CFLAGS)
   265    272   AC_SUBST(LIBRASTERLITE2_LIBS)
   266         -
   267         -PKG_CHECK_MODULES([LIBVIRTUALPG], [virtualpg], , AC_MSG_ERROR(['libvirtualpg' is required but it doesn't seem to be installed on this system.]))
   268         -AC_SUBST(LIBVIRTUALPG_CFLAGS)
   269         -AC_SUBST(LIBVIRTUALPG_LIBS)
   270    273   #-----------------------------------------------------------------------
   271    274   
   272         -#-----------------------------------------------------------------------
   273         -#   --with-pgconfig
   274         -#
   275         -AC_ARG_WITH([pgconfig],
   276         -      [AS_HELP_STRING([--with-pgconfig=FILE], [specify an alternative pg_config file])],
   277         -         [PGCONFIG="$withval"], [PGCONFIG=""])
   278         -if test "x$PGCONFIG" = "x"; then
   279         -      # PGCONFIG was not specified, so search within the current path
   280         -      AC_PATH_PROG([PGCONFIG], [pg_config])	
   281         -      # If we couldn't find pg_config, display an error
   282         -      if test "x$PGCONFIG" = "x"; then
   283         -              AC_MSG_ERROR([could not find pg_config within the current path. You may need to try re-running configure with a --with-pgconfig parameter.])
   284         -      fi
   285         -else
   286         -      # PGCONFIG was specified; display a message to the user
   287         -      if test "x$PGSCONFIG" = "xyes"; then
   288         -              AC_MSG_ERROR([you must specify a parameter to --with-pgconfig, e.g. --with-pgconfig=/path/to/pg_config])
   289         -      else
   290         -              if test -f $PGCONFIG; then
   291         -                      AC_MSG_RESULT([Using user-specified pg_config file: $PGCONFIG])
   292         -              else
   293         -                      AC_MSG_ERROR([the user-specified pg_config file $PGCONFIG does not exist])
   294         -              fi     
   295         -      fi
   296         -fi
   297         -PG_CFLAGS=-I`$PGCONFIG --includedir`
   298         -PG_LDFLAGS=-L`$PGCONFIG --libdir`
   299         -AC_SUBST(PG_CFLAGS)
   300         -AC_SUBST(PG_LDFLAGS)
   301         -#-----------------------------------------------------------------------
   302         -
   303         -#-----------------------------------------------------------------------
   304         -#   --with-libpq_deferred
   305         -#
   306         -AC_ARG_WITH(libpq_deferred, [AS_HELP_STRING(
   307         -	[--with-libpq_deferred], [enables libpq late binding [default=no]])],
   308         -	[], [with_libpq_deferred=no])
   309         -if test x"$with_libpq_deferred" != "xno"; then
   310         -	AC_DEFINE(LIBPQ_DEFERRED)
   311         -	libpq_deferred=1
   312         -fi
   313         -#-----------------------------------------------------------------------
   314         -
   315         -# Ensure that we can parse libpq-fe.h
   316         -CFLAGS_SAVE="$CFLAGS"
   317         -CFLAGS="$PG_CFLAGS"
   318         -AC_CHECK_HEADERS(libpq-fe.h,, [AC_MSG_ERROR([cannot find libpq-fe.h, bailing out])])
   319         -CFLAGS="$CFLAGS_SAVE"	
   320         -
   321         -if test x"$libpq_deferred" != "x1"; then
   322         -	# Ensure we can link against libpq
   323         -	LDFLAGS_SAVE="$LDFLAGS"
   324         -	LDFLAGS="$PG_LDFLAGS"
   325         -	AC_CHECK_LIB(pq,PQconnectdb,PG_LIB=-lpq,AC_MSG_ERROR(['libpq' is required but it doesn't seem to be installed on this system.]))
   326         -	LDFLAGS="$LDFLAGS_SAVE"
   327         -	AC_SUBST(PG_LIB)
   328         -fi
   329         -
   330    275   AC_CONFIG_FILES([Makefile \
   331    276   	icons/Makefile \
   332    277   	win_resource/Makefile \
   333    278   	gnome_resource/Makefile \
   334    279   	mac_resource/Makefile])
   335    280   
   336    281   #-----------------------------------------------------------------------

Changes to gnome_resource/Makefile.in.

     1         -# Makefile.in generated by automake 1.15.1 from Makefile.am.
            1  +# Makefile.in generated by automake 1.15 from Makefile.am.
     2      2   # @configure_input@
     3      3   
     4         -# Copyright (C) 1994-2017 Free Software Foundation, Inc.
            4  +# Copyright (C) 1994-2014 Free Software Foundation, Inc.
     5      5   
     6      6   # This Makefile.in is free software; the Free Software Foundation
     7      7   # gives unlimited permission to copy and/or distribute it,
     8      8   # with or without modifications, as long as this notice is preserved.
     9      9   
    10     10   # This program is distributed in the hope that it will be useful,
    11     11   # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
................................................................................
   200    200   LIBOBJS = @LIBOBJS@
   201    201   LIBRASTERLITE2_CFLAGS = @LIBRASTERLITE2_CFLAGS@
   202    202   LIBRASTERLITE2_LIBS = @LIBRASTERLITE2_LIBS@
   203    203   LIBS = @LIBS@
   204    204   LIBSPATIALITE_CFLAGS = @LIBSPATIALITE_CFLAGS@
   205    205   LIBSPATIALITE_LIBS = @LIBSPATIALITE_LIBS@
   206    206   LIBTOOL = @LIBTOOL@
   207         -LIBVIRTUALPG_CFLAGS = @LIBVIRTUALPG_CFLAGS@
   208         -LIBVIRTUALPG_LIBS = @LIBVIRTUALPG_LIBS@
   209    207   LIBWEBP_CFLAGS = @LIBWEBP_CFLAGS@
   210    208   LIBWEBP_LIBS = @LIBWEBP_LIBS@
   211    209   LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
   212    210   LIBXML2_LIBS = @LIBXML2_LIBS@
   213    211   LIPO = @LIPO@
   214    212   LN_S = @LN_S@
   215    213   LTLIBOBJS = @LTLIBOBJS@
................................................................................
   228    226   PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
   229    227   PACKAGE_NAME = @PACKAGE_NAME@
   230    228   PACKAGE_STRING = @PACKAGE_STRING@
   231    229   PACKAGE_TARNAME = @PACKAGE_TARNAME@
   232    230   PACKAGE_URL = @PACKAGE_URL@
   233    231   PACKAGE_VERSION = @PACKAGE_VERSION@
   234    232   PATH_SEPARATOR = @PATH_SEPARATOR@
   235         -PGCONFIG = @PGCONFIG@
   236         -PG_CFLAGS = @PG_CFLAGS@
   237         -PG_LDFLAGS = @PG_LDFLAGS@
   238         -PG_LIB = @PG_LIB@
   239    233   PKG_CONFIG = @PKG_CONFIG@
   240    234   PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
   241    235   PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
   242    236   RANLIB = @RANLIB@
   243    237   SED = @SED@
   244    238   SET_MAKE = @SET_MAKE@
   245    239   SHELL = @SHELL@

Deleted helpgen/READ_ME.txt.

     1         -About "helpgen"
     2         -===============
     3         -this is a small C tool intended to simplify and make easy the process to 
     4         -tempestively update the HTML doc internally supplied by "spatialite_gui"
     5         -about SpatiaLite and Rasterlite2 SQL functions.
     6         -
     7         -
     8         -How it works
     9         -============
    10         -1. "helpgen" will parse and rearrange the two HTML pages supporting
    11         -   each library, merging both into a single HTML page.
    12         -2. this merged HTML page will then be compressed using the well known
    13         -   ZIP/DEFLATE algorithm (zlib).
    14         -3. then the ZIP binary payload will be transformed into many short text 
    15         -   strings encoded as hexadecimal bytes.
    16         -4. and finally a C++ source will be autogenerated; this C++ source is 
    17         -   intended to be compiled and linked within "spatialite_gui", and its
    18         -   specific scope is the one to "inject" into the executable all the
    19         -   above mentioned hexadecimal strings representing the zipped HTML doc.
    20         -5. each time that the user will request "spatialite_gui" to show the
    21         -   internal HTML doc the "MyMain::GetHelp()" function defined into the
    22         -   autogenerated C++ source, the zipped payload will be decompressed
    23         -   and the HTML page will be shown on the screen.
    24         -
    25         -
    26         -Using "helpgen"
    27         -===============
    28         -a. build the "helpgen" executable (see below).
    29         -b. prepare the SpatiaLite's own HTML page; this usually means copying
    30         -   "spatialite-sql-latest.html" from libspatialite's sources to
    31         -   ./spatialite-sql-latest.html
    32         -c. prepare the RasterLite2's own HTML page; this usually means
    33         -   downloading from the Fossil Wiki:
    34         -   https://www.gaia-gis.it/fossil/librasterlite2/wiki?name=sql_reference_list
    35         -   the downloaded HTML page must be saved as ./rl2-sql-latest.html
    36         -d. now you are ready to execute "helpgen" (no args):
    37         -   ./helpgen
    38         -e. the "HtmlHelp.cpp" C++ source will be autogenerated.
    39         -f. copy "HtmlHelp.cpp" into the spatialite_gui's sources and rebuild;
    40         -   the spatialite_gui executable will now contain the latest version
    41         -   of the HTML doc.
    42         -   
    43         -   
    44         -Building "helpgen"
    45         -==================
    46         -You just have to directly invoke "gcc".
    47         -
    48         -on Linux and other *nix systems:
    49         -gcc helpgen.c -o helpgen -lz
    50         -
    51         -
    52         -on Windows using MSYS and MinGW:
    53         -gcc helpgen.c -o helpgen.exe -lz

Deleted helpgen/helpgen.c.

     1         -/* 
     2         -/ helpgen
     3         -/
     4         -/ a tool autogenerating C++ code for SpatiaLite_GUI
     5         -/ [HTML doc]
     6         -/
     7         -/ version 1.0, 2017 August 4
     8         -/
     9         -/ Author: Sandro Furieri a.furieri@lqt.it
    10         -/
    11         -/ Copyright (C) 2017  Alessandro Furieri
    12         -/
    13         -/    This program is free software: you can redistribute it and/or modify
    14         -/    it under the terms of the GNU General Public License as published by
    15         -/    the Free Software Foundation, either version 3 of the License, or
    16         -/    (at your option) any later version.
    17         -/
    18         -/    This program is distributed in the hope that it will be useful,
    19         -/    but WITHOUT ANY WARRANTY; without even the implied warranty of
    20         -/    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    21         -/    GNU General Public License for more details.
    22         -/
    23         -/    You should have received a copy of the GNU General Public License
    24         -/    along with this program.  If not, see <http://www.gnu.org/licenses/>.
    25         -/
    26         -*/
    27         -
    28         -#include <stdlib.h>
    29         -#include <stdio.h>
    30         -#include <string.h>
    31         -
    32         -#include <zlib.h>
    33         -
    34         -/*
    35         -static void
    36         -do_debug (const char *html, int len)
    37         -{
    38         -    fwrite (html, 1, len, stdout);
    39         -}
    40         -*/
    41         -
    42         -static int
    43         -load_splite (FILE * in, char **buf, int *buf_len)
    44         -{
    45         -/* loading in memory "./spatialite-sql-latest.html" */
    46         -    char *mem = NULL;
    47         -    int size;
    48         -    if (fseek (in, 0, SEEK_END) < 0)
    49         -      {
    50         -	  fprintf (stderr,
    51         -		   "ERROR: fseek failure on \"./spatialite-sql-latest.html/\"\n");
    52         -	  goto stop;
    53         -      }
    54         -    size = ftell (in);
    55         -    rewind (in);
    56         -    mem = malloc (size);
    57         -    if (mem == NULL)
    58         -      {
    59         -	  fprintf (stderr, "ERROR: insufficient memory\n");
    60         -	  goto stop;
    61         -      }
    62         -    if (fread (mem, 1, size, in) != (unsigned int) size)
    63         -      {
    64         -	  fprintf (stderr,
    65         -		   "ERROR: fread failure on \"./spatialite-sql-latest.html/\"\n");
    66         -	  goto stop;
    67         -      }
    68         -    *buf = mem;
    69         -    *buf_len = size;
    70         -    return 1;
    71         -
    72         -  stop:
    73         -    *buf = NULL;
    74         -    *buf_len = 0;
    75         -    return 0;
    76         -}
    77         -
    78         -static int
    79         -load_rl2 (FILE * in, char **buf, int *buf_len)
    80         -{
    81         -/* loading in memory "./rl2-sql-latest.html" */
    82         -    char *mem = NULL;
    83         -    int size;
    84         -    if (fseek (in, 0, SEEK_END) < 0)
    85         -      {
    86         -	  fprintf (stderr,
    87         -		   "ERROR: fseek failure on \"./rl2-sql-latest.html/\"\n");
    88         -	  goto stop;
    89         -      }
    90         -    size = ftell (in);
    91         -    rewind (in);
    92         -    mem = malloc (size);
    93         -    if (mem == NULL)
    94         -      {
    95         -	  fprintf (stderr, "ERROR: insufficient memory\n");
    96         -	  goto stop;
    97         -      }
    98         -    if (fread (mem, 1, size, in) != (unsigned int) size)
    99         -      {
   100         -	  fprintf (stderr,
   101         -		   "ERROR: fread failure on \"./rl2-sql-latest.html/\"\n");
   102         -	  goto stop;
   103         -      }
   104         -    *buf = mem;
   105         -    *buf_len = size;
   106         -    return 1;
   107         -
   108         -  stop:
   109         -    *buf = NULL;
   110         -    *buf_len = 0;
   111         -    return 0;
   112         -}
   113         -
   114         -static int
   115         -check_back (const char *buf)
   116         -{
   117         -    const char *p = buf;
   118         -    while (1)
   119         -      {
   120         -	  if (*p == ' ' || *p == '\t')
   121         -	    {
   122         -		/* skipping leading blanks */
   123         -		p++;
   124         -		continue;
   125         -	    }
   126         -	  break;
   127         -      }
   128         -    if (strcmp
   129         -	(p,
   130         -	 "<a href=\"https://www.gaia-gis.it/fossil/libspatialite\">back</a>") ==
   131         -	0)
   132         -	return 1;
   133         -    return 0;
   134         -}
   135         -
   136         -static int
   137         -check_end (const char *buf)
   138         -{
   139         -    const char *p = buf;
   140         -    while (1)
   141         -      {
   142         -	  if (*p == ' ' || *p == '\t')
   143         -	    {
   144         -		/* skipping leading blanks */
   145         -		p++;
   146         -		continue;
   147         -	    }
   148         -	  break;
   149         -      }
   150         -    if (strncmp (p, "</body>", 7) == 0)
   151         -	return 1;
   152         -    return 0;
   153         -}
   154         -
   155         -static void
   156         -check_toc (char *buf)
   157         -{
   158         -    int i;
   159         -    char title[256];
   160         -    const char *str;
   161         -    char *p = buf;
   162         -    while (1)
   163         -      {
   164         -	  if (*p == ' ' || *p == '\t')
   165         -	    {
   166         -		/* skipping leading blanks */
   167         -		p++;
   168         -		continue;
   169         -	    }
   170         -	  break;
   171         -      }
   172         -    if (strncmp (p, "<h2>SpatiaLite ", 15) != 0)
   173         -	return;
   174         -
   175         -    strcpy (title, p + 4);
   176         -    *(title + strlen (title) - 5) = '\0';
   177         -    p = buf;
   178         -
   179         -    str = "<h1>Table of Contents</h1>\n<ul>\n";
   180         -    for (i = 0; i < (int) strlen (str); i++)
   181         -	*p++ = str[i];
   182         -
   183         -    str = "<li><a href=\"#spatialite_sql\">SpatiaLite SQL functions</a></li>\n";
   184         -    for (i = 0; i < (int) strlen (str); i++)
   185         -	*p++ = str[i];
   186         -
   187         -    str =
   188         -	"<li><a href=\"#rasterlite2_sql\">RasterLite2 SQL functions</a></li>\n";
   189         -    for (i = 0; i < (int) strlen (str); i++)
   190         -	*p++ = str[i];
   191         -
   192         -    str = "</ul><br><hr>\n<h2><a name=\"spatialite_sql\">";
   193         -    for (i = 0; i < (int) strlen (str); i++)
   194         -	*p++ = str[i];
   195         -
   196         -    str = title;
   197         -    for (i = 0; i < (int) strlen (str); i++)
   198         -	*p++ = str[i];
   199         -
   200         -    str = "</a></h2>";
   201         -    for (i = 0; i < (int) strlen (str); i++)
   202         -	*p++ = str[i];
   203         -
   204         -    *p = '\0';
   205         -}
   206         -
   207         -static void
   208         -clean_splite (char **buf, int *buf_len)
   209         -{
   210         -/* cleaning "./spatialite-sql-latest.html" */
   211         -    const char *p_in = *buf;
   212         -    int in_len = *buf_len;
   213         -    char *out = malloc (in_len + 1024);
   214         -    char *p_out = out;
   215         -    char line[2048];
   216         -    char *p_line = line;
   217         -    int i;
   218         -
   219         -    for (i = 0; i < in_len; i++)
   220         -      {
   221         -	  if (*p_in == '\r')
   222         -	    {
   223         -		/* skipping RETURN chars */
   224         -		p_in++;
   225         -		continue;
   226         -	    }
   227         -	  if (*p_in == '\n')
   228         -	    {
   229         -		/* found a NEWLINE char */
   230         -		int skip = 0;
   231         -		*p_line = '\0';
   232         -		check_toc (line);
   233         -		if (check_back (line))
   234         -		    skip = 1;
   235         -		if (check_end (line))
   236         -		    skip = 1;
   237         -		if (!skip)
   238         -		  {
   239         -		      /* copying the current line into the output buffer */
   240         -		      unsigned int x;
   241         -		      for (x = 0; x < strlen (line); x++)
   242         -			  *p_out++ = line[x];
   243         -		      *p_out++ = '\n';
   244         -		  }
   245         -		p_line = line;
   246         -		p_in++;
   247         -		continue;
   248         -	    }
   249         -	  *p_line++ = *p_in++;
   250         -      }
   251         -    free (*buf);
   252         -    *buf = out;
   253         -    *buf_len = p_out - out;
   254         -}
   255         -
   256         -static int
   257         -check_start_rl2 (char *buf)
   258         -{
   259         -    int i;
   260         -    char title[256];
   261         -    const char *str;
   262         -    char *p = buf;
   263         -    while (1)
   264         -      {
   265         -	  if (*p == ' ' || *p == '\t')
   266         -	    {
   267         -		/* skipping leading blanks */
   268         -		p++;
   269         -		continue;
   270         -	    }
   271         -	  break;
   272         -      }
   273         -    if (strcmp (p, "<h1>RasterLite2 SQL functions - reference list</h1>") != 0)
   274         -	return 0;
   275         -
   276         -    strcpy (title, p + 4);
   277         -    *(title + strlen (title) - 5) = '\0';
   278         -    p = buf;
   279         -
   280         -    str = title;
   281         -    for (i = 0; i < (int) strlen (str); i++)
   282         -	*p++ = str[i];
   283         -
   284         -    str = "</a></h1>";
   285         -    for (i = 0; i < (int) strlen (str); i++)
   286         -	*p++ = str[i];
   287         -
   288         -    *p = '\0';
   289         -
   290         -    return 1;
   291         -}
   292         -
   293         -static int
   294         -check_end_rl2 (const char *buf)
   295         -{
   296         -    const char *p = buf;
   297         -    while (1)
   298         -      {
   299         -	  if (*p == ' ' || *p == '\t')
   300         -	    {
   301         -		/* skipping leading blanks */
   302         -		p++;
   303         -		continue;
   304         -	    }
   305         -	  break;
   306         -      }
   307         -    if (strcmp
   308         -	(p,
   309         -	 "Back to <a href=\"https://www.gaia-gis.it/fossil/librasterlite2/wiki?name=rasterlite2-doc\">RasterLite2 doc index</a>")
   310         -	== 0)
   311         -	return 1;
   312         -    return 0;
   313         -}
   314         -
   315         -static void
   316         -sanitize_tags (char *line)
   317         -{
   318         -    char *p;
   319         -    while (1)
   320         -      {
   321         -	  p = strstr (line, "<br />");
   322         -	  if (p != NULL)
   323         -	      memcpy (p, "<br>  ", 6);
   324         -	  else
   325         -	      break;
   326         -      }
   327         -    while (1)
   328         -      {
   329         -	  p = strstr (line, "<hr />");
   330         -	  if (p != NULL)
   331         -	      memcpy (p, "<hr>  ", 6);
   332         -	  else
   333         -	      break;
   334         -      }
   335         -}
   336         -
   337         -static void
   338         -clean_rl2 (char **buf, int *buf_len)
   339         -{
   340         -/* cleaning "./rl2-sql-latest.html" */
   341         -    const char *p_in = *buf;
   342         -    int in_len = *buf_len;
   343         -    char *out = malloc (in_len + 1024);
   344         -    char *p_out = out;
   345         -    char line[2048];
   346         -    char *p_line = line;
   347         -    int i;
   348         -    int start = 0;
   349         -    int end = 0;
   350         -    const char *header =
   351         -	"<br><br><br><br><br><br>\n<h1><a name=\"rasterlite2_sql\">";
   352         -    const char *footer = "</body></html>\n";
   353         -
   354         -    for (i = 0; i < in_len; i++)
   355         -      {
   356         -	  if (*p_in == '\r')
   357         -	    {
   358         -		/* skipping RETURN chars */
   359         -		p_in++;
   360         -		continue;
   361         -	    }
   362         -	  if (*p_in == '\n')
   363         -	    {
   364         -		/* found a NEWLINE char */
   365         -		*p_line = '\0';
   366         -		if (check_start_rl2 (line))
   367         -		  {
   368         -		      int x;
   369         -		      start = 1;
   370         -		      for (x = 0; x < (int) strlen (header); x++)
   371         -			  *p_out++ = header[x];
   372         -		  }
   373         -		if (check_end_rl2 (line))
   374         -		    end = 1;
   375         -		sanitize_tags (line);
   376         -		if (start && !end)
   377         -		  {
   378         -		      /* copying the current line into the output buffer */
   379         -		      unsigned int x;
   380         -		      for (x = 0; x < strlen (line); x++)
   381         -			  *p_out++ = line[x];
   382         -		      *p_out++ = '\n';
   383         -		  }
   384         -		p_line = line;
   385         -		p_in++;
   386         -		continue;
   387         -	    }
   388         -	  *p_line++ = *p_in++;
   389         -      }
   390         -    free (*buf);
   391         -    for (i = 0; i < (int) strlen (footer); i++)
   392         -	*p_out++ = footer[i];
   393         -    *buf = out;
   394         -    *buf_len = p_out - out;
   395         -}
   396         -
   397         -static int
   398         -zip_compress (const char *html, int len_html, unsigned char **zip, int *len_zip)
   399         -{
   400         -/* compressing the HTML page (DEFLATE - ZIP) */
   401         -    int ret;
   402         -    uLong zLen = len_html - 1;
   403         -    unsigned char *zip_buf = malloc (zLen);
   404         -    if (zip_buf == NULL)
   405         -      {
   406         -	  fprintf (stderr, "ERROR: insufficient memory\n");
   407         -	  goto error;
   408         -      }
   409         -    ret = compress (zip_buf, &zLen, (const Bytef *) html, (uLong) len_html);
   410         -    if (ret == Z_OK)
   411         -      {
   412         -	  *zip = zip_buf;
   413         -	  *len_zip = zLen;
   414         -	  return 1;
   415         -      }
   416         -    else if (ret == Z_BUF_ERROR)
   417         -	fprintf (stderr, "ERROR: ZIP compression causes inflation\n");
   418         -    else
   419         -	fprintf (stderr, "ERROR: internal ZIP codec failure (compression)\n");
   420         -
   421         -  error:
   422         -    *zip = NULL;
   423         -    *len_zip = 0;
   424         -    return 0;
   425         -}
   426         -
   427         -static void
   428         -print_source (FILE * out, int len_html, unsigned char *zip, int len_zip)
   429         -{
   430         -/* printing the C++ source file */
   431         -    int i;
   432         -    int j;
   433         -    int lim;
   434         -
   435         -    fprintf (out, "/*\n/ HtmlHelp.cpp\n");
   436         -    fprintf (out, "/ spatialite_gui HTML Help generator\n/\n");
   437         -    fprintf (out, "/ This code was autogenerated by \"helpgen\" on xxxxx\n/\n");
   438         -    fprintf (out, "/ Author: Sandro Furieri a.furieri@lqt.it\n/\n");
   439         -    fprintf (out, "/ Copyright (C) 2017  Alessandro Furieri\n/\n");
   440         -    fprintf (out,
   441         -	     "/    This program is free software: you can redistribute it and/or modify\n");
   442         -    fprintf (out,
   443         -	     "/    it under the terms of the GNU General Public License as published by\n");
   444         -    fprintf (out,
   445         -	     "/    the Free Software Foundation, either version 3 of the License, or\n");
   446         -    fprintf (out, "/    (at your option) any later version.\n/\n");
   447         -    fprintf (out,
   448         -	     "/    This program is distributed in the hope that it will be useful,\n");
   449         -    fprintf (out,
   450         -	     "/    but WITHOUT ANY WARRANTY; without even the implied warranty of\n");
   451         -    fprintf (out,
   452         -	     "/    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n");
   453         -    fprintf (out, "/    GNU General Public License for more details.\n/\n");
   454         -    fprintf (out,
   455         -	     "/    You should have received a copy of the GNU General Public License\n");
   456         -    fprintf (out,
   457         -	     "/    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n/\n*/\n\n");
   458         -    fprintf (out, "#include \"Classdef.h\"\n\n");
   459         -    fprintf (out, "#include <zlib.h>\n\n");
   460         -    fprintf (out, "void MyFrame::GetHelp(wxString & html_text)\n{\n");
   461         -    fprintf (out,
   462         -	     "//\n// return the HTML Help Page from the ZIP compressed data\n//\n");
   463         -    fprintf (out, "\tunsigned char *zip_buf = NULL;\n");
   464         -    fprintf (out, "\tint uncompressed_len = %d;\n", len_html);
   465         -    fprintf (out, "\tint compressed_len = %d;\n", len_zip);
   466         -    fprintf (out, "\tuLong inLen = compressed_len;\n");
   467         -    fprintf (out, "\tuLong outLen = uncompressed_len;\n");
   468         -    fprintf (out, "\tconst Bytef *in;\n");
   469         -    fprintf (out, "\tBytef *out;\n");
   470         -    fprintf (out, "\tchar *html = NULL;\n\n");
   471         -
   472         -    fprintf (out, "// allocating the ZIP compressed buffer\n");
   473         -    fprintf (out, "\tzip_buf = (unsigned char *)malloc(uncompressed_len);\n");
   474         -    fprintf (out, "\tif (zip_buf == NULL)\n\t\tgoto error;\n\n");
   475         -
   476         -    fprintf (out, "// feeding the ZIP compressed buffer\n");
   477         -    for (i = 0; i < len_zip; i += 25)
   478         -      {
   479         -	  fprintf (out, "\tFeedZipHtml (zip_buf, %d, \"", i);
   480         -	  lim = 25;
   481         -	  if (i + lim > len_zip)
   482         -	      lim = len_zip - i;
   483         -	  for (j = 0; j < lim; j++)
   484         -	      fprintf (out, "%02x", *(zip + i + j));
   485         -	  fprintf (out, "\");\n");
   486         -      }
   487         -    fprintf (out, "\n// uncompressing the ZIP payload\n");
   488         -    fprintf (out, "\tin = zip_buf;\n");
   489         -    fprintf (out, "\thtml = (char *)malloc (uncompressed_len + 1);\n");
   490         -    fprintf (out, "\tif (html == NULL)\n\t\tgoto error;\n");
   491         -    fprintf (out, "\tout = (Bytef *)html;\n");
   492         -    fprintf (out, "\tif (uncompress (out, &outLen, in, inLen) != Z_OK)\n");
   493         -    fprintf (out, "\t\tgoto error;\n");
   494         -    fprintf (out, "\t*(html + uncompressed_len) = '\\0';\n");
   495         -    fprintf (out, "\tfree(zip_buf);\n");
   496         -    fprintf (out, "\thtml_text = wxString::FromUTF8(html);\n");
   497         -    fprintf (out, "\tfree(html);\n");
   498         -    fprintf (out, "\treturn;\n\nerror:\n");
   499         -    fprintf (out, "\tif (zip_buf != NULL)\n\t\tfree(zip_buf);\n");
   500         -    fprintf (out, "\tif (html != NULL)\n\t\tfree(html);\n");
   501         -    fprintf (out, "\thtml_text = wxT(\"<html><body><h1>Sorry, HTML Help "
   502         -	     "is currently unavailable.</h1></body></html>\");\n");
   503         -    fprintf (out, "}\n");
   504         -}
   505         -
   506         -int
   507         -main (void)
   508         -{
   509         -/*
   510         -/
   511         -/ Please note: no args are supported !!!
   512         -/
   513         -/ we'll expect to find two input files respectively named:
   514         -/ ./spatialite-sql-latest.html
   515         -/ ./rl2-sql-latest.html
   516         -/
   517         -/ the C++ code will be generated into: ./HtmlHelp.cpp
   518         -/
   519         -*/
   520         -    FILE *fl_splite = NULL;
   521         -    FILE *fl_rl2 = NULL;
   522         -    FILE *fl_out = NULL;
   523         -    char *p_splite = NULL;
   524         -    int len_splite = 0;
   525         -    char *p_rl2 = NULL;
   526         -    int len_rl2 = 0;
   527         -    char *html = NULL;
   528         -    int len_html = 0;
   529         -    unsigned char *zip = NULL;
   530         -    int len_zip = 0;
   531         -
   532         -/* opening input and output files */
   533         -    fl_splite = fopen ("./spatialite-sql-latest.html", "rb");
   534         -    if (fl_splite == NULL)
   535         -      {
   536         -	  fprintf (stderr,
   537         -		   "ERROR: unable to open the \"./spatialite-sql-latest.html\" input file\n");
   538         -	  goto stop;
   539         -      }
   540         -    fl_rl2 = fopen ("./rl2-sql-latest.html", "rb");
   541         -    if (fl_rl2 == NULL)
   542         -      {
   543         -	  fprintf (stderr,
   544         -		   "ERROR: unable to open the \"./rl2-sql-latest.html\" input file\n");
   545         -	  goto stop;
   546         -      }
   547         -    fl_out = fopen ("./HtmlHelp.cpp", "wb");
   548         -    if (fl_out == NULL)
   549         -      {
   550         -	  fprintf (stderr,
   551         -		   "ERROR: unable to open/create the \"./HtmlHelp.cpp\" output file\n");
   552         -	  goto stop;
   553         -      }
   554         -
   555         -/* loading and arranging input files */
   556         -    if (!load_splite (fl_splite, &p_splite, &len_splite))
   557         -      {
   558         -	  fprintf (stderr,
   559         -		   "ERROR: unable to load the \"./spatialite-sql-latest.html\" input file\n");
   560         -	  goto stop;
   561         -      }
   562         -    if (!load_rl2 (fl_rl2, &p_rl2, &len_rl2))
   563         -      {
   564         -	  fprintf (stderr,
   565         -		   "ERROR: unable to load the \"./rl2-sql-latest.html\" input file\n");
   566         -	  goto stop;
   567         -      }
   568         -    clean_splite (&p_splite, &len_splite);
   569         -    clean_rl2 (&p_rl2, &len_rl2);
   570         -
   571         -/* creating in memory the uncompressed HTML page */
   572         -    len_html = len_splite + len_rl2;
   573         -    html = malloc (len_html);
   574         -    if (html == NULL)
   575         -      {
   576         -	  fprintf (stderr, "ERROR: insufficient memory\n");
   577         -	  goto stop;
   578         -      }
   579         -    memcpy (html, p_splite, len_splite);
   580         -    memcpy (html + len_splite, p_rl2, len_rl2);
   581         -    free (p_splite);
   582         -    p_splite = NULL;
   583         -    free (p_rl2);
   584         -    p_rl2 = NULL;
   585         -
   586         -/* compressing the HTML page */
   587         -    if (!zip_compress (html, len_html, &zip, &len_zip))
   588         -      {
   589         -	  fprintf (stderr, "ERROR: unable to DEFLATE\n");
   590         -	  goto stop;
   591         -      }
   592         -
   593         -/* autogenerating the C++ source */
   594         -    print_source (fl_out, len_html, zip, len_zip);
   595         -
   596         -/* end - cleanup */
   597         -  stop:
   598         -    if (zip != NULL)
   599         -	free (zip);
   600         -    if (html != NULL)
   601         -	free (html);
   602         -    if (p_splite != NULL)
   603         -	free (p_splite);
   604         -    if (p_rl2 != NULL)
   605         -	free (p_rl2);
   606         -    if (fl_splite)
   607         -	fclose (fl_splite);
   608         -    if (fl_rl2)
   609         -	fclose (fl_rl2);
   610         -    if (fl_out)
   611         -	fclose (fl_out);
   612         -    return 0;
   613         -}

Changes to icons/Makefile.am.

    20     20   	icon_map.xpm crosshair.xpm wms_off.xpm vector_off.xpm \
    21     21   	coverage_off.xpm identify.xpm zoom_in.xpm zoom_out.xpm \
    22     22   	map_table.xpm pan.xpm printer.xpm 	map_root.xpm map_go.xpm \
    23     23   	map_edit.xpm map_add.xpm linestrings_on.xpm linestrings_off.xpm \
    24     24   	points_on.xpm points_off.xpm polygons_on.xpm polygons_off.xpm \
    25     25   	topo_geo_off.xpm topo_net_off.xpm dustbin.xpm gpkgtable.xpm \
    26     26   	gpkgvtable.xpm gpkggeom.xpm virtgpkg.xpm gpkg_spatialidx.xpm \
    27         -	red_light.xpm green_light.xpm yellow_light.xpm map_magnify.xpm \
    28         -	postgres.xpm postgres_schema.xpm postgres_table.xpm \
    29         -	postgres_view.xpm
           27  +	red_light.xpm green_light.xpm yellow_light.xpm map_magnify.xpm

Changes to icons/Makefile.in.

     1         -# Makefile.in generated by automake 1.15.1 from Makefile.am.
            1  +# Makefile.in generated by automake 1.15 from Makefile.am.
     2      2   # @configure_input@
     3      3   
     4         -# Copyright (C) 1994-2017 Free Software Foundation, Inc.
            4  +# Copyright (C) 1994-2014 Free Software Foundation, Inc.
     5      5   
     6      6   # This Makefile.in is free software; the Free Software Foundation
     7      7   # gives unlimited permission to copy and/or distribute it,
     8      8   # with or without modifications, as long as this notice is preserved.
     9      9   
    10     10   # This program is distributed in the hope that it will be useful,
    11     11   # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
................................................................................
   170    170   LIBOBJS = @LIBOBJS@
   171    171   LIBRASTERLITE2_CFLAGS = @LIBRASTERLITE2_CFLAGS@
   172    172   LIBRASTERLITE2_LIBS = @LIBRASTERLITE2_LIBS@
   173    173   LIBS = @LIBS@
   174    174   LIBSPATIALITE_CFLAGS = @LIBSPATIALITE_CFLAGS@
   175    175   LIBSPATIALITE_LIBS = @LIBSPATIALITE_LIBS@
   176    176   LIBTOOL = @LIBTOOL@
   177         -LIBVIRTUALPG_CFLAGS = @LIBVIRTUALPG_CFLAGS@
   178         -LIBVIRTUALPG_LIBS = @LIBVIRTUALPG_LIBS@
   179    177   LIBWEBP_CFLAGS = @LIBWEBP_CFLAGS@
   180    178   LIBWEBP_LIBS = @LIBWEBP_LIBS@
   181    179   LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
   182    180   LIBXML2_LIBS = @LIBXML2_LIBS@
   183    181   LIPO = @LIPO@
   184    182   LN_S = @LN_S@
   185    183   LTLIBOBJS = @LTLIBOBJS@
................................................................................
   198    196   PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
   199    197   PACKAGE_NAME = @PACKAGE_NAME@
   200    198   PACKAGE_STRING = @PACKAGE_STRING@
   201    199   PACKAGE_TARNAME = @PACKAGE_TARNAME@
   202    200   PACKAGE_URL = @PACKAGE_URL@
   203    201   PACKAGE_VERSION = @PACKAGE_VERSION@
   204    202   PATH_SEPARATOR = @PATH_SEPARATOR@
   205         -PGCONFIG = @PGCONFIG@
   206         -PG_CFLAGS = @PG_CFLAGS@
   207         -PG_LDFLAGS = @PG_LDFLAGS@
   208         -PG_LIB = @PG_LIB@
   209    203   PKG_CONFIG = @PKG_CONFIG@
   210    204   PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
   211    205   PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
   212    206   RANLIB = @RANLIB@
   213    207   SED = @SED@
   214    208   SET_MAKE = @SET_MAKE@
   215    209   SHELL = @SHELL@
................................................................................
   291    285   	icon_map.xpm crosshair.xpm wms_off.xpm vector_off.xpm \
   292    286   	coverage_off.xpm identify.xpm zoom_in.xpm zoom_out.xpm \
   293    287   	map_table.xpm pan.xpm printer.xpm 	map_root.xpm map_go.xpm \
   294    288   	map_edit.xpm map_add.xpm linestrings_on.xpm linestrings_off.xpm \
   295    289   	points_on.xpm points_off.xpm polygons_on.xpm polygons_off.xpm \
   296    290   	topo_geo_off.xpm topo_net_off.xpm dustbin.xpm gpkgtable.xpm \
   297    291   	gpkgvtable.xpm gpkggeom.xpm virtgpkg.xpm gpkg_spatialidx.xpm \
   298         -	red_light.xpm green_light.xpm yellow_light.xpm map_magnify.xpm \
   299         -	postgres.xpm postgres_schema.xpm postgres_table.xpm \
   300         -	postgres_view.xpm
          292  +	red_light.xpm green_light.xpm yellow_light.xpm map_magnify.xpm
   301    293   
   302    294   all: all-am
   303    295   
   304    296   .SUFFIXES:
   305    297   $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
   306    298   	@for dep in $?; do \
   307    299   	  case '$(am__configure_deps)' in \

Deleted icons/postgres.xpm.

     1         -/* XPM */
     2         -static const char * postgres_xpm[] = {
     3         -"16 16 60 1",
     4         -" 	c None",
     5         -".	c #EEF2F4",
     6         -"+	c #E6EBEE",
     7         -"@	c #B6C5C9",
     8         -"#	c #AFBFC8",
     9         -"$	c #91ABB7",
    10         -"%	c #39638A",
    11         -"&	c #346483",
    12         -"*	c #93A5B4",
    13         -"=	c #8FAAB4",
    14         -"-	c #396485",
    15         -";	c #6B8EA1",
    16         -">	c #93B5C4",
    17         -",	c #9AADBD",
    18         -"'	c #D5DFE5",
    19         -")	c #346391",
    20         -"!	c #35638C",
    21         -"~	c #45697F",
    22         -"{	c #4B708A",
    23         -"]	c #BCC9CF",
    24         -"^	c #7596AD",
    25         -"/	c #5D7D9E",
    26         -"(	c #2F628E",
    27         -"_	c #7794A5",
    28         -":	c #6184A2",
    29         -"<	c #9BB8C4",
    30         -"[	c #8CACC0",
    31         -"}	c #7D9DB2",
    32         -"|	c #8CA9BD",
    33         -"1	c #A9BEC7",
    34         -"2	c #C3D4DC",
    35         -"3	c #C2CFD3",
    36         -"4	c #95B2BC",
    37         -"5	c #608592",
    38         -"6	c #85A9BD",
    39         -"7	c #416589",
    40         -"8	c #7CA1B4",
    41         -"9	c #5D809C",
    42         -"0	c #6E96AA",
    43         -"a	c #577688",
    44         -"b	c #8DA6B8",
    45         -"c	c #466D89",
    46         -"d	c #3F6890",
    47         -"e	c #BAC5CB",
    48         -"f	c #D4DCDF",
    49         -"g	c #8BA4B6",
    50         -"h	c #ECEEEE",
    51         -"i	c #D9E1E3",
    52         -"j	c #8BA5AD",
    53         -"k	c #567698",
    54         -"l	c #8495A3",
    55         -"m	c #C1C6CA",
    56         -"n	c #2E688B",
    57         -"o	c #E7EDF1",
    58         -"p	c #5E81A3",
    59         -"q	c #4A7299",
    60         -"r	c #61839C",
    61         -"s	c #486B8A",
    62         -"t	c #597C96",
    63         -"u	c #D7E1E6",
    64         -"  ..   .+  @#.  ",
    65         -" $%&&*=-&-;>&-, ",
    66         -"'-)!~>&!!!!{$!-]",
    67         -"$)!!^/(!%!)!_:)<",
    68         -",!))[><}!)!|1<!2",
    69         -"3!)!>~^4!!%456! ",
    70         -".!!)[%!^7)->{8; ",
    71         -" 9)!>&!}%))0a$' ",
    72         -" b)!|c&>!!)d1e  ",
    73         -" f-!c]g4!!)!=h  ",
    74         -"  g!] ijk)(!1lm ",
    75         -"   2 'j@/)n%o   ",
    76         -"        p)(d    ",
    77         -"        :!(q    ",
    78         -"        _!)r    ",
    79         -"        3stu    "};

Deleted icons/postgres_schema.xpm.

     1         -/* XPM */
     2         -static const char * postgres_schema_xpm[] = {
     3         -"16 16 82 1",
     4         -" 	g None",
     5         -".	g #80BABA",
     6         -"+	g #80B8B8",
     7         -"@	g #80B7B7",
     8         -"#	g #80B6B6",
     9         -"$	g #80B4B4",
    10         -"%	g #80B3B3",
    11         -"&	g #80BBBB",
    12         -"*	g #80D0D0",
    13         -"=	g #80E8E8",
    14         -"-	g #80F3F3",
    15         -";	g #80FDFD",
    16         -">	g #80FCFC",
    17         -",	g #80EDED",
    18         -"'	g #80E0E0",
    19         -")	g #80C2C2",
    20         -"!	g #80ADAD",
    21         -"~	g #80E1E1",
    22         -"{	g #80FEFE",
    23         -"]	g #80FFFF",
    24         -"^	g #80FBFB",
    25         -"/	g #80CFCF",
    26         -"(	g #80A9A9",
    27         -"_	g #80B9B9",
    28         -":	g #80F8F8",
    29         -"<	g #80EAEA",
    30         -"[	g #80A7A7",
    31         -"}	g #80F7F7",
    32         -"|	g #80E7E7",
    33         -"1	g #80EFEF",
    34         -"2	g #80F6F6",
    35         -"3	g #80FAFA",
    36         -"4	g #80F0F0",
    37         -"5	g #80DEDE",
    38         -"6	g #80C3C3",
    39         -"7	g #80E6E6",
    40         -"8	g #80A5A5",
    41         -"9	g #80B5B5",
    42         -"0	g #80EBEB",
    43         -"a	g #80D6D6",
    44         -"b	g #80D5D5",
    45         -"c	g #80D1D1",
    46         -"d	g #80BCBC",
    47         -"e	g #80C0C0",
    48         -"f	g #80E5E5",
    49         -"g	g #80A3A3",
    50         -"h	g #80F5F5",
    51         -"i	g #80EEEE",
    52         -"j	g #80E2E2",
    53         -"k	g #80CDCD",
    54         -"l	g #80E3E3",
    55         -"m	g #80A0A0",
    56         -"n	g #80B2B2",
    57         -"o	g #80F4F4",
    58         -"p	g #80DDDD",
    59         -"q	g #80C9C9",
    60         -"r	g #80BDBD",
    61         -"s	g #80BFBF",
    62         -"t	g #809E9E",
    63         -"u	g #80B0B0",
    64         -"v	g #80D9D9",
    65         -"w	g #80DBDB",
    66         -"x	g #80C4C4",
    67         -"y	g #809B9B",
    68         -"z	g #80AEAE",
    69         -"A	g #80F2F2",
    70         -"B	g #80D8D8",
    71         -"C	g #80DCDC",
    72         -"D	g #809696",
    73         -"E	g #80ACAC",
    74         -"F	g #80D4D4",
    75         -"G	g #80D2D2",
    76         -"H	g #809090",
    77         -"I	g #808B8B",
    78         -"J	g #80CECE",
    79         -"K	g #808A8A",
    80         -"L	g #80A1A1",
    81         -"M	g #809F9F",
    82         -"N	g #80ABAB",
    83         -"O	g #809595",
    84         -"P	g #808D8D",
    85         -"Q	g #808989",
    86         -"                ",
    87         -"     .+@#$%     ",
    88         -"   &*=-;>,')!   ",
    89         -"  .~{]]]]]]^/(  ",
    90         -"  _:{]]]]]]^<[  ",
    91         -"  @}|12^345678  ",
    92         -"  9205abc6defg  ",
    93         -"  $hi7j7~k))lm  ",
    94         -"  no<~pl5qrsjt  ",
    95         -"  u-|pv'wx+&~y  ",
    96         -"  zAjBbCBe%@'D  ",
    97         -"  E45FGwasu%5H  ",
    98         -"  (5-wGwaeq7xI  ",
    99         -"   8J,oho1j.K   ",
   100         -"    LMLN[OPQ    ",
   101         -"                "};

Deleted icons/postgres_table.xpm.

     1         -/* XPM */
     2         -static const char * postgres_table_xpm[] = {
     3         -"16 16 100 2",
     4         -"  	c None",
     5         -". 	c #80C1EF",
     6         -"+ 	c #80C0ED",
     7         -"@ 	c #80BEEB",
     8         -"# 	c #80BCEB",
     9         -"$ 	c #80BAE9",
    10         -"% 	c #80B7E7",
    11         -"& 	c #80B5E6",
    12         -"* 	c #80B2E4",
    13         -"= 	c #80AFE2",
    14         -"- 	c #80ACE0",
    15         -"; 	c #80A9DD",
    16         -"> 	c #80A5DC",
    17         -", 	c #80A3DA",
    18         -"' 	c #80C1EE",
    19         -") 	c #80F7FB",
    20         -"! 	c #80A0D7",
    21         -"~ 	c #80BFEC",
    22         -"{ 	c #80D59C",
    23         -"] 	c #80D398",
    24         -"^ 	c #80D094",
    25         -"/ 	c #80CE90",
    26         -"( 	c #80CB8B",
    27         -"_ 	c #80C987",
    28         -": 	c #80C682",
    29         -"< 	c #80C37E",
    30         -"[ 	c #80C17A",
    31         -"} 	c #80BE76",
    32         -"| 	c #809BD4",
    33         -"1 	c #80BDEB",
    34         -"2 	c #80FFFF",
    35         -"3 	c #8097D1",
    36         -"4 	c #80BAE9",
    37         -"5 	c #80C3E9",
    38         -"6 	c #8093CE",
    39         -"7 	c #80B7E7",
    40         -"8 	c #80C4E8",
    41         -"9 	c #80C7E8",
    42         -"0 	c #80F1F7",
    43         -"a 	c #808FCB",
    44         -"b 	c #80B4E5",
    45         -"c 	c #80F6FA",
    46         -"d 	c #80C6E9",
    47         -"e 	c #80C6E9",
    48         -"f 	c #80C7EA",
    49         -"g 	c #80C7E9",
    50         -"h 	c #80C9E9",
    51         -"i 	c #80C9E9",
    52         -"j 	c #80C8E8",
    53         -"k 	c #80CCE8",
    54         -"l 	c #80E7F2",
    55         -"m 	c #808AC8",
    56         -"n 	c #80B1E3",
    57         -"o 	c #80F6FA",
    58         -"p 	c #80C9EA",
    59         -"q 	c #80C9EA",
    60         -"r 	c #80E5F1",
    61         -"s 	c #8086C6",
    62         -"t 	c #80AEE1",
    63         -"u 	c #80F4FA",
    64         -"v 	c #80CBEA",
    65         -"w 	c #80CCEA",
    66         -"x 	c #80CEEA",
    67         -"y 	c #80C8E8",
    68         -"z 	c #80E2F0",
    69         -"A 	c #8086C4",
    70         -"B 	c #80AADF",
    71         -"C 	c #80F3F9",
    72         -"D 	c #80D0EB",
    73         -"E 	c #80CFEA",
    74         -"F 	c #80F6FB",
    75         -"G 	c #808DC8",
    76         -"H 	c #80A8DD",
    77         -"I 	c #80D0EB",
    78         -"J 	c #80D1EB",
    79         -"K 	c #80CDEA",
    80         -"L 	c #808AC6",
    81         -"M 	c #80A4D9",
    82         -"N 	c #80F3F9",
    83         -"O 	c #80D2EB",
    84         -"P 	c #80D3EB",
    85         -"Q 	c #80C7EA",
    86         -"R 	c #808CC6",
    87         -"S 	c #80A1D7",
    88         -"T 	c #80F2F8",
    89         -"U 	c #80F0F7",
    90         -"V 	c #80EDF6",
    91         -"W 	c #80EAF4",
    92         -"X 	c #80E7F3",
    93         -"Y 	c #80E4F1",
    94         -"Z 	c #808AC5",
    95         -"` 	c #809ED6",
    96         -" .	c #8099D3",
    97         -"..	c #8096D1",
    98         -"+.	c #8092CE",
    99         -"@.	c #808ECB",
   100         -"#.	c #808AC9",
   101         -"$.	c #8087C7",
   102         -"%.	c #8084C3",
   103         -"&.	c #8077BB",
   104         -"                                ",
   105         -"    . + @ # $ % & * = - ; > ,   ",
   106         -"  ' ) ) ) ) ) ) ) ) ) ) ) ) !   ",
   107         -"  ~ ) { ] ^ / ( _ : < [ } ) |   ",
   108         -"  1 ) 2 2 2 2 2 2 2 2 2 2 ) 3   ",
   109         -"  4 ) 5 5 5 5 5 5 5 5 5 5 ) 6   ",
   110         -"  7 ) 5 2 8 2 2 2 9 2 2 2 0 a   ",
   111         -"  b c d e f g h i 9 i j k l m   ",
   112         -"  n o p 2 q 2 2 2 9 2 2 2 r s   ",
   113         -"  t u v w w w w x 9 9 j y z A   ",
   114         -"  B C x 2 D 2 2 2 E F 2 2 z G   ",
   115         -"  H C I D D D D J K K K K z L   ",
   116         -"  M N O 2 P 2 2 2 Q 2 2 2 z R   ",
   117         -"  S T U V W X Y z z z z z z Z   ",
   118         -"  `  ...+.@.#.$.%.%.%.%.%.%.&.  ",
   119         -"                                "};

Deleted icons/postgres_view.xpm.

     1         -/* XPM */
     2         -static const char * postgres_view_xpm[] = {
     3         -"16 16 132 2",
     4         -"  	c None",
     5         -". 	c #80B9B9",
     6         -"+ 	c #80B7B7",
     7         -"@ 	c #80B5B5",
     8         -"# 	c #80B2B2",
     9         -"$ 	c #80B0B0",
    10         -"% 	c #80BABA",
    11         -"& 	c #80D6D6",
    12         -"* 	c #80EDED",
    13         -"= 	c #80F9F9",
    14         -"- 	c #80FBFB",
    15         -"; 	c #80F0F0",
    16         -"> 	c #80D9D9",
    17         -", 	c #80ABAB",
    18         -"' 	c #80B8B8",
    19         -") 	c #80F6F6",
    20         -"! 	c #80F4F4",
    21         -"~ 	c #80A8A8",
    22         -"{ 	c #80B7E7",
    23         -"] 	c #80B5E6",
    24         -"^ 	c #80B2E4",
    25         -"/ 	c #80AFE2",
    26         -"( 	c #80ACE0",
    27         -"_ 	c #80A9DD",
    28         -": 	c #80A5DC",
    29         -"< 	c #80A3DA",
    30         -"[ 	c #80B6B6",
    31         -"} 	c #80F2F2",
    32         -"| 	c #80E4E4",
    33         -"1 	c #80E2E2",
    34         -"2 	c #80C8C8",
    35         -"3 	c #80F1F1",
    36         -"4 	c #80A5A5",
    37         -"5 	c #80F7FB",
    38         -"6 	c #80A0D7",
    39         -"7 	c #80B4B4",
    40         -"8 	c #80F8F8",
    41         -"9 	c #80DBDB",
    42         -"0 	c #80EFEF",
    43         -"a 	c #80D0D0",
    44         -"b 	c #80FFFF",
    45         -"c 	c #80A2A2",
    46         -"d 	c #80CB8B",
    47         -"e 	c #80C987",
    48         -"f 	c #80C682",
    49         -"g 	c #80C37E",
    50         -"h 	c #80C17A",
    51         -"i 	c #80BE76",
    52         -"j 	c #809BD4",
    53         -"k 	c #80B1B1",
    54         -"l 	c #80D5D5",
    55         -"m 	c #80CBCB",
    56         -"n 	c #809E9E",
    57         -"o 	c #8097D1",
    58         -"p 	c #80AEAE",
    59         -"q 	c #80D1D1",
    60         -"r 	c #80ECEC",
    61         -"s 	c #80C5C5",
    62         -"t 	c #80C6C6",
    63         -"u 	c #809A9A",
    64         -"v 	c #80C3E9",
    65         -"w 	c #8093CE",
    66         -"x 	c #80ACAC",
    67         -"y 	c #80FAFA",
    68         -"z 	c #80D7D7",
    69         -"A 	c #80CACA",
    70         -"B 	c #80CFCF",
    71         -"C 	c #809393",
    72         -"D 	c #80C7E8",
    73         -"E 	c #80F1F7",
    74         -"F 	c #808FCB",
    75         -"G 	c #80A9A9",
    76         -"H 	c #80EAEA",
    77         -"I 	c #80959A",
    78         -"J 	c #80C9E9",
    79         -"K 	c #80C9E9",
    80         -"L 	c #80C8E8",
    81         -"M 	c #80CCE8",
    82         -"N 	c #80E7F2",
    83         -"O 	c #808AC8",
    84         -"P 	c #80A4AF",
    85         -"Q 	c #80ABAB",
    86         -"R 	c #80A0A4",
    87         -"S 	c #80A7A7",
    88         -"T 	c #80A7B6",
    89         -"U 	c #80F3F3",
    90         -"V 	c #80E5F1",
    91         -"W 	c #8086C6",
    92         -"X 	c #80ACD8",
    93         -"Y 	c #80DEE3",
    94         -"Z 	c #80BBD2",
    95         -"` 	c #80C2DB",
    96         -" .	c #80C7E3",
    97         -"..	c #80CCEA",
    98         -"+.	c #80CEEA",
    99         -"@.	c #80C8E8",
   100         -"#.	c #80E2F0",
   101         -"$.	c #8086C4",
   102         -"%.	c #80AADF",
   103         -"&.	c #80F3F9",
   104         -"*.	c #80D0EB",
   105         -"=.	c #80CFEA",
   106         -"-.	c #80F6FB",
   107         -";.	c #808DC8",
   108         -">.	c #80A8DD",
   109         -",.	c #80D0EB",
   110         -"'.	c #80D1EB",
   111         -").	c #80CDEA",
   112         -"!.	c #808AC6",
   113         -"~.	c #80A4D9",
   114         -"{.	c #80F3F9",
   115         -"].	c #80D2EB",
   116         -"^.	c #80D3EB",
   117         -"/.	c #80C7EA",
   118         -"(.	c #808CC6",
   119         -"_.	c #80A1D7",
   120         -":.	c #80F2F8",
   121         -"<.	c #80F0F7",
   122         -"[.	c #80EDF6",
   123         -"}.	c #80EAF4",
   124         -"|.	c #80E7F3",
   125         -"1.	c #80E4F1",
   126         -"2.	c #808AC5",
   127         -"3.	c #809ED6",
   128         -"4.	c #8099D3",
   129         -"5.	c #8096D1",
   130         -"6.	c #8092CE",
   131         -"7.	c #808ECB",
   132         -"8.	c #808AC9",
   133         -"9.	c #8087C7",
   134         -"0.	c #8084C3",
   135         -"a.	c #8077BB",
   136         -"    . + @ # $                   ",
   137         -"% & * = - ; > ,                 ",
   138         -"' ) ! = - ) ) ~ { ] ^ / ( _ : < ",
   139         -"[ } > | 1 2 3 4 5 5 5 5 5 5 5 6 ",
   140         -"7 8 9 0 a a b c d e f g h i 5 j ",
   141         -"k 8 l 0 m m b n b b b b b b 5 o ",
   142         -"p 8 q r s t b u v v v v v v 5 w ",
   143         -"x y z 1 A B b C b b D b b b E F ",
   144         -"G m H ; } r A I J K D K L M N O ",
   145         -"    P Q R S T U b b D b b b V W ",
   146         -"    X Y Z `  .....+.D D L @.#.$.",
   147         -"    %.&.+.b *.b b b =.-.b b #.;.",
   148         -"    >.&.,.*.*.*.*.'.).).).).#.!.",
   149         -"    ~.{.].b ^.b b b /.b b b #.(.",
   150         -"    _.:.<.[.}.|.1.#.#.#.#.#.#.2.",
   151         -"    3.4.5.6.7.8.9.0.0.0.0.0.0.a."};

Changes to mac_resource/Makefile.in.

     1         -# Makefile.in generated by automake 1.15.1 from Makefile.am.
            1  +# Makefile.in generated by automake 1.15 from Makefile.am.
     2      2   # @configure_input@
     3      3   
     4         -# Copyright (C) 1994-2017 Free Software Foundation, Inc.
            4  +# Copyright (C) 1994-2014 Free Software Foundation, Inc.
     5      5   
     6      6   # This Makefile.in is free software; the Free Software Foundation
     7      7   # gives unlimited permission to copy and/or distribute it,
     8      8   # with or without modifications, as long as this notice is preserved.
     9      9   
    10     10   # This program is distributed in the hope that it will be useful,
    11     11   # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
................................................................................
   170    170   LIBOBJS = @LIBOBJS@
   171    171   LIBRASTERLITE2_CFLAGS = @LIBRASTERLITE2_CFLAGS@
   172    172   LIBRASTERLITE2_LIBS = @LIBRASTERLITE2_LIBS@
   173    173   LIBS = @LIBS@
   174    174   LIBSPATIALITE_CFLAGS = @LIBSPATIALITE_CFLAGS@
   175    175   LIBSPATIALITE_LIBS = @LIBSPATIALITE_LIBS@
   176    176   LIBTOOL = @LIBTOOL@
   177         -LIBVIRTUALPG_CFLAGS = @LIBVIRTUALPG_CFLAGS@
   178         -LIBVIRTUALPG_LIBS = @LIBVIRTUALPG_LIBS@
   179    177   LIBWEBP_CFLAGS = @LIBWEBP_CFLAGS@
   180    178   LIBWEBP_LIBS = @LIBWEBP_LIBS@
   181    179   LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
   182    180   LIBXML2_LIBS = @LIBXML2_LIBS@
   183    181   LIPO = @LIPO@
   184    182   LN_S = @LN_S@
   185    183   LTLIBOBJS = @LTLIBOBJS@
................................................................................
   198    196   PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
   199    197   PACKAGE_NAME = @PACKAGE_NAME@
   200    198   PACKAGE_STRING = @PACKAGE_STRING@
   201    199   PACKAGE_TARNAME = @PACKAGE_TARNAME@
   202    200   PACKAGE_URL = @PACKAGE_URL@
   203    201   PACKAGE_VERSION = @PACKAGE_VERSION@
   204    202   PATH_SEPARATOR = @PATH_SEPARATOR@
   205         -PGCONFIG = @PGCONFIG@
   206         -PG_CFLAGS = @PG_CFLAGS@
   207         -PG_LDFLAGS = @PG_LDFLAGS@
   208         -PG_LIB = @PG_LIB@
   209    203   PKG_CONFIG = @PKG_CONFIG@
   210    204   PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
   211    205   PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
   212    206   RANLIB = @RANLIB@
   213    207   SED = @SED@
   214    208   SET_MAKE = @SET_MAKE@
   215    209   SHELL = @SHELL@

Changes to win_resource/Makefile.in.

     1         -# Makefile.in generated by automake 1.15.1 from Makefile.am.
            1  +# Makefile.in generated by automake 1.15 from Makefile.am.
     2      2   # @configure_input@
     3      3   
     4         -# Copyright (C) 1994-2017 Free Software Foundation, Inc.
            4  +# Copyright (C) 1994-2014 Free Software Foundation, Inc.
     5      5   
     6      6   # This Makefile.in is free software; the Free Software Foundation
     7      7   # gives unlimited permission to copy and/or distribute it,
     8      8   # with or without modifications, as long as this notice is preserved.
     9      9   
    10     10   # This program is distributed in the hope that it will be useful,
    11     11   # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
................................................................................
   170    170   LIBOBJS = @LIBOBJS@
   171    171   LIBRASTERLITE2_CFLAGS = @LIBRASTERLITE2_CFLAGS@
   172    172   LIBRASTERLITE2_LIBS = @LIBRASTERLITE2_LIBS@
   173    173   LIBS = @LIBS@
   174    174   LIBSPATIALITE_CFLAGS = @LIBSPATIALITE_CFLAGS@
   175    175   LIBSPATIALITE_LIBS = @LIBSPATIALITE_LIBS@
   176    176   LIBTOOL = @LIBTOOL@
   177         -LIBVIRTUALPG_CFLAGS = @LIBVIRTUALPG_CFLAGS@
   178         -LIBVIRTUALPG_LIBS = @LIBVIRTUALPG_LIBS@
   179    177   LIBWEBP_CFLAGS = @LIBWEBP_CFLAGS@
   180    178   LIBWEBP_LIBS = @LIBWEBP_LIBS@
   181    179   LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
   182    180   LIBXML2_LIBS = @LIBXML2_LIBS@
   183    181   LIPO = @LIPO@
   184    182   LN_S = @LN_S@
   185    183   LTLIBOBJS = @LTLIBOBJS@
................................................................................
   198    196   PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
   199    197   PACKAGE_NAME = @PACKAGE_NAME@
   200    198   PACKAGE_STRING = @PACKAGE_STRING@
   201    199   PACKAGE_TARNAME = @PACKAGE_TARNAME@
   202    200   PACKAGE_URL = @PACKAGE_URL@
   203    201   PACKAGE_VERSION = @PACKAGE_VERSION@
   204    202   PATH_SEPARATOR = @PATH_SEPARATOR@
   205         -PGCONFIG = @PGCONFIG@
   206         -PG_CFLAGS = @PG_CFLAGS@
   207         -PG_LDFLAGS = @PG_LDFLAGS@
   208         -PG_LIB = @PG_LIB@
   209    203   PKG_CONFIG = @PKG_CONFIG@
   210    204   PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
   211    205   PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
   212    206   RANLIB = @RANLIB@
   213    207   SED = @SED@
   214    208   SET_MAKE = @SET_MAKE@
   215    209   SHELL = @SHELL@