manager.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. """!
  2. @package dbmgr.manager
  3. @brief GRASS Attribute Table Manager
  4. This program is based on FileHunter, published in 'The wxPython Linux
  5. Tutorial' on wxPython WIKI pages.
  6. It also uses some functions at
  7. http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/426407
  8. @code
  9. python dbm.py vector@mapset
  10. @endcode
  11. List of classes:
  12. - manager::AttributeManager
  13. (C) 2007-2009, 2011-2012 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.
  16. @author Jachym Cepicky <jachym.cepicky gmail.com>
  17. @author Martin Landa <landa.martin gmail.com>
  18. @author Refactoring by Stepan Turek <stepan.turek seznam.cz> (GSoC 2012, mentor: Martin Landa)"""
  19. import sys
  20. import os
  21. if __name__ == "__main__":
  22. sys.path.append(os.path.join(os.getenv('GISBASE'), 'etc', 'gui', 'wxpython'))
  23. from core import globalvar
  24. import wx
  25. import wx.lib.flatnotebook as FN
  26. import grass.script as grass
  27. from core.gcmd import GMessage
  28. from core.debug import Debug
  29. from dbmgr.base import DbMgrBase
  30. from gui_core.widgets import GNotebook
  31. class AttributeManager(wx.Frame, DbMgrBase):
  32. def __init__(self, parent, id = wx.ID_ANY,
  33. title = None, vectorName = None, item = None, log = None,
  34. selection = None, **kwargs):
  35. """!GRASS Attribute Table Manager window
  36. @param parent parent window
  37. @param id window id
  38. @param title window title or None for default title
  39. @param vetorName name of vector map
  40. @param item item from Layer Tree
  41. @param log log window
  42. @param selection name of page to be selected
  43. @param kwagrs other wx.Frame's arguments
  44. """
  45. self.parent = parent
  46. try:
  47. mapdisplay = self.parent.GetMapDisplay()
  48. except:
  49. mapdisplay = None
  50. DbMgrBase.__init__(self, id = id, mapdisplay = mapdisplay,
  51. vectorName = vectorName, item = item,
  52. log = log, statusbar = self,
  53. **kwargs)
  54. wx.Frame.__init__(self, parent, id, *kwargs)
  55. # title
  56. if not title:
  57. title = "%s" % _("GRASS GIS Attribute Table Manager - ")
  58. if not self.dbMgrData['editable']:
  59. title += _("READONLY - ")
  60. title += "<%s>" % (self.dbMgrData['vectName'])
  61. self.SetTitle(title)
  62. # icon
  63. self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass_sql.ico'), wx.BITMAP_TYPE_ICO))
  64. self.panel = wx.Panel(parent = self, id = wx.ID_ANY)
  65. if len(self.dbMgrData['mapDBInfo'].layers.keys()) == 0:
  66. GMessage(parent = self.parent,
  67. message = _("Database connection for vector map <%s> "
  68. "is not defined in DB file. "
  69. "You can define new connection in "
  70. "'Manage layers' tab.") % self.dbMgrData['vectName'])
  71. self.CreateStatusBar(number = 1)
  72. self.notebook = GNotebook(self.panel, style = globalvar.FNPageDStyle)
  73. self.CreateDbMgrPage(parent = self, pageName = 'browse')
  74. self.notebook.AddPage(page = self.pages['browse'], text = _("Browse data"),
  75. name = 'browse')
  76. self.pages['browse'].SetTabAreaColour(globalvar.FNPageColor)
  77. self.CreateDbMgrPage(parent = self, pageName = 'manageTable')
  78. self.notebook.AddPage(page = self.pages['manageTable'], text = _("Manage tables"),
  79. name = 'table')
  80. self.pages['manageTable'].SetTabAreaColour(globalvar.FNPageColor)
  81. self.CreateDbMgrPage(parent = self, pageName = 'manageLayer')
  82. self.notebook.AddPage(page = self.pages['manageLayer'], text = _("Manage layers"),
  83. name = 'layers')
  84. if selection:
  85. wx.CallAfter(self.notebook.SetSelectionByName, selection)
  86. else:
  87. wx.CallAfter(self.notebook.SetSelection, 0) # select browse tab
  88. # buttons
  89. self.btnQuit = wx.Button(parent = self.panel, id = wx.ID_EXIT)
  90. self.btnQuit.SetToolTipString(_("Close Attribute Table Manager"))
  91. self.btnReload = wx.Button(parent = self.panel, id = wx.ID_REFRESH)
  92. self.btnReload.SetToolTipString(_("Reload attribute data (selected layer only)"))
  93. # events
  94. self.btnQuit.Bind(wx.EVT_BUTTON, self.OnCloseWindow)
  95. self.btnReload.Bind(wx.EVT_BUTTON, self.pages['browse'].OnDataReload)
  96. self.notebook.Bind(FN.EVT_FLATNOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
  97. self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
  98. # do layout
  99. self._layout()
  100. # self.SetMinSize(self.GetBestSize())
  101. self.SetSize((700, 550)) # FIXME hard-coded size
  102. self.SetMinSize(self.GetSize())
  103. def _layout(self):
  104. """!Do layout"""
  105. # frame body
  106. mainSizer = wx.BoxSizer(wx.VERTICAL)
  107. # buttons
  108. btnSizer = wx.BoxSizer(wx.HORIZONTAL)
  109. btnSizer.Add(item = self.btnReload, proportion = 1,
  110. flag = wx.ALL | wx.ALIGN_RIGHT, border = 5)
  111. btnSizer.Add(item = self.btnQuit, proportion = 1,
  112. flag = wx.ALL | wx.ALIGN_RIGHT, border = 5)
  113. mainSizer.Add(item = self.notebook, proportion = 1, flag = wx.EXPAND)
  114. mainSizer.Add(item = btnSizer, flag = wx.ALIGN_RIGHT | wx.ALL, border = 5)
  115. self.panel.SetAutoLayout(True)
  116. self.panel.SetSizer(mainSizer)
  117. mainSizer.Fit(self.panel)
  118. self.Layout()
  119. def OnCloseWindow(self, event):
  120. """!Cancel button pressed"""
  121. if self.parent and self.parent.GetName() == 'LayerManager':
  122. # deregister ATM
  123. self.parent.dialogs['atm'].remove(self)
  124. if not isinstance(event, wx.CloseEvent):
  125. self.Destroy()
  126. event.Skip()
  127. def OnPageChanged(self, event):
  128. """!On page in ATM is changed"""
  129. try:
  130. if self.pages["browse"]:
  131. selPage = self.pages["browse"].selLayer
  132. id = self.pages["browse"].layerPage[selPage]['data']
  133. else:
  134. id = None
  135. except KeyError:
  136. id = None
  137. if event.GetSelection() == self.notebook.GetPageIndexByName('browse') and id:
  138. win = self.FindWindowById(id)
  139. if win:
  140. self.log.write(_("Number of loaded records: %d") % win.GetItemCount())
  141. else:
  142. self.log.write("")
  143. self.btnReload.Enable()
  144. else:
  145. self.log.write("")
  146. self.btnReload.Enable(False)
  147. event.Skip()
  148. def OnTextEnter(self, event):
  149. pass
  150. def UpdateDialog(self, layer):
  151. """!Updates dialog layout for given layer"""
  152. DbMgrBase.UpdateDialog(self, layer = layer)
  153. # set current page selection
  154. self.notebook.SetSelectionByName('layers')
  155. def main(argv = None):
  156. import gettext
  157. gettext.install('grasswxpy', os.path.join(os.getenv("GISBASE"), 'locale'), unicode = True)
  158. if argv is None:
  159. argv = sys.argv
  160. if len(argv) != 2:
  161. print >> sys.stderr, __doc__
  162. sys.exit()
  163. #some applications might require image handlers
  164. wx.InitAllImageHandlers()
  165. app = wx.PySimpleApp()
  166. f = AttributeManager(parent = None, id = wx.ID_ANY,
  167. title = "%s - <%s>" % (_("GRASS GIS Attribute Table Manager"),
  168. argv[1]),
  169. size = (900,600), vectorName = argv[1])
  170. f.Show()
  171. app.MainLoop()
  172. if __name__ == '__main__':
  173. main()