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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 779 - (show annotations)
Tue Apr 29 14:54:26 2003 UTC (21 years, 10 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 112793 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26