Example #1
0
	def onCheckSyntax(self, evt):
		ed = self.editor
		txt = ed.Value
		lns = txt.strip().splitlines()
		# Add an extra blank line to get around the trailing comment bug
		lns.append("")
		compText = "\n".join(lns)
		try:
			compile(compText, "", "exec")
			dabo.ui.exclaim(_("No syntax errors found!"), _("Compilation Succeeded"))
		except SyntaxError as e:
			errMsg = "%s" % e
			try:
				msg, num = self._syntaxLinePat.findall(errMsg)[0]
			except (ValueError, IndexError):
				msg = errMsg
				num = None
			if num is not None:
				num = int(num)
				disp = _("Error: %(msg)s\nLine: %(num)s") % locals()
				ed.LineNumber = num-3
				ed.showCurrentLine()
				ed.hiliteLine(num-1)
			else:
				disp = msg
			dabo.ui.stop(disp, _("Compilation Failed"))
Example #2
0
	def onChangeCaption(self, evt):
		nd = self.activeNode
		self.activeNode = None
		txt = dabo.ui.getString(_("New Caption"), _("Adding Child Node"),
				defaultValue=nd.Caption)
		if txt is not None:
			nd.Caption = txt
Example #3
0
	def setupSaveCancelButtons(self):
		vs = self.Sizer
		hs = dabo.ui.dSizer("h")
		hs.append(dabo.ui.dButton(self, Caption=_("Save Changes"), DefaultButton=True, OnHit=self.onSave))
		hs.appendSpacer((3,0))
		hs.append(dabo.ui.dButton(self, Caption=_("Cancel Changes"), CancelButton=True, OnHit=self.onCancel))
		vs.append(hs, alignment="right")
Example #4
0
	def onRunDesign(self, evt):
		# First, make sure that it's been saved
		try:
			fname = self.onSaveDesign(None, useTmp=True)
		except IOError as e:
			dabo.ui.info(_("Cannot write file"), title=_("Write Error"))
		if not fname or not os.path.isfile(fname):
			# Nothing was saved
			return

		pth = os.path.split(os.path.abspath(fname))[0]
		# Set the app's HomeDirectory to the location of the cdxml file.
		self.Application.HomeDirectory = pth
		if pth not in sys.path:
			sys.path.append(pth)
		if self._formMode:
			frm = dui.createForm(fname)
		else:
			frm = dui.dForm(None)
			obj = frm.addObject(fname)
			if frm.Sizer:
				frm.Sizer.append1x(obj)
				frm.Caption = _("Test form for: %s") % os.path.split(fname)[1]
				frm.layout()
		frm.TempForm = True
		frm.Visible = True
		if isinstance(frm, dlgs.Wizard):
			frm.start()
		if isinstance(frm, dabo.ui.dDialog):
			def __dlgRelease(evt):
				evt.EventObject.release()
			frm.bindEvent(dEvents.Close, __dlgRelease)
Example #5
0
    def afterInit(self):
        self.Sizer = dabo.ui.dSizer("v")
        sz = dabo.ui.dGridSizer(MaxCols=2, HGap=7, VGap=12)
        self.Sizer.append(sz, "x", border=30, valign="middle")

        # Plain textbox
        lbl = dabo.ui.dLabel(self, Caption=_("Plain TextBox"))
        txt = dabo.ui.dTextBox(self, Name=_("PlainTextBox"), Value=_("Test it out and see"))
        txt.SelectionStart = 0
        sz.append(lbl, halign="right")
        sz.append(txt, "x")

        txt.bindEvent(dEvents.GotFocus, self.onTextGotFocus)
        txt.bindEvent(dEvents.LostFocus, self.onTextLostFocus)
        txt.bindEvent(dEvents.Destroy, self.onTextDestroy)
        txt.bindEvent(dEvents.KeyChar, self.onTextKeyChar)
        txt.bindEvent(dEvents.Hit, self.onTextHit)

        # Password textbox
        lbl = dabo.ui.dLabel(self, Caption=_("Password"))
        txt = dabo.ui.dTextBox(self, Name=_("Password TextBox"), PasswordEntry=True)
        sz.append(lbl, halign="right")
        sz.append(txt, "x")

        txt.bindEvent(dEvents.GotFocus, self.onTextGotFocus)
        txt.bindEvent(dEvents.LostFocus, self.onTextLostFocus)
        txt.bindEvent(dEvents.Destroy, self.onTextDestroy)
        txt.bindEvent(dEvents.KeyChar, self.onTextKeyChar)
        txt.bindEvent(dEvents.Hit, self.onTextHit)

        # Let the textbox column grow
        sz.setColExpand(True, 1)
        self.layout()
