more changes to the demo

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_2_BRANCH@7187 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2000-04-17 04:25:48 +00:00
parent 833a6790ad
commit 9bf69b7bb5
7 changed files with 300 additions and 89 deletions

View File

@@ -30,7 +30,13 @@ mouthful!) and wxCalendar has printing support.
Added ActiveXWrapper to the library, and some good demos of it too. Added ActiveXWrapper to the library, and some good demos of it too.
It works great for embedding a COM (a.k.a OCX, a.k.a Activex) control It works great for embedding a COM (a.k.a OCX, a.k.a Activex) control
in a window and calling its methods. in a window and calling its methods. It actually creates a new class
on the fly that derives from wxWindow, the COM CoClass and others
needed to make it all work. The resulting class can be instantiated
just like wxWindow, used in sizers, etc. It also responds to all COM
method calls, properties, etc., and if the class or a mix-in has
matching method names, then the COM events will be propogated back to
them.

View File

@@ -14,18 +14,22 @@ except:
#---------------------------------------------------------------------- #----------------------------------------------------------------------
class TestPanel(wxPanel): class TestPanel(wxWindow):
def __init__(self, parent, log): def __init__(self, parent, log, frame=None):
wxPanel.__init__(self, parent, -1)#, style=wxCLIP_CHILDREN) wxWindow.__init__(self, parent, -1)#, style=wxCLIP_CHILDREN)
self.log = log self.log = log
self.current = "http://alldunn.com/" self.current = "http://alldunn.com/"
self.frame = frame
if frame:
self.titleBase = frame.GetTitle()
sizer = wxBoxSizer(wxVERTICAL) sizer = wxBoxSizer(wxVERTICAL)
btnSizer = wxBoxSizer(wxHORIZONTAL) btnSizer = wxBoxSizer(wxHORIZONTAL)
# Make a new class that derives from the WebBrowser class in the # Make a new class that derives from the WebBrowser class in the
# COM module imported above. This class also drives from wxWindow and # COM module imported above. This class also derives from wxWindow and
# implements the machinery needed to integrate the two things. # implements the machinery needed to integrate the two worlds.
theClass = MakeActiveXClass(browserModule.WebBrowser, theClass = MakeActiveXClass(browserModule.WebBrowser,
eventObj = self) eventObj = self)
@@ -50,24 +54,44 @@ class TestPanel(wxPanel):
self.location = wxComboBox(self, wxNewId(), "", style=wxCB_DROPDOWN) self.location = wxComboBox(self, wxNewId(), "", style=wxCB_DROPDOWN)
EVT_COMBOBOX(self, self.location.GetId(), self.OnLocationSelect) EVT_COMBOBOX(self, self.location.GetId(), self.OnLocationSelect)
EVT_KEY_UP(self.location, self.OnLocationKey)
#EVT_CHAR(self.location, self.IgnoreReturn)
btnSizer.Add(self.location, 1, wxEXPAND|wxALL, 5) btnSizer.Add(self.location, 1, wxEXPAND|wxALL, 5)
sizer.Add(btnSizer, 0, wxEXPAND) sizer.Add(btnSizer, 0, wxEXPAND)
sizer.Add(self.ie, 1, wxEXPAND) sizer.Add(self.ie, 1, wxEXPAND)
self.ie.Navigate(self.current) self.ie.Navigate(self.current)
self.location.Append(self.current)
self.SetSizer(sizer) self.SetSizer(sizer)
self.SetAutoLayout(true) self.SetAutoLayout(true)
def OnSize(self, evt):
self.Layout()
def __del__(self): def __del__(self):
self.ie.Cleanup() self.ie.Cleanup()
self.ie = None self.ie = None
def OnLocationSelect(self, evt): def OnLocationSelect(self, evt):
pass url = self.location.GetStringSelection()
self.log.write('OnLocationSelect: %s\n' % url)
self.ie.Navigate(url)
def OnLocationKey(self, evt):
if evt.KeyCode() == WXK_RETURN:
URL = self.location.GetValue()
self.location.Append(URL)
self.ie.Navigate(URL)
else:
evt.Skip()
def IgnoreReturn(self, evt):
print 'IgnoreReturn'
if evt.KeyCode() != WXK_RETURN:
evt.Skip()
def OnOpenButton(self, event): def OnOpenButton(self, event):
dlg = wxTextEntryDialog(self, "Open Location", dlg = wxTextEntryDialog(self, "Open Location",
@@ -100,12 +124,22 @@ class TestPanel(wxPanel):
self.current = URL self.current = URL
self.location.SetValue(URL) self.location.SetValue(URL)
def OnTitleChange(self, text):
self.log.write('OnTitleChange: %s\n' % text)
if self.frame:
self.frame.SetTitle(self.titleBase + ' -- ' + text)
def OnStatusTextChange(self, text):
self.log.write('OnStatusTextChange: %s\n' % text)
if self.frame:
self.frame.SetStatusText(text)
#---------------------------------------------------------------------- #----------------------------------------------------------------------
# for the demo framework... # for the demo framework...
def runTest(frame, nb, log): def runTest(frame, nb, log):
win = TestPanel(nb, log) win = TestPanel(nb, log, frame)
return win return win
@@ -120,7 +154,8 @@ if __name__ == '__main__':
wxFrame.__init__(self, None, -1, "ActiveX test -- Internet Explorer", wxFrame.__init__(self, None, -1, "ActiveX test -- Internet Explorer",
size=(640, 480), size=(640, 480),
style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE) style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE)
self.tp = TestPanel(self, sys.stdout) self.CreateStatusBar()
self.tp = TestPanel(self, sys.stdout, self)
def OnCloseWindow(self, event): def OnCloseWindow(self, event):
self.tp.ie.Cleanup() self.tp.ie.Cleanup()

View File

@@ -63,7 +63,7 @@ _treeList = [
class wxPythonDemo(wxFrame): class wxPythonDemo(wxFrame):
def __init__(self, parent, id, title): def __init__(self, parent, id, title):
wxFrame.__init__(self, parent, -1, title, size = (725, 550), wxFrame.__init__(self, parent, -1, title, size = (800, 600),
style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE) style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE)
self.cwd = os.getcwd() self.cwd = os.getcwd()
@@ -185,7 +185,7 @@ class wxPythonDemo(wxFrame):
if _useSplitter: if _useSplitter:
if _useNestedSplitter: if _useNestedSplitter:
splitter2.SplitHorizontally(self.nb, self.log) splitter2.SplitHorizontally(self.nb, self.log)
splitter2.SetSashPosition(360, true) splitter2.SetSashPosition(450, true)
splitter2.SetMinimumPaneSize(20) splitter2.SetMinimumPaneSize(20)
splitter.SplitVertically(self.tree, splitter2) splitter.SplitVertically(self.tree, splitter2)

View File

@@ -5,7 +5,7 @@
# Author: Lorne White (email: lwhite1@planet.eon.net) # Author: Lorne White (email: lwhite1@planet.eon.net)
# #
# Created: # Created:
# Version 0.7 200/03/30 # Version 0.8 2000/04/16
# Licence: wxWindows license # Licence: wxWindows license
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
@@ -70,6 +70,7 @@ class TestPanel(wxPanel):
self.calend.hide_title = TRUE self.calend.hide_title = TRUE
self.calend.HideGrid() self.calend.HideGrid()
self.calend.SetWeekColor('WHITE', 'BLACK')
# display routine # display routine
@@ -186,6 +187,7 @@ class TestPanel(wxPanel):
except: except:
set_days = [1, 5, 12] set_days = [1, 5, 12]
self.calend.AddSelect([4, 11], 'BLUE', 'WHITE')
self.calend.SetSelDay(set_days) self.calend.SetSelDay(set_days)
self.calend.Refresh() self.calend.Refresh()
@@ -257,6 +259,8 @@ class CalenDlg(wxDialog):
self.calend.SetYear(start_year) self.calend.SetYear(start_year)
self.calend.HideTitle() self.calend.HideTitle()
self.calend.ShowWeekEnd()
self.ResetDisplay() self.ResetDisplay()
self.Connect(self.calend.GetId(), -1, 2100, self.MouseClick) self.Connect(self.calend.GetId(), -1, 2100, self.MouseClick)
@@ -303,6 +307,8 @@ class CalenDlg(wxDialog):
except: except:
set_days = [1, 5, 12] set_days = [1, 5, 12]
self.calend.AddSelect([4, 11], 'BLUE', 'WHITE')
self.calend.SetSelDay(set_days) self.calend.SetSelDay(set_days)
self.calend.Refresh() self.calend.Refresh()
@@ -326,6 +332,9 @@ class CalendFrame(wxFrame):
self.calend = wxCalendar(self, -1) self.calend = wxCalendar(self, -1)
self.calend.SetCurrentDay() self.calend.SetCurrentDay()
self.calend.grid_color = 'BLUE' self.calend.grid_color = 'BLUE'
self.calend.SetBusType()
# self.calend.ShowWeekEnd()
self.ResetDisplay() self.ResetDisplay()
self.Connect(self.calend.GetId(), -1, 2100, self.MouseClick) self.Connect(self.calend.GetId(), -1, 2100, self.MouseClick)
@@ -344,6 +353,8 @@ class CalendFrame(wxFrame):
except: except:
set_days = [1, 5, 12] set_days = [1, 5, 12]
self.calend.AddSelect([2, 16], 'GREEN', 'WHITE')
self.calend.SetSelDay(set_days) self.calend.SetSelDay(set_days)
self.calend.Refresh() self.calend.Refresh()
@@ -525,20 +536,29 @@ class PrintCalend:
cal.font = self.font cal.font = self.font
cal.bold = self.bold cal.bold = self.bold
cal_size = wxSize(3.0, 2.0) cal_size = wxSize(3.0, 3.0)
cal.SetSize(cal_size) cal.SetSize(cal_size)
year, month = self.year, self.month year, month = self.year, self.month
x = 1.0 x = 1.0
for i in range(2): for i in range(2):
y = 0.5 y = 0.5
for j in range(3): for j in range(3):
cal.SetCal(year, month) # current month cal.SetCal(year, month) # current month
cal.SetPos(x, y) cal.SetPos(x, y)
cal.DrawCal(DC, self.sel_lst)
try:
set_days = test_days[month]
except:
set_days = [1, 5, 12]
cal.AddSelect([2, 16], 'GREEN', 'WHITE')
cal.DrawCal(DC, set_days)
year, month = self.IncMonth(year, month) year, month = self.IncMonth(year, month)
y = y + 2.5 y = y + 3.5
x = x + 4.0 # next colum x = x + 4.0 # next colum
DC.EndDrawing() DC.EndDrawing()
@@ -695,8 +715,9 @@ def runTest(frame, nb, log):
overview = """\ overview = """\
This control provides a calendar control class for displaying and selecting dates. In addition, the class is extended and can now be used for printing/previewing. This control provides a calendar control class for displaying and selecting dates. In addition, the class is extended and can now be used for printing/previewing.
Additional features include weekend highlighting and business type Monday-Sunday format.
See example for various methods used to set display month, year, and highlighted dates (different colour). See example for various methods used to set display month, year, and highlighted dates (different font and background colours).
by Lorne White by Lorne White

View File

@@ -18,11 +18,15 @@ class TestComboBox(wxPanel):
wxComboBox(self, 500, "default value", wxPoint(80, 50), wxSize(95, -1), wxComboBox(self, 500, "default value", wxPoint(80, 50), wxSize(95, -1),
sampleList, wxCB_DROPDOWN) sampleList, wxCB_DROPDOWN)
EVT_COMBOBOX(self, 500, self.EvtComboBox) EVT_COMBOBOX(self, 500, self.EvtComboBox)
EVT_TEXT(self, 500, self.EvtText)
def EvtComboBox(self, event): def EvtComboBox(self, event):
self.log.WriteText('EvtComboBox: %s\n' % event.GetString()) self.log.WriteText('EvtComboBox: %s\n' % event.GetString())
def EvtText(self, event):
self.log.WriteText('EvtText: %s\n' % event.GetString())
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
def runTest(frame, nb, log): def runTest(frame, nb, log):

View File

@@ -2,7 +2,7 @@
# Name: wxPython.lib.activexwrapper # Name: wxPython.lib.activexwrapper
# Purpose: a wxWindow derived class that can hold an ActiveX control # Purpose: a wxWindow derived class that can hold an ActiveX control
# #
# Author: Mike Fletcher, Robin Dunn # Author: Robin Dunn
# #
# RCS-ID: $Id$ # RCS-ID: $Id$
# Copyright: (c) 2000 by Total Control Software # Copyright: (c) 2000 by Total Control Software
@@ -13,70 +13,127 @@ from wxPython.wx import *
try: try:
import win32ui import win32ui
import pywin.mfc.activex
import win32com.client
except ImportError: except ImportError:
raise ImportError( "Cannot find win32ui module, wxWindows ActiveXControl module cannot be loaded") raise ImportError( "ActiveXWrapper requires PythonWin. Please install the win32all-xxx.exe package.")
### Following makes it possible to include this module without
# needing to include the (rather large) win32con module...
##from win32con import WS_TABSTOP, WS_VISIBLE ##from win32con import WS_TABSTOP, WS_VISIBLE
WS_TABSTOP = 0x10000 WS_TABSTOP = 0x00010000
WS_VISIBLE = 0x10000000 WS_VISIBLE = 0x10000000
class ActiveXWrapper( wxWindow ): #----------------------------------------------------------------------
def MakeActiveXClass(CoClass, eventClass=None, eventObj=None):
""" """
Class providing easy integration of ActiveXControls into Dynamically construct a new class that derives from wxWindow, the
wxPython GUI environments. Pass an instantiated control class (one ActiveX control and the appropriate COM classes. This new class
which inherits from pywin.mfc.activex.Control and a particular control can be used just like the wxWindow class, but will also respond
class generated by gencache) in the argument "control". Alternatively, appropriately to the methods and properties of the COM object. If
pass the instantiated control to the SetControl method to allow for this class, a derived class or a mix-in class has method names
specifying the win32 style, id, etceteras that match the COM objects event names, they will be called
automatically.
CoClass -- A COM control class from a module generated by
makepy.py from a COM TypeLibrary. Can also accept a
CLSID.
eventClass -- If given, this class will be added to the set of
base classes that the new class is drived from. It is
good for mix-in classes for catching events.
eventObj -- If given, this object will be searched for attributes
by the new class's __getattr__ method, (like a mix-in
object.) This is useful if you want to catch COM
callbacks in an existing object, (such as the parent
window.)
""" """
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", if type(CoClass) == type(""):
style=WS_TABSTOP | WS_VISIBLE, ID=None): # use the CLSID to get the real class
""" CoClass = win32com.client.CLSIDToClass(CoClass)
Pass a pre-built control object, calls the control's
CreateControl method with the proper arguments to make it a # determine the base classes
child of this window axEventClass = CoClass.default_source
""" baseClasses = [wxWindow, pywin.mfc.activex.Control, CoClass, axEventClass]
self.control = controlObject if eventClass:
w,h = self.GetSizeTuple() baseClasses.append(eventClass)
if not ID: baseClasses = tuple(baseClasses)
ID = wxNewId()
self.control.CreateControl( name, style, (0,0,w,h), # define the class attributes
self.windowPointer, className = 'AXControl_'+CoClass.__name__
ID) classDict = { '__init__' : axw__init__,
'__getattr__' : axw__getattr__,
'axw_OnSize' : axw_OnSize,
'axw_OEB' : axw_OEB,
'_name' : className,
'_eventBase' : axEventClass,
'_eventObj' : eventObj,
'Cleanup' : axw_Cleanup,
}
# make a new class object
import new
classObj = new.classobj(className, baseClasses, classDict)
return classObj
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)
# These functions will be used as methods in the new class
def axw__init__(self, parent, ID, pos=wxDefaultPosition, size=wxDefaultSize, style=0):
# init base classes
pywin.mfc.activex.Control.__init__(self)
wxWindow.__init__(self, parent, -1, pos, size, style)
win32ui.EnableControlContainer()
self._eventObj = self._eventObj # move from class to instance
# create a pythonwin wrapper around this wxWindow
handle = self.GetHandle()
self._wnd = win32ui.CreateWindowFromHandle(handle)
# create the control
sz = self.GetSize()
self.CreateControl(self._name, WS_TABSTOP | WS_VISIBLE,
(0, 0, sz.width, sz.height), self._wnd, ID)
# init the ax events part of the object
self._eventBase.__init__(self, self._dispobj_)
# hook some wx events
EVT_SIZE(self, self.axw_OnSize)
EVT_ERASE_BACKGROUND(self, self.axw_OEB)
def axw__getattr__(self, attr):
try:
return pywin.mfc.activex.Control.__getattr__(self, attr)
except AttributeError:
try:
eo = self.__dict__['_eventObj']
return getattr(eo, attr)
except AttributeError:
raise AttributeError('Attribute not found: %s' % attr)
def axw_OnSize(self, event):
sz = self.GetClientSize() # get wxWindow size
self.MoveWindow((0, 0, sz.width, sz.height), 1) # move the AXControl
def axw_OEB(self, event):
pass
def axw_Cleanup(self):
#del self._wnd
self.close()
## anything else???

