]> git.saurik.com Git - wxWidgets.git/commitdiff
Added calendar contributed by Lorne White
authorRobin Dunn <robin@alldunn.com>
Wed, 10 Nov 1999 08:03:29 +0000 (08:03 +0000)
committerRobin Dunn <robin@alldunn.com>
Wed, 10 Nov 1999 08:03:29 +0000 (08:03 +0000)
Some tweaks for wxFloatbar

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4462 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

14 files changed:
utils/wxPython/README.txt
utils/wxPython/demo/Calbmp/Calend.bmp [new file with mode: 0644]
utils/wxPython/demo/Calbmp/DbDec.bmp [new file with mode: 0644]
utils/wxPython/demo/Calbmp/DbInc.bmp [new file with mode: 0644]
utils/wxPython/demo/Calbmp/Dec.bmp [new file with mode: 0644]
utils/wxPython/demo/Calbmp/Inc.bmp [new file with mode: 0644]
utils/wxPython/demo/Calbmp/Pt.bmp [new file with mode: 0644]
utils/wxPython/demo/Main.py
utils/wxPython/demo/wxCalendar.py [new file with mode: 0644]
utils/wxPython/demo/wxFloatBar.py
utils/wxPython/lib/CDate.py [new file with mode: 0644]
utils/wxPython/lib/calendar.py [new file with mode: 0644]
utils/wxPython/lib/floatbar.py
utils/wxPython/src/msw/clip_dnd.cpp

index 9e73f20ff3e15170ed0102db1ddd8fdd9c425300..103e9298ea50e9f032926bf0bd2c2f2737154adf 100644 (file)
@@ -47,6 +47,9 @@ Or you can send mail directly to the list using this address:
 
 What's new in 2.1.11
 --------------------
+Skipped a few version numbers so wxMSW, wxGTK and wxPython are all
+syncronized.
+
 wxImage.SetData now makes a copy of the image data before giving it to
 wxImage.  I mistakenly thought that wxImage would copy the data
 itself.
@@ -83,7 +86,14 @@ Added wxFontEnumerator.
 Many updates to wxMenu, wxMenuBar.
 
 wxPyEvent and wxPyCommandEvent derived classes now give you the actual
-Python object in the event handler.
+Python object in the event handler instead of a new shadow.
+
+Added a Calendar widget from Lorne White.
+
+Made some fixes to the wxFloatbar.
+
+Added the HTML printing classes.
+
 
 
 
diff --git a/utils/wxPython/demo/Calbmp/Calend.bmp b/utils/wxPython/demo/Calbmp/Calend.bmp
new file mode 100644 (file)
index 0000000..c192c88
Binary files /dev/null and b/utils/wxPython/demo/Calbmp/Calend.bmp differ
diff --git a/utils/wxPython/demo/Calbmp/DbDec.bmp b/utils/wxPython/demo/Calbmp/DbDec.bmp
new file mode 100644 (file)
index 0000000..970266c
Binary files /dev/null and b/utils/wxPython/demo/Calbmp/DbDec.bmp differ
diff --git a/utils/wxPython/demo/Calbmp/DbInc.bmp b/utils/wxPython/demo/Calbmp/DbInc.bmp
new file mode 100644 (file)
index 0000000..5f5dffa
Binary files /dev/null and b/utils/wxPython/demo/Calbmp/DbInc.bmp differ
diff --git a/utils/wxPython/demo/Calbmp/Dec.bmp b/utils/wxPython/demo/Calbmp/Dec.bmp
new file mode 100644 (file)
index 0000000..64efbb3
Binary files /dev/null and b/utils/wxPython/demo/Calbmp/Dec.bmp differ
diff --git a/utils/wxPython/demo/Calbmp/Inc.bmp b/utils/wxPython/demo/Calbmp/Inc.bmp
new file mode 100644 (file)
index 0000000..8dd2649
Binary files /dev/null and b/utils/wxPython/demo/Calbmp/Inc.bmp differ
diff --git a/utils/wxPython/demo/Calbmp/Pt.bmp b/utils/wxPython/demo/Calbmp/Pt.bmp
new file mode 100644 (file)
index 0000000..6c49461
Binary files /dev/null and b/utils/wxPython/demo/Calbmp/Pt.bmp differ
index 8d132d3334fe0653d665140e07396cac5b2bf504..99837dccf67a1def30efa2de0cde0d3e6509507c 100644 (file)
@@ -46,7 +46,7 @@ _treeList = [
 
     ('wxPython Library', ['OldSizers', 'Layoutf', 'wxScrolledMessageDialog',
                           'wxMultipleChoiceDialog', 'wxPlotCanvas', 'wxFloatBar',
-                          'PyShell']),
+                          'PyShell', 'wxCalendar']),
 
     ('Cool Contribs', ['pyTree', 'hangman', 'SlashDot', 'XMLtreeview']),
 
