~malept/ubuntu/lucid/python2.6/dev-dependency-fix

« back to all changes in this revision

Viewing changes to Lib/plat-mac/findertools.py

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2009-02-13 12:51:00 UTC
  • Revision ID: james.westby@ubuntu.com-20090213125100-uufgcb9yeqzujpqw
Tags: upstream-2.6.1
ImportĀ upstreamĀ versionĀ 2.6.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
"""Utility routines depending on the finder,
 
2
a combination of code by Jack Jansen and erik@letterror.com.
 
3
 
 
4
Most events have been captured from
 
5
Lasso Capture AE and than translated to python code.
 
6
 
 
7
IMPORTANT
 
8
Note that the processes() function returns different values
 
9
depending on the OS version it is running on. On MacOS 9
 
10
the Finder returns the process *names* which can then be
 
11
used to find out more about them. On MacOS 8.6 and earlier
 
12
the Finder returns a code which does not seem to work.
 
13
So bottom line: the processes() stuff does not work on < MacOS9
 
14
 
 
15
Mostly written by erik@letterror.com
 
16
"""
 
17
 
 
18
from warnings import warnpy3k
 
19
warnpy3k("In 3.x, the findertools module is removed.", stacklevel=2)
 
20
 
 
21
import Finder
 
22
from Carbon import AppleEvents
 
23
import aetools
 
24
import MacOS
 
25
import sys
 
26
import Carbon.File
 
27
import Carbon.Folder
 
28
import aetypes
 
29
from types import *
 
30
 
 
31
__version__ = '1.1'
 
32
Error = 'findertools.Error'
 
33
 
 
34
_finder_talker = None
 
35
 
 
36
def _getfinder():
 
37
    """returns basic (recyclable) Finder AE interface object"""
 
38
    global _finder_talker
 
39
    if not _finder_talker:
 
40
        _finder_talker = Finder.Finder()
 
41
    _finder_talker.send_flags = ( _finder_talker.send_flags |
 
42
        AppleEvents.kAECanInteract | AppleEvents.kAECanSwitchLayer)
 
43
    return _finder_talker
 
44
 
 
45
def launch(file):
 
46
    """Open a file thru the finder. Specify file by name or fsspec"""
 
47
    finder = _getfinder()
 
48
    fss = Carbon.File.FSSpec(file)
 
49
    return finder.open(fss)
 
50
 
 
51
def Print(file):
 
52
    """Print a file thru the finder. Specify file by name or fsspec"""
 
53
    finder = _getfinder()
 
54
    fss = Carbon.File.FSSpec(file)
 
55
    return finder._print(fss)
 
56
 
 
57
def copy(src, dstdir):
 
58
    """Copy a file to a folder"""
 
59
    finder = _getfinder()
 
60
    if type(src) == type([]):
 
61
        src_fss = []
 
62
        for s in src:
 
63
            src_fss.append(Carbon.File.FSSpec(s))
 
64
    else:
 
65
        src_fss = Carbon.File.FSSpec(src)
 
66
    dst_fss = Carbon.File.FSSpec(dstdir)
 
67
    return finder.duplicate(src_fss, to=dst_fss)
 
68
 
 
69
def move(src, dstdir):
 
70
    """Move a file to a folder"""
 
71
    finder = _getfinder()
 
72
    if type(src) == type([]):
 
73
        src_fss = []
 
74
        for s in src:
 
75
            src_fss.append(Carbon.File.FSSpec(s))
 
76
    else:
 
77
        src_fss = Carbon.File.FSSpec(src)
 
78
    dst_fss = Carbon.File.FSSpec(dstdir)
 
79
    return finder.move(src_fss, to=dst_fss)
 
80
 
 
81
def sleep():
 
82
    """Put the mac to sleep"""
 
83
    finder = _getfinder()
 
84
    finder.sleep()
 
85
 
 
86
def shutdown():
 
87
    """Shut the mac down"""
 
88
    finder = _getfinder()
 
89
    finder.shut_down()
 
90
 
 
91
def restart():
 
92
    """Restart the mac"""
 
93
    finder = _getfinder()
 
94
    finder.restart()
 
95
 
 
96
 
 
97
#---------------------------------------------------
 
98
#   Additional findertools
 
99
#
 
100
 
 
101
def reveal(file):
 
102
    """Reveal a file in the finder. Specify file by name, fsref or fsspec."""
 
103
    finder = _getfinder()
 
104
    fsr = Carbon.File.FSRef(file)
 
105
    file_alias = fsr.FSNewAliasMinimal()
 
106
    return finder.reveal(file_alias)
 
107
 
 
108
def select(file):
 
109
    """select a file in the finder. Specify file by name, fsref or fsspec."""
 
110
    finder = _getfinder()
 
111
    fsr = Carbon.File.FSRef(file)
 
112
    file_alias = fsr.FSNewAliasMinimal()
 
113
    return finder.select(file_alias)
 
114
 
 
115
def update(file):
 
116
    """Update the display of the specified object(s) to match
 
117
    their on-disk representation. Specify file by name, fsref or fsspec."""
 
118
    finder = _getfinder()
 
119
    fsr = Carbon.File.FSRef(file)
 
