manager.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  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. List of classes:
  9. - manager::AttributeManager
  10. (C) 2007-2009, 2011-2012 by the GRASS Development Team
  11. This program is free software under the GNU General Public License
  12. (>=v2). Read the file COPYING that comes with GRASS for details.
  13. @author Jachym Cepicky <jachym.cepicky gmail.com>
  14. @author Martin Landa <landa.martin gmail.com>
  15. @author Refactoring by Stepan Turek <stepan.turek seznam.cz> (GSoC 2012, mentor: Martin Landa)
  16. """
  17. import sys
  18. import os
  19. import wx
  20. import wx.lib.flatnotebook as FN
  21. import grass.script as grass
  22. from core import globalvar
  23. from core.gcmd import GMessage
  24. from core.debug import Debug
  25. from dbmgr.base import DbMgrBase
  26. from gui_core.widgets import GNotebook
  27. class AttributeManager(wx.Frame, DbMgrBase):
  28. def __init__(self, parent, id = wx.ID_ANY,
  29. title = None, vectorName = None, item = None, log = None,
  30. selection = None, **kwargs):
  31. """!GRASS Attribute Table Manager window
  32. @param parent parent window
  33. @param id window id
  34. @param title window title or None for default title
  35. @param vetorName name of vector map
  36. @param item item from Layer Tree
  37. @param log log window
  38. @param selection name of page to be selected
  39. @param kwagrs other wx.Frame's arguments
  40. """
  41. self.parent = parent
  42. try:
  43. mapdisplay = self.parent.GetMapDisplay()
  44. except:
  45. mapdisplay = None
  46. DbMgrBase.__init__(self, id = id, mapdisplay = mapdisplay,
  47. vectorName = vectorName, item = item,
  48. log = log, statusbar = self,
  49. **kwargs)
  50. wx.Frame.__init__(self, parent, id, *kwargs)
  51. # title
  52. if not title:
  53. title = "%s" % _("GRASS GIS Attribute Table Manager - ")
  54. if not self.dbMgrData['editable']:
  55. title += _("READONLY - ")
  56. title += "<%s>" % (self.dbMgrData['vectName'])
  57. self.SetTitle(title)
  58. # icon
  59. self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass_sql.ico'), wx.BITMAP_TYPE_ICO))
  60. self.panel = wx.Panel(parent = self, id = wx.ID_ANY)
  61. if len(self.dbMgrData['mapDBInfo'].layers.keys()) == 0:
  62. GMessage(parent = self.parent,
  63. message = _("Database connection for vector map <%s> "
  64. "is not defined in DB file. "
  65. "You can define new connection in "
  66. "'Manage layers' tab.") % self.dbMgrData['vectName'])
  67. self.CreateStatusBar(number = 1)
  68. self.notebook = GNotebook(self.panel, style = globalvar.FNPageDStyle)
  69. self.CreateDbMgrPage(parent = self, pageName = 'browse')
  70. self.notebook.AddPage(page = self.pages['browse'], text = _("Browse data"),
  71. name = 'browse')
  72. self.pages['browse'].SetTabAreaColour(globalvar.FNPageColor)
  73. self.CreateDbMgrPage(parent = self, pageName = 'manageTable')
  74. self.notebook.AddPage(page = self.pages['manageTable'], text = _("Manage tables"),
  75. name = 'table')
  76. self.pages['manageTable'].SetTabAreaColour(globalvar.FNPageColor)
  77. self.CreateDbMgrPage(parent = self, pageName = 'manageLayer')
  78. self.notebook.AddPage(page = self.pages['manageLayer'], text = _("Manage layers"),
  79. name = 'layers')
  80. if selection:
  81. wx.CallAfter(self.notebook.SetSelectionByName, selection)
  82. else:
  83. wx.CallAfter(self.notebook.SetSelection, 0) # select browse tab
  84. # buttons
  85. self.btnClose = wx.Button(parent = self.panel, id = wx.ID_CLOSE)
  86. self.btnClose.SetToolTipString(_("Close Attribute Table Manager"))
  87. self.btnReload = wx.Button(parent = self.panel, id = wx.ID_REFRESH)
  88. self.btnReload.SetToolTipString(_("Reload attribute data (selected layer only)"))
  89. # events
  90. self.btnClose.Bind(wx.EVT_BUTTON, self.OnCloseWindow)
  91. self.btnReload.Bind(wx.EVT_BUTTON, self.pages['browse'].OnDataReload)
  92. self.notebook.Bind(FN.EVT_FLATNOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
  93. self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
  94. # do layout
  95. self._layout()
  96. # self.SetMinSize(self.GetBestSize())
  97. self.SetSize((700, 550)) # FIXME hard-coded size
  98. self.SetMinSize(self.GetSize())
  99. def _layout(self):
  100. """!Do layout"""
  101. # frame body
  102. mainSizer = wx.BoxSizer(wx.VERTICAL)
  103. # buttons
  104. btnSizer = wx.BoxSizer(wx.HORIZONTAL)
  105. btnSizer.Add(item = self.btnReload, proportion = 1,
  106. flag = wx.ALL | wx.ALIGN_RIGHT, border = 5)
  107. btnSizer.Add(item = self.btnClose, proportion = 1,
  108. flag = wx.ALL | wx.ALIGN_RIGHT, border = 5)
  109. mainSizer.Add(item = self.notebook, proportion = 1, flag = wx.EXPAND)
  110. mainSizer.Add(item = btnSizer, flag = wx.ALIGN_RIGHT | wx.ALL, border = 5)
  111. self.panel.SetAutoLayout(True)
  112. self.panel.SetSizer(mainSizer)
  113. mainSizer.Fit(self.panel)
  114. self.Layout()
  115. def OnCloseWindow(self, event):
  116. """!Cancel button pressed"""
  117. if self.parent and self.parent.GetName() == 'LayerManager':
  118. # deregister ATM
  119. self.parent.dialogs['atm'].remove(self)
  120. if not isinstance(event, wx.CloseEvent):
  121. self.Destroy()
  122. event.Skip()
  123. def OnPageChanged(self, event):
  124. """!On page in ATM is changed"""
  125. try:
  126. if self.pages["browse"]:
  127. selPage = self.pages["browse"].selLayer
  128. id = self.pages["browse"].layerPage[selPage]['data']
  129. else:
  130. id = None
  131. except KeyError:
  132. id = None
  133. if event.GetSelection() == self.notebook.GetPageIndexByName('browse') and id:
  134. win = self.FindWindowById(id)
  135. if win:
  136. self.log.write(_("Number of loaded records: %d") % win.GetItemCount())
  137. else:
  138. self.log.write("")
  139. self.btnReload.Enable()
  140. else:
  141. self.log.write("")
  142. self.btnReload.Enable(False)
  143. event.Skip()
  144. def OnTextEnter(self, event):
  145. pass
  146. def UpdateDialog(self, layer):
  147. """!Updates dialog layout for given layer"""
  148. DbMgrBase.UpdateDialog(self, layer = layer)
  149. # set current page selection
  150. self.notebook.SetSelectionByName('layers')