Example #6
0
	def getCurrentRecordText(self, dataSource=None, grid=None):
		"""Get the text to describe which record is current."""
		self.dataSourceParameter = dataSource
		if dataSource is None and grid is not None:
			# This is being called by a regular grid not tied to a bizobj
			rowCount = grid.RowCount
			rowNumber = grid.CurrentRow + 1
		else:
			bizobj = self.getBizobj(dataSource)
			if bizobj is None:
				try:
					# Some situations, such as form preview mode, will
					# store these directly, since they lack bizobjs
					rowCount = self.rowCount
					rowNumber = self.rowNumber + 1
				except AttributeError:
					rowCount = 1
					rowNumber = 1
			else:
				rowCount = bizobj.RowCount
				if rowCount > 0:
					rowNumber = bizobj.RowNumber + 1
				else:
					rowNumber = 1
		if rowCount < 1:
			return _("No records")
		return _("Record %(rowNumber)s/%(rowCount)s") % locals()
Example #7
0
	def onNewProfile(self, evt):
		base = _("New Profile")
		i = 1
		while True:
			default = "%s %s" % (base, i)
			if default in self.ddProfile.Choices:
				i += 1
			else:
				break

		name = dabo.ui.getString(_("Please enter a name for the profile"),
				defaultValue=default)
		if name is not None:
			# Defualt to the current DbType
			currDbType = self.ctlDbType.Value
			self.dbDefaults[name] = {
					"DbType" : currDbType,
					"Name" : "",
					"Host" : "",
					"Database" : "",
					"User" : "",
					"Password" : "",
					"Port" : "" }
			ddProfile = self.ddProfile
			ddProfile.Choices = self.dbDefaults.keys()
			ddProfile.Value = name
			self.ctlDbType.Value = "MySQL"
			self.ctlPort.Value = "3306"
			self.ctlDbType.setFocus()
Example #8
0
	def insert(self, index, obj, layout="normal", proportion=0, alignment=None,
			halign="left", valign="top", border=None, borderSides=None):
		"""Inserts the passed object into the sizer layout at the specified position."""
		if obj in self.ChildSizers:
			raise ValueError, _("Adding the same sizer twice is not allowed.")
		if isinstance(layout, int):
			# proportion was passed first
			layout, proportion = proportion, layout
			# in case layout wasn't specified
			if isinstance(layout, int):
				layout = "normal"

		if isinstance(obj, (int, tuple)):
			# obj is a spacer
			ret = self.addSpacer(obj, pos=index, proportion=proportion)
		else:
			# obj is the window to add to the sizer
			_wxFlags = self._getWxFlags(alignment, halign, valign, borderSides, layout)
			if border is None:
				border = self.DefaultBorder
			# If there are objects in this sizer already, add the default spacer
			addSpacer = ( len(self.GetChildren()) > 0)
			ret = szItem = self.Insert(index, obj, proportion=proportion,
					flag=_wxFlags, border=border, userData=self)
			if addSpacer:
				self.addDefaultSpacer(index)
			obj._controllingSizer = self
			obj._controllingSizerItem = szItem
			if ret.IsSizer():
				obj._parent = self._parent
		return ret
Example #9
0
	def cancel(self, dataSource=None, ignoreNoRecords=None):
		"""
		Ask the bizobj to cancel its changes.

		This will revert back to the state of the records when they were last
		requeried or saved.
		"""
		self.dataSourceParameter = dataSource
		bizobj = self.getBizobj(dataSource)
		if bizobj is None:
			# Running in preview or some other non-live mode
			return
		self.activeControlValid()
		if ignoreNoRecords is None:
			ignoreNoRecords = True

		err = self.beforeCancel()
		if err:
			self.notifyUser(err)
			return
		try:
			if self.SaveAllRows:
				bizobj.cancelAll(ignoreNoRecords=ignoreNoRecords,
						cancelTheChildren=self.CancelChildren)
			else:
				bizobj.cancel(ignoreNoRecords=ignoreNoRecords,
						cancelTheChildren=self.CancelChildren)
			self.update()
			self.setStatusText(_("Changes to %s canceled.") % (
					self.SaveAllRows and "all records" or "current record",))
		except dException.NoRecordsException, e:
			dabo.log.error(_("Cancel failed; no records to cancel."))
