not() hint
[dom-editor.git] / Dome / Namespaces.py
blob0c9194680b7a318b92d07ff3f363971c9b5fc975
1 from xml.dom import XMLNS_NAMESPACE, XML_NAMESPACE
2 from constants import DOME_NS
3 from Ft.Xml.XPath import FT_EXT_NAMESPACE
5 import rox
6 from rox import g
8 fixed_ns = {'xml': XML_NAMESPACE, 'xmlns': XMLNS_NAMESPACE,
9 'ext': FT_EXT_NAMESPACE,
10 'dome': DOME_NS}
12 common_ns = {'http://www.w3.org/1999/xhtml': 'xhtml',
13 'http://www.w3.org/1999/02/22-rdf-syntax-ns#': 'rdf',
14 'http://xmlns.4suite.org/ext': 'ft',
15 'http://www.w3.org/1999/XSL/Transform': 'xsl',
16 'http://www.w3.org/2001/XMLSchema': 'xsd',
17 'http://www.w3.org/1999/XMLSchema-instance': 'xsi',
18 'http://schemas.xmlsoap.org/soap/envelope/': 'env',
19 'http://www.w3.org/1999/xlink': 'xlink'}
21 class Namespaces(g.GenericTreeModel):
22 def __init__(self):
23 g.GenericTreeModel.__init__(self)
24 self.uri = dict(fixed_ns)
25 self.update_list()
27 def update_list(self):
28 self.list = self.uri.keys()
29 self.list.sort()
30 pre = self.prefix = {}
31 for p, u in self.uri.iteritems():
32 pre[u] = p
34 def on_get_n_columns(self):
35 return 2
37 def on_get_iter(self, path):
38 assert len(path) == 1
39 return path[0]
41 def on_get_value(self, iter, column):
42 if column == 0:
43 return self.list[iter]
44 return self.uri[self.list[iter]]
46 def on_iter_nth_child(self, iter, n):
47 if iter == None:
48 return n
49 return None
51 def on_get_column_type(self, col):
52 return str
54 def on_iter_has_child(self, iter):
55 return False
57 def on_iter_next(self, iter):
58 if iter < len(self.list) - 1:
59 return iter + 1
61 def __setitem__(self, prefix, uri):
62 if prefix in self.uri and self.uri[prefix] == uri:
63 return
65 assert prefix
66 if prefix in fixed_ns:
67 raise Exception('That namespace prefix cannot be changed')
68 if uri in self.prefix:
69 raise Exception('That namespace already has a prefix (%s)' % self.prefix[uri])
71 modifed = prefix in self.uri
73 self.uri[prefix] = uri
74 self.update_list()
75 path = (self.list.index(prefix),)
77 if modifed:
78 self.emit('row-changed', path, self.get_iter(path))
79 else:
80 self.emit('row-inserted', path, self.get_iter(path))
82 def __delitem__(self, iter):
83 prefix = self[iter][0]
84 if prefix in fixed_ns:
85 raise Exception('This is a built-in namespace and cannot be deleted')
86 path = (self.list.index(prefix),)
87 del self.uri[prefix]
88 self.update_list()
89 self.emit('row-deleted', path)
91 def ensure_ns(self, suggested_prefix, uri):
92 """Return the prefix for this URI. If none is set choose one (using suggested_prefix
93 if possible)."""
94 try:
95 return self.prefix[uri]
96 except KeyError:
97 if not suggested_prefix:
98 suggested_prefix = common_ns.get(uri, 'ns')
99 if suggested_prefix in self.uri:
100 x = 1
101 while suggested_prefix + `x` in self.uri: x += 1
102 suggested_prefix += `x`
103 self[suggested_prefix] = uri
104 #print "Added", suggested_prefix, uri
105 return suggested_prefix
107 def to_xml(self, doc):
108 node = doc.createElementNS(DOME_NS, 'dome:namespaces')
109 for prefix, uri in self.uri.iteritems():
110 if prefix in fixed_ns: continue
111 ns = doc.createElementNS(DOME_NS, 'dome:ns')
112 ns.setAttributeNS(None, 'prefix', prefix)
113 ns.setAttributeNS(None, 'uri', uri)
114 node.appendChild(ns)
115 return node
117 class GUI(rox.Dialog):
118 def __init__(self, model):
119 rox.Dialog.__init__(self)
120 self.model = model
122 self.add_button(g.STOCK_ADD, 1)
123 self.add_button(g.STOCK_DELETE, 2)
124 self.add_button(g.STOCK_CLOSE, g.RESPONSE_OK)
126 tree = g.TreeView(model.namespaces)
128 def response(dialog, resp):
129 if resp == 1:
130 dialog.add_new(model.namespaces)
131 elif resp == 2:
132 dialog.delete_selected(tree.get_selection())
133 else:
134 dialog.destroy()
135 self.connect('response', response)
136 self.set_position(g.WIN_POS_MOUSE)
137 self.set_title('Namespaces for ' + `model.uri`)
139 frame = g.Frame()
140 frame.add(tree)
141 frame.set_shadow_type(g.SHADOW_IN)
143 cell = g.CellRendererText()
144 column = g.TreeViewColumn('Prefix', cell, text = 0)
145 tree.append_column(column)
147 column = g.TreeViewColumn('URI', cell, text = 1)
148 tree.append_column(column)
150 frame.show_all()
152 self.vbox.pack_start(frame, True, True)
153 self.set_default_size(400, 200)
155 self.set_has_separator(False)
157 def delete_selected(self, sel):
158 model, iter = sel.get_selected()
159 if not iter:
160 rox.alert('Select a namespace binding to delete')
161 return
162 try:
163 del model[iter]
164 except:
165 rox.report_exception()
167 def add_new(self, ns):
168 d = rox.Dialog()
170 hbox = g.HBox(False, 2)
171 d.vbox.pack_start(hbox, False, True)
172 hbox.pack_start(g.Label('Prefix:'), False, True, 0)
173 prefix = g.Entry()
174 hbox.pack_start(prefix, True, True, 0)
176 def check_prefix(entry):
177 if not uri.get_text():
178 pre = prefix.get_text()
179 for u, p in common_ns.iteritems():
180 if p == pre:
181 uri.set_text(u)
182 break
183 uri.grab_focus()
185 prefix.connect('activate', check_prefix)
187 hbox = g.HBox(False, 2)
188 d.vbox.pack_start(hbox, False, True)
189 hbox.pack_start(g.Label('Namespace URI:'), False, True, 0)
190 uri = g.Entry()
191 hbox.pack_start(uri, True, True, 0)
192 uri.set_activates_default(True)
194 d.vbox.show_all()
195 d.set_position(g.WIN_POS_MOUSE)
197 prefix.grab_focus()
199 d.add_button(g.STOCK_CANCEL, g.RESPONSE_CANCEL)
200 d.add_button(g.STOCK_OK, g.RESPONSE_OK)
202 d.set_default_response(g.RESPONSE_OK)
204 while 1:
205 if d.run() != g.RESPONSE_OK:
206 d.destroy()
207 return
208 try:
209 ns[prefix.get_text()] = uri.get_text()
210 break
211 except:
212 rox.report_exception()
213 d.destroy()