397 lines
19 KiB
Lua

-----------------------------------------------------------------------------
-- Name: picker.wx.lua
-- Purpose: Picker wxLua sample
-- Author: John Labenski
-- Modified by:
-- Created: 6/19/2007
-- RCS-ID:
-- Copyright: (c) 2007 John Labenski
-- Licence: wxWidgets licence
-----------------------------------------------------------------------------
-- Load the wxLua module, does nothing if running from wxLua, wxLuaFreeze, or wxLuaEdit
package.cpath = package.cpath..";./?.dll;./?.so;../lib/?.so;../lib/vc_dll/?.dll;../lib/bcc_dll/?.dll;../lib/mingw_dll/?.dll;"
require("wx")
frame = nil
textCtrl = nil
ID_COLOURPICKER1 = 1001
ID_COLOURPICKER2 = 1002
ID_COLOURPICKER3 = 1003
ID_DATEPICKER1 = 2001
ID_DATEPICKER2 = 2002
ID_DATEPICKER3 = 2003
ID_DATEPICKER4 = 2004
ID_DATEPICKER5 = 2005
ID_DIRPICKER1 = 3001
ID_DIRPICKER2 = 3002
ID_DIRPICKER3 = 3003
ID_DIRPICKER4 = 3004
ID_FILEPICKER1 = 4001
ID_FILEPICKER2 = 4002
ID_FILEPICKER3 = 4003
ID_FILEPICKER4 = 4004
ID_FILEPICKER5 = 4005
ID_FONTPICKER1 = 5001
ID_FONTPICKER2 = 5002
ID_FONTPICKER3 = 5003
ID_FONTPICKER4 = 5004
ID_FONTPICKER5 = 5005
-- ---------------------------------------------------------------------------
-- Gather up all of the wxEVT_XXX names and hash by their value
-- ---------------------------------------------------------------------------
wxEVT_Names = {}
for k, v in pairs(wx) do
if string.find(k, "wxEVT_", 1, 1) == 1 then
wxEVT_Names[v] = k
end
end
-- ---------------------------------------------------------------------------
-- Handle all wxColourPickerEvents
-- ---------------------------------------------------------------------------
function OnColourPicker(event)
local evt_type = event:GetEventType()
local c = event:GetColour()
local val = c:GetAsString()
c:delete() -- delete all wxColours when done
local s = string.format("%s wxColourPickerEvent type: %s=%d id: %d GetColour = '%s'\n\n", wx.wxNow(), wxEVT_Names[evt_type], evt_type, event:GetId(), val)
textCtrl:AppendText(s)
end
-- ---------------------------------------------------------------------------
-- Handle all wxDateEvents
-- ---------------------------------------------------------------------------
function OnDatePicker(event)
local evt_type = event:GetEventType()
local val = event:GetDate():Format()
local s = string.format("%s wxDateEvent type: %s=%d id: %d GetDate = '%s'\n\n", wx.wxNow(), wxEVT_Names[evt_type], evt_type, event:GetId(), val)
textCtrl:AppendText(s)
end
-- ---------------------------------------------------------------------------
-- Handle all wxFileDirPickerEvents
-- ---------------------------------------------------------------------------
function OnFileDirPicker(event)
local evt_type = event:GetEventType()
local val = event:GetPath()
local s = string.format("%s wxFileDirPickerEvent type: %s=%d id: %d GetPath = '%s'\n\n", wx.wxNow(), wxEVT_Names[evt_type], evt_type, event:GetId(), val)
textCtrl:AppendText(s)
end
-- ---------------------------------------------------------------------------
-- Handle all wxFontPickerEvents
-- ---------------------------------------------------------------------------
function OnFontPicker(event)
local evt_type = event:GetEventType()
local f = event:GetFont()
local val = f:GetNativeFontInfoDesc()
f:delete() -- delete all wxFonts when done
local s = string.format("%s wxFontPickerEvent type: %s=%d id: %d GetFont = '%s'\n\n", wx.wxNow(), wxEVT_Names[evt_type], evt_type, event:GetId(), val)
textCtrl:AppendText(s)
end
-- ---------------------------------------------------------------------------
-- Create the window with the picker controls
-- ---------------------------------------------------------------------------
function CreatePickerWindow(parent)
local scrollWin = wx.wxScrolledWindow(parent, wx.wxID_ANY,
wx.wxDefaultPosition, wx.wxDefaultSize,
wx.wxHSCROLL + wx.wxVSCROLL)
-- Give the scrollwindow enough size so sizer works when calling Fit()
scrollWin:SetScrollbars(15, 15, 400, 600, 0, 0, false)
local mainSizer = wx.wxBoxSizer(wx.wxVERTICAL)
local flexSizer = wx.wxFlexGridSizer(20, 2, 5, 5)
flexSizer:AddGrowableCol(1)
local statText = nil -- not used outside of this function
-- -----------------------------------------------------------------------
local colourPicker = nil -- not used outside of this function
statText = wx.wxStaticText(scrollWin, wx.wxID_ANY, "wxColourPickerCtrl + wxCLRP_DEFAULT_STYLE")
colourPicker = wx.wxColourPickerCtrl(scrollWin, ID_COLOURPICKER1, wx.wxBLACK,
wx.wxDefaultPosition, wx.wxDefaultSize,
wx.wxCLRP_DEFAULT_STYLE)
flexSizer:Add(statText, 1, wx.wxALIGN_CENTER_VERTICAL)
flexSizer:Add(colourPicker, 1, wx.wxEXPAND)
statText = wx.wxStaticText(scrollWin, wx.wxID_ANY, "wxColourPickerCtrl + wxCLRP_USE_TEXTCTRL")
colourPicker = wx.wxColourPickerCtrl(scrollWin, ID_COLOURPICKER2, wx.wxBLACK,
wx.wxDefaultPosition, wx.wxDefaultSize,
wx.wxCLRP_USE_TEXTCTRL)
flexSizer:Add(statText, 1, wx.wxALIGN_CENTER_VERTICAL)
flexSizer:Add(colourPicker, 1, wx.wxEXPAND)
statText = wx.wxStaticText(scrollWin, wx.wxID_ANY, "wxColourPickerCtrl + wxCLRP_SHOW_LABEL")
colourPicker = wx.wxColourPickerCtrl(scrollWin, ID_COLOURPICKER3, wx.wxBLACK,
wx.wxDefaultPosition, wx.wxDefaultSize,
wx.wxCLRP_SHOW_LABEL)
flexSizer:Add(statText, 1, wx.wxALIGN_CENTER_VERTICAL)
flexSizer:Add(colourPicker, 1, wx.wxEXPAND)
-- central event handler for all wxColourPickerEvent
scrollWin:Connect(wx.wxID_ANY, wx.wxEVT_COMMAND_COLOURPICKER_CHANGED, OnColourPicker)
-- -----------------------------------------------------------------------
flexSizer:Add(wx.wxStaticLine(scrollWin, wx.wxID_ANY), 1, wx.wxEXPAND)
flexSizer:Add(wx.wxStaticLine(scrollWin, wx.wxID_ANY), 1, wx.wxEXPAND)
local datePicker = nil -- not used outside of this function
statText = wx.wxStaticText(scrollWin, wx.wxID_ANY, "wxDatePickerCtrl + wxDP_DEFAULT")
datePicker = wx.wxDatePickerCtrl(scrollWin, ID_DATEPICKER1, wx.wxDefaultDateTime,
wx.wxDefaultPosition, wx.wxDefaultSize,
wx.wxDP_DEFAULT)
flexSizer:Add(statText, 1, wx.wxALIGN_CENTER_VERTICAL)
flexSizer:Add(datePicker, 1, wx.wxEXPAND)
statText = wx.wxStaticText(scrollWin, wx.wxID_ANY, "wxDatePickerCtrl + wxDP_SPIN")
if wx.__WXMSW__ then
datePicker = wx.wxDatePickerCtrl(scrollWin, ID_DATEPICKER2, wx.wxDefaultDateTime,
wx.wxDefaultPosition, wx.wxDefaultSize,
wx. wxDP_SPIN)
else
datePicker = wx.wxStaticText(scrollWin, wx.wxID_ANY, "Supported in MSW only")
end
flexSizer:Add(statText, 1, wx.wxALIGN_CENTER_VERTICAL)
flexSizer:Add(datePicker, 1, wx.wxEXPAND)
statText = wx.wxStaticText(scrollWin, wx.wxID_ANY, "wxDatePickerCtrl + wxDP_DROPDOWN")
datePicker = wx.wxDatePickerCtrl(scrollWin, ID_DATEPICKER3, wx.wxDefaultDateTime,
wx.wxDefaultPosition, wx.wxDefaultSize,
wx.wxDP_DROPDOWN)
flexSizer:Add(statText, 1, wx.wxALIGN_CENTER_VERTICAL)
flexSizer:Add(datePicker, 1, wx.wxEXPAND)
statText = wx.wxStaticText(scrollWin, wx.wxID_ANY, "wxDatePickerCtrl + wxDP_ALLOWNONE")
datePicker = wx.wxDatePickerCtrl(scrollWin, ID_DATEPICKER4, wx.wxDefaultDateTime,
wx.wxDefaultPosition, wx.wxDefaultSize,
wx.wxDP_ALLOWNONE)
flexSizer:Add(statText, 1, wx.wxALIGN_CENTER_VERTICAL)
flexSizer:Add(datePicker, 1, wx.wxEXPAND)
statText = wx.wxStaticText(scrollWin, wx.wxID_ANY, "wxDatePickerCtrl + wxDP_SHOWCENTURY")
datePicker = wx.wxDatePickerCtrl(scrollWin, ID_DATEPICKER5, wx.wxDefaultDateTime,
wx.wxDefaultPosition, wx.wxDefaultSize,
wx.wxDP_SHOWCENTURY)
flexSizer:Add(statText, 1, wx.wxALIGN_CENTER_VERTICAL)
flexSizer:Add(datePicker, 1, wx.wxEXPAND)
-- central event handler for all wxDatePickerCtrls
scrollWin:Connect(wx.wxID_ANY, wx.wxEVT_DATE_CHANGED, OnDatePicker)
-- -----------------------------------------------------------------------
flexSizer:Add(wx.wxStaticLine(scrollWin, wx.wxID_ANY), 1, wx.wxEXPAND)
flexSizer:Add(wx.wxStaticLine(scrollWin, wx.wxID_ANY), 1, wx.wxEXPAND)
local dirPicker = nil -- not used outside of this function
statText = wx.wxStaticText(scrollWin, wx.wxID_ANY, "wxDirPickerCtrl + wxDIRP_DEFAULT_STYLE")
dirPicker = wx.wxDirPickerCtrl(scrollWin, ID_DIRPICKER1, wx.wxGetCwd(), wx.wxDirSelectorPromptStr,
wx.wxDefaultPosition, wx.wxDefaultSize,
wx.wxDIRP_DEFAULT_STYLE)
flexSizer:Add(statText, 1, wx.wxALIGN_CENTER_VERTICAL)
flexSizer:Add(dirPicker, 1, wx.wxEXPAND)
statText = wx.wxStaticText(scrollWin, wx.wxID_ANY, "wxDirPickerCtrl + wxDIRP_USE_TEXTCTRL")
dirPicker = wx.wxDirPickerCtrl(scrollWin, ID_DIRPICKER2, wx.wxGetCwd(), "I'm the message parameter",
wx.wxDefaultPosition, wx.wxDefaultSize,
wx.wxDIRP_USE_TEXTCTRL)
flexSizer:Add(statText, 1, wx.wxALIGN_CENTER_VERTICAL)
flexSizer:Add(dirPicker, 1, wx.wxEXPAND)
statText = wx.wxStaticText(scrollWin, wx.wxID_ANY, "wxDirPickerCtrl + wxDIRP_CHANGE_DIR")
dirPicker = wx.wxDirPickerCtrl(scrollWin, ID_DIRPICKER3, wx.wxGetCwd(), wx.wxDirSelectorPromptStr,
wx.wxDefaultPosition, wx.wxDefaultSize,
wx.wxDIRP_CHANGE_DIR)
flexSizer:Add(statText, 1, wx.wxALIGN_CENTER_VERTICAL)
flexSizer:Add(dirPicker, 1, wx.wxEXPAND)
statText = wx.wxStaticText(scrollWin, wx.wxID_ANY, "wxDirPickerCtrl + wxDIRP_DIR_MUST_EXIST")
dirPicker = wx.wxDirPickerCtrl(scrollWin, ID_DIRPICKER4, wx.wxGetCwd(), wx.wxDirSelectorPromptStr,
wx.wxDefaultPosition, wx.wxDefaultSize,
wx.wxDIRP_DIR_MUST_EXIST)
flexSizer:Add(statText, 1, wx.wxALIGN_CENTER_VERTICAL)
flexSizer:Add(dirPicker, 1, wx.wxEXPAND)
-- central event handler for all wxDirPickerCtrl
scrollWin:Connect(wx.wxID_ANY, wx.wxEVT_COMMAND_DIRPICKER_CHANGED, OnFileDirPicker)
-- -----------------------------------------------------------------------
flexSizer:Add(wx.wxStaticLine(scrollWin, wx.wxID_ANY), 1, wx.wxEXPAND)
flexSizer:Add(wx.wxStaticLine(scrollWin, wx.wxID_ANY), 1, wx.wxEXPAND)
local filePicker = nil -- not used outside of this function
statText = wx.wxStaticText(scrollWin, wx.wxID_ANY, "wxFilePickerCtrl + wxFLP_DEFAULT_STYLE")
filePicker = wx.wxFilePickerCtrl(scrollWin, ID_FILEPICKER1, wx.wxGetCwd(), "I'm the message parameter", "*",
wx.wxDefaultPosition, wx.wxDefaultSize,
wx.wxFLP_DEFAULT_STYLE)
flexSizer:Add(statText, 1, wx.wxALIGN_CENTER_VERTICAL)
flexSizer:Add(filePicker, 1, wx.wxEXPAND)
statText = wx.wxStaticText(scrollWin, wx.wxID_ANY, "wxFilePickerCtrl + wxFLP_USE_TEXTCTRL")
filePicker = wx.wxFilePickerCtrl(scrollWin, ID_FILEPICKER2, wx.wxGetCwd(), wx.wxFileSelectorPromptStr, wx.wxFileSelectorDefaultWildcardStr,
wx.wxDefaultPosition, wx.wxDefaultSize,
wx.wxFLP_USE_TEXTCTRL)
flexSizer:Add(statText, 1, wx.wxALIGN_CENTER_VERTICAL)
flexSizer:Add(filePicker, 1, wx.wxEXPAND)
statText = wx.wxStaticText(scrollWin, wx.wxID_ANY, "wxFilePickerCtrl + wxFLP_CHANGE_DIR")
filePicker = wx.wxFilePickerCtrl(scrollWin, ID_FILEPICKER3, wx.wxGetCwd(), wx.wxFileSelectorPromptStr, wx.wxFileSelectorDefaultWildcardStr,
wx.wxDefaultPosition, wx.wxDefaultSize,
wx.wxFLP_CHANGE_DIR)
flexSizer:Add(statText, 1, wx.wxALIGN_CENTER_VERTICAL)
flexSizer:Add(filePicker, 1, wx.wxEXPAND)
statText = wx.wxStaticText(scrollWin, wx.wxID_ANY, "wxFilePickerCtrl + wxFLP_OPEN+wxFLP_FILE_MUST_EXIST")
filePicker = wx.wxFilePickerCtrl(scrollWin, ID_FILEPICKER4, wx.wxGetCwd(), wx.wxFileSelectorPromptStr, wx.wxFileSelectorDefaultWildcardStr,
wx.wxDefaultPosition, wx.wxDefaultSize,
wx.wxFLP_OPEN + wx.wxFLP_FILE_MUST_EXIST)
flexSizer:Add(statText, 1, wx.wxALIGN_CENTER_VERTICAL)
flexSizer:Add(filePicker, 1, wx.wxEXPAND)
statText = wx.wxStaticText(scrollWin, wx.wxID_ANY, "wxFilePickerCtrl + wxFLP_SAVE+wxFLP_OVERWRITE_PROMPT")
filePicker = wx.wxFilePickerCtrl(scrollWin, ID_FILEPICKER5, wx.wxGetCwd(), wx.wxFileSelectorPromptStr, wx.wxFileSelectorDefaultWildcardStr,
wx.wxDefaultPosition, wx.wxDefaultSize,
wx.wxFLP_SAVE + wx.wxFLP_OVERWRITE_PROMPT)
flexSizer:Add(statText, 1, wx.wxALIGN_CENTER_VERTICAL)
flexSizer:Add(filePicker, 1, wx.wxEXPAND)
-- central event handler for all wxDirPickerCtrl
scrollWin:Connect(wx.wxID_ANY, wx.wxEVT_COMMAND_FILEPICKER_CHANGED, OnFileDirPicker)
-- -----------------------------------------------------------------------
flexSizer:Add(wx.wxStaticLine(scrollWin, wx.wxID_ANY), 1, wx.wxEXPAND)
flexSizer:Add(wx.wxStaticLine(scrollWin, wx.wxID_ANY), 1, wx.wxEXPAND)
local fontPicker = nil -- not used outside of this function
statText = wx.wxStaticText(scrollWin, wx.wxID_ANY, "wxFontPickerCtrl + wxFNTP_DEFAULT_STYLE, wxNullFont")
fontPicker = wx.wxFontPickerCtrl(scrollWin, ID_FONTPICKER1, wx.wxNullFont,
wx.wxDefaultPosition, wx.wxDefaultSize,
wx.wxFNTP_DEFAULT_STYLE)
flexSizer:Add(statText, 1, wx.wxALIGN_CENTER_VERTICAL)
flexSizer:Add(fontPicker, 1, wx.wxEXPAND)
statText = wx.wxStaticText(scrollWin, wx.wxID_ANY, "wxFontPickerCtrl + wxFNTP_USE_TEXTCTRL, wxNORMAL_FONT")
fontPicker = wx.wxFontPickerCtrl(scrollWin, ID_FONTPICKER2, wx.wxNORMAL_FONT,
wx.wxDefaultPosition, wx.wxDefaultSize,
wx.wxFNTP_USE_TEXTCTRL)
flexSizer:Add(statText, 1, wx.wxALIGN_CENTER_VERTICAL)
flexSizer:Add(fontPicker, 1, wx.wxEXPAND)
statText = wx.wxStaticText(scrollWin, wx.wxID_ANY, "wxFontPickerCtrl + wxFNTP_FONTDESC_AS_LABEL, wxSMALL_FONT")
fontPicker = wx.wxFontPickerCtrl(scrollWin, ID_FONTPICKER3, wx.wxSMALL_FONT,
wx.wxDefaultPosition, wx.wxDefaultSize,
wx.wxFNTP_FONTDESC_AS_LABEL)
flexSizer:Add(statText, 1, wx.wxALIGN_CENTER_VERTICAL)
flexSizer:Add(fontPicker, 1, wx.wxEXPAND)
statText = wx.wxStaticText(scrollWin, wx.wxID_ANY, "wxFontPickerCtrl + wxFNTP_USEFONT_FOR_LABEL, wxITALIC_FONT")
fontPicker = wx.wxFontPickerCtrl(scrollWin, ID_FONTPICKER4, wx.wxITALIC_FONT,
wx.wxDefaultPosition, wx.wxDefaultSize,
wx.wxFNTP_USEFONT_FOR_LABEL)
flexSizer:Add(statText, 1, wx.wxALIGN_CENTER_VERTICAL)
flexSizer:Add(fontPicker, 1, wx.wxEXPAND)
statText = wx.wxStaticText(scrollWin, wx.wxID_ANY, "wxFontPickerCtrl + wxFNTP_USEFONT_FOR_LABEL, wxSWISS_FONT")
fontPicker = wx.wxFontPickerCtrl(scrollWin, ID_FONTPICKER5, wx.wxSWISS_FONT,
wx.wxDefaultPosition, wx.wxDefaultSize,
wx.wxFNTP_USEFONT_FOR_LABEL)
flexSizer:Add(statText, 1, wx.wxALIGN_CENTER_VERTICAL)
flexSizer:Add(fontPicker, 1, wx.wxEXPAND)
-- central event handler for all wxDirPickerCtrl
scrollWin:Connect(wx.wxID_ANY, wx.wxEVT_COMMAND_FONTPICKER_CHANGED, OnFontPicker)
-- -----------------------------------------------------------------------
mainSizer:Add(flexSizer, 1, wx.wxEXPAND)
scrollWin:SetSizer(mainSizer)
mainSizer:Fit(scrollWin)
return scrollWin
end
-- ---------------------------------------------------------------------------
-- Main function of the program
-- ---------------------------------------------------------------------------
function main()
frame = wx.wxFrame( wx.NULL, -- no parent needed for toplevel windows
wx.wxID_ANY, -- don't need a wxWindow ID
"wxLua Picker Demo", -- caption on the frame
wx.wxDefaultPosition, -- let system place the frame
wx.wxSize(550, 450), -- set the size of the frame
wx.wxDEFAULT_FRAME_STYLE ) -- use default frame styles
local fileMenu = wx.wxMenu()
fileMenu:Append(wx.wxID_EXIT, "E&xit", "Quit the program")
local helpMenu = wx.wxMenu()
helpMenu:Append(wx.wxID_ABOUT, "&About", "About the wxLua Picker Application")
local menuBar = wx.wxMenuBar()
menuBar:Append(fileMenu, "&File")
menuBar:Append(helpMenu, "&Help")
frame:SetMenuBar(menuBar)
frame:CreateStatusBar(1)
frame:SetStatusText("Welcome to wxLua.")
-- connect the selection event of the exit menu item to an
-- event handler that closes the window
frame:Connect(wx.wxID_EXIT, wx.wxEVT_COMMAND_MENU_SELECTED,
function (event) frame:Close(true) end )
-- connect the selection event of the about menu item
frame:Connect(wx.wxID_ABOUT, wx.wxEVT_COMMAND_MENU_SELECTED,
function (event)
wx.wxMessageBox('This is the "About" dialog of the Picker wxLua sample.\n'..
wxlua.wxLUA_VERSION_STRING.." built with "..wx.wxVERSION_STRING,
"About wxLua",
wx.wxOK + wx.wxICON_INFORMATION,
frame)
end )
-- -----------------------------------------------------------------------
splitter = wx.wxSplitterWindow(frame, wx.wxID_ANY)
splitter:SetMinimumPaneSize(50) -- don't let it unsplit
splitter:SetSashGravity(.8)
pickerWin = CreatePickerWindow(splitter)
textCtrl = wx.wxTextCtrl(splitter, wx.wxID_ANY, "",
wx.wxDefaultPosition, wx.wxDefaultSize,
wx.wxTE_READONLY+wx.wxTE_MULTILINE+wx.wxTE_DONTWRAP)
splitter:SplitHorizontally(pickerWin, textCtrl, 300)
-- -----------------------------------------------------------------------
frame:Show(true) -- show the frame window
end
main()
-- Call wx.wxGetApp():MainLoop() last to start the wxWidgets event loop,
-- otherwise the wxLua program will exit immediately.
-- Does nothing if running from wxLua, wxLuaFreeze, or wxLuaEdit since the
-- MainLoop is already running or will be started by the C++ program.
wx.wxGetApp():MainLoop()