Renamed a 'with' variable; will be a keyword in Python 2.6.
[dom-editor.git] / Dome / Window.py
blob384ae5c5e87f6cba2eee971974e0f16dbb9a904c
1 import rox
2 from rox import g, TRUE, FALSE, saving
4 import os.path
5 from Ft.Xml.Domlette import PrettyPrint
7 import __main__
9 #from support import *
10 from rox.saving import SaveBox
12 code = None
14 from codecs import lookup
15 utf8_encoder = lookup('UTF-8')[0]
17 class Window(rox.Window, saving.Saveable):
18 def __init__(self, path = None, data = None):
19 # 'data' is used when 'path' is a stylesheet...
20 rox.Window.__init__(self)
22 self.status = g.Statusbar()
23 self.showing_message = False
24 self.set_status('Welcome to Dome. Click the right-hand mouse button for menus.')
26 # Make it square, to cope with Xinerama
27 size = min(g.gdk.screen_width(), g.gdk.screen_height())
28 size = size * 3 / 4
30 self.set_default_size(size, size)
31 self.set_position(g.WIN_POS_CENTER)
32 self.savebox = None
34 self.show()
35 g.gdk.flush()
37 if path:
38 import os.path
39 path = os.path.abspath(path)
41 import Model
42 self.model = Model.Model(path, dome_data = data)
43 self.gui_view = None
44 self.dome_state = ""
46 from GUIView import GUIView
47 #from Display2 import Display as GUIView
48 from List import List
50 vbox = g.VBox(FALSE, 0)
51 self.add(vbox)
53 tools = g.Toolbar()
54 tools.set_style(g.TOOLBAR_ICONS)
55 vbox.pack_start(tools, FALSE, TRUE, 0)
56 tools.show()
58 tips = g.Tooltips()
60 for stock, label, callback in [
61 (g.STOCK_GO_UP, 'Up', self.tool_parent),
62 (g.STOCK_SAVE, 'Save', self.tool_save),
63 (g.STOCK_MEDIA_RECORD, 'Record', self.tool_record),
64 (g.STOCK_MEDIA_STOP, 'Stop', self.tool_stop),
65 (g.STOCK_MEDIA_PLAY, 'Play', self.tool_play),
66 (g.STOCK_MEDIA_NEXT, 'Next', self.tool_next),
67 (g.STOCK_MEDIA_NEXT, 'Step', self.tool_step),
68 (g.STOCK_HELP, 'Help', self.tool_help) ]:
69 item = g.ToolButton(stock)
70 item.set_label(label)
71 item.set_tooltip(tips, label)
72 item.connect('clicked', callback)
73 tools.add(item)
75 paned = g.HPaned()
76 vbox.pack_start(paned)
78 import View
79 view = View.View(self.model)
80 self.view = view
81 self.list = List(view)
83 paned.add1(self.list)
84 self.list.show()
86 #swin = g.ScrolledWindow()
87 #swin.set_policy(g.POLICY_AUTOMATIC, g.POLICY_ALWAYS)
88 #paned.add2(swin)
89 paned.set_position(200)
91 self.gui_view = GUIView(self, view)
92 #swin.add(self.gui_view)
93 paned.add2(self.gui_view)
94 #swin.set_hadjustment(self.gui_view.get_hadjustment())
95 #swin.set_vadjustment(self.gui_view.get_vadjustment())
97 vbox.pack_start(self.status, False, True, 0)
99 vbox.show_all()
101 self.gui_view.grab_focus()
102 self.update_title()
104 def delete(window, event):
105 if self.model.root_program.modified:
106 self.save(discard = 1)
107 return 1
108 return 0
109 self.connect('delete-event', delete)
111 def set_status(self, message = None):
112 if self.showing_message:
113 self.status.pop(0)
114 if message:
115 self.status.push(0, message)
116 self.showing_message = bool(message)
117 #self.status.draw((0, 0, self.status.allocation.width, self.status.allocation.height))
118 g.gdk.flush()
120 def discard(self):
121 self.destroy()
123 def set_state(self, state):
124 if state == self.dome_state:
125 return
126 if state:
127 self.dome_state = " " + state
128 else:
129 self.dome_state = ""
131 self.update_title()
133 def update_title(self):
134 title = self.model.uri
135 self.set_title(title + self.dome_state)
137 def save(self, discard = 0):
138 if self.savebox:
139 self.savebox.destroy()
140 path = self.model.uri
142 self.savebox = saving.SaveBox(self, path,
143 'application/x-dome', discard = discard)
144 self.savebox.set_transient_for(self)
145 self.savebox.set_destroy_with_parent(True)
146 radio_dome = g.RadioButton(None, 'Save everything (.dome)')
147 radio_xml = g.RadioButton(radio_dome, 'Export data as XML')
148 radio_html = g.RadioButton(radio_xml, 'Export data as XHTML')
150 self.save_radios = (
151 (radio_dome, 'dome', 'application/x-dome', self.save_as_dome),
152 (radio_xml, 'xml', 'text/xml', self.save_as_xml),
153 (radio_html, 'xhtml', 'application/xhtml+xml', self.save_as_html))
155 def changed(toggle = None):
156 name = self.savebox.save_area.entry.get_text()
157 if name.endswith('.xml'):
158 name = name[:-4]
159 elif name.endswith('.dome'):
160 name = name[:-5]
161 elif name.endswith('.xhtml'):
162 name = name[:-6]
164 for radio, ext, mime, fn in self.save_radios:
165 if radio.get_active():
166 name += '.' + ext
167 self.savebox.set_type(mime)
168 self.savebox.save_area.entry.set_text(name)
170 for radio, ext, mime, fn in self.save_radios:
171 if path.endswith('.' + ext):
172 radio.set_active(True)
173 self.savebox.set_type(mime)
174 break
175 else:
176 self.save_radios[1][0].set_active(True)
177 self.savebox.set_type(self.save_radios[1][2])
179 for radio, ext, mime, fn in self.save_radios:
180 self.savebox.vbox.pack_start(radio, False, True, 0)
181 radio.connect('toggled', changed)
183 self.savebox.vbox.show_all()
184 self.savebox.show()
186 def write(self, text):
187 if type(text) == unicode:
188 text = utf8_encoder(text)[0]
189 self.output_data.write(text)
191 def save_to_stream(self, stream):
192 self.set_status('Saving...')
193 try:
194 for radio, ext, mime, fn in self.save_radios:
195 if radio.get_active():
196 fn(stream)
197 finally:
198 self.set_status()
200 def save_as_dome(self, stream):
201 #self.view.model.strip_space()
202 doc = self.view.export_all()
203 PrettyPrint(doc, stream)
205 def save_as_xml(self, stream):
206 doc = self.view.model.doc
207 PrettyPrint(doc, stream)
209 def save_as_html(self, stream):
210 from xml.dom.html import HTMLDocument
211 import to_html
212 print >>stream, to_html.to_html(self.view.root.ownerDocument)
214 def set_uri(self, uri):
215 if self.save_radios[0][0].get_active():
216 self.model.uri = uri
217 self.model.root_program.modified = 0
218 self.update_title()
220 # Toolbar bits
222 def tool_parent(self, button = None):
223 if '/' in self.model.uri:
224 rox.filer.show_file(self.model.uri)
225 else:
226 rox.alert("File is not saved to disk yet")
228 def tool_save(self, button = None):
229 self.save()
231 def tool_stop(self, button = None):
232 if self.view.rec_point:
233 self.view.stop_recording()
234 if self.view.running():
235 self.view.single_step = 1
236 else:
237 self.view.run_new()
239 def tool_play(self, button = None):
240 from View import InProgress, Done
241 if not self.view.exec_point:
242 if self.view.rec_point:
243 self.view.set_exec(self.view.rec_point)
244 self.view.set_rec(None)
245 else:
246 rox.alert('No playback point!')
247 return
248 # Step first, in case we're on a breakpoint
249 self.view.single_step = 1
250 try:
251 self.view.do_one_step()
252 except InProgress:
253 self.view.single_step = 0
254 return
255 except Done:
256 pass
257 self.view.single_step = 0
258 self.view.sched()
260 def tool_next(self, button = None):
261 from View import InProgress, Done
262 self.view.single_step = 2
263 try:
264 self.view.do_one_step()
265 except InProgress, Done:
266 pass
268 def tool_step(self, button = None):
269 from View import InProgress, Done
270 self.view.single_step = 1
271 try:
272 self.view.do_one_step()
273 except InProgress, Done:
274 pass
276 def tool_record(self, button = None):
277 if self.view.rec_point:
278 self.view.stop_recording()
279 else:
280 if not self.view.rec_point:
281 prog = self.list.selected_program()
282 if prog:
283 start = prog.code.start
284 if start.next == None:
285 self.view.set_rec((start, 'next'))
286 return
287 self.view.record_at_point()
289 def tool_help(self, button = None):
290 rox.filer.show_file(os.path.join(rox.app_dir, 'Help', 'README'))