120
    file_alias = fsr.FSNewAliasMinimal()
 
121
    return finder.update(file_alias)
 
122
 
 
123
 
 
124
#---------------------------------------------------
 
125
#   More findertools
 
126
#
 
127
 
 
128
def comment(object, comment=None):
 
129
    """comment: get or set the Finder-comment of the item, displayed in the 'Get Info' window."""
 
130
    object = Carbon.File.FSRef(object)
 
131
    object_alias = object.FSNewAliasMonimal()
 
132
    if comment is None:
 
133
        return _getcomment(object_alias)
 
134
    else:
 
135
        return _setcomment(object_alias, comment)
 
136
 
 
137
def _setcomment(object_alias, comment):
 
138
    finder = _getfinder()
 
139
    args = {}
 
140
    attrs = {}
 
141
    aeobj_00 = aetypes.ObjectSpecifier(want=aetypes.Type('cobj'), form="alis", seld=object_alias, fr=None)
 
142
    aeobj_01 = aetypes.ObjectSpecifier(want=aetypes.Type('prop'), form="prop", seld=aetypes.Type('comt'), fr=aeobj_00)
 
143
    args['----'] = aeobj_01
 
144
    args["data"] = comment
 
145
    _reply, args, attrs = finder.send("core", "setd", args, attrs)
 
146
    if args.has_key('errn'):
 
147
        raise Error, aetools.decodeerror(args)
 
148
    if args.has_key('----'):
 
149
        return args['----']
 
150
 
 
151
def _getcomment(object_alias):
 
152
    finder = _getfinder()
 
153
    args = {}
 
154
    attrs = {}
 
155
    aeobj_00 = aetypes.ObjectSpecifier(want=aetypes.Type('cobj'), form="alis", seld=object_alias, fr=None)
 
156
    aeobj_01 = aetypes.ObjectSpecifier(want=aetypes.Type('prop'), form="prop", seld=aetypes.Type('comt'), fr=aeobj_00)
 
157
    args['----'] = aeobj_01
 
158
    _reply, args, attrs = finder.send("core", "getd", args, attrs)
 
159
    if args.has_key('errn'):
 
160
        raise Error, aetools.decodeerror(args)
 
161
    if args.has_key('----'):
 
162
        return args['----']
 
163
 
 
164
 
 
165
#---------------------------------------------------
 
166
#   Get information about current processes in the Finder.
 
167
 
 
168
def processes():
 
169
    """processes returns a list of all active processes running on this computer and their creators."""
 
170
    finder = _getfinder()
 
171
    args = {}
 
172
    attrs = {}
 
173
    processnames = []
 
174
    processnumbers = []
 
175
    creators = []
 
176
    partitions = []
 
177
    used = []
 
178
    ## get the processnames or else the processnumbers
 
179
    args['----'] = aetypes.ObjectSpecifier(want=aetypes.Type('prcs'), form="indx", seld=aetypes.Unknown('abso', "all "), fr=None)
 
180
    _reply, args, attrs = finder.send('core', 'getd', args, attrs)
 
181
    if args.has_key('errn'):
 
182
        raise Error, aetools.decodeerror(args)
 
183
    p = []
 
184
    if args.has_key('----'):
 
185
        p =  args['----']
 
186
        for proc in p:
 
187
            if hasattr(proc, 'seld'):
 
188
                # it has a real name
 
189
                processnames.append(proc.seld)
 
190
            elif hasattr(proc, 'type'):
 
191
                if proc.type == "psn ":
 
192
                    # it has a process number
 
193
                    processnumbers.append(proc.data)
 
194
    ## get the creators
 
195
    args = {}
 
196
    attrs = {}
 
197
    aeobj_0 = aetypes.ObjectSpecifier(want=aetypes.Type('prcs'), form="indx", seld=aetypes.Unknown('abso', "all "), fr=None)
 
198
    args['----'] =  aetypes.ObjectSpecifier(want=aetypes.Type('prop'), form="prop", seld=aetypes.Type('fcrt'), fr=aeobj_0)
 
199
    _reply, args, attrs = finder.send('core', 'getd', args, attrs)
 
200
    if args.has_key('errn'):
 
201
        raise Error, aetools.decodeerror(_arg)
 
202
    if args.has_key('----'):
 
203
        p =  args['----']
 
204
        creators = p[:]
 
205
    ## concatenate in one dict
 
206
    result = []
 
207
    if len(processnames) > len(processnumbers):
 
208
        data = processnames
 
209
    else:
 
210
        data = processnumbers
 
211
    for i in range(len(creators)):
 
212
        result.append((data[i], creators[i]))
 
213
    return result
 
214
 
 
215
class _process:
 
216
    pass
 
217
 
 
218
def isactiveprocess(processname):
 
219
    """Check of processname is active. MacOS9"""
 
220
    all = processes()
 
221
    ok = 0
 
222
    for n, c in all:
 
223
        if n == processname:
 
224
            return 1
 
225
    return 0
 
226
 
 
227
def processinfo(processname):
 
228
    """Return an object with all process properties as attributes for processname. MacOS9"""
 
229
    p = _process()
 
230
 
 
231
    if processname == "Finder":
 
