We'll now set up a corresponding document class which is a simple text editor.
import W
import os
import macfs
class MyDocumentClass(W.Window):
_untitledcounter = 1
# Initialisation
def __init__(self, path = ""):
# get the title and data
if not path:
self.title = "Untitled " + `MyDocumentClass._untitledcounter`
MyDocumentClass._untitledcounter = MyDocumentClass._untitledcounter + 1
text = ""
elif os.path.exists(path):
path = macfs.ResolveAliasFile(path)[0].as_pathname()
dir, name = os.path.split(path)
self.title = name
f = open(path, "rb")
text = f.read()
f.close()
# Might read from resource fork here
self.path = path
# Set up the window and widgets
W.Window.__init__(self, (600, 400), self.title, minsize = (330, 120), tabbable = 0)
self.setupwidgets(text)
self.editgroup.editor.changed = 0
def setupwidgets(self, text):
self.editgroup = W.Group((0, 0, 0, 0))
editor = W.TextEditor((0, 0, -15,-15), text)
self.editgroup._barx = W.Scrollbar((0, -15, -14, 16), editor.hscroll, max = 32767)
self.editgroup._bary = W.Scrollbar((-15, 0, 16, -14), editor.vscroll, max = 32767)
self.editgroup.editor = editor
# Finalisation
def close(self):
# If things have changed, should we save before closing?
if self.editgroup.editor.changed:
import EasyDialogs
import Qd
Qd.InitCursor() # XXX should be done by dialog
save = EasyDialogs.AskYesNoCancel('Save window Ò%sÓ before closing?' % self.title, 1)
if save > 0:
if self.domenu_save():
return 1
elif save < 0:
return 1
W.Window.close(self)
# Document Menu Items
def domenu_close(self, *args):
return self.close()
def domenu_save(self, *args):
if not self.path:
# Will call us recursively
return self.domenu_save_as()
data = self.editgroup.editor.get()
f = open(self.path, 'wb')
f.write(data)
f.close()
import macostools
macostools.touched(self.path)
self.editgroup.editor.changed = 0
def can_save(self, menuitem):
return self.editgroup.editor.changed or self.editgroup.editor.selchanged
def domenu_save_as(self, *args):
fss, ok = macfs.StandardPutFile('Save as:', self.title)
if not ok:
return 1
self.path = fss.as_pathname()
dir, name = os.path.split(self.path)
self.title = name
self.settitle(self.title)
self.domenu_save()
It's worthwhile noting that, because we are only using standard menu items, and are using them in the same way as the Python IDE, you can import this and create your own instances of the document interactively.