Example #10
0
		def createBody(self):
			self.Caption = _("This is the first page")
			lbl = dabo.ui.dLabel(self, Caption=_(
"""Are you getting excited yet???

I know that I am!!"""))
			self.Sizer.append(lbl, alignment="center")
Example #11
0
		def createBody(self):
			self.Caption = _("This is the third page")
			lbl = dabo.ui.dLabel(self, Caption=_(
"""You should only see this if you did not check
the box on Page Two.
"""))
			self.Sizer.append(lbl, alignment="center")
Example #12
0
 	def onAddSibling(self, evt):
 		nd = self.activeNode
 		self.activeNode = None
 		txt = dui.getString(_("New Node Caption?"), _("Adding Sibling Node"))
 		if txt is not None:
 			nd.parent.appendChild(txt)
 		self.Controller.updateLayout()
Example #13
0
	def showPage(self):
		if self.PageCount == 0:
			return
		if self._blankPage:
			self.pagePanel.Sizer.remove(self._blankPage)
			self._blankPage.release()
		for idx in range(self.PageCount):
			page = self._pages[idx]
			self.pagePanel.Sizer.remove(page)
			if idx == self._currentPage:
				page.Visible = True
				# Need this to keep the pages resizing correctly.
				page.Size = self.pagePanel.Size
				# Helps the pages look better under Windows
				if self.setPageColor:
					page.BackColor = self.BackColor
				self.pagePanel.Sizer.append(page, 1, "x")
				self.btnBack.Enabled = (idx > 0)
				cap = _("Next >")
				if idx == (self.PageCount - 1):
					cap = _("Finish")
				self.btnNext.Caption = cap
				if page.Picture is not None:
					self.wizardIcon.Picture = page.Picture
				else:
					self.wizardIcon.Picture = self.Picture
			else:
				page.Visible = False
		self.layout()
Example #14
0
	def afterInit(self):
		sz = dui.dGridSizer(VGap=5, HGap=8, MaxCols=2)
		lbl = dui.dLabel(self, Caption=_("HGap"))
		ctl = dui.dSpinner(self, DataField="HGap")
		sz.append(lbl, halign="right")
		sz.append(ctl)
		lbl = dui.dLabel(self, Caption=_("VGap"))
		ctl = dui.dSpinner(self, DataField="VGap")
		sz.append(lbl, halign="right")
		sz.append(ctl)
		lbl = dui.dLabel(self, Caption=_("Rows"))
		ctl = dui.dSpinner(self, DataField="Rows")
		sz.append(lbl, halign="right")
		sz.append(ctl)
		lbl = dui.dLabel(self, Caption=_("Columns"))
		ctl = dui.dSpinner(self, DataField="Columns")
		sz.append(lbl, halign="right")
		sz.append(ctl)
		lbl = dui.dLabel(self, Caption=_("MaxDimension"))
		ctl = dui.dDropdownList(self, DataField="MaxDimension",
				Choices=["C", "R"], Value="C")
		sz.append(lbl, halign="right")
		sz.append(ctl)

		self.Sizer = dui.dSizer("v")
		self.Sizer.append1x(sz, border=20,
				borderSides=("left", "right", "bottom"))
		self.Sizer.appendSpacer(20)
Example #15
0
 def onOutputRightDown(self, evt):
     pop = dabo.ui.dMenu()
     pop.append(_("Clear"), OnHit=self.onClearOutput)
     if self.edtOut.SelectionLength:
         pop.append(_("Copy"), OnHit=self.Application.onEditCopy)
     self.showContextMenu(pop)
     evt.stop()
Example #16
0
	def addControls(self):
		hs = dabo.ui.dSizer("h")
		hs.append(dabo.ui.dButton(self, Caption=_("Preview"), RegID="butPreview"),
				alignment="right", border=self.SizerBorder)
		hs.append(dabo.ui.dButton(self, Caption=_("Print"), RegID="butPrint"),
				alignment="right", border=self.SizerBorder)
		self.Sizer.append(hs, alignment="bottom", border=self.SizerBorder)