diff --git a/utils/wxPython/demo/wxCalendar.py b/utils/wxPython/demo/wxCalendar.py
new file mode 100644 (file)
index 0000000..122d31f
--- /dev/null
@@ -0,0 +1,445 @@
+#! /usr/local/bin/python
+#----------------------------------------------------------------------------
+# Name:         CalendPanel.py
+# Purpose:      Calendar control display testing on panel
+#
+# Author:       Lorne White (email: lwhite1@planet.eon.net)
+#
+# Created:
+# Version       0.5 1999/11/03
+# Licence:      wxWindows license
+#----------------------------------------------------------------------------
+
+from wxPython.wx           import *
+from wxPython.lib.calendar import Calendar, Month, using_mxDateTime
+
+import os
+dir_path = os.getcwd()
+
+
+# highlighted days in month
+
+test_days ={ 0: [],
+            1: [3, 7, 9, 21],
+            2: [2, 10, 4, 9],
+            3: [4, 20, 29],
+            4: [1, 12, 22],
+            5: [2, 10, 15],
+            6: [4, 8, 17],
+            7: [6, 7, 8],
+            8: [5, 10, 20],
+            9: [1, 2, 5, 29],
+           10: [2, 4, 6, 22],
+           11: [6, 9, 12, 28, 29],
+           12: [8, 9, 10, 11, 20] }
+
+# test of full window calendar control functions
+
+def GetMonthList():
+    monthlist = []
+    for i in range(13):
+        name = Month[i]
+        if name != None:
+            monthlist.append(name)
+    return monthlist
+
+class TestPanel(wxPanel):
+    def __init__(self, parent, log):
+        wxPanel.__init__(self, parent, -1)
+
+        self.log = log
+
+        if using_mxDateTime is true:
+            self.log.WriteText('Using mxDateTime module\n')
+        else:
+            self.log.WriteText('Using Built in CDate module\n')
+
+        self.calend = Calendar(self, -1, wxPoint(100, 50), wxSize(200, 180))
+
+        start_month = 11
+        start_year = 1999
+
+# month list from DateTime module
+
+        monthlist = GetMonthList()
+
+        self.date = wxComboBox(self, 10, Month[start_month], wxPoint(100, 20), wxSize(90, -1), monthlist, wxCB_DROPDOWN)
+        EVT_COMBOBOX(self, 10, self.EvtComboBox)
+
+# set start month and year
+
+        self.calend.SetMonth(start_month)
+        self.calend.SetYear(start_year)
+
+# set attributes of calendar
+
+        self.calend.HideTitle()
+        self.calend.HideGrid()
+
+# display routine
+
+        self.ResetDisplay()
+
+# mouse click event
+
+        self.Connect(self.calend.GetId(), -1, 2100, self.MouseClick)
+
+# scroll bar for month selection
+
+        self.scroll = wxScrollBar(self, 40, wxPoint(100, 240), wxSize(200, 20), wxSB_HORIZONTAL)
+        self.scroll.SetScrollbar(start_month-1, 1, 12, 1, TRUE)
+        EVT_COMMAND_SCROLL(self, 40, self.Scroll)
+
+# spin control for year selection
+
+        self.dtext = wxTextCtrl(self, -1, str(start_year), wxPoint(200, 20), wxSize(60, -1))
+        h = self.dtext.GetSize().height
+
+        self.spin = wxSpinButton(self, 20, wxPoint(270, 20), wxSize(h*2, h))
+        self.spin.SetRange(1980, 2010)
+        self.spin.SetValue(start_year)
+        EVT_SPIN(self, 20, self.OnSpin)
+
+# button for calendar dialog test
+
+        wxStaticText(self, -1, "Test Calendar Dialog", wxPoint(350, 50)).SetBackgroundColour(wxNamedColour('Red'))
+
+        bmp = wxBitmap('CalBmp/Calend.bmp', wxBITMAP_TYPE_BMP)
+        self.but = wxBitmapButton(self, 60, bmp, wxPoint(380, 80), wxSize(30, 30))
+        EVT_BUTTON(self, 60, self.TestDlg)
+
+# button for calendar window test
+
+        wxStaticText(self, -1, "Test Calendar Window", wxPoint(350, 150)).SetBackgroundColour(wxNamedColour('Blue'))
+
+        bmp = wxBitmap('CalBmp/Calend.bmp', wxBITMAP_TYPE_BMP)
+        self.but = wxBitmapButton(self, 160, bmp, wxPoint(380, 180), wxSize(30, 30))
+        EVT_BUTTON(self, 160, self.TestFrame)
+
+# calendar dialog
+
+    def TestDlg(self, event):
+        dlg = CalenDlg(self, self.log)
+        dlg.Centre()
+        dlg.ShowModal()
+        dlg.Destroy()
+
+# calendar window test
+
+    def TestFrame(self, event):
+        frame = CalendFrame(NULL, -1, "Test Calendar", self.log)
+        frame.Show(true)
+        self.SetTopWindow(frame)
+        return true
+
+# month and year control events
+
+    def OnSpin(self, event):
+        year = event.GetPosition()
+        self.dtext.SetValue(str(year))
+        self.calend.SetYear(year)
+        self.calend.Refresh()
+
+    def EvtComboBox(self, event):
+        name = event.GetString()
+        self.log.WriteText('EvtComboBox: %s\n' % name)
+        monthval = self.date.FindString(name)
+        self.scroll.SetScrollbar(monthval, 1, 12, 1, TRUE)
+
+        self.calend.SetMonth(monthval+1)
+        self.ResetDisplay()
+
+    def Scroll(self, event):
+        value = self.scroll.GetThumbPosition()
+        monthval = int(value)+1
+        self.calend.SetMonth(monthval)
+        self.ResetDisplay()
+        self.log.WriteText('Month: %s\n' % value)
+
+        name = Month[monthval]
+        self.date.SetValue(name)
+
+# log mouse events
+
+    def MouseClick(self, evt):
+        text = '%s CLICK   %02d/%02d/%d' % (evt.click, evt.day, evt.month, evt.year)  # format date
+        self.log.WriteText('Date Selected: ' + text + '\n')
+
+    def OnCloseWindow(self, event):
+        self.Destroy()
+
+# set the highlighted days for the calendar
+
+    def ResetDisplay(self):
+        month = self.calend.GetMonth()
+        try:
+            set_days = test_days[month]
+        except:
+            set_days = [1, 5, 12]
+
+        self.calend.SetSelDay(set_days)
+        self.calend.Refresh()
+
+# increment and decrement toolbar controls
+
+    def OnIncYear(self, event):
+        self.calend.IncYear()
+        self.ResetDisplay()
+
+    def OnDecYear(self, event):
+        self.calend.DecYear()
+        self.ResetDisplay()
+
+    def OnIncMonth(self, event):
+        self.calend.IncMonth()
+        self.ResetDisplay()
+
+    def OnDecMonth(self, event):
+        self.calend.DecMonth()
+        self.ResetDisplay()
+
+    def OnCurrent(self, event):
+        self.calend.SetCurrentDay()
+        self.ResetDisplay()
+
+# test the calendar control in a dialog
+
+class CalenDlg(wxDialog):
+    def __init__(self, parent, log):
+        self.log = log
+        wxDialog.__init__(self, parent, -1, "Test Calendar", wxPyDefaultPosition, wxSize(280, 300))
+
+        start_month = 2
+        start_year = 1999
+
+# get month list from DateTime
+
+        monthlist = GetMonthList()
+
+# select the month
+
+        self.date = wxComboBox(self, 100, Month[start_month], wxPoint(20, 20), wxSize(90, -1), monthlist, wxCB_DROPDOWN)
+        EVT_COMBOBOX(self, 100, self.EvtComboBox)
+
+# alternate spin button to control the month
+
+        h = self.date.GetSize().height
+        self.m_spin = wxSpinButton(self, 120, wxPoint(130, 20), wxSize(h*2, h), wxSP_VERTICAL)
+        self.m_spin.SetRange(1, 12)
+        self.m_spin.SetValue(start_month)
+
+        EVT_SPIN(self, 120, self.OnMonthSpin)
+
+# spin button to conrol the year
+
+        self.dtext = wxTextCtrl(self, -1, str(start_year), wxPoint(160, 20), wxSize(60, -1))
+        h = self.dtext.GetSize().height
+
+        self.y_spin = wxSpinButton(self, 20, wxPoint(220, 20), wxSize(h*2, h), wxSP_VERTICAL)
+        self.y_spin.SetRange(1980, 2010)
+        self.y_spin.SetValue(start_year)
+
+        EVT_SPIN(self, 20, self.OnYrSpin)
+
+# set the calendar and attributes
+
+        self.calend = Calendar(self, -1, wxPoint(20, 60), wxSize(240, 200))
+        self.calend.SetMonth(start_month)
+        self.calend.SetYear(start_year)
+
+        self.calend.HideTitle()
+        self.ResetDisplay()
+
+        self.Connect(self.calend.GetId(), -1, 2100, self.MouseClick)
+
+# log the mouse clicks
+
+    def MouseClick(self, evt):
+        text = '%s CLICK   %02d/%02d/%d' % (evt.click, evt.day, evt.month, evt.year)  # format date
+        self.log.WriteText('Date Selected: ' + text + '\n')
+
+        if evt.click == 'DLEFT':
+            self.EndModal(wxID_OK)
+
+# month and year spin selection routines
+
+    def OnMonthSpin(self, event):
+        month = event.GetPosition()
+        self.date.SetValue(Month[month])
+        self.calend.SetMonth(month)
+        self.calend.Refresh()
+
+    def OnYrSpin(self, event):
+        year = event.GetPosition()
+        self.dtext.SetValue(str(year))
+        self.calend.SetYear(year)
+        self.calend.Refresh()
+
+    def EvtComboBox(self, event):
+        name = event.GetString()
+        self.log.WriteText('EvtComboBox: %s\n' % name)
+        monthval = self.date.FindString(name)
+        self.m_spin.SetValue(monthval+1)
+
+        self.calend.SetMonth(monthval+1)
+        self.ResetDisplay()
+
+# set the calendar for highlighted days
+
+    def ResetDisplay(self):
+        month = self.calend.GetMonth()
+        try:
+            set_days = test_days[month]
+        except:
+            set_days = [1, 5, 12]
+
+        self.calend.SetSelDay(set_days)
+        self.calend.Refresh()
+
+# test of full window calendar control functions
+
+class CalendFrame(wxFrame):
+    def __init__(self, parent, id, title, log):
+        wxFrame.__init__(self, parent, id, title, wxPyDefaultPosition, wxSize(400, 400))
+
+        self.log = log
+        self.CreateStatusBar()
+        self.mainmenu = wxMenuBar()
+        menu = wxMenu()
+
+        menu = self.MakeFileMenu()
+        self.mainmenu.Append(menu, '&File')
+
+        self.MakeToolMenu()             # toolbar
+
+        self.SetMenuBar(self.mainmenu)
+        self.calend = Calendar(self, -1)
+        self.calend.SetCurrentDay()
+        self.calend.grid_color = 'BLUE'
+        self.ResetDisplay()
+
+        self.Connect(self.calend.GetId(), -1, 2100, self.MouseClick)
+
+    def MouseClick(self, evt):
+        text = '%s CLICK   %02d/%02d/%d' % (evt.click, evt.day, evt.month, evt.year)  # format date
+        self.log.WriteText('Date Selected: ' + text + '\n')
+
+    def OnCloseWindow(self, event):
+        self.Destroy()
+
+    def ResetDisplay(self):
+        month = self.calend.GetMonth()
+        try:
+            set_days = test_days[month]
+        except:
+            set_days = [1, 5, 12]
+
+        self.calend.SetSelDay(set_days)
+        self.calend.Refresh()
+
+    def OnIncYear(self, event):
+        self.calend.IncYear()
+        self.ResetDisplay()
+
+    def OnDecYear(self, event):
+        self.calend.DecYear()
+        self.ResetDisplay()
+
+    def OnIncMonth(self, event):
+        self.calend.IncMonth()
+        self.ResetDisplay()
+
+    def OnDecMonth(self, event):
+        self.calend.DecMonth()
+        self.ResetDisplay()
+
+    def OnCurrent(self, event):
+        self.calend.SetCurrentDay()
+        self.ResetDisplay()
+
+    def MakeFileMenu(self):
+        menu = wxMenu()
+
+        mID = NewId()
+        menu.Append(mID, 'Decrement', 'Next')
+        EVT_MENU(self, mID, self.OnDecMonth)
+
+        mID = NewId()
+        menu.Append(mID, 'Increment', 'Dec')
+        EVT_MENU(self, mID, self.OnIncMonth)
+
+        menu.AppendSeparator()
+
+        mID = NewId()
+        menu.Append(mID, 'E&xit', 'Exit')
+        EVT_MENU(self, mID, self.OnCloseWindow)
+
+        return menu
+
+    def MakeToolMenu(self):
+        tb = self.CreateToolBar(wxTB_HORIZONTAL|wxNO_BORDER)
+
+        bmp_path = 'CalBmp/'
+        SetToolPath(self, tb, 10, bmp_path + 'DbDec.bmp', 'Dec Year')
+        EVT_TOOL(self, 10, self.OnDecYear)
+
+        SetToolPath(self, tb, 15, bmp_path + 'Dec.bmp', 'Dec Month')
+        EVT_TOOL(self, 15, self.OnDecMonth)
+
+        SetToolPath(self, tb, 30, bmp_path + 'Pt.bmp', 'Current Month')
+        EVT_TOOL(self, 30, self.OnCurrent)
+
+        SetToolPath(self, tb, 40, bmp_path + 'Inc.bmp', 'Inc Month')
+        EVT_TOOL(self, 40, self.OnIncMonth)
+
+        SetToolPath(self, tb, 45, bmp_path + 'DbInc.bmp', 'Inc Year')
+        EVT_TOOL(self, 45, self.OnIncYear)
+
+        tb.Realize()
+
+def SetToolPath(self, tb, id, bmp, title):
+    global dir_path
+    tb.AddTool(id, wxBitmap(os.path.join(dir_path, bmp), wxBITMAP_TYPE_BMP), wxNullBitmap, false, -1, -1, title, title)
+
+class MyApp(wxApp):
+    def OnInit(self):
+        frame = CalendFrame(NULL, -1, "Test Calendar")
+        frame.Show(true)
+        self.SetTopWindow(frame)
+        return true
+
+#---------------------------------------------------------------------------
+
+def MessageDlg(self, message, type = 'Message'):
+    dlg = wxMessageDialog(self, message, type, wxOK | wxICON_INFORMATION)
+    dlg.ShowModal()
+    dlg.Destroy()
+
+#---------------------------------------------------------------------------
+
+def main():
+    app = MyApp(0)
+    app.MainLoop()
+
+
+if __name__ == '__main__':
+    main()
+
+
+#---------------------------------------------------------------------------
+
+def runTest(frame, nb, log):
+    win = TestPanel(nb, log)
+    return win
+
+#---------------------------------------------------------------------------
+
+
+overview = """\
+This control provides a calendar control class for displaying and selecting dates.
+
+See example for various methods used to set display month, year, and highlighted dates (different colour).
+
+by Lorne White
+
+"""
index 3ea28fdaf2c0b9eaa2ce8b2af504b3cd9560f314..48c85f4a3d4f5778451c04981f2ebd57e9bd671e 100644 (file)
@@ -7,7 +7,10 @@ class TestFloatBar(wxFrame):
                          wxPoint(0,0), wxSize(500, 300))
         self.log = log
 
