/[thuban]/branches/greater-ms3/thuban/ChangeLog
ViewVC logotype

Contents of /branches/greater-ms3/thuban/ChangeLog

Parent Directory Parent Directory | Revision Log Revision Log


Revision 811 - (show annotations)
Mon May 5 13:09:26 2003 UTC (21 years, 10 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 117501 byte(s)
update ChangeLog

1 2003-05-05 Bernhard Herzog <[email protected]>
2
3 * extensions/thuban/wxproj.cpp: Fix some of the comments.
4 (project_point): If a map projection but no layer projection is
5 given, convert degrees to radians before applying the map
6 projection.
7
8 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
9 (TableGrid.allow_messages): New methods to make it possible to
10 inhibit message sending.
11 (TableGrid.issue): Only send the message if not inhibited.
12 (LayerTableGrid.select_shape): Use the new methods to make sure
13 that no ROW_SELECTED message is sent while we're updating the
14 selected rows to match the selected shapes.
15
16 2003-05-02 Jan-Oliver Wagner <[email protected]>
17
18 Implementation of MemoryTable.
19
20 * Thuban/Model/table.py (MemoryTable): New. Quite simple table
21 implementation that operates on a list of tuples. All of the data
22 are kept in the memory.
23
24 * test/test_table.py (MemoryTableTest): New.
25
26 * test/test_transientdb.py (SimpleTable): Removed.
27 (TestTransientTable.test_transient_joined_table,
28 (TestTransientTable.test_transient_table_read_twice): Replaced
29 SimpleTable by MemoryTable.
30
31 2003-04-30 Jonathan Coles <[email protected]>
32
33 * Data/iceland_sample.thuban: Now contains correct projections
34 for each of the layers.
35
36 * Resources/Projections/defaults.proj: Geographic projection
37 contains unit conversion parameter.
38
39 2003-04-30 Jonathan Coles <[email protected]>
40
41 The most important part of this putback is the projection changes.
42 It should now be possible to specify the projection that a layer
43 is in and then specify a different projection for the map. The
44 projection dialog has an extra parameter for a geographic projection
45 which lets the user select if the input is in degrees or radians.
46
47 * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
48 to say that the parameter is a tuple of unprojected
49 points (which is what the callers to this method were assuming).
50 Also, since the points are unprojected we need to projected them.
51
52 * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
53 LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
54 groups are selected, move the layer up/down. Fixes RTbug #1833.
55
56 * Thuban/UI/mainwindow.py: Move menu item map_rename up.
57
58 * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
59 parameter in call to SetClientData.
60 (GeoPanel): Add support for selecting the units that the
61 source data is in (Radians or Degrees).
62
63 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
64 the rendering loop by reducing the number of if's, removing the
65 unnecessary try/except block, and checking if the old group
66 is the same as the new one (which happens a lot if there is
67 no classification, or lots of shapes are in the same group).
68
69 * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
70 around the redraw routine to try to catch problems that the user
71 may create by selecting invalid projections for the data set and
72 map. Clears the display if there are any problems and prints the
73 error.
74 (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
75 rectangle.
76
77 * extensions/thuban/wxproj.cpp (project_point): First invert the
78 supplied point (which should be in projected coordinates) using
79 the layer's projection and then project the point using the
80 map's projection.
81 (project_points): Use project_point() to project each point.
82
83 2003-04-30 Jan-Oliver Wagner <[email protected]>
84
85 * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
86 don't set the Classification to None if the classfication field
87 is None (ie only a DEFAULT).
88
89 2003-04-30 Bernhard Herzog <[email protected]>
90
91 * Thuban/UI/view.py: Fix some typos.
92
93 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
94 not pop up the dialog if the selection becomes empty (this could
95 happen if e.g. a new selection is opened while the identify tool
96 is active and dialog had been closed)
97
98 2003-04-30 Bernhard Herzog <[email protected]>
99
100 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
101 instance variable read_record_last_result
102 (TransientTableBase.read_record): Make sure reading the same
103 record twice works. The implementation uses the new instance
104 variable read_record_last_result
105
106 * test/test_transientdb.py
107 (TestTransientTable.test_transient_table_read_twice): New test
108 case for the above bug-fix.
109
110 2003-04-29 Jonathan Coles <[email protected]>
111
112 * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
113
114 * Thuban/UI/classgen.py: Remove all uses of Str2Num.
115
116 * Thuban/UI/classifier.py: Remove all uses of Str2Num.
117 (ClassTable.SetValueAsCustom): Rename keyword argument in
118 ClassGroup* constructors to match argument name.
119
120 2003-04-29 Bernhard Herzog <[email protected]>
121
122 * Thuban/Model/session.py (Session.Destroy): Explicitly close the
123 transient DB if it exists to make sure it doesn't leave a journal
124 file in the temp directory.
125
126 * Thuban/Model/transientdb.py (TransientDatabase.close): Set
127 self.conn to None after closing the connection to make sure it's
128 not closed twice
129
130 2003-04-29 Jonathan Coles <[email protected]>
131
132 Add a visible parameter in the layer XML tag. The default value is
133 "true". If anything other than "false" is specified we also assume
134 "true". Addresses RTbug #1025.
135
136 * Doc/thuban.dtd: Add visible parameter to a layer.
137
138 * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
139 of visible from 1 to True.
140 (Layer.__init__): Change default value of visible from 1 to True.
141
142 * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
143 parameter.
144
145 * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
146 parameter.
147
148 * test/test_load.py: Add new test data contents_test_visible.
149 (LoadSessionTest.setUp): save test data.
150 (LoadSessionTest.testLayerVisibility): Test if the visible flag
151 is loaded correctly.
152
153 * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
154 for saving an invisible layer.
155
156 2003-04-29 Jonathan Coles <[email protected]>
157
158 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
159 legend dialog box and tell it to change its map to the one
160 supplied to SetMap(). Fixes RTbug #1770.
161
162 2003-04-29 Bernhard Herzog <[email protected]>
163
164 Next step of table implementation. Introduce a transient database
165 using SQLite that some of the data is copied to on demand. This
166 allows us to do joins and other operations that require an index
167 for good performance with reasonable efficiency. Thuban now needs
168 SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
169 haven't tested that.
170
171 * Thuban/Model/transientdb.py: New. Transient database
172 implementation.
173
174 * test/test_transientdb.py: New. Tests for the transient DB
175 classes.
176
177 * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
178 classes to help automatically remove temporary files and
179 directories.
180 (Session.__init__): New instance variables temp_dir for the
181 temporary directory and transient_db for the SQLite database
182 (Session.temp_directory): New. Create a temporary directory if not
183 yet done and return its name. Use AutoRemoveDir to have it
184 automatically deleted
185 (Session.TransientDB): Instantiate the transient database if not
186 done yet and return it.
187
188 * Thuban/Model/data.py (ShapefileStore.__init__): Use an
189 AutoTransientTable so that data is copied to the transient DB on
190 demand.
191 (SimpleStore): New class that simply combines a table and a
192 shapefile
193
194 * Thuban/Model/table.py (Table, DBFTable): Rename Table into
195 DBFTable and update its doc-string to reflect the fact that this
196 is only the table interface to a DBF file. Table is now an alias
197 for DBFTable for temporary backwards compatibility.
198
199 * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
200 the last reference to the session goes away so that the temporary
201 files are removed properly.
202
203 * test/test_load.py (LoadSessionTest.tearDown): Remove the
204 reference to the session to make sure the temporary files are
205 removed.
206
207 2003-04-29 Bernhard Herzog <[email protected]>
208
209 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
210 the __parser instance variable into a normal local variable in
211 read. It's only used there and read will never be called more than
212 once. Plus it introduces a reference cycle that keeps can keep the
213 session object alive for a long time.
214
215 2003-04-29 Jonathan Coles <[email protected]>
216
217 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
218 Projection an immutable item. Fixes RTbug #1825.
219 (Projection.__init__): Initialize instance variables here.
220 (ProjFile.Replace): New. Replace the given projection object with
221 the new projection object. This solves the problem of needing the
222 mutator Projection.SetProjection() in the ProjFrame class and
223 allows a projection to change parameters without changing its
224 location in the file.
225
226 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
227 be of type wxSAVE and should verify overwriting a file.
228
229 * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
230 ProjFile.Replace() method instead of the mutator
231 Projection.SetProjection(). Also requires that we reassign the
232 client data to the new projection.
233
234 * test/test_proj.py (TestProjection.test): Test GetName() and
235 GetAllParameters()
236 (TestProjFile.test): Remove tests for Set*() methods. Add tests
237 for Replace().
238
239 2003-04-25 Jonathan Coles <[email protected]>
240
241 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
242 to save the name of the projection.
243
244 * test/test_save.py (SaveSessionTest.testLayerProjection): New
245 test to verify layer projections are saved correctly.
246
247 2003-04-25 Jonathan Coles <[email protected]>
248
249 * Thuban/Model/proj.py (Projection.SetName): Set the name
250 to "Unknown" if name is None.
251 (Projection.SetAllParameters): New. Set the projection's
252 parameter list to the one supplied.
253 (Projection.SetProjection): New. Set the projection's
254 properties to those of the supplied Projection.
255
256 * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
257 the dialog title to include the map's title.
258 (MainWindow.LayerProjection): Set the dialog title to include
259 the layer's title.
260
261 * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
262 error dialogs into a single method call.
263 (ProjFrame.__VerifyButtons): Add more states to check.
264 (ProjFrame.__GetProjection): Return the current state of an
265 edited projection or None.
266 (ProjFrame.__FillAvailList): Remove checks for states that
267 shouldn't exist.
268 (ProjFrame._OnNew): Clear all selected items and supply
269 a projection panel if necessary.
270
271 * test/test_proj.py (TestProjFile.test): Add tests for
272 ProjFile.SetAllParameters, ProjFile.SetProjection,
273 ProjFile.SetName.
274
275 2003-04-25 Jonathan Coles <[email protected]>
276
277 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
278 takes an optional argument to select the current projection.
279 This does not guarantee that the item is visible due to
280 limited wxWindows functionality. Fixes RTBug #1821.
281
282 2003-04-25 Jonathan Coles <[email protected]>
283
284 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
285 the projection name and use it when constructing the Projection
286 object.
287
288 * Thuban/Model/proj.py (Projection.__init__): Change the default
289 value for 'name' to None and then test if name is equal to None
290 in the body of the constructor. This way the caller doesn't have to
291 know what the default value should be. Namely, useful in load.py
292 where we have to pick a default value if the 'name' parameter
293 doesn't exist in the XML file.
294
295 * test/test_load.py (LoadSessionTest.testLayerProjection): New.
296 Tests a file where a layer has a projection.
297
298 2003-04-25 Jonathan Coles <[email protected]>
299
300 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
301 tree for projection information.
302
303 * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
304 XMLReader.GetFileName.
305 (SessionLoader): Added support for loading projection tags that
306 appear inside a layer.
307
308 * Thuban/Model/proj.py (ProjFile): Document the class. Move
309 back to using a list because the order of the projections in
310 the file is important to maintain. Fixes RTbug #1817.
311
312 * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
313 to ProjFile.GetFilename.
314
315 * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
316 information.
317
318 * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
319 ProjFrame._OnSaveAs. Removed old dead code from previous
320 implementation.
321 (ProjFrame._OnExport): Add support for exporting more than one
322 projection to a single file.
323 (ProjFrame.__FillAvailList): use string formatting (% operator)
324 to build strings that are (partly) translated. Fixes RTbug #1818.
325
326 * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
327 class.
328
329 2003-04-24 Bernhard Herzog <[email protected]>
330
331 * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
332
333 * po/fr.po: New. French translation by Daniel Calvelo Aros
334
335 * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
336 empty strings.
337
338 2003-04-24 Jonathan Coles <[email protected]>
339
340 * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
341 implement the interface that the ProjFrame dialog expects.
342
343 * Thuban/Model/proj.py (Projection.SetName): New. Allows the
344 name of the projection to be changed.
345 (ProjFile): Use a dictionary instead of a list so that removing
346 projections is easier and we are sure about uniqueness.
347 (ProjFile.Remove): Remove the given projection object.
348
349 * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
350 Return a list with only one projection file instead of searching for
351 any projection file. This simplifies many things if the user can
352 only have one system file and one user file.
353
354 * Thuban/UI/classgen.py: Change all references to
355 genCombo to genChoice.
356
357 * Thuban/UI/mainwindow.py: Add a Projection option under the
358 layer menu.
359 (MainWindow.LayerProjection): New. Open up a projection window
360 for a layer.
361
362 * Thuban/UI/projdialog.py: Large changes to how the dialog is
363 laid out. Use three panels instead of one. One for the list of
364 projections, one for the edit controls, and one for the buttons.
365 Fixed resizing problems so that the dialog resizes correctly
366 when the projection panel changes. Added import/export, save, and
367 new buttons/functionality.
368
369 2003-04-24 Bernhard Herzog <[email protected]>
370
371 First step towards table management. Introduce a simple data
372 abstraction so that we replace the data a layer uses more easily
373 in the next step.
374
375 * Thuban/Model/data.py: New file with a simple data abstraction
376 that bundles shapefile and dbffile into one object.
377
378 * Thuban/Model/session.py (Session.OpenShapefile): New method to
379 open shapefiles and return a shape store object
380
381 * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
382 object instead of a shapefile filename. This introduces a new
383 instance variable store holding the datastore. For intermediate
384 backwards compatibility keep the old instance variables.
385 (open_shapefile): Removed. No longer needed with the shape store.
386 (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
387 get the shape store used by a layer.
388 (Layer.Destroy): No need to explicitly destroy the shapefile or
389 table anymore.
390
391 * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
392 (MainWindow.AddLayer): Use the session's OpenShapefile method to
393 open shapefiles
394
395 * Thuban/Model/load.py (ProcessSession.start_layer): Use the
396 session's OpenShapefile method to open shapefiles
397
398 * test/test_classification.py
399 (TestClassification.test_classification): Use the session's
400 OpenShapefile method to open shapefiles and build the filename in
401 a more platform independed way
402
403 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
404 Implement to have a session to use in the tests
405 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
406 (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
407 session's OpenShapefile method to open shapefiles
408 (TestLayerLegend.setUp): Instantiate a session so that we can use
409 it to open shapefiles.
410 (TestLayerLegend.tearDown): Make sure that all references to
411 layers and session are removed otherwise we may get a resource
412 leak
413
414 * test/test_map.py (TestMapAddLayer.test_add_layer)
415 (TestMapWithContents.setUp): Instantiate a session so that we can
416 use it to open shapefiles.
417 (TestMapWithContents.tearDown): Make sure that all references to
418 layers, maps and sessions are removed otherwise we may get a
419 resource leak
420 ("__main__"): use support.run_tests() so that more info about
421 uncollected garbage is printed
422
423 * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
424 session's OpenShapefile method to open shapefiles
425 ("__main__"): use support.run_tests() so that more info about
426 uncollected garbage is printed
427
428 * test/test_selection.py (TestSelection.tearDown): Make sure that
429 all references to the session and the selection are removed
430 otherwise we may get a resource leak
431 (TestSelection.get_layer): Instantiate a session so that we can
432 use it to open shapefiles.
433 ("__main__"): use support.run_tests() so that more info about
434 uncollected garbage is printed
435
436 * test/test_session.py (TestSessionBase.tearDown)
437 (TestSessionWithContent.tearDown): Make sure that all references
438 to the session and layers are removed otherwise we may get a
439 resource leak
440 (TestSessionWithContent.setUp): Use the session's OpenShapefile
441 method to open shapefiles
442
443 2003-04-24 Jonathan Coles <[email protected]>
444
445 * Thuban/Model/load.py (XMLReader.read): Should have been checking
446 if the file_or_filename object had the 'read' attribute.
447
448 2003-04-23 Jonathan Coles <[email protected]>
449
450 * Thuban/Model/resource.py: Fixes RTbug #1813.
451 (ReadProjFile): Add documentation about which exceptions are raised.
452 Always pass the exceptions up to the caller.
453 (GetProjFiles): If the directory can't be read return an empty list.
454 If any of the proj files can't be read skip that file and go
455 on to the next one.
456
457 * test/test_proj.py: Added test cases to handle nonexistent files,
458 unreadable files, and files that don't parse correctly.
459
460 2003-04-23 Jonathan Coles <[email protected]>
461
462 Projection dialog. Allows the user to select from a list
463 of projection templates and optionally edit them and save new ones.
464
465 * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
466 (ProjPanel): Base class for projection specific panels.
467 (TMPanel): Projection panel for Transverse Mercartor.
468 (UTMPanel): Projection panel for Universal Transverse Mercartor.
469 (LCCPanel): Projection panel for Lambert Conic Conformal.
470 (GeoPanel): Projetion panel for Geographic Projection.
471
472 2003-04-23 Jonathan Coles <[email protected]>
473
474 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
475 promote symmetry. There now exists XMLReader and XMLWriter.
476 (XMLReader.read): New. Call to read the given file descriptor or
477 filename.
478 (XMLReader.close): New. Make sure the file is closed.
479 (XMLReader.GetFileName): New. Return just the file name that is being
480 read from.
481 (XMLReader.GetDirectory): New. Return just the directory of the file
482 that is being read.
483 (XMLReader.AddDispatchers): New. Take a dictionary which contains
484 the names of functions to call as the XML tree is parsed.
485 (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
486 (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
487 (SessionLoader): Removed class variables start_dispatcher and
488 end_dispatcher since this functionality is now part of a class
489 instance. Fixes RTbug #1808.
490 (SessionLoader.__init__): Add dispatcher functions.
491 (load_xmlfile): Code was moved into the XMLReader.read().
492 (load_session): Use modified SessionLoader.
493
494 * Thuban/Model/map.py (Map.GetProjection): New. Returns the
495 map's projection.
496
497 * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
498 GetAllParameters.
499 (Projection.GetParameter): Returns the value for the given parameter.
500
501 * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
502 (GetProjFiles): Renamed from GetProjections. Now returns a list
503 of ProjFile objects.
504 (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
505 a list of ProjFile objects whose files are not user defined.
506 (GetUserProjFiles): Renamed from GetUserProjections. Returns a
507 list of ProjFile objects whose files are user defined.
508 (ProjFileReader): Extend new XMLReader.
509
510 * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
511 promote symmetry.
512
513 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
514 control instead of a wxComboBox. wxChoice controls do not generate
515 events as the uses highlights possible choices which fixes problems
516 with resizing the dialog when the use selects an option.
517
518 * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
519 control instead of a wxComboBox.
520
521 * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
522 dialog.
523
524 * test/test_proj.py (TestProjection.test): New tests for GetParameter
525 method.
526
527 2003-04-22 Bernhard Herzog <[email protected]>
528
529 * Thuban/UI/mainwindow.py: Remove some unused imports and global
530 constants
531
532 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
533 (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
534
535 2003-04-17 Bernhard Herzog <[email protected]>
536
537 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
538 (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
539 anymore.
540 (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
541 (Layer.ShapeType, Layer.Shape): No need to call
542 self.open_shapefile since it's always called in __init__
543
544 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
545 In wxPython 2.4 there's no need to extend MainLoop anymore since
546 wxPython itself makes sure OnExit is called.
547
548 2003-04-16 Jonathan Coles <[email protected]>
549
550 Initial putback of projection management code. Includes new
551 classes to read and write projection files. The current load
552 and save classes were abstracted a bit so they could be reused.
553 The Projection class was extended to provide new methods and
554 have a name.
555
556 * Thuban/Model/load.py (XMLProcessor): New. Contains all the
557 general XML reading methods that were part of ProcessSession.
558
559 * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
560 name.
561 (ProjFile): New. Represents a file that contains projection
562 information.
563
564 * Thuban/Model/resource.py: New. Contains general utilities
565 for read and writing projection files.
566
567 * Thuban/Model/save.py (XMLSaver): New. Contains all the
568 general XML writing methods that were part of SessionSaver.
569 (SessionSaver): Renamed from Saver.
570
571 * test/test_proj.py: New test cases for the projection
572 file read and write functions.
573
574 2003-04-16 Jonathan Coles <[email protected]>
575
576 * Thuban/Model/classification.py: Use repr() around values
577 in the ClassGroup*.__repr__() methods so it is clearer when
578 a value is a string and when it is a number.
579
580 * test/test_load.py: Rework the classification test to test
581 that we can load old files.
582 (testLabels): Test a file where the groups have labels.
583
584 2003-04-16 Bernhard Herzog <[email protected]>
585
586 Safer implementation of the performance enhancements of the
587 low-level renderer:
588
589 * extensions/thuban/wxproj.cpp (extract_projection)
590 (extract_pointer): Rename extract_projection to extract_pointer
591 and redefine its purpose to return the pointer stored in a CObject
592 returned by the object's cobject method. Update all callers.
593 (s_draw_info, free_draw_info, draw_polygon_init): Implement the
594 handling of these low-level parameters so that each s_draw_info
595 instance is handled as a CObject at python level that also
596 contains real references to the actual python objects which
597 contain the values in the struct. Add free_draw_info as the
598 destructor.
599 (draw_polygon_shape): Add the py_draw_info parameter which must a
600 cobject containing an s_draw_info pointer.
601
602 * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
603 method to instantiat the low-level render parameter
604 (MapRenderer.draw_shape_layer): Use the new method. Remove some
605 commented out code.
606 (MapRenderer.draw_polygon_shape): Make the first parameter not the
607 layer but the low-level render parameter
608 (ScreenRenderer.draw_shape_layer): Use the low-level render
609 parameter.
610
611 2003-04-15 Jonathan Coles <[email protected]>
612
613 * Thuban/Model/classification.py: Implemented __repr__ for
614 the ClassGroup* classes to make debugging a bit easier.
615 (ClassGroup.SetLabel): Check that the string is an instance
616 of StringTypes not StringType. Accounts for Unicode strings.
617
618 * Thuban/Model/color.py: Implemented __repr__ to make
619 debugging a bit easier.
620
621 * Thuban/Model/save.py (Saver.write_classification): Need to
622 save the group label.
623
624 * test/test_load.py (testClassification): New. Loads the
625 iceland_sample_test.thuban file and checks if it was loaded
626 correctly.
627
628 2003-04-15 Jonathan Coles <[email protected]>
629
630 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
631 to improve rendering performance by initializing the variables
632 that are not change each time draw_polygon_shape() is called.
633 The values are stored in a global struct draw_info.
634 (draw_polygon_shape): Removed initialization code that is
635 now in draw_polygon_init().
636
637 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
638 drawing initialization call to draw_polygon_init()
639 (MapRenderer.draw_polygon_shape): Use new signature of
640 draw_polygon_shape.
641
642 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
643 weirdness by setting the range to (1, maxint).
644
645 * Thuban/Model/classification.py (ClassGroupProperties): Make
646 instance variables private and optimize comparison operator
647 by first checking if the color references are the same.
648 (ClassGroupSingleton): Make instance variables private.
649 (ClassGroupRange): Make instance variables private.
650
651 * HOWTO-Release: Filled in missing steps for releasing packages.
652
653 2003-04-15 Bernhard Herzog <[email protected]>
654
655 First stab at internationalized messages:
656
657 * Thuban/__init__.py (_): Implement the translation function for
658 real using the python gettext module.
659
660 * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
661 translate empty strings.
662
663 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
664 Add a missing space to a warning message
665
666 * po/README: New. Notes about the management of the translation
667 files.
668
669 * po/Makefile: New. Makefile to help manage the translation files.
670
671 * po/es.po: New. Spanish translation by Daniel Calvelo Aros
672
673 * MANIFEST.in: Include the *.mo files in Resources/Locale and the
674 translations and support files in po/
675
676 * setup.py (data_files): Add the *.mo files to the data_files too
677
678 * README: Add note about the translations when building from CVS
679
680 2003-04-14 Jonathan Coles <[email protected]>
681
682 * Thuban/UI/dock.py: Fixes some window resizing problems most
683 noticable under windows. Always assume the button bitmaps will
684 be there. Code clean up.
685 (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
686 images for the dock/undock button to the same images.
687 Work around for RTbug #1801.
688
689 * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
690 be allowed to grow within the sizer. Fixes a bug under Windows
691 where the toolbar wasn't being drawn.
692
693 2003-04-14 Frank Koormann <[email protected]>
694
695 * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
696 Updated design to try to make the button functionality more
697 transparent.
698
699 2003-04-14 Jonathan Coles <[email protected]>
700
701 * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
702 finalize the intialization of the panel.
703
704 * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
705 creation of the panel. Should be the last thing called in the
706 initializer of a subclass.
707
708 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
709 set the current selections in the combo boxes. This is needed
710 under Windows.
711
712 * Thuban/UI/classifier.py (Classifier.__init__): Add a top
713 level panel to the dialog so that the background colors are
714 consistent under Windows.
715
716 2003-04-11 Jonathan Coles <[email protected]>
717
718 * Thuban/UI/classgen.py: Change color ramps to start at white
719 not black.
720
721 * Thuban/UI/legend.py: Enable/disable the legend buttons when
722 the legend changes. Fixes RTbug #1793.
723
724 * test/test_classification.py: Added test for copying of
725 classifications.
726
727 2003-04-11 Jonathan Coles <[email protected]>
728
729 * Thuban/UI/resource.py: New. Centralize the loading of resources
730 such as bitmaps.
731
732 * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
733 added images to the move buttons, added 'reverse' button.
734 (CustomRampPanel.__init__): Added images to the move buttons.
735 (GreyRamp): New. Generates a ramp from white to black.
736 (HotToColdRamp): New. Generates a ramp from cold to hot colors.
737
738 * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
739 ID_PROPERTY_*.
740 (Classifier.__init__): Minor changes to the layout.
741 (Classifier._OnTitleChanged): Listen for when the user edits the
742 title and update the dialog's title and the layer's title.
743
744 * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
745
746 * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
747 (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
748 if the layer's title changes.
749
750 * Thuban/UI/mainwindow.py: Added new menu item and associated code
751 to open a dialog to rename the map.
752 (MainWindow): Use new resource class to import bitmaps.
753
754 2003-04-11 Jonathan Coles <[email protected]>
755
756 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
757 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
758 Resources/Bitmaps/group_use_none.xpm,
759 Resources/Bitmaps/group_use_not.xpm,
760 Resources/Bitmaps/hide_layer.xpm,
761 Resources/Bitmaps/layer_properties.xpm,
762 Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
763 Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
764 New.
765
766 2003-04-10 Jonathan Coles <[email protected]>
767
768 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
769 Should pass group to ClassGroup constructor.
770
771 2003-04-10 Jonathan Coles <[email protected]>
772
773 * Thuban/Model/classification.py: (ClassGroup): Move all the common
774 methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
775 here. Implement SetVisible(), IsVisible().
776 (ClassGroup.__init__): Add group parameter which acts as a copy
777 constructor.
778
779 * Thuban/UI/classifier.py (ClassTable): Add a new column for the
780 "Visible" check boxes.
781 (Classifier): Rename the buttons and refactor the code to match
782 the new labels.
783
784 * Thuban/UI/legend.py: Classify button is now called "Properties".
785 Refactored the code to change variable names.
786 (LegendTree.__FillTreeLayer): Only list a group if it is visible.
787
788 * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
789 MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
790 renamed to MainWindow.LayerEditProperties.
791 (MainWindow.ToggleLegend): Don't include map name in legend title.
792 (MainWindow.SetMap): Added the map name to the window title.
793 (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
794 MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
795 Functionality is found in the layer properties dialog.
796
797 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
798 draw visible groups.
799
800 2003-04-09 Jonathan Coles <[email protected]>
801
802 * Thuban/UI/classgen.py: Modifications to allow simple
803 addition and selection of new color schemes.
804 (MonochromaticRamp): New. Generates a ramp between two colors.
805 (RedRamp): New. Generates a ramp of all red.
806 (GreenRamp): New. Generates a ramp of all green.
807 (BlueRamp): New. Generates a ramp of all blue.
808
809 2003-04-09 Jonathan Coles <[email protected]>
810
811 * Thuban/Model/classification.py (Classification.__deepcopy__):
812 Need to copy over field and fieldType attributes.
813
814 * Thuban/Model/table.py (Table.field_range): New. Retrive the
815 maximum and minimum values over the entire table for a given
816 field.
817 (Table.GetUniqueValues): New. Retrieve all the unique values
818 in the table for a given field.
819
820 * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
821 (GenUniquePanel): New. Controls to allow the user to select
822 which unique field values they would like in the classification.
823 (CustomRampPanel): Code that was in ClassGenDialog that allows
824 the user to select the properties for a custom ramp.
825 (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
826
827 * Thuban/UI/classifier.py: Removed a lot of debugging code.
828 (Classifier._SetClassification): Callback method so that the
829 class generator can set the classification in the grid.
830 (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
831 editing of a group properties class into a wxWindows control.
832
833 * Thuban/UI/dock.py: It was decided that if the user closes
834 a dockable window the window should simply hide itself. That
835 way if the user wants to show the dock again it appears in the
836 same place as it was when it was closed.
837 (DockableWindow.Destroy): Call renamed method OnDockDestroy().
838 (DockableWindow._OnButtonClose): Hide the window instead of
839 destroying it.
840 (DockableWindow._OnClose): Hide the window instead of
841 destroying it.
842
843 * Thuban/UI/legend.py (LegendTree): Use a private method to
844 consistently set the font and style of the text. Fixes RTbug #1786.
845
846 * Thuban/UI/mainwindow.py: Import just the Classifier class.
847
848 2003-04-07 Bernhard Herzog <[email protected]>
849
850 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
851 to the map module
852
853 2003-04-07 Bernhard Herzog <[email protected]>
854
855 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
856 favor of ToggleSessionTree
857 (MainWindow.ToggleSessionTree): New method to toggle visibility of
858 the session tree.
859 (MainWindow.SessionTreeShown): New method to return whether the
860 session tree is currently shown.
861 (MainWindow.ToggleLegend): New method to toggle visibility of the
862 legend
863 (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
864 LegendShown
865 (MainWindow.LegendShown): New method to return whether the legend
866 is currently shown.
867 (_method_command): Add checked parameter so we can define check
868 menu items
869 (_has_tree_window_shown, _has_legend_shown): Use the appropriate
870 mainwindow methods.
871 (show_session_tree, show_legend commands): Removed.
872 (toggle_session_tree, toggle_legend commands): New commands to
873 toggle the visibility of the dialogs
874
875 2003-04-07 Jonathan Coles <[email protected]>
876
877 * Thuban/UI/classgen.py: Fix Windows problem.
878
879 * Thuban/UI/dock.py: Fix Windows problem.
880
881 * Thuban/UI/mainwindow.py: Use False instead of false.
882 (MainWindow.ShowLegend): Remove unnecessary switch parameter.
883
884 2003-04-07 Jonathan Coles <[email protected]>
885
886 Since we now say that the order of the groups in a classification
887 matters, it makes sense to be able to manipulate that order. Most
888 of the changes to Thuban/Model/classification.py are to that end.
889
890 * Thuban/Model/classification.py (Classification.AppendGroup,
891 Classification.InsertGroup, Classification.ReplaceGroup,
892 Classification.RemoveGroup, Classification.GetGroup): Do as the
893 names imply.
894 (Classification.FindGroup): This was called GetGroup, but GetGroup
895 takes an index, while FindGroup takes a value.
896 (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
897 REFERENCE. Currently there is a cyclic reference between the layer
898 and its classification. If the classification doesn't need to know
899 its owning layer we can change this, since it may make sense to be
900 able to use the same classification with different layers.
901
902 * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
903
904 * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
905 not AddGroup()
906
907 * Thuban/UI/classifier.py: Now that we can depend on the order in
908 a Classification and have methods to manipulate that order we don't
909 need to use our own data structures in the grid. We can simply make
910 the grid/table access the information they need from a copy of
911 the classification object.
912 (Classifier._OnCloseBtn): Event handler for when the user clicks
913 'Close'. This is needed so if the user applies changes and then
914 continues to change the table the user has the option of discarding
915 the most recent changes and keeping what they applied.
916
917 * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
918 into the same group.
919
920 * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
921 with a really old version of proj, PJ_VERSION won't even be defined.
922 If it isn't defined then just compile so that the function always
923 returns Py_False.
924
925 * test/test_classification.py: Fix tests to use the renamed methods.
926 Still need to write tests for the new methods.
927
928 2003-04-04 Jonathan Coles <[email protected]>
929
930 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
931 call to SetSelection out of the method and before the call
932 to __SelectField in __init__. This prevents a recursion of events
933 when _OnFieldSelect is triggered by the user.
934
935 2003-04-04 Jonathan Coles <[email protected]>
936
937 * Thuban/Model/classification.py: Rename Color.None to
938 Color.Transparent.
939 (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
940 Don't bother copying the color, since Colors are immutable.
941
942 * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
943 Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
944 Thuban/UI/renderer.py, Thuban/UI/view.py:
945 Rename Color.None to Color.Transparent.
946
947 * test/test_classification.py, test/test_load.py: Rename Color.None
948 to Color.Transparent.
949
950 2003-04-04 Jonathan Coles <[email protected]>
951
952 * Thuban/Model/classification.py: Fix assert calls.
953 (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
954 Copy the color parameter rather than hold onto a reference.
955
956 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
957 the color object.
958 (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
959 are sure there exists only one refernce to Color.None in the system.
960 This allows us to use 'is' rather than the comparision functions.
961
962 * Thuban/Model/save.py: Fix assert calls.
963
964 * Thuban/UI/classifier.py: Fix assert calls.
965 (ClassGrid._OnCellDClick): Call up to the classifier to open the
966 dialog to edit the groups properties.
967 (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
968 correctly if a cell is resized.
969 (ClassTable.SetClassification): New. Changes the classification
970 that is in the table.
971 (ClassTable.__SetRow): Allow groups to be prepended.
972 (Classifier): New code for opening the EditProperties and
973 GenerateRanges dialogs.
974 (SelectPropertiesDialog.__GetColor): Only set the color in the
975 color dialog if the current color is not None.
976
977 * Thuban/UI/dock.py: Fix assert calls.
978
979 * Thuban/UI/legend.py: Fix assert calls.
980
981 * Thuban/UI/renderer.py: Fix assert calls.
982
983 * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
984 classifications.
985 (GenRangePanel): Panel specific to range generation.
986 (GenSingletonPanel): Panel specific to singleton generation.
987 (ClassGenerator): Class responsible for actually generating
988 the classification from the data gathered in the dialog box.
989 (PropertyRamp): Generates properties whose values range from
990 a starting property to an ending property.
991
992 2003-04-03 Bernhard Herzog <[email protected]>
993
994 * test/support.py (print_garbage_information): New function that
995 prints information about still connected messages and memory
996 leaks.
997 (run_suite): Removed.
998 (run_tests): New function for use as a replacement of
999 unittest.main in the test_* files. This one calls
1000 print_garbage_information at the end.
1001
1002 * test/runtests.py (main): Use support.print_garbage_information
1003
1004 * test/test_layer.py: Use support.run_tests instead of
1005 unittest.main so we get memory leak information
1006 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
1007 (TestLayer.test_point_layer, TestLayer.test_empty_layer)
1008 (TestLayerLegend.test_visibility): Call the layer's Destroy method
1009 to fix a memory leak.
1010
1011 * test/test_classification.py: Use support.run_tests instead of
1012 unittest.main so we get memory leak information
1013 (TestClassification.test_classification): Call the layer's Destroy
1014 method to fix a memory leak.
1015
1016 2003-04-02 Bernhard Herzog <[email protected]>
1017
1018 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
1019 Handle the reference counts of the return value and errors in
1020 PyArg_ParseTuple correctly.
1021
1022 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
1023 sure the filename is absolute to avoid problems when saving the
1024 session again
1025
1026 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
1027
1028 2003-04-01 Jonathan Coles <[email protected]>
1029
1030 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
1031 that there actually are points in the returned list of points
1032 before trying to index into the list. The list may be empty if
1033 the shape is a Null Shape.
1034
1035 2003-04-01 Bernhard Herzog <[email protected]>
1036
1037 * test/test_map.py: Don't use from <module> import *
1038
1039 2003-04-01 Jonathan Coles <[email protected]>
1040
1041 * Thuban/Model/session.py: Use LAYER_CHANGED instead of
1042 LAYER_LEGEND_CHANGED
1043
1044 * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
1045 self.Destroy() to close the window after yesterday's changes.
1046
1047 * test/test_map.py, test/test_session.py: Fix messages that
1048 are sent from maps and layers.
1049
1050 2003-03-31 Jonathan Coles <[email protected]>
1051
1052 * Thuban/UI/classifier.py: Commented out some debugging statements.
1053 (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
1054 RTbug #1769.
1055
1056 * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
1057 position (although position doesn't work yet under GTK).
1058 (DockableWindow.Destroy): New. Called when the window must be
1059 closed. Namely needed when the DockFrame closes and must close
1060 its children.
1061 (DockFrame): Listen for EVT_CLOSE and destroy all children.
1062
1063 * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
1064 when then window is told to close.
1065 (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
1066 comment in source for more info.
1067
1068 * Thuban/UI/main.py: Show the legend by default when Thuban starts.
1069
1070 * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
1071 symmetry with other such methods.
1072 (MainWindow.ShowLegend): Show the legend docked by default.
1073
1074 2003-03-28 Jonathan Coles <[email protected]>
1075
1076 * Thuban/UI/classifier.py: Support for highlighting a specific
1077 group within the grid when the classification dialog is opened.
1078 Also contains a lot of debugging printouts which will later
1079 be removed.
1080
1081 * Thuban/UI/dock.py: Complete rework on the dock code so that
1082 that it is fairly removed from the rest of the Thuban application.
1083 It is easy to add new docks which the rest of the program having
1084 to be aware of them.
1085
1086 * Thuban/UI/legend.py: Modifications to support selecting a
1087 specific group in the classification dialog. Changed how layers
1088 are drawn when the layer is visible/invisible.
1089
1090 * Thuban/UI/mainwindow.py: Removed legend specific code and
1091 replaced it with calls to the new dock code.
1092
1093 * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
1094 to check if scale > 0. Trying to track down a divide by zero.
1095
1096 2003-03-26 Jonathan Coles <[email protected]>
1097
1098 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
1099 (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
1100 now part of DockableWindow.
1101 (LegendPanel.DoOnSelChanged): Select the current layer in the
1102 map.
1103 (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
1104 with the selected layer and/or group.
1105
1106 2003-03-26 Jonathan Coles <[email protected]>
1107
1108 This putback contains the code for dockable windows. There is
1109 no support in wxWindows as of this date for windows that can
1110 attach themselves to other windows.
1111
1112 The current model contains a DockableWindow which has a parent
1113 window for when it is detached and a dock window that it puts
1114 its contents in when it is docked. The contents of a DockableWindow
1115 must be a DockPanel. DockPanel itself derives from wxPanel.
1116
1117 * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
1118 message, not a LAYER_LEGEND_CHANGED message.
1119
1120 * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
1121
1122 * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
1123 as one of the style properties for the fieldTypeText item to
1124 be sure that its size is correct when the text changes.
1125
1126 * Thuban/UI/dock.py: New. Classes for the DockPanel and
1127 DockableWindow.
1128
1129 * Thuban/UI/legend.py: Added some more buttons and made the
1130 LegendPanel a DockPanel.
1131
1132 * Thuban/UI/mainwindow.py: Added sash windows to the main window
1133 and supporting functions for manipulating the sashes.
1134 (MainWindow.ShowLegend): Create a DockableWindow with the
1135 LegendPanel as the contents.
1136
1137 * Thuban/UI/messages.py: Added DOCKABLE_* messages
1138
1139 * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
1140 not LAYER_LEGEND_CHANGED, messages.
1141
1142 2003-03-25 Jonathan Coles <[email protected]>
1143
1144 * setup.py: Added custom script bdist_rpm_build_script so that
1145 when the rpm is built the path to wx-config is correct.
1146
1147 * setup.cfg: Added line saying to use the custom build script
1148
1149 2003-03-20 Jonathan Coles <[email protected]>
1150
1151 Initial implementation of the Legend.
1152
1153 * Thuban/UI/legend.py: New. Creates a window that shows the map's
1154 Legend information and allows the user to add/modify classifications
1155 and how the layers are drawn on the map.
1156
1157 * setup.py: New command 'build_docs' which currently uses
1158 happydoc to generate html documentation for Thuban.
1159
1160 * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
1161 Returns a string which is appropriately describes the group.
1162
1163 * Thuban/Model/layer.py (Layer.SetClassification): Generate a
1164 LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
1165
1166 * Thuban/Model/map.py (Map): Rename messages and use new, more
1167 specific, messages.
1168
1169 * Thuban/Model/messages.py: New message to indicate that a layer's
1170 data has changed (LAYER_CHANGED). New map messages to indicate
1171 when layers have been added/removed/changed or if the stacking order
1172 of the layers has changed.
1173
1174 * Thuban/Model/session.py: Rename and use new messages.
1175
1176 * Thuban/UI/classifier.py: Remember if any changes have actually
1177 been applied so that if the dialog is cancelled without an application
1178 of changes we don't have to set a new classification.
1179 (ClassDataPreviewer): Pulled out the window specific code and put it
1180 ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
1181 symbols on any DC.
1182
1183 * Thuban/UI/mainwindow.py: New code to open the legend.
1184
1185 * Thuban/UI/view.py: Use new message names.
1186
1187 2003-03-19 Jonathan Coles <[email protected]>
1188
1189 * Thuban/UI/main.py (verify_versions): New. Checks the versions
1190 of Python, wxPython, and some other libraries.
1191
1192 * extensions/thuban/wxproj.cpp (check_version): Checks the given
1193 version against what wxproj was compiled with.
1194 (check_version_gtk): If wxproj was compiled with gtk then check
1195 the given version against the version of the gtk library
1196 currently being used.
1197
1198 2003-03-14 Bernhard Herzog <[email protected]>
1199
1200 * test/test_command.py: Run the tests when the module is run as a
1201 script
1202
1203 2003-03-14 Bernhard Herzog <[email protected]>
1204
1205 Implement selection of multiple selected shapes in the same layer:
1206
1207 - Introduce a new class to hold the selection. This basically
1208 replaces the interactor which was nothing more than the
1209 selection anyway. A major difference is of course that the new
1210 selection class supports multiple selected shapes in one layer
1211
1212 - Move the object that represents the selection from the
1213 application to the canvas. The canvas is a better place than the
1214 application because the selection represents which shapes and
1215 layer of the map displayed by the canvas are selected and
1216 affects how the map is drawn.
1217
1218 - Make the selection and its messages publicly available through
1219 the mainwindow.
1220
1221 - The non-modal dialogs do not get a reference to the interactor
1222 anymore as they can simply refer to their parent, the
1223 mainwindow, for the what the interactor had to offer.
1224
1225 * Thuban/UI/selection.py: New module with a class to represent the
1226 selection.
1227
1228 * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
1229 these unused messages
1230
1231 * Thuban/UI/application.py (ThubanApplication.OnInit)
1232 (ThubanApplication.OnExit, ThubanApplication.SetSession): The
1233 interactor is gone now.
1234 (ThubanApplication.CreateMainWindow): There is no interactor
1235 anymore so we pass None as the interactor argument for now for
1236 compatibility.
1237
1238 * Thuban/UI/view.py (MapCanvas.delegated_messages)
1239 (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
1240 Unsubscribe, delegate messages according to the delegated_messages
1241 class variable.
1242 (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
1243 attributes from instance variables as described with the
1244 delegated_methods class variable.
1245 (MapCanvas.__init__): New instance variable selection holding the
1246 current selection
1247 (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
1248 pass them on to the renderer
1249 (MapCanvas.SetMap): Clear the selection when a different map is
1250 selected.
1251 (MapCanvas.shape_selected): Simple force a complete redraw. The
1252 selection class now takes care of only issueing SHAPES_SELECTED
1253 messages when the set of selected shapes actually does change.
1254 (MapCanvas.SelectShapeAt): The selection is now managed in
1255 self.selection
1256
1257 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
1258 (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
1259 Unsubscribe, delegate messages according to the delegated_messages
1260 class variable.
1261 (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
1262 attributes from instance variables as described with the
1263 delegated_methods class variable.
1264 (MainWindow.__init__): The interactor as ivar is gone. The
1265 parameter is still there for compatibility. The selection messages
1266 now come from the canvas.
1267 (MainWindow.current_layer, MainWindow.has_selected_layer):
1268 Delegate to the the canvas.
1269 (MainWindow.LayerShowTable, MainWindow.Classify)
1270 (MainWindow.identify_view_on_demand): The dialogs don't need the
1271 interactor parameter anymore.
1272
1273 * Thuban/UI/tableview.py (TableFrame.__init__)
1274 (LayerTableFrame.__init__, LayerTableFrame.OnClose)
1275 (LayerTableFrame.row_selected): The interactor is gone. It's job
1276 from the dialog's point of view is now done by the mainwindow,
1277 i.e. the parent. Subscribe to SHAPES_SELECTED instead
1278 of SELECTED_SHAPE
1279
1280 * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
1281 is gone. It's job from the dialog's point of view is now done by
1282 the mainwindow, i.e. the parent.
1283
1284 * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
1285 gone. It's job from the dialog's point of view is now done by the
1286 mainwindow, i.e. the parent.
1287
1288 * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
1289 gone. It's job from the dialog's point of view is now done by the
1290 mainwindow, i.e. the parent.
1291 (SessionTreeCtrl.__init__): New parameter mainwindow which is
1292 stored as self.mainwindow. The mainwindow is need so that the tree
1293 can still subscribe to the selection messages.
1294 (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
1295 (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
1296 selection is now accessible through the mainwindow. Subscribe to
1297 SHAPES_SELECTED instead of SELECTED_SHAPE
1298
1299 * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
1300 SHAPES_SELECTED message now.
1301 (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
1302 so deal with multiple shapes
1303 (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
1304 gone. It's job from the dialog's point of view is now done by the
1305 mainwindow, i.e. the parent.
1306
1307 * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
1308 parameter is now a list of shape ids.
1309 (RecordTable.SetTable): The second parameter is now a list of
1310 indices.
1311
1312 * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
1313 selected_shape parameter and ivar to selected_shapes. It's now a
1314 list of shape ids.
1315 (MapRenderer.draw_label_layer): Deal with multiple selected
1316 shapes. Rearrange the code a bit so that the setup and shape type
1317 distinctions are only executed once.
1318
1319 * test/test_selection.py: Test cases for the selection class
1320
1321 2003-03-11 Jonathan Coles <[email protected]>
1322
1323 * Thuban/Model/load.py: Temporary fix so that the xml reader
1324 doesn't cause Thuban to crash.
1325
1326 * Thuban/Model/layer.py: Handle the cyclic references between
1327 a layer and its classification better, and be sure to disconnect
1328 the classification from the layer when the layer is destroyed
1329 so that we don't maintain a cyclic reference that may not be
1330 garbage collected.
1331
1332 * Thuban/Model/classification.py: See comment for layer.py.
1333
1334 2003-03-12 Jan-Oliver Wagner <[email protected]>
1335
1336 * HOWTO-Release: New. Information on the steps for releasing
1337 a new version of Thuban.
1338
1339 2003-03-11 Jonathan Coles <[email protected]>
1340
1341 * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
1342 Use True instead of true.
1343 (Classifier): Should have a single panel in which all the controls lie.
1344
1345 * Thuban/UI/proj4dialog.py: Add normal border.
1346
1347 * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
1348
1349 * Thuban/UI/mainwindow.py: Use True instead of true.
1350
1351 * setup.py: Update some definitions to use wxWindows2.4 files
1352
1353 * Data/iceland_sample_class.thuban: Fixed file so that the
1354 field_type information is present.
1355
1356 2003-03-10 Jonathan Coles <[email protected]>
1357
1358 * Thuban/UI/classifier.py (Classifier.__init__): Make the
1359 field type label grow so that when the text changes the
1360 size is updated correctly. This may be a wxWindows bug.
1361
1362 2003-03-10 Jonathan Coles <[email protected]>
1363
1364 * Thuban/UI/application.py: Changed SESSION_CHANGED to
1365 SESSION_REPLACED.
1366
1367 * Thuban/UI/classifier.py: Wrap text with _().
1368 (ClassGrid.CreateTable): Set dimensions and size hints here,
1369 instead of in Reset, so we only set the size once.
1370
1371 * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
1372
1373 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
1374 Call Close() instead of Shutdown().
1375
1376 * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
1377
1378 * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
1379 Go back to using OnClose() instead of Shutdown().
1380
1381 2003-03-10 Jonathan Coles <[email protected]>
1382
1383 * Thuban/UI/classifier.py (Classifier): SelectField() needed
1384 to know the old field index as well as the new one.
1385
1386 2003-03-10 Jonathan Coles <[email protected]>
1387
1388 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
1389 to correctly set the table information and call this from
1390 __init__ and from _OnFieldSelect so that all the information
1391 is up to date when the dialog opens and when a field is changed.
1392
1393 2003-03-10 Jonathan Coles <[email protected]>
1394
1395 * Thuban/Model/classification.py (Classification): Don't use
1396 layer's message function directly, use the ClassChanged() method
1397 when then classification changes. SetField/SetFieldType/SetLayer
1398 must keep the information about field name and field type in
1399 sync when an owning layer is set or removed.
1400
1401 * Thuban/Model/layer.py: Added ClassChanged() so that the
1402 classification can tell the layer when its data has changed.
1403 (Layer.SetClassification): Accepts None as an arguement to
1404 remove the current classification and correctly handles
1405 adding a new classification.
1406
1407 * Thuban/Model/load.py: Comment out print statement
1408
1409 * test/test_classification.py, test/test_save.py: New and
1410 improved tests.
1411
1412 2003-03-07 Jonathan Coles <[email protected]>
1413
1414 * Thuban/Model/classification.py: Implemented __copy__ and
1415 __deepcopy__ for ClassGroup* and ClassGroupProperites so
1416 they can easily be copied by the classifier dialog.
1417 (ClassGroupProperites.__init__): The default line color should
1418 have been Color.Black.
1419
1420 * Thuban/UI/classifier.py: Setting and Getting table values now
1421 uses a consistent set of functions.
1422 (Classifier): Now non-modal. Has field type label which changes
1423 as the field changes. Keep track of buttons in a list so that
1424 we can enable/disable the buttons when the None field is selected.
1425 (SelectPropertiesDialog): Add buttons to make the colors transparent.
1426
1427 * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
1428 does what OnClose did, but can be called by the application to
1429 close a window. Needed when a session changes, and we have to
1430 close the classifier windows.
1431
1432 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
1433 Shuts down open dialogs. Used when a new session is created
1434 or a session is opened.
1435 (MainWindow.SaveSession): Should only call application.SaveSession()
1436 if we don't call SaveSessionAs first.
1437 (MainWindow.Classify): Allow different classifier dialogs for
1438 different layers.
1439
1440 * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
1441 the parent class handle it. Add Shutdown() to unsubscibe from
1442 event notification and call the parent Shutdown(). This was
1443 necessary so the application can close the tree window.
1444
1445 2003-03-06 Jonathan Coles <[email protected]>
1446
1447 * Thuban/Model/classification.py: Minor documentation changes,
1448 Addition of __eq__ and __ne__ methods.
1449 (Classification.SetLayer): prevent recursion between this method
1450 and Layer.SetClassification().
1451
1452 * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
1453
1454 * Thuban/Model/layer.py (SetClassification): prevent recursion
1455 between this method and Classification.SetLayer().
1456
1457 * test/test_classification.py, test/test_load.py,
1458 test/test_session.py: Fixed and added tests for the classification
1459 classes.
1460
1461 2003-03-06 Bernhard Herzog <[email protected]>
1462
1463 * Thuban/UI/classifier.py (ClassGrid.__init__)
1464 (ClassGrid.CreateTable): Move the SetSelectionMode call to
1465 CreateTable because otherwise it triggers an assertion in
1466 wxPython/wxGTK 2.4.
1467
1468 2003-03-05 Jonathan Coles <[email protected]>
1469
1470 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
1471
1472 * Thuban/Model/load.py: import FIELDTYPE constants from table.
1473
1474 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
1475
1476 * Thuban/Model/table.py: Put FIELDTYPE constants back.
1477
1478 2003-03-05 Jonathan Coles <[email protected]>
1479
1480 * Thuban/UI/classifier.py: Added class documentation.
1481 Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
1482 Store just the groups in the table and generate the other
1483 column information when it is requested. Add "None" field
1484 to pull-down to select no classification.
1485
1486 * Thuban/common.py: Moved FIELDTYPE constants from table.py
1487 (Str2Num): Only catch ValueError exceptions.
1488
1489 * Thuban/Model/classification.py: Class documentation. Renaming
1490 of methods with Stroke to Line. Groups are stored in a single
1491 list with the default as the first element. Groups are searched
1492 in the order they appear in the list.
1493
1494 * Thuban/Model/color.py: Documentation.
1495
1496 * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
1497 the kind of data represented by a field.
1498
1499 * Thuban/Model/load.py (ProcessSession): Use proper string
1500 conversion function; fixes RTbug #1713.
1501
1502 * Thuban/Model/save.py (Saver): Store field type information.
1503
1504 * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
1505 (Table): Add field_info_by_name() to retrieve field information
1506 by specifying the field name, not the number.
1507
1508 * Thuban/UI/mainwindow.py: Function name changes.
1509
1510 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
1511 get the layer classification once. Don't try to classify
1512 values when the field is None: just use the default properties.
1513
1514 * Thuban/UI/view.py: Function name changes.
1515
1516 * Doc/thuban.dtd: Add field_type attribute to a classification.
1517
1518 2003-03-04 Bernhard Herzog <[email protected]>
1519
1520 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
1521 the fill and stroke layer attributes optional with suitable
1522 default values. Add the stroke_width layer attribute. Use correct
1523 syntax for empty elements. Make the attribute list for labels
1524 refer to the label element.
1525
1526 2003-03-04 Bernhard Herzog <[email protected]>
1527
1528 * setup.py (thuban_build_py.build): Add a comment about distutils in
1529 Python 2.3 containing some of the functionality we implement in
1530 setup.py ourselves.
1531
1532 * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
1533 before the selection mode. Doing it the other way round triggers
1534 an assertion in wxWindows.
1535
1536 * Thuban/Model/save.py (escape): Fix typo in doc-string
1537
1538 * Thuban/Model/classification.py: Remove unnecessary wxPython
1539 import
1540
1541 2003-03-04 Jonathan Coles <[email protected]>
1542
1543 * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
1544 Parameter 'value' should default to None.
1545
1546 * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
1547 the class attribute __classification is now private.
1548
1549 * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
1550 Classifier to ClassGrid. Added support for removing selected rows,
1551 which including code for keeping track of when cells are selected,
1552 and deselected.
1553 (ClassTable): Support for added/removing rows. Fixed a problem
1554 with __ParseInput whereby it would not allow strings (only numbers)
1555 to be entered.
1556 (Classifier): Added button and supporting code for removing
1557 selected rows.
1558
1559 2003-02-27 Jonathan Coles <[email protected]>
1560
1561 * Thuban/common.py: Moved color conversion functions into
1562 Thuban/UI/common.py.
1563 (Str2Num): Now converts the float (not the string) to a long/int
1564 so that an exception isn't thrown.
1565
1566 * Thuban/UI/common.py: Common functions used in several UI modules
1567
1568 * Thuban/Model/classification.py: Changed the class hierarchy
1569 so that a Classification consists of Groups which return
1570 Properties when a value matches a Group.
1571
1572 * Thuban/Model/layer.py: Fixed name resolution problem.
1573
1574 * Thuban/Model/load.py: Use new Classification and Group functions.
1575
1576 * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
1577 failure.
1578 (Saver.write_classification): Use new Classification and Group
1579 functions.
1580
1581 * Thuban/UI/classifier.py: Changes to use new Classification and Group
1582 functions. Fix to create a tuple with a single value instead of
1583 simply returning the value.
1584
1585 * Thuban/UI/renderer.py: Use new Classification and Group functions.
1586 Use common.py functions.
1587
1588 * Thuban/UI/tree.py: Use common.py functions.
1589
1590 * test/test_classification.py: Use new Classification and Group
1591 classes.
1592
1593 2003-02-24 Jonathan Coles <[email protected]>
1594
1595 * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
1596 functions from Thuban color objects to wxWindow colour objects.
1597
1598 * Thuban/Model/classification.py (Classification): Renamed
1599 GetProperties() to GetClassData(). Used the new iterator
1600 in TreeInfo().
1601 (ClassIterator): Iterator implementation to iterate over the
1602 ClassData objects in a classification object.
1603
1604 * Thuban/Model/save.py (Saver.write_classificaton): Uses
1605 the new iterator to save the classification information.
1606
1607 * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
1608 for changing the stroke and fill colors and previewing the
1609 changes.
1610
1611 * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
1612 MainWindow.SaveSessionAs): Text string changes so the dialogs
1613 have more meaningful titles.
1614
1615 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
1616 Classification method name from GetProperties to GetClassData.
1617
1618 * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
1619 instead of accessing now non-existent class variables.
1620
1621 2003-02-24 Bernhard Herzog <[email protected]>
1622
1623 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
1624 unneeded Shape() call. Rendering is substantially faster without
1625 it and it avoids some problems with broken shape files.
1626
1627 2003-02-20 Frank Koormann <[email protected]>
1628
1629 Force minimal size of identify and label dialogs. The autosizing
1630 looked too ugly.
1631
1632 * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
1633 * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
1634 Set size of listctrl.
1635 * Thuban/UI/identifyview.py (IdentifyView.__init__):
1636 Set size of dialog.
1637
1638 2003-02-19 Jonathan Coles <[email protected]>
1639
1640 * test/test_classification.py, test/test_layer.py,
1641 test/test_load.py, test/test_map.py, test/test_session.py:
1642 Updated the tests to use the new functions that are in the
1643 respective classes.
1644
1645 * Thuban/Model/classification.py (Classification):
1646 Uses the new ClassData* classes. Modification messages are
1647 passed up to the parent layer (if it exists).
1648 (ClassData): New class to encapsulate the common data in each
1649 classification property.
1650 (ClassDataDefault): Represents the Default class. data.
1651 (ClassDataPoint): Represents a single class. data point
1652 (ClassDataRange): Represents a class. range
1653 (ClassDataMap): Represents a class. map (unused).
1654
1655 * Thuban/Model/color.py: Added Color.None to represent something
1656 with no color. Color.Black represents the color black.
1657 (NoColor): Helper class derived from Color to represent something
1658 with no color.
1659
1660 * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
1661 stroke_width attributes. Made the 'classification' attribute private.
1662 New methods for setting/getting the classification.
1663
1664 * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
1665 to get the classifcation and use the new ClassData* classes to
1666 hold the classification data. Use Str2Num to convert numbers
1667 properly.
1668
1669 * Thuban/Model/save.py (Saver): Use new Color and Classification
1670 methods
1671
1672 * Thuban/UI/classifier.py (ClassGrid): New class to represent a
1673 custom grid.
1674 (ClassTable): Support for editing Values and Labels and for
1675 changing what type (point or range) of data is stored in each
1676 property based on how the user enters the data.
1677 (Classifier): Support for saving the new classifications and
1678 launching the dialog to edit a property.
1679 (SelectPropertiesDialog): New class for editing the visual
1680 properties of a classification (stroke color, width, and fill color)
1681 (ClassPreviewer): Took the Draw method from ClassRenderer and
1682 made most of it into this new class. Intend to use this class in
1683 the SelectPropertiesDialog for previewing changes.
1684
1685 * Thuban/UI/renderer.py: Use new Color and Classification methods.
1686
1687 * Thuban/UI/tree.py: Formatting changes.
1688
1689 * Doc/thuban.dtd: Add 'label' element
1690
1691 * Thuban/common.py: New. Contains common routines used throughout
1692 the code.
1693 (Str2Num): Takes a string and converts it to the "best" type of
1694 number.
1695
1696 2003-02-14 Bernhard Herzog <[email protected]>
1697
1698 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
1699 dragging flag is always set to 0 even when the tool implementation
1700 raises an exception
1701
1702 2003-02-11 Bernhard Herzog <[email protected]>
1703
1704 * Thuban/UI/application.py (ThubanApplication.splash_screen): New
1705 method to create a splash screen.
1706 (ThubanApplication.ShowMainWindow): New. Show the main window.
1707 Needed so the splash screen can display the mainwindow
1708 (ThubanApplication.OnInit): Call the
1709 new splash_screen method to determine whether the application
1710 should display a splash screen. If it displays a splash screen do
1711 not immediately show the main window.
1712
1713 2003-02-11 Jonathan Coles <[email protected]>
1714
1715 * Thuban/Model/classification.py: Added import line to fix
1716 feature conflicts between running on python2.2 and python2.1.
1717
1718 * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
1719 onto the clinfo parameter, so removed the deepcopy().
1720
1721 2003-02-10 Jonathan Coles <[email protected]>
1722
1723 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
1724 Added element_open variable to track opening and closing of tags
1725 so that tags that don't span more than one line are closed with
1726 /> instead of </tag_name>. Use the GetDefault*() methods of
1727 the Classification class.
1728
1729 * Thuban/Model/classification.py (Classificaton): Added set and
1730 get methods for the default data. The class also takes a layer
1731 reference so that modification messages can be sent. Fixed the
1732 methods to use the new ClassData class.
1733 (ClassData): New class to encapsulate the classification data
1734
1735 * Thuban/Model/layer.py (Layer): Remove the
1736 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
1737 SetDefault*() methods on the layer's classification object.
1738 (Layer.__init__): Use the new SetDefault*() methods in the
1739 Classification class.
1740
1741 * Thuban/Model/load.py (ProcessSession): Use the new ClassData
1742 object instead of a dictionary.
1743
1744 * Thuban/UI/classifier.py (ClassRenderer): New class to
1745 draw the classifications in the dialog box's table.
1746 (Classifier): Modified to use the ClassRenderer class.
1747
1748 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
1749 methods of the Classification class.
1750
1751 * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
1752 of the ClassData class.
1753
1754 * test/test_classification.py, test/test_layer.py,
1755 test/test_map.py, test/test_session.py: Fix the tests to work
1756 with the above code changes.
1757
1758 2003-02-03 Jonathan Coles <[email protected]>
1759
1760 * Thuban/Model/classification.py (Classification): Added getNull()
1761 to return the NullData reference
1762
1763 * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
1764 Layer.SetStrokeWidth): Modified these functions to change the
1765 null data in the classification rather than keep these values
1766 directly in the Layer class. Menu options to change these values
1767 work again.
1768
1769 2003-01-28 Jonathan Coles <[email protected]>
1770
1771 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
1772 Fixed crashing problem on some systems. Dialog box shows
1773 classification data.
1774
1775 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
1776 Colors in the tree view.
1777
1778 * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
1779 the tree info for classifications. Commented out unnecessary lines.
1780
1781 * Thuban/Model/classification.py (Classification.TreeInfo): New
1782 function to add information about the classification into the
1783 tree view.
1784
1785 2003-01-27 Jan-Oliver Wagner <[email protected]>
1786
1787 * Thuban/__init__.py (_): New.
1788
1789 * Thuban/Model/classification.py, Thuban/Model/extension.py,
1790 Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
1791 Thuban/Model/session.py, Thuban/UI/application.py,
1792 Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
1793 Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
1794 Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
1795 Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
1796 Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
1797
1798 2003-01-27 Jonathan Coles <[email protected]>
1799
1800 * Thuban/Model/layer.py: Classification initialization calls.
1801
1802 * Thuban/Model/classification.py: Created class to encapsulate
1803 a layer classification. Supports specific data points and
1804 ranges.
1805
1806 * Thuban/Model/load.py: Added support for loading classification
1807 information.
1808
1809 * Thuban/Model/save.py: Added support for saving classification
1810 information.
1811
1812 * Thuban/UI/classifier.py: Initial class for a dialog box for
1813 specifying classification information.
1814
1815 * Thuban/UI/mainwindows.py: Support for opening the classifier
1816 dialog.
1817
1818 * Thuban/UI/renderer.py: Support for drawing a layer with the
1819 classification information.
1820
1821 * Data/iceland_sample_class.thuban: iceland_sample with
1822 classification data.
1823
1824 * test/test_classification: Tests for the Classification class.
1825
1826 2002-12-09 Bernhard Herzog <[email protected]>
1827
1828 * test/test_command.py: New. Tests for the command classes.
1829
1830 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
1831 (Command.IsTool): New method to distinguish between command
1832 switching tools and other commands.
1833
1834 * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
1835 the tool to avoid direct assignments to instance variables
1836 (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
1837 (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
1838 change the tool
1839
1840 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
1841 active tool's command turns insensitive, disable the tool.
1842 (_tool_command): Use the new ToolCommand class
1843
1844 * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
1845 SelectTool method to change the tool
1846 (iconfile): Use the ToolCommand class
1847
1848 2002-12-03 Bernhard Herzog <[email protected]>
1849
1850 * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
1851 the case of selected items that are not children of Layers or Maps
1852 properly. Previously this bug would trigger an assertion in
1853 wxWindows.
1854
1855 2002-11-06 Frank Koormann <[email protected]>
1856
1857 * Thuban/UI/mainwindow.py: Altered the order of tools in the
1858 toolbar: First now are all navigation tools (Zoom In/Out, Pan,
1859 Full Extent).
1860
1861 2002-10-23 Bernhard Herzog <[email protected]>
1862
1863 * setup.py (setup call): version now 0.1.3
1864
1865 * MANIFEST.in: Add the files in test/
1866
1867 * test/README: Add note about tests requiring the iceland data
1868
1869 * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
1870 copyright notice.
1871
1872 2002-10-18 Bernhard Herzog <[email protected]>
1873
1874 * test/test_map.py
1875 (TestMapWithContents.test_projected_bounding_box): Use an explicit
1876 epsilon.
1877
1878 * test/support.py (FloatComparisonMixin.assertFloatEqual)
1879 (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
1880 message if the assertion fails and don't return the return value
1881 of self.assert_. In assertFloatSeqEqual the return meant that not
1882 all items of the sequence were compared.
1883
1884 2002-09-20 Bernhard Herzog <[email protected]>
1885
1886 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
1887
1888 * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
1889
1890 * test/test_map.py (TestMapWithContents.test_tree_info): Create
1891 the string with the bounding box on the fly because of platform
1892 differences in the way %g is handled.
1893
1894 * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
1895 DBFfile too because Thuban layers can't yet cope missing DBF
1896 files.
1897
1898 2002-09-20 Bernhard Herzog <[email protected]>
1899
1900 * test/test_menu.py: Use initthuban instead of
1901 add_thuban_dir_to_path to initialize Thuban.
1902
1903 * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
1904 Mixin class for float comparisons
1905 (SubscriberMixin): New. Mixin class to test messages sent through
1906 the Connector class
1907
1908 * test/README: Fix a typo and add the -v flag to the command for
1909 individual tests
1910
1911 * test/test_session.py: New. Test cases for Thuban.Model.session
1912
1913 * test/test_proj.py: New. Test cases for Thuban.Model.proj
1914
1915 * test/test_map.py: New. Test cases for Thuban.Model.map
1916
1917 * test/test_layer.py: New. Test cases for Thuban.Model.layer
1918
1919 * test/test_label.py: New. Test cases for Thuban.Model.label
1920
1921 * test/test_connector.py: New. Test cases for Thuban.Lib.connector
1922
1923 * test/test_color.py: New. Test cases for Thuban.Model.color
1924
1925 * test/test_base.py: New. Test cases for Thuban.Model.base
1926
1927 2002-09-13 Bernhard Herzog <[email protected]>
1928
1929 * Thuban/Model/session.py (Session.forwarded_channels): Forward
1930 the CHANGED channel too.
1931
1932 * Thuban/Model/map.py (Map.forwarded_channels): Forward the
1933 CHANGED channel too.
1934 (Map.__init__): Call the Modifiable constructor as well.
1935
1936 * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
1937 event if the modified flag changes.
1938 (Modifiable.changed): Tweak the doc-string.
1939
1940 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
1941 (MainWindow.set_position_text): Put the code that puts the text
1942 with the mouse position into the status bar into the new method
1943 set_position_text so that it can overwritten in derived classes.
1944
1945 2002-09-12 Bernhard Herzog <[email protected]>
1946
1947 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
1948 message box on the main window.
1949
1950 2002-09-11 Bernhard Herzog <[email protected]>
1951
1952 * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
1953 the 'E' because it's less likely to interfere with other menu
1954 entries.
1955 (MainWindow.build_menu): remove an incorrect comment.
1956
1957 2002-09-10 Bernhard Herzog <[email protected]>
1958
1959 * Thuban/UI/mainwindow.py (MainWindow.Map): New.
1960 (_tool_command): Add sensitive parameter
1961 (_has_visible_map): Sensitivity callback to tools and other
1962 commands that require a visible map. Use it in map_zoom_in_tool,
1963 map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
1964 and map_full_extent
1965
1966 2002-09-06 Bernhard Herzog <[email protected]>
1967
1968 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
1969 VIEW_POSITION
1970
1971 2002-09-04 Frank Koormann <[email protected]>
1972
1973 * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
1974
1975 2002-09-02 Bernhard Herzog <[email protected]>
1976
1977 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
1978 wxWindows already and our implementation doesn't work correctly
1979 with wxGTK 2.3:
1980 (MapCanvas.__init__): Remove the instance variable
1981 (MapCanvas.OnPaint): Always call do_redraw when there's a map to
1982 be drawin
1983 (MapCanvas.OnIdle): Removed.
1984
1985 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
1986 a parameter to determine the size of the rectangle.
1987 (MapCanvas.find_shape_at): Create the box around the point on a
1988 layer by layer basis and make the size depend on the shape type.
1989 This solves a problem with the selection of point shapes at the
1990 border of the layer's bounding box
1991
1992 2002-08-30 Bernhard Herzog <[email protected]>
1993
1994 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
1995 for the sensitivity of remove layer.
1996 (_can_remove_layer): New. Sensitivity callback for remove layer
1997 (Command layer_remove): Use _can_remove_layer
1998
1999 * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
2000 determine whether a given layer can be deleted.
2001
2002 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
2003 (MapCanvas.do_redraw): Get rid of the unused update_region
2004 instance variable
2005
2006 * Thuban/UI/view.py: Add/update some doc-strings.
2007
2008 * test/: new subdirectory with a bunch of unit tests.
2009
2010 * test/README, test/test_table.py, test/test_save.py,
2011 test/test_menu.py, test/test_load.py: Initial set of tests and
2012 brief instructions on how to run them
2013
2014 2002-08-29 Bernhard Herzog <[email protected]>
2015
2016 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
2017 arcs with multiple parts.
2018
2019 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
2020 Handle degenrate rectangles.
2021
2022 * Thuban/Model/table.py: Make writing records work correctly:
2023 (Table.__init__): Keep track of whether the DBF is open for
2024 writing
2025 (Table.write_record): Open the DBF file for writing when necessary
2026
2027 2002-08-27 Bernhard Herzog <[email protected]>
2028
2029 * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
2030 dbf files only for reading by default. Use a new writable dbf
2031 object for writing.
2032
2033 2002-08-26 Bernhard Herzog <[email protected]>
2034
2035 * Thuban/UI/mainwindow.py: Refactor the context creation:
2036 (MainWindow.Context): New method to return a context
2037 (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
2038 new method
2039
2040 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
2041 layer table specific code from TableGrid into LayerTableGrid
2042 (TableFrame, LayerTableFrame): Split the layer table specific code
2043 from TableFrame into LayerTableFrame
2044 (LayerTableGrid.select_shape): Remove a debug print
2045
2046 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
2047 LayerTableFrame
2048
2049 2002-08-23 Bernhard Herzog <[email protected]>
2050
2051 * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
2052 absolute filename.
2053
2054 2002-08-22 Bernhard Herzog <[email protected]>
2055
2056 * Thuban/Model/table.py (Table.write_record): New method to write
2057 records.
2058 (Table.__init__): Open the DBF file for writing too.
2059
2060 * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
2061 into the underlying table.
2062
2063 * extensions/shapelib/shapefil.h (DBFCommit),
2064 extensions/shapelib/dbfopen.c (DBFCommit): New API function to
2065 commit any changes made to the DBF file.
2066
2067 * Thuban/UI/mainwindow.py (make_check_current_tool)
2068 (_tool_command): Put the code that generates the "checked"
2069 callback into a separate function so that we can reuse it
2070 elsewhere
2071
2072 * Thuban/Model/save.py (Saver): New class to handle serializing a
2073 session into an XML file. The main reason to introduce a class is
2074 that applications built on Thuban can derive from it so that they
2075 can save additional information in a session file.
2076 (save_session): Delegate almost all the work to the Saver class.
2077 Rename the filename argument to file because it may be a file like
2078 object now.
2079
2080 * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
2081 code. Remove the little test code which would be executed when the
2082 module is run as a script which didn't work anymore since it can't
2083 import the other Thuban modules.
2084 (ProcessSession, load_session): Refactor the ProcessSession to
2085 have one method for each element start and end tag so that derived
2086 classes can easily override the processing of individual tags.
2087 Also, always parse with namespaces enabled because applications
2088 built on top of Thuban will likely use namespaces if they extend
2089 the session file format.
2090
2091 2002-08-21 Bernhard Herzog <[email protected]>
2092
2093 * setup.py (ThubanInstall.run): Don't repr install_lib_orig
2094 because thubaninit_contents will do it for us.
2095
2096 2002-08-16 Jan-Oliver Wagner <[email protected]>
2097
2098 * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
2099 tree window already open
2100
2101 2002-08-15 Bernhard Herzog <[email protected]>
2102
2103 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
2104 with self.
2105
2106 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
2107 when we have actually captured it.
2108
2109 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
2110 shapefile and destroy the table.
2111
2112 * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
2113
2114 2002-08-14 Bernhard Herzog <[email protected]>
2115
2116 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
2117 instance variable columns
2118 (RecordTable.GetTypeName): row and col may be negative in some
2119 cases.
2120
2121 * setup.py (InstallLocal.initialize_options)
2122 (InstallLocal.finalize_options, InstallLocal.user_options): New
2123 option create-init-file to build a thubaninit.py when running
2124 install_local
2125 (InstallLocal.run): Create the thubaninit.py module when requested
2126 (thubaninit_contents): Split the template into several parts and
2127 create a new function thubaninit_contents that creates the
2128 contents of a thubaninit module.
2129 (ThubanInstall.run): Use the new function to create the thubaninit
2130 module.
2131
2132 2002-07-30 Bernhard Herzog <[email protected]>
2133
2134 * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
2135 cleanup.
2136 (ThubanApplication.MainLoop): Extend to automatically call OnExit.
2137
2138 * Thuban/Model/session.py (Session.Destroy): Don't bypass the
2139 direct base class' Destroy method.
2140
2141 * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
2142 layers.
2143 (Map.Destroy): Destroy the label_layer as well and call the
2144 inherited Desatroymethod first so that no more messages are
2145 issued.
2146 (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
2147 message if the stacking order actually has changed. Add
2148 doc-strings.
2149 (Map.BoundingBox): Correct the doc-string.
2150 (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
2151 (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
2152
2153 * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
2154 all labels.
2155
2156 2002-07-29 Bernhard Herzog <[email protected]>
2157
2158 * Thuban/Model/map.py (Map.subscribe_layer_channels)
2159 (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
2160 to a layer's channels into separate methods.
2161 (Map.RemoveLayer, Map.AddLayer): Call the new methods
2162 (Map.Destroy): Unsubscribe from a layer's channels before
2163 destroying it.
2164
2165 * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
2166 selected_layer parameter to searched_layer which is the layer to
2167 search in.
2168 (MapCanvas.SelectShapeAt): New parameter layer to restrict the
2169 search to that layer. Return the selected layer and shape.
2170
2171 * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
2172 typo
2173
2174 2002-07-24 Bernhard Herzog <[email protected]>
2175
2176 * Thuban/UI/application.py (ThubanApplication.create_session):
2177 Extend the doc string.
2178 (ThubanApplication.subscribe_session)
2179 (ThubanApplication.unsubscribe_session): New methods to
2180 subscribe/unsubscribe to/from session channels.
2181 (ThubanApplication.SetSession): Call the new methods here.
2182 (ThubanApplication.maps_changed, ThubanApplication.set_map):
2183 Renamed set_map to maps_changed. Its now a subscriber for
2184 MAPS_CHANGED.
2185
2186 * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
2187 x-coordinate in case of simple clicks
2188
2189 * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
2190 don't pass it as a parameter
2191
2192 * Thuban/Model/session.py (Session.RemoveMap): New
2193
2194 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
2195 window size into a parameter.
2196
2197 2002-07-23 Bernhard Herzog <[email protected]>
2198
2199 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
2200 just commands.
2201
2202 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
2203 parameter list a bit to allow setting the window title and the
2204 initial message in the status bar. Update the callers.
2205
2206 * Thuban/UI/application.py (ThubanApplication.OnInit)
2207 (ThubanApplication.CreateMainWindow): Put the mainwindow
2208 instantiation into a separate method so that it can be overridden
2209 by a subclass.
2210
2211 2002-07-19 Bernhard Herzog <[email protected]>
2212
2213 * Thuban/Model/session.py: Issue a CHANGED message every time
2214 another changed message is issued to make it easier to get
2215 notified of changes.
2216 (Session): Update the doc string
2217 (Session.forward): Issue changed-events as CHANGED as well.
2218 (Session.changed): Overwrite the inherited version to issue
2219 CHANGED events as well.
2220
2221 * Thuban/UI/tree.py: We can now simply subscribe to the session's
2222 CHANGED channel to be informed of changes.
2223 (SessionTreeCtrl.session_channels): Not needed any longer.
2224 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
2225 Only have to (un)subscribe CHANGED
2226
2227 * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
2228
2229 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
2230 for the wxPython locale bug to __init__.py so that it's
2231 automatically executed by anybody using UI code from Thuban.
2232
2233 2002-07-18 Bernhard Herzog <[email protected]>
2234
2235 * Thuban/UI/main.py (main): app no longer needs to be global
2236
2237 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
2238 as parameter and store it in an instance variable
2239 (MainWindow.invoke_command, MainWindow.update_command_ui)
2240 (MainWindow.save_modified_session, MainWindow.NewSession)
2241 (MainWindow.OpenSession, MainWindow.SaveSession)
2242 (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
2243 application object.
2244
2245 * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
2246 the main window with self.
2247
2248 * Thuban/UI/context.py: New module with the context class
2249
2250 * Thuban/UI/command.py (Command): Update doc string.
2251
2252 * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
2253 MainWindow.update_command_ui): Pass an instance of the context
2254 class to the command's methods
2255 (check_current_tool, call_method): Handle the new context
2256 implementation
2257
2258 * Examples/simple_extensions/simple_tool.py (simple_tool,
2259 check_simple_tool): Handle the new context implementation
2260
2261 * Examples/simple_extensions/simple_command.py (simple_command):
2262 Handle the new context implementation. Update the comments about
2263 the context.
2264
2265 * Thuban/UI/application.py (ThubanApplication.SetSession): Add
2266 doc-string
2267 (ThubanApplication.Session): New method to return the session
2268 object
2269
2270 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
2271 interactor's selected_layer may not be a layer of the current
2272 session when the tree is updated while a new session is being set.
2273
2274 2002-07-17 Bernhard Herzog <[email protected]>
2275
2276 * Thuban/UI/tree.py (color_string): Removed. No longer used.
2277 (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
2278 update_tree into update_tree and add_items. The tree now uses a
2279 more generic way to display the contents of the tree.
2280 (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
2281
2282 * Thuban/Model/layer.py (Layer.TreeInfo),
2283 Thuban/Model/extension.py (Extension.TreeInfo),
2284 Thuban/Model/map.py (Map.TreeInfo),
2285 Thuban/Model/session.py (Session.TreeInfo):
2286 Add TreeInfo methods to implement the new tree view update scheme
2287
2288 2002-07-16 Bernhard Herzog <[email protected]>
2289
2290 * Thuban/UI/application.py: Don't use "import from" for the
2291 MainWindow. It can't always be resolved.
2292 (ThubanApplication.OnInit): change reference to MainWindow
2293 accordingly.
2294
2295 * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
2296 completely
2297
2298 2002-07-10 Bernhard Herzog <[email protected]>
2299
2300 * setup.py (create_init_module): New configurable variable whose
2301 default depends on the platform we're running on.
2302 (ThubanInstall.initialize_options): Initialize
2303 self.create_init_module from the global create_init_module
2304 (ThubanInstall.user_options): indictate that the options
2305 create-init-module and init-module-dir have arguments.
2306
2307 * setup.py: In the setup call change the version number to include
2308 cvs.
2309
2310 * MANIFEST.in: Add the files in Examples
2311
2312 2002-07-09 Bernhard Herzog <[email protected]>
2313
2314 * setup.py: In the setup call, use the thuban homepage as the
2315 value of the url parameter.
2316
2317 * Examples: New subdirectory for examples.
2318
2319 * Examples/simple_extensions/simple_tool.xpm,
2320 Examples/simple_extensions/simple_tool.py,
2321 Examples/simple_extensions/simple_command.py,
2322 Examples/simple_extensions/README: Simple examples showing how to
2323 add new commands and tools.
2324
2325 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
2326 bdist_rpm that we also have an install script.
2327 (bdist_inno): Add 2002 to the copyright notice.
2328
2329 * setup.py: Create a file in python's site-packages directory to
2330 make installation of Thuban as a library easier.
2331 (ThubanInstall.user_options): Add two new options,
2332 create-init-module and init-module-dir
2333 (ThubanInstall.expand_with_pure_python_dirs): New method to expand
2334 filenames for installation in the default directories.
2335 (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
2336 the inherited methods to capture some filenames before they're
2337 transformed too much by distutils.
2338 (ThubanInstall.run): Create the init module if requested.
2339 (ThubanInstall.thuban_init_filename): New method to return the
2340 full name of the init module.
2341 (ThubanInstall.get_outputs): Append the filename of the init
2342 module.
2343
2344 2002-07-08 Bernhard Herzog <[email protected]>
2345
2346 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
2347 handle the prefix properly which means that the default for the
2348 installation prefix should be /usr for RPMs and /usr/local when
2349 doing a normal source install.
2350 (bdist_rpm_install_script): Script to override the default install
2351 commands in the specfile generated by the bdist_rpm command.
2352 (thuban_bdist_rpm.user_options): Add a prefix option
2353 (thuban_bdist_rpm.initialize_options): Init the prefix option.
2354 Create the script files for the spec files as empty files here
2355 (thuban_bdist_rpm._make_spec_file): Override the inherited method
2356 to fill the script files with content.
2357
2358 * Thuban/Model/save.py (relative_filename): Wrapper around
2359 Thuban.Lib.fileutil.relative_filename that accepts an empty dir
2360 argument. save_session now automatically uses this version,
2361 solving a problem when saving to a relative filename.
2362
2363 * setup.py: In the setup call, make sure that the library
2364 directories are under $prefix/lib not directly under $prefix.
2365
2366 2002-06-20 Jan-Oliver Wagner <[email protected]>
2367
2368 * Thuban/Model/extension.py: new module to handle extension objects.
2369 * Thuban/Model/messages.py: new messages for extensions.
2370 * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
2371 Session.AddExtension): new for handling extensions.
2372 Also some other minor changes to round up extension handling.
2373 * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
2374 of Extension titles and title and names of its objects.
2375
2376 2002-05-29 Bernhard Herzog <[email protected]>
2377
2378 * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
2379 the events for a command.
2380 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
2381 Call bind_command_events to bind the events. add_toolbar_command
2382 can now bind events too so that it's possible to have commands
2383 that are only available through the toolbar.
2384 (MainWindow.init_ids): New instance variable events_bound to keep
2385 track of for which commands events have been bound.
2386
2387 2002-05-28 Bernhard Herzog <[email protected]>
2388
2389 * Thuban/UI/menu.py: New module to build and manage menus.
2390
2391 * Thuban/UI/mainwindow.py: Remove some unused imports.
2392 (MainWindow.__init__, main_menu): move the definition of the main
2393 menu from __init__ to the Menu instance main_menu.
2394 (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
2395 build the menu bar and sub-menus from a menu description.
2396
2397 * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
2398 startup file
2399 (ThubanApplication.read_startup_files): New method to run
2400 ~/.thuban/thubanstart.py
2401
2402 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
2403 Move the toolbar definition to the Menu instance main_toolbar.
2404 (MainWindow.build_toolbar): New method to build the toolbar
2405 similar to the build_menu methods
2406
2407 2002-05-23 Bernhard Herzog <[email protected]>
2408
2409 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
2410 layer_outline_color. Fix it in the definition of the command too.
2411
2412 * Thuban/UI/command.py (Command): Fix typo in doc string
2413
2414 2002-05-22 Bernhard Herzog <[email protected]>
2415
2416 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
2417 in the docstring
2418
2419 2002-05-15 Bernhard Herzog <[email protected]>
2420
2421 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
2422 when the shapefile is empty.
2423 (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
2424 now return None for empty shapefiles. Update doc-strings.
2425
2426 * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
2427 the layer's bbox being None.
2428
2429 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
2430 layer's bbox being None.
2431
2432 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
2433 necessary.
2434 (MapCanvas.__init__): New instance variables, last_selected_layer
2435 and last_selected_shape to determine how the selection has
2436 changed.
2437
2438 * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
2439 AutoSizeColumns because it will cause a traversal of the entire
2440 table which for large .dbf files will take a very long time.
2441
2442 2002-05-14 Bernhard Herzog <[email protected]>
2443
2444 * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
2445 maximum depth for the tree than shapelib does by default.
2446
2447 2002-05-10 Bernhard Herzog <[email protected]>
2448
2449 * setup.py (py_modules): The shptree modules doesn't have a
2450 wrapper, so don't include it in the py_modules
2451
2452 2002-05-08 Bernhard Herzog <[email protected]>
2453
2454 * extensions/shapelib/shptree.c (compare_ints): Make arguments
2455 const void * as in the qsort prototype
2456 (SHPTreeFindLikelyShapes): Remove some unused variables.
2457
2458 * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
2459 maintains to redraw the window during a drag.
2460 (MapCanvas.unprojected_rect_around_point): New method to determine
2461 a small region around a point for hit-testing.
2462 (MapCanvas.find_shape_at): Only test the shapes in a small region
2463 around the point.
2464
2465 * setup.py: Increment the version to 0.1.2
2466
2467 * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
2468 debug print and set session to None after unsubscribing
2469
2470 2002-05-07 Bernhard Herzog <[email protected]>
2471
2472 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
2473 the file to have a .thuban extension.
2474
2475 * Thuban/UI/tree.py (session_channels): New class constant with
2476 all the session channels to subscribe to to update the tree
2477 (SessionTreeCtrl.session_changed): Remember the session so that we
2478 can unsubscribe properly. Use the new class constant to
2479 unsubscribe from the old session and subscribe to the new one.
2480 (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
2481 subscriptions of the SessionTreeCtrl.
2482 (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
2483
2484 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
2485 Session Tree" command to the file menu.
2486
2487 * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
2488 as update_region to the renderer.
2489
2490 * Thuban/UI/renderer.py
2491 (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
2492 update box is now directly a tuple, not a wxRect anymore.
2493
2494 * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
2495 prints.
2496
2497 2002-05-07 Bernhard Herzog <[email protected]>
2498
2499 * setup.py: Add the shptree extension module. See
2500 extensions/pyshapelib/ChangeLog for more details.
2501
2502 * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
2503 extensions/shapelib/dbfopen.c: Really update to the versions of
2504 shapelib 1.2.9. For some reason it wasn't really done on
2505 2002-04-11.
2506
2507 * extensions/shapelib/shptree.c: Modified version of shptree.c of
2508 shapelib 1.2.9. The only real difference is the use of qsort
2509 instead of a bubble sort implementation
2510
2511 * Thuban/Model/layer.py (Layer.__init__): New instance variable
2512 shapetree to hold the shapelib quadtree for the shapefile
2513 (Layer.open_shapefile): Create the quad tree.
2514 (Layer.ShapesInRegion): New method to return the ids of shapes in
2515 a given region using the quad tree.
2516
2517 * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
2518 comment
2519 (draw_polygon_shape): Accept both arcs and polygons.
2520 (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
2521 the api.
2522
2523 * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
2524 return the shape ids to be rendered in a given layer.
2525 (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
2526 ids. Use draw_polygon_shape to draw arc shapes as well.
2527 (ScreenRenderer.RenderMap): New parameter for the rectangle that
2528 has to be updated
2529 (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
2530 calling it's ShapesInRegion method.
2531
2532 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
2533 update_region for the update region.
2534 (MapCanvas.OnPaint): Maintain the update region
2535 (MapCanvas.do_redraw): Pass the bounding box of the update_region
2536 to the renderer when drawing the bitmap. Reset the update_region.
2537
2538 2002-05-03 Bernhard Herzog <[email protected]>
2539
2540 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
2541 MainWindow.OpenSession): Change the file extension of the session
2542 files to .thuban
2543
2544 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
2545 Move the map channels to be forwarded by the session into the
2546 class constant with forwarded_channels. Also add
2547 LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
2548 forwarded_channels
2549
2550 * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
2551 typo and some rewording).
2552
2553 2002-05-02 Bernhard Herzog <[email protected]>
2554
2555 * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
2556 around to speed up most redraws:
2557 (MapCanvas.__init__): New instance variable bitmap which holds the
2558 bitmap
2559 (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
2560 self.bitmap to draw.
2561 (MapCanvas.full_redraw): New method to force a full redraw
2562 including the bitmap
2563 (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
2564 make sure the bitmap is redrawn.
2565 (MapCanvas.projection_changed, MapCanvas.set_view_transform,
2566 MapCanvas.shape_selected): Call full_redraw instead of readraw to
2567 make sure the bitmap is redrawn.
2568 (MapCanvas.OnSize): New method to handle size events so that the
2569 bitmap can be redrawn.
2570
2571 2002-04-29 Bernhard Herzog <[email protected]>
2572
2573 * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
2574 canvas' VIEW_POSITION event
2575 (MainWindow.view_position_changed): Handler for VIEW_POSITION.
2576 Update the text in the status-bar accordingly.
2577
2578 * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
2579 (MapCanvas.__del__): Implement because Publisher.__del__ has to be
2580 called.
2581 (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
2582 current_position
2583 (MapCanvas.set_current_position): New method to set
2584 current_position. Issue a VIEW_POSITION event
2585 (MapCanvas.CurrentPosition): New public method to return the value
2586 of current_position. Should be called when the VIEW_POSITION event
2587 is processed.
2588 (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
2589 Update the position.
2590 (MapCanvas.OnLeaveWindow): Set the position to None.
2591
2592 * Thuban/UI/messages.py (VIEW_POSITION): New message for the
2593 position in the statusbar
2594
2595 2002-04-26 Frank Koormann <[email protected]>
2596
2597 * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
2598
2599 2002-04-24 Frank Koormann <[email protected]>
2600
2601 * Resources/Bitmaps/identify.xpm: shadow added
2602
2603 * Resources/Bitmaps/fullextent.xpm: new
2604
2605 2002-04-22 Jan-Oliver Wagner <[email protected]>
2606
2607 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
2608 box
2609
2610 2002-04-21 Jan-Oliver Wagner <[email protected]>
2611
2612 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
2613
2614 * Thuban/UI/tree.py (update_tree): added added map extent
2615
2616 * Thuban/UI/mainwindow.py (_method_command): extended by parameter
2617 icon; added map_full_extend as tool
2618
2619 2002-04-19 Jan-Oliver Wagner <[email protected]>
2620
2621 * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
2622 saving _new_ sessions
2623
2624 * Thuban/Model/session.py (create_empty_session): new session
2625 don't have a filename (set to None)
2626
2627 * Thuban/UI/tree.py (update_tree): added filename and modified flag
2628
2629 * Thuban/Model/load.py (ProcessSession): convert projection
2630 parameters from unicode to regular string
2631
2632 * Data/iceland_sample.session: Added UTM Zone 26 projection.
2633
2634 2002-04-11 Bernhard Herzog <[email protected]>
2635
2636 * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
2637 extensions/shapelib/dbfopen.c: Update to the versions of shapelib
2638 1.2.9
2639
2640 * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
2641 the pyshapelib directoy into the list of include dirs, so that
2642 pyshapelib_api.h can be found.
2643
2644 * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
2645 holds the pyshapelib C-API
2646 (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
2647 pyshapelib_api to access the shapelib functions.
2648 (initwxproj): Import the c_api from the shapelib module and
2649 initialize pyshapelib_api.
2650
2651 2002-04-04 Bernhard Herzog <[email protected]>
2652
2653 * setup.py (thuban_bdist_rpm.initialize_options): Use
2654 initialize_options to create the scripts for the rpm.
2655
2656 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
2657
2658 2002-04-03 Bernhard Herzog <[email protected]>
2659
2660 * setup.py: Increment version to 0.1.1
2661
2662 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
2663 Layer" and "Remove Layer" commands from the layer menu to the map
2664 menu
2665
2666 2002-02-15 Bernhard Herzog <[email protected]>
2667
2668 * Thuban/Model/layer.py (Layer.Shape): list append only takes one
2669 argument (python <= 1.5.2 erroneously accepted multiuple
2670 arguments)
2671
2672 2002-02-04 Bernhard Herzog <[email protected]>
2673
2674 * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
2675 RecordGrid in the identifyview.
2676 (IdentifyView.__init__): Use IdentifyGridCtrl instead of
2677 IdentifyListCtrl. The grid allows editing of the values.
2678
2679 * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
2680 implementing a grid for a single row of a thuban table.
2681
2682 * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
2683 layers by default. Easier to use than the previous default of only
2684 searching through the select layer which meant that if no layer
2685 was selected, you couldn't select a shape.
2686
2687 * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
2688
2689 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
2690 stroke_width attribute
2691
2692 * Thuban/Model/save.py (save_session): Write the new stroke_width
2693 attribute
2694
2695 * Thuban/Model/load.py (ProcessSession.startElement): Read the
2696 stroke_width attribute
2697
2698 * Thuban/Model/layer.py (Layer.__init__): New parameter and
2699 instance variable stroke_width
2700 (Layer.SetStrokeWidth): Set the stroke_width.
2701
2702 2002-02-01 Bernhard Herzog <[email protected]>
2703
2704 * extensions/thuban/wxproj.cpp (project_points): Fix two
2705 off-by-one errors in the last loop that joins the various parts
2706 together.
2707
2708 2002-01-14 Bernhard Herzog <[email protected]>
2709
2710 * setup.py (data_dist.make_distribution): Fix some typos
2711
2712 2001-09-18 Bernhard Herzog <[email protected]>
2713
2714 * README: Slight tweaking in preparation for the 0.1 release
2715
2716 * setup.cfg: Add section for sdist to create both tgz and zip
2717 archives
2718
2719 * setup.py: increase version number to 0.1
2720 (data_dist): New command class for data distribution
2721
2722 2001-09-14 Bernhard Herzog <[email protected]>
2723
2724 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
2725 Handle the case of no layer (i.e. layer is None) properly.
2726
2727 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
2728 Set the initial selection of the combo boxes to reflect the
2729 projection we're starting with in a way that works on windows,
2730 too.
2731
2732 * Thuban/Lib/connector.py (Connector.print_connections): Print the
2733 puiblisher's ids in hex to make it easier to compare them to the
2734 standard repr of python methods
2735
2736 * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
2737 messages
2738
2739 2001-09-13 Bernhard Herzog <[email protected]>
2740
2741 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
2742 deselect the layer if no layer is selected
2743
2744 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
2745 idle time when there actually is something to draw. If there's
2746 nothing to draw simply clear the window
2747 (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
2748 (MapCanvas.SetMap): force a redraw in all cases because
2749 FitMapToWindow doesn't always do it.
2750 (MapCanvas.ZoomFactor): Add an optional parameter, center, to
2751 specify the point to move into the center of the window
2752 (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
2753 dragged, zoon in/out by a factor of 2
2754 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
2755 index, i.e. reversed drawing order) so that objects appearing to
2756 be in from of others are selected first. This is probably mostly
2757 relevant for point shapes where the symbols used may overlap
2758
2759 * Thuban/Model/session.py (create_empty_session): Unset the
2760 modified bit before returning it
2761
2762 * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
2763 create_empty_session session to create the new, empty session.
2764
2765 * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
2766 the tool bitmaps.
2767 (MainWindow.OnClose, MainWindow.save_modified_session): Separate
2768 the code that asks whether the session should be saved into the
2769 new method save_modified_session.
2770 (MainWindow.OpenSession, MainWindow.NewSession): Use the new
2771 method to save modified session here too.
2772
2773 2001-09-11 Bernhard Herzog <[email protected]>
2774
2775 * setup.py (InnoIconItem): fix typo
2776
2777 (thuban_bdist_inno.run):
2778 (bdist_inno.run): Move the decision not to create symlinks on
2779 non-nt platforms to thuban_bdist_inno and do it unconditinally
2780 since we never want to create the symlinks here
2781
2782 2001-09-10 Bernhard Herzog <[email protected]>
2783
2784 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
2785 identify view immediately
2786
2787 * Thuban/UI/controls.py: New file with two classes RecordListCtrl
2788 and SelectableRecordListCtrl that implement the code shared by the
2789 identify view and the label dialog
2790
2791 * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
2792 new class RecordListCtrl
2793
2794 * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
2795 return value of GetValue is None instead of using it as a boolean
2796 directly so that Zero numbers are handled properly.
2797 (LabelListCtrl): Derive from the new class
2798 SelectableRecordListCtrl
2799
2800 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
2801 (Proj4Dialog.dialogLayout): Make the window resizable and set the
2802 size of the text control explicitly to make the sizers work on
2803 both Windows and X.
2804
2805 2001-09-07 Bernhard Herzog <[email protected]>
2806
2807 * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
2808 that can limit the search to the currently selected layer.
2809 (MapCanvas.SelectShapeAt): Make sure that the currently selected
2810 layer stays selected even when no shape is found
2811 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
2812 height do nothing (avoids zero division errors)
2813
2814 2001-09-06 Bernhard Herzog <[email protected]>
2815
2816 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
2817 Correct the spelling of SessionTreeCtrl. dabbrev is too damn
2818 convenient :-)
2819 (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
2820 a new instvar layer_to_item to map layers to tree items
2821 (SessionTreeCtrl.layer_selected): Select the appropriate tree item
2822 to match the current selection in the interactor
2823
2824 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
2825 (Interactor.HasSelectedLayer): New methods to query the current
2826 selection
2827
2828 * Thuban/UI/mainwindow.py (MainWindow.current_layer):
2829 (MainWindow.has_selected_layer): Simply call the appropriate
2830 interactor method
2831
2832 * Thuban/UI/mainwindow.py (MainWindow.__init__):
2833 (MainWindow.LayerShowTable):
2834 (MainWindow.identify_view_on_demand): Store the interactor in an
2835 instvar and use that reference instead of going through main.app
2836
2837 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
2838 * Thuban/UI/application.py (ThubanApplication.OnInit):
2839 * Thuban/UI/main.py (main): Create the session tree view in main
2840 with the new mainwindow method ShowSessionTree and not directly
2841 the application's OnInit method
2842
2843 * Thuban/UI/tree.py (myTreeCtrlPanel):
2844 (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
2845 TreeCtrl isntead of a panel. This affects most method since we now
2846 refer to self instead of self.tree
2847 (SessionTreeView): New class implementing a non-modal dialog
2848 showing the session tree.
2849
2850 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
2851 layer to the tableview dialog.
2852
2853 * Thuban/UI/tableview.py: Add some doc-strings
2854 (TableGrid):
2855 (TableGrid.OnRangeSelect):
2856 (TableGrid.OnSelectCell):
2857 (TableFrame.__init__):
2858 (TableFrame.row_selected):
2859 Selecting rows in the grid view now updates the selected shapes
2860 through the TableFrame. To achieve this we derive TableGrid from
2861 Publisher and introduce the message type ROW_SELECTED which the
2862 TableFrame subscribes to and which is issued by OnRangeSelect and
2863 OnSelectCell
2864
2865 (DataTable.SelectRow): Removed because it's no longer needed in
2866 the row/shape selection scheme
2867
2868 * Thuban/UI/dialogs.py: New file implementing common classes for
2869 dialogs
2870
2871 * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
2872 the SELECTED_SHAPE message anymore. This is now handled by the
2873 parent.
2874 (TableGrid.select_shape): Only update the selection if the shape
2875 is not None.
2876 (TableFrame): Inherit from the new NonModalDialog class.
2877 (TableFrame.__init__, TableFrame.select_shape): Handle the
2878 SELECT_SHAPE message.
2879 (TableFrame.OnClose): Extend the inherited method to unsubscribe
2880 SELECT_SHAPE
2881
2882 * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
2883 (MainWindow.add_dialog):
2884 (MainWindow.dialog_open):
2885 (MainWindow.remove_dialog):
2886 (MainWindow.get_open_dialog): New methods to maintain a dictionary
2887 of opened non-modal dialogs.
2888
2889 (MainWindow.__init__): Initialize the new non-modal dictionary
2890 management code
2891 (MainWindow.LayerShowTable): maintain separate dialogs for each
2892 table using the non-modal dialog management code to only open a
2893 view once for each table.
2894
2895 (MainWindow.IdentifyTool):
2896 (MainWindow.__init__):
2897 (MainWindow.identify_view_on_demand): Don't open the identify view
2898 in IdentifyTool anymore. This will be done automatically by the
2899 new method identify_view_on_demand which handles the
2900 SELECTED_SHAPE message so that the identify view will be opened on
2901 demand
2902
2903 * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
2904 the interactor argument. The SELECTED_SHAPE message is now handled
2905 by the parent.
2906 (IdentifyView.__init__): Add the interactor argument so that we
2907 can handle the SELECTED_SHAPE message here
2908 (IdentifyView.selected_shape): New method to handle the
2909 SELECTED_SHAPE messages
2910
2911 * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
2912 NonModalDialog class
2913 (IdentifyView.OnClose): Extend the inherited version to
2914 unsubscribe SELECT_SHAPE
2915
2916 * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
2917
2918 2001-09-05 Bernhard Herzog <[email protected]>
2919
2920 * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
2921
2922 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
2923 interactor to pass through to the MapCanvas
2924
2925 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
2926 argument to the MainWindow constructor to get rid of the ugly hack
2927 that made main.app available early just so that the mapcanvas
2928 could access the interactor object.
2929
2930 2001-09-04 Bernhard Herzog <[email protected]>
2931
2932 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
2933 that runs a modal message box
2934 (MainWindow.OnClose): Use the new method
2935 (MainWindow.RemoveLayer): Just do nothing in case no layer is
2936 selected. The command should be grayed out anyway, so there's no
2937 need to pop up a message box.
2938 (MainWindow.AddLayer): Pop up a message box with an error message
2939 if the shape file can't be opened
2940
2941 * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
2942 immediately. This will cause an exception in case the file can't
2943 be opened and we can display an appropriate message.
2944
2945 * MANIFEST.in: Add extensions/pyprojection/LICENSE
2946
2947 * setup.py (thuban_bdist_rpm): New class implementing a Thuban
2948 specific bdist_rpm command.
2949
2950 * Thuban/UI/main.py: Catch ImportError exceptions when importing
2951 the locale module because it may not be available on some
2952 installations.
2953
2954 * extensions/pyprojection/LICENSE: Copy of the license text in
2955 Projection.i. Having it in a separate file makes it easier to
2956 refer to license text in e.g. RPMs
2957
2958 2001-09-03 Bernhard Herzog <[email protected]>
2959
2960 * setup.py: use wx-config instead of wxgtk-config because it's
2961 more generic
2962
2963 * setup.py (ThubanInstall.get_outputs): Add the symlink in
2964 <prefix>/bin to the outputs
2965 (ThubanInstall.link_file): New method to link files. We need this
2966 because the standard copy_files refuses to link non-existing
2967 files.
2968 (ThubanInstall.run): Remove the leading install root from the
2969 script filename if an install root was specified and use the new
2970 link_file method
2971
2972 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
2973 the window when the first layer is added to the map.
2974
2975 * setup.py (ThubanInstall.run): Honor the build root (self.root)
2976 when linking thuban.py to <prefix>/bin
2977
2978 2001-08-31 Bernhard Herzog <[email protected]>
2979
2980 * setup.py: In the setup call, the install parameters shouldn't
2981 have trailing slashes because distutils on non-posix platforms
2982 doesn't like that. The same applies to other directories like
2983 "Resources/Bitmaps"
2984
2985 In the configuration section for nt, move the wxWindows directory
2986 optins into the part clearly marked as editable.
2987
2988 (InstallLocal.initialize_options):
2989 (InstallLocal.user_options): remove the currently unused debug
2990 flag
2991 (thuban_build_py.find_all_modules): Add this method so that it
2992 works for our case of having packages and modules in one
2993 distribution as well.
2994 (ThubanInstall.initialize_options):
2995 (ThubanInstall.finalize_options):
2996 (ThubanInstall.user_options):
2997 (ThubanInstall.boolean_options): Add new options, do-symlink and
2998 extra files. Since these are the first ThubanInstall specific
2999 options, override user_options and boolean_options
3000 (ThubanInstall.run): Honor the new do-symlink and extra-files
3001 options.
3002 (ThubanInstall.get_outputs): Add to override the base-class's
3003 version and add the extra-files to the outputs
3004 (bdist_inno): New class for windows distributions with Inno Setup
3005 (InnoIconItem): Helper class for bdist_inno
3006 (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
3007 this together with the appropriate parameters, to the setup call.
3008
3009 * setup.cfg (bdist_inno): added new section for the inno setup
3010 installer
3011
3012 * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
3013 changing_selection to avoid recursive selection events when
3014 modifying the selection in response to a selection event.
3015 (myTreeCtrlPanel.normalize_selection): Set the new inst var when
3016 changing the tree's selection.
3017 (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
3018 we're not being called indirectly from normalize_selection.
3019
3020 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
3021 event.Check only if the command is actuall checkable.
3022 (MainWindow.__init__): Call the toolbar's Realize method to make
3023 sure that the items are actually shown
3024
3025 2001-08-28 Bernhard Herzog <[email protected]>
3026
3027 * setup.py: Fix some doc strings
3028
3029 * ChangeLog: started
3030

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26