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
.kAEReopenApplication
,
23 AE
.AEInstallEventHandler(AppleEvents
.kCoreEventClass
, AppleEvents
.kAEPrintDocuments
,
25 AE
.AEInstallEventHandler(AppleEvents
.kCoreEventClass
, AppleEvents
.kAEOpenDocuments
,
27 AE
.AEInstallEventHandler(AppleEvents
.kCoreEventClass
, AppleEvents
.kAEQuitApplication
,
29 import PyConsole
, PyEdit
31 Splash
.uninstall_importhook()
32 PyConsole
.installoutput()
33 PyConsole
.installconsole()
35 for path
in sys
.argv
[1:]:
42 if Wthreading
.haveThreading
:
43 self
.mainthread
= Wthreading
.Thread("IDE event loop", self
.mainloop
)
44 self
.mainthread
.start()
45 #self.mainthread.setResistant(1)
50 def makeusermenus(self
):
51 m
= Wapplication
.Menu(self
.menubar
, "File")
52 newitem
= FrameWork
.MenuItem(m
, "New", "N", 'new')
53 openitem
= FrameWork
.MenuItem(m
, "Open\xc9", "O", 'open')
54 FrameWork
.Separator(m
)
55 closeitem
= FrameWork
.MenuItem(m
, "Close", "W", 'close')
56 saveitem
= FrameWork
.MenuItem(m
, "Save", "S", 'save')
57 saveasitem
= FrameWork
.MenuItem(m
, "Save as\xc9", None, 'save_as')
58 FrameWork
.Separator(m
)
59 saveasappletitem
= FrameWork
.MenuItem(m
, "Save as Applet\xc9", None, 'save_as_applet')
60 FrameWork
.Separator(m
)
61 quititem
= FrameWork
.MenuItem(m
, "Quit", "Q", 'quit')
63 m
= Wapplication
.Menu(self
.menubar
, "Edit")
64 undoitem
= FrameWork
.MenuItem(m
, "Undo", 'Z', "undo")
65 FrameWork
.Separator(m
)
66 cutitem
= FrameWork
.MenuItem(m
, "Cut", 'X', "cut")
67 copyitem
= FrameWork
.MenuItem(m
, "Copy", "C", "copy")
68 pasteitem
= FrameWork
.MenuItem(m
, "Paste", "V", "paste")
69 FrameWork
.MenuItem(m
, "Clear", None, "clear")
70 FrameWork
.Separator(m
)
71 selallitem
= FrameWork
.MenuItem(m
, "Select all", "A", "selectall")
72 sellineitem
= FrameWork
.MenuItem(m
, "Select line", "L", "selectline")
73 FrameWork
.Separator(m
)
74 finditem
= FrameWork
.MenuItem(m
, "Find\xc9", "F", "find")
75 findagainitem
= FrameWork
.MenuItem(m
, "Find again", 'G', "findnext")
76 enterselitem
= FrameWork
.MenuItem(m
, "Enter search string", "E", "entersearchstring")
77 replaceitem
= FrameWork
.MenuItem(m
, "Replace", None, "replace")
78 replacefinditem
= FrameWork
.MenuItem(m
, "Replace & find again", 'T', "replacefind")
79 FrameWork
.Separator(m
)
80 shiftleftitem
= FrameWork
.MenuItem(m
, "Shift left", "[", "shiftleft")
81 shiftrightitem
= FrameWork
.MenuItem(m
, "Shift right", "]", "shiftright")
83 m
= Wapplication
.Menu(self
.menubar
, "Python")
84 runitem
= FrameWork
.MenuItem(m
, "Run window", "R", 'run')
85 runselitem
= FrameWork
.MenuItem(m
, "Run selection", None, 'runselection')
86 FrameWork
.Separator(m
)
87 moditem
= FrameWork
.MenuItem(m
, "Module browser\xc9", "M", self
.domenu_modulebrowser
)
88 FrameWork
.Separator(m
)
89 mm
= FrameWork
.SubMenu(m
, "Preferences")
90 FrameWork
.MenuItem(mm
, "Set Scripts folder\xc9", None, self
.do_setscriptsfolder
)
91 FrameWork
.MenuItem(mm
, "Editor default settings\xc9", None, self
.do_editorprefs
)
92 FrameWork
.MenuItem(mm
, "Set default window font\xc9", None, self
.do_setwindowfont
)
94 self
.openwindowsmenu
= Wapplication
.Menu(self
.menubar
, 'Windows')
95 self
.makeopenwindowsmenu()
96 self
._menustocheck
= [closeitem
, saveitem
, saveasitem
, saveasappletitem
,
97 undoitem
, cutitem
, copyitem
, pasteitem
,
98 selallitem
, sellineitem
,
99 finditem
, findagainitem
, enterselitem
, replaceitem
, replacefinditem
,
100 shiftleftitem
, shiftrightitem
,
103 prefs
= self
.getprefs()
105 fss
, fss_changed
= macfs
.RawAlias(prefs
.scriptsfolder
).Resolve()
106 self
.scriptsfolder
= fss
.NewAlias()
108 path
= os
.path
.join(os
.getcwd(), ":Mac:IDE scripts")
109 if not os
.path
.exists(path
):
110 path
= os
.path
.join(os
.getcwd(), "Scripts")
111 if not os
.path
.exists(path
):
113 f
= open(os
.path
.join(path
, "Place your scripts here\xc9"), "w")
115 fss
= macfs
.FSSpec(path
)
116 self
.scriptsfolder
= fss
.NewAlias()
117 self
.scriptsfoldermodtime
= fss
.GetDates()[1]
119 self
.scriptsfoldermodtime
= fss
.GetDates()[1]
120 prefs
.scriptsfolder
= self
.scriptsfolder
.data
122 self
.scriptsmenu
= None
123 self
.makescriptsmenu()
125 def quitevent(self
, theAppleEvent
, theReply
):
127 AE
.AEInteractWithUser(50000000)
130 def suspendresume(self
, onoff
):
132 fss
, fss_changed
= self
.scriptsfolder
.Resolve()
133 modtime
= fss
.GetDates()[1]
134 if self
.scriptsfoldermodtime
<> modtime
or fss_changed
:
135 self
.scriptsfoldermodtime
= modtime
137 self
.makescriptsmenu()
139 def ignoreevent(self
, theAppleEvent
, theReply
):
142 def opendocsevent(self
, theAppleEvent
, theReply
):
145 parameters
, args
= aetools
.unpackevent(theAppleEvent
)
146 docs
= parameters
['----']
147 if type(docs
) <> type([]):
150 fss
, a
= doc
.Resolve()
151 path
= fss
.as_pathname()
154 def opendoc(self
, path
):
155 fcreator
, ftype
= macfs
.FSSpec(path
).GetCreatorType()
157 self
.openscript(path
)
159 W
.Message("Can't open file of type '%s'." % ftype
)
161 def getabouttext(self
):
162 return "About Python IDE\xc9"
164 def do_about(self
, id, item
, window
, event
):
167 def do_setscriptsfolder(self
, *args
):
168 fss
, ok
= macfs
.GetDirectory("Select Scripts Folder")
170 prefs
= self
.getprefs()
171 alis
= fss
.NewAlias()
172 prefs
.scriptsfolder
= alis
.data
173 self
.scriptsfolder
= alis
174 self
.makescriptsmenu()
177 def domenu_modulebrowser(self
, *args
):
180 ModuleBrowser
.ModuleBrowser()
182 def domenu_open(self
, *args
):
183 fss
, ok
= macfs
.StandardGetFile("TEXT")
185 self
.openscript(fss
.as_pathname())
187 def domenu_new(self
, *args
):
190 return PyEdit
.Editor()
192 def makescriptsmenu(self
):
195 for id, item
in self
._scripts
.keys():
196 if self
.menubar
.menus
.has_key(id):
197 m
= self
.menubar
.menus
[id]
201 if hasattr(self
.scriptsmenu
, 'id') and self
.menubar
.menus
.has_key(self
.scriptsmenu
.id):
202 self
.scriptsmenu
.delete()
203 self
.scriptsmenu
= FrameWork
.Menu(self
.menubar
, "Scripts")
204 #FrameWork.MenuItem(self.scriptsmenu, "New script", None, self.domenu_new)
205 #self.scriptsmenu.addseparator()
206 fss
, fss_changed
= self
.scriptsfolder
.Resolve()
207 self
.scriptswalk(fss
.as_pathname(), self
.scriptsmenu
)
209 def makeopenwindowsmenu(self
):
210 for i
in range(len(self
.openwindowsmenu
.items
)):
211 self
.openwindowsmenu
.menu
.DeleteMenuItem(1)
212 self
.openwindowsmenu
.items
= []
214 self
._openwindows
= {}
215 for window
in self
._windows
.keys():
216 title
= window
.GetWTitle()
219 windows
.append((title
, window
))
221 for title
, window
in windows
:
222 if title
== "Python Interactive": # ugly but useful hack by Joe Strout
226 item
= FrameWork
.MenuItem(self
.openwindowsmenu
, title
, shortcut
, callback
= self
.domenu_openwindows
)
227 self
._openwindows
[item
.item
] = window
228 self
._openwindowscheckmark
= 0
229 self
.checkopenwindowsmenu()
231 def domenu_openwindows(self
, id, item
, window
, event
):
232 w
= self
._openwindows
[item
]
236 def domenu_quit(self
):
239 def domenu_save(self
, *args
):
243 import PyConsole
, PyEdit
244 PyConsole
.console
.writeprefs()
245 PyConsole
.output
.writeprefs()
246 PyEdit
.searchengine
.writeprefs()
247 for window
in self
._windows
.values():
249 rv
= window
.close() # ignore any errors while quitting
251 rv
= 0 # (otherwise, we can get stuck!)