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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 766 - (show annotations)
Tue Apr 29 12:42:27 2003 UTC (21 years, 10 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 111325 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26