blob: 3501971f4f10760909ed1c494129ec456fb1fe20 [file] [log] [blame]
Just van Rossum40f9b7b1999-01-30 22:39:17 +00001# copyright 1997-1998 Just van Rossum, Letterror. just@letterror.com
2
3import Splash
4
5import FrameWork
6import Win
7import Wapplication
8import W
9import os
10import macfs
11
12
13class PythonIDE(Wapplication.Application):
14
15 def __init__(self):
16 self.preffilepath = ":Python:PythonIDE preferences"
17 Wapplication.Application.__init__(self, 'Pyth')
18 import AE, AppleEvents
19
20 AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEOpenApplication,
21 self.ignoreevent)
22 AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEPrintDocuments,
23 self.ignoreevent)
24 AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEOpenDocuments,
25 self.opendocsevent)
26 AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEQuitApplication,
27 self.quitevent)
28 import PyConsole, PyEdit
29 Splash.wait()
30 Splash.uninstall_importhook()
31 PyConsole.installoutput()
32 PyConsole.installconsole()
33 import sys
34 for path in sys.argv[1:]:
35 self.opendoc(path)
36 self.mainloop()
37
38 def makeusermenus(self):
39 m = Wapplication.Menu(self.menubar, "File")
40 newitem = FrameWork.MenuItem(m, "New", "N", 'new')
Just van Rossumedab9391999-02-02 22:31:05 +000041 openitem = FrameWork.MenuItem(m, "OpenŠ", "O", 'open')
Just van Rossum40f9b7b1999-01-30 22:39:17 +000042 FrameWork.Separator(m)
43 closeitem = FrameWork.MenuItem(m, "Close", "W", 'close')
44 saveitem = FrameWork.MenuItem(m, "Save", "S", 'save')
Just van Rossumedab9391999-02-02 22:31:05 +000045 saveasitem = FrameWork.MenuItem(m, "Save asŠ", None, 'save_as')
Just van Rossum40f9b7b1999-01-30 22:39:17 +000046 FrameWork.Separator(m)
Just van Rossumedab9391999-02-02 22:31:05 +000047 saveasappletitem = FrameWork.MenuItem(m, "Save as AppletŠ", None, 'save_as_applet')
Just van Rossum40f9b7b1999-01-30 22:39:17 +000048 FrameWork.Separator(m)
49 quititem = FrameWork.MenuItem(m, "Quit", "Q", 'quit')
50
51 m = Wapplication.Menu(self.menubar, "Edit")
52 undoitem = FrameWork.MenuItem(m, "Undo", 'Z', "undo")
53 FrameWork.Separator(m)
54 cutitem = FrameWork.MenuItem(m, "Cut", 'X', "cut")
55 copyitem = FrameWork.MenuItem(m, "Copy", "C", "copy")
56 pasteitem = FrameWork.MenuItem(m, "Paste", "V", "paste")
57 FrameWork.MenuItem(m, "Clear", None, "clear")
58 FrameWork.Separator(m)
59 selallitem = FrameWork.MenuItem(m, "Select all", "A", "selectall")
60 sellineitem = FrameWork.MenuItem(m, "Select line", "L", "selectline")
61 FrameWork.Separator(m)
Just van Rossumedab9391999-02-02 22:31:05 +000062 finditem = FrameWork.MenuItem(m, "FindŠ", "F", "find")
Just van Rossum40f9b7b1999-01-30 22:39:17 +000063 findagainitem = FrameWork.MenuItem(m, "Find again", 'G', "findnext")
64 enterselitem = FrameWork.MenuItem(m, "Enter search string", "E", "entersearchstring")
65 replaceitem = FrameWork.MenuItem(m, "Replace", None, "replace")
66 replacefinditem = FrameWork.MenuItem(m, "Replace & find again", 'T', "replacefind")
67 FrameWork.Separator(m)
68 shiftleftitem = FrameWork.MenuItem(m, "Shift left", "[", "shiftleft")
69 shiftrightitem = FrameWork.MenuItem(m, "Shift right", "]", "shiftright")
70
71 m = Wapplication.Menu(self.menubar, "Python")
72 runitem = FrameWork.MenuItem(m, "Run window", "R", 'run')
73 runselitem = FrameWork.MenuItem(m, "Run selection", None, 'runselection')
74 FrameWork.Separator(m)
Just van Rossumedab9391999-02-02 22:31:05 +000075 moditem = FrameWork.MenuItem(m, "Module browserŠ", "M", self.domenu_modulebrowser)
Just van Rossum40f9b7b1999-01-30 22:39:17 +000076 FrameWork.Separator(m)
77 mm = FrameWork.SubMenu(m, "Preferences")
Just van Rossumedab9391999-02-02 22:31:05 +000078 FrameWork.MenuItem(mm, "Set Scripts folderŠ", None, self.do_setscriptsfolder)
79 FrameWork.MenuItem(mm, "Editor default settingsŠ", None, self.do_editorprefs)
Just van Rossum40f9b7b1999-01-30 22:39:17 +000080
81 self.openwindowsmenu = Wapplication.Menu(self.menubar, 'Windows')
82 self.makeopenwindowsmenu()
83 self._menustocheck = [closeitem, saveitem, saveasitem, saveasappletitem,
84 undoitem, cutitem, copyitem, pasteitem,
85 selallitem, sellineitem,
86 finditem, findagainitem, enterselitem, replaceitem, replacefinditem,
87 shiftleftitem, shiftrightitem,
88 runitem, runselitem]
89
90 prefs = self.getprefs()
91 try:
92 fss, fss_changed = macfs.RawAlias(prefs.scriptsfolder).Resolve()
Just van Rossum68922f01999-02-25 22:33:05 +000093 self.scriptsfolder = fss.NewAlias()
Just van Rossum40f9b7b1999-01-30 22:39:17 +000094 except:
95 path = os.path.join(os.getcwd(), 'Scripts')
96 if not os.path.exists(path):
97 os.mkdir(path)
98 fss = macfs.FSSpec(path)
99 self.scriptsfolder = fss.NewAlias()
100 self.scriptsfoldermodtime = fss.GetDates()[1]
101 else:
Just van Rossum40f9b7b1999-01-30 22:39:17 +0000102 self.scriptsfoldermodtime = fss.GetDates()[1]
103 prefs.scriptsfolder = self.scriptsfolder.data
104 self._scripts = {}
105 self.scriptsmenu = None
106 self.makescriptsmenu()
107
108 def quitevent(self, theAppleEvent, theReply):
109 import AE
110 AE.AEInteractWithUser(50000000)
111 self._quit()
112
113 def suspendresume(self, onoff):
114 if onoff:
115 fss, fss_changed = self.scriptsfolder.Resolve()
116 modtime = fss.GetDates()[1]
117 if self.scriptsfoldermodtime <> modtime or fss_changed:
118 self.scriptsfoldermodtime = modtime
119 W.SetCursor('watch')
120 self.makescriptsmenu()
121
122 def ignoreevent(self, theAppleEvent, theReply):
123 pass
124
125 def opendocsevent(self, theAppleEvent, theReply):
126 W.SetCursor('watch')
127 import aetools
128 parameters, args = aetools.unpackevent(theAppleEvent)
129 docs = parameters['----']
130 if type(docs) <> type([]):
131 docs = [docs]
132 for doc in docs:
133 fss, a = doc.Resolve()
134 path = fss.as_pathname()
135 self.opendoc(path)
136
137 def opendoc(self, path):
138 fcreator, ftype = macfs.FSSpec(path).GetCreatorType()
139 if ftype == 'TEXT':
140 self.openscript(path)
141 else:
Just van Rossumedab9391999-02-02 22:31:05 +0000142 W.Message("Can¹t open file of type '%s'." % ftype)
Just van Rossum40f9b7b1999-01-30 22:39:17 +0000143
144 def getabouttext(self):
Just van Rossumedab9391999-02-02 22:31:05 +0000145 return "About Python IDEŠ"
Just van Rossum40f9b7b1999-01-30 22:39:17 +0000146
147 def do_about(self, id, item, window, event):
148 Splash.about()
149
150 def do_setscriptsfolder(self, *args):
151 fss, ok = macfs.GetDirectory("Select Scripts Folder")
152 if ok:
153 prefs = self.getprefs()
154 alis = fss.NewAlias()
155 prefs.scriptsfolder = alis.data
156 self.scriptsfolder = alis
157 self.makescriptsmenu()
158 prefs.save()
159
160 def domenu_modulebrowser(self, *args):
161 W.SetCursor('watch')
162 import ModuleBrowser
163 ModuleBrowser.ModuleBrowser()
164
165 def domenu_open(self, *args):
166 fss, ok = macfs.StandardGetFile("TEXT")
167 if ok:
168 self.openscript(fss.as_pathname())
169
170 def domenu_new(self, *args):
171 W.SetCursor('watch')
172 import PyEdit
173 return PyEdit.Editor()
174
175 def makescriptsmenu(self):
176 W.SetCursor('watch')
177 if self._scripts:
178 for id, item in self._scripts.keys():
179 if self.menubar.menus.has_key(id):
180 m = self.menubar.menus[id]
181 m.delete()
182 self._scripts = {}
183 if self.scriptsmenu:
184 if hasattr(self.scriptsmenu, 'id') and self.menubar.menus.has_key(self.scriptsmenu.id):
185 self.scriptsmenu.delete()
186 self.scriptsmenu = FrameWork.Menu(self.menubar, "Scripts")
187 #FrameWork.MenuItem(self.scriptsmenu, "New script", None, self.domenu_new)
188 #self.scriptsmenu.addseparator()
189 fss, fss_changed = self.scriptsfolder.Resolve()
190 self.scriptswalk(fss.as_pathname(), self.scriptsmenu)
191
192 def makeopenwindowsmenu(self):
193 for i in range(len(self.openwindowsmenu.items)):
194 self.openwindowsmenu.menu.DeleteMenuItem(1)
195 self.openwindowsmenu.items = []
196 windows = []
197 self._openwindows = {}
198 for window in self._windows.keys():
199 title = window.GetWTitle()
200 if not title:
201 title = "<no title>"
202 windows.append(title, window)
203 windows.sort()
204 for title, window in windows:
205 if title == "Python Interactive": # ugly but useful hack by Joe Strout
206 shortcut = '0'
207 else:
208 shortcut = None
209 item = FrameWork.MenuItem(self.openwindowsmenu, title, shortcut, callback = self.domenu_openwindows)
210 self._openwindows[item.item] = window
211 self._openwindowscheckmark = 0
212 self.checkopenwindowsmenu()
213
214 def domenu_openwindows(self, id, item, window, event):
215 w = self._openwindows[item]
216 w.ShowWindow()
217 w.SelectWindow()
218
219 def domenu_quit(self):
220 self._quit()
221
222 def domenu_save(self, *args):
223 print "Save"
224
225 def _quit(self):
226 import PyConsole, PyEdit
227 PyConsole.console.writeprefs()
228 PyConsole.output.writeprefs()
229 PyEdit.searchengine.writeprefs()
230 for window in self._windows.values():
231 rv = window.close()
232 if rv and rv > 0:
233 return
234 self.quitting = 1
235
236PythonIDE()
237