-        wxWindow(self, -1).SetBackgroundColour(wxNamedColour("WHITE"))
+        win = wxWindow(self, -1)
+        win.SetBackgroundColour(wxNamedColour("WHITE"))
+        wxStaticText(win, -1, "Drag the toolbar to float it,\n"
+                     "Toggle the last tool to remove the title.", wxPoint(15,15))
 
         tb = wxFloatBar(self, -1)
         self.SetToolBar(tb)
@@ -37,10 +40,6 @@ class TestFloatBar(wxFrame):
 
         tb.AddSeparator()
 
-        tb.AddTool(50, wxBitmap('bitmaps/tog1.bmp', wxBITMAP_TYPE_BMP),
-                        wxNullBitmap, true, -1, -1, "Toggle this")
-        EVT_TOOL(self, 50, self.OnToolClick)
-        EVT_TOOL_RCLICKED(self, 50, self.OnToolRClick)
 
         tb.AddTool(60, wxBitmap('bitmaps/tog1.bmp', wxBITMAP_TYPE_BMP),
                         wxBitmap('bitmaps/tog2.bmp', wxBITMAP_TYPE_BMP),
@@ -48,8 +47,8 @@ class TestFloatBar(wxFrame):
         EVT_TOOL(self, 60, self.OnToolClick)
         EVT_TOOL_RCLICKED(self, 60, self.OnToolRClick)
         tb.Realize()
-#        b = wxButton(tb, -1, "HELLO!")
-#        EVT_BUTTON(b, b.GetId(), self.test)
+
+        self.tb = tb
 
 
     def OnCloseWindow(self, event):
@@ -57,6 +56,11 @@ class TestFloatBar(wxFrame):
 
     def OnToolClick(self, event):
         self.log.WriteText("tool %s clicked\n" % event.GetId())
+        if event.GetId() == 60:
+            if event.GetExtraLong():
+                self.tb.SetTitle("")
+            else:
+                self.tb.SetTitle("Floating!")
 
     def OnToolRClick(self, event):
         self.log.WriteText("tool %s right-clicked\n" % event.GetId())
@@ -75,33 +79,8 @@ def runTest(frame, nb, log):
 overview = """\
 wxFloatBar is a subclass of wxToolBar, implemented in Python, which can be detached from its frame.
 
-Drag the toolbar with the mouse to make it float, and drag it back, or close it to make the toolbar
-
-return to its original position.
-
-wxFloatBar()
------------------------
-
-Default constructor.
-
-wxFloatBar(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTB_HORIZONTAL | wxNO_BORDER, const wxString& name = wxPanelNameStr)
-
-Constructs a floatable toolbar.
-
-Parameters
--------------------
-
-parent = Pointer to a parent window.
-
-id = Window identifier. If -1, will automatically create an identifier.
-
-pos = Window position. wxDefaultPosition is (-1, -1) which indicates that wxWindows should generate a default position for the window. If using the wxWindow class directly, supply an actual position.
-
-size = Window size. wxDefaultSize is (-1, -1) which indicates that wxWindows should generate a default size for the window.
-
-style = Window style. Se wxToolBar for details.
+Drag the toolbar with the mouse to make it float, and drag it back, or close it to make the toolbar return to its original position.
 
-name = Window name.
 """
 
 
diff --git a/utils/wxPython/lib/CDate.py b/utils/wxPython/lib/CDate.py
new file mode 100644 (file)
index 0000000..b6303df
--- /dev/null
@@ -0,0 +1,125 @@
+# Name:         CDate.py
+# Purpose:      Date and Calendar classes
+#
+# Author:       Lorne White (email: lwhite1@planet.eon.net)
+#
+# Created:
+# Version       0.2 1999/11/08
+# Licence:      wxWindows license
+#----------------------------------------------------------------------------
+
+import time
+
+Month = {2: 'February', 3: 'March', None: 0, 'July': 7, 11:
+        'November', 'December': 12, 'June': 6, 'January': 1, 'September': 9,
+        'August': 8, 'March': 3, 'November': 11, 'April': 4, 12: 'December',
+        'May': 5, 10: 'October', 9: 'September', 8: 'August', 7: 'July', 6:
+        'June', 5: 'May', 4: 'April', 'October': 10, 'February': 2, 1:
+        'January', 0: None}
+
+# Number of days per month (except for February in leap years)
+mdays = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
+
+# Full and abbreviated names of weekdays
+day_name = [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
+day_abbr = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', ]
+
+# Return number of leap years in range [y1, y2)
+# Assume y1 <= y2 and no funny (non-leap century) years
+
+def leapdays(y1, y2):
+    return (y2+3)/4 - (y1+3)/4
+       
+# Return 1 for leap years, 0 for non-leap years
+def isleap(year):
+    return year % 4 == 0 and (year % 100 <> 0 or year % 400 == 0)
+
+def FillDate(val):
+    s = str(val)
+    if len(s) < 2:
+        s = '0' + s
+    return s
+
+       
+def julianDay(year, month, day):
+    b = 0L
+    year, month, day = long(year), long(month), long(day)
+    if month > 12L:
+        year = year + month/12L
+        month = month%12
+    elif month < 1L:
+        month = -month
+        year = year - month/12L - 1L
+        month = 12L - month%12L
+    if year > 0L:
+        yearCorr = 0L
+    else:
+        yearCorr = 3L
+    if month < 3L:
+        year = year - 1L
+        month = month + 12L
+    if year*10000L + month*100L + day > 15821014L:
+        b = 2L - year/100L + year/400L
+    return (1461L*year - yearCorr)/4L + 306001L*(month + 1L)/10000L + day + 1720994L + b
+
+       
+def TodayDay():
+    date = time.localtime(time.time())
+    year = date[0]
+    month = date[1]
+    day = date[2]
+    julian = julianDay(year, month, day)
+    daywk = dayOfWeek(julian)
+    daywk = day_name[daywk]
+    return(daywk)
+
+def FormatDay(value):
+    date = FromFormat(value)
+    daywk = DateCalc.dayOfWeek(date)
+    daywk = day_name[daywk]
+    return(daywk)
+
+def FromJulian(julian):
+    julian = long(julian)
+    if (julian < 2299160L):
+        b = julian + 1525L
+    else:
+        alpha = (4L*julian - 7468861L)/146097L
+        b = julian + 1526L + alpha - alpha/4L
+    c = (20L*b - 2442L)/7305L
+    d = 1461L*c/4L
+    e = 10000L*(b - d)/306001L
+    day = int(b - d - 306001L*e/10000L)
+    if e < 14L:
+        month = int(e - 1L)
+    else:
+        month = int(e - 13L)
+    if month > 2:
+        year = c - 4716L
+    else:
+        year = c - 4715L
+    year = int(year)
+    return year, month, day
+
+def dayOfWeek(julian):
+    return int((julian + 1L)%7L)
+
+def daysPerMonth(month, year):
+    ndays = mdays[month] + (month == 2 and isleap(year))
+    return ndays
+
+class now:
+    def __init__(self):        
+        self.date = time.localtime(time.time())
+        self.year = self.date[0]
+        self.month = self.date[1]
+        self.day = self.date[2]
+               
+class Date:
+    def __init__(self, year, month, day):        
+        self.julian = julianDay(year, month, day)
+        self.month = month
+        self.year = year
+        self.day_of_week = dayOfWeek(self.julian)
+        self.days_in_month = daysPerMonth(self.month, self.year)
+
diff --git a/utils/wxPython/lib/calendar.py b/utils/wxPython/lib/calendar.py
new file mode 100644 (file)
index 0000000..690e226
--- /dev/null
@@ -0,0 +1,479 @@
+#! /usr/local/bin/python
+#----------------------------------------------------------------------------
+# Name:         wxCalend.py
+# Purpose:      Calendar display control
+#
+# Author:       Lorne White (email: lwhite1@planet.eon.net)
+#
+# Created:
+# Version       0.5 1999/11/03
+# Licence:      wxWindows license
+#----------------------------------------------------------------------------
+
+from wxPython.wx import *
+
+try:
+    from DateTime import *
+    using_mxDateTime = true
+except ImportError:
+    from CDate import *
+    using_mxDateTime = false
+
+import string, time
+
+CalDays = [6, 0, 1, 2, 3, 4, 5]
+AbrWeekday = {6:"Sun", 0:"Mon", 1:"Tue", 2:"Wed", 3:"Thu", 4:"Fri", 5:"Sat"}
+
+
+# calendar drawing routing
+
+class CalDraw:
+    def __init__(self):
+        self.rg = {}
+        self.y_st = 15      # start of vertical draw default
+
+    def SetSize(self, size):
+        self.sizew = size.width
+        self.sizeh = size.height
+
+# draw the various elements of the calendar
+
+    def DrawCal(self, DC, sel_lst):
+        self.DC = DC
+
+        self.DrawBorder()
+
+        if self.hide_title is FALSE:
+            self.DrawMonth()
+
+        self.Center()
+
+        self.DrawGrid()
+        self.GetRect()
+
+        self.DrawSel(sel_lst)   # highlighted days
+        self.DrawWeek()
+        self.DrawNum()
+
+# draw border around the outside of the main display rectangle
+
+    def DrawBorder(self):
+        rect = wxRect(0, 0, self.sizew, self.sizeh)  # full display window area
+        self.DC.DrawRectangle(rect.x, rect.y, rect.width, rect.height)
+
+    def DrawNumVal(self):
+        self.DrawNum()
+
+# calculate the calendar days and offset position
+
+    def SetCal(self, year, month):
+        self.year = year
+        self.month = month
+
+        day = 1
+        t = Date(year, month, day)
+        dow = t.day_of_week     # start day in month
+        dim = t.days_in_month   # number of days in month
+        start_pos = dow+1
+        self.st_pos = start_pos
+
+        self.cal = []
+        for i in range(start_pos):
+            self.cal.append('')
+        i = 1
+        while i <= dim:
+            self.cal.append(str(i))
+            i = i + 1
+        return start_pos
+
+# get the display rectange list of the day grid
+
+    def GetRect(self):
+        cnt = 0
+        for y in self.gridy[1:-1]:
+            for x in self.gridx[:-1]:
+                rect = wxRect(x, y, self.dl_w, self.dl_h)  # create rect region
+                self.rg[cnt] = rect
+                cnt = cnt + 1
+        return self.rg
+
+    def GetCal(self):
+        return self.cal
+
+    def GetOffset(self):
+        return self.st_pos
+
+# month and year title
+
+    def DrawMonth(self):
+        month = Month[self.month]
+
+        sizef = 12
+        if self.sizeh < 200:
+            sizef = 8
+
+        f = wxFont(sizef, self.font, wxNORMAL, wxNORMAL)
+        self.DC.SetFont(f)
+
+        tw,th = self.DC.GetTextExtent(month)
+        adjust = (self.sizew-tw)/2
+        self.DC.DrawText(month, adjust, 10)
+
+        year = str(self.year)
+        tw,th = self.DC.GetTextExtent(year)
+        adjust = self.sizew-tw-20
+
+        self.y_st = th * 3
+
+        f = wxFont(sizef, self.font, wxNORMAL, wxNORMAL)
+        self.DC.SetFont(f)
+        self.DC.DrawText(year, adjust, 10)
+
+# draw the week days
+
+    def DrawWeek(self):
+        sizef = 8
+        if self.sizeh < 300:
+            sizef = 6
+
+        f = wxFont(sizef, self.font, wxNORMAL, wxNORMAL)
+        self.DC.SetFont(f)
+
+        cnt_x = 0
+        cnt_y = 0
+        width = self.gridx[1]-self.gridx[0]
+        height = self.gridy[1] - self.gridy[0]
+
+        for val in CalDays:
+            day = AbrWeekday[val]
+            if self.sizew < 200:
+                day = day[0]
+            dw,dh = self.DC.GetTextExtent(day)
+            diffx = (width-dw)/2
+            diffy = (height-dh)/2
+
+            x = self.gridx[cnt_x]
+            y = self.gridy[cnt_y]
+            self.DC.DrawText(day, x+diffx, y+diffy)
+            cnt_x = cnt_x + 1
+
+# draw the day numbers
+
+    def DrawNum(self):
+        sizef = 9
+        if self.sizeh < 260:
+            sizef = 6
+        f = wxFont(sizef, self.font, wxNORMAL, wxNORMAL)
+        self.DC.SetFont(f)
+
+        cnt_x = 0
+        cnt_y = 1
+        for val in self.cal:
+            x = self.gridx[cnt_x]
+            y = self.gridy[cnt_y]
+            self.DC.DrawText(val, x+5, y+5)
+            if cnt_x < 6:
+                cnt_x = cnt_x + 1
+            else:
+                cnt_x = 0
+                cnt_y = cnt_y + 1
+
+# calculate the dimensions in the center of the drawing area
+
+    def Center(self):
+        self.x_st = 10
+        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.cwidth = self.dl_w * 7
+        self.cheight = self.dl_h * 6 + self.dl_h/2
+
+# highlighted selectioned days
+
+    def DrawSel(self, sel_lst):
+        for key in sel_lst:
+            brush = wxBrush(wxNamedColour(self.high_color), wxSOLID)
+            self.DC.SetBrush(brush)
+            if self.hide_grid is FALSE:
+                self.DC.SetPen(wxPen(wxNamedColour(self.grid_color), 0))
+            else:
+                self.DC.SetPen(wxPen(wxNamedColour(self.back_color), 0))
+            nkey = key + self.st_pos -1
+            rect = self.rg[nkey]
+            self.DC.DrawRectangle(rect.x, rect.y, rect.width+1, rect.height+1)
+
+# calculate and draw the grid lines
+
+    def DrawGrid(self):
+        self.DC.SetPen(wxPen(wxNamedColour(self.grid_color), 0))
+
+        self.gridx = []
+        self.gridy = []
+
+        x1 = self.x_st
+        y1 = self.y_st
+        y1 = self.y_st
+        y2 = self.y_st + self.cheight
+        for i in range(8):
+            if self.hide_grid is FALSE:
+                self.DC.DrawLine(x1, y1, x1, y2)
+            self.gridx.append(x1)
+            x1 = x1 + self.dl_w
+
+        x1 = self.x_st
+        y1 = self.y_st
+        x2 = self.x_st + self.cwidth
+        for i in range(8):
+            if self.hide_grid is FALSE:
+                self.DC.DrawLine(x1, y1, x2, y1)
+            self.gridy.append(y1)
+            if i == 0:
+                y1 = y1 + self.dl_h/2
+            else:
+                y1 = y1 + self.dl_h
+
+
+class Calendar(wxWindow):
+    def __init__(self, parent, id, pos=wxDefaultPosition, size=wxDefaultSize):
+        wxWindow.__init__(self, parent, id, pos, size)
+
+    # set the calendar control attributes
+
+        self.grid_color = 'BLACK'
+        self.back_color = 'WHITE'
+        self.sel_color = 'RED'
+        self.high_color = 'LIGHT BLUE'
+        self.font = wxSWISS
+
+        self.SetBackgroundColour(wxNamedColor(self.back_color))
+        self.Connect(-1, -1, wxEVT_LEFT_DOWN, self.OnLeftEvent)
+        self.Connect(-1, -1, wxEVT_LEFT_DCLICK, self.OnLeftDEvent)
+        self.Connect(-1, -1, wxEVT_RIGHT_DOWN, self.OnRightEvent)
+        self.Connect(-1, -1, wxEVT_RIGHT_DCLICK, self.OnRightDEvent)
+
+        self.sel_key = None      #  last used by
+        self.sel_lst = []        # highlighted selected days
+
+        self.SetNow()       # default calendar for current month
+
+        self.size = None
+        self.hide_title = FALSE
+        self.hide_grid = FALSE
+        self.set_day = None
+
+# control some of the main calendar attributes
+
+    def HideTitle(self):
+        self.hide_title = TRUE
+
+    def HideGrid(self):
+        self.hide_grid = TRUE
+
+# determine the calendar rectangle click area and draw a selection
+
+    def ProcessClick(self, event):
+        self.x, self.y = event.GetX(), event.GetY()
+        key = self.GetDayHit(self.x, self.y)
+        self.SelectDay(key)
+
+# tab mouse click events and process
+
+    def OnLeftEvent(self, event):
+        self.click = 'LEFT'
+        self.ProcessClick(event)
+
+    def OnLeftDEvent(self, event):
+        self.click = 'DLEFT'
+        self.ProcessClick(event)
+
+    def OnRightEvent(self, event):
+        self.click = 'RIGHT'
+        self.ProcessClick(event)
+
+    def OnRightDEvent(self, event):
+        self.click = 'DRIGHT'
+        self.ProcessClick(event)
+
+    def SetSize(self, set_size):
+        self.size = set_size
+
+    def SetSelDay(self, sel):
+        self.sel_lst = sel  # list of highlighted days
+
+# get the current date
+
+    def SetNow(self):
+        dt = now()
+        self.month = dt.month
+        self.year = dt.year
+        self.day = dt.day
+
+# set the current day
+
+    def SetCurrentDay(self):
+        self.SetNow()
+        self.set_day = self.day
+
+# get the date, day, month, year set in calendar
+
+    def GetDate(self):
+        return self.day, self.month, self.year
+
+    def GetDay(self):
+        return self.day
+
+    def GetMonth(self):
+        return self.month
+
+    def GetYear(self):
+        return self.year
+
+# set the day, month, and year
+
+    def SetDayValue(self, day):
+        self.set_day = day
+
+    def SetMonth(self, month):
+        if month >= 1 and month <= 12:
+            self.month = month
+        else:
+            self.month = 1
+        self.set_day = None
+
+    def SetYear(self, year):
+        self.year = year
+
+# increment year and month
+
+    def IncYear(self):
+        self.year = self.year + 1
+        self.set_day = None
+
+    def DecYear(self):
+        self.year = self.year - 1
+        self.set_day = None
+
+    def IncMonth(self):
+        self.month = self.month + 1
+        if self.month > 12:
+            self.month = 1
+            self.year = self.year + 1
+        self.set_day = None
+
+    def DecMonth(self):
+        self.month = self.month - 1
+        if self.month < 1:
+            self.month = 12
+            self.year = self.year - 1
+        self.set_day = None
+
+# test to see if the selection has a date and create event
+
+    def TestDay(self, key):
+        try:
+            self.day = int(self.cal[key])
+        except:
+            return None
+        if self.day == "":
+            return None
+        else:
+            evt = wxPyCommandEvent(2100, self.GetId())
+            evt.click, evt.day, evt.month, evt.year = self.click, self.day, self.month, self.year
+            self.GetEventHandler().ProcessEvent(evt)
+
+            self.set_day = self.day
+            return key
+
+# find the clicked area rectangle
+
+    def GetDayHit(self, mx, my):
+        for key in self.rg.keys():
+            val = self.rg[key]
+            rt = wxRegion()
+            rt.Union(val)
+            if rt.Contains(mx, my) != 0:
+                result = self.TestDay(key)
+                return result
+        return None
+
+# calendar drawing
+
+    def OnPaint(self, event):
+        DC = wxPaintDC(self)
+        self.DoDrawing(DC)
+
+    def DoDrawing(self, DC):
+        DC = wxPaintDC(self)
+        DC.BeginDrawing()
+
+        self.cal = cal = CalDraw()
+        if self.size is None:
+            size = self.GetClientSize()
+        else:
+            size = self.size
+
+# drawing attributes
+
+        cal.hide_title = self.hide_title
+        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.font = self.font
+
+        cal.SetSize(size)
+        cal.SetCal(self.year, self.month)
+        cal.DrawCal(DC, self.sel_lst)
+
+        self.rg = cal.GetRect()
+        self.cal = cal.GetCal()
+        self.st_pos = cal.GetOffset()
+        self.ymax = DC.MaxY()
+
+        if self.set_day != None:
+            self.SetDay(self.set_day)
+        DC.EndDrawing()
+
+# draw the selection rectangle
+
+    def DrawRect(self, key, color = 'BLACK', width = 0):
+        if key == None:
+            return
+        DC = wxClientDC(self)
+        DC.BeginDrawing()
+
+        brush = wxBrush(wxColour(0, 0xFF, 0x80), wxTRANSPARENT)
+        DC.SetBrush(brush)
+        DC.SetPen(wxPen(wxNamedColour(color), width))
+
+        rect = self.rg[key]
+        DC.DrawRectangle(rect.x, rect.y, rect.width+1, rect.height+1)
+
+        DC.EndDrawing()
+
+# set the day selection
+
+    def SetDay(self, day):
+        day = day + self.st_pos - 1
+        self.SelectDay(day)
+
+    def SelectDay(self, key):
+        sel_size = 1
+        self.DrawRect(self.sel_key, self.back_color, sel_size)     # clear large selection
+        if self.hide_grid is FALSE:
+            self.DrawRect(self.sel_key, self.grid_color)
+
+        self.DrawRect(key, self.sel_color, sel_size)
+        self.sel_key = key      # store last used by
+        self.select_day = None
+
+    def ClearDsp(self):
+        self.Clear()
+
+
index fefca18e5985fcb7fc4a99fbde025bc71c4dc17a..26bf194033dedafb03efc6162eb838684c935643 100644 (file)
@@ -16,6 +16,7 @@ class wxFloatBar(wxToolBar):
     position. Programmatically, call SetFloatable(true) and then
     Float(true) to float, Float(false) to dock.
     """
+
     def __init__(self,*_args,**_kwargs):
         """
         In addition to the usual arguments, wxFloatBar accepts keyword
@@ -38,8 +39,10 @@ class wxFloatBar(wxToolBar):
             self.title = ""
         EVT_MOUSE_EVENTS(self, self.OnMouse)
         self.parentframe = wxPyTypeCast(args[1], 'wxFrame')
+
     def IsFloatable(self):
         return self.floatable
+
     def SetFloatable(self, float):
         self.floatable = float
         #Find the size of a title bar.
@@ -48,17 +51,22 @@ class wxFloatBar(wxToolBar):
             test.SetClientSize(wxSize(0,0))
             self.titleheight = test.GetSizeTuple()[1]
             test.Destroy()
+
     def IsFloating(self):
         return self.floating
+
     def Realize(self):
         wxToolBar.Realize(self)
         self.barheight = -1
+
     def GetTitle(self):
         return self.title
+
     def SetTitle(self, title):
         self.title = title
         if self.IsFloating():
             self.floatframe.SetTitle(self.title)
+
     def GetHome(self):
         """
         Returns the frame which this toolbar will return to when
@@ -68,6 +76,7 @@ class wxFloatBar(wxToolBar):
             return self.parentframe
         else:
             return wxPyTypeCast(self.GetParent(), 'wxFrame')
+
     def SetHome(self, frame):
         """
         Called when docked, this will remove the toolbar from its
@@ -89,12 +98,18 @@ class wxFloatBar(wxToolBar):
             size = frame.GetSize()
             frame.SetSize(wxSize(0,0))
             frame.SetSize(size)
+
     def Float(self, bool):
         "Floats or docks the toolbar programmatically."
         if bool:
             self.parentframe = wxPyTypeCast(self.GetParent(), 'wxFrame')
             clientsize = self.parentframe.GetClientSizeTuple()
-            self.floatframe = wxMiniFrame(self.parentframe, -1, self.title, wxDefaultPosition, wxDefaultSize, wxTHICK_FRAME)
+            if self.title:
+                useStyle = wxDEFAULT_FRAME_STYLE
+            else:
+                useStyle = 0 #wxTHICK_FRAME
+            self.floatframe = wxMiniFrame(self.parentframe, -1, self.title,
+                                          style = useStyle)
             self.Reparent(self.floatframe)
             self.parentframe.SetToolBar(None)
             self.floating = 1
@@ -111,7 +126,7 @@ class wxFloatBar(wxToolBar):
             self.floatframe.SetPosition(newpos)
             self.floatframe.Show(true)
             EVT_CLOSE(self.floatframe, self.OnDock)
-#            EVT_MOVE(self.floatframe, self.OnMove)
+            EVT_MOVE(self.floatframe, self.OnMove)
         else:
             self.Reparent(self.parentframe)
             self.parentframe.SetToolBar(self)
@@ -121,6 +136,7 @@ class wxFloatBar(wxToolBar):
             self.parentframe.SetSize(wxSize(0,0))
             self.parentframe.SetSize(size)
             self.SetBackgroundColour(self.oldcolor)
+
     def OnDock(self, e):
         self.Float(0)
         if hasattr(self, 'oldpos'):
@@ -130,7 +146,7 @@ class wxFloatBar(wxToolBar):
         homepos = self.parentframe.GetPositionTuple()
         homepos = homepos[0], homepos[1] + self.titleheight
         floatpos = self.floatframe.GetPositionTuple()
-        if abs(homepos[0]-floatpos[0]) < 35 and abs(homepos[1]-floatpos[1]) < 35:
+        if abs(homepos[0] - floatpos[0]) < 35 and abs(homepos[1] - floatpos[1]) < 35:
             self._SetFauxBarVisible(true)
         else:
             self._SetFauxBarVisible(false)
@@ -142,10 +158,12 @@ class wxFloatBar(wxToolBar):
         if e.ButtonDown() or e.ButtonUp() or e.ButtonDClick(1) or e.ButtonDClick(2) or e.ButtonDClick(3):
             e.Skip()
         if e.ButtonDown():
+            self.CaptureMouse()
             self.oldpos = (e.GetX(), e.GetY())
         if e.Entering():
             self.oldpos = (e.GetX(), e.GetY())
         if e.ButtonUp():
+            self.ReleaseMouse()
             if self.IsFloating():
                 homepos = self.parentframe.GetPositionTuple()
                 homepos = homepos[0], homepos[1] + self.titleheight
@@ -165,7 +183,7 @@ class wxFloatBar(wxToolBar):
                         self.floatframe.SetPosition(pt)
 
     def _SetFauxBarVisible(self, vis):
-#        return
+        return
         if vis:
             if self.parentframe.GetToolBar() == None:
                 if not hasattr(self, 'nullbar'):
index 7818d82b81df20c9937ce627edb570ec48721e97..ef5836c4a99f31230beac515ca8f22298dbea3bc 100644 (file)
@@ -212,12 +212,17 @@ void wxPyBitmapDataObject::SetBitmap(const wxBitmap& bitmap) {
 
 class wxPyDropSource : public wxDropSource {
 public:
+#ifdef __WXMSW__
     wxPyDropSource(wxWindow *win = NULL,
                    const wxCursor &cursorCopy = wxNullCursor,
                    const wxCursor &cursorMove = wxNullCursor,
                    const wxCursor &cursorStop = wxNullCursor)
         : wxDropSource(win, cursorCopy, cursorMove, cursorStop) {}
-
+#else
+    wxPyDropSource(wxWindow *win = NULL,
+                   const wxIcon &go = wxNullIcon)
+        : wxDropSource(win, go) {}
+#endif
     DEC_PYCALLBACK_BOOL_DR(GiveFeedback);
     PYPRIVATE;
 };