232
        p.partition = None
 
233
        p.used = None
 
234
    else:
 
235
        p.partition = _processproperty(processname, 'appt')
 
236
        p.used = _processproperty(processname, 'pusd')
 
237
    p.visible = _processproperty(processname, 'pvis')       #Is the process' layer visible?
 
238
    p.frontmost = _processproperty(processname, 'pisf') #Is the process the frontmost process?
 
239
    p.file = _processproperty(processname, 'file')          #the file from which the process was launched
 
240
    p.filetype  = _processproperty(processname, 'asty')     #the OSType of the file type of the process
 
241
    p.creatortype = _processproperty(processname, 'fcrt')   #the OSType of the creator of the process (the signature)
 
242
    p.accepthighlevel = _processproperty(processname, 'revt')   #Is the process high-level event aware (accepts open application, open document, print document, and quit)?
 
243
    p.hasscripting = _processproperty(processname, 'hscr')      #Does the process have a scripting terminology, i.e., can it be scripted?
 
244
    return p
 
245
 
 
246
def _processproperty(processname, property):
 
247
    """return the partition size and memory used for processname"""
 
248
    finder = _getfinder()
 
249
    args = {}
 
250
    attrs = {}
 
251
    aeobj_00 = aetypes.ObjectSpecifier(want=aetypes.Type('prcs'), form="name", seld=processname, fr=None)
 
252
    aeobj_01 = aetypes.ObjectSpecifier(want=aetypes.Type('prop'), form="prop", seld=aetypes.Type(property), fr=aeobj_00)
 
253
    args['----'] = aeobj_01
 
254
    _reply, args, attrs = finder.send("core", "getd", args, attrs)
 
255
    if args.has_key('errn'):
 
256
        raise Error, aetools.decodeerror(args)
 
257
    if args.has_key('----'):
 
258
        return args['----']
 
259
 
 
260
 
 
261
#---------------------------------------------------
 
262
#   Mess around with Finder windows.
 
263
 
 
264
def openwindow(object):
 
265
    """Open a Finder window for object, Specify object by name or fsspec."""
 
266
    finder = _getfinder()
 
267
    object = Carbon.File.FSRef(object)
 
268
    object_alias = object.FSNewAliasMinimal()
 
269
    args = {}
 
270
    attrs = {}
 
271
    _code = 'aevt'
 
272
    _subcode = 'odoc'
 
273
    aeobj_0 = aetypes.ObjectSpecifier(want=aetypes.Type('cfol'), form="alis", seld=object_alias, fr=None)
 
274
    args['----'] = aeobj_0
 
275
    _reply, args, attrs = finder.send(_code, _subcode, args, attrs)
 
276
    if args.has_key('errn'):
 
277
        raise Error, aetools.decodeerror(args)
 
278
 
 
279
def closewindow(object):
 
280
    """Close a Finder window for folder, Specify by path."""
 
281
    finder = _getfinder()
 
282
    object = Carbon.File.FSRef(object)
 
283
    object_alias = object.FSNewAliasMinimal()
 
284
    args = {}
 
285
    attrs = {}
 
286
    _code = 'core'
 
287
    _subcode = 'clos'
 
288
    aeobj_0 = aetypes.ObjectSpecifier(want=aetypes.Type('cfol'), form="alis", seld=object_alias, fr=None)
 
289
    args['----'] = aeobj_0
 
290
    _reply, args, attrs = finder.send(_code, _subcode, args, attrs)
 
291
    if args.has_key('errn'):
 
292
        raise Error, aetools.decodeerror(args)
 
293
 
 
294
def location(object, pos=None):
 
295
    """Set the position of a Finder window for folder to pos=(w, h). Specify file by name or fsspec.
 
296
    If pos=None, location will return the current position of the object."""
 
297
    object = Carbon.File.FSRef(object)
 
298
    object_alias = object.FSNewAliasMinimal()
 
299
    if not pos:
 
300
        return _getlocation(object_alias)
 
301
    return _setlocation(object_alias, pos)
 
302
 
 
303
def _setlocation(object_alias, (x, y)):
 
304
    """_setlocation: Set the location of the icon for the object."""
 
305
    finder = _getfinder()
 
306
    args = {}
 
307
    attrs = {}
 
308
    aeobj_00 = aetypes.ObjectSpecifier(want=aetypes.Type('cfol'), form="alis", seld=object_alias, fr=None)
 
309
    aeobj_01 = aetypes.ObjectSpecifier(want=aetypes.Type('prop'), form="prop", seld=aetypes.Type('posn'), fr=aeobj_00)
 
310
    args['----'] = aeobj_01
 
311
    args["data"] = [x, y]
 
312
    _reply, args, attrs = finder.send("core", "setd", args, attrs)
 
313
    if args.has_key('errn'):
 
314
        raise Error, aetools.decodeerror(args)
 
315
    return (x,y)
 
316
 
 
317
def _getlocation(object_alias):
 
318
    """_getlocation: get the location of the icon for the object."""
 
319
    finder = _getfinder()
 
320
    args = {}
 
321
    attrs = {}
 
