1 # copyright 1997-2000 Just van Rossum, Letterror. just@letterror.com
12 class PythonIDE(Wapplication
.Application
):
15 self
.preffilepath
= ":Python:PythonIDE preferences"
16 Wapplication
.Application
.__init
__(self
, 'Pide')
17 import AE
, AppleEvents
19 AE
.AEInstallEventHandler(AppleEvents
.kCoreEventClass
, AppleEvents
.kAEOpenApplication
,
21 AE
.AEInstallEventHandler(AppleEvents
.kCoreEventClass
, AppleEvents
.kAEPrintDocuments
,
23 AE
.AEInstallEventHandler(AppleEvents
.kCoreEventClass
, AppleEvents
.kAEOpenDocuments
,
25 AE
.AEInstallEventHandler(AppleEvents
.kCoreEventClass
, AppleEvents
.kAEQuitApplication
,
27 import PyConsole
, PyEdit
29 Splash
.uninstall_importhook()
30 PyConsole
.installoutput()
31 PyConsole
.installconsole()
33 for path
in sys
.argv
[1:]:
40 main
= uthread2
.Thread("mainloop", self
.mainloop
)
44 def makeusermenus(self
):
45 m
= Wapplication
.Menu(self
.menubar
, "File")
46 newitem
= FrameWork
.MenuItem(m
, "New", "N", 'new')
47 openitem
= FrameWork
.MenuItem(m
, "OpenŠ", "O", 'open')
48 FrameWork
.Separator(m
)
49 closeitem
= FrameWork
.MenuItem(m
, "Close", "W", 'close')
50 saveitem
= FrameWork
.MenuItem(m
, "Save", "S", 'save')
51 saveasitem
= FrameWork
.MenuItem(m
, "Save asŠ", None, 'save_as')
52 FrameWork
.Separator(m
)
53 saveasappletitem
= FrameWork
.MenuItem(m
, "Save as AppletŠ", None, 'save_as_applet')
54 FrameWork
.Separator(m
)
55 quititem
= FrameWork
.MenuItem(m
, "Quit", "Q", 'quit')
57 m
= Wapplication
.Menu(self
.menubar
, "Edit")
58 undoitem
= FrameWork
.MenuItem(m
, "Undo", 'Z', "undo")
59 FrameWork
.Separator(m
)
60 cutitem
= FrameWork
.MenuItem(m
, "Cut", 'X', "cut")
61 copyitem
= FrameWork
.MenuItem(m
, "Copy", "C", "copy")
62 pasteitem
= FrameWork
.MenuItem(m
, "Paste", "V", "paste")
63 FrameWork
.MenuItem(m
, "Clear", None, "clear")
64 FrameWork
.Separator(m
)
65 selallitem
= FrameWork
.MenuItem(m
, "Select all", "A", "selectall")
66 sellineitem
= FrameWork
.MenuItem(m
, "Select line", "L", "selectline")
67 FrameWork
.Separator(m
)
68 finditem
= FrameWork
.MenuItem(m
, "FindŠ", "F", "find")
69 findagainitem
= FrameWork
.MenuItem(m
, "Find again", 'G', "findnext")
70 enterselitem
= FrameWork
.MenuItem(m
, "Enter search string", "E", "entersearchstring")
71 replaceitem
= FrameWork
.MenuItem(m
, "Replace", None, "replace")
72 replacefinditem
= FrameWork
.MenuItem(m
, "Replace & find again", 'T', "replacefind")
73 FrameWork
.Separator(m
)
74 shiftleftitem
= FrameWork
.MenuItem(m
, "Shift left", "[", "shiftleft")
75 shiftrightitem
= FrameWork
.MenuItem(m
, "Shift right", "]", "shiftright")
77 m
= Wapplication
.Menu(self
.menubar
, "Python")
78 runitem
= FrameWork
.MenuItem(m
, "Run window", "R", 'run')
79 runselitem
= FrameWork
.MenuItem(m
, "Run selection", None, 'runselection')
80 FrameWork
.Separator(m
)
81 moditem
= FrameWork
.MenuItem(m
, "Module browserŠ", "M", self
.domenu_modulebrowser
)
82 FrameWork
.Separator(m
)
83 mm
= FrameWork
.SubMenu(m
, "Preferences")
84 FrameWork
.MenuItem(mm
, "Set Scripts folderŠ", None, self
.do_setscriptsfolder
)
85 FrameWork
.MenuItem(mm
, "Editor default settingsŠ", None, self
.do_editorprefs
)
86 FrameWork
.MenuItem(mm
, "Set default window fontŠ", None, self
.do_setwindowfont
)
88 self
.openwindowsmenu
= Wapplication
.Menu(self
.menubar
, 'Windows')
89 self
.makeopenwindowsmenu()
90 self
._menustocheck
= [closeitem
, saveitem
, saveasitem
, saveasappletitem
,
91 undoitem
, cutitem
, copyitem
, pasteitem
,
92 selallitem
, sellineitem
,
93 finditem
, findagainitem
, enterselitem
, replaceitem
, replacefinditem
,
94 shiftleftitem
, shiftrightitem
,
97 prefs
= self
.getprefs()
99 fss
, fss_changed
= macfs
.RawAlias(prefs
.scriptsfolder
).Resolve()
100 self
.scriptsfolder
= fss
.NewAlias()
102 path
= os
.path
.join(os
.getcwd(), ":Mac:IDE scripts")
103 if not os
.path
.exists(path
):
104 path
= os
.path
.join(os
.getcwd(), "Scripts")
105 if not os
.path
.exists(path
):
107 f
= open(os
.path
.join(path
, "Place your scripts hereŠ"), "w")
109 fss
= macfs
.FSSpec(path
)
110 self
.scriptsfolder
= fss
.NewAlias()
111 self
.scriptsfoldermodtime
= fss
.GetDates()[1]
113 self
.scriptsfoldermodtime
= fss
.GetDates()[1]
114 prefs
.scriptsfolder
= self
.scriptsfolder
.data
116 self
.scriptsmenu
= None
117 self
.makescriptsmenu()
119 def quitevent(self
, theAppleEvent
, theReply
):
121 AE
.AEInteractWithUser(50000000)
124 def suspendresume(self
, onoff
):
126 fss
, fss_changed
= self
.scriptsfolder
.Resolve()
127 modtime
= fss
.GetDates()[1]
128 if self
.scriptsfoldermodtime
<> modtime
or fss_changed
:
129 self
.scriptsfoldermodtime
= modtime
131 self
.makescriptsmenu()
133 def ignoreevent(self
, theAppleEvent
, theReply
):
136 def opendocsevent(self
, theAppleEvent
, theReply
):
139 parameters
, args
= aetools
.unpackevent(theAppleEvent
)
140 docs
= parameters
['----']
141 if type(docs
) <> type([]):
144 fss
, a
= doc
.Resolve()
145 path
= fss
.as_pathname()
148 def opendoc(self
, path
):
149 fcreator
, ftype
= macfs
.FSSpec(path
).GetCreatorType()
151 self
.openscript(path
)
153 W
.Message("Can¹t open file of type '%s'." % ftype
)
155 def getabouttext(self
):
156 return "About Python IDEŠ"
158 def do_about(self
, id, item
, window
, event
):
161 def do_setscriptsfolder(self
, *args
):
162 fss
, ok
= macfs
.GetDirectory("Select Scripts Folder")
164 prefs
= self
.getprefs()
165 alis
= fss
.NewAlias()
166 prefs
.scriptsfolder
= alis
.data
167 self
.scriptsfolder
= alis
168 self
.makescriptsmenu()
171 def domenu_modulebrowser(self
, *args
):
174 ModuleBrowser
.ModuleBrowser()
176 def domenu_open(self
, *args
):
177 fss
, ok
= macfs
.StandardGetFile("TEXT")
179 self
.openscript(fss
.as_pathname())
181 def domenu_new(self
, *args
):
184 return PyEdit
.Editor()
186 def makescriptsmenu(self
):
189 for id, item
in self
._scripts
.keys():
190 if self
.menubar
.menus
.has_key(id):
191 m
= self
.menubar
.menus
[id]
195 if hasattr(self
.scriptsmenu
, 'id') and self
.menubar
.menus
.has_key(self
.scriptsmenu
.id):
196 self
.scriptsmenu
.delete()
197 self
.scriptsmenu
= FrameWork
.Menu(self
.menubar
, "Scripts")
198 #FrameWork.MenuItem(self.scriptsmenu, "New script", None, self.domenu_new)
199 #self.scriptsmenu.addseparator()
200 fss
, fss_changed
= self
.scriptsfolder
.Resolve()
201 self
.scriptswalk(fss
.as_pathname(), self
.scriptsmenu
)
203 def makeopenwindowsmenu(self
):
204 for i
in range(len(self
.openwindowsmenu
.items
)):
205 self
.openwindowsmenu
.menu
.DeleteMenuItem(1)
206 self
.openwindowsmenu
.items
= []
208 self
._openwindows
= {}
209 for window
in self
._windows
.keys():
210 title
= window
.GetWTitle()
213 windows
.append((title
, window
))
215 for title
, window
in windows
:
216 if title
== "Python Interactive": # ugly but useful hack by Joe Strout
220 item
= FrameWork
.MenuItem(self
.openwindowsmenu
, title
, shortcut
, callback
= self
.domenu_openwindows
)
221 self
._openwindows
[item
.item
] = window
222 self
._openwindowscheckmark
= 0
223 self
.checkopenwindowsmenu()
225 def domenu_openwindows(self
, id, item
, window
, event
):
226 w
= self
._openwindows
[item
]
230 def domenu_quit(self
):
233 def domenu_save(self
, *args
):
237 import PyConsole
, PyEdit
238 PyConsole
.console
.writeprefs()
239 PyConsole
.output
.writeprefs()
240 PyEdit
.searchengine
.writeprefs()
241 for window
in self
._windows
.values():
243 rv
= window
.close() # ignore any errors while quitting
245 rv
= 0 # (otherwise, we can get stuck!)