1from paida.paida_core.PAbsorber import *
2from paida.paida_core.PExceptions import *
3
4import types
5
6class IAnnotation:
7	titleKey = 'Title'
8
9	def __init__(self):
10		self._data = []
11		self._titleKey = []
12
13	def addItem(self, key, value, sticky = False):
14		if key in self._titleKey:
15			raise IllegalArgumentException()
16		else:
17			self._titleKey.append(key)
18			self._data.append([value, sticky])
19
20	def _addItem(self, key, value, sticky):
21		if key in self._titleKey:
22			self._data[self._titleKey.index(key)] = [value, sticky]
23		else:
24			self._titleKey.append(key)
25			self._data.append([value, sticky])
26
27	def removeItem(self, key):
28		self._removeItem(key, False)
29
30	def _removeItem(self, key, inner = False):
31		if key in self._titleKey:
32			i = self._titleKey.index(key)
33			if self._data[i][1] == True:
34				if inner == False:
35					raise IllegalArgumentException()
36			else:
37				self._titleKey.remove(key)
38				self._data.remove(self._data[i])
39		else:
40			if inner == False:
41				raise IllegalArgumentException()
42
43	def value(self, data):
44		if isinstance(data, types.StringType):
45			key = data
46			if key in self._titleKey:
47				return self._data[self._titleKey.index(key)][0]
48			else:
49				raise IllegalArgumentException('"%s" is not in %s.' % (key, self._titleKey))
50		elif isinstance(data, types.IntType):
51			if 0 <= data < len(self._titleKey):
52				return self._data[data][0]
53			else:
54				raise IllegalArgumentException('Beyond range.')
55		else:
56			raise IllegalArgumentException()
57
58	def setValue(self, key, value):
59		if key in self._titleKey:
60			self._data[self._titleKey.index(key)][0] = value
61		else:
62			raise IllegalArgumentException()
63
64	def setSticky(self, key, sticky):
65		if key in self._titleKey:
66			self._data[self._titleKey.index(key)][1] = bool(sticky)
67		else:
68			raise IllegalArgumentException()
69
70	def _sticky(self, index):
71		return self._data[index][1]
72
73	def size(self):
74		return len(self._titleKey)
75
76	def key(self, index):
77		return self._titleKey[index]
78
79	def reset(self):
80		for key in self._titleKey:
81			try:
82				self._removeItem(key, True)
83			except IllegalArgumentException:
84				pass
85