322
    aeobj_00 = aetypes.ObjectSpecifier(want=aetypes.Type('cfol'), form="alis", seld=object_alias, fr=None)
 
323
    aeobj_01 = aetypes.ObjectSpecifier(want=aetypes.Type('prop'), form="prop", seld=aetypes.Type('posn'), fr=aeobj_00)
 
324
    args['----'] = aeobj_01
 
325
    _reply, args, attrs = finder.send("core", "getd", args, attrs)
 
326
    if args.has_key('errn'):
 
327
        raise Error, aetools.decodeerror(args)
 
328
    if args.has_key('----'):
 
329
        pos = args['----']
 
330
        return pos.h, pos.v
 
331
 
 
332
def label(object, index=None):
 
333
    """label: set or get the label of the item. Specify file by name or fsspec."""
 
334
    object = Carbon.File.FSRef(object)
 
335
    object_alias = object.FSNewAliasMinimal()
 
336
    if index is None:
 
337
        return _getlabel(object_alias)
 
338
    if index < 0 or index > 7:
 
339
        index = 0
 
340
    return _setlabel(object_alias, index)
 
341
 
 
342
def _getlabel(object_alias):
 
343
    """label: Get the label for the object."""
 
344
    finder = _getfinder()
 
345
    args = {}
 
346
    attrs = {}
 
347
    aeobj_00 = aetypes.ObjectSpecifier(want=aetypes.Type('cobj'), form="alis", seld=object_alias, fr=None)
 
348
    aeobj_01 = aetypes.ObjectSpecifier(want=aetypes.Type('prop'), form="prop", seld=aetypes.Type('labi'), fr=aeobj_00)
 
349
    args['----'] = aeobj_01
 
350
    _reply, args, attrs = finder.send("core", "getd", args, attrs)
 
351
    if args.has_key('errn'):
 
352
        raise Error, aetools.decodeerror(args)
 
353
    if args.has_key('----'):
 
354
        return args['----']
 
355
 
 
356
def _setlabel(object_alias, index):
 
357
    """label: Set the label for the object."""
 
358
    finder = _getfinder()
 
359
    args = {}
 
360
    attrs = {}
 
361
    _code = 'core'
 
362
    _subcode = 'setd'
 
363
    aeobj_0 = aetypes.ObjectSpecifier(want=aetypes.Type('prop'),
 
364
            form="alis", seld=object_alias, fr=None)
 
365
    aeobj_1 = aetypes.ObjectSpecifier(want=aetypes.Type('prop'),
 
366
            form="prop", seld=aetypes.Type('labi'), fr=aeobj_0)
 
367
    args['----'] = aeobj_1
 
368
    args["data"] = index
 
369
    _reply, args, attrs = finder.send(_code, _subcode, args, attrs)
 
370
    if args.has_key('errn'):
 
371
        raise Error, aetools.decodeerror(args)
 
372
    return index
 
373
 
 
374
def windowview(folder, view=None):
 
375
    """windowview: Set the view of the window for the folder. Specify file by name or fsspec.
 
376
    0 = by icon (default)
 
377
    1 = by name
 
378
    2 = by button
 
379
    """
 
380
    fsr = Carbon.File.FSRef(folder)
 
381
    folder_alias = fsr.FSNewAliasMinimal()
 
382
    if view is None:
 
383
        return _getwindowview(folder_alias)
 
384
    return _setwindowview(folder_alias, view)
 
385
 
 
386
def _setwindowview(folder_alias, view=0):
 
387
    """set the windowview"""
 
388
    attrs = {}
 
389
    args = {}
 
390
    if view == 1:
 
391
        _v = aetypes.Type('pnam')
 
392
    elif view == 2:
 
393
        _v = aetypes.Type('lgbu')
 
394
    else:
 
395
        _v = aetypes.Type('iimg')
 
396
    finder = _getfinder()
 
397
    aeobj_0 = aetypes.ObjectSpecifier(want = aetypes.Type('cfol'),
 
398
            form = 'alis', seld = folder_alias, fr=None)
 
399
    aeobj_1 = aetypes.ObjectSpecifier(want = aetypes.Type('prop'),
 
400
            form = 'prop', seld = aetypes.Type('cwnd'), fr=aeobj_0)
 
401
    aeobj_2 = aetypes.ObjectSpecifier(want = aetypes.Type('prop'),
 
402
            form = 'prop', seld = aetypes.Type('pvew'), fr=aeobj_1)
 
403
    aeobj_3 = aetypes.ObjectSpecifier(want = aetypes.Type('prop'),
 
404
            form = 'prop', seld = _v, fr=None)
 
405
    _code = 'core'
 
406
    _subcode = 'setd'
 
407
    args['----'] = aeobj_2
 
408
    args['data'] = aeobj_3
 
409
    _reply, args, attrs = finder.send(_code, _subcode, args, attrs)
 
410
    if args.has_key('errn'):
 
411
        raise Error, aetools.decodeerror(args)
 
412
    if args.has_key('----'):
 
413
        return args['----']
 
414
 
 
415
def _getwindowview(folder_alias):
 
416
    """get the windowview"""
 
417
    attrs = {}
 
418
    args = {}
 
419
    finder = _getfinder()
 
