2 from rox
import g
, TRUE
, FALSE
, saving
5 from Ft
.Xml
.Domlette
import PrettyPrint
10 from rox
.saving
import SaveBox
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())
30 self
.set_default_size(size
, size
)
31 self
.set_position(g
.WIN_POS_CENTER
)
39 path
= os
.path
.abspath(path
)
42 self
.model
= Model
.Model(path
, dome_data
= data
)
46 from GUIView
import GUIView
47 #from Display2 import Display as GUIView
50 vbox
= g
.VBox(FALSE
, 0)
54 tools
.set_style(g
.TOOLBAR_ICONS
)
55 vbox
.pack_start(tools
, FALSE
, TRUE
, 0)
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
)
71 item
.set_tooltip(tips
, label
)
72 item
.connect('clicked', callback
)
76 vbox
.pack_start(paned
)
79 view
= View
.View(self
.model
)
81 self
.list = List(view
)
86 #swin = g.ScrolledWindow()
87 #swin.set_policy(g.POLICY_AUTOMATIC, g.POLICY_ALWAYS)
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)
101 self
.gui_view
.grab_focus()
104 def delete(window
, event
):
105 if self
.model
.root_program
.modified
:
106 self
.save(discard
= 1)
109 self
.connect('delete-event', delete
)
111 def set_status(self
, message
= None):
112 if self
.showing_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))
123 def set_state(self
, state
):
124 if state
== self
.dome_state
:
127 self
.dome_state
= " " + state
133 def update_title(self
):
134 title
= self
.model
.uri
135 self
.set_title(title
+ self
.dome_state
)
137 def save(self
, discard
= 0):
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')
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'):
159 elif name
.endswith('.dome'):
161 elif name
.endswith('.xhtml'):
164 for radio
, ext
, mime
, fn
in self
.save_radios
:
165 if radio
.get_active():
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
)
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()
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...')
194 for radio
, ext
, mime
, fn
in self
.save_radios
:
195 if radio
.get_active():
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
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():
217 self
.model
.root_program
.modified
= 0
222 def tool_parent(self
, button
= None):
223 if '/' in self
.model
.uri
:
224 rox
.filer
.show_file(self
.model
.uri
)
226 rox
.alert("File is not saved to disk yet")
228 def tool_save(self
, button
= None):
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
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)
246 rox
.alert('No playback point!')
248 # Step first, in case we're on a breakpoint
249 self
.view
.single_step
= 1
251 self
.view
.do_one_step()
253 self
.view
.single_step
= 0
257 self
.view
.single_step
= 0
260 def tool_next(self
, button
= None):
261 from View
import InProgress
, Done
262 self
.view
.single_step
= 2
264 self
.view
.do_one_step()
265 except InProgress
, Done
:
268 def tool_step(self
, button
= None):
269 from View
import InProgress
, Done
270 self
.view
.single_step
= 1
272 self
.view
.do_one_step()
273 except InProgress
, Done
:
276 def tool_record(self
, button
= None):
277 if self
.view
.rec_point
:
278 self
.view
.stop_recording()
280 if not self
.view
.rec_point
:
281 prog
= self
.list.selected_program()
283 start
= prog
.code
.start
284 if start
.next
== None:
285 self
.view
.set_rec((start
, 'next'))
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'))