/[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 602 - (hide annotations)
Fri Apr 4 12:12:18 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: 23102 byte(s)
Fix assert calls.
    (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
    Copy the color parameter rather than hold onto a reference.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26