Start recording automatically after creating a new block.
[dom-editor.git] / Dome / Window.py
blobd09997f089b18792bfa8421888ed49c1941dd66e
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 tools.insert_stock(g.STOCK_HELP, 'Help', None, self.tool_help, None, 0)
59 tools.insert_stock(g.STOCK_JUMP_TO, 'Step', None, self.tool_step, None, 0)
60 tools.insert_stock(g.STOCK_GO_FORWARD, 'Next', None, self.tool_next, None, 0)
61 tools.insert_stock(g.STOCK_GOTO_LAST, 'Play', None, self.tool_play, None, 0)
62 tools.insert_stock(g.STOCK_STOP, 'Stop', None, self.tool_stop, None, 0)
63 tools.insert_stock(g.STOCK_NO, 'Record', None, self.tool_record, None, 0)
64 tools.insert_stock(g.STOCK_SAVE, 'Save', None, self.tool_save, None, 0)
65 tools.insert_stock(g.STOCK_GO_UP, 'Up', None, self.tool_parent, None, 0)
67 paned = g.HPaned()
68 vbox.pack_start(paned)
70 import View
71 view = View.View(self.model)
72 self.view = view
73 self.list = List(view)
75 paned.add1(self.list)
76 self.list.show()
78 #swin = g.ScrolledWindow()
79 #swin.set_policy(g.POLICY_AUTOMATIC, g.POLICY_ALWAYS)
80 #paned.add2(swin)
81 paned.set_position(200)
83 self.gui_view = GUIView(self, view)
84 #swin.add(self.gui_view)
85 paned.add2(self.gui_view)
86 #swin.set_hadjustment(self.gui_view.get_hadjustment())
87 #swin.set_vadjustment(self.gui_view.get_vadjustment())
89 vbox.pack_start(self.status, False, True, 0)
91 vbox.show_all()
93 self.gui_view.grab_focus()
94 self.update_title()
96 def delete(window, event):
97 if self.model.root_program.modified:
98 self.save(discard = 1)
99 return 1
100 return 0
101 self.connect('delete-event', delete)
103 def set_status(self, message = None):
104 if self.showing_message:
105 self.status.pop(0)
106 if message:
107 self.status.push(0, message)
108 self.showing_message = bool(message)
109 self.status.draw((0, 0, self.status.allocation.width, self.status.allocation.height))
110 g.gdk.flush()
112 def discard(self):
113 self.destroy()
115 def set_state(self, state):
116 if state == self.dome_state:
117 return
118 if state:
119 self.dome_state = " " + state
120 else:
121 self.dome_state = ""
123 self.update_title()
125 def update_title(self):
126 title = self.model.uri
127 self.set_title(title + self.dome_state)
129 def save(self, discard = 0):
130 if self.savebox:
131 self.savebox.destroy()
132 path = self.model.uri
134 self.savebox = saving.SaveBox(self, path,
135 'application/x-dome', discard = discard)
136 self.savebox.set_transient_for(self)
137 self.savebox.set_destroy_with_parent(True)
138 radio_dome = g.RadioButton(None, 'Save everything (.dome)')
139 radio_xml = g.RadioButton(radio_dome, 'Export data as XML')
140 radio_html = g.RadioButton(radio_xml, 'Export data as XHTML')
142 self.save_radios = (
143 (radio_dome, 'dome', 'application/x-dome', self.save_as_dome),
144 (radio_xml, 'xml', 'text/xml', self.save_as_xml),
145 (radio_html, 'xhtml', 'application/xhtml+xml', self.save_as_html))
147 def changed(toggle = None):
148 name = self.savebox.save_area.entry.get_text()
149 if name.endswith('.xml'):
150 name = name[:-4]
151 elif name.endswith('.dome'):
152 name = name[:-5]
153 elif name.endswith('.xhtml'):
154 name = name[:-6]
156 for radio, ext, mime, fn in self.save_radios:
157 if radio.get_active():
158 name += '.' + ext
159 self.savebox.set_type(mime)
160 self.savebox.save_area.entry.set_text(name)
162 for radio, ext, mime, fn in self.save_radios:
163 self.savebox.vbox.pack_start(radio, False, True, 0)
164 radio.connect('toggled', changed)
166 for radio, ext, mime, fn in self.save_radios:
167 if path.endswith('.' + ext):
168 radio.set_active(True)
170 self.savebox.vbox.show_all()
171 self.savebox.show()
173 def write(self, text):
174 if type(text) == unicode:
175 text = utf8_encoder(text)[0]
176 self.output_data.write(text)
178 def save_to_stream(self, stream):
179 self.set_status('Saving...')
180 try:
181 for radio, ext, mime, fn in self.save_radios:
182 if radio.get_active():
183 fn(stream)
184 finally:
185 self.set_status()
187 def save_as_dome(self, stream):
188 #self.view.model.strip_space()
189 doc = self.view.export_all()
190 PrettyPrint(doc, stream)
192 def save_as_xml(self, stream):
193 doc = self.view.model.doc
194 PrettyPrint(doc, stream)
196 def save_as_html(self, stream):
197 from xml.dom.html import HTMLDocument
198 import to_html
199 print >>stream, to_html.to_html(self.view.root.ownerDocument)
201 def set_uri(self, uri):
202 if self.save_radios[0][0].get_active():
203 self.model.uri = uri
204 self.model.root_program.modified = 0
205 self.update_title()
207 # Toolbar bits
209 def tool_parent(self, button = None):
210 if '/' in self.model.uri:
211 rox.filer.show_file(self.model.uri)
212 else:
213 rox.alert("File is not saved to disk yet")
215 def tool_save(self, button = None):
216 self.save()
218 def tool_stop(self, button = None):
219 if self.view.rec_point:
220 self.view.stop_recording()
221 if self.view.running():
222 self.view.single_step = 1
223 else:
224 self.view.run_new()
226 def tool_play(self, button = None):
227 from View import InProgress, Done
228 # Step first, in case we're on a breakpoint
229 self.view.single_step = 1
230 try:
231 self.view.do_one_step()
232 except InProgress, Done:
233 pass
234 self.view.single_step = 0
235 self.view.sched()
237 def tool_next(self, button = None):
238 from View import InProgress, Done
239 self.view.single_step = 2
240 try:
241 self.view.do_one_step()
242 except InProgress, Done:
243 pass
245 def tool_step(self, button = None):
246 from View import InProgress, Done
247 self.view.single_step = 1
248 try:
249 self.view.do_one_step()
250 except InProgress, Done:
251 pass
253 def tool_record(self, button = None):
254 if self.view.rec_point:
255 self.view.stop_recording()
256 else:
257 self.view.record_at_point()
259 def tool_help(self, button = None):
260 rox.filer.show_file(os.path.join(rox.app_dir, 'Help', 'README'))