/[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 627 - (hide annotations)
Wed Apr 9 10:08:47 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: 24491 byte(s)
(Classification.__deepcopy__): Need to copy over field and fieldType attributes.

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     self.stroke = None
432     self.strokeWidth = 0
433     self.fill = None
434    
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     def __init__(self, label = ""):
512 jonathan 462 """Constructor.
513 jonathan 436
514 jonathan 462 label -- A string representing the Group's label
515     """
516    
517     self.label = None
518    
519     self.SetLabel(label)
520    
521 jonathan 388 def GetLabel(self):
522 jonathan 462 """Return the Group's label."""
523 jonathan 388 return self.label
524    
525     def SetLabel(self, label):
526 jonathan 462 """Set the Group's label.
527    
528     label -- a string representing the Group's label. This must
529     not be None.
530     """
531 jonathan 602 assert isinstance(label, StringType)
532 jonathan 388 self.label = label
533    
534 jonathan 544 def GetDisplayText(self):
535 jonathan 602 assert False, "GetDisplay must be overridden by subclass!"
536 jonathan 544 return ""
537    
538 jonathan 436 def Matches(self, value):
539 jonathan 462 """Determines if this Group is associated with the given value.
540    
541 jonathan 479 Returns False. This needs to be overridden by all subclasses.
542 jonathan 462 """
543 jonathan 602 assert False, "GetMatches must be overridden by subclass!"
544 jonathan 479 return False
545 jonathan 436
546 jonathan 462 def GetProperties(self):
547     """Return the properties associated with the given value.
548    
549 jonathan 479 Returns None. This needs to be overridden by all subclasses.
550 jonathan 462 """
551 jonathan 602 assert False, "GetProperties must be overridden by subclass!"
552 jonathan 479 return None
553 jonathan 436
554 jonathan 410
555 jonathan 436 class ClassGroupSingleton(ClassGroup):
556 jonathan 462 """A Group that is associated with a single value."""
557 jonathan 410
558 jonathan 436 def __init__(self, value = 0, prop = None, label = ""):
559 jonathan 462 """Constructor.
560    
561     value -- the associated value.
562    
563     prop -- a ClassGroupProperites object. If prop is None a default
564     set of properties is created.
565    
566     label -- a label for this group.
567     """
568 jonathan 436 ClassGroup.__init__(self, label)
569 jonathan 410
570 jonathan 462 self.prop = None
571     self.value = None
572    
573 jonathan 436 self.SetValue(value)
574     self.SetProperties(prop)
575 jonathan 410
576 jonathan 436 def __copy__(self):
577 jonathan 479 return ClassGroupSingleton(self.GetValue(),
578     self.GetProperties(),
579     self.GetLabel())
580 jonathan 436
581 jonathan 484 def __deepcopy__(self, memo):
582     return ClassGroupSingleton(copy.copy(self.GetValue()),
583     copy.copy(self.GetProperties()),
584     copy.copy(self.GetLabel()))
585    
586 jonathan 410 def GetValue(self):
587 jonathan 462 """Return the associated value."""
588 jonathan 410 return self.value
589    
590     def SetValue(self, value):
591 jonathan 462 """Associate this Group with the given value."""
592 jonathan 410 self.value = value
593    
594 jonathan 436 def Matches(self, value):
595 jonathan 462 """Determine if the given value matches the associated Group value."""
596    
597     """Returns True if the value matches, False otherwise."""
598    
599 jonathan 436 return self.value == value
600 jonathan 410
601 jonathan 462 def GetProperties(self):
602     """Return the Properties associated with this Group."""
603 jonathan 410
604 jonathan 462 return self.prop
605 jonathan 410
606 jonathan 436 def SetProperties(self, prop):
607 jonathan 462 """Set the properties associated with this Group.
608    
609     prop -- a ClassGroupProperties object. if prop is None,
610     a default set of properties is created.
611     """
612    
613 jonathan 436 if prop is None: prop = ClassGroupProperties()
614 jonathan 602 assert isinstance(prop, ClassGroupProperties)
615 jonathan 436 self.prop = prop
616    
617 jonathan 544 def GetDisplayText(self):
618     label = self.GetLabel()
619    
620     if label != "": return label
621    
622     return str(self.GetValue())
623    
624 jonathan 479 def __eq__(self, other):
625     return isinstance(other, ClassGroupSingleton) \
626     and self.GetProperties() == other.GetProperties() \
627     and self.GetValue() == other.GetValue()
628 jonathan 436
629 jonathan 479 def __ne__(self, other):
630     return not self.__eq__(other)
631    
632     class ClassGroupDefault(ClassGroup):
633 jonathan 462 """The default Group. When values do not match any other
634     Group within a Classification, the properties from this
635     class are used."""
636    
637 jonathan 436 def __init__(self, prop = None, label = ""):
638 jonathan 462 """Constructor.
639    
640     prop -- a ClassGroupProperites object. If prop is None a default
641     set of properties is created.
642    
643     label -- a label for this group.
644     """
645    
646 jonathan 479 ClassGroup.__init__(self, label)
647     self.SetProperties(prop)
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     return ClassGroupDefault(copy.copy(self.GetProperties()),
654     copy.copy(self.GetLabel()))
655    
656 jonathan 479 def Matches(self, value):
657     return True
658    
659 jonathan 462 def GetProperties(self):
660     """Return the Properties associated with this Group."""
661 jonathan 436 return self.prop
662    
663 jonathan 479 def SetProperties(self, prop):
664     """Set the properties associated with this Group.
665    
666     prop -- a ClassGroupProperties object. if prop is None,
667     a default set of properties is created.
668     """
669    
670     if prop is None: prop = ClassGroupProperties()
671 jonathan 602 assert isinstance(prop, ClassGroupProperties)
672 jonathan 479 self.prop = prop
673    
674 jonathan 544 def GetDisplayText(self):
675     label = self.GetLabel()
676    
677     if label != "": return label
678    
679 jonathan 613 return _("DEFAULT")
680 jonathan 544
681 jonathan 479 def __eq__(self, other):
682     return isinstance(other, ClassGroupDefault) \
683     and self.GetProperties() == other.GetProperties()
684    
685     def __ne__(self, other):
686     return not self.__eq__(other)
687    
688 jonathan 436 class ClassGroupRange(ClassGroup):
689 jonathan 462 """A Group that represents a range of values that map to the same
690     set of properties."""
691 jonathan 436
692     def __init__(self, min = 0, max = 1, prop = None, label = ""):
693 jonathan 462 """Constructor.
694    
695     The minumum value must be strictly less than the maximum.
696    
697     min -- the minimum range value
698    
699     max -- the maximum range value
700    
701     prop -- a ClassGroupProperites object. If prop is None a default
702     set of properties is created.
703    
704     label -- a label for this group.
705     """
706    
707 jonathan 436 ClassGroup.__init__(self, label)
708    
709 jonathan 462 self.min = self.max = 0
710     self.prop = None
711    
712 jonathan 410 self.SetRange(min, max)
713 jonathan 436 self.SetProperties(prop)
714 jonathan 410
715 jonathan 436 def __copy__(self):
716 jonathan 479 return ClassGroupRange(self.GetMin(),
717     self.GetMax(),
718     self.GetProperties(),
719     self.GetLabel())
720 jonathan 436
721 jonathan 484 def __deepcopy__(self, memo):
722     return ClassGroupRange(copy.copy(self.GetMin()),
723     copy.copy(self.GetMax()),
724     copy.copy(self.GetProperties()),
725     copy.copy(self.GetLabel()))
726    
727 jonathan 410 def GetMin(self):
728 jonathan 462 """Return the range's minimum value."""
729 jonathan 410 return self.min
730    
731     def SetMin(self, min):
732 jonathan 462 """Set the range's minimum value.
733    
734     min -- the new minimum. Note that this must be less than the current
735     maximum value. Use SetRange() to change both min and max values.
736     """
737    
738 jonathan 410 self.SetRange(min, self.max)
739    
740     def GetMax(self):
741 jonathan 462 """Return the range's maximum value."""
742 jonathan 410 return self.max
743    
744     def SetMax(self, max):
745 jonathan 462 """Set the range's maximum value.
746    
747     max -- the new maximum. Note that this must be greater than the current
748     minimum value. Use SetRange() to change both min and max values.
749     """
750 jonathan 410 self.SetRange(self.min, max)
751    
752     def SetRange(self, min, max):
753 jonathan 462 """Set a new range.
754    
755     Note that min must be strictly less than max.
756    
757     min -- the new minimum value
758     min -- the new maximum value
759     """
760    
761 jonathan 436 if min >= max:
762     raise ValueError(_("ClassGroupRange: %i(min) >= %i(max)!") %
763     (min, max))
764 jonathan 410 self.min = min
765     self.max = max
766    
767     def GetRange(self):
768 jonathan 462 """Return the range as a tuple (min, max)"""
769 jonathan 410 return (self.min, self.max)
770    
771 jonathan 436 def Matches(self, value):
772 jonathan 462 """Determine if the given value lies with the current range.
773    
774     The following check is used: min <= value < max.
775     """
776    
777 jonathan 410 return self.min <= value < self.max
778    
779 jonathan 462 def GetProperties(self):
780     """Return the Properties associated with this Group."""
781     return self.prop
782 jonathan 410
783 jonathan 462 def SetProperties(self, prop):
784     """Set the properties associated with this Group.
785 jonathan 436
786 jonathan 462 prop -- a ClassGroupProperties object. if prop is None,
787     a default set of properties is created.
788     """
789 jonathan 436 if prop is None: prop = ClassGroupProperties()
790 jonathan 602 assert isinstance(prop, ClassGroupProperties)
791 jonathan 436 self.prop = prop
792    
793 jonathan 544 def GetDisplayText(self):
794     label = self.GetLabel()
795    
796     if label != "": return label
797    
798     return _("%s - %s") % (self.GetMin(), self.GetMax())
799    
800 jonathan 479 def __eq__(self, other):
801     return isinstance(other, ClassGroupRange) \
802     and self.GetProperties() == other.GetProperties() \
803     and self.GetRange() == other.GetRange()
804    
805     def __ne__(self, other):
806     return not self.__eq__(other)
807    
808 jonathan 436 class ClassGroupMap(ClassGroup):
809 jonathan 462 """Currently, this class is not used."""
810 jonathan 436
811 jonathan 410 FUNC_ID = "id"
812    
813 jonathan 436 def __init__(self, map_type = FUNC_ID, func = None, prop = None, label=""):
814 jonathan 462 ClassGroup.__init__(self, label)
815 jonathan 410
816     self.map_type = map_type
817     self.func = func
818    
819     if self.func is None:
820     self.func = func_id
821    
822     def Map(self, value):
823     return self.func(value)
824    
825 jonathan 462 def GetProperties(self):
826     return None
827    
828     def GetPropertiesFromValue(self, value):
829     pass
830    
831 jonathan 544 def GetDisplayText(self):
832     return "Map: " + self.map_type
833    
834 jonathan 410 #
835     # built-in mappings
836     #
837     def func_id(value):
838     return value
839    

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26