9 from zeroinstall
.zerostore
import NotStored
10 from zeroinstall
.injector
import model
11 from zeroinstall
.injector
.iface_cache
import iface_cache
14 def __init__(self
, feed_editor
, parent
, element
= None):
15 self
.feed_editor
= feed_editor
16 self
.element
= element
18 self
.widgets
= gtk
.glade
.XML(main
.gladefile
, 'requires')
20 uri
= self
.widgets
.get_widget('requires_uri')
21 stream
= os
.popen('0launch --list')
22 self
.known_ifaces
= [line
.strip() for line
in stream
if not line
.startswith('/')]
23 self
.known_ifaces
.sort()
26 for x
in self
.known_ifaces
:
29 uri
.connect('changed', self
.update_uri
)
31 self
.version_element
= None # Last <version> child
32 self
.env_element
= None # Last <environment> child
34 env_combo
= self
.widgets
.get_widget('env_mode')
35 main
.combo_set_text(env_combo
, 'Prepend')
36 def mode_changed(combo
):
37 self
.widgets
.get_widget('env_default').set_sensitive(env_combo
.get_active_text() != 'Replace')
38 env_combo
.connect('changed', mode_changed
)
41 main
.combo_set_text(uri
, element
.getAttribute('interface'))
43 for child
in child_elements(element
):
44 if child
.namespaceURI
!= XMLNS_INTERFACE
: continue
45 if child
.localName
== 'version':
46 self
.version_element
= child
47 elif child
.localName
== 'environment':
48 self
.env_element
= child
50 if self
.version_element
:
51 self
.widgets
.get_widget('before').set_text(self
.version_element
.getAttribute('before') or '')
52 self
.widgets
.get_widget('not_before').set_text(self
.version_element
.getAttribute('not-before') or '')
54 for x
in ['name', 'insert']:
55 main
.combo_set_text(self
.widgets
.get_widget('env_' + x
), self
.env_element
.getAttribute(x
))
56 self
.widgets
.get_widget('env_default').set_text(self
.env_element
.getAttribute('default') or '')
57 main
.combo_set_text(env_combo
,
58 self
.env_element
.getAttribute('mode').capitalize() or 'Prepend')
61 self
.update_element(element
, self
.widgets
)
64 element
= create_element(parent
, 'requires')
65 self
.update_element(element
, self
.widgets
)
68 if r
== g
.RESPONSE_OK
:
70 self
.feed_editor
.update_version_model()
73 mode_changed(env_combo
)
74 dialog
= self
.widgets
.get_widget('requires')
75 dialog
.connect('response', resp
)
77 def update_uri(self
, combo
):
78 env_insert
= self
.widgets
.get_widget('env_insert')
79 env_insert
.get_model().clear()
81 uri
= combo
.get_active_text()
82 if uri
not in self
.known_ifaces
: return
84 impls
= iface_cache
.get_interface(uri
).implementations
.values()
88 if impl
.id.startswith('/'):
90 elif impl
.id.startswith('package:'):
94 cached_impl
= main
.stores
.lookup(impl
.id)
98 for (dirpath
, dirnames
, filenames
) in os
.walk(cached_impl
):
100 if d
in ('.svn', 'CVS'):
102 new
= dirpath
[len(cached_impl
) + 1:]
103 env_insert
.append_text(new
)
106 def update_element(self
, element
, widgets
):
107 element
.setAttribute('interface', widgets
.get_widget('requires_uri').get_active_text())
109 before
= widgets
.get_widget('before').get_text() or None
110 not_before
= widgets
.get_widget('not_before').get_text() or None
112 if before
: model
.parse_version(before
)
113 if not_before
: model
.parse_version(not_before
)
115 if before
or not_before
:
116 if not self
.version_element
:
117 self
.version_element
= create_element(element
, 'version')
118 set_or_remove(self
.version_element
, 'before', before
)
119 set_or_remove(self
.version_element
, 'not-before', not_before
)
120 elif self
.version_element
:
121 remove_element(self
.version_element
)
122 self
.version_element
= None
124 env_name
= widgets
.get_widget('env_name').get_active_text()
125 env_insert
= widgets
.get_widget('env_insert').get_active_text()
126 env_mode
= widgets
.get_widget('env_mode').get_active_text().lower()
127 env_default
= widgets
.get_widget('env_default').get_text()
130 if not self
.env_element
:
131 self
.env_element
= create_element(element
, 'environment')
132 self
.env_element
.setAttribute('name', env_name
)
133 self
.env_element
.setAttribute('insert', env_insert
)
134 self
.env_element
.setAttribute('mode', env_mode
)
135 set_or_remove(self
.env_element
, 'default', env_default
)
136 elif env_insert
or env_default
:
137 raise Exception('Missing environment variable name!')
138 elif self
.env_element
:
139 remove_element(self
.env_element
)
140 self
.env_element
= None