/[thuban]/branches/WIP-pyshapelib-bramz/Thuban/UI/join.py
ViewVC logotype

Diff of /branches/WIP-pyshapelib-bramz/Thuban/UI/join.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/thuban/Thuban/UI/join.py revision 1072 by bh, Tue May 27 16:47:48 2003 UTC branches/WIP-pyshapelib-bramz/Thuban/UI/join.py revision 2734 by bramz, Thu Mar 1 12:42:59 2007 UTC
# Line 5  Line 5 
5  # This program is free software under the GPL (>=v2)  # This program is free software under the GPL (>=v2)
6  # Read the file COPYING coming with Thuban for details.  # Read the file COPYING coming with Thuban for details.
7    
8    """The layer and table join dialog"""
9    
10    __version__ = "$Revision$"
11    # $Source$
12    # $Id$
13    
14    
15  import sys  import sys
16  from wxPython.wx import *  import wx
17    
18  from Thuban import _  from Thuban import _
19    
# Line 14  from Thuban.Model.transientdb import Tra Line 21  from Thuban.Model.transientdb import Tra
21  from Thuban.Model.data import DerivedShapeStore  from Thuban.Model.data import DerivedShapeStore
22  from Thuban.UI.tableview import QueryTableFrame  from Thuban.UI.tableview import QueryTableFrame
23    
24    from common import ThubanBeginBusyCursor, ThubanEndBusyCursor
25    
26  ID_LEFT_TABLE = 4001  ID_LEFT_TABLE = 4001
27  ID_RIGHT_TABLE = 4002  ID_RIGHT_TABLE = 4002
28    
29  CHOICE_WIDTH = 150  CHOICE_WIDTH = 150
30    
31  class JoinDialog(wxDialog):  class JoinDialog(wx.Dialog):
32    
33      """Table join dialog.      """Table join dialog.
34    
# Line 28  class JoinDialog(wxDialog): Line 37  class JoinDialog(wxDialog):
37      """      """
38    
39      def __init__(self, parent, title, session, layer = None):      def __init__(self, parent, title, session, layer = None):
40          wxDialog.__init__(self, parent, -1, title,          wx.Dialog.__init__(self, parent, -1, title,
41                            style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER)                            style = wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER)
42          self.layer = layer          self.layer = layer
43    
44          if not layer:          if not layer:
45              self.choice_left_table = wxChoice(self, ID_LEFT_TABLE)              self.choice_left_table = wx.Choice(self, ID_LEFT_TABLE)
46              width, height = self.choice_left_table.GetSizeTuple()              width, height = self.choice_left_table.GetSizeTuple()
47              self.choice_left_table.SetSize(wxSize(CHOICE_WIDTH, height))              self.choice_left_table.SetSize(wx.Size(CHOICE_WIDTH, height))
48              self.left_table = None              self.left_table = None
49          else:          else:
50              self.choice_left_table = None              self.choice_left_table = None
51              self.left_table = layer.ShapeStore().Table()              self.left_table = layer.ShapeStore().Table()
52    
53          self.choice_right_table = wxChoice(self, ID_RIGHT_TABLE)          self.choice_right_table = wx.Choice(self, ID_RIGHT_TABLE)
54          width, height = self.choice_right_table.GetSizeTuple()          width, height = self.choice_right_table.GetSizeTuple()
55          self.choice_right_table.SetSize(wxSize(CHOICE_WIDTH, height))          self.choice_right_table.SetSize(wx.Size(CHOICE_WIDTH, height))
56    
57          self.choice_left_field = wxChoice(self, -1)          self.choice_left_field = wx.Choice(self, -1)
58          width, height = self.choice_left_field.GetSizeTuple()          width, height = self.choice_left_field.GetSizeTuple()
59          self.choice_left_field.SetSize(wxSize(CHOICE_WIDTH, height))          self.choice_left_field.SetSize(wx.Size(CHOICE_WIDTH, height))
60          self.choice_right_field = wxChoice(self, -1)          self.choice_right_field = wx.Choice(self, -1)
61          width, height = self.choice_right_field.GetSizeTuple()          width, height = self.choice_right_field.GetSizeTuple()
62          self.choice_right_field.SetSize(wxSize(CHOICE_WIDTH, height))          self.choice_right_field.SetSize(wx.Size(CHOICE_WIDTH, height))
63    
64          self.button_join = wxButton(self, wxID_OK, _("Join"))          self.button_join = wx.Button(self, wx.ID_OK, _("Join"))
65          self.button_join.SetDefault()          self.button_join.SetDefault()
66          self.button_close = wxButton(self, wxID_CANCEL, _("Close"))          self.button_close = wx.Button(self, wx.ID_CANCEL, _("Close"))
67    
68          EVT_BUTTON(self, wxID_OK, self.OnJoin)          self.Bind(wx.EVT_BUTTON, self.OnJoin, id=wx.ID_OK)
69    
70          if self.choice_left_table is not None:          if self.choice_left_table is not None:
71              self.choice_left_table.Append('Select ...', None)              self.choice_left_table.Append(_('Select...'), None)
72          self.choice_right_table.Append('Select ...', None)          self.choice_right_table.Append(_('Select...'), None)
73    
74          for t in session.Tables():          for t in session.Tables():
75              if self.choice_left_table is not None:              if self.choice_left_table is not None:
76                  self.choice_left_table.Append(t.transient_table().Title(), t)                  self.choice_left_table.Append(t.Title(), t)
77    
78              # If there is no choice_left_table then self.left_table will              # If there is no choice_left_table then self.left_table will
79              # be the keft table so we can simply leave it out on the              # be the keft table so we can simply leave it out on the
80              # right side.              # right side.
81              if t is not self.left_table:              if t is not self.left_table:
82                  self.choice_right_table.Append(t.transient_table().Title(), t)                  self.choice_right_table.Append(t.Title(), t)
83    
84          if self.choice_left_table is None:          if self.choice_left_table is None:
85              for col in self.left_table.Columns():              for col in self.left_table.Columns():
86                  self.choice_left_field.Append(col.name, col)                  self.choice_left_field.Append(col.name, col)
87    
88          if self.choice_left_table is not None:          if self.choice_left_table is not None:
89              EVT_CHOICE(self, ID_LEFT_TABLE, self.OnLeftTable)              self.Bind(wx.EVT_CHOICE, self.OnLeftTable, id=ID_LEFT_TABLE)
90          EVT_CHOICE(self, ID_RIGHT_TABLE, self.OnRightTable)          self.Bind(wx.EVT_CHOICE, self.OnRightTable, id=ID_RIGHT_TABLE)
91    
92          if self.choice_left_table is not None:          if self.choice_left_table is not None:
93              self.choice_left_table.SetSelection(0)              self.choice_left_table.SetSelection(0)
94          self.choice_right_table.SetSelection(0)          self.choice_right_table.SetSelection(0)
95          self.button_join.Enable(False)          self.button_join.Enable(False)
96    
97          topBox = wxBoxSizer(wxVERTICAL)          topBox = wx.BoxSizer(wx.VERTICAL)
98    
99          sizer = wxFlexGridSizer(2, 4)          sizer = wx.FlexGridSizer(2, 4)
100          sizer.Add(wxStaticText(self, -1, _("Table:")), 0, wxALL, 4)          sizer.Add(wx.StaticText(self, -1, _("Table:")), 0, wx.ALL, 4)
101          if self.choice_left_table is not None:          if self.choice_left_table is not None:
102              sizer.Add(self.choice_left_table, 1,              sizer.Add(self.choice_left_table, 1,
103                        wxEXPAND|wxALL|wxALIGN_CENTER_VERTICAL, 4)                        wx.EXPAND|wx.ALL|wx.ALIGN_CENTER_VERTICAL, 4)
104          else:          else:
105              sizer.Add(wxStaticText(self, -1, self.left_table.Title()), 0,              sizer.Add(wx.StaticText(self, -1, self.left_table.Title()), 0,
106                        wxALL, 4)                        wx.ALL, 4)
107    
108          sizer.Add(wxStaticText(self, -1, _("Table:")), 0, wxALL, 4)          sizer.Add(wx.StaticText(self, -1, _("Table:")), 0, wx.ALL, 4)
109          sizer.Add(self.choice_right_table, 1,          sizer.Add(self.choice_right_table, 1,
110                    wxEXPAND|wxALL|wxALIGN_CENTER_VERTICAL, 4)                    wx.EXPAND|wx.ALL|wx.ALIGN_CENTER_VERTICAL, 4)
111          sizer.Add(wxStaticText(self, -1, _("Field:")), 0, wxALL, 4)          sizer.Add(wx.StaticText(self, -1, _("Field:")), 0, wx.ALL, 4)
112          sizer.Add(self.choice_left_field, 1,          sizer.Add(self.choice_left_field, 1,
113                    wxEXPAND|wxALL|wxALIGN_CENTER_VERTICAL, 4)                    wx.EXPAND|wx.ALL|wx.ALIGN_CENTER_VERTICAL, 4)
114          sizer.Add(wxStaticText(self, -1, _("Field:")), 0, wxALL, 4)          sizer.Add(wx.StaticText(self, -1, _("Field:")), 0, wx.ALL, 4)
115          sizer.Add(self.choice_right_field, 1,          sizer.Add(self.choice_right_field, 1,
116                    wxEXPAND|wxALL|wxALIGN_CENTER_VERTICAL, 4)                    wx.EXPAND|wx.ALL|wx.ALIGN_CENTER_VERTICAL, 4)
117    
118          sizer.AddGrowableCol(1)          sizer.AddGrowableCol(1)
119          sizer.AddGrowableCol(3)          sizer.AddGrowableCol(3)
120    
121          topBox.Add(sizer, 0, wxEXPAND|wxALL, 4)          topBox.Add(sizer, 0, wx.EXPAND|wx.ALL, 4)
122    
123          sizer = wxBoxSizer(wxHORIZONTAL)          sizer = wx.BoxSizer(wx.HORIZONTAL)
124          self.check_outer_join = wxCheckBox(self,-1,          self.check_outer_join = wx.CheckBox(self,-1,
125                                  _("Outer Join (preserves left table records)"))                                  _("Outer Join (preserves left table records)"))
126          sizer.Add(self.check_outer_join, 1, wxALL,4)          sizer.Add(self.check_outer_join, 1, wx.ALL,4)
127          topBox.Add(sizer, 0, wxALIGN_LEFT|wxALIGN_TOP, 4)          topBox.Add(sizer, 0, wx.ALIGN_LEFT|wx.ALIGN_TOP, 4)
128    
129          sizer = wxBoxSizer(wxHORIZONTAL)          sizer = wx.BoxSizer(wx.HORIZONTAL)
130          sizer.Add(self.button_join, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM|wxRIGHT,          sizer.Add(self.button_join, 0, wx.ALIGN_RIGHT|wx.ALIGN_BOTTOM|wx.RIGHT,
131                    10)                    10)
132          sizer.Add(self.button_close, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM|wxRIGHT,          sizer.Add(self.button_close, 0, wx.ALIGN_RIGHT|wx.ALIGN_BOTTOM|wx.RIGHT,
133                    10)                    10)
134    
135          topBox.Add(sizer, 1, wxALIGN_RIGHT|wxALIGN_BOTTOM|wxBOTTOM|wxTOP, 10)          topBox.Add(sizer, 1, wx.ALIGN_RIGHT|wx.ALIGN_BOTTOM|wx.BOTTOM|wx.TOP, 10)
136    
137          self.SetAutoLayout(True)          self.SetAutoLayout(True)
138          self.SetSizer(topBox)          self.SetSizer(topBox)
# Line 136  class JoinDialog(wxDialog): Line 145  class JoinDialog(wxDialog):
145    
146      def OnJoin(self, event):      def OnJoin(self, event):
147          """Get the table and field selections and perform the join."""          """Get the table and field selections and perform the join."""
148          # left          ThubanBeginBusyCursor()
149          if self.choice_left_table is not None:          try:
150              i = self.choice_left_table.GetSelection()              # left
151              left_table = self.choice_left_table.GetClientData(i)              if self.choice_left_table is not None:
152          else:                  i = self.choice_left_table.GetSelection()
153              left_table = self.left_table                  left_table = self.choice_left_table.GetClientData(i)
154          i = self.choice_left_field.GetSelection()              else:
155          left_field  = self.choice_left_field.GetString(i)                  left_table = self.left_table
156          # right              i = self.choice_left_field.GetSelection()
157          i = self.choice_right_table.GetSelection()              left_field  = self.choice_left_field.GetString(i)
158          right_table = self.choice_right_table.GetClientData(i)              # right
159          i = self.choice_right_field.GetSelection()              i = self.choice_right_table.GetSelection()
160          right_field  = self.choice_right_field.GetString(i)              right_table = self.choice_right_table.GetClientData(i)
161                i = self.choice_right_field.GetSelection()
162                right_field  = self.choice_right_field.GetString(i)
163    
164                outer_join = self.check_outer_join.IsChecked()
165    
166                try:
167                    joined_table = TransientJoinedTable(self.session.TransientDB(),
168                                                        left_table, left_field,
169                                                        right_table, right_field,
170                                                        outer_join)
171                except:
172                    dlg = wx.MessageDialog(None,
173                                          _('Join failed:\n  %s') % sys.exc_info()[1],
174                                          _('Info'), wx.OK|wx.ICON_ERROR)
175                    dlg.ShowModal()
176                    dlg.Destroy()
177                    return
178    
179          outer_join = self.check_outer_join.IsChecked()              joined_table = self.session.AddTable(joined_table)
180    
181          try:              if self.layer is not None:
182              joined_table = TransientJoinedTable(self.session.TransientDB(),                  needed_rows = self.layer.ShapeStore().Table().NumRows()
183                                                  left_table, left_field,                  joined_rows = joined_table.NumRows()
184                                                  right_table, right_field,                  if needed_rows == joined_rows:
185                                                  outer_join)                      store = DerivedShapeStore(self.layer.ShapeStore(),
186          except:                                            joined_table)
187              dlg = wxMessageDialog(None,                      self.session.AddShapeStore(store)
188                                    _('Join failed:\n  %s') % sys.exc_info()[1],                      self.layer.SetShapeStore(store)
189                                    _('Info'), wxOK|wxICON_ERROR)  
190              dlg.ShowModal()          finally:
191              dlg.Destroy()              ThubanEndBusyCursor()
             return  
