From 67d50e647ecd53ce6e77dd3c7b2f4e526dbc1093 Mon Sep 17 00:00:00 2001 From: Thomas Leonard Date: Tue, 13 May 2003 14:38:03 +0000 Subject: [PATCH] Started new namespaces system. git-svn-id: http://dom-editor.googlecode.com/svn/branches/Gtk2@479 ef21e15d-ca94-4315-9c45-0d95b1b2e117 --- Dome/GUIView.py | 5 ++++ Dome/List.py | 30 +++++++++++++++----- Dome/Model.py | 2 ++ Dome/Namespaces.py | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ Dome/View.py | 13 +++++---- Dome/Window.py | 8 +++--- Dome/support.py | 4 +-- 7 files changed, 125 insertions(+), 19 deletions(-) create mode 100644 Dome/Namespaces.py diff --git a/Dome/GUIView.py b/Dome/GUIView.py index 9805f58..fee25dc 100644 --- a/Dome/GUIView.py +++ b/Dome/GUIView.py @@ -101,6 +101,7 @@ menu = Menu('main', [ ('/View/Toggle hidden', 'do_toggle_hidden', '', 'H'), ('/View/Show as HTML', 'do_show_html', '', ''), ('/View/Show as canvas', 'do_show_canvas', '', ''), + ('/View/Show namespaces', 'show_namespaces', '', ';'), ('/View/Close Window', 'menu_close_window', '', 'Q'), #('/Options...', 'menu_options', '', 'O'), @@ -234,6 +235,10 @@ class GUIView(Display, XDSLoader): self.view.may_record(action) GetArg('Substitute:', do_subst, ('Replace:', 'With:')) + def show_namespaces(self): + import Namespaces + Namespaces.GUI(self.view.model).show() + def move_from(self, old = []): self.hide_editbox() Display.move_from(self, old) diff --git a/Dome/List.py b/Dome/List.py index 61906ab..eb1d6e1 100644 --- a/Dome/List.py +++ b/Dome/List.py @@ -385,7 +385,7 @@ class ChainOp(ChainNode): self.width, self.height = self.layout.get_pixel_size() self.width += 12 - self.height = max(self.height, 12) + self.height = max(self.height, 20) def expose(self): da = self.da @@ -410,13 +410,22 @@ class ChainOp(ChainNode): pen.set_rgb_fg_color(g.gdk.color_parse('white')) def maybe_clicked(self, event): - if self.x <= event.x and self.y <= event.y and \ - self.x + self.width >= event.x and self.y + self.height >= event.y: - if event.button == 1: - self.da.view.set_exec((self.op, 'next')) + x = event.x - self.x + if x < 0: return False + y = event.y - self.y + if y < 0: return False + + if x > self.width or y > self.height: + return False + + if event.button == 1: + self.da.view.set_exec((self.op, 'next')) + else: + if x < 10 and y > 10: + self.da.show_menu(event, self.op, 'next') else: - self.da.show_op_menu(event, self.op) - return True + self.da.show_menu(event, self.op) + return True def all_nodes(self): yield self @@ -1006,6 +1015,13 @@ class ChainDisplay(g.DrawingArea): return self.clipboard = next.to_doc() op.unlink(exit) + + def show_menu(self, event, op, exit = None): + if exit: + self.line_menu_line = (op, exit) + line_menu.popup(self, event) + else: + self.show_op_menu(event, op) def line_event(self, item, event, op, exit): # Item may be rec_point or exec_point... diff --git a/Dome/Model.py b/Dome/Model.py index ec12d49..fdfddff 100644 --- a/Dome/Model.py +++ b/Dome/Model.py @@ -26,6 +26,8 @@ class Model: def __init__(self, path, root_program = None, dome_data = None, do_load = 1): "If root_program is given, then no data is loaded (used for lock_and_copy)." self.uri = 'Prog.dome' + import Namespaces + self.namespaces = Namespaces.Namespaces() if dome_data: from Ft.Xml.InputSource import InputSourceFactory diff --git a/Dome/Namespaces.py b/Dome/Namespaces.py new file mode 100644 index 0000000..ccddd13 --- /dev/null +++ b/Dome/Namespaces.py @@ -0,0 +1,82 @@ +from xml.dom import XMLNS_NAMESPACE, XML_NAMESPACE + +import rox +from rox import g + +fixed_ns = {'xml': XML_NAMESPACE, 'xmlns': XMLNS_NAMESPACE} + +class Namespaces(g.GenericTreeModel): + def __init__(self): + g.GenericTreeModel.__init__(self) + self.dict = dict(fixed_ns) + self.update_list() + + def update_list(self): + self.list = self.dict.keys() + self.list.sort() + + def on_get_n_columns(self): + return 2 + + def on_get_iter(self, path): + assert len(path) == 1 + return path[0] + + def on_get_value(self, iter, column): + if column == 0: + return self.list[iter] + return self.dict[self.list[iter]] + + def on_iter_nth_child(self, iter, n): + if iter == None: + return n + return None + + def on_get_column_type(self, col): + return str + + def on_iter_has_child(self, iter): + return False + + def on_iter_next(self, iter): + if iter < len(self.list) - 1: + return iter + 1 + + def __setitem__(self, prefix, uri): + if prefix in self.dict and self.dict[prefix] == uri: + return + + assert prefix + assert prefix not in fixed_ns + + self.dict[prefix] = uri + +class GUI(rox.Dialog): + def __init__(self, model): + rox.Dialog.__init__(self) + self.model = model + self.add_button(g.STOCK_CLOSE, g.RESPONSE_OK) + def response(dialog, resp): + self.destroy() + self.connect('response', response) + self.set_position(g.WIN_POS_MOUSE) + self.set_title('Namespaces for ' + `model.uri`) + + tree = g.TreeView(model.namespaces) + frame = g.Frame() + frame.add(tree) + frame.set_shadow_type(g.SHADOW_IN) + + cell = g.CellRendererText() + column = g.TreeViewColumn('Prefix', cell, text = 0) + tree.append_column(column) + + column = g.TreeViewColumn('URI', cell, text = 1) + tree.append_column(column) + + frame.show_all() + + self.vbox.pack_start(frame, True, True) + self.set_default_size(400, 200) + + self.set_has_separator(False) diff --git a/Dome/View.py b/Dome/View.py index 21141c2..d55e31b 100644 --- a/Dome/View.py +++ b/Dome/View.py @@ -29,6 +29,9 @@ from constants import * import re +#http://www.w3.org/2001/12/soap-envelope' +SOAPENV_NS = 'http://schemas.xmlsoap.org/soap/envelope/' + def elements(node): out = [] for x in node.childNodes: @@ -1686,7 +1689,7 @@ class View: copy = node_to_xml(self.get_current()) env = copy.documentElement - if env.namespaceURI != 'http://schemas.xmlsoap.org/soap/envelope/': + if env.namespaceURI != SOAPENV_NS: alert("Not a SOAP-ENV:Envelope (bad namespace)") raise Done() if env.localName != 'Envelope': @@ -1701,12 +1704,12 @@ class View: head = kids[0] body = kids[1] - if head.namespaceURI != 'http://schemas.xmlsoap.org/soap/envelope/' or \ + if head.namespaceURI != SOAPENV_NS or \ head.localName != 'Head': alert("First child must be a SOAP-ENV:Head element") raise Done() - if body.namespaceURI != 'http://schemas.xmlsoap.org/soap/envelope/' or \ + if body.namespaceURI != SOAPENV_NS or \ body.localName != 'Body': alert("Second child must be a SOAP-ENV:Body element") raise Done() @@ -1753,9 +1756,7 @@ class View: reply = conn.getfile().read() print "Got:\n", reply - reader = PyExpat.Reader() # XXX - new_doc = reader.fromString(reply) - print new_doc + new_doc = support.parse_data(reply, None) new = self.model.doc.importNode(new_doc.documentElement, 1) diff --git a/Dome/Window.py b/Dome/Window.py index 45c0315..e05a51b 100644 --- a/Dome/Window.py +++ b/Dome/Window.py @@ -121,12 +121,12 @@ class Window(rox.Window, saving.Saveable): self.savebox.set_destroy_with_parent(True) radio_dome = g.RadioButton(None, 'Save everything (.dome)') radio_xml = g.RadioButton(radio_dome, 'Export data as XML') - radio_html = g.RadioButton(radio_xml, 'Export data as HTML') + radio_html = g.RadioButton(radio_xml, 'Export data as XHTML') self.save_radios = ( (radio_dome, 'dome', 'application/x-dome', self.save_as_dome), (radio_xml, 'xml', 'text/xml', self.save_as_xml), - (radio_html, 'html', 'text/html', self.save_as_html)) + (radio_html, 'xhtml', 'application/xhtml+xml', self.save_as_html)) def changed(toggle = None): name = self.savebox.save_area.entry.get_text() @@ -134,8 +134,8 @@ class Window(rox.Window, saving.Saveable): name = name[:-4] elif name.endswith('.dome'): name = name[:-5] - elif name.endswith('.html'): - name = name[:-5] + elif name.endswith('.xhtml'): + name = name[:-6] for radio, ext, mime, fn in self.save_radios: if radio.get_active(): diff --git a/Dome/support.py b/Dome/support.py index deff5c5..1b0347c 100644 --- a/Dome/support.py +++ b/Dome/support.py @@ -16,8 +16,8 @@ entrefpattern = re.compile('&(\D\S+);') def node_to_xml(node): "Takes an XML node and returns an XML documentElement suitable for saving." root = implementation.createDocument(None, 'root', None) - new = node.cloneNode(deep = 1) - new = root.importNode(new, deep = 1) + new = node.cloneNode(1) + new = root.importNode(new, 1) root.replaceChild(new, root.documentElement) return root -- 2.11.4.GIT