# -*- coding: utf-8 -*- """ Created on Mon Nov 26 11:57:54 2012 @author: lucadelu """ import wx import os from core import globalvar, gcmd from core.utils import _ from grass.script.utils import try_remove from rlisetup.functions import retRLiPath from rlisetup.wizard import RLIWizard import locale import codecs class ViewFrame(wx.Frame): def __init__(self, parent, conf, giface=None, id=wx.ID_ANY, title=_("Modify the configuration file"), style=wx.DEFAULT_FRAME_STYLE | wx.RESIZE_BORDER, **kwargs): ###VARIABLES self.parent = parent self.rlipath = retRLiPath() self.confile = conf self.pathfile = os.path.join(self.rlipath, conf) wx.Frame.__init__(self, parent=parent, id=id, title=title, **kwargs) self.SetIcon(wx.Icon(os.path.join(globalvar.ICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO)) self.panel = wx.Panel(parent=self, id=wx.ID_ANY) self.confilesBox = wx.StaticBox(parent=self.panel, id=wx.ID_ANY, label=_("View and modify the " \ "configuration file '{name}'".format(name=self.confile))) self.textCtrl = wx.TextCtrl(parent=self.panel, id=wx.ID_ANY, style=wx.TE_MULTILINE, size=(-1, 75)) self.textCtrl.Bind(wx.EVT_TEXT, self.OnFileText) f = open(self.pathfile) self.textCtrl.SetValue(''.join(f.readlines())) f.close() ###BUTTONS #definition self.btn_close = wx.Button(parent=self, id=wx.ID_EXIT) self.btn_ok = wx.Button(parent=self, id=wx.ID_SAVE) self.btn_close.Bind(wx.EVT_BUTTON, self.OnClose) self.btn_ok.Bind(wx.EVT_BUTTON, self.OnOk) self._layout() self.enc = locale.getdefaultlocale()[1] def _layout(self): """Set the layout""" panelsizer = wx.GridBagSizer(1, 1) mainsizer = wx.BoxSizer(wx.VERTICAL) ###CONFILES confilesSizer = wx.StaticBoxSizer(self.confilesBox, wx.HORIZONTAL) confilesSizer.Add(item=self.textCtrl, proportion=1, flag=wx.EXPAND) ###END CONFILES ###BUTTONS buttonSizer = wx.BoxSizer(wx.HORIZONTAL) buttonSizer.Add(item=self.btn_ok, flag=wx.ALL, border=5) buttonSizer.Add(item=self.btn_close, flag=wx.ALL, border=5) ###END BUTTONS #add listbox to staticbox panelsizer.Add(item=confilesSizer, pos=(0, 0), flag=wx.EXPAND, border=3) #add panel and buttons mainsizer.Add(item=self.panel, proportion=1, flag=wx.EXPAND, border=3) mainsizer.Add(item=buttonSizer, proportion=0, flag=wx.EXPAND, border=3) panelsizer.AddGrowableRow(0) panelsizer.AddGrowableCol(0) self.panel.SetAutoLayout(True) self.panel.SetSizerAndFit(panelsizer) self.SetSizer(mainsizer) self.Layout() def OnClose(self, event): """Close window""" self.Destroy() def OnOk(self, event): """Launches help""" dlg = wx.MessageDialog(parent=self.parent, message=_("Are you sure that you want modify" \ " r.li configuration file {name}?" \ "\nYou could broke the configuration" \ " file...").format(name=self.confile), caption=_("WARNING"), style=wx.YES_NO | wx.YES_DEFAULT | wx.ICON_WARNING) if dlg.ShowModal() == wx.ID_YES: f = codecs.open(self.pathfile, encoding=self.enc, mode='w', errors='replace') f.write(self.text + os.linesep) f.close() dlg.Destroy() self.Destroy() def OnFileText(self, event): """File input interactively entered""" self.text = event.GetString() class RLiSetupFrame(wx.Frame): def __init__(self, parent, giface=None, id=wx.ID_ANY, title=_("GRASS" \ " GIS Setup for r.li modules"), style=wx.DEFAULT_FRAME_STYLE | wx.RESIZE_BORDER, **kwargs): ###VARIABLES self.parent = parent # self.cmd = "r.li.setup" self.rlipath = retRLiPath() self.listfiles = self.ListFiles() ###END VARIABLES #init of frame wx.Frame.__init__(self, parent=parent, id=id, title=title, **kwargs) self.SetIcon(wx.Icon(os.path.join(globalvar.ICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO)) self.panel = wx.Panel(parent=self, id=wx.ID_ANY) #box for select configuration file self.confilesBox = wx.StaticBox(parent=self.panel, id=wx.ID_ANY, label=_('Available sampling area configuration files')) self.listfileBox = wx.ListBox(parent=self.panel, id=wx.ID_ANY, choices=self.listfiles) ###BUTTONS #definition self.btn_close = wx.Button(parent=self, id=wx.ID_CLOSE) self.btn_help = wx.Button(parent=self, id=wx.ID_HELP) self.btn_remove = wx.Button(parent=self, id=wx.ID_ANY, label=_("Remove")) self.btn_remove.SetToolTipString(_('Remove a configuration file')) self.btn_new = wx.Button(parent=self, id=wx.ID_ANY, label=_("Create")) self.btn_new.SetToolTipString(_('Create a new configuration file')) self.btn_rename = wx.Button(parent=self, id=wx.ID_ANY, label=_("Rename")) self.btn_rename.SetToolTipString(_('Rename a configuration file')) self.btn_view = wx.Button(parent=self, id=wx.ID_ANY, label=_("View/Edit")) self.btn_view.SetToolTipString(_('View and edit a configuration file')) #set action for button self.btn_close.Bind(wx.EVT_BUTTON, self.OnClose) self.btn_help.Bind(wx.EVT_BUTTON, self.OnHelp) self.btn_remove.Bind(wx.EVT_BUTTON, self.OnRemove) self.btn_new.Bind(wx.EVT_BUTTON, self.OnNew) self.btn_rename.Bind(wx.EVT_BUTTON, self.OnRename) self.btn_view.Bind(wx.EVT_BUTTON, self.OnView) self._layout() ###END BUTTONS ###SIZE FRAME self.SetMinSize(self.GetBestSize()) ##Please check this because without this the size it is not the min self.SetClientSize(self.GetBestSize()) ###END SIZE def _layout(self): """Set the layout""" panelsizer = wx.GridBagSizer(1, 1) mainsizer = wx.BoxSizer(wx.VERTICAL) ###CONFILES confilesSizer = wx.StaticBoxSizer(self.confilesBox, wx.HORIZONTAL) confilesSizer.Add(item=self.listfileBox, proportion=1, flag=wx.EXPAND) ###END CONFILES ###BUTTONS buttonSizer = wx.BoxSizer(wx.HORIZONTAL) buttonSizer.Add(item=self.btn_new, flag=wx.ALL, border=5) buttonSizer.Add(item=self.btn_rename, flag=wx.ALL, border=5) buttonSizer.Add(item=self.btn_view, flag=wx.ALL, border=5) buttonSizer.Add(item=self.btn_remove, flag=wx.ALL, border=5) buttonSizer.Add(item=self.btn_help, flag=wx.ALL, border=5) buttonSizer.Add(item=self.btn_close, flag=wx.ALL, border=5) ###END BUTTONS #add listbox to staticbox panelsizer.Add(item=confilesSizer, pos=(0, 0), flag=wx.EXPAND, border=3) #add panel and buttons mainsizer.Add(item=self.panel, proportion=1, flag=wx.EXPAND, border=3) mainsizer.Add(item=buttonSizer, proportion=0, flag=wx.EXPAND, border=3) panelsizer.AddGrowableRow(0) panelsizer.AddGrowableCol(0) self.panel.SetAutoLayout(True) self.panel.SetSizerAndFit(panelsizer) self.SetSizer(mainsizer) self.Layout() def ListFiles(self): """Check the configuration files inside the path""" # list of configuration file listfiles = [] #return all the configuration files in self.rlipath, check if there are #link or directory and doesn't add them for l in os.listdir(self.rlipath): if os.path.isfile(os.path.join(self.rlipath, l)): listfiles.append(l) return sorted(listfiles) def OnClose(self, event): """Close window""" self.Destroy() def OnHelp(self, event): """Launches help""" gcmd.RunCommand('g.manual', parent=self, entry='wxGUI.rlisetup') def OnRemove(self, event): """Remove configuration file from path and update the list""" confile = self.listfiles[self.listfileBox.GetSelections()[0]] dlg = wx.MessageDialog(parent=self.parent, message=_("Do you want remove r.li " \ "configuration file <%s>?") % confile, caption=_("Remove new r.li configuration file?"), style=wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION) if dlg.ShowModal() == wx.ID_YES: self.listfileBox.Delete(self.listfileBox.GetSelections()[0]) try_remove(os.path.join(self.rlipath, confile)) self.listfiles = self.ListFiles() dlg.Destroy() return def OnNew(self, event): """Remove configuration file from path and update the list""" RLIWizard(self) self.listfiles = self.ListFiles() self.listfileBox.Clear() self.listfileBox.Set(self.listfiles) def OnRename(self, event): """Rename an existing configuration file""" try: confile = self.listfiles[self.listfileBox.GetSelections()[0]] except: gcmd.GMessage(parent=self, message=_("You have to select a configuration file")) return dlg = wx.TextEntryDialog(parent=self.parent, message=_('Set the new name for %s " \ "configuration file') % confile, caption=_('Rename configuration file')) if dlg.ShowModal() == wx.ID_OK: res = dlg.GetValue() newname = "%s%s%s" % (self.rlipath, os.sep, res) os.rename(os.path.join(self.rlipath, confile), newname) self.listfiles = self.ListFiles() self.listfileBox.Clear() self.listfileBox.Set(self.listfiles) def OnView(self, event): """Show and edit a configuration file""" try: confile = self.listfiles[self.listfileBox.GetSelections()[0]] except: gcmd.GMessage(parent=self, message=_("You have to select a configuration file")) return frame = ViewFrame(self, conf=confile) frame.Show()