420
    args = {}
 
421
    attrs = {}
 
422
    aeobj_00 = aetypes.ObjectSpecifier(want=aetypes.Type('cfol'), form="alis", seld=folder_alias, fr=None)
 
423
    aeobj_01 = aetypes.ObjectSpecifier(want=aetypes.Type('prop'), form="prop", seld=aetypes.Type('cwnd'), fr=aeobj_00)
 
424
    aeobj_02 = aetypes.ObjectSpecifier(want=aetypes.Type('prop'), form="prop", seld=aetypes.Type('pvew'), fr=aeobj_01)
 
425
    args['----'] = aeobj_02
 
426
    _reply, args, attrs = finder.send("core", "getd", args, attrs)
 
427
    if args.has_key('errn'):
 
428
        raise Error, aetools.decodeerror(args)
 
429
    views = {'iimg':0, 'pnam':1, 'lgbu':2}
 
430
    if args.has_key('----'):
 
431
        return views[args['----'].enum]
 
432
 
 
433
def windowsize(folder, size=None):
 
434
    """Set the size of a Finder window for folder to size=(w, h), Specify by path.
 
435
    If size=None, windowsize will return the current size of the window.
 
436
    Specify file by name or fsspec.
 
437
    """
 
438
    fsr = Carbon.File.FSRef(folder)
 
439
    folder_alias = fsr.FSNewAliasMinimal()
 
440
    openwindow(fsr)
 
441
    if not size:
 
442
        return _getwindowsize(folder_alias)
 
443
    return _setwindowsize(folder_alias, size)
 
444
 
 
445
def _setwindowsize(folder_alias, (w, h)):
 
446
    """Set the size of a Finder window for folder to (w, h)"""
 
447
    finder = _getfinder()
 
448
    args = {}
 
449
    attrs = {}
 
450
    _code = 'core'
 
451
    _subcode = 'setd'
 
452
    aevar00 = [w, h]
 
453
    aeobj_0 = aetypes.ObjectSpecifier(want=aetypes.Type('cfol'),
 
454
            form="alis", seld=folder_alias, fr=None)
 
455
    aeobj_1 = aetypes.ObjectSpecifier(want=aetypes.Type('prop'),
 
456
            form="prop", seld=aetypes.Type('cwnd'), fr=aeobj_0)
 
457
    aeobj_2 = aetypes.ObjectSpecifier(want=aetypes.Type('prop'),
 
458
            form="prop", seld=aetypes.Type('ptsz'), fr=aeobj_1)
 
459
    args['----'] = aeobj_2
 
460
    args["data"] = aevar00
 
461
    _reply, args, attrs = finder.send(_code, _subcode, args, attrs)
 
462
    if args.has_key('errn'):
 
463
        raise Error, aetools.decodeerror(args)
 
464
    return (w, h)
 
465
 
 
466
def _getwindowsize(folder_alias):
 
467
    """Set the size of a Finder window for folder to (w, h)"""
 
468
    finder = _getfinder()
 
469
    args = {}
 
470
    attrs = {}
 
471
    aeobj_0 = aetypes.ObjectSpecifier(want=aetypes.Type('cfol'),
 
472
            form="alis", seld=folder_alias, fr=None)
 
473
    aeobj_1 = aetypes.ObjectSpecifier(want=aetypes.Type('prop'),
 
474
            form="prop", seld=aetypes.Type('cwnd'), fr=aeobj_0)
 
475
    aeobj_2 = aetypes.ObjectSpecifier(want=aetypes.Type('prop'),
 
476
            form="prop", seld=aetypes.Type('posn'), fr=aeobj_1)
 
477
    args['----'] = aeobj_2
 
478
    _reply, args, attrs = finder.send('core', 'getd', args, attrs)
 
479
    if args.has_key('errn'):
 
480
        raise Error, aetools.decodeerror(args)
 
481
    if args.has_key('----'):
 
482
        return args['----']
 
483
 
 
484
def windowposition(folder, pos=None):
 
485
    """Set the position of a Finder window for folder to pos=(w, h)."""
 
486
    fsr = Carbon.File.FSRef(folder)
 
487
    folder_alias = fsr.FSNewAliasMinimal()
 
488
    openwindow(fsr)
 
489
    if not pos:
 
490
        return _getwindowposition(folder_alias)
 
491
    if type(pos) == InstanceType:
 
492
        # pos might be a QDPoint object as returned by _getwindowposition
 
493
        pos = (pos.h, pos.v)
 
494
    return _setwindowposition(folder_alias, pos)
 
495
 
 
496
def _setwindowposition(folder_alias, (x, y)):
 
497
    """Set the size of a Finder window for folder to (w, h)."""
 
498
    finder = _getfinder()
 
499
    args = {}
 
500
    attrs = {}
 
501
    aeobj_0 = aetypes.ObjectSpecifier(want=aetypes.Type('cfol'),
 
502
            form="alis", seld=folder_alias, fr=None)
 
503
    aeobj_1 = aetypes.ObjectSpecifier(want=aetypes.Type('prop'),
 
504
            form="prop", seld=aetypes.Type('cwnd'), fr=aeobj_0)
 
