1 from xml
.dom
import Node
, minidom
3 import rox
, os
, pango
, sys
, textwrap
, traceback
, subprocess
, time
, urlparse
4 from rox
import g
, tasks
, loading
10 from zeroinstall
.injector
import model
11 from zeroinstall
.zerostore
import unpack
, NotStored
13 def get_combo_value(combo
):
14 i
= combo
.get_active()
18 class ImplementationProperties
:
19 def __init__(self
, feed_editor
, element
= None, is_group
= False):
20 self
.feed_editor
= feed_editor
21 self
.element
= element
23 widgets
= gtk
.glade
.XML(main
.gladefile
, 'version')
25 #attributes = g.ListStore(str, str)
26 #attr_view = widgets.get_widget('attributes')
27 #attr_view.set_model(attributes)
29 #attr_view.append_column(g.TreeViewColumn('Name'))
30 #attr_view.append_column(g.TreeViewColumn('Value'))
32 inherit_arch
= widgets
.get_widget('inherit_arch')
34 s
= not inherit_arch
.get_active()
35 widgets
.get_widget('cpu').set_sensitive(s
)
36 widgets
.get_widget('os').set_sensitive(s
)
37 inherit_arch
.connect('toggled', lambda cb
: shade_os_cpu())
39 main_menu
= widgets
.get_widget('main_binary')
42 if element
.localName
== 'group':
46 id = element
.getAttribute('id')
48 version
= element
.getAttribute('version') + \
49 (element
.getAttribute('version-modifier') or '')
50 widgets
.get_widget('version_number').set_text(version
)
51 widgets
.get_widget('released').set_text(element
.getAttribute('released'))
53 main_binary
= element
.getAttribute('main')
55 stability_menu
= widgets
.get_widget('stability')
56 stability
= element
.getAttribute('stability')
59 for row
in stability_menu
.get_model():
60 if row
[0].lower() == stability
:
61 stability_menu
.set_active(i
)
65 stability_menu
.set_active(0)
67 main
.combo_set_text(widgets
.get_widget('license'), element
.getAttribute('license'))
68 arch
= element
.getAttribute('arch')
70 arch_os
, arch_cpu
= arch
.split('-')
71 main
.combo_set_text(widgets
.get_widget('os'), arch_os
)
72 main
.combo_set_text(widgets
.get_widget('cpu'), arch_cpu
)
73 inherit_arch
.set_active(False)
76 self
.update_impl(element
, widgets
)
78 released
= widgets
.get_widget('released')
82 widgets
.get_widget('version_number').set_text('')
85 widgets
.get_widget('version_number').set_text('1.0')
86 released
.set_text(time
.strftime('%Y-%m-%d'))
88 widgets
.get_widget('cpu').set_active(0)
89 widgets
.get_widget('os').set_active(0)
90 widgets
.get_widget('stability').set_active(0)
95 element_name
= 'group'
97 element_name
= 'implementation'
98 element
= create_element(self
.feed_editor
.doc
.documentElement
, element_name
)
100 element
.setAttribute('id', '.')
102 self
.update_impl(element
, widgets
)
104 remove_element(element
)
109 self
.is_group
= is_group
111 id_label
= widgets
.get_widget('id_label')
114 id_label
.set_text('(group)')
116 id_label
.set_text(id)
117 if id.startswith('.') or id.startswith('/'):
118 id_label
.set_sensitive(True)
120 id_label
.set_text('-')
123 if r
== g
.RESPONSE_OK
:
125 self
.feed_editor
.update_version_model()
128 if is_group
and element
:
129 # Find a cached implementation for getting main
130 for x
in child_elements(element
):
131 if x
.localName
== 'implementation' and x
.namespaceURI
== XMLNS_INTERFACE
:
132 id = x
.getAttribute('id')
134 if id and main
.stores
.lookup(id):
136 except NotStored
, ex
:
139 # Find possible main settings, if possible
140 if id.startswith('/') or id.startswith('.'):
141 cached_impl
= os
.path
.abspath(os
.path
.join(os
.path
.dirname(feed_editor
.pathname
), id))
144 cached_impl
= main
.stores
.lookup(id)
145 except NotStored
, ex
:
149 for (dirpath
, dirnames
, filenames
) in os
.walk(cached_impl
):
150 for file in filenames
:
151 info
= os
.stat(os
.path
.join(dirpath
, file))
152 if info
.st_mode
& 0111:
153 relbasedir
= dirpath
[len(cached_impl
) + 1:]
154 new
= os
.path
.join(relbasedir
, file)
155 main_menu
.append_text(new
)
157 main
.combo_set_text(main_menu
, main_binary
)
159 dialog
= widgets
.get_widget('version')
160 dialog
.connect('response', resp
)
162 def update_impl(self
, element
, widgets
):
163 version
= widgets
.get_widget('version_number').get_text()
164 released
= widgets
.get_widget('released').get_text()
165 inherit_arch
= widgets
.get_widget('inherit_arch')
168 widget
= widgets
.get_widget(name
)
169 return widget
.get_active_text()
171 cpu
= get_combo('cpu')
173 license
= get_combo('license')
175 widget
= widgets
.get_widget('stability')
176 if widget
.get_active() == 0:
179 stability
= get_combo('stability').lower()
181 if inherit_arch
.get_active():
184 arch
= os
+ '-' + cpu
186 main
= widgets
.get_widget('main_binary').get_active_text()
188 old_id
= element
.getAttribute('id')
189 if old_id
.startswith('/') or old_id
.startswith('.'):
190 # Local paths are editable
191 new_id
= widgets
.get_widget('id_label').get_text()
192 if new_id
.startswith('.') or new_id
.startswith('/'):
193 element
.setAttribute('id', new_id
)
195 raise Exception('Local IDs must start with "." or "/"')
197 version_modifier
= None
199 model
.parse_version(version
)
201 version
, version_modifier
= version
.split('-', 1)
202 version_modifier
= '-' + version_modifier
204 for name
, value
in [('version', version
),
205 ('version-modifier', version_modifier
),
208 ('released', released
),
209 ('license', license
),
210 ('stability', stability
)]:
212 element
.setAttribute(name
, value
)
213 elif element
.hasAttribute(name
):
214 element
.removeAttribute(name
)