Example #17
0
	def beforeAppendOnEnter(self):
		txt = self._textToAppend.strip().lower()
		if txt == "dabo":
			print _("Attempted to add Dabo to the list!!!")
			return False
		elif txt.find("nixon") > -1:
			self._textToAppend = "Tricky Dick"
Example #18
0
	def onLeavePage(self, direction):
		if direction == "forward":
			# Make sure that there are values entered
			appdir = self.txtDir.Value
			appname = self.txtAppName.Value
			if not appdir or not appname:
				dabo.ui.stop(_("Please enter both a name for your app and a location."),
						_("Missing Information"))
				return False
			directory = os.path.join(appdir, appname)
			if not os.path.exists(directory):
				msg = _("The target directory %s does not exist. Do you want to create it now?") % directory
				if dabo.ui.areYouSure(msg, _("Create Directory?"), cancelButton=False):
					os.makedirs(directory)
				else:
					return False
			else:
				if not os.path.isdir(directory):
					dabo.ui.stop(_("The target of '%s' is a pre-existing file, not a directory. "
							"Please pick a different directory name.") % directory)
					return False
			self.Form.outputDirectory = directory
			app.setUserSetting("defaultLocation", appdir)

			self.Form.usePKUI = self.chkPKUI.Value
			self.Form.useUnknown = self.chkUnknown.Value
			self.Form.sortFieldsAlpha = self.chkSortFieldsAlpha.Value
			app.setUserSetting("UsePKUI", self.chkPKUI.Value )
			app.setUserSetting("UseUnknown", self.chkUnknown.Value )
			app.setUserSetting("SortFieldsAlpha", self.chkSortFieldsAlpha.Value )
		return True
Example #19
0
	def onSetAutoCompleteLength(self, evt):
		ed = self.CurrentEditor
		curr = ed.AutoAutoCompleteMinLen
		import dabo
		newlen = dabo.ui.getInt(_("Number of characters?"), _("Set AutoComplete Trigger"), curr)
		if newlen:
			ed.AutoAutoCompleteMinLen = newlen
Example #20
0
File: dPref.py Project: CarlFK/dabo
	def _persist(self, att, val):
		"""Writes the value of the particular att to the database with the proper key."""
		# Make sure that we have a valid key
		baseKey = self._getKey()
		if not baseKey:
			if not self._persistAll:
				dabo.log.error(_("No base key set; preference will not be persisted."))
				return
			else:
				key = att
		else:
			key = "%s.%s" % (baseKey, att)
		crs = self._cursor
		try:
			typ = self._typeDict[type(val)]
		except KeyError:
			dabo.log.error(_("BAD TYPE: %s") % type(val))
			typ = "?"
		# Convert it to a string that can be properly converted back
		val = self._encodeType(val, typ)

		sql = "update daboprefs set ctype = ?, cvalue = ? where ckey = ? "
		prm = (typ, val, key)
		crs.execute(sql, prm)
		# Use the dbapi-level 'rowcount' attribute to get the number
		# of affected rows.
		if not crs.rowcount:
			sql = "insert into daboprefs (ckey, ctype, cvalue) values (?, ?, ?)"
			prm = (key, typ, val)
			crs.execute(sql, prm)
		self._cursor.commitTransaction()
Example #21
0
	def save(self, dataSource=None):
		"""Ask the bizobj to commit its changes to the backend."""
		self.dataSourceParameter = dataSource
		bizobj = self.getBizobj(dataSource)
		if bizobj is None:
			# Running in preview or some other non-live mode
			return
		self.activeControlValid()

		err = self.beforeSave()
		if err:
			self.notifyUser(err)
			return False

		try:
			if self.SaveAllRows:
				bizobj.saveAll(saveTheChildren=self.SaveChildren)
			else:
				bizobj.save(saveTheChildren=self.SaveChildren)

			self.setStatusText(_("Changes to %s saved.") % (
					self.SaveAllRows and "all records" or "current record",))

		except dException.ConnectionLostException, e:
			msg = self._connectionLostMsg(ustr(e))
			self.notifyUser(msg, title=_("Data Connection Lost"), severe=True, exception=e)
			sys.exit()
