def addRow(self, row, rowLabel=None): """Add one row of info, either header (col names) or normal data Adds items sequentially; FlexGridSizer moves to next row automatically """ labelBox = wx.BoxSizer(wx.HORIZONTAL) if not rowLabel: if sys.platform == 'darwin': self.SetWindowVariant(variant=wx.WINDOW_VARIANT_SMALL) label = _translate('cond %s:') % str(row + 1 - int(self.hasHeader)).zfill(2) rowLabel = wx.StaticText(self, -1, label=label) rowLabel.SetForegroundColour(darkgrey) if sys.platform == 'darwin': self.SetWindowVariant(variant=wx.WINDOW_VARIANT_NORMAL) labelBox.Add(rowLabel, 1, flag=wx.ALIGN_RIGHT | wx.ALIGN_BOTTOM) self.sizer.Add(labelBox, 1, flag=wx.ALIGN_CENTER) lastRow = [] for col in range(self.cols): # get the item, as unicode for display purposes: if len(str(self.grid[row][col])): # want 0, for example item = str(self.grid[row][col]) else: item = u'' # make a textbox: field = ExpandoTextCtrl(self, -1, item, size=(self.colSizes[col], 20)) field.Bind(EVT_ETC_LAYOUT_NEEDED, self.onNeedsResize) field.SetMaxHeight(100) # ~ 5 lines if self.hasHeader and row == 0: # add a default column name (header) if none provided header = self.grid[0] if item.strip() == '': c = col while self.colName(c) in header: c += 1 field.SetValue(self.colName(c)) field.SetForegroundColour(darkblue) # dark blue # or (self.parent and if not valid_var_re.match(field.GetValue()): # self.parent.exp.namespace.exists(field.GetValue()) ): # was always red when preview .xlsx file -- in # namespace already is fine if self.fixed: field.SetForegroundColour("Red") field.SetToolTip( wx.ToolTip( _translate( 'Should be legal as a variable name (alphanumeric)' ))) field.Bind(wx.EVT_TEXT, self.checkName) elif self.fixed: field.SetForegroundColour(darkgrey) field.SetBackgroundColour(white) # warn about whitespace unless will be auto-removed. invisible, # probably spurious: if (self.fixed or not self.clean) and item != item.strip(): field.SetForegroundColour('Red') # also used in show(): self.warning = _translate('extra white-space') field.SetToolTip(wx.ToolTip(self.warning)) if self.fixed: field.Disable() lastRow.append(field) self.sizer.Add(field, 1) self.inputFields.append(lastRow) if self.hasHeader and row == 0: self.header = lastRow
class TestFrame(wx.Frame): def __init__(self, parent, log): wx.Frame.__init__(self, parent, title="Test ExpandoTextCtrl") self.log = log self.pnl = p = wx.Panel(self) self.eom = ExpandoTextCtrl( p, size=(250, -1), value="This control will expand as you type") self.Bind(EVT_ETC_LAYOUT_NEEDED, self.OnRefit, self.eom) # create some buttons and sizers to use in testing some # features and also the layout vBtnSizer = wx.BoxSizer(wx.VERTICAL) btn = wx.Button(p, -1, "Set MaxHeight") self.Bind(wx.EVT_BUTTON, self.OnSetMaxHeight, btn) vBtnSizer.Add(btn, 0, wx.ALL | wx.EXPAND, 5) btn = wx.Button(p, -1, "Set Font") self.Bind(wx.EVT_BUTTON, self.OnSetFont, btn) vBtnSizer.Add(btn, 0, wx.ALL | wx.EXPAND, 5) btn = wx.Button(p, -1, "Write Text") self.Bind(wx.EVT_BUTTON, self.OnWriteText, btn) vBtnSizer.Add(btn, 0, wx.ALL | wx.EXPAND, 5) btn = wx.Button(p, -1, "Append Text") self.Bind(wx.EVT_BUTTON, self.OnAppendText, btn) vBtnSizer.Add(btn, 0, wx.ALL | wx.EXPAND, 5) btn = wx.Button(p, -1, "Set Value") self.Bind(wx.EVT_BUTTON, self.OnSetValue, btn) vBtnSizer.Add(btn, 0, wx.ALL | wx.EXPAND, 5) btn = wx.Button(p, -1, "Get Value") self.Bind(wx.EVT_BUTTON, self.OnGetValue, btn) vBtnSizer.Add(btn, 0, wx.ALL | wx.EXPAND, 5) for x in range(3): btn = wx.Button(p, -1, " ") vBtnSizer.Add(btn, 0, wx.ALL | wx.EXPAND, 5) self.Bind(wx.EVT_BUTTON, self.OnOtherBtn, btn) hBtnSizer = wx.BoxSizer(wx.HORIZONTAL) for x in range(3): btn = wx.Button(p, -1, " ") hBtnSizer.Add(btn, 0, wx.ALL, 5) self.Bind(wx.EVT_BUTTON, self.OnOtherBtn, btn) sizer = wx.BoxSizer(wx.HORIZONTAL) col1 = wx.BoxSizer(wx.VERTICAL) col1.Add(self.eom, 0, wx.ALL, 10) col1.Add(hBtnSizer) sizer.Add(col1) sizer.Add(vBtnSizer) p.SetSizer(sizer) # Put the panel in a sizer for the frame so we can use self.Fit() frameSizer = wx.BoxSizer() frameSizer.Add(p, 1, wx.EXPAND) self.SetSizer(frameSizer) self.Fit() def OnRefit(self, evt): # The Expando control will redo the layout of the # sizer it belongs to, but sometimes this may not be # enough, so it will send us this event so we can do any # other layout adjustments needed. In this case we'll # just resize the frame to fit the new needs of the sizer. self.Fit() def OnSetMaxHeight(self, evt): mh = self.eom.GetMaxHeight() dlg = wx.NumberEntryDialog(self, "", "Enter new max height:", "MaxHeight", mh, -1, 1000) if dlg.ShowModal() == wx.ID_OK: self.eom.SetMaxHeight(dlg.GetValue()) dlg.Destroy() def OnSetFont(self, evt): dlg = wx.FontDialog(self, wx.FontData()) dlg.GetFontData().SetInitialFont(self.eom.GetFont()) if dlg.ShowModal() == wx.ID_OK: self.eom.SetFont(dlg.GetFontData().GetChosenFont()) dlg.Destroy() def OnWriteText(self, evt): self.eom.WriteText("\nThis is a test... Only a test. If this had " "been a real emergency you would have seen the " "quick brown fox jump over the lazy dog.\n") def OnAppendText(self, evt): self.eom.AppendText("\nAppended text.") def OnSetValue(self, evt): self.eom.SetValue("A new value.") def OnGetValue(self, evt): self.log.write("-----------------\n" + self.eom.GetValue()) def OnOtherBtn(self, evt): # just for testing... #print(self.eom.numLines) self.eom._adjustCtrl()