/[thuban]/branches/WIP-pyshapelib-bramz/Thuban/Model/session.py
ViewVC logotype

Contents of /branches/WIP-pyshapelib-bramz/Thuban/Model/session.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 232 - (show annotations)
Fri Jul 19 15:14:57 2002 UTC (22 years, 7 months ago) by bh
Original Path: trunk/thuban/Thuban/Model/session.py
File MIME type: text/x-python
File size: 5442 byte(s)
	* Thuban/Model/session.py: Issue a CHANGED message every time
	another changed message is issued to make it easier to get
	notified of changes.
	(Session): Update the doc string
	(Session.forward): Issue changed-events as CHANGED as well.
	(Session.changed): Overwrite the inherited version to issue
	CHANGED events as well.

1 # Copyright (c) 2001, 2002 by Intevation GmbH
2 # Authors:
3 # Bernhard Herzog <[email protected]>
4 # Jan-Oliver Wagner <[email protected]>
5 #
6 # This program is free software under the GPL (>=v2)
7 # Read the file COPYING coming with Thuban for details.
8
9 __version__ = "$Revision$"
10
11 from Thuban.Lib.connector import Publisher
12
13 from messages import MAPS_CHANGED, EXTENSIONS_CHANGED, FILENAME_CHANGED, \
14 LAYERS_CHANGED, MAP_PROJECTION_CHANGED, \
15 LAYER_LEGEND_CHANGED, LAYER_PROJECTION_CHANGED, LAYER_VISIBILITY_CHANGED,\
16 EXTENSION_CHANGED, EXTENSION_OBJECTS_CHANGED, CHANGED
17
18 from base import TitledObject, Modifiable
19
20 from map import Map
21
22
23 class Session(TitledObject, Modifiable):
24
25 """A complete session.
26
27 A Session consists of arbitrary numbers of maps, tables and extensions
28
29 Session objects send the following events:
30
31 TITLE_CHANGED -- The title has changed. Parameters: the session.
32
33 FILENAME_CHANGED -- The filename has changed. No parameters.
34
35 MAPS_CHANGED -- Maps were added, removed.
36
37 EXTENSIONS_CHANGED -- Extensions were added, removed.
38
39 LAYERS_CHANGED -- Same as the map's event of the same name.
40 It's simply resent from the session to make
41 subscriptions easier.
42
43 CHANGED -- Generic changed event. Parameters: the session. The
44 event is always issued when any other changed event
45 is issused. This is useful for code that needs to be
46 notified whenever something in the session has
47 changed but it's too cumbersome or error-prone to
48 subscribe to all the individual events.
49 """
50
51 # message channels that have to be forwarded from maps contained in
52 # the session.
53 forwarded_channels = (
54 # map specific channels
55 MAP_PROJECTION_CHANGED,
56 LAYERS_CHANGED,
57
58 # layer channels forwarded by the map
59 LAYER_PROJECTION_CHANGED,
60 LAYER_LEGEND_CHANGED,
61 LAYER_VISIBILITY_CHANGED,
62
63 # channels forwarded by an extension
64 EXTENSION_CHANGED,
65 EXTENSION_OBJECTS_CHANGED)
66
67 def __init__(self, title):
68 TitledObject.__init__(self, title)
69 Modifiable.__init__(self)
70 self.filename = None
71 self.maps = []
72 self.tables = []
73 self.extensions = []
74
75 def changed(self, channel = None, *args):
76 """Like the inherited version but issue a CHANGED message as well.
77
78 The CHANGED message is only issued if channel given is a
79 different channel than CHANGED.
80 """
81 Modifiable.changed(self, channel, *args)
82 if channel != CHANGED:
83 self.issue(CHANGED, self)
84
85 def SetFilename(self, filename):
86 self.filename = filename
87 self.changed(FILENAME_CHANGED)
88
89 def Maps(self):
90 return self.maps
91
92 def HasMaps(self):
93 return len(self.maps) > 0
94
95 def AddMap(self, map):
96 self.maps.append(map)
97 for channel in self.forwarded_channels:
98 map.Subscribe(channel, self.forward, channel)
99 self.changed(MAPS_CHANGED)
100
101 def Extensions(self):
102 return self.extensions
103
104 def HasExtensions(self):
105 return len(self.extensions) > 0
106
107 def AddExtension(self, extension):
108 self.extensions.append(extension)
109 for channel in self.forwarded_channels:
110 extension.Subscribe(channel, self.forward, channel)
111 self.changed(EXTENSIONS_CHANGED)
112
113 def Destroy(self):
114 for map in self.maps:
115 map.Destroy()
116 self.maps = []
117 self.tables = []
118 Publisher.Destroy(self)
119
120 def forward(self, *args):
121 """Reissue events.
122
123 If the channel the event is forwarded to is a changed-channel
124 that is not the CHANGED channel issue CHANGED as well. An
125 channel is considered to be a changed-channel if it's name ends
126 with 'CHANGED'.
127 """
128 if len(args) > 1:
129 args = (args[-1],) + args[:-1]
130 apply(self.issue, args)
131 channel = args[0]
132 # It's a bit of a kludge to rely on the channel name for this.
133 if channel.endswith("CHANGED") and channel != CHANGED:
134 self.issue(CHANGED, self)
135
136 def WasModified(self):
137 """Return true if the session or one of the maps was modified"""
138 if self.modified:
139 return 1
140 else:
141 for map in self.maps:
142 if map.WasModified():
143 return 1
144 return 0
145
146 def UnsetModified(self):
147 """Unset the modified flag of the session and the maps"""
148 Modifiable.UnsetModified(self)
149 for map in self.maps:
150 map.UnsetModified()
151
152 def TreeInfo(self):
153 items = []
154 if self.filename is None:
155 items.append("Filename:")
156 else:
157 items.append("Filename: %s" % self.filename)
158
159 if self.WasModified():
160 items.append("Modified")
161 else:
162 items.append("Unmodified")
163
164 items.extend(self.maps)
165 items.extend(self.extensions)
166
167 return ("Session: %s" % self.title, items)
168
169
170 def create_empty_session():
171 """Return an empty session useful as a starting point"""
172 import os
173 session = Session('unnamed session')
174 session.SetFilename(None)
175 session.AddMap(Map('unnamed map'))
176 session.UnsetModified()
177 return session

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26