Add HTML as a save format.
[dom-editor.git] / Dome / Window.py
blob2750786bd506a661bd4a2a0029bf0f56a1559fdd
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 # Make it square, to cope with Xinerama
23 size = min(g.gdk.screen_width(), g.gdk.screen_height())
24 size = size * 3 / 4
26 self.set_default_size(size, size)
27 self.set_position(g.WIN_POS_CENTER)
28 self.savebox = None
30 self.show()
31 g.gdk.flush()
33 if path:
34 import os.path
35 path = os.path.abspath(path)
37 import Model
38 self.model = Model.Model(path, dome_data = data)
39 self.gui_view = None
40 self.dome_state = ""
42 from GUIView import GUIView
43 from List import List
45 vbox = g.VBox(FALSE, 0)
46 self.add(vbox)
48 tools = g.Toolbar()
49 tools.set_style(g.TOOLBAR_ICONS)
50 vbox.pack_start(tools, FALSE, TRUE, 0)
51 tools.show()
53 tools.insert_stock(g.STOCK_HELP, 'Help', None, self.tool_help, None, 0)
54 tools.insert_stock(g.STOCK_JUMP_TO, 'Step', None, self.tool_step, None, 0)
55 tools.insert_stock(g.STOCK_GO_FORWARD, 'Next', None, self.tool_next, None, 0)
56 tools.insert_stock(g.STOCK_GOTO_LAST, 'Play', None, self.tool_play, None, 0)
57 tools.insert_stock(g.STOCK_STOP, 'Stop', None, self.tool_stop, None, 0)
58 tools.insert_stock(g.STOCK_NO, 'Record', None, self.tool_record, None, 0)
59 tools.insert_stock(g.STOCK_SAVE, 'Save', None, self.tool_save, None, 0)
61 paned = g.HPaned()
62 vbox.pack_start(paned)
64 import View
65 view = View.View(self.model)
66 self.view = view
67 self.list = List(view)
68 paned.add1(self.list)
69 self.list.show()
71 #swin = g.ScrolledWindow()
72 #swin.set_policy(g.POLICY_AUTOMATIC, g.POLICY_ALWAYS)
73 #paned.add2(swin)
74 paned.set_position(200)
76 self.gui_view = GUIView(self, view)
77 from Display2 import Display
78 #swin.add(self.gui_view)
79 paned.add2(self.gui_view)
80 #swin.set_hadjustment(self.gui_view.get_hadjustment())
81 #swin.set_vadjustment(self.gui_view.get_vadjustment())
83 vbox.show_all()
85 self.gui_view.grab_focus()
86 self.update_title()
88 def delete(window, event):
89 if self.model.root_program.modified:
90 self.save(discard = 1)
91 return 1
92 return 0
93 self.connect('delete-event', delete)
95 def discard(self):
96 self.destroy()
98 def set_state(self, state):
99 if state == self.dome_state:
100 return
101 if state:
102 self.dome_state = " " + state
103 else:
104 self.dome_state = ""
106 self.update_title()
108 def update_title(self):
109 title = self.model.uri
110 self.set_title(title + self.dome_state)
112 def save(self, discard = 0):
113 if self.savebox:
114 self.savebox.destroy()
115 path = self.model.uri
117 self.savebox = saving.SaveBox(self, path,
118 'application/x-dome', discard = discard)
119 radio_dome = g.RadioButton(None, 'Save everything (.dome)')
120 radio_xml = g.RadioButton(radio_dome, 'Export data as XML')
121 radio_html = g.RadioButton(radio_xml, 'Export data as HTML')
123 self.save_radios = (
124 (radio_dome, 'dome', 'application/x-dome', self.save_as_dome),
125 (radio_xml, 'xml', 'text/xml', self.save_as_xml),
126 (radio_html, 'html', 'text/html', self.save_as_html))
128 def changed(toggle):
129 name = self.savebox.save_area.entry.get_text()
130 if name.endswith('.xml'):
131 name = name[:-4]
132 elif name.endswith('.dome'):
133 name = name[:-5]
134 elif name.endswith('.html'):
135 name = name[:-5]
137 for radio, ext, mime, fn in self.save_radios:
138 if radio.get_active():
139 name += '.' + ext
140 self.savebox.set_type(mime)
141 self.savebox.save_area.entry.set_text(name)
143 for radio, ext, mime, fn in self.save_radios:
144 self.savebox.vbox.pack_start(radio, False, True, 0)
145 radio.connect('toggled', changed)
147 self.savebox.vbox.show_all()
148 self.savebox.show()
150 def write(self, text):
151 if type(text) == unicode:
152 text = utf8_encoder(text)[0]
153 self.output_data.write(text)
155 def save_to_stream(self, stream):
156 for radio, ext, mime, fn in self.save_radios:
157 if radio.get_active():
158 fn(stream)
160 def save_as_dome(self, stream):
161 print "Saving", self.view.root
162 #self.view.model.strip_space()
163 doc = self.view.export_all()
164 print "Writing data..."
165 PrettyPrint(doc, stream)
167 def save_as_xml(self, stream):
168 print "Saving XML", self.view.root
169 doc = self.view.model.doc
170 print "Writing data..."
171 PrettyPrint(doc, stream)
173 def save_as_html(self, stream):
174 from xml.dom.html import HTMLDocument
175 import to_html
176 print "Saving HTML", self.view.root
177 print >>stream, to_html.to_html(self.view.root.ownerDocument)
179 def set_uri(self, uri):
180 if self.savebox.save_radios[0].get_active():
181 self.model.uri = uri
182 self.model.root_program.modified = 0
183 self.update_title()
185 # Toolbar bits
187 def tool_save(self, button = None):
188 self.save()
190 def tool_stop(self, button = None):
191 if self.view.rec_point:
192 self.view.stop_recording()
193 if self.view.running():
194 self.view.single_step = 1
195 else:
196 self.view.run_new()
198 def tool_play(self, button = None):
199 from View import InProgress, Done
200 # Step first, in case we're on a breakpoint
201 self.view.single_step = 1
202 try:
203 self.view.do_one_step()
204 except InProgress, Done:
205 pass
206 self.view.single_step = 0
207 self.view.sched()
209 def tool_next(self, button = None):
210 from View import InProgress, Done
211 self.view.single_step = 2
212 try:
213 self.view.do_one_step()
214 except InProgress, Done:
215 pass
217 def tool_step(self, button = None):
218 from View import InProgress, Done
219 self.view.single_step = 1
220 try:
221 self.view.do_one_step()
222 except InProgress, Done:
223 pass
225 def tool_record(self, button = None):
226 if self.view.rec_point:
227 self.view.stop_recording()
228 else:
229 self.view.record_at_point()
231 def tool_help(self, button = None):
232 rox.filer.show_file(os.path.join(rox.app_dir, 'Help', 'README'))