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

Annotation of /branches/WIP-pyshapelib-bramz/Thuban/Model/classification.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 637 - (hide annotations)
Thu Apr 10 14:35:03 2003 UTC (21 years, 11 months ago) by jonathan
Original Path: trunk/thuban/Thuban/Model/classification.py
File MIME type: text/x-python
File size: 23342 byte(s)
(ClassGroup): Move all the common
        methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
        here. Implement SetVisible(), IsVisible().
(ClassGroup.__init__): Add group parameter which acts as a copy
        constructor.

1 bh 453 # Copyright (c) 2001, 2003 by Intevation GmbH
2 jonathan 371 # Authors:
3     # Jonathan Coles <[email protected]>
4     #
5     # This program is free software under the GPL (>=v2)
6     # Read the file COPYING coming with Thuban for details.
7    
8     __version__ = "$Revision$"
9    
10     """
11     A Classification provides a mapping from an input value
12     to data. This mapping can be specified in two ways.
13     First, specific values can be associated with data.
14     Second, ranges can be associated with data such that if
15     an input value falls with a range that data is returned.
16 jonathan 388 If no mapping can be found then default data will
17 jonathan 371 be returned. Input values must be hashable objects
18    
19 jonathan 613 See the description of FindGroup() for more information
20 jonathan 371 on the mapping algorithm.
21     """
22    
23 jonathan 397 # fix for people using python2.1
24     from __future__ import nested_scopes
25    
26 jonathan 484 import copy
27    
28 jonathan 613 from Thuban import _
29    
30 jonathan 436 from types import *
31    
32 jonathan 613 from messages import \
33     LAYER_PROJECTION_CHANGED, \
34     LAYER_LEGEND_CHANGED, \
35     LAYER_VISIBILITY_CHANGED
36 jonathan 388
37 jonathan 381 from Thuban.Model.color import Color
38 jan 374
39 jonathan 436 import Thuban.Model.layer
40    
41 jonathan 371 class Classification:
42 jonathan 613 """Encapsulates the classification of layer.
43    
44     The Classification divides some kind of data into Groups which
45     are associated with properties. Later the properties can be
46     retrieved by matching data values to the appropriate group.
47     """
48 jonathan 371
49 jonathan 410 def __init__(self, layer = None, field = None):
50 jonathan 371 """Initialize a classification.
51    
52 jonathan 613 layer -- the Layer object who owns this classification
53 jonathan 388
54 jonathan 613 field -- the name of the data table field that
55     is to be used to classify layer properties
56 jonathan 371 """
57    
58 jonathan 462 self.layer = None
59     self.field = None
60     self.fieldType = None
61 jonathan 613 self.__groups = []
62 jonathan 436
63 jonathan 528 self.__setLayerLock = False
64    
65 jonathan 436 self.SetDefaultGroup(ClassGroupDefault())
66 jonathan 491
67 jonathan 462 self.SetLayer(layer)
68 jonathan 436 self.SetField(field)
69    
70 jonathan 428 def __iter__(self):
71 jonathan 613 return ClassIterator(self.__groups)
72 jonathan 428
73 jonathan 613 def __deepcopy__(self, memo):
74     clazz = Classification()
75    
76 jonathan 627 # note: the only thing that isn't copied is the layer reference
77     clazz.field = self.field
78     clazz.fieldType = self.fieldType
79 jonathan 613 clazz.__groups[0] = copy.deepcopy(self.__groups[0])
80    
81     for i in range(1, len(self.__groups)):
82     clazz.__groups.append(copy.deepcopy(self.__groups[i]))
83    
84     return clazz
85    
86 jonathan 491 def __SendNotification(self):
87     """Notify the layer that this class has changed."""
88     if self.layer is not None:
89     self.layer.ClassChanged()
90 jonathan 410
91 jonathan 491 def SetField(self, field):
92 jonathan 371 """Set the name of the data table field to use.
93    
94 jonathan 613 If there is no layer then the field type is set to None,
95     otherwise the layer is queried to find the type of the
96     field data
97 jonathan 479
98 jonathan 613 field -- if None then all values map to the default data
99 jonathan 371 """
100    
101 jonathan 436 if field == "":
102     field = None
103    
104 jonathan 462
105 jonathan 491 if field is None:
106     if self.layer is not None:
107     self.fieldType = None
108 jonathan 462 else:
109 jonathan 491 if self.layer is not None:
110     fieldType = self.layer.GetFieldType(field)
111     if fieldType is None:
112     raise ValueError("'%s' was not found in the layer's table."
113     % self.field)
114 jonathan 462
115 jonathan 491 #
116     # unfortunately we cannot call SetFieldType() because it
117     # requires the layer to be None
118     #
119     self.fieldType = fieldType
120     #self.SetFieldType(fieldType)
121 jonathan 462
122 jonathan 491 self.field = field
123 jonathan 462
124 jonathan 491 self.__SendNotification()
125 jonathan 371
126 jonathan 388 def GetField(self):
127 jonathan 462 """Return the name of the field."""
128 jonathan 388 return self.field
129    
130 jonathan 462 def GetFieldType(self):
131     """Return the field type."""
132     return self.fieldType
133    
134     def SetFieldType(self, type):
135 jonathan 491 """Set the type of the field used by this classification.
136 jonathan 462
137 jonathan 491 A ValueError is raised if the owning layer is not None and
138     'type' is different from the current field type.
139     """
140    
141     if type != self.fieldType:
142     if self.layer is not None:
143     raise ValueError()
144     else:
145     self.fieldType = type
146     self.__SendNotification()
147    
148 jonathan 410 def SetLayer(self, layer):
149 jonathan 491 """Set the owning Layer of this classification.
150    
151 jonathan 613 A ValueError exception will be thrown either the field or
152     field type mismatch the information in the layer's table.
153 jonathan 491 """
154 jonathan 462
155 jonathan 528 # prevent infinite recursion when calling SetClassification()
156     if self.__setLayerLock: return
157    
158     self.__setLayerLock = True
159    
160 jonathan 491 if layer is None:
161     if self.layer is not None:
162     l = self.layer
163     self.layer = None
164     l.SetClassification(None)
165     else:
166 jonathan 602 assert isinstance(layer, Thuban.Model.layer.Layer)
167 jonathan 462
168 jonathan 491 old_layer = self.layer
169 jonathan 479
170 jonathan 491 self.layer = layer
171 jonathan 462
172 jonathan 491 try:
173     self.SetField(self.GetField()) # this sync's the fieldType
174     except ValueError:
175     self.layer = old_layer
176 jonathan 528 self.__setLayerLock = False
177 jonathan 491 raise ValueError
178     else:
179     self.layer.SetClassification(self)
180 jonathan 410
181 jonathan 528 self.__setLayerLock = False
182    
183 jonathan 410 def GetLayer(self):
184 jonathan 462 """Return the parent layer."""
185     return self.layer
186 jonathan 410
187 jonathan 371
188 jonathan 428 #
189     # these SetDefault* methods are really only provided for
190     # some backward compatibility. they should be considered
191     # for removal once all the classification code is finished.
192     #
193    
194 jonathan 388 def SetDefaultFill(self, fill):
195 jonathan 462 """Set the default fill color.
196    
197     fill -- a Color object.
198     """
199 jonathan 602 assert isinstance(fill, Color)
200 jonathan 462 self.GetDefaultGroup().GetProperties().SetFill(fill)
201 jonathan 491 self.__SendNotification()
202 jonathan 388
203     def GetDefaultFill(self):
204 jonathan 462 """Return the default fill color."""
205     return self.GetDefaultGroup().GetProperties().GetFill()
206 jonathan 388
207 jonathan 462 def SetDefaultLineColor(self, color):
208     """Set the default line color.
209    
210     color -- a Color object.
211     """
212 jonathan 602 assert isinstance(color, Color)
213 jonathan 462 self.GetDefaultGroup().GetProperties().SetLineColor(color)
214 jonathan 491 self.__SendNotification()
215 jonathan 388
216 jonathan 462 def GetDefaultLineColor(self):
217     """Return the default line color."""
218     return self.GetDefaultGroup().GetProperties().GetLineColor()
219 jonathan 388
220 jonathan 462 def SetDefaultLineWidth(self, lineWidth):
221     """Set the default line width.
222    
223     lineWidth -- an integer > 0.
224     """
225 jonathan 602 assert isinstance(lineWidth, IntType)
226 jonathan 462 self.GetDefaultGroup().GetProperties().SetLineWidth(lineWidth)
227 jonathan 491 self.__SendNotification()
228 jonathan 388
229 jonathan 462 def GetDefaultLineWidth(self):
230     """Return the default line width."""
231     return self.GetDefaultGroup().GetProperties().GetLineWidth()
232 jonathan 388
233 jonathan 462
234 jonathan 613 #
235     # The methods that manipulate self.__groups have to be kept in
236     # sync. We store the default group in index 0 to make it
237     # convienent to iterate over the classification's groups, but
238     # from the user's perspective the first (non-default) group is
239     # at index 0 and the DefaultGroup is a special entity.
240     #
241    
242     def SetDefaultGroup(self, group):
243     """Set the group to be used when a value can't be classified.
244    
245     group -- group that the value maps to.
246     """
247    
248     assert isinstance(group, ClassGroupDefault)
249     if len(self.__groups) > 0:
250     self.__groups[0] = group
251     else:
252     self.__groups.append(group)
253    
254     def GetDefaultGroup(self):
255     """Return the default group."""
256     return self.__groups[0]
257    
258     def AppendGroup(self, item):
259     """Append a new ClassGroup item to the classification.
260    
261 jonathan 462 item -- this must be a valid ClassGroup object
262     """
263    
264 jonathan 613 self.InsertGroup(self.GetNumGroups(), item)
265 jonathan 371
266 jonathan 613 def InsertGroup(self, index, group):
267    
268     assert isinstance(group, ClassGroup)
269 jonathan 371
270 jonathan 613 self.__groups.insert(index + 1, group)
271    
272 jonathan 491 self.__SendNotification()
273 jonathan 371
274 jonathan 613 def RemoveGroup(self, index):
275     return self.__groups.pop(index + 1)
276    
277     def ReplaceGroup(self, index, group):
278     assert isinstance(group, ClassGroup)
279    
280     self.__groups[index + 1] = group
281    
282     self.__SendNotification()
283    
284     def GetGroup(self, index):
285     return self.__groups[index + 1]
286    
287     def GetNumGroups(self):
288     """Return the number of non-default groups in the classification."""
289     return len(self.__groups) - 1
290    
291    
292     def FindGroup(self, value):
293 jonathan 462 """Return the associated group, or the default group.
294 jonathan 371
295 jonathan 613 Groups are checked in the order the were added to the
296     Classification.
297 jonathan 371
298 jonathan 613 value -- the value to classify. If there is no mapping,
299     the field is None or value is None,
300     return the default properties
301 jonathan 371 """
302    
303 jonathan 479 if self.GetField() is not None and value is not None:
304 jonathan 371
305 jonathan 613 for i in range(1, len(self.__groups)):
306     group = self.__groups[i]
307 jonathan 462 if group.Matches(value):
308     return group
309 jonathan 371
310 jonathan 462 return self.GetDefaultGroup()
311 jonathan 371
312 jonathan 462 def GetProperties(self, value):
313 jonathan 613 """Return the properties associated with the given value.
314    
315     Use this function rather than Classification.FindGroup().GetProperties()
316     since the returned group may be a ClassGroupMap which doesn't support
317     a call to GetProperties().
318     """
319 jonathan 371
320 jonathan 613 group = self.FindGroup(value)
321 jonathan 462 if isinstance(group, ClassGroupMap):
322     return group.GetPropertiesFromValue(value)
323     else:
324     return group.GetProperties()
325 jonathan 436
326 jonathan 381 def TreeInfo(self):
327     items = []
328 jonathan 378
329 jonathan 410 def build_color_item(text, color):
330 jonathan 609 if color is Color.Transparent:
331 jonathan 410 return ("%s: %s" % (text, _("None")), None)
332 jonathan 381
333 jonathan 410 return ("%s: (%.3f, %.3f, %.3f)" %
334     (text, color.red, color.green, color.blue),
335     color)
336 jonathan 381
337 jonathan 436 def build_item(group, string):
338     label = group.GetLabel()
339 jonathan 410 if label == "":
340     label = string
341     else:
342     label += " (%s)" % string
343    
344 jonathan 436 props = group.GetProperties()
345 jonathan 381 i = []
346 jonathan 462 v = props.GetLineColor()
347     i.append(build_color_item(_("Line Color"), v))
348     v = props.GetLineWidth()
349     i.append(_("Line Width: %s") % v)
350 jonathan 436 v = props.GetFill()
351 jonathan 410 i.append(build_color_item(_("Fill"), v))
352     return (label, i)
353 jonathan 388
354 jonathan 428 for p in self:
355 jonathan 613 items.append(build_item(p, p.GetDisplayText()))
356 jonathan 388
357 jonathan 613 # if isinstance(p, ClassGroupDefault):
358     # items.append(build_item(self.GetDefaultGroup(), _("'DEFAULT'")))
359     # elif isinstance(p, ClassGroupSingleton):
360     # items.append(build_item(p, str(p.GetValue())))
361     # elif isinstance(p, ClassGroupRange):
362     # items.append(build_item(p, "%s - %s" %
363     # (p.GetMin(), p.GetMax())))
364    
365 jonathan 436 return (_("Classification"), items)
366 jonathan 381
367 jonathan 428 class ClassIterator:
368 jonathan 462 """Allows the Groups in a Classifcation to be interated over.
369 jonathan 388
370 jonathan 462 The items are returned in the following order:
371     default data, singletons, ranges, maps
372     """
373 jonathan 428
374 jonathan 462 def __init__(self, data): #default, points, ranges, maps):
375     """Constructor.
376    
377     default -- the default group
378    
379     points -- a list of singleton groups
380    
381     ranges -- a list of range groups
382    
383     maps -- a list of map groups
384     """
385    
386     self.data = data #[default, points, ranges, maps]
387     self.data_index = 0
388     #self.data_iter = iter(self.data)
389     #self.iter = None
390    
391 jonathan 428 def __iter__(self):
392     return self
393    
394     def next(self):
395 jonathan 462 """Return the next item."""
396 jonathan 428
397 jonathan 462 if self.data_index >= len(self.data):
398     raise StopIteration
399     else:
400     d = self.data[self.data_index]
401     self.data_index += 1
402     return d
403    
404     # if self.iter is None:
405     # try:
406     # self.data_item = self.data_iter.next()
407     # self.iter = iter(self.data_item)
408     # except TypeError:
409     # return self.data_item
410    
411     # try:
412     # return self.iter.next()
413     # except StopIteration:
414     # self.iter = None
415     # return self.next()
416 jonathan 428
417 jonathan 436 class ClassGroupProperties:
418 jonathan 462 """Represents the properties of a single Classification Group.
419    
420     These are used when rendering a layer."""
421 jonathan 388
422 jonathan 462 def __init__(self, props = None):
423     """Constructor.
424 jonathan 410
425 jonathan 462 props -- a ClassGroupProperties object. The class is copied if
426     prop is not None. Otherwise, a default set of properties
427 jonathan 479 is created such that: line color = Color.Black, line width = 1,
428 jonathan 609 and fill color = Color.Transparent
429 jonathan 462 """
430    
431 jonathan 637 #self.stroke = None
432     #self.strokeWidth = 0
433     #self.fill = None
434 jonathan 462
435     if props is not None:
436     self.SetProperties(props)
437 jonathan 410 else:
438 jonathan 484 self.SetLineColor(Color.Black)
439 jonathan 462 self.SetLineWidth(1)
440 jonathan 609 self.SetFill(Color.Transparent)
441 jonathan 410
442 jonathan 462 def SetProperties(self, props):
443     """Set this class's properties to those in class props."""
444    
445 jonathan 602 assert isinstance(props, ClassGroupProperties)
446 jonathan 462 self.SetLineColor(props.GetLineColor())
447     self.SetLineWidth(props.GetLineWidth())
448     self.SetFill(props.GetFill())
449    
450     def GetLineColor(self):
451     """Return the line color as a Color object."""
452 jonathan 388 return self.stroke
453    
454 jonathan 462 def SetLineColor(self, color):
455     """Set the line color.
456 jonathan 388
457 jonathan 462 color -- the color of the line. This must be a Color object.
458     """
459 jonathan 388
460 jonathan 602 assert isinstance(color, Color)
461 jonathan 609 self.stroke = color
462 jonathan 410
463 jonathan 462 def GetLineWidth(self):
464     """Return the line width."""
465     return self.strokeWidth
466 jonathan 388
467 jonathan 462 def SetLineWidth(self, lineWidth):
468     """Set the line width.
469    
470     lineWidth -- the new line width. This must be > 0.
471     """
472 jonathan 602 assert isinstance(lineWidth, IntType)
473 jonathan 462 if (lineWidth < 1):
474     raise ValueError(_("lineWidth < 1"))
475    
476     self.strokeWidth = lineWidth
477    
478 jonathan 388 def GetFill(self):
479 jonathan 462 """Return the fill color as a Color object."""
480 jonathan 388 return self.fill
481    
482     def SetFill(self, fill):
483 jonathan 462 """Set the fill color.
484    
485     fill -- the color of the fill. This must be a Color object.
486     """
487    
488 jonathan 602 assert isinstance(fill, Color)
489 jonathan 609 self.fill = fill
490 jonathan 388
491 jonathan 479 def __eq__(self, other):
492     """Return true if 'props' has the same attributes as this class"""
493 jonathan 436
494 jonathan 479 return isinstance(other, ClassGroupProperties) \
495     and self.stroke == other.GetLineColor() \
496     and self.strokeWidth == other.GetLineWidth() \
497     and self.fill == other.GetFill()
498    
499     def __ne__(self, other):
500     return not self.__eq__(other)
501    
502 jonathan 484 def __copy__(self):
503     return ClassGroupProperties(self)
504    
505 jonathan 602 def __deepcopy__(self):
506     return ClassGroupProperties(self)
507    
508 jonathan 436 class ClassGroup:
509 jonathan 462 """A base class for all Groups within a Classification"""
510 jonathan 436
511 jonathan 637 def __init__(self, label = "", props = None, group = None):
512 jonathan 462 """Constructor.
513 jonathan 436
514 jonathan 462 label -- A string representing the Group's label
515     """
516    
517 jonathan 637 if group is not None:
518     self.SetLabel(copy.copy(group.GetLabel()))
519     self.SetProperties(copy.copy(group.GetProperties()))
520     self.SetVisible(group.IsVisible())
521     else:
522     self.SetLabel(label)
523     self.SetProperties(props)
524     self.SetVisible(True)
525 jonathan 462
526 jonathan 388 def GetLabel(self):
527 jonathan 462 """Return the Group's label."""
528 jonathan 388 return self.label
529    
530     def SetLabel(self, label):
531 jonathan 462 """Set the Group's label.
532    
533     label -- a string representing the Group's label. This must
534     not be None.
535     """
536 jonathan 602 assert isinstance(label, StringType)
537 jonathan 388 self.label = label
538    
539 jonathan 544 def GetDisplayText(self):
540 jonathan 602 assert False, "GetDisplay must be overridden by subclass!"
541 jonathan 544 return ""
542    
543 jonathan 436 def Matches(self, value):
544 jonathan 462 """Determines if this Group is associated with the given value.
545    
546 jonathan 479 Returns False. This needs to be overridden by all subclasses.
547 jonathan 462 """
548 jonathan 602 assert False, "GetMatches must be overridden by subclass!"
549 jonathan 479 return False
550 jonathan 436
551 jonathan 462 def GetProperties(self):
552 jonathan 637 """Return the properties associated with the given value."""
553 jonathan 462
554 jonathan 637 return self.prop
555    
556     def SetProperties(self, prop):
557     """Set the properties associated with this Group.
558    
559     prop -- a ClassGroupProperties object. if prop is None,
560     a default set of properties is created.
561 jonathan 462 """
562 jonathan 637
563     if prop is None: prop = ClassGroupProperties()
564     assert isinstance(prop, ClassGroupProperties)
565     self.prop = prop
566    
567     def IsVisible(self):
568     return self.visible
569    
570     def SetVisible(self, visible):
571     self.visible = visible
572    
573     def __eq__(self, other):
574     return isinstance(other, ClassGroup) \
575     and self.GetProperties() == other.GetProperties()
576    
577     def __ne__(self, other):
578     return not self.__eq__(other)
579    
580 jonathan 410
581 jonathan 436 class ClassGroupSingleton(ClassGroup):
582 jonathan 462 """A Group that is associated with a single value."""
583 jonathan 410
584 jonathan 637 def __init__(self, value = 0, props = None, label = "", group = None):
585 jonathan 462 """Constructor.
586    
587     value -- the associated value.
588    
589     prop -- a ClassGroupProperites object. If prop is None a default
590     set of properties is created.
591    
592     label -- a label for this group.
593     """
594 jonathan 637 ClassGroup.__init__(self, label, props, group)
595 jonathan 410
596 jonathan 436 self.SetValue(value)
597 jonathan 410
598 jonathan 436 def __copy__(self):
599 jonathan 479 return ClassGroupSingleton(self.GetValue(),
600     self.GetProperties(),
601     self.GetLabel())
602 jonathan 436
603 jonathan 484 def __deepcopy__(self, memo):
604 jonathan 637 return ClassGroupSingleton(self.GetValue(), group = self)
605 jonathan 484
606 jonathan 410 def GetValue(self):
607 jonathan 462 """Return the associated value."""
608 jonathan 410 return self.value
609    
610     def SetValue(self, value):
611 jonathan 462 """Associate this Group with the given value."""
612 jonathan 410 self.value = value
613    
614 jonathan 436 def Matches(self, value):
615 jonathan 462 """Determine if the given value matches the associated Group value."""
616    
617     """Returns True if the value matches, False otherwise."""
618    
619 jonathan 436 return self.value == value
620 jonathan 410
621 jonathan 544 def GetDisplayText(self):
622     label = self.GetLabel()
623    
624     if label != "": return label
625    
626     return str(self.GetValue())
627    
628 jonathan 479 def __eq__(self, other):
629 jonathan 637 return ClassGroup.__eq__(self, other) \
630     and isinstance(other, ClassGroupSingleton) \
631 jonathan 479 and self.GetValue() == other.GetValue()
632 jonathan 436
633 jonathan 479 class ClassGroupDefault(ClassGroup):
634 jonathan 462 """The default Group. When values do not match any other
635     Group within a Classification, the properties from this
636     class are used."""
637    
638 jonathan 637 def __init__(self, props = None, label = "", group = None):
639 jonathan 462 """Constructor.
640    
641     prop -- a ClassGroupProperites object. If prop is None a default
642     set of properties is created.
643    
644     label -- a label for this group.
645     """
646    
647 jonathan 637 ClassGroup.__init__(self, label, props, group)
648 jonathan 436
649     def __copy__(self):
650 jonathan 479 return ClassGroupDefault(self.GetProperties(), self.GetLabel())
651 jonathan 436
652 jonathan 484 def __deepcopy__(self, memo):
653 jonathan 637 return ClassGroupDefault(label = self.GetLabel(), group = self)
654 jonathan 484
655 jonathan 479 def Matches(self, value):
656     return True
657    
658 jonathan 544 def GetDisplayText(self):
659     label = self.GetLabel()
660    
661     if label != "": return label
662    
663 jonathan 613 return _("DEFAULT")
664 jonathan 544
665 jonathan 479 def __eq__(self, other):
666 jonathan 637 return ClassGroup.__eq__(self, other) \
667     and isinstance(other, ClassGroupDefault) \
668 jonathan 479 and self.GetProperties() == other.GetProperties()
669    
670 jonathan 436 class ClassGroupRange(ClassGroup):
671 jonathan 462 """A Group that represents a range of values that map to the same
672     set of properties."""
673 jonathan 436
674 jonathan 637 def __init__(self, min = 0, max = 1, props = None, label = "", group=None):
675 jonathan 462 """Constructor.
676    
677     The minumum value must be strictly less than the maximum.
678    
679     min -- the minimum range value
680    
681     max -- the maximum range value
682    
683     prop -- a ClassGroupProperites object. If prop is None a default
684     set of properties is created.
685    
686     label -- a label for this group.
687     """
688    
689 jonathan 637 ClassGroup.__init__(self, label, props, None)
690 jonathan 436
691 jonathan 462 self.min = self.max = 0
692    
693 jonathan 410 self.SetRange(min, max)
694    
695 jonathan 436 def __copy__(self):
696 jonathan 479 return ClassGroupRange(self.GetMin(),
697     self.GetMax(),
698     self.GetProperties(),
699     self.GetLabel())
700 jonathan 436
701 jonathan 484 def __deepcopy__(self, memo):
702     return ClassGroupRange(copy.copy(self.GetMin()),
703     copy.copy(self.GetMax()),
704 jonathan 637 group = self)
705 jonathan 484
706 jonathan 410 def GetMin(self):
707 jonathan 462 """Return the range's minimum value."""
708 jonathan 410 return self.min
709    
710     def SetMin(self, min):
711 jonathan 462 """Set the range's minimum value.
712    
713     min -- the new minimum. Note that this must be less than the current
714     maximum value. Use SetRange() to change both min and max values.
715     """
716    
717 jonathan 410 self.SetRange(min, self.max)
718    
719     def GetMax(self):
720 jonathan 462 """Return the range's maximum value."""
721 jonathan 410 return self.max
722    
723     def SetMax(self, max):
724 jonathan 462 """Set the range's maximum value.
725    
726     max -- the new maximum. Note that this must be greater than the current
727     minimum value. Use SetRange() to change both min and max values.
728     """
729 jonathan 410 self.SetRange(self.min, max)
730    
731     def SetRange(self, min, max):
732 jonathan 462 """Set a new range.
733    
734     Note that min must be strictly less than max.
735    
736     min -- the new minimum value
737     min -- the new maximum value
738     """
739    
740 jonathan 436 if min >= max:
741     raise ValueError(_("ClassGroupRange: %i(min) >= %i(max)!") %
742     (min, max))
743 jonathan 410 self.min = min
744     self.max = max
745    
746     def GetRange(self):
747 jonathan 462 """Return the range as a tuple (min, max)"""
748 jonathan 410 return (self.min, self.max)
749    
750 jonathan 436 def Matches(self, value):
751 jonathan 462 """Determine if the given value lies with the current range.
752    
753     The following check is used: min <= value < max.
754     """
755    
756 jonathan 410 return self.min <= value < self.max
757    
758 jonathan 544 def GetDisplayText(self):
759     label = self.GetLabel()
760    
761     if label != "": return label
762    
763     return _("%s - %s") % (self.GetMin(), self.GetMax())
764    
765 jonathan 479 def __eq__(self, other):
766 jonathan 637 return ClassGroup.__eq__(self, other) \
767     and isinstance(other, ClassGroupRange) \
768 jonathan 479 and self.GetRange() == other.GetRange()
769    
770 jonathan 436 class ClassGroupMap(ClassGroup):
771 jonathan 462 """Currently, this class is not used."""
772 jonathan 436
773 jonathan 410 FUNC_ID = "id"
774    
775 jonathan 436 def __init__(self, map_type = FUNC_ID, func = None, prop = None, label=""):
776 jonathan 462 ClassGroup.__init__(self, label)
777 jonathan 410
778     self.map_type = map_type
779     self.func = func
780    
781     if self.func is None:
782     self.func = func_id
783    
784     def Map(self, value):
785     return self.func(value)
786    
787 jonathan 462 def GetProperties(self):
788     return None
789    
790     def GetPropertiesFromValue(self, value):
791     pass
792    
793 jonathan 544 def GetDisplayText(self):
794     return "Map: " + self.map_type
795    
796 jonathan 410 #
797     # built-in mappings
798     #
799     def func_id(value):
800     return value
801    

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26