192    
         joined_table = self.session.AddTable(joined_table)  
193          if self.layer is not None:          if self.layer is not None:
             needed_rows = self.layer.ShapeStore().Table().NumRows()  
             joined_rows = joined_table.NumRows()  
194              if needed_rows != joined_rows:              if needed_rows != joined_rows:
195                  msg = _("The joined table has %(joined)d rows but "                  msg = _("The joined table has %(joined)d rows but"
196                          "it must have %(needed)d rows"                          " it must have %(needed)d rows"
197                          "to be used with the selected layer") \                          " to be used with the selected layer") \
198                          % {"joined": joined_rows,                          % {"joined": joined_rows,
199                             "needed": needed_rows}                             "needed": needed_rows}
200                  dlg = wxMessageDialog(None, msg, _('Join Failed'),                  dlg = wx.MessageDialog(None, msg, _('Join Failed'),
201                                        wxOK|wxICON_ERROR)                                        wx.OK|wx.ICON_ERROR)
202                  dlg.ShowModal()                  dlg.ShowModal()
203                  dlg.Destroy()                  dlg.Destroy()
204                  return                  return
205              else:  
                 store = DerivedShapeStore(self.layer.ShapeStore(),  
                                           joined_table)  
                 self.session.AddShapeStore(store)  
                 self.layer.SetShapeStore(store)  
206          else:          else:
207              name = joined_table.tablename              name = joined_table.tablename
208              dialog = QueryTableFrame(self.parent, name,              dialog = QueryTableFrame(self.parent, name,

Legend:
Removed from v.1072  
changed lines
  Added in v.2734

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26