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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2105 - (show annotations)
Fri Mar 12 12:19:31 2004 UTC (20 years, 11 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 358287 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26