FileBrowseButton now has history, updated demo
Added ActiveXWrapper and demos. It can't do callback events yet, but I'm working on it. Can curently embed a control and make method calls to it. Updated the wxCalendar (python version) and it's demo. It now has printing support. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_2_BRANCH@7136 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
127
utils/wxPython/demo/ActiveXWrapper_Acrobat.py
Normal file
127
utils/wxPython/demo/ActiveXWrapper_Acrobat.py
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
"""
|
||||||
|
ActiveXControl sample usage.
|
||||||
|
|
||||||
|
Based on original code by Willy Heineman, wheineman@uconect.net, 14 February 2000
|
||||||
|
|
||||||
|
ActiveXControl provides a simplified wrapper for creating activeX
|
||||||
|
controls within wxPython GUIs. It allows you to include the activeX
|
||||||
|
control in a sizer, and includes a flag to prevent redrawing the
|
||||||
|
background behind the control (reduces the annoying flicker on
|
||||||
|
Win32 systems).
|
||||||
|
"""
|
||||||
|
from wxPython.wx import *
|
||||||
|
from wxPython.lib.activexwrapper import ActiveXWrapper
|
||||||
|
|
||||||
|
import pythoncom
|
||||||
|
import pywin.mfc.activex
|
||||||
|
import win32com.client.gencache
|
||||||
|
import win32con
|
||||||
|
import win32ui
|
||||||
|
|
||||||
|
acrobatOCX = win32com.client.gencache.EnsureModule('{CA8A9783-280D-11CF-A24D-444553540000}', 0x0, 1, 3)
|
||||||
|
if acrobatOCX is None:
|
||||||
|
win32ui.MessageBox("Can't load PDF.OCX, install Acrobat 4.0",
|
||||||
|
'ActiveX Demo',
|
||||||
|
win32con.MB_OK | win32con.MB_ICONSTOP)
|
||||||
|
raise ImportError
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
# NOTE:
|
||||||
|
# Your ActiveX control _must_ be an instance of pywin.mfc.activex.Control,
|
||||||
|
# as we use the CreateControl method to bind the GUI systems.
|
||||||
|
|
||||||
|
class PDFControl(pywin.mfc.activex.Control, acrobatOCX.Pdf):
|
||||||
|
def __init__(self):
|
||||||
|
pywin.mfc.activex.Control.__init__(self)
|
||||||
|
acrobatOCX.Pdf.__init__(self)
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
|
||||||
|
class TestPanel(wxPanel):
|
||||||
|
def __init__(self, parent, log):
|
||||||
|
wxPanel.__init__(self, parent, -1)
|
||||||
|
self.log = log
|
||||||
|
|
||||||
|
sizer = wxBoxSizer(wxVERTICAL)
|
||||||
|
btnSizer = wxBoxSizer(wxHORIZONTAL)
|
||||||
|
|
||||||
|
# Build the wxPython wrapper window and put the Acrobat
|
||||||
|
# control in it
|
||||||
|
self.axw = ActiveXWrapper( self, -1, style=wxSUNKEN_BORDER, eraseBackground=0)
|
||||||
|
self.axw.SetControl( PDFControl() )
|
||||||
|
|
||||||
|
sizer.Add(self.axw, 1, wxEXPAND)
|
||||||
|
|
||||||
|
btn = wxButton(self, wxNewId(), "Open PDF File")
|
||||||
|
EVT_BUTTON(self, btn.GetId(), self.OnOpenButton)
|
||||||
|
btnSizer.Add(btn, 1, wxEXPAND|wxALL, 5)
|
||||||
|
|
||||||
|
btn = wxButton(self, wxNewId(), "<-- Previous Page")
|
||||||
|
EVT_BUTTON(self, btn.GetId(), self.OnPrevPageButton)
|
||||||
|
btnSizer.Add(btn, 1, wxEXPAND|wxALL, 5)
|
||||||
|
|
||||||
|
btn = wxButton(self, wxNewId(), "Next Page -->")
|
||||||
|
EVT_BUTTON(self, btn.GetId(), self.OnNextPageButton)
|
||||||
|
btnSizer.Add(btn, 1, wxEXPAND|wxALL, 5)
|
||||||
|
|
||||||
|
|
||||||
|
btnSizer.Add(50, -1, 2, wxEXPAND)
|
||||||
|
sizer.Add(btnSizer, 0, wxEXPAND)
|
||||||
|
|
||||||
|
self.SetSizer(sizer)
|
||||||
|
self.SetAutoLayout(true)
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
self.axw.Cleanup()
|
||||||
|
self.axw = None
|
||||||
|
|
||||||
|
|
||||||
|
def OnOpenButton(self, event):
|
||||||
|
dlg = wxFileDialog(self, wildcard="*.pdf")
|
||||||
|
if dlg.ShowModal() == wxID_OK:
|
||||||
|
self.axw.control.LoadFile(dlg.GetPath())
|
||||||
|
|
||||||
|
dlg.Destroy()
|
||||||
|
|
||||||
|
|
||||||
|
def OnPrevPageButton(self, event):
|
||||||
|
self.axw.control.gotoPreviousPage()
|
||||||
|
|
||||||
|
|
||||||
|
def OnNextPageButton(self, event):
|
||||||
|
self.axw.control.gotoNextPage()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
|
||||||
|
def runTest(frame, nb, log):
|
||||||
|
win = TestPanel(nb, log)
|
||||||
|
return win
|
||||||
|
|
||||||
|
|
||||||
|
overview = __doc__
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
class TestFrame(wxFrame):
|
||||||
|
def __init__(self):
|
||||||
|
wxFrame.__init__(self, None, -1, "ActiveX test -- Acrobat", size=(640, 480))
|
||||||
|
self.tp = TestPanel(self, sys.stdout)
|
||||||
|
|
||||||
|
def OnCloseWindow(self, event):
|
||||||
|
self.tp.axw.Cleanup()
|
||||||
|
self.Destroy()
|
||||||
|
|
||||||
|
|
||||||
|
app = wxPySimpleApp()
|
||||||
|
frame = TestFrame()
|
||||||
|
frame.Show(true)
|
||||||
|
app.MainLoop()
|
||||||
|
|
||||||
|
|
||||||
|
|
133
utils/wxPython/demo/ActiveXWrapper_IE.py
Normal file
133
utils/wxPython/demo/ActiveXWrapper_IE.py
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
"""
|
||||||
|
ActiveXControl sample usage.
|
||||||
|
|
||||||
|
Based on original code by Willy Heineman, wheineman@uconect.net, 14 February 2000
|
||||||
|
|
||||||
|
ActiveXControl provides a simplified wrapper for creating activeX
|
||||||
|
controls within wxPython GUIs.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from wxPython.wx import *
|
||||||
|
from wxPython.lib.activexwrapper import ActiveXWrapper
|
||||||
|
|
||||||
|
import pythoncom
|
||||||
|
import pywin.mfc.activex
|
||||||
|
import win32com.client.gencache
|
||||||
|
import win32con
|
||||||
|
import win32ui
|
||||||
|
|
||||||
|
browserModule = win32com.client.gencache.EnsureModule("{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}", 0, 1, 1)
|
||||||
|
if browserModule is None:
|
||||||
|
win32ui.MessageBox("IE4 or greater does not appear to be installed.",
|
||||||
|
'ActiveX Demo',
|
||||||
|
win32con.MB_OK | win32con.MB_ICONSTOP)
|
||||||
|
raise ImportError
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
# NOTE:
|
||||||
|
# Your ActiveX control _must_ be an instance of pywin.mfc.activex.Control,
|
||||||
|
# as we use the CreateControl method to bind the GUI systems.
|
||||||
|
|
||||||
|
class WebBrowserControl(pywin.mfc.activex.Control,
|
||||||
|
browserModule.WebBrowser):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
pywin.mfc.activex.Control.__init__(self)
|
||||||
|
browserModule.WebBrowser.__init__(self)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
|
||||||
|
class TestPanel(wxPanel):
|
||||||
|
def __init__(self, parent, log):
|
||||||
|
wxPanel.__init__(self, parent, -1)
|
||||||
|
self.log = log
|
||||||
|
self.current = "http://alldunn.com/"
|
||||||
|
|
||||||
|
sizer = wxBoxSizer(wxVERTICAL)
|
||||||
|
btnSizer = wxBoxSizer(wxHORIZONTAL)
|
||||||
|
|
||||||
|
# Build the wxPython wrapper window and put the Acrobat
|
||||||
|
# control in it
|
||||||
|
self.axw = ActiveXWrapper( self, -1, style=wxSUNKEN_BORDER, eraseBackground=0)
|
||||||
|
self.axw.SetControl( WebBrowserControl() )
|
||||||
|
sizer.Add(self.axw, 1, wxEXPAND)
|
||||||
|
|
||||||
|
self.axw.control.Navigate(self.current)
|
||||||
|
|
||||||
|
btn = wxButton(self, wxNewId(), "Open Location")
|
||||||
|
EVT_BUTTON(self, btn.GetId(), self.OnOpenButton)
|
||||||
|
btnSizer.Add(btn, 1, wxEXPAND|wxALL, 5)
|
||||||
|
|
||||||
|
btn = wxButton(self, wxNewId(), "<-- Back Page")
|
||||||
|
EVT_BUTTON(self, btn.GetId(), self.OnPrevPageButton)
|
||||||
|
btnSizer.Add(btn, 1, wxEXPAND|wxALL, 5)
|
||||||
|
|
||||||
|
btn = wxButton(self, wxNewId(), "Forward Page -->")
|
||||||
|
EVT_BUTTON(self, btn.GetId(), self.OnNextPageButton)
|
||||||
|
btnSizer.Add(btn, 1, wxEXPAND|wxALL, 5)
|
||||||
|
|
||||||
|
btnSizer.Add(50, -1, 2, wxEXPAND)
|
||||||
|
sizer.Add(btnSizer, 0, wxEXPAND)
|
||||||
|
|
||||||
|
self.SetSizer(sizer)
|
||||||
|
self.SetAutoLayout(true)
|
||||||
|
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
self.axw.Cleanup()
|
||||||
|
self.axw = None
|
||||||
|
|
||||||
|
|
||||||
|
def OnOpenButton(self, event):
|
||||||
|
dlg = wxTextEntryDialog(self, "Open Location",
|
||||||
|
"Enter a full URL or local path",
|
||||||
|
self.current, wxOK|wxCANCEL)
|
||||||
|
dlg.CentreOnParent()
|
||||||
|
if dlg.ShowModal() == wxID_OK:
|
||||||
|
self.current = dlg.GetValue()
|
||||||
|
self.axw.control.Navigate(self.current)
|
||||||
|
dlg.Destroy()
|
||||||
|
|
||||||
|
|
||||||
|
def OnPrevPageButton(self, event):
|
||||||
|
self.axw.control.GoBack()
|
||||||
|
|
||||||
|
|
||||||
|
def OnNextPageButton(self, event):
|
||||||
|
self.axw.control.GoForward()
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
# for the demo framework...
|
||||||
|
|
||||||
|
def runTest(frame, nb, log):
|
||||||
|
win = TestPanel(nb, log)
|
||||||
|
return win
|
||||||
|
|
||||||
|
|
||||||
|
overview = __doc__
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
class TestFrame(wxFrame):
|
||||||
|
def __init__(self):
|
||||||
|
wxFrame.__init__(self, None, -1, "ActiveX test -- Internet Explorer", size=(640, 480))
|
||||||
|
self.tp = TestPanel(self, sys.stdout)
|
||||||
|
|
||||||
|
def OnCloseWindow(self, event):
|
||||||
|
self.tp.axw.Cleanup()
|
||||||
|
self.Destroy()
|
||||||
|
|
||||||
|
|
||||||
|
app = wxPySimpleApp()
|
||||||
|
frame = TestFrame()
|
||||||
|
frame.Show(true)
|
||||||
|
app.MainLoop()
|
||||||
|
|
||||||
|
|
||||||
|
|
@@ -1,13 +1,38 @@
|
|||||||
|
|
||||||
from wxPython.wx import *
|
from wxPython.wx import *
|
||||||
from wxPython.lib.filebrowsebutton import FileBrowseButton
|
from wxPython.lib.filebrowsebutton import FileBrowseButton, FileBrowseButtonWithHistory
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
|
||||||
|
class TestPanel(wxPanel):
|
||||||
|
def __init__(self, parent, ID, log):
|
||||||
|
wxPanel.__init__(self, parent, ID)
|
||||||
|
self.log = log
|
||||||
|
self.fbb = FileBrowseButton(self, -1, wxPoint(20,20), wxSize(350, -1),
|
||||||
|
changeCallback = self.fbbCallback)
|
||||||
|
self.fbbh = FileBrowseButtonWithHistory(self, -1, wxPoint(20, 50),
|
||||||
|
wxSize(350, -1),
|
||||||
|
changeCallback = self.fbbhCallback)
|
||||||
|
self.fbbh.SetHistory([])
|
||||||
|
|
||||||
|
|
||||||
|
def fbbCallback(self, evt):
|
||||||
|
self.log.write('FileBrowseButton: %s\n' % evt.GetString())
|
||||||
|
|
||||||
|
|
||||||
|
def fbbhCallback(self, evt):
|
||||||
|
value = evt.GetString()
|
||||||
|
self.log.write('FileBrowseButtonWithHistory: %s\n' % value)
|
||||||
|
history = self.fbbh.GetHistory()
|
||||||
|
history.append(value)
|
||||||
|
self.fbbh.SetHistory(history)
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
|
|
||||||
def runTest(frame, nb, log):
|
def runTest(frame, nb, log):
|
||||||
win = wxPanel(nb, -1)
|
win = TestPanel(nb, -1, log)
|
||||||
fbb = FileBrowseButton(win, -1, wxPoint(20,20), wxSize(350, -1))
|
|
||||||
return win
|
return win
|
||||||
|
|
||||||
|
|
||||||
|
@@ -72,7 +72,7 @@ class CustomDataTable(wxPyGridTableBase):
|
|||||||
|
|
||||||
|
|
||||||
#--------------------------------------------------
|
#--------------------------------------------------
|
||||||
# optional methods
|
# Some optional methods
|
||||||
|
|
||||||
# Called when the grid needs to display labels
|
# Called when the grid needs to display labels
|
||||||
def GetColLabelValue(self, col):
|
def GetColLabelValue(self, col):
|
||||||
@@ -101,8 +101,6 @@ class CustomDataTable(wxPyGridTableBase):
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
@@ -21,7 +21,9 @@ _useSplitter = true
|
|||||||
_useNestedSplitter = true
|
_useNestedSplitter = true
|
||||||
|
|
||||||
_treeList = [
|
_treeList = [
|
||||||
('New since last release', ['wxGrid']),
|
('New since last release', ['wxGrid', 'wxStyledTextCtrl',
|
||||||
|
'ActiveXWrapper_Acrobat', 'ActiveXWrapper_IE',
|
||||||
|
'FileBrowseButton', 'wxCalendar']),
|
||||||
|
|
||||||
('Managed Windows', ['wxFrame', 'wxDialog', 'wxMiniFrame']),
|
('Managed Windows', ['wxFrame', 'wxDialog', 'wxMiniFrame']),
|
||||||
|
|
||||||
|
83
utils/wxPython/lib/activexwrapper.py
Normal file
83
utils/wxPython/lib/activexwrapper.py
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
#----------------------------------------------------------------------
|
||||||
|
# Name: wxPython.lib.activexwrapper
|
||||||
|
# Purpose: a wxWindow derived class that can hold an ActiveX control
|
||||||
|
#
|
||||||
|
# Author: Mike Fletcher, Robin Dunn
|
||||||
|
#
|
||||||
|
# RCS-ID: $Id$
|
||||||
|
# Copyright: (c) 2000 by Total Control Software
|
||||||
|
# Licence: wxWindows license
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
|
||||||
|
from wxPython.wx import *
|
||||||
|
|
||||||
|
try:
|
||||||
|
import win32ui
|
||||||
|
except ImportError:
|
||||||
|
raise ImportError( "Cannot find win32ui module, wxWindows ActiveXControl module cannot be loaded")
|
||||||
|
|
||||||
|
### Following makes it possible to include this module without
|
||||||
|
# needing to include the (rather large) win32con module...
|
||||||
|
##from win32con import WS_TABSTOP, WS_VISIBLE
|
||||||
|
WS_TABSTOP = 0x10000
|
||||||
|
WS_VISIBLE = 0x10000000
|
||||||
|
|
||||||
|
class ActiveXWrapper( wxWindow ):
|
||||||
|
"""
|
||||||
|
Class providing easy integration of ActiveXControls into
|
||||||
|
wxPython GUI environments. Pass an instantiated control class (one
|
||||||
|
which inherits from pywin.mfc.activex.Control and a particular control
|
||||||
|
class generated by gencache) in the argument "control". Alternatively,
|
||||||
|
pass the instantiated control to the SetControl method to allow for
|
||||||
|
specifying the win32 style, id, etceteras
|
||||||
|
"""
|
||||||
|
def __init__( self, parent, ID=-1, pos = wxDefaultPosition, size = wxDefaultSize,
|
||||||
|
style = 0,
|
||||||
|
name = "ActiveXControlWindow",
|
||||||
|
control = None,
|
||||||
|
controlName = "Control",
|
||||||
|
eraseBackground = 1,
|
||||||
|
):
|
||||||
|
wxWindow.__init__( self, parent, ID, pos, size, style, name )
|
||||||
|
win32ui.EnableControlContainer()
|
||||||
|
self.windowPointer = win32ui.CreateWindowFromHandle(self.GetHandle())
|
||||||
|
if control:
|
||||||
|
self.SetControl( control, name )
|
||||||
|
EVT_SIZE( self, self.OnSize)
|
||||||
|
if not eraseBackground:
|
||||||
|
def nullfunction( event ): pass
|
||||||
|
EVT_ERASE_BACKGROUND( self, nullfunction )
|
||||||
|
|
||||||
|
|
||||||
|
def SetControl( self, controlObject, name="Control",
|
||||||
|
style=WS_TABSTOP | WS_VISIBLE, ID=None):
|
||||||
|
"""
|
||||||
|
Pass a pre-built control object, calls the control's
|
||||||
|
CreateControl method with the proper arguments to make it a
|
||||||
|
child of this window
|
||||||
|
"""
|
||||||
|
self.control = controlObject
|
||||||
|
w,h = self.GetSizeTuple()
|
||||||
|
if not ID:
|
||||||
|
ID = wxNewId()
|
||||||
|
self.control.CreateControl( name, style, (0,0,w,h),
|
||||||
|
self.windowPointer,
|
||||||
|
ID)
|
||||||
|
|
||||||
|
|
||||||
|
def Cleanup( self ):
|
||||||
|
"""Delete the reference to the control, to ensure that it is dereferenced."""
|
||||||
|
self.control = None
|
||||||
|
self.windowPointer = None
|
||||||
|
|
||||||
|
def OnSize( self, event=None ):
|
||||||
|
"""wxPython resize event, call MoveWindow on the control"""
|
||||||
|
size = self.GetClientSize()
|
||||||
|
self.control.MoveWindow( (0,0,size.width,size.height),1)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@@ -5,7 +5,7 @@
|
|||||||
# Author: Lorne White (email: lwhite1@planet.eon.net)
|
# Author: Lorne White (email: lwhite1@planet.eon.net)
|
||||||
#
|
#
|
||||||
# Created:
|
# Created:
|
||||||
# Version 0.5 1999/11/03
|
# Version 0.6 2000/03/30
|
||||||
# Licence: wxWindows license
|
# Licence: wxWindows license
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -17,24 +17,75 @@ import string, time
|
|||||||
|
|
||||||
CalDays = [6, 0, 1, 2, 3, 4, 5]
|
CalDays = [6, 0, 1, 2, 3, 4, 5]
|
||||||
AbrWeekday = {6:"Sun", 0:"Mon", 1:"Tue", 2:"Wed", 3:"Thu", 4:"Fri", 5:"Sat"}
|
AbrWeekday = {6:"Sun", 0:"Mon", 1:"Tue", 2:"Wed", 3:"Thu", 4:"Fri", 5:"Sat"}
|
||||||
_MIDSIZE = 100
|
_MIDSIZE = 160
|
||||||
|
|
||||||
|
|
||||||
# calendar drawing routing
|
# calendar drawing routing
|
||||||
|
|
||||||
class CalDraw:
|
class CalDraw:
|
||||||
def __init__(self):
|
def __init__(self, parent):
|
||||||
self.rg = {}
|
self.pwidth = 1
|
||||||
self.y_st = 15 # start of vertical draw default
|
self.pheight = 1
|
||||||
|
try:
|
||||||
|
self.scale = parent.scale
|
||||||
|
except:
|
||||||
|
self.scale = 1
|
||||||
|
|
||||||
|
self.DefParms()
|
||||||
|
|
||||||
|
def DefParms(self):
|
||||||
|
self.grid_color = 'BLACK'
|
||||||
|
self.back_color = 'WHITE'
|
||||||
|
self.sel_color = 'RED'
|
||||||
|
self.high_color = 'LIGHT BLUE'
|
||||||
|
self.border_color = 'BLACK'
|
||||||
|
self.week_color = 'LIGHT GREY'
|
||||||
|
|
||||||
|
self.font = wxSWISS
|
||||||
|
self.bold = wxNORMAL
|
||||||
|
|
||||||
|
self.hide_title = FALSE
|
||||||
|
self.hide_grid = FALSE
|
||||||
|
self.outer_border = TRUE
|
||||||
|
|
||||||
|
self.title_offset = 0
|
||||||
|
|
||||||
def SetSize(self, size):
|
def SetSize(self, size):
|
||||||
self.sizew = size.width
|
self.set_sizew = size.width
|
||||||
self.sizeh = size.height
|
self.set_sizeh = size.height
|
||||||
|
|
||||||
# draw the various elements of the calendar
|
def InitValues(self): # default dimensions of various elements of the calendar
|
||||||
|
self.rg = {}
|
||||||
|
self.set_cy_st = 0 # start position
|
||||||
|
self.set_cx_st = 0
|
||||||
|
|
||||||
|
self.set_y_mrg = 15 # start of vertical draw default
|
||||||
|
self.set_x_mrg = 10
|
||||||
|
self.set_y_end = 10
|
||||||
|
|
||||||
|
def SetPos(self, xpos, ypos):
|
||||||
|
self.set_cx_st = xpos
|
||||||
|
self.set_cy_st = ypos
|
||||||
|
|
||||||
|
def SetMarg(self, xmarg, ymarg):
|
||||||
|
self.set_x_st = xmarg
|
||||||
|
self.set_y_st = ymarg
|
||||||
|
self.set_y_end = ymarg
|
||||||
|
|
||||||
|
def InitScale(self): # scale position values
|
||||||
|
self.sizew = self.set_sizew * self.pwidth
|
||||||
|
self.sizeh = self.set_sizeh * self.pheight
|
||||||
|
|
||||||
|
self.cx_st = self.set_cx_st * self.pwidth # draw start position
|
||||||
|
self.cy_st = self.set_cy_st * self.pheight
|
||||||
|
|
||||||
|
self.x_mrg = self.set_x_mrg * self.pwidth # calendar draw margins
|
||||||
|
self.y_mrg = self.set_y_mrg * self.pheight
|
||||||
|
self.y_end = self.set_y_end * self.pheight
|
||||||
|
|
||||||
def DrawCal(self, DC, sel_lst):
|
def DrawCal(self, DC, sel_lst):
|
||||||
self.DC = DC
|
self.DC = DC
|
||||||
|
self.InitScale()
|
||||||
|
|
||||||
self.DrawBorder()
|
self.DrawBorder()
|
||||||
|
|
||||||
@@ -50,10 +101,13 @@ class CalDraw:
|
|||||||
self.DrawWeek()
|
self.DrawWeek()
|
||||||
self.DrawNum()
|
self.DrawNum()
|
||||||
|
|
||||||
# draw border around the outside of the main display rectangle
|
def DrawBorder(self): # draw border around the outside of the main display rectangle
|
||||||
|
brush = wxBrush(wxNamedColour(self.back_color), wxSOLID)
|
||||||
|
self.DC.SetBrush(brush)
|
||||||
|
self.DC.SetPen(wxPen(wxNamedColour(self.border_color), 1))
|
||||||
|
|
||||||
def DrawBorder(self):
|
if self.outer_border is TRUE:
|
||||||
rect = wxRect(0, 0, self.sizew, self.sizeh) # full display window area
|
rect = wxRect(self.cx_st, self.cy_st, self.sizew, self.sizeh) # full display window area
|
||||||
self.DC.DrawRectangle(rect.x, rect.y, rect.width, rect.height)
|
self.DC.DrawRectangle(rect.x, rect.y, rect.width, rect.height)
|
||||||
|
|
||||||
def DrawNumVal(self):
|
def DrawNumVal(self):
|
||||||
@@ -62,6 +116,8 @@ class CalDraw:
|
|||||||
# calculate the calendar days and offset position
|
# calculate the calendar days and offset position
|
||||||
|
|
||||||
def SetCal(self, year, month):
|
def SetCal(self, year, month):
|
||||||
|
self.InitValues() # reset initial values
|
||||||
|
|
||||||
self.year = year
|
self.year = year
|
||||||
self.month = month
|
self.month = month
|
||||||
|
|
||||||
@@ -81,9 +137,7 @@ class CalDraw:
|
|||||||
i = i + 1
|
i = i + 1
|
||||||
return start_pos
|
return start_pos
|
||||||
|
|
||||||
# get the display rectange list of the day grid
|
def GetRect(self): # get the display rectange list of the day grid
|
||||||
|
|
||||||
def GetRect(self):
|
|
||||||
cnt = 0
|
cnt = 0
|
||||||
for y in self.gridy[1:-1]:
|
for y in self.gridy[1:-1]:
|
||||||
for x in self.gridx[:-1]:
|
for x in self.gridx[:-1]:
|
||||||
@@ -98,12 +152,10 @@ class CalDraw:
|
|||||||
def GetOffset(self):
|
def GetOffset(self):
|
||||||
return self.st_pos
|
return self.st_pos
|
||||||
|
|
||||||
# month and year title
|
def DrawMonth(self): # month and year title
|
||||||
|
|
||||||
def DrawMonth(self):
|
|
||||||
month = Month[self.month]
|
month = Month[self.month]
|
||||||
|
|
||||||
sizef = 12
|
sizef = 11
|
||||||
if self.sizeh < _MIDSIZE:
|
if self.sizeh < _MIDSIZE:
|
||||||
sizef = 10
|
sizef = 10
|
||||||
|
|
||||||
@@ -111,25 +163,23 @@ class CalDraw:
|
|||||||
self.DC.SetFont(f)
|
self.DC.SetFont(f)
|
||||||
|
|
||||||
tw,th = self.DC.GetTextExtent(month)
|
tw,th = self.DC.GetTextExtent(month)
|
||||||
adjust = (self.sizew-tw)/2
|
adjust = self.cx_st + (self.sizew-tw)/2
|
||||||
self.DC.DrawText(month, adjust, 10)
|
self.DC.DrawText(month, adjust, self.cy_st + th)
|
||||||
|
|
||||||
year = str(self.year)
|
year = str(self.year)
|
||||||
tw,th = self.DC.GetTextExtent(year)
|
tw,th = self.DC.GetTextExtent(year)
|
||||||
adjust = self.sizew-tw-20
|
adjust = self.cx_st + self.sizew-tw-20
|
||||||
|
|
||||||
self.y_st = th * 3
|
self.title_offset = th * 2
|
||||||
|
|
||||||
f = wxFont(sizef, self.font, wxNORMAL, self.bold)
|
f = wxFont(sizef, self.font, wxNORMAL, self.bold)
|
||||||
self.DC.SetFont(f)
|
self.DC.SetFont(f)
|
||||||
self.DC.DrawText(year, adjust, 10)
|
self.DC.DrawText(year, adjust, self.cy_st + th)
|
||||||
|
|
||||||
# draw the week days
|
def DrawWeek(self): # draw the week days
|
||||||
|
|
||||||
def DrawWeek(self):
|
|
||||||
sizef = 10
|
|
||||||
if self.sizeh < _MIDSIZE:
|
|
||||||
sizef = 8
|
sizef = 8
|
||||||
|
if self.sizeh < _MIDSIZE:
|
||||||
|
sizef = 7
|
||||||
|
|
||||||
f = wxFont(sizef, self.font, wxNORMAL, self.bold)
|
f = wxFont(sizef, self.font, wxNORMAL, self.bold)
|
||||||
self.DC.SetFont(f)
|
self.DC.SetFont(f)
|
||||||
@@ -139,6 +189,12 @@ class CalDraw:
|
|||||||
width = self.gridx[1]-self.gridx[0]
|
width = self.gridx[1]-self.gridx[0]
|
||||||
height = self.gridy[1] - self.gridy[0]
|
height = self.gridy[1] - self.gridy[0]
|
||||||
|
|
||||||
|
rect_w = self.gridx[7]-self.gridx[0]
|
||||||
|
|
||||||
|
brush = wxBrush(wxNamedColour(self.week_color), wxSOLID)
|
||||||
|
self.DC.SetBrush(brush)
|
||||||
|
# self.DC.DrawRectangle(self.gridx[0], self.gridy[0], rect_w+1, height)
|
||||||
|
|
||||||
for val in CalDays:
|
for val in CalDays:
|
||||||
day = AbrWeekday[val]
|
day = AbrWeekday[val]
|
||||||
if self.sizew < 200:
|
if self.sizew < 200:
|
||||||
@@ -149,12 +205,12 @@ class CalDraw:
|
|||||||
|
|
||||||
x = self.gridx[cnt_x]
|
x = self.gridx[cnt_x]
|
||||||
y = self.gridy[cnt_y]
|
y = self.gridy[cnt_y]
|
||||||
|
self.DC.DrawRectangle(self.gridx[cnt_x], self.gridy[0], width+1, height)
|
||||||
self.DC.DrawText(day, x+diffx, y+diffy)
|
self.DC.DrawText(day, x+diffx, y+diffy)
|
||||||
cnt_x = cnt_x + 1
|
cnt_x = cnt_x + 1
|
||||||
|
|
||||||
# draw the day numbers
|
|
||||||
|
|
||||||
def DrawNum(self):
|
def DrawNum(self): # draw the day numbers
|
||||||
sizef = 10
|
sizef = 10
|
||||||
if self.sizeh < _MIDSIZE:
|
if self.sizeh < _MIDSIZE:
|
||||||
sizef = 8
|
sizef = 8
|
||||||
@@ -173,24 +229,18 @@ class CalDraw:
|
|||||||
cnt_x = 0
|
cnt_x = 0
|
||||||
cnt_y = cnt_y + 1
|
cnt_y = cnt_y + 1
|
||||||
|
|
||||||
# calculate the dimensions in the center of the drawing area
|
def Center(self): # calculate the dimensions in the center of the drawing area
|
||||||
|
bdw = self.x_mrg * 2
|
||||||
|
bdh = self.y_mrg + self.y_end + self.title_offset
|
||||||
|
|
||||||
def Center(self):
|
self.dl_w = int((self.sizew-bdw)/7)
|
||||||
self.x_st = 10
|
self.dl_h = int((self.sizeh-bdh)/7)
|
||||||
self.y_end = 10
|
|
||||||
|
|
||||||
bdw = self.x_st * 2
|
|
||||||
bdh = self.y_st + self.y_end
|
|
||||||
|
|
||||||
self.dl_w = (self.sizew-bdw)/7
|
|
||||||
self.dl_h = (self.sizeh-bdh)/7
|
|
||||||
|
|
||||||
|
self.dl_th = int(2*self.dl_h/3) # week title adjustment
|
||||||
self.cwidth = self.dl_w * 7
|
self.cwidth = self.dl_w * 7
|
||||||
self.cheight = self.dl_h * 6 + self.dl_h/2
|
self.cheight = self.dl_h * 6 + self.dl_th
|
||||||
|
|
||||||
# highlighted selectioned days
|
def DrawSel(self, sel_lst): # highlighted selected days
|
||||||
|
|
||||||
def DrawSel(self, sel_lst):
|
|
||||||
for key in sel_lst:
|
for key in sel_lst:
|
||||||
brush = wxBrush(wxNamedColour(self.high_color), wxSOLID)
|
brush = wxBrush(wxNamedColour(self.high_color), wxSOLID)
|
||||||
self.DC.SetBrush(brush)
|
self.DC.SetBrush(brush)
|
||||||
@@ -202,18 +252,19 @@ class CalDraw:
|
|||||||
rect = self.rg[nkey]
|
rect = self.rg[nkey]
|
||||||
self.DC.DrawRectangle(rect.x, rect.y, rect.width+1, rect.height+1)
|
self.DC.DrawRectangle(rect.x, rect.y, rect.width+1, rect.height+1)
|
||||||
|
|
||||||
# calculate and draw the grid lines
|
def DrawGrid(self): # calculate and draw the grid lines
|
||||||
|
|
||||||
def DrawGrid(self):
|
|
||||||
self.DC.SetPen(wxPen(wxNamedColour(self.grid_color), 0))
|
self.DC.SetPen(wxPen(wxNamedColour(self.grid_color), 0))
|
||||||
|
|
||||||
self.gridx = []
|
self.gridx = []
|
||||||
self.gridy = []
|
self.gridy = []
|
||||||
|
|
||||||
|
self.x_st = self.cx_st + self.x_mrg
|
||||||
|
self.y_st = self.cy_st + self.y_mrg + self.title_offset # start postion of draw
|
||||||
|
|
||||||
x1 = self.x_st
|
x1 = self.x_st
|
||||||
y1 = self.y_st
|
y1 = self.y_st
|
||||||
y1 = self.y_st
|
|
||||||
y2 = self.y_st + self.cheight
|
y2 = y1 + self.cheight
|
||||||
for i in range(8):
|
for i in range(8):
|
||||||
if self.hide_grid is FALSE:
|
if self.hide_grid is FALSE:
|
||||||
self.DC.DrawLine(x1, y1, x1, y2)
|
self.DC.DrawLine(x1, y1, x1, y2)
|
||||||
@@ -222,17 +273,35 @@ class CalDraw:
|
|||||||
|
|
||||||
x1 = self.x_st
|
x1 = self.x_st
|
||||||
y1 = self.y_st
|
y1 = self.y_st
|
||||||
x2 = self.x_st + self.cwidth
|
|
||||||
|
x2 = x1 + self.cwidth
|
||||||
for i in range(8):
|
for i in range(8):
|
||||||
if self.hide_grid is FALSE:
|
if self.hide_grid is FALSE:
|
||||||
self.DC.DrawLine(x1, y1, x2, y1)
|
self.DC.DrawLine(x1, y1, x2, y1)
|
||||||
self.gridy.append(y1)
|
self.gridy.append(y1)
|
||||||
if i == 0:
|
if i == 0:
|
||||||
y1 = y1 + self.dl_h/2
|
y1 = y1 + self.dl_th
|
||||||
else:
|
else:
|
||||||
y1 = y1 + self.dl_h
|
y1 = y1 + self.dl_h
|
||||||
|
|
||||||
|
|
||||||
|
class PrtCalDraw(CalDraw):
|
||||||
|
def InitValues(self):
|
||||||
|
self.rg = {}
|
||||||
|
self.set_cx_st = 1.0 # start draw border location
|
||||||
|
self.set_cy_st = 1.0
|
||||||
|
|
||||||
|
self.set_y_mrg = 0.2 # draw offset position
|
||||||
|
self.set_x_mrg = 0.2
|
||||||
|
self.set_y_end = 0.2
|
||||||
|
|
||||||
|
def SetPSize(self, pwidth, pheight): # calculate the dimensions in the center of the drawing area
|
||||||
|
self.pwidth = int(pwidth)/self.scale
|
||||||
|
self.pheight = int(pheight)/self.scale
|
||||||
|
|
||||||
|
def SetPreview(self, preview):
|
||||||
|
self.preview = preview
|
||||||
|
|
||||||
class wxCalendar(wxWindow):
|
class wxCalendar(wxWindow):
|
||||||
def __init__(self, parent, id, pos=wxDefaultPosition, size=wxDefaultSize):
|
def __init__(self, parent, id, pos=wxDefaultPosition, size=wxDefaultSize):
|
||||||
wxWindow.__init__(self, parent, id, pos, size)
|
wxWindow.__init__(self, parent, id, pos, size)
|
||||||
@@ -241,10 +310,9 @@ class wxCalendar(wxWindow):
|
|||||||
|
|
||||||
self.grid_color = 'BLACK'
|
self.grid_color = 'BLACK'
|
||||||
self.back_color = 'WHITE'
|
self.back_color = 'WHITE'
|
||||||
|
self.hide_grid = FALSE
|
||||||
self.sel_color = 'RED'
|
self.sel_color = 'RED'
|
||||||
self.high_color = 'LIGHT BLUE'
|
self.hide_title = FALSE
|
||||||
self.font = wxSWISS
|
|
||||||
self.bold = wxNORMAL
|
|
||||||
|
|
||||||
self.SetBackgroundColour(wxNamedColor(self.back_color))
|
self.SetBackgroundColour(wxNamedColor(self.back_color))
|
||||||
self.Connect(-1, -1, wxEVT_LEFT_DOWN, self.OnLeftEvent)
|
self.Connect(-1, -1, wxEVT_LEFT_DOWN, self.OnLeftEvent)
|
||||||
@@ -258,8 +326,6 @@ class wxCalendar(wxWindow):
|
|||||||
self.SetNow() # default calendar for current month
|
self.SetNow() # default calendar for current month
|
||||||
|
|
||||||
self.size = None
|
self.size = None
|
||||||
self.hide_title = FALSE
|
|
||||||
self.hide_grid = FALSE
|
|
||||||
self.set_day = None
|
self.set_day = None
|
||||||
|
|
||||||
# control some of the main calendar attributes
|
# control some of the main calendar attributes
|
||||||
@@ -390,9 +456,8 @@ class wxCalendar(wxWindow):
|
|||||||
def GetDayHit(self, mx, my):
|
def GetDayHit(self, mx, my):
|
||||||
for key in self.rg.keys():
|
for key in self.rg.keys():
|
||||||
val = self.rg[key]
|
val = self.rg[key]
|
||||||
rt = wxRegion()
|
ms_rect = wxRect(mx, my, 1, 1)
|
||||||
rt.UnionRect(val)
|
if wxIntersectRect(ms_rect, val) != None:
|
||||||
if rt.Contains(mx, my) != 0:
|
|
||||||
result = self.TestDay(key)
|
result = self.TestDay(key)
|
||||||
return result
|
return result
|
||||||
return None
|
return None
|
||||||
@@ -407,7 +472,8 @@ class wxCalendar(wxWindow):
|
|||||||
DC = wxPaintDC(self)
|
DC = wxPaintDC(self)
|
||||||
DC.BeginDrawing()
|
DC.BeginDrawing()
|
||||||
|
|
||||||
self.cal = cal = CalDraw()
|
self.cal = cal = CalDraw(self)
|
||||||
|
|
||||||
if self.size is None:
|
if self.size is None:
|
||||||
size = self.GetClientSize()
|
size = self.GetClientSize()
|
||||||
else:
|
else:
|
||||||
@@ -415,14 +481,11 @@ class wxCalendar(wxWindow):
|
|||||||
|
|
||||||
# drawing attributes
|
# drawing attributes
|
||||||
|
|
||||||
cal.hide_title = self.hide_title
|
cal.grid_color = 'BLUE'
|
||||||
cal.hide_grid = self.hide_grid
|
|
||||||
|
|
||||||
cal.grid_color = self.grid_color
|
|
||||||
cal.high_color = self.high_color
|
|
||||||
cal.back_color = self.back_color
|
cal.back_color = self.back_color
|
||||||
cal.font = self.font
|
cal.hide_grid = self.hide_grid
|
||||||
cal.bold = self.bold
|
cal.grid_color = self.grid_color
|
||||||
|
cal.hide_title = self.hide_title
|
||||||
|
|
||||||
cal.SetSize(size)
|
cal.SetSize(size)
|
||||||
cal.SetCal(self.year, self.month)
|
cal.SetCal(self.year, self.month)
|
||||||
|
@@ -1,10 +1,24 @@
|
|||||||
|
#----------------------------------------------------------------------
|
||||||
|
# Name: wxPython.lib.filebrowsebutton
|
||||||
|
# Purpose: Composite controls that provide a Browse button next to
|
||||||
|
# either a wxTextCtrl or a wxComboBox. The Browse button
|
||||||
|
# launches a wxFileDialog and loads the result into the
|
||||||
|
# other control.
|
||||||
|
#
|
||||||
|
# Author: Mike Fletcher
|
||||||
|
#
|
||||||
|
# RCS-ID: $Id$
|
||||||
|
# Copyright: (c) 2000 by Total Control Software
|
||||||
|
# Licence: wxWindows license
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
|
||||||
from wxPython.wx import *
|
from wxPython.wx import *
|
||||||
import os
|
import os
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
|
|
||||||
class FileBrowseButton(wxPanel):
|
class FileBrowseButton(wxPanel):
|
||||||
''' A control to allow the user to type in a filename
|
""" A control to allow the user to type in a filename
|
||||||
or browse with the standard file dialog to select file
|
or browse with the standard file dialog to select file
|
||||||
|
|
||||||
__init__ (
|
__init__ (
|
||||||
@@ -24,13 +38,13 @@ class FileBrowseButton(wxPanel):
|
|||||||
label -- pointer to internal label widget
|
label -- pointer to internal label widget
|
||||||
textControl -- pointer to internal text control
|
textControl -- pointer to internal text control
|
||||||
browseButton -- pointer to button
|
browseButton -- pointer to button
|
||||||
'''
|
"""
|
||||||
def __init__ (self, parent, id= -1,
|
def __init__ (self, parent, id= -1,
|
||||||
pos = wxDefaultPosition, size = wxDefaultSize,
|
pos = wxDefaultPosition, size = wxDefaultSize,
|
||||||
style = wxTAB_TRAVERSAL,
|
style = wxTAB_TRAVERSAL,
|
||||||
labelText= "File Entry:",
|
labelText= "File Entry:",
|
||||||
buttonText= "Browse",
|
buttonText= "Browse",
|
||||||
toolTip= "Type filename or browse computer to choose file",
|
toolTip= "Type filename or click browse to choose file",
|
||||||
# following are the values for a file dialog box
|
# following are the values for a file dialog box
|
||||||
dialogTitle = "Choose a file",
|
dialogTitle = "Choose a file",
|
||||||
startDirectory = ".",
|
startDirectory = ".",
|
||||||
@@ -38,35 +52,41 @@ class FileBrowseButton(wxPanel):
|
|||||||
fileMask = "*.*",
|
fileMask = "*.*",
|
||||||
fileMode = wxOPEN,
|
fileMode = wxOPEN,
|
||||||
# callback for when value changes (optional)
|
# callback for when value changes (optional)
|
||||||
changeCallback= None
|
changeCallback= lambda x:x
|
||||||
):
|
):
|
||||||
wxPanel.__init__ (self, parent, id, pos, size, style)
|
|
||||||
# store variables
|
# store variables
|
||||||
|
self.labelText = labelText
|
||||||
|
self.buttonText = buttonText
|
||||||
|
self.toolTip = toolTip
|
||||||
self.dialogTitle = dialogTitle
|
self.dialogTitle = dialogTitle
|
||||||
self.startDirectory = startDirectory
|
self.startDirectory = startDirectory
|
||||||
|
self.initialValue = initialValue
|
||||||
self.fileMask = fileMask
|
self.fileMask = fileMask
|
||||||
self.fileMode = fileMode
|
self.fileMode = fileMode
|
||||||
self.changeCallback = changeCallback
|
self.changeCallback = changeCallback
|
||||||
|
|
||||||
|
# create the dialog
|
||||||
|
self.createDialog(parent, id, pos, size, style )
|
||||||
|
# Setting a value causes the changeCallback to be called.
|
||||||
|
# In this case that would be before the return of the
|
||||||
|
# constructor. Not good. So a default value on
|
||||||
|
# SetValue is used to disable the callback
|
||||||
|
self.SetValue( initialValue, 0)
|
||||||
|
|
||||||
|
def createDialog( self, parent, id, pos, size, style ):
|
||||||
|
"""Setup the graphic representation of the dialog"""
|
||||||
|
wxPanel.__init__ (self, parent, id, pos, size, style)
|
||||||
|
|
||||||
box = wxBoxSizer(wxHORIZONTAL)
|
box = wxBoxSizer(wxHORIZONTAL)
|
||||||
self.label = wxStaticText(self, -1, labelText, style =wxALIGN_RIGHT )
|
|
||||||
font = self.label.GetFont()
|
self.label = self.createLabel( )
|
||||||
w, h, d, e = self.GetFullTextExtent(labelText, font)
|
|
||||||
self.label.SetSize(wxSize(w+5, h))
|
|
||||||
box.Add( self.label, 0, wxCENTER )
|
box.Add( self.label, 0, wxCENTER )
|
||||||
|
|
||||||
ID = wxNewId()
|
self.textControl = self.createTextControl()
|
||||||
self.textControl = wxTextCtrl(self, ID)
|
|
||||||
self.textControl.SetToolTipString( toolTip )
|
|
||||||
box.Add( self.textControl, 1, wxLEFT|wxCENTER, 5)
|
box.Add( self.textControl, 1, wxLEFT|wxCENTER, 5)
|
||||||
if changeCallback:
|
|
||||||
EVT_TEXT(self.textControl, ID, changeCallback)
|
|
||||||
|
|
||||||
ID = wxNewId()
|
self.browseButton = self.createBrowseButton()
|
||||||
self.browseButton = button =wxButton(self, ID, buttonText)
|
box.Add( self.browseButton, 0, wxCENTER)
|
||||||
box.Add( button, 0, wxCENTER)
|
|
||||||
button.SetToolTipString( toolTip )
|
|
||||||
EVT_BUTTON(button, ID, self.OnBrowse)
|
|
||||||
|
|
||||||
# add a border around the whole thing and resize the panel to fit
|
# add a border around the whole thing and resize the panel to fit
|
||||||
outsidebox = wxBoxSizer(wxVERTICAL)
|
outsidebox = wxBoxSizer(wxVERTICAL)
|
||||||
@@ -79,10 +99,34 @@ class FileBrowseButton(wxPanel):
|
|||||||
if size.width != -1 or size.height != -1:
|
if size.width != -1 or size.height != -1:
|
||||||
self.SetSize(size)
|
self.SetSize(size)
|
||||||
|
|
||||||
|
def createLabel( self ):
|
||||||
|
"""Create the label/caption"""
|
||||||
|
label = wxStaticText(self, -1, self.labelText, style =wxALIGN_RIGHT )
|
||||||
|
font = label.GetFont()
|
||||||
|
w, h, d, e = self.GetFullTextExtent(self.labelText, font)
|
||||||
|
label.SetSize(wxSize(w+5, h))
|
||||||
|
return label
|
||||||
|
|
||||||
|
def createTextControl( self):
|
||||||
|
"""Create the text control"""
|
||||||
|
ID = wxNewId()
|
||||||
|
textControl = wxTextCtrl(self, ID)
|
||||||
|
textControl.SetToolTipString( self.toolTip )
|
||||||
|
if self.changeCallback:
|
||||||
|
EVT_TEXT(textControl, ID, self.changeCallback)
|
||||||
|
EVT_COMBOBOX(textControl, ID, self.changeCallback)
|
||||||
|
return textControl
|
||||||
|
|
||||||
|
def createBrowseButton( self):
|
||||||
|
"""Create the browse-button control"""
|
||||||
|
ID = wxNewId()
|
||||||
|
button =wxButton(self, ID, self.buttonText)
|
||||||
|
button.SetToolTipString( self.toolTip )
|
||||||
|
EVT_BUTTON(button, ID, self.OnBrowse)
|
||||||
|
return button
|
||||||
|
|
||||||
def OnBrowse (self, event = None):
|
def OnBrowse (self, event = None):
|
||||||
''' Going to browse for file... '''
|
""" Going to browse for file... """
|
||||||
current = self.GetValue ()
|
current = self.GetValue ()
|
||||||
directory = os.path.split(current)
|
directory = os.path.split(current)
|
||||||
if os.path.isdir( current):
|
if os.path.isdir( current):
|
||||||
@@ -95,56 +139,210 @@ class FileBrowseButton(wxPanel):
|
|||||||
if dlg.ShowModal() == wxID_OK:
|
if dlg.ShowModal() == wxID_OK:
|
||||||
self.SetValue (dlg.GetPath())
|
self.SetValue (dlg.GetPath())
|
||||||
dlg.Destroy()
|
dlg.Destroy()
|
||||||
self.textControl.SetFocus()
|
|
||||||
|
|
||||||
|
|
||||||
def GetValue (self):
|
def GetValue (self):
|
||||||
''' Convenient access to text control value '''
|
""" Convenient access to text control value """
|
||||||
return self.textControl.GetValue ()
|
return self.textControl.GetValue ()
|
||||||
|
|
||||||
|
def SetValue (self, value, callBack=1):
|
||||||
def SetValue (self, value):
|
""" Convenient setting of text control value """
|
||||||
''' Convenient setting of text control value '''
|
# Removed the return from here because SetValue doesn't return anything.
|
||||||
return self.textControl.SetValue (value)
|
self.textControl.SetValue (value)
|
||||||
|
|
||||||
def Enable (self, value):
|
def Enable (self, value):
|
||||||
''' Convenient enabling/disabling of entire control '''
|
""" Convenient enabling/disabling of entire control """
|
||||||
self.label.Enable (value)
|
self.label.Enable (value)
|
||||||
self.textControl.Enable (value)
|
self.textControl.Enable (value)
|
||||||
return self.browseButton.Enable (value)
|
return self.browseButton.Enable (value)
|
||||||
|
|
||||||
def GetLabel( self ):
|
def GetLabel( self ):
|
||||||
''' Retrieve the label's current text '''
|
""" Retrieve the label's current text """
|
||||||
return self.label.GetLabel()
|
return self.label.GetLabel()
|
||||||
|
|
||||||
def SetLabel( self, value ):
|
def SetLabel( self, value ):
|
||||||
''' Set the label's current text '''
|
""" Set the label's current text """
|
||||||
return self.label.SetLabel( value )
|
rvalue = self.label.SetLabel( value )
|
||||||
|
self.Refresh( true )
|
||||||
|
return rvalue
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class FileBrowseButtonWithHistory( FileBrowseButton ):
|
||||||
|
""" with following additions:
|
||||||
|
__init__(..., history=None)
|
||||||
|
|
||||||
|
history -- optional list of paths for initial history drop-down
|
||||||
|
(must be passed by name, not a positional argument)
|
||||||
|
If history is callable it will must return a list used
|
||||||
|
for the history drop-down
|
||||||
|
changeCallback -- as for FileBrowseButton, but with a work-around
|
||||||
|
for win32 systems which don't appear to create EVT_COMBOBOX
|
||||||
|
events properly. There is a (slight) chance that this work-around
|
||||||
|
will cause some systems to create two events for each Combobox
|
||||||
|
selection. If you discover this condition, please report it!
|
||||||
|
As for a FileBrowseButton.__init__ otherwise.
|
||||||
|
GetHistoryControl()
|
||||||
|
Return reference to the control which implements interfaces
|
||||||
|
required for manipulating the history list. See GetHistoryControl
|
||||||
|
documentation for description of what that interface is.
|
||||||
|
GetHistory()
|
||||||
|
Return current history list
|
||||||
|
SetHistory( value=(), selectionIndex = None )
|
||||||
|
Set current history list, if selectionIndex is not None, select that index
|
||||||
|
"""
|
||||||
|
def __init__( self, *arguments, **namedarguments):
|
||||||
|
self.history = namedarguments.get( "history" )
|
||||||
|
if self.history:
|
||||||
|
del namedarguments["history"]
|
||||||
|
|
||||||
|
self.historyCallBack=None
|
||||||
|
if callable(self.history):
|
||||||
|
self.historyCallBack=self.history
|
||||||
|
self.history=None
|
||||||
|
apply( FileBrowseButton.__init__, ( self,)+arguments, namedarguments)
|
||||||
|
|
||||||
|
def createTextControl( self):
|
||||||
|
"""Create the text control"""
|
||||||
|
ID = wxNewId()
|
||||||
|
textControl = wxComboBox(self, ID, style = wxCB_DROPDOWN )
|
||||||
|
textControl.SetToolTipString( self.toolTip )
|
||||||
|
EVT_SET_FOCUS(textControl, self.OnSetFocus)
|
||||||
|
if self.changeCallback:
|
||||||
|
EVT_TEXT(textControl, ID, self.changeCallback)
|
||||||
|
EVT_COMBOBOX(textControl, ID, self.changeCallback)
|
||||||
|
if self.history:
|
||||||
|
history=self.history
|
||||||
|
self.history=None
|
||||||
|
self.SetHistory( history, control=textControl)
|
||||||
|
return textControl
|
||||||
|
|
||||||
|
def GetHistoryControl( self ):
|
||||||
|
"""Return a pointer to the control which provides (at least)
|
||||||
|
the following methods for manipulating the history list.:
|
||||||
|
Append( item ) -- add item
|
||||||
|
Clear() -- clear all items
|
||||||
|
Delete( index ) -- 0-based index to delete from list
|
||||||
|
SetSelection( index ) -- 0-based index to select in list
|
||||||
|
Semantics of the methods follow those for the wxComboBox control
|
||||||
|
"""
|
||||||
|
return self.textControl
|
||||||
|
|
||||||
|
def SetHistory( self, value=(), selectionIndex = None, control=None ):
|
||||||
|
"""Set the current history list"""
|
||||||
|
if control is None:
|
||||||
|
control = self.GetHistoryControl()
|
||||||
|
if self.history == value:
|
||||||
|
return
|
||||||
|
self.history = value
|
||||||
|
# Clear history values not the selected one.
|
||||||
|
tempValue=control.GetValue()
|
||||||
|
# clear previous values
|
||||||
|
control.Clear()
|
||||||
|
control.SetValue(tempValue)
|
||||||
|
# walk through, appending new values
|
||||||
|
for path in value:
|
||||||
|
control.Append( path )
|
||||||
|
if selectionIndex is not None:
|
||||||
|
control.SetSelection( selectionIndex )
|
||||||
|
|
||||||
|
def GetHistory( self ):
|
||||||
|
"""Return the current history list"""
|
||||||
|
if self.historyCallBack != None:
|
||||||
|
return self.historyCallBack()
|
||||||
|
else:
|
||||||
|
return list( self.history )
|
||||||
|
|
||||||
|
def OnSetFocus(self, event):
|
||||||
|
"""When the history scroll is selected, update the history"""
|
||||||
|
if self.historyCallBack != None:
|
||||||
|
self.SetHistory( self.historyCallBack(), control=self.textControl)
|
||||||
|
event.Skip()
|
||||||
|
|
||||||
|
if wxPlatform == "__WXMSW__":
|
||||||
|
def SetValue (self, value, callBack=1):
|
||||||
|
""" Convenient setting of text control value, works
|
||||||
|
around limitation of wxComboBox """
|
||||||
|
# Removed the return from here because SetValue doesn't return anything.
|
||||||
|
self.textControl.SetValue (value)
|
||||||
|
# Hack to call an event handler
|
||||||
|
class LocalEvent:
|
||||||
|
def __init__(self, string):
|
||||||
|
self._string=string
|
||||||
|
def GetString(self):
|
||||||
|
return self._string
|
||||||
|
if callBack==1:
|
||||||
|
# The callback wasn't being called when SetValue was used ??
|
||||||
|
# So added this explicit call to it
|
||||||
|
self.changeCallback(LocalEvent(value))
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
#from skeletonbuilder import rulesfile
|
#from skeletonbuilder import rulesfile
|
||||||
|
class SimpleCallback:
|
||||||
|
def __init__( self, tag ):
|
||||||
|
self.tag = tag
|
||||||
|
def __call__( self, event ):
|
||||||
|
print self.tag, event.GetString()
|
||||||
class DemoFrame( wxFrame ):
|
class DemoFrame( wxFrame ):
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
wxFrame.__init__(self, parent, 2400, "File entry with browse", size=(500,100) )
|
wxFrame.__init__(self, parent, 2400, "File entry with browse", size=(500,220) )
|
||||||
panel = wxPanel (self,-1)
|
panel = wxPanel (self,-1)
|
||||||
innerbox = wxBoxSizer(wxVERTICAL)
|
innerbox = wxBoxSizer(wxVERTICAL)
|
||||||
control = FileBrowseButton(panel)
|
control = FileBrowseButton(
|
||||||
|
panel,
|
||||||
|
initialValue = "z:\\temp",
|
||||||
|
)
|
||||||
innerbox.Add( control, 0, wxEXPAND )
|
innerbox.Add( control, 0, wxEXPAND )
|
||||||
control = FileBrowseButton(panel, labelText = "With Callback", style = wxSUNKEN_BORDER ,changeCallback= self.OnFileNameChanged)
|
middlecontrol = FileBrowseButtonWithHistory(
|
||||||
innerbox.Add( control, 0, wxEXPAND|wxALIGN_BOTTOM )
|
panel,
|
||||||
|
labelText = "With History",
|
||||||
|
initialValue = "d:\\temp",
|
||||||
|
history = ["c:\\temp", "c:\\tmp", "r:\\temp","z:\\temp"],
|
||||||
|
changeCallback= SimpleCallback( "With History" ),
|
||||||
|
)
|
||||||
|
innerbox.Add( middlecontrol, 0, wxEXPAND )
|
||||||
|
middlecontrol = FileBrowseButtonWithHistory(
|
||||||
|
panel,
|
||||||
|
labelText = "History callback",
|
||||||
|
initialValue = "d:\\temp",
|
||||||
|
history = self.historyCallBack,
|
||||||
|
changeCallback= SimpleCallback( "History callback" ),
|
||||||
|
)
|
||||||
|
innerbox.Add( middlecontrol, 0, wxEXPAND )
|
||||||
|
self.bottomcontrol = control = FileBrowseButton(
|
||||||
|
panel,
|
||||||
|
labelText = "With Callback",
|
||||||
|
style = wxSUNKEN_BORDER|wxCLIP_CHILDREN ,
|
||||||
|
changeCallback= SimpleCallback( "With Callback" ),
|
||||||
|
)
|
||||||
|
innerbox.Add( control, 0, wxEXPAND)
|
||||||
|
ID = wxNewId()
|
||||||
|
innerbox.Add( wxButton( panel, ID,"Change Label", ), 1, wxEXPAND)
|
||||||
|
EVT_BUTTON( self, ID, self.OnChangeLabel )
|
||||||
|
ID = wxNewId()
|
||||||
|
innerbox.Add( wxButton( panel, ID,"Change Value", ), 1, wxEXPAND)
|
||||||
|
EVT_BUTTON( self, ID, self.OnChangeValue )
|
||||||
panel.SetAutoLayout(true)
|
panel.SetAutoLayout(true)
|
||||||
panel.SetSizer( innerbox )
|
panel.SetSizer( innerbox )
|
||||||
|
self.history={"c:\\temp":1, "c:\\tmp":1, "r:\\temp":1,"z:\\temp":1}
|
||||||
|
|
||||||
def OnFileNameChanged (self, event):
|
def historyCallBack(self):
|
||||||
print "Filename changed", event.GetString ()
|
keys=self.history.keys()
|
||||||
|
keys.sort()
|
||||||
|
return keys
|
||||||
|
|
||||||
|
def OnFileNameChangedHistory (self, event):
|
||||||
|
self.history[event.GetString ()]=1
|
||||||
|
|
||||||
def OnCloseMe(self, event):
|
def OnCloseMe(self, event):
|
||||||
self.Close(true)
|
self.Close(true)
|
||||||
|
def OnChangeLabel( self, event ):
|
||||||
|
self.bottomcontrol.SetLabel( "Label Updated" )
|
||||||
|
def OnChangeValue( self, event ):
|
||||||
|
self.bottomcontrol.SetValue( "r:\\somewhere\\over\\the\\rainbow.htm" )
|
||||||
|
|
||||||
def OnCloseWindow(self, event):
|
def OnCloseWindow(self, event):
|
||||||
self.Destroy()
|
self.Destroy()
|
||||||
@@ -163,7 +361,7 @@ if __name__ == "__main__":
|
|||||||
def test( ):
|
def test( ):
|
||||||
app = DemoApp(0)
|
app = DemoApp(0)
|
||||||
app.MainLoop()
|
app.MainLoop()
|
||||||
print 'Creating dialogue'
|
print 'Creating dialog'
|
||||||
test( )
|
test( )
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* FILE : oglbasic.cpp
|
* FILE : ./oglbasic.cpp
|
||||||
*
|
*
|
||||||
* This file was automatically generated by :
|
* This file was automatically generated by :
|
||||||
* Simplified Wrapper and Interface Generator (SWIG)
|
* Simplified Wrapper and Interface Generator (SWIG)
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* FILE : oglshapes.cpp
|
* FILE : ./oglshapes.cpp
|
||||||
*
|
*
|
||||||
* This file was automatically generated by :
|
* This file was automatically generated by :
|
||||||
* Simplified Wrapper and Interface Generator (SWIG)
|
* Simplified Wrapper and Interface Generator (SWIG)
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* FILE : oglshapes2.cpp
|
* FILE : ./oglshapes2.cpp
|
||||||
*
|
*
|
||||||
* This file was automatically generated by :
|
* This file was automatically generated by :
|
||||||
* Simplified Wrapper and Interface Generator (SWIG)
|
* Simplified Wrapper and Interface Generator (SWIG)
|
||||||
|
Reference in New Issue
Block a user