blob: 65b59ad0ca1917c8e69499ff14470429bc83f393 [file] [log] [blame]
Jack Jansend0fc42f2001-08-19 22:05:06 +00001"""aetypes - Python objects representing various AE types."""
2
Jack Jansen5a6fdcd2001-08-25 12:15:04 +00003from Carbon.AppleEvents import *
Jack Jansend0fc42f2001-08-19 22:05:06 +00004import struct
5from types import *
6import string
7
8#
9# convoluted, since there are cyclic dependencies between this file and
10# aetools_convert.
11#
Jack Jansen8b777672002-08-07 14:49:00 +000012def pack(*args, **kwargs):
Jack Jansen0ae32202003-04-09 13:25:43 +000013 from aepack import pack
14 return pack( *args, **kwargs)
Tim Peters182b5ac2004-07-18 06:16:08 +000015
Jack Jansend0fc42f2001-08-19 22:05:06 +000016def nice(s):
Jack Jansen0ae32202003-04-09 13:25:43 +000017 """'nice' representation of an object"""
18 if type(s) is StringType: return repr(s)
19 else: return str(s)
Jack Jansend0fc42f2001-08-19 22:05:06 +000020
21class Unknown:
Jack Jansen0ae32202003-04-09 13:25:43 +000022 """An uninterpreted AE object"""
Tim Peters182b5ac2004-07-18 06:16:08 +000023
Jack Jansen0ae32202003-04-09 13:25:43 +000024 def __init__(self, type, data):
25 self.type = type
26 self.data = data
Tim Peters182b5ac2004-07-18 06:16:08 +000027
Jack Jansen0ae32202003-04-09 13:25:43 +000028 def __repr__(self):
Walter Dörwald70a6b492004-02-12 17:35:32 +000029 return "Unknown(%r, %r)" % (self.type, self.data)
Tim Peters182b5ac2004-07-18 06:16:08 +000030
Jack Jansen0ae32202003-04-09 13:25:43 +000031 def __aepack__(self):
32 return pack(self.data, self.type)
Jack Jansend0fc42f2001-08-19 22:05:06 +000033
34class Enum:
Jack Jansen0ae32202003-04-09 13:25:43 +000035 """An AE enumeration value"""
Tim Peters182b5ac2004-07-18 06:16:08 +000036
Jack Jansen0ae32202003-04-09 13:25:43 +000037 def __init__(self, enum):
38 self.enum = "%-4.4s" % str(enum)
Tim Peters182b5ac2004-07-18 06:16:08 +000039
Jack Jansen0ae32202003-04-09 13:25:43 +000040 def __repr__(self):
Walter Dörwald70a6b492004-02-12 17:35:32 +000041 return "Enum(%r)" % (self.enum,)
Tim Peters182b5ac2004-07-18 06:16:08 +000042
Jack Jansen0ae32202003-04-09 13:25:43 +000043 def __str__(self):
44 return string.strip(self.enum)
Tim Peters182b5ac2004-07-18 06:16:08 +000045
Jack Jansen0ae32202003-04-09 13:25:43 +000046 def __aepack__(self):
47 return pack(self.enum, typeEnumeration)
Jack Jansend0fc42f2001-08-19 22:05:06 +000048
49def IsEnum(x):
Jack Jansen0ae32202003-04-09 13:25:43 +000050 return isinstance(x, Enum)
Jack Jansend0fc42f2001-08-19 22:05:06 +000051
52def mkenum(enum):
Jack Jansen0ae32202003-04-09 13:25:43 +000053 if IsEnum(enum): return enum
54 return Enum(enum)
Jack Jansend0fc42f2001-08-19 22:05:06 +000055
Jack Jansen8b777672002-08-07 14:49:00 +000056# Jack changed the way this is done
57class InsertionLoc:
Jack Jansen0ae32202003-04-09 13:25:43 +000058 def __init__(self, of, pos):
59 self.of = of
60 self.pos = pos
Tim Peters182b5ac2004-07-18 06:16:08 +000061
Jack Jansen0ae32202003-04-09 13:25:43 +000062 def __repr__(self):
Walter Dörwald70a6b492004-02-12 17:35:32 +000063 return "InsertionLoc(%r, %r)" % (self.of, self.pos)
Tim Peters182b5ac2004-07-18 06:16:08 +000064
Jack Jansen0ae32202003-04-09 13:25:43 +000065 def __aepack__(self):
66 rec = {'kobj': self.of, 'kpos': self.pos}
67 return pack(rec, forcetype='insl')
Tim Peters182b5ac2004-07-18 06:16:08 +000068
Jack Jansen8b777672002-08-07 14:49:00 +000069# Convenience functions for dsp:
70def beginning(of):
Jack Jansen0ae32202003-04-09 13:25:43 +000071 return InsertionLoc(of, Enum('bgng'))
Tim Peters182b5ac2004-07-18 06:16:08 +000072
Jack Jansen8b777672002-08-07 14:49:00 +000073def end(of):
Jack Jansen0ae32202003-04-09 13:25:43 +000074 return InsertionLoc(of, Enum('end '))
Jack Jansen8b777672002-08-07 14:49:00 +000075
Jack Jansend0fc42f2001-08-19 22:05:06 +000076class Boolean:
Jack Jansen0ae32202003-04-09 13:25:43 +000077 """An AE boolean value"""
Tim Peters182b5ac2004-07-18 06:16:08 +000078
Jack Jansen0ae32202003-04-09 13:25:43 +000079 def __init__(self, bool):
80 self.bool = (not not bool)
Tim Peters182b5ac2004-07-18 06:16:08 +000081
Jack Jansen0ae32202003-04-09 13:25:43 +000082 def __repr__(self):
Walter Dörwald70a6b492004-02-12 17:35:32 +000083 return "Boolean(%r)" % (self.bool,)
Tim Peters182b5ac2004-07-18 06:16:08 +000084
Jack Jansen0ae32202003-04-09 13:25:43 +000085 def __str__(self):
86 if self.bool:
87 return "True"
88 else:
89 return "False"
Tim Peters182b5ac2004-07-18 06:16:08 +000090
Jack Jansen0ae32202003-04-09 13:25:43 +000091 def __aepack__(self):
92 return pack(struct.pack('b', self.bool), 'bool')
Jack Jansend0fc42f2001-08-19 22:05:06 +000093
94def IsBoolean(x):
Jack Jansen0ae32202003-04-09 13:25:43 +000095 return isinstance(x, Boolean)
Jack Jansend0fc42f2001-08-19 22:05:06 +000096
97def mkboolean(bool):
Jack Jansen0ae32202003-04-09 13:25:43 +000098 if IsBoolean(bool): return bool
99 return Boolean(bool)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000100
101class Type:
Jack Jansen0ae32202003-04-09 13:25:43 +0000102 """An AE 4-char typename object"""
Tim Peters182b5ac2004-07-18 06:16:08 +0000103
Jack Jansen0ae32202003-04-09 13:25:43 +0000104 def __init__(self, type):
105 self.type = "%-4.4s" % str(type)
Tim Peters182b5ac2004-07-18 06:16:08 +0000106
Jack Jansen0ae32202003-04-09 13:25:43 +0000107 def __repr__(self):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000108 return "Type(%r)" % (self.type,)
Tim Peters182b5ac2004-07-18 06:16:08 +0000109
Jack Jansen0ae32202003-04-09 13:25:43 +0000110 def __str__(self):
111 return string.strip(self.type)
Tim Peters182b5ac2004-07-18 06:16:08 +0000112
Jack Jansen0ae32202003-04-09 13:25:43 +0000113 def __aepack__(self):
114 return pack(self.type, typeType)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000115
116def IsType(x):
Jack Jansen0ae32202003-04-09 13:25:43 +0000117 return isinstance(x, Type)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000118
119def mktype(type):
Jack Jansen0ae32202003-04-09 13:25:43 +0000120 if IsType(type): return type
121 return Type(type)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000122
123
124class Keyword:
Jack Jansen0ae32202003-04-09 13:25:43 +0000125 """An AE 4-char keyword object"""
Tim Peters182b5ac2004-07-18 06:16:08 +0000126
Jack Jansen0ae32202003-04-09 13:25:43 +0000127 def __init__(self, keyword):
128 self.keyword = "%-4.4s" % str(keyword)
Tim Peters182b5ac2004-07-18 06:16:08 +0000129
Jack Jansen0ae32202003-04-09 13:25:43 +0000130 def __repr__(self):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000131 return "Keyword(%r)" % `self.keyword`
Tim Peters182b5ac2004-07-18 06:16:08 +0000132
Jack Jansen0ae32202003-04-09 13:25:43 +0000133 def __str__(self):
134 return string.strip(self.keyword)
Tim Peters182b5ac2004-07-18 06:16:08 +0000135
Jack Jansen0ae32202003-04-09 13:25:43 +0000136 def __aepack__(self):
137 return pack(self.keyword, typeKeyword)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000138
139def IsKeyword(x):
Jack Jansen0ae32202003-04-09 13:25:43 +0000140 return isinstance(x, Keyword)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000141
142class Range:
Jack Jansen0ae32202003-04-09 13:25:43 +0000143 """An AE range object"""
Tim Peters182b5ac2004-07-18 06:16:08 +0000144
Jack Jansen0ae32202003-04-09 13:25:43 +0000145 def __init__(self, start, stop):
146 self.start = start
147 self.stop = stop
Tim Peters182b5ac2004-07-18 06:16:08 +0000148
Jack Jansen0ae32202003-04-09 13:25:43 +0000149 def __repr__(self):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000150 return "Range(%r, %r)" % (self.start, self.stop)
Tim Peters182b5ac2004-07-18 06:16:08 +0000151
Jack Jansen0ae32202003-04-09 13:25:43 +0000152 def __str__(self):
153 return "%s thru %s" % (nice(self.start), nice(self.stop))
Tim Peters182b5ac2004-07-18 06:16:08 +0000154
Jack Jansen0ae32202003-04-09 13:25:43 +0000155 def __aepack__(self):
156 return pack({'star': self.start, 'stop': self.stop}, 'rang')
Jack Jansend0fc42f2001-08-19 22:05:06 +0000157
158def IsRange(x):
Jack Jansen0ae32202003-04-09 13:25:43 +0000159 return isinstance(x, Range)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000160
161class Comparison:
Jack Jansen0ae32202003-04-09 13:25:43 +0000162 """An AE Comparison"""
Tim Peters182b5ac2004-07-18 06:16:08 +0000163
Jack Jansen0ae32202003-04-09 13:25:43 +0000164 def __init__(self, obj1, relo, obj2):
165 self.obj1 = obj1
166 self.relo = "%-4.4s" % str(relo)
167 self.obj2 = obj2
Tim Peters182b5ac2004-07-18 06:16:08 +0000168
Jack Jansen0ae32202003-04-09 13:25:43 +0000169 def __repr__(self):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000170 return "Comparison(%r, %r, %r)" % (self.obj1, self.relo, self.obj2)
Tim Peters182b5ac2004-07-18 06:16:08 +0000171
Jack Jansen0ae32202003-04-09 13:25:43 +0000172 def __str__(self):
173 return "%s %s %s" % (nice(self.obj1), string.strip(self.relo), nice(self.obj2))
Tim Peters182b5ac2004-07-18 06:16:08 +0000174
Jack Jansen0ae32202003-04-09 13:25:43 +0000175 def __aepack__(self):
176 return pack({'obj1': self.obj1,
177 'relo': mkenum(self.relo),
178 'obj2': self.obj2},
179 'cmpd')
Jack Jansend0fc42f2001-08-19 22:05:06 +0000180
181def IsComparison(x):
Jack Jansen0ae32202003-04-09 13:25:43 +0000182 return isinstance(x, Comparison)
Tim Peters182b5ac2004-07-18 06:16:08 +0000183
Jack Jansend0fc42f2001-08-19 22:05:06 +0000184class NComparison(Comparison):
Jack Jansen0ae32202003-04-09 13:25:43 +0000185 # The class attribute 'relo' must be set in a subclass
Tim Peters182b5ac2004-07-18 06:16:08 +0000186
Jack Jansen0ae32202003-04-09 13:25:43 +0000187 def __init__(self, obj1, obj2):
188 Comparison.__init__(obj1, self.relo, obj2)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000189
190class Ordinal:
Jack Jansen0ae32202003-04-09 13:25:43 +0000191 """An AE Ordinal"""
Tim Peters182b5ac2004-07-18 06:16:08 +0000192
Jack Jansen0ae32202003-04-09 13:25:43 +0000193 def __init__(self, abso):
194# self.obj1 = obj1
195 self.abso = "%-4.4s" % str(abso)
Tim Peters182b5ac2004-07-18 06:16:08 +0000196
Jack Jansen0ae32202003-04-09 13:25:43 +0000197 def __repr__(self):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000198 return "Ordinal(%r)" % (self.abso,)
Tim Peters182b5ac2004-07-18 06:16:08 +0000199
Jack Jansen0ae32202003-04-09 13:25:43 +0000200 def __str__(self):
201 return "%s" % (string.strip(self.abso))
Tim Peters182b5ac2004-07-18 06:16:08 +0000202
Jack Jansen0ae32202003-04-09 13:25:43 +0000203 def __aepack__(self):
204 return pack(self.abso, 'abso')
Jack Jansend0fc42f2001-08-19 22:05:06 +0000205
206def IsOrdinal(x):
Jack Jansen0ae32202003-04-09 13:25:43 +0000207 return isinstance(x, Ordinal)
Tim Peters182b5ac2004-07-18 06:16:08 +0000208
Jack Jansend0fc42f2001-08-19 22:05:06 +0000209class NOrdinal(Ordinal):
Jack Jansen0ae32202003-04-09 13:25:43 +0000210 # The class attribute 'abso' must be set in a subclass
Tim Peters182b5ac2004-07-18 06:16:08 +0000211
Jack Jansen0ae32202003-04-09 13:25:43 +0000212 def __init__(self):
213 Ordinal.__init__(self, self.abso)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000214
215class Logical:
Jack Jansen0ae32202003-04-09 13:25:43 +0000216 """An AE logical expression object"""
Tim Peters182b5ac2004-07-18 06:16:08 +0000217
Jack Jansen0ae32202003-04-09 13:25:43 +0000218 def __init__(self, logc, term):
219 self.logc = "%-4.4s" % str(logc)
220 self.term = term
Tim Peters182b5ac2004-07-18 06:16:08 +0000221
Jack Jansen0ae32202003-04-09 13:25:43 +0000222 def __repr__(self):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000223 return "Logical(%r, %r)" % (self.logc, self.term)
Tim Peters182b5ac2004-07-18 06:16:08 +0000224
Jack Jansen0ae32202003-04-09 13:25:43 +0000225 def __str__(self):
226 if type(self.term) == ListType and len(self.term) == 2:
227 return "%s %s %s" % (nice(self.term[0]),
228 string.strip(self.logc),
229 nice(self.term[1]))
230 else:
231 return "%s(%s)" % (string.strip(self.logc), nice(self.term))
Tim Peters182b5ac2004-07-18 06:16:08 +0000232
Jack Jansen0ae32202003-04-09 13:25:43 +0000233 def __aepack__(self):
234 return pack({'logc': mkenum(self.logc), 'term': self.term}, 'logi')
Jack Jansend0fc42f2001-08-19 22:05:06 +0000235
236def IsLogical(x):
Jack Jansen0ae32202003-04-09 13:25:43 +0000237 return isinstance(x, Logical)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000238
239class StyledText:
Jack Jansen0ae32202003-04-09 13:25:43 +0000240 """An AE object respresenting text in a certain style"""
Tim Peters182b5ac2004-07-18 06:16:08 +0000241
Jack Jansen0ae32202003-04-09 13:25:43 +0000242 def __init__(self, style, text):
243 self.style = style
244 self.text = text
Tim Peters182b5ac2004-07-18 06:16:08 +0000245
Jack Jansen0ae32202003-04-09 13:25:43 +0000246 def __repr__(self):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000247 return "StyledText(%r, %r)" % (self.style, self.text)
Tim Peters182b5ac2004-07-18 06:16:08 +0000248
Jack Jansen0ae32202003-04-09 13:25:43 +0000249 def __str__(self):
250 return self.text
Tim Peters182b5ac2004-07-18 06:16:08 +0000251
Jack Jansen0ae32202003-04-09 13:25:43 +0000252 def __aepack__(self):
253 return pack({'ksty': self.style, 'ktxt': self.text}, 'STXT')
Jack Jansend0fc42f2001-08-19 22:05:06 +0000254
255def IsStyledText(x):
Jack Jansen0ae32202003-04-09 13:25:43 +0000256 return isinstance(x, StyledText)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000257
258class AEText:
Jack Jansen0ae32202003-04-09 13:25:43 +0000259 """An AE text object with style, script and language specified"""
Tim Peters182b5ac2004-07-18 06:16:08 +0000260
Jack Jansen0ae32202003-04-09 13:25:43 +0000261 def __init__(self, script, style, text):
262 self.script = script
263 self.style = style
264 self.text = text
Tim Peters182b5ac2004-07-18 06:16:08 +0000265
Jack Jansen0ae32202003-04-09 13:25:43 +0000266 def __repr__(self):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000267 return "AEText(%r, %r, %r)" % (self.script, self.style, self.text)
Tim Peters182b5ac2004-07-18 06:16:08 +0000268
Jack Jansen0ae32202003-04-09 13:25:43 +0000269 def __str__(self):
270 return self.text
Tim Peters182b5ac2004-07-18 06:16:08 +0000271
Jack Jansen0ae32202003-04-09 13:25:43 +0000272 def __aepack__(self):
273 return pack({keyAEScriptTag: self.script, keyAEStyles: self.style,
274 keyAEText: self.text}, typeAEText)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000275
276def IsAEText(x):
Jack Jansen0ae32202003-04-09 13:25:43 +0000277 return isinstance(x, AEText)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000278
279class IntlText:
Jack Jansen0ae32202003-04-09 13:25:43 +0000280 """A text object with script and language specified"""
Tim Peters182b5ac2004-07-18 06:16:08 +0000281
Jack Jansen0ae32202003-04-09 13:25:43 +0000282 def __init__(self, script, language, text):
283 self.script = script
284 self.language = language
285 self.text = text
Tim Peters182b5ac2004-07-18 06:16:08 +0000286
Jack Jansen0ae32202003-04-09 13:25:43 +0000287 def __repr__(self):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000288 return "IntlText(%r, %r, %r)" % (self.script, self.language, self.text)
Tim Peters182b5ac2004-07-18 06:16:08 +0000289
Jack Jansen0ae32202003-04-09 13:25:43 +0000290 def __str__(self):
291 return self.text
Tim Peters182b5ac2004-07-18 06:16:08 +0000292
Jack Jansen0ae32202003-04-09 13:25:43 +0000293 def __aepack__(self):
294 return pack(struct.pack('hh', self.script, self.language)+self.text,
295 typeIntlText)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000296
297def IsIntlText(x):
Jack Jansen0ae32202003-04-09 13:25:43 +0000298 return isinstance(x, IntlText)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000299
300class IntlWritingCode:
Jack Jansen0ae32202003-04-09 13:25:43 +0000301 """An object representing script and language"""
Tim Peters182b5ac2004-07-18 06:16:08 +0000302
Jack Jansen0ae32202003-04-09 13:25:43 +0000303 def __init__(self, script, language):
304 self.script = script
305 self.language = language
Tim Peters182b5ac2004-07-18 06:16:08 +0000306
Jack Jansen0ae32202003-04-09 13:25:43 +0000307 def __repr__(self):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000308 return "IntlWritingCode(%r, %r)" % (self.script, self.language)
Tim Peters182b5ac2004-07-18 06:16:08 +0000309
Jack Jansen0ae32202003-04-09 13:25:43 +0000310 def __str__(self):
311 return "script system %d, language %d"%(self.script, self.language)
Tim Peters182b5ac2004-07-18 06:16:08 +0000312
Jack Jansen0ae32202003-04-09 13:25:43 +0000313 def __aepack__(self):
314 return pack(struct.pack('hh', self.script, self.language),
315 typeIntlWritingCode)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000316
317def IsIntlWritingCode(x):
Jack Jansen0ae32202003-04-09 13:25:43 +0000318 return isinstance(x, IntlWritingCode)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000319
320class QDPoint:
Jack Jansen0ae32202003-04-09 13:25:43 +0000321 """A point"""
Tim Peters182b5ac2004-07-18 06:16:08 +0000322
Jack Jansen0ae32202003-04-09 13:25:43 +0000323 def __init__(self, v, h):
324 self.v = v
325 self.h = h
Tim Peters182b5ac2004-07-18 06:16:08 +0000326
Jack Jansen0ae32202003-04-09 13:25:43 +0000327 def __repr__(self):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000328 return "QDPoint(%r, %r)" % (self.v, self.h)
Tim Peters182b5ac2004-07-18 06:16:08 +0000329
Jack Jansen0ae32202003-04-09 13:25:43 +0000330 def __str__(self):
331 return "(%d, %d)"%(self.v, self.h)
Tim Peters182b5ac2004-07-18 06:16:08 +0000332
Jack Jansen0ae32202003-04-09 13:25:43 +0000333 def __aepack__(self):
334 return pack(struct.pack('hh', self.v, self.h),
335 typeQDPoint)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000336
337def IsQDPoint(x):
Jack Jansen0ae32202003-04-09 13:25:43 +0000338 return isinstance(x, QDPoint)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000339
340class QDRectangle:
Jack Jansen0ae32202003-04-09 13:25:43 +0000341 """A rectangle"""
Tim Peters182b5ac2004-07-18 06:16:08 +0000342
Jack Jansen0ae32202003-04-09 13:25:43 +0000343 def __init__(self, v0, h0, v1, h1):
344 self.v0 = v0
345 self.h0 = h0
346 self.v1 = v1
347 self.h1 = h1
Tim Peters182b5ac2004-07-18 06:16:08 +0000348
Jack Jansen0ae32202003-04-09 13:25:43 +0000349 def __repr__(self):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000350 return "QDRectangle(%r, %r, %r, %r)" % (self.v0, self.h0, self.v1, self.h1)
Tim Peters182b5ac2004-07-18 06:16:08 +0000351
Jack Jansen0ae32202003-04-09 13:25:43 +0000352 def __str__(self):
353 return "(%d, %d)-(%d, %d)"%(self.v0, self.h0, self.v1, self.h1)
Tim Peters182b5ac2004-07-18 06:16:08 +0000354
Jack Jansen0ae32202003-04-09 13:25:43 +0000355 def __aepack__(self):
356 return pack(struct.pack('hhhh', self.v0, self.h0, self.v1, self.h1),
357 typeQDRectangle)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000358
359def IsQDRectangle(x):
Jack Jansen0ae32202003-04-09 13:25:43 +0000360 return isinstance(x, QDRectangle)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000361
362class RGBColor:
Jack Jansen0ae32202003-04-09 13:25:43 +0000363 """An RGB color"""
Tim Peters182b5ac2004-07-18 06:16:08 +0000364
Jack Jansen0ae32202003-04-09 13:25:43 +0000365 def __init__(self, r, g, b):
366 self.r = r
367 self.g = g
368 self.b = b
Tim Peters182b5ac2004-07-18 06:16:08 +0000369
Jack Jansen0ae32202003-04-09 13:25:43 +0000370 def __repr__(self):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000371 return "RGBColor(%r, %r, %r)" % (self.r, self.g, self.b)
Tim Peters182b5ac2004-07-18 06:16:08 +0000372
Jack Jansen0ae32202003-04-09 13:25:43 +0000373 def __str__(self):
374 return "0x%x red, 0x%x green, 0x%x blue"% (self.r, self.g, self.b)
Tim Peters182b5ac2004-07-18 06:16:08 +0000375
Jack Jansen0ae32202003-04-09 13:25:43 +0000376 def __aepack__(self):
377 return pack(struct.pack('hhh', self.r, self.g, self.b),
378 typeRGBColor)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000379
380def IsRGBColor(x):
Jack Jansen0ae32202003-04-09 13:25:43 +0000381 return isinstance(x, RGBColor)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000382
383class ObjectSpecifier:
Tim Peters182b5ac2004-07-18 06:16:08 +0000384
Jack Jansen0ae32202003-04-09 13:25:43 +0000385 """A class for constructing and manipulation AE object specifiers in python.
Tim Peters182b5ac2004-07-18 06:16:08 +0000386
Jack Jansen0ae32202003-04-09 13:25:43 +0000387 An object specifier is actually a record with four fields:
Tim Peters182b5ac2004-07-18 06:16:08 +0000388
Jack Jansen0ae32202003-04-09 13:25:43 +0000389 key type description
390 --- ---- -----------
Tim Peters182b5ac2004-07-18 06:16:08 +0000391
Jack Jansen0ae32202003-04-09 13:25:43 +0000392 'want' type 4-char class code of thing we want,
393 e.g. word, paragraph or property
Tim Peters182b5ac2004-07-18 06:16:08 +0000394
Jack Jansen0ae32202003-04-09 13:25:43 +0000395 'form' enum how we specify which 'want' thing(s) we want,
396 e.g. by index, by range, by name, or by property specifier
Tim Peters182b5ac2004-07-18 06:16:08 +0000397
Jack Jansen0ae32202003-04-09 13:25:43 +0000398 'seld' any which thing(s) we want,
399 e.g. its index, its name, or its property specifier
Tim Peters182b5ac2004-07-18 06:16:08 +0000400
Jack Jansen0ae32202003-04-09 13:25:43 +0000401 'from' object the object in which it is contained,
402 or null, meaning look for it in the application
Tim Peters182b5ac2004-07-18 06:16:08 +0000403
Jack Jansen0ae32202003-04-09 13:25:43 +0000404 Note that we don't call this class plain "Object", since that name
405 is likely to be used by the application.
406 """
Tim Peters182b5ac2004-07-18 06:16:08 +0000407
Jack Jansen0ae32202003-04-09 13:25:43 +0000408 def __init__(self, want, form, seld, fr = None):
409 self.want = want
410 self.form = form
411 self.seld = seld
412 self.fr = fr
Tim Peters182b5ac2004-07-18 06:16:08 +0000413
Jack Jansen0ae32202003-04-09 13:25:43 +0000414 def __repr__(self):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000415 s = "ObjectSpecifier(%r, %r, %r" % (self.want, self.form, self.seld)
Jack Jansen0ae32202003-04-09 13:25:43 +0000416 if self.fr:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000417 s = s + ", %r)" % (self.fr,)
Jack Jansen0ae32202003-04-09 13:25:43 +0000418 else:
419 s = s + ")"
420 return s
Tim Peters182b5ac2004-07-18 06:16:08 +0000421
Jack Jansen0ae32202003-04-09 13:25:43 +0000422 def __aepack__(self):
423 return pack({'want': mktype(self.want),
424 'form': mkenum(self.form),
425 'seld': self.seld,
426 'from': self.fr},
427 'obj ')
Jack Jansend0fc42f2001-08-19 22:05:06 +0000428
429def IsObjectSpecifier(x):
Jack Jansen0ae32202003-04-09 13:25:43 +0000430 return isinstance(x, ObjectSpecifier)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000431
432
Georg Brandl08c02db2005-07-22 18:39:19 +0000433# Backwards compatibility, sigh...
Jack Jansend0fc42f2001-08-19 22:05:06 +0000434class Property(ObjectSpecifier):
435
Jack Jansen0ae32202003-04-09 13:25:43 +0000436 def __init__(self, which, fr = None, want='prop'):
437 ObjectSpecifier.__init__(self, want, 'prop', mktype(which), fr)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000438
Jack Jansen0ae32202003-04-09 13:25:43 +0000439 def __repr__(self):
440 if self.fr:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000441 return "Property(%r, %r)" % (self.seld.type, self.fr)
Jack Jansen0ae32202003-04-09 13:25:43 +0000442 else:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000443 return "Property(%r)" % (self.seld.type,)
Tim Peters182b5ac2004-07-18 06:16:08 +0000444
Jack Jansen0ae32202003-04-09 13:25:43 +0000445 def __str__(self):
446 if self.fr:
447 return "Property %s of %s" % (str(self.seld), str(self.fr))
448 else:
449 return "Property %s" % str(self.seld)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000450
451
452class NProperty(ObjectSpecifier):
Jack Jansen0ae32202003-04-09 13:25:43 +0000453 # Subclasses *must* self baseclass attributes:
454 # want is the type of this property
455 # which is the property name of this property
Jack Jansend0fc42f2001-08-19 22:05:06 +0000456
Jack Jansen0ae32202003-04-09 13:25:43 +0000457 def __init__(self, fr = None):
458 #try:
459 # dummy = self.want
460 #except:
461 # self.want = 'prop'
462 self.want = 'prop'
Tim Peters182b5ac2004-07-18 06:16:08 +0000463 ObjectSpecifier.__init__(self, self.want, 'prop',
Jack Jansen0ae32202003-04-09 13:25:43 +0000464 mktype(self.which), fr)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000465
Jack Jansen0ae32202003-04-09 13:25:43 +0000466 def __repr__(self):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000467 rv = "Property(%r" % (self.seld.type,)
Jack Jansen0ae32202003-04-09 13:25:43 +0000468 if self.fr:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000469 rv = rv + ", fr=%r" % (self.fr,)
Jack Jansen0ae32202003-04-09 13:25:43 +0000470 if self.want != 'prop':
Walter Dörwald70a6b492004-02-12 17:35:32 +0000471 rv = rv + ", want=%r" % (self.want,)
Jack Jansen0ae32202003-04-09 13:25:43 +0000472 return rv + ")"
Tim Peters182b5ac2004-07-18 06:16:08 +0000473
Jack Jansen0ae32202003-04-09 13:25:43 +0000474 def __str__(self):
475 if self.fr:
476 return "Property %s of %s" % (str(self.seld), str(self.fr))
477 else:
478 return "Property %s" % str(self.seld)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000479
480
481class SelectableItem(ObjectSpecifier):
Tim Peters182b5ac2004-07-18 06:16:08 +0000482
Jack Jansen0ae32202003-04-09 13:25:43 +0000483 def __init__(self, want, seld, fr = None):
484 t = type(seld)
485 if t == StringType:
486 form = 'name'
487 elif IsRange(seld):
488 form = 'rang'
489 elif IsComparison(seld) or IsLogical(seld):
490 form = 'test'
491 elif t == TupleType:
492 # Breakout: specify both form and seld in a tuple
493 # (if you want ID or rele or somesuch)
494 form, seld = seld
495 else:
496 form = 'indx'
497 ObjectSpecifier.__init__(self, want, form, seld, fr)
Jack Jansend0fc42f2001-08-19 22:05:06 +0000498
499
500class ComponentItem(SelectableItem):
Jack Jansen0ae32202003-04-09 13:25:43 +0000501 # Derived classes *must* set the *class attribute* 'want' to some constant
502 # Also, dictionaries _propdict and _elemdict must be set to map property
503 # and element names to the correct classes
Jack Jansen7e0bc112003-03-21 12:04:19 +0000504
Jack Jansen0ae32202003-04-09 13:25:43 +0000505 _propdict = {}
506 _elemdict = {}
507 def __init__(self, which, fr = None):
508 SelectableItem.__init__(self, self.want, which, fr)
Tim Peters182b5ac2004-07-18 06:16:08 +0000509
Jack Jansen0ae32202003-04-09 13:25:43 +0000510 def __repr__(self):
511 if not self.fr:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000512 return "%s(%r)" % (self.__class__.__name__, self.seld)
513 return "%s(%r, %r)" % (self.__class__.__name__, self.seld, self.fr)
Tim Peters182b5ac2004-07-18 06:16:08 +0000514
Jack Jansen0ae32202003-04-09 13:25:43 +0000515 def __str__(self):
516 seld = self.seld
517 if type(seld) == StringType:
518 ss = repr(seld)
519 elif IsRange(seld):
520 start, stop = seld.start, seld.stop
521 if type(start) == InstanceType == type(stop) and \
522 start.__class__ == self.__class__ == stop.__class__:
523 ss = str(start.seld) + " thru " + str(stop.seld)
524 else:
525 ss = str(seld)
526 else:
527 ss = str(seld)
528 s = "%s %s" % (self.__class__.__name__, ss)
529 if self.fr: s = s + " of %s" % str(self.fr)
530 return s
Tim Peters182b5ac2004-07-18 06:16:08 +0000531
Jack Jansen0ae32202003-04-09 13:25:43 +0000532 def __getattr__(self, name):
533 if self._elemdict.has_key(name):
534 cls = self._elemdict[name]
535 return DelayedComponentItem(cls, self)
536 if self._propdict.has_key(name):
537 cls = self._propdict[name]
538 return cls(self)
539 raise AttributeError, name
Tim Peters182b5ac2004-07-18 06:16:08 +0000540
541
Jack Jansend0fc42f2001-08-19 22:05:06 +0000542class DelayedComponentItem:
Jack Jansen0ae32202003-04-09 13:25:43 +0000543 def __init__(self, compclass, fr):
544 self.compclass = compclass
545 self.fr = fr
Tim Peters182b5ac2004-07-18 06:16:08 +0000546
Jack Jansen0ae32202003-04-09 13:25:43 +0000547 def __call__(self, which):
548 return self.compclass(which, self.fr)
Tim Peters182b5ac2004-07-18 06:16:08 +0000549
Jack Jansen0ae32202003-04-09 13:25:43 +0000550 def __repr__(self):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000551 return "%s(???, %r)" % (self.__class__.__name__, self.fr)
Tim Peters182b5ac2004-07-18 06:16:08 +0000552
Jack Jansen0ae32202003-04-09 13:25:43 +0000553 def __str__(self):
554 return "selector for element %s of %s"%(self.__class__.__name__, str(self.fr))
Jack Jansend0fc42f2001-08-19 22:05:06 +0000555
556template = """
557class %s(ComponentItem): want = '%s'
558"""
559
560exec template % ("Text", 'text')
561exec template % ("Character", 'cha ')
562exec template % ("Word", 'cwor')
563exec template % ("Line", 'clin')
564exec template % ("paragraph", 'cpar')
565exec template % ("Window", 'cwin')
566exec template % ("Document", 'docu')
567exec template % ("File", 'file')
568exec template % ("InsertionPoint", 'cins')