9 from zeroinstall
.zerostore
import NotStored
10 from zeroinstall
.injector
import model
11 from zeroinstall
.injector
.policy
import Policy
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
35 main
.combo_set_text(uri
, element
.getAttribute('interface'))
37 for child
in child_elements(element
):
38 if child
.namespaceURI
!= XMLNS_INTERFACE
: continue
39 if child
.localName
== 'version':
40 self
.version_element
= child
41 elif child
.localName
== 'environment':
42 self
.env_element
= child
44 if self
.version_element
:
45 self
.widgets
.get_widget('before').set_text(self
.version_element
.getAttribute('before') or '')
46 self
.widgets
.get_widget('not_before').set_text(self
.version_element
.getAttribute('not-before') or '')
48 for x
in ['name', 'insert']:
49 main
.combo_set_text(self
.widgets
.get_widget('env_' + x
), self
.env_element
.getAttribute(x
))
50 self
.widgets
.get_widget('env_default').set_text(self
.env_element
.getAttribute('default') or '')
53 self
.update_element(element
, self
.widgets
)
56 element
= create_element(parent
, 'requires')
57 self
.update_element(element
, self
.widgets
)
60 if r
== g
.RESPONSE_OK
:
62 self
.feed_editor
.update_version_model()
65 dialog
= self
.widgets
.get_widget('requires')
66 dialog
.connect('response', resp
)
68 def update_uri(self
, combo
):
69 env_insert
= self
.widgets
.get_widget('env_insert')
70 env_insert
.get_model().clear()
72 uri
= combo
.get_active_text()
73 if uri
not in self
.known_ifaces
: return
76 policy
.network_use
= model
.network_offline
78 impls
= policy
.get_ranked_implementations(policy
.get_interface(uri
))
81 if impl
.id.startswith('/'):
85 cached_impl
= main
.stores
.lookup(impl
.id)
89 for (dirpath
, dirnames
, filenames
) in os
.walk(cached_impl
):
91 if d
in ('.svn', 'CVS'):
93 new
= dirpath
[len(cached_impl
) + 1:]
94 env_insert
.append_text(new
)
97 def update_element(self
, element
, widgets
):
98 element
.setAttribute('interface', widgets
.get_widget('requires_uri').get_active_text())
100 before
= widgets
.get_widget('before').get_text() or None
101 not_before
= widgets
.get_widget('not_before').get_text() or None
103 if before
: model
.parse_version(before
)
104 if not_before
: model
.parse_version(not_before
)
106 if before
or not_before
:
107 if not self
.version_element
:
108 self
.version_element
= create_element(element
, 'version')
109 set_or_remove(self
.version_element
, 'before', before
)
110 set_or_remove(self
.version_element
, 'not-before', not_before
)
111 elif self
.version_element
:
112 remove_element(self
.version_element
)
113 self
.version_element
= None
115 env_name
= widgets
.get_widget('env_name').get_active_text()
116 env_insert
= widgets
.get_widget('env_insert').get_active_text()
117 env_default
= widgets
.get_widget('env_default').get_text()
120 if not self
.env_element
:
121 self
.env_element
= create_element(element
, 'environment')
122 self
.env_element
.setAttribute('name', env_name
)
123 self
.env_element
.setAttribute('insert', env_insert
)
124 set_or_remove(self
.env_element
, 'default', env_default
)
125 elif env_insert
or env_default
:
126 raise Exception('Missing environment variable name!')
127 elif self
.env_element
:
128 remove_element(self
.env_element
)
129 self
.env_element
= None