505
    aeobj_2 = aetypes.ObjectSpecifier(want=aetypes.Type('prop'),
 
506
            form="prop", seld=aetypes.Type('posn'), fr=aeobj_1)
 
507
    args['----'] = aeobj_2
 
508
    args["data"] = [x, y]
 
509
    _reply, args, attrs = finder.send('core', 'setd', args, attrs)
 
510
    if args.has_key('errn'):
 
511
        raise Error, aetools.decodeerror(args)
 
512
    if args.has_key('----'):
 
513
        return args['----']
 
514
 
 
515
def _getwindowposition(folder_alias):
 
516
    """Get the size of a Finder window for folder, Specify by path."""
 
517
    finder = _getfinder()
 
518
    args = {}
 
519
    attrs = {}
 
520
    aeobj_0 = aetypes.ObjectSpecifier(want=aetypes.Type('cfol'),
 
521
            form="alis", seld=folder_alias, fr=None)
 
522
    aeobj_1 = aetypes.ObjectSpecifier(want=aetypes.Type('prop'),
 
523
            form="prop", seld=aetypes.Type('cwnd'), fr=aeobj_0)
 
524
    aeobj_2 = aetypes.ObjectSpecifier(want=aetypes.Type('prop'),
 
525
            form="prop", seld=aetypes.Type('ptsz'), fr=aeobj_1)
 
526
    args['----'] = aeobj_2
 
527
    _reply, args, attrs = finder.send('core', 'getd', args, attrs)
 
528
    if args.has_key('errn'):
 
529
        raise Error, aetools.decodeerror(args)
 
530
    if args.has_key('----'):
 
531
        return args['----']
 
532
 
 
533
def icon(object, icondata=None):
 
534
    """icon sets the icon of object, if no icondata is given,
 
535
    icon will return an AE object with binary data for the current icon.
 
536
    If left untouched, this data can be used to paste the icon on another file.
 
537
    Development opportunity: get and set the data as PICT."""
 
538
    fsr = Carbon.File.FSRef(object)
 
539
    object_alias = fsr.FSNewAliasMinimal()
 
540
    if icondata is None:
 
541
        return _geticon(object_alias)
 
542
    return _seticon(object_alias, icondata)
 
543
 
 
544
def _geticon(object_alias):
 
545
    """get the icondata for object. Binary data of some sort."""
 
546
    finder = _getfinder()
 
547
    args = {}
 
548
    attrs = {}
 
549
    aeobj_00 = aetypes.ObjectSpecifier(want=aetypes.Type('cobj'),
 
550
            form="alis", seld=object_alias, fr=None)
 
551
    aeobj_01 = aetypes.ObjectSpecifier(want=aetypes.Type('prop'),
 
552
            form="prop", seld=aetypes.Type('iimg'), fr=aeobj_00)
 
553
    args['----'] = aeobj_01
 
554
    _reply, args, attrs = finder.send("core", "getd", args, attrs)
 
555
    if args.has_key('errn'):
 
556
        raise Error, aetools.decodeerror(args)
 
557
    if args.has_key('----'):
 
558
        return args['----']
 
559
 
 
560
def _seticon(object_alias, icondata):
 
561
    """set the icondata for object, formatted as produced by _geticon()"""
 
562
    finder = _getfinder()
 
563
    args = {}
 
564
    attrs = {}
 
565
    aeobj_00 = aetypes.ObjectSpecifier(want=aetypes.Type('cobj'),
 
566
            form="alis", seld=object_alias, fr=None)
 
567
    aeobj_01 = aetypes.ObjectSpecifier(want=aetypes.Type('prop'),
 
568
            form="prop", seld=aetypes.Type('iimg'), fr=aeobj_00)
 
569
    args['----'] = aeobj_01
 
570
    args["data"] = icondata
 
571
    _reply, args, attrs = finder.send("core", "setd", args, attrs)
 
572
    if args.has_key('errn'):
 
573
        raise Error, aetools.decodeerror(args)
 
574
    if args.has_key('----'):
 
575
        return args['----'].data
 
576
 
 
577
 
 
578
#---------------------------------------------------
 
579
#   Volumes and servers.
 
580
 
 
581
def mountvolume(volume, server=None, username=None, password=None):
 
582
    """mount a volume, local or on a server on AppleTalk.
 
583
    Note: mounting a ASIP server requires a different operation.
 
584
    server is the name of the server where the volume belongs
 
585
    username, password belong to a registered user of the volume."""
 
586
    finder = _getfinder()
 
587
    args = {}
 
588
    attrs = {}
 
589
    if password:
 
590
        args["PASS"] = password
 
591
    if username:
 
592
        args["USER"] = username
 
593
    if server:
 
594
        args["SRVR"] = server
 
595
    args['----'] = volume
 
596
    _reply, args, attrs = finder.send("aevt", "mvol", args, attrs)
 
597
    if args.has_key('errn'):
 
598
        raise Error, aetools.decodeerror(args)
 
599
    if args.has_key('----'):
 
600
        return args['----']
 
601
 
 
602
def unmountvolume(volume):
 
603
    """unmount a volume that's on the desktop"""
 
604
    putaway(volume)
 
