blob: 6bb0b4472225e7fda41c457e1699b3ee408b80e5 [file] [log] [blame]
Just van Rossum73efed22000-04-09 19:45:22 +00001# copyright 1997-2000 Just van Rossum, Letterror. just@letterror.com
Just van Rossum40f9b7b1999-01-30 22:39:17 +00002
3import Splash
4
5import FrameWork
Just van Rossum40f9b7b1999-01-30 22:39:17 +00006import Wapplication
7import W
8import os
9import macfs
10
11
12class PythonIDE(Wapplication.Application):
13
14 def __init__(self):
15 self.preffilepath = ":Python:PythonIDE preferences"
Just van Rossumf4b06811999-02-27 17:16:54 +000016 Wapplication.Application.__init__(self, 'Pide')
Just van Rossum40f9b7b1999-01-30 22:39:17 +000017 import AE, AppleEvents
18
19 AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEOpenApplication,
20 self.ignoreevent)
21 AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEPrintDocuments,
22 self.ignoreevent)
23 AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEOpenDocuments,
24 self.opendocsevent)
25 AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEQuitApplication,
26 self.quitevent)
27 import PyConsole, PyEdit
28 Splash.wait()
29 Splash.uninstall_importhook()
30 PyConsole.installoutput()
31 PyConsole.installconsole()
32 import sys
33 for path in sys.argv[1:]:
34 self.opendoc(path)
Just van Rossum73efed22000-04-09 19:45:22 +000035 try:
Just van Rossuma1a33562000-10-20 06:37:11 +000036 import Wthreading
Just van Rossum73efed22000-04-09 19:45:22 +000037 except ImportError:
38 self.mainloop()
39 else:
Just van Rossuma1a33562000-10-20 06:37:11 +000040 if Wthreading.haveThreading:
41 self.mainthread = Wthreading.Thread("IDE event loop", self.mainloop)
42 self.mainthread.start()
43 #self.mainthread.setResistant(1)
44 Wthreading.run()
45 else:
46 self.mainloop()
Just van Rossum40f9b7b1999-01-30 22:39:17 +000047
48 def makeusermenus(self):
49 m = Wapplication.Menu(self.menubar, "File")
50 newitem = FrameWork.MenuItem(m, "New", "N", 'new')
Just van Rossumedab9391999-02-02 22:31:05 +000051 openitem = FrameWork.MenuItem(m, "OpenŠ", "O", 'open')
Just van Rossum40f9b7b1999-01-30 22:39:17 +000052 FrameWork.Separator(m)
53 closeitem = FrameWork.MenuItem(m, "Close", "W", 'close')
54 saveitem = FrameWork.MenuItem(m, "Save", "S", 'save')
Just van Rossumedab9391999-02-02 22:31:05 +000055 saveasitem = FrameWork.MenuItem(m, "Save asŠ", None, 'save_as')
Just van Rossum40f9b7b1999-01-30 22:39:17 +000056 FrameWork.Separator(m)
Just van Rossumedab9391999-02-02 22:31:05 +000057 saveasappletitem = FrameWork.MenuItem(m, "Save as AppletŠ", None, 'save_as_applet')
Just van Rossum40f9b7b1999-01-30 22:39:17 +000058 FrameWork.Separator(m)
59 quititem = FrameWork.MenuItem(m, "Quit", "Q", 'quit')
60
61 m = Wapplication.Menu(self.menubar, "Edit")
62 undoitem = FrameWork.MenuItem(m, "Undo", 'Z', "undo")
63 FrameWork.Separator(m)
64 cutitem = FrameWork.MenuItem(m, "Cut", 'X', "cut")
65 copyitem = FrameWork.MenuItem(m, "Copy", "C", "copy")
66 pasteitem = FrameWork.MenuItem(m, "Paste", "V", "paste")
67 FrameWork.MenuItem(m, "Clear", None, "clear")
68 FrameWork.Separator(m)
69 selallitem = FrameWork.MenuItem(m, "Select all", "A", "selectall")
70 sellineitem = FrameWork.MenuItem(m, "Select line", "L", "selectline")
71 FrameWork.Separator(m)
Just van Rossumedab9391999-02-02 22:31:05 +000072 finditem = FrameWork.MenuItem(m, "FindŠ", "F", "find")
Just van Rossum40f9b7b1999-01-30 22:39:17 +000073 findagainitem = FrameWork.MenuItem(m, "Find again", 'G', "findnext")
74 enterselitem = FrameWork.MenuItem(m, "Enter search string", "E", "entersearchstring")
75 replaceitem = FrameWork.MenuItem(m, "Replace", None, "replace")
76 replacefinditem = FrameWork.MenuItem(m, "Replace & find again", 'T', "replacefind")
77 FrameWork.Separator(m)
78 shiftleftitem = FrameWork.MenuItem(m, "Shift left", "[", "shiftleft")
79 shiftrightitem = FrameWork.MenuItem(m, "Shift right", "]", "shiftright")
80
81 m = Wapplication.Menu(self.menubar, "Python")
82 runitem = FrameWork.MenuItem(m, "Run window", "R", 'run')
83 runselitem = FrameWork.MenuItem(m, "Run selection", None, 'runselection')
84 FrameWork.Separator(m)
Just van Rossumedab9391999-02-02 22:31:05 +000085 moditem = FrameWork.MenuItem(m, "Module browserŠ", "M", self.domenu_modulebrowser)
Just van Rossum40f9b7b1999-01-30 22:39:17 +000086 FrameWork.Separator(m)
87 mm = FrameWork.SubMenu(m, "Preferences")
Just van Rossumedab9391999-02-02 22:31:05 +000088 FrameWork.MenuItem(mm, "Set Scripts folderŠ", None, self.do_setscriptsfolder)
89 FrameWork.MenuItem(mm, "Editor default settingsŠ", None, self.do_editorprefs)
Just van Rossum2028b591999-09-26 12:16:22 +000090 FrameWork.MenuItem(mm, "Set default window fontŠ", None, self.do_setwindowfont)
Just van Rossum40f9b7b1999-01-30 22:39:17 +000091
92 self.openwindowsmenu = Wapplication.Menu(self.menubar, 'Windows')
93 self.makeopenwindowsmenu()
94 self._menustocheck = [closeitem, saveitem, saveasitem, saveasappletitem,
95 undoitem, cutitem, copyitem, pasteitem,
96 selallitem, sellineitem,
97 finditem, findagainitem, enterselitem, replaceitem, replacefinditem,
98 shiftleftitem, shiftrightitem,
99 runitem, runselitem]
100
101 prefs = self.getprefs()
102 try:
103 fss, fss_changed = macfs.RawAlias(prefs.scriptsfolder).Resolve()
Just van Rossum68922f01999-02-25 22:33:05 +0000104 self.scriptsfolder = fss.NewAlias()
Just van Rossum40f9b7b1999-01-30 22:39:17 +0000105 except:
Just van Rossum2028b591999-09-26 12:16:22 +0000106 path = os.path.join(os.getcwd(), ":Mac:IDE scripts")
Just van Rossum40f9b7b1999-01-30 22:39:17 +0000107 if not os.path.exists(path):
Just van Rossum2028b591999-09-26 12:16:22 +0000108 path = os.path.join(os.getcwd(), "Scripts")
109 if not os.path.exists(path):
110 os.mkdir(path)
111 f = open(os.path.join(path, "Place your scripts hereŠ"), "w")
112 f.close()
Just van Rossum40f9b7b1999-01-30 22:39:17 +0000113 fss = macfs.FSSpec(path)
114 self.scriptsfolder = fss.NewAlias()
115 self.scriptsfoldermodtime = fss.GetDates()[1]
116 else:
Just van Rossum40f9b7b1999-01-30 22:39:17 +0000117 self.scriptsfoldermodtime = fss.GetDates()[1]
118 prefs.scriptsfolder = self.scriptsfolder.data
119 self._scripts = {}
120 self.scriptsmenu = None
121 self.makescriptsmenu()
122
123 def quitevent(self, theAppleEvent, theReply):
124 import AE
125 AE.AEInteractWithUser(50000000)
126 self._quit()
127
128 def suspendresume(self, onoff):
129 if onoff:
130 fss, fss_changed = self.scriptsfolder.Resolve()
131 modtime = fss.GetDates()[1]
132 if self.scriptsfoldermodtime <> modtime or fss_changed:
133 self.scriptsfoldermodtime = modtime
134 W.SetCursor('watch')
135 self.makescriptsmenu()
136
137 def ignoreevent(self, theAppleEvent, theReply):
138 pass
139
140 def opendocsevent(self, theAppleEvent, theReply):
141 W.SetCursor('watch')
142 import aetools
143 parameters, args = aetools.unpackevent(theAppleEvent)
144 docs = parameters['----']
145 if type(docs) <> type([]):
146 docs = [docs]
147 for doc in docs:
148 fss, a = doc.Resolve()
149 path = fss.as_pathname()
150 self.opendoc(path)
151
152 def opendoc(self, path):
153 fcreator, ftype = macfs.FSSpec(path).GetCreatorType()
154 if ftype == 'TEXT':
155 self.openscript(path)
156 else:
Just van Rossumedab9391999-02-02 22:31:05 +0000157 W.Message("Can¹t open file of type '%s'." % ftype)
Just van Rossum40f9b7b1999-01-30 22:39:17 +0000158
159 def getabouttext(self):
Just van Rossumedab9391999-02-02 22:31:05 +0000160 return "About Python IDEŠ"
Just van Rossum40f9b7b1999-01-30 22:39:17 +0000161
162 def do_about(self, id, item, window, event):
163 Splash.about()
164
165 def do_setscriptsfolder(self, *args):
166 fss, ok = macfs.GetDirectory("Select Scripts Folder")
167 if ok:
168 prefs = self.getprefs()
169 alis = fss.NewAlias()
170 prefs.scriptsfolder = alis.data
171 self.scriptsfolder = alis
172 self.makescriptsmenu()
173 prefs.save()
174
175 def domenu_modulebrowser(self, *args):
176 W.SetCursor('watch')
177 import ModuleBrowser
178 ModuleBrowser.ModuleBrowser()
179
180 def domenu_open(self, *args):
181 fss, ok = macfs.StandardGetFile("TEXT")
182 if ok:
183 self.openscript(fss.as_pathname())
184
185 def domenu_new(self, *args):
186 W.SetCursor('watch')
187 import PyEdit
188 return PyEdit.Editor()
189
190 def makescriptsmenu(self):
191 W.SetCursor('watch')
192 if self._scripts:
193 for id, item in self._scripts.keys():
194 if self.menubar.menus.has_key(id):
195 m = self.menubar.menus[id]
196 m.delete()
197 self._scripts = {}
198 if self.scriptsmenu:
199 if hasattr(self.scriptsmenu, 'id') and self.menubar.menus.has_key(self.scriptsmenu.id):
200 self.scriptsmenu.delete()
201 self.scriptsmenu = FrameWork.Menu(self.menubar, "Scripts")
202 #FrameWork.MenuItem(self.scriptsmenu, "New script", None, self.domenu_new)
203 #self.scriptsmenu.addseparator()
204 fss, fss_changed = self.scriptsfolder.Resolve()
205 self.scriptswalk(fss.as_pathname(), self.scriptsmenu)
206
207 def makeopenwindowsmenu(self):
208 for i in range(len(self.openwindowsmenu.items)):
209 self.openwindowsmenu.menu.DeleteMenuItem(1)
210 self.openwindowsmenu.items = []
211 windows = []
212 self._openwindows = {}
213 for window in self._windows.keys():
214 title = window.GetWTitle()
215 if not title:
216 title = "<no title>"
Jack Jansen34d11f02000-03-07 23:40:13 +0000217 windows.append((title, window))
Just van Rossum40f9b7b1999-01-30 22:39:17 +0000218 windows.sort()
219 for title, window in windows:
220 if title == "Python Interactive": # ugly but useful hack by Joe Strout
221 shortcut = '0'
222 else:
223 shortcut = None
224 item = FrameWork.MenuItem(self.openwindowsmenu, title, shortcut, callback = self.domenu_openwindows)
225 self._openwindows[item.item] = window
226 self._openwindowscheckmark = 0
227 self.checkopenwindowsmenu()
228
229 def domenu_openwindows(self, id, item, window, event):
230 w = self._openwindows[item]
231 w.ShowWindow()
232 w.SelectWindow()
233
234 def domenu_quit(self):
235 self._quit()
236
237 def domenu_save(self, *args):
238 print "Save"
239
240 def _quit(self):
241 import PyConsole, PyEdit
242 PyConsole.console.writeprefs()
243 PyConsole.output.writeprefs()
244 PyEdit.searchengine.writeprefs()
245 for window in self._windows.values():
Just van Rossumd58c7461999-06-22 18:37:35 +0000246 try:
247 rv = window.close() # ignore any errors while quitting
248 except:
249 rv = 0 # (otherwise, we can get stuck!)
Just van Rossum40f9b7b1999-01-30 22:39:17 +0000250 if rv and rv > 0:
251 return
252 self.quitting = 1
253
254PythonIDE()
255