Example #22
0
 def addControls(self):
     self.useStandard = True
     self.Caption = _("Select a Picture")
     sz = self.Sizer
     sz.appendSpacer(20)
     sz.DefaultSpacing = 10
     sz.DefaultBorder = 20
     sz.DefaultBorderLeft = sz.DefaultBorderRight = True
     btn = dabo.ui.dButton(self, Caption=_("Select your own image..."))
     btn.bindEvent(dEvents.Hit, self.onSelectOwn)
     sz.append(btn, halign="center")
     sz.append(dabo.ui.dLine(self), border=25, borderSides=("left", "right"))
     sz.append(dabo.ui.dLabel(self, Caption="- or -"), halign="center")
     lbl = dabo.ui.dLabel(self, Caption=_("Select a standard image:"))
     dd = dabo.ui.dDropdownList(self, RegID="ddIcons", Choices=defIcons, OnHit=self.updImage)
     hsz = dabo.ui.dSizer("h")
     hsz.append(lbl)
     hsz.appendSpacer(5)
     hsz.append(dd)
     sz.append(hsz, halign="center", border=16)
     hsz = dabo.ui.dSizer("h")
     img = dabo.ui.dImage(self, Picture="", Size=(64, 64), RegID="img")
     bsz = dabo.ui.dBorderSizer(self)
     bsz.append(img, border=8, halign="center", valign="middle")
     hsz.append(bsz)
     hsz.appendSpacer(16)
     btn = dabo.ui.dButton(self, Caption=_("Select"), OnHit=self.onSelect)
     hsz.append(btn, valign="middle")
     sz.append(hsz, halign="center")
     sz.append(dabo.ui.dLine(self), border=25, borderSides=("left", "right"))
     btn = dabo.ui.dButton(self, Caption=_("Cancel"), OnHit=self.onCancel)
     sz.append(btn, halign="right", border=20, borderSides=("right",))
     sz.appendSpacer(25)
     self._selected = False
Example #23
0
	def deleteAll(self, dataSource=None, message=None):
		"""Ask the primary bizobj to delete all records from the recordset."""
		self.dataSourceParameter = dataSource
		bizobj = self.getBizobj(dataSource)
		if bizobj is None:
			# Running in preview or some other non-live mode
			return
		self.activeControlValid()

		err = self.beforeDeleteAll()
		if err:
			self.notifyUser(err)
			return
		if not message:
			message = _("This will delete all records in the recordset, and cannot "
						"be canceled.\n\n Are you sure you want to do this?")

		if dabo.ui.areYouSure(message, defaultNo=True):
			try:
				bizobj.deleteAll()
				# Notify listeners that the row number changed:
				self.raiseEvent(dEvents.RowNumChanged)
			except dException.ConnectionLostException, e:
				msg = self._connectionLostMsg(ustr(e))
				self.notifyUser(msg, title=_("Data Connection Lost"), severe=True, exception=e)
				sys.exit()
			except dException.dException, e:
				dabo.log.error(_("Delete All failed with response: %s") % e)
				self.notifyUser(ustr(e), title=_("Deletion Not Allowed"), severe=True, exception=e)
Example #24
0
    def customCanGetValueAs(self, row, col, typ):
        ret = True
        if col == 0:
            ret = typ in ("str", "string", "unicode", "u")
        else:
            if not self.Controller.Selection:
                return type(None)
            pd = self.getPropDictForRow(row)

            if not isinstance(pd, dict):
                if pd is not None:
                    print(_("BAD PROP DICT:"), pd, type(pd), _("ROW="), row)
            else:
                if pd["type"] == "multi":
                    # This is a catch-all setting for props such as 'Value' that
                    # can have any number of types.
                    ret = True
                else:
                    typtyp = {
                        "str": str,
                        "unicode": str,
                        "bool": bool,
                        "int": int,
                        "long": int,
                        "szinfo": str,
                        "double": float,
                    }[typ]
                    ret = pd["type"] == typtyp
        return ret
Example #25
0
def loadUI(uiType):
	"""Load the given UI into the global namespace."""
	retVal = False
	currType = getUIType()
	mods = {"wx" : "dabo.ui.uiwx", "tk" : "dabo.ui.uitk"}
	if uiType.lower() in ("wx", "wxpython", "uiwx"):
		typ = "wx"
	elif uiType.lower() in ("tk", "tkinter", "uitk"):
		typ = "tk"
	else:
		raise ValueError("Unknown UI type '%s' passed to loadUI()" % uiType)

	if currType is None:
		try:
			exec("from %s import *" % mods[typ], globals())
			retVal = True
		except Exception as e:
			retVal = False
			# Record the actual problem
			print(_("ui.loadUI failed: %s") % e)
			traceback.print_exc()
	else:
		if currType == typ:
			# No problem; just a redundant call
			pass
		else:
			dabo.log.info(_("Cannot change the uiType to '%(typ)s', because UI '%(currType)s' is already loaded.")
					% locals())
	return retVal