605
 
 
606
def putaway(object):
 
607
    """puth the object away, whereever it came from."""
 
608
    finder = _getfinder()
 
609
    args = {}
 
610
    attrs = {}
 
611
    args['----'] = aetypes.ObjectSpecifier(want=aetypes.Type('cdis'), form="name", seld=object, fr=None)
 
612
    _reply, args, attrs = talker.send("fndr", "ptwy", args, attrs)
 
613
    if args.has_key('errn'):
 
614
        raise Error, aetools.decodeerror(args)
 
615
    if args.has_key('----'):
 
616
        return args['----']
 
617
 
 
618
 
 
619
#---------------------------------------------------
 
620
#   Miscellaneous functions
 
621
#
 
622
 
 
623
def volumelevel(level):
 
624
    """set the audio output level, parameter between 0 (silent) and 7 (full blast)"""
 
625
    finder = _getfinder()
 
626
    args = {}
 
627
    attrs = {}
 
628
    if level < 0:
 
629
        level = 0
 
630
    elif level > 7:
 
631
        level = 7
 
632
    args['----'] = level
 
633
    _reply, args, attrs = finder.send("aevt", "stvl", args, attrs)
 
634
    if args.has_key('errn'):
 
635
        raise Error, aetools.decodeerror(args)
 
636
    if args.has_key('----'):
 
637
        return args['----']
 
638
 
 
639
def OSversion():
 
640
    """return the version of the system software"""
 
641
    finder = _getfinder()
 
642
    args = {}
 
643
    attrs = {}
 
644
    aeobj_00 = aetypes.ObjectSpecifier(want=aetypes.Type('prop'), form="prop", seld=aetypes.Type('ver2'), fr=None)
 
645
    args['----'] = aeobj_00
 
646
    _reply, args, attrs = finder.send("core", "getd", args, attrs)
 
647
    if args.has_key('errn'):
 
648
        raise Error, aetools.decodeerror(args)
 
649
    if args.has_key('----'):
 
650
        return args['----']
 
651
 
 
652
def filesharing():
 
653
    """return the current status of filesharing and whether it is starting up or not:
 
654
        -1  file sharing is off and not starting up
 
655
        0   file sharing is off and starting up
 
656
        1   file sharing is on"""
 
657
    status = -1
 
658
    finder = _getfinder()
 
659
    # see if it is on
 
660
    args = {}
 
661
    attrs = {}
 
662
    args['----'] = aetypes.ObjectSpecifier(want=aetypes.Type('prop'), form="prop", seld=aetypes.Type('fshr'), fr=None)
 
663
    _reply, args, attrs = finder.send("core", "getd", args, attrs)
 
664
    if args.has_key('errn'):
 
665
        raise Error, aetools.decodeerror(args)
 
666
    if args.has_key('----'):
 
667
        if args['----'] == 0:
 
668
            status = -1
 
669
        else:
 
670
            status = 1
 
671
    # is it starting up perchance?
 
672
    args = {}
 
673
    attrs = {}
 
674
    args['----'] = aetypes.ObjectSpecifier(want=aetypes.Type('prop'), form="prop", seld=aetypes.Type('fsup'), fr=None)
 
675
    _reply, args, attrs = finder.send("core", "getd", args, attrs)
 
676
    if args.has_key('errn'):
 
677
        raise Error, aetools.decodeerror(args)
 
678
    if args.has_key('----'):
 
679
        if args['----'] == 1:
 
680
            status = 0
 
681
    return status
 
682
 
 
683
def movetotrash(path):
 
684
    """move the object to the trash"""
 
685
    fss = Carbon.File.FSSpec(path)
 
686
    trashfolder = Carbon.Folder.FSFindFolder(fss.as_tuple()[0], 'trsh', 0)
 
687
    move(path, trashfolder)
 
688
 
 
689
def emptytrash():
 
690
    """empty the trash"""
 
691
    finder = _getfinder()
 
692
    args = {}
 
693
    attrs = {}
 
694
    args['----'] = aetypes.ObjectSpecifier(want=aetypes.Type('prop'), form="prop", seld=aetypes.Type('trsh'), fr=None)
 
695
    _reply, args, attrs = finder.send("fndr", "empt", args, attrs)
 
696
    if args.has_key('errn'):
 
697
        raise aetools.Error, aetools.decodeerror(args)
 
698
 
 
699
 
 
700
def _test():
 
701
    import EasyDialogs
 
702
    print 'Original findertools functionality test...'
 
703
    print 'Testing launch...'
 
704
    pathname = EasyDialogs.AskFileForOpen('File to launch:')
 
705
    if pathname:
 
706
        result = launch(pathname)
 
707
        if result:
 
708
            print 'Result: ', result
 
709
        print 'Press return-',
 
710
        sys.stdin.readline()
 
711
    print 'Testing print...'
 
712
    pathname = EasyDialogs.AskFileForOpen('File to print:')
 
713
    if pathname:
 
714
        result = Print(pathname)
 
715
        if result:
 
716
            print 'Result: ', result
 
717
        print 'Press return-',
 
718
        sys.stdin.readline()
 
719
    print 'Testing copy...'
 