View File

@@ -19,6 +19,7 @@ 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 = 160 _MIDSIZE = 160
BusCalDays = [0, 1, 2, 3, 4, 5, 6]
# calendar drawing routing # calendar drawing routing
@@ -34,13 +35,17 @@ class CalDraw:
self.DefParms() self.DefParms()
def DefParms(self): def DefParms(self):
self.grid_color = 'BLACK' self.grid_color = 'BLACK' # grid and selection colors
self.back_color = 'WHITE' self.back_color = 'WHITE'
self.sel_color = 'RED' self.sel_color = 'RED'
self.high_color = 'LIGHT BLUE' self.high_color = 'LIGHT BLUE'
self.border_color = 'BLACK' self.border_color = 'BLACK'
self.week_color = 'LIGHT GREY' self.week_color = 'LIGHT GREY'
self.week_font_color = 'BLACK' # font colors
self.day_font_color = 'BLACK'
self.font = wxSWISS self.font = wxSWISS
self.bold = wxNORMAL self.bold = wxNORMAL
@@ -49,6 +54,13 @@ class CalDraw:
self.outer_border = TRUE self.outer_border = TRUE
self.title_offset = 0 self.title_offset = 0
self.cal_week_scale = 0.7
self.show_weekend = FALSE
self.cal_type = "NORMAL"
def SetWeekColor(self, font_color, week_color): # set font and background color for week title
self.week_font_color = font_color
self.week_color = week_color
def SetSize(self, size): def SetSize(self, size):
self.set_sizew = size.width self.set_sizew = size.width
@@ -56,6 +68,7 @@ class CalDraw:
def InitValues(self): # default dimensions of various elements of the calendar def InitValues(self): # default dimensions of various elements of the calendar
self.rg = {} self.rg = {}
self.cal_sel = {}
self.set_cy_st = 0 # start position self.set_cy_st = 0 # start position
self.set_cx_st = 0 self.set_cx_st = 0
@@ -83,12 +96,11 @@ class CalDraw:
self.y_mrg = self.set_y_mrg * self.pheight self.y_mrg = self.set_y_mrg * self.pheight
self.y_end = self.set_y_end * 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.InitScale()
self.DrawBorder() self.DrawBorder()
if self.hide_title is FALSE: if self.hide_title is FALSE:
self.DrawMonth() self.DrawMonth()
@@ -97,10 +109,24 @@ class CalDraw:
self.DrawGrid() self.DrawGrid()
self.GetRect() self.GetRect()
self.DrawSel(sel_lst) # highlighted days if self.show_weekend is TRUE: # highlight weekend dates
self.SetWeekEnd()
self.AddSelect(sel_lst) # overrides the weekend highlight
self.DrawSel() # highlighted days
self.DrawWeek() self.DrawWeek()
self.DrawNum() self.DrawNum()
def AddSelect(self, list, cfont=None, cbackgrd = None):
if cfont is None:
cfont = self.sel_color # font digit color
if cbackgrd is None:
cbackgrd = self.high_color # select background color
for val in list:
self.cal_sel[val] = (cfont, cbackgrd)
def DrawBorder(self): # 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) brush = wxBrush(wxNamedColour(self.back_color), wxSOLID)
self.DC.SetBrush(brush) self.DC.SetBrush(brush)
@@ -123,9 +149,13 @@ class CalDraw:
day = 1 day = 1
t = Date(year, month, day) t = Date(year, month, day)
dow = t.day_of_week # start day in month dow = self.dow = t.day_of_week # start day in month
dim = t.days_in_month # number of days in month dim = self.dim = t.days_in_month # number of days in month
start_pos = dow+1 if self.cal_type == "NORMAL":
start_pos = dow+1
else:
start_pos = dow
self.st_pos = start_pos self.st_pos = start_pos
self.cal = [] self.cal = []
@@ -137,6 +167,17 @@ class CalDraw:
i = i + 1 i = i + 1
return start_pos return start_pos
def SetWeekEnd(self, font_color='BLACK', backgrd = 'LIGHT GREY'):
date = 6 - int(self.dow) # start day of first saturday
while date <= self.dim:
self.cal_sel[date] = (font_color, backgrd) # Saturday
date = date + 1
if date <= self.dim:
self.cal_sel[date] = (font_color, backgrd) # Sunday
date = date + 6
else:
date = date + 7
def GetRect(self): # get the display rectange list of the day grid def GetRect(self): # get the display rectange list of the day grid
cnt = 0 cnt = 0
for y in self.gridy[1:-1]: for y in self.gridy[1:-1]:
@@ -168,13 +209,13 @@ class CalDraw:
year = str(self.year) year = str(self.year)
tw,th = self.DC.GetTextExtent(year) tw,th = self.DC.GetTextExtent(year)
adjust = self.cx_st + self.sizew-tw-20 adjust = self.sizew - tw - self.x_mrg
self.title_offset = th * 2 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, self.cy_st + th) self.DC.DrawText(year, self.cx_st + adjust, self.cy_st + th)
def DrawWeek(self): # draw the week days def DrawWeek(self): # draw the week days
sizef = 8 sizef = 8
@@ -183,6 +224,7 @@ class CalDraw:
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.SetTextForeground(wxNamedColour(self.week_font_color))
cnt_x = 0 cnt_x = 0
cnt_y = 0 cnt_y = 0
@@ -195,7 +237,12 @@ class CalDraw:
self.DC.SetBrush(brush) self.DC.SetBrush(brush)
# self.DC.DrawRectangle(self.gridx[0], self.gridy[0], rect_w+1, height) # self.DC.DrawRectangle(self.gridx[0], self.gridy[0], rect_w+1, height)
for val in CalDays: if self.cal_type == "NORMAL":
cal_days = CalDays
else:
cal_days = BusCalDays
for val in cal_days:
day = AbrWeekday[val] day = AbrWeekday[val]
if self.sizew < 200: if self.sizew < 200:
day = day[0] day = day[0]
@@ -215,13 +262,22 @@ class CalDraw:
if self.sizeh < _MIDSIZE: if self.sizeh < _MIDSIZE:
sizef = 8 sizef = 8
f = wxFont(sizef, self.font, wxNORMAL, self.bold) f = wxFont(sizef, self.font, wxNORMAL, self.bold)
self.DC.SetFont(f)
cnt_x = 0 cnt_x = 0
cnt_y = 1 cnt_y = 1
for val in self.cal: for val in self.cal:
x = self.gridx[cnt_x] x = self.gridx[cnt_x]
y = self.gridy[cnt_y] y = self.gridy[cnt_y]
try:
num_val = int(val)
num_color = self.cal_sel[num_val][0]
except:
num_color = self.day_font_color
self.DC.SetTextForeground(wxNamedColour(num_color))
self.DC.SetFont(f)
self.DC.DrawText(val, x+5, y+5) self.DC.DrawText(val, x+5, y+5)
if cnt_x < 6: if cnt_x < 6:
cnt_x = cnt_x + 1 cnt_x = cnt_x + 1
@@ -236,14 +292,16 @@ class CalDraw:
self.dl_w = int((self.sizew-bdw)/7) self.dl_w = int((self.sizew-bdw)/7)
self.dl_h = int((self.sizeh-bdh)/7) self.dl_h = int((self.sizeh-bdh)/7)
self.dl_th = int(2*self.dl_h/3) # week title adjustment self.dl_th = int(self.dl_h*self.cal_week_scale) # week title adjustment
self.cwidth = self.dl_w * 7 self.cwidth = self.dl_w * 7
self.cheight = self.dl_h * 6 + self.dl_th self.cheight = self.dl_h * 6 + self.dl_th
def DrawSel(self, sel_lst): # highlighted selected days def DrawSel(self): # highlighted selected days
for key in sel_lst: for key in self.cal_sel.keys():
brush = wxBrush(wxNamedColour(self.high_color), wxSOLID) sel_color = self.cal_sel[key][1]
brush = wxBrush(wxNamedColour(sel_color), wxSOLID)
self.DC.SetBrush(brush) self.DC.SetBrush(brush)
if self.hide_grid is FALSE: if self.hide_grid is FALSE:
self.DC.SetPen(wxPen(wxNamedColour(self.grid_color), 0)) self.DC.SetPen(wxPen(wxNamedColour(self.grid_color), 0))
else: else:
@@ -288,6 +346,7 @@ class CalDraw:
class PrtCalDraw(CalDraw): class PrtCalDraw(CalDraw):
def InitValues(self): def InitValues(self):
self.rg = {} self.rg = {}
self.cal_sel = {}
self.set_cx_st = 1.0 # start draw border location self.set_cx_st = 1.0 # start draw border location
self.set_cy_st = 1.0 self.set_cy_st = 1.0
@@ -313,6 +372,13 @@ class wxCalendar(wxWindow):
self.hide_grid = FALSE self.hide_grid = FALSE
self.sel_color = 'RED' self.sel_color = 'RED'
self.hide_title = FALSE self.hide_title = FALSE
self.show_weekend = FALSE
self.cal_type = "NORMAL"
self.week_color = 'LIGHT GREY'
self.week_font_color = 'BLACK' # font colors
self.select_list = []
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)
@@ -464,6 +530,20 @@ class wxCalendar(wxWindow):
# calendar drawing # calendar drawing
def SetWeekColor(self, font_color, week_color): # set font and background color for week title
self.week_font_color = font_color
self.week_color = week_color
def AddSelect(self, list, font_color, back_color):
list_val = [list, font_color, back_color]
self.select_list.append(list_val)
def ShowWeekEnd(self):
self.show_weekend = TRUE # highlight weekend
def SetBusType(self):
self.cal_type = "BUS"
def OnPaint(self, event): def OnPaint(self, event):
DC = wxPaintDC(self) DC = wxPaintDC(self)
self.DoDrawing(DC) self.DoDrawing(DC)
@@ -474,6 +554,14 @@ class wxCalendar(wxWindow):
self.cal = cal = CalDraw(self) self.cal = cal = CalDraw(self)
cal.grid_color = self.grid_color
cal.back_color = self.back_color
cal.hide_grid = self.hide_grid
cal.grid_color = self.grid_color
cal.hide_title = self.hide_title
cal.show_weekend = self.show_weekend
cal.cal_type = self.cal_type
if self.size is None: if self.size is None:
size = self.GetClientSize() size = self.GetClientSize()
else: else:
@@ -481,14 +569,14 @@ class wxCalendar(wxWindow):
# drawing attributes # drawing attributes
cal.grid_color = 'BLUE' cal.week_font_color = self.week_font_color
cal.back_color = self.back_color cal.week_color = self.week_color
cal.hide_grid = self.hide_grid
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)
for val in self.select_list:
cal.AddSelect(val[0], val[1], val[2])
cal.DrawCal(DC, self.sel_lst) cal.DrawCal(DC, self.sel_lst)
self.rg = cal.GetRect() self.rg = cal.GetRect()