Example #26
0
	def _setHotKey(self, evt):
		dlg = HotKeyEditor(self)
		itm = self._selectedItem
		origKey = itm.hotkey
		dlg.setKey(origKey)
		dlg.show()
		if dlg.Accepted:
			hk = dlg.KeyText
			change = (hk != origKey)
			dupeItem = None
			if change:
				dupeItem = self._hotKeyMap.get(hk)
				if dupeItem and (dupeItem is not itm):
					msg = _("This key combination is assigned to the menu command '%s'. " +
							"Do you wish to re-assign it to the command '%s'?") % (cleanMenuCaption(dupeItem.Caption, "&_"),
							cleanMenuCaption(itm.Caption, "&_"))
					change = dabo.ui.areYouSure(msg, title=_("Duplicate Keystroke"), defaultNo=True,
							cancelButton=False)
			if change:
				if dupeItem:
					# Un-assign that hotkey
					dupeItem.HotKey = None
					# Clear it from the tree
					nd = self.menuKeyAssignmentTree.nodeForObject(dupeItem)
					if nd:
						nd.hotkey = None
				if origKey:
					self._hotKeyMap.pop(origKey)
				if hk:
					# Set the internal key map.
					self._hotKeyMap[hk] = itm.Object
				self.txtMenuCurrentHotKey.Value = itm.hotkey = itm.Object.HotKey = hk
				itm.pref.setValue("hotkey", hk)
		dlg.release()
		self.pgMenuKeys.update()
Example #27
0
	def onConfigGrid(self, evt):
		try:
			grid = self.PageFrame.Pages[1].BrowseGrid
			ds = grid.DataSet
		except:
			dabo.ui.info(_("Sorry, there are no records in the grid, please requery first."))
			return

		#cols
		cols = [col.Caption for col in grid.Columns]

		#keys
		keys = [col.DataField for col in grid.Columns]

		class GridColumnsDialog(dabo.ui.dOkCancelDialog):

			def initProperties(self):
				self.selectedColumns = None

			def addControls(self):
				self.addObject(dabo.ui.dLabel, RegID="label",
						Caption=_("You can customize grid appearence by selecting\nthe columns you wish to see bellow:"), WordWrap=True)

				self.addObject(dabo.ui.dCheckList, RegID="columns",
						Height=150, ValueMode="Key",
						Choices=cols,
						Keys=keys)

				for col in grid.Columns:
					if col.Visible:
						self.columns.setSelection(col.ColumnIndex)

				self.Sizer.DefaultBorder = 5
				self.Sizer.DefaultBorderAll = True

				self.Sizer.append(self.label, border=5)
				self.Sizer.append1x(self.columns)

			def runOK(self):
				self.selectedColumns = self.columns.Value

			def runCancel(self):
				self.selectedColumns = None

		d = GridColumnsDialog(self, Caption=_("Select Columns"))
		d.show()

		#the user has canceled, just return
		if d.selectedColumns == None:
			return

		for col in grid.Columns:
			if col.DataField in d.selectedColumns:
				col.Visible = True
			else:
				col.Visible = False

		#release the window
		d.release()
Example #28
0
	def addEditPages(self, ds):
		"""Called when it is time to add the edit page(s)."""
		biz = self.getBizobj()
		if biz:
			caption = _("Edit") + " " + biz.Caption
		else:
			caption = _("Edit")
		self.addEditPage(ds, caption)
Example #29
0
	def createMenu(self):
		mb = self.MenuBar
		fm = mb.getMenu("base_file")
		fm.prepend(_("Open Connection File..."),
				HotKey="Ctrl+O",
				OnHit=self.onOpenFile,
				ItemID="file_open",
				help=_("Open an existing connection file"))
Example #30
0
		def createBody(self):
			self.Caption = _("This is the fifth (and last) page")
			lbl = dabo.ui.dLabel(self, Caption=_(
"""This is the last page. Note that the 'Next' button
now reads 'Finish'. Click that to exit, or click 'Back'
to play some more.
"""))
			self.Sizer.append(lbl, alignment="center")