/[thuban]/branches/WIP-pyshapelib-bramz/ChangeLog
ViewVC logotype

Contents of /branches/WIP-pyshapelib-bramz/ChangeLog

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2115 - (show annotations)
Thu Mar 18 17:58:25 2004 UTC (20 years, 11 months ago) by joey
Original Path: trunk/thuban/ChangeLog
File size: 360638 byte(s)
Reflect my changes from today

1 2004-03-18 Martin Schulze <[email protected]>
2
3 * Extensions/wms/test/test_parser.py: Added another test for
4 checking whether the WMS XML parser (to be implemented) returns
5 the information we expect. This requires a sample WMS WML file
6 (sample.xml) which has been extracted from the frida server and
7 "improved" manually.
8
9 * Extensions/wms/test/test_ogclib.py: Added legacy code to add the
10 main Thuban directory to the path in order to be able to import
11 random modules. Adjusted the PyOGCLib detection to reuse the
12 information gathered. Also added a note about the PYTHONPATH
13 environment variable.
14
15 * Extensions/wms/test/test_ogclib.py: The format specification is
16 a mime-type, not a graphic format, hence image/jpeg wou ld be the
17 proper format and not JPEG. We'll also have to take care of the
18 encoding of / as %2F.
19
20 2004-03-16 Martin Schulze <[email protected]>
21
22 * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
23 comprehensive test for the getMapURL method, built compare URLs
24 according to the documentation in OGC 01-068r3
25
26 * Extensions/wms/capabilities.py (WMSCapabilities): Added the
27 class WMSCapabilities to manage capabilites, will incorporate
28 parsing the capabilities response and provide details for other
29 classes.
30
31 2004-03-12 Bernhard Herzog <[email protected]>
32
33 Support views in addition to normal tables in the postgis
34 shapestore
35
36 * Thuban/Model/postgisdb.py
37 (PostGISShapeStore._fetch_table_information): Add a fallback for
38 the case where the table name is not in the geometry_columns
39 table. This is usually the case for views. Also, set
40 self.shapestore here.
41 (PostGISShapeStore.ShapeType): No need to query the database all
42 the time. The shape type is now determined in
43 _fetch_table_information
44
45 * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
46 (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
47 New parameter to specify views.
48 (PostGISDatabase.has_data): Also compare the views. New views
49 parameter
50 (PostGISDatabase.initdb): Create the views.
51 (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
52 view
53
54 * test/test_postgis_db.py
55 (TestPostGISShapestorePointFromViews): New. Test a
56 PostGISShapeStore with a view
57 (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
58 the geometry_column explicitly to test whether that works
59
60 2004-03-12 Bernhard Herzog <[email protected]>
61
62 Final step for explicit id/geometry columns: Loading and saving
63
64 * Resources/XML/thuban-1.1.dtd: New. Derived from thuban-1.0.dtd
65 with the following changes:
66 (dbshapesource): Two new attributes id_column and geometry_column
67
68 * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
69 (SessionSaver.write_session): Use the new namespace
70 (SessionSaver.write_data_containers): Write the new dbshapesource
71 parameters
72
73 * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
74 the new file format version
75 (SessionLoader.start_dbshapesource): Handle the new db parameters
76
77 * test/test_save.py: Update to the new dtd and namespace
78 (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
79 mock object to provide a working IDColumn method.
80
81 * test/test_load_1_0.py: New. Copy of the test_load.py before
82 today's changes but with the round-trip tests removed.
83
84 * test/test_load_0_9.py: Update doc-string.
85
86 * test/test_load.py: Update all .thuban files to the new dtd and
87 namespace.
88 (TestPostGISLayer.file_contents): Add the new dbshapesource
89 paramters
90
91 2004-03-11 Bernhard Herzog <[email protected]>
92
93 Next step for explicit id/geometry columns: User interaction
94
95 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
96 the dialog is constructed. Add combo boxes to select id and
97 geometry column. Rename some instance variables.
98 (ChooseDBTableDialog.GetTable): Return id and geometry column
99 names
100 (ChooseDBTableDialog.OnTableSelect): New. Event handler for
101 selections in the table list
102
103 * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
104 and geometry_column
105
106 * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
107 parameters for id_column and geometry column of PostGISShapeStore
108 here as well.
109
110 * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
111 (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
112 (PostGISConnection.GeometryTables): Use a better query to
113 determine which relations in the database might be usable for
114 shapestores. Now supports views as well but is more PostgreSQL
115 specific
116 (PostGISConnection.table_columns): New. Somewhat experimental
117 method to let the db dialogs provide lists of columns to users so
118 that they can select id and geometry columns.
119 (PostGISTable.__init__): The default value of the id_column
120 parameter is now None it still means "gid" effectively, though.
121 (PostGISTable.IDColumn): New introspection method to return a
122 column object for the id column
123 (PostGISShapeStore.GeometryColumn): New introspection method to
124 return a column object for the geometry column
125
126 * test/test_postgis_db.py
127 (TestPostGISConnection.test_gis_tables_non_empty):
128 Removed. Subsumed by the new:
129 (TestPostGISConnection.test_gis_tables_with_views_and_tables):
130 New. Tes the GeometryTables and table_columns methods with actual
131 tables and views.
132 (PointTests.test_id_column, PointTests.test_geometry_column):
133 New. tests for the new methods.
134 (TestPostGISShapestorePoint.setUp)
135 (TestPostGISShapestorePointSRID.setUp)
136 (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
137 instance variables needed by the new tests
138
139 2004-03-11 Bernhard Herzog <[email protected]>
140
141 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
142 numbers given to ReadValue are ordinals.
143
144 2004-03-11 Bernhard Herzog <[email protected]>
145
146 Elimiate the requirement for PostGIS tables to have a column
147 called "gid".
148
149 * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
150 id_column to specify which column to use to identify rows. Also
151 new instance variables id_column and quoted_id_column
152 (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
153 (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
154 (PostGISTable.SimpleQuery): Use the id column name provided to the
155 constructor instead of "gid"
156 (PostGISShapeStore.__init__): New parameter id_column analogously
157 to PostGISTable.__init__. This parameter is simply passed through
158 to the base class constructor
159 (PostGISShapeStore._create_col_from_description): Fix typo in
160 doc-string
161 (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
162 (PostGISShapeStore.ShapesInRegion): Use the id column name
163 provided to the constructor instead of "gid"
164
165 * test/postgissupport.py
166 (PostgreSQLServer.get_default_static_data_db): New static table
167 landmarks_point_id with an id column != "gid. Update the comments
168 a bit.
169 (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
170 doc-
171 (upload_shapefile): New parameter gid_column to use a name other
172 than "gid" for the column to store the shape ids
173
174 * test/test_postgis_db.py (TableTests): New. Mixin-class
175 containing all tests previously in TestPostGISTable. The actual
176 tests are the same but the code is a bit more configurable to
177 allow for different id columns etc.
178 (TestPostGISTable): Derive from TableTests now for the actual
179 tests.
180 (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
181 except that it the landmarks_point_id table to test the id_column
182 parameter
183 (PointTests): Extend the doc-string
184 (TestPostGISShapestorePointExplicitGIDColumn)
185 (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
186 from PointTests to test the explicit id_column parameter. One
187 tests with the name of the column holding the shape ids, the other
188 uses PostgreSQL's OID column. For the latter a number of methods
189 have to be overwritten to make them independent of the actual id
190 values.
191
192 2004-03-08 Silke Reimer <[email protected]>
193
194 Update debian directory:
195
196 * debian/changelog: Added new version.
197 * deiban/rules: Updated management of patches (with cbds)
198 * debian/control: Added cbds to dependencies
199 * debian/patches/*: New. Adds better support for patches of thuban in
200 debian
201 * debian/menu: Syntax of menu changed slightly
202 * debian/setup.py.patch: removed because it has been moved to
203 debian/patechs/setup.py.patch
204
205
206 2004-02-26 Bernhard Herzog <[email protected]>
207
208 Create the Doc/technotes directory for text files with information
209 for developers
210
211 * Doc/technotes/README: New. README for the technotes
212
213 * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
214 Thuban
215
216 * Doc/technotes/release_process.txt: New. Used to be
217 HOWTO-Release. Now slightly adapted to technote formatting style.
218
219 * HOWTO-Release: Removed. It's contents are now in
220 Doc/technotes/release_process.txt
221
222 2004-02-25 Bernhard Herzog <[email protected]>
223
224 * libraries/thuban/wxproj.cpp (get_wx_version): New. Return the
225 version of wxWindows the module was compiled with so we can check
226 that against the wxPython version.
227
228 * Thuban/version.py (thuban_branch, thuban_release): New variables
229 controlling which and how Thuban versions are shown. See the
230 comments for details.
231 (verify_versions): Also check that the wx version that wxproj is
232 compiled against matches that of the wxPython we use at runtime
233
234 2004-02-20 Bernhard Herzog <[email protected]>
235
236 * Extensions/wms/wms.py (epsg_code_to_projection): Use
237 get_system_proj_file to read the epsg projections. The old way
238 depended on the current directory being the top Thuban directory.
239
240 2004-02-20 Bernhard Herzog <[email protected]>
241
242 * Extensions/svgexport/test/test_svgmapwriter.py
243 (TestVirtualDC.test_clippath): Remove a debug print
244
245 2004-02-20 Bernhard Herzog <[email protected]>
246
247 * Extensions/svgexport/__init__.py: New. Turn
248 Extensions/svgexport into a package.
249
250 * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
251 doc-string a bit. The doc-string must come first, otherwise it's
252 not a doc-string. The __future__ import must be the first thing
253 after the doc-string. Use only double quotes in doc-strings.
254 Single quotes trip up emacs syntax highlighting if the text
255 contains apostrophes.
256
257 2004-02-20 Bernhard Herzog <[email protected]>
258
259 * Extensions/svgexport/test/__init__.py,
260 Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
261 suite for svgexport
262
263 * test/runtests.py (find_test_modules): New. Function with the
264 module finding code from main.
265 (main): Use find_test_modules to figure out the default test
266 modules and take modules from Extensions.svgexport.test too.
267
268 2004-02-19 Bernhard Herzog <[email protected]>
269
270 * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
271 the mainwindow has a reference to the map of the initial session.
272 This fixes a bug introduced with the fix for RT#2245
273
274 2004-02-19 Bernhard Herzog <[email protected]>
275
276 * Extensions/svgexport/svgsaver.py,
277 Extensions/svgexport/svgmapwriter.py,
278 Extensions/svgexport/maplegend.py: Added again. This time in the
279 correct place.
280
281 2004-02-17 Bernhard Herzog <[email protected]>
282
283 Fix for RT#2245
284
285 * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
286 instance variables before trying to create any windows. Creating
287 windows can start an event loop if e.g. message boxes are popped
288 up for some reason, and event handlers, especially EVT_UPDATE_UI
289 may want to access things from the application.
290 (ThubanApplication.maps_changed): The mainwindow may not have been
291 created yet, so check whether it has been created before calling
292 its methods
293
294 * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
295 have a map
296
297 2004-02-17 Bernhard Herzog <[email protected]>
298
299 * test/test_svgmapwriter.py, Extensions/svgsaver.py,
300 Extensions/svgmapwriter.py, Extensions/maplegend.py,
301 extensions/svgexport/svgsaver.py,
302 extensions/svgexport/svgmapwriter.py,
303 extensions/svgexport/maplegend.py: Removed. These files were in
304 the wrong places or didn't work at all.
305
306 2004-02-16 Bernhard Herzog <[email protected]>
307
308 * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
309 line
310
311 2004-02-16 Bernhard Herzog <[email protected]>
312
313 * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
314
315 2004-02-15 Markus Rechtien <[email protected]>
316
317 * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
318 to write a session to a file in SVG format.
319 * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
320 to write a SVG map of a session.
321 * Extensions/svgexport/maplegend: New. Writes a basic maplegend
322 in SVG format for the current session.
323
324 2004-02-13 Bernhard Herzog <[email protected]>
325
326 * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
327 can't be created, return immediately after displaying the error
328 message.
329
330 2004-02-11 Bernhard Herzog <[email protected]>
331
332 Handle postgis tables with more than one geometry column.
333
334 * Thuban/Model/postgisdb.py
335 (PostGISTable._fetch_table_information): Delegate the creation of
336 column objects to a different method so that we can extend that in
337 derived classes
338 (PostGISTable._create_col_from_description): New. Column object
339 creation part of _fetch_table_information
340 (PostGISShapeStore._create_col_from_description): New. Extend
341 inherited method to handle geometry columns
342 (PostGISShapeStore.__init__): New parameter geometry_column to
343 specify which geometry column to use. Optional but mandatory for
344 tables with more than one geometry column
345 (PostGISShapeStore._fetch_table_information): Also use the name of
346 the geometry column when looking for the srid
347 (PostGISShapeStore.ShapeType): Also use the name of the geometry
348 column when looking for the shape type
349
350 * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
351 NonConnectionStore to changes in the PostGISShapeStore
352
353 * test/test_postgis_db.py
354 (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
355 PostGISShapeStore with tables having two geometry columns.
356
357 2004-02-10 Bernhard Herzog <[email protected]>
358
359 Fix some postgis problems. What remains to be done is real
360 handling of SRIDs as they affect how reprojection is done
361
362 * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
363 doc-string
364 (PostGISShapeStore._fetch_table_information): New. Extend
365 inherited method to retrieve srid
366 (PostGISShapeStore.BoundingBox): Handle tables without data.
367 extent yields NULL for those
368 (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
369
370 * test/test_postgis_db.py
371 (TestPostGISSpecialCases.test_shapestore_empty_table): New test
372 for the special case of a table without any data
373 (TestPostGISShapestorePointSRID): New class with tests for a table
374 that uses srids
375 (PolygonTests): Fix a doc-string typo
376
377 * test/postgissupport.py (PostGISDatabase.__init__): New parameter
378 reference_systems with a specification of spacial reference
379 systems to create in the new db.
380 (PostgreSQLServer.new_postgis_db)
381 (PostgreSQLServer.get_static_data_db): New parameter
382 reference_systems to be passed through ultimately to
383 PostGISDatabase. In new_postgis_db also check whether an existing
384 db already has the right srids
385 (PostgreSQLServer.get_default_static_data_db): Add srids and a
386 table that uses srids
387 (PostGISDatabase.initdb): Create the entries for the reference
388 systems
389 (PostGISDatabase.has_data): Add reference_systems parameter to
390 check for those too
391 (upload_shapefile): New parameter srid to create tables with a
392 specific srid
393
394 2004-02-06 Frank Koormann <[email protected]>
395
396 * po/pt_BR.po: Fixed charset
397
398 2004-02-05 Frank Koormann <[email protected]>
399
400 * po/pt_BR.po: Fixed format string for error message, missing %s
401 added (Thuban/UI/application.py:273)
402
403 2004-02-03 Frank Koormann <[email protected]>
404
405 First version of Portuguese (Brazilian) translation
406
407 * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
408 Brazilian Portuguese by Eduardo Patto Kanegae.
409
410 * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
411 translators.
412
413
414 2004-01-22 Frank Koormann <[email protected]>
415
416 * Doc/manual/thuban-manual.xml: Added section on installation of
417 Thuban under Win32 systems. Fixed image path references in the postgis
418 section. Some minor source formattings.
419
420 2004-01-21 Frank Koormann <[email protected]>
421
422 Make Thuban remember path selections (at least for one application run).
423
424 * Thuban/UI/application.py (Application.OnInit): Initialize path as a
425 attribute of application object. Path is a dictionary of
426 strings, currently with the items "data" and "projection".
427 (Application.SetPath): New, stores path for the specified item.
428 (Application.Path): New, return path for the specified item.
429
430 * Thuban/UI/mainwindow.py
431 (MainWindow.OpenSession, MainWindow.SaveSessionAs,
432 MainWindow.AddLayer, MainWindow.AddRasterLayer,
433 MainWindow.TableOpen): Access "data" path information of the
434 application.
435
436 * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
437 Access "projection" path information of the application.
438
439 2004-01-05 Bernhard Herzog <[email protected]>
440
441 * po/ru.po: Updated translations from Alex Shevlakov
442
443 2004-01-05 Bernhard Herzog <[email protected]>
444
445 * po/Makefile, po/README: Move the description of how to generate
446 the translation statistics to the README.
447
448 2003-12-23 Bernhard Herzog <[email protected]>
449
450 * NEWS: Update for 1.0.0
451
452 * po/it.po: Another update from Maurizio Napolitano
453
454 2003-12-23 Bernhard Herzog <[email protected]>
455
456 * po/it.po: Updated translation from Maurizio Napolitano
457
458 2003-12-23 Bernhard Herzog <[email protected]>
459
460 * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
461 for translation
462
463 * Thuban/UI/mainwindow.py (MainWindow.TableRename)
464 (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
465 strings for translation
466
467 * po/de.po: Update with the newly marked strings.
468
469 2003-12-22 Bernhard Herzog <[email protected]>
470
471 * HOWTO-Release: Fix the places where version numbers have to be
472 updated
473
474 2003-12-22 Bernhard Herzog <[email protected]>
475
476 * setup.py (setup call): 1.0.0, yeah!
477
478 * Thuban/version.py (longversion): 1.0.0, yeah!
479
480 * Thuban/Model/load.py (SessionLoader.__init__): Accept the
481 1.0.0 namespace too
482
483 * Thuban/Model/save.py (SessionSaver.write_session): Save with
484 1.0.0 namespace
485
486 * test/test_load.py (LoadSessionTest.dtd)
487 (TestSingleLayer.file_contents)
488 (TestNonAsciiColumnName.file_contents)
489 (TestLayerVisibility.file_contents)
490 (TestClassification.file_contents, TestLabels.file_contents)
491 (TestLayerProjection.file_contents)
492 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
493 (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
494 (TestPostGISLayerPassword.file_contents)
495 (TestLoadError.file_contents, TestLoadError.test): Update for
496 1.0.0 namespace
497
498 * test/test_save.py (SaveSessionTest.dtd)
499 (SaveSessionTest.testEmptySession)
500 (SaveSessionTest.testSingleLayer)
501 (SaveSessionTest.testLayerProjection)
502 (SaveSessionTest.testRasterLayer)
503 (SaveSessionTest.testClassifiedLayer)
504 (SaveSessionTest.test_dbf_table)
505 (SaveSessionTest.test_joined_table)
506 (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
507
508 2003-12-22 Bernhard Herzog <[email protected]>
509
510 * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
511 alignment flags are byte strings not unicode and that they have
512 valid values
513
514 * test/test_load.py (TestLabelLayer): New. Test loading (and
515 indirectly saving) of maps with labels.
516
517 2003-12-22 Bernhard Herzog <[email protected]>
518
519 * Thuban/UI/tableview.py (TableGrid.OnDestroy)
520 (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
521 unsubscribe all subscribers.
522 (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
523 self.grid since it may already have been destroyed.
524 Fixes RT #2256
525
526 2003-12-19 Bernhard Herzog <[email protected]>
527
528 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
529
530 2003-12-16 Bernhard Herzog <[email protected]>
531
532 * debian/bitmappath.patch, debian/setup.py.patch:
533 added to ensure compliance with FHS for debian
534 * debian/rules, debian/changelog:
535 added patches in rules to ensure compliance with FHS for debian
536
537 2003-12-16 Bernhard Herzog <[email protected]>
538
539 * po/Makefile (mo): Make the output a bit nicer so that it prints
540 statistics about the translations. Add a comment how produce even
541 nicer statistics with sed.
542
543 2003-12-09 Frank Koormann <[email protected]>
544
545 * Resources/Projections/defaults.proj:
546 French projection sample with correct accents (UNICODE).
547
548 2003-12-05 Bernhard Herzog <[email protected]>
549
550 * MANIFEST.in: Add the devtools directory
551
552 * setup.py (setup call): Use license instead of licence. This
553 silences a deprecation warning on Python 2.3
554
555 2003-12-05 Frank Koormann <[email protected]>
556
557 Documentation synced with 1.0rc1
558
559 * Doc/manual/thuban-manual.xml:
560 Minor formatting changes and references to database layers .
561 Introduction.Internationalization: New section on i18n.
562 MapManagement.AddingandRemovingLayers: Added item on database layers.
563 MapManagement.TheLegend: Added section and screenshot on popup menu.
564 ProjectionManagement: Updated screenshot and sentence on EPSG.
565 Appendix.SupportedDataSources: Added PostGIS.
566 Appendix.WorkingwithPostGIS: New section.
567
568 * Doc/manual/images/6_projection.png: Updated screenshot including
569 EPSG checkboxes.
570
571 * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
572
573 * Doc/manual/images/app_postgis_add_layer.png,
574 Doc/manual/images/app_postgis_db_add.png,
575 Doc/manual/images/app_postgis_db_management.png:
576 New screenshots focussing on database layers
577
578 2003-12-05 Frank Koormann <[email protected]>
579
580 * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
581 write warning to stderr instead of rising a warning dialog
582
583 2003-12-03 Bernhard Herzog <[email protected]>
584
585 Fix for RT #2243
586
587 * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
588 New. Like has_selected_layer but for shape layers only
589 (_has_selected_shape_layer): New. Like _has_selected_layer but for
590 shape layers only
591 (layer_show_table command, layer_jointable command): Use these
592 commands should only be available for shape layers
593
594 2003-12-03 Bernhard Herzog <[email protected]>
595
596 * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
597 publishers that are wx objects and may have been destroyed by wx
598 already. Fixes RT #2242.
599
600 2003-12-03 Bernhard Herzog <[email protected]>
601
602 * po/ru.po: Updates from Alex Shevlakov
603
604 2003-12-03 Silke Reimer <silkeintevation.de>
605
606 * debian/control, debian/changelog: Added gdal-support to
607 debian package, updated to new thuban version
608
609
610 2003-12-03 Bernhard Herzog <[email protected]>
611
612 * Thuban/Lib/version.py: New. Module for version number
613 manipulations. The version of make_tuple here also deals better
614 with more unusual version number strings, such as e.g.
615 "1.2+cvs20031111"
616
617 * Thuban/version.py (make_tuple): Removed. It's now in
618 Thuban.Lib.version. Use that implementation instead.
619
620 * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
621
622 2003-12-02 Bernhard Herzog <[email protected]>
623
624 * MANIFEST.in: Add debian files
625
626 * setup.py (setup call): Add packages for the Extensions so that
627 they're installed too
628 (data_files): Add READMEs and sample data from some Extensions
629
630 * NEWS: Add note about the extensions in binary packages
631
632 2003-12-02 Bernhard Herzog <[email protected]>
633
634 * Thuban/Model/save.py (SessionSaver.write_session): Save files
635 with the thuban-1.0rc1
636
637 * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
638 thuban-1.0rc1 namespace too
639
640 * test/test_save.py (SaveSessionTest.dtd)
641 (SaveSessionTest.testEmptySession)
642 (SaveSessionTest.testSingleLayer)
643 (SaveSessionTest.testLayerProjection)
644 (SaveSessionTest.testRasterLayer)
645 (SaveSessionTest.testClassifiedLayer)
646 (SaveSessionTest.test_dbf_table)
647 (SaveSessionTest.test_joined_table)
648 (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
649 namespace
650
651 * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
652 namespace
653 (TestSingleLayer.file_contents)
654 (TestNonAsciiColumnName.file_contents)
655 (TestLayerVisibility.file_contents)
656 (TestClassification.file_contents, TestLabels.file_contents)
657 (TestLayerProjection.file_contents)
658 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
659 (TestPostGISLayer.file_contents)
660 (TestPostGISLayerPassword.file_contents)
661 (TestLoadError.file_contents, TestLoadError.test): Update to
662 thuban-1.0rc1 namespace
663
664 2003-12-01 Bernhard Herzog <[email protected]>
665
666 * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
667 nt to better match Intevation's current w32 setup
668
669 * HOWTO-Release: Add note about updating MANIFEST.in
670
671 * MANIFEST.in: Add the Extensions
672
673 * NEWS: Update for 1.0rc1
674
675 2003-12-01 Bernhard Herzog <[email protected]>
676
677 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
678 cards for the dialog so that shapefiles ending in all uppercase
679 SHP are listed too
680
681 2003-11-28 Bernhard Herzog <[email protected]>
682
683 * Thuban/version.py (longversion): Update to 1.0rc1
684
685 * setup.py (setup call): Update version to 1.0rc1. Use the
686 [email protected] email address as author email instead of my
687 personal one.
688
689 2003-11-28 Bernhard Herzog <[email protected]>
690
691 * po/de.po: Update german translation.
692
693 2003-11-28 Bernhard Herzog <[email protected]>
694
695 Unify the filenames stored in .thuban files so that the .thuban
696 files are more platform independend
697
698 * Thuban/Model/save.py (unify_filename): New. Unify filenames so
699 that they can be used on both windows and unix
700 (SessionSaver.prepare_filename): New. Handle all filename
701 transformations for filenames stored in the thuban file
702 (SessionSaver.write_data_containers, SessionSaver.write_layer):
703 Use prepare_filename
704
705 * test/test_save.py (SaveSessionTest.testSingleLayer)
706 (SaveSessionTest.testLayerProjection)
707 (SaveSessionTest.testRasterLayer)
708 (SaveSessionTest.testClassifiedLayer)
709 (SaveSessionTest.test_dbf_table)
710 (SaveSessionTest.test_joined_table): Filenames are always stored
711 with slashes on all currently supported platforms so adapt all
712 tests to this
713
714 * test/test_load.py (LoadSessionTest.filenames): With the new
715 filename scheme the filenames in the tests should be
716 understandable on all currently supported platforms so we turn
717 this into an empty list because we don't have to normalize them
718 anymore
719
720 2003-11-28 Bernhard Herzog <[email protected]>
721
722 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
723 Add the ellipsoid to the projection since some Proj versions
724 complain if it's missing.
725
726 2003-11-27 Bernhard Herzog <[email protected]>
727
728 Corect some bounding box projection problems
729
730 * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
731 version of ForwardBBox
732 (Projection._transform_bbox): New. common implementation of
733 ForwardBBox and InverseBBox
734 (Projection.ForwardBBox): Use _transform_bbox.
735
736 * test/test_proj.py (TestProjection.test): Add test for
737 InverseBBox
738
739 * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
740 (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
741 new InverseBBox method to determine the unprojected bounding box
742 (Layer.ShapesInRegion): Use the ForwardBBox method to project the
743 bbox.
744
745 * test/test_layer.py (TestLayer.test_point_layer_with_projection):
746 Removed.
747 (TestLayer.test_arc_layer_with_projection): New. This test is
748 better able to test whether bounding boxes are projected correctly
749 than test_point_layer_with_projection
750
751 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
752 InverseBBox to unproject bboxes
753
754 2003-11-25 Bernhard Herzog <[email protected]>
755
756 * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
757 source code.
758
759 2003-11-25 Bernhard Herzog <[email protected]>
760
761 * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
762 there for backwards compatibility and all code relying on that
763 should have been updated by now.
764
765 2003-11-25 Bernhard Herzog <[email protected]>
766
767 * test/test_load.py (TestClassification.test): Add the missing
768 round trip test.
769 (TestClassification.file_contents): Update to the newest file
770 format
771
772 2003-11-25 Bernhard Herzog <[email protected]>
773
774 Add very experimental (and possibly dangerous) extension to draw
775 polygons:
776
777 * Extensions/drawshape/README: New. Brief installation
778 instructions
779
780 * Extensions/drawshape/drawshape.py: New. Implementation of the
781 drawshape extensions
782
783 * Extensions/drawshape/patch.diff: Patch to apply before the
784 extension can be used.
785
786 2003-11-24 Bernhard Herzog <[email protected]>
787
788 * Thuban/Model/data.py (ShapefileStore._open_shapefile)
789 (ShapefileStore.__init__): Factor opening the shapefile into a
790 separate method (the new _open_shapefile). This makes the code a
791 bit more readable but the real reason is that it makes some evil
792 hacks easier. :-)
793
794 2003-11-24 Bernhard Herzog <[email protected]>
795
796 * Thuban/Model/load.py (SessionLoader.check_attrs): If no
797 converter is specified for an attribute assume it's a string
798 containing only Latin1 characters. Update doc-string accordingly.
799 This change should fix many places where unicode objects might
800 accidentally enter Thuban.
801
802 * test/test_load.py (TestNonAsciiColumnName): New test to check
803 what happens with column names in DBF files that contain non-ascii
804 characters
805
806 2003-11-21 Bernhard Herzog <[email protected]>
807
808 Enable the experimental attribute editing again and introduce a
809 command line switch to actually activate it
810
811 * Thuban/UI/main.py (options): New. Container for options set on
812 the commmand line
813 (main): Add the --enable-attribute-editing flag.
814
815 * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
816 editing is enabled use the grid ctrl which allows editing of the
817 values
818
819 * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
820 New. Just delegate this to the underlying table.
821
822 2003-11-20 Bernhard Herzog <[email protected]>
823
824 * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
825 Skip this test if run under non-posix systems since it only works
826 there
827
828 2003-11-19 Bernhard Herzog <[email protected]>
829
830 * Thuban/Model/resource.py: Rework the way gdal support is
831 determined so that we can give a reason in the about why gdal is
832 not supported.
833 (gdal_support_status): New. Variable holding a string with the
834 reason for no gdal support
835
836 * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
837 not supported to the message
838
839 2003-11-19 Bernhard Herzog <[email protected]>
840
841 Remove the old table interface and its test cases
842
843 * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
844 (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
845 anymore
846
847 * Thuban/Model/transientdb.py (TransientTableBase)
848 (AutoTransientTable): Do not derive from OldTableInterfaceMixin
849 anymore
850
851 * test/test_table.py: Removed since the old interface it tests is
852 gone.
853
854 * test/runtests.py (main): The old table interface is gone and
855 with it the deprecation warnings so remove the code that turns
856 these warnings into errors
857
858 2003-11-19 Bernhard Herzog <[email protected]>
859
860 * test/test_table.py: Revert to revision 1.5 again. Changing the
861 tests to use the new table interface is completely wrong since the
862 whole purpose of the tests in this module is to test the old
863 interface.
864
865 2003-11-18 Bernhard Herzog <[email protected]>
866
867 * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
868 New. Test whether the connection matches a set of connection
869 parameters
870
871 * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
872 (DBFrame.OnAdd): Use the new MatchesParameters method when looking
873 for existing connections with the same parameters and break out of
874 the loop correctly.
875
876 * test/test_postgis_db.py (TestBriefDescription)
877 (TestPostGISSimple.test_brief_description): Rename
878 TestBriefDescription to TestPostGISSimple and the test method to
879 test_brief_description so that we can add more test methods.
880 (TestPostGISSimple.test_matches_parameters): New. Test the new
881 MatchesParameters method
882
883 2003-11-18 Bernhard Herzog <[email protected]>
884
885 * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
886 _was_destroyed, to indicate whether an publisher instance has
887 already been destroyed.
888 (Publisher.Unsubscribe): Only disconnect if the publisher has not
889 been destroyed yet.
890 (Publisher.Destroy): Set the _was_destroyed flag to true.
891
892 * test/test_connector.py
893 (TestPublisher.test_unsubscribe_after_destroy): New. Test that
894 calling Unsubscribe after Destroy doesn't raise an exception
895
896 2003-11-14 Bernhard Herzog <[email protected]>
897
898 * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
899 typo in doc-string
900
901 2003-11-13 Bernhard Herzog <[email protected]>
902
903 Quote table and column names properly for postgis.
904
905 * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
906 quote an identifier for use in an sql statement
907 (PostGISColumn.__init__): Add the quoted_name attribute
908 (PostGISTable.__init__): New instance variable quoted_tablename
909 (PostGISTable._fetch_table_information): Use the quoted table
910 name. New isntance variable quoted_geo_col with a quoted version
911 of geometry_column
912 (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
913 (PostGISTable.RowOrdinalToId): Use the quoted table name
914 (PostGISTable.ReadValue, PostGISTable.ValueRange)
915 (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
916 (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
917 (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
918 Use quoted table and column names
919
920 * test/test_postgis_db.py (TestPostGISSpecialCases)
921 (TestPostGISIgnoredColumns): Rename the class to
922 TestPostGISSpecialCases because that better describes the new
923 cases
924 (TestPostGISSpecialCases.test_unsupported_types)
925 (TestPostGISSpecialCases.test): Rename the method to
926 test_unsupported_types because we need a more descriptive name now
927 that there are more methods
928 (TestPostGISSpecialCases.test_table_name_quoting)
929 (TestPostGISSpecialCases.test_column_name_quoting)
930 (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
931 cases to test quoting of table and column names in PostGISTable
932 and PostGISShapeStore
933
934 * test/postgissupport.py
935 (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
936 AddGeometryColumn desn't support table or column names with sapces
937 or double quotes
938
939 2003-11-12 Jan-Oliver Wagner <[email protected]>
940
941 * Extensions/wms/__init__.py: New: Init to make this
942 directory a package.
943
944 * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
945
946 2003-11-11 Bernhard Herzog <[email protected]>
947
948 * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
949 Constant for the file woth deprecated epsg projections
950 (get_system_proj_file): Update doc-string
951
952 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
953 above the EPS widgets, introduce a check box for the deprecated
954 eps projections and a label for the epsg widgets
955 (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
956 too
957
958 2003-11-11 Bernhard Herzog <[email protected]>
959
960 Avoid warnings when run under Python 2.3
961
962 * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
963 (BaseRenderer.draw_label_layer): Coordinates must be ints.
964
965 * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
966 real method so that we can convert to int.
967 (MapRenderer.label_font): The font size mist be an int.
968
969 * Thuban/UI/common.py (Color2wxColour): The color values must be
970 ints. Also, remove the unnecessary asserts.
971
972 * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
973 (TestUnicodeStrings.test): Python source code should not contain
974 non-ascii characters unless an encoding is specified in the file.
975 Therefore use \x escapes in the string literals for non-ascii
976 characters.
977
978 2003-11-11 Bernhard Herzog <[email protected]>
979
980 * Thuban/Model/resource.py (get_system_proj_file): Add a filename
981 parameter so that this function can be used for all proj files in
982 Resource/Projections
983 (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
984 get_system_proj_file
985
986 * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
987 ProjFile self.__sysProjFile use a dictionary of system ProjFile
988 objects self._sys_proj_files
989 (ProjFrame.build_dialog): Adapt to the new changes in the
990 ProjectionList constructor. Add a check button to toggle whether
991 EPSG projections are shown
992 (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
993 events.
994 (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
995 the busy cursor if the files have not yet been loaded by the
996 dialog.
997 (ProjFrame.load_system_proj): Add a parameter for the name of the
998 proj file. Maintain the dictionary of system projections
999 self._sys_proj_files
1000
1001 * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
1002 user_projs parameters into one parameter proj_files which is a
1003 list of proj files.
1004 (ProjectionList._subscribe_proj_files)
1005 (ProjectionList._unsubscribe_proj_files): New. Move
1006 subscription/unsubscription of projfile messages to separate
1007 methods
1008 (ProjectionList.Destroy): The unsubscribe is now done in
1009 _unsubscribe_proj_files
1010 (ProjectionList.update_projections): We now have a list of proj
1011 file objects
1012 (ProjectionList.SetProjFiles): New method to set a new list of
1013 proj file objects
1014
1015 * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
1016 Specify explicitly which system proj file to load.
1017
1018 2003-11-11 Bernhard Herzog <[email protected]>
1019
1020 * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
1021 instance variables to cut cyclic references. The GC would have
1022 collected the loader eventually but it can happen that it doesn't
1023 run at all until thuban is closed (2.3 but not 2.2 tries a bit
1024 harder and forces a collection when the interpreter terminates)
1025 (load_session): Call the handler's Destroy method to make sure
1026 that it gets garbage collected early. Otherwise it will be
1027 collected very late if at all and it holds some references to e.g.
1028 shapestores and the session which can lead to leaks (of e.g. the
1029 temporary files)
1030
1031 * test/test_load.py (TestSingleLayer.test_leak): New. test for the
1032 resource leak in load_session
1033
1034 2003-11-10 Bernhard Herzog <[email protected]>
1035
1036 * Thuban/UI/baserenderer.py: Add a way to specify how layers in
1037 extensions are to be rendered.
1038 (_renderer_extensions): New. List with renderer for layers in
1039 extensions
1040 (add_renderer_extension): New. Add a renderer extension
1041 (init_renderer_extensions): New. Init the renderer extensions
1042 (BaseRenderer.render_map_incrementally): Search
1043 _renderer_extensions for how to draw unknown layer types
1044 (BaseRenderer.draw_raster_data): Add format parameter so that
1045 formats other than BMP can be drawn
1046 (BaseRenderer.draw_raster_layer): Pass an explicit format to
1047 draw_raster_data
1048
1049 * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
1050 strings of the format parameter of draw_raster_data method to wx
1051 constants
1052 (MapRenderer.draw_raster_data): Add the format parameter and use
1053 raster_format_map to map it to the right wxwindows constant for
1054 wxImageFromStream
1055
1056 * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
1057 the format parameter and record it
1058 (TestBaseRenderer.test_raster_no_projection): check the format
1059 paramter of the draw_raster_data method
1060 (TestBaseRenderer.test_renderer_extension): New. Test the renderer
1061 extension facility
1062
1063 2003-11-07 Bernhard Herzog <[email protected]>
1064
1065 Tweak the usage of the sqlite database to make common use cases
1066 more responsive. In most cases copying the data to the sqlite
1067 database takes so long that using sqlite doesn't have enough
1068 advantages.
1069
1070 * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
1071 comments about performance and query the min and max in separate
1072 statements because only that way will indexes be used.
1073 (TransientTableBase.UniqueValues): Add some comments about
1074 performance.
1075 (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
1076 Do not copy the data to the transient DB but use the transient
1077 copy if it exists. See the new comments for the performance trade
1078 offs
1079
1080 * test/test_transientdb.py
1081 (TestTransientTable.test_auto_transient_table): Make sure that the
1082 data is copied to the transient database at some point.
1083
1084 2003-11-03 Bernhard Herzog <[email protected]>
1085
1086 * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
1087 globals to locals so that it's a bit faster
1088
1089 2003-11-03 Bernhard Herzog <[email protected]>
1090
1091 * Thuban/UI/baserenderer.py
1092 (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
1093 method. ReadValue is faster than ReadRowAsDict since it only reads
1094 one cell especially now that the dbf file objects actually
1095 implement it.
1096
1097 * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
1098 read_attribute method of the dbf objects
1099
1100 2003-11-03 Bernhard Herzog <[email protected]>
1101
1102 * Extensions/profiling/profiling.py (popup_dialog_box): New config
1103 variable to indicate whether the result should be shown in a
1104 dialog box
1105 (profile_screen_renderer, time_screen_renderer): Only show a
1106 dialog box if popup_dialog_box is true.
1107 (profile_screen_renderer): Flush stdout after the printing the
1108 first part of the "profiling..." message
1109
1110 * Thuban/UI/baserenderer.py
1111 (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
1112 brushes for the groups so that they're not created over and over
1113 again
1114
1115 * Thuban/Model/classification.py (Classification.__getattr__)
1116 (Classification._compile_classification)
1117 (Classification._clear_compiled_classification): New. Methods to
1118 manage a 'compiled' representation of the classification groups
1119 which is created on demand
1120 (Classification.InsertGroup, Classification.RemoveGroup)
1121 (Classification.ReplaceGroup): reset the compiled representation
1122 (Classification.FindGroup): Use the compiled representation to
1123 find the matching group
1124 (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
1125
1126 2003-10-31 Bernhard Herzog <[email protected]>
1127
1128 * Thuban/Model/classification.py (Classification.SetDefaultGroup):
1129 Send a CLASS_CHANGED message
1130 (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
1131 not return the removed group since it wasn't used.
1132
1133 * test/test_classification.py
1134 (TestClassification.test_set_default_group): New. Test the
1135 SetDefaultGroup method
1136 (TestClassification.test_insert_group): New. Test the InsertGroup
1137 method
1138 (TestClassification.test_remove_group): New. Test the RemoveGroup
1139 method
1140 (TestClassification.test_replace_group): New. Test the
1141 ReplaceGroup method
1142
1143 2003-10-31 Bernhard Herzog <[email protected]>
1144
1145 * test/test_classification.py (TestClassification.setUp):
1146 Subscribe to the CLASS_CHANGED messages
1147 (TestClassification.tearDown): New. Destroy the classification
1148 properly
1149 (TestClassification.test_defaults): Add tests for the default line
1150 width and whether no messages were sent yet
1151 (TestClassification.test_set_default_properties): Add tests for
1152 messages and setting the default line width
1153 (TestClassification.test_add_singleton)
1154 (TestClassification.test_add_range)
1155 (TestClassification.test_multiple_groups): Add tests for messages
1156
1157 2003-10-31 Bernhard Herzog <[email protected]>
1158
1159 Some more refactoring in preparation for new tests:
1160
1161 * test/test_classification.py (TestClassification.setUp): New.
1162 Instantiate the classification here. Update the test methods
1163 accordingly.
1164 (TestClassification.test_multiple_groups): Make sure that the two
1165 singletons matching 1 are considered different.
1166
1167 2003-10-31 Bernhard Herzog <[email protected]>
1168
1169 * test/test_classification.py (red, green, blue): New. These
1170 constants were used in several cases. Update the relevant methods.
1171 (TestClassification.test_defaults)
1172 (TestClassification.test_set_default_properties)
1173 (TestClassification.test_add_singleton)
1174 (TestClassification.test_add_range)
1175 (TestClassification.test_multiple_groups)
1176 (TestClassification.test_deepcopy): New. These were formerly all
1177 part of the single method test.
1178 (TestClassification.test_deepcopy): Removed.
1179 (TestClassIterator): Removed. The test case is now a method of
1180 TestClassification since it tests part of the public interface of
1181 Classification
1182 (TestClassification.test_iterator): New. Used to be
1183 TestClassIterator effectively
1184
1185 2003-10-31 Jan-Oliver Wagner <[email protected]>
1186
1187 GUIfied the functions of the profiling extension.
1188
1189 * /Extensions/profiling/__init__.py: New: Init to make this
1190 directory a package.
1191
1192 * Extensions/profiling/profiling.py: Moved menu entries to
1193 the Extensions menu. Applied _() for strings.
1194 (profile_screen_renderer): Catch the detailed printout and present
1195 it in a dialog.
1196 (time_screen_renderer): Raise a dialog to present the result instead
1197 of printing it to stdout.
1198
1199 2003-10-31 Bernhard Herzog <[email protected]>
1200
1201 * test/test_classification.py (TestClassGroupProperties)
1202 (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
1203 (TestClassGroupSingleton, TestClassIterator, TestClassification):
1204 Split TestClassification into several classes, one for each class
1205 being tested. TestClassification itself now only tests
1206 Classification. This split makes changes to the tests a bit easier
1207
1208 2003-10-31 Bernhard Herzog <[email protected]>
1209
1210 * Extensions/profiling/profiling.py: New. Extension to measure
1211 Thuban performance
1212
1213 2003-10-31 Frank Koormann <[email protected]>
1214
1215 Added two items to legend popup menu: Remove Layer and Show Layer Table
1216
1217 * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
1218 LegendPanel._OnShowTable): New event handlers, call the corresponding
1219 mainwindow methods.
1220 (LegendTree._OnRightClick): Added items to popup menu.
1221
1222 2003-10-30 Bernhard Herzog <[email protected]>
1223
1224 * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
1225 EVT_WINDOW_DESTROY
1226 (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
1227 nothing but is convenient for the derived classes.
1228
1229 * Thuban/UI/tableview.py
1230 (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
1231 Unsubscribe the messages here not in OnClose because that might
1232 get called multiple times. Fixes RT #2196
1233 (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
1234 anymore.
1235
1236 * README: Update the minimum requirement for wxPython. Since we
1237 now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
1238 the version in which that was introduced for all platforms
1239
1240 2003-10-30 Frank Koormann <[email protected]>
1241
1242 * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
1243 the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
1244 frame.
1245
1246 2003-10-30 Jan-Oliver Wagner <[email protected]>
1247
1248 Improved APR import extension, added further EPSG definitions
1249 and some cleanup regarding string class.
1250
1251 * test/test_proj.py (TestProjection.test_get_projection_units_geo):
1252 Added test for alias 'longlat'.
1253
1254 * Resources/Projections/epsg-deprecated.proj: New. Contains
1255 deprecated EPSG definitions.
1256
1257 * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
1258 the variable names for objects.
1259
1260 * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
1261 Copied from importAPR and provided with documentation.
1262
1263 * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
1264 Moved to apr.py.
1265 (APR_View): Added object ref 'ITheme'.
1266
1267 * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
1268 split function by corresponding use of the string class method.
1269
1270 * Thuban/Model/xmlwriter.py: Replaced string replace function by
1271 corresponding string method.
1272
1273 2003-10-29 Bernhard Herzog <[email protected]>
1274
1275 * Thuban/UI/baserenderer.py
1276 (BaseRenderer.draw_shape_layer_incrementally): Speed up the
1277 special case of a classification that only has the default group
1278
1279 2003-10-27 Bernhard Herzog <[email protected]>
1280
1281 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
1282
1283 * po/de.po: Update.
1284
1285 * Thuban/UI/application.py
1286 (ThubanApplication.ShowExceptionDialog): Handle translation of the
1287 dialog message properly
1288
1289 2003-10-27 Bernhard Herzog <[email protected]>
1290
1291 Rework how localization works so that we use wx's translation
1292 functions when running Thuban as a normal application but not when
1293 we don't need any UI, such as in the test suite. See the comment
1294 in Thuban/__init__.py for details
1295
1296 * Thuban/__init__.py (_): Add one level of indirection to make the
1297 translation handling more flexible and to make it possible to use
1298 either wx's translation services or not.
1299 (gettext_identity, translation_function_installed)
1300 (install_translation_function): New function to help with this
1301
1302 * Thuban/UI/__init__.py: Install the wx specific translation
1303 function if it's OK to do that
1304
1305 * test/support.py (initthuban): Install a dummy translation
1306 function so that importing Thuban.UI doesn't install a wx specific
1307 one for which would need to import wxPython
1308
1309 2003-10-27 Bernhard Herzog <[email protected]>
1310
1311 * HOWTO-Release: Source archives should be created first and the
1312 binary packages should be created from the source archives.
1313 There's an official debian package now so there's no need to test
1314 the rpm on debian anymore
1315
1316 2003-10-27 Bernhard Herzog <[email protected]>
1317
1318 Several rendering changes:
1319
1320 - Render the selection into a separate bitmap so that only that
1321 bitmap needs to be redrawn when the selection changes
1322
1323 - Render incrementally showing previews and allowing interaction
1324 before rendering is complete
1325
1326 - Update the renderer interface a bit. Most parameters of
1327 RenderMap are now parameters of the constructor
1328
1329 * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
1330 and the update region as parameters. Update the doc-string
1331 (BaseRenderer.render_map_incrementally): New. Generator function
1332 to renders the map incrementally
1333 (BaseRenderer.render_map): Remove the map argument (it's now in
1334 the constructor) and simply iterate over the
1335 render_map_incrementally generator to draw the map.
1336 (BaseRenderer.draw_shape_layer_incrementally)
1337 (BaseRenderer.draw_shape_layer): Renamed to
1338 draw_shape_layer_incrementally and changed into a generator that
1339 yields True every 500 shapes. Used by render_map_incrementally to
1340 render shape layers incrementally
1341
1342 * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
1343 map and region parameters which are now in the constructor
1344 (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
1345 the inherited render_map_incrementally.
1346 (BaseRenderer.draw_shape_layer): Removed.
1347 (ScreenRenderer.draw_selection_incrementally): New. The selection
1348 drawing part of the removed draw_shape_layer as a generator
1349 (ScreenRenderer.layer_shapes): Update because of the region
1350 parameter change
1351 (ExportRenderer.__init__): New. Extend the inherited constructor
1352 with the destination region for the drawing
1353 (ExportRenderer.RenderMap): Removed the map and region parameters
1354 which are now in the constructor
1355
1356 * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
1357 bitmap suitable for a preview in a tool
1358 (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
1359 bitmap
1360 (MapPrintout.draw_on_dc): Adapt to new renderer interface
1361 (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
1362 exists
1363 (MapCanvas.OnIdle): Update the logic to deal with incremental
1364 rendering and the selection bitmap
1365 (MapCanvas._do_redraw): Handle the instantiation of the render
1366 iterator and the redraws during rendering
1367 (MapCanvas._render_iterator): New. Generator to incrementally
1368 redraw both bitmaps
1369 (MapCanvas.Export): Adapt to new renderer interface.
1370 (MapCanvas.full_redraw): Reset the selection bitmap and the
1371 renderer iterator too
1372 (MapCanvas.redraw_selection): New. Force a redraw of the selection
1373 bitmap
1374 (MapCanvas.shape_selected): Only redraw the selection bitmap
1375
1376 * test/test_baserenderer.py
1377 (TestBaseRenderer.test_polygon_no_projection)
1378 (TestBaseRenderer.test_raster_no_projection)
1379 (TestBaseRenderer.test_point_map_projection)
1380 (TestBaseRenderer.test_point_layer_and_map_projection)
1381 (TestBaseRenderer.test_point_layer_projection)
1382 (TestBaseRenderer.test_point_with_classification): Adapt to new
1383 renderer interface
1384
1385 2003-10-24 Bernhard Herzog <[email protected]>
1386
1387 * libraries/thuban/wxproj.cpp (draw_polygon_shape)
1388 (point_in_polygon_shape, shape_centroid): Raise an exception if
1389 the shape can't be read. Previously invalid shape ids would lead
1390 to a segfault.
1391
1392 * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
1393 New. test whether an exception is raised for invalid shape ids
1394
1395 2003-10-24 Jan-Oliver Wagner <[email protected]>
1396
1397 * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
1398 as alias for 'latlong'.
1399
1400 * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
1401 as alias for 'latlong'.
1402
1403 2003-10-24 Jan-Oliver Wagner <[email protected]>
1404
1405 * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
1406 the projection even for the UnknownPanel.
1407 (UnknownProjPanel.__init__): Define the text and create the textctrl
1408 widget.
1409 (UnknownProjPanel._DoLayout): Replaced static text widget by the
1410 textctrl created in __init__.
1411 (UnknownProjPanel.SetProjection): Set the text for the text ctrl
1412 including the parameters of the projection.
1413
1414 2003-10-24 Jan-Oliver Wagner <[email protected]>
1415
1416 * Resources/Projections/epsg.proj: New. This is a list of
1417 EPSG codes with parameters for proj. The list has been
1418 generated using devtools/create_epsg.py based on the
1419 file nad/epsg of the proj 4.4.7 package. Four projection
1420 definitions have been deleted as they are not accepted by proj:
1421 "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
1422 and "HD72 / EOV".
1423
1424 2003-10-22 Bernhard Herzog <[email protected]>
1425
1426 Some more tweaks to the projection dialog which should fix RT
1427 #1886.
1428
1429 * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
1430 the ProjFile's messages and call the base class methods correctly
1431 (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
1432 flag on the newly selected item too. Otherwise some other item is
1433 focused and the first time the focus is moved with the keyboard
1434 the selection moves in unexpected ways.
1435
1436 * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
1437 focus on the OK button, only on the projection list. That way the
1438 list really has the focus initially
1439 (ProjFrame.OnClose): Call the projection list's Destroy method to
1440 make it unsubscribe all messages
1441
1442 2003-10-21 Bernhard Herzog <[email protected]>
1443
1444 Rework the projection dialog to fix a few bugs, including RT 2166
1445 and most of 2168
1446
1447 * Thuban/UI/projlist.py: New. The class ProjectionList is a
1448 special wxListCtrl to show a list of projections in a more MVC
1449 fashion
1450
1451 * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
1452 throughout the class. The main change is to use the ProjectionList
1453 class instead of a normal wxListBox. Also, add an explicit
1454 "Unknown" projection to the projection choice control.
1455 (ProjPanel.__init__): Add an "unknown" ellipsoid
1456 (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
1457 instantiation of the panel's controls to make the tab-order more
1458 natural
1459
1460 2003-10-21 Bernhard Herzog <[email protected]>
1461
1462 * test/test_load.py (TestSingleLayer.file_contents)
1463 (TestSingleLayer.test): Add non-ascii characters to the titles of
1464 session, map and layer. This is effectively a port of the
1465 TestUnicodeStrings test in test_load_0_8.py which for some reason
1466 was only added there.
1467
1468 * test/test_load_0_9.py (TestSingleLayer.file_contents)
1469 (TestSingleLayer.test): Same as in test_load.py: add non-ascii
1470 characters to the titles of session, map and layer,.
1471
1472 2003-10-21 Bernhard Herzog <[email protected]>
1473
1474 Add EPSG projection handling to .thuban files
1475
1476 * test/test_save.py (SaveSessionTest.dtd)
1477 (SaveSessionTest.testEmptySession)
1478 (SaveSessionTest.testLayerProjection)
1479 (SaveSessionTest.testRasterLayer)
1480 (SaveSessionTest.testClassifiedLayer)
1481 (SaveSessionTest.test_dbf_table)
1482 (SaveSessionTest.test_joined_table)
1483 (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
1484 (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
1485 use a and epsg projection to test saving them
1486
1487 * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
1488 namespace
1489 (TestLayerVisibility.file_contents, TestLabels.file_contents)
1490 (TestLayerProjection.file_contents)
1491 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
1492 (TestPostGISLayer.file_contents)
1493 (TestPostGISLayerPassword.file_contents)
1494 (TestLoadError.file_contents, TestLoadError.test): Update to use
1495 1.0-dev namespace
1496 (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
1497 use 1.0-dev namespace and use an EPSG projection to test whether
1498 loading it works
1499
1500 * test/test_load_0_9.py: New. Effectively a copy of test_load.py
1501 as of Thuban 0.9. These are now tests to determine whether Thuban
1502 can still read files generated by Thuban 0.9
1503
1504 * Thuban/Model/save.py (SessionSaver.write)
1505 (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
1506 namespace
1507 (SessionSaver.write_projection): Write the projection's epsg
1508 attribute
1509
1510 * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
1511 thuban-1.0-dev.dtd namespace
1512 (SessionLoader.check_attrs): Allow a callable object as conversion
1513 too
1514 (SessionLoader.start_projection, SessionLoader.end_projection)
1515 (SessionLoader.start_parameter): Handle the epsg attribute and
1516 rename a few instance variables to lower case
1517
1518 * Resources/XML/thuban-1.0.dtd: New. Only difference to
1519 thuban-0.9.dtd is the epsg attribute for projections.
1520
1521 2003-10-21 Bernhard Herzog <[email protected]>
1522
1523 * test/runtests.py (main): Let the user specify which tests to run
1524 on the command line
1525
1526 * test/support.py (ThubanTestResult.getDescription): Override to
1527 give a better short description. The description can be used as a
1528 parameter to run_tests to run that particular test in isolation.
1529
1530 2003-10-21 Frank Koormann <[email protected]>
1531
1532 Popup menu for legend. Scheduled for the 1.2 release this was too
1533 simple to implement: The popup menu is bound to the legend tree, while
1534 the events are hanlded by its anchestor, the legend panel. This
1535 allows reuse of all the event handlers already implemented for the
1536 legend toolbar buttons.
1537
1538 * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
1539 to add handlers for the events issued by the popup menu.
1540 (LegendPanel._OnToggleVisibility): Handler for toggling layer
1541 visibility event
1542 (LegendPanel._OnProjection): Handler for layer projection event.
1543 (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
1544 (LegendTree._OnRightClick): Event handler for right click, select item
1545 and pop up menu.
1546 (LegendTree.ToggleVisibility): Toggle layer visibility
1547 (LegendTree.LayerProjection): Raise layer projection dialog for
1548 current layer.
1549
1550 2003-10-21 Bernhard Herzog <[email protected]>
1551
1552 * Resources/Projections/defaults.proj: Use correct DOCTYPE
1553 declaration. The top-level element is projectionlist not projfile
1554
1555 2003-10-20 Bernhard Herzog <[email protected]>
1556
1557 * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
1558 method to write a projfile and display a busy cursor and error
1559 dialogs.
1560 (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
1561 (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
1562 (ProjFrame.__FillAvailList): Translate "<None>" too and display a
1563 busy cursor while loading the user and system prj files.
1564
1565 2003-10-16 Bernhard Herzog <[email protected]>
1566
1567 * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
1568 ProjFile objects
1569 (clear_proj_file_cache): New function to clear the cache. Mainly
1570 useful for use by the test suite
1571 (read_proj_file): Use the cache.
1572
1573 * test/test_proj.py (TestProjFile): Clarify the doc-string
1574 (ProjFileReadTests): Update doc-string
1575 (ProjFileReadTests.test_get_system_proj_file): Check whether the
1576 system proj files is cached.
1577 (ProjFileLoadTestCase): New base class for the proj file tests
1578 derived from support.FileLoadTestCase to provide some common
1579 behavior.
1580 (TestLoadingProjFile)
1581 (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
1582 (TestProjFileWithInvalidParameters.file_contents): Derive from
1583 ProjFileLoadTestCase
1584 (TestLoadingProjFile.test_caching): New. Test whether the cache
1585 works
1586
1587 2003-10-16 Silke Reimer <[email protected]>
1588
1589 * debian/*: New directory with configuration files for building a thuban
1590 deb-package.
1591
1592 2003-10-14 Bernhard Herzog <[email protected]>
1593
1594 * test/test_proj.py: Execute support.run_tests when run as
1595 __main__ so that missing unsubscribes are detected
1596 (TestProjFile.tearDown): Destroy the proj_file properly
1597
1598 2003-10-14 Bernhard Herzog <[email protected]>
1599
1600 * Thuban/Model/messages.py (PROJECTION_ADDED)
1601 (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
1602 the ProjFile objects
1603
1604 * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
1605 easily send messages when the projections change
1606 (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
1607 when the change was successful
1608
1609 * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
1610 proj file messages
1611 (TestProjFile.test_add_remove)
1612 (TestProjFile.test_remove_non_existing)
1613 (TestProjFile.test_replace)
1614 (TestProjFile.test_replace_non_existing): Test whether the right
1615 messages are sent
1616
1617 2003-10-14 Bernhard Herzog <[email protected]>
1618
1619 * test/test_proj.py (TestProjFile.test): Refactor into several
1620 tests
1621 (TestProjFile.test_add_remove)
1622 (TestProjFile.test_remove_non_existing)
1623 (TestProjFile.test_replace)
1624 (TestProjFile.test_replace_non_existing): Some of the new
1625 individual test cases
1626 (TestProjFileSimple): New class for the rest of the test cases
1627 that came out of the refactoring
1628 (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
1629 derived classes don't have to
1630
1631 2003-10-13 Bernhard Herzog <[email protected]>
1632
1633 Add an optional EPSG code to the projection objects and extend the
1634 .proj file format accordingly.
1635
1636 * Resources/XML/projfile.dtd (element projection): Add epsg
1637 attribute
1638
1639 * Thuban/Model/proj.py (Projection.__init__): New parameter and
1640 instance variable epsg. Update doc-string
1641 (Projection.EPSGCode, Projection.Label): New methods to provide
1642 access to EPSG code and a label for use in dialogs
1643
1644 * Thuban/Model/resource.py (ProjFileReader.start_projection)
1645 (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
1646 Handle the epsg code attribute when reading or writing proj files
1647
1648 * Thuban/UI/projdialog.py (ProjFrame._OnSave)
1649 (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
1650 (ProjFrame.__FillAvailList): Use the projection's Label method to
1651 get the string for the list box
1652
1653 * test/test_proj.py (TestProjection.test_label)
1654 (TestProjection.test_label_epsg)
1655 (TestProjection.test_epsgcode_for_non_epsg_projection)
1656 (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
1657 for the label and EPSGCode methods
1658 (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
1659 (WriteProjFileTests.test_write_empty_file): Create the ProjFile
1660 objects in the test cases and put the expected contents into the
1661 test case methods too. Update doTestWrite accordingly
1662 (TestLoadingProjFile)
1663 (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
1664 read tests from TestProjFile.
1665 (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
1666 tests are now in the new classes.
1667 (sample_projfile, sample_projfile_data)
1668 (sample_projfile2, sample_projfile_data2): Removed. Not used
1669 anymore.
1670 (TestProjFile.test_read_unreadable_file): No need to reset the
1671 permissions at the end anymore since we use a unique filename
1672
1673 2003-10-13 Bernhard Herzog <[email protected]>
1674
1675 * test/test_proj.py: Some more refactoring of the test cases
1676 (ProjFileTest): New base class for the proj file tests.
1677 (TestProjFile): Derive from ProjFileTest
1678 (TestProjFile.test_read_unreadable_file)
1679 (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
1680 the new filename method to get a unique filename
1681 (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
1682 (WriteProjFileTests): New class for proj file write tests.
1683 Contains the write test that were in TestProjFile originally.
1684
1685 2003-10-13 Bernhard Herzog <[email protected]>
1686
1687 * test/test_proj.py (TestProjFile.testRead)
1688 (TestProjFile.test_read_non_existing_file)
1689 (TestProjFile.test_read_unreadable_file)
1690 (TestProjFile.test_read_empty_file): Split into several methods.
1691
1692 2003-10-10 Bernhard Herzog <[email protected]>
1693
1694 * Thuban/UI/sizers.py: New file with custom sizers.
1695
1696 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
1697 all projection type specific panels and put them into a
1698 NotebookLikeSizer. This way the dialog doesn't change its size
1699 when a different projection is selected
1700 (ProjFrame.__init__): Rename projection_panels
1701 projection_panel_defs and reuse projection_panels for a list of
1702 the instantiated panels.
1703 (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
1704 (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
1705 the panels
1706 (UnknownProjPanel._DoLayout): Place the newlines in the message
1707 differently to make the panel narrower.
1708 (TMPanel._DoLayout): Layout the parameters in one column.
1709
1710 2003-10-10 Bernhard Herzog <[email protected]>
1711
1712 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
1713 that contains all the setup for the dialog's widgets, layout and
1714 event handling.
1715 (__): Call build_dialog to build the dialog.
1716 (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
1717 Their functionality is now in build_dialog
1718 (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
1719 (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
1720 (ProjFrame.__DoOnProjChoice): Small updates due to slightly
1721 different widget names and hierarchy introduced with build_dialog.
1722
1723 2003-10-10 Bernhard Herzog <[email protected]>
1724
1725 * README: Fix typo.
1726
1727 2003-10-09 Bernhard Herzog <[email protected]>
1728
1729 * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
1730 projection is already in the list. This is *a lot* faster when
1731 loading files with hundreds of projections since it saves a linear
1732 search. OTOH this will allow adding the same projection to the
1733 user.proj file multiple times in the projection dialog but we'll
1734 deal with that later
1735
1736 2003-10-09 Jan-Oliver Wagner <[email protected]>
1737
1738 * devtools: New. Directory for developer tools that are not intended
1739 for the regular user.
1740
1741 * devtools/create_epsg.py: New. Convert the epsg file of proj into
1742 a python .proj file.
1743
1744 2003-10-09 Bernhard Herzog <[email protected]>
1745
1746 * test/test_proj.py
1747 (TestProjection.test_get_parameter_without_equals_sign): New. Test
1748 whether GetParameter handles parameters without "=" sign correctly
1749
1750 * Thuban/Model/proj.py (Projection.GetParameter): Handle
1751 parameters that do not contain a "=". Update the doc-string
1752
1753 2003-10-08 Bernhard Herzog <[email protected]>
1754
1755 * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
1756 length limit on the projname text control
1757
1758 2003-10-08 Bernhard Herzog <[email protected]>
1759
1760 * test/test_proj.py (TestProjection.test_get_projection_units_geo)
1761 (TestProjection.test_get_projection_units_normal): New. Tests for
1762 the Projection.GetProjectedUnits method
1763
1764 2003-10-08 Jan-Oliver Wagner <[email protected]>
1765
1766 * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
1767 Added missing 'val' parameter.
1768
1769 2003-10-08 Bernhard Herzog <[email protected]>
1770
1771 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
1772 projection type of the currently selected projection is not known,
1773 i.e. there's no panel for it, use the UnknownProjPanel
1774 (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
1775 the actual replacing of the proj panel into the new method
1776 _show_proj_panel.
1777 (UnknownProjPanel): Add doc-string.
1778 (UnknownProjPanel._DoLayout): Insert a newline into the text so
1779 that the panel is not so wide.
1780
1781 2003-10-08 Bernhard Herzog <[email protected]>
1782
1783 * Thuban/Model/resource.py (read_proj_file): Return the warnings
1784 too. Update the doc-string
1785 (get_proj_files): Removed. It wasn't used anywhere
1786 (get_system_proj_files, get_system_proj_file): Rename to
1787 get_system_proj_file and return the ProjFile object and not a list
1788 of ProjFile objects. Update the callers.
1789 (get_user_proj_files, get_user_proj_file): Rename to
1790 get_user_proj_file return the ProjFile object and not a list of
1791 ProjFile objects. Update the callers.
1792 (ProjFileReader.__init__): New instance variable for the warnings.
1793 Rename the __pf ivar to projfile. Update the methods referring to
1794 __pf
1795 (ProjFileReader.end_projection): Catch any errors raised when
1796 instantiating the projection and record that as an error. The
1797 projection will not be in the final ProjFile object.
1798 (ProjFileReader.GetWarnings): New method to return the warnings.
1799
1800 * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
1801 show the warnings from the projfile reader
1802 (ProjFrame._OnImport): Deal with any warnings returned by
1803 read_proj_file
1804 (ProjFrame.__FillAvailList): Deal with any warnings returned by
1805 get_system_proj_file or get_user_proj_file.
1806
1807 * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
1808 (TestProjFileWithInvalidParameters.file_contents): New test cases
1809 to test whether read_proj_file handles invalid projection
1810 parameters correctly
1811 (TestProjFile.test_get_system_proj_file): New. Simple test for
1812 resource.get_system_proj_file
1813
1814 2003-10-07 Bernhard Herzog <[email protected]>
1815
1816 * test/test_derivedshapestore.py
1817 (TestDerivedShapeStoreExceptions.tearDown): Clear the session
1818 properly so that the temporary directories get deleted correctly
1819
1820 2003-10-06 Bernhard Herzog <[email protected]>
1821
1822 Handle the title changes in a proper MVC way.
1823
1824 * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
1825 canvas' TITLE_CHANGED messages
1826 (MainWindow.update_title): New. Update the main window's title
1827 (MainWindow.__SetTitle): Removed. Use update_title instead.
1828 (MainWindow.SetMap): Use update_title instead of __SetTitle
1829 (MainWindow.RenameMap): Do change the window title explicitly
1830 here. That's handled in a proper MVC way now.
1831 (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
1832 messages
1833
1834 * Thuban/Lib/connector.py (Conduit): New class to help classes
1835 that forward messages
1836
1837 * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
1838 (ViewPort): Derive from Conduit instead of Publisher
1839 (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
1840 when calling the inherited versions
1841 (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
1842 methods to subscribe and unsubscribe map messages
1843 (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
1844 handle the map subscriptions
1845 (ViewPort.Map, ViewPort.map_projection_changed)
1846 (ViewPort.layer_projection_changed): Add or update doc-strings
1847
1848 * test/test_connector.py (TestPublisher.test_issue_simple): Fix
1849 typo
1850 (MyConduit): Helper class for the Conduit test.
1851 (TestConduit): Test cases for Conduit
1852
1853 * test/test_connector.py: Use support.run_tests as main.
1854
1855 * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
1856 the TITLE_CHANGED messages
1857 (ViewPortTest.test_forwarding_title_changed): New test to check
1858 whether the viewport forwards the map's TITLE_CHANGED messages
1859 (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
1860 after the port's because the latter may require a still functional
1861 map.
1862
1863 2003-10-06 Bernhard Herzog <[email protected]>
1864
1865 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
1866 doc-string
1867
1868 2003-10-06 Bernhard Herzog <[email protected]>
1869
1870 * test/test_viewport.py (ViewPortTest.setUp)
1871 (SimpleViewPortTest.test_init_with_size): Move the test for the
1872 initial size as a constructor parameter from ViewPortTest.setUp
1873 method to a new separate test in SimpleViewPortTest.
1874
1875 2003-10-06 Bernhard Herzog <[email protected]>
1876
1877 * test/test_viewport.py (MockView): New class derived from
1878 ViewPort with a mock implementation of GetTextExtent to be used in
1879 the test cases
1880 (ViewPortTest.setUp): Use MockView instead of ViewPort
1881
1882 * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
1883 into what would be a "pure virtual function" in C++: always raise
1884 NotImplementedError. Mock implementations for test cases don't
1885 belong into the real code
1886
1887 2003-10-02 Bernhard Herzog <[email protected]>
1888
1889 * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
1890 close the dbf file we create so that it's contents have been
1891 written properly.
1892
1893 * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
1894 libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
1895 Update to shapelib 1.2.10
1896
1897 2003-10-01 Jan-Oliver Wagner <[email protected]>
1898
1899 * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
1900 it annoys lintian which warns about these files not being
1901 executable. The #! isn't necessary here since if you absolutely
1902 must execute them you can always say "python <filename>".
1903
1904 2003-09-26 Bernhard Herzog <[email protected]>
1905
1906 * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
1907 only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
1908 is ported to a newer the import will fail, so it should be noticed
1909 immediately that this function is gone.
1910 Fixes RT#1919
1911
1912 2003-09-26 Bernhard Herzog <[email protected]>
1913
1914 Add a DTD for the projection files and make thuban write valid
1915 projection files
1916
1917 * Resources/XML/projfile.dtd: New. DTD for thuban's projection
1918 files
1919
1920 * Thuban/Model/resource.py (ProjFileSaver.write): Use
1921 'projectionlist' as the name in the document type declaration so
1922 that it matches the element type of the root element.
1923
1924 * test/test_proj.py (sample_projfile, sample_projfile2): Use
1925 'projectionlist' as the name in the document type declaration just
1926 as it is done now in the files thuban would write
1927 (sample_projfile, sample_projfile_data): Fix spelling of
1928 "Mercator"
1929 (TestProjFile.doTestWrite): Validate the written and the expected
1930 XML data
1931 (TestProjFile): Derive from ValidationTest so that we can run xml
1932 validation tests
1933
1934 2003-09-24 Bernhard Herzog <[email protected]>
1935
1936 * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
1937 modify the list returned by map.Layers() in place since it is the
1938 actual list of layers used by the map.
1939
1940 2003-09-23 Jan-Oliver Wagner <[email protected]>
1941
1942 * Doc/manual/thuban-manual.xml: Added subsection to chapter
1943 Extensions to describe the extensions coming with the Thuban
1944 standard package (gns2shp and importAPR).
1945
1946 2003-09-23 Bernhard Herzog <[email protected]>
1947
1948 * libraries/thuban/wxproj.cpp (project_point): if there's an
1949 inverse but no forward projection, convert to degrees after
1950 applying the inverse projection. Fixes RT#2096
1951
1952 * test/test_wxproj.py: New. Test cases for wxproj.so. One test
1953 implicitly tests for the fix to RT#2096
1954
1955 * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
1956 Check that the sequences have the same lengths
1957
1958 * Resources/Projections/defaults.proj (Geographic projection): Use
1959 a much more precise value for the to_meter attribute.
1960
1961 2003-09-22 Bernhard Herzog <[email protected]>
1962
1963 * test/support.py (initthuban): Make sure to unset the LANG env.
1964 var. so that tests that compare translated strings work. Solves RT
1965 #2094
1966
1967 2003-09-22 Jan-Oliver Wagner <[email protected]>
1968
1969 Small improvement of APR import.
1970
1971 * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
1972 Added tests for text-ranges.
1973
1974 * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
1975 returns a string object if the range is based on text.
1976
1977 * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
1978 range retrieval.
1979
1980 2003-09-22 Jan-Oliver Wagner <[email protected]>
1981
1982 Initial version of the importAPR extension which is in
1983 experimental state.
1984
1985 * /Extensions/importAPR/, /Extensions/importAPR/samples/,
1986 /Extensions/importAPR/test/: New directories.
1987
1988 * /Extensions/importAPR/samples/README: New: Howto load the samples.
1989
1990 * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
1991 file which refers to the Thuban Iceland demo data.
1992
1993 * /Extensions/importAPR/test/README: New: Howto execute the tests.
1994
1995 * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
1996
1997 * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
1998 as in '.apr'-files.
1999
2000 * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
2001 ODB Objects as in '.apr', '.avl' and other files.
2002
2003 * /Extensions/importAPR/__init__.py: New: Init to make this
2004 directory a package.
2005
2006 * /Extensions/importAPR/importAPR.py: New: Import a ArcView
2007 project file (.apr) and convert it to Thuban.
2008
2009 2003-09-22 Jan-Oliver Wagner <[email protected]>
2010
2011 * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
2012
2013 2003-09-19 Jan-Oliver Wagner <[email protected]>
2014
2015 * Doc/manual/thuban-manual.xml: Extended section 'Installation'
2016 with description on RPM installation and RPM binary package
2017 creation.
2018
2019 2003-09-18 Bernhard Herzog <[email protected]>
2020
2021 * setup.py (data_files): Only add the mo files if the Locales
2022 directory actually exists, so that setup.py works with a fresh CVS
2023 checkout
2024
2025 2003-09-12 Jan-Oliver Wagner <[email protected]>
2026
2027 * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
2028 in viewport, not anymore in view
2029
2030 2003-09-04 Jan-Oliver Wagner <[email protected]>
2031
2032 Introducing first Extension (gns2shp).
2033
2034 * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
2035
2036 * Extensions/__init__.py: New. init to make this dir a package.
2037
2038 * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
2039
2040 * Extensions/gns2shp/test/README: New. some info on this test directory.
2041
2042 * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
2043
2044 * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
2045 of Shapefile from GNS text file format
2046
2047 2003-09-03 Jan-Oliver Wagner <[email protected]>
2048
2049 Fix/workaround for bug #2019:
2050 https://intevation.de/rt/webrt?serial_num=2019
2051
2052 * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
2053 (IdentifyView.__init__): Added another button that allows to
2054 stop the identify mode.
2055 (IdentifyView.OnStop): New. Stops the identify mode.
2056
2057 2003-09-03 Jan-Oliver Wagner <[email protected]>
2058
2059 Introducing a new exception dialog that allows to exit the
2060 application immediately.
2061 This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
2062
2063 * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
2064
2065 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
2066 Made strings available to translations. Exchanged the simple
2067 ScrolledMessageDialog by the new ExceptionDialog.
2068
2069 2003-09-01 Bernhard Herzog <[email protected]>
2070
2071 * NEWS: New. Summary of changes and release notes.
2072
2073 * MANIFEST.in: Add NEWS
2074
2075 2003-09-01 Bernhard Herzog <[email protected]>
2076
2077 * MANIFEST.in: Correct the include statement for the mo-files and
2078 include the documentation too.
2079
2080 * setup.py (data_files): Add the .mo files
2081 (setup call): Up to version 0.9.0
2082
2083 2003-09-01 Bernhard Herzog <[email protected]>
2084
2085 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
2086 parameter list to just parent and session
2087 (ChooseDBTableDialog.__set_properties): Removed. Setting the
2088 selection of empty list boxes is not allowed (and produces C++
2089 assertion errors) and the rest of the setup is better done in
2090 __init__ anyway.
2091 (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
2092 (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
2093 builtins True/False for booleans to avoid warnings from wxPython
2094
2095 * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
2096 ChooseDBTableDialog constructor parameters.
2097
2098 2003-09-01 Bernhard Herzog <[email protected]>
2099
2100 * Thuban/Model/postgisdb.py
2101 (PostGISTable): Extend doc-string
2102 (PostGISTable._fetch_table_information): Set the column index
2103 correctly, pretending ignored columns don't exist.
2104
2105 * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
2106 for postgis tables with data types not yet supported by thuban.
2107
2108 2003-08-29 Bernhard Herzog <[email protected]>
2109
2110 * HOWTO-Release: Tweak item about running the tests.
2111
2112 2003-08-29 Jan-Oliver Wagner <[email protected]>
2113
2114 * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
2115
2116 2003-08-29 Bernhard Herzog <[email protected]>
2117
2118 Add some missing parameters to projections. Proj complains about
2119 them on windows but for some reason not on Linux.
2120
2121 * test/test_save.py (SaveSessionTest.testLayerProjection): Add
2122 missing required projection parameters
2123
2124 * test/test_proj.py (TestProjFile.test): Add missing required
2125 projection parameters
2126
2127 * test/test_load_0_8.py (TestLayerProjection.file_contents)
2128 (TestLayerProjection.test): Add missing required projection
2129 parameters and tests for them
2130
2131 * test/test_load.py (TestLayerProjection.file_contents)
2132 (TestLayerProjection.test): Add missing required projection
2133 parameters and tests for them
2134
2135 * test/test_layer.py (TestLayer.test_base_layer): Add missing
2136 required projection parameters
2137
2138 2003-08-29 Bernhard Herzog <[email protected]>
2139
2140 * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
2141 access the pj_errno because directly accessing pj_errno doesn't
2142 work on windows if the proj library is in a DLL
2143
2144 * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
2145
2146 2003-08-28 Bernhard Herzog <[email protected]>
2147
2148 * test/test_proj.py: Import things from Thuban after calling
2149 initthuban
2150
2151 * test/test_load.py (LoadSessionTest.filenames): New class
2152 variable with the filename attributes to normalize
2153 (LoadSessionTest.check_format): Pass self.filenames to
2154 sax_eventlist to normalize the filename attributes
2155
2156 * test/xmlsupport.py: Add cvs keywords
2157 (SaxEventLister.__init__): New parameter filenames which indicates
2158 attributes that contain filenames
2159 (SaxEventLister.startElementNS): Normalize the filename attributes
2160 with os.path.normpath
2161 (sax_eventlist): New parameter filenames to pass through to
2162 SaxEventLister
2163
2164 * test/test_derivedshapestore.py: Make this file callable as a
2165 program to execute the tests
2166 (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
2167 the session to self.session so that it gets destroyed properly
2168
2169 * test/test_layer.py (TestLayer.tearDown): Call the session's
2170 Destroy method
2171
2172 * test/test_map.py (TestMapBase.tearDown): Destroy self.session
2173 too if it exists
2174 (TestMapAddLayer.test_add_layer): Bind the session to self.session
2175 so that it gets destroyed properly
2176
2177 * test/postgissupport.py (reason_for_not_running_tests): Add a
2178 test for the existence of popen2.Popen4.
2179
2180 * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
2181 reliable way to destroy the sessions created in the test cases
2182 (SaveSessionTest.test_dbf_table): Bind the session to self.session
2183 so that it gets destroyed properly
2184 (SaveSessionTest.testLayerProjection): Bind the session to
2185 self.session so that it gets destroyed properly
2186
2187 * test/test_session.py (UnreferencedTablesTests.tearDown): Make
2188 sure that the session is destroyed properly
2189
2190 * test/test_shapefilestore.py: Make this callable as a program to
2191 execute the tests
2192
2193 * test/test_scalebar.py: Remove unnecessary import of _ from
2194 Thuban
2195
2196 * test/support.py (print_garbage_information): Call initthuban
2197 here because it may be called indirectly from test cases that test
2198 test support modules which do not use anything from thuban itself
2199 (ThubanTestProgram.runTests): Remove unnecessary debug print
2200
2201 2003-08-28 Bernhard Herzog <[email protected]>
2202
2203 * Thuban/version.py (longversion): Update to 0.9
2204
2205 * Thuban/UI/mainwindow.py: Remove some unused imports
2206
2207 * README: Add section about required additional software. Add date
2208 and revision CVS keywords
2209
2210 * HOWTO-Release: Add item about the translations. Add date and
2211 revision CVs keywords and change formatting to match README a bit
2212 better
2213
2214 * po/de.po: Update for 0.9
2215
2216 * test/README: Tweak the wording a little because many tests are
2217 not really unittest.
2218
2219 2003-08-27 Bernhard Herzog <[email protected]>
2220
2221 As preparation for the 0.9 release, switch thuban files to a
2222 non-dev namespace
2223
2224 * Thuban/Model/save.py (SessionSaver.write_session): Write files
2225 with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
2226 namespace
2227
2228 * Thuban/Model/load.py (SessionLoader.__init__): Accept the
2229 http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
2230
2231 * test/test_save.py (SaveSessionTest.dtd)
2232 (SaveSessionTest.testEmptySession)
2233 (SaveSessionTest.testSingleLayer)
2234 (SaveSessionTest.testLayerProjection)
2235 (SaveSessionTest.testRasterLayer)
2236 (SaveSessionTest.testClassifiedLayer)
2237 (SaveSessionTest.test_dbf_table)
2238 (SaveSessionTest.test_joined_table)
2239 (SaveSessionTest.test_save_postgis): Update for new namespace
2240
2241 * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
2242 (TestLayerVisibility.file_contents, TestLabels.file_contents)
2243 (TestLayerProjection.file_contents)
2244 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2245 (TestPostGISLayer.file_contents)
2246 (TestPostGISLayerPassword.file_contents)
2247 (TestLoadError.file_contents, TestLoadError.test): Update for new
2248 namespace
2249
2250 2003-08-27 Bernhard Herzog <[email protected]>
2251
2252 Make the table interface distinguish between row ids (an integer
2253 that uniquely identifies a row) and row ordinals (a simple row
2254 count from 0 to NumRows() - 1)
2255
2256 * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
2257 (PostGISTable.RowOrdinalToId): New methods to conver between row
2258 ids and row ordinals
2259 (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
2260 parameter row_is_ordinal to indicate whether the row parameter is
2261 the row id or the ordinal
2262
2263 * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
2264 (TransientTableBase.RowOrdinalToId)
2265 (AutoTransientTable.RowIdToOrdinal)
2266 (AutoTransientTable.RowOrdinalToId): Same new methods as in
2267 PostGISTable.
2268 (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
2269 (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
2270 Same new parameter as in PostGISTable.
2271
2272 * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
2273 (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
2274 (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
2275 (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
2276 (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
2277 parameter as in PostGISTable.
2278
2279 * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
2280 (DataTable.RowOrdinalToId): New methods to convert between row ids
2281 and row ordinals.
2282 (TableGrid.SelectRowById): New method to select a row based on its
2283 ID as opposed to its ordinal
2284 (DataTable.GetValue, TableGrid.OnRangeSelect)
2285 (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
2286 (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
2287 (LayerTableFrame.__init__): Convert between row ids and row
2288 ordinals as appropriate
2289
2290 * test/postgissupport.py (PostGISDatabase.__init__): Add
2291 doc-string.
2292 (PostGISDatabase.initdb): The optional third item in a tuple in
2293 tables is now a (key, value) list with additional arguments to
2294 pass to upload_shapefile
2295 (upload_shapefile): New parameter gid_offset to allow gids that
2296 are not the same as the shapeids in the shapefile
2297 (PostgreSQLServer.get_default_static_data_db): Use the new
2298 gid_offset to make the gids in landmarks 1000 higher than the
2299 shapeids in the shapefile
2300
2301 * test/test_viewport.py
2302 (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
2303 new shapeids in the landmarks table
2304
2305 * test/test_transientdb.py
2306 (TestTransientTable.run_iceland_political_tests)
2307 (TestTransientTable.test_transient_joined_table): Add tests for
2308 the new table methods and new keywords arguments.
2309
2310 * test/test_postgis_db.py
2311 (TestPostGISTable.test_read_row_as_dict_row_count_mode)
2312 (TestPostGISTable.test_read_value_row_count_mode)
2313 (TestPostGISTable.test_row_id_to_ordinal)
2314 (TestPostGISTable.test_row_oridnal_to_id): New test for the new
2315 table methods and the new arguments
2316 (TestPostGISShapestorePoint.test_shapes_in_region)
2317 (TestPostGISShapestorePoint.test_shape_raw_data)
2318 (TestPostGISShapestorePoint.test_shape_points)
2319 (TestPostGISShapestorePoint.test_shape_shapeid)
2320 (TestPostGISShapestorePoint.test_all_shapes)
2321 (TestPostGISTable.test_simple_query)
2322 (TestPostGISTable.test_simple_query)
2323 (TestPostGISTable.test_simple_query)
2324 (TestPostGISTable.test_read_value)
2325 (TestPostGISTable.test_read_row_as_dict): Adapt to the new
2326 shapeids in the landmarks table
2327
2328 * test/test_memory_table.py
2329 (TestMemoryTable.test_read_row_as_dict_row_count_mode)
2330 (TestMemoryTable.test_read_value_row_count_mode)
2331 (TestMemoryTable.test_row_id_to_ordinal)
2332 (TestMemoryTable.test_row_oridnal_to_id): New test for the new
2333 table methods and the new arguments
2334
2335 * test/test_dbf_table.py
2336 (TestDBFTable.test_read_row_as_dict_row_count_mode)
2337 (TestDBFTable.test_read_value_row_count_mode)
2338 (TestDBFTable.test_row_id_to_ordinal)
2339 (TestDBFTable.test_row_oridnal_to_id): New test for the new table
2340 methods and the new arguments
2341
2342 2003-08-26 Bernhard Herzog <[email protected]>
2343
2344 * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
2345 more postgis specific but much faster method to get the bounding
2346 box
2347
2348 2003-08-26 Bernhard Herzog <[email protected]>
2349
2350 * Thuban/Model/postgisdb.py (PostGISTable.Title)
2351 (PostGISShapeStore.AllShapes): Add these missing methods.
2352 (PostGISShapeStore.ShapesInRegion): No need to raise
2353 StopIteration. We can simply return
2354
2355 * test/test_postgis_db.py (TestPostGISTable.test_title)
2356 (TestPostGISShapestorePoint.test_all_shapes): New tests for the
2357 new methods
2358
2359 2003-08-25 Bernhard Herzog <[email protected]>
2360
2361 * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
2362
2363 * test/test_postgis_db.py (PolygonTests): New class containing
2364 those tests from TestPostGISShapestorePolygon that can also be
2365 used to test MUTLIPOLYGON tables
2366 (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
2367 so derive from that
2368 (TestPostGISShapestoreMultiPolygon): New class with tests for
2369 MUTLIPOLYGON tables
2370
2371 * test/postgissupport.py (PostGISDatabase.initdb): Allow the
2372 tables argument to have tuples with three items to override the
2373 WKT type used.
2374 (PostgreSQLServer.get_default_static_data_db): Use the above to
2375 create a polygon table with MUTLIPOLYGONs
2376 (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
2377 (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
2378 coords_to*
2379 (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
2380 (wkt_converter): New. Map WKT types to converters
2381 (upload_shapefile): New parameter force_wkt_type to use a
2382 different WKT type than the default
2383
2384 2003-08-25 Bernhard Herzog <[email protected]>
2385
2386 * Thuban/UI/application.py
2387 (ThubanApplication.run_db_param_dialog): New. Suitable as a
2388 db_connection_callback. Main difference is that the dialog run
2389 from this method doesn't have a parent so it can be used even when
2390 there is no main window
2391 (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
2392 no db_connection_callback was given. This way the dialog pops up
2393 even when the .thuban file was given as a command line parameter.
2394
2395 2003-08-25 Bernhard Herzog <[email protected]>
2396
2397 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
2398 before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
2399 which leads to an effectively frozen X session because the user
2400 can only interact with the dialog but the mouse is still grabbed
2401 by the canvas.
2402 Also, call the tool's Hide method before MouseLeftUp because
2403 MouseLeftUp may change the tool's coordinates.
2404
2405 2003-08-25 Bernhard Herzog <[email protected]>
2406
2407 * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
2408 LoadCancelled exceptions and handle them by returning immediately.
2409
2410 2003-08-25 Bernhard Herzog <[email protected]>
2411
2412 GUI part of loading sessions with postgis connections which may
2413 require user interaction to get passwords or updated parameters
2414
2415 * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
2416 bit nucer and be more generic.
2417 (DBFrame.OnAdd): Adapt to new DBDialog interface
2418
2419 * Thuban/UI/application.py (ThubanApplication.OpenSession): New
2420 optional parameter db_connection_callback which is passed to
2421 load_session.
2422
2423 * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
2424 Suitable as a db_connection_callback
2425 (MainWindow.OpenSession): Use self.run_db_param_dialog as the
2426 db_connection_callback of the application's OpenSession method
2427
2428
2429 2003-08-25 Bernhard Herzog <[email protected]>
2430
2431 Basic loading of sessions containing postgis connections:
2432
2433 * Thuban/Model/load.py (LoadError): Add doc-string
2434 (LoadCancelled): New exception class to indicate a cancelled load
2435 (SessionLoader.__init__): Add the db_connection_callback parameter
2436 which will be used by the loader to get updated parameters and a
2437 password for a database connection
2438 (SessionLoader.__init__): Add the new XML elements to the
2439 dispatchers dictionary
2440 (SessionLoader.check_attrs): Two new conversions, ascii to convert
2441 to a byte-string object and idref as a generic id reference
2442 (SessionLoader.start_dbconnection)
2443 (SessionLoader.start_dbshapesource): New. Handlers for the new XML
2444 elements
2445 (load_session): Add the db_connection_callback to pass through the
2446 SessionLoader
2447
2448 * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
2449 New classes to test loading of sessions with postgis database
2450 connections.
2451
2452 2003-08-25 Bernhard Herzog <[email protected]>
2453
2454 * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
2455 replace it and the comment with __BuildDate__ by the Source: and
2456 Id: cvs keywords as used in the other files.
2457
2458 2003-08-25 Bernhard Herzog <[email protected]>
2459
2460 * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
2461 LoadError when a required attribute is missing. The code used to
2462 be commented out for some reason, but probably should have been
2463 active.
2464
2465 * test/test_load.py (TestLoadError.test): Test the message in the
2466 LoadError too to make sure it really is about the missing
2467 attribute
2468
2469 2003-08-22 Bernhard Herzog <[email protected]>
2470
2471 * test/test_save.py (SaveSessionTest.test_dbf_table)
2472 (SaveSessionTest.test_joined_table): Add XML validation tests.
2473
2474 2003-08-22 Bernhard Herzog <[email protected]>
2475
2476 Implement saving a session with a postgis connection
2477
2478 * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
2479 elements for database connections and shapestores using db
2480 connections
2481 (session): Add the dbconnections to the content model
2482
2483 * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
2484 Write the db connections
2485 (SessionSaver.write_session): Call write_db_connections to write
2486 the connection before the data sources
2487 (SessionSaver.write_data_containers): Handle postgis shapestores
2488
2489 * test/test_save.py (SaveSessionTest.thubanids)
2490 (SaveSessionTest.thubanidrefs): Update for new DTD
2491 (SaveSessionTest.test_save_postgis): New. Test saving a session
2492 with postgis connections
2493
2494 * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
2495 (PostGISTable.TableName): New accessor methods for the connection
2496 and table name
2497
2498 * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
2499 (TestPostGISTable.test_dbname): New methods to test the new
2500 PostGISConnection methods
2501
2502 2003-08-22 Bernhard Herzog <[email protected]>
2503
2504 * Thuban/Model/postgisdb.py (ConnectionError): New exception class
2505 for exceptions occurring when establishing a Database connection
2506 (PostGISConnection.connect): Catch psycopg.OperationalError during
2507 connects and raise ConnectionError.
2508
2509 * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
2510 tests for database exceptions
2511
2512 2003-08-22 Bernhard Herzog <[email protected]>
2513
2514 Prepare the test suite for tests with required authentication
2515
2516 * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
2517 variables with two predefined users/passwords, one for the admin
2518 and one for a non-privileged user.
2519 (PostgreSQLServer.createdb): Pass the admin name to initdb and add
2520 the non-privileged user to the database and set the admin password
2521 (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
2522 Better error reporting
2523 (PostgreSQLServer.connection_params)
2524 (PostgreSQLServer.connection_string): New methods to return
2525 information about how to connect to the server
2526 (PostgreSQLServer.execute_sql): New. Convenience method to execute
2527 SQL statements
2528 (PostgreSQLServer.require_authentication): Toggle whether the
2529 server requires authentication
2530 (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
2531 Add or alter users
2532 (PostGISDatabase.initdb): Pass the admin name one the
2533 subprocesses' command lines. Grant select rights on
2534 geometry_columns to everybody.
2535 (upload_shapefile): Use the admin name and password when
2536 connecting. Grant select rights on the new table to everybody.
2537
2538 * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
2539 server's new methods to get the connection parameters.
2540
2541 * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
2542 (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
2543 server's new methods to get the connection parameters.
2544
2545 * test/test_postgis_db.py
2546 (TestPostGISConnection.test_gis_tables_empty)
2547 (TestPostGISConnection.test_gis_tables_non_empty)
2548 (PostGISStaticTests.setUp): Use the server's new methods to get
2549 the connection parameters.
2550
2551 2003-08-22 Bernhard Herzog <[email protected]>
2552
2553 * Thuban/UI/about.py (About.__init__): Add the psycopg version.
2554
2555 * Thuban/version.py: Add psycopg version
2556
2557 * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
2558 version of the psycopg module
2559
2560 2003-08-22 Bernhard Herzog <[email protected]>
2561
2562 * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
2563 (DBFrame.OnEdit): Removed because it's not used and wouldn't work
2564 at the moment. The functionality should probably be implemented
2565 some time, though.
2566 (DBFrame.OnRemove): Display a message if the connection can't be
2567 removed because it's still in use.
2568
2569 2003-08-22 Jan-Oliver Wagner <[email protected]>
2570
2571 * Thuban/UI/about.py (About.__init__): split up the huge about
2572 text into elements/lists for easier translation. This fixes bug
2573 https://intevation.de/rt/webrt?serial_num=2058
2574 Also, made some forgotten string available for the i18n.
2575
2576 2003-08-21 Bernhard Herzog <[email protected]>
2577
2578 Make postgis support really optional including insensitive menu
2579 items.
2580
2581 * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
2582 whether the postgis is supported.
2583
2584 * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
2585 to make postgis support optional
2586
2587 * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
2588 version of Thuban.Model.postgisdb.has_postgis_support
2589 (database_management command): Make it only sensitive if postgis
2590 is supported.
2591
2592 2003-08-21 Jan-Oliver Wagner <[email protected]>
2593
2594 * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
2595 (section Adding and Removing Layers): Added text and described
2596 multi-selection.
2597 (chapter Extensions): New.
2598
2599 2003-08-21 Jan-Oliver Wagner <[email protected]>
2600
2601 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
2602 settings to allow multiple files to load into the map.
2603 Also reduced selection to *.shp as a default.
2604
2605 2003-08-20 Bernhard Herzog <[email protected]>
2606
2607 Add dialogs and commands to open database connections and add
2608 database layers.
2609
2610 * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
2611 method to open the database connection management dialog
2612 (MainWindow.AddDBLayer): New method to add a layer from a database
2613 (_has_dbconnections): New helper function to use for sensitivity
2614 (database_management command, layer_add_db command): New commands
2615 that call the above new methods.
2616 (main_menu): Add the new commands to the menu.
2617
2618 * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
2619 (PostGISConnection.connect): Establish the actual connection in a
2620 separate method and call it in __init__. This makes it easier to
2621 override the behavior in test cases
2622 (PostGISConnection.BriefDescription): New method to return a brief
2623 description for use in dialogs.
2624
2625 * test/test_postgis_db.py (NonConnection): DB connection that
2626 doesn't actually connect
2627 (TestBriefDescription): New class with tests for the new
2628 BriefDescription method
2629
2630 2003-08-19 Jan-Oliver Wagner <[email protected]>
2631
2632 Moved anything from extensions to libraries.
2633
2634 * libraries: New.
2635
2636 * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
2637
2638 * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
2639 Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
2640 been moved here from thuban/extensions/pyprojection/
2641 See there in the Attic for the older history.
2642
2643 * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
2644 dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
2645 shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
2646 have been moved here from thuban/extensions/pyshapelib/
2647 See there in the Attic for the older history.
2648
2649 * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
2650 files have been moved here from thuban/extensions/shapelib/
2651 See there in the Attic for the older history.
2652
2653 * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
2654 gdalwarp.cpp, wxproj.cpp: These files have been moved here from
2655 thuban/extensions/thuban/
2656 See there in the Attic for the older history.
2657
2658 * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
2659
2660 * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
2661 gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
2662
2663 * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
2664 Moved to libraries/shapelib.
2665
2666 * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
2667 shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
2668 ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
2669 Moved to libraries/pyshapelib.
2670
2671 * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
2672 LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
2673 Moved to libraries/pyprojection.
2674
2675 * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
2676
2677 * extensions: Removed.
2678
2679 2003-08-19 Bernhard Herzog <[email protected]>
2680
2681 * test/test_viewport.py (ViewPortTest): We don't use the
2682 facilities of FileTestMixin so don't derive from it.
2683 (TestViewportWithPostGIS): New class with tests for using a
2684 viewport on a map with postgis layers.
2685
2686 2003-08-19 Bernhard Herzog <[email protected]>
2687
2688 Add the db connection management to the session.
2689
2690 * Thuban/Model/session.py (Session.__init__): New instance
2691 variable db_connections
2692 (Session.AddDBConnection, Session.DBConnections)
2693 (Session.HasDBConnections, Session.CanRemoveDBConnection)
2694 (Session.RemoveDBConnection): New methods to manage and query the
2695 db connections managed by the session
2696 (Session.OpenDBShapeStore): New method to open a shapestore from a
2697 db connection
2698
2699 * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
2700 messages for the db connection handling in the session
2701
2702 * test/test_postgis_session.py: New. test cases for the session's
2703 db connection handling with postgis connections
2704
2705 2003-08-19 Bernhard Herzog <[email protected]>
2706
2707 Add very basic postgis database support and the corresponding test
2708 cases. The test cases require a PostgreSQL + postgis installation
2709 but no existing database. The database will be created
2710 automatically by the test cases
2711
2712 * test/README: Add note about skipped tests and the requirements
2713 of the postgis tests.
2714
2715 * Thuban/Model/postgisdb.py: New. Basic postgis database support.
2716
2717 * test/test_postgis_db.py: New. Test cases for the postgis
2718 support.
2719
2720 * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
2721 format
2722
2723 * test/test_wellknowntext.py: New. Test cases for the
2724 wellknowntext parser
2725
2726 * test/postgissupport.py: New. Support module for tests involving
2727 a postgis database.
2728
2729 * test/support.py (execute_as_testsuite): Shut down the postmaster
2730 if it's still running after the tests
2731
2732 * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
2733 well known text format
2734
2735 2003-08-19 Jan-Oliver Wagner <[email protected]>
2736
2737 * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
2738 message dialog.
2739
2740 2003-08-18 Bernhard Herzog <[email protected]>
2741
2742 * test/support.py (ThubanTestResult.printErrors): Indent the
2743 reason for the skips in the output to make it a bit more readable.
2744 (execute_as_testsuite): New helper function to run a test suite
2745 and print some more information.
2746 (run_tests): Use execute_as_testsuite to run the tests
2747
2748 * test/runtests.py (main): Use execute_as_testsuite to run the
2749 tests
2750
2751 2003-08-18 Bernhard Herzog <[email protected]>
2752
2753 Fix some bugs in Thuban and the test suite that were uncovered by
2754 changes introduced in Python 2.3:
2755
2756 * Thuban/Model/table.py (DBFTable.__init__): Make sure the
2757 filename is an absolute name
2758
2759 * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
2760 filename is an absolute name
2761
2762 * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
2763 unique filename to save to and use the correct relative filename
2764 in the expected output.
2765 (SaveSessionTest.test_dbf_table): Use the correct relative
2766 filename in the expected output.
2767
2768 * test/test_layer.py (TestLayer.test_raster_layer): Update the
2769 test to check whether the filename is absolute.
2770
2771 2003-08-18 Jan-Oliver Wagner <[email protected]>
2772
2773 * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
2774
2775 2003-08-15 Bernhard Herzog <[email protected]>
2776
2777 Change the way shapes are returned by a shape store. The
2778 ShapesInRegion method returns an iterator over actual shape
2779 objects instead of a list of shape ids.
2780
2781 * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
2782 id.
2783 (ShapefileStore.ShapesInRegion): Return an iterator over the
2784 shapes which yields shape objects instead of returning a list of
2785 shape ids
2786 (ShapefileStore.AllShapes): New. Return an iterator over all
2787 shapes in the shape store
2788 (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
2789
2790 * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
2791 doc-string.
2792
2793 * Thuban/UI/baserenderer.py
2794 (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
2795 layer_shapes and make it return an iterator containg shapes
2796 instead of a list of ids.
2797 (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
2798 layer_shapes() change
2799
2800 * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
2801 (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
2802
2803 * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
2804 changes in the ShapesInRegion return value.
2805 (ViewPort._get_hit_tester): Remove commented out code
2806
2807 * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
2808 new return value.
2809 (SimpleShapeStore.AllShapes): New. Implement this method too.
2810
2811 * test/test_layer.py (TestLayer.test_arc_layer)
2812 (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
2813 (TestLayer.test_point_layer_with_projection)
2814 (TestLayer.test_derived_store): Adapt to changes in the
2815 ShapesInRegion return value.
2816
2817 * test/test_shapefilestore.py
2818 (TestShapefileStoreArc.test_shapes_in_region)
2819 (TestShapefileStorePolygon.test_shapes_in_region)
2820 (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
2821 in the ShapesInRegion return value.
2822 (TestShapefileStorePoint.test_all_shapes)
2823 (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
2824 methods
2825
2826 * test/test_derivedshapestore.py
2827 (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
2828 the ShapesInRegion return value.
2829 (TestDerivedShapeStore.test_all_shapes)
2830 (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
2831 methods
2832
2833 2003-08-15 Bernhard Herzog <[email protected]>
2834
2835 Make the renderers deal correctly with raw vs. python level
2836 representation of shape geometries
2837
2838 * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
2839 Return a flag useraw in addition to the callable and the parameter
2840 to indicate whether the callable can deal with the raw shape data
2841 or uses the higher level python lists of coordinates. The callable
2842 now should accept either the raw data or the return value of the
2843 shape's Points() method.
2844 (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
2845 change
2846 (BaseRenderer.projected_points): Instead of the shape id use the
2847 points list as parameter.
2848 (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
2849 (BaseRenderer.draw_point_shape): Adapt to projected_points()
2850 change and accept the points list as parameter instead of the
2851 shape id.
2852
2853 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
2854 the useraw flag as required by the BaseRenderer
2855 (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
2856 changes.
2857
2858 * test/test_baserenderer.py
2859 (TestBaseRenderer.test_point_with_classification): New test for
2860 rendering a map with classifications.
2861
2862 2003-08-15 Bernhard Herzog <[email protected]>
2863
2864 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
2865 (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
2866 (ViewPort._get_hit_tester, ViewPort.projected_points)
2867 (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
2868 (ViewPort._find_label_at): Split the find_shape_at method into
2869 several new methods and use the functions in the hit-test module.
2870
2871 * Thuban/UI/hittest.py: New module with Python-level hit-testing
2872 functions
2873
2874 * test/test_hittest.py: New. Test for the new hittest module
2875
2876 2003-08-15 Bernhard Herzog <[email protected]>
2877
2878 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
2879 projection to all corners of the bounding box to get a better
2880 approximation of the projected bounding box
2881
2882 * test/test_layer.py (TestLayer.test_point_layer_with_projection):
2883 New. Test coordinate handling of a layer with a projection.
2884 Catches the bug fixed in Layer.ShapesInRegion
2885
2886 2003-08-15 Bernhard Herzog <[email protected]>
2887
2888 Move some of the mock objects in test_baserenderer into their own
2889 module so they can easily be used from other tests
2890
2891 * test/mockgeo.py: New test helper module with some mock objects
2892 for geometry related things like shapes, shapestores and
2893 projections.
2894
2895 * test/test_mockgeo.py: New. Tests for the new helper module
2896
2897 * test/test_baserenderer.py: Some of the mock-objects are in
2898 mockgeo now.
2899
2900 2003-08-12 Jan-Oliver Wagner <[email protected]>
2901
2902 * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
2903
2904 2003-08-12 Bernhard Herzog <[email protected]>
2905
2906 * po/de.po: New. German translations by Bjoern Broscheit
2907
2908 2003-08-12 Bernhard Herzog <[email protected]>
2909
2910 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
2911 strings have to be one string literal.
2912
2913 2003-08-11 Bernhard Herzog <[email protected]>
2914
2915 * test/support.py (FloatComparisonMixin.assertPointListEquals):
2916 New. This method was used in various derived classes, but it's
2917 better to have it here.
2918
2919 * test/test_shapefilestore.py
2920 (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
2921 FloatComparisonMixin
2922
2923 * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
2924 It's now in FloatComparisonMixin
2925
2926 * test/test_derivedshapestore.py
2927 (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
2928 in FloatComparisonMixin
2929
2930 2003-08-11 Bernhard Herzog <[email protected]>
2931
2932 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
2933 error message
2934
2935 2003-08-08 Jan-Oliver Wagner <[email protected]>
2936
2937 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
2938 with version number.
2939 Changed title to reflect version number of Thuban.
2940
2941 2003-08-08 Jan-Oliver Wagner <[email protected]>
2942
2943 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
2944 the list corresponds to the "About" web page.
2945
2946 2003-08-08 Bernhard Herzog <[email protected]>
2947
2948 * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
2949 Make sure translated strings are recognized as one string literal.
2950
2951 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
2952 Make sure translated strings are recognized as one string literal.
2953
2954 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
2955 translated strings are recognized as one string literal.
2956
2957 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
2958 sure translated strings are recognized as one string literal.
2959
2960 2003-08-07 Bernhard Herzog <[email protected]>
2961
2962 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
2963 Simply delegates to the original shapestore.
2964
2965 * test/test_derivedshapestore.py
2966 (TestDerivedShapeStore.test_raw_format): New. Test case for
2967 DerivedShapeStore.RawShapeFormat
2968
2969 2003-08-07 Bernhard Herzog <[email protected]>
2970
2971 Add raw data interface to shape objects.
2972
2973 * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
2974 class to ShapefileShape which now holds shapefile specific
2975 information.
2976 (ShapefileShape.compute_bbox): Simplified to not cache any
2977 information. The way this method is used that shouldn't matter
2978 performance wise.
2979 (ShapefileShape.RawData): New. Return the shapeid which is the raw
2980 data format for shapes from shapefiles.
2981 (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
2982 in the shape objects returned by a shapestore. For a
2983 ShapefileStore this is always RAW_SHAPEFILE.
2984 (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
2985 method.
2986
2987 * test/test_shapefilestore.py
2988 (TestShapefileStore.test_raw_format): New test to test the raw
2989 format feature of shapes.
2990
2991 * Thuban/Model/layer.py: Remove the unused import of Shape from
2992 data. It was only there for interface compatibility but it's not
2993 used inside of Thuban and the generic Shape class has gone away.
2994
2995 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
2996 the raw data format and only use an optimized version of its a
2997 shapefile.
2998
2999 2003-08-07 Bernhard Herzog <[email protected]>
3000
3001 * test/test_baserenderer.py (SimpleShape): Shape class for the
3002 tests.
3003 (SimpleShapeStore.Shape): Use SimpleShape instead of
3004 Thuban.Model.data.Shape to make the tests independed of the coming
3005 changes.
3006
3007 2003-08-07 Bernhard Herzog <[email protected]>
3008
3009 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
3010 (ThubanTestProgram): New classes that extend the respective
3011 classes from unittest. These new version support skipping tests
3012 under certain expected conditions. In the Thuban test suite we
3013 uses this for tests that require the optional gdal support.
3014 (run_tests): Use ThubanTestProgram instead of the unittest.main()
3015
3016 * test/runtests.py (main): Use the new ThubanTestRunner instead of
3017 the normal one from unittest
3018
3019 * test/test_layer.py (TestLayer.test_raster_layer): If this test
3020 is not run because gdal support isn't available report this to the
3021 runner.
3022
3023 * test/test_baserenderer.py
3024 (TestBaseRenderer.test_raster_no_projection): Do not run this test
3025 if gdal support isn't available and report this to the runner.
3026
3027 2003-08-06 Bernhard Herzog <[email protected]>
3028
3029 Rearrange the renderers a bit, partly in preparation for changes
3030 required for the postgis merge, partly to make it more testable.
3031 Also make the representation of coordinates in Shapes more
3032 consistent.
3033
3034 * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
3035 this class is now in BaseRenderer. This class is now practically
3036 only a specialization of BaseRenderer for rendering to an actual
3037 wx DC.
3038 (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
3039 to get the shapetype specific rendering functions.
3040
3041 * Thuban/UI/baserenderer.py: New file with the basic rendering
3042 logic. The code in this file is completely independend of wx.
3043 (BaseRenderer): Class with the basic rendering logic
3044
3045 * test/test_baserenderer.py: New. Test cases for BaseRenderer
3046
3047 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
3048 error_on_redraw to guard agains endless loops and stack overflows
3049 when there's a bug in the rendering code that raises exceptions.
3050 (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
3051 rendering into a separate method _do_redraw so that error handling
3052 is a bit easier. When an exception occurs, set error_on_redraw to
3053 true. When it's true on entry to OnIdle do nothing and return
3054 immediately.
3055
3056 * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
3057 Shape object will always have the coordinates as a list of list of
3058 coordinate pairs (tuples).
3059 (Shape.compute_bbox): Adapt to new representation.
3060
3061 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
3062 (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
3063 Shape objects.
3064
3065 * test/test_shapefilestore.py
3066 (ShapefileStoreTests.assertFloatTuplesEqual)
3067 (ShapefileStoreTests.assertPointListEquals): Rename to
3068 assertPointListEquals and change purpose to checking equality of
3069 the lists returned by Shape.Points().
3070 (TestShapefileStoreArc.test_shape)
3071 (TestShapefileStorePolygon.test_shape)
3072 (TestShapefileStorePoint.test_shape): Use the new
3073 assertPointListEquals instead of assertFloatTuplesEqual
3074
3075 * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
3076 (TestLayer.assertPointListEquals): Rename to assertPointListEquals
3077 and change purpose to checking equality of the lists returned by
3078 Shape.Points().
3079 (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
3080 (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
3081 (TestLayer.test_derived_store): Use the new assertPointListEquals
3082 instead of assertFloatTuplesEqual
3083
3084 * test/test_derivedshapestore.py
3085 (TestDerivedShapeStore.assertFloatTuplesEqual)
3086 (TestDerivedShapeStore.assertPointListEquals): Rename to
3087 assertPointListEquals and change purpose to checking equality of
3088 the lists returned by Shape.Points().
3089 (TestDerivedShapeStore.test_shape): Use the new
3090 assertPointListEquals instead of assertFloatTuplesEqual
3091
3092 2003-08-06 Jan-Oliver Wagner <[email protected]>
3093
3094 * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
3095 a bounding box. A dialog is raised in case, no bounding box
3096 is found. This fixes bug #2043:
3097 https://intevation.de/rt/webrt?serial_num=2043
3098
3099 2003-08-05 Bernhard Herzog <[email protected]>
3100
3101 * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
3102 object look like a Color instantiation. Formerly it looked like a
3103 tuple.
3104
3105 * test/test_color.py (TestColor.test_repr)
3106 (TestColor.test_equality, TestColor.test_inequality): New. test
3107 some more apects of the Color class
3108 (TestTransparent.test_repr, TestTransparent.test_hex)
3109 (TestTransparent.test_equality): New. Test cases for the
3110 Transparent object.
3111
3112 2003-08-04 Jan-Oliver Wagner <[email protected]>
3113
3114 * Doc/manual/thuban-manual.xml: a number of small improvements.
3115 The resulting file is the version submitted for GREAT-ER II.
3116
3117 2003-08-01 Bernhard Herzog <[email protected]>
3118
3119 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
3120 Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
3121 Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
3122
3123 * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
3124 (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
3125 (ThubanEndBusyCursor): Add doc-strings
3126
3127 2003-08-01 Bernhard Herzog <[email protected]>
3128
3129 First step towards PostGIS integration. More abstraction by movin
3130 more code from the layer to the shapestore. More methods of the
3131 layer are now simply delegated to the equivalent method of the
3132 shapestore. The SHAPETYPE_* constants are now in data not in
3133 layer.
3134
3135 * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
3136 (SHAPETYPE_POINT, Shape): Move these constants and classes from
3137 layer.py to data.py
3138 (ShapefileStore.__init__): More Initialization for the new methods
3139 and functionality.
3140 (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
3141 (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
3142 (ShapefileStore.Shape): New methods that were formerly implemented
3143 in the layer.
3144 (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
3145 (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
3146 (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
3147 equivalents of the new shape methods. These versions are simply
3148 delegated to the original shapstore.
3149
3150 * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
3151 (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
3152 (Layer.SetShapeStore): Removed the initializatin of instance
3153 variables that were needed for the stuff that's now in
3154 ShapefileStore
3155 (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
3156 (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
3157 shapestore.
3158
3159 * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
3160 Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
3161 instead of layer.
3162
3163 * test/test_shapefilestore.py: New. Tests for ShapefileStore.
3164
3165 * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
3166
3167 * test/test_layer.py: Import the SHAPETYPE_* constants from data
3168 instead of layer.
3169 (TestLayer.test_derived_store): Remove the test for the exception
3170 when instantiating the DerivedShapeStore with an incompatible
3171 table which is now in test_derivedshapestore.py. Add some more
3172 tests of the layer methods to determine whether they work for a
3173 DerivedShapeStore as well.
3174
3175 2003-07-31 Jonathan Coles <[email protected]>
3176
3177 * Doc/manual/thuban-manual.xml: Fix the list of required packages
3178 by just listing the name and where they can be found.
3179
3180 2003-07-31 Frank Koormann <[email protected]>
3181
3182 * Doc/manual/thuban-manual.xml:
3183 Changed the screenshot elements to figure.
3184 Changed some variablelist elements to itemizedlist.
3185 Added section on GDAL formats.
3186
3187 2003-07-31 Jonathan Coles <[email protected]>
3188
3189 * Doc/manual/thuban-manual.xml: Added a few sentences about
3190 the Fix Border Color option when generating classes.
3191
3192 2003-07-30 Jonathan Coles <[email protected]>
3193
3194 * Thuban/Model/classgen.py: Add docstrings. Rename specific
3195 Ramp instances to use lower_case_style.
3196
3197 * Thuban/UI/classgen.py: Use renamed Ramp instances.
3198
3199 * Thuban/UI/classifier.py: Add docstrings.
3200
3201 * Thuban/UI/dock.py: Add docstrings.
3202
3203 * test/test_classgen.py: Use renamed Ramp instances.
3204
3205 2003-07-30 Bernhard Herzog <[email protected]>
3206
3207 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
3208 was never used in Thuban.
3209
3210 2003-07-30 Bernhard Herzog <[email protected]>
3211
3212 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
3213 method directly instead of going through the transient_table
3214 method. This faster because transient_table may force the copy of
3215 a DBF file into the transient database and setting a table's title
3216 doesnm't affect the title of the associated transient table, so
3217 this fixes RT #2042
3218
3219 * Thuban/UI/main.py (__version__): Don't import the already
3220 removed show_exception_dialog.
3221
3222 2003-07-29 Jonathan Coles <[email protected]>
3223
3224 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
3225 Put back this method and remove the equivalent function since we
3226 are setting the exception hook from within this class (OnInit).
3227
3228 2003-07-29 Jonathan Coles <[email protected]>
3229
3230 * Doc/manual/images/5_2_custom_ramp.png,
3231 Doc/manual/images/5_2_quantiles.png,
3232 Doc/manual/images/5_2_uniform_dist.png,
3233 Doc/manual/images/5_2_unique_values.png,
3234 Doc/manual/images/8_int_error.png: New screen shots.
3235
3236 * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
3237 some points, and added more screen shots.
3238
3239 2003-07-29 Bernhard Herzog <[email protected]>
3240
3241 * Thuban/Model/data.py: Remove the now unused import of warnings
3242
3243 2003-07-29 Bernhard Herzog <[email protected]>
3244
3245 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
3246 deprecated since before the 0.8 release and isn't used in Thuban
3247 itself anymore.
3248
3249 * Thuban/Model/transientdb.py: Remove some unnecessary imports
3250
3251 2003-07-29 Jonathan Coles <[email protected]>
3252
3253 * Thuban/UI/application.py (ThubanApplication.OnInit): set the
3254 python exception hook here so that we are sure to catch any
3255 Thuban exception that happen during initialization.
3256
3257 * Thuban/UI/main.py (main): Don't set the exception hook here,
3258 it will get set in ThubanApplication.OnInit.
3259
3260 2003-07-29 Jonathan Coles <[email protected]>
3261
3262 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
3263 Removed and called it show_exception_dialog() so that the exception
3264 handler can be set before the class is created.
3265
3266 * Thuban/UI/main.py (main): Install the exception handler before
3267 a ThubanApplication is created.
3268
3269 2003-07-29 Bernhard Herzog <[email protected]>
3270
3271 * po/it.po: New. Italian translation by Maurizio Napolitano
3272
3273 * po/ru.po: New. Russian translation by Alex Shevlakov
3274
3275 2003-07-29 Frank Koormann <[email protected]>
3276
3277 * Doc/manual/thuban-manual.xml: Extended section on supported
3278 projections.
3279
3280 2003-07-29 Frank Koormann <[email protected]>
3281
3282 * Doc/manual/thuban-manual.xml: gaspell-checked.
3283
3284 2003-07-29 Jonathan Coles <[email protected]>
3285
3286 * Doc/manual/images/3_5_legend.png: Added border to improve look
3287 on white background.
3288
3289 2003-07-29 Jonathan Coles <[email protected]>
3290
3291 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
3292 descriptions for the legend toolbar.
3293
3294 * Doc/manual/images/4_2_raster_layer_properties.png: Removed
3295 cursor from dialog box.
3296
3297 2003-07-28 Jonathan Coles <[email protected]>
3298
3299 * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
3300
3301 * Doc/manual/images/2_4_session_tree.png,
3302 Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
3303 Doc/manual/images/4_2_layer_properties.png,
3304 Doc/manual/images/4_2_raster_layer_properties.png,
3305 Doc/manual/images/5_3_genclass.png,
3306 Doc/manual/images/5_classification.png,
3307 Doc/manual/images/6_projection.png,
3308 Doc/manual/images/7_1_table_view.png,
3309 Doc/manual/images/7_2_5_join.png: New screenshots.
3310
3311 2003-07-24 Jonathan Coles <[email protected]>
3312
3313 * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
3314
3315 2003-07-24 Jonathan Coles <[email protected]>
3316
3317 * Doc/manual/thuban-manual.xml: Added EPS images and wrote
3318 chapter on Layer Management.
3319
3320 * Doc/manual/Makefile: New. Makefile to generate all formats for the
3321 manual and images.
3322
3323 2003-07-24 Bernhard Herzog <[email protected]>
3324
3325 * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
3326 it annoys lintian which warns about these files not being
3327 executable. The #! isn't necessary here since if you absolutely
3328 must execute them you can always say "python <filename>".
3329
3330 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
3331 superfluous code to set brush and pen for point shapes
3332
3333 * Thuban/UI/viewport.py: Remove commented out code that wouldn't
3334 belong in viewport anyway
3335
3336 2003-07-24 Frank Koormann <[email protected]>
3337
3338 * Doc/manual/thuban-manual.xml: Added section on table management.
3339
3340 2003-07-24 Bernhard Herzog <[email protected]>
3341
3342 * test/runtests.py (main): Recognize the long "verbose" option
3343 correctly.
3344
3345 2003-07-22 Jonathan Coles <[email protected]>
3346
3347 * Doc/manual/thuban-manual.xml: Continue to write first revision
3348 of the manual.
3349
3350 * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
3351 with Begin/EndDrawing() calls to ensure we aren't doing to
3352 many updates to the dc during rendering.
3353 (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
3354 a pen and brush argument so they need to be passed to the function.
3355
3356 * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
3357 Calculates the minimum and maximum scale values. Factored out
3358 of set_view_transform so that it could be used to zoom all the
3359 way into a single point.
3360 (ViewPort.set_view_transform): Call calc_min_max_scales().
3361 (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
3362 if only a single point is selected.
3363
3364 * Doc/manual/images/1_2_legend_close.png,
3365 Doc/manual/images/1_2_legend_dock.png,
3366 Doc/manual/images/1_2_mainwindow.png,
3367 Doc/manual/images/1_2_mainwindow.ps,
3368 Doc/manual/images/1_2_mainwindow.sk,
3369 Doc/manual/images/3_2_fullextent.png,
3370 Doc/manual/images/3_2_fulllayerextent.png,
3371 Doc/manual/images/3_2_fullshapeextent.png,
3372 Doc/manual/images/3_2_pan.png,
3373 Doc/manual/images/3_2_zoomin.png,
3374 Doc/manual/images/3_2_zoomout.png,
3375 Doc/manual/images/3_3_identify.png,
3376 Doc/manual/images/3_3_label.png,
3377 Doc/manual/images/3_5_invisible.png,
3378 Doc/manual/images/3_5_movedown.png,
3379 Doc/manual/images/3_5_moveup.png,
3380 Doc/manual/images/3_5_props.png,
3381 Doc/manual/images/3_5_tobottom.png,
3382 Doc/manual/images/3_5_totop.png,
3383 Doc/manual/images/3_5_visible.png: New. Images for the documentation.
3384
3385 2003-07-18 Bernhard Herzog <[email protected]>
3386
3387 * Thuban/UI/messages.py (MAP_REPLACED): New message.
3388
3389 * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
3390 after the new map has been assigned
3391
3392 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
3393 Delegate MAP_REPLACED to the canvas too
3394 (MainWindow.prepare_new_session): Removed. Thanks to the new
3395 MAP_REPLACED message it's no longer needed
3396 (MainWindow.OpenSession, MainWindow.NewSession):
3397 prepare_new_session has been removed.
3398
3399 * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
3400 MAP_REPLACED so that we can close the dialog if a new map is set.
3401 (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
3402 (Classifier.map_replaced): Handle MAP_REPLACED by closing the
3403 dialog
3404
3405 * test/test_viewport.py (SimpleViewPortTest)
3406 (SimpleViewPortTest.test_default_size): Add doc-strings
3407 (ViewPortTest.setUp): Bind map to self.map so we can use it in
3408 tests. Subscribe to MAP_REPLACED messages too.
3409 (ViewPortTest.tearDown): No need to explicitly unsubscribe
3410 (ViewPortTest.test_set_map): New test for the SetMap method.
3411
3412 2003-07-18 Bernhard Herzog <[email protected]>
3413
3414 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
3415 Move this test from ViewPortTest.setUp to this new separate test
3416 case. setUp is not the place for the actual tests.
3417 (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
3418 more of the test from setUp to the new test test_inital_settings.
3419 (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
3420 (ViewPortTest.test_proj_conv): Split test_proj_conv into
3421 test_win_to_proj and test_proj_to_win and make the tests easier to
3422 understand
3423 (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
3424 (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
3425 (ViewPortTest.test_unprojected_rect_around_point)
3426 (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
3427 Reformat to increase readability.
3428
3429 2003-07-18 Bernhard Herzog <[email protected]>
3430
3431 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
3432
3433 2003-07-18 Bernhard Herzog <[email protected]>
3434
3435 * test/runtests.py: The test suite can now be run without an X
3436 connection. To make sure this remains true, remove the DISPLAY
3437 environment variable so that an error occurs if the wxGTK is
3438 imported accidentally
3439
3440 2003-07-18 Bernhard Herzog <[email protected]>
3441
3442 * Thuban/UI/viewport.py: Remove unused imports
3443
3444 * Thuban/UI/view.py: Remove unused imports
3445
3446 2003-07-18 Bernhard Herzog <[email protected]>
3447
3448 * test/test_export.py Remove unused imports. The OutputTransform
3449 function is now in viewport.py and is called output_transform
3450 (TestScalebar.test_output_transform)
3451 (TestScalebar.test_OutputTransform): Renamed to
3452 test_output_transform and updated to use output_transform instead
3453 of OutputTransform
3454
3455 * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
3456 renamed.
3457 (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
3458 renamed to output_transform
3459
3460 * Thuban/UI/viewport.py (OutputTransform, output_transform):
3461 Rename to output_transform
3462
3463 2003-07-18 Bernhard Herzog <[email protected]>
3464
3465 * Thuban/Model/layer.py (Layer.__init__): Rename
3466 classificationField to classificatin_column and init it here so
3467 that it can be used in SetClassificationColumn
3468 (Layer.GetClassificationColumn, Layer.GetClassificationField):
3469 Rename to GetClassificationColumn.
3470 (Layer.SetClassificationColumn, Layer.SetClassificationField):
3471 Rename to SetClassificationColumn and issue a LAYER_CHANGED
3472 message if the column changes.
3473 (Layer._classification_changed, Layer.ClassChanged): Rename to
3474 _classification_changed. Update the callers.
3475 (Layer.SetShapeStore): Further field->column renames.
3476
3477 * Thuban/Model/load.py (SessionLoader.start_classification)
3478 (SessionLoader.start_clpoint): Updates because of
3479 field->column method name changes in the Layer class
3480
3481 * Thuban/Model/save.py (SessionSaver.write_classification): Updates
3482 because of field->column method name changes in the Layer class
3483
3484 * Thuban/UI/classifier.py (Classifier.__init__)
3485 (Classifier._OnTry, Classifier._OnRevert): Updates because of
3486 field->column method name changes in the Layer class
3487
3488 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
3489 because of field->column method name changes in the Layer class
3490
3491 * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
3492 of field->column method name changes in the Layer class
3493
3494 * test/test_save.py (SaveSessionTest.testClassifiedLayer)
3495 (SaveSessionTest.testClassifiedLayer): Update because of
3496 field->column method name changes in the Layer class
3497
3498 * test/test_layer.py (SetShapeStoreTests.setUp)
3499 (SetShapeStoreTests.test_sanity): Update because of field->column
3500 method name changes in the Layer class
3501 (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
3502 (TestLayerModification.test_sanity)
3503 (TestLayerModification.test_initial_settings): remove unsued code
3504 and rename to test_sanity.
3505 (TestLayerModification.test_set_classification): New test for
3506 SetClassification and SetClassificationField.
3507
3508 2003-07-18 Bernhard Herzog <[email protected]>
3509
3510 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
3511 the non-fixed values as well. The old test would have accepted a
3512 fixed ramp that only returnes the fixed properties
3513
3514 2003-07-17 Jonathan Coles <[email protected]>
3515
3516 * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
3517 shots for the manual. The XCF file is the source image and
3518 has additional layers to support changes.
3519
3520 * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
3521
3522 * Thuban/UI/classifier.py (Classifier.__BuildClassification):
3523 Return both the new class and the field name.
3524
3525 * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
3526 fit the map to the window as this changes any zoom level that
3527 the user may have set.
3528
3529 2003-07-16 Jonathan Coles <[email protected]>
3530
3531 * Thuban/Model/classgen.py (generate_singletons,
3532 generate_uniform_distribution, generate_quantiles): Remove
3533 fixes parameter, but maintain the same functionality by having
3534 the calling function pass a FixedRamp object for the ramp.
3535 (FixedRamp): New. Adapts a ramp to have fixed property values.
3536
3537 * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
3538 (Classification): Inherit from Publisher.
3539 (Classification.__init__): Remove the layer parameter.
3540 Classifications no longer need to have a parent layer.
3541 (Classification.GetField, Classification.GetFieldType,
3542 Classification.SetFieldInfo): Removed. The field name is stored
3543 in the layer, and the type can be retreived by calling
3544 Layer.GetFieldType().
3545 (Classification._set_layer, Classification.GetLayer): Removed.
3546 Classifications no longer have a parent layer.
3547
3548 * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
3549 classification.
3550 (Layer.SetShapeStore): Reset the classification first while
3551 we still have the old shape store to work with.
3552 (Layer.GetClassificationField, Layer.SetClassificationField):
3553 New. Method for getting/setting the field to classify on.
3554 (Layer.SetClassification): Simplified now that the layer
3555 simply has to hold a reference to the classification and not
3556 tell the classification who owns it.
3557 Fixes RTbug #2023.
3558
3559 * Thuban/Model/load.py (SessionLoader.start_classification):
3560 Set the field name on the layer, not the classification.
3561
3562 * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
3563 classification is modified.
3564
3565 * Thuban/Model/save.py (SessionSaver.write_classification):
3566 Get the field name and type from the layer.
3567
3568 * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
3569 parameter records to rows and add docstring. Fixes RTbug #1997.
3570
3571 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
3572 ramp when we need to fix certain values of a ramp rather than
3573 using the old fixes parameter. Fixes RTbug #2024.
3574
3575 * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
3576 parameter.
3577 (ClassTable.Reset): Add fieldType parameter and use it, rather
3578 than asking the classification.
3579 (Classifier.__init__): Remember the original class's field
3580 and ask the layer for the field type, rather than the classification.
3581 (Classifier.__SetGridTable): Retrieve the field and field type
3582 for the table because they are not in the classification.
3583 (Classifier._OnTry, Classifier._OnRevert): Set the classification
3584 field on the layer in addition to the classification itself.
3585
3586 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
3587 classification field from layer.
3588
3589 * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
3590 classification field from layer. Split up tests and remove
3591 *-imports. Fixes RTbug #1992.
3592
3593 * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
3594
3595 * test/test_classification.py
3596 (TestClassification.test_classification): Remove tests for methods
3597 that no longer exist.
3598
3599 * test/test_layer.py (SetShapeStoreTests.setUp): Classification
3600 __init__ no longer has a field parameter, use SetClassificationField.
3601 (SetShapeStoreTests.test_sanity): Use layer object to get class
3602 field info.
3603
3604 * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
3605 SetClassificationField on layer to set class field info.
3606
3607 * test/test_viewport.py: Renamed from test/test_view.py.
3608
3609 2003-07-16 Jan-Oliver Wagner <[email protected]>
3610
3611 * Doc/manual/thuban-manual.xml: Added authors and an initial
3612 coarse structure.
3613
3614 2003-07-15 Bernhard Herzog <[email protected]>
3615
3616 * test/support.py (FloatComparisonMixin): This is a mix-in class
3617 and therefore should not be derived from any other class.
3618
3619 * test/test_range.py (RangeTest): FloatComparisonMixin is a
3620 mix-in, so derive from TestCase as well.
3621
3622 2003-07-15 Bernhard Herzog <[email protected]>
3623
3624 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
3625 draw_func handling a bit to remove one layer of indirection. This
3626 makes the renderer about 10% faster in the non-classifying case
3627 and the code a bit cleaner
3628 (MapRenderer.draw_point_shape): Add the pen and brush parameters
3629 and set them in the dc. Now the draw_point_shape method and
3630 wxproj's draw_polygon_shape function have basically the same
3631 signature so that both can be directly used as draw_func
3632
3633 2003-07-15 Bernhard Herzog <[email protected]>
3634
3635 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
3636 string values (in addition to the labels) as UTF 8
3637
3638 * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
3639 values if the field type is string
3640
3641 * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
3642 saving a session with non-ascii string classification values.
3643
3644 * test/test_load.py (TestClassification.file_contents)
3645 (TestClassification.test): Check for non-ascii values in string
3646 classifications
3647
3648 2003-07-14 Jonathan Coles <[email protected]>
3649
3650 * test/test_view.py: New. Tests for ViewPort.
3651
3652 2003-07-14 Frank Koormann <[email protected]>
3653
3654 * Thuban/Model/load.py (SessionLoader.start_map): Encode map
3655 title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
3656
3657 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
3658 unicode strings from session file: session title, map title and
3659 projection name.
3660
3661 2003-07-10 Jonathan Coles <[email protected]>
3662
3663 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
3664 drag_stop, not drag_move when the mouse is released.
3665
3666 2003-07-10 Jonathan Coles <[email protected]>
3667
3668 The most important part of this is the seperation of view.py into
3669 two pieces. viewport.py now has a class called ViewPort which
3670 contains all the non-wx parts of view.py and can therefore be
3671 tested. view.py contains only the wx-specific parts and is fairly
3672 simple.
3673
3674 * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
3675 RTTbug #1992.
3676 * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
3677 RTTbug #1992.
3678
3679 * Thuban/Model/classgen.py (generate_singletons,
3680 generate_uniform_distribution, generate_quantiles):
3681 Added 'fixes' parameter so that property attributes can
3682 be held constant over the generated classification groups.
3683 (CustomRamp.GetProperties): Remove unused variables.
3684
3685 * Thuban/Model/map.py (Map.SetProjection): Send the old
3686 projection as an argument to listeners of the MAP_PROJECTION_CHANGED
3687 event.
3688
3689 * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
3690 parameter which is a list of records that restricts which
3691 records are saved. Fixes RTbug #1997.
3692
3693 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
3694 Port exception dialog from GREAT-ER. Fixes RTbug #1993.
3695
3696 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
3697 to allow the user to fix line color/width on generated groups.
3698 (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
3699 functions to optionally fix group properties.
3700
3701 * Thuban/UI/main.py (main): Set exception hook to the
3702 ShowExceptionDialog. Fixes RTbug #1993.
3703
3704 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
3705 the table window when it is selectd to be shown.
3706
3707 * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
3708 Export Selection button and move the export buttons underneath
3709 the table.
3710 (QueryTableFrame.UpdateStatusText): Added event argument so
3711 that it can respond to grid selection events. The status text
3712 is now updated even when the table is not associated with a
3713 layer as was previously assumed.
3714 (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
3715 UpdateStatusText responds to these events.
3716 (QueryTableFrame.OnSaveAs): Renamed to doExport.
3717 (QueryTableFrame.doExport): Helper function that saves the
3718 entire table, or selected rows, to a file.
3719 (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
3720 Respond to export button events and call doExport.
3721
3722 * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
3723 the function doesn't return NULL without first setting a Python
3724 Error.
3725
3726 * test/runtests.py (main): Only print "Unknown option" for
3727 unsupported options.
3728
3729 * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
3730 optional epsilon argument to specify floating point accuracy.
3731 (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
3732 for each item test.
3733
3734 * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
3735 tests for saving selected records.
3736
3737 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
3738 tests for saving selected records.
3739
3740 * test/test_map.py (TestMapWithContents.test_set_projection):
3741 MAP_PROJECTION_CHANGED events send the old projection.
3742
3743 * test/test_session.py
3744 (TestSessionWithContent.test_forward_map_projection):
3745 MAP_PROJECTION_CHANGED events send the old projection.
3746
3747 * test/test_table.py (TableTest): Update tests to use non-deprecated
3748 functions.
3749
3750 2003-07-08 Bernhard Herzog <[email protected]>
3751
3752 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
3753 constants in the column objects are the standard ones defined in
3754 the table module.
3755
3756 * test/test_transientdb.py
3757 (TestTransientTable.test_transienttable_to_dbf): New. Test whether
3758 exporting transient tables as DBF works. This should catch the bug
3759 just fixed in TransientTableBase.Width.
3760
3761 2003-07-08 Bernhard Herzog <[email protected]>
3762
3763 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
3764 interpolated colors correctly.
3765
3766 * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
3767 New. Test case for the fix in classgen.py
3768
3769 2003-07-08 Bernhard Herzog <[email protected]>
3770
3771 * test/runtests.py (main): Make the default output less verbose
3772 and add a verbosity option (-v) to get the old output
3773
3774 2003-07-08 Bernhard Herzog <[email protected]>
3775
3776 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
3777 0.9.
3778
3779 * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
3780 New. Return the join type
3781
3782 * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
3783 DTD
3784 (SessionSaver.write_data_containers): Save the join type for
3785 joined tables
3786
3787 * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
3788 namespace
3789 (SessionLoader.start_jointable): Handle the jointype attribute
3790
3791 * test/test_load_0_8.py: New. Effectively a copy of test_load.py
3792 as of Thuban 0.8. These are now tests to determine whether Thuban
3793 can still read files generated by Thuban 0.8
3794
3795 * test/test_load.py (LoadSessionTest.dtd)
3796 (TestSingleLayer.file_contents)
3797 (TestLayerVisibility.file_contents, TestLabels.file_contents)
3798 (TestLayerProjection.file_contents)
3799 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3800 (TestJoinedTable.file_contents)
3801 (TestLoadError.file_contents): Update for new DTD
3802 (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
3803 for new join type attribute
3804
3805 * test/test_save.py (SaveSessionTest.dtd)
3806 (SaveSessionTest.testEmptySession)
3807 (SaveSessionTest.testSingleLayer)
3808 (SaveSessionTest.testLayerProjection)
3809 (SaveSessionTest.testRasterLayer)
3810 (SaveSessionTest.testClassifiedLayer)
3811 (SaveSessionTest.test_dbf_table)
3812 (SaveSessionTest.test_joined_table): Update for new DTD
3813 (SaveSessionTest.test_joined_table): Add test for new join type
3814 attribute
3815
3816 2003-07-04 Bernhard Herzog <[email protected]>
3817
3818 * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
3819 function for table_to_dbf
3820 (table_to_dbf): Deal with names longer than the 10 character limit
3821
3822 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
3823 doc-string
3824 (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
3825 long column names
3826
3827 2003-07-03 Bernhard Herzog <[email protected]>
3828
3829 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
3830
3831 2003-07-03 Bernhard Herzog <[email protected]>
3832
3833 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
3834 for the Thuban manual and README with some basic information about
3835 the manual
3836
3837 2003-07-03 Bernhard Herzog <[email protected]>
3838
3839 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
3840 Update doc-string
3841 (TransientJoinedTable.create): Do not modify the column objects of
3842 the input tables in place and copy all columns of the input tables
3843 into the joined table after all.
3844
3845 * test/test_transientdb.py
3846 (TestTransientTable.test_transient_joined_table_same_column_name):
3847 Update to reflect the new behavior
3848 (TestTransientTable.test_transient_joined_table_with_equal_column_names):
3849 Update to reflect the new behavior
3850 (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
3851 New test case for a bug which modified the column objects in place
3852
3853 2003-07-02 Jonathan Coles <[email protected]>
3854
3855 * Thuban/Model/classgen.py (generate_singletons,
3856 generate_uniform_distribution, generate_quantiles,
3857 GenQuantiles0): Make sure maxValue isn't less than
3858 one, otherwise we could divide by zero.
3859
3860 * test/test_classgen.py (ClassGenTest.doClassRangeTest,
3861 ClassGenTest.doClassSingleTest): Call doBoundsTest to
3862 check the end classification groups against the
3863 proper property values.
3864 (ClassGenTest.doBoundsTest): New. Checks the first and
3865 last classification groups to make sure their properties
3866 are the correct upper and lower bounds for a color ramp.
3867
3868 2003-07-02 Jonathan Coles <[email protected]>
3869
3870 * Thuban/Model/classgen.py (generate_singletons,
3871 generate_uniform_distribution, generate_quantiles,
3872 GenQuantiles0): The denominator was one to high when
3873 calculating the index for the ramp causing the index
3874 to never to reach one.
3875
3876 2003-07-02 Jonathan Coles <[email protected]>
3877
3878 Changed the singature of ClassGroupRange.__init__ and
3879 ClassGroupRange.SetRange() so that the min/max values are
3880 passed as a tuple. This makes a better calling scheme for
3881 when a Range object is passed instead.
3882
3883 * Thuban/Model/classgen.py: Fixed parameters to
3884 ClassGroupRange constructor.
3885
3886 * Thuban/Model/classification.py (ClassGroupRange.__init__):
3887 Consolidate the min/max parameters into a single _range which
3888 can either be a tuple or a Range object.
3889 (ClassGroupRange.SetRange): Consolidate the min/max parameters
3890 into a single _range which can either be a tuple or a Range object.
3891
3892 * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
3893 call to ClassGroupRange constructor to use a tuple.
3894
3895 * Thuban/Model/layer.py (Layer.SetClassification): Switch
3896 the classification instance variable to the new class
3897 before calling _set_layer otherwise subscribers to a
3898 LAYER_CHANGED event will not see any difference.
3899
3900 * test/test_classification.py: Fix tests of ClassGroupRange
3901 so that they use the new signature.
3902
3903 * test/test_load.py: Fix use of ClassGroupRange so that it
3904 uses the new signature.
3905
3906 * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
3907 uses the new signature.
3908
3909 * test/test_save.py: Fix use of ClassGroupRange so that it
3910 uses the new signature.
3911
3912
3913 2003-07-01 Jonathan Coles <[email protected]>
3914
3915 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
3916 Import used objects/class from color.
3917 (generate_singletons): We don't
3918 need the numGroups parameter anymore because we are using
3919 the new ramps with GetProperties().
3920 (generate_uniform_distribution): Use new ramp method
3921 GetProperties().
3922 (generate_quantiles, GenQuantiles0): Use new ramp method
3923 GetProperties().
3924 (CustomRamp.SetNumGroups): Removed. The ramps now map
3925 a value from 0 to 1 to class properties so the number
3926 of groups is not needed ahead of time.
3927 (CustomRamp.next): Removed. CustomRamp does not support
3928 interation anymore.
3929 (CustomRamp.GetProperties): Returns a ClassGroupProperties
3930 object based on the index value from 0 to 1 that is
3931 passed to it.
3932 (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
3933 Made into instances of Monochromatic class instread of
3934 deriving from it.
3935 (HotToCold.SetNumGroups): Removed. See CustomRamp.
3936 (HotToCold.next): Removed. See CustomRamp.
3937
3938 * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
3939 (Classification.SetField, Classification.SetFieldType):
3940 Replaced with SetFieldInfo.
3941 (Classification.SetFieldInfo): New. Does a better job of
3942 what SetField and SetFieldType used to do by combining
3943 their function since they should really always be done
3944 at the same time.
3945 (Classification.SetLayer): Renamed to _set_layer.
3946 (Classification._set_layer): Should only be called from
3947 Layer's SetClassification. This does not cause a recursive
3948 call as SetLayer did because we know that Layer knows about
3949 the classification.
3950
3951 * Thuban/Model/color.py: Fixes RTbug #1971.
3952 (_Transparent): Renamed from Transparent so it doesn't
3953 conflict with the module variable.
3954 (Transparent, Black): Renamed from Color.Transparent,
3955 Color.Black so they are not class variables.
3956
3957 * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
3958 (Layer.Destroy): We don't need to call SetClassification
3959 anymore to clear out the back reference in the classifcation
3960 to the layer. It's better to set it to None using _set_layer,
3961 and we won't be creating another clas object too.
3962 (Layer.SetClassification): Classification._set_layer is not
3963 recursive so remove all the locking variables. Also clean
3964 up the code so that it remains unchanged if something fails.
3965
3966 * Thuban/Model/load.py: Fixes RTbug #1971.
3967 (SessionLoader.start_classification): Call
3968 Classification.SetFieldInfo().
3969
3970 * Thuban/Model/save.py: Removed import of Color which wasn't
3971 being used.
3972
3973 * Thuban/UI/classgen.py: Fixes RTbug #1972.
3974 (ClassGenDialog.__init__): Color ramps are now instances
3975 already so we don't need to create any new objects.
3976 (ClassGenDialog.OnOK): Check for numGroups is no longer
3977 necessary because we never use it.
3978
3979 * Thuban/UI/classifier.py: Fixes RTbug #1971.
3980 (Classifier.__BuildClassification, Classifier.__SetGridTable):
3981 Call Classification.SetFieldInfo() instead of SetFieldType.
3982
3983 * Thuban/UI/renderer.py: Fixes RTbug #1971.
3984
3985 * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
3986 (MapCanvas.__init__): Subscribe to the idle time event. Set
3987 background color to white.
3988 (MapCanvas.OnPaint): Set a flag indicating that we should
3989 render the map during idle time. If we already have a bitmap
3990 just draw it now.
3991 (MapCanvas.OnIdle): New. Render the map only during idle time.
3992 This also fixes a problem with the busy cursor under gtk.
3993
3994 * test/test_classgen.py (ClassGenTest.test_generate_singletons):
3995 Fix calls to generate_singletons because the signature changed.
3996
3997 * test/test_classification.py: Fix color references and
3998 change calls to Classification.[SetField|SetFieldType] to
3999 SetFieldInfo.
4000
4001 * test/test_load.py: Fix color references.
4002
4003 * test/test_load_0_2.py: Fix color references.
4004
4005 * test/test_save.py (SaveSessionTest.testClassifiedLayer):
4006 Change calls to Classification.[SetField|SetFieldType] to
4007 SetFieldInfo.
4008
4009 2003-07-01 Frank Koormann <[email protected]>
4010
4011 MERGE from the greater-ms3 branch.
4012
4013 * test/test_transientdb.py
4014 (TestTransientTable.test_transient_joined_table_with_equal_column_names):
4015 New. Test join of two tables with partly equal column names.
4016
4017 * Thuban/Model/transientdb.py (TransientJoinedTable.create):
4018 If duplicates in left and right tables column names are found,
4019 append '_' (underscores) to the name until it is unique.
4020 Create always new internal names for the resulting table and reference
4021 columns in the join statement with <table>.<column>
4022
4023 2003-07-01 Bernhard Herzog <[email protected]>
4024
4025 * test/test_transientdb.py
4026 (TestTransientTable.test_transient_joined_table_same_column_name):
4027 New. Test whether joining on columns with the same names in both
4028 tables works.
4029
4030 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
4031 sure to use the right internal names even when joining on field
4032 with the same names in both tables. Also, detect duplicate names
4033 in the joined table correctly.
4034
4035 2003-07-01 Frank Koormann <[email protected]>
4036
4037 * Thuban/UI/renderer.py (ExportRenderer.render_legend):
4038 Reverse List of layers to render in same order as in desktop legend.
4039
4040 2003-06-30 Jonathan Coles <[email protected]>
4041
4042 * Thuban/version.py (make_tuple): Takes a version string
4043 and splits it into a tuple of at most three integers.
4044 Used make_tuple() to make tuple versions of the version
4045 numbers.
4046
4047 * Thuban/UI/about.py: Add Thuban email addresses.
4048
4049 2003-06-30 Jonathan Coles <[email protected]>
4050
4051 * Thuban/version.py: SQLite/PySQLite version dependencies
4052 were too high.
4053
4054 2003-06-30 Jonathan Coles <[email protected]>
4055
4056 * Thuban/version.py: Update version to 0.8.1
4057
4058 * MANIFEST.in: Added Projections so that default.proj is
4059 included.
4060
4061 2003-06-26 Jonathan Coles <[email protected]>
4062
4063 New About box with lots more information including library
4064 versions and credits. More/better version checking before
4065 Thuban starts.
4066
4067 * Thuban/UI/about.py: New. New About box that displays
4068 library version information and credits.
4069
4070 * Thuban/version.py: Added new 'versions' dictionary which
4071 contains the verions of various libraries which are checked
4072 when the module loads.
4073 (verify_versions): Check all version numbers and returns
4074 a list of errors.
4075
4076 * Thuban/UI/classifier.py (Classifier.__EnableButtons):
4077 Reset the status of the buttons as the situation warrants,
4078 but in a better more reliable way by not relying on the
4079 current status to determine what needs to change.
4080
4081 * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
4082 (verify_versions): Remove most of the code since it is
4083 now in Thuban.version.verify_versions.o
4084
4085 * Thuban/UI/mainwindow.py (MainWindow.About): Call new
4086 About box in Thuban.UI.about.
4087
4088 * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
4089 Returns the version of gdal library being used as a string.
4090
4091 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
4092 Removed.
4093 (get_proj_version): Return the version of PROJ that the file
4094 was compiled with.
4095 (get_gtk_version): Return th version of GTK that the file
4096 was compiled with.
4097
4098 2003-06-25 Jonathan Coles <[email protected]>
4099
4100 * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
4101 of the SelectPropertiesDialog should be self so the window
4102 appears on top.
4103 (ClassGroupPropertiesCtrl.DoEdit): The parent
4104 of the SelectPropertiesDialog should be self so the window
4105 appears on top.
4106
4107 * Thuban/UI/resource.py: Cleaned up how we determine file
4108 extensions.
4109 (GetImageResource): Return an wxImage from our Resources.
4110
4111 2003-06-24 Jonathan Coles <[email protected]>
4112
4113 * Thuban/UI/renderer.py (ExportRenderer.render_legend):
4114 Check that a layer has a classification before trying
4115 to get it. Raster layers don't have classifications.
4116
4117 2003-06-23 Jonathan Coles <[email protected]>
4118
4119 * setup.py: Add Resources/XML to resource list.
4120
4121 2003-06-23 Jonathan Coles <[email protected]>
4122
4123 * setup.cfg: Fix copyright dates
4124
4125 2003-06-23 Jonathan Coles <[email protected]>
4126
4127 * MANIFEST.in: Update with Resources/XML
4128
4129 * setup.py: Don't include Locale resources yet as we don't
4130 have any and it causes problems building the distribution
4131 for Windows. Update version to 0.8.0.
4132
4133 * Doc/thuban.dtd: Removed since it is now in Resources/XML.
4134
4135 * Thuban/UI/mainwindow.py: Add blank line at the end because
4136 file was not being read correctly building the Windows
4137 distribution.
4138
4139 2003-06-23 Jonathan Coles <[email protected]>
4140
4141 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
4142
4143 * Thuban/version.py: Temporarily update longversion for
4144 the 0.8 release so that it doesn't have the cvs revision.
4145
4146 2003-06-23 Jonathan Coles <[email protected]>
4147
4148 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
4149 to make sure that we don't create reentrant possibilities with
4150 wxYield.
4151
4152 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
4153 directly to avoid the wxSafeYield() call which generates an
4154 OnPaint event causing infinite recursion. Don't try to catch
4155 exception anymore. This was for before there were limits on map
4156 scaling.
4157
4158 2003-06-23 Bernhard Herzog <[email protected]>
4159
4160 Bug fix for RT #1961:
4161
4162 * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
4163 Register DerivedShapestores with the session
4164
4165 * Thuban/Model/session.py (Session.Tables): Make sure each table
4166 is only listed once.
4167
4168 * test/test_load.py (TestJoinedTable.test): Add check_format call.
4169 Update file contents to match the one written out.
4170
4171 2003-06-20 Bernhard Herzog <[email protected]>
4172
4173 * test/xmlsupport.py (SaxEventLister.startElementNS)
4174 (SaxEventLister.endElementNS): Do not include the qname. Python
4175 2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
4176 is (presumably incorrectly) None, whereas it's a string with the
4177 element name in the later versions.
4178
4179 * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
4180 (TestEventList.test_even_list_namespace): Update tests to reflect
4181 the new behaviour
4182 (TestEventList.test_even_list_id_normalization): Fix doc-string
4183
4184 2003-06-20 Jonathan Coles <[email protected]>
4185
4186 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
4187 by deriving classes to determine if that layer supports shapes.
4188 (Layer): Override HasShapes and return true.
4189
4190 * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
4191 instead of a direct call to wx[Begin|End]CusyCursor().
4192 (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
4193 table data.
4194
4195 * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
4196 New. Wrappers around the wxWindows functions that allow us to
4197 make additional calls such as wxYield which gives the native
4198 system a chance to update the cursor correctly.
4199
4200 * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
4201 instead of a direct call to wx[Begin|End]CusyCursor().
4202
4203 * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
4204 instead of a direct call to wx[Begin|End]CusyCursor().
4205 (MapCanvas.find_shape_at): Check if the current search layer
4206 support shapes, otherwise go on to the next layer.
4207
4208 * test/test_layer.py: Add tests in each type of layer for
4209 HasClassification() and HasShapes()
4210
4211 2003-06-20 Jonathan Coles <[email protected]>
4212
4213 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
4214 turning on the busy cursor to allow the system to change the
4215 cursor before we begin painting. This fixes a problem that
4216 was occuring only under GTK. Fixes RTbug #1840.
4217
4218 2003-06-20 Bernhard Herzog <[email protected]>
4219
4220 * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
4221 version.
4222
4223 * Thuban/Model/save.py (sort_data_stores): New. Make topological
4224 sort of the data sources so they can be written with sources that
4225 data sources that depend on other data sources come after the
4226 sources they depend on.
4227 (SessionSaver.__init__): Add idmap instance variable to map from
4228 objects to the ids used in the file.
4229 (SessionSaver.get_id, SessionSaver.define_id)
4230 (SessionSaver.has_id): New. Methods to manage the idmap
4231 (SessionSaver.write): Use thuban-0.8.dtd
4232 (SessionSaver.write_session): Add a namespace on the session and
4233 write out the data sources before the maps.
4234 (SessionSaver.write_data_containers): New. Write the data
4235 containers.
4236 (SessionSaver.write_layer): Layer elements now refer to a
4237 shapestore and don't contain filenames anymore.
4238
4239 * Thuban/Model/load.py (LoadError): Exception class to raise when
4240 errors in the files are discovered
4241 (SessionLoader.__init__): Define dispatchers for elements with a
4242 thuban-0.8 namespace too.
4243 (SessionLoader.check_attrs): New helper method to check and
4244 convert attributes
4245 (AttrDesc): New. Helper class for SessionLoader.check_attrs
4246 (SessionLoader.start_fileshapesource)
4247 (SessionLoader.start_derivedshapesource)
4248 (SessionLoader.start_filetable, SessionLoader.start_jointable):
4249 Handlers for the new elements in the new fileformat
4250 (SessionLoader.start_layer): Handle the shapestore attribute in
4251 addition to filename.
4252 (SessionLoader.start_table, SessionLoader.end_table): Removed.
4253 They were never used in the old formats and aren't needed for the
4254 new.
4255
4256 * Thuban/Model/session.py (Session.DataContainers): New method to
4257 return all "data containers", i.e. shapestores and tables
4258
4259 * test/xmlsupport.py (SaxEventLister.__init__)
4260 (SaxEventLister.startElementNS, sax_eventlist): Add support to
4261 normalize IDs.
4262
4263 * test/test_xmlsupport.py
4264 (TestEventList.test_even_list_id_normalization): New test case for
4265 id normalization
4266
4267 * test/test_load.py (LoadSessionTest.check_format): Use ID
4268 normalization
4269 (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
4270 class atrributes used for ID normalization
4271 (TestSingleLayer, TestLayerVisibility, TestLabels.test)
4272 (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
4273 file format
4274 (TestJoinedTable): New test for loading sessions with joined
4275 tables.
4276 (TestLoadError): New. Test whether missing required attributes
4277 cause a LoadError.
4278
4279 * test/test_save.py (SaveSessionTest.thubanids)
4280 (SaveSessionTest.thubanidrefs): New class attributes for ID
4281 normalization in .thuban files.
4282 (SaveSessionTest.compare_xml): Use id-normalization.
4283 (SaveSessionTest.testEmptySession)
4284 (SaveSessionTest.testLayerProjection)
4285 (SaveSessionTest.testRasterLayer)
4286 (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
4287 (SaveSessionTest.testLayerProjection): The filename used was the
4288 same as for testSingleLayer. Use a different one.
4289 (SaveSessionTest.test_dbf_table)
4290 (SaveSessionTest.test_joined_table): New test cases for saving the
4291 new data sources structures.
4292 (TestStoreSort, MockDataStore): Classes to test the sorting of the
4293 data stores for writing.
4294
4295 * test/runtests.py: Add CVS keywords
4296
4297 2003-06-20 Jonathan Coles <[email protected]>
4298
4299 * test/test_session.py
4300 (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
4301 Use the cultural_landmark-point.dbf file for the store so that
4302 the table rows and shape count match.
4303
4304 2003-06-20 Jonathan Coles <[email protected]>
4305
4306 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
4307 an exception if the number of shapes is different from the
4308 number of rows in the table. Address RTbug #1933.
4309
4310 * test/test_layer.py (TestLayer.test_derived_store): Add
4311 a test for the new exception in DerivedShapeStore.__init__.
4312
4313 * test/support.py (FloatTestCase): Removed since there is
4314 already FloatComparisonMixin. Fixes RTbug #1954.
4315 (FloatComparisonMixin.assertFloatEqual): Include test for
4316 infinity that was part of FloatTestCase.
4317
4318 * test/test_range.py (RangeTest): Inherit from
4319 support.FloatComparisonMixin now that we don't have
4320 support.FloatTestCase.
4321
4322 2003-06-20 Bernhard Herzog <[email protected]>
4323
4324 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
4325 the implementation in xmlsupport instead.
4326 (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
4327
4328 * test/test_proj.py: Import sax_eventlist from xmlsupport instead
4329 of test_save
4330
4331 2003-06-20 Bernhard Herzog <[email protected]>
4332
4333 * test/test_load.py (LoadSessionTest.check_format): New helper
4334 method to make sure the test files we load might have been written
4335 by the current thuban version.
4336 (ClassificationTest.TestLayers, TestSingleLayer.test)
4337 (TestLayerVisibility.test, TestClassification.test)
4338 (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
4339 Add check_format() calls and fix the thuban data to match the data
4340 that would be written by saving the session loaded from it.
4341
4342 * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
4343 the same class and function in test_save.
4344
4345 * test/test_xmlsupport.py (TestEventList): New. test cases for
4346 sax_eventlist
4347
4348 2003-06-20 Bernhard Herzog <[email protected]>
4349
4350 * Resources/XML/thuban.dtd: Add comment about which versions of
4351 Thuban are covered by this DTD
4352 (map): Fix content model for layers and raster layers. There can
4353 be any number or layers and raster layers in any order.
4354
4355 2003-06-20 Jonathan Coles <[email protected]>
4356
4357 This is mainly about fixing RTbug #1949.
4358
4359 * Thuban/Model/classification.py: Remove "from __future__"
4360 import statement since python 2.2 is the earliest supported
4361 version.
4362
4363 * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
4364 Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
4365 depending on the units this projection *forwards* into.
4366
4367 * Thuban/Model/save.py (SessionSaver.write_classification):
4368 Remove unnecessary use of lambdas and nested functions.
4369
4370 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
4371 adjustment here if the map projection uses degrees.
4372
4373 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
4374 scale adjust code since it is now done before calling
4375 this method. Don't do anything if the map projection
4376 is None.
4377
4378 2003-06-19 Bernhard Herzog <[email protected]>
4379
4380 Move version specific load tests to their own file.
4381
4382 * test/test_load.py: Expand the doc-string to explain a bit how to
4383 handle file format changes.
4384 (TestClassification.test): Update the docstring as this test is
4385 not about Thuban 0.2 anymore.
4386
4387 * test/test_load_0_2.py: New file with the load tests for thuban
4388 files created with Thuban 0.2 and earlier.
4389
4390 2003-06-19 Bernhard Herzog <[email protected]>
4391
4392 Add XML validation to some of the tests. Validation will only be
4393 done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
4394 To make the DTD available to the test cases it's moved into
4395 Resources/XML
4396
4397 * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
4398 for versions up to and including 0.2. Two slight changes: added an
4399 encoding specification and fixed the comment which refered to
4400 GRASS, not Thuban
4401
4402 * test/xmlsupport.py: New support module for tests involving XML.
4403 Currently there's a mix-in class for XML validation.
4404
4405 * test/test_xmlsupport.py: New. Tests for the xmlsupport module
4406
4407 * test/test_save.py (SaveSessionTest): Derive from ValidationTest
4408 so that we can validate the
4409 (SaveSessionTest.testEmptySession)
4410 (SaveSessionTest.testSingleLayer)
4411 (SaveSessionTest.testSingleLayer)
4412 (SaveSessionTest.testLayerProjection)
4413 (SaveSessionTest.testRasterLayer)
4414 (SaveSessionTest.testClassifiedLayer): Validate the generated XML
4415
4416 * test/runtests.py (main): Call print_additional_summary instead
4417 of print_garbage_information
4418
4419 * test/support.py (resource_dir): New function to return the
4420 "Resource" subdirectory
4421 (print_additional_summary): New function to combine several
4422 summary functions
4423 (run_tests): Use print_additional_summary instead of calling
4424 print_garbage_information directly
4425
4426 2003-06-19 Bernhard Herzog <[email protected]>
4427
4428 * Doc/thuban.dtd (classification): Correct the content model of
4429 the classification element.
4430 (projection): Add the "name" attribute
4431
4432 2003-06-19 Frank Koormann <[email protected]>
4433
4434 MERGE from the greater-ms3 branch.
4435
4436 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
4437 scale if projection is latlong to get better estimate.
4438
4439 Fix problem of hidden properties dialog under windows after double
4440 click on layer tree:
4441 The tree control always gets an Expanded / Collapsed event after
4442 the ItemActivated on double click, which raises the main window again. We add a second ItemActivated event to the queue, which simply
4443 raises the already displayed window.
4444
4445 * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
4446 raiseProperties initialized to prevent endless loops
4447 (LegendTree._OnItemActivated): Depending on self.raiseProperties
4448 simply raise the properties or open the dialog and issue a second
4449 event.
4450
4451 2003-06-18 Jonathan Coles <[email protected]>
4452
4453 * setup.py: Fix a few problems that occured under Windows.
4454
4455 2003-06-18 Jonathan Coles <[email protected]>
4456
4457 When Thuban loaded the map was redrawn twice because the
4458 legend was being opened after the mainwindow was created
4459 and not during its creation. This meant the map was drawn
4460 initially and then had to be redrawn when the legend
4461 caused the display to change. Now the legend is opened
4462 in the mainwindow constructor which resolves this issue.
4463
4464 Also, although we were checking for the existence of
4465 gdal and gdalwarp modules, the gdalwarp extension was
4466 still being compiled (which may fail if the system doesn't
4467 have gdal installed). the build_ext command to setup.py
4468 now accepts the flags --with-gdal and --without-gdal.
4469 If --without-gdal is specified setup.py will try to
4470 use the gdal parameters specified by gdal-config. Under
4471 windows, those parameters have to be set in setup.py
4472 as with proj4 an wxWindows.
4473
4474 * setup.py: Use a list instead of seperate variables for
4475 extension parameters so we can create a generic function
4476 that runs an appropriate *-config script.
4477 (run_cs_script): Renamed from run_wx_script and modified
4478 to accept a second argument which is a list of lists to
4479 be filled in by the values returned from running the command.
4480 (thuban_build_ext): New. Extends the build_ext command and
4481 provides the options --with-gdal/--without-gdal which then
4482 optionally includes the gdalwarp extension.
4483
4484 * Thuban/Model/resource.py: First check if we can import
4485 the gdalwarp Thuban extension before checking for gdal.
4486 Also added some comments.
4487
4488 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
4489 the map is None which may be the case if none has been loaded
4490 yet.
4491
4492 * Thuban/UI/main.py (main): Remove call to ShowLegend.
4493
4494 * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
4495
4496 * Thuban/UI/renderer.py: Check for gdal support before importing
4497 gdalwarp.
4498 (MapRenderer.render_map): Only try to optimize if we have gdal
4499 support otherwise nothing will get drawn.
4500
4501 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
4502 during startup before a map has been created. Check if map is None
4503 before using it and do nothing if it is.
4504
4505 2003-06-17 Jonathan Coles <[email protected]>
4506
4507 Fix the problem with raster layers under Windows that caused
4508 Thuban to crash. The view should respond to layer projection
4509 changed events to update the display. Changes to a projection
4510 should not cause the map to be set to full extent.
4511
4512 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
4513 current_map_proj to remember the current map projection so that
4514 when the projection changes we know what the previous projection
4515 was.
4516 (MapCanvas.SetMap): Unsubscribe and subscribe to
4517 LAYER_PROJECTION_CHANGED events.
4518 (MapCanvas.projection_changed): Split into two methods that respond
4519 to map and layer projection changes.
4520 (MapCanvas.map_projection_changed): New. Takes the current view and
4521 projects it using the new projection. This does not cause the
4522 map to be redrawn at full extent.
4523 (MapCanvas.layer_projection_changed): New. Cause a redraw which
4524 will draw each layer in its new projection.
4525
4526 * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
4527 VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
4528 under Windows.
4529
4530 * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
4531 to twice sizeof(void*) because there are two digits for each
4532 hex byte.
4533
4534 2003-06-16 Bernhard Herzog <[email protected]>
4535
4536 Update to the layer interface: Direct access to the table,
4537 shapetable, shapefile and filename attributes is now actively
4538 deprecated by issuing deprecation warnings for all places where
4539 this happens.
4540
4541 * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
4542 to the instance variables table, shapetable, shapefile and
4543 filename via __getattr__ so that we can issue a deprecation
4544 warning.
4545 (Layer.SetShapeStore): Don't set the deprecated instance variables
4546 any more
4547 (Layer.SetShapeStore): Don't use deprecated layer instance
4548 variables
4549 (Layer.Destroy): No need to explicitly remove the instance
4550 variables any more
4551 (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
4552 instance variables
4553
4554 * Thuban/UI/classgen.py (ClassGenDialog.__init__)
4555 (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
4556 (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
4557 use deprecated layer instance variables
4558
4559 * Thuban/UI/classifier.py (Classifier.__init__): Don't use
4560 deprecated layer instance variables
4561
4562 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
4563 (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
4564 instance variables
4565
4566 * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
4567 deprecated layer instance variables
4568
4569 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
4570 deprecated layer instance variables
4571
4572 * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
4573 deprecated layer instance variables
4574
4575 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
4576 (MapRenderer.polygon_render_param): Don't use deprecated layer instance
4577 variables
4578
4579 * test/runtests.py (main): Turn Thuban's deprecation warnings into
4580 errors so that they're cought by the tests
4581
4582 * test/test_load.py (TestSingleLayer.test): Don't use deprecated
4583 layer instance variables
4584
4585 2003-06-16 Jonathan Coles <[email protected]>
4586
4587 Fix a problem under Windows whereby if the user double-clicks on a
4588 layer in the legend that tree item will expand or collapse as well
4589 as open the layer properties dialog. The state of the tree item
4590 should not be affected.
4591
4592 * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
4593 preventExpandCollapse and subscribe to expanding and collapsing
4594 events.
4595 (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
4596 collapsing events and will veto the event if it has been triggered
4597 by the user double clicking on a layer.
4598 (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
4599 that an expanding/collapsing event should be vetoed.
4600
4601 2003-06-13 Bernhard Herzog <[email protected]>
4602
4603 * Thuban/UI/classifier.py (Classifier.OnClose)
4604 (Classifier.map_layers_removed)
4605 (Classifier.layer_shapestore_replaced): Unsubscribe the messages
4606 in OnClose and not in map_layers_removed or
4607 layer_shapestore_replaced to make sure it always happens when the
4608 dialog is closed
4609
4610 2003-06-13 Jonathan Coles <[email protected]>
4611
4612 This puts back a fix for Windows where a panel is needed so that
4613 the background of the table view appears correctly.
4614
4615 * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
4616 object that can be used by derived classes to place any
4617 controls (including the grid) onto.
4618 (QueryTableFrame.__init__): Use the panel as the parent window
4619 for all the controls. Reparent the grid so that the panel is
4620 the parent. Call UpdateStatusText() to correctly initialize
4621 the status bar.
4622
4623 2003-06-13 Jonathan Coles <[email protected]>
4624
4625 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
4626 from wxFrame (as opposed to wxDialog like the other classes)
4627 but otherwise behaves like the other classes. This is needed
4628 for the TableView which isn't really a dialog and needs to
4629 have a status bar and control buttons.
4630
4631 * Thuban/UI/tableview.py (TableGrid.__init__): Create an
4632 instance variable to keep track of how many rows are selected.
4633 Subscribe once to the the events we are interested in.
4634 (ThubanGrid.OnRangeSelect): Only handle event if event handling
4635 hasn't been turned off.
4636 (ThubanGrid.OnSelectCell): Only handle event if event handling
4637 hasn't been turned off.
4638 (ThubanGrid.ToggleEventListeners): Rather than subscribe None
4639 as an event listener (which changes the event handler stack)
4640 simply set an instance variable to False. This is checked in
4641 the event handlers.
4642 (ThubanGrid.GetNumberSelected): Return the number of currently
4643 selected rows.
4644 (TableFrame): Inherit from ThubanFrame so we can have a
4645 status bar and control buttons.
4646 (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
4647 Explicitly set which items are selected in the operator choice and
4648 action choice so there is always a valid selection. Fixes RTbug #1941.
4649 Subscribe to grid cell selection events so we can update the
4650 status bar.
4651 (QueryTableFrame.UpdateStatusText): Update the status bar with
4652 how many rows are in the grid, how many columns, and how many
4653 rows are selected.
4654 (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
4655 Call UpdateStatusText when cells are (de)selected.
4656 (QueryTableFrame.OnQuery): Use the string value in the value
4657 combo if either the selected item index is 0 or if the string
4658 cannot be found in the predefined list (this happens if the
4659 user changes the text). Fixes RTbug #1940.
4660 Only turn off the grid event listeners if there a query comes
4661 back with a none empty list of ids. in the case that the list
4662 is empty this causes a grid.ClearSelection() call to actually
4663 clear the grid selection which causes the selected items in
4664 the map to be deselected. Fixes RTbug #1939.
4665
4666 * test/test_save.py (XMLWriterTest.Encode): Check return values.
4667 Fixes RTbug #1851.
4668
4669 2003-06-13 Bernhard Herzog <[email protected]>
4670
4671 * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
4672 self.selected_shape with the current selection to make sure the
4673 contents of the dialog are up to date when it's shown for the
4674 first time.
4675 The dialog used to work without this by luck. The recent fix to
4676 the connector module 'broke' a 'feature' the identify view was
4677 relying on, i.e that subscribing to a message in response to
4678 receiving a message of that type would mean that the new
4679 subscriber would also be called for the same message.
4680
4681 2003-06-12 Jonathan Coles <[email protected]>
4682
4683 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
4684 the image is rendered. Fixes RTbug #1937.
4685
4686 2003-06-12 Jonathan Coles <[email protected]>
4687
4688 * Thuban/Lib/fileutil.py: As is done under Windows, create the
4689 user directory if it doesn't exist on a posix system.
4690 Fixes RTbug #1815.
4691
4692 * Thuban/Model/resource.py (get_user_proj_files): Moved the
4693 called to get_application_dir here, so that the directory
4694 will only be called if this method is invoked.
4695
4696 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
4697 the projfilepath if no projection is selected.
4698
4699 2003-06-12 Jonathan Coles <[email protected]>
4700
4701 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
4702 the scalebar if the current map has no projection set.
4703
4704 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
4705 projfilepath label to just the basename of the projection file
4706 rather than include the entire path.
4707
4708 * Thuban/Model/resource.py: Fix missed proj functions that
4709 needed to be renamed.
4710
4711 2003-06-12 Jonathan Coles <[email protected]>
4712
4713 * Thuban/Model/classification.py: Removed assert statements that
4714 tested if the variable was an instance of Color.
4715
4716 * Thuban/Model/color.py (Color): Remove commented code that isn't
4717 used.
4718 (Transparent): Renamed from NoColor. Doesn't inherit from Color.
4719 Fixes RTbug #1835.
4720 (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
4721 Needed now that the class doesn't inherit from Color.
4722
4723 2003-06-12 Jonathan Coles <[email protected]>
4724
4725 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
4726 check unicode strings.
4727
4728 * test/test_layer.py: Check for existence of gdal.
4729
4730 2003-06-12 Jonathan Coles <[email protected]>
4731
4732 * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
4733 that was in load.py
4734
4735 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
4736 that was in save.py
4737
4738 2003-06-12 Jonathan Coles <[email protected]>
4739
4740 This is largely a collection of bug fixes. We also handle the
4741 case where gdal is not on the system. The XMLReader and XMLWriter
4742 classes were moved into there own files to resolve some circular
4743 import references and because they shouldn't really be in the
4744 file that is dediciated to reading/writing session files since
4745 they are also used elsewhere.
4746
4747 * Thuban/Model/classgen.py: Renamed functions to follow the
4748 function_names_with_underscores style. Fixes RTbug #1903.
4749 (calculate_quantiles): Raise ValueError if 'percents' is invalid.
4750
4751 * Thuban/Model/layer.py: Import gdal only if it available.
4752 (RasterLayer): Handle the case where the gdal library is unavailable.
4753 Addresses RTbug #1877.
4754
4755 * Thuban/Model/load.py (XMLReader): Moved into seperate file
4756 xmlreader.py.
4757
4758 2003-06-12 Jonathan Coles <[email protected]>
4759
4760 This is largely a collection of bug fixes. We also handle the
4761 case where gdal is not on the system. The XMLReader and XMLWriter
4762 classes were moved into there own files to resolve some circular
4763 import references and because they shouldn't really be in the
4764 file that is dediciated to reading/writing session files since
4765 they are also used elsewhere.
4766
4767 * Thuban/Model/classgen.py: Renamed functions to follow the
4768 function_names_with_underscores style. Fixes RTbug #1903.
4769 (calculate_quantiles): Raise ValueError if 'percents' is invalid.
4770
4771 * Thuban/Model/layer.py: Import gdal only if it available.
4772 (RasterLayer): Handle the case where the gdal library is unavailable.
4773 Addresses RTbug #1877.
4774
4775 * Thuban/Model/load.py (XMLReader): Moved into seperate file
4776 xmlreader.py.
4777
4778 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
4779 file xmlwriter.py.
4780
4781 * Thuban/Model/resource.py: Renamed functions to following the
4782 function_names_with_underscores style.
4783 (has_gdal_support): New function that returns true if the gdal
4784 library is available. Addresses RTbug #1877.
4785
4786 * Thuban/UI/application.py (ThubanApplication.OpenSession):
4787 Display a message box if the gdal library is not available, but
4788 only if there are any layers that would use it. Addresses RTbug #1877.
4789
4790 * Thuban/UI/classgen.py: Use renamed projection resource functions.
4791 (GenUniformPanel.__CalcStepping): Fix a slight discrepency
4792 when using integers versus floats.
4793
4794 * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
4795 determine if the "Add Image Layer" menu option should be
4796 greyed out or not. Addresses RTbug #1877.
4797
4798 * Thuban/UI/projdialog.py: Use renamed projection resource functions.
4799
4800 * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
4801 optimize if a raster layer is visible. Fixes RTbug #1931.
4802 Only draw the raster layer if the gdal library is available.
4803 Addresses RTbug #1877.
4804
4805 * test/test_classgen.py: Add tests for generate_singletons,
4806 generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
4807 (test_calculate_quantiles): Fix some tests to catch the new
4808 ValueError that is raised.
4809
4810 * test/test_proj.py: Use renamed projection resource functions.
4811
4812 * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
4813 test for saving classified layers. Fixes RTbug #1902.
4814 (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
4815
4816 2003-06-12 Jan-Oliver Wagner <[email protected]>
4817
4818 Fix for http://intevation.de/rt/webrt?serial_num=1900.
4819
4820 * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
4821
4822 * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
4823 multiplechoicedialog.py rather than from the wxPython library.
4824
4825 2003-06-11 Frank Koormann <[email protected]>
4826
4827 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
4828 update.
4829
4830 2003-06-11 Frank Koormann <[email protected]>
4831
4832 * Thuban/Lib/fileutil.py (get_application_dir): New function to
4833 determine the absolute .thuban/thuban directory under
4834 "posix" (os.expanduser) and "nt" (read AppData registry key).
4835
4836 * Thuban/Model/resource.py: Use get_application_dir
4837
4838 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
4839 Use get_application_dir.
4840
4841 2003-06-10 Bernhard Herzog <[email protected]>
4842
4843 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
4844 the messages MAP_LAYERS_REMOVED messages
4845 (LayerTableFrame.OnClose): Unsubscribe from it.
4846 (LayerTableFrame.map_layers_removed): New. Receiver for
4847 MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
4848 dialog is showing is removed.
4849
4850 2003-06-10 Bernhard Herzog <[email protected]>
4851
4852 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
4853 of the receivers list so that unsubscribing in a receiver doesn't
4854 modify it while iterating over it.
4855
4856 * test/test_connector.py
4857 (ConnectorTest.test_disconnect_in_receiver): New. Test whether
4858 unsubscribing in a receiver works correctly. See docstring for
4859 details
4860
4861 2003-06-10 Bernhard Herzog <[email protected]>
4862
4863 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
4864 message.
4865
4866 * Thuban/Model/layer.py (Layer.SetShapeStore): Send
4867 LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
4868 LAYER_CHANGED will still be sent if the classification changes.
4869
4870 * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
4871 parameter so we can subscribe to some of its messages
4872 (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
4873 and the layer's LAYER_SHAPESTORE_REPLACED
4874 (Classifier.unsubscribe_messages): New. Unsubscribe from message
4875 subscribed to in __init__
4876 (Classifier.map_layers_removed)
4877 (Classifier.layer_shapestore_replaced): receivers for the messages
4878 subscribed to in __init__. Unsubscribe and close the dialog
4879
4880 * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
4881 the map to the Classifier dialog
4882
4883 * test/test_layer.py (SetShapeStoreTests): Derive from
4884 SubscriberMixin as well so we can test messages
4885 (SetShapeStoreTests.setUp): Subscribe to some of the layer's
4886 messages
4887 (SetShapeStoreTests.tearDown): Clear the messages again
4888 (SetShapeStoreTests.test_sanity): Expand the doc-string and check
4889 for the modified flag too
4890 (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
4891 to check whether SetShapeStore sets the modified flag
4892 (SetShapeStoreTests.test_set_shape_store_different_field_name)
4893 (SetShapeStoreTests.test_set_shape_store_same_field)
4894 (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
4895 Add tests for the messages. This checks both the new
4896 LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
4897
4898 2003-06-06 Jan-Oliver Wagner <[email protected]>
4899
4900 * Thuban/UI/mainwindow.py: Improved and partly added help texts for
4901 the menu items.
4902
4903 2003-06-05 Frank Koormann <[email protected]>
4904
4905 * Thuban/UI/identifyview.py (IdentifyView.__init__):
4906 Layout reimplemented without panel. Make life easier to fit the list
4907 in the dialog.
4908
4909 2003-06-05 Frank Koormann <[email protected]>
4910
4911 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
4912 once on initialisation (Former implementation resulted in multiple
4913 entries for each projection).
4914 (ProjFrame.__FillAvailList): selectProj as second optional parameter,
4915 if set, select the projection found under the specified name. This
4916 overwrites any other selection estimate.
4917 Removed projchoice filling from this method.
4918 (ProjFrame._OnSave, ProjFrame._OnAddToList):
4919 Updated call of ProjFrame.__FillAvailList
4920 (LCCPanel._DoLayout): Moved parameter controls in more common order.
4921
4922 * Resources/Projections/defaults.proj: Extended defaults representing
4923 various common European projections.
4924
4925 2003-06-05 Frank Koormann <[email protected]>
4926
4927 * Thuban/UI/identifyview.py (IdentifyView.__init__):
4928 Use ListCtrl instead of GridCtrl
4929
4930 * Thuban/Model/resource.py:
4931 Guess location of .thuban directory from tempdir parent directory.
4932
4933 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
4934 Guess location of .thuban directory from tempdir parent directory.
4935
4936 2003-06-04 Bernhard Herzog <[email protected]>
4937
4938 Do not cache the values returned by the tree widget's
4939 GetFirstChild and GetNextChild methods because it led to lots of
4940 segfaults. The new way requires more brute force but is more
4941 reliable.
4942
4943 * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
4944 variable layer2id
4945 (LegendTree.find_layer): New method to do with brute force what
4946 layer2id tried to accomplish
4947 (LegendTree._OnMsgLayerChanged)
4948 (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
4949 Use find_layer instead of layer2id
4950 (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
4951 update layer2id anymore
4952 (LegendTree._OnMsgMapLayersRemoved)
4953 (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
4954
4955 2003-06-03 Thomas Koester <[email protected]>
4956
4957 * Thuban/Model/classgen.py (GenQuantiles0): New function.
4958
4959 2003-06-02 Bernhard Herzog <[email protected]>
4960
4961 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
4962 New commands.
4963 (main_menu): Add the new commands.
4964 (MainWindow.TableRename): New. Implementation of the table_rename
4965 command.
4966 (MainWindow.RenameLayer): New. Implementation of the layer_rename
4967 command.
4968
4969 * Thuban/Model/session.py (Session.AddTable): call self.changed to
4970 set the modified flag
4971
4972 * test/test_session.py (TestSessionSimple.test_add_table): Test
4973 whether the modified flag is set properly
4974
4975 * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
4976 instead of issue so that the modified flags get updated.
4977
4978 * test/test_base.py (SomeTitledObject): Derive from Modifiable
4979 instead of Publisher to reflect reality better and to accomodate
4980 the fact that SetTitle now calls changed instead of issue
4981
4982 2003-06-02 Bernhard Herzog <[email protected]>
4983
4984 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
4985 acquisition has to happen before the try in a try-finally.
4986
4987 2003-06-02 Bernhard Herzog <[email protected]>
4988
4989 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
4990 possible that a layer is removed that is not currently selected in
4991 the legend so don't check for this.
4992
4993 2003-05-30 Bernhard Herzog <[email protected]>
4994
4995 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
4996 variables to None that have direct or indirect references to
4997 shapefiles or dbf files to make sure that they do go away and the
4998 files are closed.
4999
5000 2003-05-30 Bernhard Herzog <[email protected]>
5001
5002 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
5003 availImgListIndices when a new image list is created
5004
5005 2003-05-30 Bernhard Herzog <[email protected]>
5006
5007 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
5008 changing_selection to indicate whether the LegendTree code itself
5009 is currently changing the selection
5010 (LegendTree.normalize_selection): New method to normalize the
5011 selection by selecting the layer item even if the user clicked on
5012 the classification.
5013 (LegendTree._OnSelChanged): normalize the selection. This works
5014 around a bug in wx which doesn't keep track of the selection
5015 properly when subtrees are deleted.
5016
5017 2003-05-30 Bernhard Herzog <[email protected]>
5018
5019 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
5020 maximum and minimum scale factors.
5021
5022 * test/test_classgen.py (ClassGenTest.test): Update to reflect the
5023 changes in classgen.py
5024
5025 2003-05-30 Jonathan Coles <[email protected]>
5026
5027 * Thuban/Model/classgen.py: Remove ClassGenerator class but make
5028 all the methods functions. Fixes RTBug #1903.
5029
5030 * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
5031 to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
5032 RTBug #1907.
5033
5034 * Thuban/UI/classgen.py: Use classgen functions that were part
5035 of the ClassGenerator class. Put try/finally blocks around
5036 code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
5037 RTBug #1904.
5038
5039 * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
5040
5041 * Thuban/UI/legend.py: The legend was cleared and repopulated any
5042 time something changed which caused some state to be lost such
5043 as which children were expanded or collapsed. Fixes RTBug #1901.
5044 (LegendTree._OnMsgMapLayersAdded): Add only new layers.
5045 (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
5046 the legend but not in the map.
5047 (LegendTree.__FillTree): Move main functionality out into smaller
5048 methods that can be used by other methods.
5049 (LegendTree.__FillTreeLayer): Reuse old slots in the image list
5050 if they are available.
5051 (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
5052 that we override the wxTreeCtrl method. Iterate over children
5053 and call __RemoveLayer.
5054 (LegendTree.__AddLayer): New. Add a new layer to the legend.
5055 (LegendTree.__RemoveLayer): Remove a layer from the legend.
5056 (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
5057 Should only be called with the id of a layer branch.
5058 (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
5059 Returns the root item or creates one if necessary.
5060
5061 * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
5062 ProjectRasterFile with tuple arguments instead of strings.
5063
5064 * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
5065 with try/finally. Fixes RTBug #1904.
5066
5067 * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
5068 with try/finally. Fixes RTBug #1904.
5069 (MapCanvas.FitSelectedToWindow): If a single point is selected
5070 simply center it on the display. Fixes RTBug #1849.
5071
5072 * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
5073 to be compiled as a standalone app. Now the code can only be
5074 called from Python which simplifies the parameter passing.
5075 (ProjectRasterFile): Handle Python arguments. Remove code that
5076 checks for a destination dataset. Add more clean up code.
5077
5078 * test/test_map.py (TestMapWithContents.test_raise_layer_top,
5079 TestMapWithContents.test_lower_layer_bottom):
5080 Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
5081 Fixes RTBug #1907.
5082
5083 * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
5084 extent to the map when the legend is toggled. Fixes RTBug #1881.
5085
5086 2003-05-29 Jan-Oliver Wagner <[email protected]>
5087
5088 * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
5089 unsubscribes all that is subcribed in __init__.
5090
5091 2003-05-28 Bernhard Herzog <[email protected]>
5092
5093 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
5094 (MainWindow.CanDuplicateLayer): New methods to implement the
5095 Layer/Duplicate command.
5096 (layer_duplicate command): New.
5097 (main_menu): Add layer_duplicate to the Layer menu.
5098
5099 2003-05-28 Bernhard Herzog <[email protected]>
5100
5101 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
5102 renderer so that NULL/None values get displayed differently (by a
5103 gray rectangle).
5104 (TableGrid.__init__): Override the default renderers
5105
5106 2003-05-28 Bernhard Herzog <[email protected]>
5107
5108 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
5109 classification to "None" if the type of the field has changed.
5110
5111 * test/test_layer.py (SetShapeStoreTests): New. Class with a few
5112 test for the Layer.SetShapeStore method
5113
5114 2003-05-28 Jan-Oliver Wagner <[email protected]>
5115
5116 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
5117 does not necessarily have a filename).
5118
5119 2003-05-28 Jan-Oliver Wagner <[email protected]>
5120
5121 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
5122 sort the selection list for the dialog.
5123
5124 2003-05-28 Frank Koormann <[email protected]>
5125
5126 * extensions/thuban/wxproj.cpp
5127 (project_point): Removed cast to int for projected point coordinates.
5128 (shape_centroid): Return last point if all polygon vertices fall
5129 to one point.
5130
5131 2003-05-28 Bernhard Herzog <[email protected]>
5132
5133 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
5134 with layers that don't have shapestores, i.e. raster layers.
5135
5136 2003-05-28 Bernhard Herzog <[email protected]>
5137
5138 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
5139 when determining the title from the filename.
5140
5141 * test/test_dbf_table.py (TestDBFTable.test_title): Update to
5142 reflect changes in the way the title is derived from the filename
5143
5144 2003-05-28 Frank Koormann <[email protected]>
5145
5146 * Thuban/UI/mainwindow.py (MainWindow.TableShow):
5147 Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
5148
5149 2003-05-27 Bernhard Herzog <[email protected]>
5150
5151 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
5152 delegate SelectedLayer.
5153 (MainWindow.LayerUnjoinTable): Implement.
5154 (_can_unjoin): New. Helper function for the sensitivity of the
5155 layer/unjoin command.
5156
5157 * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
5158 (DerivedShapeStore.OrigShapeStore): New. Return the original
5159 shapestore. Used to figure out how to unjoin.
5160 (DerivedShapeStore.Shapefile): Fix a typo.
5161
5162 2003-05-27 Bernhard Herzog <[email protected]>
5163
5164 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
5165 well
5166 (JoinDialog.__init__): Use the layer parameter and only build the
5167 left choice when a layer is given
5168 (JoinDialog.OnJoin): Handle layer joins as well
5169 (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
5170 that the user selects the "Select..." item. The sensitivitly
5171 updating is now in update_sensitivity
5172 (JoinDialog.y): New method to refactor the sensitivity update of
5173 the join button into its own method.
5174
5175 * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
5176
5177 2003-05-27 Bernhard Herzog <[email protected]>
5178
5179 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
5180 iff there are unreferenced tables in the session
5181
5182 2003-05-27 Bernhard Herzog <[email protected]>
5183
5184 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
5185
5186 * Thuban/Model/session.py (Session.UnreferencedTables): New method
5187 to return tables that are not referenced by other tables or shape
5188 stores and can be removed.
5189 (Session.RemoveTable): Issue a TABLE_REMOVED message after
5190 removing the table
5191
5192 * Thuban/UI/mainwindow.py: Remove unused imports
5193 (MainWindow.TableClose): Implement.
5194
5195 * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
5196 messages so that the frame will be automatically closed when a new
5197 session is opened or the table is removed.
5198 (TableFrame.OnClose): Unsubscribe the Subscriptions made in
5199 __init__
5200 (TableFrame.close_on_session_replaced)
5201 (TableFrame.close_on_table_removed): New. Subscribers that close
5202 the window
5203
5204 * test/test_session.py (TestSessionMessages.test_remove_table)
5205 (TestSessionSimple.test_remove_table): Move the test to
5206 TestSessionSimple and add test for the TABLE_REMOVED message
5207 (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
5208 (TestSessionSimple.test_unreferenced_tables) New. Test for the
5209 UnreferencedTables method.
5210 (UnreferencedTablesTests): New. Class with some more sophisticated
5211 tests for UnreferencedTables.
5212
5213 2003-05-27 Frank Koormann <[email protected]>
5214
5215 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
5216 display has some unwanted side effects. Removed again.
5217
5218 2003-05-27 Frank Koormann <[email protected]>
5219
5220 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
5221
5222 * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
5223
5224 2003-05-27 Jan-Oliver Wagner <[email protected]>
5225
5226 * test/test_menu.py (MenuTest.test): Added test for
5227 Menu.RemoveItem().
5228
5229 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
5230 the menu.
5231
5232 2003-05-27 Frank Koormann <[email protected]>
5233
5234 Nonmodal dialogs without parent (i.e. they can fall behind the main
5235 window)
5236
5237 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
5238 all dialogs in the dialogs dictionary and the canvas.
5239
5240 * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
5241 parent, i.e. can fall behind other windows.
5242 (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
5243 dictionary before removing it.
5244
5245 * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
5246
5247 * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
5248 * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
5249 * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
5250
5251 2003-05-27 Bernhard Herzog <[email protected]>
5252
5253 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
5254 tableview dialog
5255 (MainWindow.TableShow): Use ShowTableView to open the dialogs.
5256 Also, don't use the table's titles as the dialog names. The titles
5257 aren't guaranteed to be unique.
5258 (MainWindow.TableOpen): Open a table view dialog after opening the
5259 table
5260
5261 2003-05-27 Bernhard Herzog <[email protected]>
5262
5263 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
5264 effect can be achieved by simply closing the window showing the
5265 table.
5266 (MainWindow.TableHide): Removed.
5267 (main_menu): Removed "table_hide"
5268
5269 2003-05-27 Frank Koormann <[email protected]>
5270
5271 Fix legend tree display problems under Win32
5272
5273 * Thuban/UI/legend.py: BMP_SIZE_W = 15
5274 (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
5275 (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
5276
5277 * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
5278
5279 2003-05-27 Jan-Oliver Wagner <[email protected]>
5280
5281 * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
5282 'after' now allows to insert separators almost anywhere in the menu.
5283
5284 2003-05-27 Frank Koormann <[email protected]>
5285
5286 * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
5287 "S" of selection box label to hint on hot key (Alt-S). Works under
5288 Win32 but is ignored under GTK.
5289
5290 2003-05-26 Frank Koormann <[email protected]>
5291
5292 * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
5293 Center Choices.
5294
5295 2003-05-26 Bernhard Herzog <[email protected]>
5296
5297 Remove the Precision methods again. They're too DBF specific to be
5298 part of the table interface and they're only used in table_to_dbf
5299 anyway.
5300
5301 * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
5302 fixed precision of 12 for doubles.
5303 (TransientTableBase.Precision): Removed
5304 (AutoTransientTable.Width): Delegate to self.table.
5305
5306 * Thuban/Model/table.py (DBFTable.Precision)
5307 (MemoryTable.Precision): Removed.
5308 (MemoryTable.Width): Use a fixed precision of 12 for doubles.
5309 (table_to_dbf): Use a fixed precision of 12 for floats unless the
5310 column object specifies something else.
5311
5312 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
5313 test for table_to_dbf
5314
5315 2003-05-26 Bernhard Herzog <[email protected]>
5316
5317 * test/test_transientdb.py
5318 (TestTransientTable.run_iceland_political_tests): Fix a comment.
5319
5320 2003-05-26 Bernhard Herzog <[email protected]>
5321
5322 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
5323 implementation. Mark parts of the file format strings for
5324 localization.
5325
5326 * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
5327 file and add the table to the tables managed by the session
5328
5329 * test/test_session.py (TestSessionSimple.test_open_table_file):
5330 New. test case for OpenTableFile
5331
5332 2003-05-26 Jan-Oliver Wagner <[email protected]>
5333
5334 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
5335 Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
5336 Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
5337 Replace the true/false of wxWindows by True/False of Python 2.2.1.
5338
5339 2003-05-26 Jan-Oliver Wagner <[email protected]>
5340
5341 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
5342 already a selection present, update the grid accordingly.
5343
5344 * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
5345 resizeable and increase its initial size.
5346
5347 2003-05-26 Frank Koormann <[email protected]>
5348
5349 Table export functionality
5350
5351 * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
5352 Return width (in characters) for a column.
5353 (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
5354 (table_to_dbf): Write table to dbf file.
5355 (table_to_csv): Write table to csv file.
5356
5357 * Thuban/Model/transientdb.py (TransientTableBase.Width,
5358 TransientTableBase.Precision): Return column width and precision.
5359
5360 * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
5361 or table_to_csv depending on file selection.
5362
5363 * test/test_dbf_table.py:
5364 Test table_to_dbf (extension of former part of test).
5365
5366 * test/test_csv_table.py:
5367 Test table_to_csv.
5368
5369 2003-05-23 Jan-Oliver Wagner <[email protected]>
5370
5371 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
5372 Use QueryTableFrame instead of TableFrame.
5373
5374 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
5375 table window with 'Layer Table:' instead of 'Table:'.
5376
5377 2003-05-23 Jan-Oliver Wagner <[email protected]>
5378
5379 Give all tables a title via mix-in TitledObject.LayerShowTable
5380
5381 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
5382 only if it exists.
5383
5384 * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
5385 and call its init-method with a default title. Remove Title() method.
5386
5387 * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
5388 AutoTransientTable): mix-in TitledObject and call its init-method with
5389 a default title. Remove Title() method.
5390
5391 2003-05-23 Bernhard Herzog <[email protected]>
5392
5393 * Thuban/Model/session.py (Session.AddShapeStore): Define
5394 AddShapeStore analogously to AddTable.
5395
5396 * test/test_session.py (TestSessionSimple.test_add_shapestore):
5397 New. Test for AddShapeStore
5398
5399 2003-05-23 Jan-Oliver Wagner <[email protected]>
5400
5401 Introducing QueryTableFrame and a very coarse ShowTable implementation.
5402
5403 * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
5404 class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
5405 The latter implements the selection GUI without dependency on a layer.
5406 LayerTableFrame now is derived from QueryTableFrame and connects
5407 to a layer.
5408
5409 * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
5410 implementation that still needs work.
5411
5412 * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
5413
5414 2003-05-22 Frank Koormann <[email protected]>
5415
5416 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
5417 Added "outer_join = False" as optional parameter.
5418 (TransientJoinedTable.create): If outer join is true, perform a
5419 "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
5420 the left table. Records not matching are filled with 0 / None.
5421
5422 * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
5423 (JoinDialog.OnJoin): Consider outer join check box.
5424
5425 2003-05-22 Bernhard Herzog <[email protected]>
5426
5427 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
5428 somewhat safer way. Storing the traceback in a local variable can
5429 lead to memory leaks
5430
5431 2003-05-22 Bernhard Herzog <[email protected]>
5432
5433 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
5434 the wxMessageDialog's Destroy() method.
5435
5436 2003-05-22 Frank Koormann <[email protected]>
5437
5438 * Thuban/UI/join.py (JoinDialog.__init__): Make use of
5439 TransientTable.Title()
5440
5441 2003-05-22 Frank Koormann <[email protected]>
5442
5443 Join Dialog, initial version.
5444
5445 * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
5446
5447 * Thuban/UI/join.py (JoinDialog): Functional implementation of
5448 former framework. Renamed Table1/Table2 to LeftTable/RightTable
5449 in all occurences.
5450
5451 * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
5452 Typo fixed.
5453
5454 2003-05-22 Bernhard Herzog <[email protected]>
5455
5456 Give the tables titles so that the GUI can display more meaningful
5457 names. For now the titles are fixed but depend on e.g. filenames
5458 or the titles of the joined tables.
5459
5460 * Thuban/Model/transientdb.py (TransientTable.Title)
5461 (TransientJoinedTable.Title, AutoTransientTable.Title): New.
5462
5463 * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
5464
5465 * test/test_transientdb.py
5466 (TestTransientTable.test_auto_transient_table_title): New. Test
5467 for the Title method
5468 (TestTransientTable.test_transient_joined_table)
5469 (TestTransientTable.test_transient_table): Add test for the Title
5470 methods
5471
5472 * test/test_memory_table.py (TestMemoryTable.test_title): New.
5473 Test for the Title method
5474
5475 * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
5476 the Title method
5477
5478 2003-05-22 Bernhard Herzog <[email protected]>
5479
5480 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
5481 Provide a better way to destroy the layers
5482 (TestLayer.test_base_layer, TestLayer.test_arc_layer)
5483 (TestLayer.test_point_layer, TestLayer.test_empty_layer)
5484 (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
5485 the new way to destroy the layers.
5486 (TestLayer.test_derived_store): New. Test for using a layer with a
5487 DerivedShapeStore
5488
5489 * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
5490 filename if the shape store actually has one.
5491
5492 2003-05-22 Bernhard Herzog <[email protected]>
5493
5494 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
5495 for the filename
5496
5497 * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
5498 for the FileName method
5499 (TestDBFTableWriting.test_write): Fix spelling of filename
5500
5501 2003-05-22 Thomas Koester <[email protected]>
5502
5503 * Thuban/Model/range.py, test/test_range.py: Brought over new Range
5504 from SciParam that now really is immutable.
5505
5506 2003-05-22 Frank Koormann <[email protected]>
5507
5508 Layer Top/Bottom placement added to legend.
5509
5510 * Thuban/UI/legend.py
5511 (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
5512 bound to tool events.
5513 (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
5514 New, methods binding the event methods with the map methods.
5515
5516 * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
5517 layer at top/bottom of layer stack.
5518
5519 * Resources/Bitmaps/top_layer.xpm: New button icon.
5520
5521 * Resources/Bitmaps/bottom_layer.xpm: New button icon.
5522
5523 2003-05-22 Bernhard Herzog <[email protected]>
5524
5525 * Thuban/Model/session.py (Session.RemoveTable): New method to
5526 remove tables
5527
5528 * test/test_session.py (TestSessionSimple.test_remove_table): New.
5529 Test for RemoveTable
5530
5531 2003-05-22 Thomas Koester <[email protected]>
5532
5533 * Thuban/Model/classgen.py: Added short module doc string and CVS id.
5534 (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
5535
5536 2003-05-22 Bernhard Herzog <[email protected]>
5537
5538 Implement a way to discover dependencies between tables and
5539 shapestores.
5540
5541 * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
5542 (TransientJoinedTable.Dependencies)
5543 (AutoTransientTable.SimpleQuery): New. Implement the dependencies
5544 interface
5545 (TransientJoinedTable.__init__): Keep tack of the original table
5546 objects in addition to the corresponding transient tables.
5547
5548 * Thuban/Model/table.py (DBFTable.Dependencies)
5549 (MemoryTable.Dependencies): New. Implement the dependencies
5550 interface
5551
5552 * Thuban/Model/data.py (ShapeTable): New. Helper class for
5553 ShapefileStore
5554 (ShapefileStore.__init__): Use ShapeTable instead of
5555 AutoTransientTable
5556 (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
5557 (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
5558 methods for filename and type
5559 (ShapefileStore.Dependencies): New. Implement the dependencies
5560 interface
5561 (DerivedShapeStore): New class to replace SimpleStore. The main
5562 difference to SimpleStore is that it depends not on a shapefile
5563 but another shapestore which expresses the dependencies a bit
5564 better
5565 (SimpleStore.__init__): Add deprecation warning.
5566
5567 * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
5568 Test for the Dependencies method.
5569
5570 * test/test_memory_table.py (TestMemoryTable.test_dependencies):
5571 New. Test for the Dependencies method.
5572
5573 * test/test_transientdb.py
5574 (TestTransientTable.test_auto_transient_table_dependencies): New.
5575 Test for the Dependencies method.
5576 (TestTransientTable.test_transient_joined_table): Add test for the
5577 Dependencies method.
5578
5579 * test/test_session.py (TestSessionSimple.setUp)
5580 (TestSessionSimple.tearDown): New. Implement a better way to
5581 destroy the sessions.
5582 (TestSessionSimple.test_initial_state)
5583 (TestSessionSimple.test_add_table): Bind session to self.session
5584 so that it's destroyed by tearDown
5585 (TestSessionSimple.test_open_shapefile): New. Test for
5586 OpenShapefile and the object it returns
5587
5588 2003-05-22 Bernhard Herzog <[email protected]>
5589
5590 * Thuban/Model/session.py (Session.AddTable): New method to
5591 register tables with the session.
5592 (Session.Tables): Return the tables registered with AddTable too.
5593
5594 * test/test_session.py (TestSessionSimple.test_add_table): New.
5595 Test case for the AddTable method
5596
5597 2003-05-22 Frank Koormann <[email protected]>
5598
5599 UI polishing updates: Place main buttons (OK, Cancel, etc) in the
5600 lower right corner, center labels for selections, initialize controls
5601 in reasonable order for keyboard navigation.
5602
5603 * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
5604 (ProjFrame.__DoOnProjAvail): Determine position of current projection
5605 using the wxListBox.FindString() method. Still a problem (#1886)
5606
5607 * Thuban/UI/classifier.py
5608 (Classifier.__init__, SelectPropertiesDialog.__init__)
5609
5610 * Thuban/UI/classgen.py (ClassGenDialog.__init__,
5611 (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
5612 different classification types from here to __init__.
5613 (GenUniquePanel.__init__): Set the column width of the first field
5614 in the Field ListCtrl to the full width.
5615
5616 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
5617 Button to 'Export'. Center Buttons in Selection Box, set Focus to
5618 Grid.
5619 (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
5620 changes focus to the Selection when pressing "Alt-S".
5621
5622 * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
5623 the text if not visible. The italic font sometimes exceeds the
5624 rendering area.
5625
5626 2003-05-21 Jonathan Coles <[email protected]>
5627
5628 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
5629 to OnClose so that Thuban closes correctly.
5630
5631 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
5632 DockFrame.OnClose, not DockFrame._OnClose.
5633
5634 2003-05-21 Jonathan Coles <[email protected]>
5635
5636 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
5637 references to 'inf' and use new Range __init__ to pass floats
5638 directly rather than converting them to strings first.
5639 Fixes RTBug #1876.
5640
5641 * Thuban/Model/classification.py (ClassGroupRange.SetRange):
5642 Use new Range ___init__ to pass floats.
5643
5644 * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
5645 filename is a valid image file. Throw IOError otherwise.
5646
5647 * Thuban/Model/range.py: Brought over new Range from SciParam that
5648 is immutable and has an __init__ which can accept floats.
5649
5650 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
5651 into try block. AddLayer doesn't throw any exceptions anymore.
5652 (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
5653 try block.
5654
5655 * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
5656 the first item in choices. Fixes RTBug #1882.
5657
5658 * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
5659 has gone to 0 which is a serious problem. abort.
5660 (MapRenderer.draw_raster_layer): Catch IOError seperately and
5661 print the error from GDAL.
5662
5663 * Thuban/UI/tableview.py (TableGrid.__init__): Call
5664 ToggleEventListeners to turn on listening.
5665 (TableGrid.ToggleEventListeners): New. Turns event listening on
5666 and off so as to prevent excessive messages.
5667 (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
5668 to suppress excessive messages when selecting many rows.
5669 Fixes RTBug #1880.
5670
5671 * Thuban/UI/view.py: Added checks against if scale == 0. This
5672 is a serious problem that can occur when an image without
5673 geo data is loading and causes the map projection bounds to
5674 go to infinity. Right now, the solution is to simply try
5675 to recover.
5676
5677 * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
5678 to set the MFILEReceiver attributes even if the data is NULL.
5679
5680 * extensions/thuban/gdalwarp.cpp: Improved the error handling
5681 and passed GDAL messages back up to the Python layer. Also
5682 tried to fix some memory leaks that were present in the original
5683 utility but didn't matter because the program aborted.
5684
5685 * test/test_range.py: Copied over tests from SciParam. Removed
5686 tests against importing. Fixes RTBug #1867.
5687
5688 2003-05-21 Bernhard Herzog <[email protected]>
5689
5690 * test/test_load.py: Remove unused imports and restructure the
5691 test code
5692 (LoadSessionTest): Split into one class for each test and turn
5693 LoadSessionTest itself into the base class for all such session
5694 tests.
5695 (ClassificationTest): New base class for load tests that test
5696 classifications
5697 (TestSingleLayer, TestLayerVisibility, TestClassification)
5698 (TestLabels, TestLayerProjection, TestRasterLayer): New classes
5699 for the individual tests
5700
5701 * test/support.py (FileLoadTestCase.filename): New base class for
5702 file loading tests
5703
5704 2003-05-21 Jan-Oliver Wagner <[email protected]>
5705
5706 * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
5707 Mercator' to 'UTM Zone 32' as a more convenient example.
5708 Added 'Gauss Krueger Zone 6'.
5709
5710 * Data/iceland_sample_raster.thuban: political polygon now
5711 filled transparent to have the raster image visible at once.
5712
5713 2003-05-21 Frank Koormann <[email protected]>
5714
5715 * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
5716 OnClose() to keep in sync with extensions. Internally Thuban
5717 still uses "underscored" names.
5718
5719 2003-05-20 Jonathan Coles <[email protected]>
5720
5721 This puts back Raster layer support. These layers support projections
5722 through the GDAL library. Currently, the CVS version is being used.
5723 There are no Debian packages available although this may change soon.
5724 A GDAL driver was extended to support writing to memory rather to
5725 files.
5726
5727 There is still some work that needs to be done, such as some error
5728 handling when loading invalid images or when there is a problem
5729 projecting the image. This putback simply checks in the majority
5730 of the work.
5731
5732 * setup.py: Add gdalwarp library extension.
5733
5734 * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
5735 Defaults to False, but can be overridden by subclasses if they
5736 support classification.
5737 (RasterLayer): New. Defines a new layer that represents an
5738 image.
5739
5740 * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
5741 tag handler.
5742 (SessionLoader.start_layer): Encode the filename.
5743 (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
5744 New. Supports reading a rasterlayer tag.
5745
5746 * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
5747
5748 * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
5749 get a string in Latin1. If we get such as string convert it to
5750 unicode first, otherwise leave if alone before encoding.
5751 (SessionSaver.write_layer): Add support for writing both Layers
5752 and RasterLayers.
5753
5754 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
5755 The right argument may not be a string, it could also be a Column.
5756
5757 * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
5758 Make initial window size 600x400. Fixes RTBug #1872.
5759
5760 * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
5761 the dialog is constructed so that we can support layers that
5762 do not have classifications.
5763 (Classifier._OnTry): Only build a classification if the layer
5764 supports one.
5765
5766 * Thuban/UI/legend.py: Change all checks that a layer is an
5767 instance of Layer into checks against BaseLayer.
5768 (LegendTree.__FillTreeLayer): Only add children to a branch if
5769 the layer supports classification.
5770
5771 * Thuban/UI/mainwindow.py (MainWindow.NewSession,
5772 MainWindow.OpenSession): Don't proceed with an action if the
5773 user chooses Cancel when they are asked to save changes.
5774 (MainWindow.AddRasterLayer): New. Open a dialog to allow the
5775 user to select an image file. Create a new RasterLayer and add
5776 it to the map.
5777
5778 * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
5779 for rendering RasterLayer layers.
5780 (MapRenderer.draw_raster_layer): Actually method that calls
5781 the GDALWarp python wrapper and constructs an image from the
5782 data returned.
5783
5784 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
5785 Choices symbols to match those used in the table query method.
5786 Replace deprecated method calls on table with new method names.
5787
5788 * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
5789 how small the scale can get. This still needs more testing.
5790
5791 * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
5792 Provides a driver to output in .bmp format.
5793
5794 * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
5795 New. Provides IO routines which write to memory, rather than a file.
5796
5797 * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
5798 of the gdalwarp utility provided in GDAL. Added function calls
5799 that can be accessed from python.
5800
5801 * Data/iceland_sample_raster.thuban: New. Sample file that uses
5802 a raster layer.
5803
5804 * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
5805 layer image data.
5806
5807 * Doc/thuban.dtd: Added rasterlayer attribute definition.
5808
5809 * test/test_layer.py, test/test_load.py, test/test_save.py: Added
5810 tests associated with the raster layer code.
5811
5812 * test/test_transientdb.py
5813 (TestTransientTable.test_auto_transient_table_query): Added a test
5814 for using a Column object as the "right" parameter to a query.
5815
5816 2003-05-19 Frank Koormann <[email protected]>
5817
5818 * Thuban/version.py (get_changelog_date):
5819 Catch exceptions if ChangeLog does not exist.
5820
5821 * Thuban/UI/view.py (MapCanvas.Export): Bugfix
5822
5823 2003-05-19 Frank Koormann <[email protected]>
5824
5825 Extended version information for Thuban
5826
5827 * Thuban/version.py: New, version information for Thuban: Last
5828 modification date and last ChangeLog entry date.
5829
5830 * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
5831 information: Display Thuban, wxPython and Python version.
5832
5833 2003-05-16 Bernhard Herzog <[email protected]>
5834
5835 * Thuban/Model/save.py: Remove some unused imports including the
5836 __future__ import for nested_scopes as Thuban relies on Python 2.2
5837 now.
5838 (XMLWriter.encode): Remove the special case for a None argument.
5839 In the saver encode is always called with a string argument.
5840
5841 2003-05-16 Bernhard Herzog <[email protected]>
5842
5843 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
5844 in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
5845 of the bug was that e.g. float("1.2") would fail. Thuban now
5846 requires 2.4.x.
5847
5848 2003-05-16 Frank Koormann <[email protected]>
5849
5850 Printing enhancement and WMF export (under Win32)
5851
5852 * Thuban/UI/renderer.py (ExportRenderer): New, derived from
5853 ScreenRenderer. Renders Map, Legend and Scalebar for export.
5854 (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
5855 PrintRender.
5856
5857 * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
5858 to fullfil information needed for PrinterRenderer.
5859 (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
5860 (MapCanvas.Print): Adapted to new MapPrintout.
5861 (OutputTransform): General calculations to transform from canvas
5862 coordinates to export/printing devices.
5863
5864 * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
5865 new method_command to call ExportMap, with platform dependency (only
5866 __WXMSW__)
5867
5868 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
5869 of scalebar drawing area as new parameters.
5870
5871 * Thuban/Model/scalebar.py (roundInterval): round long instead of int
5872
5873 * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
5874 Update to extended scalebar.DrawScalebar header.
5875
5876 * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
5877
5878 * test/test_scalebar.py: Made test executable as standalone.
5879
5880 2003-05-16 Bernhard Herzog <[email protected]>
5881
5882 * Thuban/Model/table.py (Table): Remove this compatibility alias
5883 for DBFTable.
5884
5885 * test/test_table.py: Import DBFTable as Table because that alias
5886 doesn't exist anymore.
5887
5888 * Thuban/UI/classgen.py: Remove some unused imports
5889
5890 2003-05-14 Jonathan Coles <[email protected]>
5891
5892 * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
5893 Fix docstring.
5894 (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
5895 (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
5896 values of the supplied range to determine the beginning and end
5897 bounds of the generated classes.
5898
5899 * Thuban/Model/range.py (Range.number_re): Now accepts floats that
5900 do not have a leading 0 (.5 is now accepted as well as 0.5).
5901
5902 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
5903 call to ClassGenerator.GenUniformDistribution.
5904
5905 * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
5906 layout bug with the 'Projection' label.
5907
5908 * test/support.py (FloatTestCase): New. Needed for the Range tests.
5909
5910 * test/test_range.py: New. Imported from SciParam.
5911
5912 2003-05-12 Jonathan Coles <[email protected]>
5913
5914 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
5915 to table.UniqueValues() with calls that retrieve all the values
5916 from the table. This will need to be replaced by a method on table
5917 which can simply return the list (perhaps more efficiently).
5918
5919 2003-05-12 Jonathan Coles <[email protected]>
5920
5921 The return value of ClassGenerator.CalculateQuantiles has changed.
5922 Refer to the documentation for details.
5923
5924 * test/test_classgen.py: Modified Quantile tests to use the
5925 new return values.
5926
5927 * Thuban/Model/classgen.py
5928 (ClassGenerator.GenQuantiles): Add comments describing the parameters,
5929 use new return values from CalculateQuantiles to produce the correct
5930 range bounds in the Classification.
5931 (ClassGenerator.CalculateQuantiles): Add more comments describing
5932 the return values and parameters. Make minor adjustments to improve
5933 the legibility of the code. Fix problem with adjusted not being set
5934 in most cases.
5935
5936 2003-05-12 Frank Koormann <[email protected]>
5937
5938 * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
5939 and latin1. Fixes #1851 finally.
5940
5941 2003-05-09 Jonathan Coles <[email protected]>
5942
5943 * test/test_classgen.py: New. Tests the Quantile algorithm.
5944
5945 * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
5946 Clean up debugging statement, add comments, fix a small bug in the
5947 returned adjusted percentiles.
5948
5949 2003-05-09 Jonathan Coles <[email protected]>
5950
5951 Introduces Range class from SciParam into the ClassGroupRange class,
5952 and such ranges can now be saved and loaded from disk.
5953
5954 Quantiles are now available in the Classification Generator.
5955
5956 Initial support for building Queries on a table. Doesn't do anything
5957 but run some tests.
5958
5959 * Thuban/Model/classification.py: Explicit imports.
5960 (ClassGroupRange): Use the Range class to store the underlying
5961 range information. The interface remains the same, except for
5962 GetRange(), and you can also supply a Range object as the min
5963 parameter to SetRange or __init__.
5964
5965 * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
5966 string appropriately for use in Thuban. Fixes RTbug #1851.
5967 (SessionLoader.end_projection): Handle the context of the
5968 projection tag a bit better by looking at what objects are not
5969 None. There was an assumption that a projection tag for a map
5970 could occur before any layers.
5971 (SessionLoader.start_clrange): Provide backward compatibility for
5972 reading min/max values as well as the new range parameter.
5973
5974 * Thuban/Model/map.py: Explicit imports.
5975
5976 * Thuban/Model/resource.py: Import _.
5977 (ProjFileSaver.write): write header using projfile.dtd.
5978
5979 * Thuban/Model/save.py: Explicit imports.
5980 (XMLWriter.encode): New. Encode the given string from a format
5981 used by Thuban into UTF-8. Fixes RTbug #1851.
5982
5983 * Thuban/UI/classgen.py: Explicit imports.
5984 (ClassGenDialog.__init__): Clean up the code and add support
5985 for Quantiles.
5986 (ClassGenDialog.OnOK): Add support for Quantiles.
5987 (GenQuantilesPanel): New. Input panel for Quantiles.
5988 (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
5989 GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
5990
5991 * Thuban/Model/classgen.py: New. Contains all the classes named above.
5992
5993 * Thuban/UI/classifier.py: Explicit imports.
5994 (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
5995 ClassTable.SetValueAsCustom): Reworked to use new Range class.
5996
5997 * Thuban/UI/legend.py: Explicit imports.
5998
5999 * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
6000 a Table menu and associated method calls.
6001 (MainWindow.choose_color): Removed. No longer needed.
6002
6003 * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
6004 should be disabled if no projection is selected in the available
6005 list.
6006
6007 * Thuban/UI/renderer.py: Explicit imports.
6008
6009 * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
6010 with correctly selecting the rows and issuing the right events.
6011 Be sure to call Skip() to allow the grid to do some of its own
6012 handling which allows the rows to actually be selected.
6013 (LayerTableGrid.select_shapes): Rename from select_shape. Supports
6014 selecting multiple shapes.
6015 (LayerTableFrame): Support for building Queries.
6016 (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
6017
6018 * Thuban/UI/tree.py: Explicit imports.
6019
6020 * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
6021 table view can call it.
6022
6023 * test/test_classification.py: Explicit imports.
6024 (TestClassification.test_ClassGroupRange): Fix test for new
6025 Range class.
6026
6027 * Doc/thuban.dtd: Add range parameter for clrange.
6028
6029 * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
6030 object in ClassGroupRange, and also uesd for inputting ranges in
6031 the classifer table and elsewhere.
6032
6033 * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
6034 yet.
6035
6036 2003-05-09 Frank Koormann <[email protected]>
6037
6038 * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
6039
6040 2003-05-08 Frank Koormann <[email protected]>
6041
6042 Coding style updates
6043
6044 * test/test_scalebar.py: Replaced tab indentation by spaces.
6045
6046 * Thuban/UI/scalebar.py: Explicit imports.
6047
6048 2003-05-08 Frank Koormann <[email protected]>
6049
6050 * Thuban/UI/scalebar.py
6051 (ScaleBar.DrawScalebar): Format string bug fixed.
6052
6053 2003-05-08 Frank Koormann <[email protected]>
6054
6055 Reorganization of scalebar component (no wx in Thuban/Model)
6056
6057 * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
6058 (deriveInterval):
6059 Calculate scalebar interval and unit which fits in width for scale.
6060 (roundInterval): Round float.
6061
6062 * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
6063
6064 * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
6065
6066 * Thuban/UI/legend.py: Import Thuban.UI.scalebar
6067
6068 2003-05-08 Frank Koormann <[email protected]>
6069
6070 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
6071 Initialize ScaleBar with canvas.map
6072
6073 * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
6074 round intervals to display smarter lengths
6075 (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
6076 layer. If the maps has no projection applied grey the scalebar.
6077
6078 2003-05-07 Frank Koormann <[email protected]>
6079
6080 Basic Scalebar features added.
6081
6082 * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
6083
6084 * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
6085 (ScaleBarBitmap): New, links the scalebar bitmap with view messages
6086 and the renderer.
6087
6088 * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
6089
6090 * Thuban/UI/messages.py: SCALE_CHANGED added.
6091
6092 2003-05-07 Bernhard Herzog <[email protected]>
6093
6094 * Thuban/Model/session.py (Session.__init__): New instance
6095 variable shapestores to hold a list of all open shapestore objects
6096 (Session.ShapeStores): New. Accessor method for the shapestores
6097 list.
6098 (Session._add_shapestore, Session._clean_weak_store_refs): New.
6099 Internal methods to maintain the shapestores list.
6100 (Session.Tables): New. Return all tables open in the session.
6101 (Session.OpenShapefile): Insert the new ShapeStore into the
6102 shapestores list.
6103
6104 * test/test_session.py (TestSessionSimple.test_initial_state): Add
6105 tests for ShapeStores and Tables
6106 (TestSessionWithContent.test_shape_stores)
6107 (TestSessionWithContent.test_tables): New. Test cases for
6108 ShapeStores and Tables
6109
6110 2003-05-07 Bernhard Herzog <[email protected]>
6111
6112 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
6113 Add comments about the optimizations used.
6114 (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
6115 Implement the ReadValue table interface method.
6116
6117 * test/test_transientdb.py
6118 (TestTransientTable.run_iceland_political_tests)
6119 (TestTransientTable.test_transient_joined_table): Add tests for
6120 ReadValue
6121
6122 2003-05-07 Frank Koormann <[email protected]>
6123
6124 * Resources/Bitmaps/fulllayerextent.xpm,
6125 Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
6126 new icons.
6127
6128 2003-05-06 Bernhard Herzog <[email protected]>
6129
6130 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
6131 New. Simply delegate to the transient table's version.
6132
6133 * test/test_transientdb.py
6134 (TestTransientTable.test_auto_transient_table_query): New. Test
6135 case for AutoTransientTable's SimpleQuery
6136
6137 2003-05-06 Bernhard Herzog <[email protected]>
6138
6139 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
6140 Implement a simple query method for the query dialog
6141 (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
6142 the row index or shapeid.
6143 (TransientTable.create): Insert the right value of the row index
6144 (TransientJoinedTable.create): Copy the row index of the left
6145 table to the joined result table
6146
6147 * test/test_transientdb.py
6148 (TestTransientTable.test_transient_table_read_twice): Fix
6149 doc-string
6150 (TestTransientTable.test_transient_table_query): New. Test for the
6151 SimpleQuery method
6152
6153 2003-05-06 Bernhard Herzog <[email protected]>
6154
6155 Convert all table users to use the new table interface. This only
6156 covers Thuban itself, not GREAT-ER or other applications built on
6157 Thuban yet, so the compatibility interface stays in place for the
6158 time being but it now issues DeprecationWarnings.
6159
6160 Finally, the new Table interface has a new method, HasColumn.
6161
6162 * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
6163 issue deprecation warnings when they're. The warnings refer to the
6164 caller of the method.
6165 (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
6166 for the deprecation warnings
6167
6168 * test/test_table.py: Ignore the deprecation warnings for the old
6169 table in the tests in this module. The purpose of the tests is to
6170 test the old interface, after all.
6171
6172 * test/test_transientdb.py
6173 (TestTransientTable.run_iceland_political_tests): Use the
6174 constants for the types. Add a test for HasColumn
6175 (TestTransientTable.test_transient_joined_table): Adapt to new
6176 table interface. Add a test for HasColumn
6177 (TestTransientTable.test_transient_table_read_twice): Adapt to new
6178 table interface
6179
6180 * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
6181 Adapt to new table interface
6182
6183 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
6184 new table interface
6185
6186 * Thuban/UI/controls.py (RecordListCtrl.fill_list)
6187 (RecordTable.SetTable): Adapt to new table interface
6188
6189 * Thuban/UI/classifier.py (Classifier.__init__)
6190 (Classifier.__init__): Adapt to new table interface
6191
6192 * Thuban/UI/classgen.py (ClassGenDialog.__init__)
6193 (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
6194 to new table interface
6195
6196 * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
6197 (AutoTransientTable.HasColumn): Implement the new table interface
6198 method
6199 (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
6200 (AutoTransientTable.UniqueValues): Adapt to new table interface
6201
6202 * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
6203 Adapt to new table interface
6204
6205 * test/test_layer.py (TestLayer.open_shapefile): Helper method to
6206 simplify opening shapefiles a bit easier.
6207 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
6208 (TestLayer.test_point_layer): Use the new helper method
6209 (TestLayer.test_get_field_type): New. Test for the GetFieldType
6210 method
6211
6212 * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
6213 the new table method
6214
6215 * test/test_memory_table.py (TestMemoryTable.test_has_column):
6216 Test for the new table method HasColumn
6217
6218 2003-05-06 Jonathan Coles <[email protected]>
6219
6220 Addresses the "Selection Extent" wish of RTbug #1787.
6221
6222 * Resources/Bitmaps/fulllayerextent.xpm,
6223 Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
6224 extent. These are just place holders for the real bitmaps.
6225
6226 * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
6227 calculate the bounding box once (the first time compute_bbox() is
6228 called).
6229 (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
6230 the bounding box for the shapes in lat/long coordinates.
6231
6232 * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
6233 option.
6234 (MainWindow.has_selected_shapes): New. Returns true if there are
6235 any selected shapes.
6236 (MainWindow.FullSelectionExtent): New. Calls
6237 MapCanvas.FitSelectedToWindow() when the user selects the menu option.
6238 (_has_selected_shapes): New. Returns true if there are any
6239 selected shapes.
6240
6241 * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
6242 true if there are any selected shapes.
6243
6244 * Thuban/UI/view.py (MapCanvas): Added delegated method
6245 HasSelectedShapes.
6246 (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
6247 shapes on the canvas using the map projection (if any).
6248
6249 * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
6250 for Layer.ShapesBoundingBox().
6251
6252 2003-05-06 Bernhard Herzog <[email protected]>
6253
6254 * Resources/Projections/defaults.proj: Fix spelling of Mercator
6255
6256 2003-05-05 Jonathan Coles <[email protected]>
6257
6258 Addresses the "Full Layer Extent" wish of RTbug #1787.
6259
6260 * Resources/Projections/defaults.proj: Added UK National Grid.
6261
6262 * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
6263 (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
6264 when the user selects the menu option.
6265
6266 * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
6267 scales the given layer on the canvas using the map projection.
6268
6269 2003-05-05 Bernhard Herzog <[email protected]>
6270
6271 Convert the table implementations to a new table interface. All
6272 tables use a common mixin class to provide backwards compatibility
6273 until all table users have been updated.
6274
6275 * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
6276 provide backwards compatibility for table classes implementing the
6277 new interface
6278 (DBFTable, MemoryTable): Implement the new table interface. Use
6279 OldTableInterfaceMixin as base for compatibility
6280 (DBFColumn, MemoryColumn): New. Column description for DBFTable
6281 and MemoryTable resp.
6282
6283 * test/test_dbf_table.py: New. Test cases for the DBFTable with
6284 the new table interface.
6285
6286 * test/test_memory_table.py: New. Test cases for the MemoryTable
6287 with the new table interface.
6288
6289 * test/test_table.py: Document the all tests in this file as only
6290 for backwards compatibility. The equivalent tests for the new
6291 interface are in test_memory_table.py and test_dbf_table.py
6292 (MemoryTableTest.test_read): field_info should be returning tuples
6293 with four items
6294 (MemoryTableTest.test_write): Make doc-string a more precise.
6295
6296 * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
6297 table interface. Derive from from OldTableInterfaceMixin for
6298 compatibility.
6299 (TransientTableBase.create): New intance variable column_map to
6300 map from names and indices to column objects
6301 (TransientTable.create): Use the new table interface of the input
6302 table
6303 (AutoTransientTable): Convert to new table interface. Derive from
6304 from OldTableInterfaceMixin for compatibility.
6305 (AutoTransientTable.write_record): Removed. It's not implemented
6306 yet and we still have to decide how to handle writing with the new
6307 table and data framework.
6308
6309 * test/test_transientdb.py
6310 (TestTransientTable.run_iceland_political_tests)
6311 (TestTransientTable.test_transient_joined_table): Use the new
6312 table interface
6313
6314 2003-05-05 Jonathan Coles <[email protected]>
6315
6316 This is namely a collection of UI updates to improve user interactivity.
6317 Tabbing between controls now exists and you can use ESC to close dialog
6318 boxes; ENTER will active the default button.
6319
6320 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
6321 order that the controls are created so that tabbing works correctly.
6322 (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
6323 wxDialog can handle the default button correctly.
6324 (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
6325 same reasons as for OnOK.
6326 (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
6327 when we ask the table for the maximum/minimum values of a field
6328 which could take a very long time.
6329
6330 * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
6331 order that the controls are created so that tabbing works correctly.
6332 (SelectPropertiesDialog.__init__): Rearrange the order that the
6333 controls are created so that tabbing works correctly.
6334
6335 * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
6336 to derive from a wxDialog but behave like the original implementation
6337 which was derived from a wxFrame. wxDialog provides useful key
6338 handling functionality like ESC calling OnCancel and ENTER calling
6339 OnOK which is lost with wxFrame.
6340
6341 * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
6342 new dialogs.
6343
6344 * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
6345 order that the controls are created so that tabbing works correctly.
6346 (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
6347 (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
6348 (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
6349 (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
6350 can provide the "UK National Grid" as a default projection.
6351 (UTMPanel.__init__): Rearrange the order that the controls are
6352 created so that tabbing works correctly.
6353
6354 2003-05-05 Bernhard Herzog <[email protected]>
6355
6356 * extensions/thuban/wxproj.cpp: Fix some of the comments.
6357 (project_point): If a map projection but no layer projection is
6358 given, convert degrees to radians before applying the map
6359 projection.
6360
6361 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
6362 (TableGrid.allow_messages): New methods to make it possible to
6363 inhibit message sending.
6364 (TableGrid.issue): Only send the message if not inhibited.
6365 (LayerTableGrid.select_shape): Use the new methods to make sure
6366 that no ROW_SELECTED message is sent while we're updating the
6367 selected rows to match the selected shapes.
6368
6369 2003-05-02 Jan-Oliver Wagner <[email protected]>
6370
6371 Implementation of MemoryTable.
6372
6373 * Thuban/Model/table.py (MemoryTable): New. Quite simple table
6374 implementation that operates on a list of tuples. All of the data
6375 are kept in the memory.
6376
6377 * test/test_table.py (MemoryTableTest): New.
6378
6379 * test/test_transientdb.py (SimpleTable): Removed.
6380 (TestTransientTable.test_transient_joined_table,
6381 (TestTransientTable.test_transient_table_read_twice): Replaced
6382 SimpleTable by MemoryTable.
6383
6384 2003-04-30 Jonathan Coles <[email protected]>
6385
6386 * Data/iceland_sample.thuban: Now contains correct projections
6387 for each of the layers.
6388
6389 * Resources/Projections/defaults.proj: Geographic projection
6390 contains unit conversion parameter.
6391
6392 2003-04-30 Jonathan Coles <[email protected]>
6393
6394 The most important part of this putback is the projection changes.
6395 It should now be possible to specify the projection that a layer
6396 is in and then specify a different projection for the map. The
6397 projection dialog has an extra parameter for a geographic projection
6398 which lets the user select if the input is in degrees or radians.
6399
6400 * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
6401 to say that the parameter is a tuple of unprojected
6402 points (which is what the callers to this method were assuming).
6403 Also, since the points are unprojected we need to projected them.
6404
6405 * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
6406 LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
6407 groups are selected, move the layer up/down. Fixes RTbug #1833.
6408
6409 * Thuban/UI/mainwindow.py: Move menu item map_rename up.
6410
6411 * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
6412 parameter in call to SetClientData.
6413 (GeoPanel): Add support for selecting the units that the
6414 source data is in (Radians or Degrees).
6415
6416 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
6417 the rendering loop by reducing the number of if's, removing the
6418 unnecessary try/except block, and checking if the old group
6419 is the same as the new one (which happens a lot if there is
6420 no classification, or lots of shapes are in the same group).
6421
6422 * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
6423 around the redraw routine to try to catch problems that the user
6424 may create by selecting invalid projections for the data set and
6425 map. Clears the display if there are any problems and prints the
6426 error.
6427 (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
6428 rectangle.
6429
6430 * extensions/thuban/wxproj.cpp (project_point): First invert the
6431 supplied point (which should be in projected coordinates) using
6432 the layer's projection and then project the point using the
6433 map's projection.
6434 (project_points): Use project_point() to project each point.
6435
6436 2003-04-30 Jan-Oliver Wagner <[email protected]>
6437
6438 * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
6439 don't set the Classification to None if the classfication field
6440 is None (ie only a DEFAULT).
6441
6442 2003-04-30 Bernhard Herzog <[email protected]>
6443
6444 * Thuban/UI/view.py: Fix some typos.
6445
6446 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
6447 not pop up the dialog if the selection becomes empty (this could
6448 happen if e.g. a new selection is opened while the identify tool
6449 is active and dialog had been closed)
6450
6451 2003-04-30 Bernhard Herzog <[email protected]>
6452
6453 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
6454 instance variable read_record_last_result
6455 (TransientTableBase.read_record): Make sure reading the same
6456 record twice works. The implementation uses the new instance
6457 variable read_record_last_result
6458
6459 * test/test_transientdb.py
6460 (TestTransientTable.test_transient_table_read_twice): New test
6461 case for the above bug-fix.
6462
6463 2003-04-29 Jonathan Coles <[email protected]>
6464
6465 * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
6466
6467 * Thuban/UI/classgen.py: Remove all uses of Str2Num.
6468
6469 * Thuban/UI/classifier.py: Remove all uses of Str2Num.
6470 (ClassTable.SetValueAsCustom): Rename keyword argument in
6471 ClassGroup* constructors to match argument name.
6472
6473 2003-04-29 Bernhard Herzog <[email protected]>
6474
6475 * Thuban/Model/session.py (Session.Destroy): Explicitly close the
6476 transient DB if it exists to make sure it doesn't leave a journal
6477 file in the temp directory.
6478
6479 * Thuban/Model/transientdb.py (TransientDatabase.close): Set
6480 self.conn to None after closing the connection to make sure it's
6481 not closed twice
6482
6483 2003-04-29 Jonathan Coles <[email protected]>
6484
6485 Add a visible parameter in the layer XML tag. The default value is
6486 "true". If anything other than "false" is specified we also assume
6487 "true". Addresses RTbug #1025.
6488
6489 * Doc/thuban.dtd: Add visible parameter to a layer.
6490
6491 * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
6492 of visible from 1 to True.
6493 (Layer.__init__): Change default value of visible from 1 to True.
6494
6495 * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
6496 parameter.
6497
6498 * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
6499 parameter.
6500
6501 * test/test_load.py: Add new test data contents_test_visible.
6502 (LoadSessionTest.setUp): save test data.
6503 (LoadSessionTest.testLayerVisibility): Test if the visible flag
6504 is loaded correctly.
6505
6506 * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
6507 for saving an invisible layer.
6508
6509 2003-04-29 Jonathan Coles <[email protected]>
6510
6511 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
6512 legend dialog box and tell it to change its map to the one
6513 supplied to SetMap(). Fixes RTbug #1770.
6514
6515 2003-04-29 Bernhard Herzog <[email protected]>
6516
6517 Next step of table implementation. Introduce a transient database
6518 using SQLite that some of the data is copied to on demand. This
6519 allows us to do joins and other operations that require an index
6520 for good performance with reasonable efficiency. Thuban now needs
6521 SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
6522 haven't tested that.
6523
6524 * Thuban/Model/transientdb.py: New. Transient database
6525 implementation.
6526
6527 * test/test_transientdb.py: New. Tests for the transient DB
6528 classes.
6529
6530 * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
6531 classes to help automatically remove temporary files and
6532 directories.
6533 (Session.__init__): New instance variables temp_dir for the
6534 temporary directory and transient_db for the SQLite database
6535 (Session.temp_directory): New. Create a temporary directory if not
6536 yet done and return its name. Use AutoRemoveDir to have it
6537 automatically deleted
6538 (Session.TransientDB): Instantiate the transient database if not
6539 done yet and return it.
6540
6541 * Thuban/Model/data.py (ShapefileStore.__init__): Use an
6542 AutoTransientTable so that data is copied to the transient DB on
6543 demand.
6544 (SimpleStore): New class that simply combines a table and a
6545 shapefile
6546
6547 * Thuban/Model/table.py (Table, DBFTable): Rename Table into
6548 DBFTable and update its doc-string to reflect the fact that this
6549 is only the table interface to a DBF file. Table is now an alias
6550 for DBFTable for temporary backwards compatibility.
6551
6552 * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
6553 the last reference to the session goes away so that the temporary
6554 files are removed properly.
6555
6556 * test/test_load.py (LoadSessionTest.tearDown): Remove the
6557 reference to the session to make sure the temporary files are
6558 removed.
6559
6560 2003-04-29 Bernhard Herzog <[email protected]>
6561
6562 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
6563 the __parser instance variable into a normal local variable in
6564 read. It's only used there and read will never be called more than
6565 once. Plus it introduces a reference cycle that keeps can keep the
6566 session object alive for a long time.
6567
6568 2003-04-29 Jonathan Coles <[email protected]>
6569
6570 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
6571 Projection an immutable item. Fixes RTbug #1825.
6572 (Projection.__init__): Initialize instance variables here.
6573 (ProjFile.Replace): New. Replace the given projection object with
6574 the new projection object. This solves the problem of needing the
6575 mutator Projection.SetProjection() in the ProjFrame class and
6576 allows a projection to change parameters without changing its
6577 location in the file.
6578
6579 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
6580 be of type wxSAVE and should verify overwriting a file.
6581
6582 * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
6583 ProjFile.Replace() method instead of the mutator
6584 Projection.SetProjection(). Also requires that we reassign the
6585 client data to the new projection.
6586
6587 * test/test_proj.py (TestProjection.test): Test GetName() and
6588 GetAllParameters()
6589 (TestProjFile.test): Remove tests for Set*() methods. Add tests
6590 for Replace().
6591
6592 2003-04-25 Jonathan Coles <[email protected]>
6593
6594 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
6595 to save the name of the projection.
6596
6597 * test/test_save.py (SaveSessionTest.testLayerProjection): New
6598 test to verify layer projections are saved correctly.
6599
6600 2003-04-25 Jonathan Coles <[email protected]>
6601
6602 * Thuban/Model/proj.py (Projection.SetName): Set the name
6603 to "Unknown" if name is None.
6604 (Projection.SetAllParameters): New. Set the projection's
6605 parameter list to the one supplied.
6606 (Projection.SetProjection): New. Set the projection's
6607 properties to those of the supplied Projection.
6608
6609 * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
6610 the dialog title to include the map's title.
6611 (MainWindow.LayerProjection): Set the dialog title to include
6612 the layer's title.
6613
6614 * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
6615 error dialogs into a single method call.
6616 (ProjFrame.__VerifyButtons): Add more states to check.
6617 (ProjFrame.__GetProjection): Return the current state of an
6618 edited projection or None.
6619 (ProjFrame.__FillAvailList): Remove checks for states that
6620 shouldn't exist.
6621 (ProjFrame._OnNew): Clear all selected items and supply
6622 a projection panel if necessary.
6623
6624 * test/test_proj.py (TestProjFile.test): Add tests for
6625 ProjFile.SetAllParameters, ProjFile.SetProjection,
6626 ProjFile.SetName.
6627
6628 2003-04-25 Jonathan Coles <[email protected]>
6629
6630 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
6631 takes an optional argument to select the current projection.
6632 This does not guarantee that the item is visible due to
6633 limited wxWindows functionality. Fixes RTBug #1821.
6634
6635 2003-04-25 Jonathan Coles <[email protected]>
6636
6637 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
6638 the projection name and use it when constructing the Projection
6639 object.
6640
6641 * Thuban/Model/proj.py (Projection.__init__): Change the default
6642 value for 'name' to None and then test if name is equal to None
6643 in the body of the constructor. This way the caller doesn't have to
6644 know what the default value should be. Namely, useful in load.py
6645 where we have to pick a default value if the 'name' parameter
6646 doesn't exist in the XML file.
6647
6648 * test/test_load.py (LoadSessionTest.testLayerProjection): New.
6649 Tests a file where a layer has a projection.
6650
6651 2003-04-25 Jonathan Coles <[email protected]>
6652
6653 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
6654 tree for projection information.
6655
6656 * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
6657 XMLReader.GetFileName.
6658 (SessionLoader): Added support for loading projection tags that
6659 appear inside a layer.
6660
6661 * Thuban/Model/proj.py (ProjFile): Document the class. Move
6662 back to using a list because the order of the projections in
6663 the file is important to maintain. Fixes RTbug #1817.
6664
6665 * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
6666 to ProjFile.GetFilename.
6667
6668 * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
6669 information.
6670
6671 * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
6672 ProjFrame._OnSaveAs. Removed old dead code from previous
6673 implementation.
6674 (ProjFrame._OnExport): Add support for exporting more than one
6675 projection to a single file.
6676 (ProjFrame.__FillAvailList): use string formatting (% operator)
6677 to build strings that are (partly) translated. Fixes RTbug #1818.
6678
6679 * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
6680 class.
6681
6682 2003-04-24 Bernhard Herzog <[email protected]>
6683
6684 * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
6685
6686 * po/fr.po: New. French translation by Daniel Calvelo Aros
6687
6688 * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
6689 empty strings.
6690
6691 2003-04-24 Jonathan Coles <[email protected]>
6692
6693 * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
6694 implement the interface that the ProjFrame dialog expects.
6695
6696 * Thuban/Model/proj.py (Projection.SetName): New. Allows the
6697 name of the projection to be changed.
6698 (ProjFile): Use a dictionary instead of a list so that removing
6699 projections is easier and we are sure about uniqueness.
6700 (ProjFile.Remove): Remove the given projection object.
6701
6702 * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
6703 Return a list with only one projection file instead of searching for
6704 any projection file. This simplifies many things if the user can
6705 only have one system file and one user file.
6706
6707 * Thuban/UI/classgen.py: Change all references to
6708 genCombo to genChoice.
6709
6710 * Thuban/UI/mainwindow.py: Add a Projection option under the
6711 layer menu.
6712 (MainWindow.LayerProjection): New. Open up a projection window
6713 for a layer.
6714
6715 * Thuban/UI/projdialog.py: Large changes to how the dialog is
6716 laid out. Use three panels instead of one. One for the list of
6717 projections, one for the edit controls, and one for the buttons.
6718 Fixed resizing problems so that the dialog resizes correctly
6719 when the projection panel changes. Added import/export, save, and
6720 new buttons/functionality.
6721
6722 2003-04-24 Bernhard Herzog <[email protected]>
6723
6724 First step towards table management. Introduce a simple data
6725 abstraction so that we replace the data a layer uses more easily
6726 in the next step.
6727
6728 * Thuban/Model/data.py: New file with a simple data abstraction
6729 that bundles shapefile and dbffile into one object.
6730
6731 * Thuban/Model/session.py (Session.OpenShapefile): New method to
6732 open shapefiles and return a shape store object
6733
6734 * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
6735 object instead of a shapefile filename. This introduces a new
6736 instance variable store holding the datastore. For intermediate
6737 backwards compatibility keep the old instance variables.
6738 (open_shapefile): Removed. No longer needed with the shape store.
6739 (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
6740 get the shape store used by a layer.
6741 (Layer.Destroy): No need to explicitly destroy the shapefile or
6742 table anymore.
6743
6744 * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
6745 (MainWindow.AddLayer): Use the session's OpenShapefile method to
6746 open shapefiles
6747
6748 * Thuban/Model/load.py (ProcessSession.start_layer): Use the
6749 session's OpenShapefile method to open shapefiles
6750
6751 * test/test_classification.py
6752 (TestClassification.test_classification): Use the session's
6753 OpenShapefile method to open shapefiles and build the filename in
6754 a more platform independed way
6755
6756 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
6757 Implement to have a session to use in the tests
6758 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
6759 (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
6760 session's OpenShapefile method to open shapefiles
6761 (TestLayerLegend.setUp): Instantiate a session so that we can use
6762 it to open shapefiles.
6763 (TestLayerLegend.tearDown): Make sure that all references to
6764 layers and session are removed otherwise we may get a resource
6765 leak
6766
6767 * test/test_map.py (TestMapAddLayer.test_add_layer)
6768 (TestMapWithContents.setUp): Instantiate a session so that we can
6769 use it to open shapefiles.
6770 (TestMapWithContents.tearDown): Make sure that all references to
6771 layers, maps and sessions are removed otherwise we may get a
6772 resource leak
6773 ("__main__"): use support.run_tests() so that more info about
6774 uncollected garbage is printed
6775
6776 * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
6777 session's OpenShapefile method to open shapefiles
6778 ("__main__"): use support.run_tests() so that more info about
6779 uncollected garbage is printed
6780
6781 * test/test_selection.py (TestSelection.tearDown): Make sure that
6782 all references to the session and the selection are removed
6783 otherwise we may get a resource leak
6784 (TestSelection.get_layer): Instantiate a session so that we can
6785 use it to open shapefiles.
6786 ("__main__"): use support.run_tests() so that more info about
6787 uncollected garbage is printed
6788
6789 * test/test_session.py (TestSessionBase.tearDown)
6790 (TestSessionWithContent.tearDown): Make sure that all references
6791 to the session and layers are removed otherwise we may get a
6792 resource leak
6793 (TestSessionWithContent.setUp): Use the session's OpenShapefile
6794 method to open shapefiles
6795
6796 2003-04-24 Jonathan Coles <[email protected]>
6797
6798 * Thuban/Model/load.py (XMLReader.read): Should have been checking
6799 if the file_or_filename object had the 'read' attribute.
6800
6801 2003-04-23 Jonathan Coles <[email protected]>
6802
6803 * Thuban/Model/resource.py: Fixes RTbug #1813.
6804 (ReadProjFile): Add documentation about which exceptions are raised.
6805 Always pass the exceptions up to the caller.
6806 (GetProjFiles): If the directory can't be read return an empty list.
6807 If any of the proj files can't be read skip that file and go
6808 on to the next one.
6809
6810 * test/test_proj.py: Added test cases to handle nonexistent files,
6811 unreadable files, and files that don't parse correctly.
6812
6813 2003-04-23 Jonathan Coles <[email protected]>
6814
6815 Projection dialog. Allows the user to select from a list
6816 of projection templates and optionally edit them and save new ones.
6817
6818 * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
6819 (ProjPanel): Base class for projection specific panels.
6820 (TMPanel): Projection panel for Transverse Mercartor.
6821 (UTMPanel): Projection panel for Universal Transverse Mercartor.
6822 (LCCPanel): Projection panel for Lambert Conic Conformal.
6823 (GeoPanel): Projetion panel for Geographic Projection.
6824
6825 2003-04-23 Jonathan Coles <[email protected]>
6826
6827 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
6828 promote symmetry. There now exists XMLReader and XMLWriter.
6829 (XMLReader.read): New. Call to read the given file descriptor or
6830 filename.
6831 (XMLReader.close): New. Make sure the file is closed.
6832 (XMLReader.GetFileName): New. Return just the file name that is being
6833 read from.
6834 (XMLReader.GetDirectory): New. Return just the directory of the file
6835 that is being read.
6836 (XMLReader.AddDispatchers): New. Take a dictionary which contains
6837 the names of functions to call as the XML tree is parsed.
6838 (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
6839 (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
6840 (SessionLoader): Removed class variables start_dispatcher and
6841 end_dispatcher since this functionality is now part of a class
6842 instance. Fixes RTbug #1808.
6843 (SessionLoader.__init__): Add dispatcher functions.
6844 (load_xmlfile): Code was moved into the XMLReader.read().
6845 (load_session): Use modified SessionLoader.
6846
6847 * Thuban/Model/map.py (Map.GetProjection): New. Returns the
6848 map's projection.
6849
6850 * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
6851 GetAllParameters.
6852 (Projection.GetParameter): Returns the value for the given parameter.
6853
6854 * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
6855 (GetProjFiles): Renamed from GetProjections. Now returns a list
6856 of ProjFile objects.
6857 (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
6858 a list of ProjFile objects whose files are not user defined.
6859 (GetUserProjFiles): Renamed from GetUserProjections. Returns a
6860 list of ProjFile objects whose files are user defined.
6861 (ProjFileReader): Extend new XMLReader.
6862
6863 * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
6864 promote symmetry.
6865
6866 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
6867 control instead of a wxComboBox. wxChoice controls do not generate
6868 events as the uses highlights possible choices which fixes problems
6869 with resizing the dialog when the use selects an option.
6870
6871 * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
6872 control instead of a wxComboBox.
6873
6874 * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
6875 dialog.
6876
6877 * test/test_proj.py (TestProjection.test): New tests for GetParameter
6878 method.
6879
6880 2003-04-22 Bernhard Herzog <[email protected]>
6881
6882 * Thuban/UI/mainwindow.py: Remove some unused imports and global
6883 constants
6884
6885 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
6886 (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
6887
6888 2003-04-17 Bernhard Herzog <[email protected]>
6889
6890 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
6891 (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
6892 anymore.
6893 (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
6894 (Layer.ShapeType, Layer.Shape): No need to call
6895 self.open_shapefile since it's always called in __init__
6896
6897 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
6898 In wxPython 2.4 there's no need to extend MainLoop anymore since
6899 wxPython itself makes sure OnExit is called.
6900
6901 2003-04-16 Jonathan Coles <[email protected]>
6902
6903 Initial putback of projection management code. Includes new
6904 classes to read and write projection files. The current load
6905 and save classes were abstracted a bit so they could be reused.
6906 The Projection class was extended to provide new methods and
6907 have a name.
6908
6909 * Thuban/Model/load.py (XMLProcessor): New. Contains all the
6910 general XML reading methods that were part of ProcessSession.
6911
6912 * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
6913 name.
6914 (ProjFile): New. Represents a file that contains projection
6915 information.
6916
6917 * Thuban/Model/resource.py: New. Contains general utilities
6918 for read and writing projection files.
6919
6920 * Thuban/Model/save.py (XMLSaver): New. Contains all the
6921 general XML writing methods that were part of SessionSaver.
6922 (SessionSaver): Renamed from Saver.
6923
6924 * test/test_proj.py: New test cases for the projection
6925 file read and write functions.
6926
6927 2003-04-16 Jonathan Coles <[email protected]>
6928
6929 * Thuban/Model/classification.py: Use repr() around values
6930 in the ClassGroup*.__repr__() methods so it is clearer when
6931 a value is a string and when it is a number.
6932
6933 * test/test_load.py: Rework the classification test to test
6934 that we can load old files.
6935 (testLabels): Test a file where the groups have labels.
6936
6937 2003-04-16 Bernhard Herzog <[email protected]>
6938
6939 Safer implementation of the performance enhancements of the
6940 low-level renderer:
6941
6942 * extensions/thuban/wxproj.cpp (extract_projection)
6943 (extract_pointer): Rename extract_projection to extract_pointer
6944 and redefine its purpose to return the pointer stored in a CObject
6945 returned by the object's cobject method. Update all callers.
6946 (s_draw_info, free_draw_info, draw_polygon_init): Implement the
6947 handling of these low-level parameters so that each s_draw_info
6948 instance is handled as a CObject at python level that also
6949 contains real references to the actual python objects which
6950 contain the values in the struct. Add free_draw_info as the
6951 destructor.
6952 (draw_polygon_shape): Add the py_draw_info parameter which must a
6953 cobject containing an s_draw_info pointer.
6954
6955 * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
6956 method to instantiat the low-level render parameter
6957 (MapRenderer.draw_shape_layer): Use the new method. Remove some
6958 commented out code.
6959 (MapRenderer.draw_polygon_shape): Make the first parameter not the
6960 layer but the low-level render parameter
6961 (ScreenRenderer.draw_shape_layer): Use the low-level render
6962 parameter.
6963
6964 2003-04-15 Jonathan Coles <[email protected]>
6965
6966 * Thuban/Model/classification.py: Implemented __repr__ for
6967 the ClassGroup* classes to make debugging a bit easier.
6968 (ClassGroup.SetLabel): Check that the string is an instance
6969 of StringTypes not StringType. Accounts for Unicode strings.
6970
6971 * Thuban/Model/color.py: Implemented __repr__ to make
6972 debugging a bit easier.
6973
6974 * Thuban/Model/save.py (Saver.write_classification): Need to
6975 save the group label.
6976
6977 * test/test_load.py (testClassification): New. Loads the
6978 iceland_sample_test.thuban file and checks if it was loaded
6979 correctly.
6980
6981 2003-04-15 Jonathan Coles <[email protected]>
6982
6983 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
6984 to improve rendering performance by initializing the variables
6985 that are not change each time draw_polygon_shape() is called.
6986 The values are stored in a global struct draw_info.
6987 (draw_polygon_shape): Removed initialization code that is
6988 now in draw_polygon_init().
6989
6990 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
6991 drawing initialization call to draw_polygon_init()
6992 (MapRenderer.draw_polygon_shape): Use new signature of
6993 draw_polygon_shape.
6994
6995 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
6996 weirdness by setting the range to (1, maxint).
6997
6998 * Thuban/Model/classification.py (ClassGroupProperties): Make
6999 instance variables private and optimize comparison operator
7000 by first checking if the color references are the same.
7001 (ClassGroupSingleton): Make instance variables private.
7002 (ClassGroupRange): Make instance variables private.
7003
7004 * HOWTO-Release: Filled in missing steps for releasing packages.
7005
7006 2003-04-15 Bernhard Herzog <[email protected]>
7007
7008 First stab at internationalized messages:
7009
7010 * Thuban/__init__.py (_): Implement the translation function for
7011 real using the python gettext module.
7012
7013 * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
7014 translate empty strings.
7015
7016 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7017 Add a missing space to a warning message
7018
7019 * po/README: New. Notes about the management of the translation
7020 files.
7021
7022 * po/Makefile: New. Makefile to help manage the translation files.
7023
7024 * po/es.po: New. Spanish translation by Daniel Calvelo Aros
7025
7026 * MANIFEST.in: Include the *.mo files in Resources/Locale and the
7027 translations and support files in po/
7028
7029 * setup.py (data_files): Add the *.mo files to the data_files too
7030
7031 * README: Add note about the translations when building from CVS
7032
7033 2003-04-14 Jonathan Coles <[email protected]>
7034
7035 * Thuban/UI/dock.py: Fixes some window resizing problems most
7036 noticable under windows. Always assume the button bitmaps will
7037 be there. Code clean up.
7038 (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
7039 images for the dock/undock button to the same images.
7040 Work around for RTbug #1801.
7041
7042 * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
7043 be allowed to grow within the sizer. Fixes a bug under Windows
7044 where the toolbar wasn't being drawn.
7045
7046 2003-04-14 Frank Koormann <[email protected]>
7047
7048 * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
7049 Updated design to try to make the button functionality more
7050 transparent.
7051
7052 2003-04-14 Jonathan Coles <[email protected]>
7053
7054 * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
7055 finalize the intialization of the panel.
7056
7057 * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
7058 creation of the panel. Should be the last thing called in the
7059 initializer of a subclass.
7060
7061 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
7062 set the current selections in the combo boxes. This is needed
7063 under Windows.
7064
7065 * Thuban/UI/classifier.py (Classifier.__init__): Add a top
7066 level panel to the dialog so that the background colors are
7067 consistent under Windows.
7068
7069 2003-04-11 Jonathan Coles <[email protected]>
7070
7071 * Thuban/UI/classgen.py: Change color ramps to start at white
7072 not black.
7073
7074 * Thuban/UI/legend.py: Enable/disable the legend buttons when
7075 the legend changes. Fixes RTbug #1793.
7076
7077 * test/test_classification.py: Added test for copying of
7078 classifications.
7079
7080 2003-04-11 Jonathan Coles <[email protected]>
7081
7082 * Thuban/UI/resource.py: New. Centralize the loading of resources
7083 such as bitmaps.
7084
7085 * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
7086 added images to the move buttons, added 'reverse' button.
7087 (CustomRampPanel.__init__): Added images to the move buttons.
7088 (GreyRamp): New. Generates a ramp from white to black.
7089 (HotToColdRamp): New. Generates a ramp from cold to hot colors.
7090
7091 * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
7092 ID_PROPERTY_*.
7093 (Classifier.__init__): Minor changes to the layout.
7094 (Classifier._OnTitleChanged): Listen for when the user edits the
7095 title and update the dialog's title and the layer's title.
7096
7097 * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
7098
7099 * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
7100 (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
7101 if the layer's title changes.
7102
7103 * Thuban/UI/mainwindow.py: Added new menu item and associated code
7104 to open a dialog to rename the map.
7105 (MainWindow): Use new resource class to import bitmaps.
7106
7107 2003-04-11 Jonathan Coles <[email protected]>
7108
7109 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
7110 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
7111 Resources/Bitmaps/group_use_none.xpm,
7112 Resources/Bitmaps/group_use_not.xpm,
7113 Resources/Bitmaps/hide_layer.xpm,
7114 Resources/Bitmaps/layer_properties.xpm,
7115 Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
7116 Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
7117 New.
7118
7119 2003-04-10 Jonathan Coles <[email protected]>
7120
7121 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
7122 Should pass group to ClassGroup constructor.
7123
7124 2003-04-10 Jonathan Coles <[email protected]>
7125
7126 * Thuban/Model/classification.py: (ClassGroup): Move all the common
7127 methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
7128 here. Implement SetVisible(), IsVisible().
7129 (ClassGroup.__init__): Add group parameter which acts as a copy
7130 constructor.
7131
7132 * Thuban/UI/classifier.py (ClassTable): Add a new column for the
7133 "Visible" check boxes.
7134 (Classifier): Rename the buttons and refactor the code to match
7135 the new labels.
7136
7137 * Thuban/UI/legend.py: Classify button is now called "Properties".
7138 Refactored the code to change variable names.
7139 (LegendTree.__FillTreeLayer): Only list a group if it is visible.
7140
7141 * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
7142 MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
7143 renamed to MainWindow.LayerEditProperties.
7144 (MainWindow.ToggleLegend): Don't include map name in legend title.
7145 (MainWindow.SetMap): Added the map name to the window title.
7146 (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
7147 MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
7148 Functionality is found in the layer properties dialog.
7149
7150 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
7151 draw visible groups.
7152
7153 2003-04-09 Jonathan Coles <[email protected]>
7154
7155 * Thuban/UI/classgen.py: Modifications to allow simple
7156 addition and selection of new color schemes.
7157 (MonochromaticRamp): New. Generates a ramp between two colors.
7158 (RedRamp): New. Generates a ramp of all red.
7159 (GreenRamp): New. Generates a ramp of all green.
7160 (BlueRamp): New. Generates a ramp of all blue.
7161
7162 2003-04-09 Jonathan Coles <[email protected]>
7163
7164 * Thuban/Model/classification.py (Classification.__deepcopy__):
7165 Need to copy over field and fieldType attributes.
7166
7167 * Thuban/Model/table.py (Table.field_range): New. Retrive the
7168 maximum and minimum values over the entire table for a given
7169 field.
7170 (Table.GetUniqueValues): New. Retrieve all the unique values
7171 in the table for a given field.
7172
7173 * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
7174 (GenUniquePanel): New. Controls to allow the user to select
7175 which unique field values they would like in the classification.
7176 (CustomRampPanel): Code that was in ClassGenDialog that allows
7177 the user to select the properties for a custom ramp.
7178 (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
7179
7180 * Thuban/UI/classifier.py: Removed a lot of debugging code.
7181 (Classifier._SetClassification): Callback method so that the
7182 class generator can set the classification in the grid.
7183 (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
7184 editing of a group properties class into a wxWindows control.
7185
7186 * Thuban/UI/dock.py: It was decided that if the user closes
7187 a dockable window the window should simply hide itself. That
7188 way if the user wants to show the dock again it appears in the
7189 same place as it was when it was closed.
7190 (DockableWindow.Destroy): Call renamed method OnDockDestroy().
7191 (DockableWindow._OnButtonClose): Hide the window instead of
7192 destroying it.
7193 (DockableWindow._OnClose): Hide the window instead of
7194 destroying it.
7195
7196 * Thuban/UI/legend.py (LegendTree): Use a private method to
7197 consistently set the font and style of the text. Fixes RTbug #1786.
7198
7199 * Thuban/UI/mainwindow.py: Import just the Classifier class.
7200
7201 2003-04-07 Bernhard Herzog <[email protected]>
7202
7203 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
7204 to the map module
7205
7206 2003-04-07 Bernhard Herzog <[email protected]>
7207
7208 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
7209 favor of ToggleSessionTree
7210 (MainWindow.ToggleSessionTree): New method to toggle visibility of
7211 the session tree.
7212 (MainWindow.SessionTreeShown): New method to return whether the
7213 session tree is currently shown.
7214 (MainWindow.ToggleLegend): New method to toggle visibility of the
7215 legend
7216 (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
7217 LegendShown
7218 (MainWindow.LegendShown): New method to return whether the legend
7219 is currently shown.
7220 (_method_command): Add checked parameter so we can define check
7221 menu items
7222 (_has_tree_window_shown, _has_legend_shown): Use the appropriate
7223 mainwindow methods.
7224 (show_session_tree, show_legend commands): Removed.
7225 (toggle_session_tree, toggle_legend commands): New commands to
7226 toggle the visibility of the dialogs
7227
7228 2003-04-07 Jonathan Coles <[email protected]>
7229
7230 * Thuban/UI/classgen.py: Fix Windows problem.
7231
7232 * Thuban/UI/dock.py: Fix Windows problem.
7233
7234 * Thuban/UI/mainwindow.py: Use False instead of false.
7235 (MainWindow.ShowLegend): Remove unnecessary switch parameter.
7236
7237 2003-04-07 Jonathan Coles <[email protected]>
7238
7239 Since we now say that the order of the groups in a classification
7240 matters, it makes sense to be able to manipulate that order. Most
7241 of the changes to Thuban/Model/classification.py are to that end.
7242
7243 * Thuban/Model/classification.py (Classification.AppendGroup,
7244 Classification.InsertGroup, Classification.ReplaceGroup,
7245 Classification.RemoveGroup, Classification.GetGroup): Do as the
7246 names imply.
7247 (Classification.FindGroup): This was called GetGroup, but GetGroup
7248 takes an index, while FindGroup takes a value.
7249 (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
7250 REFERENCE. Currently there is a cyclic reference between the layer
7251 and its classification. If the classification doesn't need to know
7252 its owning layer we can change this, since it may make sense to be
7253 able to use the same classification with different layers.
7254
7255 * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
7256
7257 * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
7258 not AddGroup()
7259
7260 * Thuban/UI/classifier.py: Now that we can depend on the order in
7261 a Classification and have methods to manipulate that order we don't
7262 need to use our own data structures in the grid. We can simply make
7263 the grid/table access the information they need from a copy of
7264 the classification object.
7265 (Classifier._OnCloseBtn): Event handler for when the user clicks
7266 'Close'. This is needed so if the user applies changes and then
7267 continues to change the table the user has the option of discarding
7268 the most recent changes and keeping what they applied.
7269
7270 * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
7271 into the same group.
7272
7273 * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
7274 with a really old version of proj, PJ_VERSION won't even be defined.
7275 If it isn't defined then just compile so that the function always
7276 returns Py_False.
7277
7278 * test/test_classification.py: Fix tests to use the renamed methods.
7279 Still need to write tests for the new methods.
7280
7281 2003-04-04 Jonathan Coles <[email protected]>
7282
7283 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
7284 call to SetSelection out of the method and before the call
7285 to __SelectField in __init__. This prevents a recursion of events
7286 when _OnFieldSelect is triggered by the user.
7287
7288 2003-04-04 Jonathan Coles <[email protected]>
7289
7290 * Thuban/Model/classification.py: Rename Color.None to
7291 Color.Transparent.
7292 (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
7293 Don't bother copying the color, since Colors are immutable.
7294
7295 * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
7296 Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
7297 Thuban/UI/renderer.py, Thuban/UI/view.py:
7298 Rename Color.None to Color.Transparent.
7299
7300 * test/test_classification.py, test/test_load.py: Rename Color.None
7301 to Color.Transparent.
7302
7303 2003-04-04 Jonathan Coles <[email protected]>
7304
7305 * Thuban/Model/classification.py: Fix assert calls.
7306 (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
7307 Copy the color parameter rather than hold onto a reference.
7308
7309 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
7310 the color object.
7311 (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
7312 are sure there exists only one refernce to Color.None in the system.
7313 This allows us to use 'is' rather than the comparision functions.
7314
7315 * Thuban/Model/save.py: Fix assert calls.
7316
7317 * Thuban/UI/classifier.py: Fix assert calls.
7318 (ClassGrid._OnCellDClick): Call up to the classifier to open the
7319 dialog to edit the groups properties.
7320 (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
7321 correctly if a cell is resized.
7322 (ClassTable.SetClassification): New. Changes the classification
7323 that is in the table.
7324 (ClassTable.__SetRow): Allow groups to be prepended.
7325 (Classifier): New code for opening the EditProperties and
7326 GenerateRanges dialogs.
7327 (SelectPropertiesDialog.__GetColor): Only set the color in the
7328 color dialog if the current color is not None.
7329
7330 * Thuban/UI/dock.py: Fix assert calls.
7331
7332 * Thuban/UI/legend.py: Fix assert calls.
7333
7334 * Thuban/UI/renderer.py: Fix assert calls.
7335
7336 * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
7337 classifications.
7338 (GenRangePanel): Panel specific to range generation.
7339 (GenSingletonPanel): Panel specific to singleton generation.
7340 (ClassGenerator): Class responsible for actually generating
7341 the classification from the data gathered in the dialog box.
7342 (PropertyRamp): Generates properties whose values range from
7343 a starting property to an ending property.
7344
7345 2003-04-03 Bernhard Herzog <[email protected]>
7346
7347 * test/support.py (print_garbage_information): New function that
7348 prints information about still connected messages and memory
7349 leaks.
7350 (run_suite): Removed.
7351 (run_tests): New function for use as a replacement of
7352 unittest.main in the test_* files. This one calls
7353 print_garbage_information at the end.
7354
7355 * test/runtests.py (main): Use support.print_garbage_information
7356
7357 * test/test_layer.py: Use support.run_tests instead of
7358 unittest.main so we get memory leak information
7359 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
7360 (TestLayer.test_point_layer, TestLayer.test_empty_layer)
7361 (TestLayerLegend.test_visibility): Call the layer's Destroy method
7362 to fix a memory leak.
7363
7364 * test/test_classification.py: Use support.run_tests instead of
7365 unittest.main so we get memory leak information
7366 (TestClassification.test_classification): Call the layer's Destroy
7367 method to fix a memory leak.
7368
7369 2003-04-02 Bernhard Herzog <[email protected]>
7370
7371 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
7372 Handle the reference counts of the return value and errors in
7373 PyArg_ParseTuple correctly.
7374
7375 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
7376 sure the filename is absolute to avoid problems when saving the
7377 session again
7378
7379 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
7380
7381 2003-04-01 Jonathan Coles <[email protected]>
7382
7383 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
7384 that there actually are points in the returned list of points
7385 before trying to index into the list. The list may be empty if
7386 the shape is a Null Shape.
7387
7388 2003-04-01 Bernhard Herzog <[email protected]>
7389
7390 * test/test_map.py: Don't use from <module> import *
7391
7392 2003-04-01 Jonathan Coles <[email protected]>
7393
7394 * Thuban/Model/session.py: Use LAYER_CHANGED instead of
7395 LAYER_LEGEND_CHANGED
7396
7397 * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
7398 self.Destroy() to close the window after yesterday's changes.
7399
7400 * test/test_map.py, test/test_session.py: Fix messages that
7401 are sent from maps and layers.
7402
7403 2003-03-31 Jonathan Coles <[email protected]>
7404
7405 * Thuban/UI/classifier.py: Commented out some debugging statements.
7406 (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
7407 RTbug #1769.
7408
7409 * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
7410 position (although position doesn't work yet under GTK).
7411 (DockableWindow.Destroy): New. Called when the window must be
7412 closed. Namely needed when the DockFrame closes and must close
7413 its children.
7414 (DockFrame): Listen for EVT_CLOSE and destroy all children.
7415
7416 * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
7417 when then window is told to close.
7418 (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
7419 comment in source for more info.
7420
7421 * Thuban/UI/main.py: Show the legend by default when Thuban starts.
7422
7423 * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
7424 symmetry with other such methods.
7425 (MainWindow.ShowLegend): Show the legend docked by default.
7426
7427 2003-03-28 Jonathan Coles <[email protected]>
7428
7429 * Thuban/UI/classifier.py: Support for highlighting a specific
7430 group within the grid when the classification dialog is opened.
7431 Also contains a lot of debugging printouts which will later
7432 be removed.
7433
7434 * Thuban/UI/dock.py: Complete rework on the dock code so that
7435 that it is fairly removed from the rest of the Thuban application.
7436 It is easy to add new docks which the rest of the program having
7437 to be aware of them.
7438
7439 * Thuban/UI/legend.py: Modifications to support selecting a
7440 specific group in the classification dialog. Changed how layers
7441 are drawn when the layer is visible/invisible.
7442
7443 * Thuban/UI/mainwindow.py: Removed legend specific code and
7444 replaced it with calls to the new dock code.
7445
7446 * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
7447 to check if scale > 0. Trying to track down a divide by zero.
7448
7449 2003-03-26 Jonathan Coles <[email protected]>
7450
7451 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
7452 (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
7453 now part of DockableWindow.
7454 (LegendPanel.DoOnSelChanged): Select the current layer in the
7455 map.
7456 (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
7457 with the selected layer and/or group.
7458
7459 2003-03-26 Jonathan Coles <[email protected]>
7460
7461 This putback contains the code for dockable windows. There is
7462 no support in wxWindows as of this date for windows that can
7463 attach themselves to other windows.
7464
7465 The current model contains a DockableWindow which has a parent
7466 window for when it is detached and a dock window that it puts
7467 its contents in when it is docked. The contents of a DockableWindow
7468 must be a DockPanel. DockPanel itself derives from wxPanel.
7469
7470 * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
7471 message, not a LAYER_LEGEND_CHANGED message.
7472
7473 * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
7474
7475 * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
7476 as one of the style properties for the fieldTypeText item to
7477 be sure that its size is correct when the text changes.
7478
7479 * Thuban/UI/dock.py: New. Classes for the DockPanel and
7480 DockableWindow.
7481
7482 * Thuban/UI/legend.py: Added some more buttons and made the
7483 LegendPanel a DockPanel.
7484
7485 * Thuban/UI/mainwindow.py: Added sash windows to the main window
7486 and supporting functions for manipulating the sashes.
7487 (MainWindow.ShowLegend): Create a DockableWindow with the
7488 LegendPanel as the contents.
7489
7490 * Thuban/UI/messages.py: Added DOCKABLE_* messages
7491
7492 * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
7493 not LAYER_LEGEND_CHANGED, messages.
7494
7495 2003-03-25 Jonathan Coles <[email protected]>
7496
7497 * setup.py: Added custom script bdist_rpm_build_script so that
7498 when the rpm is built the path to wx-config is correct.
7499
7500 * setup.cfg: Added line saying to use the custom build script
7501
7502 2003-03-20 Jonathan Coles <[email protected]>
7503
7504 Initial implementation of the Legend.
7505
7506 * Thuban/UI/legend.py: New. Creates a window that shows the map's
7507 Legend information and allows the user to add/modify classifications
7508 and how the layers are drawn on the map.
7509
7510 * setup.py: New command 'build_docs' which currently uses
7511 happydoc to generate html documentation for Thuban.
7512
7513 * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
7514 Returns a string which is appropriately describes the group.
7515
7516 * Thuban/Model/layer.py (Layer.SetClassification): Generate a
7517 LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
7518
7519 * Thuban/Model/map.py (Map): Rename messages and use new, more
7520 specific, messages.
7521
7522 * Thuban/Model/messages.py: New message to indicate that a layer's
7523 data has changed (LAYER_CHANGED). New map messages to indicate
7524 when layers have been added/removed/changed or if the stacking order
7525 of the layers has changed.
7526
7527 * Thuban/Model/session.py: Rename and use new messages.
7528
7529 * Thuban/UI/classifier.py: Remember if any changes have actually
7530 been applied so that if the dialog is cancelled without an application
7531 of changes we don't have to set a new classification.
7532 (ClassDataPreviewer): Pulled out the window specific code and put it
7533 ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
7534 symbols on any DC.
7535
7536 * Thuban/UI/mainwindow.py: New code to open the legend.
7537
7538 * Thuban/UI/view.py: Use new message names.
7539
7540 2003-03-19 Jonathan Coles <[email protected]>
7541
7542 * Thuban/UI/main.py (verify_versions): New. Checks the versions
7543 of Python, wxPython, and some other libraries.
7544
7545 * extensions/thuban/wxproj.cpp (check_version): Checks the given
7546 version against what wxproj was compiled with.
7547 (check_version_gtk): If wxproj was compiled with gtk then check
7548 the given version against the version of the gtk library
7549 currently being used.
7550
7551 2003-03-14 Bernhard Herzog <[email protected]>
7552
7553 * test/test_command.py: Run the tests when the module is run as a
7554 script
7555
7556 2003-03-14 Bernhard Herzog <[email protected]>
7557
7558 Implement selection of multiple selected shapes in the same layer:
7559
7560 - Introduce a new class to hold the selection. This basically
7561 replaces the interactor which was nothing more than the
7562 selection anyway. A major difference is of course that the new
7563 selection class supports multiple selected shapes in one layer
7564
7565 - Move the object that represents the selection from the
7566 application to the canvas. The canvas is a better place than the
7567 application because the selection represents which shapes and
7568 layer of the map displayed by the canvas are selected and
7569 affects how the map is drawn.
7570
7571 - Make the selection and its messages publicly available through
7572 the mainwindow.
7573
7574 - The non-modal dialogs do not get a reference to the interactor
7575 anymore as they can simply refer to their parent, the
7576 mainwindow, for the what the interactor had to offer.
7577
7578 * Thuban/UI/selection.py: New module with a class to represent the
7579 selection.
7580
7581 * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
7582 these unused messages
7583
7584 * Thuban/UI/application.py (ThubanApplication.OnInit)
7585 (ThubanApplication.OnExit, ThubanApplication.SetSession): The
7586 interactor is gone now.
7587 (ThubanApplication.CreateMainWindow): There is no interactor
7588 anymore so we pass None as the interactor argument for now for
7589 compatibility.
7590
7591 * Thuban/UI/view.py (MapCanvas.delegated_messages)
7592 (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
7593 Unsubscribe, delegate messages according to the delegated_messages
7594 class variable.
7595 (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
7596 attributes from instance variables as described with the
7597 delegated_methods class variable.
7598 (MapCanvas.__init__): New instance variable selection holding the
7599 current selection
7600 (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
7601 pass them on to the renderer
7602 (MapCanvas.SetMap): Clear the selection when a different map is
7603 selected.
7604 (MapCanvas.shape_selected): Simple force a complete redraw. The
7605 selection class now takes care of only issueing SHAPES_SELECTED
7606 messages when the set of selected shapes actually does change.
7607 (MapCanvas.SelectShapeAt): The selection is now managed in
7608 self.selection
7609
7610 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
7611 (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
7612 Unsubscribe, delegate messages according to the delegated_messages
7613 class variable.
7614 (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
7615 attributes from instance variables as described with the
7616 delegated_methods class variable.
7617 (MainWindow.__init__): The interactor as ivar is gone. The
7618 parameter is still there for compatibility. The selection messages
7619 now come from the canvas.
7620 (MainWindow.current_layer, MainWindow.has_selected_layer):
7621 Delegate to the the canvas.
7622 (MainWindow.LayerShowTable, MainWindow.Classify)
7623 (MainWindow.identify_view_on_demand): The dialogs don't need the
7624 interactor parameter anymore.
7625
7626 * Thuban/UI/tableview.py (TableFrame.__init__)
7627 (LayerTableFrame.__init__, LayerTableFrame.OnClose)
7628 (LayerTableFrame.row_selected): The interactor is gone. It's job
7629 from the dialog's point of view is now done by the mainwindow,
7630 i.e. the parent. Subscribe to SHAPES_SELECTED instead
7631 of SELECTED_SHAPE
7632
7633 * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
7634 is gone. It's job from the dialog's point of view is now done by
7635 the mainwindow, i.e. the parent.
7636
7637 * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
7638 gone. It's job from the dialog's point of view is now done by the
7639 mainwindow, i.e. the parent.
7640
7641 * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
7642 gone. It's job from the dialog's point of view is now done by the
7643 mainwindow, i.e. the parent.
7644 (SessionTreeCtrl.__init__): New parameter mainwindow which is
7645 stored as self.mainwindow. The mainwindow is need so that the tree
7646 can still subscribe to the selection messages.
7647 (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
7648 (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
7649 selection is now accessible through the mainwindow. Subscribe to
7650 SHAPES_SELECTED instead of SELECTED_SHAPE
7651
7652 * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
7653 SHAPES_SELECTED message now.
7654 (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
7655 so deal with multiple shapes
7656 (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
7657 gone. It's job from the dialog's point of view is now done by the
7658 mainwindow, i.e. the parent.
7659
7660 * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
7661 parameter is now a list of shape ids.
7662 (RecordTable.SetTable): The second parameter is now a list of
7663 indices.
7664
7665 * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
7666 selected_shape parameter and ivar to selected_shapes. It's now a
7667 list of shape ids.
7668 (MapRenderer.draw_label_layer): Deal with multiple selected
7669 shapes. Rearrange the code a bit so that the setup and shape type
7670 distinctions are only executed once.
7671
7672 * test/test_selection.py: Test cases for the selection class
7673
7674 2003-03-11 Jonathan Coles <[email protected]>
7675
7676 * Thuban/Model/load.py: Temporary fix so that the xml reader
7677 doesn't cause Thuban to crash.
7678
7679 * Thuban/Model/layer.py: Handle the cyclic references between
7680 a layer and its classification better, and be sure to disconnect
7681 the classification from the layer when the layer is destroyed
7682 so that we don't maintain a cyclic reference that may not be
7683 garbage collected.
7684
7685 * Thuban/Model/classification.py: See comment for layer.py.
7686
7687 2003-03-12 Jan-Oliver Wagner <[email protected]>
7688
7689 * HOWTO-Release: New. Information on the steps for releasing
7690 a new version of Thuban.
7691
7692 2003-03-11 Jonathan Coles <[email protected]>
7693
7694 * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
7695 Use True instead of true.
7696 (Classifier): Should have a single panel in which all the controls lie.
7697
7698 * Thuban/UI/proj4dialog.py: Add normal border.
7699
7700 * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
7701
7702 * Thuban/UI/mainwindow.py: Use True instead of true.
7703
7704 * setup.py: Update some definitions to use wxWindows2.4 files
7705
7706 * Data/iceland_sample_class.thuban: Fixed file so that the
7707 field_type information is present.
7708
7709 2003-03-10 Jonathan Coles <[email protected]>
7710
7711 * Thuban/UI/classifier.py (Classifier.__init__): Make the
7712 field type label grow so that when the text changes the
7713 size is updated correctly. This may be a wxWindows bug.
7714
7715 2003-03-10 Jonathan Coles <[email protected]>
7716
7717 * Thuban/UI/application.py: Changed SESSION_CHANGED to
7718 SESSION_REPLACED.
7719
7720 * Thuban/UI/classifier.py: Wrap text with _().
7721 (ClassGrid.CreateTable): Set dimensions and size hints here,
7722 instead of in Reset, so we only set the size once.
7723
7724 * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
7725
7726 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
7727 Call Close() instead of Shutdown().
7728
7729 * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
7730
7731 * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
7732 Go back to using OnClose() instead of Shutdown().
7733
7734 2003-03-10 Jonathan Coles <[email protected]>
7735
7736 * Thuban/UI/classifier.py (Classifier): SelectField() needed
7737 to know the old field index as well as the new one.
7738
7739 2003-03-10 Jonathan Coles <[email protected]>
7740
7741 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
7742 to correctly set the table information and call this from
7743 __init__ and from _OnFieldSelect so that all the information
7744 is up to date when the dialog opens and when a field is changed.
7745
7746 2003-03-10 Jonathan Coles <[email protected]>
7747
7748 * Thuban/Model/classification.py (Classification): Don't use
7749 layer's message function directly, use the ClassChanged() method
7750 when then classification changes. SetField/SetFieldType/SetLayer
7751 must keep the information about field name and field type in
7752 sync when an owning layer is set or removed.
7753
7754 * Thuban/Model/layer.py: Added ClassChanged() so that the
7755 classification can tell the layer when its data has changed.
7756 (Layer.SetClassification): Accepts None as an arguement to
7757 remove the current classification and correctly handles
7758 adding a new classification.
7759
7760 * Thuban/Model/load.py: Comment out print statement
7761
7762 * test/test_classification.py, test/test_save.py: New and
7763 improved tests.
7764
7765 2003-03-07 Jonathan Coles <[email protected]>
7766
7767 * Thuban/Model/classification.py: Implemented __copy__ and
7768 __deepcopy__ for ClassGroup* and ClassGroupProperites so
7769 they can easily be copied by the classifier dialog.
7770 (ClassGroupProperites.__init__): The default line color should
7771 have been Color.Black.
7772
7773 * Thuban/UI/classifier.py: Setting and Getting table values now
7774 uses a consistent set of functions.
7775 (Classifier): Now non-modal. Has field type label which changes
7776 as the field changes. Keep track of buttons in a list so that
7777 we can enable/disable the buttons when the None field is selected.
7778 (SelectPropertiesDialog): Add buttons to make the colors transparent.
7779
7780 * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
7781 does what OnClose did, but can be called by the application to
7782 close a window. Needed when a session changes, and we have to
7783 close the classifier windows.
7784
7785 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
7786 Shuts down open dialogs. Used when a new session is created
7787 or a session is opened.
7788 (MainWindow.SaveSession): Should only call application.SaveSession()
7789 if we don't call SaveSessionAs first.
7790 (MainWindow.Classify): Allow different classifier dialogs for
7791 different layers.
7792
7793 * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
7794 the parent class handle it. Add Shutdown() to unsubscibe from
7795 event notification and call the parent Shutdown(). This was
7796 necessary so the application can close the tree window.
7797
7798 2003-03-06 Jonathan Coles <[email protected]>
7799
7800 * Thuban/Model/classification.py: Minor documentation changes,
7801 Addition of __eq__ and __ne__ methods.
7802 (Classification.SetLayer): prevent recursion between this method
7803 and Layer.SetClassification().
7804
7805 * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
7806
7807 * Thuban/Model/layer.py (SetClassification): prevent recursion
7808 between this method and Classification.SetLayer().
7809
7810 * test/test_classification.py, test/test_load.py,
7811 test/test_session.py: Fixed and added tests for the classification
7812 classes.
7813
7814 2003-03-06 Bernhard Herzog <[email protected]>
7815
7816 * Thuban/UI/classifier.py (ClassGrid.__init__)
7817 (ClassGrid.CreateTable): Move the SetSelectionMode call to
7818 CreateTable because otherwise it triggers an assertion in
7819 wxPython/wxGTK 2.4.
7820
7821 2003-03-05 Jonathan Coles <[email protected]>
7822
7823 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
7824
7825 * Thuban/Model/load.py: import FIELDTYPE constants from table.
7826
7827 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
7828
7829 * Thuban/Model/table.py: Put FIELDTYPE constants back.
7830
7831 2003-03-05 Jonathan Coles <[email protected]>
7832
7833 * Thuban/UI/classifier.py: Added class documentation.
7834 Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
7835 Store just the groups in the table and generate the other
7836 column information when it is requested. Add "None" field
7837 to pull-down to select no classification.
7838
7839 * Thuban/common.py: Moved FIELDTYPE constants from table.py
7840 (Str2Num): Only catch ValueError exceptions.
7841
7842 * Thuban/Model/classification.py: Class documentation. Renaming
7843 of methods with Stroke to Line. Groups are stored in a single
7844 list with the default as the first element. Groups are searched
7845 in the order they appear in the list.
7846
7847 * Thuban/Model/color.py: Documentation.
7848
7849 * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
7850 the kind of data represented by a field.
7851
7852 * Thuban/Model/load.py (ProcessSession): Use proper string
7853 conversion function; fixes RTbug #1713.
7854
7855 * Thuban/Model/save.py (Saver): Store field type information.
7856
7857 * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
7858 (Table): Add field_info_by_name() to retrieve field information
7859 by specifying the field name, not the number.
7860
7861 * Thuban/UI/mainwindow.py: Function name changes.
7862
7863 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
7864 get the layer classification once. Don't try to classify
7865 values when the field is None: just use the default properties.
7866
7867 * Thuban/UI/view.py: Function name changes.
7868
7869 * Doc/thuban.dtd: Add field_type attribute to a classification.
7870
7871 2003-03-04 Bernhard Herzog <[email protected]>
7872
7873 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
7874 the fill and stroke layer attributes optional with suitable
7875 default values. Add the stroke_width layer attribute. Use correct
7876 syntax for empty elements. Make the attribute list for labels
7877 refer to the label element.
7878
7879 2003-03-04 Bernhard Herzog <[email protected]>
7880
7881 * setup.py (thuban_build_py.build): Add a comment about distutils in
7882 Python 2.3 containing some of the functionality we implement in
7883 setup.py ourselves.
7884
7885 * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
7886 before the selection mode. Doing it the other way round triggers
7887 an assertion in wxWindows.
7888
7889 * Thuban/Model/save.py (escape): Fix typo in doc-string
7890
7891 * Thuban/Model/classification.py: Remove unnecessary wxPython
7892 import
7893
7894 2003-03-04 Jonathan Coles <[email protected]>
7895
7896 * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
7897 Parameter 'value' should default to None.
7898
7899 * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
7900 the class attribute __classification is now private.
7901
7902 * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
7903 Classifier to ClassGrid. Added support for removing selected rows,
7904 which including code for keeping track of when cells are selected,
7905 and deselected.
7906 (ClassTable): Support for added/removing rows. Fixed a problem
7907 with __ParseInput whereby it would not allow strings (only numbers)
7908 to be entered.
7909 (Classifier): Added button and supporting code for removing
7910 selected rows.
7911
7912 2003-02-27 Jonathan Coles <[email protected]>
7913
7914 * Thuban/common.py: Moved color conversion functions into
7915 Thuban/UI/common.py.
7916 (Str2Num): Now converts the float (not the string) to a long/int
7917 so that an exception isn't thrown.
7918
7919 * Thuban/UI/common.py: Common functions used in several UI modules
7920
7921 * Thuban/Model/classification.py: Changed the class hierarchy
7922 so that a Classification consists of Groups which return
7923 Properties when a value matches a Group.
7924
7925 * Thuban/Model/layer.py: Fixed name resolution problem.
7926
7927 * Thuban/Model/load.py: Use new Classification and Group functions.
7928
7929 * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
7930 failure.
7931 (Saver.write_classification): Use new Classification and Group
7932 functions.
7933
7934 * Thuban/UI/classifier.py: Changes to use new Classification and Group
7935 functions. Fix to create a tuple with a single value instead of
7936 simply returning the value.
7937
7938 * Thuban/UI/renderer.py: Use new Classification and Group functions.
7939 Use common.py functions.
7940
7941 * Thuban/UI/tree.py: Use common.py functions.
7942
7943 * test/test_classification.py: Use new Classification and Group
7944 classes.
7945
7946 2003-02-24 Jonathan Coles <[email protected]>
7947
7948 * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
7949 functions from Thuban color objects to wxWindow colour objects.
7950
7951 * Thuban/Model/classification.py (Classification): Renamed
7952 GetProperties() to GetClassData(). Used the new iterator
7953 in TreeInfo().
7954 (ClassIterator): Iterator implementation to iterate over the
7955 ClassData objects in a classification object.
7956
7957 * Thuban/Model/save.py (Saver.write_classificaton): Uses
7958 the new iterator to save the classification information.
7959
7960 * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
7961 for changing the stroke and fill colors and previewing the
7962 changes.
7963
7964 * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
7965 MainWindow.SaveSessionAs): Text string changes so the dialogs
7966 have more meaningful titles.
7967
7968 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
7969 Classification method name from GetProperties to GetClassData.
7970
7971 * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
7972 instead of accessing now non-existent class variables.
7973
7974 2003-02-24 Bernhard Herzog <[email protected]>
7975
7976 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
7977 unneeded Shape() call. Rendering is substantially faster without
7978 it and it avoids some problems with broken shape files.
7979
7980 2003-02-20 Frank Koormann <[email protected]>
7981
7982 Force minimal size of identify and label dialogs. The autosizing
7983 looked too ugly.
7984
7985 * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
7986 * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
7987 Set size of listctrl.
7988 * Thuban/UI/identifyview.py (IdentifyView.__init__):
7989 Set size of dialog.
7990
7991 2003-02-19 Jonathan Coles <[email protected]>
7992
7993 * test/test_classification.py, test/test_layer.py,
7994 test/test_load.py, test/test_map.py, test/test_session.py:
7995 Updated the tests to use the new functions that are in the
7996 respective classes.
7997
7998 * Thuban/Model/classification.py (Classification):
7999 Uses the new ClassData* classes. Modification messages are
8000 passed up to the parent layer (if it exists).
8001 (ClassData): New class to encapsulate the common data in each
8002 classification property.
8003 (ClassDataDefault): Represents the Default class. data.
8004 (ClassDataPoint): Represents a single class. data point
8005 (ClassDataRange): Represents a class. range
8006 (ClassDataMap): Represents a class. map (unused).
8007
8008 * Thuban/Model/color.py: Added Color.None to represent something
8009 with no color. Color.Black represents the color black.
8010 (NoColor): Helper class derived from Color to represent something
8011 with no color.
8012
8013 * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
8014 stroke_width attributes. Made the 'classification' attribute private.
8015 New methods for setting/getting the classification.
8016
8017 * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
8018 to get the classifcation and use the new ClassData* classes to
8019 hold the classification data. Use Str2Num to convert numbers
8020 properly.
8021
8022 * Thuban/Model/save.py (Saver): Use new Color and Classification
8023 methods
8024
8025 * Thuban/UI/classifier.py (ClassGrid): New class to represent a
8026 custom grid.
8027 (ClassTable): Support for editing Values and Labels and for
8028 changing what type (point or range) of data is stored in each
8029 property based on how the user enters the data.
8030 (Classifier): Support for saving the new classifications and
8031 launching the dialog to edit a property.
8032 (SelectPropertiesDialog): New class for editing the visual
8033 properties of a classification (stroke color, width, and fill color)
8034 (ClassPreviewer): Took the Draw method from ClassRenderer and
8035 made most of it into this new class. Intend to use this class in
8036 the SelectPropertiesDialog for previewing changes.
8037
8038 * Thuban/UI/renderer.py: Use new Color and Classification methods.
8039
8040 * Thuban/UI/tree.py: Formatting changes.
8041
8042 * Doc/thuban.dtd: Add 'label' element
8043
8044 * Thuban/common.py: New. Contains common routines used throughout
8045 the code.
8046 (Str2Num): Takes a string and converts it to the "best" type of
8047 number.
8048
8049 2003-02-14 Bernhard Herzog <[email protected]>
8050
8051 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
8052 dragging flag is always set to 0 even when the tool implementation
8053 raises an exception
8054
8055 2003-02-11 Bernhard Herzog <[email protected]>
8056
8057 * Thuban/UI/application.py (ThubanApplication.splash_screen): New
8058 method to create a splash screen.
8059 (ThubanApplication.ShowMainWindow): New. Show the main window.
8060 Needed so the splash screen can display the mainwindow
8061 (ThubanApplication.OnInit): Call the
8062 new splash_screen method to determine whether the application
8063 should display a splash screen. If it displays a splash screen do
8064 not immediately show the main window.
8065
8066 2003-02-11 Jonathan Coles <[email protected]>
8067
8068 * Thuban/Model/classification.py: Added import line to fix
8069 feature conflicts between running on python2.2 and python2.1.
8070
8071 * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
8072 onto the clinfo parameter, so removed the deepcopy().
8073
8074 2003-02-10 Jonathan Coles <[email protected]>
8075
8076 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
8077 Added element_open variable to track opening and closing of tags
8078 so that tags that don't span more than one line are closed with
8079 /> instead of </tag_name>. Use the GetDefault*() methods of
8080 the Classification class.
8081
8082 * Thuban/Model/classification.py (Classificaton): Added set and
8083 get methods for the default data. The class also takes a layer
8084 reference so that modification messages can be sent. Fixed the
8085 methods to use the new ClassData class.
8086 (ClassData): New class to encapsulate the classification data
8087
8088 * Thuban/Model/layer.py (Layer): Remove the
8089 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
8090 SetDefault*() methods on the layer's classification object.
8091 (Layer.__init__): Use the new SetDefault*() methods in the
8092 Classification class.
8093
8094 * Thuban/Model/load.py (ProcessSession): Use the new ClassData
8095 object instead of a dictionary.
8096
8097 * Thuban/UI/classifier.py (ClassRenderer): New class to
8098 draw the classifications in the dialog box's table.
8099 (Classifier): Modified to use the ClassRenderer class.
8100
8101 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
8102 methods of the Classification class.
8103
8104 * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
8105 of the ClassData class.
8106
8107 * test/test_classification.py, test/test_layer.py,
8108 test/test_map.py, test/test_session.py: Fix the tests to work
8109 with the above code changes.
8110
8111 2003-02-03 Jonathan Coles <[email protected]>
8112
8113 * Thuban/Model/classification.py (Classification): Added getNull()
8114 to return the NullData reference
8115
8116 * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
8117 Layer.SetStrokeWidth): Modified these functions to change the
8118 null data in the classification rather than keep these values
8119 directly in the Layer class. Menu options to change these values
8120 work again.
8121
8122 2003-01-28 Jonathan Coles <[email protected]>
8123
8124 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
8125 Fixed crashing problem on some systems. Dialog box shows
8126 classification data.
8127
8128 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
8129 Colors in the tree view.
8130
8131 * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
8132 the tree info for classifications. Commented out unnecessary lines.
8133
8134 * Thuban/Model/classification.py (Classification.TreeInfo): New
8135 function to add information about the classification into the
8136 tree view.
8137
8138 2003-01-27 Jan-Oliver Wagner <[email protected]>
8139
8140 * Thuban/__init__.py (_): New.
8141
8142 * Thuban/Model/classification.py, Thuban/Model/extension.py,
8143 Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
8144 Thuban/Model/session.py, Thuban/UI/application.py,
8145 Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
8146 Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
8147 Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
8148 Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
8149 Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
8150
8151 2003-01-27 Jonathan Coles <[email protected]>
8152
8153 * Thuban/Model/layer.py: Classification initialization calls.
8154
8155 * Thuban/Model/classification.py: Created class to encapsulate
8156 a layer classification. Supports specific data points and
8157 ranges.
8158
8159 * Thuban/Model/load.py: Added support for loading classification
8160 information.
8161
8162 * Thuban/Model/save.py: Added support for saving classification
8163 information.
8164
8165 * Thuban/UI/classifier.py: Initial class for a dialog box for
8166 specifying classification information.
8167
8168 * Thuban/UI/mainwindows.py: Support for opening the classifier
8169 dialog.
8170
8171 * Thuban/UI/renderer.py: Support for drawing a layer with the
8172 classification information.
8173
8174 * Data/iceland_sample_class.thuban: iceland_sample with
8175 classification data.
8176
8177 * test/test_classification: Tests for the Classification class.
8178
8179 2002-12-09 Bernhard Herzog <[email protected]>
8180
8181 * test/test_command.py: New. Tests for the command classes.
8182
8183 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
8184 (Command.IsTool): New method to distinguish between command
8185 switching tools and other commands.
8186
8187 * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
8188 the tool to avoid direct assignments to instance variables
8189 (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
8190 (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
8191 change the tool
8192
8193 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
8194 active tool's command turns insensitive, disable the tool.
8195 (_tool_command): Use the new ToolCommand class
8196
8197 * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
8198 SelectTool method to change the tool
8199 (iconfile): Use the ToolCommand class
8200
8201 2002-12-03 Bernhard Herzog <[email protected]>
8202
8203 * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
8204 the case of selected items that are not children of Layers or Maps
8205 properly. Previously this bug would trigger an assertion in
8206 wxWindows.
8207
8208 2002-11-06 Frank Koormann <[email protected]>
8209
8210 * Thuban/UI/mainwindow.py: Altered the order of tools in the
8211 toolbar: First now are all navigation tools (Zoom In/Out, Pan,
8212 Full Extent).
8213
8214 2002-10-23 Bernhard Herzog <[email protected]>
8215
8216 * setup.py (setup call): version now 0.1.3
8217
8218 * MANIFEST.in: Add the files in test/
8219
8220 * test/README: Add note about tests requiring the iceland data
8221
8222 * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
8223 copyright notice.
8224
8225 2002-10-18 Bernhard Herzog <[email protected]>
8226
8227 * test/test_map.py
8228 (TestMapWithContents.test_projected_bounding_box): Use an explicit
8229 epsilon.
8230
8231 * test/support.py (FloatComparisonMixin.assertFloatEqual)
8232 (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
8233 message if the assertion fails and don't return the return value
8234 of self.assert_. In assertFloatSeqEqual the return meant that not
8235 all items of the sequence were compared.
8236
8237 2002-09-20 Bernhard Herzog <[email protected]>
8238
8239 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
8240
8241 * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
8242
8243 * test/test_map.py (TestMapWithContents.test_tree_info): Create
8244 the string with the bounding box on the fly because of platform
8245 differences in the way %g is handled.
8246
8247 * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
8248 DBFfile too because Thuban layers can't yet cope missing DBF
8249 files.
8250
8251 2002-09-20 Bernhard Herzog <[email protected]>
8252
8253 * test/test_menu.py: Use initthuban instead of
8254 add_thuban_dir_to_path to initialize Thuban.
8255
8256 * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
8257 Mixin class for float comparisons
8258 (SubscriberMixin): New. Mixin class to test messages sent through
8259 the Connector class
8260
8261 * test/README: Fix a typo and add the -v flag to the command for
8262 individual tests
8263
8264 * test/test_session.py: New. Test cases for Thuban.Model.session
8265
8266 * test/test_proj.py: New. Test cases for Thuban.Model.proj
8267
8268 * test/test_map.py: New. Test cases for Thuban.Model.map
8269
8270 * test/test_layer.py: New. Test cases for Thuban.Model.layer
8271
8272 * test/test_label.py: New. Test cases for Thuban.Model.label
8273
8274 * test/test_connector.py: New. Test cases for Thuban.Lib.connector
8275
8276 * test/test_color.py: New. Test cases for Thuban.Model.color
8277
8278 * test/test_base.py: New. Test cases for Thuban.Model.base
8279
8280 2002-09-13 Bernhard Herzog <[email protected]>
8281
8282 * Thuban/Model/session.py (Session.forwarded_channels): Forward
8283 the CHANGED channel too.
8284
8285 * Thuban/Model/map.py (Map.forwarded_channels): Forward the
8286 CHANGED channel too.
8287 (Map.__init__): Call the Modifiable constructor as well.
8288
8289 * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
8290 event if the modified flag changes.
8291 (Modifiable.changed): Tweak the doc-string.
8292
8293 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
8294 (MainWindow.set_position_text): Put the code that puts the text
8295 with the mouse position into the status bar into the new method
8296 set_position_text so that it can overwritten in derived classes.
8297
8298 2002-09-12 Bernhard Herzog <[email protected]>
8299
8300 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
8301 message box on the main window.
8302
8303 2002-09-11 Bernhard Herzog <[email protected]>
8304
8305 * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
8306 the 'E' because it's less likely to interfere with other menu
8307 entries.
8308 (MainWindow.build_menu): remove an incorrect comment.
8309
8310 2002-09-10 Bernhard Herzog <[email protected]>
8311
8312 * Thuban/UI/mainwindow.py (MainWindow.Map): New.
8313 (_tool_command): Add sensitive parameter
8314 (_has_visible_map): Sensitivity callback to tools and other
8315 commands that require a visible map. Use it in map_zoom_in_tool,
8316 map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
8317 and map_full_extent
8318
8319 2002-09-06 Bernhard Herzog <[email protected]>
8320
8321 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
8322 VIEW_POSITION
8323
8324 2002-09-04 Frank Koormann <[email protected]>
8325
8326 * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
8327
8328 2002-09-02 Bernhard Herzog <[email protected]>
8329
8330 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
8331 wxWindows already and our implementation doesn't work correctly
8332 with wxGTK 2.3:
8333 (MapCanvas.__init__): Remove the instance variable
8334 (MapCanvas.OnPaint): Always call do_redraw when there's a map to
8335 be drawin
8336 (MapCanvas.OnIdle): Removed.
8337
8338 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
8339 a parameter to determine the size of the rectangle.
8340 (MapCanvas.find_shape_at): Create the box around the point on a
8341 layer by layer basis and make the size depend on the shape type.
8342 This solves a problem with the selection of point shapes at the
8343 border of the layer's bounding box
8344
8345 2002-08-30 Bernhard Herzog <[email protected]>
8346
8347 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
8348 for the sensitivity of remove layer.
8349 (_can_remove_layer): New. Sensitivity callback for remove layer
8350 (Command layer_remove): Use _can_remove_layer
8351
8352 * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
8353 determine whether a given layer can be deleted.
8354
8355 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
8356 (MapCanvas.do_redraw): Get rid of the unused update_region
8357 instance variable
8358
8359 * Thuban/UI/view.py: Add/update some doc-strings.
8360
8361 * test/: new subdirectory with a bunch of unit tests.
8362
8363 * test/README, test/test_table.py, test/test_save.py,
8364 test/test_menu.py, test/test_load.py: Initial set of tests and
8365 brief instructions on how to run them
8366
8367 2002-08-29 Bernhard Herzog <[email protected]>
8368
8369 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
8370 arcs with multiple parts.
8371
8372 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
8373 Handle degenrate rectangles.
8374
8375 * Thuban/Model/table.py: Make writing records work correctly:
8376 (Table.__init__): Keep track of whether the DBF is open for
8377 writing
8378 (Table.write_record): Open the DBF file for writing when necessary
8379
8380 2002-08-27 Bernhard Herzog <[email protected]>
8381
8382 * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
8383 dbf files only for reading by default. Use a new writable dbf
8384 object for writing.
8385
8386 2002-08-26 Bernhard Herzog <[email protected]>
8387
8388 * Thuban/UI/mainwindow.py: Refactor the context creation:
8389 (MainWindow.Context): New method to return a context
8390 (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
8391 new method
8392
8393 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
8394 layer table specific code from TableGrid into LayerTableGrid
8395 (TableFrame, LayerTableFrame): Split the layer table specific code
8396 from TableFrame into LayerTableFrame
8397 (LayerTableGrid.select_shape): Remove a debug print
8398
8399 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
8400 LayerTableFrame
8401
8402 2002-08-23 Bernhard Herzog <[email protected]>
8403
8404 * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
8405 absolute filename.
8406
8407 2002-08-22 Bernhard Herzog <[email protected]>
8408
8409 * Thuban/Model/table.py (Table.write_record): New method to write
8410 records.
8411 (Table.__init__): Open the DBF file for writing too.
8412
8413 * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
8414 into the underlying table.
8415
8416 * extensions/shapelib/shapefil.h (DBFCommit),
8417 extensions/shapelib/dbfopen.c (DBFCommit): New API function to
8418 commit any changes made to the DBF file.
8419
8420 * Thuban/UI/mainwindow.py (make_check_current_tool)
8421 (_tool_command): Put the code that generates the "checked"
8422 callback into a separate function so that we can reuse it
8423 elsewhere
8424
8425 * Thuban/Model/save.py (Saver): New class to handle serializing a
8426 session into an XML file. The main reason to introduce a class is
8427 that applications built on Thuban can derive from it so that they
8428 can save additional information in a session file.
8429 (save_session): Delegate almost all the work to the Saver class.
8430 Rename the filename argument to file because it may be a file like
8431 object now.
8432
8433 * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
8434 code. Remove the little test code which would be executed when the
8435 module is run as a script which didn't work anymore since it can't
8436 import the other Thuban modules.
8437 (ProcessSession, load_session): Refactor the ProcessSession to
8438 have one method for each element start and end tag so that derived
8439 classes can easily override the processing of individual tags.
8440 Also, always parse with namespaces enabled because applications
8441 built on top of Thuban will likely use namespaces if they extend
8442 the session file format.
8443
8444 2002-08-21 Bernhard Herzog <[email protected]>
8445
8446 * setup.py (ThubanInstall.run): Don't repr install_lib_orig
8447 because thubaninit_contents will do it for us.
8448
8449 2002-08-16 Jan-Oliver Wagner <[email protected]>
8450
8451 * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
8452 tree window already open
8453
8454 2002-08-15 Bernhard Herzog <[email protected]>
8455
8456 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
8457 with self.
8458
8459 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
8460 when we have actually captured it.
8461
8462 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
8463 shapefile and destroy the table.
8464
8465 * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
8466
8467 2002-08-14 Bernhard Herzog <[email protected]>
8468
8469 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
8470 instance variable columns
8471 (RecordTable.GetTypeName): row and col may be negative in some
8472 cases.
8473
8474 * setup.py (InstallLocal.initialize_options)
8475 (InstallLocal.finalize_options, InstallLocal.user_options): New
8476 option create-init-file to build a thubaninit.py when running
8477 install_local
8478 (InstallLocal.run): Create the thubaninit.py module when requested
8479 (thubaninit_contents): Split the template into several parts and
8480 create a new function thubaninit_contents that creates the
8481 contents of a thubaninit module.
8482 (ThubanInstall.run): Use the new function to create the thubaninit
8483 module.
8484
8485 2002-07-30 Bernhard Herzog <[email protected]>
8486
8487 * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
8488 cleanup.
8489 (ThubanApplication.MainLoop): Extend to automatically call OnExit.
8490
8491 * Thuban/Model/session.py (Session.Destroy): Don't bypass the
8492 direct base class' Destroy method.
8493
8494 * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
8495 layers.
8496 (Map.Destroy): Destroy the label_layer as well and call the
8497 inherited Desatroymethod first so that no more messages are
8498 issued.
8499 (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
8500 message if the stacking order actually has changed. Add
8501 doc-strings.
8502 (Map.BoundingBox): Correct the doc-string.
8503 (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
8504 (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
8505
8506 * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
8507 all labels.
8508
8509 2002-07-29 Bernhard Herzog <[email protected]>
8510
8511 * Thuban/Model/map.py (Map.subscribe_layer_channels)
8512 (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
8513 to a layer's channels into separate methods.
8514 (Map.RemoveLayer, Map.AddLayer): Call the new methods
8515 (Map.Destroy): Unsubscribe from a layer's channels before
8516 destroying it.
8517
8518 * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
8519 selected_layer parameter to searched_layer which is the layer to
8520 search in.
8521 (MapCanvas.SelectShapeAt): New parameter layer to restrict the
8522 search to that layer. Return the selected layer and shape.
8523
8524 * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
8525 typo
8526
8527 2002-07-24 Bernhard Herzog <[email protected]>
8528
8529 * Thuban/UI/application.py (ThubanApplication.create_session):
8530 Extend the doc string.
8531 (ThubanApplication.subscribe_session)
8532 (ThubanApplication.unsubscribe_session): New methods to
8533 subscribe/unsubscribe to/from session channels.
8534 (ThubanApplication.SetSession): Call the new methods here.
8535 (ThubanApplication.maps_changed, ThubanApplication.set_map):
8536 Renamed set_map to maps_changed. Its now a subscriber for
8537 MAPS_CHANGED.
8538
8539 * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
8540 x-coordinate in case of simple clicks
8541
8542 * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
8543 don't pass it as a parameter
8544
8545 * Thuban/Model/session.py (Session.RemoveMap): New
8546
8547 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
8548 window size into a parameter.
8549
8550 2002-07-23 Bernhard Herzog <[email protected]>
8551
8552 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
8553 just commands.
8554
8555 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
8556 parameter list a bit to allow setting the window title and the
8557 initial message in the status bar. Update the callers.
8558
8559 * Thuban/UI/application.py (ThubanApplication.OnInit)
8560 (ThubanApplication.CreateMainWindow): Put the mainwindow
8561 instantiation into a separate method so that it can be overridden
8562 by a subclass.
8563
8564 2002-07-19 Bernhard Herzog <[email protected]>
8565
8566 * Thuban/Model/session.py: Issue a CHANGED message every time
8567 another changed message is issued to make it easier to get
8568 notified of changes.
8569 (Session): Update the doc string
8570 (Session.forward): Issue changed-events as CHANGED as well.
8571 (Session.changed): Overwrite the inherited version to issue
8572 CHANGED events as well.
8573
8574 * Thuban/UI/tree.py: We can now simply subscribe to the session's
8575 CHANGED channel to be informed of changes.
8576 (SessionTreeCtrl.session_channels): Not needed any longer.
8577 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
8578 Only have to (un)subscribe CHANGED
8579
8580 * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
8581
8582 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
8583 for the wxPython locale bug to __init__.py so that it's
8584 automatically executed by anybody using UI code from Thuban.
8585
8586 2002-07-18 Bernhard Herzog <[email protected]>
8587
8588 * Thuban/UI/main.py (main): app no longer needs to be global
8589
8590 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
8591 as parameter and store it in an instance variable
8592 (MainWindow.invoke_command, MainWindow.update_command_ui)
8593 (MainWindow.save_modified_session, MainWindow.NewSession)
8594 (MainWindow.OpenSession, MainWindow.SaveSession)
8595 (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
8596 application object.
8597
8598 * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
8599 the main window with self.
8600
8601 * Thuban/UI/context.py: New module with the context class
8602
8603 * Thuban/UI/command.py (Command): Update doc string.
8604
8605 * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
8606 MainWindow.update_command_ui): Pass an instance of the context
8607 class to the command's methods
8608 (check_current_tool, call_method): Handle the new context
8609 implementation
8610
8611 * Examples/simple_extensions/simple_tool.py (simple_tool,
8612 check_simple_tool): Handle the new context implementation
8613
8614 * Examples/simple_extensions/simple_command.py (simple_command):
8615 Handle the new context implementation. Update the comments about
8616 the context.
8617
8618 * Thuban/UI/application.py (ThubanApplication.SetSession): Add
8619 doc-string
8620 (ThubanApplication.Session): New method to return the session
8621 object
8622
8623 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
8624 interactor's selected_layer may not be a layer of the current
8625 session when the tree is updated while a new session is being set.
8626
8627 2002-07-17 Bernhard Herzog <[email protected]>
8628
8629 * Thuban/UI/tree.py (color_string): Removed. No longer used.
8630 (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
8631 update_tree into update_tree and add_items. The tree now uses a
8632 more generic way to display the contents of the tree.
8633 (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
8634
8635 * Thuban/Model/layer.py (Layer.TreeInfo),
8636 Thuban/Model/extension.py (Extension.TreeInfo),
8637 Thuban/Model/map.py (Map.TreeInfo),
8638 Thuban/Model/session.py (Session.TreeInfo):
8639 Add TreeInfo methods to implement the new tree view update scheme
8640
8641 2002-07-16 Bernhard Herzog <[email protected]>
8642
8643 * Thuban/UI/application.py: Don't use "import from" for the
8644 MainWindow. It can't always be resolved.
8645 (ThubanApplication.OnInit): change reference to MainWindow
8646 accordingly.
8647
8648 * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
8649 completely
8650
8651 2002-07-10 Bernhard Herzog <[email protected]>
8652
8653 * setup.py (create_init_module): New configurable variable whose
8654 default depends on the platform we're running on.
8655 (ThubanInstall.initialize_options): Initialize
8656 self.create_init_module from the global create_init_module
8657 (ThubanInstall.user_options): indictate that the options
8658 create-init-module and init-module-dir have arguments.
8659
8660 * setup.py: In the setup call change the version number to include
8661 cvs.
8662
8663 * MANIFEST.in: Add the files in Examples
8664
8665 2002-07-09 Bernhard Herzog <[email protected]>
8666
8667 * setup.py: In the setup call, use the thuban homepage as the
8668 value of the url parameter.
8669
8670 * Examples: New subdirectory for examples.
8671
8672 * Examples/simple_extensions/simple_tool.xpm,
8673 Examples/simple_extensions/simple_tool.py,
8674 Examples/simple_extensions/simple_command.py,
8675 Examples/simple_extensions/README: Simple examples showing how to
8676 add new commands and tools.
8677
8678 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
8679 bdist_rpm that we also have an install script.
8680 (bdist_inno): Add 2002 to the copyright notice.
8681
8682 * setup.py: Create a file in python's site-packages directory to
8683 make installation of Thuban as a library easier.
8684 (ThubanInstall.user_options): Add two new options,
8685 create-init-module and init-module-dir
8686 (ThubanInstall.expand_with_pure_python_dirs): New method to expand
8687 filenames for installation in the default directories.
8688 (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
8689 the inherited methods to capture some filenames before they're
8690 transformed too much by distutils.
8691 (ThubanInstall.run): Create the init module if requested.
8692 (ThubanInstall.thuban_init_filename): New method to return the
8693 full name of the init module.
8694 (ThubanInstall.get_outputs): Append the filename of the init
8695 module.
8696
8697 2002-07-08 Bernhard Herzog <[email protected]>
8698
8699 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
8700 handle the prefix properly which means that the default for the
8701 installation prefix should be /usr for RPMs and /usr/local when
8702 doing a normal source install.
8703 (bdist_rpm_install_script): Script to override the default install
8704 commands in the specfile generated by the bdist_rpm command.
8705 (thuban_bdist_rpm.user_options): Add a prefix option
8706 (thuban_bdist_rpm.initialize_options): Init the prefix option.
8707 Create the script files for the spec files as empty files here
8708 (thuban_bdist_rpm._make_spec_file): Override the inherited method
8709 to fill the script files with content.
8710
8711 * Thuban/Model/save.py (relative_filename): Wrapper around
8712 Thuban.Lib.fileutil.relative_filename that accepts an empty dir
8713 argument. save_session now automatically uses this version,
8714 solving a problem when saving to a relative filename.
8715
8716 * setup.py: In the setup call, make sure that the library
8717 directories are under $prefix/lib not directly under $prefix.
8718
8719 2002-06-20 Jan-Oliver Wagner <[email protected]>
8720
8721 * Thuban/Model/extension.py: new module to handle extension objects.
8722 * Thuban/Model/messages.py: new messages for extensions.
8723 * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
8724 Session.AddExtension): new for handling extensions.
8725 Also some other minor changes to round up extension handling.
8726 * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
8727 of Extension titles and title and names of its objects.
8728
8729 2002-05-29 Bernhard Herzog <[email protected]>
8730
8731 * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
8732 the events for a command.
8733 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
8734 Call bind_command_events to bind the events. add_toolbar_command
8735 can now bind events too so that it's possible to have commands
8736 that are only available through the toolbar.
8737 (MainWindow.init_ids): New instance variable events_bound to keep
8738 track of for which commands events have been bound.
8739
8740 2002-05-28 Bernhard Herzog <[email protected]>
8741
8742 * Thuban/UI/menu.py: New module to build and manage menus.
8743
8744 * Thuban/UI/mainwindow.py: Remove some unused imports.
8745 (MainWindow.__init__, main_menu): move the definition of the main
8746 menu from __init__ to the Menu instance main_menu.
8747 (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
8748 build the menu bar and sub-menus from a menu description.
8749
8750 * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
8751 startup file
8752 (ThubanApplication.read_startup_files): New method to run
8753 ~/.thuban/thubanstart.py
8754
8755 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
8756 Move the toolbar definition to the Menu instance main_toolbar.
8757 (MainWindow.build_toolbar): New method to build the toolbar
8758 similar to the build_menu methods
8759
8760 2002-05-23 Bernhard Herzog <[email protected]>
8761
8762 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
8763 layer_outline_color. Fix it in the definition of the command too.
8764
8765 * Thuban/UI/command.py (Command): Fix typo in doc string
8766
8767 2002-05-22 Bernhard Herzog <[email protected]>
8768
8769 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
8770 in the docstring
8771
8772 2002-05-15 Bernhard Herzog <[email protected]>
8773
8774 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
8775 when the shapefile is empty.
8776 (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
8777 now return None for empty shapefiles. Update doc-strings.
8778
8779 * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
8780 the layer's bbox being None.
8781
8782 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
8783 layer's bbox being None.
8784
8785 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
8786 necessary.
8787 (MapCanvas.__init__): New instance variables, last_selected_layer
8788 and last_selected_shape to determine how the selection has
8789 changed.
8790
8791 * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
8792 AutoSizeColumns because it will cause a traversal of the entire
8793 table which for large .dbf files will take a very long time.
8794
8795 2002-05-14 Bernhard Herzog <[email protected]>
8796
8797 * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
8798 maximum depth for the tree than shapelib does by default.
8799
8800 2002-05-10 Bernhard Herzog <[email protected]>
8801
8802 * setup.py (py_modules): The shptree modules doesn't have a
8803 wrapper, so don't include it in the py_modules
8804
8805 2002-05-08 Bernhard Herzog <[email protected]>
8806
8807 * extensions/shapelib/shptree.c (compare_ints): Make arguments
8808 const void * as in the qsort prototype
8809 (SHPTreeFindLikelyShapes): Remove some unused variables.
8810
8811 * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
8812 maintains to redraw the window during a drag.
8813 (MapCanvas.unprojected_rect_around_point): New method to determine
8814 a small region around a point for hit-testing.
8815 (MapCanvas.find_shape_at): Only test the shapes in a small region
8816 around the point.
8817
8818 * setup.py: Increment the version to 0.1.2
8819
8820 * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
8821 debug print and set session to None after unsubscribing
8822
8823 2002-05-07 Bernhard Herzog <[email protected]>
8824
8825 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
8826 the file to have a .thuban extension.
8827
8828 * Thuban/UI/tree.py (session_channels): New class constant with
8829 all the session channels to subscribe to to update the tree
8830 (SessionTreeCtrl.session_changed): Remember the session so that we
8831 can unsubscribe properly. Use the new class constant to
8832 unsubscribe from the old session and subscribe to the new one.
8833 (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
8834 subscriptions of the SessionTreeCtrl.
8835 (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
8836
8837 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
8838 Session Tree" command to the file menu.
8839
8840 * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
8841 as update_region to the renderer.
8842
8843 * Thuban/UI/renderer.py
8844 (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
8845 update box is now directly a tuple, not a wxRect anymore.
8846
8847 * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
8848 prints.
8849
8850 2002-05-07 Bernhard Herzog <[email protected]>
8851
8852 * setup.py: Add the shptree extension module. See
8853 extensions/pyshapelib/ChangeLog for more details.
8854
8855 * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
8856 extensions/shapelib/dbfopen.c: Really update to the versions of
8857 shapelib 1.2.9. For some reason it wasn't really done on
8858 2002-04-11.
8859
8860 * extensions/shapelib/shptree.c: Modified version of shptree.c of
8861 shapelib 1.2.9. The only real difference is the use of qsort
8862 instead of a bubble sort implementation
8863
8864 * Thuban/Model/layer.py (Layer.__init__): New instance variable
8865 shapetree to hold the shapelib quadtree for the shapefile
8866 (Layer.open_shapefile): Create the quad tree.
8867 (Layer.ShapesInRegion): New method to return the ids of shapes in
8868 a given region using the quad tree.
8869
8870 * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
8871 comment
8872 (draw_polygon_shape): Accept both arcs and polygons.
8873 (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
8874 the api.
8875
8876 * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
8877 return the shape ids to be rendered in a given layer.
8878 (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
8879 ids. Use draw_polygon_shape to draw arc shapes as well.
8880 (ScreenRenderer.RenderMap): New parameter for the rectangle that
8881 has to be updated
8882 (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
8883 calling it's ShapesInRegion method.
8884
8885 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
8886 update_region for the update region.
8887 (MapCanvas.OnPaint): Maintain the update region
8888 (MapCanvas.do_redraw): Pass the bounding box of the update_region
8889 to the renderer when drawing the bitmap. Reset the update_region.
8890
8891 2002-05-03 Bernhard Herzog <[email protected]>
8892
8893 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
8894 MainWindow.OpenSession): Change the file extension of the session
8895 files to .thuban
8896
8897 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
8898 Move the map channels to be forwarded by the session into the
8899 class constant with forwarded_channels. Also add
8900 LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
8901 forwarded_channels
8902
8903 * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
8904 typo and some rewording).
8905
8906 2002-05-02 Bernhard Herzog <[email protected]>
8907
8908 * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
8909 around to speed up most redraws:
8910 (MapCanvas.__init__): New instance variable bitmap which holds the
8911 bitmap
8912 (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
8913 self.bitmap to draw.
8914 (MapCanvas.full_redraw): New method to force a full redraw
8915 including the bitmap
8916 (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
8917 make sure the bitmap is redrawn.
8918 (MapCanvas.projection_changed, MapCanvas.set_view_transform,
8919 MapCanvas.shape_selected): Call full_redraw instead of readraw to
8920 make sure the bitmap is redrawn.
8921 (MapCanvas.OnSize): New method to handle size events so that the
8922 bitmap can be redrawn.
8923
8924 2002-04-29 Bernhard Herzog <[email protected]>
8925
8926 * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
8927 canvas' VIEW_POSITION event
8928 (MainWindow.view_position_changed): Handler for VIEW_POSITION.
8929 Update the text in the status-bar accordingly.
8930
8931 * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
8932 (MapCanvas.__del__): Implement because Publisher.__del__ has to be
8933 called.
8934 (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
8935 current_position
8936 (MapCanvas.set_current_position): New method to set
8937 current_position. Issue a VIEW_POSITION event
8938 (MapCanvas.CurrentPosition): New public method to return the value
8939 of current_position. Should be called when the VIEW_POSITION event
8940 is processed.
8941 (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
8942 Update the position.
8943 (MapCanvas.OnLeaveWindow): Set the position to None.
8944
8945 * Thuban/UI/messages.py (VIEW_POSITION): New message for the
8946 position in the statusbar
8947
8948 2002-04-26 Frank Koormann <[email protected]>
8949
8950 * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
8951
8952 2002-04-24 Frank Koormann <[email protected]>
8953
8954 * Resources/Bitmaps/identify.xpm: shadow added
8955
8956 * Resources/Bitmaps/fullextent.xpm: new
8957
8958 2002-04-22 Jan-Oliver Wagner <[email protected]>
8959
8960 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
8961 box
8962
8963 2002-04-21 Jan-Oliver Wagner <[email protected]>
8964
8965 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
8966
8967 * Thuban/UI/tree.py (update_tree): added added map extent
8968
8969 * Thuban/UI/mainwindow.py (_method_command): extended by parameter
8970 icon; added map_full_extend as tool
8971
8972 2002-04-19 Jan-Oliver Wagner <[email protected]>
8973
8974 * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
8975 saving _new_ sessions
8976
8977 * Thuban/Model/session.py (create_empty_session): new session
8978 don't have a filename (set to None)
8979
8980 * Thuban/UI/tree.py (update_tree): added filename and modified flag
8981
8982 * Thuban/Model/load.py (ProcessSession): convert projection
8983 parameters from unicode to regular string
8984
8985 * Data/iceland_sample.session: Added UTM Zone 26 projection.
8986
8987 2002-04-11 Bernhard Herzog <[email protected]>
8988
8989 * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
8990 extensions/shapelib/dbfopen.c: Update to the versions of shapelib
8991 1.2.9
8992
8993 * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
8994 the pyshapelib directoy into the list of include dirs, so that
8995 pyshapelib_api.h can be found.
8996
8997 * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
8998 holds the pyshapelib C-API
8999 (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
9000 pyshapelib_api to access the shapelib functions.
9001 (initwxproj): Import the c_api from the shapelib module and
9002 initialize pyshapelib_api.
9003
9004 2002-04-04 Bernhard Herzog <[email protected]>
9005
9006 * setup.py (thuban_bdist_rpm.initialize_options): Use
9007 initialize_options to create the scripts for the rpm.
9008
9009 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
9010
9011 2002-04-03 Bernhard Herzog <[email protected]>
9012
9013 * setup.py: Increment version to 0.1.1
9014
9015 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
9016 Layer" and "Remove Layer" commands from the layer menu to the map
9017 menu
9018
9019 2002-02-15 Bernhard Herzog <[email protected]>
9020
9021 * Thuban/Model/layer.py (Layer.Shape): list append only takes one
9022 argument (python <= 1.5.2 erroneously accepted multiuple
9023 arguments)
9024
9025 2002-02-04 Bernhard Herzog <[email protected]>
9026
9027 * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
9028 RecordGrid in the identifyview.
9029 (IdentifyView.__init__): Use IdentifyGridCtrl instead of
9030 IdentifyListCtrl. The grid allows editing of the values.
9031
9032 * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
9033 implementing a grid for a single row of a thuban table.
9034
9035 * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
9036 layers by default. Easier to use than the previous default of only
9037 searching through the select layer which meant that if no layer
9038 was selected, you couldn't select a shape.
9039
9040 * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
9041
9042 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
9043 stroke_width attribute
9044
9045 * Thuban/Model/save.py (save_session): Write the new stroke_width
9046 attribute
9047
9048 * Thuban/Model/load.py (ProcessSession.startElement): Read the
9049 stroke_width attribute
9050
9051 * Thuban/Model/layer.py (Layer.__init__): New parameter and
9052 instance variable stroke_width
9053 (Layer.SetStrokeWidth): Set the stroke_width.
9054
9055 2002-02-01 Bernhard Herzog <[email protected]>
9056
9057 * extensions/thuban/wxproj.cpp (project_points): Fix two
9058 off-by-one errors in the last loop that joins the various parts
9059 together.
9060
9061 2002-01-14 Bernhard Herzog <[email protected]>
9062
9063 * setup.py (data_dist.make_distribution): Fix some typos
9064
9065 2001-09-18 Bernhard Herzog <[email protected]>
9066
9067 * README: Slight tweaking in preparation for the 0.1 release
9068
9069 * setup.cfg: Add section for sdist to create both tgz and zip
9070 archives
9071
9072 * setup.py: increase version number to 0.1
9073 (data_dist): New command class for data distribution
9074
9075 2001-09-14 Bernhard Herzog <[email protected]>
9076
9077 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
9078 Handle the case of no layer (i.e. layer is None) properly.
9079
9080 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
9081 Set the initial selection of the combo boxes to reflect the
9082 projection we're starting with in a way that works on windows,
9083 too.
9084
9085 * Thuban/Lib/connector.py (Connector.print_connections): Print the
9086 puiblisher's ids in hex to make it easier to compare them to the
9087 standard repr of python methods
9088
9089 * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
9090 messages
9091
9092 2001-09-13 Bernhard Herzog <[email protected]>
9093
9094 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
9095 deselect the layer if no layer is selected
9096
9097 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
9098 idle time when there actually is something to draw. If there's
9099 nothing to draw simply clear the window
9100 (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
9101 (MapCanvas.SetMap): force a redraw in all cases because
9102 FitMapToWindow doesn't always do it.
9103 (MapCanvas.ZoomFactor): Add an optional parameter, center, to
9104 specify the point to move into the center of the window
9105 (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
9106 dragged, zoon in/out by a factor of 2
9107 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
9108 index, i.e. reversed drawing order) so that objects appearing to
9109 be in from of others are selected first. This is probably mostly
9110 relevant for point shapes where the symbols used may overlap
9111
9112 * Thuban/Model/session.py (create_empty_session): Unset the
9113 modified bit before returning it
9114
9115 * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
9116 create_empty_session session to create the new, empty session.
9117
9118 * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
9119 the tool bitmaps.
9120 (MainWindow.OnClose, MainWindow.save_modified_session): Separate
9121 the code that asks whether the session should be saved into the
9122 new method save_modified_session.
9123 (MainWindow.OpenSession, MainWindow.NewSession): Use the new
9124 method to save modified session here too.
9125
9126 2001-09-11 Bernhard Herzog <[email protected]>
9127
9128 * setup.py (InnoIconItem): fix typo
9129
9130 (thuban_bdist_inno.run):
9131 (bdist_inno.run): Move the decision not to create symlinks on
9132 non-nt platforms to thuban_bdist_inno and do it unconditinally
9133 since we never want to create the symlinks here
9134
9135 2001-09-10 Bernhard Herzog <[email protected]>
9136
9137 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
9138 identify view immediately
9139
9140 * Thuban/UI/controls.py: New file with two classes RecordListCtrl
9141 and SelectableRecordListCtrl that implement the code shared by the
9142 identify view and the label dialog
9143
9144 * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
9145 new class RecordListCtrl
9146
9147 * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
9148 return value of GetValue is None instead of using it as a boolean
9149 directly so that Zero numbers are handled properly.
9150 (LabelListCtrl): Derive from the new class
9151 SelectableRecordListCtrl
9152
9153 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
9154 (Proj4Dialog.dialogLayout): Make the window resizable and set the
9155 size of the text control explicitly to make the sizers work on
9156 both Windows and X.
9157
9158 2001-09-07 Bernhard Herzog <[email protected]>
9159
9160 * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
9161 that can limit the search to the currently selected layer.
9162 (MapCanvas.SelectShapeAt): Make sure that the currently selected
9163 layer stays selected even when no shape is found
9164 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
9165 height do nothing (avoids zero division errors)
9166
9167 2001-09-06 Bernhard Herzog <[email protected]>
9168
9169 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
9170 Correct the spelling of SessionTreeCtrl. dabbrev is too damn
9171 convenient :-)
9172 (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
9173 a new instvar layer_to_item to map layers to tree items
9174 (SessionTreeCtrl.layer_selected): Select the appropriate tree item
9175 to match the current selection in the interactor
9176
9177 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
9178 (Interactor.HasSelectedLayer): New methods to query the current
9179 selection
9180
9181 * Thuban/UI/mainwindow.py (MainWindow.current_layer):
9182 (MainWindow.has_selected_layer): Simply call the appropriate
9183 interactor method
9184
9185 * Thuban/UI/mainwindow.py (MainWindow.__init__):
9186 (MainWindow.LayerShowTable):
9187 (MainWindow.identify_view_on_demand): Store the interactor in an
9188 instvar and use that reference instead of going through main.app
9189
9190 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
9191 * Thuban/UI/application.py (ThubanApplication.OnInit):
9192 * Thuban/UI/main.py (main): Create the session tree view in main
9193 with the new mainwindow method ShowSessionTree and not directly
9194 the application's OnInit method
9195
9196 * Thuban/UI/tree.py (myTreeCtrlPanel):
9197 (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
9198 TreeCtrl isntead of a panel. This affects most method since we now
9199 refer to self instead of self.tree
9200 (SessionTreeView): New class implementing a non-modal dialog
9201 showing the session tree.
9202
9203 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
9204 layer to the tableview dialog.
9205
9206 * Thuban/UI/tableview.py: Add some doc-strings
9207 (TableGrid):
9208 (TableGrid.OnRangeSelect):
9209 (TableGrid.OnSelectCell):
9210 (TableFrame.__init__):
9211 (TableFrame.row_selected):
9212 Selecting rows in the grid view now updates the selected shapes
9213 through the TableFrame. To achieve this we derive TableGrid from
9214 Publisher and introduce the message type ROW_SELECTED which the
9215 TableFrame subscribes to and which is issued by OnRangeSelect and
9216 OnSelectCell
9217
9218 (DataTable.SelectRow): Removed because it's no longer needed in
9219 the row/shape selection scheme
9220
9221 * Thuban/UI/dialogs.py: New file implementing common classes for
9222 dialogs
9223
9224 * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
9225 the SELECTED_SHAPE message anymore. This is now handled by the
9226 parent.
9227 (TableGrid.select_shape): Only update the selection if the shape
9228 is not None.
9229 (TableFrame): Inherit from the new NonModalDialog class.
9230 (TableFrame.__init__, TableFrame.select_shape): Handle the
9231 SELECT_SHAPE message.
9232 (TableFrame.OnClose): Extend the inherited method to unsubscribe
9233 SELECT_SHAPE
9234
9235 * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
9236 (MainWindow.add_dialog):
9237 (MainWindow.dialog_open):
9238 (MainWindow.remove_dialog):
9239 (MainWindow.get_open_dialog): New methods to maintain a dictionary
9240 of opened non-modal dialogs.
9241
9242 (MainWindow.__init__): Initialize the new non-modal dictionary
9243 management code
9244 (MainWindow.LayerShowTable): maintain separate dialogs for each
9245 table using the non-modal dialog management code to only open a
9246 view once for each table.
9247
9248 (MainWindow.IdentifyTool):
9249 (MainWindow.__init__):
9250 (MainWindow.identify_view_on_demand): Don't open the identify view
9251 in IdentifyTool anymore. This will be done automatically by the
9252 new method identify_view_on_demand which handles the
9253 SELECTED_SHAPE message so that the identify view will be opened on
9254 demand
9255
9256 * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
9257 the interactor argument. The SELECTED_SHAPE message is now handled
9258 by the parent.
9259 (IdentifyView.__init__): Add the interactor argument so that we
9260 can handle the SELECTED_SHAPE message here
9261 (IdentifyView.selected_shape): New method to handle the
9262 SELECTED_SHAPE messages
9263
9264 * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
9265 NonModalDialog class
9266 (IdentifyView.OnClose): Extend the inherited version to
9267 unsubscribe SELECT_SHAPE
9268
9269 * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
9270
9271 2001-09-05 Bernhard Herzog <[email protected]>
9272
9273 * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
9274
9275 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
9276 interactor to pass through to the MapCanvas
9277
9278 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
9279 argument to the MainWindow constructor to get rid of the ugly hack
9280 that made main.app available early just so that the mapcanvas
9281 could access the interactor object.
9282
9283 2001-09-04 Bernhard Herzog <[email protected]>
9284
9285 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
9286 that runs a modal message box
9287 (MainWindow.OnClose): Use the new method
9288 (MainWindow.RemoveLayer): Just do nothing in case no layer is
9289 selected. The command should be grayed out anyway, so there's no
9290 need to pop up a message box.
9291 (MainWindow.AddLayer): Pop up a message box with an error message
9292 if the shape file can't be opened
9293
9294 * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
9295 immediately. This will cause an exception in case the file can't
9296 be opened and we can display an appropriate message.
9297
9298 * MANIFEST.in: Add extensions/pyprojection/LICENSE
9299
9300 * setup.py (thuban_bdist_rpm): New class implementing a Thuban
9301 specific bdist_rpm command.
9302
9303 * Thuban/UI/main.py: Catch ImportError exceptions when importing
9304 the locale module because it may not be available on some
9305 installations.
9306
9307 * extensions/pyprojection/LICENSE: Copy of the license text in
9308 Projection.i. Having it in a separate file makes it easier to
9309 refer to license text in e.g. RPMs
9310
9311 2001-09-03 Bernhard Herzog <[email protected]>
9312
9313 * setup.py: use wx-config instead of wxgtk-config because it's
9314 more generic
9315
9316 * setup.py (ThubanInstall.get_outputs): Add the symlink in
9317 <prefix>/bin to the outputs
9318 (ThubanInstall.link_file): New method to link files. We need this
9319 because the standard copy_files refuses to link non-existing
9320 files.
9321 (ThubanInstall.run): Remove the leading install root from the
9322 script filename if an install root was specified and use the new
9323 link_file method
9324
9325 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
9326 the window when the first layer is added to the map.
9327
9328 * setup.py (ThubanInstall.run): Honor the build root (self.root)
9329 when linking thuban.py to <prefix>/bin
9330
9331 2001-08-31 Bernhard Herzog <[email protected]>
9332
9333 * setup.py: In the setup call, the install parameters shouldn't
9334 have trailing slashes because distutils on non-posix platforms
9335 doesn't like that. The same applies to other directories like
9336 "Resources/Bitmaps"
9337
9338 In the configuration section for nt, move the wxWindows directory
9339 optins into the part clearly marked as editable.
9340
9341 (InstallLocal.initialize_options):
9342 (InstallLocal.user_options): remove the currently unused debug
9343 flag
9344 (thuban_build_py.find_all_modules): Add this method so that it
9345 works for our case of having packages and modules in one
9346 distribution as well.
9347 (ThubanInstall.initialize_options):
9348 (ThubanInstall.finalize_options):
9349 (ThubanInstall.user_options):
9350 (ThubanInstall.boolean_options): Add new options, do-symlink and
9351 extra files. Since these are the first ThubanInstall specific
9352 options, override user_options and boolean_options
9353 (ThubanInstall.run): Honor the new do-symlink and extra-files
9354 options.
9355 (ThubanInstall.get_outputs): Add to override the base-class's
9356 version and add the extra-files to the outputs
9357 (bdist_inno): New class for windows distributions with Inno Setup
9358 (InnoIconItem): Helper class for bdist_inno
9359 (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
9360 this together with the appropriate parameters, to the setup call.
9361
9362 * setup.cfg (bdist_inno): added new section for the inno setup
9363 installer
9364
9365 * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
9366 changing_selection to avoid recursive selection events when
9367 modifying the selection in response to a selection event.
9368 (myTreeCtrlPanel.normalize_selection): Set the new inst var when
9369 changing the tree's selection.
9370 (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
9371 we're not being called indirectly from normalize_selection.
9372
9373 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
9374 event.Check only if the command is actuall checkable.
9375 (MainWindow.__init__): Call the toolbar's Realize method to make
9376 sure that the items are actually shown
9377
9378 2001-08-28 Bernhard Herzog <[email protected]>
9379
9380 * setup.py: Fix some doc strings
9381
9382 * ChangeLog: started
9383

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26