720
    pathname = EasyDialogs.AskFileForOpen('File to copy:')
 
721
    if pathname:
 
722
        destdir = EasyDialogs.AskFolder('Destination:')
 
723
        if destdir:
 
724
            result = copy(pathname, destdir)
 
725
            if result:
 
726
                print 'Result:', result
 
727
            print 'Press return-',
 
728
            sys.stdin.readline()
 
729
    print 'Testing move...'
 
730
    pathname = EasyDialogs.AskFileForOpen('File to move:')
 
731
    if pathname:
 
732
        destdir = EasyDialogs.AskFolder('Destination:')
 
733
        if destdir:
 
734
            result = move(pathname, destdir)
 
735
            if result:
 
736
                print 'Result:', result
 
737
            print 'Press return-',
 
738
            sys.stdin.readline()
 
739
    print 'Testing sleep...'
 
740
    if EasyDialogs.AskYesNoCancel('Sleep?') > 0:
 
741
        result = sleep()
 
742
        if result:
 
743
            print 'Result:', result
 
744
        print 'Press return-',
 
745
        sys.stdin.readline()
 
746
    print 'Testing shutdown...'
 
747
    if EasyDialogs.AskYesNoCancel('Shut down?') > 0:
 
748
        result = shutdown()
 
749
        if result:
 
750
            print 'Result:', result
 
751
        print 'Press return-',
 
752
        sys.stdin.readline()
 
753
    print 'Testing restart...'
 
754
    if EasyDialogs.AskYesNoCancel('Restart?') > 0:
 
755
        result = restart()
 
756
        if result:
 
757
            print 'Result:', result
 
758
        print 'Press return-',
 
759
        sys.stdin.readline()
 
760
 
 
761
def _test2():
 
762
    print '\nmorefindertools version %s\nTests coming up...' %__version__
 
763
    import os
 
764
    import random
 
765
 
 
766
    # miscellaneous
 
767
    print '\tfilesharing on?',  filesharing()       # is file sharing on, off, starting up?
 
768
    print '\tOS version',       OSversion()     # the version of the system software
 
769
 
 
770
    # set the soundvolume in a simple way
 
771
    print '\tSystem beep volume'
 
772
    for i in range(0, 7):
 
773
        volumelevel(i)
 
774
        MacOS.SysBeep()
 
775
 
 
776
    # Finder's windows, file location, file attributes
 
777
    open("@findertoolstest", "w")
 
778
    f = "@findertoolstest"
 
779
    reveal(f)               # reveal this file in a Finder window
 
780
    select(f)               # select this file
 
781
 
 
782
    base, file = os.path.split(f)
 
783
    closewindow(base)   # close the window this file is in  (opened by reveal)
 
784
    openwindow(base)        # open it again
 
785
    windowview(base, 1) # set the view by list
 
786
 
 
787
    label(f, 2)             # set the label of this file to something orange
 
788
    print '\tlabel', label(f)   # get the label of this file
 
789
 
 
790
    # the file location only works in a window with icon view!
 
791
    print 'Random locations for an icon'
 
792
    windowview(base, 0)     # set the view by icon
 
793
    windowsize(base, (600, 600))
 
794
    for i in range(50):
 
795
        location(f, (random.randint(10, 590), random.randint(10, 590)))
 
796
 
 
797
    windowsize(base, (200, 400))
 
798
    windowview(base, 1)     # set the view by icon
 
799
 
 
800
    orgpos = windowposition(base)
 
801
    print 'Animated window location'
 
802
    for i in range(10):
 
803
        pos = (100+i*10, 100+i*10)
 
804
        windowposition(base, pos)
 
805
        print '\twindow position', pos
 
806
    windowposition(base, orgpos)    # park it where it was before
 
807
 
 
808
    print 'Put a comment in file', f, ':'
 
809
    print '\t', comment(f)      # print the Finder comment this file has
 
810
    s = 'This is a comment no one reads!'
 
811
    comment(f, s)           # set the Finder comment
 
812
 
 
813
def _test3():
 
814
    print 'MacOS9 or better specific functions'
 
815
    # processes
 
816
    pr = processes()        # return a list of tuples with (active_processname, creatorcode)
 
817
    print 'Return a list of current active processes:'
 
818
    for p in pr:
 
819
        print '\t', p
 
820
 
 
821
    # get attributes of the first process in the list
 
822
    print 'Attributes of the first process in the list:'
 
823
    pinfo = processinfo(pr[0][0])
 
824
    print '\t', pr[0][0]
 
825
    print '\t\tmemory partition', pinfo.partition       # the memory allocated to this process
 
826
    print '\t\tmemory used', pinfo.used         # the memory actuall used by this process
 
827
    print '\t\tis visible', pinfo.visible           # is the process visible to the user
 
828
    print '\t\tis frontmost', pinfo.frontmost       # is the process the front most one?
 
829
    print '\t\thas scripting', pinfo.hasscripting       # is the process scriptable?
 
830
    print '\t\taccepts high level events',  pinfo.accepthighlevel   # does the process accept high level appleevents?
 
831
 
 
832
if __name__ == '__main__':
 
833
    _test()
 
834
    _test2()
 
835
    _test3()