2 @package ogc_services.py
4 @brief Dialogs for OGC services
6 Currently only implemeted WMS.
12 (C) 2009 by the GRASS Development Team
14 This program is free software under the GNU General Public License
15 (>=v2). Read the file COPYING that comes with GRASS for details.
17 @author Martin Landa <landa.martin gmail.com>
21 from wx.gizmos
import TreeListCtrl
22 import wx.lib.mixins.listctrl
as listmix
26 from preferences
import globalSettings
as UserSettings
29 def __init__(self, parent, service = 'wms',
31 style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER):
32 """!Dialog to import data from WMS server"""
36 wx.Dialog.__init__(self, parent, id, style=style)
38 self.SetTitle(_(
"Import data from WMS server"))
40 self.
panel = wx.Panel(parent = self, id = wx.ID_ANY)
46 self.SetMinSize((550, 400))
48 def __createWidgets(self):
49 """!Create dialog widgets"""
54 label = _(
" Server settings "))
56 self.
serverText = wx.StaticText(parent = self.
panel, id = wx.ID_ANY, label = _(
"Server:"))
57 self.
server = wx.TextCtrl(parent = self.
panel, id = wx.ID_ANY)
63 label=_(
" List of layers "))
68 self.
add = wx.CheckBox(parent=self.
panel, id=wx.ID_ANY,
69 label=_(
"Add imported layers into layer tree"))
70 self.add.SetValue(UserSettings.Get(group=
'cmd', key=
'addNewLayer', subkey=
'enabled'))
77 self.btn_cancel.SetToolTipString(_(
"Close dialog"))
79 self.
btn_connect = wx.Button(parent = self.
panel, id = wx.ID_ANY, label = _(
"&Connect"))
80 self.btn_connect.SetToolTipString(_(
"Connect to the server"))
81 self.btn_connect.SetDefault()
82 if not self.server.GetValue():
83 self.btn_connect.Enable(
False)
85 self.
btn_import = wx.Button(parent = self.
panel, id = wx.ID_OK, label = _(
"&Import"))
86 self.btn_import.SetToolTipString(_(
"Import selected layers"))
87 self.btn_import.Enable(
False)
92 self.btn_cancel.Bind(wx.EVT_BUTTON, self.
OnCancel)
93 self.btn_connect.Bind(wx.EVT_BUTTON, self.
OnConnect)
94 self.server.Bind(wx.EVT_TEXT, self.
OnServer)
97 """!Do dialog layout"""
98 dialogSizer = wx.BoxSizer(wx.VERTICAL)
103 settingsSizer = wx.StaticBoxSizer(self.
settingsBox, wx.HORIZONTAL)
105 gridSizer = wx.FlexGridSizer(cols=2, vgap=5, hgap=5)
108 flag=wx.ALIGN_CENTER_VERTICAL)
109 gridSizer.AddGrowableCol(1)
110 gridSizer.Add(item=self.
server,
111 flag=wx.EXPAND | wx.ALL)
113 settingsSizer.Add(item=gridSizer, proportion=1,
114 flag=wx.EXPAND | wx.ALL)
116 dialogSizer.Add(item=settingsSizer, proportion=0,
117 flag=wx.ALL | wx.EXPAND, border=5)
122 layersSizer = wx.StaticBoxSizer(self.
layersBox, wx.HORIZONTAL)
124 layersSizer.Add(item=self.
list, proportion=1,
125 flag=wx.ALL | wx.EXPAND, border=5)
127 dialogSizer.Add(item=layersSizer, proportion=1,
128 flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=5)
130 dialogSizer.Add(item=self.
add, proportion=0,
131 flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=5)
136 btnsizer = wx.BoxSizer(orient=wx.HORIZONTAL)
138 btnsizer.Add(item=self.
btn_cancel, proportion=0,
139 flag=wx.ALL | wx.ALIGN_CENTER,
143 flag=wx.ALL | wx.ALIGN_CENTER,
146 btnsizer.Add(item=self.
btn_import, proportion=0,
147 flag=wx.ALL | wx.ALIGN_CENTER,
150 dialogSizer.Add(item=btnsizer, proportion=0,
151 flag=wx.ALIGN_CENTER)
153 self.panel.SetAutoLayout(
True)
154 self.panel.SetSizer(dialogSizer)
155 dialogSizer.Fit(self.
panel)
159 """!Button 'Cancel' pressed -> close the dialog"""
163 """!Button 'Connect' pressed"""
164 server = self.server.GetValue()
166 self.btn_import.Enable(
False)
170 ret = gcmd.RunCommand(
'r.in.wms',
179 self.btn_import.Enable(
False)
182 lastLayer = lastStyle =
''
183 for line
in ret.splitlines():
185 key, value = line.split(
':', 1)
188 key = key.strip().lower()
189 value = value.strip()
195 layers[lastLayer][key] = value
197 if 'style' not in layers[lastLayer]:
198 layers[lastLayer][
'style'] = {}
199 layers[lastLayer][
'style'][value] =
''
201 elif key ==
'style title':
202 layers[lastLayer][
'style'][lastStyle] = value
205 self.list.LoadData(layers)
207 if len(layers.keys()) > 0:
208 self.btn_import.Enable(
True)
210 self.btn_import.Enable(
False)
213 """!Server settings changed"""
214 value = event.GetString()
216 self.btn_connect.Enable(
True)
218 self.btn_connect.Enable(
False)
221 """!Get list of selected layers/styles to be imported"""
222 return self.list.GetSelectedLayers()
225 """!Get connection settings"""
226 return {
'server' : self.server.GetValue() }
228 class LayersList(TreeListCtrl, listmix.ListCtrlAutoWidthMixin):
229 def __init__(self, parent, pos=wx.DefaultPosition):
230 """!List of layers to be imported (dxf, shp...)"""
233 TreeListCtrl.__init__(self, parent, wx.ID_ANY,
234 style = wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT |
235 wx.TR_FULL_ROW_HIGHLIGHT | wx.TR_MULTIPLE)
238 listmix.ListCtrlAutoWidthMixin.__init__(self)
240 self.AddColumn(_(
'Layer / Style'))
241 self.AddColumn(_(
'Title'))
242 self.SetMainColumn(0)
243 self.SetColumnWidth(0, 175)
248 """!Load data into list"""
250 self.DeleteAllItems()
251 self.
root = self.AddRoot(_(
"Layers"))
260 title = data[layer][
'title']
261 lchild = self.AppendItem(self.
root, layer)
262 self.SetItemText(lchild, title, 1)
263 if 'style' in data[layer]:
264 styles = data[layer][
'style'].keys()
269 title = data[layer][
'style'][style]
270 schild = self.AppendItem(lchild, style)
271 self.SetItemText(schild, title, 1)
273 self.Expand(self.
root)
276 """!Required for listmix.ListCtrlAutoWidthMixin"""
280 """!Required for listmix.ListCtrlAutoWidthMixin"""
284 """!Get selected layers/styles"""
287 for item
in self.GetSelections():
288 parent = self.GetItemParent(item)
289 if parent == self.
root:
290 layer = self.GetItemText(item, 0)
291 layers[layer] = list()
292 sitem, cookie = self.GetFirstChild(item)
294 layers[layer].append(self.GetItemText(sitem, 0))
295 sitem, cookie = self.GetNextChild(item, cookie)
297 layer = self.GetItemText(parent, 0)
298 layers[layer] = list()
299 layers[layer].append(self.GetItemText(item, 0))