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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2138 - (show annotations)
Thu Mar 25 05:31:38 2004 UTC (20 years, 11 months ago) by joey
Original Path: trunk/thuban/ChangeLog
File size: 362314 byte(s)
Missing update for the ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26