pax_global_header00006660000000000000000000000064135270617150014521gustar00rootroot0000000000000052 comment=b82e5497fbd6cc8afca74d6d22e0003eb4039565 wxGlade-0.9.4/000077500000000000000000000000001352706171500131265ustar00rootroot00000000000000wxGlade-0.9.4/.gitignore000066400000000000000000000006521352706171500151210ustar00rootroot00000000000000# Files to be ignored by git **.pyc **.pyo **~ # build related directories bdist build dist # build related files logdict*.log warnwxglade.txt MANIFEST # wxGlade log file wxglade.log # IDE project files .idea .ropeproject *.wpr # automatically generated version file version.py wxgladeDS.py tests/generated/*.* sphinx/images/*.* tests/generated/PythonSubclass/PythonSubclass.py docs/doctrees/*.* docs/html/_sources/*.* wxGlade-0.9.4/.hgeol000066400000000000000000000001371352706171500142260ustar00rootroot00000000000000[eol] only-consistent = False [patterns] Makefile = LF ** = native **.bat = CRLF **.html = LF wxGlade-0.9.4/.hgignore000066400000000000000000000010231352706171500147250ustar00rootroot00000000000000# Files to be ignored by mercurial syntax: glob **.pyc **.pyo **~ \#*\# **/\#*\# # automcatically generated source code documentation docs/apidocs # build related directories bdist build dist # build related files logdict*.log warnwxglade.txt MANIFEST # wxGlade log file wxglade.log # PyCharm / IntellyJ IDEA IDE .idea .ropeproject # automatically generated version file version.py wxgladeDS.py tests/generated/*.* sphinx/images/*.* tests/generated/PythonSubclass/PythonSubclass.py docs/doctrees/*.* docs/html/_sources/*.* wxGlade-0.9.4/CHANGES.txt000066400000000000000000017352441352706171500147570ustar00rootroot000000000000002016-03-03 Carsten Grohmann * NEWS.txt, docs/html/apa.html, docs/html/apb.html, docs/html/apbs02.html, docs/html/apbs03.html, docs/html/apbs04.html, docs/html/apc.html, docs/html/apd.html, docs/html/ape.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch01s07.html, docs/html/ch01s08.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch02s06.html, docs/html/ch02s07.html, docs/html/ch02s08.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch04.html, docs/html/ch04s02.html, docs/html/ch04s03.html, docs/html/ch05.html, docs/html/ch05s02.html, docs/html/ch05s03.html, docs/html/ch05s04.html, docs/html/ch05s05.html, docs/html/ch05s06.html, docs/html/ch06.html, docs/html/ch06s02.html, docs/html/ch06s03.html, docs/html/ch06s04.html, docs/html/ch06s05.html, docs/html/ch06s06.html, docs/html/ch06s07.html, docs/html/ch06s08.html, docs/html/ch06s09.html, docs/html/ch07.html, docs/html/ch07s02.html, docs/html/ch07s03.html, docs/html/design_window_empty_slot.png, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/preferences.png, docs/pdf/manual.pdf, docs/src/design_window_empty_slot.png, docs/src/manual.xml, docs/src/preferences.png: Reorganise and update the documentation [2c030f953c91] [tip] 2016-02-24 Carsten Grohmann * xml_parse.py: Remove obsolete pass statement [51bf01d7606c] 2016-02-21 Carsten Grohmann * msgdialog.py, res/messagedialog.wxg: Remove unused application startup code [e79cc413602f] * NEWS.txt, codegen/py_codegen.py, msgdialog.py, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_30.py, tests/casefiles/ComplexExample.py, tests/casefiles/ComplexExample_30.py, tests/casefiles/PyOgg1.py, tests/casefiles/PyOgg2_app.py, tests/casefiles/PyOgg3.py, tests/casefiles/PythonAddApp_multi_gettext_simple.py, tests/casefiles/PythonAddApp_multi_simple.py, tests/casefiles/PythonAddApp_single_gettext_simple.py, tests/casefiles/PythonAddApp_single_simple.py: Don't set the default value for redirection in wx.PySimpleApp() [e38c12b01c54] * widget_properties.py: Treat (escape/unescape) tabs always like newlines in Properties [c3519118ad95] * widget_properties.py: Convert newline character to newline sequence in GridProperty Newline characters entered via Ctrl+Enter won't be handled correctly. This change converts such characters to newline sequences. Thereby it will be handled correctly. [d34774dc6a0d] 2016-02-19 Carsten Grohmann * widget_properties.py: Rework GridProperty to prevent changing the type of self.cols [734fff193302] * widget_properties.py: Extract code to escape/unescape newlines / tabs into separate functions [c44a851bc014] 2016-02-18 Carsten Grohmann * widget_properties.py: Add docstring for TextProperty.multiline [3a6ddcecc4c7] * about.py: Remove unused application startup code [fe84f58b56d2] 2016-02-17 Carsten Grohmann * NEWS.txt, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_30.pl, widgets/datepicker_ctrl/perl_codegen.py: Add workaround for missing wxDefaultDateTime in wxPerl [72f1128ad9f8] 2016-02-16 Carsten Grohmann * wxGlade.desktop: Typo in desktop file [e3e25d2a8e1e] * widgets/grid/grid.py: Show newlines correctly in the grid header if shown design window [29794333dcce] 2016-02-12 Carsten Grohmann * tests/test_gui.py: Add a simple test case for loading all XRC case files [ae030730a36a] * NEWS.txt, codegen/xrc_codegen.py, tests/casefiles/AllWidgets_28.xrc, tests/casefiles/AllWidgets_30.xrc, tests/casefiles/ComplexExample.xrc, tests/casefiles/ComplexExample_30.xrc, widgets/bitmap_button/codegen.py, widgets/toolbar/codegen.py: Add support for wxArtProvider to XRC code generator [d9d987998ab6] * common.py: Improve encode_to_unicode() to work in cli mode too [8c14a3d58e05] 2016-02-11 Carsten Grohmann * wcodegen/__init__.py: Typos in docstrings [4ae0720df0c2] * widgets/static_bitmap/codegen.py: Rename class XrcCodeGenerator to StaticBitmapXrcObject [74d0f108dd03] 2016-02-10 Carsten Grohmann * tests/casefiles/import_test.xrc, xrc2wxg.py: Remove attribute xmlns during converting xrc to wxg [eaa6746cdf87] * NEWS.txt, codegen/cpp_codegen.py, tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.h, tests/casefiles/AllWidgets_30.cpp, tests/casefiles/AllWidgets_30.h, tests/casefiles/Bug179_Frame.c++, tests/casefiles/Bug179_Frame.hpp, tests/casefiles/CPPOgg1.cpp, tests/casefiles/CPPOgg1.h, tests/casefiles/CPPOgg2_MyDialog.cpp, tests/casefiles/CPPOgg2_MyDialog.h, tests/casefiles/CPPOgg2_MyFrame.cpp, tests/casefiles/CPPOgg2_MyFrame.h, tests/casefiles/CPPOgg3.cpp, tests/casefiles/CPPOgg3.h, tests/casefiles/CPP_Preferences.cpp, tests/casefiles/CPP_Preferences.h, tests/casefiles/CalendarCtrl.cpp, tests/casefiles/CalendarCtrl.h, tests/casefiles/ComplexExample.cpp, tests/casefiles/ComplexExample.h, tests/casefiles/ComplexExample_30.cpp, tests/casefiles/ComplexExample_30.h, tests/casefiles/CustomWidget.cpp, tests/casefiles/CustomWidget.h, tests/casefiles/FontColour.cpp, tests/casefiles/FontColour.h, tests/casefiles/Gauge.cpp, tests/casefiles/Gauge.h, tests/casefiles/Grid.cpp, tests/casefiles/Grid.h, tests/casefiles/HyperlinkCtrl_28.cpp, tests/casefiles/HyperlinkCtrl_28.h, tests/casefiles/Sizers_classattr.cpp, tests/casefiles/Sizers_classattr.h, tests/casefiles/Sizers_no_classattr.cpp, tests/casefiles/Sizers_no_classattr.h, tests/casefiles/Statusbar_wo_labels.cpp, tests/casefiles/Statusbar_wo_labels.h, tests/casefiles/add_class_inplace_extended.cpp, tests/casefiles/add_class_inplace_extended.h, tests/casefiles/add_class_inplace_orig.cpp, tests/casefiles/add_class_inplace_orig.h, tests/casefiles/app_wo_attrs.cpp, tests/casefiles/app_wo_attrs.h, tests/casefiles/bug163.cpp, tests/casefiles/bug163.h, tests/casefiles/bug165.cpp, tests/casefiles/bug165.h, tests/casefiles/bug166.cpp, tests/casefiles/bug166.h, tests/casefiles/bug167.cpp, tests/casefiles/bug167.h, tests/casefiles/bug167_utf8.cpp, tests/casefiles/bug167_utf8.h, tests/casefiles/no_suitable_writer.cpp, tests/casefiles/no_suitable_writer.h, tests/casefiles/no_supported_flags.cpp, tests/casefiles/no_supported_flags.h, tests/casefiles/remove_class_inplace_expected.cpp, tests/casefiles/remove_class_inplace_expected.h, tests/casefiles/remove_class_inplace_input.cpp, tests/casefiles/remove_class_inplace_input.h, tests/casefiles /styleless-dialog.cpp, tests/casefiles/styleless-dialog.h, widgets/dialog/codegen.py, widgets/frame/codegen.py, widgets/notebook/codegen.py, widgets/panel/codegen.py, widgets/splitter_window/codegen.py, widgets/toolbar/codegen.py: Use wxWindowID instead of int for widget identifiers in C++ [2ceb9bfa9998] 2016-02-09 Carsten Grohmann * wxglade.pyw: Use unicode strings if reporting of early error messages on Windows The previous code produces a mixture of ASCII and Unicode strings, that causes unusable error messages. [fa44856f4106] * NEWS.txt, docs/html/apa.html, docs/html/apb.html, docs/html/apc.html, docs/html/apd.html, docs/html/ape.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch01s07.html, docs/html/ch01s08.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch02s06.html, docs/html/ch02s07.html, docs/html/ch02s08.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch04.html, docs/html/ch04s02.html, docs/html/ch04s03.html, docs/html/ch05.html, docs/html/ch05s02.html, docs/html/ch05s03.html, docs/html/ch05s04.html, docs/html/ch06.html, docs/html/ch06s02.html, docs/html/ch06s03.html, docs/html/ch06s04.html, docs/html/ch06s05.html, docs/html/ch06s06.html, docs/html/ch06s07.html, docs/html/ch06s08.html, docs/html/ch06s09.html, docs/html/ch07.html, docs/html/ch07s02.html, docs/html/ch07s03.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/pdf/manual.pdf, docs/src/manual.xml, test.py, wxglade.py, wxglade.pyw: Improve reporting of early error messages on Windows [71c4b1eadf53] 2016-02-07 Carsten Grohmann * wcodegen/__init__.py: Add docstring for constructor class variable [a76aa5cf9831] * xrc2wxg.py: Show a warning message if an unsupported widgets is imported from xrc [4c5014fe1179] * xrc2wxg.py: Update list of supported widgets in xrc2wxg.py [88738cd17adb] 2016-02-06 Carsten Grohmann * res/templates_ui.wxg, template.py, templates_ui.py: Rename internal variables in both template dialogs [c4ccdf33f100] * NEWS.txt, tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_28.xrc, tests/casefiles/AllWidgets_30.cpp, tests/casefiles/AllWidgets_30.pl, tests/casefiles/AllWidgets_30.py, tests/casefiles/AllWidgets_30.wxg, tests/casefiles/AllWidgets_30.xrc, widgets/statusbar/codegen.py, widgets/statusbar/perl_codegen.py: Fix wrong CreateStatusBar statement if styles are selected [88adbe54429d] * NEWS.txt, codegen/__init__.py, codegen/cpp_codegen.py, edit_sizers/cpp_sizers_codegen.py, edit_sizers/edit_sizers.py, edit_sizers/lisp_sizers_codegen.py, edit_sizers/perl_sizers_codegen.py, edit_sizers/py_sizers_codegen.py, templates_ui.py, tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.h, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_30.cpp, tests/casefiles/AllWidgets_30.h, tests/casefiles/AllWidgets_30.pl, tests/casefiles/AllWidgets_30.py, tests/casefiles/CPP_Preferences.cpp, tests/casefiles/CPP_Preferences.h, tests/casefiles/ComplexExample.cpp, tests/casefiles/ComplexExample.h, tests/casefiles/ComplexExample.lisp, tests/casefiles/ComplexExample.pl, tests/casefiles/ComplexExample.py, tests/casefiles/ComplexExample_30.cpp, tests/casefiles/ComplexExample_30.h, tests/casefiles/ComplexExample_30.pl, tests/casefiles/ComplexExample_30.py, tests/casefiles/Lisp_Preferences.lisp, tests/casefiles/Perl_Preferences.pl, tests/casefiles/Python_Preferences.py, tests/casefiles/Sizers_classattr.cpp, tests/casefiles/Sizers_classattr.h, tests/casefiles/Sizers_classattr.lisp, tests/casefiles/Sizers_classattr.pl, tests/casefiles/Sizers_classattr.py, tests/casefiles/Sizers_no_classattr.cpp, tests/casefiles/Sizers_no_classattr.h, tests/casefiles/Sizers_no_classattr.lisp, tests/casefiles/Sizers_no_classattr.pl, tests/casefiles/Sizers_no_classattr.py: Inline wxStaticBox statement into wxStaticBoxSizer statement [f4aa032018dc] * tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_28.xrc, tests/casefiles/AllWidgets_30.cpp, tests/casefiles/AllWidgets_30.pl, tests/casefiles/AllWidgets_30.py, tests/casefiles/AllWidgets_30.wxg, tests/casefiles/AllWidgets_30.xrc: Remove wxDatePickerCtrl style wxDP_SPIN from all test cases The documentation describes some limitations if using this style. Thereby the style has been removed from all test cases to prevent trouble. (grafted from c1dc8a460862eaa7ebccceedc339a85985077733) [0c16f91484e3] * tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_28.xrc, tests/casefiles/AllWidgets_30.cpp, tests/casefiles/AllWidgets_30.pl, tests/casefiles/AllWidgets_30.py, tests/casefiles/AllWidgets_30.wxg, tests/casefiles/AllWidgets_30.xrc: Remove wxDatePickerCtrl style wxDP_SPIN from all test cases The documentation describes some limitations if using this style. Thereby the style has been removed from all test cases to prevent trouble. [c1dc8a460862] * compat.py, widget_properties.py: Add compatibility code for wxSizerItem.SetSizer() With wx3 "wxWindow::IsEnabled() now returns false if a window parent (and not necessarily the window itself) is disabled, new function IsThisEnabled() with the same behaviour as old IsEnabled() was added." For instance: a parent window can be disabled during a modal dialog is shown. (grafted from ba825f05d240e09a2d5ccb8453d64c45880b8d57) [e6cf181b62d0] * NEWS.txt, tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_28.xrc, tests/casefiles/AllWidgets_30.cpp, tests/casefiles/AllWidgets_30.pl, tests/casefiles/AllWidgets_30.py, tests/casefiles/AllWidgets_30.wxg, tests/casefiles/AllWidgets_30.xrc, widgets/datepicker_ctrl/codegen.py, widgets/datepicker_ctrl/perl_codegen.py, widgets/datepicker_ctrl/wconfig.py: Fix generated code for wxDatePickerCtrl (grafted from 7d890365d1eca12e7c15a1ac911ac4e804a5be8a) [633ec62814b4] * NEWS.txt, widgets/statusbar/wconfig.py: Add missing wxStatusBar style wxST_SIZEGRIP (grafted from 7040e98b356a30f12689354bd089fcc36cd32904) [771f60c5728d] * compat.py, widget_properties.py: Add compatibility code for wxSizerItem.SetSizer() With wx3 "wxWindow::IsEnabled() now returns false if a window parent (and not necessarily the window itself) is disabled, new function IsThisEnabled() with the same behaviour as old IsEnabled() was added." For instance: a parent window can be disabled during a modal dialog is shown. [ba825f05d240] 2016-02-05 Carsten Grohmann * NEWS.txt, tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_28.xrc, tests/casefiles/AllWidgets_30.cpp, tests/casefiles/AllWidgets_30.pl, tests/casefiles/AllWidgets_30.py, tests/casefiles/AllWidgets_30.wxg, tests/casefiles/AllWidgets_30.xrc, widgets/datepicker_ctrl/codegen.py, widgets/datepicker_ctrl/perl_codegen.py, widgets/datepicker_ctrl/wconfig.py: Fix generated code for wxDatePickerCtrl [7d890365d1ec] 2016-02-04 Carsten Grohmann * main.py: Add widget names to simplify using widget inspector [7804aa6ff905] * application.py: Rename panel to panel_application variable to clarify purpose [64c525b6fc3d] 2016-02-03 Carsten Grohmann * NEWS.txt, widgets/statusbar/wconfig.py: Add missing wxStatusBar style wxST_SIZEGRIP [7040e98b356a] 2016-01-24 Carsten Grohmann * tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_28.xrc, tests/casefiles/AllWidgets_30.cpp, tests/casefiles/AllWidgets_30.pl, tests/casefiles/AllWidgets_30.py, tests/casefiles/AllWidgets_30.wxg, tests/casefiles/AllWidgets_30.xrc: Add icons to AllWidget tests [77810c100db3] * NEWS.txt, codegen/cpp_codegen.py, tests/casefiles/Bug179_Frame.c++, tests/casefiles/Bug179_Frame.hpp, tests/casefiles/Bug179_main.c++, tests/casefiles/bug179.wxg, tests/test_bugs.py, tests/test_codegen.py: Fix main file is generated without custom extensions (sf bug #179) (grafted from 3d351422d9fc6149542f241d9275d867afb5534b) [1f1cce01ac62] * NEWS.txt, codegen/cpp_codegen.py, tests/casefiles/Bug179_Frame.c++, tests/casefiles/Bug179_Frame.hpp, tests/casefiles/Bug179_main.c++, tests/casefiles/bug179.wxg, tests/test_bugs.py, tests/test_codegen.py: Fix main file is generated without custom extensions (sf bug #179) [3d351422d9fc] 2016-01-23 Carsten Grohmann * NEWS.txt, preferences_ui.py, tests/casefiles/Perl_Preferences.pl, tests/casefiles/Python_Preferences.py, widgets/dialog/codegen.py, widgets/dialog/perl_codegen.py, widgets/frame/codegen.py, widgets/frame/perl_codegen.py: Fix usage of wx.NullIcon for Perl and Python [4028580ba0cc] * NEWS.txt, edit_sizers/edit_sizers.py: Fix PyDeadObjectError during closing wxGlade (grafted from 60fe758aa2994d64f02d62cbff57c9059cca5d58) [89c22e4d3fb6] * edit_sizers/edit_sizers.py: Rename some variables to clarify purpose [f70ef68ecc58] * bugdialog.py, edit_sizers/edit_sizers.py, font_dialog.py, main.py, widgets/custom_widget/custom_widget.py, widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/gauge/gauge.py, widgets/menubar/menubar.py, widgets/notebook/notebook.py, widgets/slider/slider.py, widgets/spacer/spacer.py, widgets/splitter_window/splitter_window.py, widgets/static_line/static_line.py, widgets/statusbar/statusbar.py, widgets/toolbar/toolbar.py: Destroy() all instances of wxDialog after usage [24fb34baf3c3] * tests/test_gui.py, widget_properties.py, widgets/notebook/notebook.py: Remove obsolete comma in function argument lists [9cc1be9e2268] * edit_sizers/edit_sizers.py: Draw hatched lines of sizer slots only on MSW in foreground [98b17716ac81] * NEWS.txt, edit_sizers/edit_sizers.py: Fix PyDeadObjectError during closing wxGlade [60fe758aa299] 2016-01-10 Carsten Grohmann * NEWS.txt, edit_sizers/edit_sizers.py: Fix black window bug on Windows It's not possible to draw the hatched lines to the background on MSW due to a bug in wxWidgets. It's wxWidget bug #17326 "SetBackground() with hatched brushes cases black background on MSW" (grafted from 0a1811d9a3fe5257e60799e7fea9f3651117179a) [51858439bbcb] * NEWS.txt, edit_sizers/edit_sizers.py: Fix black window bug on Windows It's not possible to draw the hatched lines to the background on MSW due to a bug in wxWidgets. It's wxWidget bug #17326 "SetBackground() with hatched brushes cases black background on MSW" [0a1811d9a3fe] 2016-01-08 Carsten Grohmann * NEWS.txt, common.py: Fix WindowsError is the backup file already exists (Thanks to Graeme Glenn) (grafted from 8363d1e592af423ea8e3f4b9ad90bf349e9b7851) [4c20f2fa0215] * NEWS.txt, common.py: Fix WindowsError is the backup file already exists (Thanks to Graeme Glenn) [8363d1e592af] 2016-01-07 Carsten Grohmann * NEWS.txt, compat.py, edit_sizers/edit_sizers.py: Fix ZeroDevisionError during adding a new column to a wxFlexGridSizer with only one row The API changed with wx 2.9: wx3 wxGridSizer.GetRows() and wxGridSizer.GetCols() "returns zero if the sizer is automatically adjusting the number of rows depending on number of its children." (grafted from fa206b3bcc3e3cf06e9671c1069373136d4142d0) [012c084ba4ba] 2016-01-06 Carsten Grohmann * NEWS.txt, edit_sizers/edit_sizers.py: Fix NameError exception during inserting a sizer slot (grafted from d7c6eda7a797e47993f5ca12ac76a7f875023eaf) [2345ac6822a3] 2016-01-05 Carsten Grohmann * NEWS.txt, widgets/static_line/static_line.py: Fix wrong orientation of wxStaticLine widgets (grafted from f9035341846ff0881fd6b3a69f8d806e924efb63) [ecec97ef8332] * widgets/slider/wconfig.py: Extend style description of wxSlider (grafted from e04101192b60dedd4571b3e1f5f13cfa67c7746c) [ac72fa86bd0d] * widgets/static_line/wconfig.py: Extend style description of wxStaticLine (grafted from 7400864e82fd8f2e1d798001eab6ed7c14c25bdf) [46ca917b4d50] 2016-01-07 Carsten Grohmann * NEWS.txt, compat.py, edit_sizers/edit_sizers.py: Fix ZeroDevisionError during adding a new column to a wxFlexGridSizer with only one row The API changed with wx 2.9: wx3 wxGridSizer.GetRows() and wxGridSizer.GetCols() "returns zero if the sizer is automatically adjusting the number of rows depending on number of its children." [fa206b3bcc3e] 2016-01-06 Carsten Grohmann * NEWS.txt, edit_sizers/edit_sizers.py: Fix NameError exception during inserting a sizer slot [d7c6eda7a797] 2016-01-05 Carsten Grohmann * Makefile: Create all documentation from source files in "doc" rule [ea1496fe1939] * Makefile: Update path of manpage style sheet [771695f0648a] * .hgignore, docs/man/wxglade.1: Adding wxglade manpage to the repository [cf20c36f98d4] * .hgignore: Remove ignored files from Eric IDE [4c3bc52c2c75] * NEWS.txt, widgets/static_line/static_line.py: Fix wrong orientation of wxStaticLine widgets [f9035341846f] * widgets/slider/wconfig.py: Extend style description of wxSlider [e04101192b60] * widgets/static_line/wconfig.py: Extend style description of wxStaticLine [7400864e82fd] 2016-01-01 Carsten Grohmann * LICENSE.txt, MANIFEST.in, about.py, appdata.xml, application.py, bugdialog.py, clipboard.py, code_property.py, codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/perl_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, color_dialog.py, common.py, compat.py, config.py, decorators.py, docs/html/apa.html, docs/html/apb.html, docs/html/apc.html, docs/html/apd.html, docs/html/ape.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch01s07.html, docs/html/ch01s08.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch02s06.html, docs/html/ch02s07.html, docs/html/ch02s08.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch04.html, docs/html/ch04s02.html, docs/html/ch04s03.html, docs/html/ch05.html, docs/html/ch05s02.html, docs/html/ch05s03.html, docs/html/ch05s04.html, docs/html/ch06.html, docs/html/ch06s02.html, docs/html/ch06s03.html, docs/html/ch06s04.html, docs/html/ch06s05.html, docs/html/ch06s06.html, docs/html/ch06s07.html, docs/html/ch06s08.html, docs/html/ch06s09.html, docs/html/ch07.html, docs/html/ch07s02.html, docs/html/ch07s03.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/man/manpage.xml, docs/pdf/manual.pdf, docs/src/manual.xml, edit_sizers/__init__.py, edit_sizers/cpp_sizers_codegen.py, edit_sizers/edit_sizers.py, edit_sizers/lisp_sizers_codegen.py, edit_sizers/perl_sizers_codegen.py, edit_sizers/py_sizers_codegen.py, edit_sizers/xrc_sizers_codegen.py, edit_widget.py, edit_windows.py, errors.py, events_mixin.py, gui_mixins.py, install/pyinstaller/build.bat, install/pyinstaller/hooks/hook-main.py, install/pyinstaller/wxglade- SAE-installer.iss, install/pyinstaller/wxglade-installer.iss, install/pyinstaller/wxglade.spec, layout_option_property.py, log.py, main.py, misc.py, plugins.py, preferencesdialog.py, setup.py, template.py, test.py, tests/__init__.py, tests/casefiles/file_encodings.txt, tests/test_bugs.py, tests/test_codegen.py, tests/test_compile.py, tests/test_external.py, tests/test_gui.py, tree.py, wcodegen/__init__.py, wcodegen/dialogs.py, wcodegen/taghandler.py, widget_properties.py, widgets/ChoicesCodeHandler.py, widgets/ChoicesProperty.py, widgets/MenuTree.py, widgets/bitmap_button/bitmap_button.py, widgets/bitmap_button/codegen.py, widgets/bitmap_button/lisp_codegen.py, widgets/bitmap_button/perl_codegen.py, widgets/bitmap_button/wconfig.py, widgets/button/button.py, widgets/button/codegen.py, widgets/button/lisp_codegen.py, widgets/button/perl_codegen.py, widgets/button/wconfig.py, widgets/calendar_ctrl/calendar_ctrl.py, widgets/calendar_ctrl/codegen.py, widgets/calendar_ctrl/perl_codegen.py, widgets/calendar_ctrl/wconfig.py, widgets/checkbox/checkbox.py, widgets/checkbox/checkbox_base.py, widgets/checkbox/codegen.py, widgets/checkbox/lisp_codegen.py, widgets/checkbox/perl_codegen.py, widgets/checkbox/wconfig.py, widgets/choice/choice.py, widgets/choice/codegen.py, widgets/choice/lisp_codegen.py, widgets/choice/perl_codegen.py, widgets/choice/wconfig.py, widgets/combo_box/codegen.py, widgets/combo_box/combo_box.py, widgets/combo_box/lisp_codegen.py, widgets/combo_box/perl_codegen.py, widgets/combo_box/wconfig.py, widgets/custom_widget/codegen.py, widgets/custom_widget/custom_widget.py, widgets/custom_widget/lisp_codegen.py, widgets/custom_widget/perl_codegen.py, widgets/datepicker_ctrl/codegen.py, widgets/datepicker_ctrl/datepicker_ctrl.py, widgets/datepicker_ctrl/lisp_codegen.py, widgets/datepicker_ctrl/perl_codegen.py, widgets/datepicker_ctrl/wconfig.py, widgets/dialog/codegen.py, widgets/dialog/dialog.py, widgets/dialog/lisp_codegen.py, widgets/dialog/perl_codegen.py, widgets/dialog/wconfig.py, widgets/frame/codegen.py, widgets/frame/frame.py, widgets/frame/lisp_codegen.py, widgets/frame/perl_codegen.py, widgets/frame/wconfig.py, widgets/gauge/codegen.py, widgets/gauge/lisp_codegen.py, widgets/gauge/perl_codegen.py, widgets/gauge/wconfig.py, widgets/grid/grid.py, widgets/grid/lisp_codegen.py, widgets/grid/perl_codegen.py, widgets/grid/wconfig.py, widgets/hyperlink_ctrl/__init__.py, widgets/hyperlink_ctrl/codegen.py, widgets/hyperlink_ctrl/hyperlink_ctrl.py, widgets/hyperlink_ctrl/lisp_codegen.py, widgets/hyperlink_ctrl/perl_codegen.py, widgets/hyperlink_ctrl/wconfig.py, widgets/list_box/codegen.py, widgets/list_box/lisp_codegen.py, widgets/list_box/list_box.py, widgets/list_box/perl_codegen.py, widgets/list_box/wconfig.py, widgets/list_ctrl/codegen.py, widgets/list_ctrl/lisp_codegen.py, widgets/list_ctrl/list_ctrl.py, widgets/list_ctrl/perl_codegen.py, widgets/list_ctrl/wconfig.py, widgets/menubar/codegen.py, widgets/menubar/menubar.py, widgets/menubar/perl_codegen.py, widgets/notebook/codegen.py, widgets/notebook/lisp_codegen.py, widgets/notebook/notebook.py, widgets/notebook/perl_codegen.py, widgets/notebook/wconfig.py, widgets/panel/codegen.py, widgets/panel/lisp_codegen.py, widgets/panel/panel.py, widgets/panel/perl_codegen.py, widgets/panel/wconfig.py, widgets/radio_box/codegen.py, widgets/radio_box/lisp_codegen.py, widgets/radio_box/perl_codegen.py, widgets/radio_box/radio_box.py, widgets/radio_box/radio_box_base.py, widgets/radio_box/wconfig.py, widgets/radio_button/codegen.py, widgets/radio_button/lisp_codegen.py, widgets/radio_button/perl_codegen.py, widgets/radio_button/radio_button.py, widgets/radio_button/wconfig.py, widgets/slider/codegen.py, widgets/slider/lisp_codegen.py, widgets/slider/perl_codegen.py, widgets/slider/slider.py, widgets/slider/wconfig.py, widgets/spacer/codegen.py, widgets/spacer/lisp_codegen.py, widgets/spacer/perl_codegen.py, widgets/spacer/spacer.py, widgets/spin_button/codegen.py, widgets/spin_button/lisp_codegen.py, widgets/spin_button/perl_codegen.py, widgets/spin_button/spin_button.py, widgets/spin_button/wconfig.py, widgets/spin_ctrl/codegen.py, widgets/spin_ctrl/lisp_codegen.py, widgets/spin_ctrl/perl_codegen.py, widgets/spin_ctrl/spin_ctrl.py, widgets/spin_ctrl/wconfig.py, widgets/splitter_window/codegen.py, widgets/splitter_window/lisp_codegen.py, widgets/splitter_window/perl_codegen.py, widgets/splitter_window/splitter_window.py, widgets/splitter_window/wconfig.py, widgets/static_bitmap/codegen.py, widgets/static_bitmap/lisp_codegen.py, widgets/static_bitmap/perl_codegen.py, widgets/static_bitmap/static_bitmap.py, widgets/static_bitmap/wconfig.py, widgets/static_line/codegen.py, widgets/static_line/lisp_codegen.py, widgets/static_line/perl_codegen.py, widgets/static_line/static_line.py, widgets/static_line/wconfig.py, widgets/static_text/codegen.py, widgets/static_text/lisp_codegen.py, widgets/static_text/perl_codegen.py, widgets/static_text/static_text.py, widgets/static_text/wconfig.py, widgets/statusbar/__init__.py, widgets/statusbar/codegen.py, widgets/statusbar/lisp_codegen.py, widgets/statusbar/perl_codegen.py, widgets/statusbar/statusbar.py, widgets/statusbar/wconfig.py, widgets/text_ctrl/codegen.py, widgets/text_ctrl/lisp_codegen.py, widgets/text_ctrl/perl_codegen.py, widgets/text_ctrl/text_ctrl.py, widgets/text_ctrl/wconfig.py, widgets/toggle_button/codegen.py, widgets/toggle_button/lisp_codegen.py, widgets/toggle_button/perl_codegen.py, widgets/toggle_button/toggle_button.py, widgets/toggle_button/wconfig.py, widgets/toolbar/codegen.py, widgets/toolbar/lisp_codegen.py, widgets/toolbar/perl_codegen.py, widgets/toolbar/tool.py, widgets/toolbar/toolbar.py, widgets/toolbar/wconfig.py, widgets/tree_ctrl/codegen.py, widgets/tree_ctrl/lisp_codegen.py, widgets/tree_ctrl/perl_codegen.py, widgets/tree_ctrl/tree_ctrl.py, widgets/tree_ctrl/wconfig.py, wxglade, wxglade.py, wxglade.pyw, xml_parse.py, xrc2wxg.py: Update copyright year [fabd4a25d23e] * NEWS.txt, application.py, common.py, kdefiledialog.py, main.py, misc.py, preferences_ui.py, preferencesdialog.py, res/preferences_ui.wxg, widget_properties.py, widgets/bitmap_button/bitmap_button.py, widgets/static_bitmap/static_bitmap.py, widgets/toolbar/toolbar.py: Remove usage of KDE file dialog [c5fe5ef69ff7] * CHANGES.txt, changelog.style, docs/ReleaseSteps.txt: Update release documentation [c1dfe4cb14f5] 2015-12-29 Carsten Grohmann * setup.py: Remove obsolation setup requirement setuptools_hg [8cce02f8702e] 2015-12-26 Carsten Grohmann * README.SF.md: Add package checksums [52c0472bd07f] * version.py: Add version file [ca598bf107a7] * NEWS.txt, install/pyinstaller/wxglade-installer.iss: Start new development cycle [b387f5691856] * Created WXG-BRANCH-VERSION_0_7_1 branch [59331e19f57a] * .hgtags: Added tag rel_0.7.1 for changeset 5668b53d9f7d [f236cc6d527e] * Closed WXG-BRANCH-VERSION_0_7_0 branch [be549fd67e4f] * CHANGES.txt, NEWS.txt, README.SF.md, README.txt, install/pyinstaller /wxglade-installer.iss, wxGlade.desktop: Bump version number to 0.7.1 [5668b53d9f7d] [rel_0.7.1] * docs/ReleaseSteps.txt: Update release steps [7076007a12f2] 2015-12-23 Carsten Grohmann * widget_properties.py: Add a cache for wrapped messages textwarp.wrap() is teribble show. The cache accelerate loading larger designs significantly. [1ceb257b3e1c] 2015-12-19 Carsten Grohmann * icons/wxg_file.ico: Change size of wxg file icon to 32x64 to 32x32 [4f456563cac1] * docs/html/apa.html, docs/html/apb.html, docs/html/apc.html, docs/html/apd.html, docs/html/ape.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch01s07.html, docs/html/ch01s08.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch02s06.html, docs/html/ch02s07.html, docs/html/ch02s08.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch04.html, docs/html/ch04s02.html, docs/html/ch04s03.html, docs/html/ch05.html, docs/html/ch05s02.html, docs/html/ch05s03.html, docs/html/ch05s04.html, docs/html/ch06.html, docs/html/ch06s02.html, docs/html/ch06s03.html, docs/html/ch06s04.html, docs/html/ch06s05.html, docs/html/ch06s06.html, docs/html/ch06s07.html, docs/html/ch06s08.html, docs/html/ch06s09.html, docs/html/ch07.html, docs/html/ch07s02.html, docs/html/ch07s03.html, docs/html/custom_widget_SM_design1.png, docs/html/custom_widget_SM_design2.png, docs/html/custom_widget_SM_preview.png, docs/html/custom_widget_SM_tree.png, docs/html/index.html, docs/html/mondrian_200x200.png, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/properties_window_tab_3.png, docs/html/properties_window_tab_3_dont_generate_code.png, docs/pdf/manual.pdf, docs/src/custom_widget_SM_design1.png, docs/src/custom_widget_SM_design2.png, docs/src/custom_widget_SM_preview.png, docs/src/custom_widget_SM_tree.png, docs/src/manual.xml, docs/src/mondrian_200x200.png, docs/src/properties_window_tab_3.png, docs/src/properties_window_tab_3_dont_generate_code.png: Update and extend documentation [cf99bed74b41] 2015-12-14 Carsten Grohmann * tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.h, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_28.xrc, tests/casefiles/AllWidgets_30.cpp, tests/casefiles/AllWidgets_30.h, tests/casefiles/AllWidgets_30.pl, tests/casefiles/AllWidgets_30.py, tests/casefiles/AllWidgets_30.wxg, tests/casefiles/AllWidgets_30.xrc: Clarify widget name in AllWidgets examples [e52637656945] 2015-12-11 Carsten Grohmann * templates/Dialog_with_two_buttons.wgt: Remove email from author entry in two button dialog template [03e04b31c0f7] * templates/CustomWidget_AGW_SpeedMeter.wgt: Add a custom widget example as a template [4776a304e204] 2015-12-07 Carsten Grohmann * main.py, widgets/notebook/notebook.py, widgets/panel/panel.py, widgets/splitter_window/splitter_window.py: Improve wording [e005a68b619c] 2015-12-06 Carsten Grohmann * docs/src/manual.xml, wxGlade.desktop: Use XPM formatted icon in wxGlade desktop file [9ef2515dcf94] * icons/wxglade.xpm: Add XPM formatted wxGlade icon [6aee6bc081aa] * edit_sizers/edit_sizers.py: Fix SegFault during removal of sizer slots wxSizer.Remove(elem.widget) doesn't remove the widget from the sizer. After the call the widget is listed with GetChildren(). Now the widget is detached only. It will be deleted later like in the previous revisions. [e2ab49f697a6] * edit_sizers/edit_sizers.py: Minor documentation and code improvements for sizer code [e7f3db5c1050] * README.SF.md: Add RC2 details [779305a771fb] * .hgtags: Added tag rel_0.7.1RC2 for changeset 27d9766606a8 [0c172f8b5b31] 2015-12-04 Carsten Grohmann * compat.py: Disable compatibility code for wxSizerItem.SetSizer() AssignSizer() causes dead objects if widgets are added to more than one sizer. [27d9766606a8] [rel_0.7.1RC2] * NEWS.txt, config.py, tests/casefiles/app_wo_attrs_gui.wxg, tests/casefiles/app_wo_attrs_gui.xrc, tests/test_gui.py, xml_parse.py: Load wxg files even if application attributes are missing [0cc9a0ce2409] * tests/test_gui.py: Show widgets during graphical tests are running [65e6ad5775af] * edit_sizers/edit_sizers.py: Simplify widget handling in sizer code to prevent PyAssertionError The current code raises a PyAssertionError because "Adding a window to the same sizer twice?". The current simplified code should prevent such messages. [05e859527d7f] * edit_sizers/edit_sizers.py: Update source documentation of edit sizer code [60e3605cc830] 2015-12-03 Carsten Grohmann * application.py, edit_sizers/edit_sizers.py, edit_windows.py, main.py, misc.py, tree.py: Remove hidden_property_panel workaround The workaround caused an assertion exception because an object was added to two sizers at the same time. [d47846fa5f4a] 2015-12-02 Carsten Grohmann * tests/test_gui.py: Suppress wx error messages during running test cases [e4695e26371a] * widgets/toolbar/toolbar.py: Improve deleting tools from toolbar A new test setup causes the assertion error shown below. This change fix this error: File "/home/carsten/wxglade/widgets/toolbar/toolbar.py", line 718, in set_tools while self.widget.DeleteToolByPos(0): File "/usr/lib64/python2.7/site-packages/wx-3.0-gtk2/wx/_controls.py", line 3777, in DeleteToolByPos return _controls_.ToolBarBase_DeleteToolByPos(*args, **kwargs) PyAssertionError: C++ assertion "pos < GetToolsCount()" failed at ./src/common/tbarbase.cpp(328) in DeleteToolByPos(): invalid position in wxToolBar::DeleteToolByPos() [c09299f9934b] 2015-11-30 Carsten Grohmann * NEWS.txt, README.txt, wxGlade.desktop: Bump version number to 0.7.1RC2 [eb84df738324] * compat.py, edit_sizers/edit_sizers.py, edit_widget.py, edit_windows.py, widgets/bitmap_button/bitmap_button.py, widgets/button/button.py, widgets/calendar_ctrl/calendar_ctrl.py, widgets/check_list_box/check_list_box.py, widgets/checkbox/checkbox.py, widgets/choice/choice.py, widgets/combo_box/combo_box.py, widgets/custom_widget/custom_widget.py, widgets/datepicker_ctrl/datepicker_ctrl.py, widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/gauge/gauge.py, widgets/generic_calendar_ctrl/generic_calendar_ctrl.py, widgets/grid/grid.py, widgets/hyperlink_ctrl/hyperlink_ctrl.py, widgets/list_box/list_box.py, widgets/list_ctrl/list_ctrl.py, widgets/menubar/menubar.py, widgets/notebook/notebook.py, widgets/panel/panel.py, widgets/property_grid_manager/property_grid_manager.py, widgets/radio_box/radio_box.py, widgets/radio_button/radio_button.py, widgets/slider/slider.py, widgets/spin_button/spin_button.py, widgets/spin_ctrl/spin_ctrl.py, widgets/splitter_window/splitter_window.py, widgets/static_bitmap/static_bitmap.py, widgets/static_line/static_line.py, widgets/static_text/static_text.py, widgets/statusbar/statusbar.py, widgets/text_ctrl/text_ctrl.py, widgets/toggle_button/toggle_button.py, widgets/toolbar/toolbar.py, widgets/tree_ctrl/tree_ctrl.py: Add compatibility code for wxSizerItem.SetSizer() wxSizerItem.SetSizer() is deprecated since wxPython 3.0 use wxSizerItem.AssignSizer() instead. [1717c49eb9d2] 2015-11-25 Carsten Grohmann * compat.py: Rework handling of compat function Take the decision which function is to use once per application runtime and not once per function call [b4e847c9bfe7] 2015-11-24 Carsten Grohmann * codegen/cpp_codegen.py: Remove unsed local variable "out_path" in CPPCodeWriter.init_lang() [df18c6238933] * NEWS.txt, tests/casefiles/app_wo_attrs.cpp, tests/casefiles/app_wo_attrs.h, tests/casefiles/app_wo_attrs.lisp, tests/casefiles/app_wo_attrs.pl, tests/casefiles/app_wo_attrs.py, tests/casefiles/app_wo_attrs.wxg, tests/casefiles/app_wo_attrs.xrc, tests/test_codegen.py, xml_parse.py: Use defaults for missing application attributes in wxg files The tag has a lot of attributes to specifiy generating source files. If a attribute is missed the defaults will be used. Except the "language" attribute. This will be get from the code writer instance. [35f567111940] 2015-11-23 Carsten Grohmann * xml_parse.py: Wrong type definition in docstring of xml_parse.Sizeritem.set_flag() [e5c21a726f9a] * codegen/cpp_codegen.py, config.py, tests/test_codegen.py: Store some C++ defaults in config module [811190f33cf4] * tests/test_gui.py, xml_parse.py: Typo in error message [ab1fb8370768] 2015-11-18 Carsten Grohmann * clipboard.py, xml_parse.py: Minor code reorg and docstring changes related to the previous commit [a7d98ed6a95b] * NEWS.txt, clipboard.py, xml_parse.py: Fix root widget loses layout attributes during copy and paste [2e2a110bcd84] 2015-11-16 Carsten Grohmann * widgets/button/button.py, widgets/calendar_ctrl/calendar_ctrl.py, widgets/datepicker_ctrl/datepicker_ctrl.py, widgets/generic_calendar_ctrl/generic_calendar_ctrl.py: Add new created object existing sizer to some XML factory functions Most of the XML factory functions adds new created objects to sizers already. Some widgets hadn't implemented this code. [1510f918aeef] 2015-11-12 Carsten Grohmann * wxglade.py: Import and initialise Python Fault Handler if available [b47df010ce3c] 2015-11-10 Carsten Grohmann * codegen/perl_codegen.py, widgets/menubar/perl_codegen.py: Remove usage of codegen.perl_codegen.PerlCodeWriter.quote_key() [28f6c0d28e8e] * tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.h, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_28.xrc, tests/casefiles/AllWidgets_30.cpp, tests/casefiles/AllWidgets_30.h, tests/casefiles/AllWidgets_30.pl, tests/casefiles/AllWidgets_30.py, tests/casefiles/AllWidgets_30.wxg, tests/casefiles/AllWidgets_30.xrc: Add more complex menus to AllWidgets test cases for 2.8 and 3.0 [6831418208d3] * NEWS.txt, codegen/perl_codegen.py, widgets/menubar/perl_codegen.py: Fix binding of menu event in Perl [adef9976b2ec] * wcodegen/__init__.py: Typo in docstring [c848603c086f] * Makefile: Add rule for clonedigger [f29fb543a033] 2015-11-09 Carsten Grohmann * bugdialog_ui.py, res/bugdialog_ui.wxg: Increase initial size of bug dialog [74d38345f17c] * misc.py: Remove first and empty declaration of misc.accel_table misc.accel_table has been declared twice. The first declaration is removed and the docstring is part of the second declaration now. [c433e63e5bcc] 2015-11-08 Carsten Grohmann * edit_sizers/edit_sizers.py, edit_windows.py, tree.py, widgets/menubar/menubar.py, widgets/panel/panel.py, widgets/toolbar/toolbar.py: Rework calculating popup menu positions The previous version doesn't work with wxPython 2.8 [dad39564da40] 2015-11-07 Carsten Grohmann * tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.h, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_28.xrc: Remove wxPropertyGridManager and wxGenericCalendarCtrl from 2.8 tests Both widgets are not supported with wxPython 2.8 and prevent using the test case with wxPython 2.8 [aa1fda2243ac] * NEWS.txt, edit_windows.py: Fix a infinite loop within sizing a widget (sf bug #170) There are an infinite loop of wxSizeEvents. All events have the same id. It looks currently like a bug in the underlaying wx libraries especially in the GTK part. The bug doesn't occur on Windows. The issue probably occur only within EditGrid. This is workaround prevents the propagation if the size hasn't changed. [99eb611e25c1] 2015-11-01 Carsten Grohmann * edit_sizers/edit_sizers.py, events_mixin.py, widget_properties.py, widgets/statusbar/lisp_codegen.py, xrc2wxg.py: Rework some for statements to be more Pythonic [bf00e82cea14] 2015-10-31 Carsten Grohmann * edit_sizers/edit_sizers.py: Reformat docstring for edit_sizers.change_sizer() [cc1dc83a1424] * docs/html/apa.html, docs/html/apb.html, docs/html/apd.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch01s07.html, docs/html/ch01s08.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch02s06.html, docs/html/ch02s07.html, docs/html/ch02s08.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch04.html, docs/html/ch04s02.html, docs/html/ch04s03.html, docs/html/ch05.html, docs/html/ch05s02.html, docs/html/ch05s03.html, docs/html/ch05s04.html, docs/html/ch06.html, docs/html/ch06s02.html, docs/html/ch06s03.html, docs/html/ch06s04.html, docs/html/ch06s05.html, docs/html/ch06s06.html, docs/html/ch06s07.html, docs/html/ch06s08.html, docs/html/ch06s09.html, docs/html/ch07.html, docs/html/ch07s02.html, docs/html/ch07s03.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/pdf/manual.pdf, docs/src/manual.xml: Change documentation to reflect changed name of SizerSlot.on_drop_widget() [0b13533b75f1] * clipboard.py, edit_sizers/edit_sizers.py, edit_windows.py, widgets/panel/panel.py: Minor code reorg in accessing clipboard functions [0dc724c3ad3d] * edit_sizers/edit_sizers.py: Fix segfault triggered by deleting a SizerSlot instance The segfault was triggered by incorrect / incomplete deletion of related objects. The incorrect code was probably introduced in 1737:e6c212b7f347 "Rework SizerSlot class mainly to draw background buffered" [02df7a2ab281] * edit_sizers/edit_sizers.py: Rename some event handler in calss SizerSlot to start with "on_" [adb06566cb35] 2015-10-30 Carsten Grohmann * NEWS.txt, widgets/gauge/gauge.py, widgets/slider/slider.py, widgets/splitter_window/splitter_window.py, widgets/static_line/static_line.py: Fix TypeError triggered during generating the widget label Creating a widget label raises a TypeError (due a programming bug) if a widget of this type already exists. [ee021cfff68f] 2015-10-29 Carsten Grohmann * NEWS.txt, clipboard.py: Fix unicode error during copying widgets to the clipboard [4d21265043c7] 2015-10-25 Carsten Grohmann * Makefile, pylintrc: Use Pylint config file instead of commandline options [cac19923c9a8] * pylintrc: Plain and unmodified Pylint configuration file [d8d352934705] * setup.py: Use own implementation to filter files for binary packages This change solves a possible license issue, because the old implementation was copied from the Python source code and modified. The new implementation just filters the output of the original implementation. [1990285b58e0] 2015-10-08 Carsten Grohmann * docs/html/apa.html, docs/html/apb.html, docs/html/apd.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch01s07.html, docs/html/ch01s08.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch02s06.html, docs/html/ch02s07.html, docs/html/ch02s08.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch04.html, docs/html/ch04s02.html, docs/html/ch04s03.html, docs/html/ch05.html, docs/html/ch05s02.html, docs/html/ch05s03.html, docs/html/ch05s04.html, docs/html/ch06.html, docs/html/ch06s02.html, docs/html/ch06s03.html, docs/html/ch06s04.html, docs/html/ch06s05.html, docs/html/ch06s06.html, docs/html/ch06s07.html, docs/html/ch06s08.html, docs/html/ch06s09.html, docs/html/ch07.html, docs/html/ch07s02.html, docs/html/ch07s03.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/properties_custom_widget.png, docs/pdf/manual.pdf, docs/src/manual.xml, docs/src/properties_custom_widget.png, widgets/custom_widget/custom_widget.py: Remove button 'Help on "Arguments" property' use the documentation instead The custom widget is well described incl. a short example in the wxGlade documentation now. [b3eebf6429ee] 2015-10-06 Carsten Grohmann * docs/html/apa.html, docs/html/apb.html, docs/html/apd.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch01s07.html, docs/html/ch01s08.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch02s06.html, docs/html/ch02s07.html, docs/html/ch02s08.html, docs/html/ch02s09.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch04.html, docs/html/ch04s02.html, docs/html/ch04s03.html, docs/html/ch05.html, docs/html/ch05s02.html, docs/html/ch05s03.html, docs/html/ch05s04.html, docs/html/ch06.html, docs/html/ch06s02.html, docs/html/ch06s03.html, docs/html/ch06s04.html, docs/html/ch06s05.html, docs/html/ch06s06.html, docs/html/ch06s07.html, docs/html/ch06s08.html, docs/html/ch06s09.html, docs/html/ch07.html, docs/html/ch07s02.html, docs/html/ch07s03.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/properties_custom_widget.png, docs/html/tooltip_styles.png, docs/html/wxglade_start_on_linux.png, docs/html/wxglade_start_on_windows.png, docs/pdf/manual.pdf, docs/src/manual.xml, docs/src/properties_custom_widget.png, docs/src/tooltip_styles.png, docs/src/wxglade_start_on_linux.png, docs/src/wxglade_start_on_windows.png: Update and extend documentation [1faf6ce251df] 2015-10-02 Carsten Grohmann * Makefile: Clearify distclean rule [1241901289f2] 2015-09-26 Carsten Grohmann * wxglade: Rework start shell script to search the right python interpreter [6fef7aca9201] 2015-09-18 Carsten Grohmann * config.py: Re-add docstring lost in 2ce339510eca "Move common.widget_config ..." [0e873dfda314] 2015-09-11 Carsten Grohmann * install/pyinstaller/wxglade-installer.iss: Extend cleanup of byte code files during deinstallation on Windows [8d8d2322eefb] 2015-09-03 Carsten Grohmann * about.py, common.py: Rework detection of paths to different wxGlade resources [e4a6e385aa7a] 2015-08-31 Carsten Grohmann * docs/index.html: Remove obsolete documentation index file [86363c74f5ec] * common.py, config.py, docs/src/manual.xml, install/pyinstaller /wxglade-installer.iss, main.py, tests/__init__.py, wxglade.py: Clearify manual and tutorial path [23eb133a540b] 2015-08-28 Carsten Grohmann * README.SF.md: Add RC1 details [abd9e8955e0d] * common.py, edit_sizers/edit_sizers.py, widgets/bitmap_button/bitmap_button.py, widgets/button/button.py, widgets/calendar_ctrl/calendar_ctrl.py, widgets/check_list_box/check_list_box.py, widgets/checkbox/checkbox.py, widgets/choice/choice.py, widgets/combo_box/combo_box.py, widgets/custom_widget/custom_widget.py, widgets/datepicker_ctrl/datepicker_ctrl.py, widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/gauge/gauge.py, widgets/generic_calendar_ctrl/generic_calendar_ctrl.py, widgets/grid/grid.py, widgets/hyperlink_ctrl/hyperlink_ctrl.py, widgets/list_box/list_box.py, widgets/list_ctrl/list_ctrl.py, widgets/menubar/menubar.py, widgets/notebook/notebook.py, widgets/panel/panel.py, widgets/property_grid_manager/property_grid_manager.py, widgets/radio_box/radio_box.py, widgets/radio_button/radio_button.py, widgets/slider/slider.py, widgets/spacer/spacer.py, widgets/spin_button/spin_button.py, widgets/spin_ctrl/spin_ctrl.py, widgets/splitter_window/splitter_window.py, widgets/static_bitmap/static_bitmap.py, widgets/static_line/static_line.py, widgets/static_text/static_text.py, widgets/statusbar/statusbar.py, widgets/text_ctrl/text_ctrl.py, widgets/toggle_button/toggle_button.py, widgets/toolbar/toolbar.py, widgets/tree_ctrl/tree_ctrl.py: Search widget icons with relative paths always in config.icon_path [c572134e1b93] * CREDITS.txt, LICENSE.txt, MANIFEST.in, Makefile, README.txt, __init__.py, about.py, application.py, bugdialog.py, changelog.style, clipboard.py, code_property.py, codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/perl_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, color_dialog.py, common.py, compat.py, config.py, credits.txt, decorators.py, docs/src/manual.xml, edit_sizers/__init__.py, edit_sizers/cpp_sizers_codegen.py, edit_sizers/edit_sizers.py, edit_sizers/lisp_sizers_codegen.py, edit_sizers/perl_sizers_codegen.py, edit_sizers/py_sizers_codegen.py, edit_sizers/xrc_sizers_codegen.py, edit_widget.py, edit_windows.py, errors.py, events_mixin.py, font_dialog.py, gui_mixins.py, install/pyinstaller/build.bat, install/pyinstaller/hooks/hook-main.py, install/pyinstaller/wxglade- SAE-installer.iss, install/pyinstaller/wxglade-installer.iss, install/pyinstaller/wxglade.spec, install/rpm/wxglade.spec, kdefiledialog.py, layout_option_property.py, license.txt, log.py, main.py, misc.py, plugins.py, preferencesdialog.py, setup.py, template.py, test.py, tests/__init__.py, tests/casefiles/file_encodings.txt, tests/test_bugs.py, tests/test_codegen.py, tests/test_compile.py, tests/test_external.py, tests/test_gui.py, tree.py, wcodegen/__init__.py, wcodegen/dialogs.py, wcodegen/taghandler.py, widget_properties.py, widgets/ChoicesCodeHandler.py, widgets/ChoicesProperty.py, widgets/MenuTree.py, widgets/__init__.py, widgets/bitmap_button/__init__.py, widgets/bitmap_button/bitmap_button.py, widgets/bitmap_button/codegen.py, widgets/bitmap_button/lisp_codegen.py, widgets/bitmap_button/perl_codegen.py, widgets/bitmap_button/wconfig.py, widgets/button/__init__.py, widgets/button/button.py, widgets/button/codegen.py, widgets/button/lisp_codegen.py, widgets/button/perl_codegen.py, widgets/button/wconfig.py, widgets/calendar_ctrl/__init__.py, widgets/calendar_ctrl/calendar_ctrl.py, widgets/calendar_ctrl/codegen.py, widgets/calendar_ctrl/perl_codegen.py, widgets/calendar_ctrl/wconfig.py, widgets/check_list_box/__init__.py, widgets/check_list_box/check_list_box.py, widgets/check_list_box/codegen.py, widgets/check_list_box/lisp_codegen.py, widgets/check_list_box/perl_codegen.py, widgets/check_list_box/wconfig.py, widgets/checkbox/__init__.py, widgets/checkbox/checkbox.py, widgets/checkbox/checkbox_base.py, widgets/checkbox/codegen.py, widgets/checkbox/lisp_codegen.py, widgets/checkbox/perl_codegen.py, widgets/checkbox/wconfig.py, widgets/choice/__init__.py, widgets/choice/choice.py, widgets/choice/codegen.py, widgets/choice/lisp_codegen.py, widgets/choice/perl_codegen.py, widgets/choice/wconfig.py, widgets/combo_box/__init__.py, widgets/combo_box/codegen.py, widgets/combo_box/combo_box.py, widgets/combo_box/lisp_codegen.py, widgets/combo_box/perl_codegen.py, widgets/combo_box/wconfig.py, widgets/custom_widget/__init__.py, widgets/custom_widget/codegen.py, widgets/custom_widget/custom_widget.py, widgets/custom_widget/lisp_codegen.py, widgets/custom_widget/perl_codegen.py, widgets/datepicker_ctrl/__init__.py, widgets/datepicker_ctrl/codegen.py, widgets/datepicker_ctrl/datepicker_ctrl.py, widgets/datepicker_ctrl/lisp_codegen.py, widgets/datepicker_ctrl/perl_codegen.py, widgets/datepicker_ctrl/wconfig.py, widgets/dialog/__init__.py, widgets/dialog/codegen.py, widgets/dialog/dialog.py, widgets/dialog/lisp_codegen.py, widgets/dialog/perl_codegen.py, widgets/dialog/wconfig.py, widgets/frame/__init__.py, widgets/frame/codegen.py, widgets/frame/frame.py, widgets/frame/lisp_codegen.py, widgets/frame/perl_codegen.py, widgets/frame/wconfig.py, widgets/gauge/__init__.py, widgets/gauge/codegen.py, widgets/gauge/gauge.py, widgets/gauge/lisp_codegen.py, widgets/gauge/perl_codegen.py, widgets/gauge/wconfig.py, widgets/generic_calendar_ctrl/__init__.py, widgets/generic_calendar_ctrl/codegen.py, widgets/generic_calendar_ctrl/generic_calendar_ctrl.py, widgets/generic_calendar_ctrl/perl_codegen.py, widgets/generic_calendar_ctrl/wconfig.py, widgets/grid/__init__.py, widgets/grid/codegen.py, widgets/grid/grid.py, widgets/grid/lisp_codegen.py, widgets/grid/perl_codegen.py, widgets/grid/wconfig.py, widgets/hyperlink_ctrl/__init__.py, widgets/hyperlink_ctrl/codegen.py, widgets/hyperlink_ctrl/hyperlink_ctrl.py, widgets/hyperlink_ctrl/lisp_codegen.py, widgets/hyperlink_ctrl/perl_codegen.py, widgets/hyperlink_ctrl/wconfig.py, widgets/list_box/__init__.py, widgets/list_box/codegen.py, widgets/list_box/lisp_codegen.py, widgets/list_box/list_box.py, widgets/list_box/perl_codegen.py, widgets/list_box/wconfig.py, widgets/list_ctrl/__init__.py, widgets/list_ctrl/codegen.py, widgets/list_ctrl/lisp_codegen.py, widgets/list_ctrl/list_ctrl.py, widgets/list_ctrl/perl_codegen.py, widgets/list_ctrl/wconfig.py, widgets/menubar/__init__.py, widgets/menubar/codegen.py, widgets/menubar/lisp_codegen.py, widgets/menubar/menubar.py, widgets/menubar/perl_codegen.py, widgets/notebook/__init__.py, widgets/notebook/codegen.py, widgets/notebook/lisp_codegen.py, widgets/notebook/notebook.py, widgets/notebook/perl_codegen.py, widgets/notebook/wconfig.py, widgets/panel/__init__.py, widgets/panel/codegen.py, widgets/panel/lisp_codegen.py, widgets/panel/panel.py, widgets/panel/perl_codegen.py, widgets/panel/wconfig.py, widgets/property_grid_manager/__init__.py, widgets/property_grid_manager/codegen.py, widgets/property_grid_manager/lisp_codegen.py, widgets/property_grid_manager/perl_codegen.py, widgets/property_grid_manager/property_grid_manager.py, widgets/property_grid_manager/wconfig.py, widgets/radio_box/__init__.py, widgets/radio_box/codegen.py, widgets/radio_box/lisp_codegen.py, widgets/radio_box/perl_codegen.py, widgets/radio_box/radio_box.py, widgets/radio_box/radio_box_base.py, widgets/radio_box/wconfig.py, widgets/radio_button/__init__.py, widgets/radio_button/codegen.py, widgets/radio_button/lisp_codegen.py, widgets/radio_button/perl_codegen.py, widgets/radio_button/radio_button.py, widgets/radio_button/wconfig.py, widgets/slider/__init__.py, widgets/slider/codegen.py, widgets/slider/lisp_codegen.py, widgets/slider/perl_codegen.py, widgets/slider/slider.py, widgets/slider/wconfig.py, widgets/spacer/__init__.py, widgets/spacer/codegen.py, widgets/spacer/lisp_codegen.py, widgets/spacer/perl_codegen.py, widgets/spacer/spacer.py, widgets/spin_button/__init__.py, widgets/spin_button/codegen.py, widgets/spin_button/lisp_codegen.py, widgets/spin_button/perl_codegen.py, widgets/spin_button/spin_button.py, widgets/spin_button/wconfig.py, widgets/spin_ctrl/__init__.py, widgets/spin_ctrl/codegen.py, widgets/spin_ctrl/lisp_codegen.py, widgets/spin_ctrl/perl_codegen.py, widgets/spin_ctrl/spin_ctrl.py, widgets/spin_ctrl/wconfig.py, widgets/splitter_window/__init__.py, widgets/splitter_window/codegen.py, widgets/splitter_window/lisp_codegen.py, widgets/splitter_window/perl_codegen.py, widgets/splitter_window/splitter_window.py, widgets/splitter_window/wconfig.py, widgets/static_bitmap/__init__.py, widgets/static_bitmap/codegen.py, widgets/static_bitmap/lisp_codegen.py, widgets/static_bitmap/perl_codegen.py, widgets/static_bitmap/static_bitmap.py, widgets/static_bitmap/wconfig.py, widgets/static_line/__init__.py, widgets/static_line/codegen.py, widgets/static_line/lisp_codegen.py, widgets/static_line/perl_codegen.py, widgets/static_line/static_line.py, widgets/static_line/wconfig.py, widgets/static_text/__init__.py, widgets/static_text/codegen.py, widgets/static_text/lisp_codegen.py, widgets/static_text/perl_codegen.py, widgets/static_text/static_text.py, widgets/static_text/wconfig.py, widgets/statusbar/__init__.py, widgets/statusbar/codegen.py, widgets/statusbar/lisp_codegen.py, widgets/statusbar/perl_codegen.py, widgets/statusbar/statusbar.py, widgets/statusbar/wconfig.py, widgets/text_ctrl/__init__.py, widgets/text_ctrl/codegen.py, widgets/text_ctrl/lisp_codegen.py, widgets/text_ctrl/perl_codegen.py, widgets/text_ctrl/text_ctrl.py, widgets/text_ctrl/wconfig.py, widgets/toggle_button/__init__.py, widgets/toggle_button/codegen.py, widgets/toggle_button/lisp_codegen.py, widgets/toggle_button/perl_codegen.py, widgets/toggle_button/toggle_button.py, widgets/toggle_button/wconfig.py, widgets/toolbar/__init__.py, widgets/toolbar/codegen.py, widgets/toolbar/lisp_codegen.py, widgets/toolbar/perl_codegen.py, widgets/toolbar/tool.py, widgets/toolbar/toolbar.py, widgets/toolbar/wconfig.py, widgets/tree_ctrl/__init__.py, widgets/tree_ctrl/codegen.py, widgets/tree_ctrl/lisp_codegen.py, widgets/tree_ctrl/perl_codegen.py, widgets/tree_ctrl/tree_ctrl.py, widgets/tree_ctrl/wconfig.py, wxglade, wxglade.py, wxglade.pyw, xml_parse.py, xrc2wxg.py: Rename credits.txt to CREDITS.txt and license.txt to LICENSE.txt [7196e0303a43] * MANIFEST.in, setup.py: Rework generation of release packages [39a50ca1999f] 2015-08-15 Carsten Grohmann * NEWS.txt, tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_30.cpp, tests/casefiles/AllWidgets_30.pl, tests/casefiles/AllWidgets_30.py, tests/casefiles/Sizers_classattr.cpp, tests/casefiles/Sizers_classattr.lisp, tests/casefiles/Sizers_classattr.pl, tests/casefiles/Sizers_classattr.py, tests/casefiles/Sizers_no_classattr.cpp, tests/casefiles/Sizers_no_classattr.lisp, tests/casefiles/Sizers_no_classattr.pl, tests/casefiles/Sizers_no_classattr.py, wcodegen/__init__.py, widgets/radio_box/codegen.py, widgets/radio_box/lisp_codegen.py, widgets/radio_box/perl_codegen.py, widgets/radio_box/radio_box_base.py: Revert "Empty choices will be filled with a placeholder ..." Old commit was 1682:0fab37fd9138 "Empty choices will be filled with a placeholder ''" [cda6b2be50f1] 2015-08-13 Carsten Grohmann * tests/casefiles/CustomWidget.lisp, widgets/custom_widget/lisp_codegen.py: Fix Lisp code generator for CustomWidget [9f631c040004] * widgets/custom_widget/codegen.py, widgets/custom_widget/custom_widget.py, widgets/custom_widget/lisp_codegen.py, widgets/custom_widget/perl_codegen.py: Minor code reorg for CustomWidget [93720717fcb9] * tests/casefiles/CustomWidget.cpp, tests/casefiles/CustomWidget.h, tests/casefiles/CustomWidget.lisp, tests/casefiles/CustomWidget.pl, tests/casefiles/CustomWidget.py, tests/casefiles/CustomWidget.wxg, tests/casefiles/CustomWidget.xrc, tests/test_codegen.py, tests/test_gui.py: Add test cases for CustomWidget [44e114b7e3e6] * NEWS.txt, widgets/custom_widget/custom_widget.py: Fix generated code for CustomWidget constructor (Thanks to Udi Fuchs) [10877c3ad73d] 2015-08-04 Carsten Grohmann * install/pyinstaller/hooks/hook-main.py, install/pyinstaller/wxglade- SAE-installer.iss, install/pyinstaller/wxglade-installer.iss, install/pyinstaller/wxglade.spec: Update copyright [d81c410a80df] * docs/BuildingInstaller.txt, install/pyinstaller/build.bat: Update building Windows installer [2b79f2510d3a] 2015-08-03 Carsten Grohmann * .hgtags: Added tag rel_0.7.1RC1 for changeset a5b57a51e924 [7bb5c00119a5] * NEWS.txt, README.SF.md, README.txt, wxGlade.desktop: Bump version number to 0.7.1RC1 [a5b57a51e924] [rel_0.7.1RC1] * docs/ReleaseSteps.txt: Update steps to release a new version [c04200d199b2] * about.py, clipboard.py, code_property.py, codegen/perl_codegen.py, codegen/py_codegen.py, edit_windows.py, epydoc.conf, main.py, msgdialog.py, ordereddict.py, templates_ui.py, tree.py, widgets/ChoicesProperty.py, widgets/custom_widget/custom_widget.py, widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/menubar/codegen.py, widgets/menubar/menubar.py, widgets/panel/panel.py, widgets/toolbar/codegen.py, widgets/toolbar/perl_codegen.py, widgets/toolbar/toolbar.py: PEP8: E251/E261/E262/E271/E272/E273/E274 Whitespaces [2aab9017aff3] * Makefile, NEWS.txt, README.SF.md, TODO.txt, about.py, clipboard.py, code_property.py, codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/perl_codegen.py, codegen/py_codegen.py, color_dialog.py, credits.txt, edit_widget.py, edit_windows.py, epydoc.conf, events_mixin.py, font_dialog.py, install/update-po.py, kdefiledialog.py, layout_option_property.py, main.py, template.py, tests/__init__.py, tests/test_codegen.py, tree.py, widgets/ChoicesCodeHandler.py, widgets/MenuTree.py, widgets/bitmap_button/bitmap_button.py, widgets/button/button.py, widgets/button/button_stockitems.py, widgets/calendar_ctrl/calendar_ctrl.py, widgets/checkbox/checkbox.py, widgets/choice/choice.py, widgets/combo_box/combo_box.py, widgets/custom_widget/codegen.py, widgets/custom_widget/custom_widget.py, widgets/datepicker_ctrl/datepicker_ctrl.py, widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/grid/codegen.py, widgets/grid/grid.py, widgets/list_box/list_box.py, widgets/list_ctrl/list_ctrl.py, widgets/menubar/codegen.py, widgets/menubar/lisp_codegen.py, widgets/menubar/menubar.py, widgets/menubar/perl_codegen.py, widgets/panel/panel.py, widgets/radio_button/radio_button.py, widgets/spacer/spacer.py, widgets/spin_button/spin_button.py, widgets/spin_ctrl/spin_ctrl.py, widgets/splitter_window/codegen.py, widgets/splitter_window/lisp_codegen.py, widgets/splitter_window/perl_codegen.py, widgets/splitter_window/splitter_window.py, widgets/static_bitmap/static_bitmap.py, widgets/static_line/static_line.py, widgets/static_text/static_text.py, widgets/text_ctrl/text_ctrl.py, widgets/toggle_button/toggle_button.py, widgets/toolbar/codegen.py, widgets/toolbar/lisp_codegen.py, widgets/toolbar/perl_codegen.py, widgets/toolbar/toolbar.py, widgets/tree_ctrl/tree_ctrl.py, wxglade: PEP8: W291/W293 Trailing whitespaces [8999c8192418] * Makefile, about.py, application.py, clipboard.py, code_property.py, codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/xrc_codegen.py, color_dialog.py, compat.py, decorators.py, edit_windows.py, font_dialog.py, install /update-po.py, main.py, misc.py, ordereddict.py, templates_ui.py, tests/test_external.py, tree.py, widget_properties.py, widgets/MenuTree.py, widgets/bitmap_button/codegen.py, widgets/choice/choice.py, widgets/custom_widget/custom_widget.py, widgets/custom_widget/lisp_codegen.py, widgets/datepicker_ctrl/codegen.py, widgets/gauge/gauge.py, widgets/gauge/lisp_codegen.py, widgets/grid/codegen.py, widgets/menubar/codegen.py, widgets/menubar/menubar.py, widgets/notebook/notebook.py, widgets/panel/lisp_codegen.py, widgets/panel/panel.py, widgets/slider/slider.py, widgets/spacer/spacer.py, widgets/spin_ctrl/spin_ctrl.py, widgets/splitter_window/splitter_window.py, widgets/static_text/static_text.py, widgets/text_ctrl/text_ctrl.py, widgets/toolbar/toolbar.py, xml_parse.py: PEP8: E301/E302 missing blank lines [907c4aeba03e] * appdata.xml, bugdialog.py, bugdialog_ui.py, codegen/lisp_codegen.py, decorators.py, edit_sizers/xrc_sizers_codegen.py, edit_widget.py, gui_mixins.py, kdefiledialog.py, msgdialog.py, template.py, tests/test_codegen.py, tests/test_gui.py, tree.py, wcodegen/__init__.py, wcodegen/taghandler.py, widget_properties.py, widgets/combo_box/combo_box.py, widgets/frame/codegen.py, widgets/frame/perl_codegen.py, widgets/menubar/lisp_codegen.py, widgets/menubar/menubar.py, widgets/menubar/perl_codegen.py, widgets/radio_box/codegen.py, widgets/static_text/static_text.py, widgets/statusbar/__init__.py, widgets/statusbar/statusbar.py, widgets/toolbar/lisp_codegen.py, wxGlade.desktop, xrc2wxg.py: PEP8: E303 too many blank lines [154f240961d6] * wxglade.pyw: Reorder code to prevent reporting SystemExit exception [3b8d01bb2be9] 2015-08-02 Carsten Grohmann * .hgignore, config.py, setup.py: Use module version.py to store the current version number [593873a6fb68] 2015-08-01 Carsten Grohmann * edit_windows.py: Minor docstring update [a6de1512165e] * edit_sizers/edit_sizers.py: Rework SizerSlot class mainly to draw background buffered [e6c212b7f347] * NEWS.txt, edit_sizers/edit_sizers.py: Always show new widgets in the design window Some new widget wasn't show after adding to the design window. The hatched background was shown instead of the new added widget. [be9e795f2441] 2015-07-26 Carsten Grohmann * misc.py: Code cleanup in SelectionTag (blue squares) to mark the active widget [ebb3509a4cb2] 2015-07-17 Carsten Grohmann * common.py, misc.py, widgets/button/button.py, widgets/check_list_box/check_list_box.py, widgets/choice/choice.py, widgets/hyperlink_ctrl/hyperlink_ctrl.py, widgets/list_box/list_box.py, widgets/menubar/menubar.py, widgets/radio_box/radio_box.py, widgets/radio_button/radio_button.py, widgets/static_text/static_text.py, widgets/toggle_button/toggle_button.py: Remove obsolete function common.encode_from_xml() [713b5693d473] * common.py: Fix handling of Unicode content in check for modified files [5e3c84da9644] * NEWS.txt, code_property.py, codegen/__init__.py, codegen/xrc_codegen.py, common.py, edit_sizers/edit_sizers.py, edit_windows.py, events_mixin.py, gui_mixins.py, template.py, tests/casefiles/bug166.cpp, tests/casefiles/bug166.h, tests/casefiles/bug166.lisp, tests/casefiles/bug166.pl, tests/casefiles/bug166.py, tests/casefiles/bug166.wxg, tests/casefiles/bug166.xrc, tests/test_bugs.py, tree.py, wcodegen/taghandler.py, widget_properties.py, widgets/ChoicesCodeHandler.py, widgets/ChoicesProperty.py, widgets/MenuTree.py, widgets/checkbox/checkbox.py, widgets/custom_widget/codegen.py, widgets/custom_widget/custom_widget.py, widgets/frame/codegen.py, widgets/grid/codegen.py, widgets/grid/grid.py, widgets/menubar/codegen.py, widgets/menubar/menubar.py, widgets/notebook/codegen.py, widgets/notebook/notebook.py, widgets/statusbar/codegen.py, widgets/statusbar/statusbar.py, widgets/toolbar/codegen.py, widgets/toolbar/tool.py, widgets/toolbar/toolbar.py, xml_parse.py: Improve string and XML handling to be Unicode aware fully (sf bug #166) [d081a810e31d] * wxglade.pyw: Wrong newline sequence [e996c8183a5e] 2015-07-13 Carsten Grohmann * common.py: Fix handling of Unicode content in check for modified files [327f789145e7] 2015-07-07 Carsten Grohmann * gui_mixins.py: Create EmptyBitmaps with a minimal size of 1, 1 Due to a limitation on the Mac bitmaps are not allowed to have a size with a dimension of zero. [c125717cb878] * common.py, plugins.py: Improve logging messages at startup [24ad267642c8] * install/pyinstaller/wxglade.spec: Don't show a console window on MS Windows [0d888524e0df] * wxglade.py: Fix for unexpected termination of SAE on Windows The root cause is the missing encoding attribute in the PyInstaller NullWriter implementation used as a drop-in replacement for sys.stdout and sys.stderr. https://github.com/pyinstaller/pyinstaller/issues/1324 [e068940e65cc] 2015-07-03 Carsten Grohmann * edit_sizers/edit_sizers.py: Set color of new created sizer buttons initially This change provides a consistent impression for non-default look and feels. [2ccea99a0683] 2015-07-02 Carsten Grohmann * edit_sizers/edit_sizers.py: PEP8 [cc2541d93b7e] 2015-06-27 Carsten Grohmann * NEWS.txt, color_dialog.py: Fix broken color selection dialog [bc1cdaba4acc] * NEWS.txt, common.py: Don't rewrite unchanged files Use md5 to be compatible with Python 2.4 [03b4184cf876] 2015-06-26 Carsten Grohmann * wxglade.py: Minor code reorg [2081c5dc66c1] 2015-06-25 Carsten Grohmann * config.py, test.py, wxglade.py: Separate initialisation of locale to shorten wxglade.init_stage1() [02fd229e9fc7] * wxglade.py: Adjust output messages [946332de6423] * xml_parse.py: Clarify comment of custom tag handler interface [e1083f61b801] 2015-06-24 Carsten Grohmann * tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_28.xrc, tests/casefiles/AllWidgets_30.cpp, tests/casefiles/AllWidgets_30.pl, tests/casefiles/AllWidgets_30.py, tests/casefiles/AllWidgets_30.wxg, tests/casefiles/AllWidgets_30.xrc, tests/casefiles/CalendarCtrl.cpp, widgets/calendar_ctrl/codegen.py: Fix C++ template of wxCalendarCtrl The old template has not compiled due a missing default parameter if styles are given. [c159a2d9c1dd] 2015-06-23 Carsten Grohmann * widgets/calendar_ctrl/wconfig.py: Add missing styles and event types to wxCalendarCtrl [049b60e0d0aa] * widgets/calendar_ctrl/wconfig.py: Add missing styles and event types to wxCalendarCtrl [f2b78211f402] * docs/src/manual.xml, tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.h, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_28.xrc, tests/casefiles/AllWidgets_30.cpp, tests/casefiles/AllWidgets_30.h, tests/casefiles/AllWidgets_30.pl, tests/casefiles/AllWidgets_30.py, tests/casefiles/AllWidgets_30.wxg, tests/casefiles/AllWidgets_30.xrc: Add unittests for generation of foreground and background colours [6f066be3ef7e] 2015-06-21 Carsten Grohmann * codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/perl_codegen.py, codegen/py_codegen.py, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_30.pl, tests/casefiles/ComplexExample.pl, tests/casefiles/ComplexExample_30.pl, wcodegen/__init__.py, widgets/custom_widget/codegen.py, widgets/custom_widget/perl_codegen.py, widgets/grid/codegen.py, widgets/grid/lisp_codegen.py, widgets/grid/perl_codegen.py, widgets/menubar/codegen.py, widgets/menubar/perl_codegen.py, widgets/notebook/codegen.py, widgets/notebook/lisp_codegen.py, widgets/notebook/perl_codegen.py, widgets/panel/codegen.py, widgets/panel/lisp_codegen.py, widgets/panel/perl_codegen.py, widgets/splitter_window/codegen.py, widgets/splitter_window/lisp_codegen.py, widgets/splitter_window/perl_codegen.py, widgets/toolbar/codegen.py, widgets/toolbar/lisp_codegen.py, widgets/toolbar/perl_codegen.py: Unify generating widget access The base change is: if not obj.is_toplevel: parent = 'self.%s' % obj.name else: parent = 'self' to this: parent = self.format_widget_access(obj) [3f8c15d57d22] 2015-06-20 Carsten Grohmann * widgets/toolbar/toolbar.py: Change bitmap labels in toolbar editor [0d3973316c41] * widgets/menubar/menubar.py, widgets/toolbar/toolbar.py: Change signature of derived bind_event() to prevent pylint warning [450a0ba7ba9d] * gui_mixins.py, wcodegen/__init__.py, wcodegen/mixins.py, widgets/bitmap_button/bitmap_button.py, widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/static_bitmap/static_bitmap.py, widgets/toolbar/toolbar.py: Move and rename wcodegen.mixins to gui_mixins [c1c727cabfbf] * codegen/__init__.py, log.py, misc.py, tree.py: unidiomatic-typecheck lint warn Change this: type(obj) is T to this: isinstance(obj, T) [ec76337f2a52] * common.py, plugins.py: Move plugins.style_attrs_to_sets to common module [ce94f84ca927] * common.py, config.py, events_mixin.py, misc.py, plugins.py, tests/test_codegen.py, wcodegen/__init__.py, wcodegen/mixins.py, widget_properties.py, widgets/dialog/wconfig.py, widgets/notebook/notebook.py, widgets/property_grid_manager/property_grid_manager.py, widgets/static_bitmap/codegen.py: Move common.widget_config to config module [2ce339510eca] * widget_properties.py: Wrong formatted version numbers in styles tooltips [e24f17112d94] 2015-06-13 Carsten Grohmann * widgets/toolbar/codegen.py: Remove unused imports [3f1f84894c27] 2015-06-12 Carsten Grohmann * widgets/calendar_ctrl/wconfig.py, widgets/grid/wconfig.py, widgets/slider/wconfig.py: Summarise event type definitions [993a50a08349] * README.SF.md, docs/ReleaseSteps.txt, setup.py: Add a separate README file for the SF download folder [056eec02912a] 2015-06-11 Carsten Grohmann * common.py, config.py, edit_sizers/edit_sizers.py, misc.py: Change public used private variables to public variables E.g. rename config._backed_up to config.backed_up [4b8a9d1552a4] 2015-06-10 Carsten Grohmann * tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.h, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_28.xrc, tests/casefiles/AllWidgets_30.cpp, tests/casefiles/AllWidgets_30.h, tests/casefiles/AllWidgets_30.pl, tests/casefiles/AllWidgets_30.py, tests/casefiles/AllWidgets_30.wxg, tests/casefiles/AllWidgets_30.xrc, tests/test_compile.py, widgets/check_list_box/check_list_box.py, widgets/check_list_box/wconfig.py, widgets/generic_calendar_ctrl/codegen.py, widgets/generic_calendar_ctrl/generic_calendar_ctrl.py, widgets/generic_calendar_ctrl/wconfig.py, widgets/property_grid_manager/codegen.py, widgets/property_grid_manager/property_grid_manager.py, widgets/property_grid_manager/wconfig.py: Adapt new widgets to current wxGlade development version and add tests [fd013086abf8] * NEWS.txt, credits.txt, widgets/check_list_box/__init__.py, widgets/check_list_box/check_list_box.py, widgets/check_list_box/codegen.py, widgets/check_list_box/lisp_codegen.py, widgets/check_list_box/perl_codegen.py, widgets/check_list_box/wconfig.py, widgets/generic_calendar_ctrl/__init__.py, widgets/generic_calendar_ctrl/codegen.py, widgets/generic_calendar_ctrl/generic_calendar_ctrl.py, widgets/generic_calendar_ctrl/perl_codegen.py, widgets/generic_calendar_ctrl/wconfig.py, widgets/property_grid_manager/__init__.py, widgets/property_grid_manager/codegen.py, widgets/property_grid_manager/lisp_codegen.py, widgets/property_grid_manager/perl_codegen.py, widgets/property_grid_manager/property_grid_manager.py, widgets/property_grid_manager/wconfig.py, widgets/widgets.txt: New widgets CheckListBox, GenericCalendarCtrl and PropertyGridManager contributed by Franco Bugnano The widgets are licensed under MIT license too. [e99c0059128a] 2015-06-03 Carsten Grohmann * tree.py: Improve handling of values for storing in the WXG XML header [bde585141ba0] 2015-06-02 Carsten Grohmann * tests/test_compile.py: Show output of the compiling tests only on failures [1cc7ce017d49] 2015-05-31 Carsten Grohmann * application.py, common.py, plugins.py: Separate code to import widgets and increase robustness [d976616c68bf] 2015-05-30 Carsten Grohmann * wxglade: Fix wrong error message [0a2638d8f0d3] 2015-05-21 Carsten Grohmann * bugdialog.py: Improve output format in bugdialog [af03f19e71bb] 2015-05-20 Carsten Grohmann * NEWS.txt, color_dialog.py: Fix broken color selection dialog [5d10648a232a] * Makefile, test.py, tests/__init__.py, tests/test_compile.py: Add a test suite to compile single-file C++ sources [9aa8413b0a8f] 2015-05-19 Carsten Grohmann * tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_30.pl, tests/casefiles/ComplexExample.pl, tests/casefiles/ComplexExample_30.pl, tests/casefiles/Grid.pl, tests/casefiles/PlOgg2_MyFrame.pm, tests/casefiles/PlOgg3.pl, widgets/grid/perl_codegen.py: Remove unneded imports of Wx::Grid for Perl [a87469ea1f78] * codegen/perl_codegen.py, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_30.pl, tests/casefiles/ComplexExample.pl, tests/casefiles/ComplexExample_30.pl, tests/casefiles/Grid.pl: Add dependencies inside the package block additionally on Perl The dependencies have to add to the package block too because global imports are not visible inside the package block. [2f44e36cf2e7] 2015-05-18 Carsten Grohmann * codegen/cpp_codegen.py, wcodegen/__init__.py, widgets/calendar_ctrl/codegen.py, widgets/datepicker_ctrl/codegen.py, widgets/frame/codegen.py, widgets/frame/lisp_codegen.py, widgets/frame/perl_codegen.py, widgets/grid/codegen.py, widgets/hyperlink_ctrl/codegen.py, widgets/list_ctrl/codegen.py, widgets/notebook/codegen.py, widgets/spin_button/codegen.py, widgets/spin_ctrl/codegen.py, widgets/splitter_window/codegen.py, widgets/static_line/codegen.py, widgets/toggle_button/codegen.py, widgets/tree_ctrl/codegen.py: Unify handling of additional imports in C++ extra_headers has been renamed to import_modules to use the same variable within all code generators. [29a0afbec3ba] * codegen/__init__.py, wcodegen/__init__.py: Simplify handling of additional imports [138154860237] 2015-05-17 Carsten Grohmann * NEWS.txt, codegen/__init__.py, codegen/cpp_codegen.py, tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.h, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_28.xrc, tests/casefiles/AllWidgets_30.cpp, tests/casefiles/AllWidgets_30.h, tests/casefiles/AllWidgets_30.pl, tests/casefiles/AllWidgets_30.py, tests/casefiles/AllWidgets_30.wxg, tests/casefiles/AllWidgets_30.xrc, tests/test_codegen.py, wcodegen/__init__.py, wcodegen/mixins.py, widgets/bitmap_button/bitmap_button.py, widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/static_bitmap/static_bitmap.py, widgets/toolbar/toolbar.py: Add support for bitmaps from wxArtProvider [f4aa1f9a8107] * tests/__init__.py: Ignore version line during comparison of test files [df4fa17392da] 2015-05-14 Carsten Grohmann * codegen/__init__.py, codegen/cpp_codegen.py, wcodegen/__init__.py: Add support for dynamic dependencies [0aa8a1f3d6e6] 2015-05-08 Carsten Grohmann * NEWS.txt, tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.h, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_28.xrc, tests/casefiles/AllWidgets_30.cpp, tests/casefiles/AllWidgets_30.h, tests/casefiles/AllWidgets_30.pl, tests/casefiles/AllWidgets_30.py, tests/casefiles/AllWidgets_30.wxg, tests/casefiles/AllWidgets_30.xrc, tests/test_codegen.py, wcodegen/__init__.py, wcodegen/mixins.py, widgets/bitmap_button/bitmap_button.py, widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/static_bitmap/static_bitmap.py, widgets/toolbar/toolbar.py: Add support for empty bitmaps [5cc343df284f] 2015-05-01 Carsten Grohmann * NEWS.txt, tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_30.cpp, tests/casefiles/AllWidgets_30.pl, tests/casefiles/AllWidgets_30.py, tests/casefiles/ComplexExample.cpp, tests/casefiles/ComplexExample.lisp, tests/casefiles/ComplexExample.pl, tests/casefiles/ComplexExample_30.cpp, tests/casefiles/ComplexExample_30.pl, tests/casefiles/Lisp_wxBitmapButton.lisp, tests/casefiles/Perl_Preferences.pl, tests/casefiles/Python_Preferences.py, tests/test_codegen.py, wcodegen/__init__.py, widgets/bitmap_button/codegen.py, widgets/bitmap_button/lisp_codegen.py, widgets/bitmap_button/perl_codegen.py, widgets/dialog/codegen.py, widgets/dialog/lisp_codegen.py, widgets/dialog/perl_codegen.py, widgets/frame/codegen.py, widgets/frame/lisp_codegen.py, widgets/frame/perl_codegen.py, widgets/static_bitmap/codegen.py, widgets/static_bitmap/lisp_codegen.py, widgets/static_bitmap/perl_codegen.py, widgets/toolbar/codegen.py, widgets/toolbar/lisp_codegen.py, widgets/toolbar/perl_codegen.py: Rework creation of wxBitmap code used by several widgets [777c8c83d089] 2015-04-26 Carsten Grohmann * wcodegen/__init__.py: Unify generating choice code [b04e3a0ed418] * NEWS.txt, tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_30.cpp, tests/casefiles/AllWidgets_30.pl, tests/casefiles/AllWidgets_30.py, tests/casefiles/Sizers_classattr.cpp, tests/casefiles/Sizers_classattr.lisp, tests/casefiles/Sizers_classattr.pl, tests/casefiles/Sizers_classattr.py, tests/casefiles/Sizers_no_classattr.cpp, tests/casefiles/Sizers_no_classattr.lisp, tests/casefiles/Sizers_no_classattr.pl, tests/casefiles/Sizers_no_classattr.py, wcodegen/__init__.py: Empty choices will be filled with a placeholder '' [0fab37fd9138] * codegen/__init__.py, codegen/cpp_codegen.py, codegen/perl_codegen.py, codegen/py_codegen.py, tests/casefiles/AllWidgets_30.cpp, tests/casefiles/AllWidgets_30.pl, tests/casefiles/AllWidgets_30.py: Fix handling of EVT_NAVIGATION_KEY event because the signature differs from the remaining events. [2bdc1109253c] 2015-04-24 Carsten Grohmann * xml_parse.py: Unify XML parser code [146701e2b142] 2015-04-23 Carsten Grohmann * codegen/py_codegen.py, tests/casefiles/FontColour.py, tests/casefiles/HyperlinkCtrl_28.py, tests/casefiles/PythonAddApp_multi_detailed.py, tests/casefiles/PythonAddApp_multi_gettext_detailed.py, tests/casefiles/PythonAddApp_single_detailed.py, tests/casefiles/PythonAddApp_single_gettext_detailed.py, tests/casefiles/Sizers_classattr.py, tests/casefiles/Sizers_no_classattr.py, tests/casefiles/add_class_inplace_extended.py, tests/casefiles/add_class_inplace_orig.py, tests/casefiles/no_suitable_writer.py, tests/casefiles/remove_class_inplace_expected.py, tests/casefiles/remove_class_inplace_input.py: OnInit() returns True instead of 1 for Python now [f52c59c94e38] 2015-04-22 Carsten Grohmann * NEWS.txt, common.py: Don't rewrite unchanged files Use md5 to be compatible with Python 2.4 [a89239bf9c6d] 2015-04-21 Carsten Grohmann * common.py: Remove unused class variable from common.Preferences [dc28a4138867] 2015-04-16 Carsten Grohmann * tree.py: Don't access to a deprecated property [b451e8ea6067] * about.py, appdata.xml, application.py, changelog.style, code_property.py, codegen/lisp_codegen.py, codegen/perl_codegen.py, codegen/py_codegen.py, compat.py, config.py, docs/man/manpage.xml, edit_sizers/__init__.py, edit_sizers/cpp_sizers_codegen.py, edit_sizers/lisp_sizers_codegen.py, edit_sizers/perl_sizers_codegen.py, edit_sizers/py_sizers_codegen.py, edit_sizers/xrc_sizers_codegen.py, edit_windows.py, layout_option_property.py, license.txt, test.py, tests/test_external.py, wcodegen/__init__.py, wcodegen/dialogs.py, widgets/bitmap_button/codegen.py, widgets/bitmap_button/lisp_codegen.py, widgets/bitmap_button/perl_codegen.py, widgets/button/codegen.py, widgets/button/lisp_codegen.py, widgets/button/perl_codegen.py, widgets/calendar_ctrl/perl_codegen.py, widgets/choice/codegen.py, widgets/choice/lisp_codegen.py, widgets/choice/perl_codegen.py, widgets/combo_box/codegen.py, widgets/combo_box/lisp_codegen.py, widgets/combo_box/perl_codegen.py, widgets/custom_widget/custom_widget.py, widgets/custom_widget/lisp_codegen.py, widgets/custom_widget/perl_codegen.py, widgets/datepicker_ctrl/lisp_codegen.py, widgets/datepicker_ctrl/perl_codegen.py, widgets/dialog/dialog.py, widgets/dialog/lisp_codegen.py, widgets/dialog/perl_codegen.py, widgets/frame/codegen.py, widgets/frame/frame.py, widgets/frame/lisp_codegen.py, widgets/frame/perl_codegen.py, widgets/frame/wconfig.py, widgets/gauge/codegen.py, widgets/gauge/lisp_codegen.py, widgets/gauge/perl_codegen.py, widgets/gauge/wconfig.py, widgets/grid/lisp_codegen.py, widgets/grid/perl_codegen.py, widgets/hyperlink_ctrl/__init__.py, widgets/hyperlink_ctrl/lisp_codegen.py, widgets/hyperlink_ctrl/perl_codegen.py, widgets/list_box/lisp_codegen.py, widgets/list_ctrl/lisp_codegen.py, widgets/list_ctrl/perl_codegen.py, widgets/menubar/menubar.py, widgets/notebook/lisp_codegen.py, widgets/notebook/perl_codegen.py, widgets/panel/codegen.py, widgets/panel/lisp_codegen.py, widgets/panel/panel.py, widgets/panel/perl_codegen.py, widgets/radio_box/codegen.py, widgets/radio_box/lisp_codegen.py, widgets/radio_box/perl_codegen.py, widgets/radio_button/codegen.py, widgets/radio_button/lisp_codegen.py, widgets/radio_button/perl_codegen.py, widgets/slider/lisp_codegen.py, widgets/slider/perl_codegen.py, widgets/spacer/codegen.py, widgets/spacer/lisp_codegen.py, widgets/spacer/perl_codegen.py, widgets/spacer/spacer.py, widgets/spin_button/lisp_codegen.py, widgets/spin_button/perl_codegen.py, widgets/spin_ctrl/lisp_codegen.py, widgets/spin_ctrl/perl_codegen.py, widgets/splitter_window/lisp_codegen.py, widgets/splitter_window/perl_codegen.py, widgets/static_bitmap/codegen.py, widgets/static_bitmap/lisp_codegen.py, widgets/static_bitmap/perl_codegen.py, widgets/static_bitmap/static_bitmap.py, widgets/static_bitmap/wconfig.py, widgets/static_line/codegen.py, widgets/static_line/lisp_codegen.py, widgets/static_line/perl_codegen.py, widgets/static_line/static_line.py, widgets/static_line/wconfig.py, widgets/static_text/codegen.py, widgets/static_text/lisp_codegen.py, widgets/static_text/perl_codegen.py, widgets/static_text/wconfig.py, widgets/statusbar/__init__.py, widgets/statusbar/codegen.py, widgets/statusbar/lisp_codegen.py, widgets/statusbar/perl_codegen.py, widgets/statusbar/wconfig.py, widgets/text_ctrl/codegen.py, widgets/text_ctrl/lisp_codegen.py, widgets/text_ctrl/perl_codegen.py, widgets/toolbar/codegen.py, widgets/toolbar/lisp_codegen.py, widgets/toolbar/perl_codegen.py, widgets/toolbar/toolbar.py, widgets/toolbar/wconfig.py, widgets/tree_ctrl/lisp_codegen.py, widgets/tree_ctrl/perl_codegen.py, wxglade, wxglade.py, xrc2wxg.py: Update copyright year [8aca18141318] 2015-04-14 Carsten Grohmann * NEWS.txt, tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.h, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_28.xrc, tests/casefiles/AllWidgets_30.cpp, tests/casefiles/AllWidgets_30.h, tests/casefiles/AllWidgets_30.pl, tests/casefiles/AllWidgets_30.py, tests/casefiles/AllWidgets_30.wxg, tests/casefiles/AllWidgets_30.xrc, widgets/toggle_button/codegen.py, widgets/toggle_button/lisp_codegen.py, widgets/toggle_button/perl_codegen.py, widgets/toggle_button/toggle_button.py: Add styles to wxToggleButton [a70f184b4934] 2015-04-13 Carsten Grohmann * widgets/list_box/wconfig.py, widgets/slider/wconfig.py: Update style definitions [25ca954983dc] * application.py, bugdialog.py, codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/perl_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, main.py, misc.py, preferencesdialog.py, tests/test_codegen.py, wcodegen/__init__.py, widgets/grid/grid.py, widgets/menubar/codegen.py, widgets/menubar/perl_codegen.py, widgets/toolbar/codegen.py: Minor internal code changes like renames, improving wording, ... [965ddf619dc2] 2015-04-12 Carsten Grohmann * tests/__init__.py, tests/casefiles/PerlAddApp_multi_detailed.pl, tests/casefiles/PerlAddApp_multi_gettext_detailed.pl, tests/casefiles/PerlAddApp_multi_gettext_simple.pl, tests/casefiles/PerlAddApp_multi_simple.pl, tests/casefiles/PerlAddApp_single_detailed.pl, tests/casefiles/PerlAddApp_single_gettext_detailed.pl, tests/casefiles/PerlAddApp_single_gettext_simple.pl, tests/casefiles/PerlAddApp_single_simple.pl, tests/casefiles/PlAddApp_multi_detailed.pl, tests/casefiles/PlAddApp_multi_gettext_detailed.pl, tests/casefiles/PlAddApp_multi_gettext_simple.pl, tests/casefiles/PlAddApp_multi_simple.pl, tests/casefiles/PlAddApp_single_detailed.pl, tests/casefiles/PlAddApp_single_gettext_detailed.pl, tests/casefiles/PlAddApp_single_gettext_simple.pl, tests/casefiles/PlAddApp_single_simple.pl, tests/casefiles/PyAddApp_multi_detailed.py, tests/casefiles/PyAddApp_multi_gettext_detailed.py, tests/casefiles/PyAddApp_multi_gettext_simple.py, tests/casefiles/PyAddApp_multi_simple.py, tests/casefiles/PyAddApp_single_detailed.py, tests/casefiles/PyAddApp_single_gettext_detailed.py, tests/casefiles/PyAddApp_single_gettext_simple.py, tests/casefiles/PyAddApp_single_simple.py, tests/casefiles/PythonAddApp_multi_detailed.py, tests/casefiles/PythonAddApp_multi_gettext_detailed.py, tests/casefiles/PythonAddApp_multi_gettext_simple.py, tests/casefiles/PythonAddApp_multi_simple.py, tests/casefiles/PythonAddApp_single_detailed.py, tests/casefiles/PythonAddApp_single_gettext_detailed.py, tests/casefiles/PythonAddApp_single_gettext_simple.py, tests/casefiles/PythonAddApp_single_simple.py, tests/test_codegen.py, tests/test_gui.py: Summarise language specific contansts in base class instead of declaring several times. [55e70caf3b22] * NEWS.txt, tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_28.xrc, tests/casefiles/AllWidgets_30.cpp, tests/casefiles/AllWidgets_30.pl, tests/casefiles/AllWidgets_30.py, tests/casefiles/AllWidgets_30.wxg, tests/casefiles/AllWidgets_30.xrc, tests/casefiles/Sizers_classattr.cpp, tests/casefiles/Sizers_classattr.lisp, tests/casefiles/Sizers_classattr.pl, tests/casefiles/Sizers_no_classattr.cpp, tests/casefiles/Sizers_no_classattr.lisp, tests/casefiles/Sizers_no_classattr.pl, widgets/list_box/codegen.py, widgets/list_box/perl_codegen.py, widgets/list_box/wconfig.py: Fix generated code for wxListBox [05bce66af2bd] * NEWS.txt, codegen/cpp_codegen.py, tests/casefiles/AllWidgets_28.h, tests/casefiles/AllWidgets_30.h, tests/casefiles/CPPOgg1.h, tests/casefiles/CPPOgg2_MyDialog.h, tests/casefiles/CPPOgg3.h, tests/casefiles/ComplexExample.h, tests/casefiles/ComplexExample_30.h, tests/casefiles/Grid.h: Event handler in C++ aren't virtual anymore The wx documentation states "The member function that handles an event does not have to be virtual." [dc15f21dfa0b] * NEWS.txt, codegen/xrc_codegen.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_30.cpp, tests/casefiles/AllWidgets_30.h, tests/casefiles/AllWidgets_30.pl, tests/casefiles/AllWidgets_30.py, tests/casefiles/AllWidgets_30.wxg, tests/casefiles/AllWidgets_30.xrc, tests/test_codegen.py, tests/test_gui.py, wcodegen/__init__.py, widgets/panel/wconfig.py: Add support for events that are only supported by a specific wx version [ac3ee003ec75] 2015-04-11 Carsten Grohmann * common.py, tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.h, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_28.xrc, tests/casefiles/AllWidgets_30.cpp, tests/casefiles/AllWidgets_30.h, tests/test_codegen.py, wcodegen/__init__.py, widgets/notebook/wconfig.py: Add support for events with different prototypes for diff. wx versions The prototype of the events issued by wxNotebook has changed from 2.8 "wxNotebookEvent" to 3.0 "wxBookCtrlEvent". [9e07a4f948d4] * NEWS.txt, codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/perl_codegen.py, codegen/py_codegen.py, common.py, events_mixin.py, tests/test_codegen.py, wcodegen/__init__.py, widgets/bitmap_button/bitmap_button.py, widgets/bitmap_button/wconfig.py, widgets/button/button.py, widgets/button/wconfig.py, widgets/calendar_ctrl/calendar_ctrl.py, widgets/calendar_ctrl/codegen.py, widgets/calendar_ctrl/wconfig.py, widgets/checkbox/checkbox.py, widgets/checkbox/wconfig.py, widgets/choice/choice.py, widgets/choice/wconfig.py, widgets/combo_box/combo_box.py, widgets/combo_box/wconfig.py, widgets/datepicker_ctrl/codegen.py, widgets/datepicker_ctrl/datepicker_ctrl.py, widgets/datepicker_ctrl/wconfig.py, widgets/dialog/codegen.py, widgets/dialog/wconfig.py, widgets/grid/codegen.py, widgets/grid/grid.py, widgets/grid/wconfig.py, widgets/hyperlink_ctrl/codegen.py, widgets/hyperlink_ctrl/hyperlink_ctrl.py, widgets/hyperlink_ctrl/wconfig.py, widgets/list_box/list_box.py, widgets/list_box/wconfig.py, widgets/list_ctrl/codegen.py, widgets/list_ctrl/list_ctrl.py, widgets/list_ctrl/wconfig.py, widgets/menubar/codegen.py, widgets/menubar/perl_codegen.py, widgets/notebook/codegen.py, widgets/notebook/notebook.py, widgets/notebook/wconfig.py, widgets/radio_box/radio_box.py, widgets/radio_box/wconfig.py, widgets/radio_button/radio_button.py, widgets/radio_button/wconfig.py, widgets/slider/codegen.py, widgets/slider/slider.py, widgets/slider/wconfig.py, widgets/spin_button/codegen.py, widgets/spin_button/spin_button.py, widgets/spin_button/wconfig.py, widgets/spin_ctrl/codegen.py, widgets/spin_ctrl/spin_ctrl.py, widgets/spin_ctrl/wconfig.py, widgets/splitter_window/codegen.py, widgets/splitter_window/splitter_window.py, widgets/splitter_window/wconfig.py, widgets/text_ctrl/text_ctrl.py, widgets/text_ctrl/wconfig.py, widgets/toggle_button/toggle_button.py, widgets/toggle_button/wconfig.py, widgets/toolbar/codegen.py, widgets/tree_ctrl/codegen.py, widgets/tree_ctrl/tree_ctrl.py, widgets/tree_ctrl/wconfig.py: Migrate event definitions to the wconfig files and adapt event handling [56809e02f999] 2015-04-07 Carsten Grohmann * NEWS.txt, widgets/datepicker_ctrl/codegen.py, widgets/dialog/codegen.py, widgets/hyperlink_ctrl/codegen.py, widgets/tree_ctrl/codegen.py: Add missing event types for event handling in C++ [114168a0e9c5] 2015-04-05 Carsten Grohmann * codegen/lisp_codegen.py, widgets/menubar/menubar.py: Reduce usage of "Unbound local variable" It's unclear if the orginal code may raise bugs. [ce3b33d10084] 2015-04-04 Carsten Grohmann * edit_windows.py: Use the memoize decorators instead of an own cache algorithm [d803a4cea380] * NEWS.txt, wxglade.pyw: Catch and show early exceptions on Windows (Thanks to Tor Sjøwall) [433c0af02aef] 2015-04-03 Carsten Grohmann * bugdialog.py, bugdialog_ui.py, docs/html/apa.html, docs/html/apb.html, docs/html/apd.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch01s07.html, docs/html/ch01s08.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch02s06.html, docs/html/ch02s07.html, docs/html/ch02s08.html, docs/html/ch02s09.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch04.html, docs/html/ch04s03.html, docs/html/ch05.html, docs/html/ch05s02.html, docs/html/ch05s03.html, docs/html/ch05s04.html, docs/html/ch06.html, docs/html/ch06s02.html, docs/html/ch06s03.html, docs/html/ch06s04.html, docs/html/ch06s05.html, docs/html/ch06s06.html, docs/html/ch06s07.html, docs/html/ch06s08.html, docs/html/ch06s09.html, docs/html/ch07.html, docs/html/ch07s02.html, docs/html/ch07s03.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/pdf/manual.pdf, docs/src/manual.xml, res/bugdialog_ui.wxg: Show full path of error log file in the bug dialog [e32e72f7285e] * NEWS.txt, about.py, bugdialog_ui.py, codegen/py_codegen.py, main.py, msgdialog.py, templates_ui.py, tests/casefiles/AllWidgets_28.py, tests/casefiles/ComplexExample.py, tests/casefiles/ComplexExample_30.py, tests/casefiles/FontColour.py, tests/casefiles/HyperlinkCtrl_28.py, tests/casefiles/PyAddApp_multi_detailed.py, tests/casefiles/PyAddApp_multi_gettext_detailed.py, tests/casefiles/PyAddApp_multi_gettext_simple.py, tests/casefiles/PyAddApp_multi_simple.py, tests/casefiles/PyAddApp_single_detailed.py, tests/casefiles/PyAddApp_single_gettext_detailed.py, tests/casefiles/PyAddApp_single_gettext_simple.py, tests/casefiles/PyAddApp_single_simple.py, tests/casefiles/PyOgg1.py, tests/casefiles/PyOgg2_app.py, tests/casefiles/PyOgg3.py, tests/casefiles/Sizers_classattr.py, tests/casefiles/Sizers_no_classattr.py, tests/casefiles/add_class_inplace_extended.py, tests/casefiles/add_class_inplace_orig.py, tests/casefiles/no_suitable_writer.py, tests/casefiles/remove_class_inplace_expected.py, tests/casefiles/remove_class_inplace_input.py, tests/test_gui.py: Remove obsolete calls of wx.InitAllImageHandlers() wx.InitAllImageHandlers() has been removed from all Python code as well as from the Python code generator. The former functionality of InitAllImageHanders is now done internal to the _core_ extension module and so this function has become a simple NOP. [a9d244fd7a2e] * NEWS.txt, tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.h, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_28.xrc, widgets/checkbox/checkbox.py, widgets/checkbox/checkbox_base.py, widgets/checkbox/codegen.py, widgets/checkbox/lisp_codegen.py, widgets/checkbox/perl_codegen.py, widgets/checkbox/wconfig.py: Add support for 3-state checkboxes [de213db4646a] * wcodegen/mixins.py: Fix docstring format [978f1af9ffaa] 2015-03-31 Carsten Grohmann * tests/test_codegen.py: Minor cleanups [6a16f6f6b22e] * widget_properties.py: Increase robustness of RadioProperty Now you can call enable_item() even if the widget isn't displayed / created. [949743b04254] 2015-03-29 Carsten Grohmann * common.py, tests/test_codegen.py, wcodegen/mixins.py, widget_properties.py, widgets/checkbox/wconfig.py: Rework style processing to handle dependencies properly. A new style attribute 'require' has been introduced. [42776405add0] 2015-03-27 Carsten Grohmann * common.py, wcodegen/mixins.py, widget_properties.py, widgets/checkbox/wconfig.py: Rename style attributes 'add' and 'delete' into 'include' and 'exclude' [083773a39c57] 2015-03-26 Carsten Grohmann * common.py, decorators.py, wcodegen/__init__.py, wcodegen/mixins.py: Move code to prepare style attributes from wcodegen.mixins to common Special style attributes ('add', 'combination' and 'delete') are converted from string to set in a earlier. Thereby function can always use these attributes as a set. [32eccd5c6311] 2015-03-24 Carsten Grohmann * common.py, tests/test_codegen.py, wcodegen/mixins.py, widget_properties.py, widgets/checkbox/wconfig.py: Add style attributes 'add' and 'delete'. Both styles allows to add or remove a style based on current selected styles. [d74777c72589] 2015-03-21 Carsten Grohmann * test.py: Change test setup to use wx version 2.8 or newer instead of 2.8 only [7d7afd8c0d9f] 2015-03-20 Carsten Grohmann * main.py: Disable autosave checks during unittests [5ae528aa226e] 2015-03-19 Carsten Grohmann * common.py: Normalise paths of internal files and directories [696a98de122f] * application.py, bugdialog.py, main.py, preferencesdialog.py: Introduce wrapper functions to simplify showing bug reports. [0b5b3a0a0cd8] 2015-03-18 Carsten Grohmann * bugdialog.py: Show missing exception details in bug dialog [ce877788c5b9] 2015-03-16 Carsten Grohmann * widget_properties.py: Remove cache for style tooltips Without cache widgets can use the same style but with an individual tooltips [265ec9bbee3c] * widgets/checkbox/checkbox.py, widgets/checkbox/wconfig.py: Add missing style handling for wxCheckbox widgets and fix wrong styles The styles weren't adapted after copying from wxCalenderCtrl :-( [015761ac3f22] * common.py, edit_sizers/edit_sizers.py, misc.py, template.py, tree.py, widget_properties.py, widgets/ChoicesProperty.py, widgets/MenuTree.py, widgets/grid/grid.py, widgets/notebook/notebook.py, widgets/statusbar/statusbar.py, widgets/toolbar/tool.py: Rename encode_to_xml() to encode_to_unicode(), it returns Unicode The function returns Unicode encoded strings and not UTF-8 like the name suggests. [a3cbc301b5b0] 2015-03-13 Carsten Grohmann * docs/html/apa.html, docs/html/apb.html, docs/html/apd.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch01s07.html, docs/html/ch01s08.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch02s06.html, docs/html/ch02s07.html, docs/html/ch02s08.html, docs/html/ch02s09.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch04.html, docs/html/ch04s03.html, docs/html/ch05.html, docs/html/ch05s02.html, docs/html/ch05s03.html, docs/html/ch05s04.html, docs/html/ch06.html, docs/html/ch06s02.html, docs/html/ch06s03.html, docs/html/ch06s04.html, docs/html/ch06s05.html, docs/html/ch06s06.html, docs/html/ch06s07.html, docs/html/ch06s08.html, docs/html/ch06s09.html, docs/html/ch07.html, docs/html/ch07s02.html, docs/html/ch07s03.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/pdf/manual.pdf, docs/src/manual.xml: Typo [73b7da91fde0] 2015-03-12 Carsten Grohmann * NEWS.txt, widgets/button/button.py, widgets/checkbox/checkbox.py, widgets/hyperlink_ctrl/hyperlink_ctrl.py, widgets/radio_button/radio_button.py, widgets/static_text/static_text.py, widgets/toggle_button/toggle_button.py: Fix Designer not displaying buttons two lines correctly (sf bug #169) (grafted from 779fc77bf78a05ace8215a4b4fdeb7ae5af82560) [00e4541a5eab] * errors.py: Remove obsolete exception class [427c7f66c379] * NEWS.txt, widgets/button/button.py, widgets/checkbox/checkbox.py, widgets/hyperlink_ctrl/hyperlink_ctrl.py, widgets/radio_button/radio_button.py, widgets/static_text/static_text.py, widgets/toggle_button/toggle_button.py: Fix Designer not displaying buttons two lines correctly (sf bug #169) [779fc77bf78a] * CONTRIBUTING.txt, README.txt, docs/html/apa.html, docs/html/apb.html, docs/html/apc.html, docs/html/apd.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch01s07.html, docs/html/ch01s08.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch02s06.html, docs/html/ch02s07.html, docs/html/ch02s08.html, docs/html/ch02s09.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch03s07.html, docs/html/ch04.html, docs/html/ch04s02.html, docs/html/ch04s03.html, docs/html/ch05.html, docs/html/ch05s02.html, docs/html/ch05s03.html, docs/html/ch05s04.html, docs/html/ch06.html, docs/html/ch06s02.html, docs/html/ch06s03.html, docs/html/ch06s04.html, docs/html/ch06s05.html, docs/html/ch06s06.html, docs/html/ch06s07.html, docs/html/ch06s08.html, docs/html/ch06s09.html, docs/html/ch07.html, docs/html/ch07s02.html, docs/html/ch07s03.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/pdf/manual.pdf, docs/src/manual.xml, errors.py: Update and extend documentation [94f3b97a391b] 2015-02-10 Carsten Grohmann * CONTRIBUTING.txt, README.txt, docs/ReleaseSteps.txt, install/pyinstaller/wxglade-installer.iss, install/pyinstaller/wxglade.spec, setup.py: Documentation updates [b9b56d3df47c] 2015-02-06 Carsten Grohmann * application.py: Fix file extensions update during changing languages [db29a7b10e0d] * main.py: Rename two variables in class wxGladeFrame to use speaking names Rename frame2 to frame_property and tree_frame to frame_tree [c96faa85eb56] 2015-02-02 Carsten Grohmann * setup.py: Use setuptools instead of distutils Looks like the parallel installation of setuptools and distutils doesn't work. From my perspective setuptools breaks distutils. Thereby I'm switching to setuptools to prevent strange behaviour. [8c807647e7d2] 2015-02-01 Carsten Grohmann * NEWS.txt, codegen/__init__.py, errors.py, tests/__init__.py, tests/casefiles/bug167.cpp, tests/casefiles/bug167.h, tests/casefiles/bug167.lisp, tests/casefiles/bug167.pl, tests/casefiles/bug167.py, tests/casefiles/bug167.wxg, tests/casefiles/bug167.xrc, tests/casefiles/bug167_utf8.cpp, tests/casefiles/bug167_utf8.h, tests/casefiles/bug167_utf8.lisp, tests/casefiles/bug167_utf8.pl, tests/casefiles/bug167_utf8.py, tests/casefiles/bug167_utf8.wxg, tests/casefiles/bug167_utf8.xrc, tests/casefiles/file_encodings.txt, tests/test_bugs.py: Fix Unicode error during update of an existing source file (sf bug #167) Convert file content internally to Unicode always. Thereby: - Store generated source files in the selected encoding - Read source files will be converted to Unicode also [8f795494349c] 2015-01-31 Carsten Grohmann * tests/__init__.py, tests/casefiles/file_encodings.txt: Read encoding of test case files from a file instead of hard-coded encodings The encodings are stored in tests/casefiles/file_encodings.txt [d7c6e05750c0] 2015-01-28 Carsten Grohmann * tests/__init__.py: Use a decorator to load test files from case file directory Previously test cases used an own function to load the files. Those function replaced the original implementation dynamically during the tests run. Now the decorator adapts the filenames only and the tests tests the real implementation. [40c28ba6b7cb] 2015-01-26 Carsten Grohmann * tests/test_bugs.py: Remove obsolete import [bf89d00c971f] 2015-01-21 Carsten Grohmann * NEWS.txt: Update NEWS.txt [d3a0c45e6237] * xml_parse.py: Don't ignore disabled gettext support (Thanks to Udi Fuchs) (grafted from 463bc8c718b5e00f3c7fa214ec75975ab9d36d0b) [26808eb4a3a8] * xml_parse.py: Don't ignore disabled gettext support (Thanks to Udi Fuchs) [463bc8c718b5] 2015-01-07 Carsten Grohmann * common.py: Improve wording [2589c129a475] * tests/casefiles/bug165.cpp, tests/casefiles/bug165.h, tests/casefiles/bug165.lisp, tests/casefiles/bug165.pl, tests/casefiles/bug165.py, tests/casefiles/bug165.wxg, tests/casefiles/bug165.xrc, tests/test_bugs.py, wcodegen/__init__.py: Fix error during preview of classed with custom names (sf bug #165) Two assert statements were misplaced and are removed now. (grafted from f9410889529c84ef5121b11631ac39ce4368aa35) [7192ec5074ca] * NEWS.txt, tests/casefiles/bug165.cpp, tests/casefiles/bug165.h, tests/casefiles/bug165.lisp, tests/casefiles/bug165.pl, tests/casefiles/bug165.py, tests/casefiles/bug165.wxg, tests/casefiles/bug165.xrc, tests/test_bugs.py, wcodegen/__init__.py: Fix error during preview of classed with custom names (sf bug #165) Two assert statements were misplaced and are removed now. [f9410889529c] 2015-01-02 Carsten Grohmann * bugdialog.py, log.py, main.py: Rework handling of bug dialog Rework the change "Show logged exceptions in wxGlade bug dialog" (1602:c6724cad00a3) because the locking doesn't work always fine. [f892a6c32a54] 2015-01-01 Carsten Grohmann * main.py: Remove obsolete import [628a68b24cb3] 2014-12-28 Carsten Grohmann * Makefile: Remove automatically generated directory wxGlade.egg-info within clean rule (grafted from fef9307f37a48e79260ff603e09e670f416628eb) [3c6f483a8f8a] * setup.py: Add a workaround for a probable bug in setuptools The sdist command failed with a "TypeError: dist must be a Distribution instance" exception. This is probably caused by a setuptools-monkeypatched Extension/Distribution class. Workaround: import setuptools first if setuptools are installed Bug details: http://bugs.python.org/issue23102 (grafted from cd4db92a5b1e2bc7bed5e33d7cdb799d613343f6) [9688fd1b9851] * setup.py: Take over handling icons as data files from Debian package [5082bfa2bb89] 2014-12-27 Carsten Grohmann * Makefile: Remove automatically generated directory wxGlade.egg-info within clean rule [fef9307f37a4] * setup.py: Add a workaround for a probable bug in setuptools The sdist command failed with a "TypeError: dist must be a Distribution instance" exception. This is probably caused by a setuptools-monkeypatched Extension/Distribution class. Workaround: import setuptools first if setuptools are installed Bug details: http://bugs.python.org/issue23102 [cd4db92a5b1e] * application.py, common.py, edit_windows.py, misc.py: Hardening importing and showing preview widgets The old code didn't handles failed imports very well. The new code has more checks and prevent subsequent error. (grafted from 049de2845adc74bfdc97564e61c34fd9f1dbe205) [07d9c6af801f] * main.py, tests/__init__.py, tests/casefiles/import_test.wxg, tests/test_codegen.py, tests/test_gui.py, tree.py, xrc2wxg.py: Use and enforce unicode in internal file-like objects for wxg and xrc files. (grafted from b0898ab090551f54b771ccd2c0c600463292afdb) [a006ef8a1efa] 2014-12-21 Carsten Grohmann * bugdialog.py, tests/__init__.py: Disable bug dialog if unittests are running [e7b5822eb51a] 2014-12-20 Carsten Grohmann * edit_windows.py, tests/test_gui.py: Another fix incorrect handling of styles (grafted from f4955614617dc5d0e4cf6ba9442ba5fa5e9135e0) [942d4687a558] * tests/casefiles/AllWidgets_28.lisp, tests/casefiles/no_supported_flags.cpp, tests/casefiles/no_supported_flags.h, tests/casefiles/no_supported_flags.lisp, tests/casefiles/no_supported_flags.pl, tests/casefiles/no_supported_flags.py, tests/casefiles/no_supported_flags.wxg, tests/casefiles/no_supported_flags.xrc, tests/test_codegen.py, wcodegen/__init__.py, widgets/bitmap_button/codegen.py, widgets/notebook/codegen.py, widgets/notebook/lisp_codegen.py, widgets/notebook/perl_codegen.py, widgets/notebook/wconfig.py, widgets/splitter_window/codegen.py, widgets/splitter_window/lisp_codegen.py, widgets/splitter_window/perl_codegen.py, widgets/splitter_window/wconfig.py: Unify code used to format styles (grafted from cc0753997b7e3374a05692fe1781430b5f9c892b) [0363afe10fc5] * widgets/toolbar/wconfig.py: Update style attributes for wxToolBar (grafted from 79b429b586e02864d64a56f2f7d236a3bab5a960) [7d0a7cd5e421] * common.py: Clarify log message (grafted from 37b97aca47d1f908817f6409aa2c1b137073ba67) [9340b217d6ec] * tests/test_codegen.py, wcodegen/mixins.py: Fix incorrect handling of styles only supported by a specific wx version (grafted from 97bf9909dc2a911521a4a231842db842fcd3d39b) [b067eba71a38] * common.py: Clarify 'supported_by' documentation (grafted from 8ae3cb6db217dd65f1edd70d0b92425538c5b0af) [6ba172a34ebb] * misc.py: Change title of design window to match schema used by property window (grafted from 7b35936d2b3404247b3922b32929198606e3bc80) [5041ba13b610] * misc.py: Change title of design window to match schema used by property window (grafted from ebfde85ee859deffd4978ef1ee8b3662fb12fbbb) [ac41b556de1c] * edit_windows.py, tests/test_gui.py: Another fix incorrect handling of styles [f4955614617d] 2014-12-19 Carsten Grohmann * tests/casefiles/AllWidgets_28.lisp, tests/casefiles/no_supported_flags.cpp, tests/casefiles/no_supported_flags.h, tests/casefiles/no_supported_flags.lisp, tests/casefiles/no_supported_flags.pl, tests/casefiles/no_supported_flags.py, tests/casefiles/no_supported_flags.wxg, tests/casefiles/no_supported_flags.xrc, tests/test_codegen.py, wcodegen/__init__.py, widgets/bitmap_button/codegen.py, widgets/notebook/codegen.py, widgets/notebook/lisp_codegen.py, widgets/notebook/perl_codegen.py, widgets/notebook/wconfig.py, widgets/splitter_window/codegen.py, widgets/splitter_window/lisp_codegen.py, widgets/splitter_window/perl_codegen.py, widgets/splitter_window/wconfig.py: Unify code used to format styles [cc0753997b7e] * widgets/toolbar/wconfig.py: Update style attributes for wxToolBar [79b429b586e0] 2014-12-07 Carsten Grohmann * NEWS.txt: Add new changes [8e163ed24b65] * bugdialog.py, main.py: Show logged exceptions in wxGlade bug dialog [c6724cad00a3] 2014-12-06 Carsten Grohmann * common.py: Clarify log message [37b97aca47d1] * bugdialog.py, main.py: Show bugdialog for unhandled exception in wxGlade GUI [1ac725293df6] * log.py: Simplify installation and deinstallation of the exception handler [fb072b468f56] 2014-11-30 Carsten Grohmann * tests/test_codegen.py, wcodegen/mixins.py: Fix incorrect handling of styles only supported by a specific wx version [97bf9909dc2a] 2014-11-29 Carsten Grohmann * common.py: Clarify 'supported_by' documentation [8ae3cb6db217] 2014-11-09 Carsten Grohmann * install/pyinstaller/build.bat: Show a status message after PyInstaller has run. [0bc3a53f95a0] * misc.py: Change title of design window to match schema used by property window [7b35936d2b34] * misc.py: Change title of design window to match schema used by property window [ebfde85ee859] 2014-11-08 Carsten Grohmann * main.py: Improve statusbar messages for loading from file-like objects (grafted from 851aa3217fa642181c6c6131571be34a46df2e53) [aa7bf8510ab2] * application.py, common.py, edit_windows.py, misc.py: Hardening importing and showing preview widgets The old code didn't handles failed imports very well. The new code has more checks and prevent subsequent error. [049de2845adc] 2014-11-07 Carsten Grohmann * main.py: Don't hide warnings. The warnings should be shown to fix them. [3fedb337a071] * main.py: Improve statusbar messages for loading from file-like objects [851aa3217fa6] * NEWS.txt: Update news [f71b66fe14b8] * log.py: Add check for existing file logger destination (grafted from 4b42b463963ce457f1a87a80ba513e901dd1826e) [9c97d34a9087] * common.py: Update creation config directory (grafted from d12f1c050a77247e1940edbee6941e0da94070ba) [ca6448d6903c] * main.py: Abbreviate statusbar messages (grafted from fd81debe6d57c84ca0b1cdaa5bba4ec2d00ddbb1) [d3ca70d95cf7] * log.py: Add check for existing file logger destination [4b42b463963c] * common.py: Update creation config directory [d12f1c050a77] * main.py: Abbreviate statusbar messages [fd81debe6d57] 2014-11-06 Carsten Grohmann * main.py, tests/__init__.py, tests/casefiles/import_test.wxg, tests/test_codegen.py, tests/test_gui.py, tree.py, xrc2wxg.py: Use and enforce unicode in internal file-like objects for wxg and xrc files. [b0898ab09055] 2014-11-03 Carsten Grohmann * common.py, tree.py: More docstrings and minor code cosmetics [c2fdcccbbb0c] 2014-11-02 Carsten Grohmann * common.py, edit_windows.py: Typos [ecb43f6aa7c8] * about.py, common.py, main.py: Improve handling of UTF-8 encoded files especially wxg files. [3135bd07aa8d] * Makefile: Remove autosave files within clean rule too [ac650f4e3038] * common.py: Write autosave file in UTF-8 [3fb3942ec9a8] 2014-11-01 Carsten Grohmann * application.py: Use UTF-8 encoded XML to generate source code The old change used XML encoded with the selected source file encoding, but the encoding wasn't mentioned. This caused ugly bugs. Now the encoding isn't still mentioned - but wxGlade used the XML default UTF-8. (grafted from 5e35b67e5e3446a7f199bc7b28a02a7f8048c703) [e74a939461c5] * main.py: Fix swapping property and tree windows at every wxGlade startup (grafted from 549deffea9f2076903cd178900eccaa835b19b9b) [100e9d2a641e] * application.py: Use UTF-8 encoded XML to generate source code The old change used XML encoded with the selected source file encoding, but the encoding wasn't mentioned. This caused ugly bugs. Now the encoding isn't still mentioned - but wxGlade used the XML default UTF-8. [5e35b67e5e34] * main.py: Fix swapping property and tree windows at every wxGlade startup [549deffea9f2] 2014-10-31 Carsten Grohmann * NEWS.txt: Add new changes [4453b2ef0710] * config.py: Interims fix for handling the version file RELEASE-VERSION [0af6e6d870b1] * common.py, main.py, misc.py: Open wxGlade windows in the upper left corner if wxGlade is starting the first time (grafted from 37c252ed8fda2599de2474a431641fa028dda36a) [5d8f3712eec9] * common.py: Decode Unicode written to wxg files later to prevent UnicodeDecodeErrors (grafted from 27becaef20951d9a7164e647996d481f0464d56d) [1e46478a0d54] * common.py, main.py, misc.py: Open wxGlade windows in the upper left corner if wxGlade is starting the first time [37c252ed8fda] * config.py: Minor docstring format update [49b3b7173c6c] 2014-10-29 Carsten Grohmann * common.py: Decode Unicode written to wxg files later to prevent UnicodeDecodeErrors [27becaef2095] 2014-10-28 Carsten Grohmann * bugdialog_ui.py, main.py, templates_ui.py, widgets/bitmap_button/bitmap_button.py, widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/static_bitmap/static_bitmap.py: Replace old styles (wx .6) by new styles (wx2.8 and wx3.0) (grafted from 79cd1f59effc41f7288b7f07bf83a4abf186f4e7) [db7b99d8e5e7] * bugdialog_ui.py, main.py, templates_ui.py, widgets/bitmap_button/bitmap_button.py, widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/static_bitmap/static_bitmap.py: Replace old styles (wx .6) by new styles (wx2.8 and wx3.0) [79cd1f59effc] * RELEASE-VERSION: Adding RELEASE-VERSION file [81698e054674] 2014-10-27 Carsten Grohmann * Closed WXG-BRANCH-VERSION_0_6_8 branch [66d09153246b] * common.py: Create missing application data directory Otherwise log initialisation will failed with an IOError "No such file or directory" [4c3c49e4cf61] * wxglade.py: Show version in wxglade CLI output too [25263ed45bd2] * common.py: Create missing application data directory Otherwise log initialisation will failed with an IOError "No such file or directory" [3b0c9705b793] * wxglade.py: Show version in wxglade CLI output too [01431279a7b5] 2014-10-26 Carsten Grohmann * NEWS.txt, install/pyinstaller/wxglade-installer.iss: Start new development cycle [e2850c84f9ad] * Created WXG-BRANCH-VERSION_0_7_0 branch [bb685d8ad2a0] * .hgtags: Added tag rel_0.7.0 for changeset 98fb6cee1545 [31d71d6218c7] * install/pyinstaller/wxglade-installer.iss: Bump version number to 0.7.0 [98fb6cee1545] [rel_0.7.0] * CHANGES.txt, NEWS.txt, README.txt: Update documentation [8605bcccf3eb] * install/pyinstaller/wxglade-installer.iss: Remove technical notes from INNO setup [5ac988366b8e] * install/pyinstaller/wxglade-installer.iss: Change directory the SAE installed will placed to [d7128a24050c] * install/pyinstaller/wxglade.spec: Remove appdata.xml and wxGlade.desktop from Windows distribution [c30d0781be12] * wxglade.py: Remove obsolete wxversion comment [6284e0555c1b] * docs/BuildingInstaller.txt, docs/ReleaseSteps.txt, install/pyinstaller/build.bat, install/pyinstaller/hook-main.py, install/pyinstaller/hooks/hook-main.py, install/pyinstaller/wxglade- installer.iss, install/pyinstaller/wxglade.spec: Update Windows installation procedure after upgrading to Pyinstaller 2.1 [a53efb9ac8f3] * credits.txt: Update developers [4dc155ba93f6] * setup.py: Update classification of the programming language [d72fe7f9f6fd] 2014-10-25 Carsten Grohmann * Merge documenation [f37bd738d687] * docs/html/apa.html, docs/html/apb.html, docs/html/apc.html, docs/html/apd.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch01s07.html, docs/html/ch01s08.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch02s06.html, docs/html/ch02s07.html, docs/html/ch02s08.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch04.html, docs/html/ch04s03.html, docs/html/ch05.html, docs/html/ch05s02.html, docs/html/ch05s03.html, docs/html/ch05s04.html, docs/html/ch06.html, docs/html/ch06s02.html, docs/html/ch06s03.html, docs/html/ch06s04.html, docs/html/ch06s05.html, docs/html/ch06s06.html, docs/html/ch06s07.html, docs/html/ch06s08.html, docs/html/ch06s09.html, docs/html/ch07.html, docs/html/ch07s02.html, docs/html/ch07s03.html, docs/html/index.html, docs/html/label_menu.png, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/properties_menu_editor.png, docs/html/properties_toolbar_editor.png, docs/html/properties_window_application.png, docs/html/properties_window_settings.png, docs/html/properties_window_statusbar.png, docs/html/sizer_menu.png, docs/html/tree_window.png, docs/pdf/manual.pdf, docs/src/label_menu.png, docs/src/manual.xml, docs/src/properties_menu_editor.png, docs/src/properties_toolbar_editor.png, docs/src/properties_window_application.png, docs/src/properties_window_settings.png, docs/src/properties_window_statusbar.png, docs/src/sizer_menu.png, docs/src/tree_window.png: Update and extend documentation [b15e740febca] * tree.py, xml_parse.py: Rename codegen_opt into multiple_files for clarification [13ac79fec9a8] * docs/src/manual.xml, docs/tech_notes.txt: Migrate technical notes into manual [1020317882ce] * setup.py, wxglade.py: Add myself to license statements [96433fd01af9] * setup.py: Adapt software classification [3a501524ac89] * application.py: Set proper output path at GUI startup [2aee28624b44] * application.py: Rename codegen_opt into multiple_files for clarification [4970f3edc9a4] 2014-10-24 Carsten Grohmann * application.py, codegen/__init__.py, codegen/cpp_codegen.py, edit_sizers/edit_sizers.py, edit_windows.py, main.py: Use raw strings if strings contains backslashes [845fe7309162] * about.py, application.py, clipboard.py, codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/perl_codegen.py, codegen/py_codegen.py, common.py, edit_sizers/edit_sizers.py, edit_windows.py, main.py, misc.py, preferences_ui.py, res/preferences_ui.wxg, tree.py, widget_properties.py, widgets/dialog/dialog.py, widgets/dialog/perl_codegen.py, widgets/grid/grid.py, widgets/hyperlink_ctrl/wconfig.py, widgets/menubar/menubar.py, widgets/notebook/notebook.py, widgets/panel/panel.py, widgets/splitter_window/splitter_window.py, xml_parse.py: Text improvements and typos [286e6942366a] * application.py: Adapt file extensions to changing code generator languages in single file mode [869c8e52ab10] * application.py, xml_parse.py: Rename codegen_prop into multiple_files_prop for clarification [287e061155ce] * application.py, xml_parse.py: Improve setting the code generator language [f86d3947e305] 2014-10-23 Carsten Grohmann * codegen/perl_codegen.py, codegen/py_codegen.py, wcodegen/__init__.py: Escape linebreak and tab characters in doc strings [da23edfa913d] * application.py: Minor code reorg [fa5315eee8f8] * log.py: Show locale settings in printed or logged exceptions [8c91455a545c] * common.py, wcodegen/__init__.py, widgets/choice/codegen.py, widgets/choice/lisp_codegen.py, widgets/choice/perl_codegen.py, widgets/combo_box/codegen.py, widgets/combo_box/lisp_codegen.py, widgets/combo_box/perl_codegen.py, widgets/combo_box/wconfig.py, widgets/gauge/codegen.py, widgets/gauge/lisp_codegen.py, widgets/gauge/perl_codegen.py, widgets/gauge/wconfig.py, widgets/list_box/codegen.py, widgets/list_box/lisp_codegen.py, widgets/list_box/perl_codegen.py, widgets/list_ctrl/codegen.py, widgets/list_ctrl/lisp_codegen.py, widgets/list_ctrl/perl_codegen.py, widgets/list_ctrl/wconfig.py, widgets/radio_box/codegen.py, widgets/radio_box/lisp_codegen.py, widgets/radio_box/perl_codegen.py, widgets/slider/codegen.py, widgets/slider/lisp_codegen.py, widgets/slider/perl_codegen.py, widgets/slider/wconfig.py, widgets/spin_button/codegen.py, widgets/spin_button/lisp_codegen.py, widgets/spin_button/perl_codegen.py, widgets/spin_button/wconfig.py, widgets/spin_ctrl/codegen.py, widgets/spin_ctrl/lisp_codegen.py, widgets/spin_ctrl/perl_codegen.py, widgets/spin_ctrl/wconfig.py, widgets/static_line/codegen.py, widgets/static_line/lisp_codegen.py, widgets/static_line/perl_codegen.py, widgets/static_line/wconfig.py, widgets/tree_ctrl/codegen.py, widgets/tree_ctrl/lisp_codegen.py, widgets/tree_ctrl/perl_codegen.py, widgets/tree_ctrl/wconfig.py: Move default_style to widget config dict and recognise choices automatically [50281f66b867] 2014-10-22 Carsten Grohmann * NEWS.txt, codegen/__init__.py, codegen/perl_codegen.py, codegen/py_codegen.py, tests/test_codegen.py: Fix incomplete Unicode escaping The unicode range 0x80-0xFF (Latin-1 Supplement - also called C1 Controls and Latin-1 Supplement) wasn't escaped yet. Thereby the returned string was not pure ascii. This commit manually converts the remaining unicode characters. [20ccdcc44a7e] * NEWS.txt: Short update to reflect already committed changes [2287be298892] * application.py: Add a deprecation notice to the in place modification feature. wxGlade can change code inside existing source files to reflect changed designs. This feature is deprecated now und will be removed within the next releases. [686462f2fecf] 2014-10-21 Carsten Grohmann * Closed DEV_UNICODE branch [291d010e653f] * install/pyinstaller/wxglade.spec: Include RELEASE-VERSION into files/dirs generated by PyInstaller [65a1092d9906] 2014-10-20 Carsten Grohmann * codegen/py_codegen.py, common.py, tests/__init__.py, tests/test_codegen.py: Fix wrong decoding of strings in function to quote/escape Python strings The input parameter s is a string encoded with self.app_encoding. Decoding with 'utf8' works for pure ascii strings only. Latin1 string with umlauts have failed. [29e695522d81] 2014-10-19 Carsten Grohmann * misc.py, widgets/button/button.py, widgets/choice/choice.py, widgets/hyperlink_ctrl/hyperlink_ctrl.py, widgets/list_box/list_box.py, widgets/menubar/menubar.py, widgets/radio_box/radio_box.py, widgets/radio_button/radio_button.py, widgets/static_text/static_text.py, widgets/toggle_button/toggle_button.py: Remove alias misc.encode [8e277e979210] * widget_properties.py: Add missing docstring [048d796d6c69] 2014-10-18 Carsten Grohmann * wxGlade.desktop: Add desktop entry file [8f8145bde793] * appdata.xml, docs/ReleaseSteps.txt, install/pyinstaller/wxglade.spec, setup.py: Add short application description via appdata.xml file [2a44b7e947e6] * codegen/cpp_codegen.py, misc.py: Introduce an wrapper class for StringIO to enforce ASCII content. [25e9a84e7118] * application.py, misc.py: Rename StringIO wrapper misc.EncStringIO() to misc.UnicodeStringIO() The wrapper class enforces the conversion to Unicode always. [ae11e42af74f] * codegen/perl_codegen.py, tests/casefiles/ComplexExample_30.pl: Change Perl tooltip statement for wx3 from SetToolTipString() to SetToolTip() [a10b60c1aac8] * codegen/__init__.py, codegen/py_codegen.py: Adapt naming schema for code statements to schema used with styles Example: 'tooltip_3X' -> 'tooltip_3' [1401ffbc36fe] * common.py: Rename wxALIGN_CENTRE* to wxALIGN_CENTER* during code generation [c66c45031a9a] * codegen/xrc_codegen.py: Don't inject cn_f() into XrcObject, it's used from the StylesMixin now. [02121ac02d2a] * codegen/xrc_codegen.py: Fix wrong formatted string statement [6060ffdde0ca] * common.py, edit_sizers/edit_sizers.py, edit_windows.py, tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.xrc, tests/casefiles/Sizers_classattr.cpp, tests/casefiles/Sizers_classattr.lisp, tests/casefiles/Sizers_classattr.pl, tests/casefiles/Sizers_classattr.py, tests/casefiles/Sizers_classattr.xrc, tests/casefiles/Sizers_no_classattr.cpp, tests/casefiles/Sizers_no_classattr.lisp, tests/casefiles/Sizers_no_classattr.pl, tests/casefiles/Sizers_no_classattr.py, tests/casefiles/Sizers_no_classattr.xrc, tests/test_codegen.py, wcodegen/__init__.py, wcodegen/mixins.py, xml_parse.py: Separate styles related code The resulting StylesMixin can be used within the widget writer structure as well as the code generator structure later. This commit fixes a bug in handling combined styles too. [5537cf7b7f99] * xml_parse.py: Rework xml_parse.Sizeritem() to use style names instead of values partially [3148cc28c63d] * edit_sizers/edit_sizers.py, edit_windows.py, tests/test_gui.py, wcodegen/__init__.py, widgets/bitmap_button/bitmap_button.py, widgets/button/button.py, widgets/calendar_ctrl/calendar_ctrl.py, widgets/combo_box/combo_box.py, widgets/custom_widget/custom_widget.py, widgets/datepicker_ctrl/datepicker_ctrl.py, widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/gauge/gauge.py, widgets/grid/grid.py, widgets/hyperlink_ctrl/hyperlink_ctrl.py, widgets/list_box/list_box.py, widgets/list_ctrl/list_ctrl.py, widgets/notebook/notebook.py, widgets/panel/panel.py, widgets/radio_button/radio_button.py, widgets/slider/slider.py, widgets/spacer/spacer.py, widgets/spin_button/spin_button.py, widgets/spin_ctrl/spin_ctrl.py, widgets/splitter_window/splitter_window.py, widgets/static_bitmap/static_bitmap.py, widgets/static_line/static_line.py, widgets/static_text/static_text.py, widgets/statusbar/statusbar.py, widgets/text_ctrl/text_ctrl.py, widgets/toolbar/toolbar.py, widgets/tree_ctrl/tree_ctrl.py: Rename StylesMixin in EditStylesMixin [5e409245d2a2] 2014-10-17 Carsten Grohmann * wcodegen/__init__.py: Remove unused parameter in cn_f() [b355b943acbf] * codegen/xrc_codegen.py, tests/casefiles/AllWidgets_28.xrc, tests/casefiles/ComplexExample.xrc, tests/casefiles/ComplexExample_30.xrc, tests/casefiles/Format_flags.wxg, tests/casefiles/Format_flags.xrc, tests/casefiles/Sizers_classattr.xrc, tests/casefiles/Sizers_no_classattr.xrc, tests/test_codegen.py, wcodegen/__init__.py, widgets/toolbar/codegen.py: Rework formatting flags for XRC code [5412db02dcb4] 2014-10-15 Carsten Grohmann * widgets/static_bitmap/static_bitmap.py: Typo [fa1e3247a8ab] * wcodegen/__init__.py: Add debug message for processing flags (cn_f()) [cf6c240b6ca9] * log.py: Fix writing debug() messages to the log file [aea715990cba] 2014-10-14 Carsten Grohmann * tests/casefiles/Statusbar_wo_labels.cpp, tests/casefiles/Statusbar_wo_labels.h, tests/casefiles/Statusbar_wo_labels.lisp, tests/casefiles/Statusbar_wo_labels.pl, tests/casefiles/Statusbar_wo_labels.py, tests/casefiles/Statusbar_wo_labels.wxg, tests/casefiles/Statusbar_wo_labels.xrc, tests/test_codegen.py, widgets/statusbar/codegen.py, widgets/statusbar/lisp_codegen.py, widgets/statusbar/perl_codegen.py: Don't set wxStatusbar labels if no label have a text [0d923808cf05] * config.py: Minor fix for last commit [63b1f9e93b8e] 2014-10-13 Carsten Grohmann * common.py, config.py, docs/BuildingInstaller.txt, docs/ReleaseSteps.txt, setup.py, wxglade.py: Change internal handling of the version number and introduce RELEASE-VERSION The version number will determinate in three steps: 1. read from release file 2. Queried from local hg repo 3. Set to "not found" [f73c8b74a30d] * install/pyinstaller/wxglade-installer.iss: Add statusbar widget to Windows installer file [d89ece760839] * codegen/perl_codegen.py, tests/casefiles/AllWidgets_28.pl, tests/casefiles/CalendarCtrl.pl, tests/casefiles/ComplexExample.pl, tests/casefiles/ComplexExample_30.pl, tests/casefiles/FontColour.pl, tests/casefiles/Gauge.pl, tests/casefiles/Grid.pl, tests/casefiles/HyperlinkCtrl_28.pl, tests/casefiles/Perl_Preferences.pl, tests/casefiles/PlAddApp_multi_detailed.pl, tests/casefiles/PlAddApp_multi_gettext_detailed.pl, tests/casefiles/PlAddApp_multi_gettext_simple.pl, tests/casefiles/PlAddApp_multi_simple.pl, tests/casefiles/PlOgg1.pl, tests/casefiles/PlOgg2_MyDialog.pm, tests/casefiles/PlOgg2_MyFrame.pm, tests/casefiles/PlOgg2_app.pl, tests/casefiles/PlOgg3.pl, tests/casefiles/Sizers_classattr.pl, tests/casefiles/Sizers_no_classattr.pl, tests/casefiles/add_class_inplace_extended.pl, tests/casefiles/add_class_inplace_orig.pl, tests/casefiles/bug163.pl, tests/casefiles/no_suitable_writer.pl, tests/casefiles/remove_class_inplace_expected.pl, tests/casefiles/remove_class_inplace_input.pl, tests/casefiles /styleless-dialog.pl: Update wxPerl homepage URL [3750f1b57bec] * misc.py: Typo [394c825b3556] * configUI.py, configdialog.py, main.py, preferences_ui.py, preferencesdialog.py, res/preferences.wxg, res/preferences_ui.wxg: Rename configdialog into preferencesdialog to have consistent naming schema [99ace2652874] * tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_28.xrc: Minor changes in all widgets test case [c1d4ec279e8e] * tests/casefiles/AllWidgets_28.cpp, widgets/radio_box/codegen.py: Set majorDimension to 1 if choice is empty for C++ and wxRadiobox wx raises an assertion if choices are empty and majorDim is 0 (default) [d43658de1381] 2014-10-12 Carsten Grohmann * widget_properties.py: Add caching for tooltips [6ee5f55e98ed] * xml_parse.py: Fix comparing version number introduced with last commit [b0eccb84d4b8] * codegen/__init__.py, config.py, xml_parse.py: Show warning if loading projects for wx2.6 or with old python imports [f080397cd59a] * config.py: Rework specified types in docstrings [db81f7fc1f17] 2014-10-11 Carsten Grohmann * tests/casefiles/AllWidgets_28.pl, tests/casefiles/ComplexExample.pl, tests/casefiles/ComplexExample.py, tests/casefiles/ComplexExample_30.pl, tests/casefiles/Perl_Preferences.pl, tests/casefiles/PlOgg1.pl, tests/casefiles/PlOgg2_MyDialog.pm, tests/casefiles/PlOgg3.pl, widgets/menubar/perl_codegen.py, widgets/panel/perl_codegen.py, widgets/splitter_window/perl_codegen.py, widgets/toolbar/perl_codegen.py, wxglade.py: Don't generate "wxDefaultPosition, wxDefaultSize, );" for Perl [e13688559c77] * tests/test_gui.py: Separate setting wxGlade output path to an own function [4e0700718588] * tests/test_gui.py: Extract processing of wx events to a separate function [2490b6cab219] * codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/perl_codegen.py, codegen/py_codegen.py, edit_sizers/edit_sizers.py, install/update- po.py, tests/__init__.py, tests/test_gui.py, wcodegen/__init__.py, wcodegen/dialogs.py, widgets/bitmap_button/lisp_codegen.py, widgets/custom_widget/custom_widget.py, widgets/dialog/codegen.py, widgets/dialog/dialog.py, widgets/frame/codegen.py, widgets/frame/frame.py, widgets/menubar/lisp_codegen.py, widgets/menubar/menubar.py, widgets/notebook/notebook.py, widgets/spacer/spacer.py, widgets/statusbar/statusbar.py, widgets/toolbar/toolbar.py: Rework specified types in docstrings and minor code changes [e2ea9baeeecb] * application.py, common.py, config.py, edit_windows.py, log.py, main.py, misc.py, ordereddict.py, test.py, tree.py, widget_properties.py, widgets/panel/codegen.py, widgets/panel/lisp_codegen.py, widgets/panel/perl_codegen.py, wxglade.py, xml_parse.py: Add missing layout code generation for wxPanel [13cafd1a4944] * widgets/frame/frame.py, widgets/statusbar/statusbar.py: Fix different call syntax of EditStatusBar [bdde7b0a7db9] 2014-10-10 Carsten Grohmann * tests/test_gui.py: Adapt GUI test setup to run on 2.8 and 3.0 [74c00b2d2ac9] 2014-10-09 Carsten Grohmann * main.py: Show an info instead of an error if opening a non-existing last visited file [0049b908a587] * application.py, tree.py, wxglade.py: More path normalisation [97a297b4006f] 2014-10-08 Carsten Grohmann * application.py, codegen/__init__.py: Expand user in output files and directories [ca1cb7d10bb2] * wxglade.py: Enable wxPython3 for GUI [1206fd23e176] * xml_parse.py: Remove unused import xml.sax.expatreader [503af71a6a47] * Closed WXG-BRANCH-VERSION_0_6_8 branch [fbdcbd25b08e] * Makefile, NEWS.txt, about.py, application.py, codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/perl_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, common.py, config.py, edit_sizers/sizers_codegen.py, log.py, main.py, setup.py, test.py, tests/__init__.py, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/CPP_Preferences.cpp, tests/casefiles/CPP_wxCalendarCtrl.cpp, tests/casefiles/CPP_wxCalendarCtrl.h, tests/casefiles/CPP_wxCalendarCtrl.wxg, tests/casefiles/CalendarCtrl.pl, tests/casefiles/ComplexExample.lisp, tests/casefiles/Gauge.lisp, tests/casefiles/Gauge.pl, tests/casefiles/Grid.lisp, tests/casefiles/Grid.pl, tests/casefiles/HyperlinkCtrl_26.cpp, tests/casefiles/HyperlinkCtrl_26.h, tests/casefiles/HyperlinkCtrl_26.lisp, tests/casefiles/HyperlinkCtrl_26.pl, tests/casefiles/HyperlinkCtrl_26.py, tests/casefiles/HyperlinkCtrl_26.wxg, tests/casefiles/HyperlinkCtrl_26.xrc, tests/casefiles/LispOgg1.lisp, tests/casefiles/LispOgg2_MyDialog.lisp, tests/casefiles/LispOgg2_MyFrame.lisp, tests/casefiles/LispOgg3.lisp, tests/casefiles/Lisp_Preferences.lisp, tests/casefiles/Lisp_wxBitmapButton.lisp, tests/casefiles/Perl_Preferences.pl, tests/casefiles/PlOgg3.pl, tests/casefiles/Preferences.wxg, tests/casefiles/PyOgg1_oldnamespace.py, tests/casefiles/Python_Preferences.py, tests/casefiles/Sizers_classattr.lisp, tests/casefiles/Sizers_no_classattr.lisp, tests/casefiles/add_class_inplace_extended.lisp, tests/casefiles/add_class_inplace_orig.lisp, tests/casefiles/bug163.h, tests/casefiles/bug163.lisp, tests/casefiles/bug163.pl, tests/casefiles/remove_class_inplace_expected.lisp, tests/casefiles/remove_class_inplace_input.lisp, tests/casefiles /styleless-dialog.cpp, tests/casefiles/styleless-dialog.lisp, tests/casefiles/styleless-dialog.pl, tests/casefiles/styleless- dialog.py, tests/test_bugs.py, tests/test_codegen.py, wcodegen/__init__.py, widget_properties.py, widgets/custom_widget/codegen.py, widgets/grid/grid.py, widgets/menubar/menubar.py, widgets/panel/__init__.py, wxglade.py, xml_parse.py: merged DEV_GUI_WX30 into default [5e983acdcc76] 2014-10-07 Carsten Grohmann * tests/__init__.py: Add option to exclude languages from tests.WXGladeBaseTest._test_all() [da8bb5e52c2f] * application.py, codegen/py_codegen.py, errors.py, tests/test_codegen.py, wxglade.py: Improve disabling old import style for wxPython 3.0 [e4264989b3bb] * application.py, codegen/lisp_codegen.py, errors.py, tests/casefiles/ComplexExample_30.lisp, tests/test_codegen.py, wxglade.py, xml_parse.py: Disable Lisp code generation for wxWidgets 3.0 I've disabled Lisp due lack of testing possibilities for the upcoming release of wxWidgets 3.0. [ad23813a0818] * msgdialog.py, res/messagedialog.wxg: Change "wxGlade Message" dialog to close on pressing enter [99f75deb6b23] 2014-10-06 Carsten Grohmann * application.py, common.py, config.py, edit_sizers/edit_sizers.py, layout_option_property.py, misc.py, template.py, tree.py, widget_properties.py, widgets/ChoicesProperty.py, widgets/MenuTree.py, widgets/grid/grid.py, widgets/notebook/notebook.py, widgets/statusbar/statusbar.py, widgets/toolbar/tool.py, xml_parse.py: Minor code reorganisation - rename common._encode_from_xml() to encode_from_xml() - rename common._encode_to_xml() to encode_to_xml() - move widget_properties.label_initial_width to config module [853e6e5689f4] * application.py, codegen/xrc_codegen.py, edit_sizers/edit_sizers.py, edit_windows.py, misc.py, template.py, widget_properties.py, widgets/ChoicesCodeHandler.py, widgets/ChoicesProperty.py, widgets/MenuTree.py, widgets/button/button_stockitems.py, widgets/custom_widget/codegen.py, widgets/custom_widget/custom_widget.py, widgets/frame/codegen.py, widgets/grid/codegen.py, widgets/grid/grid.py, widgets/menubar/codegen.py, widgets/notebook/codegen.py, widgets/notebook/notebook.py, widgets/statusbar/codegen.py, widgets/toolbar/codegen.py, widgets/toolbar/tool.py: Convert old-style classes in new-style classes [c747aca85c28] * widget_properties.py, widgets/combo_box/combo_box.py: Add list of public names to use during wildcard import [737df80a3241] * edit_sizers/edit_sizers.py: Change initialisation of border styles in SizerBase class The old version caused an exception during copy / paste sizers. [9d7013fab8a4] 2014-10-05 Carsten Grohmann * NEWS.txt, tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_28.xrc, widgets/splitter_window/codegen.py, widgets/splitter_window/lisp_codegen.py, widgets/splitter_window/perl_codegen.py, widgets/splitter_window/splitter_window.py: Add support for wxSplitterWindow.SetMinimumPaneSize() [c5aa6e853de9] 2014-10-04 Carsten Grohmann * tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.h, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_28.xrc: Add wxTextCtrl to wxSpinButton test page [e925c77a0da7] * tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.h, widgets/bitmap_button/codegen.py, widgets/static_bitmap/codegen.py, wxglade.py: Fix C++ compile error The error was caused by using strings instead of wxT() for wxBitmap file names. Old: wxBitmap("icon.xpm", wxBITMAP_TYPE_ANY) New: wxBitmap(wxT("icon.xpm"), wxBITMAP_TYPE_ANY) [f848b22a1ddc] * codegen/cpp_codegen.py, tests/casefiles/CPPAddApp_multi_gettext_detailed.cpp, tests/casefiles/CPPAddApp_multi_gettext_simple.cpp, tests/casefiles/CPPOgg1.h, tests/casefiles/CPPOgg2_MyDialog.h, tests/casefiles/CPPOgg2_MyFrame.h, tests/casefiles/CPPOgg2_main.cpp, tests/casefiles/CPPOgg3.h, tests/casefiles/CPP_Preferences.h, tests/casefiles/ComplexExample.h, tests/casefiles/ComplexExample_30.h, tests/casefiles/FontColour.h, tests/casefiles/HyperlinkCtrl_28.h, tests/casefiles/Sizers_classattr.h, tests/casefiles/Sizers_no_classattr.h, tests/casefiles/add_class_inplace_extended.h, tests/casefiles/add_class_inplace_orig.h, tests/casefiles/no_suitable_writer.h, tests/casefiles/remove_class_inplace_expected.h, tests/casefiles/remove_class_inplace_input.h, tests/casefiles /styleless-dialog.h: Change inclusion of C++ i18n header file from "wx/intl.h" to [e80c0d089636] * config.py, widget_properties.py: Wrap tooltip lines automatically. [f64346e3a3d7] 2014-10-03 Carsten Grohmann * tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.h, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_28.xrc: Add tests for widget without tests. Now all widgets should be tested at least onece. [3c724f259c55] * widgets/slider/perl_codegen.py: Typo in Perl code template for wxSlider [abce48683412] * widgets/splitter_window/splitter_window.py: Use style names instead of style values wxSplitterWindow GUI elements [2d82ea0db4c7] * widget_properties.py: Use the right value to set checkboxes in CheckListProperty.display() [839be9262e98] 2014-10-01 Carsten Grohmann * tree.py, widget_properties.py: Changing binding events from wx.EVT*() to widget.Bind() This change doesn't affect all occurrences. It was triggered by bug fixing. [ecb86304d026] * codegen/__init__.py, widgets/dialog/wconfig.py, widgets/splitter_window/codegen.py: Various minor bug fixes [d4a79b752324] 2014-09-28 Carsten Grohmann * edit_windows.py, tests/test_gui.py, wcodegen/__init__.py: Improve handling of empty styles ('', None) [95584f0064ae] * widgets/frame/codegen.py, widgets/frame/lisp_codegen.py, widgets/frame/perl_codegen.py: Further cleanup for wx2.6 [54bfcc07b1a0] 2014-09-27 Carsten Grohmann * NEWS.txt, application.py, codegen/py_codegen.py, edit_sizers/edit_sizers.py, edit_windows.py, log.py, setup.py, test.py, tests/casefiles/HyperlinkCtrl_26.cpp, tests/casefiles/HyperlinkCtrl_26.h, tests/casefiles/HyperlinkCtrl_26.lisp, tests/casefiles/HyperlinkCtrl_26.pl, tests/casefiles/HyperlinkCtrl_26.py, tests/casefiles/HyperlinkCtrl_26.wxg, tests/casefiles/HyperlinkCtrl_26.xrc, tests/test_codegen.py, widgets/frame/codegen.py: Remove support for wxPython 2.6 [1da6e745ea39] * about.py, application.py, kdefiledialog.py, main.py: Replace old styles (wx .6) by new styles (wx2.8 and wx3.0) [c6cb542d3bfc] * code_property.py, edit_windows.py, layout_option_property.py, tests/test_gui.py, widgets/statusbar/__init__.py: Minor bug fixes introduced during code rework [1e8650cc1a59] 2014-09-26 Carsten Grohmann * widget_properties.py, widgets/static_text/static_text.py: Use always wx.lib.stattext.GenStaticText [a229eebb4745] * NEWS.txt, application.py, codegen/py_codegen.py, edit_windows.py, tree.py, widgets/calendar_ctrl/codegen.py, widgets/grid/codegen.py, xml_parse.py: Remove support for old Python import style generally [535a6f5a277b] * wcodegen/__init__.py, widgets/bitmap_button/codegen.py, widgets/bitmap_button/lisp_codegen.py, widgets/bitmap_button/perl_codegen.py, widgets/custom_widget/codegen.py, widgets/custom_widget/lisp_codegen.py, widgets/custom_widget/perl_codegen.py, widgets/datepicker_ctrl/codegen.py, widgets/frame/codegen.py, widgets/grid/codegen.py, widgets/grid/lisp_codegen.py, widgets/grid/perl_codegen.py, widgets/menubar/codegen.py, widgets/menubar/lisp_codegen.py, widgets/menubar/perl_codegen.py, widgets/notebook/codegen.py, widgets/notebook/lisp_codegen.py, widgets/notebook/perl_codegen.py, widgets/spin_ctrl/codegen.py, widgets/splitter_window/codegen.py, widgets/splitter_window/lisp_codegen.py, widgets/splitter_window/perl_codegen.py, widgets/toolbar/codegen.py, widgets/toolbar/lisp_codegen.py, widgets/toolbar/perl_codegen.py: Rework widget writer to use code generator via class attribute [b44700241add] * msgdialog.py, widgets/custom_widget/custom_widget.py, widgets/list_ctrl/list_ctrl.py, widgets/menubar/menubar.py, widgets/toolbar/toolbar.py, widgets/tree_ctrl/tree_ctrl.py: Replace wxSUNKEN_BORDER into wxBORDER_SUNKEN [6facebbd40d7] 2014-09-25 Carsten Grohmann * application.py, common.py, docs/tech_notes.txt, edit_sizers/edit_sizers.py, edit_widget.py, edit_windows.py, events_mixin.py, layout_option_property.py, misc.py, tests/__init__.py, tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/test_codegen.py, tests/test_gui.py, wcodegen/__init__.py, wcodegen/dialogs.py, widget_properties.py, widgets/bitmap_button/bitmap_button.py, widgets/bitmap_button/codegen.py, widgets/bitmap_button/lisp_codegen.py, widgets/bitmap_button/perl_codegen.py, widgets/bitmap_button/wconfig.py, widgets/button/button.py, widgets/button/wconfig.py, widgets/calendar_ctrl/calendar_ctrl.py, widgets/calendar_ctrl/wconfig.py, widgets/checkbox/checkbox.py, widgets/checkbox/wconfig.py, widgets/choice/choice.py, widgets/combo_box/combo_box.py, widgets/combo_box/wconfig.py, widgets/custom_widget/custom_widget.py, widgets/datepicker_ctrl/datepicker_ctrl.py, widgets/datepicker_ctrl/wconfig.py, widgets/dialog/dialog.py, widgets/dialog/wconfig.py, widgets/frame/codegen.py, widgets/frame/frame.py, widgets/frame/lisp_codegen.py, widgets/frame/perl_codegen.py, widgets/frame/wconfig.py, widgets/gauge/gauge.py, widgets/gauge/wconfig.py, widgets/grid/grid.py, widgets/hyperlink_ctrl/hyperlink_ctrl.py, widgets/hyperlink_ctrl/wconfig.py, widgets/list_box/list_box.py, widgets/list_box/wconfig.py, widgets/list_ctrl/list_ctrl.py, widgets/list_ctrl/wconfig.py, widgets/menubar/menubar.py, widgets/notebook/codegen.py, widgets/notebook/lisp_codegen.py, widgets/notebook/notebook.py, widgets/notebook/perl_codegen.py, widgets/notebook/wconfig.py, widgets/panel/codegen.py, widgets/panel/lisp_codegen.py, widgets/panel/panel.py, widgets/panel/perl_codegen.py, widgets/panel/wconfig.py, widgets/radio_box/radio_box.py, widgets/radio_button/radio_button.py, widgets/radio_button/wconfig.py, widgets/slider/slider.py, widgets/slider/wconfig.py, widgets/spacer/spacer.py, widgets/spin_button/spin_button.py, widgets/spin_button/wconfig.py, widgets/spin_ctrl/spin_ctrl.py, widgets/spin_ctrl/wconfig.py, widgets/splitter_window/codegen.py, widgets/splitter_window/lisp_codegen.py, widgets/splitter_window/perl_codegen.py, widgets/splitter_window/splitter_window.py, widgets/splitter_window/wconfig.py, widgets/static_bitmap/static_bitmap.py, widgets/static_bitmap/wconfig.py, widgets/static_line/static_line.py, widgets/static_line/wconfig.py, widgets/static_text/static_text.py, widgets/static_text/wconfig.py, widgets/statusbar/__init__.py, widgets/statusbar/codegen.py, widgets/statusbar/lisp_codegen.py, widgets/statusbar/perl_codegen.py, widgets/statusbar/statusbar.py, widgets/statusbar/wconfig.py, widgets/text_ctrl/text_ctrl.py, widgets/text_ctrl/wconfig.py, widgets/toggle_button/toggle_button.py, widgets/toolbar/codegen.py, widgets/toolbar/lisp_codegen.py, widgets/toolbar/perl_codegen.py, widgets/toolbar/toolbar.py, widgets/toolbar/wconfig.py, widgets/tree_ctrl/tree_ctrl.py, widgets/tree_ctrl/wconfig.py, widgets/widgets.txt, wxglade.py, xml_parse.py: Rework style handling to use style names. Most positions use style names instead of a combination of style names and style values now. This enables wxGlade to handle old (and ancient) styles like wxADJUST_MINSIZE even if underlaying wxPython don't know the styles. This change changes allow wxGlade to run on wxPython3 and generate code for wxPython2.8 and reverse later after all styles and attributes are adapted. [903c73d6a86b] 2014-09-14 Carsten Grohmann * xml_parse.py: Minor changes to improve debugging [e312435ddced] * main.py: Improve exception message generated during loading a file [d4367cecd0cc] 2014-09-12 Carsten Grohmann * codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/perl_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, tests/casefiles/PyOgg1_oldnamespace.py, tests/test_codegen.py, wcodegen/__init__.py: Reorg code generation and start removal of old style python imports [0c167cfc2d31] 2014-09-11 Carsten Grohmann * Makefile: Change handling of epydoc options in Makefile [3ee5492a129d] 2014-09-09 Carsten Grohmann * codegen/__init__.py, codegen/xrc_codegen.py, edit_sizers/edit_sizers.py, tests/__init__.py, tests/test_codegen.py, tests/test_gui.py, wcodegen/__init__.py, widgets/panel/panel.py, widgets/static_bitmap/static_bitmap.py: Improve copying instances ... [cf594e9dce9a] 2014-09-08 Carsten Grohmann * clipboard.py, codegen/__init__.py, codegen/cpp_codegen.py, codegen/xrc_codegen.py, log.py, main.py, misc.py, tests/__init__.py, tests/test_codegen.py, tests/test_gui.py, widgets/custom_widget/codegen.py, xml_parse.py: Replace cStringIO by StringIO because StringIO supports Unicode (taken from ff7561dc0004) [b38aa987293f] 2014-09-05 Carsten Grohmann * tests/__init__.py, tests/test_gui.py: Split test initialisation into setUpClass() and setUp() [6d6164dcd29d] 2014-09-03 Carsten Grohmann * NEWS.txt, codegen/perl_codegen.py: Fix bug in generation of valid hash keys for Perl [3c7eee26186c] * codegen/__init__.py, tests/test_codegen.py: Add BaseLangCodeWriter.copy() to create instance copies This function should be used to rework styles update in graphical editor [5cd58e863585] * codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/perl_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, config.py, main.py: Add more default values used during initialising code generators [769f0f046df4] 2014-09-02 Carsten Grohmann * common.py, main.py, wxglade.py: Unite the four steps to initialise code generators [d6dc3728adfa] 2014-08-31 Carsten Grohmann * setup.py: Include wxglade.pyw into release packages [555db48f7457] * Makefile: Change manpage XSL [430d94e5a681] 2014-08-28 Carsten Grohmann * Makefile: Use python2 in Makefile too (grafted from 737ac2bfe7ad81b3423f0fde6b9b329d1bdf6098) [039aff30fc1e] * Makefile: Use python2 in Makefile too [737ac2bfe7ad] * wxglade.py: Use wxPython 2.8 - only and always The GUI isn't wxPython 3.0 ready yet. (grafted from 5bbecbbca1c67bd2a2d9c48258b4bbdd7b3b5665) [585b06033e77] * test.py: Use wxPython 2.8 for GUI tests too (grafted from b221e052e9111a99ddb2dbb8743f5b685a3c69cb) [979b019391b5] * wxglade: Use python2 interpreter instead of just python (grafted from 081a452ad96441bbba62e494279f75d77710a1b3) [64d3266fa6ce] * test.py, wxglade.py, wxglade.pyw, xrc2wxg.py: Change shebang to start Python2 always. That's useful for systems with Python3 as default (grafted from b01e80fc1fe3bb873afa1e9e7f3c1d4e95a653be) [539eaf1f2420] 2014-08-26 Carsten Grohmann * codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/py_codegen.py, common.py, edit_windows.py, tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/CPPOgg1.cpp, tests/casefiles/CPPOgg1.wxg, tests/casefiles/CPPOgg2.wxg, tests/casefiles/CPPOgg2_MyDialog.cpp, tests/casefiles/CPPOgg2_MyDialog.h, tests/casefiles/CPPOgg2_MyFrame.cpp, tests/casefiles/CPPOgg2_MyFrame.h, tests/casefiles/CPPOgg3.cpp, tests/casefiles/CPP_Preferences.cpp, tests/casefiles/CPP_Preferences.h, tests/casefiles/CPP_Preferences.wxg, tests/casefiles/CPP_wxCalendarCtrl.cpp, tests/casefiles/CPP_wxCalendarCtrl.h, tests/casefiles/CPP_wxCalendarCtrl.wxg, tests/casefiles/ComplexExample.cpp, tests/casefiles/ComplexExample.lisp, tests/casefiles/ComplexExample.pl, tests/casefiles/ComplexExample.py, tests/casefiles/ComplexExample_30.cpp, tests/casefiles/ComplexExample_30.lisp, tests/casefiles/ComplexExample_30.pl, tests/casefiles/ComplexExample_30.py, tests/casefiles/LispOgg1.lisp, tests/casefiles/LispOgg1.wxg, tests/casefiles/LispOgg2.wxg, tests/casefiles/LispOgg2_MyDialog.lisp, tests/casefiles/LispOgg2_MyFrame.lisp, tests/casefiles/LispOgg3.lisp, tests/casefiles/LispOgg3.wxg, tests/casefiles/Lisp_Preferences.lisp, tests/casefiles/Lisp_Preferences.wxg, tests/casefiles/Notebook_w_tabs.wxg, tests/casefiles/Notebook_wo_tabs.wxg, tests/casefiles/Perl_Preferences.pl, tests/casefiles/Perl_Preferences.wxg, tests/casefiles/PlOgg1.pl, tests/casefiles/PlOgg1.wxg, tests/casefiles/PlOgg2.wxg, tests/casefiles/PlOgg2_MyDialog.pm, tests/casefiles/PlOgg2_MyFrame.pm, tests/casefiles/PlOgg3.pl, tests/casefiles/Preferences.wxg, tests/casefiles/PyOgg1.py, tests/casefiles/PyOgg1.wxg, tests/casefiles/PyOgg1_oldnamespace.py, tests/casefiles/PyOgg2.wxg, tests/casefiles/PyOgg2_MyDialog.py, tests/casefiles/PyOgg2_MyFrame.py, tests/casefiles/PyOgg2_app.py, tests/casefiles/PyOgg3.py, tests/casefiles/Python_Preferences.py, tests/casefiles/Python_Preferences.wxg, tests/casefiles/Sizers_classattr.cpp, tests/casefiles/Sizers_classattr.lisp, tests/casefiles/Sizers_classattr.pl, tests/casefiles/Sizers_classattr.py, tests/casefiles/Sizers_no_classattr.cpp, tests/casefiles/Sizers_no_classattr.lisp, tests/casefiles/Sizers_no_classattr.pl, tests/casefiles/Sizers_no_classattr.py, tests/casefiles/styleless- dialog.cpp, tests/casefiles/styleless-dialog.py, tests/test_codegen.py, tests/test_gui.py, wcodegen/__init__.py, widgets/dialog/codegen.py, widgets/dialog/wconfig.py, widgets/frame/wconfig.py, widgets/hyperlink_ctrl/config.py, widgets/hyperlink_ctrl/wconfig.py, widgets/notebook/codegen.py, widgets/notebook/lisp_codegen.py, widgets/notebook/notebook.py, widgets/notebook/perl_codegen.py, widgets/splitter_window/wconfig.py: Rework formatting flags Now we support: - removal of duplicate flags - removal of flags that are part of others flags - recombine flags from parts e.g. wxALL from wxLEFT+wxRIGHT+wxTOP+wxBOTTOM - renameing of flags [8e8fb2aa5982] 2014-08-21 Carsten Grohmann * edit_windows.py, tree.py: Use built-in set() instead of sets module [cb7a2d8c7db6] * widgets/notebook/notebook.py: Fix wrong initialisation sequence for graphical notebook editor. This bug has been introduced with changeset 1396:fbf87e4590e7 "Unify style handling code in widgets GUI elements" [033dc86a05ec] * log.py: Don't show non-printable values in exception handler [cd2ee3030556] * log.py: Merge exception handler from default branch [452acb298e2c] 2014-08-20 Carsten Grohmann * tests/test_gui.py: Extend error messages in GUI unittests [2d37675babb3] 2014-08-17 Carsten Grohmann * codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/perl_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, common.py, docs/tech_notes.txt, edit_sizers/__init__.py, edit_sizers/cpp_sizers_codegen.py, edit_sizers/edit_sizers.py, edit_sizers/py_sizers_codegen.py, edit_sizers/sizers_codegen.py, edit_sizers/xrc_sizers_codegen.py, tests/test_codegen.py, wcodegen/__init__.py: Unify code writer and widget initialisation sequence This commit changes the initialisation sequence to 0) load widget configuation (already implemented in 1421:6167430196c8) 1) load and initialise language code writer 2) load and initialise widget code writer 3) load and initialise sizer Earlier the steps 1), 2) and 3) was merged for Perl and Lisp but not for Python, C++ and XRC. Now the sequence is the same for all languages. [1892694b1b59] 2014-08-14 Carsten Grohmann * codegen/__init__.py, common.py, edit_windows.py, main.py, misc.py, tests/casefiles/HyperlinkCtrl_26.cpp, tests/casefiles/HyperlinkCtrl_26.lisp, tests/casefiles/HyperlinkCtrl_26.pl, tests/casefiles/HyperlinkCtrl_26.py, tests/test_codegen.py, wcodegen/__init__.py, widgets/hyperlink_ctrl/codegen.py, widgets/hyperlink_ctrl/config.py, widgets/hyperlink_ctrl/hyperlink_ctrl.py, widgets/hyperlink_ctrl/lisp_codegen.py, widgets/hyperlink_ctrl/perl_codegen.py, wxglade.py: Introduce separation of widget settings in a config module [6167430196c8] 2014-08-11 Carsten Grohmann * tests/test_external.py: Add some tests for external code Currently just one test for deep-copying of OrderedDict() is implemented. [83bdfdfa39f0] 2014-08-04 Carsten Grohmann * common.py, wcodegen/__init__.py, widgets/bitmap_button/codegen.py, widgets/bitmap_button/lisp_codegen.py, widgets/bitmap_button/perl_codegen.py, widgets/button/codegen.py, widgets/button/lisp_codegen.py, widgets/button/perl_codegen.py, widgets/calendar_ctrl/codegen.py, widgets/calendar_ctrl/perl_codegen.py, widgets/checkbox/codegen.py, widgets/checkbox/lisp_codegen.py, widgets/checkbox/perl_codegen.py, widgets/choice/codegen.py, widgets/choice/lisp_codegen.py, widgets/choice/perl_codegen.py, widgets/combo_box/codegen.py, widgets/combo_box/lisp_codegen.py, widgets/combo_box/perl_codegen.py, widgets/custom_widget/codegen.py, widgets/custom_widget/lisp_codegen.py, widgets/custom_widget/perl_codegen.py, widgets/datepicker_ctrl/codegen.py, widgets/datepicker_ctrl/lisp_codegen.py, widgets/datepicker_ctrl/perl_codegen.py, widgets/dialog/codegen.py, widgets/dialog/lisp_codegen.py, widgets/dialog/perl_codegen.py, widgets/gauge/codegen.py, widgets/gauge/lisp_codegen.py, widgets/gauge/perl_codegen.py, widgets/grid/codegen.py, widgets/grid/lisp_codegen.py, widgets/grid/perl_codegen.py, widgets/hyperlink_ctrl/codegen.py, widgets/hyperlink_ctrl/lisp_codegen.py, widgets/hyperlink_ctrl/perl_codegen.py, widgets/list_box/codegen.py, widgets/list_box/lisp_codegen.py, widgets/list_box/perl_codegen.py, widgets/list_ctrl/codegen.py, widgets/list_ctrl/lisp_codegen.py, widgets/list_ctrl/perl_codegen.py, widgets/menubar/codegen.py, widgets/menubar/lisp_codegen.py, widgets/menubar/perl_codegen.py, widgets/notebook/codegen.py, widgets/notebook/lisp_codegen.py, widgets/notebook/perl_codegen.py, widgets/panel/codegen.py, widgets/panel/lisp_codegen.py, widgets/panel/perl_codegen.py, widgets/radio_box/codegen.py, widgets/radio_box/lisp_codegen.py, widgets/radio_box/perl_codegen.py, widgets/radio_button/codegen.py, widgets/radio_button/lisp_codegen.py, widgets/radio_button/perl_codegen.py, widgets/slider/codegen.py, widgets/slider/lisp_codegen.py, widgets/slider/perl_codegen.py, widgets/spacer/codegen.py, widgets/spacer/lisp_codegen.py, widgets/spacer/perl_codegen.py, widgets/spin_button/codegen.py, widgets/spin_button/lisp_codegen.py, widgets/spin_button/perl_codegen.py, widgets/spin_ctrl/codegen.py, widgets/spin_ctrl/lisp_codegen.py, widgets/spin_ctrl/perl_codegen.py, widgets/splitter_window/codegen.py, widgets/splitter_window/lisp_codegen.py, widgets/splitter_window/perl_codegen.py, widgets/static_bitmap/codegen.py, widgets/static_bitmap/lisp_codegen.py, widgets/static_bitmap/perl_codegen.py, widgets/static_line/codegen.py, widgets/static_line/lisp_codegen.py, widgets/static_line/perl_codegen.py, widgets/static_text/codegen.py, widgets/static_text/lisp_codegen.py, widgets/static_text/perl_codegen.py, widgets/text_ctrl/codegen.py, widgets/text_ctrl/lisp_codegen.py, widgets/text_ctrl/perl_codegen.py, widgets/toggle_button/codegen.py, widgets/toggle_button/lisp_codegen.py, widgets/toggle_button/perl_codegen.py, widgets/toolbar/codegen.py, widgets/toolbar/lisp_codegen.py, widgets/toolbar/perl_codegen.py, widgets/tree_ctrl/codegen.py, widgets/tree_ctrl/lisp_codegen.py, widgets/tree_ctrl/perl_codegen.py: Simplify registration of widget code generators [4fcb55cb7011] 2014-08-02 Carsten Grohmann * test.py: Use wxPython 2.8 for GUI tests too [6f429d71d767] * test.py: Use wxPython 2.8 for GUI tests too [b221e052e911] * main.py: Improve exception handling while loading data from file-like object [45737ceccc25] 2014-07-30 Carsten Grohmann * docs/html/apa.html, docs/html/apb.html, docs/html/apd.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch01s07.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch02s06.html, docs/html/ch02s07.html, docs/html/ch02s08.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch04.html, docs/html/ch04s03.html, docs/html/ch05.html, docs/html/ch06.html, docs/html/ch06s02.html, docs/html/ch06s03.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/pdf/manual.pdf, docs/src/manual.xml: Update documentation about application start code [5ecf9c2d7abb] * NEWS.txt, codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, tests/casefiles/CPP_Preferences.cpp, tests/casefiles/CPP_wxCalendarCtrl.cpp, tests/casefiles/CalendarCtrl.cpp, tests/casefiles/CalendarCtrl.pl, tests/casefiles/CalendarCtrl.py, tests/casefiles/Gauge.cpp, tests/casefiles/Gauge.lisp, tests/casefiles/Gauge.pl, tests/casefiles/Gauge.py, tests/casefiles/Grid.cpp, tests/casefiles/Grid.lisp, tests/casefiles/Grid.pl, tests/casefiles/Grid.py, tests/casefiles/Lisp_Preferences.lisp, tests/casefiles/Lisp_wxBitmapButton.lisp, tests/casefiles/Perl_Preferences.pl, tests/casefiles/Python_Preferences.py, tests/casefiles/bug163.cpp, tests/casefiles/bug163.lisp, tests/casefiles/bug163.pl, tests/casefiles/bug163.py, tests/casefiles/styleless-dialog.cpp, tests/casefiles/styleless-dialog.lisp, tests/casefiles/styleless- dialog.pl, tests/casefiles/styleless-dialog.py, tests/test_codegen.py: Fix wrong conditions to generate application start code (sf bug #161) [7a070963581f] 2014-07-28 Carsten Grohmann * docs/src/manual.xml: Change shebang from python to python2 in XRC example [b9bc65f122f9] 2014-06-23 Carsten Grohmann * NEWS.txt, codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, tests/casefiles/bug163.cpp, tests/casefiles/bug163.h, tests/casefiles/bug163.lisp, tests/casefiles/bug163.pl, tests/casefiles/bug163.py, tests/casefiles/bug163.wxg, tests/casefiles/bug163.xrc, tests/test_bugs.py: Don't convert first char of a XRC extraproperty to upper case (sf bug #163) [17926443bae9] * widgets/custom_widget/codegen.py: Show warning about malformed arguments in Custom Widget XRC code writer [3c39f60a800b] 2014-06-22 Carsten Grohmann * tests/casefiles/import_test.wxg, tests/casefiles/import_test.xrc, xrc2wxg.py: Use "-1" instead of -1 for undefined statusbar widths during XRC import [b98f8bd97d5e] 2014-06-21 Carsten Grohmann * tests/casefiles/import_test.wxg, tests/casefiles/import_test.xrc, xrc2wxg.py: Fix value of enabled/disabled property during import from XRC [bbcff7f59ac5] * NEWS.txt, tests/casefiles/import_test.wxg, tests/casefiles/import_test.xrc, tests/test_codegen.py, xrc2wxg.py: Fix import of wxStatusbar from XRC [447dd5b41668] 2014-06-20 Carsten Grohmann * NEWS.txt, tests/casefiles/import_test.wxg, xrc2wxg.py: Fix wrong menu generation after importing from XRC file [98d5b63dcffc] 2014-06-18 Carsten Grohmann * NEWS.txt, tests/casefiles/import_test.wxg, tests/casefiles/import_test.xrc, xrc2wxg.py: Fix wrong wxMenuItem property name after importing from XRC file [cbcb8e6818f2] * tests/casefiles/import_test.wxg, tests/casefiles/import_test.xrc, tests/test_codegen.py, xrc2wxg.py: Code reorg and documentation improvements as well as a added test case [054015f64562] 2014-05-28 Carsten Grohmann * Closed agriggio branch [cf75bd597a48] * Closed v0-1-3devel branch [084f0b95fcce] * Closed HEAD branch [6296183d519e] * clipboard.py, codegen/__init__.py, codegen/cpp_codegen.py, codegen/xrc_codegen.py, log.py, main.py, misc.py, tests/__init__.py, tests/test_codegen.py, tests/test_gui.py, widgets/custom_widget/codegen.py, xml_parse.py: Replace cStringIO by StringIO because StringIO supports Unicode [ff7561dc0004] 2014-04-23 Carsten Grohmann * Created DEV_UNICODE [f5782c1899ab] 2014-04-19 Carsten Grohmann * log.py: Adjust logging code [8075d5eaea99] 2014-03-05 Carsten Grohmann * wxglade.py: Use wxPython 2.8 - only and always The GUI isn't wxPython 3.0 ready yet. (grafted from 5bbecbbca1c67bd2a2d9c48258b4bbdd7b3b5665) [acbfabfba67b] 2014-03-01 Carsten Grohmann * tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.h, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_28.xrc, tests/test_gui.py: Add tests for the unified style handling [a73b0ac1beb8] * edit_sizers/edit_sizers.py, edit_windows.py, widget_properties.py, widgets/bitmap_button/bitmap_button.py, widgets/button/button.py, widgets/calendar_ctrl/calendar_ctrl.py, widgets/checkbox/checkbox.py, widgets/choice/choice.py, widgets/combo_box/combo_box.py, widgets/custom_widget/custom_widget.py, widgets/datepicker_ctrl/datepicker_ctrl.py, widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/gauge/gauge.py, widgets/grid/grid.py, widgets/hyperlink_ctrl/hyperlink_ctrl.py, widgets/list_box/list_box.py, widgets/list_ctrl/list_ctrl.py, widgets/menubar/menubar.py, widgets/notebook/notebook.py, widgets/panel/panel.py, widgets/radio_box/radio_box.py, widgets/radio_button/radio_button.py, widgets/slider/slider.py, widgets/spacer/spacer.py, widgets/spin_button/spin_button.py, widgets/spin_ctrl/spin_ctrl.py, widgets/splitter_window/splitter_window.py, widgets/static_bitmap/static_bitmap.py, widgets/static_line/static_line.py, widgets/static_text/static_text.py, widgets/text_ctrl/text_ctrl.py, widgets/toggle_button/toggle_button.py, widgets/toolbar/toolbar.py, widgets/tree_ctrl/tree_ctrl.py: Unify style handling code in widgets GUI elements [fbf87e4590e7] * common.py: fixed indentation (cosmetic change only) [7f1bc5489cc8] 2014-02-25 Carsten Grohmann * wxglade.py: Use wxPython 2.8 - only and always The GUI isn't wxPython 3.0 ready yet. [5bbecbbca1c6] 2014-02-18 Carsten Grohmann * common.py: Catch OS errors during renaming the app directory (Thanks to Davorin) [e9544789b057] 2014-02-12 Carsten Grohmann * test.py, tests/__init__.py, tests/test_gui.py: Improve test initialisation to run tests with wxPython 2.8 currently The initialisation order of wxPython was unexpected if if wxPython 2.8 and wxPython 3.0 are available. [ad99879a5233] 2014-02-11 Carsten Grohmann * tests/test_gui.py: Add new GUI test case [e29d03af61ba] 2014-02-01 Carsten Grohmann * tests/__init__.py, tests/casefiles/AllWidgets_28.pl, tests/casefiles/CalendarCtrl.pl, tests/casefiles/ComplexExample.pl, tests/casefiles/ComplexExample_30.pl, tests/casefiles/FontColour.pl, tests/casefiles/Gauge.pl, tests/casefiles/Grid.pl, tests/casefiles/HyperlinkCtrl_26.pl, tests/casefiles/HyperlinkCtrl_28.pl, tests/casefiles/Perl_Preferences.pl, tests/casefiles/PlOgg1.pl, tests/casefiles/PlOgg2_MyDialog.pm, tests/casefiles/PlOgg2_MyFrame.pm, tests/casefiles/PlOgg2_app.pl, tests/casefiles/PlOgg3.pl, tests/casefiles/Sizers_classattr.pl, tests/casefiles/Sizers_no_classattr.pl, tests/casefiles/add_class_inplace_extended.pl, tests/casefiles/add_class_inplace_orig.pl, tests/casefiles/no_suitable_writer.pl, tests/casefiles/remove_class_inplace_expected.pl, tests/casefiles/remove_class_inplace_input.pl, tests/casefiles /styleless-dialog.pl: Change indentation inside Perl test cases from 8 to the default of 4. This change simplifies the generation of test files because the default indentation is 4 always. [192e520ed695] 2014-01-31 Carsten Grohmann * NEWS.txt, tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.h, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_28.xrc, widgets/datepicker_ctrl/lisp_codegen.py, widgets/datepicker_ctrl/perl_codegen.py: Add Lisp and Perl support for wxDatePickerCtrl [69ac59dd5068] 2014-01-29 Carsten Grohmann * docs/html/apa.html, docs/html/apb.html, docs/html/apc.html, docs/html/apd.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch01s07.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch02s06.html, docs/html/ch02s07.html, docs/html/ch02s08.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch04.html, docs/html/ch04s02.html, docs/html/ch04s03.html, docs/html/ch05.html, docs/html/ch05s02.html, docs/html/ch05s03.html, docs/html/ch05s04.html, docs/html/ch06.html, docs/html/ch06s02.html, docs/html/ch06s03.html, docs/html/error_dialog.png, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/pdf/manual.pdf, docs/src/error_dialog.png, docs/src/manual.xml: Add a section about installing and designing own widgets primarily The section is still incomplete but it should show current changes already. [165de0ffff96] 2014-01-25 Carsten Grohmann * Makefile, NEWS.txt, application.py, bugdialog.py, bugdialog_ui.py, configdialog.py, main.py, res/bugdialog_ui.wxg: Improve the internal error dialog [000d787786a7] 2014-01-19 Carsten Grohmann * misc.py, widgets/button/button.py, widgets/choice/choice.py, widgets/combo_box/combo_box.py, widgets/hyperlink_ctrl/hyperlink_ctrl.py, widgets/list_box/list_box.py, widgets/menubar/menubar.py, widgets/radio_box/radio_box.py, widgets/radio_button/radio_button.py, widgets/static_text/static_text.py, widgets/toggle_button/toggle_button.py: Rename misc._encode to misc.encode [ead08f134cf2] * tests/casefiles/AllWidgets_28.cpp, tests/casefiles/AllWidgets_28.h, tests/casefiles/AllWidgets_28.lisp, tests/casefiles/AllWidgets_28.pl, tests/casefiles/AllWidgets_28.py, tests/casefiles/AllWidgets_28.wxg, tests/casefiles/AllWidgets_28.xrc, tests/casefiles/icon.xpm, tests/test_codegen.py: Add new tests [299197b0e082] * NEWS.txt, tests/casefiles/CPPOgg1.cpp, tests/casefiles/CPPOgg2_MyDialog.cpp, tests/casefiles/CPPOgg3.cpp, tests/casefiles/CPP_Preferences.cpp, tests/casefiles/CalendarCtrl.pl, tests/casefiles/ComplexExample.cpp, tests/casefiles/ComplexExample.lisp, tests/casefiles/ComplexExample.pl, tests/casefiles/ComplexExample.py, tests/casefiles/ComplexExample_30.cpp, tests/casefiles/ComplexExample_30.lisp, tests/casefiles/ComplexExample_30.pl, tests/casefiles/ComplexExample_30.py, tests/casefiles/FontColour.lisp, tests/casefiles/Gauge.lisp, tests/casefiles/Gauge.pl, tests/casefiles/Grid.lisp, tests/casefiles/HyperlinkCtrl_26.lisp, tests/casefiles/HyperlinkCtrl_28.lisp, tests/casefiles/LispOgg1.lisp, tests/casefiles/LispOgg2_MyDialog.lisp, tests/casefiles/LispOgg2_MyFrame.lisp, tests/casefiles/LispOgg3.lisp, tests/casefiles/Lisp_Preferences.lisp, tests/casefiles/Lisp_wxBitmapButton.lisp, tests/casefiles/Perl_Preferences.pl, tests/casefiles/PlOgg1.pl, tests/casefiles/PlOgg2_MyDialog.pm, tests/casefiles/PlOgg2_MyFrame.pm, tests/casefiles/PlOgg3.pl, tests/casefiles/Sizers_classattr.cpp, tests/casefiles/Sizers_classattr.lisp, tests/casefiles/Sizers_classattr.pl, tests/casefiles/Sizers_no_classattr.cpp, tests/casefiles/Sizers_no_classattr.lisp, tests/casefiles/Sizers_no_classattr.pl, tests/casefiles/add_class_inplace_extended.lisp, tests/casefiles/add_class_inplace_extended.pl, tests/casefiles/add_class_inplace_orig.lisp, tests/casefiles/add_class_inplace_orig.pl, tests/casefiles/no_suitable_writer.lisp, tests/casefiles/remove_class_inplace_expected.lisp, tests/casefiles/remove_class_inplace_expected.pl, tests/casefiles/remove_class_inplace_input.lisp, tests/casefiles/remove_class_inplace_input.pl, tests/casefiles /styleless-dialog.lisp, wcodegen/__init__.py, widgets/button/codegen.py, widgets/button/lisp_codegen.py, widgets/button/perl_codegen.py, widgets/calendar_ctrl/codegen.py, widgets/calendar_ctrl/perl_codegen.py, widgets/checkbox/codegen.py, widgets/checkbox/lisp_codegen.py, widgets/checkbox/perl_codegen.py, widgets/choice/codegen.py, widgets/choice/lisp_codegen.py, widgets/choice/perl_codegen.py, widgets/combo_box/codegen.py, widgets/combo_box/lisp_codegen.py, widgets/combo_box/perl_codegen.py, widgets/custom_widget/codegen.py, widgets/datepicker_ctrl/codegen.py, widgets/dialog/codegen.py, widgets/dialog/lisp_codegen.py, widgets/dialog/perl_codegen.py, widgets/frame/codegen.py, widgets/frame/lisp_codegen.py, widgets/frame/perl_codegen.py, widgets/gauge/codegen.py, widgets/gauge/lisp_codegen.py, widgets/gauge/perl_codegen.py, widgets/grid/codegen.py, widgets/hyperlink_ctrl/codegen.py, widgets/hyperlink_ctrl/lisp_codegen.py, widgets/hyperlink_ctrl/perl_codegen.py, widgets/list_box/codegen.py, widgets/list_box/lisp_codegen.py, widgets/list_box/perl_codegen.py, widgets/list_ctrl/codegen.py, widgets/list_ctrl/lisp_codegen.py, widgets/list_ctrl/perl_codegen.py, widgets/menubar/codegen.py, widgets/menubar/lisp_codegen.py, widgets/menubar/perl_codegen.py, widgets/radio_box/codegen.py, widgets/radio_box/lisp_codegen.py, widgets/radio_box/perl_codegen.py, widgets/radio_button/codegen.py, widgets/radio_button/lisp_codegen.py, widgets/radio_button/perl_codegen.py, widgets/slider/codegen.py, widgets/slider/lisp_codegen.py, widgets/slider/perl_codegen.py, widgets/spacer/codegen.py, widgets/spacer/lisp_codegen.py, widgets/spacer/perl_codegen.py, widgets/spin_button/codegen.py, widgets/spin_button/lisp_codegen.py, widgets/spin_button/perl_codegen.py, widgets/spin_ctrl/codegen.py, widgets/spin_ctrl/lisp_codegen.py, widgets/spin_ctrl/perl_codegen.py, widgets/static_bitmap/codegen.py, widgets/static_bitmap/lisp_codegen.py, widgets/static_bitmap/perl_codegen.py, widgets/static_line/codegen.py, widgets/static_line/lisp_codegen.py, widgets/static_line/perl_codegen.py, widgets/static_text/codegen.py, widgets/static_text/lisp_codegen.py, widgets/static_text/perl_codegen.py, widgets/static_text/static_text.py, widgets/text_ctrl/codegen.py, widgets/text_ctrl/lisp_codegen.py, widgets/text_ctrl/perl_codegen.py, widgets/toggle_button/codegen.py, widgets/toggle_button/lisp_codegen.py, widgets/toggle_button/perl_codegen.py, widgets/tree_ctrl/codegen.py, widgets/tree_ctrl/lisp_codegen.py, widgets/tree_ctrl/perl_codegen.py: Unify the code generation of widget specific code. That causes minor changes in the generated code. Parallel two wrong Lisp statement in wxHyperlinkCtrl and wxFrame has been corrected. [ab887740ee3c] * codegen/xrc_codegen.py: Typo [322b754b06a4] 2014-01-17 Carsten Grohmann * codegen/pl_codegen.py: Add more constants to Perl code generator [b345b119539b] 2014-01-16 Carsten Grohmann * codegen/__init__.py: Documentation typos [534610ca1bac] 2014-01-15 Carsten Grohmann * widgets/radio_box/radio_box.py: Change initial dimension of a wxRadioBox from 0 to 1 [21d67e7289f2] 2014-01-09 Carsten Grohmann * log.py: Remove gettext usage from exception handler [894e98ab3259] 2014-01-05 Carsten Grohmann * license.txt: Add myself to license file [16cada1aa8c5] 2014-01-01 Carsten Grohmann * NEWS.txt, codegen/pl_codegen.py: Fix bug in generation of valid hash keys for Perl [33daddbba93e] 2013-12-27 Carsten Grohmann * log.py: Increase robustness of exception logger [956750c8c23f] 2013-12-25 Carsten Grohmann * widgets/bitmap_button/__init__.py, widgets/button/__init__.py, widgets/calendar_ctrl/__init__.py, widgets/checkbox/__init__.py, widgets/choice/__init__.py, widgets/combo_box/__init__.py, widgets/custom_widget/__init__.py, widgets/datepicker_ctrl/__init__.py, widgets/dialog/__init__.py, widgets/frame/__init__.py, widgets/gauge/__init__.py, widgets/grid/__init__.py, widgets/hyperlink_ctrl/__init__.py, widgets/list_box/__init__.py, widgets/list_ctrl/__init__.py, widgets/notebook/__init__.py, widgets/radio_box/__init__.py, widgets/radio_button/__init__.py, widgets/slider/__init__.py, widgets/spacer/__init__.py, widgets/spin_button/__init__.py, widgets/spin_ctrl/__init__.py, widgets/splitter_window/__init__.py, widgets/static_bitmap/__init__.py, widgets/static_line/__init__.py, widgets/static_text/__init__.py, widgets/text_ctrl/__init__.py, widgets/toggle_button/__init__.py, widgets/tree_ctrl/__init__.py: Remove default widget initialisation code. The widget default initialisation will be performed by the widget loader now. [e6f4126c7a62] * NEWS.txt: Typos [2c62158e7b2b] 2013-12-20 Carsten Grohmann * log.py: Extent exception handler by reversing the order of logged stack frames and by including more general information (like version numbers and platform infos). [f65e4edb0e40] * about.py, config.py, main.py, wxglade.py: Store wx version in config.wx_version [5480df7e0465] * config.py: Minor source documentation update for config.use_gui [69abbef37c70] * codegen/__init__.py, common.py: Unity code to load and initialise widgets. [a261491079b9] 2013-12-11 Carsten Grohmann * misc.py: Typo in docstring [579dad455f7f] * docs/html/apa.html, docs/html/apb.html, docs/html/apd.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch01s07.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch02s06.html, docs/html/ch02s07.html, docs/html/ch02s08.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch04.html, docs/html/ch04s03.html, docs/html/ch05.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/preferences.png, docs/pdf/manual.pdf, docs/src/preferences.png: Updated screenshot of preferences dialog [b0c41d97a53b] * NEWS.txt, codegen/__init__.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, common.py: Improve widget import to be able to import widgets from ZIP files The previous implementation of ZIP file imports doesn't work for code generators. The new implementation used the same code (copied) to load GUI part of a widget as well as the widget code generators from a ZIP file. Imports from ZIP files have a higher priority than traditional imports. This is helpful for ad-hoc fixes. [110b485dafe0] * Makefile: Adapt Makefile to new pylint version [95e2985d6bde] 2013-12-09 Carsten Grohmann * common.py: PEP8: rename variable id to widget_id [2f773100ddb7] 2013-12-06 Carsten Grohmann * wxglade.py: Show log file during application startup similar to other files [67fa55ddb6de] * configUI.py, docs/html/apa.html, docs/html/apb.html, docs/html/apd.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch01s07.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch02s06.html, docs/html/ch02s07.html, docs/html/ch02s08.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch04.html, docs/html/ch04s03.html, docs/html/ch05.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/preferences.png, docs/pdf/manual.pdf, docs/src/preferences.png, res/preferences.wxg: Minor layout changes in preferences dialog [6297d871b8da] * wxglade: Use python2 interpreter instead of just python [081a452ad964] * test.py, wxglade.py, wxglade.pyw, xrc2wxg.py: Change shebang to start Python2 always. That's useful for systems with Python3 as default [5496b927d38f] * edit_windows.py: Fix bug introduced in 1333:9859659429ff [35355bec2cdc] * docs/html/apa.html, docs/html/apb.html, docs/html/apc.html, docs/html/apd.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch01s07.html, docs/html/ch01s08.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch02s06.html, docs/html/ch02s07.html, docs/html/ch02s08.html, docs/html/ch02s09.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch03s07.html, docs/html/ch04.html, docs/html/ch04s02.html, docs/html/ch04s03.html, docs/html/ch05.html, docs/html/ch05s03.html, docs/html/ch05s04.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/html/preferences.png, docs/pdf/manual.pdf, docs/src/html.xsl, docs/src/manual.xml, docs/src/pdf.xsl, docs/src/preferences.png: Extend documentation HG Bitte gib eine Versions-Meldung ein. Zeilen beginnend mit 'HG:' werden [bc18610d0567] 2013-12-04 Carsten Grohmann * log.py: Set backupCount=1 during setup of RotatingFileHandler The default backupCount=0 doesn't delete the file during the rollover. Thereby the log file grows instead of remaining at 100 KiB. [c24c07e5dcce] 2013-12-03 Carsten Grohmann * edit_windows.py: Fix bug introduced in 1333:9859659429ff [297fda9023c6] 2013-11-26 Carsten Grohmann * log.py: Add more details to logged exceptions and unify exception formatting code [c5afcde6f5e6] 2013-11-24 Carsten Grohmann * errors.py, wxglade.py: Improve error handling in case if missing code writer [baa8d6246a56] * tests/test_codegen.py: Add test case for last commit "Prevent code generation ..." [ecb3bf4f9787] * NEWS.txt, codegen/__init__.py, errors.py: Prevent code generation from a template file by commandline invocation [0ab726df3b2a] * xml_parse.py: Remove obsolete "import errors" [5a075d2b9115] * wxglade: Use python2 interpreter instead of just python [29f7c3faf169] * tests/__init__.py, tests/test_codegen.py: Improve tests of the existance of output file and directory [fef6cdbda237] 2013-11-23 Carsten Grohmann * main.py: Reorg code to open file to reduce duplicate code [7bfd38922609] 2013-11-16 Carsten Grohmann * test.py, wxglade.py, wxglade.pyw, xrc2wxg.py: Change shebang to start Python2 always. That's useful for systems with Python3 as default [b01e80fc1fe3] 2013-11-05 Carsten Grohmann * wxglade.py: PEP8 [e478cd2d5cfd] * codegen/xrc_codegen.py, errors.py, tests/test_codegen.py: XRC code generator raises an own exception instead of IOError. The code generator raises now WxgXRCMultipleFilesNotSupported instead of the generic IOError exception. It's a logical mistake not not an IO error. [b054b258642a] * application.py, wxglade.py: Improve checks for wxGlade specific exceptions [6257c4bf9ed3] * application.py, codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/py_codegen.py, errors.py, tests/__init__.py, tests/test_codegen.py, wxglade.py, xml_parse.py: Improve check for output directory [a01618bc6930] 2013-11-02 Carsten Grohmann * application.py, codegen/py_codegen.py, errors.py, tests/test_codegen.py, wxglade.py: Improve disabling old import style for wxPython 3.0 [12dcaea82563] 2013-11-01 Carsten Grohmann * NEWS.txt, application.py, codegen/lisp_codegen.py, errors.py, tests/casefiles/ComplexExample_30.lisp, tests/test_codegen.py, wxglade.py, xml_parse.py: Disable Lisp code generation for wxWidgets 3.0 I've disabled Lisp due lack of testing possibilities for the upcoming release of wxWidgets 3.0. [929b728156a5] * widget_properties.py: Add RadioProperty.enable_item() to enable/disable choices within the property [b43b01a1101a] 2013-10-30 Carsten Grohmann * tests/__init__.py: Add option to exclude languages from tests.WXGladeBaseTest._test_all() [3f7594b6af3c] * codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py: Rework the initialisation of values in code generators [5e826fc3103b] * xml_parse.py: Pep8 changes [d7b4e45849e0] 2013-10-29 Carsten Grohmann * xml_parse.py: Minor update of the source code documentation [735370d77e46] 2013-10-27 Carsten Grohmann * log.py: Minor code reorg in exception handlers [d26255c41444] * wxglade.py: Update copyright notice [95bef50e8089] * merged DEV_GUI_WX30 into default [09789fae8916] 2013-10-16 Carsten Grohmann * application.py, compat.py, edit_sizers/edit_sizers.py, edit_windows.py, tree.py: Move compatibility code to compat.py [9859659429ff] 2013-10-15 Carsten Grohmann * edit_sizers/edit_sizers.py, edit_windows.py: Use SizerItem.AssignWindow() instead of SetWindow() SizerItem.SetWindow() is deprecated since wxPython 2.9 [11706a357d8f] * NEWS.txt: Start implementing GUI changes to support upcoming wxPython 3.0 [19e898384490] * application.py, tree.py: Use SizerItem.AssignWindow() instead of SetWindow() (Thanks to Martin Gregory) SizerItem.SetWindow() is deprecated since wxPython 2.9 This change is an adapt version of the patch provided by Martin. [5a78f3b6c0ba] 2013-10-08 Carsten Grohmann * Created DEV_GUI_WX30 branch [d5ec8e0d20d2] 2013-10-01 Carsten Grohmann * wxglade.py: Reorg in determining locale to prevent warning message on Windows [8a41588c804d] 2013-09-30 Carsten Grohmann * setup.py: Add installation requirement to setup.py [5dbf1cdc40dd] 2013-09-29 Carsten Grohmann * NEWS.txt, common.py: Change default to remember position and geometry of the main windows This configuration change effects fresh installations only because wxGlade writes always all configuration settings into the rc file. Changed defaults will be overwritten by the values from the rc file. [7081c03e7c7b] * docs/src/manual.xml, wxglade: Typo [262e10831dd5] * Close DEV_LOGGING branch [20bde6c43e2b] * NEWS.txt, main.py, wxglade.py: merged DEV_LOGGING into default [9510a31d471d] * log.py: Fix for a incomplete change in log.py The cleanup for old log handlers was too late. Thereby the new created handlers have been removed too. [c7a48e74cdc3] * log.py: Minor code reorg triggered by a PEP8 check [5345f7e56b2f] * config.py: Minor source documentation updates [a71a67caa8dd] * NEWS.txt, common.py, config.py, configUI.py, configdialog.py, log.py, main.py, res/preferences.wxg, wxglade.py: Improve file logging The log file will always created . The file is stored inside the appdata directory and it's size is limited to 100kB. Parallel a new option has added to log DEBUG information to the log file. This option is off per default. [4ebc54cf7601] 2013-09-28 Carsten Grohmann * NEWS.txt, common.py, config.py, template.py, wxglade.py: Rework internal path handling [92719b634b39] 2013-09-27 Carsten Grohmann * about.py, code_property.py, codegen/__init__.py, common.py, config.py, configUI.py, docs/ReleaseSteps.txt, edit_sizers/__init__.py, edit_sizers/edit_sizers.py, main.py, misc.py, res/preferences.wxg, template.py, tests/__init__.py, tests/casefiles/Preferences.wxg, tests/casefiles/Python_Preferences.py, tree.py, widgets/__init__.py, widgets/bitmap_button/__init__.py, widgets/bitmap_button/codegen.py, widgets/button/__init__.py, widgets/calendar_ctrl/__init__.py, widgets/checkbox/__init__.py, widgets/choice/__init__.py, widgets/combo_box/__init__.py, widgets/custom_widget/__init__.py, widgets/datepicker_ctrl/__init__.py, widgets/dialog/__init__.py, widgets/dialog/dialog.py, widgets/frame/__init__.py, widgets/frame/frame.py, widgets/gauge/__init__.py, widgets/grid/__init__.py, widgets/hyperlink_ctrl/__init__.py, widgets/list_box/__init__.py, widgets/list_ctrl/__init__.py, widgets/menubar/__init__.py, widgets/menubar/menubar.py, widgets/notebook/__init__.py, widgets/panel/__init__.py, widgets/panel/panel.py, widgets/radio_box/__init__.py, widgets/radio_button/__init__.py, widgets/slider/__init__.py, widgets/spacer/__init__.py, widgets/spin_button/__init__.py, widgets/spin_ctrl/__init__.py, widgets/splitter_window/__init__.py, widgets/static_bitmap/__init__.py, widgets/static_bitmap/codegen.py, widgets/static_line/__init__.py, widgets/static_text/__init__.py, widgets/text_ctrl/__init__.py, widgets/toggle_button/__init__.py, widgets/toolbar/__init__.py, widgets/toolbar/codegen.py, widgets/toolbar/toolbar.py, widgets/tree_ctrl/__init__.py, widgets/tree_ctrl/tree_ctrl.py, wxglade.py, xml_parse.py: Move configuration settings from common to config and code back to common This change moves most of configuration variables from common.py to config.py and active code from config back to common. This change prevents some circular imports of config and common. [38de358eed2f] 2013-09-25 Carsten Grohmann * .hgignore: Ignore wxGlade log file and PyCharm IDE files [84e04744cb00] 2013-09-21 Carsten Grohmann * NEWS.txt, tests/casefiles/ComplexExample.pl, tests/casefiles/ComplexExample_30.pl, widgets/frame/perl_codegen.py: Use configurable indents instead of hard coded tabs in wxFrame code for Perl [ca8a9b63640c] * wcodegen/__init__.py: Add BaseWidgetCodeWriter.stmt2list() convert a string into a list. The function stmt2list() splits a multi line code statement into a list of lines. The newlines will be conserved. [22f4e4cde616] * Makefile: Add directoy wcodegen to list of source directories [3e6acc670822] * wxglade.py: Write log file with utf-8 encoding [65e5ba4f4a91] * main.py, wxglade.py: Minor cosmetic changes [8220d4169fd0] 2013-09-04 Carsten Grohmann * Created DEV_LOGGING branch [a5eb50eb0377] 2013-09-01 Carsten Grohmann * tests/casefiles/ComplexExample.cpp, tests/casefiles/ComplexExample.lisp, tests/casefiles/ComplexExample.pl, tests/casefiles/ComplexExample.py, tests/casefiles/ComplexExample.wxg, tests/casefiles/ComplexExample.xrc, tests/casefiles/ComplexExample_30.cpp, tests/casefiles/ComplexExample_30.lisp, tests/casefiles/ComplexExample_30.pl, tests/casefiles/ComplexExample_30.py, tests/casefiles/ComplexExample_30.wxg, tests/casefiles/ComplexExample_30.xrc, widgets/toolbar/codegen.py: Change bitmap specification in complex example [5caa450eb90c] * NEWS.txt, codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, docs/html/apa.html, docs/html/apb.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch01s07.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch02s06.html, docs/html/ch02s07.html, docs/html/ch02s08.html, docs/html/ch02s09.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s06.html, docs/html/ch03s07.html, docs/html/ch04.html, docs/html/ch05.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/pdf/manual.pdf, docs/src/manual.xml, tests/casefiles/ComplexExample.cpp, tests/casefiles/ComplexExample.h, tests/casefiles/ComplexExample.lisp, tests/casefiles/ComplexExample.pl, tests/casefiles/ComplexExample.py, tests/casefiles/ComplexExample.wxg, tests/casefiles/ComplexExample.xrc, tests/casefiles/ComplexExample_30.cpp, tests/casefiles/ComplexExample_30.h, tests/casefiles/ComplexExample_30.lisp, tests/casefiles/ComplexExample_30.pl, tests/casefiles/ComplexExample_30.py, tests/casefiles/ComplexExample_30.wxg, tests/casefiles/ComplexExample_30.xrc, tests/test_codegen.py: Rework quoting and escaping of special character sequences [cf7d695c8278] 2013-08-27 Carsten Grohmann * NEWS.txt, codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py: Simplify signature of quote_str(), use quote_path() for filenames or paths [534c09b7673c] 2013-08-26 Carsten Grohmann * tests/casefiles/ComplexExample.cpp, tests/casefiles/ComplexExample_30.cpp, widgets/bitmap_button/codegen.py, widgets/dialog/codegen.py, widgets/frame/codegen.py, widgets/static_bitmap/codegen.py, widgets/toolbar/codegen.py: Use quote_path() instead of quote_str() to quote / escape filenames [4fc773828910] 2013-08-26 Carsten Grohmann * docs/ReleaseSteps.txt: Add creation of a development branch to release steps [e494dfa8ae57] 2013-08-25 Carsten Grohmann * Close stable branch WXG-BRANCH-VERSION_0_6_7 [c15b934f9e44] 2013-08-24 Carsten Grohmann * NEWS.txt, codegen/__init__.py, codegen/pl_codegen.py, codegen/py_codegen.py, tests/casefiles/ComplexExample.cpp, tests/casefiles/ComplexExample.lisp, tests/casefiles/ComplexExample.pl, tests/casefiles/ComplexExample.py, tests/casefiles/ComplexExample.wxg, tests/casefiles/ComplexExample.xrc, tests/test_codegen.py: Fix escape sequences in Unicode strings were escaped twice Perl and Python [c164edb5afff] * NEWS.txt: Extent NEWS.txt [fd369e4c6aa9] * Create new branch for stable version 0.6.8 [b9ba1e9ee9e1] * NEWS.txt, codegen/__init__.py, codegen/pl_codegen.py, codegen/py_codegen.py, tests/casefiles/ComplexExample.cpp, tests/casefiles/ComplexExample.lisp, tests/casefiles/ComplexExample.pl, tests/casefiles/ComplexExample.py, tests/casefiles/ComplexExample.wxg, tests/casefiles/ComplexExample.xrc, tests/casefiles/ComplexExample_30.cpp, tests/casefiles/ComplexExample_30.lisp, tests/casefiles/ComplexExample_30.pl, tests/casefiles/ComplexExample_30.py, tests/casefiles/ComplexExample_30.wxg, tests/casefiles/ComplexExample_30.xrc, tests/test_codegen.py: Fix escape sequences in Unicode strings were escaped twice Perl and Python [ed6b1ff15a56] 2013-08-21 Carsten Grohmann * codegen/__init__.py: Source documentation update for quote_str() and _quote_str_pattern [0dfe9cf1a288] 2013-08-17 Carsten Grohmann * codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, edit_sizers/edit_sizers.py, misc.py, tests/__init__.py, tests/test_codegen.py: Rename class codegen.BaseCodeWriter -> BaseLangCodeWriter [74ccfbc1bd58] * NEWS.txt, application.py, clipboard.py, codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, common.py, config.py, edit_sizers/edit_sizers.py, edit_widget.py, edit_windows.py, events_mixin.py, font_dialog.py, install/pyinstaller/wxglade- installer.iss, install/pyinstaller/wxglade.spec, install/rpm/wxglade.spec, log.py, main.py, misc.py, template.py, tests/__init__.py, tests/test_gui.py, tree.py, wcodegen/__init__.py, widget_properties.py, widgets/custom_widget/codegen.py, widgets/grid/codegen.py, widgets/menubar/codegen.py, widgets/menubar/lisp_codegen.py, widgets/menubar/perl_codegen.py, widgets/notebook/notebook.py, widgets/panel/panel.py, widgets/splitter_window/splitter_window.py, widgets/static_bitmap/static_bitmap.py, wxglade.py, xml_parse.py, xrc2wxg.py: Use Python logging facility instead of print statements The information will be shown in three ways: - at console - in a log file - within the GUI [a6dd33ce9368] 2013-08-15 Carsten Grohmann * application.py, config.py, wxglade.py: Initialise localisation earlier / at application start In old version the localisation was initialised during the graphical init process only. Now the localisation is started always during the first step of application initialisation. BTW: The old call of "locale.setlocale(locale.LC_ALL)" initialised the "C" locale always and not the user specific locales. This has been fixed. [a9d16f4d6697] 2013-08-14 Carsten Grohmann * wxglade.py: Improve module import of wxversion and wx as well as the error messages [4161b6fb9096] 2013-08-08 Carsten Grohmann * codegen/__init__.py: Change default version for code generation from 2.6 to 2.8 The preselected version for a new project in GUI is the version of the used wxPython version. [5903d225a95e] * NEWS.txt, tests/casefiles/ComplexExample.cpp, tests/casefiles/ComplexExample.lisp, tests/casefiles/ComplexExample.pl, tests/casefiles/ComplexExample.py, tests/casefiles/ComplexExample.wxg, tests/casefiles/ComplexExample.xrc, tests/casefiles/ComplexExample_30.cpp, tests/casefiles/ComplexExample_30.lisp, tests/casefiles/ComplexExample_30.pl, tests/casefiles/ComplexExample_30.py, tests/casefiles/ComplexExample_30.wxg, tests/casefiles/ComplexExample_30.xrc, widgets/notebook/notebook.py: Add missing styles for wxNotebook (Thanks to Udi Fuchs) [2ceb04d0021a] 2013-08-07 Carsten Grohmann * widgets/notebook/__init__.py, widgets/notebook/codegen.py, widgets/notebook/lisp_codegen.py, widgets/notebook/notebook.py, widgets/notebook/perl_codegen.py, widgets/radio_box/__init__.py, widgets/radio_box/codegen.py, widgets/radio_box/lisp_codegen.py, widgets/radio_box/perl_codegen.py, widgets/radio_box/radio_box.py: Pep8 [973b01021e2d] 2013-08-06 Carsten Grohmann * NEWS.txt, codegen/py_codegen.py, tests/casefiles/ComplexExample_30.py: Use SetToolTip() instead of SetToolTipString() for wxPython 3.x [a525128133d2] * NEWS.txt: Update NEWS.txt [b03e4a2d52b5] * codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py: Extent handling for code statements use to set properties [ef8a76603d7b] 2013-08-04 Carsten Grohmann * tests/casefiles/ComplexExample_30.cpp, tests/casefiles/ComplexExample_30.h, tests/casefiles/ComplexExample_30.lisp, tests/casefiles/ComplexExample_30.pl, tests/casefiles/ComplexExample_30.py, tests/casefiles/ComplexExample_30.wxg, tests/casefiles/ComplexExample_30.xrc, tests/test_codegen.py: Add initial test for wxPython 3.0 using a own copy of "ComplexExample" [ee47e557e8d6] * tests/__init__.py, tests/test_codegen.py, tests/test_gui.py: Update year in copyright statement [5d6cf129a460] 2013-07-13 Carsten Grohmann * docs/tutorial.html: Replace Albertos email in the tutorial by mailing list address [e43a17d1922e] * docs/BuildingInstaller.txt: Add deleting Python bytecode files to release documentation [2016ef90992e] * .hgtags: Added tag rel_0.6.8 for changeset 80fb1637a216 [64fc83033268] * common.py, install/pyinstaller/wxglade-installer.iss: Bump version number to 0.6.8 [80fb1637a216] [rel_0.6.8] 2013-07-10 Carsten Grohmann * NEWS.txt, README.txt: Prerelease documentation updates [ffb705fc1782] * NEWS.txt, codegen/pl_codegen.py, codegen/py_codegen.py, tests/casefiles/ComplexExample.cpp, tests/casefiles/ComplexExample.h, tests/casefiles/ComplexExample.lisp, tests/casefiles/ComplexExample.pl, tests/casefiles/ComplexExample.py, tests/casefiles/ComplexExample.wxg, tests/casefiles/ComplexExample.xrc, tests/test_codegen.py: Fix handling of unicode characters in strings for Perl and Python Looks like wxGlade uses ASCII internal at all places. This change escapes unicode characters to continue handling of strings as ascii strings. The generated source code is always ascii, even if it contains an encoding statement at top. [af83a01b67bb] * NEWS.txt, common.py, wxglade.py: Add comfortable exception handler for more detailed bug reports This exception handler logs names, types and content of local variables from top stack entry. [f1935988f512] * application.py: Update text of two tooltips [f91b569ebdbc] * NEWS.txt, application.py: Disable old import style for wxPython 3.0 [c65e2be8871f] * widget_properties.py: Improve source documentation [0caac8e1633f] 2013-07-08 Carsten Grohmann * docs/html/apa.html, docs/html/apb.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch01s07.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch02s06.html, docs/html/ch02s07.html, docs/html/ch02s08.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch03s07.html, docs/html/ch04.html, docs/html/ch04s02.html, docs/html/ch05.html, docs/html/ch05s02.html, docs/html/ch05s03.html, docs/html/ch05s04.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/html/properties_window.png, docs/pdf/manual.pdf, docs/src/manual.xml: Add section about "Language specific peculiarities" and fix broken links [0bacd2937507] * docs/html/apa.html, docs/html/apb.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch01s07.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch02s06.html, docs/html/ch02s07.html, docs/html/ch02s08.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch03s07.html, docs/html/ch04.html, docs/html/ch04s02.html, docs/html/ch05.html, docs/html/ch05s02.html, docs/html/ch05s03.html, docs/html/ch05s04.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/html/properties_window.png, docs/pdf/manual.pdf, docs/src/manual.xml: Add section about "Language specific peculiarities" and fix broken links [bbc054686648] 2013-06-25 Carsten Grohmann * application.py, misc.py: Code reorganisation [44b9a46fbb58] 2013-06-23 Carsten Grohmann * NEWS.txt, tests/casefiles/styleless-dialog.cpp, tests/casefiles /styleless-dialog.h, tests/casefiles/styleless-dialog.lisp, tests/casefiles/styleless-dialog.pl, tests/casefiles/styleless- dialog.py, tests/casefiles/styleless-dialog.wxg, tests/casefiles /styleless-dialog.xrc, tests/test_codegen.py, tests/test_gui.py, widgets/dialog/dialog.py, widgets/frame/frame.py: Fix handling of style-less dialogs and frames (sf bug #145) [28d4010e08d9] * tests/test_gui.py: Improve GUI test code [3e6399946365] * NEWS.txt, tests/casefiles/styleless-dialog.cpp, tests/casefiles /styleless-dialog.h, tests/casefiles/styleless-dialog.lisp, tests/casefiles/styleless-dialog.pl, tests/casefiles/styleless- dialog.py, tests/casefiles/styleless-dialog.wxg, tests/casefiles /styleless-dialog.xrc, tests/test_codegen.py, tests/test_gui.py, widgets/dialog/dialog.py, widgets/frame/frame.py: Fix handling of style-less dialogs and frames (sf bug #145) [4e391171149f] * tests/test_gui.py: Improve GUI test code [0057a391ee52] 2013-06-19 Carsten Grohmann * widget_properties.py: Minor function documentation update [f5f6de46a504] 2013-05-29 Carsten Grohmann * setup.py: Add installer files to all packages [0bcaf81f5daf] * setup.py: Internal restructuring [b5955aef483c] 2013-05-27 Carsten Grohmann * setup.py: Typo [d27f0c8d49d2] 2013-05-26 Carsten Grohmann * setup.py: Add test case files to release bundles [9b46e37d8e9d] * Makefile: Call clean rule before building release packages [60ac9a63907a] 2013-05-25 Carsten Grohmann * README.txt, common.py: Mark version as 0.6.7+ [1bfef4cd9659] * docs/ReleaseSteps.txt: Add stable branch handling to release documentation [23e51b2ebdef] * xml_parse.py: Improve checking output path The output path checking for single file generation returned a misleading error message. This change improve the checking of the ouput directory in such a case. [79e542df29ee] * NEWS.txt, main.py: Fix an uninitialised variable in saving a project file (sf bug # 157) The exception handler for general (not IOError and not OSError) exceptions uses an uninitialised variable. [0ba948da308b] * NEWS.txt, xml_parse.py: Fix "Overwrite existing sources" for new projects The previous commit (1206:5214a3ac9026) to change the default for overwriting existing sources was incomplete. Thereby this change adds the missing part and set the GUI checkbox proberly also if a non-overwrite project will be opened. [ea791e73a6ec] * NEWS.txt, codegen/__init__.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, tests/casefiles/ComplexExample.cpp, tests/casefiles/ComplexExample.h, tests/casefiles/ComplexExample.lisp, tests/casefiles/ComplexExample.pl, tests/casefiles/ComplexExample.py, tests/casefiles/ComplexExample.wxg, tests/casefiles/ComplexExample.xrc, tests/test_codegen.py: Fix too strict sanity checks for class attributes [3ee15268008d] * tests/casefiles/ComplexExample.cpp, tests/casefiles/ComplexExample.h, tests/casefiles/ComplexExample.lisp, tests/casefiles/ComplexExample.pl, tests/casefiles/ComplexExample.py, tests/casefiles/ComplexExample.wxg, tests/casefiles/ComplexExample.xrc, tests/test_codegen.py: Add complex test example [5e68a548728f] * NEWS.txt, widgets/notebook/codegen.py: Fix XRC code generation for notebooks with panes [85a8b4484e87] * NEWS.txt, edit_sizers/perl_sizers_codegen.py: Wrong SetSizeHint() call in Perl (Thanks to Eric McKeeth) [0232035f04ee] * Created WXG-BRANCH-VERSION_0_6_7 branch [453a37c9f55a] * msgdialog.py, res/messagedialog.wxg: MessageDialog is resizeable now It's simpler to read larger messages e.g. exception details now. [d7c6498f673b] * common.py: Improve exception handler [c99210689ebb] * NEWS.txt, codegen/pl_codegen.py, codegen/py_codegen.py, tests/casefiles/ComplexExample.cpp, tests/casefiles/ComplexExample.h, tests/casefiles/ComplexExample.lisp, tests/casefiles/ComplexExample.pl, tests/casefiles/ComplexExample.py, tests/casefiles/ComplexExample.wxg, tests/casefiles/ComplexExample.xrc, tests/test_codegen.py: Fix handling of unicode characters in strings for Perl and Python Looks like wxGlade uses ASCII internal at all places. This change escapes unicode characters to continue handling of strings as ascii strings. The generated source code is always ascii, even if it contains an encoding statement at top. [7807f6d6a7fa] 2013-05-24 Carsten Grohmann * NEWS.txt, common.py, wxglade.py: Add comfortable exception handler for more detailed bug reports This exception handler logs names, types and content of local variables from top stack entry. [1cd22e54ef36] 2013-05-22 Carsten Grohmann * xml_parse.py: Improve checking output path The output path checking for single file generation returned a misleading error message. This change improve the checking of the ouput directory in such a case. [528d6ec6e4cf] 2013-05-21 Carsten Grohmann * application.py: Print locale settings during initialise GUI Printing locale is a little bit late in init process. Setting and printing should be earlier e.g. in wxglade.init_stage1(). [4f4e0e8bcdba] * codegen/__init__.py, main.py: Rename variables and minor code cleanups Some variables have be renamed to prevent redefining Python built- ins. Some imports have been restructured and other minor code changes. [274c597be116] * NEWS.txt, main.py: Fix an uninitialised variable in saving a project file (sf bug # 157) The exception handler for general (not IOError and not OSError) exceptions uses an uninitialised variable. [6c47fb22bdad] * NEWS.txt, xml_parse.py: Fix "Overwrite existing sources" for new projects The previous commit (1206:5214a3ac9026) to change the default for overwriting existing sources was incomplete. Thereby this change adds the missing part and set the GUI checkbox proberly also if a non-overwrite project will be opened. [32edb433b035] 2013-05-18 Carsten Grohmann * NEWS.txt, codegen/__init__.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, tests/casefiles/ComplexExample.cpp, tests/casefiles/ComplexExample.h, tests/casefiles/ComplexExample.lisp, tests/casefiles/ComplexExample.pl, tests/casefiles/ComplexExample.py, tests/casefiles/ComplexExample.wxg, tests/casefiles/ComplexExample.xrc, tests/test_codegen.py: Fix too strict sanity checks for class attributes [c94dcad73493] 2013-04-26 Carsten Grohmann * tests/casefiles/ComplexExample.cpp, tests/casefiles/ComplexExample.h, tests/casefiles/ComplexExample.lisp, tests/casefiles/ComplexExample.pl, tests/casefiles/ComplexExample.py, tests/casefiles/ComplexExample.wxg, tests/casefiles/ComplexExample.xrc, tests/test_codegen.py: Add complex test example [01d8bb798de7] * NEWS.txt, widgets/notebook/codegen.py: Fix XRC code generation for notebooks with panes [57e7a7d844ed] 2013-04-24 Carsten Grohmann * .hgtags: Cleanup duplicate tags [7ce391ea3f74] 2013-04-13 Carsten Grohmann * NEWS.txt, edit_sizers/perl_sizers_codegen.py: Wrong SetSizeHint() call in Perl (Thanks to Eric McKeeth) [b7e763e639d3] * NEWS.txt: Prepare for new version [d9d3e6c88263] 2013-04-12 Carsten Grohmann * application.py, docs/html/apa.html, docs/html/apb.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch01s07.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch02s06.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s06.html, docs/html/ch03s07.html, docs/html/ch04.html, docs/html/ch05.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/pdf/manual.pdf, docs/src/manual.xml: Start development for wx 3.0 support [36c2fab9a7e7] 2013-04-07 Carsten Grohmann * docs/BuildingInstaller.txt, docs/ReleaseSteps.txt: Update release documentation [354ad29010d1] * common.py, install/pyinstaller/wxglade-installer.iss: Set version numbers back to HG to start new development cycle [0cd76cabf7cb] * .hgtags: Added tag rel_0.6.7 for changeset 09ab5dec05ce [b82efd84c958] * common.py, install/pyinstaller/wxglade-installer.iss: Bump version number to 0.6.7 [09ab5dec05ce] [rel_0.6.7] * CHANGES.txt, NEWS.txt, README.txt: Prerelease documentation updates [37684571f31f] * NEWS.txt, res/templates_ui.wxg, template.py, templates_ui.py: Improve usability of the dialog to list and open templates [a19405d8464e] * NEWS.txt, codegen/py_codegen.py: Regression in generated Python code for bindung events The regression was introduced in 1173:95047b445b12 "Rework generating constructor code in all code generators". The generated code raised an AssertionError if the source of the event is specified by an ID number instead of a widget. [11b82132ec86] 2013-04-06 Carsten Grohmann * NEWS.txt, edit_sizers/edit_sizers.py, res/templates_ui.wxg, templates_ui.py, widgets/spacer/spacer.py: Preselect some dialog elements Simplify usage of some dialogs by setting focus to first input widget and select the widget content. [4794febbd4d3] 2013-04-03 Carsten Grohmann * application.py: Show feedback in status bar if code generation dialog is suppressed [2a9c6855e18a] 2013-04-01 Carsten Grohmann * tests/test_gui.py: Repair GUI test broken with 1223:602859354d4b [92d261ba743f] * NEWS.txt, codegen/py_codegen.py, tests/casefiles/CalendarCtrl.py, tests/casefiles/FontColour.py, tests/casefiles/Gauge.py, tests/casefiles/Grid.py, tests/casefiles/HyperlinkCtrl_26.py, tests/casefiles/HyperlinkCtrl_28.py, tests/casefiles/PyAddApp_multi_detailed.py, tests/casefiles/PyAddApp_multi_gettext_detailed.py, tests/casefiles/PyAddApp_multi_gettext_simple.py, tests/casefiles/PyAddApp_multi_simple.py, tests/casefiles/PyOgg1.py, tests/casefiles/PyOgg1_oldnamespace.py, tests/casefiles/PyOgg2_app.py, tests/casefiles/PyOgg3.py, tests/casefiles/Python_Preferences.py, tests/casefiles/Sizers_classattr.py, tests/casefiles/Sizers_no_classattr.py, tests/casefiles/add_class_inplace_extended.py, tests/casefiles/add_class_inplace_orig.py, tests/casefiles/no_suitable_writer.py, tests/casefiles/remove_class_inplace_expected.py, tests/casefiles/remove_class_inplace_input.py: Remove empty line between shebang and encoding statement in Python files The additional empty line between the shebang and the encoding statement violates PEP 0263 and causes some trouble with utf-8 on win7. [2e90add4076a] * codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py: Change handling of empty lines in file headers Hardcoded empty lines are removed. The empty lines are added to the variables shebang, tmpl_encoding and language_note. Thereby the generated code has not changed. [df6744b0901d] * application.py: Minor change in source documentation [8183c8ee4e24] 2013-03-31 Carsten Grohmann * credits.txt: Update Main Developer [b4e3ef274e80] * NEWS.txt, application.py, config.py, configUI.py, configdialog.py, res/preferences.wxg: Add a config option to suppress the code generation success message [602859354d4b] * common.py: Fix plus sign for uncommitted changes in version number. "++" was shown due a logical bug. Now just "+" is shown. The plus sign in version number indicates not committed changes. [5a9daca7f1cd] 2013-03-30 Carsten Grohmann * NEWS.txt, common.py, install/pyinstaller/wxglade-installer.iss: Set version numbers back to HG to start new development cycle [508d0ee2eca7] 2013-03-29 Carsten Grohmann * .hgtags: Added tag rel_0.6.6 for changeset 9ee81dcd0dc1 [e29081a1182d] * install/pyinstaller/wxglade-installer.iss: Uninstall byte-code files for hyperlink widget too [9ee81dcd0dc1] [rel_0.6.6] * .hgtags: Added tag rel_0.6.6 for changeset 4487d7edc422 [198de9aff62b] * common.py, install/pyinstaller/wxglade-installer.iss: Bump version number to 0.6.6 [4487d7edc422] * CHANGES.txt, NEWS.txt, README.txt, credits.txt: Prerelease documentation updates [0b81f0b99f4c] * application.py, docs/html/apa.html, docs/html/apb.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch01s07.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch02s06.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s06.html, docs/html/ch03s07.html, docs/html/ch04.html, docs/html/ch05.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/html/properties_window_application.png, docs/html/properties_window_settings.png, docs/html/properties_window_tab_1_change.png, docs/html/wxglade.png, docs/pdf/manual.pdf, docs/src/manual.xml, docs/src/properties_window.png, docs/src/properties_window_application.png, docs/src/properties_window_settings.png, docs/src/properties_window_tab_1_change.png, docs/src/wxglade.png: Combine language specific panels in application properties dialog [b0e2289dbaaf] * application.py, codegen/__init__.py: Typo in source documentation [34788736bd1f] * NEWS.txt, application.py, codegen/__init__.py, config.py, docs/html/apa.html, docs/html/apb.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch01s07.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch02s06.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s06.html, docs/html/ch03s07.html, docs/html/ch04.html, docs/html/ch05.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/pdf/manual.pdf, docs/src/manual.xml, tests/casefiles/PyAddApp_multi_detailed.py, tests/casefiles/PyAddApp_multi_gettext_detailed.py, tests/casefiles/PyAddApp_multi_gettext_simple.py, tests/casefiles/PyAddApp_multi_simple.py, xml_parse.py: Change some default settings and reorg internal handling The primary changes are: - usage of UTF-8 as fallback encoding - enable gettext per default Some of the default values are converted from hard coded values to variables located in config module. [530b2bc1c3dd] 2013-03-16 Carsten Grohmann * tests/casefiles/LispOgg1.lisp, tests/casefiles/LispOgg1.wxg, tests/casefiles/PlOgg1.pl, tests/casefiles/PlOgg1.wxg, tests/casefiles/PyOgg1.py, tests/casefiles/PyOgg1.wxg, tests/casefiles/PyOgg1_oldnamespace.py: Unify test cases [db270e04afa2] 2013-03-15 Carsten Grohmann * NEWS.txt, edit_windows.py: Setting invalid windows names hasn't blocked fully (sf bug #154) [d4d79f527fcb] 2013-03-08 Carsten Grohmann * docs/html/apa.html, docs/html/apb.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch01s07.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch02s06.html, docs/html/ch02s07.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s06.html, docs/html/ch03s07.html, docs/html/ch04.html, docs/html/ch04s02.html, docs/html/ch05.html, docs/html/ch05s03.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/pdf/manual.pdf, docs/src/manual.xml: Extend documentation with a best practice section [e4581bbb1907] 2013-03-02 Carsten Grohmann * codegen/py_codegen.py, tests/test_codegen.py: Do not format wx classnames, constants and ... twice in Python. Add check if the parameter hand over to cn() is already formatted and do not format such a parameter again. This is just the case if the user enters language-specific formatted values. [fffa28856fa7] 2013-02-05 Carsten Grohmann * edit_sizers/edit_sizers.py: Added tooltips to sizer elements and dialogs [eadd3417d239] 2013-02-04 Carsten Grohmann * codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, tests/test_codegen.py: Unify code generation of adding objects to sizers [1c0d04e7277b] 2013-02-03 Carsten Grohmann * NEWS.txt, application.py: Set "Overwrite existing sources" for new projects [5214a3ac9026] * codegen/py_codegen.py: Small change to format flags in Python [048c0e1bd6c7] 2013-02-02 Carsten Grohmann * codegen/pl_codegen.py, codegen/py_codegen.py: Don't format border property in add_sizeritem - it's always an integer [02c177e6f619] * codegen/lisp_codegen.py, widgets/button/lisp_codegen.py, widgets/checkbox/lisp_codegen.py, widgets/choice/lisp_codegen.py, widgets/combo_box/lisp_codegen.py, widgets/gauge/lisp_codegen.py, widgets/hyperlink_ctrl/lisp_codegen.py, widgets/list_box/lisp_codegen.py, widgets/list_ctrl/lisp_codegen.py, widgets/notebook/lisp_codegen.py, widgets/panel/lisp_codegen.py, widgets/radio_box/lisp_codegen.py, widgets/radio_button/lisp_codegen.py, widgets/slider/lisp_codegen.py, widgets/spin_button/lisp_codegen.py, widgets/spin_ctrl/lisp_codegen.py, widgets/splitter_window/lisp_codegen.py, widgets/static_bitmap/lisp_codegen.py, widgets/static_line/lisp_codegen.py, widgets/static_text/lisp_codegen.py, widgets/text_ctrl/lisp_codegen.py, widgets/toolbar/lisp_codegen.py, widgets/tree_ctrl/lisp_codegen.py: Improve flag handling in Lisp code generator [4a314a069f94] 2013-02-01 Carsten Grohmann * NEWS.txt, codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, edit_sizers/edit_sizers.py, edit_sizers/lisp_sizers_codegen.py, edit_sizers/perl_sizers_codegen.py, edit_sizers/sizers_codegen.py, tests/casefiles/LispOgg1.lisp, tests/casefiles/LispOgg2_MyDialog.lisp, tests/casefiles/LispOgg2_MyFrame.lisp, tests/casefiles/LispOgg3.lisp, tests/casefiles/Lisp_Preferences.lisp, tests/casefiles/Sizers_classattr.cpp, tests/casefiles/Sizers_classattr.h, tests/casefiles/Sizers_classattr.lisp, tests/casefiles/Sizers_classattr.pl, tests/casefiles/Sizers_classattr.py, tests/casefiles/Sizers_classattr.wxg, tests/casefiles/Sizers_classattr.xrc, tests/casefiles/Sizers_no_classattr.cpp, tests/casefiles/Sizers_no_classattr.h, tests/casefiles/Sizers_no_classattr.lisp, tests/casefiles/Sizers_no_classattr.pl, tests/casefiles/Sizers_no_classattr.py, tests/casefiles/Sizers_no_classattr.wxg, tests/casefiles/Sizers_no_classattr.xrc, tests/casefiles/add_class_inplace_extended.lisp, tests/casefiles/add_class_inplace_orig.lisp, tests/casefiles/remove_class_inplace_expected.lisp, tests/casefiles/remove_class_inplace_input.lisp, tests/test_codegen.py, wxglade.py: Add "Store as attribute" for sizers Sizers won't store as class attributes per default. You can enable this using the new GUI element. This change primarily affects Python and C++, because the code generators for Perl and Lisp do already store sizers as class attributes. [f4503e3639c7] 2013-01-31 Carsten Grohmann * codegen/py_codegen.py: Fix AttributeError during preview of a new generated project. This bug is a regression introducted in commit 197d18d "Set codewriter variables back to defaults if a new document is created" [7d6af3dd3e56] 2013-01-28 Carsten Grohmann * xml_parse.py: Add source documention for in_sizers and in_windows [8620694a219c] 2013-01-25 Carsten Grohmann * tests/__init__.py: Improve error message for missing test files [63309a107352] * tests/__init__.py, tests/test_codegen.py: Introduce WXGladeBaseTest._test_all() to generate code for all languages at once. [7562a1b59aad] 2013-01-18 Carsten Grohmann * edit_sizers/edit_sizers.py, edit_sizers/lisp_sizers_codegen.py, edit_sizers/perl_sizers_codegen.py, edit_sizers/sizers_codegen.py, tests/casefiles/CPP_Preferences.cpp, tests/casefiles/FontColour.lisp, tests/casefiles/Gauge.lisp, tests/casefiles/Grid.lisp, tests/casefiles/HyperlinkCtrl_26.lisp, tests/casefiles/HyperlinkCtrl_28.lisp, tests/casefiles/LispOgg1.lisp, tests/casefiles/LispOgg2_MyDialog.lisp, tests/casefiles/LispOgg2_MyFrame.lisp, tests/casefiles/LispOgg3.lisp, tests/casefiles/Lisp_Preferences.lisp, tests/casefiles/Lisp_wxBitmapButton.lisp, tests/casefiles/Perl_Preferences.pl, tests/casefiles/add_class_inplace_extended.lisp, tests/casefiles/add_class_inplace_orig.lisp, tests/casefiles/no_suitable_writer.lisp, tests/casefiles/remove_class_inplace_expected.lisp, tests/casefiles/remove_class_inplace_input.lisp: Unify sizer code generation [98a1f4674b36] 2013-01-15 Carsten Grohmann * codegen/pl_codegen.py: Add more wx constants to prevent formatting of those contants. [ff748962a528] 2013-01-07 Carsten Grohmann * NEWS.txt, tree.py, xml_parse.py: applied patch by Roel van Os: "When pasting: only search current top-level window for duplicate names" Original commit: 923:3b06bb046ccf at https://bitbucket.org/elentirmo/wxglade_elentirmo [befeac404735] 2013-01-05 Carsten Grohmann * tests/casefiles/CPPOgg1.cpp, tests/casefiles/CPPOgg1.wxg, tests/casefiles/CPPOgg2.wxg, tests/casefiles/CPPOgg2_MyDialog.cpp, tests/casefiles/CPPOgg3.cpp, tests/casefiles/LispOgg1.lisp, tests/casefiles/LispOgg1.wxg, tests/casefiles/LispOgg2.wxg, tests/casefiles/LispOgg2_MyDialog.lisp, tests/casefiles/LispOgg3.lisp, tests/casefiles/LispOgg3.wxg, tests/casefiles/PlOgg1.pl, tests/casefiles/PlOgg1.wxg, tests/casefiles/PlOgg2.wxg, tests/casefiles/PlOgg2_MyDialog.pm, tests/casefiles/PlOgg3.pl, tests/casefiles/PyOgg1.py, tests/casefiles/PyOgg1.wxg, tests/casefiles/PyOgg1_oldnamespace.py, tests/casefiles/PyOgg2.wxg, tests/casefiles/PyOgg2_MyDialog.py, tests/casefiles/PyOgg3.py: Remove flag wxTHICK_FRAME because it is not available with wxPerl 2.8 The code generated by the test suite is fine, but you can't start the test programs with a current wxPerl. Thereby I've remove this flag. [1a2fe678e1b0] 2013-01-04 Carsten Grohmann * NEWS.txt, codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, tests/casefiles/HyperlinkCtrl_26.cpp, tests/casefiles/HyperlinkCtrl_26.lisp, tests/casefiles/HyperlinkCtrl_26.pl, tests/casefiles/HyperlinkCtrl_26.py, tests/casefiles/no_suitable_writer.cpp, tests/casefiles/no_suitable_writer.lisp, tests/casefiles/no_suitable_writer.pl, tests/casefiles/no_suitable_writer.py, tests/casefiles/no_suitable_writer.wxg: Don't add unsupported widgets to a sizer Widgets without code generator or widget that are not supporting the requested wx version are blacklisted now. Thereby the widgets won't add to any sizers. [deff762b7529] * tests/casefiles/HyperlinkCtrl_26.lisp, tests/test_codegen.py: Activate tests for HyperlinkCtrl and Lisp [ae54b3f2c112] * codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py: Remove unused imports of cStringIO [972fc3bdb200] * codegen/__init__.py, tests/casefiles/HyperlinkCtrl_26.pl, tests/casefiles/HyperlinkCtrl_26.py, tests/casefiles/no_suitable_writer.lisp, tests/casefiles/no_suitable_writer.pl, tests/casefiles/no_suitable_writer.py: Add warning messages to Perl, Python and Lisp source code again [0006bfa8f874] 2013-01-02 Carsten Grohmann * codegen/__init__.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, tests/casefiles/HyperlinkCtrl_26.pl, tests/casefiles/LispOgg1.lisp, tests/casefiles/LispOgg2_MyDialog.lisp, tests/casefiles/LispOgg3.lisp, tests/casefiles/Lisp_Preferences.lisp, tests/casefiles/Perl_Preferences.pl, tests/casefiles/PlOgg1.pl, tests/casefiles/PlOgg2_MyDialog.pm, tests/casefiles/no_suitable_writer.lisp, tests/casefiles/no_suitable_writer.pl, tests/test_codegen.py: Unify code generation for widgets in Perl, Python and Lisp. Merge add_object() code of Perl, Python and Lisp code writer. The change unify the code generation code. The warning messages won't be included in generated Perl code now. One of the next commits will re-introduce the warning messages to Perl, Python and Lisp. [f2673117df2a] 2013-01-01 Carsten Grohmann * tests/test_codegen.py: Solve logical bug in test case for no suitable writer A difference between generated and expected code causes an test failure (that's ok). But the temporary removed wxButton widget wouldn't restored in such a case. This change fixes the behaviour. [869922b3cc5e] 2012-12-30 Carsten Grohmann * application.py, codegen/__init__.py, edit_sizers/edit_sizers.py, edit_windows.py, font_dialog.py, misc.py, tree.py, widget_properties.py, wxglade.py: Replace traceback.print_exc() by common.message.exception() [166866b98938] * codegen/__init__.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, tests/casefiles/PlOgg1.pl, tests/casefiles/PlOgg1.wxg: Rework generating code in Lisp, Perl and Python code generator This changes primarily unify the add_class() function and move it to the base class. BTW: This changes solves a bug that has suppressed adding extra code to Perl sources. [f8ef056f45c3] 2012-12-29 Carsten Grohmann * codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py: Simplify access to parent attributes in SourceFileContent The language specific instances of SourceFileContent need access to a few attributes of the parent code writer instance. Most of the ctor parameters are replaced by a new parameter called "code_writer" and this is used to access parents attributes in the ctor once. [28a48389ee1e] * Makefile: Exclude test cases from pylint run [657c33e80e1b] * codegen/xrc_codegen.py, tests/casefiles/add_class_inplace_extended.xrc: Use OrderedDict in XRC code generator to prevent flipping of entries. This flipping entries may break unittests randomly. [814915641f4b] * docs/html/apa.html, docs/html/apb.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch01s07.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s06.html, docs/html/ch03s07.html, docs/html/ch04.html, docs/html/ch05.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/pdf/manual.pdf, docs/src/manual.xml, ordereddict.py: Add 3rd party software OrderedDict The class OrderedDict provides a dictionary that remembers insertion order. This feature is useful to prevent flipping of lines or code blocks in automatically generated source code. [e9fda479ce91] * Makefile, docs/src/html.xsl: Suppress appendix toc in HTML documentation [eb6faf0cccca] 2012-12-28 Carsten Grohmann * codegen/__init__.py, tests/casefiles/remove_class_inplace_expected.cpp, tests/casefiles/remove_class_inplace_expected.lisp, tests/casefiles/remove_class_inplace_expected.pl, tests/casefiles/remove_class_inplace_expected.py, tests/test_codegen.py: Fix warning for removed / renamed top-level classes. The mis-formatting of the warning messages, was probably introduced during the code generator rework. I'm sorry. [53544add48cf] * tests/casefiles/add_class_inplace_extended.cpp, tests/casefiles/add_class_inplace_extended.h, tests/casefiles/add_class_inplace_extended.lisp, tests/casefiles/add_class_inplace_extended.pl, tests/casefiles/add_class_inplace_extended.py, tests/casefiles/add_class_inplace_extended.wxg, tests/casefiles/add_class_inplace_extended.xrc, tests/casefiles/add_class_inplace_orig.cpp, tests/casefiles/add_class_inplace_orig.h, tests/casefiles/add_class_inplace_orig.lisp, tests/casefiles/add_class_inplace_orig.pl, tests/casefiles/add_class_inplace_orig.py, tests/casefiles/add_class_inplace_orig.xrc, tests/casefiles/remove_class_inplace.wxg, tests/casefiles/remove_class_inplace_expected.cpp, tests/casefiles/remove_class_inplace_expected.h, tests/casefiles/remove_class_inplace_expected.lisp, tests/casefiles/remove_class_inplace_expected.pl, tests/casefiles/remove_class_inplace_expected.py, tests/casefiles/remove_class_inplace_expected.xrc, tests/casefiles/remove_class_inplace_input.cpp, tests/casefiles/remove_class_inplace_input.h, tests/casefiles/remove_class_inplace_input.lisp, tests/casefiles/remove_class_inplace_input.pl, tests/casefiles/remove_class_inplace_input.py, tests/casefiles/remove_class_inplace_input.xrc, tests/test_codegen.py: Add two test cases for adding and removing top-level widget in-place The generated code looks broken for Perl, Python and Lisp currently. [21db30e11f3a] 2012-12-26 Carsten Grohmann * NEWS.txt, tests/casefiles/no_suitable_writer.cpp, tests/casefiles/no_suitable_writer.h, tests/casefiles/no_suitable_writer.lisp, tests/casefiles/no_suitable_writer.pl, tests/casefiles/no_suitable_writer.py, tests/casefiles/no_suitable_writer.wxg, tests/casefiles/no_suitable_writer.xrc, tests/test_codegen.py: Add a test case to test "no suitable writer" warning. This warning occurs if the widget exists generally but there is no writer for the language to generate. Currently the warning won't written to all generated source files. It will be written for C++, Lisp and Perl. Not for Python. [dfd7952244cc] * common.py, config.py, template.py: Replace os.mkdir() by more robust and recursive working os.makedirs() [59f60ff617c5] * tests/__init__.py: Add faked implementation of os.makedirs() for unittests [7b14faea8cbf] 2012-12-25 Carsten Grohmann * codegen/__init__.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py: Improve storing files from code generators. Add new functions to separate creating filenames to unify code generators a little bit more. Create sub directories e.g. for Perl modules during saving of the generated source code. [00a679328f06] * tests/__init__.py: Improve faked os.path.isdir() implementation This implementation will be used for tests only. [0c7932b9d1d9] 2012-12-23 Carsten Grohmann * codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, tests/casefiles/CPPOgg1.cpp, tests/casefiles/CPPOgg2_MyDialog.cpp, tests/casefiles/CPPOgg3.cpp, tests/casefiles/CPP_wxCalendarCtrl.cpp, tests/casefiles/CalendarCtrl.pl, tests/casefiles/FontColour.lisp, tests/casefiles/FontColour.pl, tests/casefiles/Gauge.lisp, tests/casefiles/Gauge.pl, tests/casefiles/Grid.cpp, tests/casefiles/Grid.lisp, tests/casefiles/Grid.pl, tests/casefiles/Grid.py, tests/casefiles/HyperlinkCtrl_26.lisp, tests/casefiles/HyperlinkCtrl_26.pl, tests/casefiles/HyperlinkCtrl_28.lisp, tests/casefiles/HyperlinkCtrl_28.pl, tests/casefiles/LispOgg1.lisp, tests/casefiles/LispOgg2_MyDialog.lisp, tests/casefiles/LispOgg2_MyFrame.lisp, tests/casefiles/LispOgg3.lisp, tests/casefiles/Lisp_Preferences.lisp, tests/casefiles/Lisp_wxBitmapButton.lisp, tests/casefiles/Perl_Preferences.pl, tests/casefiles/PlOgg1.pl, tests/casefiles/PlOgg2_MyDialog.pm, tests/casefiles/PlOgg2_MyFrame.pm, tests/casefiles/PlOgg3.pl, tests/casefiles/PyOgg1.py, tests/casefiles/PyOgg1_oldnamespace.py, tests/casefiles/PyOgg2_MyDialog.py, tests/casefiles/PyOgg3.py: Rework generating constructor code in all code generators This causes some minor changes in the code generated by wxGlade for Lisp, Perl, Python and C++. For Perl: Some empty lines are gone. For Lisp: The round brackets are now outside of the blocks "begin wxGlade" and "end wxGlade" in the Lisp code now. There is an additional new line in front of the dependencies now. For Python: A single quotation mark has changed in a printed message. For C++: Event table and event handler stubs have been moved later in the same file. This change was necessary to equalise parts of the C++ code generator code. [95047b445b12] 2012-12-22 Carsten Grohmann * codegen/__init__.py: Fix for wrong formatted error message [a93cd2d12368] 2012-12-21 Carsten Grohmann * codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, tests/casefiles/CalendarCtrl.pl, tests/casefiles/FontColour.lisp, tests/casefiles/FontColour.pl, tests/casefiles/Gauge.lisp, tests/casefiles/Gauge.pl, tests/casefiles/Grid.lisp, tests/casefiles/Grid.pl, tests/casefiles/HyperlinkCtrl_26.lisp, tests/casefiles/HyperlinkCtrl_26.pl, tests/casefiles/HyperlinkCtrl_28.lisp, tests/casefiles/HyperlinkCtrl_28.pl, tests/casefiles/LispOgg1.lisp, tests/casefiles/LispOgg2_MyDialog.lisp, tests/casefiles/LispOgg2_MyFrame.lisp, tests/casefiles/LispOgg3.lisp, tests/casefiles/Lisp_Preferences.lisp, tests/casefiles/Lisp_wxBitmapButton.lisp, tests/casefiles/Perl_Preferences.pl, tests/casefiles/PlOgg1.pl, tests/casefiles/PlOgg2_MyDialog.pm, tests/casefiles/PlOgg2_MyFrame.pm, tests/casefiles/PlOgg3.pl: Rework __do_layout() and __set_properties() in all code generators Now the functions __do_layout() and __set_properties() are generated by using the same code. This causes some minor changes in the code generated by wxGlade for both functions for Perl and Lisp. Both changes effects only Perl and Lisp code generated for both functions and if in-place editing is used. For Perl: Some empty lines are gone. For Lisp: The round brackets are now outside of the blocks "begin wxGlade" and "end wxGlade" in the Lisp code now. [f307a8fbd781] * codegen/pl_codegen.py: Remove preview code from Perl code generator [3cf9c2976fc8] * widgets/bitmap_button/lisp_codegen.py: Add missing newlines in Lisp codegen for wxBitmapButton [817d0c6175e1] 2012-12-20 Carsten Grohmann * codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py: Code generatore source code cleanups and aligments [9608beb7c72f] * codegen/__init__.py, codegen/xrc_codegen.py, tests/casefiles/HyperlinkCtrl_26.cpp, tests/casefiles/HyperlinkCtrl_26.pl: Add BaseSourceFileContent._format_comment() and _source_comment(). Generic functions to write a warning message to the source code. [3958c37229b2] 2012-12-19 Carsten Grohmann * xml_parse.py: Fix directory check in CodeWriter class if just the file name is given [6c1e25ee98e6] * NEWS.txt: Update NEWS.txt [296e50bb4c1b] * NEWS.txt, icons/hyperlink_ctrl.xpm, tests/casefiles/HyperlinkCtrl_26.cpp, tests/casefiles/HyperlinkCtrl_26.h, tests/casefiles/HyperlinkCtrl_26.lisp, tests/casefiles/HyperlinkCtrl_26.pl, tests/casefiles/HyperlinkCtrl_26.py, tests/casefiles/HyperlinkCtrl_26.wxg, tests/casefiles/HyperlinkCtrl_26.xrc, tests/casefiles/HyperlinkCtrl_28.cpp, tests/casefiles/HyperlinkCtrl_28.h, tests/casefiles/HyperlinkCtrl_28.lisp, tests/casefiles/HyperlinkCtrl_28.pl, tests/casefiles/HyperlinkCtrl_28.py, tests/casefiles/HyperlinkCtrl_28.wxg, tests/casefiles/HyperlinkCtrl_28.xrc, tests/test_codegen.py, widgets/hyperlink_ctrl/__init__.py, widgets/hyperlink_ctrl/codegen.py, widgets/hyperlink_ctrl/hyperlink_ctrl.py, widgets/hyperlink_ctrl/lisp_codegen.py, widgets/hyperlink_ctrl/perl_codegen.py, widgets/widgets.txt: Add new widget HyperlinkCtrl [391295336917] 2012-12-18 Carsten Grohmann * events_mixin.py, misc.py: Remove code to support Python 2.2 [eb35f65cadf9] * misc.py: Epydoc fix [f8e79ab6fffb] * edit_windows.py, widget_properties.py: Remove unused code [793912785cee] * NEWS.txt, codegen/__init__.py, edit_windows.py, misc.py: Add support for widget builder that don't support all wx versions Some new widgets like wxHyperlinkCtrl are not available for wxWidgets 2.6. Thereby a new class attribute called "supported_by" is introducted. The attribute has set in the code generator class are well as in the class to edit the widget. The properties window shows a note at bottom if the widget is not supported at all wx versions supported by wxGlade. [ddbfb3f0bb2d] * application.py: Add a class variable to Application class with all supported wx versions The class variable Application.all_supported_versions contains a list of all supported wxWidgets versions now. The variable is also used to build GUI elements. [016625ff23ce] 2012-12-17 Carsten Grohmann * codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py: Just add a comment to source [72cd121f0c04] 2012-12-16 Carsten Grohmann * codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py: Unify codegenerators Move the initial action for adding a object from language specific code generators to base class BaseCodeWriter. [aa8fa3b004cd] 2012-12-14 Carsten Grohmann * codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py: Minor changes to eliminate a indentation level [e96710974d59] * misc.py: Check abbreviations case in-sensitive and return them upper case The function capitalize() doesn't capitalize some abbreviations e.g. XML. Now the check for this abbreviations is case in-sensitive and returns the abbreviation always upper case. [0876a4632567] 2012-12-11 Carsten Grohmann * main.py: Show filename of loaded project file [48c968ca924b] 2012-12-08 Carsten Grohmann * xml_parse.py: Use common.messages.exception() for exception logging [0cd7f89db07b] * xml_parse.py: Implement workaround for SAX internal UnicodeEncodeError (sf bug #149) Permanent workaround for Python bug "Sax parser crashes if given unicode file name" (http://bugs.python.org/issue11159). This bug causes a UnicodeEncodeError if the SAX XML parser wants to store an unicode filename internally. That's not a general file handling issue because the parameter source is an open file already. [244a415a4c5b] * NEWS.txt, application.py, codegen/__init__.py, codegen/xrc_codegen.py, common.py, main.py, widget_properties.py: Improve message logging [63c4f06d4d40] 2012-12-07 Carsten Grohmann * xml_parse.py: Pep8 and documentation changes only [c715ad2019a8] * layout_option_property.py: Rename unused variable [1837b69fb41a] * main.py: Remove mutable default arguments [bc3c6f504fc4] * edit_sizers/__init__.py: Add some comments [321c6bd38818] * application.py, widget_properties.py: Remove mutable default arguments [a7ffaf686b21] * widget_properties.py: Remove unused parameter first in on_change_value() Currently on_change_value() is mostly used for event handling an mutable argument first isn't used. [60c3a81acd1c] 2012-12-04 Carsten Grohmann * docs/html/apa.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch01s07.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch02s06.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s06.html, docs/html/ch03s07.html, docs/html/ch04.html, docs/html/ch04s02.html, docs/html/ch05.html, docs/html/ch05s03.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/html/wxglade.png, docs/pdf/manual.pdf, docs/src/manual.xml, docs/src/wxglade.png: Update and extend documentation [f9b3c679ebb4] * xrc2wxg.py: Set HG executable bit only [cc18532ddd99] 2012-12-03 Carsten Grohmann * NEWS.txt, edit_windows.py, main.py: Fix exceptions during widget preview triggered by keyboard shortcut [a0b7bb0b1c3c] 2012-12-01 Carsten Grohmann * xrc2wxg.py: Pep8 changes only [01afcc969aab] 2012-11-28 Carsten Grohmann * application.py, codegen/cpp_codegen.py, main.py: Add file extension automatically if no extension is given [4c61cec7e162] * credits.txt: Add myself [56b6b11ef5fd] 2012-11-11 Carsten Grohmann * codegen/cpp_codegen.py, tests/casefiles/CPPAddApp_multi_gettext_detailed.cpp, tests/casefiles/CPPAddApp_multi_gettext_simple.cpp, tests/casefiles/CPPAddApp_single_gettext_detailed.cpp, tests/casefiles/CPPAddApp_single_gettext_simple.cpp, tests/casefiles/CPPOgg1.cpp, tests/casefiles/CPPOgg1.h, tests/casefiles/CPPOgg2_main.cpp, tests/casefiles/CPPOgg3.cpp, tests/casefiles/CPPOgg3.h, tests/casefiles/CPP_Preferences.cpp, tests/casefiles/CPP_Preferences.h, tests/casefiles/FontColour.cpp, tests/casefiles/FontColour.h: Relocate parts of the i18n code to a earlier position in file [05ba7a0cecfc] * codegen/__init__.py: Remove cleaning variables in BaseCodeWriter.initialze() The cleanup is done in BaseCodeWriter._init_vars() already. [d9e115cf493a] * NEWS.txt, codegen/cpp_codegen.py, tests/casefiles/CPPAddApp_multi_gettext_detailed.cpp, tests/casefiles/CPPAddApp_multi_gettext_simple.cpp, tests/casefiles/CPPAddApp_multi_simple.cpp, tests/casefiles/CPPAddApp_single_gettext_detailed.cpp, tests/casefiles/CPPAddApp_single_gettext_simple.cpp, tests/casefiles/CPPAddApp_single_simple.cpp, tests/casefiles/CPPOgg1.cpp, tests/casefiles/CPPOgg2_main.cpp, tests/casefiles/CPPOgg3.cpp, tests/casefiles/CPP_Preferences.cpp, tests/casefiles/CPP_wxCalendarCtrl.cpp, tests/casefiles/CalendarCtrl.cpp, tests/casefiles/FontColour.cpp, tests/casefiles/Gauge.cpp, tests/casefiles/Grid.cpp, tests/test_codegen.py: Add simple application start code to C++ code generator [48d35546c885] * NEWS.txt, codegen/cpp_codegen.py, tests/casefiles/CPPAddApp_multi_gettext_detailed.cpp, tests/casefiles/CPPAddApp_single_gettext_detailed.cpp, tests/casefiles/CPPOgg1.cpp, tests/casefiles/CPPOgg2_main.cpp, tests/casefiles/CPPOgg3.cpp, tests/casefiles/FontColour.cpp: Add i18n support to C++ code generator [962f2af1515d] 2012-11-10 Carsten Grohmann * NEWS.txt: Update NEWS.txt [d6a6014568f0] * codegen/__init__.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py: Rename some codegen variables and extent source documentation [a4429201e969] * codegen/py_codegen.py, tests/casefiles/FontColour.py, tests/casefiles/PyAddApp_multi_gettext_detailed.py, tests/casefiles/PyAddApp_multi_gettext_simple.py, tests/casefiles/PyAddApp_single_gettext_detailed.py, tests/casefiles/PyAddApp_single_gettext_simple.py, tests/casefiles/PyOgg1.py, tests/casefiles/PyOgg1_oldnamespace.py, tests/casefiles/PyOgg2_app.py, tests/casefiles/PyOgg3.py, tests/casefiles/Python_Preferences.py: Relocate Pythons gettext import statements [0603b7328418] * codegen/__init__.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py: Move python codegen specific code from BaseCodeWriter to PythonCodeWriter [66b7578476bd] 2012-11-09 Carsten Grohmann * codegen/__init__.py, codegen/pl_codegen.py, codegen/py_codegen.py: Set codewriter variables back to defaults if a new document is created [197d18db6d1d] 2012-11-07 Carsten Grohmann * codegen/pl_codegen.py, tests/casefiles/PlAddApp_multi_gettext_simple.pl, tests/casefiles/PlAddApp_multi_simple.pl, tests/casefiles/PlOgg2_app.pl: Simplify generation of Perl application startup code [33a7e8bfbade] * NEWS.txt, codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, tests/test_codegen.py: Separate code templates for application startup code The code pieces are moved into class variables as well as join language specific parts of add_app(). [8c4d1d553680] 2012-11-05 Carsten Grohmann * tests/casefiles/CPPAddApp_detailed.cpp, tests/casefiles/CPPAddApp_gettext_detailed.cpp, tests/casefiles/CPPAddApp_gettext_simple.cpp, tests/casefiles/CPPAddApp_multi_detailed.cpp, tests/casefiles/CPPAddApp_multi_gettext_detailed.cpp, tests/casefiles/CPPAddApp_simple.cpp, tests/casefiles/CPPAddApp_single_detailed.cpp, tests/casefiles/CPPAddApp_single_gettext_detailed.cpp, tests/casefiles/CPPAddApp_single_gettext_simple.cpp, tests/casefiles/CPPAddApp_single_simple.cpp, tests/casefiles/LispAddApp_detailed.lisp, tests/casefiles/LispAddApp_gettext_detailed.lisp, tests/casefiles/LispAddApp_gettext_simple.lisp, tests/casefiles/LispAddApp_multi_detailed.lisp, tests/casefiles/LispAddApp_multi_gettext_detailed.lisp, tests/casefiles/LispAddApp_multi_gettext_simple.lisp, tests/casefiles/LispAddApp_multi_simple.lisp, tests/casefiles/LispAddApp_simple.lisp, tests/casefiles/LispAddApp_single_detailed.lisp, tests/casefiles/LispAddApp_single_gettext_detailed.lisp, tests/casefiles/LispAddApp_single_gettext_simple.lisp, tests/casefiles/LispAddApp_single_simple.lisp, tests/casefiles/PlAddApp_detailed.pl, tests/casefiles/PlAddApp_gettext_detailed.pl, tests/casefiles/PlAddApp_gettext_simple.pl, tests/casefiles/PlAddApp_multi_detailed.pl, tests/casefiles/PlAddApp_multi_gettext_detailed.pl, tests/casefiles/PlAddApp_multi_gettext_simple.pl, tests/casefiles/PlAddApp_multi_simple.pl, tests/casefiles/PlAddApp_simple.pl, tests/casefiles/PlAddApp_single_detailed.pl, tests/casefiles/PlAddApp_single_gettext_detailed.pl, tests/casefiles/PlAddApp_single_gettext_simple.pl, tests/casefiles/PlAddApp_single_simple.pl, tests/casefiles/PyAddApp_detailed.py, tests/casefiles/PyAddApp_gettext_detailed.py, tests/casefiles/PyAddApp_gettext_simple.py, tests/casefiles/PyAddApp_multi_detailed.py, tests/casefiles/PyAddApp_multi_gettext_detailed.py, tests/casefiles/PyAddApp_multi_gettext_simple.py, tests/casefiles/PyAddApp_multi_simple.py, tests/casefiles/PyAddApp_simple.py, tests/casefiles/PyAddApp_single_detailed.py, tests/casefiles/PyAddApp_single_gettext_detailed.py, tests/casefiles/PyAddApp_single_gettext_simple.py, tests/casefiles/PyAddApp_single_simple.py, tests/test_codegen.py: Add more tests for app code generation [021f78af9555] * codegen/__init__.py, codegen/cpp_codegen.py, tests/test_codegen.py: Rename CPPCodeWriter.output_source to CPPCodeWriter.output_file [d708a58267a3] 2012-11-04 Carsten Grohmann * tests/casefiles/CPPAddApp_detailed.cpp, tests/casefiles/CPPAddApp_gettext_detailed.cpp, tests/casefiles/CPPAddApp_gettext_simple.cpp, tests/casefiles/CPPAddApp_simple.cpp, tests/casefiles/LispAddApp_detailed.lisp, tests/casefiles/LispAddApp_gettext_detailed.lisp, tests/casefiles/LispAddApp_gettext_simple.lisp, tests/casefiles/LispAddApp_simple.lisp, tests/casefiles/PlAddApp_detailed.pl, tests/casefiles/PlAddApp_gettext_detailed.pl, tests/casefiles/PlAddApp_gettext_simple.pl, tests/casefiles/PlAddApp_simple.pl, tests/casefiles/PyAddApp_detailed.py, tests/casefiles/PyAddApp_gettext_detailed.py, tests/casefiles/PyAddApp_gettext_simple.py, tests/casefiles/PyAddApp_simple.py, tests/test_codegen.py: Add test for app code generation [d4a475e26fc5] 2012-11-01 Carsten Grohmann * NEWS.txt, application.py: Add more tooltips to properties window [6213d466e7d2] * widget_properties.py: Added tooltip for DialogProperty [d457dcb2e491] 2012-10-29 Carsten Grohmann * widget_properties.py: Rework tooltip handling to allow to set of tooltips without calling display() [8366ad0117c4] * docs/html/apa.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s06.html, docs/html/ch03s07.html, docs/html/ch04.html, docs/html/ch05.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/pdf/manual.pdf, docs/src/manual.xml: Minor layout changes in wxGlade manual [bfbca28b9495] 2012-10-28 Carsten Grohmann * widget_properties.py: Minor source documentation changes [b62aa553df64] * application.py, docs/html/apa.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s06.html, docs/html/ch03s07.html, docs/html/ch04.html, docs/html/ch05.html, docs/html/design_window.png, docs/html/design_window_empty_slot.png, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/html/properties_window.png, docs/html/select_frame.png, docs/pdf/manual.pdf, docs/src/design_window.png, docs/src/design_window_empty_slot.png, docs/src/properties_window.png, docs/src/select_frame.png: Enable sorting and capitalising code writer languages in "Properties" window [d6f337f53aa2] * widget_properties.py: Extent RadioProperty to sort and capitalise the choices [53c99a8f359e] 2012-10-27 Carsten Grohmann * application.py: Consolidate creation of file dialog wildcards [62a6b7f55276] * application.py, misc.py, widget_properties.py: Write and use own function to capitalise first character. This function don't change upper case abbreviations like XML and XRC. Be carefully because this function may break i18n. [486b631cf86a] 2012-10-11 Carsten Grohmann * README.txt: Minor update [cd759433b243] 2012-10-09 Carsten Grohmann * widgets/button/button.py: Improve tooltip for wxButton [c90cff67d98e] * application.py, tests/test_gui.py: Add test case for testing code generation in GUI [a3b636b9f222] * tests/__init__.py: Separate setting of test specific options in a wxg (XML) file [622ba804444f] 2012-09-19 Carsten Grohmann * templates/Dialog with two buttons.wgt, templates/Dialog_with_two_buttons.wgt: Replace spaces in a template file by underscore [461a9bc6ea67] 2012-09-16 Carsten Grohmann * NEWS.txt, layout_option_property.py, widget_properties.py: Change tooltip handling - mangled property names will not show anymore - tooltips will be shown at all elements of a property [035e16478e27] 2012-09-15 Carsten Grohmann * wxglade.py: Remove unused variable msg from command_line_code_generation() [8f35f89490e7] 2012-08-13 Carsten Grohmann * docs/html/apa.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s06.html, docs/html/ch03s07.html, docs/html/ch04.html, docs/html/ch05.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/pdf/manual.pdf: Rebuild documentation [41313818bb7a] * docs/html/apa.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s06.html, docs/html/ch03s07.html, docs/html/ch04.html, docs/html/ch04s02.html, docs/html/ch05.html, docs/html/ch05s03.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/html/properties_window.png, docs/pdf/manual.pdf, docs/src/manual.xml, docs/src/properties_window.png: Update and extend documentation [4737d780ab66] 2012-07-08 Carsten Grohmann * tests/casefiles/CalendarCtrl.cpp, tests/casefiles/CalendarCtrl.h, tests/casefiles/CalendarCtrl.pl, tests/casefiles/CalendarCtrl.py, tests/casefiles/CalendarCtrl.wxg, tests/casefiles/CalendarCtrl.xrc, tests/test_codegen.py: Add test code for wxCalendarCtrl [0bfbfe01fca7] 2012-07-08 Eric McKeeth * widgets/calendar_ctrl/perl_codegen.py: Add Perl code generator for wxCalendarCtrl Special thanks to Eric for sharing his code. [9756a246126b] 2012-06-11 Carsten Grohmann * codegen/cpp_codegen.py: Fix typos introduces in last commit :-( [26a8c0791097] * NEWS.txt, codegen/cpp_codegen.py, tests/casefiles/CPPOgg1.h, tests/casefiles/CPPOgg2_MyDialog.h, tests/casefiles/CPPOgg2_MyFrame.h, tests/casefiles/CPPOgg3.h, tests/casefiles/CPP_Preferences.h, tests/casefiles/CPP_wxCalendarCtrl.h, tests/casefiles/FontColour.h, tests/casefiles/Gauge.h, tests/casefiles/Grid.h: Write isolation directives at beginning in C++ header files [bf0292744c03] 2012-06-09 Carsten Grohmann * docs/html/apa.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s06.html, docs/html/ch03s07.html, docs/html/ch04.html, docs/html/ch05.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/pdf/manual.pdf, docs/src/manual.xml: Extend documentation about the various installation methods [55914b697ea9] 2012-06-07 Carsten Grohmann * codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, tests/test_codegen.py: Fix regression in generate_code_id() for parameter id [dc3cd635d687] 2012-05-31 Carsten Grohmann * wxglade.py: Replace tabs by spaces introducted in 1090:c93d25c53d31 (thanks Davorin) [b7e9747cf820] 2012-05-30 Carsten Grohmann * widgets/notebook/notebook.py: Improve name generation of notebooks and notebook panes Noetbook names as well as notebook pane names should be unique. Deleted default names won't be reused. [66bec3ea57c7] 2012-05-27 Carsten Grohmann * tests/__init__.py: Adapt test suite to handle improved error handling well [f752c17b6a6a] * NEWS.txt, widgets/notebook/notebook.py: Fix: Same default names for multiple notebooks (sf bug #2000566) [d33686c3f223] 2012-05-25 Carsten Grohmann * codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py: Update Copyright notice at code generators [6bf0febe90b8] 2012-05-23 Carsten Grohmann * wxglade.py: Use error() for printing error messages [0bda2cf7f89c] * application.py, errors.py, wxglade.py, xml_parse.py: Improve error handling for non-existing and non-writable output directories [029b310aa249] 2012-05-20 Carsten Grohmann * xml_parse.py: Empty output path raises XmlParsingError during code generation [ff1bfdb1a265] * codegen/__init__.py: Improve error handling of chmod after writing main output file [14bb00b4fc49] 2012-05-18 Carsten Grohmann * codegen/pl_codegen.py, tests/casefiles/CPPOgg1.cpp, tests/casefiles/CPPOgg1.wxg, tests/casefiles/CPPOgg2.wxg, tests/casefiles/CPPOgg2_MyDialog.cpp, tests/casefiles/CPPOgg3.cpp, tests/casefiles/FontColour.pl, tests/casefiles/LispOgg1.lisp, tests/casefiles/LispOgg1.wxg, tests/casefiles/LispOgg2.wxg, tests/casefiles/LispOgg2_MyDialog.lisp, tests/casefiles/LispOgg3.lisp, tests/casefiles/LispOgg3.wxg, tests/casefiles/Perl_Preferences.pl, tests/casefiles/PlOgg1.pl, tests/casefiles/PlOgg1.wxg, tests/casefiles/PlOgg2.wxg, tests/casefiles/PlOgg2_MyDialog.pm, tests/casefiles/PlOgg2_MyFrame.pm, tests/casefiles/PlOgg3.pl, tests/casefiles/PyOgg1.py, tests/casefiles/PyOgg1.wxg, tests/casefiles/PyOgg1_oldnamespace.py, tests/casefiles/PyOgg2.wxg, tests/casefiles/PyOgg2_MyDialog.py, tests/casefiles/PyOgg3.py: Fix regression for gettext handling in Perl code generator [b664b2c06055] 2012-05-12 Carsten Grohmann * docs/html/apa.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s06.html, docs/html/ch03s07.html, docs/html/ch04.html, docs/html/ch05.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/pdf/manual.pdf, docs/src/manual.xml, wxglade.py: Improve searching for files credits.txt and license.txt Both files were not found if wxGlade has been installed at /opt/wxglade like suggested in manual. [c93d25c53d31] * codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py: Unify codegenerators a little bit more [e3555a296146] * codegen/__init__.py: Minor changes for epydoc [1cd403eda874] 2012-05-11 Carsten Grohmann * codegen/cpp_codegen.py, tests/casefiles/CPPOgg1.cpp, tests/casefiles/CPPOgg1.h, tests/casefiles/CPPOgg2_MyDialog.cpp, tests/casefiles/CPPOgg2_MyDialog.h, tests/casefiles/CPPOgg2_MyFrame.cpp, tests/casefiles/CPPOgg2_MyFrame.h, tests/casefiles/CPPOgg2_main.cpp, tests/casefiles/CPPOgg3.cpp, tests/casefiles/CPPOgg3.h, tests/casefiles/CPP_Preferences.cpp, tests/casefiles/CPP_Preferences.h, tests/casefiles/CPP_wxCalendarCtrl.cpp, tests/casefiles/CPP_wxCalendarCtrl.h, tests/casefiles/FontColour.cpp, tests/casefiles/FontColour.h, tests/casefiles/Gauge.cpp, tests/casefiles/Gauge.h, tests/casefiles/Grid.cpp, tests/casefiles/Grid.h: Write small example how to compile in all C++ source and header files [080087eecb51] * tests/casefiles/CPPOgg1.cpp, tests/casefiles/CPPOgg1.h, tests/casefiles/CPPOgg1.wxg, tests/casefiles/CPPOgg2.wxg, tests/casefiles/CPPOgg2_MyDialog.h, tests/casefiles/CPPOgg2_MyFrame.h, tests/casefiles/CPPOgg3.h: Convert non-C++ statements into C++ statements to allow compiling Now all C++ examples compile well. [42da1e54f9c3] 2012-05-10 Carsten Grohmann * codegen/__init__.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py: Move equal finalize() functions into code generator base class [2985e0baa93f] 2012-05-09 Carsten Grohmann * codegen/lisp_codegen.py, codegen/pl_codegen.py: Minor code changes [253c1da088ff] * codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, tests/casefiles/FontColour.cpp, tests/casefiles/FontColour.h, tests/casefiles/FontColour.lisp, tests/casefiles/FontColour.pl, tests/casefiles/FontColour.py, tests/casefiles/FontColour.wxg, tests/casefiles/FontColour.xrc, tests/test_codegen.py: Unify code generation for colours and fonts [25652001602c] 2012-05-08 Carsten Grohmann * tests/casefiles/Grid.cpp, tests/casefiles/Grid.lisp, tests/casefiles/Grid.pl, tests/casefiles/Grid.py, tests/casefiles/Grid.wxg, tests/casefiles/Grid.xrc: Fix: Wrong attribute names [ed32915f7ffb] * tests/__init__.py, tests/casefiles/PyOgg1_oldnamespace.py, tests/test_codegen.py: Add one testcase for generating python code using old wx namespace [84bdfe8dc96c] * codegen/py_codegen.py: Format flags written namespace independent by the python code generator Old version differs between old wx namespace and the new one [96293ca249e6] * widgets/menubar/codegen.py: Cleanup obsolete for_version statement [7c741f95be79] * code_property.py: Cleanup tooltips for extracode and extraproperties This functionality is available at all code generators now [a8c32472ba42] * docs/html/apa.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s06.html, docs/html/ch03s07.html, docs/html/ch04.html, docs/html/ch05.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/man/manpage.xml, docs/pdf/manual.pdf, docs/src/manual.xml: Minor changes for current maintainer [5cb97d02951e] 2012-05-07 Carsten Grohmann * NEWS.txt, codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, tests/__init__.py, tests/casefiles/CPPOgg1.cpp, tests/casefiles/CPPOgg1.h, tests/casefiles/CPPOgg1.wxg, tests/casefiles/CPPOgg2.wxg, tests/casefiles/CPPOgg2_MyDialog.cpp, tests/casefiles/CPPOgg2_MyDialog.h, tests/casefiles/CPPOgg2_MyFrame.cpp, tests/casefiles/CPPOgg2_MyFrame.h, tests/casefiles/CPPOgg2_main.cpp, tests/casefiles/CPPOgg3.cpp, tests/casefiles/CPPOgg3.h, tests/casefiles/CPP_Preferences.cpp, tests/casefiles/CPP_Preferences.h, tests/casefiles/CPP_wxCalendarCtrl.cpp, tests/casefiles/CPP_wxCalendarCtrl.h, tests/casefiles/CPP_wxCalendarCtrl.wxg, tests/casefiles/Gauge.cpp, tests/casefiles/Gauge.h, tests/casefiles/Gauge.lisp, tests/casefiles/Gauge.pl, tests/casefiles/Gauge.py, tests/casefiles/Gauge.wxg, tests/casefiles/Grid.cpp, tests/casefiles/Grid.h, tests/casefiles/Grid.lisp, tests/casefiles/Grid.pl, tests/casefiles/Grid.py, tests/casefiles/Grid.wxg, tests/casefiles/Grid.xrc, tests/casefiles/GridEvents.cpp, tests/casefiles/GridEvents.h, tests/casefiles/GridEvents.lisp, tests/casefiles/GridEvents.pl, tests/casefiles/GridEvents.py, tests/casefiles/GridEvents.wxg, tests/casefiles/GridEvents.xrc, tests/casefiles/LispOgg1.lisp, tests/casefiles/LispOgg1.wxg, tests/casefiles/LispOgg2.wxg, tests/casefiles/LispOgg2_MyDialog.lisp, tests/casefiles/LispOgg2_MyFrame.lisp, tests/casefiles/LispOgg2_app.lisp, tests/casefiles/LispOgg3.lisp, tests/casefiles/LispOgg3.wxg, tests/casefiles/Lisp_Preferences.lisp, tests/casefiles/Lisp_Preferences.wxg, tests/casefiles/Lisp_wxBitmapButton.lisp, tests/casefiles/Lisp_wxBitmapButton.wxg, tests/casefiles/Notebook_w_tabs.wxg, tests/casefiles/Notebook_wo_tabs.wxg, tests/casefiles/Perl_Preferences.pl, tests/casefiles/PlOgg1.pl, tests/casefiles/PlOgg1.wxg, tests/casefiles/PlOgg2.wxg, tests/casefiles/PlOgg2_MyDialog.pm, tests/casefiles/PlOgg2_MyFrame.pm, tests/casefiles/PlOgg2_app.pl, tests/casefiles/PlOgg3.pl, tests/casefiles/Preferences.wxg, tests/casefiles/PyOgg1.py, tests/casefiles/PyOgg1.wxg, tests/casefiles/PyOgg2.wxg, tests/casefiles/PyOgg2_MyDialog.py, tests/casefiles/PyOgg2_MyFrame.py, tests/casefiles/PyOgg2_app.py, tests/casefiles/PyOgg3.py, tests/casefiles/Python_Preferences.py, tests/test_codegen.py: Rework and unify code generators. All code generators support extracode and extraproperties now. Sorry for the huge commit. [31dd07530557] 2012-04-14 Carsten Grohmann * widgets/dialog/lisp_codegen.py, widgets/frame/lisp_codegen.py: Fix: Lisp code generation for wxFrame and wxDialog [baa3e7f42b61] 2012-04-12 Carsten Grohmann * NEWS.txt, application.py: Fix: Encoding detection for Mac OS X [b48da20df8f4] 2012-03-14 Carsten Grohmann * docs/html/ch03s07.html, docs/html/pr01s03.html: Add two missing HTML files of the previously committed user manual [b88235c2317b] * Makefile, NEWS.txt, docs/html/apa.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch03s07.html, docs/html/ch04.html, docs/html/ch04s02.html, docs/html/ch04s03.html, docs/html/ch04s04.html, docs/html/ch04s05.html, docs/html/ch04s06.html, docs/html/ch04s07.html, docs/html/ch04s08.html, docs/html/ch04s09.html, docs/html/ch04s10.html, docs/html/ch04s11.html, docs/html/ch04s12.html, docs/html/ch04s13.html, docs/html/ch04s14.html, docs/html/ch04s15.html, docs/html/ch04s16.html, docs/html/ch04s17.html, docs/html/ch04s18.html, docs/html/ch04s19.html, docs/html/ch04s20.html, docs/html/ch04s21.html, docs/html/ch04s22.html, docs/html/ch04s23.html, docs/html/ch04s24.html, docs/html/ch04s25.html, docs/html/ch04s26.html, docs/html/ch04s27.html, docs/html/ch05.html, docs/html/ch05s02.html, docs/html/ch05s03.html, docs/html/ch05s04.html, docs/html/example_baseclasses.png, docs/html/example_eventhandler.png, docs/html/example_setproperty.png, docs/html/example_subclassed.png, docs/html/example_variableassigment.png, docs/html/index.html, docs/html/main_window.png, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/html/properties_window.png, docs/html/properties_window_tab_1.png, docs/html/properties_window_tab_1_change.png, docs/html/properties_window_tab_2.png, docs/html/properties_window_tab_3.png, docs/html/properties_window_tab_4.png, docs/html/properties_window_tab_5.png, docs/pdf/manual.pdf, docs/src/example_baseclasses.png, docs/src/example_eventhandler.png, docs/src/example_setproperty.png, docs/src/example_subclassed.png, docs/src/example_variableassigment.png, docs/src/main_window.png, docs/src/manual.xml, docs/src/pdf.xsl, docs/src/properties_window.png, docs/src/properties_window_tab_1.png, docs/src/properties_window_tab_1_change.png, docs/src/properties_window_tab_2.png, docs/src/properties_window_tab_3.png, docs/src/properties_window_tab_4.png, docs/src/properties_window_tab_5.png: Update wxGlade user manual [61123fcf21fb] 2012-03-03 Carsten Grohmann * codegen/pl_codegen.py: Add more constants ... [a53d3c79174a] 2012-03-02 Carsten Grohmann * codegen/pl_codegen.py, edit_sizers/perl_sizers_codegen.py, tests/casefiles/GridEvents.pl, tests/casefiles/Perl_Preferences.pl: Fix: Handling of wx constants in generated Perl code [71a087c94365] * tests/casefiles/Gauge.cpp, tests/casefiles/Gauge.h, tests/casefiles/Gauge.lisp, tests/casefiles/Gauge.pl, tests/casefiles/Gauge.py, tests/casefiles/Gauge.wxg, tests/casefiles/Gauge.xrc, tests/test_codegen.py: Add tests for wxGauge code generation [300a4438fc64] 2012-03-02 Johan Vromans * widgets/gauge/lisp_codegen.py: Fix: Lisp codegen for the Gauge widget was an exact copy of the Perl codegen [c62106cc8ee2] 2012-02-29 Carsten Grohmann * edit_windows.py: Add tooltips for widgets properties "Id" and "Name" [1aaeb0280d1f] 2012-02-21 Carsten Grohmann * wxglade: Add searching for a parallel Python module directory [c2736dfcbf2b] 2012-02-18 Carsten Grohmann * edit_sizers/perl_sizers_codegen.py, tests/casefiles/Perl_Preferences.pl: Generate Perl code for wxStaticBox() with wxID_ANY instead of -1 [6e6d590edffb] * codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, tests/casefiles/GridEvents.lisp, tests/casefiles/GridEvents.pl, tests/casefiles/GridEvents.py, tests/casefiles/Lisp_Preferences.lisp, tests/casefiles/Lisp_wxBitmapButton.lisp, tests/casefiles/Perl_Preferences.pl, tests/test_codegen.py: Add generate_code_id() tests incl. minor code reorg in all generate_code_id() This change may also fix some wrong behaviour introduced by changing the default widget id from -1 to wxID_ANY. [c9a065b06e42] 2012-02-08 Carsten Grohmann * NEWS.txt, codegen/lisp_codegen.py, tests/casefiles/GridEvents.lisp, tests/test_codegen.py: Fix: String formatting issue for event handlers in Lisp code generator [2f11a293bd25] * tests/casefiles/GridEvents.cpp, tests/casefiles/GridEvents.h, tests/casefiles/GridEvents.pl, tests/casefiles/GridEvents.py, tests/casefiles/GridEvents.wxg, tests/casefiles/GridEvents.xrc, tests/test_codegen.py: Add small tests for wxGrid events (sf bug #1542195 - not reproducible) [6e132223ec97] * tests/__init__.py: Show differences for failed non GUI tests (solves buggy last commit) [32a36ba06040] 2012-02-07 Carsten Grohmann * tests/__init__.py, tests/test_codegen.py, tests/test_gui.py: Regorganise test code [063b0f539d9e] * wxglade.py: Do not load wxversion if wx already loaded [d6f3fef52a16] * Makefile: Adapt pylint settings in Makefile [e25a986f109b] * code_property.py, tree.py: Reorg imports [347d58962b18] 2012-02-04 Carsten Grohmann * tests/casefiles/CPP_Preferences.h, tests/casefiles/CPP_Preferences.wxg, tests/casefiles/Perl_Preferences.pl, tests/casefiles/Perl_Preferences.wxg, tests/test_codegen.py: Split sources of test cases to generate working source files [83f41edb5a25] * NEWS.txt, codegen/py_codegen.py, edit_sizers/sizers_codegen.py, edit_windows.py, tests/casefiles/CPP_Preferences.cpp, tests/casefiles/Python_Preferences.py: Change default widget ID from -1 to wxID_ANY and adapt codegen [31c5ee6a109b] 2012-02-01 Carsten Grohmann * install/pyinstaller/wxglade-installer.iss: Exclude test suite from full edtion Windows installer [58fa8e7a8f02] 2012-01-30 Carsten Grohmann * tests/test_gui.py: Split single GUI test in two different tests [ce253b98aea3] * wxglade.py: Don't load wxversion twice wxversion will be imported several times only if the test suite is running. [9fef90204404] * Makefile, test.py, tests/__init__.py, tests/casefiles/Notebook_w_tabs.wxg, tests/casefiles/Notebook_wo_tabs.wxg, tests/test_gui.py: Add first GUI test case [541e8440e543] * widgets/notebook/notebook.py: Improve error message for import notebooks without tabs [8e4513a78a48] 2012-01-27 Carsten Grohmann * config.py, configdialog.py, main.py: Move preferences dialog to own file to simplify handling e.g. for test cases [23e0e1fb35a6] * main.py, tests/__init__.py, wxglade.py: Split initialisation of wxGlade to simplify handling e.g. for test cases [1c0c070e0a3a] * common.py: Add platform variable This variable is introduced to eliminate dependencies to wx (e.g. wx.Platform) for non-interactive runs. [4e9b0be6550f] * NEWS.txt: Minor update of NEWS file [b07c89bd33ae] * misc.py: Remove code to support wxPython < 2.6 [e0dff9e3dbde] 2012-01-25 Carsten Grohmann * widget_properties.py: PEP8 changes and minor cleanups [a20d0ba4d857] * widgets/notebook/notebook.py: [FIX] Prevent deleting last notebook tab (sf bug #3126974) [fb14132b64b1] * widget_properties.py: Added parameter to prevent removing last entry in GridProperty [2f2913cd61ab] 2012-01-23 Carsten Grohmann * config.py, install/pyinstaller/wxglade-installer.iss: Disable usage of KDE file dialogs for non GTK platforms [976d795a4347] 2012-01-20 Carsten Grohmann * common.py: Loading code generators loads only Python files (.py, .pyc, .pyo) only now [4df18386b820] 2012-01-19 Carsten Grohmann * install/pyinstaller/wxglade-installer.iss: Show better version string at windows installer welcome page [c83de5013298] 2012-01-17 Davorin Kunstelj * docs/man/manpage.xml: [FIX] Attribute name mismatch in source of manual page [61be9fe53cc6] 2012-01-14 Carsten Grohmann * codegen/__init__.py, codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py: Rework code generation code to move common parts to codegen/__init__.py and rework code generators partially to be more eqal. [83c5dfb7f8b2] 2012-01-12 Carsten Grohmann * NEWS.txt, codegen/lisp_codegen.py: [FIX] Prevent caching effects in Lisp code generator The code generator remembers parts of earlier generated code without initialisation of class_lines in initialize() [4c4b457413b7] * NEWS.txt: Add stub for new version [885d22f07b17] * tests/casefiles/CPP_Preferences.cpp, tests/casefiles/CPP_Preferences.h, tests/casefiles/Lisp_Preferences.lisp, tests/casefiles/Perl_Preferences.pl, tests/casefiles/Preferences.wxg, tests/casefiles/Python_Preferences.py, tests/test_codegen.py: Add more test cases [f7680a0b3189] 2012-01-11 Carsten Grohmann * common.py, install/pyinstaller/wxglade-installer.iss: Set version numbers back to HG to start new development cycle [46271e66718d] 2012-01-08 Carsten Grohmann * .hgtags: Added tag rel_0.6.5 for changeset 8f314df2d7c8 [742a6175a85f] * common.py, install/pyinstaller/wxglade-installer.iss: Bump version number to 0.6.5 [8f314df2d7c8] [rel_0.6.5] * CHANGES.txt, NEWS.txt, README.txt: Prerelease documentation updates [98dd3bfd0589] * docs/man/manpage.xml: Minor manpage changes [427f6be4dda3] 2012-01-07 Carsten Grohmann * tests/casefiles/CPP_wxCalendarCtrl.cpp, tests/casefiles/CPP_wxCalendarCtrl.h, tests/casefiles/CPP_wxCalendarCtrl.wxg, tests/test_codegen.py, widgets/calendar_ctrl/calendar_ctrl.py, widgets/calendar_ctrl/codegen.py: [FIX] Solve issue "C++ CalendarControl issues in 0.6.3" (sf bug #2782306) [6245cb4685cf] * NEWS.txt, wxglade.py: [FIX] Wrong parameters for CodeWriter() in command_line_code_generation() Bug was introduces with changeset changeset 1022 31fe078c5b0a. [1fa4ee4ff0fb] * common.py: [FIX] Allow saving of generated code to filenames without directory part [49a1a7528bb0] * CHANGES.txt, NEWS.txt, docs/ReleaseSteps.txt, install/pyinstaller /wxglade-installer.iss, install/pyinstaller/wxglade.spec, install/rpm/wxglade.spec, setup.py: Add new file NEWS.txt to summarise release changes [0fa0447f3545] * wxglade.py: Enable gettext for usage message [d14a0777e5cf] * docs/man/manpage.xml: Update and extend manual page [d545ac5762d5] 2012-01-06 Carsten Grohmann * wxglade.py: Change option handling as well as add --version and --help [31fe078c5b0a] * wxglade.py, xrc2wxg.py: remove support for Python 2.2 [bf29904a8c6d] * tree.py: Remove unused import edit_windows [c004543d13a1] 2012-01-06 Davorin Kunstelj * widget_properties.py: Added column sizes parameter to GridProperty init parameters [0486ded17c35] * widget_properties.py: Added tooltip for CheckBoxProperty [96c42f2c98b4] 2012-01-06 Carsten Grohmann * application.py: Remove code to support wxPython < 2.6 (forgotten part) [1715decea9e6] 2012-01-05 Carsten Grohmann * Makefile, test.py, tests/__init__.py, tests/casefiles/Lisp_wxBitmapButton.lisp, tests/casefiles/Lisp_wxBitmapButton.wxg, tests/test_codegen.py: Add small test suite [2ddd10897c3a] * codegen/lisp_codegen.py: [FIX] Add missing path quotation to codegen.lisp_codegen [5645b1c942ec] 2012-01-03 Carsten Grohmann * codegen/lisp_codegen.py: Remove needless print statement in Lisp code generator [9c5c77444ded] * codegen/lisp_codegen.py: Replace tab characters by spaces in Lisp code generator [595555ae462b] * codegen/lisp_codegen.py: [FIX] Wrong file extensions created by Lisp code generator [53ba588400a7] * common.py: Minor documentation and code reorg in common.save_file() [3c1b5b867e2e] 2012-01-02 Carsten Grohmann * common.py: Minor code reorg in common.load_code_writers() [fcc60dde8f7e] * install/update-po.py: Merge with original file [45bd73138365] * widgets/combo_box/combo_box.py: Remove duplicate code EditComboBox.create_widget() [d7b4000211d4] * about.py, application.py, common.py, config.py, edit_sizers/edit_sizers.py, edit_windows.py, font_dialog.py, main.py, misc.py, tree.py, widget_properties.py, widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/menubar/menubar.py, widgets/notebook/notebook.py, widgets/panel/panel.py, widgets/toolbar/toolbar.py, xml_parse.py: Remove code to support wxPython < 2.6 [4aef6ad90356] * main.py, misc.py: Remove unused function misc.sizer_fixed_Insert() [dbd92a3e6c34] * Makefile: Adapt pylint settings in Makefile [d3afa362e510] * misc.py: Remove obsolete second "import wx" [01ade77d0851] 2011-12-30 Carsten Grohmann * main.py, wxglade.py: Move "Using wxPython " to main.py to eliminate "import wx" [bd1ffca4d46d] 2011-12-30 Davorin Kunstelj * misc.py, res/preferences.wxg: Adapt missed icon paths [bdb3fc1536b4] 2011-12-30 Carsten Grohmann * codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/xrc_codegen.py, edit_sizers/edit_sizers.py, main.py, misc.py, tree.py, widgets/bitmap_button/bitmap_button.py, widgets/bitmap_button/lisp_codegen.py, widgets/bitmap_button/perl_codegen.py, widgets/button/button.py, widgets/calendar_ctrl/calendar_ctrl.py, widgets/choice/perl_codegen.py, widgets/datepicker_ctrl/datepicker_ctrl.py, widgets/gauge/gauge.py, widgets/list_box/perl_codegen.py, widgets/list_ctrl/list_ctrl.py, widgets/list_ctrl/perl_codegen.py, widgets/menubar/menubar.py, widgets/notebook/notebook.py, widgets/notebook/perl_codegen.py, widgets/slider/slider.py, widgets/spin_button/spin_button.py, widgets/spin_ctrl/spin_ctrl.py, widgets/splitter_window/splitter_window.py, widgets/static_bitmap/lisp_codegen.py, widgets/static_bitmap/perl_codegen.py, widgets/static_bitmap/static_bitmap.py, widgets/static_line/perl_codegen.py, widgets/text_ctrl/text_ctrl.py, widgets/toolbar/tool.py, widgets/toolbar/toolbar.py, widgets/tree_ctrl/tree_ctrl.py: Remove unused import and minor code elegancy changes [73280bcc4cb7] 2011-12-29 Carsten Grohmann * Makefile: Adapt pylint settings in Makefile [1f6b03bc7a1e] * widgets/bitmap_button/lisp_codegen.py: [FIX] Remove wasted wxButton_SetDefault statement The perl code sizer doesn't have this statement too. Thereby removed. [f815424b0be7] * common.py: Change some initial paths for documentation purposes only All effected path variables will be overwritten during initialisation. [e06603686a91] 2011-12-28 Carsten Grohmann * install/pyinstaller/wxglade-installer.iss: Add epydoc.conf to Windows installer exclude list [0ad85ad3adac] * install/pyinstaller/wxglade-installer.iss: Clean all possible wxGlade MUICache entries always [707e3fca4bc2] * widgets/panel/panel.py: Adapt missed icon path [f2d2b4d4fcbf] * about.py, common.py, main.py, wxglade.py: Continue introducing path variables e.g. credits and license file This solves a bug preventing about dialog showing credits.txt and license.txt. The location of both files differs depending packaging method (Unix vs. Windows vs. running out of the devel directory). [25b89f65c597] * wxglade.py: Minor reorg in determining wxGlade application directory [a3d4cb8675d6] 2011-12-27 Carsten Grohmann * about.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, common.py, configUI.py, edit_sizers/edit_sizers.py, main.py, misc.py, template.py, tree.py, widgets/bitmap_button/codegen.py, widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/menubar/menubar.py, widgets/panel/panel.py, widgets/static_bitmap/codegen.py, widgets/toolbar/codegen.py, widgets/toolbar/toolbar.py, wxglade.py: Add separate path variables for icons, docs, templates and widgets [e7d5fb37af01] * codegen/pl_codegen.py: [FIX] Typo in printing exception details [309045659f30] 2011-12-26 Carsten Grohmann * setup.py: Update Trove Categorization [139778e454a2] * config.py, docs/html/design_window.png, docs/html/main_window.png, docs/html/preview_window.png, docs/html/properties_window.png, docs/html/tree_window.png, docs/src/design_window.png, docs/src/main_window.png, docs/src/manual.xml, docs/src/preview_window.png, docs/src/properties_window.png, docs/src/tree_window.png, edit_widget.py, msgdialog.py, templates_ui.py, wxglade.py, xrc2wxg.py: Just an update of the Unix file permissions [d02e453a9cc9] * Makefile, setup.py: Use only shell script wxglade to start wxGlade at Unix [a1c7f20870a2] * wxglade: Improve searching and executeing of wxglade.py in shell script wxglade [8c50367d4961] * install/srcpkgs/make_wxglade_release.py: Script has been replaced by setup.py in combination with Makefile [5c9fbcc6beaf] * Makefile, TODO.txt, configUI.py, setup.py: No need for separately callable configUI.py (preferences dialog) The preferences dialog is a menu item in the wxGlade GUI. [840d1dbd8a8b] * .hgignore: Ignore files generated by Eric4 IDE too [e18ee53ea945] * Makefile: Add maintainer-clean target to Makefile and extend BIN_FILES [038b1ba36d9b] 2011-12-25 Carsten Grohmann * setup.py: Change package file names from wxglade-* to wxGlade-* [4846d1760beb] * setup.py: Add source files of manpage and wxGlade manual to distribution [d9dc684ae5d4] 2011-12-24 Carsten Grohmann * install/pyinstaller/wxglade-installer.iss: Extend Windows installer to clean MUICache registry entries There are some pages with more information about the MUI cache mechanisms: http://windowsir.blogspot.com/2005/12/mystery-of- muicachesolved.html http://forensicartifacts.com/2010/08/registry- muicache/ [e97476e65b80] * common.py, install/pyinstaller/wxglade-installer.iss: Set version numbers back to HG to start new development cycle [dd4244ccee75] 2011-12-20 Carsten Grohmann * .hgtags: Added tag rel_0.6.4 for changeset d62eb65d431e [f5d52c02c3f8] * common.py, install/pyinstaller/wxglade-installer.iss, install/pyinstaller/wxglade.spec: Bump version number to 0.6.4 [d62eb65d431e] [rel_0.6.4] * CHANGES.txt, README.txt, TODO.txt, changelog.style, docs/BuildingInstaller.txt, docs/ReleaseSteps.txt, install/README.txt: Lot of documentation changes [76577470d149] * common.py: [FIX] Algorithm to get the release tag checked the wrong changeset The release tag isn't located at tip it's located at the revision prior to the tip. [0ee6881eb872] * .hgtags: Added tag rel_0.5 for changeset 6a8223539dd8 [a06615d14d69] * .hgtags: Removed tag v0.5 [469dea276a9d] 2011-12-12 Carsten Grohmann * Makefile: Add PHONY targets [e5d588f2c4ea] 2011-12-11 Carsten Grohmann * debian/changelog, debian/compat, debian/control, debian/copyright, debian/dirs, debian/docs, debian/files, debian/manpage.xml, debian/menu, debian/rules, debian/wxglade.1, install/pyinstaller /wxglade-installer.iss: Remove debian directory The debian directory is used to build debian packages. It will be maintainted by Debian / Ubuntu developers. [eef624e584f9] * codegen/lisp_codegen.py, codegen/pl_codegen.py: Move some import statements to earlier positions [1f13f842ee17] 2011-12-08 Carsten Grohmann * .hgignore: Ignore more files [266ee32c897c] * Makefile, setup.py: Add native Python build mechanism (setup.py) and integrate it into Makefile [676f14704f31] 2011-11-25 Carsten Grohmann * install/pyinstaller/wxglade-installer.iss: Improve start menu structure and exclude some unused docs [3c3fa51d26ed] 2011-11-18 Carsten Grohmann * install/pyinstaller/wxglade-installer.iss: Add PDF manual to Inno-Setup installer [9d8b2ae26672] * docs/pdf/manual.pdf, docs/pdf/readme.txt: Add manual PDF to support building on Windows without whole xml toolchain [cd7f6011bc25] * Makefile, docs/Makefile: Integrate docs Makefile in main Makefile [61098ccf9262] 2011-11-16 Carsten Grohmann * docs/man/manpage.xml: Copy manpage to docs directory [a013cddee9a2] * Makefile: Rework Makefile [9c933c647cb2] * install/pyinstaller/wxglade-installer.iss: Add Makefile and setup.py to windows installer exclude list [c40846689893] 2011-11-11 Carsten Grohmann * wxglade.py: Cosmetic changes only [9ff95f3c63e8] * wxglade.py: Print version string at startup too [f23fe91c8bac] 2011-11-10 Carsten Grohmann * .hgignore: Ignore temporary files created during build process [f2f708d8c69f] * install/pyinstaller/wxglade-SAE-installer.iss, install/pyinstaller /wxglade-installer.iss: Merge and unify installer scripts to reduce redundant code [6e1fbf84463c] * install/pyinstaller/hook-main.py, install/pyinstaller/wxglade.spec: Add License statement [3ef6512ff0db] 2011-11-09 Carsten Grohmann * install/README.txt, install/pyinstaller/wxglade-installer.iss: Improve full edition installer Add show and agree license Create start menu entries for various documentation files Add conversion of some documentation files from Unix EOL to Windows EOL style Show README.txt after installation has been finished [8970d2801499] 2011-11-07 Carsten Grohmann * install/pyinstaller/wxglade-SAE-installer.iss: Add label "(Standalone Edition)" to some links and menu entries [593e091c6312] 2011-11-06 Carsten Grohmann * install/pyinstaller/wxglade-installer.iss: [FIX] Error at "Launch wxGlade" at the end of installer [c6cc275479dc] 2011-11-04 Carsten Grohmann * install/pyinstaller/wxglade-installer.iss: Remove Python bytecode and empty app directory during deinstallation [557f077e2e1c] 2011-10-31 Carsten Grohmann * .hgignore: Ignore temporary directories created during build process [04986689cc15] * install/pyinstaller/wxglade-SAE-installer.iss: Whitespace changes only [d4df6c072a19] * install/pyinstaller/wxglade-installer.iss: Standard installer [f2dea430de7d] * install/pyinstaller/make_installer_script.py, install/pyinstaller /wxglade-SAE-installer.iss, install/pyinstaller/wxglade- installer.iss.template: Rework existing installer to use with standalone edition [0914445da61f] * install/pyinstaller/hook-main.py, install/pyinstaller/wxglade.spec: Rework and improve spec file used by pyinstaller to collect all files [60662246d607] 2011-10-30 Carsten Grohmann * common.py: PEP8 and cosmetic code changes [f7c56de72d14] * common.py: Change common.version to show "(standalone edition)" for frozen installations [ac4a91baffb1] 2011-10-17 Carsten Grohmann * install/srcpkgs/make_wxglade_release.py: Position of dispatch function has changes in new mercurial versions [bdc430fdce2e] * install/rpm/wxglade.spec, wxglade.spec: Relocate RPM spec file [c947792e5a49] * install/README.txt, install/pyinstaller/make_installer_script.py, install/pyinstaller/mondrian.ico, install/pyinstaller/wxglade- installer.iss.template, install/pyinstaller/wxglade.spec, install/srcpkgs/make_wxglade_release.py, install/update-po.py: Merge support files from wxglade-dist-scripts repo [4c3d4812426c] * .hgignore, epydoc.conf: Change location of source documentation from htmldocs to docs/apidocs [5dfb90f92fd3] 2011-10-14 Carsten Grohmann * codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, font_dialog.py, widgets/notebook/notebook.py: Epydoc changes [7cc34000a15d] * codegen/__init__.py: Make codegen to a package by adding __init__.py [9153c50bb9de] 2011-10-12 Carsten Grohmann * codegen/py_codegen.py: Epydoc changes [b603d12e38ae] * common.py: Epydoc changes [60ed85c79faa] 2011-08-15 Carsten Grohmann * codegen/py_codegen.py, xml_parse.py: Epydoc changes [b0247325407e] * edit_sizers/lisp_sizers_codegen.py: Whitespace changes only [d04ce2c84f16] 2011-08-14 Carsten Grohmann * codegen/cpp_codegen.py, codegen/lisp_codegen.py, edit_sizers/edit_sizers.py, widgets/bitmap_button/perl_codegen.py, widgets/button/perl_codegen.py, widgets/calendar_ctrl/calendar_ctrl.py, widgets/checkbox/lisp_codegen.py, widgets/checkbox/perl_codegen.py, widgets/choice/perl_codegen.py, widgets/combo_box/combo_box.py, widgets/combo_box/perl_codegen.py, widgets/custom_widget/perl_codegen.py, widgets/datepicker_ctrl/datepicker_ctrl.py, widgets/dialog/dialog.py, widgets/gauge/gauge.py, widgets/gauge/perl_codegen.py, widgets/grid/grid.py, widgets/grid/perl_codegen.py, widgets/list_box/perl_codegen.py, widgets/list_ctrl/perl_codegen.py, widgets/menubar/perl_codegen.py, widgets/panel/perl_codegen.py, widgets/radio_box/perl_codegen.py, widgets/radio_button/perl_codegen.py, widgets/slider/perl_codegen.py, widgets/spin_button/perl_codegen.py, widgets/spin_ctrl/perl_codegen.py, widgets/splitter_window/perl_codegen.py, widgets/static_bitmap/perl_codegen.py, widgets/static_line/perl_codegen.py, widgets/static_text/perl_codegen.py, widgets/text_ctrl/perl_codegen.py, widgets/toggle_button/perl_codegen.py, widgets/toolbar/codegen.py, widgets/toolbar/perl_codegen.py, widgets/tree_ctrl/perl_codegen.py: Some whitespace changes (e.g. remove tabs) only [56561e6d2f1b] * main.py: Do not use wxversion in frozen installations [c13addd13c4b] 2011-08-08 Alberto Griggio * codegen/py_codegen.py: Applied patch by Ramin Sabet to make generated Python code more PEP8-compliant [157dc78db748] 2011-03-25 Alberto Griggio * edit_sizers/edit_sizers.py: Fixed exception in edit_sizers.change_sizer (do not try to reparent things without a GetParent method) Thanks to Davorin Kunstelj for reporting the bug [96ff5a770485] 2010-08-27 Alberto Griggio * widget_properties.py: Cleaned up multiple imports and added ComboBoxProperty tooltip. Patch provided by Davorin Kunstelj [783a09e9ee04] 2010-06-29 Alberto Griggio * application.py: The fix introduced in changeset 82b4f56b56c6 was actually broken. This one should be better [c21ba8ab8302] 2010-06-28 Alberto Griggio * application.py: Fixed str/unicode mixing issue that was causing code generation to fail [82b4f56b56c6] 2010-01-05 Alberto Griggio * po/fr.po: added French translation by Guillaume Barthe [cdc33fbee011] 2010-01-02 Alberto Griggio * xml_parse.py: generate code using the StringIO module instead of cStringIO, because the latter doesn't play nicely with Unicode Thanks to all the people who reported the bug and suggested patches [0124338e07a7] 2009-12-29 Alberto Griggio * codegen/cpp_codegen.py: C++ output: applied patch by Sander Cox to prevent double line breaks to add up when no extra_code is present. [726b87e1c4e2] 2009-11-30 Alberto Griggio * common.py: fix stupid bug in determining the version number using mercurial The code was catching only ImportError, but in fact there are more things that can go wrong. Fixed by catching everything [33ee9fcf0b2a] 2009-09-18 Alberto Griggio * application.py: fix for issue #1962327 (extra code property allows only ASCII text) [d1260418a762] * codegen/py_codegen.py, edit_sizers/sizers_codegen.py: applied patch by Roel van Os: "Change initialization order to improve tab order" [7ee9265d7a91] 2009-08-25 Alberto Griggio * codegen/pl_codegen.py, widgets/menubar/perl_codegen.py: applied patch by Johan Vromans to fix issue in Perl code generator Here's a quick summary of the issue: """ If a menu entry has a name that contains whitespace (or other non perl-identifier characters) wxglade generates invalid hash keys. """ [8a5c6ed2b841] 2009-06-13 Alberto Griggio * edit_windows.py, tree.py, widget_properties.py, widgets/grid/grid.py: Applied patch by Davorin Kunstelj to allow properties to be "blocked" (locked down) when certain conditions are met [0ad97073204c] 2009-05-13 Alberto Griggio * widgets/bitmap_button/bitmap_button.py: Applied patch by Davorin Kunstelj to fix a tooltip mismatch on bitmap buttons [6115f364f5f0] * widget_properties.py: Applied patch by Davorin Kunstelj to not write disabled ComboBox properties I've changed the patch a little bit to be more compatible with the old behaviour [08ecf9da3935] 2009-04-25 Alberto Griggio * merged fixes to xrc2wxg [f9709e9537f4] 2009-04-18 Alberto Griggio * common.py: Use Mercurial to determine the version number of wxGlade, if possible [297b63b0d5b9] * about.py, application.py, clipboard.py, color_dialog.py, common.py, edit_sizers/edit_sizers.py, edit_widget.py, edit_windows.py, events_mixin.py, font_dialog.py, layout_option_property.py, main.py, tree.py, widget_properties.py, xml_parse.py: Code cleanup: removed unused imports Patch submitted by Carsten Grohmann [283762d13eff] * Fixed an issue and updated some docstrings in the Python code generator Patch submitted by Carsten Grohmann [ba92601b5172] 2009-01-27 Alberto Griggio * xrc2wxg.py: Fix: when importing from XRC, add a scrollable property to wx.ScrolledWindowS [2d602d9b2041] 2009-01-25 Alberto Griggio * xrc2wxg.py: fixed issue #2530409 (wxScrolledWindow could not be imported from XRC) [6badf24df629] 2009-01-11 Alberto Griggio * widgets/panel/codegen.py: fix for bug #2498055 [2637ad7dccd6] 2009-01-08 Alberto Griggio * codegen/py_codegen.py: merge backout [a87d392bed04] * codegen/py_codegen.py: Backed out changeset 3529b9200ebd [4d38c72b6e5c] 2009-01-01 Alberto Griggio * application.py: Moved language-specific properties of Application to separate tabs [2149b6c38f33] * application.py, codegen/cpp_codegen.py, tree.py, xml_parse.py: Applied patch by Sander Cox to allow configuration of indentation for C++ output [e10a3eabc826] 2008-12-29 Alberto Griggio * widget_properties.py: bugfix: in SpinProperty, display() was sometimes called before self.val was set [830d60097cc9] * common.py: set common.version to 'HG' - version number is not meaningful anymore [2bd4ad97e93a] * widget_properties.py: bugfix: in RadioProperty, display() was sometimes called before self.val was set [7ecff3153908] 2008-12-26 Alberto Griggio * widgets/custom_widget/codegen.py, widgets/custom_widget/custom_widget.py, widgets/custom_widget/perl_codegen.py: Applied patch by Geoff May: added option to specify a custom constructor for CustomWidget [b1aa20f4a566] 2008-11-29 Alberto Griggio * codegen/py_codegen.py, common.py: merged changes from home [ffe38d73add4] 2008-11-22 Alberto Griggio * common.py: Fixed bug in common.generated_from() when code generation is invoked from the command line [be5d55a22479] * codegen/py_codegen.py: Fixed bug in python App code generation, introduced by 'wxID_ANY' patch [65f8ae127a49] * widgets/custom_widget/custom_widget.py, widgets/panel/panel.py: Fixed a couple of code formatting issues (lines longer than 80 characters) [f0bbdde66d19] 2008-11-15 Alberto Griggio * codegen/py_codegen.py: applied submitted patch to generate wx.ID_ANY instead of -1 in python code [3529b9200ebd] 2008-10-23 Alberto Griggio * layout_option_property.py, widget_properties.py: applied patch by Roel van Os to fix MacOSX-related bugs [76ec6a75d5f7] 2008-10-21 Alberto Griggio * codegen/cpp_codegen.py: fixed duplication of 'extra code' in C++ output [e28754400002] 2008-07-28 Alberto Griggio * po/de.po, po/fr.po: updated CHARSET for German and French translations [443c06b371b8] 2008-07-25 Alberto Griggio * widgets/list_box/codegen.py: avoid generation of if the list of choices is empty [7d7ae7f7ab18] 2008-04-24 Alberto Griggio * codegen/py_codegen.py: applied patch by Doug Evans to fix "duplicate frame extracode" [60a635ee796e] 2008-03-11 Alberto Griggio * edit_sizers/edit_sizers.py: fixed bug in GridSizer.set_cols the number of *rows* was used instead of that of columns... [40fcf52d3ee2] 2008-02-14 Alberto Griggio * tree.py, widgets/custom_widget/codegen.py: fixed bug in preview when using CustomWidgets [36d05465336e] * widgets/custom_widget/lisp_codegen.py, widgets/custom_widget/perl_codegen.py: Applied patches by Johan Vromans to fix the Perl code generator for Custom Widgets [ce08c0a13c69] 2008-02-01 Alberto Griggio * .hgtags: Added tag rel_0.6.3 for changeset d58a6f9c593a [c5b0342899ac] * common.py, widgets/dialog/dialog.py: updated version number, some indentation changes to dialog.py [d58a6f9c593a] [rel_0.6.3] 2008-01-27 Alberto Griggio * widgets/grid/codegen.py: fixed bug #1876682 [42e197ce6ce0] * widgets/grid/grid.py: fixed indentation (only cosmetic change) [97329288e88b] 2008-01-04 Alberto Griggio * widgets/dialog/codegen.py, widgets/frame/codegen.py: fixed silly bug in xrc code generation [c72e7a85232a] 2007-12-28 Alberto Griggio * .hgtags: Added tag rel_0.6.2 for changeset 0ca2ea7b12e8 [ad8d5d2268ce] * common.py: updated version number to 0.6.2 [0ca2ea7b12e8] [rel_0.6.2] 2007-12-23 Alberto Griggio * application.py, edit_sizers/lisp_sizers_codegen.py, edit_sizers/perl_sizers_codegen.py, edit_sizers/sizers_codegen.py, widget_properties.py, widgets/dialog/codegen.py, widgets/dialog/dialog.py, widgets/frame/codegen.py, widgets/frame/frame.py: added "size hints" property to wxFrame and wxDialog [7c3c542a1dc6] 2007-12-08 Alberto Griggio * update-po.py: moved update-po.py to repository "wxglade-dist-scripts" [300911d54fce] 2007-12-06 Alberto Griggio * wxglade.py: fix for Python <= 2.3, where no built-in "sorted" exists [1c8be6cb3bed] 2007-11-27 Alberto Griggio * common.py: Merged i18n changes by Homin Lee [e89bc8228b2f] 2007-11-08 Homin Lee * update-po.py: modifying... update-po.py [f809b22058f3] * update-po.py: add update-po.py which based on mki18n.py from http://wiki.wxpython.org/Internationalization [411a98ae91be] * po/ja.po: add Japanese po from Japanese wxglade.mo [b4dcdefcb8b9] 2007-11-08 Administrator * about.py, application.py, code_property.py, common.py, config.py, edit_sizers/edit_sizers.py, edit_windows.py, events_mixin.py, font_dialog.py, kdefiledialog.py, layout_option_property.py, locale/ja/LC_MESSAGES/wxglade.mo, misc.py, template.py, templates_ui.py, tree.py, widget_properties.py, widgets/bitmap_button/bitmap_button.py, widgets/button/button.py, widgets/calendar_ctrl/calendar_ctrl.py, widgets/checkbox/checkbox.py, widgets/choice/choice.py, widgets/combo_box/combo_box.py, widgets/custom_widget/custom_widget.py, widgets/datepicker_ctrl/datepicker_ctrl.py, widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/gauge/gauge.py, widgets/grid/grid.py, widgets/list_box/list_box.py, widgets/list_ctrl/list_ctrl.py, widgets/menubar/menubar.py, widgets/notebook/notebook.py, widgets/panel/panel.py, widgets/radio_box/radio_box.py, widgets/radio_button/radio_button.py, widgets/slider/slider.py, widgets/spacer/spacer.py, widgets/spin_button/spin_button.py, widgets/spin_ctrl/spin_ctrl.py, widgets/splitter_window/splitter_window.py, widgets/static_bitmap/static_bitmap.py, widgets/static_line/static_line.py, widgets/static_text/static_text.py, widgets/text_ctrl/text_ctrl.py, widgets/toggle_button/toggle_button.py, widgets/toolbar/toolbar.py, widgets/tree_ctrl/tree_ctrl.py, xml_parse.py: add japanese mo, update scripts that unmanaged by gettext, add dispName to Property obj. for non-us users. [d8f38c06c1f4] 2007-11-08 Homin Lee * po/ko.po: update Korean translation [71f6a305a260] 2007-11-27 Alberto Griggio * merge [9a6365ba4dac] * merged changes [70c277847254] 2007-11-17 Alberto Griggio * merged rel 0.6.1 [5324f86989d1] * widgets/choice/codegen.py, widgets/combo_box/codegen.py, widgets/list_box/codegen.py: fixed compilation problem when using non-standard empty arrays [e16277bbd924] 2007-11-27 Alberto Griggio * codegen/cpp_codegen.py, common.py: fixed very serious regression on cpp_codegen, updated version number The problem was that old event handlers were not detected and declared/defined again at each code generation. This was because event handlers became virtual but I forgot to update the regexp that matches them to reflect this :-( [8244b1b39883] 2007-10-25 Alberto Griggio * .hgtags: Added tag rel_0.6.1 for changeset 58d181f6df32 [a9fe1a6f8dbb] * common.py: changed version number to 0.6.1 [58d181f6df32] [rel_0.6.1] 2007-10-22 Alberto Griggio * application.py, main.py, tree.py, widget_properties.py, widgets/bitmap_button/bitmap_button.py, widgets/bitmap_button/codegen.py, widgets/button/button.py, widgets/button/button_stockitems.py, widgets/calendar_ctrl/calendar_ctrl.py, widgets/calendar_ctrl/codegen.py, widgets/combo_box/combo_box.py, widgets/datepicker_ctrl/codegen.py, widgets/datepicker_ctrl/datepicker_ctrl.py, widgets/dialog/dialog.py, xml_parse.py: removed tabs from source code [cc3e62fac409] * po/ko.po: added korean translation Thanks to Homin Lee for providing this! [ba5a2da99345] 2007-10-18 Alberto Griggio * widgets/menubar/codegen.py, widgets/menubar/lisp_codegen.py, widgets/menubar/perl_codegen.py: patch to fix problem in code generated for wxMenuBar on OS X [263799dd5981] 2007-10-16 Alberto Griggio * widgets/frame/codegen.py, widgets/frame/perl_codegen.py: fixed bug in layout of frames with explicit size on wx < 2.8 [c31fa443cb03] * codegen/cpp_codegen.py: fixed bug #180219 (changed std::cout to wxLogDebug) [0c99ef15c856] * widget_properties.py: fixed bug #1800898 (no refresh when changing foreground/backround color) [c0d58dcca0cd] * edit_windows.py: fixed bug #1800895 (exception when clicking "has toolbar") [22936a4c1fa3] * widgets/calendar_ctrl/codegen.py: fixed bug on python code generation [112e3896f8f4] 2007-09-23 Alberto Griggio * .hgtags: Added tag rel_0.6 for changeset c4316ac0d906 [46c000bd92b8] * application.py, edit_sizers/edit_sizers.py, edit_windows.py: fixed tab ordering of properties [c4316ac0d906] [rel_0.6] 2007-09-22 Alberto Griggio * docs/index.html: changed URL of user's manual (to use the on-line version) [713ad7e89b05] * widgets/static_text/static_text.py: use wx.GenStaticText if available to implement labels wx.StaticText is a weird widget, with odd behaviour wrt. key and focus events. wx.GenStaticText is much better in this respect [2f5d56ab95b5] 2007-09-19 Alberto Griggio * edit_sizers/edit_sizers.py, edit_windows.py: fixed bug #1797230 [ae837954dd04] 2007-09-17 Alberto Griggio * codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, common.py, config.py, configUI.py, res/preferences.wxg: added option to include .wxg file name in generated source files This was requested by SPE's author, for better integration with the IDE [4c5d4ad2544c] 2007-09-09 Alberto Griggio * codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, config.py, configUI.py, res/preferences.wxg: added code generation preference "write_timestamp" [59cfa4bcad62] * main.py: fixed problems with "small_frames" on Ubuntu (actually, I think it's on GNOME...) [514a92bb5dc8] * edit_sizers/edit_sizers.py: update the "saved" flag of Application when removing an empty slot [ffbd1b388e3c] 2007-09-07 Alberto Griggio * widgets/dialog/codegen.py, widgets/frame/codegen.py: fixed cut-and-paste error (grr!!!) [c2dde72fa386] * widgets/dialog/codegen.py, widgets/frame/codegen.py: fixed code generation for "icon" property when using special "var:" and "code:" forms [138080cdf6e2] * config.py: workaround for spinctrl bug on wxGTK 2.8.4.2 [33f3bb4f5378] * xml_parse.py: fixed encoding problem with non-western locales [979fc80125ca] 2007-09-06 Alberto Griggio * tree.py: fixed compatibility with python 2.3 In python 2.3, set is not a builtin, but needs to be aliased from sets.Set [94ccd9289dfd] * res/templates_ui.wxg, template.py, templates_ui.py: fixed compatibility problem with wx 2.6 wx.ID_EDIT was introduced in 2.8... [4455d0b07db0] * main.py: fixed bug that made the tree and property windows disappear on win32 [7ed3aad42dd7] * wxglade.py: small formatting fix [57f80092cf45] 2007-09-04 Alberto Griggio * edit_sizers/edit_sizers.py: fixed compatibility issue with wxPython 2.8.4.2 [c8cb0d602ee8] * edit_sizers/edit_sizers.py: fixed bug in change_sizer when changing to a wx.StaticBoxSizer [b72e2bb66fd1] * edit_sizers/edit_sizers.py, edit_windows.py: fixed bug in 'setup_preview_menu' when using wxPython 2.8.4.2 [3827622f9bb3] 2007-09-02 Alberto Griggio * edit_widget.py, widget_properties.py, widgets/ChoicesCodeHandler.py, widgets/ChoicesProperty.py: improved support for custom components - made ChoicesProperty more general (for wxCheckListBox) - made edit_widget a bit more flexible [288058984a75] 2007-09-01 Alberto Griggio * codegen/py_codegen.py: fixed bug in event handler id generation [550dd605d0c6] * codegen/cpp_codegen.py, codegen/py_codegen.py: fixed a bug in handling extracode The extra code was not generated when the options "single file" and "overwrite" were set [f33e3c8cc5f1] * code_property.py: fixed a bug in ExtraPropertiesProperty [b5d99ff756cd] * code_property.py, codegen/cpp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, edit_windows.py, widget_properties.py: Implemented "exraproperties" property. This allows you to add more properties to the generated code for the widgets. For each pair (name, value) in extraproperties for a widget, a line widget.SetName(value) will be added in __set_properties. That is, the name of the property is capitalized, and the value is taken as it is. This works for Python, C++ and Perl. For XRC, the extra line would be value (notice that there is no capitalization). [1ab3f55a072f] * res/templates_ui.wxg, template.py, templates_ui.py: small ui fix [13cc255c2418] * msgdialog.py, res/messagedialog.wxg, res/templates_ui.wxg, templates_ui.py: make bold labels use the default font size [714b2487617a] * config.py, main.py, misc.py, tree.py: merged encoding fixes [b9545315fbcc] * config.py, kdefiledialog.py, main.py, misc.py, tree.py: fixed some encoding problems (when using non-ascii filesystem paths) [53ffc1a86fee] 2007-08-31 Alberto Griggio * codegen/lisp_codegen.py: removed "generated from" in output file [111e0efad8ea] * codegen/xrc_codegen.py: removed "generated from" in output [f2796e295acd] * widgets/grid/codegen.py: implemented XRC code generation [580284f3d914] * widget_properties.py: small ui improvement in CheckListProperty [56eac4ede7c0] * code_property.py: small ui improvement [b347a9639185] * codegen/py_codegen.py: improved warning messages [3c98fd513cf4] * codegen/cpp_codegen.py: implemented "extracode" and "custom base classes" for C++ output [065dee31c1d8] * codegen/py_codegen.py: added a couple of fixes for "extracode" [c41111080ade] * codegen/py_codegen.py: fixed bug when not overwriting existing sources [7feec9d408ca] * application.py: better implementation of check_codegen for XRC [ffd88d9972b9] * codegen/py_codegen.py, codegen/xrc_codegen.py, edit_windows.py, widgets/notebook/notebook.py, widgets/panel/panel.py, widgets/splitter_window/splitter_window.py: added "custom base classes" support It is now possible to specify custom base classes for wxGlade- generated ones. At the moment, it works only for the Python code generator, but I plan to implement it also for C++. This feature is not really meant to be used unless the "overwrite existing sources" option is set: if not, the generated code might be incorrect. [1c83f314dc14] * codegen/xrc_codegen.py: implemented 'extracode' property for XRC [3e4582ec4214] * code_property.py, main.py: fixed a couple of UI glitches [44629ce128b7] 2007-08-30 Alberto Griggio * code_property.py, codegen/py_codegen.py, edit_windows.py: Added "extracode" property This property allows the user to insert arbitrary code snippets in the wxGlade-generated source files. This could be quite useful, for instance to include files, define constants, etc. At the moment, only the Python code generator has been updated to support this. I plan to extend also the C++ one, for the others patches are welcome... Finally, you should use this feature only in "overwrite sources" mode: if you don't, it should work for "easy" cases (when you really insert only imports or constant declarations), but if you insert more complex stuff the wxGlade "parsers" (quoted because they aren't real parsers) will get fooled quite easily... [bf5947e22cb5] * template.py: small fix in displaying template information [0721e2801a82] 2007-08-29 Alberto Griggio * main.py: moved "import template" at the top level [8017eb9f9403] * main.py, res/templates_ui.wxg, template.py, templates_ui.py: implemented template editing [aca7f36428c0] * main.py, template.py: added first template management code For now, it is only possible to delete custom (i.e. not bundled with wxGlade) templates [561fd0099c5b] * templates/Dialog with two buttons.wgt: A very simple example template [ae1f7ea4259e] * main.py, res/templates_ui.wxg, template.py, templates_ui.py, tree.py: improved templates support Added dialogs and menu entries to create an app from a template, or to save an app as a template Still needs to be finished (e.g. editing/deleting existing templates is not possible at the moment) [496a5e090b4c] * msgdialog.py, res/messagedialog.wxg: improved message dialog [044e48c1f238] * template.py: fixed line-wrapping [387bc1f95d96] * application.py, misc.py, msgdialog.py, res/messagedialog.wxg, widgets/bitmap_button/bitmap_button.py, widgets/bitmap_button/codegen.py, widgets/dialog/codegen.py, widgets/dialog/dialog.py, widgets/frame/codegen.py, widgets/frame/frame.py, widgets/static_bitmap/codegen.py, widgets/static_bitmap/static_bitmap.py, widgets/toolbar/codegen.py, widgets/toolbar/toolbar.py: better handling of relative paths for images There was a problem in wxGlade: relative paths for icons (for example in toolbars or frames) were accepted by the code generator, but were not working well in the gui design and in preview. This patch fixes the problem, by interpreting paths for images as relative to the output path for the generated code [58b4b14c758a] 2007-08-28 Alberto Griggio * .hgignore: updated .hgignore [eee361d8fd43] * common.py, config.py, msgdialog.py, res/messagedialog.wxg: better implementation of common.message, using a custom MessageDialog [848a601445c8] * main.py, tree.py: remember position of top-level windows when reloading an app [e5d0ed7b172f] * codegen/pl_codegen.py: fixed wrong commit [f879787d8ab5] * application.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, common.py, main.py, tree.py: added notification of missing code generators Every time a widget is added to the current design, or the output language is changed, check that every widget has a suitable code generator for the language, and if not warn the user [0eba537c26b3] 2007-08-26 Alberto Griggio * codegen/cpp_codegen.py: applied patch to make event handlers virtual [bba868ec70a1] 2007-08-22 Alberto Griggio * misc.py: fixed small bug in selection markers [d383d5a81ff0] 2007-08-11 Alberto Griggio * common.py: upadted version number to 0.6 [1a8f84be2b20] 2007-08-07 Alberto Griggio * Closed HEAD branch [60f8cb53b21d] * zmain.py, zwxglade.py: Removed obsolete files [9422bb9c3010] * .cvsignore, codegen/.cvsignore, docs/.cvsignore, docs/img/.cvsignore, edit_sizers/.cvsignore, icons/.cvsignore, icons/gtk/.cvsignore, icons/msw/.cvsignore, widgets/.cvsignore, widgets/bitmap_button/.cvsignore, widgets/button/.cvsignore, widgets/calendar_ctrl/.cvsignore, widgets/checkbox/.cvsignore, widgets/choice/.cvsignore, widgets/combo_box/.cvsignore, widgets/custom_widget/.cvsignore, widgets/datepicker_ctrl/.cvsignore, widgets/dialog/.cvsignore, widgets/frame/.cvsignore, widgets/gauge/.cvsignore, widgets/grid/.cvsignore, widgets/list_box/.cvsignore, widgets/list_ctrl/.cvsignore, widgets/menubar/.cvsignore, widgets/notebook/.cvsignore, widgets/panel/.cvsignore, widgets/radio_box/.cvsignore, widgets/radio_button/.cvsignore, widgets/slider/.cvsignore, widgets/spacer/.cvsignore, widgets/spin_button/.cvsignore, widgets/spin_ctrl/.cvsignore, widgets/splitter_window/.cvsignore, widgets/static_bitmap/.cvsignore, widgets/static_line/.cvsignore, widgets/static_text/.cvsignore, widgets/text_ctrl/.cvsignore, widgets/toggle_button/.cvsignore, widgets/toolbar/.cvsignore, widgets/tree_ctrl/.cvsignore, zmain.py, zwxglade.py: merge after tagging v0.5 [e0fae539f01e] * .hgtags: Added tag v0.5 for changeset 6a8223539dd8 [2296d06486fe] * zmain.py, zwxglade.py: Removed obsolete files [efc77c56a126] * .hgignore: Added .hgignore [622ff1929ab9] * .cvsignore, codegen/.cvsignore, docs/.cvsignore, docs/img/.cvsignore, edit_sizers/.cvsignore, icons/.cvsignore, icons/gtk/.cvsignore, icons/msw/.cvsignore, widgets/.cvsignore, widgets/bitmap_button/.cvsignore, widgets/button/.cvsignore, widgets/calendar_ctrl/.cvsignore, widgets/checkbox/.cvsignore, widgets/choice/.cvsignore, widgets/combo_box/.cvsignore, widgets/custom_widget/.cvsignore, widgets/datepicker_ctrl/.cvsignore, widgets/dialog/.cvsignore, widgets/frame/.cvsignore, widgets/gauge/.cvsignore, widgets/grid/.cvsignore, widgets/list_box/.cvsignore, widgets/list_ctrl/.cvsignore, widgets/menubar/.cvsignore, widgets/notebook/.cvsignore, widgets/panel/.cvsignore, widgets/radio_box/.cvsignore, widgets/radio_button/.cvsignore, widgets/slider/.cvsignore, widgets/spacer/.cvsignore, widgets/spin_button/.cvsignore, widgets/spin_ctrl/.cvsignore, widgets/splitter_window/.cvsignore, widgets/static_bitmap/.cvsignore, widgets/static_line/.cvsignore, widgets/static_text/.cvsignore, widgets/text_ctrl/.cvsignore, widgets/toggle_button/.cvsignore, widgets/toolbar/.cvsignore, widgets/tree_ctrl/.cvsignore: Removed .cvsignore files [4d5c399c338d] * codegen/pl_codegen.py: Some code cleanup [a7ba4564fea2] * common.py, configUI.py, edit_sizers/edit_sizers.py, edit_windows.py, font_dialog.py, layout_option_property.py, main.py, misc.py, widget_properties.py: Several "visual" and usability improvements, like better icons, better keyboard navigation, better preview support [5f8a088a129b] * widgets/bitmap_button/codegen.py, widgets/calendar_ctrl/codegen.py, widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/gauge/gauge.py, widgets/menubar/menubar.py, widgets/slider/slider.py, widgets/spacer/spacer.py, widgets/static_line/static_line.py, widgets/toolbar/toolbar.py, wxglade.py: Some code cleanup [2f8a7e7e45ba] * codegen/py_codegen.py, widgets/notebook/codegen.py, widgets/notebook/notebook.py, widgets/notebook/perl_codegen.py, widgets/panel/codegen.py, widgets/panel/lisp_codegen.py, widgets/panel/panel.py, widgets/panel/perl_codegen.py, widgets/splitter_window/codegen.py, widgets/splitter_window/perl_codegen.py, widgets/splitter_window/splitter_window.py: Improved multiple files code generation. Now it is possible to generate classes living in subpackages [6f3167a0372a] * application.py, tree.py, widgets/custom_widget/codegen.py, widgets/custom_widget/custom_widget.py, xml_parse.py: Better preview support for "cross-referencing" custom widgets. Example: suppose you have a panel called MyPanel, and a frame with a custom widget called MyPanel. Then wxGlade detects that the custom widget is actually a MyPanel instance created before, and will correctly use that in the preview [1a791aa4eb11] 2007-07-21 Alberto Griggio * clipboard.py: Set the busy cursor before pasting (since it can take some time...) [5c9156fad1f2] * edit_sizers/edit_sizers.py, widgets/panel/panel.py: fixed a segfault when adding a sizer to a panel after having removed the previous one [ece932490171] 2007-06-25 Alberto Griggio * edit_sizers/edit_sizers.py: minor changes to keep lines shorter than 80 characters... [cfc500e4e683] * edit_sizers/edit_sizers.py: fixed bug in change_sizer [d53e11bb389a] 2007-06-23 Alberto Griggio * widgets/menubar/perl_codegen.py: applied patch by Klaas Hartmann [155ab9059158] 2007-05-02 dinogen * configUI.py: added a spacer because last entry are not well readable [12e682665c01] 2007-04-19 Alberto Griggio * misc.py: SelectionTags are created and destroyed every time they are shown/hidden: this helps slowing down the rate at which GDI objects usage increases over time (note: this is not a real fix for the problem, I don't know enough about win32 gui to do it...) [c8310ab7ff10] 2007-04-14 Alberto Griggio * edit_windows.py, widgets/notebook/notebook.py: fixed bug when deleting a page of a notebook [0a496e6ad710] 2007-04-12 guyru * widgets/bitmap_button/bitmap_button.py: fixed some bugs [1b8f5cf86e4c] 2007-04-10 guyru * widgets/bitmap_button/codegen.py: fixed cpp codegen [a4256f84f9db] * widgets/bitmap_button/bitmap_button.py, widgets/bitmap_button/codegen.py: added styles to bitmap button widget. [8055b1da3be7] 2007-04-04 Alberto Griggio * common.py: changed version number [85006d1d6401] * edit_sizers/edit_sizers.py, widget_properties.py: minor UI and code tweaks [f44e6572ef4c] 2007-04-02 Alberto Griggio * credits.txt: updated credits [b24eb925d5fb] * CHANGES.txt: updated change log [6a8223539dd8] [rel_0.5] * application.py: updated "for_version" property [dafd07ccc015] * common.py: changed version number [d4ac4711e37f] 2007-04-01 Alberto Griggio * widgets/button/codegen.py: added XRC code generation for stock items [67529af29478] * widgets/button/codegen.py, widgets/button/lisp_codegen.py, widgets/button/perl_codegen.py: fixed code generation for stock items [6ac2d1f087cf] 2007-03-31 Alberto Griggio * widgets/button/button.py: fixed set_stockitem [f9e3629c6504] * widget_properties.py: small code formatting change [00ff9bc635c3] 2007-03-30 Alberto Griggio * codegen/cpp_codegen.py: applied some "cosmetic" patches [f97220e6f9bb] 2007-03-28 Alberto Griggio * widgets/radio_box/radio_box.py: fixed segfault with wx 2.8 [6c14f19b9954] * misc.py: removed deprecated wx.SystemSettings_GetSystemFont [4ad2560c82bf] 2007-03-27 Alberto Griggio * main.py: fixed raise_all [f0dd4131cbed] * README.txt, __init__.py, about.py, application.py, clipboard.py, codegen/cpp_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, common.py, edit_sizers/__init__.py, edit_sizers/edit_sizers.py, edit_sizers/sizers_codegen.py, edit_windows.py, kdefiledialog.py, layout_option_property.py, main.py, misc.py, template.py, tree.py, widget_properties.py, widgets/ChoicesCodeHandler.py, widgets/ChoicesProperty.py, widgets/MenuTree.py, widgets/__init__.py, widgets/bitmap_button/__init__.py, widgets/bitmap_button/bitmap_button.py, widgets/bitmap_button/codegen.py, widgets/button/__init__.py, widgets/button/button.py, widgets/button/codegen.py, widgets/calendar_ctrl/__init__.py, widgets/calendar_ctrl/calendar_ctrl.py, widgets/calendar_ctrl/codegen.py, widgets/checkbox/__init__.py, widgets/checkbox/checkbox.py, widgets/checkbox/codegen.py, widgets/choice/__init__.py, widgets/choice/choice.py, widgets/choice/codegen.py, widgets/combo_box/__init__.py, widgets/combo_box/codegen.py, widgets/combo_box/combo_box.py, widgets/custom_widget/__init__.py, widgets/custom_widget/codegen.py, widgets/custom_widget/custom_widget.py, widgets/datepicker_ctrl/__init__.py, widgets/datepicker_ctrl/codegen.py, widgets/datepicker_ctrl/datepicker_ctrl.py, widgets/dialog/__init__.py, widgets/dialog/codegen.py, widgets/dialog/dialog.py, widgets/frame/__init__.py, widgets/frame/codegen.py, widgets/frame/frame.py, widgets/frame/lisp_codegen.py, widgets/frame/perl_codegen.py, widgets/gauge/__init__.py, widgets/gauge/codegen.py, widgets/gauge/gauge.py, widgets/grid/__init__.py, widgets/grid/codegen.py, widgets/grid/grid.py, widgets/list_box/__init__.py, widgets/list_box/codegen.py, widgets/list_box/list_box.py, widgets/list_ctrl/__init__.py, widgets/list_ctrl/codegen.py, widgets/list_ctrl/list_ctrl.py, widgets/menubar/__init__.py, widgets/menubar/codegen.py, widgets/menubar/menubar.py, widgets/notebook/__init__.py, widgets/notebook/codegen.py, widgets/notebook/notebook.py, widgets/panel/__init__.py, widgets/panel/codegen.py, widgets/panel/panel.py, widgets/radio_box/__init__.py, widgets/radio_box/codegen.py, widgets/radio_box/radio_box.py, widgets/radio_button/__init__.py, widgets/radio_button/codegen.py, widgets/radio_button/radio_button.py, widgets/slider/__init__.py, widgets/slider/codegen.py, widgets/slider/slider.py, widgets/spacer/__init__.py, widgets/spacer/codegen.py, widgets/spacer/spacer.py, widgets/spin_button/__init__.py, widgets/spin_ctrl/__init__.py, widgets/spin_ctrl/codegen.py, widgets/spin_ctrl/spin_ctrl.py, widgets/splitter_window/__init__.py, widgets/splitter_window/codegen.py, widgets/splitter_window/splitter_window.py, widgets/static_bitmap/__init__.py, widgets/static_bitmap/codegen.py, widgets/static_bitmap/lisp_codegen.py, widgets/static_bitmap/perl_codegen.py, widgets/static_bitmap/static_bitmap.py, widgets/static_line/__init__.py, widgets/static_line/codegen.py, widgets/static_line/static_line.py, widgets/static_text/__init__.py, widgets/static_text/codegen.py, widgets/static_text/static_text.py, widgets/text_ctrl/__init__.py, widgets/text_ctrl/codegen.py, widgets/text_ctrl/text_ctrl.py, widgets/toggle_button/__init__.py, widgets/toggle_button/codegen.py, widgets/toggle_button/toggle_button.py, widgets/toolbar/__init__.py, widgets/toolbar/codegen.py, widgets/toolbar/tool.py, widgets/toolbar/toolbar.py, widgets/tree_ctrl/__init__.py, widgets/tree_ctrl/codegen.py, widgets/tree_ctrl/tree_ctrl.py, wxglade.py, xml_parse.py, xrc2wxg.py: updated copyright notice [365a0fc3894a] * widget_properties.py, widgets/button/button.py, widgets/button/button_stockitems.py, widgets/button/codegen.py, widgets/button/lisp_codegen.py, widgets/button/perl_codegen.py: Added patch by Johan Vromans to support stock buttons [ec89b7c641f5] * application.py, common.py, configUI.py, kdefiledialog.py: fix for default path of DirDialog [196949d3cf6a] 2007-03-26 Alberto Griggio * widget_properties.py, widgets/list_box/list_box.py: a couple of minor fixes... [3267ed30a83d] * widget_properties.py: fixed SpinProperty crash with new wx 2.8 [6557868ce104] * widgets/combo_box/combo_box.py: updated indentation style [60123762b4ab] * widgets/panel/panel.py: fix for hang using wxPython 2.8.1.1 on Ubuntu [710c020fa587] * main.py: fixed raise_all bug [0b876df97ef4] 2007-03-19 Alberto Griggio * main.py: applied patch to add a "Raise All" menu item [a6ba91bbe3d6] * widgets/menubar/perl_codegen.py: applied patch to fix submenu generation problem... [33d29ae8f245] * main.py: small reformatting changes... [c696a6d572d9] * codegen/py_codegen.py: small change to the encoding line [6b665fdebc68] 2007-03-18 guyru * template.py: replaced tabs with regular spaces [bce2c8e9e722] 2007-03-09 Alberto Griggio * widgets/splitter_window/splitter_window.py: changed range of "sash pos" property to allow negative values [33437978e3bc] * codegen/pl_codegen.py: Applied patch for event handlers [7615d15332cd] 2007-03-01 Alberto Griggio * main.py: changed wxversion.select("2.6") to wxversion.ensureMinimal("2.6"), fixed mixed tabs/spaces problem [0d73711c924d] 2007-02-13 guyru * template.py: fixed header tag [6d6922ebab60] * xml_parse.py: some exception handling [c058316135e3] * main.py, template.py: template info reading [bb4c8225e7f5] 2007-02-09 dinogen * po/de.po, po/fr.po: i18n completed. Now translations. [c845ef6881f6] * credits.txt, po/messages.pot, widgets/gauge/gauge.py, widgets/grid/grid.py, widgets/list_box/list_box.py, widgets/list_ctrl/list_ctrl.py, widgets/menubar/menubar.py, widgets/notebook/notebook.py, widgets/radio_button/radio_button.py, widgets/slider/slider.py, widgets/spacer/lisp_codegen.py, widgets/static_text/static_text.py, widgets/text_ctrl/text_ctrl.py, widgets/tree_ctrl/tree_ctrl.py: i18n completed. Now translations. [04b5be4ac461] 2007-02-04 Alberto Griggio * credits.txt: updated credits [6950dc2cd97f] * license.txt: updated copyright notice [f915bd1e706a] * main.py: fixed small bug that prevented displaying help [2a747c6b5bf3] * edit_sizers/edit_sizers.py: fixed bug that prevented changing from FlexGridSizer to GridSizer [2da65087d5a5] 2007-01-31 dinogen * misc.py, tree.py, widget_properties.py, widgets/bitmap_button/bitmap_button.py, wxglade.py, xml_parse.py, zmain.py: correct fallback bug [936ffa7ccdaf] 2007-01-31 guyru * application.py: set the default value of is_template to false [5fda610e6af1] * credits.txt: self credit :) [757bf25bf32d] * main.py, tree.py, xml_parse.py: template handling [fd9fe3501047] * kdefiledialog.py: removed extra ) in line 70 [bd3e73988b4d] * locale/en/LC_MESSAGES/wxglade.mo, po/en.po: fixed issue regarding starting up without an Italian locale. [3b2f12d13924] 2007-01-29 dinogen * edit_widget.py, edit_windows.py, events_mixin.py, font_dialog.py, kdefiledialog.py, layout_option_property.py, main.py: i18n [ed289052a9e3] 2007-01-27 dinogen * color_dialog.py, edit_sizers/edit_sizers.py, locale/it/LC_MESSAGES/wxglade.mo, po/it.po: preference dialog iternationalizated [cbb40d18f9ad] * clipboard.py: stupid bug [af59a751009d] * about.py, clipboard.py, color_dialog.py, common.py, config.py, configUI.py, locale/it/LC_MESSAGES/wxglade.mo, po/it.po, po/messages.pot, wxglade.py: locales added [5b0f60584f4e] 2007-01-26 dinogen * edit_sizers/edit_sizers.py, po/messages.po, po/messages.pot: pp [b3a774fcaa72] 2007-01-19 dinogen * po/messages.po: add i18n [dceede7fdb1f] 2007-01-18 dinogen * clipboard.py, color_dialog.py, common.py, config.py, configUI.py, wxglade.py: begin of localization [a61a4237523c] 2006-12-07 Alberto Griggio * application.py, tree.py, xml_parse.py: changed the UI of "use_new_namespace". Now the meaning is the opposite: if checked, the old "from wxPython.wx import *" mechanism will be used (unchecked by default) [069350aabcce] 2006-12-04 jkt * main.py: conform to wxPython 2.7 [1da5806b73ed] 2006-12-02 guyru * widgets/slider/slider.py: added new styles and tooltips [9da4ccd3b127] * widgets/radio_button/radio_button.py: *** empty log message *** [faa363be3228] 2006-12-02 jkt * credits.txt: autokudos [2dbcb9b57a11] 2006-12-02 Alberto Griggio * edit_sizers/lisp_sizers_codegen.py, edit_sizers/perl_sizers_codegen.py, edit_sizers/sizers_codegen.py: Better layout code generation, following Robin Dunn's comments appearing here: http://lists.wxwidgets.org/cgi-bin/ezmlm- cgi?11:mss:50516:200604:ckdkhmebfbadhedacofn [8608f86031eb] * application.py, common.py, configUI.py, edit_sizers/edit_sizers.py, edit_windows.py, events_mixin.py, font_dialog.py, layout_option_property.py, main.py, misc.py, tree.py, widget_properties.py, widgets/button/button.py, widgets/calendar_ctrl/calendar_ctrl.py, widgets/checkbox/checkbox.py, widgets/combo_box/combo_box.py, widgets/custom_widget/custom_widget.py, widgets/datepicker_ctrl/datepicker_ctrl.py, widgets/grid/grid.py, widgets/list_ctrl/list_ctrl.py, widgets/menubar/menubar.py, widgets/radio_box/radio_box.py, widgets/radio_button/radio_button.py, widgets/static_line/static_line.py, widgets/toolbar/toolbar.py, widgets/widgets.txt, xml_parse.py: Transition to the new wx namespace completed (hopefully) [3eebe336c131] 2006-11-30 jkt * codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, common.py: add "from " to headers of generated code with compliments to Stani of SPE fame who suggested this in http://sourceforge.net/ma ilarchive/forum.php?thread_id=31139957&forum_id=10344 [5b29c569195e] 2006-11-23 dinogen * edit_widget.py, edit_windows.py: wx module [f345c9927e2c] * application.py: Error on show_prop. [1e2633e28835] 2006-11-22 dinogen * config.py: wx module [67ff2e43a07d] * application.py: wx module [d713ef29f425] 2006-11-22 guyru * widgets/gauge/gauge.py, widgets/list_box/list_box.py, widgets/list_ctrl/list_ctrl.py: added tooltips [200e5ccc1974] * widgets/datepicker_ctrl/datepicker_ctrl.py, widgets/dialog/dialog.py: tooltips [6af2b6fc29b9] 2006-11-21 dinogen * clipboard.py, color_dialog.py: wx module [38e3cd52aafb] 2006-11-20 dinogen * application.py: new module wx [aa301fe00899] * about.py: wxPython to wx module [ab7b91644ff0] 2006-11-20 guyru * widgets/calendar_ctrl/calendar_ctrl.py: added tooltips and updated style labels [6c172bccc7a6] * widgets/combo_box/combo_box.py: added tooltips and one more style [2f188767fc47] 2006-11-19 guyru * widgets/button/button.py: added tooltips for the checkbox properties. also added one more style: wxNO_BORDER which creates flat buttons. [c54938ad79e0] * widget_properties.py: added tooltips for the checkbox properties [fe268b976a3d] 2006-11-16 guyru * widgets/checkbox/checkbox.py, widgets/radio_button/radio_button.py: moved to the wxPython namespace [cc3e12e463ee] * widgets/radio_box/radio_box.py: moved to the wxPython namespace [0ef063ba38e9] * widgets/static_bitmap/static_bitmap.py, widgets/static_line/static_line.py: moved to the wxPython namespace [ad33931afc7f] * widgets/list_ctrl/list_ctrl.py: moved to the wxPython namespace [760812f2d23e] * widgets/tree_ctrl/tree_ctrl.py: moved to the wxPython namespace [d3f086f36229] * widgets/grid/grid.py: moved to the wxPython namespace [f274fa4f6e51] * widgets/custom_widget/custom_widget.py, widgets/spacer/spacer.py: moved to the wxPython namespace [26c8bb3a63fc] * widgets/menubar/menubar.py: moved to the wxPython namespace [87858d5f007a] 2006-11-15 guyru * widgets/toolbar/toolbar.py: moved to the wxPython namespace [bf594a28fd04] * widgets/datepicker_ctrl/datepicker_ctrl.py: moved to the wxPython namespace [2a4a30e812e8] 2006-11-14 jkt * widgets/choice/choice.py, widgets/combo_box/combo_box.py, widgets/list_box/list_box.py: convert from "import wxPython*" to "import wx" as wxPython namespace is deprecated as of 2.7.1.1 [d924e2c29dac] 2006-11-11 guyru * widgets/calendar_ctrl/calendar_ctrl.py: moved to the new syntax [20103ffb4ef0] 2006-11-07 jkt * widgets/bitmap_button/bitmap_button.py, widgets/button/button.py, widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/gauge/gauge.py, widgets/notebook/notebook.py, widgets/panel/panel.py, widgets/slider/slider.py, widgets/spin_button/spin_button.py, widgets/spin_ctrl/spin_ctrl.py, widgets/splitter_window/splitter_window.py, widgets/static_text/static_text.py, widgets/text_ctrl/text_ctrl.py, widgets/toggle_button/toggle_button.py: convert from "import wxPython*" to "import wx" as wxPython namespace is deprecated as of 2.7.1.1 [022e01730796] 2006-11-02 guyru * widgets/calendar_ctrl/calendar_ctrl.py: moved most of the code to the new syntax, but still some old syntax remains, although the module shouldn't have any problems [72088dd75e26] 2006-10-29 Alberto Griggio * widgets/widgets.txt: reoreded list to keep spacer at the end [04609b3e7dda] * icons/calendar_ctrl.xpm, icons/datepicker_ctrl.xpm: better icons [ed395b34cb58] 2006-10-20 guyru * icons/datepicker_ctrl.xpm, widgets/datepicker_ctrl/.cvsignore, widgets/datepicker_ctrl/__init__.py, widgets/datepicker_ctrl/codegen.py, widgets/datepicker_ctrl/datepicker_ctrl.py, widgets/widgets.txt: wxDatePickerCtrl support [f481be54790e] * widgets/calendar_ctrl/codegen.py: fixed c++ code generation. missed wxDefaultDate [46bf664d0b63] * widgets/calendar_ctrl/calendar_ctrl.py, widgets/calendar_ctrl/codegen.py: various bug fixes, removed extra debugging code, fixed python code generation [9ca83e6f4d98] 2006-10-19 guyru * widgets/calendar_ctrl/codegen.py: *** empty log message *** [13afd7173eef] * widgets/calendar_ctrl/calendar_ctrl.py, widgets/calendar_ctrl/codegen.py: bugfixes [61c21b2153fc] 2006-10-18 guyru * widgets/calendar_ctrl/calendar_ctrl.py: a small fix to the xml_builder [4ab2a06cc8dc] 2006-10-15 guyru * widgets/calendar_ctrl/calendar_ctrl.py: new icon [785f3a6a73a4] * icons/calendar_ctrl.xpm: icon for wxCalendarCtrl [1a1cbd116f98] * widgets/calendar_ctrl/calendar_ctrl.py: fixed some bugs [cb4ab04cf759] 2006-10-14 guyru * widgets/calendar_ctrl/.cvsignore, widgets/calendar_ctrl/__init__.py, widgets/calendar_ctrl/calendar_ctrl.py, widgets/calendar_ctrl/codegen.py: initial revision for calendar_ctrl. still has some bugs in the codegen [ded1870133e8] * widgets/widgets.txt: added calendar_ctrl [bc85605794fd] * epydoc.conf: configuration file for the epydoc documentation generator [a3e0c3ecb7d2] 2006-10-12 Alberto Griggio * codegen/cpp_codegen.py: patch for feature request #1228246 [2004c6c40b5f] 2006-10-11 Alberto Griggio * widgets/choice/choice.py, widgets/combo_box/combo_box.py: fixed a size bug on win xp [0207f89fca31] 2006-10-07 Alberto Griggio * main.py, widgets/menubar/codegen.py, widgets/slider/codegen.py: fixed some bugs [06e77956f3aa] 2006-07-02 Alberto Griggio * widgets/menubar/codegen.py, widgets/toolbar/codegen.py: Added event handler stubs code generation for C++ output [642bb1f1b328] 2006-05-16 Alberto Griggio * edit_sizers/edit_sizers.py: fixed segfault and wxGridSizer removal problem [3534205786c2] 2006-05-13 Alberto Griggio * common.py: updated version number [03cac451726f] * widget_properties.py: fixed possible segfault [63d94ec258fa] 2006-05-07 Alberto Griggio * widgets/menubar/menubar.py: added apply button to the menu editor [2dd0af6a8fa2] * widgets/toolbar/toolbar.py: added apply button to the toolbar editor [66a92e626714] * tree.py: fixed small bug [ce032c64fc46] 2006-05-06 Alberto Griggio * application.py, codegen/xrc_codegen.py, tree.py: some bugs fixed [02fea3ab3ca5] * edit_sizers/edit_sizers.py: fixed "change class" bug [40b01b1fc692] 2006-05-02 Alberto Griggio * codegen/cpp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py: Fixed bug when both "separate file for each class" and "overwrite existing sources" were used [5b9c5a7aa2a3] * application.py: fixed "select top window" bug [c4b636683fa3] 2006-03-13 Alberto Griggio * main.py: added wxversion select of wx2.6 [d442a779b4be] * widgets/custom_widget/custom_widget.py: applied patch #1447669 [ec0e07c46cd3] * edit_windows.py: applied patch #1447674 [83be2f0ca075] 2006-03-02 Alberto Griggio * CHANGES.txt: added line of release of v0.4.1 [d78c49e2222e] * common.py: updated version number [dbe512a98fb2] 2006-02-21 georgesk * debian/changelog: fixed the changelog [0a499cd97a5e] * debian/changelog: adjusted the version number for the debian package [684fdbb51b1b] 2006-02-12 Alberto Griggio * codegen/cpp_codegen.py, codegen/lisp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py: fixed multiple generation of event stubs [c8d91ed1a0e3] 2006-01-31 georgesk * debian/changelog, debian/menu, wxglade: fixed a lot of bugs reported by debian users, see debian/Changelog [774f21e98481] 2006-01-17 Alberto Griggio * edit_sizers/edit_sizers.py: commented out debug print statement [406306f99d92] * widget_properties.py: fixed crash on windows (caused by spin properties losing focus...) [9e8d3e0675d6] 2005-12-28 Alberto Griggio * widgets/panel/panel.py: added option to prevent generating code for the custom class [c1f0c60e19d2] * edit_sizers/edit_sizers.py, edit_windows.py, tree.py, widget_properties.py, xml_parse.py: added "sizerslot", i.e. keep empty slots when saving a project... [9076ab9a81ac] 2005-12-23 Alberto Griggio * widgets/choice/codegen.py, widgets/combo_box/codegen.py: fixed invalid SetSelection code generation [a356f5d8abb7] 2005-11-20 Alberto Griggio * tree.py, widgets/panel/codegen.py, widgets/panel/panel.py, widgets/panel/perl_codegen.py, xml_parse.py: added option (to wxPanel) to disable code generation for custom classes [a0157f7db5ea] 2005-10-27 georgesk * Makefile, debian/files: fixed one bug about the deletion of .xvpics upon building the debian package [2c0a19a81aa2] 2005-10-14 crazyinsomniac * codegen/pl_codegen.py: fixup wxGlade tag order for events [69d02e5dde7e] * widgets/menubar/perl_codegen.py: import MenuHandler instead of inlining [831d2cee2ead] * widgets/menubar/perl_codegen.py: import MenuHandler instead of inlining [962a0edce280] * codegen/pl_codegen.py: notebooksizer for_version [e79d4496c876] * widgets/static_bitmap/perl_codegen.py: discovered by 1255968 (wxFoo Wx::Foo) [6e6e9384b123] 2005-10-14 Alberto Griggio * application.py, codegen/cpp_codegen.py, codegen/pl_codegen.py, widgets/menubar/perl_codegen.py: bugs fixed/added event handling support for perl output [23a0e26009c7] 2005-10-13 dinogen * edit_windows.py: Fixed bug 1289473. Show Properties of widget under a wxNotebook. [eecfb8e0c592] 2005-10-08 Alberto Griggio * CHANGES.txt, application.py, codegen/pl_codegen.py, common.py: some patches... [b22a3f9108c3] 2005-09-29 efuzzyone * application.py, edit_windows.py, events_mixin.py: The name for events, widgets, classes, etc., now should allow hyphen(-). This change was necessitated due to lisp, which has a convention of allowing hyphen in names. [a81a114a3a20] 2005-09-27 efuzzyone * widgets/notebook/lisp_codegen.py: Replace _ by - in variable names. [42f4d56fc343] * codegen/lisp_codegen.py: Fixed wxEvtHandlerConnect to wxEvtHandler_Connect. [b54bc0c2ee6b] 2005-09-25 efuzzyone * widgets/frame/lisp_codegen.py, widgets/menubar/lisp_codegen.py, widgets/toolbar/lisp_codegen.py: Made several code improvements. [435cdaf35029] * codegen/lisp_codegen.py: Made several improvements, also wrapped the program initialization code with unwind-protect. [cb9867f60820] 2005-09-22 efuzzyone * widgets/checkbox/lisp_codegen.py, widgets/choice/lisp_codegen.py, widgets/combo_box/lisp_codegen.py, widgets/custom_widget/lisp_codegen.py, widgets/dialog/lisp_codegen.py, widgets/frame/lisp_codegen.py, widgets/gauge/lisp_codegen.py, widgets/grid/lisp_codegen.py, widgets/list_box/lisp_codegen.py, widgets/list_ctrl/lisp_codegen.py, widgets/menubar/lisp_codegen.py, widgets/notebook/lisp_codegen.py, widgets/panel/lisp_codegen.py, widgets/radio_box/lisp_codegen.py, widgets/radio_button/lisp_codegen.py, widgets/slider/lisp_codegen.py, widgets/spacer/lisp_codegen.py, widgets/spin_button/lisp_codegen.py, widgets/spin_ctrl/lisp_codegen.py, widgets/splitter_window/lisp_codegen.py: Initial Revision for generating lisp code. [50321ed75754] * widgets/static_bitmap/lisp_codegen.py, widgets/static_line/lisp_codegen.py: Initial revision. [b9925bf5f8e4] * codegen/lisp_codegen.py, edit_sizers/lisp_sizers_codegen.py, widgets/bitmap_button/lisp_codegen.py, widgets/button/lisp_codegen.py, widgets/static_text/lisp_codegen.py, widgets/text_ctrl/lisp_codegen.py, widgets/toggle_button/lisp_codegen.py, widgets/toolbar/lisp_codegen.py, widgets/tree_ctrl/lisp_codegen.py: Initial revision. [daee2d6a5b04] 2005-08-25 Alberto Griggio * codegen/pl_codegen.py: fixed small bug [d36591c7e103] 2005-08-24 georgesk * Makefile, debian/changelog, debian/control, debian/postinst, debian/rules, wxglade: imported modifications made by Matthias Klose [82d6c693b3f7] 2005-08-23 Alberto Griggio * widgets/frame/frame.py, widgets/splitter_window/splitter_window.py: small bug fixed [82046b9989ae] 2005-08-23 georgesk * debian/changelog: updated the dependancies [130bc8dc8c17] * debian/changelog, debian/control, debian/files: updated the dependancies [763642d4f8c1] 2005-08-15 crazyinsomniac * widgets/toolbar/perl_codegen.py, widgets/tree_ctrl/perl_codegen.py: discovered by 1255968 (wxFoo Wx::Foo) [2dca1369ed41] * widgets/toggle_button/perl_codegen.py: discovered by 1255968 (wxFoo Wx::Foo) [0dc3b138c81a] * widgets/bitmap_button/perl_codegen.py, widgets/button/perl_codegen.py, widgets/checkbox/perl_codegen.py, widgets/choice/perl_codegen.py, widgets/combo_box/perl_codegen.py, widgets/gauge/perl_codegen.py, widgets/grid/perl_codegen.py, widgets/list_box/perl_codegen.py, widgets/list_ctrl/perl_codegen.py, widgets/menubar/perl_codegen.py, widgets/panel/perl_codegen.py, widgets/radio_box/perl_codegen.py, widgets/radio_button/perl_codegen.py, widgets/slider/perl_codegen.py, widgets/spin_button/perl_codegen.py, widgets/spin_ctrl/perl_codegen.py, widgets/splitter_window/perl_codegen.py, widgets/static_line/perl_codegen.py, widgets/static_text/perl_codegen.py, widgets/text_ctrl/perl_codegen.py: discovered by 1255968 (wxFoo Wx::Foo) [d8f9cb50d461] * widgets/notebook/perl_codegen.py: bug related to 1255968 (1255968 fixed long ago) [09fdc432f7fe] * codegen/pl_codegen.py: s/mkdir/makedirs/ -- pending bug 1255256 [279b7e9cefb0] 2005-08-06 Alberto Griggio * widgets/__init__.py: added to please spe... [70e1b588e455] 2005-08-01 Alberto Griggio * widgets/static_bitmap/perl_codegen.py: fixed bug in the generated constructor [9c34f33e058a] * widgets/combo_box/combo_box.py: added EVT_TEXT_ENTER event [b3b814449101] 2005-07-11 Alberto Griggio * application.py, codegen/py_codegen.py, widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/list_ctrl/list_ctrl.py, widgets/panel/panel.py, widgets/spin_ctrl/spin_ctrl.py, widgets/static_bitmap/static_bitmap.py, widgets/tree_ctrl/tree_ctrl.py: various bugfixes [30970f46b902] 2005-06-11 Alberto Griggio * codegen/cpp_codegen.py: fixed bug #1218563 [8d4b6c7a15fb] * codegen/py_codegen.py: fixed bug #1218563 [a23688d570ec] 2005-06-09 Alberto Griggio * codegen/py_codegen.py: changed quote_str to generate a unicode object if the string contains non-ascii chars [c6f0e8750c59] 2005-06-04 Alberto Griggio * edit_sizers/edit_sizers.py: now SizerHandleButtons are based on generic buttons on all platforms (better looking even with strange themes...) [f24b4b6969be] 2005-06-03 Alberto Griggio * widgets/static_text/static_text.py: applied patch to fix "empty label" bug [c3796fa56410] 2005-05-13 Alberto Griggio * edit_sizers/edit_sizers.py: fixed wx2.6 segfault [d90298bbf326] 2005-05-06 Alberto Griggio * CHANGES.txt, README.txt, __init__.py, about.py, application.py, clipboard.py, codegen/cpp_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, common.py, credits.txt, edit_sizers/__init__.py, edit_sizers/edit_sizers.py, edit_sizers/sizers_codegen.py, edit_windows.py, license.txt, main.py, misc.py, tree.py, widget_properties.py, widgets/ChoicesCodeHandler.py, widgets/ChoicesProperty.py, widgets/MenuTree.py, widgets/bitmap_button/__init__.py, widgets/bitmap_button/bitmap_button.py, widgets/bitmap_button/codegen.py, widgets/button/__init__.py, widgets/button/button.py, widgets/button/codegen.py, widgets/checkbox/__init__.py, widgets/checkbox/checkbox.py, widgets/checkbox/codegen.py, widgets/choice/__init__.py, widgets/choice/choice.py, widgets/choice/codegen.py, widgets/combo_box/__init__.py, widgets/combo_box/codegen.py, widgets/combo_box/combo_box.py, widgets/custom_widget/__init__.py, widgets/custom_widget/codegen.py, widgets/custom_widget/custom_widget.py, widgets/dialog/__init__.py, widgets/dialog/codegen.py, widgets/dialog/dialog.py, widgets/frame/__init__.py, widgets/frame/codegen.py, widgets/frame/frame.py, widgets/frame/perl_codegen.py, widgets/gauge/__init__.py, widgets/gauge/codegen.py, widgets/gauge/gauge.py, widgets/grid/__init__.py, widgets/grid/codegen.py, widgets/grid/grid.py, widgets/list_box/__init__.py, widgets/list_box/codegen.py, widgets/list_box/list_box.py, widgets/list_ctrl/__init__.py, widgets/list_ctrl/codegen.py, widgets/list_ctrl/list_ctrl.py, widgets/menubar/__init__.py, widgets/menubar/codegen.py, widgets/menubar/menubar.py, widgets/notebook/__init__.py, widgets/notebook/codegen.py, widgets/notebook/notebook.py, widgets/panel/__init__.py, widgets/panel/codegen.py, widgets/panel/panel.py, widgets/radio_box/__init__.py, widgets/radio_box/codegen.py, widgets/radio_box/radio_box.py, widgets/radio_button/__init__.py, widgets/radio_button/codegen.py, widgets/radio_button/radio_button.py, widgets/slider/__init__.py, widgets/slider/codegen.py, widgets/slider/slider.py, widgets/spacer/__init__.py, widgets/spacer/codegen.py, widgets/spacer/spacer.py, widgets/spin_button/__init__.py, widgets/spin_ctrl/__init__.py, widgets/spin_ctrl/codegen.py, widgets/spin_ctrl/spin_ctrl.py, widgets/splitter_window/__init__.py, widgets/splitter_window/codegen.py, widgets/splitter_window/splitter_window.py, widgets/static_bitmap/__init__.py, widgets/static_bitmap/codegen.py, widgets/static_bitmap/perl_codegen.py, widgets/static_bitmap/static_bitmap.py, widgets/static_line/__init__.py, widgets/static_line/codegen.py, widgets/static_line/static_line.py, widgets/static_text/__init__.py, widgets/static_text/codegen.py, widgets/static_text/static_text.py, widgets/text_ctrl/__init__.py, widgets/text_ctrl/codegen.py, widgets/text_ctrl/text_ctrl.py, widgets/toggle_button/__init__.py, widgets/toggle_button/codegen.py, widgets/toggle_button/toggle_button.py, widgets/toolbar/__init__.py, widgets/toolbar/codegen.py, widgets/toolbar/tool.py, widgets/toolbar/toolbar.py, widgets/tree_ctrl/__init__.py, widgets/tree_ctrl/codegen.py, widgets/tree_ctrl/tree_ctrl.py, wxglade.py, xml_parse.py, xrc2wxg.py: updated copyright info - added wx2.6 compatibility [c756f426c1ce] 2005-04-27 Alberto Griggio * edit_sizers/edit_sizers.py, events_mixin.py: small fixes (as usual ;-) [953b32c04bc8] 2005-04-26 Alberto Griggio * edit_sizers/edit_sizers.py: fixed broken GridSizer layout [c65bff823272] 2005-04-16 Alberto Griggio * widgets/toolbar/toolbar.py: changed to unix eol [e2a414ebb6ac] 2005-04-14 Alberto Griggio * edit_sizers/edit_sizers.py: fixed small bug [148b2d47b72d] 2005-04-09 crazyinsomniac * widgets/toolbar/toolbar.py: load empty bitmap if var:/code: [d88587b60b42] * widgets/bitmap_button/bitmap_button.py, widgets/static_bitmap/static_bitmap.py: load empty bitmap if var:/code: [dfee061cbc7c] 2005-04-07 Alberto Griggio * edit_sizers/edit_sizers.py, edit_windows.py, widget_properties.py, widgets/panel/panel.py: fixed segfault when adding a panel... (introduced by mistake some weeks ago) [8d8e47eb52d1] 2005-04-04 Alberto Griggio * codegen/py_codegen.py, edit_sizers/edit_sizers.py, edit_windows.py, widgets/grid/codegen.py: fixed some various bugs... [21530c7810f0] * layout_option_property.py: added layout_option_property to prepare for (possible) wx.GridBagSizer support [27fa1293dfae] 2005-03-25 Alberto Griggio * widgets/toolbar/perl_codegen.py: applied patch #1169318 [6b5f29e3b7da] 2005-03-11 Alberto Griggio * main.py, widgets/frame/codegen.py, xml_parse.py: some bug fixes [c701e69d0c21] 2005-03-05 Alberto Griggio * icons/gtk/refresh.xpm, icons/msw/refresh.xpm, main.py, tree.py: implemented "refresh" [a5f02c2e8705] 2005-02-21 crazyinsomniac * widgets/notebook/perl_codegen.py: added missing new_signature [59aa1657cc4c] 2005-02-12 Alberto Griggio * edit_sizers/edit_sizers.py, edit_windows.py: now when you select a different widget, the visible tab is preserved (if possible) [19adf2b6f932] 2005-02-07 Alberto Griggio * edit_windows.py, widgets/dialog/dialog.py, widgets/frame/frame.py: fixed title bug [6c2964bcad08] 2005-01-20 Alberto Griggio * common.py: applied patch #1101182 [2c4d5a2dc166] * config.py, main.py, misc.py, xrc2wxg.py: fixed dir dialog bug and bug #1104006 [f9d8b03fe0d5] 2005-01-14 Alberto Griggio * application.py, main.py: fixed small wxDirSelector bug [2e7254cfe0f0] 2005-01-10 Alberto Griggio * about.py, codegen/cpp_codegen.py, codegen/py_codegen.py, edit_sizers/edit_sizers.py, main.py, tree.py, widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/notebook/notebook.py: a lot of things... unfortunately I don't remeber any of them :-( [56a9d961d496] 2004-12-23 crazyinsomniac * zmain.py, zwxglade.py: mdi allows for fullscreen, against slightly outdated main.py/wxglade.py [f0d277241132] 2004-12-22 crazyinsomniac * widgets/bitmap_button/perl_codegen.py: add missing comma [c6612e7d15ae] 2004-12-20 Alberto Griggio * main.py: fixed kde file dialog bug [283f5d59bec0] 2004-12-19 Alberto Griggio * widgets/bitmap_button/codegen.py, widgets/static_bitmap/codegen.py, widgets/toolbar/codegen.py: minor code generation changes for 'code:' and 'var:' [e8e77b0604ec] * application.py, edit_sizers/edit_sizers.py, edit_windows.py, misc.py, widgets/menubar/menubar.py, widgets/panel/panel.py, widgets/toolbar/toolbar.py: some minor ui enhancements [81af530199c1] 2004-12-13 Alberto Griggio * codegen/cpp_codegen.py, widgets/grid/codegen.py, widgets/list_ctrl/codegen.py, widgets/notebook/codegen.py, widgets/spin_button/codegen.py, widgets/spin_ctrl/codegen.py, widgets/splitter_window/codegen.py, widgets/tree_ctrl/codegen.py: c++ event handling enhancements [aa67443505b9] 2004-12-12 crazyinsomniac * codegen/pl_codegen.py: build_untouched_content block_start re tweak (Cheetah bug) [b7e3a6ecaa24] 2004-12-11 Alberto Griggio * README.txt: updated email address [12d29d1d2681] * README.txt: updated system requirements [12bddc6dfeb8] 2004-12-10 Alberto Griggio * events_mixin.py: event handling improvements [ea01d8484ab5] * codegen/cpp_codegen.py, codegen/py_codegen.py, widgets/menubar/codegen.py: event handling improvements [483a9e464b7f] * application.py, events_mixin.py, main.py, widgets/MenuTree.py, widgets/menubar/menubar.py, widgets/toolbar/tool.py, widgets/toolbar/toolbar.py: some event handling enhancements [1af34079ea56] 2004-12-08 Alberto Griggio * application.py, codegen/cpp_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, common.py, docs/tutorial.html, edit_windows.py, events_mixin.py, main.py, misc.py, tree.py, widget_properties.py, widgets/MenuTree.py, widgets/bitmap_button/bitmap_button.py, widgets/button/button.py, widgets/checkbox/checkbox.py, widgets/choice/choice.py, widgets/combo_box/combo_box.py, widgets/frame/frame.py, widgets/grid/codegen.py, widgets/grid/grid.py, widgets/list_box/list_box.py, widgets/list_ctrl/list_ctrl.py, widgets/menubar/codegen.py, widgets/menubar/menubar.py, widgets/notebook/notebook.py, widgets/radio_box/radio_box.py, widgets/radio_button/radio_button.py, widgets/slider/slider.py, widgets/spin_button/spin_button.py, widgets/spin_ctrl/spin_ctrl.py, widgets/splitter_window/splitter_window.py, widgets/text_ctrl/text_ctrl.py, widgets/toggle_button/toggle_button.py, widgets/toolbar/codegen.py, widgets/toolbar/tool.py, widgets/toolbar/toolbar.py, widgets/tree_ctrl/tree_ctrl.py, xml_parse.py: first basic event handlers support [d1ff6707f591] 2004-11-18 Alberto Griggio * edit_windows.py: fixed name validation regexp [dd4ba1026e6d] * widget_properties.py, widgets/menubar/menubar.py, widgets/toolbar/toolbar.py: possible fix for bug #1067586 [5ae44f888f06] 2004-11-16 Alberto Griggio * codegen/cpp_codegen.py: fixed: extra headers not inserted correctly when generating multiple files [b4954ca8b5ef] 2004-11-08 Alberto Griggio * CHANGES.txt: updated version info [03347c3f2a6a] * common.py, wxglade.spec: updated version number [20456d457838] 2004-11-06 Alberto Griggio * edit_sizers/edit_sizers.py: made possible to Cancel insertion of slots/rows/columns [14f3f23e2969] * edit_windows.py: fixed recently introduced "on_size" bug [cae1db52bfab] 2004-11-04 Alberto Griggio * CHANGES.txt, application.py, edit_sizers/edit_sizers.py, edit_windows.py, widgets/panel/panel.py, wxglade.spec: last changes before v0.3.5 [17af9f3f9d20] 2004-11-02 Alberto Griggio * CHANGES.txt, credits.txt: updated credits [1c4d354b75bd] * widgets/dialog/codegen.py, widgets/frame/codegen.py: patch from Vaclav Slavik to support 'icon' property in XRC [982b72e98767] 2004-11-02 georgesk * codegen/py_codegen.py: added the definition of the function _() to the code generated in python when i18n is selected [62e92abb96bf] * Makefile, debian/changelog, debian/compat, debian/control, debian/copyright, debian/dirs, debian/docs, debian/files, debian/manpage.xml, debian/postinst, debian/rules, debian/wxglade.1, wxglade: added debianisation tools to the package. They can be activated by running the command 'debuild' [a79c5b93c482] 2004-11-02 Alberto Griggio * README.txt, about.py, application.py, common.py, config.py, configUI.py, edit_windows.py, kdefiledialog.py, main.py, misc.py, res/preferences.wxg, widget_properties.py, widgets/bitmap_button/bitmap_button.py, widgets/dialog/dialog.py, widgets/menubar/menubar.py, widgets/static_bitmap/static_bitmap.py, widgets/toolbar/toolbar.py, wxglade.py, wxglade.spec, xml_parse.py: various tweaks and fixes for v0.3.5 release... [14d31979076f] 2004-11-01 georgesk * codegen/py_codegen.py: improved slightly i18n support in generated python code [c18a51041009] 2004-10-27 Alberto Griggio * wxglade.py: support for windows entry point [3c9b430a842d] * wxglade.pyw: entry point on windows [e49dc385f2d4] 2004-10-26 Alberto Griggio * codegen/pl_codegen.py: fixed windows line endings... [9729b4d4a4ec] * widgets/frame/codegen.py: fixed wxMDIChildFrame C++ code bug [707579ce628d] 2004-10-26 crazyinsomniac * codegen/pl_codegen.py: replace :: with os.sep in filenames [b8573561da20] 2004-10-24 Alberto Griggio * configUI.py, edit_sizers/edit_sizers.py, edit_windows.py, misc.py, res/preferences.wxg, tree.py: better handling of "duplicate names" [e03dc4952306] 2004-10-21 Alberto Griggio * codegen/cpp_codegen.py, codegen/py_codegen.py: fixed file name problem when generating multiple files [52e6fd4deb4e] * edit_windows.py: fixed set_size issue on wx >= 2.5 [840b740f9f6a] 2004-10-20 Alberto Griggio * edit_sizers/edit_sizers.py: fixed GridSizerBase.add_row bug [2ff812c400e2] * widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/menubar/menubar.py, widgets/panel/panel.py, widgets/toolbar/toolbar.py: fixed incorrect labeling in the tree when using custom class values [212c2d47b4a7] 2004-10-18 Alberto Griggio * widgets/toolbar/toolbar.py: fixed style problem [a817867604b9] * xml_parse.py: patch for encoding problem [6f684f972e11] * widgets/frame/frame.py: fixed segfault when removing a frame with a statusbar [d5325098b4c5] * edit_windows.py, widgets/menubar/menubar.py: fixed segfault when removing a toplevel window from the popup menu [db7fa19f054b] * common.py, main.py: small autosave enhancement [193442c60e43] * edit_windows.py: fixed bug that made it possible to double-past a sizer into a toplevel window [0837473ed086] * widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/menubar/menubar.py, widgets/radio_button/codegen.py, widgets/radio_button/radio_button.py, widgets/text_ctrl/text_ctrl.py, widgets/toolbar/toolbar.py: fixed minor issues [2ac44c750105] * config.py, configUI.py, icons/spinbtn.xpm, main.py, res/preferences.wxg: some ui tweaks [2c2b5c085b69] * common.py, edit_sizers/edit_sizers.py, edit_widget.py, edit_windows.py, widget_properties.py: better edit_widget support [14275c77ab9f] 2004-10-15 Alberto Griggio * codegen/py_codegen.py, common.py, docs/tutorial.html, edit_sizers/sizers_codegen.py, edit_windows.py, main.py, misc.py: some minor enhancements... [59fac1337962] * widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/menubar/menubar.py, widgets/toolbar/toolbar.py: better default class names for xrc output [af859781dd07] * CHANGES.txt, common.py, config.py, configUI.py, main.py, res/preferences.wxg: auto save support [a9401ee609dc] 2004-10-14 Alberto Griggio * codegen/py_codegen.py: fixed wrong add_app code [f2a6b5f07de5] 2004-10-05 Alberto Griggio * application.py, clipboard.py, codegen/py_codegen.py, edit_sizers/edit_sizers.py, edit_windows.py, tree.py: various bugs fixed (preview, change of position on a sizer, ...) [d376adef66c2] 2004-10-02 crazyinsomniac * widgets/radio_button/radio_button.py: now a radio button is displayed checked when thats its value [9274d0ff621d] 2004-09-30 Alberto Griggio * edit_sizers/edit_sizers.py: fixed segfault when using grid sizers [ec1e77efbec4] * widgets/frame/frame.py: fixed bug #1019325 [3fe94f7ab356] * widgets/combo_box/combo_box.py: added wxCB_SIMPLE style [9024a011ee06] 2004-09-28 crazyinsomniac * widgets/spin_button/spin_button.py: create_widget now has exception handling [a877bad87104] * widgets/button/button.py: create_widget now exception handling [97bfd3040a6f] * widgets/button/button.py: create_widget button now takes on style as specified by user [31bbbd1bb55a] 2004-09-27 Alberto Griggio * tree.py, widgets/bitmap_button/bitmap_button.py, widgets/static_bitmap/static_bitmap.py: miscellaneous fixes [f4dd937a330e] * icons/closed_folder.xpm: *** empty log message *** [16ef67724693] * main.py, widgets/dialog/dialog.py, widgets/menubar/menubar.py, widgets/panel/panel.py, widgets/splitter_window/splitter_window.py, xrc2wxg.py: miscellaneous fixes [3151aca2f366] 2004-09-23 crazyinsomniac * widgets/spin_button/spin_button.py: add style [6716fedf86e1] * icons/spinbtn.xpm: no message [39f2c94dc885] * widgets/spin_button/.cvsignore, widgets/spin_button/__init__.py, widgets/spin_button/codegen.py, widgets/spin_button/perl_codegen.py, widgets/spin_button/spin_button.py: no message [0671df6f4ab5] * widgets/widgets.txt: no message [7bb99ab679bb] * codegen/pl_codegen.py: no message [5b15986e9a32] * codegen/pl_codegen.py: put return $self after # end wxGlade [a08f0e69c193] 2004-09-22 crazyinsomniac * codegen/pl_codegen.py: missed a # [5afd34367a56] * codegen/pl_codegen.py: perl_codegen's now loaded from widgets.txt, just like the rest [5f55c774b2c5] 2004-09-20 Alberto Griggio * main.py, widgets/menubar/menubar.py, widgets/panel/panel.py: mac tweaks [69f54317ff5d] 2004-09-17 Alberto Griggio * CHANGES.txt, __init__.py, about.py, application.py, clipboard.py, codegen/cpp_codegen.py, codegen/pl_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, common.py, credits.txt, edit_sizers/__init__.py, edit_sizers/edit_sizers.py, edit_sizers/perl_sizers_codegen.py, edit_sizers/sizers_codegen.py, edit_widget.py, edit_windows.py, main.py, misc.py, tree.py, widget_properties.py, widgets/ChoicesCodeHandler.py, widgets/ChoicesProperty.py, widgets/MenuTree.py, widgets/bitmap_button/__init__.py, widgets/bitmap_button/bitmap_button.py, widgets/bitmap_button/codegen.py, widgets/bitmap_button/perl_codegen.py, widgets/button/__init__.py, widgets/button/button.py, widgets/button/codegen.py, widgets/button/perl_codegen.py, widgets/checkbox/__init__.py, widgets/checkbox/checkbox.py, widgets/checkbox/codegen.py, widgets/checkbox/perl_codegen.py, widgets/choice/__init__.py, widgets/choice/choice.py, widgets/choice/codegen.py, widgets/choice/perl_codegen.py, widgets/combo_box/__init__.py, widgets/combo_box/codegen.py, widgets/combo_box/combo_box.py, widgets/combo_box/perl_codegen.py, widgets/custom_widget/__init__.py, widgets/custom_widget/codegen.py, widgets/custom_widget/custom_widget.py, widgets/custom_widget/perl_codegen.py, widgets/dialog/__init__.py, widgets/dialog/codegen.py, widgets/dialog/dialog.py, widgets/dialog/perl_codegen.py, widgets/frame/__init__.py, widgets/frame/codegen.py, widgets/frame/frame.py, widgets/frame/perl_codegen.py, widgets/gauge/__init__.py, widgets/gauge/codegen.py, widgets/gauge/gauge.py, widgets/gauge/perl_codegen.py, widgets/grid/__init__.py, widgets/grid/codegen.py, widgets/grid/grid.py, widgets/grid/perl_codegen.py, widgets/list_box/__init__.py, widgets/list_box/codegen.py, widgets/list_box/list_box.py, widgets/list_box/perl_codegen.py, widgets/list_ctrl/__init__.py, widgets/list_ctrl/codegen.py, widgets/list_ctrl/list_ctrl.py, widgets/list_ctrl/perl_codegen.py, widgets/menubar/__init__.py, widgets/menubar/codegen.py, widgets/menubar/menubar.py, widgets/menubar/perl_codegen.py, widgets/notebook/__init__.py, widgets/notebook/codegen.py, widgets/notebook/notebook.py, widgets/notebook/perl_codegen.py, widgets/panel/__init__.py, widgets/panel/codegen.py, widgets/panel/panel.py, widgets/panel/perl_codegen.py, widgets/radio_box/__init__.py, widgets/radio_box/codegen.py, widgets/radio_box/perl_codegen.py, widgets/radio_box/radio_box.py, widgets/radio_button/__init__.py, widgets/radio_button/codegen.py, widgets/radio_button/perl_codegen.py, widgets/radio_button/radio_button.py, widgets/slider/__init__.py, widgets/slider/codegen.py, widgets/slider/perl_codegen.py, widgets/slider/slider.py, widgets/spacer/__init__.py, widgets/spacer/codegen.py, widgets/spacer/perl_codegen.py, widgets/spacer/spacer.py, widgets/spin_ctrl/__init__.py, widgets/spin_ctrl/codegen.py, widgets/spin_ctrl/perl_codegen.py, widgets/spin_ctrl/spin_ctrl.py, widgets/splitter_window/__init__.py, widgets/splitter_window/codegen.py, widgets/splitter_window/perl_codegen.py, widgets/splitter_window/splitter_window.py, widgets/static_bitmap/__init__.py, widgets/static_bitmap/codegen.py, widgets/static_bitmap/perl_codegen.py, widgets/static_bitmap/static_bitmap.py, widgets/static_line/__init__.py, widgets/static_line/codegen.py, widgets/static_line/perl_codegen.py, widgets/static_line/static_line.py, widgets/static_text/__init__.py, widgets/static_text/codegen.py, widgets/static_text/perl_codegen.py, widgets/static_text/static_text.py, widgets/text_ctrl/__init__.py, widgets/text_ctrl/codegen.py, widgets/text_ctrl/perl_codegen.py, widgets/text_ctrl/text_ctrl.py, widgets/toggle_button/__init__.py, widgets/toggle_button/codegen.py, widgets/toggle_button/perl_codegen.py, widgets/toggle_button/toggle_button.py, widgets/toolbar/__init__.py, widgets/toolbar/codegen.py, widgets/toolbar/perl_codegen.py, widgets/toolbar/tool.py, widgets/toolbar/toolbar.py, widgets/tree_ctrl/__init__.py, widgets/tree_ctrl/codegen.py, widgets/tree_ctrl/perl_codegen.py, widgets/tree_ctrl/tree_ctrl.py, wxglade.py, xml_parse.py, xrc2wxg.py: updated copyright information [7da9a49e539c] * common.py: updated version number [0becbca5675e] * CHANGES.txt, edit_sizers/edit_sizers.py, edit_windows.py: fixed bug when removing widgets from the popup menu (GTK2) [5f12a2b7a57e] * codegen/cpp_codegen.py, codegen/py_codegen.py, edit_sizers/sizers_codegen.py: fix for staticbox bug [4fc62b12aea6] * wxglade.spec: updated version number [ded07f71202d] * icons/wxg_file.ico: icon for .wxg files [0fe496090dd2] 2004-09-17 crazyinsomniac * codegen/pl_codegen.py, edit_sizers/perl_sizers_codegen.py: fix staticbox order bug [200dc46f2a54] 2004-09-15 Alberto Griggio * widgets/frame/codegen.py: removed "fake" wxPanel from xrc code generation, as it is not necessary anymore [8f77c204289f] 2004-09-04 Alberto Griggio * CHANGES.txt, common.py: changed version number [ae359ae40e78] 2004-09-02 Alberto Griggio * configUI.py, res/preferences.wxg: *** empty log message *** [651303f23d55] 2004-09-01 Alberto Griggio * tree.py, widget_properties.py, wxglade.py, wxglade.spec: small fixes [990386c26941] * widgets/grid/codegen.py: fixed bug with 2.5.2.8 [38a3cf7e2684] 2004-08-26 Alberto Griggio * edit_sizers/edit_sizers.py, edit_windows.py, tree.py, widgets/panel/codegen.py, xml_parse.py: *** empty log message *** [2afcc1cf44a9] 2004-08-19 Alberto Griggio * common.py: fixed bug in make_object_button [0986cfe5e4ed] 2004-08-18 Alberto Griggio * edit_windows.py: fixed typo in wxFIXED_MINSIZE [e80613119015] 2004-08-17 Alberto Griggio * edit_windows.py: "fix" for wxPython 2.5.2.x [07d25e6ebb4d] 2004-08-17 crazyinsomniac * widgets/frame/perl_codegen.py, widgets/grid/perl_codegen.py, widgets/panel/perl_codegen.py: again with the CR+LF to LF tomfoolery [5f91cb32a9fa] 2004-08-16 Alberto Griggio * widget_properties.py, wxglade.py: fixed small bugs [18983b92d12b] 2004-08-15 Alberto Griggio * edit_windows.py, main.py: fixed bug in "_build_from_font" [060cb8c2c0fe] 2004-08-12 Alberto Griggio * CHANGES.txt, common.py, config.py, configUI.py, edit_sizers/edit_sizers.py, edit_windows.py, res/preferences.wxg: some small improvements... [7279374bda0e] 2004-08-06 Alberto Griggio * common.py, license.txt, widgets/list_box/codegen.py: *** empty log message *** [4db223aee897] 2004-07-21 Alberto Griggio * widgets/static_bitmap/codegen.py: fixed style bug in python code [a596e9067632] 2004-07-18 Alberto Griggio * CHANGES.txt, common.py, widgets/menubar/codegen.py: changed python code generator for menubar [f3c8ed7d5e58] 2004-07-15 Alberto Griggio * widgets/tree_ctrl/tree_ctrl.py: applied patch #985511 [f00818bbec5b] 2004-06-29 Alberto Griggio * codegen/py_codegen.py: applied patch #974995 [bc4991f906b2] 2004-06-16 Alberto Griggio * widget_properties.py: fixed ColorDialogProperty affecting grid in 0.3.3 [2ed4eb49dbf4] 2004-06-04 Alberto Griggio * edit_windows.py: fixed bug #966094 [2454e0a03560] 2004-05-18 Alberto Griggio * color_dialog.py: fixed bug on 2.5 on windows [15df45f2b9bf] 2004-05-17 Alberto Griggio * edit_widget.py: added from_xml option to add_widget_node [7ca3093a6209] * color_dialog.py, edit_widget.py, edit_windows.py, widget_properties.py: more bugfixes... [6da32eb6287f] 2004-05-14 Alberto Griggio * config.py: fixed for wrong bool conversion [b0ccdf12e067] 2004-05-12 Alberto Griggio * font_dialog.py: fixed 2.5 bug in choose_specific_font [18a0752f1d88] * edit_widget.py: fixed small bug in increment_label [0eb94acc9125] 2004-05-11 Alberto Griggio * xml_parse.py: fixed composed.class.Name bug :-) [a4bfd7c3d6ee] * main.py: fixed wx 2.5 incompatibility (wxSizer.Show(wxSizer, bool) not working as expected...) [097cdf4c2a90] * font_dialog.py, widgets/custom_widget/custom_widget.py: small fixes [80507d81897c] 2004-05-05 Alberto Griggio * CHANGES.txt, codegen/xrc_codegen.py, common.py, edit_windows.py, widget_properties.py, widgets/button/button.py, widgets/button/codegen.py, widgets/button/perl_codegen.py, widgets/choice/choice.py, widgets/combo_box/codegen.py, widgets/combo_box/combo_box.py, widgets/frame/codegen.py, widgets/list_box/list_box.py, widgets/list_ctrl/list_ctrl.py, widgets/spin_ctrl/codegen.py: fixes and tweaks in preparation for release 0.3.3 [a34801085654] 2004-05-01 Alberto Griggio * widgets/list_ctrl/list_ctrl.py: removed obsolete wxLC_USER_TEXT style [fb9a30022309] 2004-04-26 Alberto Griggio * application.py, edit_sizers/edit_sizers.py, widgets/choice/choice.py: fixes for wx2.5 [4582efc8c392] 2004-04-21 Alberto Griggio * __init__.py: to turn wxGlade into a package [ed7db4aca88a] * edit_sizers/edit_sizers.py: fixed segfault on wx2.5 [8ed0070394c3] 2004-04-07 Alberto Griggio * widgets/combo_box/combo_box.py: fixed wx 2.5 incompatibility [af8713eaa923] 2004-03-30 Alberto Griggio * widgets/splitter_window/codegen.py, widgets/splitter_window/perl_codegen.py: fixed splitter window layout bug [c0f0a61d312e] 2004-03-15 Alberto Griggio * widgets/menubar/menubar.py: fixed small bug [0fe2178b422d] 2004-03-11 Alberto Griggio * edit_windows.py, widgets/frame/codegen.py, widgets/frame/frame.py, widgets/frame/perl_codegen.py, widgets/text_ctrl/text_ctrl.py: some bugfixes [af41c4dfae96] 2004-03-10 Alberto Griggio * wxglade.spec: first commit [44e65bf534e1] 2004-03-06 Alberto Griggio * CHANGES.txt, widgets/panel/panel.py: fixed bug #880674 [a0123047e355] 2004-03-04 Alberto Griggio * CHANGES.txt: update to version 0.3.2 [7591d042f862] 2004-03-01 Alberto Griggio * common.py: updated version number [077f0532af62] * credits.txt, docs/html/apa.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch04.html, docs/html/ch04s02.html, docs/html/ch05.html, docs/html/ch05s02.html, docs/html/ch05s03.html, docs/html/ch05s04.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/src/manual.xml: user's manual update [8a7b9086af66] 2004-02-22 Alberto Griggio * icons/wxglade_small.png: changed to wxWidgets [0272510f7220] 2004-02-21 Alberto Griggio * credits.txt: changed wxWindows to wxWidgets [7686cb9e98e1] * common.py: updated version number [a00930cfb9bd] * main.py: removed drop targets for the tree and property windows as they make wxGlade crash on win32 [2b15bb2bcc97] 2004-02-20 Alberto Griggio * widgets/MenuTree.py, widgets/menubar/codegen.py: fixed submenu bug [f16b04cd8cdd] 2004-02-19 Alberto Griggio * CHANGES.txt, clipboard.py, main.py: added drag&drop of wxg files for opening them [cd5f378c846e] 2004-02-17 Alberto Griggio * CHANGES.txt, docs/index.html: new manual added [7f5c545352ad] * application.py, main.py: fixed `relative paths' issue [17259cbc9854] 2004-02-09 Alberto Griggio * widget_properties.py: made possible for GridProperty to be empty [3fba24153bb2] 2004-02-07 Alberto Griggio * CHANGES.txt: *** empty log message *** [1efa6c398f02] 2004-02-06 Alberto Griggio * config.py: applied patch #890587 [0a60987b18c2] 2004-02-01 Alberto Griggio * widgets/bitmap_button/codegen.py, widgets/bitmap_button/perl_codegen.py, widgets/static_bitmap/codegen.py, widgets/static_bitmap/perl_codegen.py, widgets/toolbar/codegen.py, widgets/toolbar/perl_codegen.py: converted to unix EOL [2c24d4b3fed8] 2004-01-31 Alberto Griggio * widgets/dialog/dialog.py, widgets/frame/frame.py: changes to support var: and code: icons [3787b2e1413c] 2004-01-30 Alberto Griggio * tree.py: fixed wx 2.5 incompatibility [91859644fd40] * misc.py: added global Ctrl+g shortcut [58c334519245] 2004-01-29 dinogen * docs/html/apa.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch04.html, docs/html/ch04s02.html, docs/html/ch05.html, docs/html/ch05s02.html, docs/html/ch05s03.html, docs/html/ch05s04.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/src/manual.xml: syntax error on manual [0e4c816f2401] * docs/manual.tex: *** empty log message *** [687a3aea9ef3] * icons/icon16.xpm, widgets/frame/codegen.py: wxglade 16x16 icon var and code in wxFrame [b8f256d07a46] * widgets/bitmap_button/codegen.py, widgets/static_bitmap/codegen.py, widgets/toolbar/codegen.py: wxglade icon in the bitmaps preview [021a4218bacc] 2004-01-28 dinogen * docs/html/apa.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch04.html, docs/html/ch04s02.html, docs/html/ch05.html, docs/html/ch05s02.html, docs/html/ch05s03.html, docs/html/ch05s04.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/src/manual.xml: reduction of subsetction [e5db87747494] 2004-01-27 dinogen * docs/html/apa.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch04.html, docs/html/ch04s02.html, docs/html/ch04s03.html, docs/html/ch04s04.html, docs/html/ch04s05.html, docs/html/ch04s06.html, docs/html/ch04s07.html, docs/html/ch04s08.html, docs/html/ch04s09.html, docs/html/ch04s10.html, docs/html/ch04s11.html, docs/html/ch04s12.html, docs/html/ch04s13.html, docs/html/ch04s14.html, docs/html/ch04s15.html, docs/html/ch04s16.html, docs/html/ch04s17.html, docs/html/ch04s18.html, docs/html/ch04s19.html, docs/html/ch04s20.html, docs/html/ch04s21.html, docs/html/ch04s22.html, docs/html/ch04s23.html, docs/html/ch04s24.html, docs/html/ch04s25.html, docs/html/ch04s26.html, docs/html/ch04s27.html, docs/html/ch05.html, docs/html/ch05s02.html, docs/html/ch05s03.html, docs/html/ch05s04.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/src/manual.xml: manual finish [cc9b496b253a] * docs/html/apa.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch04.html, docs/html/ch04s02.html, docs/html/ch04s03.html, docs/html/ch04s04.html, docs/html/ch04s05.html, docs/html/ch04s06.html, docs/html/ch04s07.html, docs/html/ch04s08.html, docs/html/ch04s09.html, docs/html/ch04s10.html, docs/html/ch04s11.html, docs/html/ch04s12.html, docs/html/ch04s13.html, docs/html/ch04s14.html, docs/html/ch04s15.html, docs/html/ch04s16.html, docs/html/ch04s17.html, docs/html/ch04s18.html, docs/html/ch04s19.html, docs/html/ch04s20.html, docs/html/ch04s21.html, docs/html/ch04s22.html, docs/html/ch04s23.html, docs/html/ch04s24.html, docs/html/ch04s25.html, docs/html/ch04s26.html, docs/html/ch04s27.html, docs/html/ch05.html, docs/html/ch05s02.html, docs/html/ch05s03.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/src/manual.xml: doc widgets section completed [b3365b2fc347] 2004-01-26 dinogen * docs/pdf/readme.txt: added pdf dir but NOT the pdf file, it is too large. [14e22877cd05] * docs/html/apa.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch02s05.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch03s07.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/src/manual.xml: Widgets section in documentation [08f1dcd1e3ce] 2004-01-25 Alberto Griggio * wxPyColourChooser/__init__.py, wxPyColourChooser/canvas.py, wxPyColourChooser/intl.py, wxPyColourChooser/license/lgpl.txt, wxPyColourChooser/license/wxwindowslib.txt, wxPyColourChooser/pycolourbox.py, wxPyColourChooser/pycolourchooser.py, wxPyColourChooser/pycolourslider.py, wxPyColourChooser/pypalette.py: Removed unneeded files [bf3bb9da0506] * CHANGES.txt, about.py, codegen/py_codegen.py, color_dialog.py, config.py, edit_sizers/edit_sizers.py, font_dialog.py, main.py, misc.py, tree.py, widgets/frame/frame.py, widgets/splitter_window/splitter_window.py: fixes and changes for 2.5 compatibility [66917d1c9d2b] * widgets/toolbar/codegen.py: wrapped a long line [e77d83646774] 2004-01-20 dinogen * widgets/bitmap_button/codegen.py, widgets/bitmap_button/perl_codegen.py, widgets/static_bitmap/codegen.py, widgets/static_bitmap/perl_codegen.py, widgets/toolbar/codegen.py, widgets/toolbar/perl_codegen.py: added code\: tag to static_bitmap, bitmap_button and toolbar [b442205ffac0] 2004-01-20 crazyinsomniac * codegen/pl_codegen.py, edit_sizers/perl_sizers_codegen.py, widgets/button/perl_codegen.py, widgets/frame/perl_codegen.py, widgets/panel/perl_codegen.py: more \t tweaking *yawn* [7677e40ee135] * widgets/splitter_window/perl_codegen.py: add new new_signature, fix bug #865338 [6eb71c554fc8] 2004-01-20 Alberto Griggio * edit_sizers/edit_sizers.py: fixed bug #878469 [95efe405c4b2] 2004-01-18 Alberto Griggio * about.py, application.py, codegen/py_codegen.py, misc.py, tree.py, widgets/bitmap_button/codegen.py, widgets/static_bitmap/codegen.py, widgets/toolbar/codegen.py, xml_parse.py: new "use wx namespace" option for python output [7b274863ac08] 2004-01-08 dinogen * docs/src/manual.xml: english corrected version [0bc11548c7d8] 2004-01-08 Alberto Griggio * codegen/cpp_codegen.py: fixed `//*' bug [0c752c51f059] 2004-01-05 Alberto Griggio * codegen/py_codegen.py, widgets/frame/frame.py: fixed small typo [48cabc37bbd3] 2003-12-28 Alberto Griggio * CHANGES.txt, xrc2wxg.py: updated to xrc2wxg version 0.0.3 [31ab0e910ac9] 2003-12-20 Alberto Griggio * widgets/static_bitmap/codegen.py: fixed new wx namespace bug [1a2e9f2b43f4] * widgets/bitmap_button/codegen.py: fixed new wx namespace bug [7c511b8c85a5] 2003-12-17 Alberto Griggio * widgets/menubar/codegen.py: fixed new namespace bug [3d09671d0bdf] 2003-12-09 dinogen * widgets/static_bitmap/codegen.py: static bitmap generation bug correct [a4394e28fd11] 2003-12-07 Alberto Griggio * CHANGES.txt, tree.py: partially fixed bug #798041 (renaming) [4aa4d408fab3] 2003-12-06 Alberto Griggio * CHANGES.txt, widgets/panel/panel.py: it is now possible to paste a sizer into a panel [491470d72cd8] 2003-12-03 Alberto Griggio * codegen/cpp_codegen.py: fixed bug in generate_code_id [132000b1627a] 2003-11-30 Alberto Griggio * codegen/py_codegen.py: fixed new wx namespace bug [5bab01a607cc] 2003-11-27 Alberto Griggio * widgets/text_ctrl/text_ctrl.py: added some styles [11521660debb] * codegen/py_codegen.py: fixed new namespace bug (wxFont) [6a6b8db559f0] * application.py: fixed preview bug (use_new_namespace) [ead1a85ea5e1] 2003-11-25 Alberto Griggio * config.py: wrapped a long line :) [df37e3c5ee08] * CHANGES.txt: new wx namespace for python code generator [8c8a18f6e0a1] * common.py: changed version number [c6968b79c686] 2003-11-24 Alberto Griggio * application.py, codegen/py_codegen.py, edit_sizers/sizers_codegen.py, widgets/bitmap_button/codegen.py, widgets/button/codegen.py, widgets/checkbox/codegen.py, widgets/choice/codegen.py, widgets/combo_box/codegen.py, widgets/custom_widget/codegen.py, widgets/dialog/codegen.py, widgets/frame/codegen.py, widgets/gauge/codegen.py, widgets/grid/codegen.py, widgets/list_box/codegen.py, widgets/list_ctrl/codegen.py, widgets/menubar/codegen.py, widgets/notebook/codegen.py, widgets/panel/codegen.py, widgets/radio_box/codegen.py, widgets/radio_button/codegen.py, widgets/slider/codegen.py, widgets/spin_ctrl/codegen.py, widgets/splitter_window/codegen.py, widgets/static_bitmap/codegen.py, widgets/static_line/codegen.py, widgets/static_text/codegen.py, widgets/text_ctrl/codegen.py, widgets/toggle_button/codegen.py, widgets/toolbar/codegen.py, widgets/tree_ctrl/codegen.py: support for new wxPython namespace [c87db99bbdcd] * configUI.py: small UI fixes [0427ae7c415f] 2003-11-20 dinogen * config.py, configUI.py, res/preferences.wxg: split config.py in configUI (base class) and config (derived class) [d6d155e980b1] 2003-11-18 dinogen * res/preferences.wxg: wxg preference added [f633369011c1] 2003-11-13 Alberto Griggio * application.py: fixed preview bug [37307be4efe7] 2003-10-30 dinogen * config.py, widgets/custom_widget/codegen.py, widgets/custom_widget/custom_widget.py, widgets/custom_widget/perl_codegen.py: custom widget w and h - variable default border [326c0b730535] 2003-10-29 lawson89 * tree.py: Fixes to address: (1) toplevel windows not brought to front on a double click of node (2) doubleclick on expanded toplevel node collapsed entire widget tree instead of just the node [db953116f0d5] 2003-10-24 Alberto Griggio * edit_sizers/edit_sizers.py, edit_windows.py, xml_parse.py: added wxSHAPED and wxADJUST_MINSIZE flags [06b49b52bd0b] 2003-10-09 dinogen * docs/src/manual.xml: *** empty log message *** [c5aae736200d] 2003-10-07 dinogen * docs/html/apa.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/ch03s06.html, docs/html/ch03s07.html, docs/html/index.html, docs/src/manual.xml: *** empty log message *** [373585b7c8a1] 2003-10-02 dinogen * docs/Makefile, docs/html/apa.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/ch03s05.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/src/manual.xml: *** empty log message *** [2046e0f1fdc9] 2003-10-01 dinogen * docs/html/apa.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch02s04.html, docs/html/ch03.html, docs/html/ch03s02.html, docs/html/ch03s03.html, docs/html/ch03s04.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/html/properties_window_tab_1.png, docs/html/properties_window_tab_2.png, docs/html/properties_window_tab_3.png, docs/src/manual.xml, docs/src/properties_window_tab_1.png, docs/src/properties_window_tab_2.png, docs/src/properties_window_tab_3.png: *** empty log message *** [6f25507c6b71] 2003-09-24 dinogen * docs/src/manual.xml, edit_sizers/sizers_codegen.py: fixed growing cols bug [c0449a28c7e0] 2003-09-11 dinogen * config.py, widgets/bitmap_button/bitmap_button.py, widgets/button/button.py, widgets/checkbox/checkbox.py, widgets/choice/choice.py, widgets/combo_box/combo_box.py, widgets/radio_button/radio_button.py, widgets/spin_ctrl/spin_ctrl.py, widgets/static_text/static_text.py, widgets/text_ctrl/text_ctrl.py, widgets/toggle_button/toggle_button.py: added border default on config window for some widget [39d21fa441ca] 2003-09-09 dinogen * docs/html/ch02s04.html, docs/html/ch03s02.html, docs/html/design_window.png, docs/html/design_window_empty_slot.png, docs/html/label_menu.png, docs/html/sizer_menu.png: *** empty log message *** [f8139a0bec08] * docs/src/design_window_empty_slot.png, docs/src/label_menu.png, docs/src/select_frame.png, docs/src/sizer_menu.png, docs/src/test.wxg: added some section\ [b5e3edef32ca] * docs/html/apa.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch03.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/src/design_window.png, docs/src/manual.xml: added some section [d2cedbe6c619] 2003-08-31 Alberto Griggio * widgets/frame/codegen.py: fixed icon path quoting bug [6dfd4bbd469e] 2003-08-30 Alberto Griggio * misc.py: fixed bug with menu icons on wxGTK 2.4.1.2 [13b4753e29b7] * CHANGES.txt, common.py: updated to 0.3.1 [80eabe0fd98b] * codegen/pl_codegen.py: removed some ^M (DOS eol) [85886e9c585c] 2003-08-29 Alberto Griggio * CHANGES.txt, common.py: v0.3 released [a8c88c0bfac5] 2003-08-29 crazyinsomniac * codegen/pl_codegen.py: cleanup, locale multifile fixes, wxPySimpleApp fakery [16741c2d2deb] 2003-08-28 crazyinsomniac * codegen/pl_codegen.py: fixed "replace %s dependencies" not being replaced [d44325282d04] * codegen/pl_codegen.py: quote_path patch (escape $ and @ cause its ") [7b0bb62bc288] 2003-08-27 Alberto Griggio * main.py: minor cosmetic change (initial size of the property window) [a3fb5262d998] 2003-08-26 Alberto Griggio * widgets/spacer/spacer.py: minor UI tweak [8201e98f1baa] 2003-08-23 crazyinsomniac * codegen/pl_codegen.py: quote_str patch (escape $ and @ cause its ") [553b4ad7135e] 2003-08-16 Alberto Griggio * common.py: changed version id [f6819e323b5b] * main.py: silenced unimportant warning on py 2.3 [c6891100d90b] * edit_sizers/edit_sizers.py: small change [2a8b13dff299] * widgets/menubar/codegen.py, widgets/toolbar/codegen.py: fixed preview bug [33a13aabb12a] 2003-08-11 Alberto Griggio * widgets/radio_button/radio_button.py: fixed bug #786266 [fc57944821a4] * main.py: fixed bug #786233 [bbecb73d8e44] 2003-08-07 crazyinsomniac * codegen/pl_codegen.py, widgets/menubar/codegen.py, widgets/menubar/perl_codegen.py: logic bug (if id has no val, set it to wxNewId()) [8e632c2585bb] 2003-08-07 Alberto Griggio * widgets/bitmap_button/bitmap_button.py, widgets/bitmap_button/codegen.py, widgets/bitmap_button/perl_codegen.py, widgets/menubar/menubar.py, xrc2wxg.py: fixed bug #782767 [11a37a647329] 2003-08-07 crazyinsomniac * widgets/frame/frame.py, widgets/panel/panel.py: added wxNO_BORDER as a style option [84dcdf686d84] * codegen/pl_codegen.py: nonce tags now perl comments (#<...>), in case they're left over [93e75b6152d7] 2003-08-07 dinogen * docs/Makefile, docs/html/apa.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch03.html, docs/html/design_window.png, docs/html/index.html, docs/html/main_window.png, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/html/preview_window.png, docs/html/properties_window.png, docs/html/select_frame.png, docs/html/tree_window.png, docs/src/manual.xml: Docs on tree windows [dfd166e5aa73] 2003-08-05 dinogen * docs/manual.xml, docs/manual_des.png, docs/manual_main.png, docs/manual_preview.png, docs/manual_prop.png, docs/manual_tree.png: qqq:wq [a6e9003b814c] * docs/Makefile, docs/html/apa.html, docs/html/ch01.html, docs/html/ch01s02.html, docs/html/ch01s03.html, docs/html/ch01s04.html, docs/html/ch01s05.html, docs/html/ch01s06.html, docs/html/ch02.html, docs/html/ch02s02.html, docs/html/ch02s03.html, docs/html/ch03.html, docs/html/index.html, docs/html/pr01.html, docs/html/pr01s02.html, docs/html/pr01s03.html, docs/src/design_window.png, docs/src/main_window.png, docs/src/manual.xml, docs/src/preview_window.png, docs/src/properties_window.png, docs/src/tree_window.png: Nuova struttura docs [c3f1c4eba7e3] * docs/manual.xml: Added xml file [6f08a6633998] 2003-08-03 Alberto Griggio * codegen/py_codegen.py: better id code generation [fdfcec35f3d7] 2003-08-02 Alberto Griggio * application.py, edit_sizers/edit_sizers.py, edit_windows.py, widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/grid/grid.py, widgets/list_box/list_box.py, widgets/list_ctrl/list_ctrl.py, widgets/menubar/perl_codegen.py, widgets/spacer/spacer.py, widgets/static_bitmap/static_bitmap.py, widgets/toolbar/toolbar.py, widgets/tree_ctrl/tree_ctrl.py: fixed some python 2.3 warnings [59cddf97cb0c] 2003-07-31 crazyinsomniac * widgets/toolbar/perl_codegen.py: typo fix [c79ea83d5071] 2003-07-31 dinogen * docs/manual.tex: Aggiunta sezione di exploring [29f66cb4a7fd] 2003-07-29 Alberto Griggio * TODO.txt, application.py, main.py, misc.py, widgets/grid/grid.py, xml_parse.py: fixed some bugs [6bdf8690a358] 2003-07-26 Alberto Griggio * CHANGES.txt, codegen/pl_codegen.py, widgets/bitmap_button/perl_codegen.py, widgets/menubar/perl_codegen.py, widgets/static_bitmap/perl_codegen.py, widgets/toolbar/perl_codegen.py: brought perl generator up to date [3631803a55ff] * codegen/py_codegen.py: fixed comment [f7d474e0bcc8] * codegen/cpp_codegen.py, codegen/py_codegen.py, widgets/bitmap_button/codegen.py, widgets/static_bitmap/codegen.py, widgets/toolbar/codegen.py: fixed bug when escaping \ for pathnames [614e2b1c344c] 2003-07-23 Alberto Griggio * application.py, config.py: some bugs fixed [4f7841fa6dcc] * application.py, xml_parse.py: fixes for preview when self.klass == self.base [afe42205b63b] 2003-07-22 dinogen * docs/manual.tex: aggiustati termini nel quick start [ad6ffd43b012] 2003-07-22 Alberto Griggio * codegen/py_codegen.py: generated ids are now globals [621b22550e8a] 2003-07-21 dinogen * docs/manual.tex: Quick start completed [404349ce655f] 2003-07-19 Alberto Griggio * widgets/frame/frame.py, widgets/toolbar/codegen.py: fixed bugs [c018a5e11850] 2003-07-18 crazyinsomniac * widgets/custom_widget/perl_codegen.py: use CustomWidgetClass (temporary fix) [9a4b1690f6e1] * widgets/grid/perl_codegen.py: another wxGrid constants fix [7a0f6816f272] * widgets/grid/perl_codegen.py: wxGridSelectCells typo fix (thanks Jouke) [eedebca95ff9] 2003-07-18 Alberto Griggio * CHANGES.txt, codegen/cpp_codegen.py, codegen/py_codegen.py, widgets/bitmap_button/bitmap_button.py, widgets/bitmap_button/codegen.py, widgets/static_bitmap/codegen.py, widgets/static_bitmap/static_bitmap.py, widgets/toolbar/codegen.py, widgets/toolbar/toolbar.py: added support for var:variable_name in bitmap properties [1ab1929eee4f] * application.py: fixed wxMDIChildFrame preview bug [6264267ca01c] * edit_windows.py: fixed dialog units size bug [8a4a86fb3162] 2003-07-17 Alberto Griggio * widgets/button/button.py, widgets/toggle_button/toggle_button.py: fixed small label bug [801563300741] 2003-07-16 Alberto Griggio * CHANGES.txt, codegen/xrc_codegen.py, docs/tutorial.html, edit_windows.py, widget_properties.py, xml_parse.py: added subclass support to XRC output [420d8ac4b812] 2003-07-15 Alberto Griggio * CHANGES.txt, application.py, codegen/cpp_codegen.py, codegen/py_codegen.py, docs/tutorial.html, tree.py, xml_parse.py: new "overwrite" property of Application [28790b833f54] 2003-07-14 Alberto Griggio * application.py: changed default encoding from 'latin-1' to the equivalent 'ISO-8859-1' [3b03a60eca9e] 2003-07-13 crazyinsomniac * codegen/pl_codegen.py: generate_code_id fix (and probably other minor bits) [6e691c764983] 2003-07-12 Alberto Griggio * docs/tutorial.html: added special form "name=?" for id properties [dad1157b7c41] 2003-07-11 Alberto Griggio * codegen/pl_codegen.py: added useless comment, only to avoid emacs font-lock going insane [d6c34849ccb4] * CHANGES.txt, codegen/cpp_codegen.py, codegen/py_codegen.py, common.py, widgets/menubar/codegen.py, widgets/toolbar/codegen.py: fixed a couple of bugs, added ID_SOMETHING=? support (automatic id value generation) [65e84f9c5caa] * widgets/frame/frame.py: fixed bug #769524 [798fbf8b45aa] 2003-07-11 crazyinsomniac * codegen/pl_codegen.py, widgets/bitmap_button/perl_codegen.py, widgets/static_bitmap/perl_codegen.py, widgets/toolbar/perl_codegen.py: added quote_path and othe rminor bits [62e119c249b1] 2003-07-10 crazyinsomniac * codegen/pl_codegen.py: quote_str fix and other minor bits [cb4906c810a5] 2003-07-09 crazyinsomniac * widgets/dialog/perl_codegen.py, widgets/panel/perl_codegen.py: constructor signature fixes [89308ab69121] * codegen/pl_codegen.py, widgets/frame/perl_codegen.py, widgets/panel/perl_codegen.py: constructor signature fixes [63d04bf38159] 2003-07-08 Alberto Griggio * application.py, edit_sizers/edit_sizers.py, edit_windows.py, widgets/menubar/codegen.py, widgets/radio_box/radio_box.py: small bugfixes [c7c53561ff94] * widgets/menubar/codegen.py: fixed radio/checkable menu items bug (c++ codegen) [601a34c526a7] 2003-07-06 crazyinsomniac * widgets/splitter_window/perl_codegen.py: minor bugfixes [53e05b839f90] 2003-07-05 Alberto Griggio * CHANGES.txt, application.py, codegen/cpp_codegen.py, codegen/py_codegen.py, credits.txt, edit_windows.py: fixed some bugs [1e0853ca5d37] 2003-06-30 Alberto Griggio * codegen/.cvsignore, docs/.cvsignore, docs/img/.cvsignore, edit_sizers/.cvsignore, icons/gtk/.cvsignore, icons/msw/.cvsignore, widgets/.cvsignore, widgets/bitmap_button/.cvsignore, widgets/button/.cvsignore, widgets/checkbox/.cvsignore, widgets/choice/.cvsignore, widgets/combo_box/.cvsignore, widgets/custom_widget/.cvsignore, widgets/dialog/.cvsignore, widgets/frame/.cvsignore, widgets/gauge/.cvsignore, widgets/grid/.cvsignore, widgets/list_box/.cvsignore, widgets/list_ctrl/.cvsignore, widgets/menubar/.cvsignore, widgets/notebook/.cvsignore, widgets/panel/.cvsignore, widgets/radio_box/.cvsignore, widgets/radio_button/.cvsignore, widgets/slider/.cvsignore, widgets/spacer/.cvsignore, widgets/spin_ctrl/.cvsignore, widgets/splitter_window/.cvsignore, widgets/static_bitmap/.cvsignore, widgets/static_line/.cvsignore, widgets/static_text/.cvsignore, widgets/text_ctrl/.cvsignore, widgets/toggle_button/.cvsignore, widgets/toolbar/.cvsignore, widgets/tree_ctrl/.cvsignore: added missing .cvsignore [12cd6a30e69f] * .cvsignore, icons/.cvsignore: updated .cvsignore [0747d6982e08] * edit_sizers/edit_sizers.py: fixed "layout()" bug on 2.4.0 [eaf1780fa049] 2003-06-29 Alberto Griggio * docs/tutorial.html: small tweaks for xhtml compliance [d547f265c945] 2003-06-28 Alberto Griggio * docs/tutorial.html: small changes [db494b40ec74] * docs/tutorial.html: small changes [14b06db60d77] 2003-06-27 Alberto Griggio * edit_windows.py, widget_properties.py, widgets/list_box/list_box.py, widgets/panel/panel.py: small tweaks [38873597daad] 2003-06-27 crazyinsomniac * widgets/panel/perl_codegen.py: added ScrolledWindow support [8f7d5986ab68] * codegen/pl_codegen.py: minor bugfixes [3753bbb55c30] 2003-06-26 Alberto Griggio * edit_sizers/edit_sizers.py: layout() function update [5a1c0623c48d] * docs/tech_notes.txt: added coding conventions info [43d75f0e5d04] * CHANGES.txt, tree.py, widgets/panel/codegen.py, widgets/panel/panel.py: first scrolled window support [a1a3b545bb18] 2003-06-26 crazyinsomniac * widgets/frame/perl_codegen.py, widgets/toolbar/perl_codegen.py: minor bugfixes [57a1b98de9b9] * edit_sizers/perl_sizers_codegen.py: added a few missing semicolons (thanks Jouke) [d932a43463ae] 2003-06-25 crazyinsomniac * edit_sizers/perl_sizers_codegen.py, widgets/bitmap_button/perl_codegen.py, widgets/button/perl_codegen.py, widgets/checkbox/perl_codegen.py, widgets/choice/perl_codegen.py, widgets/combo_box/perl_codegen.py, widgets/frame/perl_codegen.py, widgets/gauge/perl_codegen.py, widgets/grid/perl_codegen.py, widgets/list_box/perl_codegen.py, widgets/list_ctrl/perl_codegen.py, widgets/notebook/perl_codegen.py, widgets/panel/perl_codegen.py, widgets/radio_box/perl_codegen.py, widgets/radio_button/perl_codegen.py, widgets/slider/perl_codegen.py, widgets/spin_ctrl/perl_codegen.py, widgets/splitter_window/perl_codegen.py, widgets/static_bitmap/perl_codegen.py, widgets/static_line/perl_codegen.py, widgets/static_text/perl_codegen.py, widgets/text_ctrl/perl_codegen.py, widgets/toggle_button/perl_codegen.py, widgets/toolbar/perl_codegen.py, widgets/tree_ctrl/perl_codegen.py: minor fixes, some reformatting [74b8ba8e7789] * codegen/pl_codegen.py: minor fixes, some reformatting [cee0cac0d2a6] * codegen/pl_codegen.py: minor fixes, some reformatting [d236d87116b9] 2003-06-24 Alberto Griggio * application.py: fixed a segfault due to a wxGTK wxRadioBox bug [2ff2559c4c69] 2003-06-24 crazyinsomniac * codegen/pl_codegen.py: add_sizeritem cleanup [b411e2902761] 2003-06-24 Alberto Griggio * application.py, codegen/py_codegen.py, edit_sizers/edit_sizers.py, edit_windows.py, main.py, misc.py, widgets/notebook/notebook.py: small tweaks [297a8a1569a5] 2003-06-24 lawson89 * edit_widget.py: removed some unused debug statements [12bc314ef453] 2003-06-23 crazyinsomniac * CHANGES.txt: *** empty log message *** [c765bb06d5d0] * codegen/pl_codegen.py: fixed dialog_units statements (apparently they are supported) [d3efd9cff63d] * codegen/pl_codegen.py: fixed dialog_units statements (not supported in wxPerl) [df0180634379] * codegen/pl_codegen.py, edit_sizers/perl_sizers_codegen.py: perl generator -- initial import into cvs [8e82cbf1bdd4] * widgets/button/perl_codegen.py, widgets/radio_button/perl_codegen.py, widgets/slider/perl_codegen.py, widgets/spacer/perl_codegen.py, widgets/spin_ctrl/perl_codegen.py, widgets/splitter_window/perl_codegen.py, widgets/static_bitmap/perl_codegen.py, widgets/static_line/perl_codegen.py, widgets/static_text/perl_codegen.py, widgets/text_ctrl/perl_codegen.py, widgets/toggle_button/perl_codegen.py, widgets/toolbar/perl_codegen.py, widgets/tree_ctrl/perl_codegen.py: perl generator -- initial import into cvs [963878ed13cc] * widgets/checkbox/perl_codegen.py, widgets/choice/perl_codegen.py, widgets/combo_box/perl_codegen.py, widgets/custom_widget/perl_codegen.py, widgets/dialog/perl_codegen.py, widgets/frame/perl_codegen.py, widgets/gauge/perl_codegen.py, widgets/grid/perl_codegen.py, widgets/list_box/perl_codegen.py, widgets/list_ctrl/perl_codegen.py, widgets/menubar/perl_codegen.py, widgets/notebook/perl_codegen.py, widgets/panel/perl_codegen.py, widgets/radio_box/perl_codegen.py: perl generator -- initial import into cvs [a80dd45fbd01] * widgets/bitmap_button/perl_codegen.py: perl generator -- initial import into cvs [a47d5ae3cb10] 2003-06-23 lawson89 * edit_widget.py: *** empty log message *** [090915245d00] 2003-06-21 Alberto Griggio * .cvsignore, CHANGES.txt, application.py, codegen/cpp_codegen.py, common.py, edit_sizers/edit_sizers.py, edit_windows.py, icons/.cvsignore, misc.py, widget_properties.py, widgets/bitmap_button/bitmap_button.py, widgets/button/button.py, widgets/checkbox/checkbox.py, widgets/choice/choice.py, widgets/combo_box/combo_box.py, widgets/custom_widget/custom_widget.py, widgets/frame/codegen.py, widgets/frame/frame.py, widgets/grid/grid.py, widgets/list_box/list_box.py, widgets/menubar/menubar.py, widgets/notebook/notebook.py, widgets/radio_box/radio_box.py, widgets/radio_button/radio_button.py, widgets/static_bitmap/static_bitmap.py, widgets/static_text/static_text.py, widgets/text_ctrl/text_ctrl.py, widgets/toggle_button/toggle_button.py, widgets/toolbar/tool.py, widgets/toolbar/toolbar.py, xml_parse.py, xrc2wxg.py: fixed a bunch of unicode bugs [71ec7b17f08d] 2003-06-11 Alberto Griggio * codegen/cpp_codegen.py, codegen/py_codegen.py: changed 'Disable()' to 'Enable(0)' in the generated code [2fec35b74b25] 2003-06-07 dinogen * docs/manual.tex, docs/manual_des.png, docs/manual_main.png, docs/manual_preview.png, docs/manual_prop.png, docs/manual_tree.png: manual TEX added [5b83838d11b7] 2003-06-02 Alberto Griggio * CHANGES.txt, common.py: *** empty log message *** [061b2a997ec7] * main.py: ToggleButtonBox [bf07afae6e26] 2003-05-24 Alberto Griggio * xrc2wxg.py: fixed Unicode issue [112899ba3570] * widgets/static_bitmap/codegen.py, widgets/static_line/codegen.py, widgets/static_text/codegen.py: fixed XRC generator (removed 'attribute' property) [fdbefb44fc6c] 2003-05-22 Alberto Griggio * widgets/splitter_window/codegen.py, widgets/toolbar/codegen.py: updated XRC support to latest XRC from CVS [8af5ea639d49] * CHANGES.txt, common.py, config.py, credits.txt: local widgets support [7b6821ba2f0e] 2003-05-20 Alberto Griggio * codegen/xrc_codegen.py: fixed silly bug [1c6387640bf5] 2003-05-19 Alberto Griggio * CHANGES.txt, docs/tutorial.html: updated information [eb70c965c04e] 2003-05-18 Alberto Griggio * codegen/xrc_codegen.py, widgets/menubar/codegen.py, xml_parse.py, xrc2wxg.py: small fixed (mostly unicode-related) [c0c99bb092c1] 2003-05-16 Alberto Griggio * main.py, widgets/notebook/codegen.py: fixed small bugs [0579489c3640] 2003-05-15 Alberto Griggio * CHANGES.txt, codegen/cpp_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, edit_windows.py, icons/sizer.xpm, widgets/dialog/codegen.py, widgets/dialog/dialog.py, widgets/frame/codegen.py, widgets/frame/frame.py, xml_parse.py: last fixes for the upcoming 0.2.3 [aa2674b422e4] 2003-05-14 Alberto Griggio * common.py, edit_sizers/edit_sizers.py, main.py: small changes [89b951014735] 2003-05-13 dinogen * widgets/frame/codegen.py, widgets/frame/frame.py: first write of icon property I have to test Cpp code generation. [b2db421c2974] 2003-05-13 Alberto Griggio * about.py, application.py, clipboard.py, color_dialog.py, common.py, config.py, edit_sizers/edit_sizers.py, edit_windows.py, font_dialog.py, main.py, misc.py, tree.py, widget_properties.py, xrc2wxg.py: small tweaks, and $Id:$ keyword [1ed6e80aa715] * CHANGES.txt, README.txt, TODO.txt, application.py, codegen/cpp_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, common.py, edit_sizers/__init__.py, edit_sizers/sizers_codegen.py, widgets/ChoicesCodeHandler.py, widgets/ChoicesProperty.py, widgets/MenuTree.py, widgets/bitmap_button/__init__.py, widgets/bitmap_button/bitmap_button.py, widgets/bitmap_button/codegen.py, widgets/button/__init__.py, widgets/button/button.py, widgets/button/codegen.py, widgets/checkbox/__init__.py, widgets/checkbox/checkbox.py, widgets/checkbox/codegen.py, widgets/choice/__init__.py, widgets/choice/choice.py, widgets/choice/codegen.py, widgets/combo_box/__init__.py, widgets/combo_box/codegen.py, widgets/combo_box/combo_box.py, widgets/custom_widget/__init__.py, widgets/custom_widget/codegen.py, widgets/custom_widget/custom_widget.py, widgets/dialog/__init__.py, widgets/dialog/codegen.py, widgets/dialog/dialog.py, widgets/frame/__init__.py, widgets/frame/codegen.py, widgets/frame/frame.py, widgets/gauge/__init__.py, widgets/gauge/codegen.py, widgets/gauge/gauge.py, widgets/grid/__init__.py, widgets/grid/codegen.py, widgets/grid/grid.py, widgets/list_box/__init__.py, widgets/list_box/codegen.py, widgets/list_box/list_box.py, widgets/list_ctrl/__init__.py, widgets/list_ctrl/codegen.py, widgets/list_ctrl/list_ctrl.py, widgets/menubar/__init__.py, widgets/menubar/codegen.py, widgets/menubar/menubar.py, widgets/notebook/__init__.py, widgets/notebook/codegen.py, widgets/notebook/notebook.py, widgets/panel/__init__.py, widgets/panel/codegen.py, widgets/panel/panel.py, widgets/radio_box/__init__.py, widgets/radio_box/codegen.py, widgets/radio_box/radio_box.py, widgets/radio_button/__init__.py, widgets/radio_button/codegen.py, widgets/radio_button/radio_button.py, widgets/slider/__init__.py, widgets/slider/codegen.py, widgets/slider/slider.py, widgets/spacer/__init__.py, widgets/spacer/codegen.py, widgets/spacer/spacer.py, widgets/spin_ctrl/__init__.py, widgets/spin_ctrl/codegen.py, widgets/spin_ctrl/spin_ctrl.py, widgets/splitter_window/__init__.py, widgets/splitter_window/codegen.py, widgets/splitter_window/splitter_window.py, widgets/static_bitmap/__init__.py, widgets/static_bitmap/codegen.py, widgets/static_bitmap/static_bitmap.py, widgets/static_line/__init__.py, widgets/static_line/codegen.py, widgets/static_line/static_line.py, widgets/static_text/__init__.py, widgets/static_text/codegen.py, widgets/static_text/static_text.py, widgets/text_ctrl/__init__.py, widgets/text_ctrl/codegen.py, widgets/text_ctrl/text_ctrl.py, widgets/toggle_button/__init__.py, widgets/toggle_button/codegen.py, widgets/toggle_button/toggle_button.py, widgets/toolbar/__init__.py, widgets/toolbar/codegen.py, widgets/toolbar/tool.py, widgets/toolbar/toolbar.py, widgets/tree_ctrl/__init__.py, widgets/tree_ctrl/codegen.py, widgets/tree_ctrl/tree_ctrl.py, wxglade.py, xml_parse.py, xrc2wxg.py: small tweaks, and $Id:$ keyword [045986c1a3ec] * icons/wxglade.ico: windows icon [90408b6153f0] 2003-05-10 Alberto Griggio * CHANGES.txt, codegen/xrc_codegen.py, widget_properties.py, widgets/button/button.py, widgets/custom_widget/codegen.py, widgets/custom_widget/custom_widget.py, widgets/notebook/codegen.py, xrc2wxg.py: better custom widget support (and some minor fixes) [85152aa04b45] 2003-05-07 Alberto Griggio * CHANGES.txt, application.py, codegen/py_codegen.py, credits.txt, edit_windows.py, misc.py, widgets/custom_widget/codegen.py, widgets/frame/frame.py, widgets/menubar/codegen.py, widgets/menubar/menubar.py, widgets/toolbar/codegen.py, widgets/toolbar/toolbar.py, xml_parse.py: added preview support [0b48ebe999f2] 2003-05-01 Alberto Griggio * codegen/cpp_codegen.py, widgets/notebook/notebook.py, widgets/toolbar/codegen.py, widgets/toolbar/toolbar.py: latest bugfixes before 0.2.2 release [e6330e5c7443] 2003-04-27 Alberto Griggio * main.py, misc.py: *** empty log message *** [f07a6baf310f] * widgets/frame/frame.py, widgets/notebook/notebook.py, widgets/splitter_window/splitter_window.py, widgets/toolbar/codegen.py, widgets/toolbar/toolbar.py: fixed small bugs and win32 incompatibilities [6258a462feb4] 2003-04-24 Alberto Griggio * widgets/static_bitmap/codegen.py: style property added [666a585115a2] * CHANGES.txt, codegen/py_codegen.py, config.py, credits.txt, main.py, widgets/dialog/dialog.py, widgets/frame/codegen.py, widgets/frame/frame.py, widgets/menubar/menubar.py, widgets/notebook/notebook.py, widgets/panel/panel.py, widgets/splitter_window/splitter_window.py, widgets/static_bitmap/static_bitmap.py, widgets/widgets.txt, xrc2wxg.py: toolbar support, some bugfixes and small updates [5be5365a1a2c] * icons/toolbar.xpm, widgets/toolbar/__init__.py, widgets/toolbar/codegen.py, widgets/toolbar/tool.py, widgets/toolbar/toolbar.py: first toolbar support [a5410e3d5d31] * about.py, credits.txt: updated credits and about box [dcea0e413385] * CHANGES.txt, credits.txt, edit_sizers/__init__.py, edit_sizers/edit_sizers.py, edit_windows.py, main.py, tree.py, widgets/custom_widget/custom_widget.py, widgets/list_ctrl/list_ctrl.py, widgets/notebook/notebook.py, widgets/panel/panel.py, widgets/splitter_window/splitter_window.py, widgets/tree_ctrl/tree_ctrl.py, xml_parse.py: bug fixes and new "virtual sizers" support [fbf7fe706204] 2003-04-23 Alberto Griggio * widgets/panel/__init__.py: new "virtual sizers" support [a5e20cfa7270] 2003-04-22 Alberto Griggio * codegen/py_codegen.py: fixed bug in __set_properties code generation [93e1388a5b64] 2003-04-18 Alberto Griggio * credits.txt: updated credits [44ac1e8684a4] * codegen/cpp_codegen.py: fix for "bug" #723115 [54e91bcb7d76] 2003-04-17 Alberto Griggio * CHANGES.txt, common.py, config.py, credits.txt, edit_sizers/edit_sizers.py, main.py, misc.py, widgets/custom_widget/custom_widget.py, widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/menubar/menubar.py: new preferences and some bugfixes/tweaks [d8c3c36787b9] 2003-04-13 Alberto Griggio * widgets/MenuTree.py, widgets/menubar/codegen.py, widgets/menubar/menubar.py: added support for radio menu items [675b15347ed7] 2003-04-10 Alberto Griggio * codegen/py_codegen.py: fixed bug #717863 [551de9f64860] * main.py: fixed bug #717595 [1fdc55b5e05c] 2003-04-03 Alberto Griggio * widgets/menubar/__init__.py, widgets/menubar/codegen.py, widgets/menubar/menubar.py: standalone menubar support [cf9590d4a498] * CHANGES.txt, codegen/cpp_codegen.py, codegen/py_codegen.py, common.py, edit_sizers/sizers_codegen.py, edit_windows.py, tree.py, widgets/bitmap_button/codegen.py, widgets/button/codegen.py, widgets/checkbox/codegen.py, widgets/choice/codegen.py, widgets/combo_box/codegen.py, widgets/custom_widget/codegen.py, widgets/dialog/codegen.py, widgets/widgets.txt, xrc2wxg.py: changed code generation API [a30c61552ed8] * widgets/frame/codegen.py, widgets/frame/frame.py, widgets/gauge/codegen.py, widgets/grid/codegen.py, widgets/list_box/codegen.py, widgets/list_ctrl/codegen.py, widgets/notebook/codegen.py, widgets/panel/codegen.py, widgets/panel/panel.py, widgets/radio_box/codegen.py, widgets/radio_button/codegen.py, widgets/slider/codegen.py, widgets/spacer/codegen.py, widgets/spin_ctrl/codegen.py, widgets/splitter_window/codegen.py, widgets/static_bitmap/codegen.py, widgets/static_line/codegen.py, widgets/static_text/codegen.py, widgets/text_ctrl/codegen.py, widgets/toggle_button/codegen.py, widgets/tree_ctrl/codegen.py: changed code generation API [3f0abca894b6] 2003-03-25 Alberto Griggio * edit_windows.py, widget_properties.py, widgets/grid/grid.py: fixed grid selection mode bug [65e4519a64b0] 2003-03-23 Alberto Griggio * widgets/radio_box/radio_box.py: fixed small bug in (title property) [66ed495c937a] 2003-03-21 dinogen * widgets/static_bitmap/codegen.py: variable "prefix" used [a77aaeae00d2] 2003-03-21 Alberto Griggio * widgets/bitmap_button/bitmap_button.py, widgets/radio_button/radio_button.py, widgets/spin_ctrl/spin_ctrl.py, widgets/static_bitmap/static_bitmap.py, widgets/toggle_button/toggle_button.py: fixed small bugs in some property getter/setter [03aadd9d7d17] * application.py, edit_windows.py, widgets/bitmap_button/bitmap_button.py, widgets/button/button.py, widgets/grid/grid.py: fixed bugs due to incorrect bool casts [3ba3a4e81441] 2003-03-20 Alberto Griggio * widgets/dialog/dialog.py, widgets/grid/grid.py: fixed small layout bugs [0e10abcfba8f] * CHANGES.txt, edit_windows.py: fixed bug #706890 [bdc1145df701] 2003-03-16 Alberto Griggio * codegen/cpp_codegen.py: small changes [975475dcd458] 2003-03-15 Alberto Griggio * CHANGES.txt, edit_windows.py, widgets/frame/frame.py: fixed small bugs [87fbd4b48f3c] 2003-03-14 Alberto Griggio * CHANGES.txt, config.py, main.py: added config.preferences.buttons_per_row [7d133bf92aa8] 2003-03-11 Alberto Griggio * CHANGES.txt: added first (basic) support for wxListCtrl and wxTreeCtrl [b33f0f97af2d] * application.py, edit_sizers/edit_sizers.py, edit_windows.py, widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/gauge/gauge.py, widgets/grid/grid.py, widgets/list_box/list_box.py, widgets/notebook/notebook.py, widgets/slider/slider.py, widgets/spin_ctrl/spin_ctrl.py, widgets/splitter_window/splitter_window.py, widgets/text_ctrl/text_ctrl.py, widgets/widgets.txt: added wxTAB_TRAVERSAL style to scrolled wins that display properties [bd182dde3dc4] * icons/tree_ctrl.xpm, widgets/tree_ctrl/__init__.py, widgets/tree_ctrl/codegen.py, widgets/tree_ctrl/tree_ctrl.py: wxTreeCtrl support [564db2e17d32] * icons/list_ctrl.xpm, widgets/list_ctrl/__init__.py, widgets/list_ctrl/codegen.py, widgets/list_ctrl/list_ctrl.py: wxListCtrl support [7d71d8aec07c] 2003-03-10 Alberto Griggio * CHANGES.txt, widget_properties.py, widgets/choice/choice.py, widgets/combo_box/combo_box.py, widgets/custom_widget/custom_widget.py, widgets/grid/grid.py, widgets/list_box/list_box.py, widgets/notebook/notebook.py, widgets/radio_box/radio_box.py: fixed bugs (see CHANGES.txt) [c7b7ae3dcf0c] 2003-03-09 Alberto Griggio * wxPyColourChooser/pycolourbox.py, wxPyColourChooser/pycolourchooser.py: converted true/false to True/False [15d2e82a6b28] 2003-03-08 Alberto Griggio * CHANGES.txt, codegen/cpp_codegen.py, codegen/py_codegen.py: fixed bug in the codegen modules (class decl regex) [4f53f21af979] * main.py, misc.py: fixed bug in wxPython 2.4.0.2's wxSizer.Insert [72153b987969] 2003-03-06 Alberto Griggio * CHANGES.txt, color_dialog.py, edit_sizers/edit_sizers.py, edit_windows.py, font_dialog.py, main.py, misc.py, widget_properties.py: bugfixes and improved performance and resources usage of the various properties [e2453269f0fc] 2003-03-05 Alberto Griggio * widgets/frame/frame.py: experimental bugfixes for bugs 698071 and 698074 [2ed4eb036de5] 2003-03-03 Alberto Griggio * README.txt: Added info about broken PyXML [bbde78ee66b7] 2003-02-26 Alberto Griggio * wxglade.py: commented out traceback print [d5224b2a139e] 2003-02-22 Alberto Griggio * widget_properties.py: *** empty log message *** [def414c6e8b9] * edit_windows.py: fixed bug in set_size when use_dialog_units preference is set [94ecd3d8194e] * tree.py: fixed bug in right_click handler [bd2e12ca15cf] * edit_windows.py: fixed bug in set_size when use_dialog_units preference is set [5f0eed8b1c56] 2003-02-19 Alberto Griggio * config.py, tree.py, widget_properties.py: fixed incompatibilities with python 2.3 due to new bool behaviour [e9896c039d6d] 2003-02-17 Alberto Griggio * application.py, widget_properties.py: minor layout tweaks for win32 [cbbb02664a69] 2003-02-16 Alberto Griggio * widgets/grid/grid.py: fixed bug: 'create_grid' property not saved correctly [a148c688fce4] 2003-02-14 Alberto Griggio * application.py, tree.py, xml_parse.py: slightly improved error messages [62d4ce052c8b] * CHANGES.txt, application.py, codegen/cpp_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, main.py, tree.py, xml_parse.py: slightly improved error messages [40da132ff020] 2003-02-12 Alberto Griggio * widgets/notebook/notebook.py, widgets/splitter_window/splitter_window.py: fixed bug #685264 [7c158d098c43] 2003-02-02 Alberto Griggio * CHANGES.txt: *** empty log message *** [5fe8aa354995] 2003-01-30 Alberto Griggio * widgets/notebook/notebook.py, widgets/splitter_window/splitter_window.py: fixed bug in *Pane.GetBestSize [b222920785e5] 2003-01-27 Alberto Griggio * CHANGES.txt: updated changelog [009e9d12c273] * codegen/cpp_codegen.py, codegen/py_codegen.py: fixed bug in multi-files code generation [c80a8c229011] * docs/tutorial.html: fixed some typos [8fad2dc8fd9b] 2003-01-26 Alberto Griggio * docs/tutorial.html: updated information and fixed typos [313ddf82f0c0] * config.py: *** empty log message *** [3ba5b3972768] * README.txt, about.py, application.py, clipboard.py, codegen/cpp_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, common.py, config.py, edit_sizers/__init__.py, edit_sizers/edit_sizers.py, edit_sizers/sizers_codegen.py, edit_windows.py, license.txt, main.py, misc.py, tree.py, widget_properties.py, widgets/ChoicesCodeHandler.py, widgets/ChoicesProperty.py, widgets/MenuTree.py, widgets/bitmap_button/__init__.py, widgets/bitmap_button/bitmap_button.py, widgets/bitmap_button/codegen.py, widgets/button/__init__.py, widgets/button/button.py, widgets/button/codegen.py, widgets/checkbox/__init__.py, widgets/checkbox/checkbox.py, widgets/checkbox/codegen.py, widgets/choice/__init__.py, widgets/choice/choice.py, widgets/choice/codegen.py, widgets/combo_box/__init__.py, widgets/combo_box/codegen.py, widgets/combo_box/combo_box.py, widgets/custom_widget/__init__.py, widgets/custom_widget/codegen.py, widgets/custom_widget/custom_widget.py, widgets/dialog/__init__.py, widgets/dialog/codegen.py, widgets/dialog/dialog.py, widgets/frame/__init__.py, widgets/frame/codegen.py, widgets/frame/frame.py, widgets/gauge/__init__.py, widgets/gauge/codegen.py, widgets/gauge/gauge.py, widgets/grid/__init__.py, widgets/grid/codegen.py, widgets/grid/grid.py, widgets/list_box/__init__.py, widgets/list_box/codegen.py, widgets/list_box/list_box.py, widgets/notebook/__init__.py, widgets/notebook/codegen.py, widgets/notebook/notebook.py, widgets/panel/__init__.py, widgets/panel/codegen.py, widgets/panel/panel.py, widgets/radio_box/__init__.py, widgets/radio_box/codegen.py, widgets/radio_box/radio_box.py, widgets/radio_button/__init__.py, widgets/radio_button/codegen.py, widgets/radio_button/radio_button.py, widgets/slider/__init__.py, widgets/slider/codegen.py, widgets/slider/slider.py, widgets/spacer/__init__.py, widgets/spacer/codegen.py, widgets/spacer/spacer.py, widgets/spin_ctrl/__init__.py, widgets/spin_ctrl/codegen.py, widgets/spin_ctrl/spin_ctrl.py, widgets/splitter_window/__init__.py, widgets/splitter_window/codegen.py, widgets/splitter_window/splitter_window.py, widgets/static_bitmap/__init__.py, widgets/static_bitmap/codegen.py, widgets/static_bitmap/static_bitmap.py, widgets/static_line/__init__.py, widgets/static_line/codegen.py, widgets/static_line/static_line.py, widgets/static_text/__init__.py, widgets/static_text/codegen.py, widgets/static_text/static_text.py, widgets/text_ctrl/__init__.py, widgets/text_ctrl/codegen.py, widgets/text_ctrl/text_ctrl.py, widgets/toggle_button/__init__.py, widgets/toggle_button/codegen.py, widgets/toggle_button/toggle_button.py, wxglade.py, xml_parse.py, xrc2wxg.py: update copyright notice [778df94ddb11] * CHANGES.txt, common.py, wxglade.py: small changes before v0.1.2 [79a3ddb66894] 2003-01-24 Alberto Griggio * widget_properties.py: fixed wxPython 2.4.0.2 incompatibility causing segfault at startup [a11b0bfe2071] 2003-01-20 Alberto Griggio * codegen/cpp_codegen.py: fixed serious bug introduced after v0.2 [784ad68412fc] 2003-01-19 Alberto Griggio * common.py, edit_sizers/edit_sizers.py, main.py, tree.py, widgets/dialog/dialog.py, widgets/frame/frame.py, widgets/notebook/notebook.py, widgets/panel/panel.py, widgets/splitter_window/splitter_window.py, wxglade.py: better paths handling (now it should be OK to execute from any dir) [d414ee4d35e0] * codegen/cpp_codegen.py, codegen/py_codegen.py, widgets/bitmap_button/codegen.py, widgets/button/codegen.py, widgets/checkbox/codegen.py, widgets/choice/codegen.py, widgets/combo_box/codegen.py, widgets/dialog/codegen.py, widgets/gauge/codegen.py, widgets/list_box/codegen.py, widgets/notebook/codegen.py, widgets/radio_box/codegen.py, widgets/radio_button/codegen.py, widgets/slider/codegen.py, widgets/splitter_window/codegen.py, widgets/static_bitmap/codegen.py, widgets/static_line/codegen.py, widgets/static_text/codegen.py, widgets/text_ctrl/codegen.py, widgets/toggle_button/codegen.py: some code cleanups [bb283fa5ef7d] 2003-01-17 dinogen * widgets/grid/__init__.py: changed comment [d6e66e8007c7] 2003-01-03 Alberto Griggio * widgets/static_bitmap/static_bitmap.py: fix (?) for a win-specific bug (#661123) [8816c903b97a] * CHANGES.txt, application.py, codegen/cpp_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, common.py, config.py, edit_sizers/sizers_codegen.py, main.py, tree.py, widgets/button/codegen.py, widgets/checkbox/codegen.py, widgets/choice/codegen.py, widgets/combo_box/codegen.py, widgets/dialog/codegen.py, widgets/frame/codegen.py, widgets/grid/codegen.py, widgets/list_box/codegen.py, widgets/notebook/codegen.py, widgets/radio_box/codegen.py, widgets/radio_button/codegen.py, widgets/static_bitmap/codegen.py, widgets/static_bitmap/static_bitmap.py, widgets/static_line/codegen.py, widgets/static_line/static_line.py, widgets/static_text/codegen.py, widgets/static_text/static_text.py, widgets/text_ctrl/codegen.py, widgets/toggle_button/codegen.py, wxglade.py, xml_parse.py: various tweaks to code generation: - customizable automatic backup - gettext support - "local" widgets [12e83f90bc74] 2002-12-28 Alberto Griggio * CHANGES.txt, edit_sizers/edit_sizers.py, edit_windows.py: platform-specific bugfixes and improvements [c5af71900208] 2002-12-27 Alberto Griggio * README.txt: information updated [f0dee1cce106] * widgets/frame/frame.py: workaround to avoid some segfaults on GTK [1026f07f8a7d] * docs/tutorial.html: some corrections [35d30ecbb3d7] 2002-12-26 Alberto Griggio * docs/tutorial.html: more notes added [8f6ce58423a3] 2002-12-25 Alberto Griggio * codegen/cpp_codegen.py, codegen/py_codegen.py, edit_sizers/edit_sizers.py, widgets/notebook/codegen.py, widgets/splitter_window/codegen.py, wxglade.py: more bugs fixed [4c55033ce6dc] 2002-12-24 Alberto Griggio * widgets/custom_widget/custom_widget.py, widgets/grid/grid.py, widgets/notebook/notebook.py: fixed bug in get_property_handler caused by a typo [2395aeaa1f32] * CHANGES.txt: fixed typo [a89b80cb00d6] 2002-12-23 Alberto Griggio * widgets/static_text/static_text.py: fixed bug impacting XRC output [b3af068e6440] * CHANGES.txt, application.py, main.py: better error messages [f3ed54e3f82d] 2002-12-21 Alberto Griggio * widgets/choice/choice.py, widgets/combo_box/combo_box.py, widgets/custom_widget/custom_widget.py, widgets/grid/grid.py, widgets/list_box/list_box.py, widgets/notebook/notebook.py, widgets/radio_box/radio_box.py: fixed bug in get_property_handler [e6c3ce540a45] 2002-12-20 Alberto Griggio * application.py, main.py, misc.py, widget_properties.py, widgets/choice/choice.py, widgets/combo_box/combo_box.py, widgets/gauge/gauge.py, widgets/grid/grid.py, widgets/list_box/list_box.py, widgets/slider/codegen.py, widgets/spin_ctrl/codegen.py: fixed bugs and/or wx 2.3.4 incompatibilities [f408d3070687] 2002-12-19 Alberto Griggio * widgets/grid/codegen.py, widgets/grid/grid.py: c++ code generation and some tweaks [0008df576e6e] * widget_properties.py: small bugfix [0b4af144c30a] 2002-12-18 dinogen * widgets/grid/codegen.py, widgets/grid/grid.py: codegen for wxgrid added [8ad498d73d3c] 2002-12-16 Alberto Griggio * config.py, widget_properties.py, widgets/notebook/codegen.py: small improvements [3e062f204c4d] 2002-12-15 Alberto Griggio * about.py, main.py: fixed path-related bug [5fe0cdd0b501] * widgets/splitter_window/splitter_window.py: fixed wxPython 2.3.2.1 incompatibility [51181fc972ca] 2002-12-14 Alberto Griggio * docs/img/custom_widget.gif, docs/img/sizer_slot.gif: *** empty log message *** [36b279877e50] * CHANGES.txt, docs/tutorial.html: tutorial updated [90e2c9b58cc0] * edit_sizers/__init__.py, edit_sizers/edit_sizers.py, widgets/frame/frame.py: automatically add a sizer to a frame [b5d57d6a7d04] * wxglade.py: fixed help string [3080b8779bc2] 2002-12-11 Alberto Griggio * edit_sizers/edit_sizers.py: added insert_row and insert_col to grid sizers [53561a163b9a] * xml_parse.py: better handling of renames during paste [d25a6262cd49] * about.py, common.py, misc.py, widget_properties.py, widgets/spin_ctrl/codegen.py, widgets/spin_ctrl/spin_ctrl.py, wxglade.py: fixed some minor bugs [3212e80e7052] * wxglade.py: fixed potential sys.path problem [5b5aa6b2f9f0] 2002-12-10 Alberto Griggio * widgets/bitmap_button/bitmap_button.py: fixed bug on load_bitmap [54f02a0e406e] * widget_properties.py: implemented "escaping" from text properties to undo changes [45a96b324e4e] * main.py: safer _save_app [9049c80564e2] * common.py: merged [b9cc098948c7] * edit_sizers/edit_sizers.py, edit_sizers/sizers_codegen.py: SetSizeHints code generation [4cb86a3805b7] * color_dialog.py: fixed bug on win32 [0ecef53d7524] 2002-12-10 dinogen * widgets/grid/grid.py: oops, an stupid error slops to me [104c2172ce4b] * widgets/grid/codegen.py, widgets/grid/grid.py: Added columns property [b022ec403acf] * common.py, misc.py: smart_split function moved. [b2f2a9b67030] 2002-12-08 Alberto Griggio * codegen/py_codegen.py: "fixed" code generation bugs when a container class is renamed (and we're in single file mode) [f04ae26807a1] * codegen/cpp_codegen.py, codegen/py_codegen.py: "fixed" code generation bugs when a container class is renamed (and we're in single file mode) [15ebc526e593] * CHANGES.txt, application.py, docs/tutorial.html, edit_sizers/edit_sizers.py: bug fixes [4e32d8332f73] * about.py, credits.txt: updated credits [7f0c2b6fd3ea] * wxglade.py: fixed sys.path bug [7c81dabf91a6] * codegen/cpp_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, edit_windows.py, misc.py, widget_properties.py: changes due to new color and font properties [6813583dde44] * font_dialog.py: new font dialog [d52e19cb75d0] * color_dialog.py: new color chooser dialog [96bbab1afc43] * wxPyColourChooser/__init__.py, wxPyColourChooser/canvas.py, wxPyColourChooser/intl.py, wxPyColourChooser/license/lgpl.txt, wxPyColourChooser/license/wxwindowslib.txt, wxPyColourChooser/pycolourbox.py, wxPyColourChooser/pycolourchooser.py, wxPyColourChooser/pycolourslider.py, wxPyColourChooser/pypalette.py: wxPyColourChooser module by Michael Gilfix [c3265170b70f] * widgets/bitmap_button/bitmap_button.py, widgets/button/button.py, widgets/combo_box/combo_box.py, widgets/notebook/codegen.py: bug fixes [bb5610b9b22a] 2002-12-04 Alberto Griggio * widgets/list_box/list_box.py, widgets/radio_box/radio_box.py: small bugfixes [46d6114a2906] * widgets/notebook/notebook.py, widgets/splitter_window/splitter_window.py: fixed wxPanel style-related bugs that caused segfaults on win [181460cf510f] * widgets/panel/panel.py: fixed style bug [87705270190c] 2002-12-03 Alberto Griggio * widgets/combo_box/combo_box.py, widgets/panel/panel.py, widgets/spin_ctrl/spin_ctrl.py: fixed bug that caused a SEGFAULT on win [b42cf7411e85] 2002-12-03 dinogen * misc.py, widgets/grid/codegen.py, widgets/grid/grid.py: columns names ok [e2019009c3a8] 2002-12-02 Alberto Griggio * TODO.txt: added autosave/backup to the TODO [ca5f356f0ede] * main.py, tree.py, widget_properties.py, widgets/combo_box/combo_box.py: fixed bugs [9305b7c35703] 2002-12-01 Alberto Griggio * widgets/notebook/notebook.py: fixed bug that caused segfaults occasionally [c903c7427cae] * widgets/combo_box/combo_box.py: fixed bug in set_style [614bd0f149c4] * xrc2wxg.py: custom classes support [1191b7fb0198] * icons/custom.xpm: better icon [2c22da59c067] 2002-11-30 Alberto Griggio * edit_sizers/edit_sizers.py, widget_properties.py, widgets/checkbox/checkbox.py, widgets/radio_button/radio_button.py: bux fixes (again :) [1e5c64360f11] * tree.py: fixed bug on change_node_pos [7fa320cf2577] * config.py, main.py: added option to disable progress dialog on loading [81633aeeeba3] * widgets/panel/panel.py, xrc2wxg.py: fixed bugs [169c82adf8cf] * edit_sizers/edit_sizers.py, edit_windows.py: fixed bug on SetItemMinSize when w or h are -1 [69c8cb8f6083] 2002-11-29 Alberto Griggio * widgets/panel/panel.py: fixed resizing bug [9d1504d7fc39] * xml_parse.py: made loading a wxg file more permissive [579481c1d6be] * xrc2wxg.py, xrc_import.py: renamed xrc_import.py to xrc2wxg.py [6bde32c209d4] 2002-11-28 Alberto Griggio * xrc_import.py: first EXPERIMENTAL and probably BROKEN xrc to wxg converter [bca5a48d2fb4] * main.py: better wxFileHistory support [15d57c5ac4f4] * widgets/frame/frame.py: fixed menubar-related bugs [1c8921ee398b] * widget_properties.py: fixed tab ordering in GridProperty buttons [2e3151be5fdf] 2002-11-27 Alberto Griggio * widgets/frame/frame.py: fixed bug on EditFrame.get_property_handler.MenuHandler [3ff1b017e3fb] * tree.py: fixed bug on change_node_pos [4d556fc4fcac] * CHANGES.txt, edit_sizers/edit_sizers.py: fixed bug on set_item_pos [ab3616f376f8] * README.txt, edit_sizers/edit_sizers.py, edit_windows.py, widgets/grid/codegen.py, widgets/grid/grid.py: fixed some small bugs [65fdb71c32e3] 2002-11-26 Alberto Griggio * misc.py, widget_properties.py, widgets/grid/codegen.py, widgets/grid/grid.py: some small fixes [fa181eeeae91] * about.py: added credits to Marcello [5165ce435189] * CHANGES.txt, codegen/py_codegen.py, common.py, widgets/bitmap_button/codegen.py, widgets/button/codegen.py, widgets/checkbox/codegen.py, widgets/choice/codegen.py, widgets/combo_box/codegen.py, widgets/dialog/codegen.py, widgets/frame/codegen.py, widgets/frame/frame.py, widgets/gauge/codegen.py, widgets/list_box/codegen.py, widgets/notebook/codegen.py, widgets/panel/codegen.py, widgets/radio_box/codegen.py, widgets/radio_button/codegen.py, widgets/slider/codegen.py, widgets/spin_ctrl/codegen.py, widgets/splitter_window/codegen.py, widgets/static_bitmap/codegen.py, widgets/static_line/codegen.py, widgets/static_text/codegen.py, widgets/text_ctrl/codegen.py, widgets/toggle_button/codegen.py, widgets/widgets.txt, xml_parse.py: changed some code-generation details [20513500bb0f] 2002-11-26 dinogen * widgets/grid/codegen.py, widgets/grid/grid.py: added selection property [ad10a6199a88] * widgets/grid/codegen.py, widgets/grid/grid.py: grid label bg color property [398054d9400d] * widgets/grid/codegen.py: Fixed VERY STUPID error in lines color [1b5baf421be4] * widgets/grid/codegen.py: Grid lines colors, but code generation isn't ok yet. [42c01141a409] 2002-11-22 dinogen * widgets/grid/grid.py: grid lines color added [f02bd6bbd124] * widgets/grid/codegen.py, widgets/grid/grid.py: added resizing properties [188f93efd4ff] * widgets/widgets.txt: extra module added for wxGrid [0c06c80f2ddb] * widgets/grid/codegen.py: extra module added for wxGrid [95433a824571] 2002-11-21 Alberto Griggio * codegen/py_codegen.py, main.py, widgets/frame/frame.py, widgets/notebook/notebook.py: some bugs fixed [c7c3e6605a5e] 2002-11-21 dinogen * icons/grid.xpm: icon added for grid widget [d51302977a18] * widgets/grid/__init__.py, widgets/grid/codegen.py, widgets/grid/grid.py: The grid module added [f7b49fe6745b] 2002-11-19 Alberto Griggio * main.py, wxglade.py: fixed bug on relative paths [ad0ae988fb15] * icons/gauge.xpm, widgets/gauge/__init__.py, widgets/gauge/codegen.py, widgets/gauge/gauge.py, widgets/widgets.txt: wxGauge support [a853f05fd549] * TODO.txt, icons/slider.xpm, widgets/custom_widget/custom_widget.py, widgets/slider/codegen.py: fixed bugs [b83509d58efe] 2002-11-17 Alberto Griggio * CHANGES.txt, codegen/py_codegen.py: added import_modules argument to add_widget_handler [c26d83528b2d] 2002-11-12 Alberto Griggio * CHANGES.txt, README.txt, about.py, application.py, clipboard.py, codegen/cpp_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, common.py, config.py, credits.txt, edit_sizers/__init__.py, edit_sizers/edit_sizers.py, edit_sizers/sizers_codegen.py, edit_windows.py, license.txt, main.py, misc.py, tree.py, widget_properties.py, widgets/ChoicesCodeHandler.py, widgets/ChoicesProperty.py, widgets/MenuTree.py, widgets/bitmap_button/__init__.py, widgets/bitmap_button/bitmap_button.py, widgets/bitmap_button/codegen.py, widgets/button/__init__.py, widgets/button/button.py, widgets/button/codegen.py, widgets/checkbox/__init__.py, widgets/checkbox/checkbox.py, widgets/checkbox/codegen.py, widgets/choice/__init__.py, widgets/choice/choice.py, widgets/choice/codegen.py, widgets/combo_box/__init__.py, widgets/combo_box/codegen.py, widgets/combo_box/combo_box.py, widgets/custom_widget/__init__.py, widgets/custom_widget/codegen.py, widgets/custom_widget/custom_widget.py, widgets/dialog/__init__.py, widgets/dialog/codegen.py, widgets/dialog/dialog.py, widgets/frame/__init__.py, widgets/frame/codegen.py, widgets/frame/frame.py, widgets/list_box/__init__.py, widgets/list_box/codegen.py, widgets/list_box/list_box.py, widgets/notebook/__init__.py, widgets/notebook/codegen.py, widgets/notebook/notebook.py, widgets/panel/__init__.py, widgets/panel/codegen.py, widgets/panel/panel.py, widgets/radio_box/__init__.py, widgets/radio_box/codegen.py, widgets/radio_box/radio_box.py, widgets/radio_button/__init__.py, widgets/radio_button/codegen.py, widgets/radio_button/radio_button.py, widgets/slider/__init__.py, widgets/slider/codegen.py, widgets/slider/slider.py, widgets/spacer/__init__.py, widgets/spacer/codegen.py, widgets/spacer/spacer.py, widgets/spin_ctrl/__init__.py, widgets/spin_ctrl/codegen.py, widgets/spin_ctrl/spin_ctrl.py, widgets/splitter_window/__init__.py, widgets/splitter_window/codegen.py, widgets/splitter_window/splitter_window.py, widgets/static_bitmap/__init__.py, widgets/static_bitmap/codegen.py, widgets/static_bitmap/static_bitmap.py, widgets/static_line/__init__.py, widgets/static_line/codegen.py, widgets/static_line/static_line.py, widgets/static_text/__init__.py, widgets/static_text/codegen.py, widgets/static_text/static_text.py, widgets/text_ctrl/__init__.py, widgets/text_ctrl/codegen.py, widgets/text_ctrl/text_ctrl.py, widgets/toggle_button/__init__.py, widgets/toggle_button/codegen.py, widgets/toggle_button/toggle_button.py, wxglade.py, xml_parse.py: change of license (MIT) to avoid troubles [0ccbbe1138f8] 2002-11-09 Alberto Griggio * CHANGES.txt, config.py, main.py, misc.py: support for wxFileHistory on wxPython >= 2.3.3 [e7d0b1de52e2] 2002-11-03 Alberto Griggio * CHANGES.txt, edit_sizers/edit_sizers.py, edit_windows.py, misc.py, tree.py: keyboard shortcuts for popup menus almost working [fff1868af94a] * widgets/bitmap_button/bitmap_button.py, widgets/panel/panel.py, widgets/static_bitmap/static_bitmap.py: some bugs fixed [e0418250602e] 2002-10-28 Alberto Griggio * widgets/panel/codegen.py: fixed C++ code generation bug [a223154d9357] * widgets/notebook/notebook.py, widgets/splitter_window/splitter_window.py: added style property [a582e3ccc906] * CHANGES.txt, icons/custom.xpm, widgets/custom_widget/__init__.py, widgets/custom_widget/codegen.py, widgets/custom_widget/custom_widget.py, widgets/widgets.txt: custom widgets support [18232398140e] * codegen/cpp_codegen.py, codegen/py_codegen.py: fixed bug regarding notebook sizers [14ba95c282ff] * xml_parse.py: fixed bug regarding encoding in CodeWriter [b296334dce17] * edit_windows.py: fixed bug in on_set_focus [855db952d01c] 2002-10-26 Alberto Griggio * misc.py: simplified check_wx_version [3f0f7e1012b3] * CHANGES.txt, widgets/notebook/codegen.py: fixed xrc code generation bug (usenotebooksizer) [906a31718925] 2002-10-25 Alberto Griggio * codegen/cpp_codegen.py: fixed bug when the output file exists but it doesn't contain any class [663d6797e366] * codegen/cpp_codegen.py, codegen/py_codegen.py: fixed bug when the output file exists but it doesn't contain any class [d2c18b20a48d] * application.py, edit_windows.py: fixed bug concerning renaming of toplevel widgets [bd7106ed2b16] 2002-10-24 Alberto Griggio * CHANGES.txt, application.py, common.py, edit_windows.py, tree.py, widget_properties.py, xml_parse.py: added encoding property to Application objects [9b64c32cf56d] * main.py: some layout tweaks [147390bbc777] * widgets/dialog/dialog.py, widgets/panel/__init__.py, widgets/panel/codegen.py, widgets/panel/panel.py: new EditTopLevelPanel class, to create panels without a container frame/dialog [ade56e5c8159] 2002-10-22 Alberto Griggio * icons/gtk/prefs.xpm, icons/msw/prefs.xpm: preferences icon [d484b99890e9] * CHANGES.txt, application.py, config.py, edit_sizers/edit_sizers.py, edit_windows.py, main.py, misc.py: changes to allow user preferences [d9af5c3494bd] 2002-10-20 Alberto Griggio * edit_sizers/edit_sizers.py, edit_windows.py, misc.py: lazy initialization of popup menus [71e75ad97aa1] * CHANGES.txt, edit_sizers/edit_sizers.py, edit_windows.py, main.py, misc.py: added icons for menu items and keyboard shortcuts for popup menus (not on GTK yet) [ced465c39fba] * icons/gtk/about.xpm, icons/gtk/copy.xpm, icons/gtk/cut.xpm, icons/gtk/exit.xpm, icons/gtk/generate.xpm, icons/gtk/new.xpm, icons/gtk/open.xpm, icons/gtk/paste.xpm, icons/gtk/remove.xpm, icons/gtk/save.xpm, icons/gtk/save_as.xpm, icons/gtk/tutorial.xpm, icons/msw/copy.xpm, icons/msw/cut.xpm, icons/msw/exit.xpm, icons/msw/generate.xpm, icons/msw/new.xpm, icons/msw/open.xpm, icons/msw/paste.xpm, icons/msw/remove.xpm, icons/msw/save.xpm, icons/msw/save_as.xpm, icons/msw/tutorial.xpm: icons for menu items [f305c60e5ca1] * widgets/panel/codegen.py, widgets/panel/panel.py: added style property [3ecc8d3e0085] 2002-10-19 Alberto Griggio * CHANGES.txt: *** empty log message *** [6f3ca80dba06] * about.py, main.py: some layout tweaks [b77f0d3bee22] * docs/tutorial.html: updated contents to mention new layout features (change of sizer type, change of position inside a sizer) [208a00a79ed9] * widgets/splitter_window/splitter_window.py: fixed 'style' property bug [c2293f8ecca9] * widgets/panel/codegen.py, widgets/panel/panel.py: added 'style' property [e53334a7705a] * widget_properties.py, widgets/static_text/static_text.py, widgets/text_ctrl/text_ctrl.py: added 'multiline' option to TextProperty [08843d6b7e9a] * widgets/dialog/dialog.py: fixed win32 bug [7135d3434f45] 2002-10-14 Alberto Griggio * edit_sizers/edit_sizers.py, tree.py, widget_properties.py: small fixes [03f161a574bf] 2002-10-13 Alberto Griggio * widgets/splitter_window/codegen.py, widgets/splitter_window/splitter_window.py: fixed 2.3.3 compatibility [3c64724e37a4] * widgets/combo_box/combo_box.py: fixed segfault (why?) on win32 [15352d997db4] * application.py, main.py, misc.py, widget_properties.py: added check_wx_version function [2d2d5d4eb775] * edit_sizers/edit_sizers.py: fixed bug on change_sizer [9a5a9274193c] 2002-10-12 Alberto Griggio * edit_sizers/edit_sizers.py: fixed bug on SizerBase.change_item_pos [6543aec87215] * edit_sizers/edit_sizers.py: change_item_pos: added Refresh() call on Win32 [e5b53bb8b3ae] * CHANGES.txt, TODO.txt, edit_sizers/edit_sizers.py, edit_windows.py, tree.py: added 'pos' property to change the position of a widget inside its sizer [264928eea8f6] 2002-10-10 Alberto Griggio * CHANGES.txt, TODO.txt, edit_sizers/edit_sizers.py, edit_windows.py, main.py, tree.py, widget_properties.py, widgets/bitmap_button/bitmap_button.py, widgets/bitmap_button/codegen.py, widgets/button/button.py, widgets/button/codegen.py, widgets/dialog/dialog.py, widgets/spacer/spacer.py: - added possibility to dynamically change the type of a sizer - some bugs fixed [52178fc1d766] 2002-10-06 Alberto Griggio * docs/img/box_sizer_button.gif, docs/img/button_button.gif, docs/img/frame_button.gif, docs/img/notebook_button.gif, docs/img/spacer_button.gif, docs/img/text_ctrl_button.gif, docs/tutorial.html: first CVS version [1b1452e7d003] * application.py, codegen/cpp_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, edit_sizers/edit_sizers.py, edit_windows.py, main.py, widget_properties.py, widgets/bitmap_button/codegen.py, widgets/notebook/notebook.py, widgets/slider/slider.py, widgets/splitter_window/splitter_window.py, widgets/static_line/static_line.py: various bugs fixed. See CHANGES.txt [ff897886631f] * about.py: new wxGlade logo [9e847777225c] * CHANGES.txt: *** empty log message *** [685b472e4578] 2002-09-07 Alberto Griggio * about.py: added wxGlade logo [c28930b8e716] * TODO.txt: updated the TODO list [460bfa635963] * common.py, main.py, tree.py: fixed a couple of minor win32 bugs, changed the style of tree_frame and property_frame [2e7af3234962] * icons/wxglade_small.png: wxGlade logo [fddec67fe79b] 2002-09-02 Alberto Griggio * README.txt: new license (Python 2.2) [7ed3eb760542] * edit_sizers.py, widgets/frame.py: *** empty log message *** [78debef7ba27] * CHANGES.txt, TODO.txt, about.py, application.py, clipboard.py, codegen/cpp_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, common.py, credits.txt, edit_sizers/__init__.py, edit_sizers/edit_sizers.py, edit_sizers/sizers_codegen.py, edit_windows.py, icons/application.xpm, license.txt, main.py, misc.py, tree.py, widget_properties.py, widgets/ChoicesCodeHandler.py, widgets/ChoicesProperty.py, widgets/MenuTree.py, widgets/bitmap_button.py, widgets/bitmap_button/__init__.py, widgets/bitmap_button/bitmap_button.py, widgets/bitmap_button/codegen.py, widgets/button.py, widgets/button/__init__.py, widgets/button/button.py, widgets/button/codegen.py, widgets/checkbox.py, widgets/checkbox/__init__.py, widgets/checkbox/checkbox.py, widgets/checkbox/codegen.py, widgets/choice.py, widgets/choice/__init__.py, widgets/choice/choice.py, widgets/choice/codegen.py, widgets/combo_box.py, widgets/combo_box/__init__.py, widgets/combo_box/codegen.py, widgets/combo_box/combo_box.py, widgets/dialog.py, widgets/dialog/__init__.py, widgets/dialog/codegen.py, widgets/dialog/dialog.py, widgets/frame/__init__.py, widgets/frame/codegen.py, widgets/frame/frame.py, widgets/list_box.py, widgets/list_box/__init__.py, widgets/list_box/codegen.py, widgets/list_box/list_box.py, widgets/notebook.py, widgets/notebook/__init__.py, widgets/notebook/codegen.py, widgets/notebook/notebook.py, widgets/panel.py, widgets/panel/__init__.py, widgets/panel/codegen.py, widgets/panel/panel.py, widgets/radio_box.py, widgets/radio_box/__init__.py, widgets/radio_box/codegen.py, widgets/radio_box/radio_box.py, widgets/radio_button.py, widgets/radio_button/__init__.py, widgets/radio_button/codegen.py, widgets/radio_button/radio_button.py, widgets/slider.py, widgets/slider/__init__.py, widgets/slider/codegen.py, widgets/slider/slider.py, widgets/spacer.py, widgets/spacer/__init__.py, widgets/spacer/codegen.py, widgets/spacer/spacer.py, widgets/spin_ctrl.py, widgets/spin_ctrl/__init__.py, widgets/spin_ctrl/codegen.py, widgets/spin_ctrl/spin_ctrl.py, widgets/splitter_window.py, widgets/splitter_window/__init__.py, widgets/splitter_window/codegen.py, widgets/splitter_window/splitter_window.py, widgets/static_bitmap.py, widgets/static_bitmap/__init__.py, widgets/static_bitmap/codegen.py, widgets/static_bitmap/static_bitmap.py, widgets/static_line.py, widgets/static_line/__init__.py, widgets/static_line/codegen.py, widgets/static_line/static_line.py, widgets/static_text.py, widgets/static_text/__init__.py, widgets/static_text/codegen.py, widgets/static_text/static_text.py, widgets/text_ctrl.py, widgets/text_ctrl/__init__.py, widgets/text_ctrl/codegen.py, widgets/text_ctrl/text_ctrl.py, widgets/toggle_button.py, widgets/toggle_button/__init__.py, widgets/toggle_button/codegen.py, widgets/toggle_button/toggle_button.py, wxglade.py, xml_parse.py: merged version 0.1.3 [0509dcc738d1] * CHANGES.txt, README.txt, about.py, application.py, clipboard.py, codegen/cpp_codegen.py, codegen/py_codegen.py, codegen/xrc_codegen.py, common.py, edit_sizers/__init__.py, edit_sizers/edit_sizers.py, edit_sizers/sizers_codegen.py, edit_windows.py, main.py, misc.py, tree.py, widget_properties.py, widgets/ChoicesCodeHandler.py, widgets/ChoicesProperty.py, widgets/MenuTree.py, widgets/bitmap_button/__init__.py, widgets/bitmap_button/bitmap_button.py, widgets/bitmap_button/codegen.py, widgets/button/__init__.py, widgets/button/button.py, widgets/button/codegen.py, widgets/checkbox/__init__.py, widgets/checkbox/checkbox.py, widgets/checkbox/codegen.py, widgets/choice/__init__.py, widgets/choice/choice.py, widgets/choice/codegen.py, widgets/combo_box/__init__.py, widgets/combo_box/codegen.py, widgets/combo_box/combo_box.py, widgets/dialog/__init__.py, widgets/dialog/codegen.py, widgets/dialog/dialog.py, widgets/frame/__init__.py, widgets/frame/codegen.py, widgets/frame/frame.py, widgets/list_box/__init__.py, widgets/list_box/codegen.py, widgets/list_box/list_box.py, widgets/notebook/__init__.py, widgets/notebook/codegen.py, widgets/notebook/notebook.py, widgets/panel/__init__.py, widgets/panel/codegen.py, widgets/panel/panel.py, widgets/radio_box/__init__.py, widgets/radio_box/codegen.py, widgets/radio_box/radio_box.py, widgets/radio_button/__init__.py, widgets/radio_button/codegen.py, widgets/radio_button/radio_button.py, widgets/slider/__init__.py, widgets/slider/codegen.py, widgets/slider/slider.py, widgets/spacer/__init__.py, widgets/spacer/codegen.py, widgets/spacer/spacer.py, widgets/spin_ctrl/__init__.py, widgets/spin_ctrl/codegen.py, widgets/spin_ctrl/spin_ctrl.py, widgets/splitter_window/__init__.py, widgets/splitter_window/codegen.py, widgets/splitter_window/splitter_window.py, widgets/static_bitmap/__init__.py, widgets/static_bitmap/codegen.py, widgets/static_bitmap/static_bitmap.py, widgets/static_line/__init__.py, widgets/static_line/codegen.py, widgets/static_line/static_line.py, widgets/static_text/__init__.py, widgets/static_text/codegen.py, widgets/static_text/static_text.py, widgets/text_ctrl/__init__.py, widgets/text_ctrl/codegen.py, widgets/text_ctrl/text_ctrl.py, widgets/toggle_button/__init__.py, widgets/toggle_button/codegen.py, widgets/toggle_button/toggle_button.py, wxglade.py, xml_parse.py: new license (Python 2.2) [e262b8909abd] * widgets/radio_box/codegen.py: small change to the C++ code generator [2251197c8ac2] * README.txt, license.txt: new license (Python 2.2) [e713bf481c8a] 2002-08-27 Alberto Griggio * TODO.txt: updated with TabOrder [fc56a8dc5cbb] * CHANGES.txt, edit_sizers/sizers_codegen.py, widgets/dialog/dialog.py, widgets/frame/frame.py: bugs fixed [d018a4496f31] * codegen/py_codegen.py: fixed bug on code generation for container widgets [21a53d6bce9e] * codegen/cpp_codegen.py, widgets/bitmap_button/codegen.py, widgets/button/codegen.py, widgets/checkbox/codegen.py, widgets/choice/codegen.py, widgets/combo_box/codegen.py, widgets/list_box/codegen.py, widgets/notebook/codegen.py, widgets/panel/codegen.py, widgets/radio_box/codegen.py, widgets/radio_button/codegen.py, widgets/slider/codegen.py, widgets/spin_ctrl/codegen.py, widgets/splitter_window/codegen.py, widgets/static_bitmap/codegen.py, widgets/static_line/codegen.py, widgets/static_text/codegen.py, widgets/text_ctrl/codegen.py, widgets/toggle_button/codegen.py: fixed bug on C++ id code generation [60c1b5cee423] 2002-08-26 Alberto Griggio * CHANGES.txt: changed code generation to initialize widgets in the right order, so as to preserve the tab traversal order [443cce7b5440] * codegen/cpp_codegen.py, codegen/py_codegen.py, widgets/bitmap_button/codegen.py, widgets/button/codegen.py, widgets/checkbox/codegen.py, widgets/choice/codegen.py, widgets/combo_box/codegen.py, widgets/frame/codegen.py, widgets/list_box/codegen.py, widgets/notebook/codegen.py, widgets/panel/codegen.py, widgets/radio_box/codegen.py, widgets/radio_button/codegen.py, widgets/slider/codegen.py, widgets/spin_ctrl/codegen.py, widgets/splitter_window/codegen.py, widgets/static_bitmap/codegen.py, widgets/static_line/codegen.py, widgets/static_text/codegen.py, widgets/text_ctrl/codegen.py, widgets/toggle_button/codegen.py, xml_parse.py: changed code generation to initialize widgets in the right order, so as to preserve the tab traversal order [9ba34dc7ffda] 2002-08-16 Alberto Griggio * about.py, edit_sizers/edit_sizers.py, edit_sizers/sizers_codegen.py, main.py, widgets/spacer/spacer.py: some bugs fixed [f611b84cc23d] * credits.txt: updated credits [e1b3ddbaf718] * common.py, edit_windows.py, wxglade.py: some bugs fixed [92cfd1eb1a51] * codegen/cpp_codegen.py, edit_sizers/sizers_codegen.py, widgets/bitmap_button/codegen.py, widgets/button/codegen.py, widgets/checkbox/codegen.py, widgets/choice/codegen.py, widgets/combo_box/codegen.py: experimental C++ code generator [53d169256542] 2002-08-15 Alberto Griggio * codegen/py_codegen.py, edit_windows.py, main.py, wxglade.py: tooltips and dialog units support [7608f2814e4b] * CHANGES.txt: experimental C++ code generator and other things [f0dc5ed7cf4f] * widgets/dialog/codegen.py, widgets/dialog/dialog.py, widgets/frame/codegen.py, widgets/frame/frame.py, widgets/list_box/codegen.py, widgets/notebook/codegen.py, widgets/panel/codegen.py, widgets/radio_box/codegen.py, widgets/radio_button/codegen.py, widgets/slider/codegen.py, widgets/spacer/codegen.py, widgets/spin_ctrl/codegen.py, widgets/splitter_window/codegen.py, widgets/static_bitmap/codegen.py, widgets/static_line/codegen.py, widgets/static_text/codegen.py, widgets/text_ctrl/codegen.py, widgets/toggle_button/codegen.py: experimental C++ code generator [9f9255a419f7] 2002-08-12 Alberto Griggio * CHANGES.txt, application.py, codegen/py_codegen.py, codegen/xrc_codegen.py, edit_sizers/edit_sizers.py, edit_windows.py, main.py, widget_properties.py, widgets/bitmap_button/codegen.py, widgets/button/codegen.py, widgets/checkbox/codegen.py, widgets/choice/codegen.py, widgets/combo_box/codegen.py, widgets/frame/codegen.py, widgets/list_box/codegen.py, widgets/notebook/codegen.py, widgets/panel/codegen.py, widgets/radio_box/codegen.py, widgets/radio_button/codegen.py, widgets/slider/codegen.py, widgets/spin_ctrl/codegen.py, widgets/splitter_window/codegen.py, widgets/static_bitmap/codegen.py, widgets/static_line/codegen.py, widgets/static_text/codegen.py, widgets/text_ctrl/codegen.py, widgets/toggle_button/codegen.py, xml_parse.py: support for dialog units and other stuff [0070a3bd90b8] 2002-08-10 Alberto Griggio * icons/application.xpm: new icon [1ce463aac14a] * CHANGES.txt, TODO.txt, codegen/py_codegen.py, edit_sizers/edit_sizers.py, edit_sizers/sizers_codegen.py, widgets/bitmap_button/codegen.py, widgets/button/codegen.py, widgets/checkbox/codegen.py, widgets/choice/codegen.py, widgets/combo_box/codegen.py, widgets/frame/codegen.py, widgets/list_box/codegen.py, widgets/notebook/codegen.py, widgets/panel/codegen.py, widgets/radio_box/codegen.py, widgets/radio_button/codegen.py, widgets/slider/codegen.py, widgets/spin_ctrl/codegen.py, widgets/splitter_window/codegen.py, widgets/static_bitmap/codegen.py, widgets/static_line/codegen.py, widgets/static_text/codegen.py, widgets/text_ctrl/codegen.py, widgets/text_ctrl/text_ctrl.py, widgets/toggle_button/codegen.py: better python code generation [b53b8036bb2d] * codegen/xrc_codegen.py: bugfixes [2ccaa40d4a20] * main.py, xml_parse.py: bugfixes [6f1199b777d7] 2002-08-06 Alberto Griggio * widgets/text_ctrl/text_ctrl.py: fixed bug regarding style on GTK [bdfbf0371733] * CHANGES.txt, codegen/xrc_codegen.py, widgets/ChoicesCodeHandler.py, widgets/choice/codegen.py, widgets/combo_box/codegen.py, widgets/frame/codegen.py, widgets/frame/frame.py, widgets/list_box/codegen.py, widgets/notebook/codegen.py, widgets/radio_box/codegen.py, widgets/slider/codegen.py, widgets/spin_ctrl/codegen.py, widgets/splitter_window/codegen.py: experimental (but apparently working) XRC code generator [7290812cf462] * application.py, codegen/py_codegen.py, edit_sizers/edit_sizers.py, license.txt, main.py, tree.py, widget_properties.py, wxglade.py, xml_parse.py: mainly bugfixes [5f911c7c5c0a] 2002-08-04 Alberto Griggio * edit_sizers.py: bugfix in EditFlexGridSizer [d4dc06d1a7a1] * edit_sizers/edit_sizers.py: MANY bugs fixed [13934c86ab9a] * edit_sizers.py: MANY bugs fixed [dd57706a9149] * codegen/py_codegen.py: made sizers local to the __do_layout method [f7c5356b20ec] * CHANGES.txt, README.txt, TODO.txt, about.py, application.py, common.py, edit_sizers/edit_sizers.py, edit_sizers/sizers_codegen.py, main.py, widget_properties.py, widgets/MenuTree.py, widgets/bitmap_button/codegen.py, widgets/button/codegen.py, widgets/checkbox/codegen.py, widgets/frame/codegen.py, widgets/frame/frame.py, widgets/notebook/codegen.py, widgets/radio_box/codegen.py, widgets/radio_button/codegen.py, widgets/static_bitmap/codegen.py, widgets/static_text/codegen.py, widgets/text_ctrl/codegen.py, widgets/toggle_button/codegen.py, wxglade.py, xml_parse.py: various bugs fixed [ec7baa1d9432] 2002-08-03 Alberto Griggio * icons/source.jpg: *** empty log message *** [9db1b91aefc2] * README, README.txt: renamed README to README.txt [6ed021f15963] * icons/source.jpg: removed [2fa4adf4008d] * credits.txt: credits to various people [6bb27698c7ab] * README, README.txt: renamed README to README.txt [f90589306f39] * edit_sizers.py: removed from v0-1-3devel branch [214c75a5f5be] * widget_properties.py: fixed just introduced wxPython 2.3.2.1 incompatibility [04e6fb592448] * application.py, widget_properties.py: fixed just introduced wxPython 2.3.2.1 incompatibility [6e4c61feb45c] * widgets/bitmap_button.py, widgets/button.py, widgets/checkbox.py, widgets/choice.py, widgets/combo_box.py, widgets/dialog.py, widgets/frame.py, widgets/list_box.py, widgets/notebook.py, widgets/panel.py, widgets/radio_box.py, widgets/radio_button.py, widgets/slider.py, widgets/spacer.py, widgets/spin_ctrl.py, widgets/splitter_window.py, widgets/static_bitmap.py, widgets/static_line.py, widgets/static_text.py, widgets/text_ctrl.py, widgets/toggle_button.py: removed from v0-1-3devel branch [34fbe53a1f75] * codegen/py_codegen.py, widget_properties.py: fixed wxPython 2.3.3 incompatibilities [21d1a2d8be1b] * CHANGES.txt, application.py, codegen/py_codegen.py, common.py, edit_sizers/__init__.py, edit_sizers/edit_sizers.py, edit_sizers/sizers_codegen.py, edit_windows.py, main.py, misc.py, tree.py, widgets/ChoicesCodeHandler.py, widgets/ChoicesProperty.py, widgets/MenuTree.py, widgets/bitmap_button/__init__.py, widgets/bitmap_button/bitmap_button.py, widgets/bitmap_button/codegen.py, widgets/button/__init__.py, widgets/button/button.py, widgets/button/codegen.py, widgets/checkbox/__init__.py, widgets/checkbox/checkbox.py, widgets/checkbox/codegen.py, widgets/choice/__init__.py, widgets/choice/choice.py, widgets/choice/codegen.py, widgets/combo_box/__init__.py, widgets/combo_box/codegen.py, widgets/combo_box/combo_box.py, widgets/dialog/__init__.py, widgets/dialog/codegen.py, widgets/dialog/dialog.py, widgets/frame/__init__.py, widgets/frame/codegen.py, widgets/frame/frame.py, widgets/list_box/__init__.py, widgets/list_box/codegen.py, widgets/list_box/list_box.py, widgets/notebook/__init__.py, widgets/notebook/codegen.py, widgets/notebook/notebook.py, widgets/panel/__init__.py, widgets/panel/codegen.py, widgets/panel/panel.py, widgets/radio_box/__init__.py, widgets/radio_box/codegen.py, widgets/radio_box/radio_box.py, widgets/radio_button/__init__.py, widgets/radio_button/codegen.py, widgets/radio_button/radio_button.py, widgets/slider/__init__.py, widgets/slider/codegen.py, widgets/slider/slider.py, widgets/spacer/__init__.py, widgets/spacer/codegen.py, widgets/spacer/spacer.py, widgets/spin_ctrl/__init__.py, widgets/spin_ctrl/codegen.py, widgets/spin_ctrl/spin_ctrl.py, widgets/splitter_window/__init__.py, widgets/splitter_window/codegen.py, widgets/splitter_window/splitter_window.py, widgets/static_bitmap/__init__.py, widgets/static_bitmap/codegen.py, widgets/static_bitmap/static_bitmap.py, widgets/static_line/__init__.py, widgets/static_line/codegen.py, widgets/static_line/static_line.py, widgets/static_text/__init__.py, widgets/static_text/codegen.py, widgets/static_text/static_text.py, widgets/text_ctrl/__init__.py, widgets/text_ctrl/codegen.py, widgets/text_ctrl/text_ctrl.py, widgets/toggle_button/__init__.py, widgets/toggle_button/codegen.py, widgets/toggle_button/toggle_button.py, wxglade.py, xml_parse.py: v0-1-3devel branch [63afc819555c] * CHANGES.txt, codegen/py_codegen.py, edit_sizers.py, edit_windows.py, main.py, widget_properties.py, widgets/frame.py: fixed wxPython 2.3.3 incompatibilities [512c1bf2da07] 2002-08-03 repo convert * creating branch v0-1-3devel from HEAD [18974a6234ac] 2002-08-02 Alberto Griggio * widgets/frame.py: experimental bugfix for menubar-related segfaults on GTK [61a2dc22befa] 2002-08-01 Alberto Griggio * README: first version on cvs [95b4dbb1faf3] * CHANGES.txt, clipboard.py, edit_sizers.py, edit_windows.py, widget_properties.py, widgets/bitmap_button.py, widgets/radio_box.py, widgets/splitter_window.py, widgets/static_bitmap.py: various bugs fixed [b98ccd96d56b] * clipboard.py: fixed bug in the previous bugfix :( [b274ccf1737d] * CHANGES.txt, TODO.txt: updated contents [0c27f6ec47fe] * widgets/dialog.py: changed create_widget to use a default style for the dialog [ab75b622c10d] * xml_parse.py: added code to rename copied widgets properly [860b42530e1d] * tree.py: fixed small bug [5c0f013c9169] * clipboard.py: "confinement" of the option:flag:border:xml_str string before putting it inside the Clipboard [cd6c11e252c2] * CHANGES.txt: changes updated [11cf80c6af24] 2002-08-01 marco_bari * CHANGES.txt: clipboard.py updated [4847b52fb9f7] 2002-07-31 Alberto Griggio * TODO.txt: updated status [7c83326ce73b] * edit_sizers.py, xml_parse.py: cut & paste of non-toplevel sizers [62075566f8fd] * common.py, edit_sizers.py, edit_windows.py, misc.py, widget_properties.py, widgets/bitmap_button.py, widgets/button.py, widgets/checkbox.py, widgets/choice.py, widgets/combo_box.py, widgets/dialog.py, widgets/frame.py, widgets/list_box.py, widgets/notebook.py, widgets/panel.py, widgets/radio_box.py, widgets/radio_button.py, widgets/slider.py, widgets/spin_ctrl.py, widgets/splitter_window.py, widgets/static_bitmap.py, widgets/static_text.py, widgets/text_ctrl.py, widgets/toggle_button.py: removed obsolete misc.Sizer [c4436cadadf8] 2002-07-30 Alberto Griggio * CHANGES.txt, edit_sizers.py, widget_properties.py, widgets/notebook.py, widgets/slider.py, widgets/splitter_window.py, widgets/static_line.py, xml_parse.py: xml_builder cleanup and some bugfixes [1f6b867a8fc8] * CHANGES.txt, TODO.txt, about.py, edit_sizers.py, edit_windows.py, misc.py, tree.py, widgets/notebook.py, widgets/panel.py, widgets/splitter_window.py: minor bugfixes [7be70f9fff82] 2002-07-30 marco_bari * clipboard.py: Now wxGlade's clipboard uses wxTheClipboard. [6ccc3ed8b762] 2002-07-29 Alberto Griggio * main.py, tree.py: prevented auto-expansion of tree nodes during app loading [183962c7b8cf] * widget_properties.py: fixed bug in _enabler [b07afcdde743] 2002-07-29 marco_bari * edit_sizers.py: Corrected create_widget bug with static boxes. [97b240539f17] 2002-07-28 Alberto Griggio * edit_windows.py, widgets/notebook.py, widgets/panel.py, widgets/splitter_window.py: some bug fixes [71d61c8e1dd5] * common.py, edit_windows.py, main.py, tree.py, widgets/bitmap_button.py, widgets/button.py, widgets/checkbox.py, widgets/choice.py, widgets/combo_box.py, widgets/dialog.py, widgets/frame.py, widgets/list_box.py, widgets/notebook.py, widgets/panel.py, widgets/radio_box.py, widgets/radio_button.py, widgets/slider.py, widgets/spacer.py, widgets/spin_ctrl.py, widgets/splitter_window.py, widgets/static_bitmap.py, widgets/static_line.py, widgets/static_text.py, widgets/text_ctrl.py, widgets/toggle_button.py: "create_widget" migration almost working [8c95c975b96b] * about.py: updated credits [505ec37e1cf1] 2002-07-28 marco_bari * wxglade.py: Added built-in function bool. [aca8b4bd1c2c] * widgets/bitmap_button.py, widgets/button.py, widgets/checkbox.py, widgets/choice.py, widgets/combo_box.py, widgets/dialog.py, widgets/frame.py, widgets/list_box.py, widgets/notebook.py, widgets/panel.py, widgets/slider.py, widgets/spacer.py, widgets/spin_ctrl.py, widgets/static_bitmap.py, widgets/static_line.py, widgets/static_text.py, widgets/text_ctrl.py, widgets/toggle_button.py: Corrected self.parent bug in create_widget. [b85ecfdd4ba0] 2002-07-28 Alberto Griggio * TODO.txt, edit_sizers.py, edit_windows.py, tree.py, widget_properties.py: nearer to the end of "create_widget" migration [8e178af19280] 2002-07-27 marco_bari * widgets/bitmap_button.py, widgets/button.py, widgets/checkbox.py, widgets/choice.py, widgets/combo_box.py, widgets/dialog.py, widgets/frame.py, widgets/list_box.py, widgets/notebook.py, widgets/panel.py, widgets/radio_box.py, widgets/radio_button.py, widgets/slider.py, widgets/spacer.py, widgets/spin_ctrl.py, widgets/static_bitmap.py, widgets/static_line.py, widgets/static_text.py, widgets/text_ctrl.py, widgets/toggle_button.py: Added (partial) support to new widget interface. [85875de3273e] 2002-07-26 Alberto Griggio * common.py, edit_sizers.py, edit_windows.py, misc.py, tree.py, widgets/button.py, widgets/frame.py, xml_parse.py: something working again [bd1bd2027fd4] 2002-07-25 Alberto Griggio * common.py, edit_sizers.py, edit_windows.py, main.py, tree.py, xml_parse.py: show_widget support and some fixes [0e6e2525efca] 2002-07-24 Alberto Griggio * edit_windows.py: Fix in TopLevelBase.set_sizer [ecc66c7c1f76] * edit_sizers.py: create_widget initial support [9bf33e37d745] 2002-07-24 marco_bari * widgets/checkbox.py: Added support for "create_widget" [29408ed43330] * widgets/bitmap_button.py: Added support for "create_widget" [19c6aa22690f] * widgets/button.py: *** empty log message *** [db3c0d3388b6] * widgets/button.py: Support for 'create_widget' [6a4146ce8130] 2002-07-24 Alberto Griggio * edit_windows.py: added self.widget, show_widget, create_widget, finish_widget_creation [6a84844707f3] 2002-07-22 Alberto Griggio * TODO.txt: fixed some typos [6010f5ba83eb] * wxglade.py: Merge from vendor branch agriggio: First version on CVS [d9ca64534402] * .cvsignore, CHANGES.txt, TODO.txt, about.py, clipboard.py, codegen/py_codegen.py, common.py, docs/tech_notes.txt, edit_sizers.py, edit_windows.py, icons/.cvsignore, icons/application.xpm, icons/bitmap_button.xpm, icons/button.xpm, icons/checkbox.xpm, icons/choice.xpm, icons/combo_box.xpm, icons/dialog.xpm, icons/frame.xpm, icons/grid_sizer.xpm, icons/icon.xpm, icons/list_box.xpm, icons/menubar.xpm, icons/notebook.xpm, icons/panel.xpm, icons/radio_box.xpm, icons/radio_button.xpm, icons/sizer.xpm, icons/slider.xpm, icons/source.jpg, icons/spacer.xpm, icons/spin_ctrl.xpm, icons/splitter_window.xpm, icons/static_bitmap.xpm, icons/static_line.xpm, icons/static_text.xpm, icons/statusbar.xpm, icons/text_ctrl.xpm, icons/toggle_button.xpm, license.txt, main.py, misc.py, tree.py, widget_properties.py, widgets/ChoicesProperty.py, widgets/bitmap_button.py, widgets/button.py, widgets/checkbox.py, widgets/choice.py, widgets/combo_box.py, widgets/dialog.py, widgets/frame.py, widgets/list_box.py, widgets/notebook.py, widgets/panel.py, widgets/radio_box.py, widgets/radio_button.py, widgets/slider.py, widgets/spacer.py, widgets/spin_ctrl.py, widgets/splitter_window.py, widgets/static_bitmap.py, widgets/static_line.py, widgets/static_text.py, widgets/text_ctrl.py, widgets/toggle_button.py, widgets/widgets.txt, wxglade.py, xml_parse.py: First version on CVS [73127b08b329] 2002-07-22 repo convert * creating vendor branch agriggio [ea6c66367e3e] wxGlade-0.9.4/CONTRIBUTING.txt000066400000000000000000000022751352706171500156040ustar00rootroot00000000000000Contributing to wxGlade ======================= You are, of course, free to make any changes / additions you want to wxGlade, in whatever way you like. If you decide to contribute them back, however, here are some simple rules to follow: note that these are only general indications, if you think they don't fit somewhere, feel free to ignore them. Coding convensions ------------------ - Class names are usually CamelCase - variables, functions and method names are lower_case_with_unserscores - Constants are ``UPPER_CASE`` - Source lines are at most 79 characters long - Class bodies are usually ended by a ``# end of class ClassName`` comment - Source files use Unix EOL conventions (LF) if possible. In any case, please don't mix Unix and Windows EOLs - Put your copyright info whenever appropriate Testing ------- Please write tests for significant changes and run the test suite before commiting changes. Commit Messages --------------- - Use the present tense ("Add feature" not "Added feature") - Use the imperative mood ("Move cursor to..." not "Moves cursor to...") - Limit the first line to 72 characters or less - Reference issues and pull requests liberally Thanks, the wxGlade developers wxGlade-0.9.4/CREDITS.txt000066400000000000000000000044161352706171500147710ustar00rootroot00000000000000 Main Developer: --------------------------------------------------------------------------- - Dietmar Schwertberger Other Developers: --------------------------------------------------------------------------- - none Former Developers: --------------------------------------------------------------------------- - Alberto Griggio - Carsten Grohmann (project lead) - Marcello Semboli - Guy Rutenberg - D.H. (Perl code generation) - Georges Khaznadar (debian package maintainer) - Marco Barisione - Kevin Walzer (OSX app bundle maintainer) Contributors: --------------------------------------------------------------------------- - Peter Bradley: editorial work on the new documentation - Johan Vromans - Richard Lawson - Alex Thuering : general virtual sizers support and porting of the SplitterWindow to this new model - Brendan Oakley : editor of the new user's manual - Jack Thomasson : assist with port to wx namespace - Roel van Os : for some patches integrated from his Elentirmo repository - Franco Bugnano : Contribute CheckListBox, GenericCalendarCtrl and PropertyGridManager Many thanks to: --------------------------------------------------------------------------- - Guido van Rossum and all the people at PSF for the excellent language - Robin Dunn, Julian Smart, Vadim Zeitlin, Robert Roebling and the wxWidgets team for their great libary - Glade developers for the inspiration they gave me and for the icons - Boa-constructor developers for some of the icons - Vaclav Slavik for the suggestions about XRC - Michael Gilfix for his wxPyColorChooser, used in the color dialog - ... and, of course, all the people who provided feedback, comments, critics and support (John Dubery in particular for his huge amount of bug reports). (We apologize with all the people that should be mentioned here but in fact aren't: if you think you are one of them, tell us and your name will be added ASAP) wxGlade-0.9.4/LICENSE.txt000066400000000000000000000022701352706171500147520ustar00rootroot00000000000000Copyright (c) 2002-2007 Alberto Griggio Copyright (c) 2011-2016 Carsten Grohmann Copyright (c) 2017 Dietmar Schwertberger Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. wxGlade-0.9.4/Makefile000066400000000000000000000150531352706171500145720ustar00rootroot00000000000000# Makefile for wxGlade # # License: MIT (see LICENSE.txt) # THIS PROGRAM COMES WITH NO WARRANTY DESTDIR = # Makefile defaults SHELL = /bin/sh INSTALL = install INSTALL_PROGRAM = ${INSTALL} INSTALL_DATA = ${INSTALL} -m 644 PACKAGE = python-wxglade prefix = $(DESTDIR)/usr/local exec_prefix = $(DESTDIR)/usr/local bindir = $(exec_prefix)/bin datarootdir = $(prefix)/share datadir = $(datarootdir) docdir = $(datarootdir)/doc/$(PACKAGE) mandir = $(datarootdir)/man man1dir = $(mandir)/man1 BASE_DIR = . BIN_FILES = wxglade BUILD_DIR = $(BASE_DIR)/build BDIST_DIR = $(BASE_DIR)/bdist DOC_DIR = $(BASE_DIR)/docs DIST_DIR = $(BASE_DIR)/dist EGG_DIR = $(BASE_DIR)/wxGlade.egg-info CHECK_FILES = $(filter-out $(BASE_DIR)/test.py, $(wildcard $(BASE_DIR)/*.py)) \ $(filter-out tests/%.py, $(shell find $(SOURCE_DIRS) -name "*.py")) EPYDOC_BIN = epydoc EPYDOC_CONFIG = $(BASE_DIR)/epydoc.conf EPYDOC_OPTS = --config $(EPYDOC_CONFIG) APIDOC_DIR = $(BASE_DIR)/docs/apidocs SOURCE_DIRS = codegen wcodegen edit_sizers widgets install tests SOURCE_FILES = $(wildcard $(BASE_DIR)/*.py) $(shell find $(SOURCE_DIRS) -name "*.py") TEST_BIN = $(BASE_DIR)/test.py PYLINT_BIN = pylint2 PYLINT_OPTS = --rcfile ./pylintrc PYLINT_PATH = "$(BASE_DIR):$(BASE_DIR)/widgets:$(BASE_DIR)/codegen" DIGGER_BIN = clonedigger DIGGER_OUTFILE = clonedigger.html DIGGER_OPTS = --language python --output $(DIGGER_OUTFILE) PYTHON_BIN = python2 MANPAGE_XSL = /usr/share/xml/docbook/xsl-stylesheets-1.79.1/manpages/docbook.xsl XP = xsltproc --nonet MANUAL_HTML_DIR = $(DOC_DIR)/html MANUAL_PDF_DIR = $(DOC_DIR)/pdf MANUAL_SRC_DIR = $(DOC_DIR)/src MANUAL_XML = $(MANUAL_SRC_DIR)/manual.xml MANUAL_PICS = $(wildcard $($(MANUAL_SRC_DIR)/*.png)) MANUAL_PDF = $(MANUAL_PDF_DIR)/manual.pdf MANUAL_PDF_XSL = $(MANUAL_SRC_DIR)/pdf.xsl MANUAL_HTML = $(MANUAL_HTML_DIR)/index.html MANUAL_HTML_XSL = $(MANUAL_SRC_DIR)/html.xsl HELP= @grep -B1 '^[a-zA-Z\-]*:' Makefile |\ awk 'function p(h,t){printf"%-12s=%s\n",h,t;};\ /\#+/{t=$$0;};\ /:/{gsub(":.*","");h=$$0};\ /^--/{p(h,t);t=h="";};\ END{p(h,t)}' |\ sed -n 's/=.*\#+/:/gp' .PHONY: help clean distclean compile apidoc pylint permissions man doc \ pdf html doc-clean release rel-binary rel-source install \ maintainer-clean test # Rule to compile a single Python file %.pyc: %.py @echo "Compile $< ..." @$(PYTHON_BIN) -c "import py_compile; py_compile.compile('$<')" #+ Show this text help: $(HELP) #+ Run all test package test: test-nongui test-gui test-compile #+ Run all non-GUI test package test-nongui: @$(TEST_BIN) #+ Run all GUI test package test-gui: @$(TEST_BIN) --gui #+ Run test to compile C++ files test-compile: @$(TEST_BIN) --compile #+ Clean python compiler files and automatic generated documentation clean: @echo "Remove all automatically generated files ..." @find $(BASE_DIR) -depth -type f -name "*.pyc" -exec rm -f {} \; @find $(BASE_DIR) -depth -type f -name "*.pyo" -exec rm -f {} \; @if [ -e $(BUILD_DIR) ]; then rm -rf $(BUILD_DIR); fi @if [ -e $(BDIST_DIR) ]; then rm -rf $(BDIST_DIR); fi @if [ -e $(DIST_DIR) ]; then rm -rf $(DIST_DIR); fi @if [ -e $(APIDOC_DIR) ]; then rm -rf $(APIDOC_DIR); fi @if [ -e $(EGG_DIR) ]; then rm -rf $(EGG_DIR); fi @find $(BASE_DIR) -depth -type f -name "*.orig" -exec rm -f {} \; @find $(BASE_DIR) -depth -type f -name "*~" -exec rm -f {} \; @find $(BASE_DIR) -depth -type f -name "#~wxg.autosave*" -exec rm -f {} \; @$(RM) logdict*.log @$(RM) warnwxglade.txt @$(RM) MANIFEST @$(RM) $(DIGGER_OUTFILE) #+ Remove all automatically generated and Mercurial repository data distclean: clean @echo "Remove Mercurial repository data (.hg*) ..." @$(RM) .hgtags .hgignore version.py #+ Remove almost everything that can bee reconstructed with this Makefile maintainer-clean: distclean doc-clean @echo "This command is intended for maintainers to use; it" @echo 'deletes files that may need special tools to rebuild." #+ Compile all python files compile: $(BYTECODE_FILES) # Create the documentation $(APIDOC_DIR)/index.html: $(SOURCE_FILES) $(EPYDOC_CONFIG) @echo "Create documentation from source ..." @$(EPYDOC_BIN) $(EPYDOC_OPTS) #+ Create documentation from source files apidoc: $(APIDOC_DIR)/index.html #+ Check all source files for logical errors using pylint pylint: PYTHONPATH=$(PYLINT_PATH) $(PYLINT_BIN) $(PYLINT_OPTS) $(CHECK_FILES) || /bin/true #+ Check all source files for dublicates digger: $(DIGGER_BIN) $(DIGGER_OPTS) $(CHECK_FILES) #+ Set proper permissions for all files and directories permissions: @echo "Set permissions for all files ..." @find $(BASE_DIR) -type d -exec chmod 755 {} \; @find $(BASE_DIR) -type f -exec chmod 644 {} \; @chmod 755 $(BIN_FILES) # Create the manpage $(DOC_DIR)/man/wxglade.1: $(DOC_DIR)/man/manpage.xml $(XP) --output $@ $(MANPAGE_XSL) $< #+ Create manpage from source files man: $(DOC_DIR)/man/wxglade.1 #+ Create all documentation from source files doc: pdf html man # Create PDF documentation $(MANUAL_PDF): $(MANUAL_XML) $(MANUAL_PICS) dblatex -p $(MANUAL_PDF_XSL) -o $(MANUAL_PDF_DIR)/manual.pdf $(MANUAL_XML) #+ Create PDF document based on manual xml file pdf: $(MANUAL_PDF) # Create HTML documentation $(MANUAL_HTML): $(MANUAL_XML) $(MANUAL_PICS) $(INSTALL_DATA) -t $(MANUAL_HTML_DIR) $(MANUAL_SRC_DIR)/*.png xmlto -m $(MANUAL_HTML_XSL) -o $(MANUAL_HTML_DIR) html $(MANUAL_XML) $(RM) $(MANUAL_HTML_DIR)/manual.proc #+ Create a set of HTML documents based on manual xml file html: $(MANUAL_HTML) #+ Cleanup all automatically generated manuals (if you really know what you do) doc-clean: $(RM) $(MANUAL_HTML_DIR)/*.html $(RM) $(MANUAL_HTML_DIR)/*.png $(RM) $(MANUAL_PDF) #+ Create official release packages release: rel-source rel-binary #+ Create Unix binary packages rel-binary: clean doc @echo "Creating Unix release packages ..." @$(RM) MANIFEST $(PYTHON_BIN) setup.py bdist --format=zip @$(RM) MANIFEST #+ Create Unix source release packages rel-source: clean doc @echo "Creating source packages ..." @$(RM) MANIFEST $(PYTHON_BIN) setup.py sdist --formats=gztar,zip @$(RM) MANIFEST #+ Install wxGlade locally at $(prefix) install: doc setup.py @echo "Install wxGlade locally at $(prefix) ..." $(PYTHON_BIN) setup.py install --prefix $(prefix) gzip -9 $(man1dir)/wxglade.1 wxGlade-0.9.4/NEWS.txt000066400000000000000000000446561352706171500144620ustar00rootroot00000000000000Version 0.9 General: - new user interface; use Alt-1,-2,-3, the menu or the toolbar to switch between layouts - many new keyboard shortcuts Widgets: - WrapSizer - SearchCtrl - SpinCtrlDouble - Splitter: ask user whether to add panels; add support for SashGravity - StaticText: support for Wrap property - Button, ToggleButton, BitmapButton: support more bitmap properties (e.g. BitmapCurrent) - Notebook: context menu items to add a page Generated Code: - option to remove all the BEGIN/END wxGlade comments in the generated code (only with overwrite True) - Python: unicode strings not escaped if the selected encoding does not require it Version 0.8.0 General: - support for wxPython Phoenix and Python 3 - full visualization of sizer slots; full editing capability in Tree window (structure, names, labels) - support for GridBagSizer - Repeat feature (Ctrl-R and Ctrl-Y) to apply property change(s) to multiple widgets - new Menu and Toolbar editors; you don't have to create IDs manually any more - better visualization for gauge, list ctrl, property grid in Design window Internal: - very major refactoring of property handling, code generation and sizers - many bug fixes - reformatted code and comments to be more compact - always use DestroyLater to avoid crashes - less redundant calls to widget.Show() to reduce display errors - better handling of size changes due to fonts - Disable autosave functionality permanently after saving has failed - Redesigned palette window Generated Code: - bind menu handlers without the need for user-defined IDs - default file encoding is now UTF-8 Documentation: - new tutorial Testing: - refactored testing Version 0.7.3 - 2016-06-XX: General: - Disable autosave functionality permanently after saving has failed - Redesign the palette window (Thanks to Dietmar Schwertberger) - ... Generated Code: - Remove the outdated version from the Perl "use Wx" statement - Use dynamic lookups to call event handler in Perl - ... Known issues: - Missing dependencies with wxToolBox widgets (sf bug #188) Workaround: enter dependencies manually in th extra code field Bugs: - Fix missing icons in release packages - Fix PyDeadObject errors and crashes during cut and paste - Fix preview failure for Perl class names with "::" (sf bug #183) - System colour constants named incorrectly in Perl (sf bug #184, Thanks to Sue D. Nymme) - Rework querying home path to prevent unexpanded variables (sf bug #185) - Fix C++ code issue with Ids assigned to variables (sf bug #186) - Fix typo in default type of the toolbar C++ constructor - Fix AttributeError during code generation of toplevel menubars - Don't wrap up IOError in XmlParsingError (sf bug #189) - Catch all errors raised during faulthandler initiasisation (sf bug #193) - Fix wrong CheckListBox C++ statement if styles are selected - Add excludes for wxCheckListBox mutual styles - Fix 'Store as attribute' does not work for sizers in C++ (sf bug #192) - LB_EXTENDED for ListBox never show up in generated code (sf bug #194) - Assert isinstance(geometry, (wx.Point, wx.Rect)) (sf bug #196) - ... Documentation: - ... Note: - See CHANGES.txt for a full list of changes Version 0.7.2 - 2016-03-05: General: - Remove usage of KDE file dialog - Improve reporting of early error messages on Windows Generated Code: - Inline wxStaticBox statement into wxStaticBoxSizer statement - Use wxWindowID instead of int for widget identifiers in C++ - Add support for wxArtProvider to XRC code generator - Don't set the default value for redirection in wx.PySimpleApp() Bugs: - Fix wrong orientation of wxStaticLine widgets - Fix NameError exception during inserting a sizer slot - Fix ZeroDevisionError during adding a new column to a wxFlexGridSizer with only one row - Fix WindowsError is the backup file already exists (Thanks to Graeme Glenn) - Fix black window bug on Windows - Fix PyDeadObjectError during closing wxGlade - Fix usage of wx.NullIcon for Perl and Python - Fix main file is generated without custom extensions (sf bug #179) - Fix wrong CreateStatusBar statement if styles are selected - Add missing wxStatusBar style wxST_SIZEGRIP - Fix generated code for wxDatePickerCtrl - Add workaround for missing wxDefaultDateTime in wxPerl Deprecation - In place modifications for generated source files will be removed in one of the next releases Documentation: - Reorganise and update the documentation Note: - See CHANGES.txt for a full list of changes Version 0.7.1 - 2015-12-26: General: - Open wxGlade windows in the upper left corner if wxGlade is starting the first time - Change internal string handling to Unicode - Show logged exceptions in wxGlade bug dialog - Store generated source files in the selected encoding - Add support for 3-state checkboxes - Remove obsolete calls of wx.InitAllImageHandlers() - Catch and show early exceptions on Windows (Thanks to Tor Sjøwall) - Rework handling of event types for C++ - Add support for events that are only supported by a specific wx version - Add styles to wxToggleButton - Don't rewrite unchanged files - Rework creation of wxBitmap code used by several widgets - New widgets CheckListBox, GenericCalendarCtrl and PropertyGridManager contributed by Franco Bugnano - Use defaults for missing application attributes in wxg files Generated Code: - Remove obsolete wx.InitAllImageHandlers() calls from Python codegen - Add missing event types for event handling in C++ - Event handler in C++ aren't virtual anymore - Add support for empty bitmaps and wxArtProvider Bugs: - Fix Unicode error during saving wxg files - Create non-existing config directory during initialisation (sf bug #164) - Fix incorrect handling of styles only supported by a specific wx version - Fix error during preview of classed with custom names (sf bug #165) - Don't ignore disabled gettext support (Thanks to Udi Fuchs) - Fix UnicodeDecodeError when saving project using non ASCII characters in menu items (sf bug #166) - Unicode error during update of an existing source file (sf bug #167) - Fix unicode error during copying widgets to the clipboard - Fix Designer not displaying buttons two lines correctly (sf bug #169) - Fix generated code for wxListBox - Fix broken color selection dialog - Fix a string formatting error during creating the second instances of the same widget - Always show new widgets in the design window - Fix generated code for CustomWidget constructor (Thanks to Udi Fuchs) - Fix a infinite loop within sizing a widget (sf bug #170) - Fix binding of menu event in Perl - Fix root widget loses layout attributes during copy and paste - Load wxg files even if application attributes are missing Deprecation - In place modifications for generated source files will be removed in one of the next releases Documentation: - Adapt and extend the documentation Note: - See CHANGES.txt for a full list of changes Version 0.7.0 - 2014-10-26: General: - Remove support for old Python import style generally - Add missing styles for wxNotebook (Thanks to Udi Fuchs) - Use Python logging facility instead of print statements - Rework quoting and escaping of special character sequences - Rework internal path handling - Write always an error log file - Improve widget import to be able to import widgets from ZIP files - Change configuration default to remember the position and geometry of the three main windows. This change effects fresh installations only. - adapt GUI to run with wxPython 2.8 till 3.0 - remove support for wxPython 2.6 - Disable Lisp for wx 3.0 - Improve the internal error dialog - Unify the code generation of widget specific code This change causes some minor changes in the generated code. - Add Lisp and Perl support for wxDatePickerCtrl - Add support for wxSplitterWindow.SetMinimumPaneSize() Generated Code: - Use SetToolTip() instead of SetToolTipString() for wxPython 3 und wxPerl 3 - Use configurable indents instead of hard coded tabs in wxFrame code for Perl Bugs: - Fix escape sequences in Unicode strings were escaped twice Perl and Python - Wrong Lisp statement in wxHyperlinkCtrl and wxFrame - Prevent code generation from a template file by commandline invocation - Fix bug in generation of valid hash keys for Perl - Fix various issues during transformation from XRC into wxGlade - Fix wrong conditions to generate application start code (sf bug #161) - Don't convert first char of a XRC extraproperty to upper case (sf bug #163) - Fix incomplete Unicode escaping Deprecation - In place modifications for generated source files will be removed in one of the next releases Documentation: - Adapt and extend the documentation API (for custom widgets): - Simplify signature of quote_str(), use quote_path() to quote / escape filenames or paths Note: - See CHANGES.txt for a full list of changes Version 0.6.8 - 2013-07-13: General: - Add comfortable exception handler for more detailed bug reports Bugs: - Wrong SetSizeHint() call in Perl (Thanks to Eric McKeeth) - Fix XRC code generation for notebooks with panes - Fix too strict sanity checks for class attributes - Fix "Overwrite existing sources" for new projects - Fix an uninitialised variable in saving a project file (sf bug # 157) - Fix handling of unicode characters in strings for Perl and Python - Fix handling of style-less dialogs and frames (sf bug #145) Documentation: - ... API (for custom widgets): - ... Note: - See CHANGES.txt for a full list of changes Version 0.6.7 - 2013-04-07: General: - Add a config option to suppress the code generation success message - Improve usability of some dialogs Bugs: - Remove empty line between shebang and encoding statement in Python files - Regression in generated Python code for bindung events Documentation: - no changes API (for custom widgets): - no changes Note: - See CHANGES.txt for a full list of changes Version 0.6.6 - 2013-03-29: General: - Add i18n support to C++ code generator - Add more test cases - Add more tooltips to gui - Add new widget HyperlinkCtrl - Add Perl support to CalendarCtrl - Add simple application start code to C++ code generator - Add "Store as attribute" for sizers - Change default widget ID from -1 to wxID_ANY and adapt codegen - Change some default settings and reorg internal handling - Fix exceptions during widget preview triggered by keyboard shortcut - Improve error handling - Improve message logging - Internal rework of code generator parts, this causes minor changes in the generated code - Join code templates for application startup code in class variables and unify the code generation of this piece - Minor GUI improvements - Rework and unify code generators, all code generators support extracode and extraproperties now - Set "Overwrite existing sources" for new projects - Show existing tooltips at all elements of a property - When pasting: only search current top-level window for duplicate names - Write isolation directives at beginning in C++ header files Bugs: - Don't add unsupported widgets to a sizer - Encoding detection for Mac OS X - Prevent caching effects in Lisp code generator - Prevent deleting last notebook tab (sf bug #3126974) - Same default names for multiple notebooks (sf bug #2000566) - Setting invalid windows names hasn't blocked fully (sf bug #154) - String formatting issue for event handlers in Lisp code generator - UnicodeEncodeError in xml.sax.expatreader (sf bug #149) Documentation: - Update wxGlade user manual API (for custom widgets): - Add support for widget builder that don't support all wx versions supported by wxGlade Note: - See CHANGES.txt for a full list of changes Version 0.6.5 - 2012-01-08: General: - remove support for Python 2.2 - remove support for wxPython < 2.6 - add a small test suite - add tooltip for CheckBoxProperty (Davorin Kunstelj) - add column sizes parameter to GridProperty init parameters (Davorin Kunstelj) - Improve searching and executeing of wxglade.py in shell script wxglade - some minor changes / improvements Bugs: - Various bugs in Lisp code generators - Typo in Perl code generators - Allow saving of generated code to filenames without directory part - Solve issue "C++ CalendarControl issues in 0.6.3" (sf bug #2782306) Documentation: - Update usage message and manpage API (for custom widgets): - no changes Note: - See CHANGES.txt for a full list of changes Version 0.6.4 till version 0.5: No summary of changes available - see CHANGES.txt for a full list of changes Version 0.5 - 2007-04-02: - with some improvements - code ported to the "new" wx namespace - wxWidgets 2.8 support - and more... Version 0.4.1 - 2006-03-02: - Note that this file isn't very much up to date anymore... Version 0.4 - 2005-10-10: - edit_sizers/edit_sizers.py: updated layout() to work with wx2.6 - widgets/frame/frame.py: fixed a segfault when deleting a frame with a statusbar on wx2.6 - widgets/notebook/notebook.py: updated notebook virtual sizer to fix broken layout on wx2.6 - edit_windows.py: fixed property_panel layout which was broken on wx2.6 - tree.py: - added wxBegin/EndBusyCursor() calls when showing a toplevel widget - called fit_parent at the end of show_widget for toplevel widgets without a specific size - added event handlers support (not for perl at the moment) - better sizers layout - many bugs fixed - updated copyright information - ... Version 0.3.5.1 - 2004-11-08: - released, due to a bug in version 0.3.5 (size property not updating correctly) Version 0.3.5 - 2004-11-04: - kdefiledialog.py: support for native file and dir dialogs on KDE - debian/: support for Debian package (by Georges Khaznadar) - common.py, config.py, configUI.py, main.py, res/preferences.wxg: auto save support (i.e. now wxg files can be saved automatically periodically) - edit_sizers/sizers_codegen.py, edit_sizers/perl_sizers_codegen.py, codegen/*.py: fixed issue with wxStaticBoxSizer code generation - edit_sizers/edit_sizers.py, edit_windows.py: fixed segfault on wxGTK2 when removing a widget from the popup menu - *.py: updated copyright information Version 0.3.4.1 - 2004-09-04: - introduce of a workaround for a bug in wxPython 2.5.2.8 (about wxGrid and its default size...) Version 0.3.4 - 2004-09-01: - common.py: minor UI tweak - edit_windows.py, config.py, configUI.py: added `show "handles" of sizers' option added `allow duplicate widget names' option - widgets/menubar/codegen.py: changed python code generator to be smarter about menu items with a user defined name - edit_windows.py, widget_properties.py: fixed a couple of wxMac issues - widgets/frame/codegen.py: added xrc code generator for wxStatusBar - widgets/choice/choice.py, widgets/combo_box/combo_box.py, widgets/list_box/list_box.py: removed default entry in Choices property - widgets/combo_box/codegen.py, widgets/spin_ctrl/codegen.py: applied patch #944642 - widgets/list_ctrl/list_ctrl.py: added a couple of extra styles - widgets/button/*: added wxButton styles - widgets/panel/panel.py: fixed (hopefully) bug #880674 - clipboard.py, main.py: added Drag&Drop of wxg files for opening them (thanks to Chris Liechti) - main.py, docs/index.html, docs/html/*: new manual added - config.py: config path is now under APPDATA ok windows - widgets/bitmap_button/*, widgets/toolbar/*, widgets/static_bitmap/*: added "code:" tag - xrc2wxg.py: added wxSplitterWindow support - tree.py: partially fixed bug #798041 (renaming of cut widgets) - widgets/panel/panel.py: added ability to paste a sizer inside a panel, notebook page and splitter pane - codegen/py_codegen.py, widgets/*/codegen.py, edit_sizers/sizers_codegen.py: changes to the python code generator to support new wx namespace Version 0.3.1 - 2003-08-30: - we found an annoying bug on pl_codegen.py right after releasing 0.3 :-( Version 0.3 - 2003-08-29: - codegen/pl_codegen.py, toolbar/perl_codegen.py, menubar/perl_codegen.py: brought Perl code generator up to date: - multiple files support - ``keep contents'' support - automatic ids generation (ID_FOO=?) support everything is still *experimental* and NEEDS EXTENSIVE TESTING - widgets/toolbar/codegen.py, widgets/bitmap_button/codegen.py, widgets/static_bitmap/codegen.py: added (limited) support to xpm data (not on files). I.e. if the bitmap property is something like var:variable_name, variable_name is taken to be a variable that holds xpm data - codegen/xrc_codegen.py, xml_parse.py, docs/turorial.html: added subclass support to XRC output - application.py, tree.py, xml_parse.py, codegen/py_codegen.py, codegen/cpp_codegen.py: added "overwrite" property to Application, to allow re-generation of (C++ and python) code from scratch (as opposed to updating wxGlade blocks). - docs/tutorial.html: updated notes - codegen/py_codegen.py, codegen/cpp_codegen.py: enhanced generate_code_id, to recognize ID_SOMETHING=? and generate a "unique" id automatically - codegen/cpp_codegen.py: fixed ids code generation when the output file already exists - widgets/toolbar.py: fixed xrc code generation - common.py: updated version number to 0.3pre1 - edit_windows.py, application.py: added validation code for `name' and `class' properties (fixed bug #764186) - credits.txt: updated developer names - codegen/py_codegen.py, codegen/cpp_codegen.py: fixed bug in quote_str - tree.py, widgets/panel/*: added scrolled window support (this required a small change in Tree.Node.write in tree.py) - perl generation support added - nearly all around: fixed various Unicode-related bugs - misc.py added functions, streq and wxstr, to fix some Unicode issues - edit_windows.py, edit_sizers/edit_sizers.py, xml_parse.py: added cut&paste support for toplevel sizers - common.py, main.py: added ToggleButtonBox to separate the "core" components from the "custom" ones (similar to Glade and QT-Designer) - common.py, config.py: added local widgets path support See VCS revision history for change details of older version. Check especially revisions of CHANGES.txt earlier then December 2011 wxGlade-0.9.4/README.rst000066400000000000000000000043121352706171500146150ustar00rootroot00000000000000============================================= wxGlade: A GUI builder for wxPython/wxWidgets ============================================= .. image:: docs/html/_images/wxglade_large.png :align: center Version: 0.9.4 License: MIT (see LICENSE.txt) THIS PROGRAM COMES WITH NO WARRANTY Introduction ------------ wxGlade is a GUI builder for wxWidgets/wxPython. It can create Python, C++, Perl, Lisp and XRC output. Requirements ------------ * Python (http://www.python.org) 2.7, 3.4 or later * wxPython (http://www.wxpython.org) >= 2.8 (wxPython Phoenix, i.e. release >=4.0.0, is supported) If you have a choice, you should prefer wxPython Phoenix running on Python 3.x. Installation ------------ To start the program, enter ``python wxglade.py`` in your shell or use whatever is required to start a python application on your platform. If you want to build a GUI for wxPython Classic or Phoenix: Start wxGlade in your target version - if it runs under Phoenix, it will create Phoenix code. Documentation ------------- The documentation is at docs/html/index.html and includes a tutorial. You can view it from the help menu as well. The target audience includes people who have not yet been using wxPython or wxWidgets before. A snapshot of the documentation including tutorial can be found here: http://wxglade.sourceforge.net/docs/index.html This one is not always up to date, though. Issues / Bugs ------------- For any kind of question, there's a mailing list: https://lists.sourceforge.net/lists/listinfo/wxglade-general If you observe a bug, please check the bug tracker for current open bugs: https://github.com/wxGlade/wxGlade/issues For new bugs, please open a bug report in the tracker. You have to register and log in at GitHub to file a bug report. Alternatively you can send the bug report to the wxGlade mailing list. Keep in mind that you need a subscription for sending emails to this mailing list. Please include the following information: * What did you? May you want to include a screenshot. * What do you want to happen? * What actually happened? * Provide a short example to reproduce the issue. * Maybe, include the internal error log file ``wxglade.log`` Have fun! Dietmar Schwertberger wxGlade-0.9.4/README.txt000066400000000000000000000037231352706171500146310ustar00rootroot00000000000000wxGlade: A GUI builder for wxPython/wxWidgets ============================================= Version: 0.9.4 License: MIT (see LICENSE.txt) THIS PROGRAM COMES WITH NO WARRANTY Requirements ------------ - Python (http://www.python.org) 2.7, 3.4 or later - wxPython (http://www.wxpython.org) >= 2.8 (wxPython Phoenix, i.e. release >=4.0.0, is supported) If you have a choice, you should prefer wxPython Phoenix running on Python 3.x. Installation ------------ To start the program, enter ``python wxglade.py`` in your shell or use whatever is required to start a python application on your platform. If you want to build a GUI for wxPython Classic or Phoenix: Start wxGlade in your target version - if it runs under Phoenix, it will create Phoenix code. Documentation ------------- The documentation is at docs\html\index.html and includes a tutorial. You can view it from the help menu as well. The target audience includes people who have not yet been using wxPython or wxWidgets before. A snapshot of the documentation including tutorial can be found here: http://wxglade.sourceforge.net/docs/index.html This one is not always up to date, though. Issues / Bugs ------------- For any kind of question, there's a mailing list: https://lists.sourceforge.net/lists/listinfo/wxglade-general If you observe a bug, please check the bug tracker for current open bugs: https://github.com/wxGlade/wxGlade/issues For new bugs, please open a bug report in the tracker. You have to register and log in at GitHub to file a bug report. Alternatively you can send the bug report to the wxGlade mailing list. Keep in mind that you need a subscription for sending emails to this mailing list. Please include the following information: - What did you? May you want to include a screenshot. - What do you want to happen? - What actually happened? - Provide a short example to reproduce the issue. - Maybe, include the internal error log file ``wxglade.log`` Have fun! Dietmar Schwertberger wxGlade-0.9.4/__init__.py000066400000000000000000000003761352706171500152450ustar00rootroot00000000000000# __init__.py: to turn wxGlade into a package # $Id: __init__.py,v 1.4 2007/03/27 07:02:07 agriggio Exp $ # # Copyright (c) 2002-2007 Alberto Griggio # License: MIT (see LICENSE.txt) # THIS PROGRAM COMES WITH NO WARRANTY wxGlade-0.9.4/about.py000066400000000000000000000112151352706171500146120ustar00rootroot00000000000000""" About box with general info @copyright: 2002-2007 Alberto Griggio @copyright: 2014-2016 Carsten Grohmann @copyright: 2017 Dietmar Schwertberger @license: MIT (see LICENSE.txt) - THIS PROGRAM COMES WITH NO WARRANTY """ import bugdialog import codecs import wx import wx.html import wx.lib.wxpTag import config import misc import os.path class wxGladeAboutBox(wx.Dialog): text = '''
Version %s on Python %s and wxPython %s

License: MIT (see LICENSE.txt)

Home page: http://wxglade.sourceforge.net

For credits, see CREDITS.txt.

''' def __init__(self, parent=None): wx.Dialog.__init__(self, parent, -1, _('About wxGlade')) html = wx.html.HtmlWindow(self, -1, size=(480, 250)) html.Bind(wx.html.EVT_HTML_LINK_CLICKED, self.OnLinkClicked) # it's recommended at least for GTK2 based wxPython if "gtk2" in wx.PlatformInfo: html.SetStandardFonts() bgcolor = misc.color_to_string(self.GetBackgroundColour()) icon_path = os.path.join(config.icons_path, 'wxglade_small.png') html.SetPage( self.text % (bgcolor, icon_path, config.version, config.py_version, config.wx_version) ) ir = html.GetInternalRepresentation() ir.SetIndent(0, wx.html.HTML_INDENT_ALL) html.SetSize((ir.GetWidth(), ir.GetHeight())) szr = wx.BoxSizer(wx.VERTICAL) szr.Add(html, 0, wx.TOP|wx.ALIGN_CENTER, 10) szr.Add(wx.StaticLine(self, -1), 0, wx.LEFT|wx.RIGHT|wx.EXPAND, 20) szr2 = wx.BoxSizer(wx.HORIZONTAL) btn = wx.Button(self, wx.ID_OK, _("OK")) btn.SetDefault() szr2.Add(btn) if wx.Platform == '__WXGTK__': extra_border = 5 # border around a default button else: extra_border = 0 szr.Add(szr2, 0, wx.ALL|wx.ALIGN_RIGHT, 20 + extra_border) self.SetAutoLayout(True) self.SetSizer(szr) szr.Fit(self) self.Layout() if parent: self.CenterOnParent() else: self.CenterOnScreen() def OnLinkClicked(self, event): href = event.GetLinkInfo().GetHref() if href == 'show_license': if config.license_file: from wx.lib.dialogs import ScrolledMessageDialog try: license_file = codecs.open(config.license_file, encoding='UTF-8') dlg = ScrolledMessageDialog( self, license_file.read(), "wxGlade - License" ) license_file.close() dlg.ShowModal() dlg.Destroy() except EnvironmentError as inst: bugdialog.ShowEnvironmentError( _('''Can't read the file "LICENSE.txt".\n\nYou can get a license copy at\n''' '''http://www.opensource.org/licenses/mit-license.php'''), inst) else: wx.MessageBox(_('File "LICENSE.txt" not found!\nYou can get a license copy at\n' 'http://www.opensource.org/licenses/mit-license.php'), _('Error'), wx.OK | wx.CENTRE | wx.ICON_EXCLAMATION) elif href == 'show_credits': if config.credits_file: from wx.lib.dialogs import ScrolledMessageDialog try: credits_file = codecs.open( config.credits_file, encoding='UTF-8' ) dlg = ScrolledMessageDialog( self, credits_file.read(), _("wxGlade - Credits") ) credits_file.close() dlg.ShowModal() dlg.Destroy() except EnvironmentError as inst: bugdialog.ShowEnvironmentError(_('''Can't read the file "CREDITS.txt"'''), inst) else: wx.MessageBox(_('File "CREDITS.txt" not found!'), _('Error'), wx.OK | wx.CENTRE | wx.ICON_EXCLAMATION) else: import webbrowser webbrowser.open(href, new=True) wxGlade-0.9.4/appdata.xml000066400000000000000000000035521352706171500152670ustar00rootroot00000000000000 wxGlade.desktop CC0-1.0 MIT wxGlade A GUI designer written in Python with the popular GUI toolkit wxPython

wxGlade allows to create graphical user interfaces using wxWidgets. The designer can arrange different widgets using a drag and drop WYSIWYG editor. This simplifies the creation of a graphical user interface in comparison with manual coded graphical user interfaces.

wxGlade is able to generate source code for Python, Perl, Lisp, C++ and XRC based on the designed GUI.

With wxGlade you can:

  • Design the whole GUI of your application inclusive simple or complex dialogs as well as menu bars, different kinds of buttons and text widgets, bitmaps, ...
  • Use the graphical editor for editing, cutting and pasting widgets
  • Convert your design in source code of your favorite language
  • Run wxGlade on a wide variety of operation systems since it's written in Python
http://wxglade.sourceforge.net/img/wxglade_session.png http://wxglade.sourceforge.net/ wxglade-general_at_lists.sourceforge.net
wxGlade-0.9.4/application.py000066400000000000000000000735511352706171500160160ustar00rootroot00000000000000""" Application class to store properties of the application being created @copyright: 2002-2007 Alberto Griggio @copyright: 2012-2016 Carsten Grohmann @copyright: 2016-2018 Dietmar Schwertberger @license: MIT (see LICENSE.txt) - THIS PROGRAM COMES WITH NO WARRANTY """ import os, sys, random, re, logging, math import wx import common, config, misc, plugins, errors, compat import bugdialog import new_properties as np class FileDirDialog(object): """Custom class which displays a FileDialog or a DirDialog, according to the value of the L{Application.multiple_files} of its parent (instance of L{Application}). @ivar default_extension: The default extension will be added to all file names without extension. @ivar file_message: Message to show on the file dialog @ivar dir_message: Message to show on the directory dialog @ivar file_style: Style for the file dialog @ivar dir_style: Style for the directory dialog @ivar value: Value returned by file or directory dialog on success @ivar parent: Parent instance of L{Application} @ivar prev_dir: Previous directory""" def __init__(self, parent, wildcard=_("All files|*"), file_message=_("Choose a file"),dir_message=None,file_style=0): self.prev_dir = config.preferences.codegen_path or "" self.wildcard = wildcard self.file_message = file_message self.dir_message = dir_message self.file_style = file_style self.dir_style = wx.DD_DEFAULT_STYLE | wx.DD_NEW_DIR_BUTTON self.parent = parent self.value = None self.default_extension = None def ShowModal(self): """Show a FileDialog or a DirDialog as a modal dialog. The selected file or directory is stored in self.value on success. Returns ID_OK or ID_CANCEL.""" if self.parent.multiple_files == 0: self.value = wx.FileSelector( self.file_message, self.prev_dir, wildcard=self.wildcard, flags=self.file_style ) # check for file extension and add default extension if missing if self.value and self.default_extension: ext = os.path.splitext(self.value)[1].lower() if not ext: self.value = "%s%s" % (self.value, self.default_extension) else: self.value = wx.DirSelector( self.dir_message, self.prev_dir, style=self.dir_style ) if self.value: self.prev_dir = self.value if not os.path.isdir(self.prev_dir): self.prev_dir = os.path.dirname(self.prev_dir) return wx.ID_OK return wx.ID_CANCEL def get_value(self): "Return the dialog value returned during the last L{ShowModal()} call; @see: L{value}" return self.value class Application(np.PropertyOwner): "Properties of the application being created" all_supported_versions = ['2.8', '3.0'] # Supported wx versions _VERSION_TOOLTIPS = ("Generate source files for wxWidgets version 2.8", "Generate source files for wxWidgets version 3.0\nOld style import are not supported anymore.") PROPERTIES = ["Application", "name", "class", "encoding", "use_gettext", "top_window", "multiple_files", "language", "for_version", "overwrite", "mark_blocks", "output_path", "generate_code", "Settings", "indent_mode", "indent_amount", "source_extension", "header_extension"] _PROPERTY_LABELS = {"source_extension": 'C++ source file ext', "header_extension": 'C++ header file ext', "use_gettext": "Enable gettext support", "indent_mode": "Indentation mode", "multiple_files": "Code Generation", "overwrite": "Keep user code", "mark_blocks": "Mark code blocks", "generate_code": "Generate Source"} _PROPERTY_HELP = {"name": 'Name of the instance created from "Class";\n' ' also used as (main) file name in case of "Separate file for each class"', "class": "Name of the automatically generated class derived from wxApp", "use_gettext": "Enable internationalisation and localisation for the generated source files", "header_extension":'for C++ only: extension of the header file', "source_extension":'for C++ only: extension of the source file', 'indent_amount': 'Number of spaces or tabs used for one indentation level.', "top_window": "This widget is used as top window in the wxApp start code", "overwrite":"Keep user code in source files when generating code.\n" "wxGlade will just write the blocks that are marked 'begin wxGlade'/'end wxGlade'.\n" "Be aware that this feature is not too robust against e.g. renaming of frames.\n" "Always keep backups and don't touch the wxGlade begin/end markers!", "output_path": "Output file or directory: absolute or relative path", "mark_blocks":"Mark auto-generated code blocks with BEGIN/END wxGlade comments.\n" "This allows to identify user code in source files.\n" "Therefore it can not be disabled if 'Keep user code' is selected." } if sys.platform=="win32": _PROPERTY_HELP["output_path"] = "Output file or directory; double click label to show in Explorer" elif sys.platform=="darwin": _PROPERTY_HELP["output_path"] = "Output file or directory; double click label to show in Finder" is_sizer = False _is_toplevel = False base = None def __init__(self): np.PropertyOwner.__init__(self) self._logger = logging.getLogger(self.__class__.__name__) self.__saved = True # raw value for self.saved property; if True, there are no changes to save self.__filename = None # raw value for the self.filename property; Name of the output XML file # initialise instance properties self.is_template = np.Property(False) # hidden property # name and derived class name, including validation self.name = np.TextPropertyA("app", default_value="") self.klass = np.TextPropertyA("MyApp", default_value="", name="class") self.properties["name"].validation_re = re.compile(r'^[a-zA-Z]+[\w0-9-]*$') self.properties["class"].validation_re = re.compile(r'^[a-zA-Z]+[\w:.0-9-]*$') # generate separate file for each class? labels = [_("Single file"), _("Separate file for each class") ] tooltips = [_("Write all source code in one file"), _("Split source code in one file per class / widget") ] self.multiple_files = np.RadioProperty( config.default_multiple_files, values=[0,1], labels=labels, tooltips=tooltips ) # code indentation: mode and count self.indent_mode = np.RadioProperty( 1, [0,1], ["Tabs","Spaces"], aliases=["tab","space"], columns=2 ) self.indent_amount = np.SpinProperty( config.default_indent_amount, val_range=(1, 100) ) # C++ file extension self.source_extension = np.TextProperty('cpp') self.header_extension = np.TextProperty('h') # output path output_path = config.default_output_path if self.multiple_files else config.default_output_file self.output_path = np.FileNameProperty(output_path, style=wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT) self._update_output_path('python') self.overwrite = np.InvCheckBoxProperty(config.default_overwrite) # YYY self.mark_blocks = np.CheckBoxProperty(True) # output language languages = sorted( common.code_writers.keys() ) labels = [misc.capitalize(s) for s in languages] self.language = np.RadioProperty('python', languages, labels, columns=3) # gettext? self.use_gettext = np.CheckBoxProperty(config.default_use_gettext) # wx Version: string of major dot minor version number version = "%d.%d"%compat.version if not version in self.all_supported_versions: version = "2.8" if version[0]=="2" else "3.0" self.for_version = np.RadioProperty( version, self.all_supported_versions, tooltips=self._VERSION_TOOLTIPS) # encoding encodings = ["UTF-8", "ISO-8859-1", "ISO-8859-15", "CP1252"] # just some common values self.encoding = np.ComboBoxProperty(config.default_encoding, encodings) # top window name for the generated app self.top_window = prop = np.ListBoxProperty("", choices=[]) prop.auto_activated = True self.generate_code = np.ActionButtonProperty(self.generate_code) self.widget = None # always None, just to keep interface to Tree similar to other editors self.node = None def set_for_version(self, value): self.for_version = self.for_version_prop.get_string_value() if self.for_version.startswith('3.'): ## disable lisp for wx > 2.8 if self.codewriters_prop.get_string_value() == 'lisp': misc.warning_message( _('Generating Lisp code for wxWidgets version %s is not supported.\n' 'Set version to "2.8" instead.') % self.for_version ) self.for_version_prop.set_str_value('2.8') self.set_for_version('2.8') return self.codewriters_prop.enable_item('lisp', False) else: # enable lisp again self.codewriters_prop.enable_item('lisp', True) def get_output_path(self): return os.path.normpath(os.path.expanduser(self.output_path)) def _add_page(self, label, page, sizer): "Add a page to properties notebook (L{self.notebook})" page.SetAutoLayout(True) page.SetSizer(sizer) sizer.Layout() sizer.Fit(page) self.notebook.AddPage(page, label) h = page.GetSize()[1] page.SetScrollbars(1, 5, 1, int(math.ceil(h / 5.0))) def set_encoding(self, value): try: unicode('a', value) except LookupError as inst: bugdialog.Show(_('Set Encoding'), inst) self.encoding_prop.set_value(self.encoding) else: self.encoding = value def _set_language(self): "Set code generator language and adapt corresponding settings like file dialog wild cards (value: str or int)" language = self.language # update wildcards and default extension in the dialog self._update_output_path(language) # check that the new language supports all the widgets in the tree self.check_codegen() # disable lisp for wx > 2.8 if language == 'lisp': for_version = self.for_version if for_version == '3.0': misc.warning_message( _('Generating Lisp code for wxWidgets version %s is not supported.\n' 'Set version to "2.8" instead.') % self.for_version ) self.properties["for_version"].set('2.8') self.properties["for_version"].set_blocked(True) else: self.properties["for_version"].set_blocked(False) # don't change the extension in multiple files mode if self.multiple_files == 1: return # update file extensions current_name = self.output_path if not current_name: return base, ext = os.path.splitext(current_name) # is already a valid extension? ext has a leading . but default_extensions hasn't if ext and ext[1:] in common.code_writers[language].default_extensions: return new_name = "%s.%s" % (base, common.code_writers[language].default_extensions[0]) self.properties["output_path"].set(new_name) blocked = self.language!="C++" self.properties["source_extension"].set_blocked(blocked) self.properties["header_extension"].set_blocked(blocked) # properties: saved and filename def _get_saved(self): return self.__saved def _set_saved(self, value): if self.__saved != value: self.__saved = value t = common.app_tree.get_title().strip() if not value: common.app_tree.set_title('* ' + t) else: if t[0] == '*': common.app_tree.set_title(t[1:].strip()) saved = property(_get_saved, _set_saved) def _get_filename(self): return self.__filename def _set_filename(self, value): if self.__filename != value: self.__filename = value if self.__saved: flag = ' ' else: flag = '* ' if self.__filename is not None: common.app_tree.set_title('%s(%s)' % (flag, self.__filename)) else: common.app_tree.set_title(flag) filename = property(_get_filename, _set_filename) # interface from tree ############################################################################################## def add_top_window(self, name): p = self.properties["top_window"] p.add_choice(name) if not p.get() and not p.deactivated: p.set(name) if p.deactivated: p.set_active() def remove_top_window(self, name): p = self.properties["top_window"] p.remove_choice(name) def update_top_window_name(self, oldname, newname): p = self.properties["top_window"] if not oldname in p.choices: return if p.get() == oldname: p.value = newname p.choices[p.choices.index(oldname)] = newname p.set_choices() #################################################################################################################### def properties_changed(self, modified): # ['encoding', 'output_path', 'class', 'name', 'multiple_files', 'language', 'top_window', 'use_gettext', # 'use_gettext', 'is_template', 'overwrite', 'indent_mode', 'indent_amount', 'for_version', 'source_extension', # 'header_extension'] # XXX any other to be handled? if not modified or "language" in modified: self._set_language() # update language-dependent choices if not modified or "name" in modified or "class" in modified: # enable/disable top_window self.properties["top_window"].set_active(self.name or self.klass) if not modified or "overwrite" in modified: block = not self.overwrite self.properties["mark_blocks"].set_blocked(block) if block: self.properties["mark_blocks"].set(True) self.properties["mark_blocks"].set_blocked(block) def _init(self): # common part for init and new p = self.properties p["multiple_files"].set( config.default_multiple_files ) p["indent_mode"].set(1) p["indent_amount"].set(config.default_indent_amount) p["source_extension"].set('cpp') p["header_extension"].set('h') if config.default_multiple_files: p["output_path"].set("wxglade_out") else: p["output_path"].set("wxglade_out.dummy") # will be changed by _set_language() p["top_window"].set('') p["top_window"].set_choices([]) # do not reset language, but call set_language anyway to update the wildcard of the file dialog self._set_language() def init(self): "initializes the attributes of the app before loading a file" p = self.properties p["class"].set("MyApp", deactivate=True) p["name" ].set("app", deactivate=True) self._init() self.properties_changed(None) def new(self): "resets the default values of the attributes of the app" p = self.properties p["class"].set("MyApp", activate=True) p["name" ].set("app", activate=True) self._init() self.properties_changed(None) def generate_code(self, preview=False, out_path=None, widget=None): if config.use_gui: common.property_panel.flush() else: np.flush_current_property() if out_path is None: out_path = os.path.expanduser(self.output_path.strip()) if not os.path.isabs(out_path) and (out_path and self.filename): out_path = os.path.join(os.path.dirname(self.filename), out_path) out_path = os.path.normpath(out_path) if not out_path: msg = "You must specify an output file before generating any code." if not self.filename: msg += "\nFor relative file names, the project needs to be saved first." return misc.error_message( msg ) name_p = self.properties["name"] class_p = self.properties["class"] if self.language != "XRC": if not preview and ( name_p.is_active() or class_p.is_active() ) and not self.top_window: return misc.error_message( "Please select a top window for the application or deactivate " "the Name and Class properties for Application.\n" "In that case, only code for the windows will be generated, not for the " "application." ) if preview: writer = common.code_writers["python"].copy() else: writer = common.code_writers[self.language]#.copy() try: writer.new_project(self, out_path, preview) writer.generate_code(self.node, widget) writer.finalize() except errors.WxgBaseException as inst: misc.error_message( _("Error generating code:\n%s")%inst ) return except EnvironmentError as inst: bugdialog.ShowEnvironmentError(_('An IO/OS related error is occurred:'), inst) bugdialog.Show(_('Generate Code'), inst) return finally: writer.clean_up(self.node) if preview or not config.use_gui: return if config.preferences.show_completion: # Show informational dialog misc.info_message("Code generation completed successfully") else: # Show message in application status bar app = wx.GetApp() frame = app.GetTopWindow() frame.user_message(_('Code generated')) def is_visible(self): return True def _get_preview_filename(self): import warnings warnings.filterwarnings("ignore", "tempnam", RuntimeWarning, "application") if compat.PYTHON2: out_name = os.tempnam(None, 'wxg') + '.py' else: # create a temporary file at either the output path or the project path error = None if not self.filename: error = "Save project first; a temporary file will be created in the same directory." else: dirname, basename = os.path.split(self.filename) basename, extension = os.path.splitext(basename) if not os.path.exists(dirname): error = "Directory '%s' not found"%dirname elif not os.path.isdir(dirname): error = "'%s' is not a directory"%dirname if error: misc.error_message(error) return None while True: out_name = os.path.join(dirname, "_%s_%d.py"%(basename,random.randrange(10**8, 10**9))) if not os.path.exists(out_name): break return out_name def preview(self, widget, position=None): """Generate and instantiate preview widget. None will be returned in case of errors. The error details are written to the application log file.""" # some checks #if compat.IS_PHOENIX: #found = common.app_tree.find_widgets_by_classnames(widget.node, "EditPropertyGridManager") #if found: #error = ("Preview with PropertyGridManager controls is currently deactivated as it causes crashes " #"with wxPython Phoenix") #wx.MessageBox( error, _('Error'), wx.OK | wx.CENTRE | wx.ICON_EXCLAMATION ) #return # XXX check other things as well, e.g. different bitmap sizes for BitmapButton preview_filename = self._get_preview_filename() if preview_filename is None: return widget_class_name = widget.klass # make a valid name for the class (this can be invalid for some sensible reasons...) widget_class = widget.klass[widget.klass.rfind('.') + 1:] widget_class = widget.klass[widget.klass.rfind(':') + 1:] # ALB 2003-11-08: always randomize the class name: this is to make preview work even when there are multiple # classes with the same name (which makes sense for XRC output...) widget_class = '_%d_%s' % (random.randrange(10 ** 8, 10 ** 9), widget_class) widget.properties["class"].set(widget_class) if wx.Platform == "__WXMAC__" and not compat.PYTHON2: # workaround for Mac OS testing: sometimes the caches need to be invalidated import importlib importlib.invalidate_caches() frame = None try: self.generate_code(True, preview_filename, widget) # import generated preview module dynamically preview_path = os.path.dirname(preview_filename) preview_module_name = os.path.basename(preview_filename) preview_module_name = os.path.splitext(preview_module_name)[0] preview_module = plugins.import_module(preview_path, preview_module_name) if not preview_module: misc.error_message( _('Can not import the preview module from file \n"%s".\n' 'The details are written to the log file.\n' 'If you think this is a wxGlade bug, please report it.') % self.output_path ) return None try: preview_class = getattr(preview_module, widget.klass) except AttributeError: # module loade previously -> do a re-load XXX this is required for Python 3; check alternatives import importlib preview_module = importlib.reload(preview_module) preview_class = getattr(preview_module, widget.klass) if not preview_class: misc.error_message( _('No preview class "%s" found.\nThe details are written to the log file.\n' 'If you think this is a wxGlade bug, please report it.') % widget.klass ) return None if issubclass(preview_class, wx.MDIChildFrame): frame = wx.MDIParentFrame(None, -1, '') child = preview_class(frame, -1, '') child.SetTitle(' - ' + child.GetTitle()) w, h = child.GetSize() frame.SetClientSize((w + 20, h + 20)) elif not issubclass(preview_class, (wx.Frame,wx.Dialog)): # the toplevel class isn't really toplevel, add a frame... frame = wx.Frame(None, -1, widget_class_name) if issubclass(preview_class, wx.MenuBar): menubar = preview_class() frame.SetMenuBar(menubar) panel = wx.Panel(frame) elif issubclass(preview_class, wx.ToolBar): toolbar = preview_class(frame, -1) frame.SetToolBar(toolbar) panel = wx.Panel(frame) frame.SetMinSize( toolbar.GetBestSize() ) frame.Fit() else: panel = preview_class(frame, -1) frame.Fit() else: frame = preview_class(None, -1, '') def on_close(event): frame.Unbind(wx.EVT_CHAR_HOOK) compat.DestroyLater(frame) widget.preview_widget = None widget.properties["preview"].set_label(_('Show Preview')) frame.Bind(wx.EVT_CLOSE, on_close) frame.SetTitle(_(' - %s') % frame.GetTitle()) # raise the frame if position: frame.SetPosition(position) else: frame.CenterOnScreen() if widget.widget: # avoid Design and Preview window at the same position pos = widget.widget.GetPosition() if frame.GetPosition()==pos: frame.SetPosition( (pos[0]+200, pos[1]+100)) frame.Show() # install handler for key down events frame.Bind(wx.EVT_CHAR_HOOK, self.on_char_hook) # remove the temporary file if not config.debugging: name = os.path.join(preview_path, preview_module_name+".py") if os.path.isfile(name): os.unlink(name) except Exception as inst: if config.debugging or config.testing: raise widget.preview_widget = None widget.properties["preview"].set_label(_('Show Preview')) bugdialog.Show(_("Generate Preview"), inst) # XXX restore app state widget.properties["class"].set(widget_class_name) return frame def on_char_hook(self, event): # handler for EVT_CHAR_HOOK events on preview windows if event.GetKeyCode()==wx.WXK_ESCAPE: wx.FindWindowById(event.GetId()).GetTopLevelParent().Close() return misc.handle_key_event(event, "preview") def update_view(self, selected=False): pass def check_codegen(self, widget=None, language=None): """Checks whether widget has a suitable code generator for the given language (default: the current active language). If not, the user is informed with a message.""" if language is None: language = self.language if widget is not None: if widget.__class__.__name__=="SizerSlot": return cname = common.class_names[widget.__class__.__name__] if language != 'XRC': ok = cname in common.code_writers[language].obj_builders else: # xrc is special... xrcgen = common.code_writers['XRC'] ok = xrcgen.obj_builders.get(cname, None) is not xrcgen.NotImplementedXrcObject if not ok: self._logger.warn( _('No %s code generator for %s (of type %s) available'), misc.capitalize(language), widget.name, cname ) else: # in this case, we check all the widgets in the tree def check_rec(node): if node.widget is not None: self.check_codegen(node.widget) if node.children: for c in node.children: check_rec(c) if common.app_tree.root.children: for c in common.app_tree.root.children: check_rec(c) def _update_output_path(self, language): "Update wildcards and default extension in the generic file and directory dialog (L{FileDirDialog})." prop = self.properties["output_path"] prop.message = _("Select output file") if self.multiple_files else _("Select output directory") ext = getattr(common.code_writers[language], 'default_extensions', []) wildcards = [] for e in ext: wildcards.append( _('%s files (*.%s)|*.%s') % (misc.capitalize(language), e, e) ) wildcards.append(_('All files|*')) prop.wildcards = '|'.join(wildcards) prop.default_extension = '.%s' % ext[0] if ext else None def popup_menu(self, event, pos=None): # right click event -> expand all or show context menu expanded = True for child_node in common.app_tree.root.children or []: if not common.app_tree.IsExpanded(child_node.item) and child_node.children: expanded = False break if not expanded: # -> expand all common.app_tree.ExpandAll() return # already expanded -> show context menu event_widget = event.GetEventObject() menu = self._create_popup_menu(widget=event_widget) if pos is None: # convert relative event position to relative widget position event_pos = event.GetPosition() screen_pos = event_widget.ClientToScreen(event_pos) pos = event_widget.ScreenToClient(screen_pos) event_widget.PopupMenu(menu, pos=pos) menu.Destroy() def _create_popup_menu(self, widget): menu = misc.wxGladePopupMenu("Application") i = misc.append_menu_item( menu, -1, _('Generate Code') ) misc.bind_menu_item_after(widget, i, self.generate_code) # a property, but it can be called return menu def check_drop_compatibility(self): return (False, "Only toplevel widgets can be added here; click Frame or Dialog icon to do so") def check_compatibility(self, widget, typename=None): if getattr(widget, "_is_toplevel", False) or typename=="window": return (True, None) return (False, "Only toplevel widgets can be pasted here (e.g. Frame or Dialog)") def clipboard_paste(self, clipboard_data): "Insert a widget from the clipboard to the current destination" import clipboard return clipboard._paste(None, None, 0, clipboard_data) wxGlade-0.9.4/bugdialog.py000066400000000000000000000106371352706171500154440ustar00rootroot00000000000000"""\ Dialog to show details of internal errors. @copyright: 2014-2016 Carsten Grohmann @copyright: 2017 Dietmar Schwertberger @license: MIT (see LICENSE.txt) - THIS PROGRAM COMES WITH NO WARRANTY """ import bugdialog_ui import config import log import logging import sys import wx class BugReport(bugdialog_ui.UIBugDialog): "Dialog to show details of internal errors" _disabled = False # Flag to prevent dialog popups during test runs. def __init__(self): self._disabled = getattr(sys, '_called_from_test', False) bugdialog_ui.UIBugDialog.__init__(self, None, -1, "") def SetContent(self, msg, exc): """Prepare given exception information and show it as dialog content. msg: Short description of the action that has raised this error exc: Caught exception (Exception instance) see: SetContentEI()""" if self._disabled: return exc_type = exc.__class__.__name__ exc_msg = str(exc) header = self.st_header.GetLabel() % {'action': msg} log.exception_orig(header) self._fill_dialog(exc_msg, exc_type, header) def SetContentEI(self, exc_type, exc_value, exc_tb, msg=_('An internal error occurred')): """Format given exception and add details to dialog. exc_type: Exception type exc_value: Exception value exc_tb: Exception traceback msg: Short description of the exception see: SetContent()""" if self._disabled: return # don't use exception() because it overwrites exc_info with 1 logging.error(msg, exc_info=(exc_type, exc_value, exc_tb)) self._fill_dialog(msg, exc_type, _('An internal error occurred')) def _fill_dialog(self, exc_msg, exc_type, header): """Fill the bug dialog exc_msg: Short exception summary exc_type: Exception type as string header: Initial message see: L{SetContent(), SetContentEI()""" details = log.getBufferAsString() if not exc_msg: exc_msg = _('No summary available') summary = self.st_summary.GetLabel() % { 'exc_type':exc_type, 'exc_msg':exc_msg } self.st_header.SetLabel(header) self.st_summary.SetLabel(summary) self.tc_details.SetValue(details) howto = self.tc_howto_report.GetValue() howto = howto % {'log_file': config.log_file} self.tc_howto_report.SetValue(howto) def OnCopy(self, event): "Copy the dialog content to the clipboard" text = self.tc_details.GetValue() if not text: return data = wx.TextDataObject(text) if wx.TheClipboard.Open(): wx.TheClipboard.SetData(data) wx.TheClipboard.Close() else: wx.MessageBox("Unable to open the clipboard", "Error") def ShowModal(self, **kwargs): if getattr(sys, '_called_from_test', False): return wx.ID_OK super(BugReport, self).ShowModal(**kwargs) def Show(msg, exc): """Wrapper for creating a L{BugReport} dialog and show the details of the given exception instance. msg: Short description of the action that has raised this error exc: Caught exception see ShowEI(), BugReport.SetContent()""" dialog = BugReport() dialog.SetContent(msg, exc) dialog.ShowModal() dialog.Destroy() def ShowEI(exc_type, exc_value, exc_tb, msg=None): """Wrapper for creating a L{BugReport} dialog and show the given exception details. exc_type: Exception type exc_value: Exception value exc_tb: Exception traceback msg: Short description of the exception see: L{Show(), BugReport.SetContent()""" dialog = BugReport() dialog.SetContentEI(exc_type, exc_value, exc_tb, msg) dialog.ShowModal() dialog.Destroy() def ShowEnvironmentError(msg, inst): """Show EnvironmentError exceptions detailed and user-friendly msg: Error message inst: The caught exception""" details = {'msg':msg, 'type':inst.__class__.__name__} if inst.filename: details['filename'] = _('Filename: %s') % inst.filename if inst.errno is not None and inst.strerror is not None: details['error'] = '%s - %s' % (inst.errno, inst.strerror) else: details['error'] = str(inst.args) text = _("""%(msg)s Error type: %(type)s Error code: %(error)s %(filename)s""") % details wx.MessageBox(text, _('Error'), wx.OK | wx.CENTRE | wx.ICON_ERROR) wxGlade-0.9.4/bugdialog_ui.py000077500000000000000000000116221352706171500161370ustar00rootroot00000000000000# -*- coding: UTF-8 -*- # # generated by wxGlade 0.9.0b3 on Mon Jan 7 18:55:35 2019 # import wx import gettext import compat class UIBugDialog(wx.Dialog): def __init__(self, *args, **kwds): # begin wxGlade: UIBugDialog.__init__ kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER wx.Dialog.__init__(self, *args, **kwds) self.SetSize((600, 400)) self.notebook_1 = wx.Notebook(self, wx.ID_ANY, style=wx.NB_BOTTOM) self.nb1_pane_summary = wx.Panel(self.notebook_1, wx.ID_ANY) self.st_header = wx.StaticText(self.nb1_pane_summary, wx.ID_ANY, _("An internal error occurred while %(action)s")) self.st_summary = wx.StaticText(self.nb1_pane_summary, wx.ID_ANY, _("Error type: %(exc_type)s\nError summary: %(exc_msg)s")) self.st_report = wx.StaticText(self.nb1_pane_summary, wx.ID_ANY, _("This is a bug - please report it.")) self.nb1_pane_details = wx.Panel(self.notebook_1, wx.ID_ANY) self.st_details = wx.StaticText(self.nb1_pane_details, wx.ID_ANY, _("Error details:")) self.tc_details = wx.TextCtrl(self.nb1_pane_details, wx.ID_ANY, "", style=wx.TE_MULTILINE) self.notebook_1_pane_1 = wx.Panel(self.notebook_1, wx.ID_ANY) self.tc_howto_report = wx.TextCtrl(self.notebook_1_pane_1, wx.ID_ANY, _("Writing a helpful bug report is easy if you follow some hints. The items below should help you to integrate useful information. They are not an absolute rule - it's more like a guideline.\n\n- What did you do? Maybe you want to include a screenshot.\n- What did you want to happen?\n- What did actually happen?\n- Provide a short example to reproduce the issue.\n- Include the internal error log file %(log_file)s if required.\n\nPlease open a new bug in the wxGlade bug tracker https://github.com/wxGlade/wxGlade/issues/ .\nAlternatively you can send the bug report to the wxGlade mailing list wxglade-general@lists.sourceforge.net. Keep in mind that you need a subscription for sending emails to this mailing list.\nThe subscription page is at https://sourceforge.net/projects/wxglade/lists/wxglade-general ."), style=wx.TE_MULTILINE | wx.TE_READONLY) self.static_line_1 = wx.StaticLine(self, wx.ID_ANY) self.btn_copy = wx.Button(self, wx.ID_COPY, "") self.btn_ok = wx.Button(self, wx.ID_OK, "") self.__set_properties() self.__do_layout() self.Bind(wx.EVT_BUTTON, self.OnCopy, self.btn_copy) # end wxGlade def __set_properties(self): # begin wxGlade: UIBugDialog.__set_properties self.SetTitle(_("Error Dialog")) self.SetSize((600, 400)) self.SetFocus() self.tc_details.SetFont(wx.Font(10, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, "")) self.tc_howto_report.SetFont(wx.Font(10, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, "")) compat.SetToolTip( self.btn_copy, _("Copy error details to clipboard") ) self.btn_ok.SetDefault() # end wxGlade def __do_layout(self): # begin wxGlade: UIBugDialog.__do_layout grid_sizer_1 = wx.FlexGridSizer(3, 1, 0, 0) sizer_2 = wx.BoxSizer(wx.HORIZONTAL) sizer_3 = wx.BoxSizer(wx.HORIZONTAL) grid_sizer_2 = wx.FlexGridSizer(2, 1, 0, 0) sizer_1 = wx.BoxSizer(wx.HORIZONTAL) grid_sizer_3 = wx.FlexGridSizer(3, 1, 0, 0) grid_sizer_3.Add(self.st_header, 1, wx.ALL | wx.EXPAND, 5) grid_sizer_3.Add(self.st_summary, 1, wx.ALL | wx.EXPAND, 5) grid_sizer_3.Add(self.st_report, 1, wx.ALL | wx.EXPAND, 5) grid_sizer_3.AddGrowableCol(0) sizer_1.Add(grid_sizer_3, 1, wx.EXPAND, 0) self.nb1_pane_summary.SetSizer(sizer_1) grid_sizer_2.Add(self.st_details, 0, wx.ALL | wx.EXPAND, 5) grid_sizer_2.Add(self.tc_details, 1, wx.ALL | wx.EXPAND, 5) self.nb1_pane_details.SetSizer(grid_sizer_2) grid_sizer_2.AddGrowableRow(1) grid_sizer_2.AddGrowableCol(0) sizer_3.Add(self.tc_howto_report, 1, wx.ALL | wx.EXPAND, 5) self.notebook_1_pane_1.SetSizer(sizer_3) self.notebook_1.AddPage(self.nb1_pane_summary, _("Error Summary")) self.notebook_1.AddPage(self.nb1_pane_details, _("Error Details")) self.notebook_1.AddPage(self.notebook_1_pane_1, _("How to Report a Bug")) grid_sizer_1.Add(self.notebook_1, 1, wx.ALL | wx.EXPAND, 5) grid_sizer_1.Add(self.static_line_1, 0, wx.ALL | wx.EXPAND, 5) sizer_2.Add(self.btn_copy, 0, wx.ALIGN_RIGHT | wx.ALL, 5) sizer_2.Add(self.btn_ok, 0, wx.ALIGN_RIGHT | wx.ALL, 5) grid_sizer_1.Add(sizer_2, 1, wx.ALIGN_RIGHT, 0) self.SetSizer(grid_sizer_1) grid_sizer_1.AddGrowableRow(0) grid_sizer_1.AddGrowableCol(0) self.Layout() self.Centre() # end wxGlade def OnCopy(self, event): # wxGlade: UIBugDialog. print("Event handler 'OnCopy' not implemented!") event.Skip() # end of class UIBugDialog wxGlade-0.9.4/clipboard.py000066400000000000000000000275131352706171500154470ustar00rootroot00000000000000""" Support for cut & paste of wxGlade widgets @copyright: 2002-2007 Alberto Griggio @copyright: 2016 Carsten Grohmann @copyright: 2016-2018 Dietmar Schwertberger @license: MIT (see LICENSE.txt) - THIS PROGRAM COMES WITH NO WARRANTY """ import logging, sys, os.path import compat, common, config, misc import edit_sizers import wx # Format used by wxGlade for the clipboard. if compat.IS_CLASSIC: DataFormat = wx.CustomDataFormat else: DataFormat = wx.DataFormat widget_data_format = DataFormat("wxglade.widget") # a serialized widget sizer_data_format = DataFormat("wxglade.sizer") # a serialized sizer window_data_format = DataFormat("wxglade.window") # a toplevel window _current_drag_source = None # reference to drag start; used when dragging within application def set_drag_source(widget=None): # to be called when a drag operation starts or ends global _current_drag_source _current_drag_source = widget def begin_drag(window, widget): do = get_data_object(widget) set_drag_source(widget) if isinstance(widget, edit_sizers.Sizer): msg = "Move sizer to empty or populated slot to insert, to a sizer to append; hold Ctrl to copy" elif widget._is_toplevel: msg = "Move window to application object; hold Ctrl to copy" else: msg = "Move control to empty or populated slot to insert, to a sizer to append; hold Ctrl to copy" common.main.user_message( msg ) drop_source = wx.DropSource(window) drop_source.SetData(do) drop_source.DoDragDrop(True) set_drag_source(None) class DropTarget(wx.DropTarget): # widget drag & drop support; for tree and also for the design window def __init__(self, window, toplevel=False): wx.DropTarget.__init__(self) self.window = window # window should have methods: check_drop_compatibility, drop self._create_data_objects(toplevel) self.SetDataObject(self.data_object) self._last_check = None # will be set to x,y,result if a compatibility check was done self.fmt = None # the received format def _create_data_objects(self, toplevel=False): data_objects = {} data_object = wx.DataObjectComposite() formats = [widget_data_format, sizer_data_format] if toplevel: formats.append(window_data_format) for fmt in formats: do = wx.CustomDataObject(fmt) data_objects[fmt.GetId()] = do data_object.Add(do) self.data_objects = data_objects self.data_object = data_object def _get_received_format(self): if self.fmt is None: # unfortunately, there seems to be no way to identify the data format without actually receiving the data self.GetData() self.fmt = self.data_object.GetReceivedFormat().GetId() return self.fmt def _check_compatibility(self, x,y): # check whether the dragged item is compatible to the widget at position (x,y) widget = self.window.find_widget_by_pos(x,y) if widget is None: return (False, "No widget found") if not widget.is_sizer and not widget._is_toplevel and getattr(widget,"sizer",None): # for a toplevel window, sizer is the child if widget.sizer._IS_GRIDBAG and not isinstance(widget, edit_sizers.SizerSlot): # for GridBagSizer we have cells, so we don't shift items return (False, "Can only paste into empty slots") if _current_drag_source is not None: # drag within application: avoid dragging of an item on itself or it's child if widget.node is _current_drag_source.node: return (False, "Can't paste item on itself") if widget.node.has_ancestor(_current_drag_source.node): return (False, "Can't paste item into itself") return widget.check_compatibility(_current_drag_source) # drag from outside fmt = self._get_received_format().split(".")[-1] return widget.check_compatibility(None, fmt) def OnDragOver(self, x,y, default): # continuously called while the mouse is over the target should return the desired operation or wx.DragNone # check only if position changed if not self._last_check or x!=self._last_check[0] or y!=self._last_check[1]: self._last_check = (x,y, self._check_compatibility(x, y)[0] ) return self._last_check[2] and default or wx.DragNone def OnData(self, x,y,default): compatible, message = self._check_compatibility(x,y) if not compatible: return wx.DragCancel dst_widget = self.window.find_widget_by_pos(x,y) if _current_drag_source: src_widget = _current_drag_source # was set in begin_drag src_node = src_widget.node copy = (default==wx.DragCopy) if not copy and _current_drag_source is misc.focused_widget: if hasattr(_current_drag_source, "parent"): misc.set_focused_widget(_current_drag_source.parent) elif hasattr(_current_drag_source, "window"): # a sizer misc.set_focused_widget(_current_drag_source.window) if compatible=="AddSlot": # dropped on a sizer -> add slot dst_widget._add_slot() dst_widget.layout() dst_widget = dst_widget.children[-1] # the slot elif compatible=="Slot": # insert a slot or fill empty slot pos = dst_widget.pos dst_widget.sizer._insert_slot(pos) dst_widget = dst_widget.sizer.children[pos] # the slot if not hasattr(dst_widget, "clipboard_paste"): return wx.DragCancel # use cut and paste functionality from clipboard to do the actual work ######################################### fmt = self._get_received_format() data = self.data_objects[fmt].GetData() # the data as string self.fmt = None if wx.Platform=="__WXMAC__": # delay action, as otherwise there will be a segmentation fault; 50ms seems to be enough wx.CallLater(50, self._OnData, _current_drag_source, src_widget, dst_widget, data, copy) else: wx.CallAfter(self._OnData, _current_drag_source, src_widget, dst_widget, data, copy) return default def _OnData(self, drag_source, src_widget, dst_widget, data, copy): if drag_source and not copy: with src_widget.frozen(): src_widget.remove() dst_widget.clipboard_paste(data) else: dst_widget.clipboard_paste(data) common.app_tree.expand(dst_widget.node) def OnLeave(self): self.fmt = None def get_data_object(widget): data = dump_widget(widget) # make a data object if isinstance(widget, edit_sizers.Sizer): do = wx.CustomDataObject(sizer_data_format) elif getattr(widget, "_is_toplevel", False): do = wx.CustomDataObject(window_data_format) else: do = wx.CustomDataObject(widget_data_format) do.SetData(data) cdo = wx.DataObjectComposite() cdo.Add(do) if widget.name: cdo.Add(wx.TextDataObject(widget.name), True) # the widget name as text, preferred return cdo def dump_widget(widget): "build the XML string and pickle it together with the layout properties" xml_unicode = [] widget.node.write(xml_unicode, 0) flag = option = span = border = None flag = widget.properties.get("flag") if flag is not None: flag = flag.get_string_value() proportion = getattr(widget, "proportion", 0) span = getattr(widget, "span", (1,1)) border = getattr(widget, "border", 0) return widget2clipboard( proportion, span, flag, border, "".join(xml_unicode) ) def widget2clipboard(option, span, flag, border, xml_unicode): """Pickle all parameter to store them as a string in the clipboard. option, flag, border: widget layout properties xml_unicode: XML representation of this widget""" clipboard_data = compat.pickle.dumps((option, span, flag, border, xml_unicode)) return clipboard_data def clipboard2widget(clipboard_data): """Convert widget data prepared in widget2clipboard() back to single values. Returns a list [option (proportions), flag, border and widget in XML representation]""" if isinstance(clipboard_data, memoryview) and sys.version_info[0]<3: clipboard_data = clipboard_data.tobytes() option, span, flag, border, xml_unicode = compat.pickle.loads(clipboard_data) # remove the dirt at the end of XML representation bound = xml_unicode.rfind('>') + 1 xml_unicode = xml_unicode[:bound] # option, flag and border are integers. if option is not None: option = int(option) if border is not None: border = int(border) return option, span, flag, border, xml_unicode def copy(widget): "Store a widget copy into the clipboard; returns True on success" if not wx.TheClipboard.Open(): return False try: wdo = get_data_object(widget) return wx.TheClipboard.SetData(wdo) finally: wx.TheClipboard.Close() def cut(widget): "Store a copy of self into the clipboard and delete the widget; returns True on success" if copy(widget): widget.remove() return True else: return False #def paste(parent, sizer, pos, clipboard_data=None): def paste(widget): """Copies a widget (and all its children) from the clipboard to the given destination (parent, sizer and position inside the sizer). Returns True on success.""" error = None if not wx.TheClipboard.Open(): misc.error_message( "Clipboard can't be opened." ) return False try: data_object = None for fmt in [widget_data_format,sizer_data_format,window_data_format]: if wx.TheClipboard.IsSupported(fmt): data_object = wx.CustomDataObject(fmt) break if data_object is None: misc.info_message( "The clipboard doesn't contain wxGlade widget data." ) return False if not wx.TheClipboard.GetData(data_object): misc.error_message( "Data can't be copied from clipboard." ) return False finally: wx.TheClipboard.Close() format_name = data_object.GetFormat().GetId().split(".")[1] # e.g. 'wxglade.widget' -> 'widget' compatible, message = widget.check_compatibility(None, format_name) if not compatible: wx.Bell() if message: misc.error_message(message) return False if not widget.clipboard_paste(data_object.GetData()): misc.error_message("Paste failed") def _paste(parent, sizer, pos, clipboard_data): "parse XML and insert widget" option, span, flag, border, xml_unicode = clipboard2widget( clipboard_data ) if not xml_unicode: return False import xml_parse try: wx.BeginBusyCursor() # widget representation is still unicode, but parser need UTF8 xml_utf8 = xml_unicode.encode('utf8') parser = xml_parse.ClipboardXmlWidgetBuilder(parent, sizer, pos, option, span, flag, border) with parent and parent.frozen() or misc.dummy_contextmanager(): parser.parse_string(xml_utf8) common.app_tree.saved = False return True # Widget hierarchy pasted. except xml_parse.XmlParsingError: if config.debugging: raise return False finally: wx.EndBusyCursor() def check(*formats): "check whether wxglade formats are on the clipboard" if not wx.TheClipboard.IsOpened(): try: wx.TheClipboard.Open() if "widget" in formats and wx.TheClipboard.IsSupported(widget_data_format): return True if "window" in formats and wx.TheClipboard.IsSupported(window_data_format): return True if "sizer" in formats and wx.TheClipboard.IsSupported(sizer_data_format): return True finally: wx.TheClipboard.Close() return False wxGlade-0.9.4/codegen/000077500000000000000000000000001352706171500145325ustar00rootroot00000000000000wxGlade-0.9.4/codegen/__init__.py000066400000000000000000002350251352706171500166520ustar00rootroot00000000000000"""Common code used by all code generators @copyright: 2011-2016 Carsten Grohmann @copyright: 2017 Dietmar Schwertberger @license: MIT (see LICENSE.txt) - THIS PROGRAM COMES WITH NO WARRANTY """ import copy, logging, os, os.path, random, re, sys, time import common, config, compat, errors, misc import new_properties as np import wcodegen def _replace_tag(lst, tag, content): ret = False add_line = False if not tag in lst and not tag.endswith("\n"): tag = tag + "\n" add_line = True while True: try: idx = lst.index(tag) except ValueError: return ret if isinstance(content, list): if add_line: lst[idx:idx+1] = content + ["\n"] else: lst[idx:idx+1] = content elif isinstance(content, compat.basestring): if add_line: lst[idx] = content + "\n" else: lst[idx] = content else: raise ValueError("Internal error") ret = True class BaseSourceFileContent(object): """Keeps info about an existing file that has to be updated, to replace only the lines inside a wxGlade block, an to keep the rest of the file as it was Attributers to be defined in derived classes: rec_block_start: Regexp to match the begin of a wxglade block rec_block_end: Regexp to match the end of a wxGlade block rec_class_decl: Regexp to match class declarations rec_event_handler: Regexp to match event handlers""" def __init__(self, name, code_writer): # initialise instance logger self._logger = logging.getLogger(self.__class__.__name__) # initialise instance self.classes = {} # Classes declared in the file self.class_name = None # Name of the current processed class self.content = [] # Content of the source file, if it existed before this session of code gen. self.event_handlers = {} # List of event handlers for each class self.name = name # Name of the file self.new_classes = [] # New classes to add to the file (they are inserted BEFORE the old ones) self.new_classes_inserted = False # Flag if the placeholder for new classes has been inserted in file already self.code_writer = code_writer # Reference to the parent code writer object (BaseLangCodeWriter instance) self.spaces = {} # Indentation level for each class self.nonce = code_writer.nonce self.out_dir = code_writer.out_dir self.multiple_files = code_writer.multiple_files if not self.content: self.build_untouched_content() def replace(self, tag, content): return _replace_tag(self.content, tag, content) def build_untouched_content(self): """Builds a string with the contents of the file that must be left as is, and replaces the wxGlade blocks with tags that in turn will be replaced by the new wxGlade blocks""" self.class_name = None self.new_classes_inserted = False def format_classname(self, class_name): "Format class name read from existing source file; may be overwritten in derived class" return class_name def is_end_of_class(self, line): "True if the line is the marker for class end" return line.strip().startswith('# end of class ') def is_import_line(self, line): "True if the line imports wx; may be overwritten in derived class" return False def _load_file(self, filename): "Load a file and return the content. The read source file will be decoded to unicode automatically." # Separated for debugging purposes lines = common._read_file(filename) encoding = self.code_writer.app_encoding if encoding: try: lines = [line.decode(encoding) for line in lines] except UnicodeDecodeError: raise errors.WxgReadSourceFileUnicodeError(filename) return lines def __getstate__(self): state = self.__dict__.copy() del state['_logger'] return state def __setstate__(self, state): self.__dict__.update(state) # re-initialise logger instance deleted from __getstate__ self._logger = logging.getLogger(self.__class__.__name__) class BaseWidgetHandler(object): "Interface the various code generators for the widgets must implement" import_modules = [] # List of modules to import (eg. ['use Wx::Grid;\n']) def __init__(self): "Initialise instance variables" self.import_modules = [] def get_code(self, obj): """Handler for normal widgets (non-toplevel): returns 3 lists of strings, init, properties and layout, that contain the code for the corresponding methods of the class to generate""" return [], [], [] def get_properties_code(self, obj): """Handler for the code of the set_properties method of toplevel objects. Returns a list of strings containing the code to generate""" return [] def get_init_code(self, obj): """Handler for the code of the constructor of toplevel objects. Returns a list of strings containing the code to generate. Usually the default implementation is ok (i.e. there are no extra lines to add). The generated lines are appended at the end of the constructor.""" return [] def get_layout_code(self, obj): """Handler for the code of the do_layout method of toplevel objects. Returns a list of strings containing the code to generate. Usually the default implementation is ok (i.e. there are no extra lines to add).""" return [] class ClassLines(object): "Stores the lines of source code for a custom class" def __init__(self): self.child_order = [] self.dependencies = {} # Names of the modules this class depends on self.deps = [] self.event_handlers = [] # Lines to bind events (see L{wcodegen.BaseWidgetWriter.get_event_handlers()}) self.extra_code = [] # Extra code to output before this class self.done = False # If True, the code for this class has already been generated self.init = [] # Lines of code to insert in the __init__ method (for children widgets) self.init_lines = {} self.layout = [] # Lines to insert in the __do_layout method self.parents_init = [] # Lines to insert in the __init__ for container widgets (panels, splitters, ...) self.props = [] # Lines to insert in the __set_properties method self.sizers_init = [] # Lines related to sizer objects declarations class BaseLangCodeWriter(wcodegen.BaseCodeWriter): """Dictionary of objects used to generate the code in a given language. A code writer object *must* implement those interface and set those variables: - init_lang(), init_files(), finalize() - wcodegen.BaseLanguageMixin.language - add_app(), add_class(), add_object() - add_property_handler() - add_sizeritem(} - add_widget_handler() - generate_code_background(), generate_code_font(), generate_code_foreground() - generate_code_id() - generate_code_size() - format_generic_access() - _code_statements A code writer object *could* implement those interfaces and set those variables: - setup() - quote_str(), quote_path() - wcodegen.BaseLanguageMixin.cn() - wcodegen.BaseLanguageMixin.cn_f() app_name: Application name app_encoding: Encoding of the application; will be initialised with config.default_encoding app_filename: File name to store the application start code within multi file projects app_mapping: Default mapping of template variables for substituting in templates (see lang_mapping, add_app()) lang_mapping: Language specific mapping of template variables for substituting in templates (see app_mapping, add_app()) for_version: wx version we are generating code for (e.g. (2, 8) ) blacklisted_widgets: Don't add those widgets to sizers because they are not supported for the requested wx version or there is no code generator available. classes: Dictionary that maps the lines of code of a class to the name of such class: the lines are divided in 3 categories: '__init__', '__set_properties' and '__do_layout' dependencies: Module dependencies of all classes header_lines: Lines common to all the generated files (import of wxCL, ...) curr_tab: Current indentation level indent_amount: An indentation level is indent_symbol*indent_amount; will be initialised with config.default_indent_amount indent_symbol: Character to use for indentation; will be initialised with L{config.default_indent_symbol} nonce: Random number used to be sure that the replaced tags in the sources are the right ones (see BaseSourceFileContent, add_class and create_nonce) obj_builders: "writers" for the various objects obj_properties: "property writer" functions, used to set the properties of a toplevel object out_dir: If not None, it is the directory inside which the output files are saved output_file: Output string buffer for the code output_file_name: Name of the output file multiple_files: If True, generate a file for each custom class previous_source: If not None, it is an instance of BaseSourceFileContent that keeps info about the previous version of the source to generate _app_added: True after wxApp instance has been generated _current_extra_code: Set of lines for extra code to add to the current file _current_extra_modules: Set of lines of extra modules to add to the current file _overwrite: If True, overwrite any previous version of the source file instead of updating only the wxGlade blocks; will be initialised with config.default_overwrite _property_writers: Dictionary of dictionaries of property handlers specific for a widget; keys are the class names of the widgets (E.g. _property_writers['wxRadioBox'] = {'choices', choices_handler}) _textdomain: gettext textdomain (see _use_gettext) _use_gettext: If True, enable gettext support; will be initialised with config.default_use_gettext _widget_extra_modules: Map of widget class names to a list of extra modules needed for the widget (e.g. C{'wxGrid': 'from wxLisp.grid import *\\n'}).""" _code_statements = {} """Language specific code templates for for small statements. The statements are stored in a dictionary. The property names are the keys. The keys may have one of two different extensions: - "C{_X}" e.g. "C{tooltip_3X}" to generate tooltips source code for wxWidgets 3.x - "C{_}" e.g. "C{wxcolour_28}" to generate source code for wxWidgets 2.8 only The extensions will be evaluated from most specific to generic. Example:: >>> _code_statements = { ... 'disabled': "", ... 'wxcolour_28': "", ... 'tooltip_3': "" } The function _get_code_statement() handles the extensions properly and returns the requested template. see: _get_code_statement(), _generic_code(), generate_code_extraproperties()""" ClassLines = ClassLines classattr_always = [] # List of classes to store always as class attributes; see store_as_attr() class_separator = '' # Separator between class and attribute or between different name space elements; # E.g "." for Python or "->" for Perl. global_property_writers = {} # Custom handlers for widget properties indent_level_func_body = 1 # Indentation level for bodies of class functions. language_note = "" # Language specific notice written into every file header; newline sequence at the end; see save_file name_ctor = '' # Name of the constructor. E.g. "__init__" in Python or "new" in Perl. shebang = None # Shebang line, the first line of the generated main files; newline sequence at the end; see save_file SourceFileContent = None # Just a reference to the language specific instance of SourceFileContent #################################################################################################################### # code generation templates tmpl_encoding = None # Template of the encoding notices; file encoding will be added to the output in save_file() tmpl_block_begin = '%(tab)s%(comment_sign)s begin wxGlade: %(klass)s%(class_separator)s%(function)s\n' tmpl_cfunc_end = '' # Statement to add at the end of a class function. e.g. 'return $self;' for Perl. tmpl_class_end = '' # Statement to add at the end of a class, with 'end of class' marker tmpl_class_end_nomarker='' # same without marker tmpl_ctor_call_layout = '' # Code add to the contructor to call '__do_layout()' and '__set_properties()'. # these statements differ between the various code generators: tmpl_func_empty = '' # Statement for an empty function e.g. "pass" for Python or "return;" for perl tmpl_empty_string = '""' # Template for an empty string. tmpl_name_do_layout = '' # Name of the function __do_layout() in wxGlade begin tag tmpl_func_do_layout = '' # Statement for the __do_layout() function; # -> see generate_code_do_layout(): tmpl_func_event_stub = '' # Statement for a event handler stub -> see generate_code_event_handler()_ tmpl_name_set_properties = '' # Name of the function __set_properties() in wxGlade begin tag tmpl_func_set_properties = '' # Statement for the __set_properties() function # -> see generate_code_set_properties(): # Template of the "generated by ..." message ;see create_generated_by(); save_file() tmpl_generated_by = "%(comment_sign)s %(generated_by)s\n%(comment_sign)s\n" # Template of the overwrite message in all standalone app files; see add_app tmpl_overwrite = "%(comment_sign)s This is an automatically generated file.\n" \ "%(comment_sign)s Manual changes will be overwritten without warning!\n\n" tmpl_sizeritem = '' # Template for adding a widget to a sizer; see add_sizeritem() tmpl_spacersize = '(%s, %s)' # Python and Lisp need the braces tmpl_style = '' # Template for setting style in constructor; see _format_style() tmpl_toplevel_style = '' # same for a toplevel object tmpl_style0 = '' # same for style == 0 tmpl_toplevel_style0 = '' # same for style == 0 # templates used by add_app(): tmpl_appfile = None # file header for standalone files with application start code tmpl_detailed = None # detailed application start code without gettext support tmpl_gettext_detailed = None # detailed application start code with gettext support tmpl_simple = None # simplified application start code without gettext support tmpl_gettext_simple = None # simplified application start code with gettext support _show_warnings = True # Enable or disable printing of warning messages; see self.warning() def __init__(self): "Initialise only instance variables using there defaults" wcodegen.BaseCodeWriter.__init__(self) self.obj_builders = {} self.obj_properties = {} self._property_writers = {} self._init_vars() def _init_vars(self): """Set instance variables (back) to default values during class instantiation (__init__) and before loading new data (new_project()).""" self.app_encoding = config.default_encoding self.app_filename = None self.app_mapping = {} self.app_name = None self.classes = {} self.curr_tab = 0 self.dependencies = {} self.for_version = config.for_version self.header_lines = [] self.indent_symbol = config.default_indent_symbol self.indent_amount = config.default_indent_amount self.is_template = 0 self.blacklisted_widgets = {} self.lang_mapping = {} self.multiple_files = False # this is to be more sure to replace the right tags self.nonce = self.create_nonce() self.out_dir = None self.output_file_name = None self.output_file = None self.previous_source = None self._app_added = False self._current_extra_code = [] self._current_extra_modules = {} self._overwrite = config.default_overwrite self._mark_blocks = True # YYY config.mark_blocks self._textdomain = 'app' self._use_gettext = config.default_use_gettext self._widget_extra_modules = {} def new_project(self, app, out_path=None, preview=False): "Initialise generic and language independent code generator settings; see init_lang(), init_files()" # set (most of) instance variables back to default values self._init_vars() # application name self.app_name = app.name if self.app_name: self.app_filename = '%s.%s' % ( self.app_name, self.default_extensions[0] ) self._textdomain = self.app_name # file encoding self.app_encoding = app.encoding.upper() or config.default_encoding # wx doesn't like latin-1 if self.app_encoding == 'latin-1': self.app_encoding = 'ISO-8859-1' # Indentation symbol and level based on the project options self.indent_symbol = app.properties["indent_mode"].get_string_value() if self.indent_symbol == 'tab': self.indent_symbol = '\t' elif self.indent_symbol == 'space': self.indent_symbol = ' ' else: self.indent_symbol = config.default_indent_symbol self.indent_amount = app.indent_amount if preview: self.multiple_files = False self._overwrite = True self._mark_blocks = False self._use_gettext = False else: self.multiple_files = app.multiple_files self._overwrite = app.overwrite self._mark_blocks = True if self._overwrite else app.mark_blocks self._use_gettext = app.use_gettext if not preview: self.for_version = tuple([int(t) for t in app.for_version.split('.')[:2]]) else: self.for_version = compat.version self.is_template = app.is_template if self.multiple_files: self.out_dir = out_path or config.default_output_path else: self.out_dir = out_path or config.default_output_file self.out_dir = os.path.normpath( os.path.expanduser(self.out_dir.strip()) ) self.preview = preview self.init_lang(app) # call initialisation of language specific settings self.check_values() # check the validity of the set values self.init_files(self.out_dir) # call initialisation of the file handling def init_lang(self, app_attrs): "Initialise language specific settings; overwrite this function in the derived class" raise NotImplementedError def init_files(self, out_path): "Initialise the file handling; outp_path: file or path, depending on self.multiple_files" # You may overwrite this function in the derived class if self.multiple_files: self.previous_source = None if not os.path.isdir(out_path): raise errors.WxgOutputPathIsNotDirectory(out_path) self.out_dir = out_path else: if os.path.isdir(out_path): raise errors.WxgOutputPathIsDirectory(out_path) if not self._overwrite and self._file_exists(out_path): # the file exists, we must keep all the lines not inside a # wxGlade block. NOTE: this may cause troubles if out_path is # not a valid source file, so be careful! self.previous_source = self.SourceFileContent(out_path, self) else: # if the file doesn't exist, create it and write the ``intro'' self.previous_source = None self.output_file = [] self.output_file_name = out_path self.output_file.extend( self.header_lines ) self.output_file.append('<%swxGlade extra_modules>\n' % self.nonce) self.output_file.append('\n') self.output_file.append('<%swxGlade replace dependencies>\n' % self.nonce) self.output_file.append('<%swxGlade replace extracode>\n' % self.nonce) def output_file_replace(self, tag, content): _replace_tag(self.output_file, tag, content) def check_values(self): "Check the validity of the set application values. Raises exceptions for errors; see module errors" # XXX implement without exceptions # Check if the values of use_multiple_files and out_path agree if self.multiple_files: if not os.path.isdir(self.out_dir): raise errors.WxgOutputDirectoryNotExist(self.out_dir) if not os.access(self.out_dir, os.W_OK): raise errors.WxgOutputDirectoryNotWritable(self.out_dir) else: if os.path.isdir(self.out_dir): raise errors.WxgOutputPathIsDirectory(self.out_dir) directory = os.path.dirname(self.out_dir) if directory: if not os.path.isdir(directory): raise errors.WxgOutputDirectoryNotExist(directory) if not os.access(directory, os.W_OK): raise errors.WxgOutputDirectoryNotWritable(directory) # It's not possible to generate code from a template directly if self.is_template: raise errors.WxgTemplateCodegenNotPossible def _generate_code(self, node): # for anything except application.Application import tree obj = node.widget topl = self.toplevel if isinstance(node, tree.SlotNode): # empty sizer slot szr = self.sizers[-1] if not szr._IS_GRIDBAG: self.add_spacer(topl, szr, None) return elif node.widget.classname=="spacer": # add a spacer szr = self.sizers[-1] self.add_spacer(topl, szr, obj, obj.proportion, obj.properties["flag"].get_string_value(), obj.border ) return obj.is_toplevel = node.is_toplevel # this is from the position in the data structure if obj.is_sizer: self.sizers.append(obj) can_be_toplevel = obj.__class__.__name__ in common.toplevels old_class = old_base = None # XXX check for alternatives # classname is used only for 'EditTopLevelScrolledWindow' vs. 'EditTopLevelPanel' classname = getattr(obj, '_classname', obj.__class__.__name__) base = common.class_names[classname] if base!=obj.base: old_base = obj.base obj.base = base if (not self.toplevels or obj.klass != obj.base) and can_be_toplevel: obj.is_toplevel = True # for panel objects, if the user sets a custom class but (s)he doesn't want the code to be generated... if obj.check_prop("no_custom_class") and obj.no_custom_class and not self.preview: obj.is_toplevel = False elif self.preview and not can_be_toplevel and obj.base != 'CustomWidget': # if this is a custom class, but not a toplevel one, for the preview we have to use the "real" class # CustomWidgets handle this in a special way (see widgets/custom_widget/codegen.py) old_class = obj.properties["klass"].get() obj.properties["klass"].set(obj.base) # XXX handle this in a different way if obj.is_toplevel: # XXX as long as generate_code is called with self.toplevels.append(obj) # children first for c in node.children or []: self._generate_code(c) # clean up stacks if obj.is_toplevel: del self.toplevels[-1] if obj.is_sizer: del self.sizers[-1] # then the item if obj.is_toplevel and not obj.is_sizer: # XXX as long as generate_code is called with self.add_class(obj) if self.toplevels: self.add_object(obj) # check whether the object belongs to some sizer; if applicable, add it to the sizer at the top of the stack parent = node.parent.widget if parent.is_sizer: flag = obj.properties["flag"].get_string_value() # as string, joined with "|" self.add_sizeritem(topl, parent, obj, obj.proportion, flag, obj.border) # XXX handle this in a different way if old_class is not None: obj.properties["klass"].set(old_class) if old_base is not None: obj.base = old_base def generate_code(self, root, widget=None): # root must be application.Application instance for now self.class_names = {} self.toplevels = [] self.sizers = [] for c in root.children or []: if widget is not None and c is not widget.node: continue # for preview self._generate_code(c) #if isinstance(root, application.Application): topwin = [c.widget for c in root.children if c.widget.name==root.widget.top_window] if topwin: topwin = topwin[0] elif root.children: topwin = root.children[0].widget else: topwin = None self.add_app(root.widget, topwin) @property def toplevel(self): return self.toplevels and self.toplevels[-1] or None def finalize(self): "Code generator finalization function" if self.previous_source: # insert all the new custom classes inside the old file if self.previous_source.new_classes: code = "".join(self.previous_source.new_classes) else: code = "" self.previous_source.replace( '<%swxGlade insert new_classes>' % self.nonce, code ) code = "".join(sorted(self._current_extra_modules.keys())) self.previous_source.replace( '<%swxGlade extra_modules>\n' % self.nonce, code ) # module dependencies of all classes dep_list = sorted( self.dependencies.keys() ) code = self._tagcontent('dependencies', dep_list) self.previous_source.replace( '<%swxGlade replace dependencies>' % self.nonce, code ) # extra code (see the 'extracode' property of top-level widgets) code = self._tagcontent( 'extracode', self._current_extra_code ) self.previous_source.replace( '<%swxGlade replace extracode>' % self.nonce, code ) # now remove all the remaining <123415wxGlade ...> tags from the source: # this may happen if we're not generating multiple files, and one of the container class names is changed self._content_notfound( self.previous_source ) self._remove_tag_re(self.previous_source, r'<%swxGlade event_handlers \w+>') # write the new file contents to disk content = "".join(self.previous_source.content) self.save_file( self.previous_source.name, content, content_only=True ) elif not self.multiple_files: code = "".join(sorted(self._current_extra_modules.keys())) self.output_file_replace( '<%swxGlade extra_modules>\n' % self.nonce, code ) # module dependencies of all classes dep_list = sorted( self.dependencies.keys() ) code = self._tagcontent('dependencies', dep_list) self.output_file_replace( '<%swxGlade replace dependencies>' % self.nonce, code ) # extra code (see the 'extracode' property of top-level widgets) code = self._tagcontent('extracode', self._current_extra_code) self.output_file_replace( '<%swxGlade replace extracode>' % self.nonce, code ) self.save_file(self.output_file_name, self.output_file, self._app_added) self.output_file = None def clean_up(self, root): pass def add_app(self, app, top_win): """Generates the code for a wxApp instance. If the file to write into already exists, this function does nothing. If gettext support is requested and there is not template with gettext support but there is a template without gettext support, template without gettext support will be used. This fallback mechanism works bidirectional. L{app_mapping} will be reset to default values and updated with L{lang_mapping}. see: tmpl_appfile, tmpl_detailed, tmpl_gettext_detailed, tmpl_simple, tmpl_gettext_simple, app_mapping, lang_mapping""" if not self.multiple_files: prev_src = self.previous_source else: # overwrite apps file always prev_src = None # do nothing if the file exists if prev_src: return klass = app.klass # top window and application name are mandatory if not app.top_window: return # get and fill language dependent template tmpl = self._get_app_template(app, top_win) if not tmpl: return self._app_added = True # map to substitute template variables self.app_mapping = {'comment_sign': self.comment_sign, 'header_lines': ''.join(self.header_lines), 'klass': self.cn_class(klass), 'name': self.app_name, 'overwrite': self.tmpl_overwrite % {'comment_sign': self.comment_sign}, 'tab': self.tabs(1), 'textdomain': self._textdomain, 'top_win_class': self.cn_class(top_win and top_win.klass or None), 'top_win_module': top_win and top_win.klass.replace('::', '_'), 'top_win': app.top_window } # extend default mapping with language specific mapping if self.lang_mapping: self.app_mapping.update(self.lang_mapping) code = tmpl % self.app_mapping if self.multiple_files: filename = os.path.join(self.out_dir, self.app_filename) code = "%s%s" % ( self.tmpl_appfile % self.app_mapping, code ) # write the wxApp code self.save_file(filename, [code], True) else: self.output_file.append(code) def add_class(self, code_obj): """Add class behaves very differently for XRC output than for other languages (i.e. python): since custom classes are not supported in XRC, this has effect only for true toplevel widgets, i.e. frames and dialogs. For other kinds of widgets, this is equivalent to add_object""" # shortcuts base = code_obj.base klass = code_obj.klass if klass in self.classes and self.classes[klass].done: return # the code has already been generated if self.multiple_files: # let's see if the file to generate exists, and in this case create a SourceFileContent instance filename = self._get_class_filename(klass) if self._overwrite or not self._file_exists(filename): prev_src = None else: prev_src = self.SourceFileContent(filename, self) self._current_extra_modules = {} else: # in this case, previous_source is the SourceFileContent instance # that keeps info about the single file to generate prev_src = self.previous_source try: builder = self.obj_builders[base] mycn = getattr(builder, 'cn', self.cn) mycn_f = getattr(builder, 'cn_f', self.cn_f) except KeyError: self._logger.error('%s', code_obj) # this is an error, let the exception be raised the details are logged by the global exception handler raise if prev_src and klass in prev_src.classes: is_new = False indentation = prev_src.spaces[klass] else: # this class wasn't in the previous version of the source (if any) is_new = True indentation = self.tabs(self.indent_level_func_body) mods = getattr(builder, 'extra_modules', []) if mods: for m in mods: self._current_extra_modules[m] = 1 obuffer = [] if not klass in self.classes: # if the class body was empty, create an empty ClassLines self.classes[klass] = self.ClassLines() # collect all event handlers event_handlers = self.classes[klass].event_handlers for win_id, evt, handler, evt_type in builder.get_event_handlers(code_obj): event_handlers.append((win_id, mycn(evt), handler, evt_type)) # try to see if there's some extra code to add to this class if not self.preview: extra_code = getattr(builder, 'extracode', getattr(code_obj, 'extracode', "") or "") if extra_code and not extra_code in self.classes[klass].extra_code: self.classes[klass].extra_code.append(extra_code) # Don't add extra_code to self._current_extra_code here, that is handled later. # Otherwise we'll emit duplicate extra code for frames. tab = indentation # generate code for first constructor stage code_lines = self.generate_code_ctor(code_obj, is_new, tab) obuffer.extend(code_lines) # now check if there are extra lines to add to the constructor if hasattr(builder, 'get_init_code'): for l in builder.get_init_code(code_obj): obuffer.append(tab+l) obuffer.append( self.tmpl_ctor_call_layout % {'tab':tab} ) # generate code for binding events code_lines = self.generate_code_event_bind( code_obj, tab, event_handlers ) obuffer.extend(code_lines) if self._mark_blocks: # end tag obuffer.append( '%s%s end wxGlade\n' % (tab, self.comment_sign) ) # write class function end statement if self.tmpl_cfunc_end and is_new: obuffer.append( self.tmpl_cfunc_end%{'tab':tab} ) # end of ctor generation # replace code inside existing constructor block if prev_src and not is_new: # replace the lines inside the ctor wxGlade block # with the new ones tag = '<%swxGlade replace %s %s>' % (self.nonce, klass, self.name_ctor) if not prev_src.replace(tag, obuffer): # no __init__ tag found, issue a warning and do nothing self.warning( "wxGlade %(ctor)s block not found for %(name)s, %(ctor)s code " "NOT generated" % { 'name': code_obj.name, 'ctor': self.name_ctor } ) obuffer = [] # generate code for __set_properties() code_lines = self.generate_code_set_properties( builder, code_obj, is_new, tab ) obuffer.extend(code_lines) # replace code inside existing __set_properties() function if prev_src and not is_new: # replace the lines inside the __set_properties wxGlade block # with the new ones tag = '<%swxGlade replace %s %s>' % (self.nonce, klass, '__set_properties') if not prev_src.replace(tag, obuffer): # no __set_properties tag found, issue a warning and do nothing self.warning( "wxGlade __set_properties block not found for %s, " "__set_properties code NOT generated" % code_obj.name ) obuffer = [] # generate code for __do_layout() code_lines = self.generate_code_do_layout( builder, code_obj, is_new, tab ) obuffer.extend(code_lines) # replace code inside existing __do_layout() function if prev_src and not is_new: # replace the lines inside the __do_layout wxGlade block with the new ones tag = '<%swxGlade replace %s %s>' % (self.nonce, klass, '__do_layout') if not prev_src.replace(tag, obuffer): # no __do_layout tag found, issue a warning and do nothing self.warning("wxGlade __do_layout block not found for %s, __do_layout code NOT generated"%code_obj.name) # generate code for event handler stubs code_lines = self.generate_code_event_handler( code_obj, is_new, tab, prev_src, event_handlers ) # replace code inside existing event handlers if prev_src and not is_new: tag = '<%swxGlade event_handlers %s>' % (self.nonce, klass) if not prev_src.replace( tag, code_lines ): # no event_handlers tag found, issue a warning and do nothing self.warning( "wxGlade event_handlers block not found for %s, " "event_handlers code NOT generated" % code_obj.name ) else: obuffer.extend(code_lines) # the code has been generated self.classes[klass].done = True # write "end of class" statement if self.tmpl_class_end and self._mark_blocks: obuffer.append( self.tmpl_class_end % { 'klass': self.cn_class(klass), 'comment': self.comment_sign } ) elif self.tmpl_class_end_nomarker: obuffer.append( self.tmpl_class_end_nomarker ) if self.multiple_files: if prev_src: prev_src.replace('<%swxGlade insert new_classes>' % self.nonce, "") # insert the extra modules prev_src.replace( '<%swxGlade extra_modules>\n' % self.nonce, list(self._current_extra_modules.keys()) ) # insert the module dependencies of this class dep_list = list( self.classes[klass].dependencies.keys() ) dep_list.extend(self.dependencies.keys()) dep_list.sort() code = self._tagcontent('dependencies', dep_list) prev_src.replace('<%swxGlade replace dependencies>' % self.nonce, code) prev_src.replace('<%swxGlade replace %s dependencies>' % (self.nonce, klass), code) # for Perl # insert the extra code of this class extra_code = self.classes[klass].extra_code[::-1] code = self._tagcontent('extracode', extra_code) prev_src.replace('<%swxGlade replace extracode>' % self.nonce, code) # store the new file contents to disk self.save_file(filename, prev_src.content, content_only=True) return # create the new source file filename = self._get_class_filename(klass) out = [] # write the common lines out.extend( self.header_lines ) # write the module dependencies for this class dep_list = list( self.classes[klass].dependencies.keys() ) dep_list.extend(self.dependencies.keys()) dep_list.sort() code = self._tagcontent('dependencies', dep_list, True) out.append(code) # insert the extra code of this class code = self._tagcontent( 'extracode', self.classes[klass].extra_code[::-1], True ) out.append(code) # write the class body out.extend( obuffer ) # store the contents to filename self.save_file(filename, out) else: # not self.multiple_files if prev_src: # if this is a new class, add its code to the new_classes list of the SourceFileContent instance if is_new: prev_src.new_classes.append("".join(obuffer)) elif self.classes[klass].extra_code: self._current_extra_code.extend(self.classes[klass].extra_code[::-1]) return else: # write the class body onto the single source file for dep in self.classes[klass].dependencies: self._current_extra_modules[dep] = 1 if self.classes[klass].extra_code: self._current_extra_code.extend(self.classes[klass].extra_code[::-1]) for line in obuffer: self.output_file.append(line) def add_object(self, sub_obj): """Adds the code to build 'sub_obj' to the class body of 'top_obj'; see _add_object_init(), add_object_format_name()""" #sub_obj.name = self._format_name(sub_obj.name) #sub_obj.parent.name = self._format_name(sub_obj.parent.name) # get top level source code object and the widget builder instance klass, builder = self._add_object_init(sub_obj) if not klass or not builder: return try: init, props, layout = builder.get_code(sub_obj) except: self._logger.error('%s', sub_obj) # this is an error, let the exception be raised the details are logged by the global exception handler raise if not sub_obj.is_sizer: # the object is a wxWindow instance if sub_obj.node.children and not sub_obj.is_toplevel: init.reverse() # parents_init will be reversed in the end klass.parents_init.extend(init) else: klass.init.extend(init) if not self.preview: if "extracode_pre" in sub_obj.properties and sub_obj.extracode_pre: init = sub_obj.properties["extracode_pre"].get_lines() + init if "extracode_post" in sub_obj.properties and sub_obj.extracode_post: init += sub_obj.properties["extracode_post"].get_lines() # Add a dependency of the current object on its parent klass.deps.append((sub_obj, sub_obj.parent)) klass.child_order.append(sub_obj) klass.init_lines[sub_obj] = init mycn = getattr(builder, 'cn', self.cn) for win_id, evt, handler, evt_type in builder.get_event_handlers(sub_obj): klass.event_handlers.append( (win_id, mycn(evt), handler, evt_type) ) # try to see if there's some extra code to add to this class if not self.preview: extra_code = getattr(builder, 'extracode', getattr(sub_obj, 'extracode', "") or "" ) if extra_code and not extra_code in klass.extra_code: klass.extra_code.append(extra_code) else: # the object is a sizer klass.sizers_init.extend(init) klass.props.extend(props) klass.layout.extend(layout) if self.multiple_files and (sub_obj.is_toplevel and sub_obj.base != sub_obj.klass): key = self._format_import(sub_obj.klass) klass.dependencies[key] = 1 for dep in getattr(self.obj_builders.get(sub_obj.base), 'import_modules', []): klass.dependencies[dep] = 1 def _add_object_init(self, sub_obj): """Perform some initial actions for L{add_object()} Widgets without code generator or widget that are not supporting the requested wx version are blacklisted at L{blacklisted_widgets}. @return: Top level source code object and the widget builder instance or C{None, None} in case of errors.""" # initialise internal variables first klass = None builder = None # Check for proper source code instance top_obj = self.toplevel if top_obj.klass in self.classes: klass = self.classes[top_obj.klass] else: klass = self.classes[top_obj.klass] = self.ClassLines() # Check for widget builder object try: builder = self.obj_builders[sub_obj.base] except KeyError: # no code generator found: write a comment about it name = getattr(sub_obj, "name", "None") name = self._format_name(name) msg = _('Code for instance "%s" of "%s" not generated: no suitable writer found') % (name, sub_obj.klass ) self._source_warning(klass, msg, sub_obj) self.warning(msg) # ignore widget later too self.blacklisted_widgets[sub_obj] = 1 return None, None # check for supported versions if hasattr(builder, 'is_widget_supported'): is_supported = builder.is_widget_supported(*self.for_version) else: is_supported = True if not is_supported: supported_versions = [misc.format_supported_by(version) for version in builder.config['supported_by']] msg = _('Code for instance "%(name)s" of "%(klass)s" was\n' 'not created, because the widget is not available for wx version %(requested_version)s.\n' 'It is available for wx versions %(supported_versions)s only.') % { 'name': self._format_name(sub_obj.name), 'klass': sub_obj.klass, 'requested_version': str(misc.format_for_version(self.for_version)), 'supported_versions': ', '.join(supported_versions) } self._source_warning(klass, msg, sub_obj) self.warning(msg) # ignore widget later too self.blacklisted_widgets[sub_obj] = 1 return None, None return klass, builder def add_property_handler(self, property_name, handler, widget_name=None): """Sets a function to parse a portion of XML to get the value of the property property_name. If widget_name is not None, the function is called only if the property in inside a widget whose class is widget_name.""" if not widget_name: self.global_property_writers[property_name] = handler else: try: self._property_writers[widget_name][property_name] = handler except KeyError: self._property_writers[widget_name] = {property_name: handler} def add_sizeritem(self, toplevel, sizer, obj, option, flag, border): """Writes the code to add the object 'obj' to the sizer 'sizer' in the 'toplevel' object. All widgets in L{blacklisted_widgets} are ignored; template is self.tmpl_sizeritem""" # don't process widgets listed in blacklisted_widgets if obj in self.blacklisted_widgets: return # the name attribute of a spacer is already formatted ", ". # This string can simply inserted in Add() call. obj_name = self._format_classattr(obj) if toplevel.klass in self.classes: klass = self.classes[toplevel.klass] else: klass = self.classes[toplevel.klass] = self.ClassLines() # check if sizer has to store as a class attribute sizer_name = self._format_classattr(sizer) flag = self.cn_f(flag) or '0' if sizer.klass!="wxGridBagSizer": stmt = self.tmpl_sizeritem % ( sizer_name, obj_name, option, flag, border ) else: pos = sizer._get_row_col(obj.pos) stmt = self.tmpl_gridbagsizeritem % ( sizer_name, obj_name, pos, obj.span, flag, border ) klass.layout.append(stmt) def add_spacer(self, toplevel, sizer, obj=None, proportion=0, flag='0', border=0): # add spacer if toplevel.klass in self.classes: klass = self.classes[toplevel.klass] else: klass = self.classes[toplevel.klass] = self.ClassLines() sizer_name = self._format_classattr(sizer) if obj is not None: size = (obj.width, obj.height) else: size = (0, 0) flag = self.cn_f(flag) or '0' if sizer.klass!="wxGridBagSizer": size = self.tmpl_spacersize%size stmt = self.tmpl_sizeritem % ( sizer_name, size, proportion,flag, border ) else: # GridBagSizer pos = sizer._get_row_col(obj.pos) stmt = self.tmpl_gridbagsizerspacer % ( sizer_name, size[0], size[1], pos, obj.span, flag, border ) klass.layout.append( stmt ) def add_widget_handler(self, widget_name, handler, *args, **kwds): self.obj_builders[widget_name] = handler def create_generated_by(self): "Create I{generated by wxGlade} string without leading comment characters and without tailing new lines" generated_from = '' if config.preferences.write_generated_from and common.app_tree and common.app_tree.app.filename: generated_from = ' from "%s"' % common.app_tree.app.filename if config.preferences.write_timestamp: msg = 'generated by wxGlade %s on %s%s' % ( config.version, time.asctime(), generated_from ) else: msg = 'generated by wxGlade%s' % generated_from return msg def create_nonce(self): """Create a random number used to be sure that the replaced tags in the sources are the right ones (see SourceFileContent and add_class)""" nonce = '%s%s' % ( str(time.time()).replace('.', ''), random.randrange(10 ** 6, 10 ** 7) ) return nonce def get_property_handler(self, property_name, widget_name): """Return the widget specific property handler; @see: L{add_property_handler}, L{global_property_writers}, L{_property_writers}""" try: cls = self._property_writers[widget_name][property_name] except KeyError: cls = self.global_property_writers.get(property_name, None) if cls: return cls() return None def generate_code_background(self, obj): "Returns the code fragment that sets the background colour of the given object; @see: L{_get_colour()}" # check if there is an code template for this property tmpl = self._get_code_statement('backgroundcolour') if not tmpl: msg = "%s WARNING: no code template for property '%s' registered!\n"%(self.comment_sign, 'backgroundcolour') self.warning(msg) return msg objname = self.format_generic_access(obj) color = self._get_colour(obj.background) stmt = tmpl % { 'objname':objname, 'value':color } return stmt def generate_code_ctor(self, code_obj, is_new, tab): "Generate constructor code for top-level object (CodeObject instance); is_new: create a new file?" return [] #def generate_code_disabled(self, obj): #"Returns the code fragment that disables the given object." #return self._generic_code(obj, 'disabled') def generate_code_do_layout(self, builder, code_obj, is_new, tab): """Generate code for the function C{__do_layout()}. If C{is_new} is set, this function returns list of source code for the whole function. Otherwise it returns just the function body framed by "begin wxGlade" and "end wxGlade". @param builder: Widget specific builder @param code_obj: Object to generate code for (CodeObject) @param is_new: Indicates if previous source code exists see tmpl_name_do_layout, tmpl_func_do_layout, tmpl_func_empty; _generate_function()""" code_lines = [] write = code_lines.append # generate content of function body first layout_lines = self.classes[code_obj.klass].layout sizers_init_lines = self.classes[code_obj.klass].sizers_init # check if there are extra layout lines to add if hasattr(builder, 'get_layout_code'): extra_layout_lines = builder.get_layout_code(code_obj) else: extra_layout_lines = [] if layout_lines or sizers_init_lines or extra_layout_lines: sizers_init_lines.reverse() for l in sizers_init_lines: write(l) for l in layout_lines: write(l) for l in extra_layout_lines: write(l) code_lines = self._generate_function( code_obj, is_new, tab, self.tmpl_name_do_layout, self.tmpl_func_do_layout, code_lines ) return code_lines def generate_code_event_bind(self, code_obj, tab, event_handlers): "Generate code to bind events for 'code_obj'; event_handlers is a list of event handlers (str,str,str)" return [] def generate_code_event_handler(self, code_obj, is_new, tab, prev_src, event_handlers): """Generate the event handler stubs for 'code_obj' is_new: Indicates if previous source code exists; prev_src: Previous source code event_handlers; SourceFileContent instance event_handlers: List of event handlers (str,str,str)""" code_lines = [] write = code_lines.append if prev_src and not is_new: already_there = prev_src.event_handlers.get(code_obj.klass, {}) else: already_there = {} for win_id, event, handler, unused in event_handlers: # don't create handler twice if handler in already_there: continue # add an empty line for; TODO: Remove later if self.language in ('python', 'lisp') and not (prev_src and not is_new): write('\n') write(self.tmpl_func_event_stub % {'tab': tab, 'klass': self.cn_class(code_obj.klass), 'handler': handler }) already_there[handler] = 1 return code_lines def generate_code_extraproperties(self, obj): "Returns a list of code fragments that set extra properties for the given object" tmpl = self._get_code_statement('extraproperties') if not tmpl: return [] objname = self.format_generic_access(obj) ret = [] for name, value in sorted(obj.extraproperties): name_cap = name[0].upper() + name[1:] stmt = tmpl % { 'klass': self.cn_class(obj.klass), 'objname': objname, 'propname': name, 'propname_cap': name_cap, 'value': value } ret.append(stmt) return ret #def generate_code_focused(self, obj): #"Returns the code fragment that get the focus to the given object" #return self._generic_code(obj, 'focused') def generate_code_font(self, obj): "Returns the code fragment that sets the font of the given object" stmt = None # check if there is an code template for this property tmpl = self._get_code_statement('setfont' ) if not tmpl: msg = " %s WARNING: no code template for property '%s' registered!\n" % (self.comment_sign, 'setfont') self.warning(msg) return msg objname = self.format_generic_access(obj) cnfont = self.cn('wxFont') font_p = obj.properties["font"] size, family, style, weight, underlined, face = font_p.get() family = font_p.font_families[family] # e.g. 'roman' -> 'wxROMAN' style = font_p.font_styles[style] weight = font_p.font_weights[weight] if self.for_version[0]<3: # use old constants family = family.replace('wxFONTFAMILY_', 'wx') style = style.replace( 'wxFONTSTYLE_', 'wx') weight = weight.replace('wxFONTWEIGHT_', 'wx') face = '"%s"' % face.replace('"', r'\"') stmt = tmpl % { 'objname':objname, 'cnfont':cnfont, 'face':face, 'family':self.cn(family), 'size':size, 'style':self.cn(style), 'underlined': underlined, 'weight':self.cn(weight) } return stmt def generate_code_foreground(self, obj): "Returns the code fragment that sets the foreground colour of the given object; @see: L{_get_colour()}" # check if there is an code template for this property tmpl = self._get_code_statement('foregroundcolour' ) if not tmpl: msg =" %s WARNING: no code template for property '%s' registered!\n"%(self.comment_sign, 'foregroundcolour') self.warning(msg) return msg objname = self.format_generic_access(obj) color = self._get_colour(obj.foreground) stmt = tmpl % { 'objname':objname, 'value':color } return stmt #def generate_code_hidden(self, obj): #"Returns the code fragment that hides the given object" #return self._generic_code(obj, 'hidden') def generate_code_id(self, obj, id=None): """Generate the code for the widget ID. The parameter C{id} is evaluated first. An empty string for C{id} returns C{'', 'wxID_ANY'}. Returns a tuple of two string. The two strings are: 1. A line to the declare the variable. It's empty if the object id is a constant 2. The value of the id @param obj: An instance of L{xml_parse.CodeObject} @param id: Widget ID definition as String.""" raise NotImplementedError def generate_code_set_properties(self, builder, code_obj, is_new, tab): """Generate code for the function C{__set_properties()}. If C{is_new} is set, this function returns a list of source code for the whole function. Otherwise it returns just the function body framed by "begin wxGlade" and "end wxGlade". @param builder: Widget specific builder @param code_obj: Object to generate code for (CodeObject instance) @param is_new: Indicates if previous source code exists see tmpl_name_set_properties, tmpl_func_set_properties, tmpl_func_empty; _generate_function()""" # check if there are property lines to add _get_properties = getattr( builder, 'get_properties_code', self.generate_common_properties ) property_lines = _get_properties(code_obj) property_lines.extend(self.classes[code_obj.klass].props) code_lines = self._generate_function( code_obj, is_new, tab, self.tmpl_name_set_properties, self.tmpl_func_set_properties, property_lines ) return code_lines def generate_code_size(self, obj): "Returns the code fragment that sets the size of the given object." raise NotImplementedError #def generate_code_tooltip(self, obj): #"Returns the code fragment that sets the tooltip of the given object." #return self._generic_code(obj, 'tooltip') def generate_common_properties(self, widget): """generates the code for various properties common to all widgets (background and foreground colours, font,...) returns a list of strings containing the generated code""" out = [] props = [p.name for p in widget.get_properties() if p.is_active()] if widget.check_prop('size') and widget.base!='wxFrame': out.append(self.generate_code_size(widget)) if widget.check_prop('background'): out.append(self.generate_code_background(widget)) if widget.check_prop('foreground'): out.append(self.generate_code_foreground(widget)) if widget.check_prop('font'): out.append(self.generate_code_font(widget)) # tooltip if widget.check_prop('tooltip') and widget.tooltip: out.append( self._generic_code(widget, 'tooltip') ) # trivial boolean properties if widget.check_prop('disabled') and widget.disabled: out.append( self._generic_code(widget, 'disabled') ) if widget.check_prop('focused' ) and widget.focused: out.append( self._generic_code(widget, 'focused') ) if widget.check_prop('hidden' ) and widget.hidden: out.append( self._generic_code(widget, 'hidden') ) if widget.check_prop('extraproperties') and not self.preview: out.extend(self.generate_code_extraproperties(widget)) out = [l for l in out if l is not None] return out def quote_str(self, s): """Returns a quoted / escaped version of 's', suitable to insert in a source file as a string object. Takes care also of gettext support. Escaped are: quotations marks, backslash, characters with special meaning Please use quote_path() to quote / escape filenames or paths. Please check the test case tests.test_codegen.TestCodeGen.test_quote_str() for additional infos. The language specific implementations are in _quote_str().""" if not s: return self.tmpl_empty_string # no longer with direct generation: ## this is called from the Codewriter which is fed with XML ## here newlines are escaped already as '\n' and '\n' two-character sequences as '\\n' ## so we start by unescaping these #s = np.TextProperty._unescape(s) # then escape as required s = s.replace("\\", "\\\\").replace("\n", "\\n").replace("\t", "\\t").replace('"', '\\"') return self._quote_str(s) def _quote_str(self, s): "Language specific implementation for escaping or quoting." raise NotImplementedError def quote_path(self, s): "Escapes all quotation marks and backslashes, thus making a path suitable to insert in a list source file" # You may overwrite this function in the derived class s = s.replace('\\', '\\\\') s = s.replace('"', r'\"') s = s.replace('$', r'\$') # sigh s = s.replace('@', r'\@') return '"%s"' % s def save_file(self, filename, content, mainfile=False, content_only=False): """Store the content in a file. A shebang is added in top of all mainfiles. The permissions of mainfiles will be set to 0755 too. common.save_file() is used for storing content, i.e. the file will only be written in case of changes. filename: File name content: File content as list of strings mainfile: Mainfiles gets a shebang and 0755 permissions. content_only: Write only content to the file""" tmp = [] # write additional information to file header if not content_only: # add shebang to main file if self.shebang and mainfile or self.language == 'C++': tmp.append( self.shebang ) # add file encoding notice if self.tmpl_encoding and self.app_encoding: tmp.append( self.tmpl_encoding % self.app_encoding ) # add created by notice if self.tmpl_generated_by: tmp.append( self.tmpl_generated_by % {'comment_sign': self.comment_sign, 'generated_by': self.create_generated_by() } ) # add language specific note if self.language_note: tmp.append( "%s" % self.language_note ) # add a empty line tmp.append( "\n" ) # add original file content tmp += content # encode unicode to binary; filter out empty line def encode(line): if isinstance(line, compat.unicode): return line.encode(self.app_encoding) return line try: tmp = [encode(line) for line in tmp if line] except UnicodeEncodeError as inst: raise errors.WxgOutputUnicodeError( self.app_encoding, inst.object[inst.start:inst.end].encode('unicode-escape'), inst.start, inst.end ) # check for necessary sub directories e.g. for Perl or Python modules dirname = os.path.dirname(filename) if dirname and not os.path.isdir(dirname): try: os.makedirs(dirname) except: self._logger.exception( _('Can not create output directory "%s"'), dirname ) # save the file now try: common.save_file(filename, tmp, 'codegen') except (errors.WxgBaseException, EnvironmentError): # EnvironmentError's will be caught at a higher level raise except: self._logger.exception(_('Internal Error')) if mainfile and sys.platform in ['linux2', 'darwin']: try: # make the file executable os.chmod(filename, 0o755) except OSError as e: # this isn't necessarily a bad error self.warning(_('Changing permission of file "%s" failed: %s') % (filename, str(e))) def store_as_attr(self, obj): """Returns True if 'obj' should be added as an attribute of its parent's class, False if it should be created as a local variable of C{__do_layout}. The function returns True of the object klass is listed in L{classattr_always}. The function returns True for all widgets except sizers, if - the property exists and is an integer greater equal 1 - the property does not exists - the property contains a non-integer value The function returns True for sizers, if - the property exists and is an integer greater equal 1 @see: L{classattr_always} """ if obj.klass in self.classattr_always: return True if 'attribute' in obj.properties: return obj.attribute if obj.is_sizer: return False if obj.classname in ("wxStaticText","wxHyperlinkCtrl","wxStaticBitmap","wxStaticLine"): return False return True # this is the default def tabs(self, number): "Return a proper formatted string for indenting lines" return self.indent_symbol * self.indent_amount * number def warning(self, msg): "Show a warning message" if self._show_warnings: self._logger.warning(msg) def _remove_tag_re(self, source, re_string): "Remove all tags that match the regular expression" tags = re.compile( re_string%self.nonce ) remove = [i for i,line in enumerate(source.content) if tags.match(line)] for i in reversed(remove): del source.content[i] def _content_notfound(self, source): """Remove all the remaining <123415wxGlade ...> tags from the source and add a warning instead. This may happen if we're not generating multiple files, and one of the container class names is changed. The indentation of the string depends values detected during the initial parsing of the source file. Those values are stored in L{BaseSourceFileContent.spaces}. @param source: Source content string with tags to replace""" tags = re.compile( r'(<%swxGlade replace ([a-zA-Z_]\w*) +[.\w]+>)' % self.nonce) for i,line in enumerate(source.content): match = tags.match(line) if not match: continue # re.findall() returned a list of tuples (caused by grouping) # first element in tuple: the whole match # second element in tuple: the class / block name tag = match.groups() indent = self.previous_source.spaces.get(tag[1], "") comment = '%(indent)s%(comment_sign)s Content of this block not found. Did you rename this class?\n' tmpl = self._get_code_statement('contentnotfound' ) if tmpl: comment += '%(indent)s%(command)s\n' command = tmpl else: command = "" comment = comment % {'command':command, 'comment_sign':self.comment_sign, 'indent':indent } #source = source.replace(tag[0], comment) source.content[i] = comment def _do_replace_backslashes(self, match): "Escape double backslashes in first RE match group; see quote_str()" return 2 * match.group(0) def _do_replace_doublequotes(self, match): "Escape double quotes" # " -> \" # \" -> \\" if match.group(0).startswith('\\'): return '\\\"' else: return '\\"' def _file_exists(self, filename): "Check if the file exists; separated for debugging purposes" return os.path.isfile(filename) def add_object_format_name(self, name): "Format a widget name to use in add_object(" return name def _format_classattr(self, obj): "Format the object name to store as a class attribute; obj: Instance of L{xml_parse.CodeObject}" if not obj: return '' elif not getattr(obj, 'name', None): return '' return obj.name def _format_comment(self, msg): """Return message formatted to add as a comment string in generating source code. Trailing spaces will be removed. Leading spaces e.g. indentation won't be added.""" return "%s %s" % (self.comment_sign, msg.rstrip()) def _format_import(self, klass): "Return formatted import statement for the given class name" return klass def _format_name(self, name): "Format a class or a widget name by replacing forbidden characters." return name def _format_style(self, style, code_obj): """Return the formatted styles to insert into constructor code. The function just returned L{tmpl_style}. Write a derived version implementation if more logic is needed.""" if code_obj.is_toplevel: if style: return self.tmpl_toplevel_style return self.tmpl_toplevel_style0 if style: return self.tmpl_style return self.tmpl_style0 def _generic_code(self, obj, prop_name): """Create a code statement for calling a method e.g. to hide a widget. @param obj: Instance of L{xml_parse.CodeObject} @param prop_name: Name of the property to set @return: Code statement or None @see: L{_code_statements}""" value = obj.properties[prop_name].get_value() if isinstance(value, compat.basestring): value = self.quote_str(obj.tooltip) tmpl = self._get_code_statement(prop_name) objname = self.format_generic_access(obj) stmt = tmpl % { 'objname': objname, 'tooltip': value } return stmt def _get_code_statement(self, prop_name): """Return non-formatted code statement related to prop_name. This function handled the properties extensions described in L{_code_statements}. @param prop_name: Name of the property to set @return: Code statement or None @see: L{_code_statements}""" prop_name_major = '%s_%d' % ( prop_name, self.for_version[0] ) prop_name_detailed = '%s_%d%d' % ( prop_name, self.for_version[0], self.for_version[1] ) # check if there is an code template for this prop_name # most specific to generic if prop_name_detailed in self._code_statements: prop_name_use = prop_name_detailed elif prop_name_major in self._code_statements: prop_name_use = prop_name_major elif prop_name in self._code_statements: prop_name_use = prop_name else: return None return self._code_statements[prop_name_use] def format_generic_access(self, obj): """Format a generic and language specific access to the given object. For example: C{self}, C{$self} or C{$self->}.""" raise NotImplementedError def _get_colour(self, colourvalue): "Returns the language specific colour statement" # check if there is an code template for this properties if colourvalue == 'wxNullColour': return self.cn(self._get_code_statement('wxnullcolour')) tmpl_wxcolour = self._get_code_statement('wxcolour' ) if not tmpl_wxcolour: msg = " %s WARNING: no code template for property '%s' registered!\n" % (self.comment_sign, 'wxcolour') self.warning(msg) return msg tmpl_wxsystemcolour = self._get_code_statement('wxsystemcolour' ) if not tmpl_wxsystemcolour: msg = " %s WARNING: no code template for property '%s' registered!\n"%(self.comment_sign, 'wxsystemcolour') self.warning(msg) return msg try: value = self._string_to_colour(colourvalue) tmpl = self.cn(tmpl_wxcolour) except (IndexError, ValueError): # the color is from system settings value = self.cn(colourvalue) tmpl = self.cn(tmpl_wxsystemcolour) stmt = tmpl % {'value': value} return stmt def _get_class_filename(self, klass): "Returns the filename to store a single class in multi file projects; 'class': class name" return '' def _generate_function(self, code_obj, is_new, tab, fname, ftmpl, body): """Generic function to generate a complete function from given parts. @param code_obj: Object to generate code for (CodeObject instance) @param is_new: Indicates if previous source code exists @param fname: Name of the function @param ftmpl: Template string of the function @param body: Content of the function @type body: list[str] @rtype: list[str]""" code_lines = [] write = code_lines.append if self._mark_blocks: # begin tag write( self.tmpl_block_begin % { 'class_separator': self.class_separator, 'comment_sign': self.comment_sign, 'function': fname, 'klass': self.cn_class(code_obj.klass), 'tab': tab} ) if body: for l in body: write(tab + l) else: write(self.tmpl_func_empty % {'tab': tab}) if self._mark_blocks: # end tag write('%s%s end wxGlade\n' % (tab, self.comment_sign)) # embed the content into function template if is_new: stmt = ftmpl % {'tab': tab, 'klass': self.cn_class(code_obj.klass), 'content': ''.join(code_lines) } code_lines = ["%s\n" % line.rstrip() for line in stmt.split('\n')] # remove newline at last line code_lines[-1] = code_lines[-1].rstrip() return code_lines def _recode_x80_xff(self, s): """Re-code characters in range 0x80-0xFF (Latin-1 Supplement - also called C1 Controls and Latin-1 Supplement) from \\xXX to \\u00XX""" assert isinstance(s, bytes) def repl(matchobj): dec = ord(matchobj.group(0)) if dec > 127: return b'\u00' + ('%x'% dec).encode() return matchobj.group(0) s = re.sub(b'[\\x80-\\xFF]{1}', repl, s) return s def _source_warning(self, klass, msg, sub_obj): """Format and add a warning message to the source code. The message msg will be split into single lines and every line will be properly formatted. @param klass: Instance of L{ClassLines} to add the code in @param msg: Multiline message @param sub_obj: Object to generate code for (CodeObject instance) @see: L{_format_comment()}""" code_lines = [] # add leading empty line code_lines.append('\n') # add a leading "WARNING:" to the message if not msg.upper().startswith(_('WARNING:')): msg = "%s %s" % (_('WARNING:'), msg) # add message text for line in msg.split('\n'): code_lines.append( "%s\n" % self._format_comment(line.rstrip()) ) # add tailing empty line code_lines.append('\n') # Add warning message to source code # TODO: Remove next three lines after C++ code gen uses dependencies like Python, Perl and Lisp if self.language == 'C++': klass.init.extend(code_lines) else: klass.deps.append((sub_obj, sub_obj.parent)) klass.child_order.append(sub_obj) klass.init_lines[sub_obj] = code_lines def _string_to_colour(self, s): """Convert a colour values out of a hex string to comma separated decimal values. Example:: >>> self._string_to_colour('#FFFFFF') '255, 255, 255' >>> self._string_to_colour('#ABCDEF') '171, 205, 239' """ return '%d, %d, %d' % ( int(s[1:3], 16), int(s[3:5], 16), int(s[5:], 16) ) def _tagcontent(self, tag, content, newline=False): """Returns content embedded between C{begin wxGlade} and C{end wxGlade} sequence. @return: Embedded content string @param tag: used in C{begin wxGlade} statement to indicate different blocks @param content: Content to enter as string or list of strings @param newline: Add a tailing empty line?""" code_list = [] if self._mark_blocks: code_list.append( '%s begin wxGlade: %s' % (self.comment_sign, tag) ) if isinstance(content, list): for entry in content: code_list.append(entry.rstrip()) elif isinstance(content, compat.basestring): # don't append empty content _content = content.rstrip() if _content: code_list.append(_content) else: raise AssertionError('Unknown content type: %s' % type(content)) if self._mark_blocks: code_list.append( '%s end wxGlade' % self.comment_sign ) # newline for "end wxGlade" line code_list.append('') if newline: code_list.append('') return "\n".join(code_list) def copy(self): """Return a deep copy of the current instance. The instance will be reinitialised with defaults automatically in L{__setstate__()}.""" new_codegen = copy.deepcopy(self) return new_codegen def __getstate__(self): """Return the state dict of this instance except the L{_logger} and the L{classes} attributes. Both attributes caused copy errors due to file locking resp. weak references in XML SAX module.""" state = self.__dict__.copy() del state['_logger'] del state['classes'] return state def __setstate__(self, state): """Update the instance using values from dict 'state'. The code generator will be reinitialised after the state has been updated; see L{new_project()}""" self.__dict__.update(state) # re-initialise logger instance deleted from __getstate__ and instance variables self._logger = logging.getLogger(self.__class__.__name__) #self.new_project() wxGlade-0.9.4/codegen/cpp_codegen.py000066400000000000000000001517251352706171500173650ustar00rootroot00000000000000"""\ C++ code generator How the code is generated: every time the end of an object is reached during the parsing of the xml tree, either the function 'add_object' or the function 'add_class' is called: the latter when the object is a toplevel one, the former when it is not. In the last case, 'add_object' calls the appropriate ``writer'' function for the specific object, found in the 'obj_builders' dict. Such function accepts one argument, the CodeObject representing the object for which the code has to be written, and returns 3 lists of strings, representing the lines to add to the '__init__', '__set_properties' and '__do_layout' methods of the parent object. @copyright: 2002-2007 Alberto Griggio @copyright: 2012-2016 Carsten Grohmann @copyright: 2017-2018 Dietmar Schwertberger @license: MIT (see LICENSE.txt) - THIS PROGRAM COMES WITH NO WARRANTY """ import os.path, re from codegen import BaseLangCodeWriter, BaseSourceFileContent, BaseWidgetHandler, _replace_tag from codegen import ClassLines as BaseClassLines import config, compat, misc import wcodegen class SourceFileContent(BaseSourceFileContent): """Keeps info about an existing file that has to be updated, to replace only the lines inside a wxGlade block, and to keep the rest of the file as it was. @ivar event_handlers: dictionary of event handlers for each class @ivar header_content: Content of the header file @ivar source_content: Content of the source file""" rec_block_start = re.compile( r'^(?P\s*)' # leading spaces r'//\s*' # comment sign r'begin\s+wxGlade:\s*' # "begin wxGlade:" statement and tailing spaces r'(?P\w*)' # class or function name r'::' # separator between class and function / block (non-greedy) r'(?P\w+)' # function / block name r'\s*$' # tailing spaces ) rec_block_end = re.compile( r'^\s*' # leading spaces r'//\s*' # comment sign r'end\s+wxGlade' # "end exGlade" statement r'\s*$' # tailing spaces ) rec_class_end = re.compile( r'^\s*};\s*' # closing curly brackets r'//\s*' # comment sign r'wxGlade:\s+end\s+class' # "wxGlade: end class" statement r'\s*$' # tailing spaces ) "Regexp to match last line of a class statement" rec_class_decl = re.compile( r'^\s*' # leading spaces r'class\s+([a-zA-Z_]\w*)' # "class " statement r'\s*' # tailing spaces ) """Regexp to match class declarations This isn't very accurate - doesn't match template classes, nor virtual inheritance, but should be enough for most cases""" rec_decl_event_table = re.compile( r'^\s*' # leading spaces r'DECLARE_EVENT_TABLE\s*\(\s*\)\s*;?' # declaration of the event table r'\s*$' # tailing spaces ) "Regexp to match declaration of event table" rec_def_event_table = re.compile( r'^\s*' # leading spaces r'BEGIN_EVENT_TABLE\s*\(\s*(\w+)\s*,\s*(\w+)\s*\)' r'\s*$' # tailing spaces ) "Regexp to match event table" rec_event_handler = re.compile( r'^\s*' # leading spaces r'(?:virtual\s+)?' r'void\s+(?P[A-Za-z_]+\w*)' # event handler name r'\s*' # optional spaces r'\([A-Za-z_:0-9]+\s*&\s*\w*\)\s*;' r'\s*' # optional spaces r'//\s*wxGlade:\s*' # wxGlade event handler statement r'\s*$' # tailing spaces ) rec_event_handlers_marker = re.compile( r'^\s*' # leading spaces r'//\s*wxGlade:\s*add\s+' r'((?:\w|:)+)\s+event handlers' r'\s*$' # tailing spaces ) "Regexp to match wxGlade comment of event handlers" def __init__(self, name, code_writer): # initialise new variables first self.header_content = None #self.source_content = None self.content = None self.event_table_decl = {} self.event_table_def = {} self.header_extension = code_writer.header_extension self.source_extension = code_writer.source_extension # call inherited constructor BaseSourceFileContent.__init__(self, name, code_writer) def replace_header(self, tag, content): return _replace_tag(self.header_content, tag, content) def build_untouched_content(self): BaseSourceFileContent.build_untouched_content(self) self._build_untouched(self.name + "." + self.header_extension, True) BaseSourceFileContent.build_untouched_content(self) self._build_untouched(self.name + "." + self.source_extension, False) def _build_untouched(self, filename, is_header): prev_was_handler = False events_tag_added = False inside_block = False inside_comment = False tmp_in = self._load_file(filename) out_lines = [] for line in tmp_in: comment_index = line.find('/*') if not inside_comment and comment_index != -1 and comment_index > line.find('//'): inside_comment = True if inside_comment: end_index = line.find('*/') if end_index > comment_index: inside_comment = False if not is_header: result = None else: result = self.rec_class_decl.match(line) if not inside_comment and not inside_block and result: if not self.class_name: # this is the first class declared in the file: insert the new ones before this out_lines.append( '<%swxGlade insert new_classes>' % self.nonce ) self.new_classes_inserted = True self.class_name = result.group(1) self.class_name = self.format_classname(self.class_name) self.classes[self.class_name] = 1 # add the found class to the list of classes of this module out_lines.append(line) elif not inside_block: result = self.rec_block_start.match(line) if not inside_comment and result: # replace the lines inside a wxGlade block with a tag that will be used later by add_class spaces = result.group('spaces') which_class = result.group('classname') which_block = result.group('block') if not which_class: which_class = self.class_name else: which_class = self.format_classname(which_class) self.spaces[which_class] = spaces inside_block = True out_lines.append( '<%swxGlade replace %s %s>' % (self.nonce, result.group('classname'), result.group('block') ) ) else: dont_append = False # ALB 2004-12-08 event handling support... if is_header and not inside_comment: result = self.rec_event_handler.match(line) if result: prev_was_handler = True which_handler = result.group('handler') which_class = self.class_name self.event_handlers.setdefault(which_class, {})[which_handler] = 1 else: if prev_was_handler: # add extra event handlers here... out_lines.append('<%swxGlade event_handlers %s>' % (self.nonce, self.class_name) ) prev_was_handler = False events_tag_added = True elif not events_tag_added and \ self.is_end_of_class(line): out_lines.append( '<%swxGlade event_handlers %s>' % (self.nonce, self.class_name) ) # now try to see if we already have a DECLARE_EVENT_TABLE result = self.rec_decl_event_table.match(line) if result: self.event_table_decl[self.class_name] = True elif not inside_comment: result = self.rec_event_handlers_marker.match(line) if result: out_lines.append( '<%swxGlade add %s event handlers>' % (self.nonce, result.group(1)) ) dont_append = True result = self.rec_def_event_table.match(line) if result: which_class = result.group(1) self.event_table_def[which_class] = True # ---------------------------------------- if not dont_append: out_lines.append(line) else: # ignore all the lines inside a wxGlade block if self.rec_block_end.match(line): inside_block = False if is_header and not self.new_classes_inserted: # if we are here, the previous ``version'' of the file did not contain any class, so we must add the # new_classes tag at the end of the file out_lines.append('<%swxGlade insert new_classes>' % self.nonce) # set the ``persistent'' content of the file if is_header: self.header_content = out_lines else: self.content = out_lines def is_end_of_class(self, line): """Returns True if the line is the last line of a class Not really, but for wxglade-generated code it should work...""" return self.rec_class_end.match(line) class WidgetHandler(BaseWidgetHandler): "Interface the various code generators for the widgets must implement" constructor = [] # 'signature' of the widget's constructor import_modules = [] # If not None, list of extra header file, in the form or "header.h" def __init__(self): BaseWidgetHandler.__init__(self) self.constructor = [] def get_ids_code(self, obj): """Handler for the code of the ids enum of toplevel objects. Returns a list of strings containing the code to generate. Usually the default implementation is ok (i.e. there are no extra lines to add)""" return [] class ClassLines(BaseClassLines): """Stores the lines of C++ code for a custom class""" def __init__(self): BaseClassLines.__init__(self) self.ids = [] # Ids declared in the source (for Evt. handling): grouped in a public enum in the custom class self.sub_objs = [] # List of 2-tuples (type, name) of the sub-objects; attributes of the toplevel object self.extra_code_h = [] # Extra header code to output self.extra_code_cpp = [] # Extra source code to output self.dependencies = [] # List not dictionary class CPPCodeWriter(BaseLangCodeWriter, wcodegen.CppMixin): """Code writer class for writing C++ code out of the designed GUI elements source_extension: Extension of the source file header_extension: Extension of the header file last_generated_id: Last generated Id number (wxNewId() is not used yet) tmpl_init_gettext: Template for inclusion of i18n headers and defining APP_CATALOG constant or None @see: L{BaseLangCodeWriter}""" ClassLines = ClassLines _code_statements = { 'backgroundcolour': "%(objname)sSetBackgroundColour(%(value)s);\n", 'disabled': "%(objname)sEnable(0);\n", 'extraproperties': "%(objname)sSet%(propname_cap)s(%(value)s);\n", 'focused': "%(objname)sSetFocus();\n", 'foregroundcolour': "%(objname)sSetForegroundColour(%(value)s);\n", 'hidden': "%(objname)sHide();\n", 'setfont': "%(objname)sSetFont(wxFont(%(size)s, %(family)s, " "%(style)s, %(weight)s, %(underlined)s, wxT(%(face)s)));\n", 'tooltip': "%(objname)sSetToolTip(%(tooltip)s);\n", 'wxcolour': "wxColour(%(value)s)", 'wxnullcolour': "wxNullColour", 'wxsystemcolour': "wxSystemSettings::GetColour(%(value)s)", } class_separator = '::' language_note = \ '// Example for compiling a single file project under Linux using g++:\n' \ '// g++ MyApp.cpp $(wx-config --libs) $(wx-config --cxxflags) -o MyApp\n' \ '//\n' \ '// Example for compiling a multi file project under Linux using g++:\n' \ '// g++ main.cpp $(wx-config --libs) $(wx-config --cxxflags) -o MyApp Dialog1.cpp Frame1.cpp\n' \ '//\n' output_name = None # If not None, name (without extension) of the file to write into output_header = None # Temporary storage of header file for writing into (list) output_file = None # Temporary storage of source file for writing into (list) shebang = '// -*- C++ -*-\n//\n' tmpl_cfunc_end = '}\n\n' tmpl_name_do_layout = 'do_layout' tmpl_name_set_properties = 'set_properties' tmpl_sizeritem = '%s->Add(%s, %s, %s, %s);\n' tmpl_gridbagsizeritem = '%s->Add(%s, wxGBPosition%s, wxGBSpan%s, %s, %s);\n' tmpl_gridbagsizerspacer = '%s->Add(%s, %s, wxGBPosition%s, wxGBSpan%s, %s, %s);\n' tmpl_spacersize = '%s, %s' tmpl_ctor_call_layout = '\n' \ '%(tab)sset_properties();\n' \ '%(tab)sdo_layout();\n' tmpl_func_do_layout = '\n' \ 'void %(klass)s::do_layout()\n{\n' \ '%(content)s' \ '}\n\n' tmpl_func_set_properties = '\n' \ 'void %(klass)s::set_properties()\n{\n' \ '%(content)s' \ '}\n\n' tmpl_appfile = """\ %(overwrite)s\ %(header_lines)s\ #include "%(filename_top_win_class)s" """ tmpl_init_gettext = """\ #include #ifndef APP_CATALOG #define APP_CATALOG "%(textdomain)s" // replace with the appropriate catalog name #endif """ def _get_app_template(self, app, top_win): 'build template string for application' if not self.app_name: return None # XXX use Show() for frames/panels and ShowModal()/Destroy for dialogs klass = app.klass if self._use_gettext: gettext1 = ["protected:", "%(tab)swxLocale m_locale; // locale we'll be using"] gettext2 = ['%(tab)sm_locale.Init();', '#ifdef APP_LOCALE_DIR', '%(tab)sm_locale.AddCatalogLookupPathPrefix(wxT(APP_LOCALE_DIR));', '#endif', '%(tab)sm_locale.AddCatalog(wxT(APP_CATALOG));\n'] else: gettext1 = gettext2 = [] if klass: klass1 = 'class %(klass)s: public wxApp {' klass2 = ['IMPLEMENT_APP(%(klass)s)\n', 'bool %(klass)s::OnInit()'] else: klass1 = 'class MyApp: public wxApp {' klass2 = ['IMPLEMENT_APP(MyApp)\n', 'bool MyApp::OnInit()',] ret = ['', klass1, 'public:', '%(tab)sbool OnInit();' ] + gettext1 + ['};\n'] + klass2 + ['{'] + gettext2 + [ '%(tab)swxInitAllImageHandlers();', '%(tab)s%(top_win_class)s* %(top_win)s = new %(top_win_class)s(NULL, wxID_ANY, wxEmptyString);', '%(tab)sSetTopWindow(%(top_win)s);', '%(tab)s%(top_win)s->Show();', '%(tab)sreturn true;', '}', ''] return '\n'.join(ret) tmpl_empty_string = 'wxEmptyString' def init_lang(self, app=None): self.last_generated_id = 1000 self.generated_ids = {} # Extensions and main filename based on Project options when set if app is not None: self.source_extension = app.source_extension or config.default_source_extension self.header_extension = app.header_extension or config.default_header_extension else: self.source_extension = config.default_source_extension self.header_extension = config.default_header_extension if hasattr(app, "app_filename"): # only for testing base = os.path.splitext(app.app_filename)[0] else: base = os.path.splitext(config.default_cpp_app_name)[0] # self.app_filename = '%s.%s' % (base, self.source_extension) self.header_lines = [ '#include \n', '#include \n' ] # include i18n / gettext if self._use_gettext and self._textdomain: self.header_lines.append( self.tmpl_init_gettext % {'textdomain': self._textdomain} ) # extra lines to generate (see the 'extracode' property of top-level widgets) self._current_extra_code_h = [] self._current_extra_code_cpp = [] def init_files(self, out_path): if self.multiple_files: self.previous_source = None self.out_dir = out_path else: name = os.path.splitext(out_path)[0] self.output_name = name if not self._overwrite and self._file_exists(name + "." + self.header_extension): # the file exists, we must keep all the lines not inside a wxGlade block. # NOTE: this may cause troubles if out_path is not a valid source file, so be careful! self.previous_source = SourceFileContent(name, self) else: # if the file doesn't exist, create it and write the ``intro'' self.previous_source = None self.output_header = [] self.output_file = [] # isolation directives oh = os.path.basename(name + "." + self.header_extension).upper().replace( '.', '_' ) self.output_header.append('#ifndef %s\n#define %s\n' % (oh, oh)) self.output_header.append('\n') for line in self.header_lines: self.output_header.append(line) self.output_header.append('\n') # now, write the tags to store dependencies and extra code self.output_header.append('<%swxGlade replace dependencies>' % self.nonce) self.output_header.append('\n') self.output_header.append('<%swxGlade replace extracode>' % self.nonce) self.output_header.append('\n') self.output_file.append('#include "%s.%s"\n\n' % (os.path.basename(name), self.header_extension)) self.output_file.append('<%swxGlade replace extracode>\n' % self.nonce) self.output_file.append('\n') def output_header_replace(self, tag, content): _replace_tag(self.output_header, tag, content) def finalize(self): if self.previous_source: # insert all the new custom classes inside the old file tag = '<%swxGlade insert new_classes>' % self.nonce if self.previous_source.new_classes: code = "".join([c[0] for c in self.previous_source.new_classes]) else: code = "" self.previous_source.replace_header(tag, code) extra_source = "".join([c[1] for c in self.previous_source.new_classes]) # extra code (see the 'extracode' property of top-level widgets) tag = '<%swxGlade replace extracode>' % self.nonce code = self._tagcontent( '::extracode', self._current_extra_code_h ) self.previous_source.replace_header(tag, code) code = self._tagcontent( '::extracode', self._current_extra_code_cpp ) self.previous_source.replace(tag, code) # -------------------------------------------------------------- # now remove all the remaining <123415wxGlade ...> tags from the source: # this may happen if we're not generating multiple files, and one of the container class names is changed tags = re.compile( r'(<%swxGlade replace ([a-zA-Z_]*\w*) (\w+)>)' % self.nonce ) for i,line in enumerate(self.previous_source.header_content): match = tags.match(line) if not match: continue tag = match.groups() if tag[2] == 'dependencies': #self._logger.debug('writing dependencies') deps = [] for code in self.classes.values(): deps.extend(code.dependencies) lines = self._format_dependencies( deps ) elif tag[2] == 'methods': lines = '%svoid set_properties();\n%svoid do_layout();\n' % (self.tabs(1), self.tabs(1)) else: lines = '// content of this block (%s) not found: did you rename this class?\n' % tag[2] self.previous_source.replace_header(tag[0], lines) # remove all the remaining <123415wxGlade ...> tags in source file XXX make more efficient self._content_notfound( self.previous_source ) tag_start = r'<%swxGlade add ' % self.nonce tag_end = r' event_handlers>' for i, line in enumerate(self.previous_source.content): if line.startswith(tag_start) and line.endswith(tag_end): source_content.content[i] = "" # write the new file contents to disk header_content = "".join( self.previous_source.header_content ) self.save_file( self.previous_source.name + "." + self.header_extension, header_content, content_only=True ) if extra_source: extra_source = '\n\n' + extra_source source_content = "".join( self.previous_source.content ) self.save_file( self.previous_source.name + "." + self.source_extension, source_content + extra_source, content_only=True ) elif not self.multiple_files: oh = os.path.basename(self.output_name).upper() + '_H' self.output_header.append('\n#endif // %s\n' % oh) # write the list of include files deps = [] for code in self.classes.values(): deps.extend(code.dependencies) code = self._format_dependencies( deps ) self.output_header_replace( '<%swxGlade replace dependencies>' % self.nonce, code ) # extra code (see the 'extracode' property of top-level widgets) tag = '<%swxGlade replace extracode>' % self.nonce code = self._tagcontent('::extracode', self._current_extra_code_h) self.output_header_replace( tag, code ) code = self._tagcontent('::extracode', self._current_extra_code_cpp) self.output_file_replace( tag, code ) self.save_file( self.output_name + "." + self.header_extension, self.output_header, self._app_added ) self.save_file( self.output_name + "." + self.source_extension, self.output_file, self._app_added ) self.output_file = self.output_header = None def add_app(self, app_attrs, top_win): # add language specific mappings self.lang_mapping['filename_top_win_class'] = '%s.%s' % (top_win.klass, self.header_extension) BaseLangCodeWriter.add_app(self, app_attrs, top_win) def add_class(self, code_obj): # shortcuts base = code_obj.base klass = code_obj.klass fmt_klass = self.cn_class(klass) if klass in self.classes and self.classes[klass].done: return # the code has already been generated if self.multiple_files: # let's see if the file to generate exists, and in this case create a SourceFileContent instance filename = os.path.join(self.out_dir, klass.replace('::', '_') + "." + self.header_extension) if self._overwrite or not self._file_exists(filename): prev_src = None else: prev_src = SourceFileContent( os.path.join(self.out_dir, klass), self ) else: # in this case, previous_source is the SourceFileContent instance # that keeps info about the single file to generate prev_src = self.previous_source try: builder = self.obj_builders[base] mycn = getattr(builder, 'cn', self.cn) mycn_f = getattr(builder, 'cn_f', self.cn_f) except KeyError: self._logger.error('%s', code_obj) # this is an error, let the exception be raised; the details are logged by the global exception handler raise if prev_src and klass in prev_src.classes: is_new = False else: # this class wasn't in the previous version of the source (if any) is_new = True header_buffer = [] source_buffer = [] hwrite = header_buffer.append swrite = source_buffer.append if not klass in self.classes: # if the class body was empty, create an empty ClassLines self.classes[klass] = self.ClassLines() # collect all event handlers event_handlers = self.classes[klass].event_handlers for win_id, evt, handler, evt_type in builder.get_event_handlers(code_obj): event_handlers.append((win_id, mycn(evt), handler, evt_type)) # try to see if there's some extra code to add to this class extra_code = getattr(builder, 'extracode', getattr(code_obj, 'extracode', "") or "") if extra_code: extra_code = re.sub(r'\\n', '\n', extra_code) extra_code = re.split(re.compile(r'^###\s*$', re.M), extra_code, 1) self.classes[klass].extra_code_h.append(extra_code[0]) if len(extra_code) > 1: self.classes[klass].extra_code_cpp.append(extra_code[1]) if not is_new: self.warning( '%s has extra code, but you are not overwriting existing sources:' ' please check that the resulting code is correct!' % code_obj.name ) if not self.multiple_files: if self.classes[klass].extra_code_h: self._current_extra_code_h.append( "".join( self.classes[klass].extra_code_h[::-1] ) ) if self.classes[klass].extra_code_cpp: self._current_extra_code_cpp.append( "".join( self.classes[klass].extra_code_cpp[::-1] ) ) default_sign = [('wxWindow*', 'parent'), ('wxWindowID', 'id')] sign = getattr(builder, 'constructor', default_sign) defaults = [] for t in sign: if len(t) == 3: defaults.append(t[2]) else: defaults.append(None) tmp_sign = [t[0] + ' ' + t[1] for t in sign] sign_decl2 = ', '.join(tmp_sign) for i in range(len(tmp_sign)): if defaults[i]: tmp_sign[i] += '=%s' % defaults[i] sign_decl1 = ', '.join(tmp_sign) sign_inst = ', '.join([t[1] for t in sign]) # custom base classes support custom_base = getattr(code_obj, 'custom_base', code_obj.properties.get('custom_base', None)) if custom_base and not custom_base.strip(): custom_base = None # generate constructor code if is_new: pass elif custom_base: # custom base classes set, but "overwrite existing sources" not # set. Issue a warning about this self.warning( '%s has custom base classes, but you are not overwriting existing sources: ' 'please check that the resulting code is correct!' % code_obj.name ) if is_new: # header file if custom_base: base = ", public ".join([b.strip() for b in custom_base.split(',')]) hwrite('\nclass %s: public %s {\n' % (fmt_klass, base)) hwrite('public:\n') # the first thing to add it the enum of the various ids if self._mark_blocks: hwrite(self.tabs(1) + '// begin wxGlade: %s::ids\n' % fmt_klass) ids = self.classes[klass].ids # let's try to see if there are extra ids to add to the enum if hasattr(builder, 'get_ids_code'): ids.extend(builder.get_ids_code(code_obj)) if ids: hwrite(self.tabs(1) + 'enum {\n') for id_name in ids: hwrite('%s%s,\n' % (self.tabs(2), id_name)) hwrite(self.tabs(1) + '};\n') if self._mark_blocks: hwrite(self.tabs(1) + '// end wxGlade\n\n') # constructor prototype hwrite(self.tabs(1) + '%s(%s);\n' % (fmt_klass, sign_decl1)) hwrite('\nprivate:\n') # set_properties and do_layout prototypes if self._mark_blocks: hwrite(self.tabs(1) + '// begin wxGlade: %s::methods\n' % fmt_klass) hwrite(self.tabs(1) + 'void set_properties();\n') hwrite(self.tabs(1) + 'void do_layout();\n') if self._mark_blocks: hwrite(self.tabs(1) + '// end wxGlade\n') # declarations of the attributes hwrite('\n') hwrite('protected:\n') hwrite(self.tabs(1) + '// begin wxGlade: %s::attributes\n' % fmt_klass) for o_type, o_name in self.classes[klass].sub_objs: hwrite(self.tabs(1) + '%s* %s;\n' % (o_type, o_name)) hwrite(self.tabs(1) + '// end wxGlade\n') if event_handlers: t = self.tabs(1) hwrite('\n' + t + 'DECLARE_EVENT_TABLE();\n') hwrite('\npublic:\n') already_there = {} for win_id, evt, handler, evt_type in event_handlers: if handler not in already_there: hwrite('%svoid %s(%s &event); // wxGlade: \n' % (t, handler, evt_type)) already_there[handler] = 1 hwrite('}; // wxGlade: end class\n\n') elif prev_src: if self._mark_blocks: hwrite(self.tabs(1) + '// begin wxGlade: %s::ids\n' % fmt_klass) ids = self.classes[klass].ids # let's try to see if there are extra ids to add to the enum if hasattr(builder, 'get_ids_code'): ids.extend(builder.get_ids_code(code_obj)) if ids: hwrite(self.tabs(1) + 'enum {\n') for id_name in ids: hwrite('%s%s,\n' % (self.tabs(2), id_name)) hwrite(self.tabs(1) + '};\n') if self._mark_blocks: hwrite(self.tabs(1) + '// end wxGlade\n') tag = '<%swxGlade replace %s ids>' % (self.nonce, klass) if not prev_src.replace_header( tag, "".join(header_buffer) ): # no ids tag found, issue a warning and do nothing self.warning("wxGlade ids block not found for %s, ids declarations code NOT generated" % code_obj.name) header_buffer = [] if self._mark_blocks: header_buffer.append( self.tabs(1) + '// begin wxGlade: %s::methods\n' % fmt_klass ) header_buffer.append( self.tabs(1) + 'void set_properties();\n' ) header_buffer.append( self.tabs(1) + 'void do_layout();\n' ) if self._mark_blocks: header_buffer.append( self.tabs(1) + '// end wxGlade\n' ) tag = '<%swxGlade replace %s methods>' % (self.nonce, klass) if not prev_src.replace_header(tag, "".join(header_buffer)): # no methods tag found, issue a warning and do nothing self.warning( "wxGlade methods block not found for %s, methods declarations code NOT generated" % code_obj.name ) header_buffer = [] hwrite = header_buffer.append if self._mark_blocks: hwrite(self.tabs(1) + '// begin wxGlade: %s::attributes\n' % fmt_klass) for o_type, o_name in self.classes[klass].sub_objs: hwrite(self.tabs(1) + '%s* %s;\n' % (o_type, o_name)) if self._mark_blocks: hwrite(self.tabs(1) + '// end wxGlade\n') tag = '<%swxGlade replace %s attributes>' % (self.nonce, klass) if not prev_src.replace_header(tag, "".join(header_buffer)): # no attributes tag found, issue a warning and do nothing self.warning( "wxGlade attributes block not found for %s, attributes declarations code NOT generated" % code_obj.name ) header_buffer = [] hwrite = header_buffer.append if event_handlers: already_there = prev_src.event_handlers.get(klass, {}) t = self.tabs(1) for win_id, evt, handler, evt_type in event_handlers: if handler not in already_there: hwrite('%svoid %s(%s &event); // wxGlade: \n' % (t, handler, evt_type)) already_there[handler] = 1 if klass not in prev_src.event_table_def: hwrite('\nprotected:\n') hwrite(self.tabs(1) + 'DECLARE_EVENT_TABLE()\n') tag = '<%swxGlade event_handlers %s>' % (self.nonce, klass) if not prev_src.replace_header( tag, "".join(header_buffer) ): # no attributes tag found, issue a warning and do nothing self.warning( "wxGlade events block not found for %s, event table code NOT generated" % code_obj.name ) # source file # set the window's style style_p = code_obj.properties.get("style") if style_p and style_p.value_set != style_p.default_value: style = mycn_f(style_p.get_string_value()) if style: sign_inst = sign_inst.replace('style', '%s' % style) # constructor if is_new: base = "%s(%s)" % (base, sign_inst) if custom_base: bases = [b.strip() for b in custom_base.split(',')] if bases: base = "%s(%s)" % (bases[0], sign_inst) rest = ", ".join([b + "()" for b in bases[1:]]) if rest: base += ", " + rest swrite('\n%s::%s(%s):\n%s%s\n{\n' % (fmt_klass, fmt_klass, sign_decl2, self.tabs(1), base) ) if self._mark_blocks: swrite(self.tabs(1) + '// begin wxGlade: %s::%s\n' % (fmt_klass, fmt_klass)) # set size here to avoid problems with splitter windows if 'size' in code_obj.properties and code_obj.properties["size"].is_active(): swrite( self.tabs(1) + self.generate_code_size(code_obj) ) tab = self.tabs(1) init_lines = self.classes[klass].init parents_init = self.classes[klass].parents_init parents_init.reverse() for l in parents_init: swrite(tab + l) for l in init_lines: swrite(tab + l) # now check if there are extra lines to add to the constructor if hasattr(builder, 'get_init_code'): for l in builder.get_init_code(code_obj): swrite(tab + l) swrite( self.tmpl_ctor_call_layout % {'tab':tab} ) if self._mark_blocks: # end tag swrite('%s%s end wxGlade\n' % (tab, self.comment_sign)) # write class function end statement if self.tmpl_cfunc_end and is_new: swrite( self.tmpl_cfunc_end % {'tab':tab} ) # replace code inside existing constructor block if prev_src and not is_new: # replace the lines inside the ctor wxGlade block # with the new ones tag = '<%swxGlade replace %s %s>' % (self.nonce, klass, klass) if not prev_src.replace( tag, "".join(source_buffer) ): # no constructor tag found, issue a warning and do nothing self.warning( "wxGlade %s::%s block not found, relative code NOT generated" % (fmt_klass, fmt_klass) ) source_buffer = [] swrite = source_buffer.append # generate code for __set_properties() code_lines = self.generate_code_set_properties( builder, code_obj, is_new, tab ) source_buffer.extend(code_lines) # replace code inside existing __set_properties() function if prev_src and not is_new: # replace the lines inside the set_properties wxGlade block with the new ones tag = '<%swxGlade replace %s set_properties>' % (self.nonce, klass) if not prev_src.replace( tag, "".join(source_buffer) ): # no set_properties tag found, issue a warning and do nothing self.warning( "wxGlade %s::set_properties block not found, relative code NOT generated" % fmt_klass ) source_buffer = [] swrite = source_buffer.append # generate code for __do_layout() code_lines = self.generate_code_do_layout( builder, code_obj, is_new, tab ) source_buffer.extend(code_lines) # replace code inside existing do_layout() function if prev_src and not is_new: # replace the lines inside the do_layout wxGlade block with the new ones tag = '<%swxGlade replace %s %s>' % (self.nonce, klass, 'do_layout') if not prev_src.replace(tag, "".join(source_buffer)): # no do_layout tag found, issue a warning and do nothing self.warning( "wxGlade do_layout block not found for %s, do_layout code NOT generated" % code_obj.name ) source_buffer = [] swrite = source_buffer.append # generate code for event table code_lines = self.generate_code_event_table( code_obj, is_new, tab, prev_src, event_handlers ) if prev_src and not is_new: tag = '<%swxGlade replace %s event_table>' % (self.nonce, klass) if not prev_src.replace( tag, "".join(code_lines) ): # no constructor tag found, issue a warning and do nothing self.warning( "wxGlade %s::event_table block not found, relative code NOT generated" % fmt_klass ) else: source_buffer.extend(code_lines) # generate code for event handler stubs code_lines = self.generate_code_event_handler( code_obj, is_new, tab, prev_src, event_handlers ) # replace code inside existing event handlers if prev_src and not is_new: tag = '<%swxGlade add %s event handlers>' % (self.nonce, klass) if not prev_src.replace( tag, "".join(code_lines) ): # no constructor tag found, issue a warning and do nothing self.warning( "wxGlade %s event handlers marker not found, relative code NOT generated" % fmt_klass ) else: source_buffer.extend(code_lines) # the code has been generated self.classes[klass].done = True if not self.multiple_files and prev_src: # if this is a new class, add its code to the new_classes list of the SourceFileContent instance if is_new: prev_src.new_classes.append( ("".join(header_buffer), "".join(source_buffer)) ) return if self.multiple_files: if base in self.obj_builders: self.classes[klass].dependencies.extend( getattr(self.obj_builders[base], 'import_modules', []) ) if prev_src: tag = '<%swxGlade insert new_classes>' % self.nonce prev_src.replace_header(tag, "") # insert the module dependencies of this class extra_modules = self.classes[klass].dependencies # WARNING: there's a double space ' ' between 'replace' and 'dependencies' in the tag below, # because there is no class name (see SourceFileContent, line ~147) tag = '<%swxGlade replace dependencies>' % self.nonce code = self._format_dependencies(extra_modules) prev_src.replace_header(tag, code) # insert the extra code of this class extra_code_h = "".join(self.classes[klass].extra_code_h[::-1]) extra_code_cpp = "".join(self.classes[klass].extra_code_cpp[::-1]) # if there's extra code but we are not overwriting existing sources, warn the user if extra_code_h or extra_code_cpp: self.warning( '%s (or one of its children) has extra code classes, but you are not overwriting ' 'existing sources: please check that the resulting code is correct!' % code_obj.name ) extra_code_h = self._tagcontent("::extracode", extra_code_h) extra_code_cpp = self._tagcontent("::extracode", extra_code_cpp) tag = '<%swxGlade replace extracode>' % self.nonce prev_src.replace_header(tag, extra_code_h) prev_src.replace(tag, extra_code_cpp) # store the new file contents to disk name = os.path.join(self.out_dir, klass) self.save_file( name +"."+ self.header_extension, "".join(prev_src.header_content), content_only=True ) self.save_file( name +"."+ self.source_extension, "".join(prev_src.content), content_only=True ) return # create the new source file header_file = os.path.join(self.out_dir, klass + "." + self.header_extension) source_file = os.path.join(self.out_dir, klass + "." + self.source_extension) hout = [] sout = [] # header file ---------------------------------------------------------------------------------------------- # isolation directives hn = os.path.basename(header_file).upper().replace('.', '_') hout.append('#ifndef %s\n#define %s\n' % (hn, hn)) hout.append('\n') # write the common lines hout.extend( self.header_lines ) hout.append('\n') # write the module dependencies for this class extra_modules = self.classes[klass].dependencies code = self._format_dependencies(extra_modules) hout.append(code) hout.append('\n') # insert the extra code of this class extra_code_h = "".join(self.classes[klass].extra_code_h[::-1]) extra_code_h = self._tagcontent('::extracode', extra_code_h) hout.append(extra_code_h) hout.append('\n') # write the class body for line in header_buffer: hout.append(line) hout.append('\n#endif // %s\n' % hn) # source file ---------------------------------------------------------------------------------------------- # write the common lines sout.append(self.header_lines[0]) sout.append('#include "%s"\n\n' % os.path.basename(header_file)) # insert the extra code of this class extra_code_cpp = "".join(self.classes[klass].extra_code_cpp[::-1]) extra_code_cpp = self._tagcontent('::extracode', extra_code_cpp) sout.append(extra_code_cpp) sout.append('\n') # write the class implementation sout.extend(source_buffer) # store source to disk self.save_file(header_file, hout) self.save_file(source_file, sout) else: # not self.multiple_files # write the class body onto the single source file self.output_header.extend(header_buffer) self.output_file.extend(source_buffer) def add_object(self, sub_obj): # get top level source code object and the widget builder instance klass, builder = self._add_object_init(sub_obj) if not klass or not builder: return try: init, ids, props, layout = builder.get_code(sub_obj) except: print(sub_obj) raise # this shouldn't happen if not sub_obj.is_sizer: # the object is a wxWindow instance if "extracode_pre" in sub_obj.properties and sub_obj.extracode_pre: init = sub_obj.properties["extracode_pre"].get_lines() + init if "extracode_post" in sub_obj.properties and sub_obj.extracode_post: init += sub_obj.properties["extracode_post"].get_lines() if sub_obj.node.children and not sub_obj.is_toplevel: init.reverse() klass.parents_init.extend(init) else: klass.init.extend(init) mycn = getattr(builder, 'cn', self.cn) for win_id, evt, handler, evt_type in builder.get_event_handlers(sub_obj): klass.event_handlers.append( (win_id, mycn(evt), handler, evt_type) ) # try to see if there's some extra code to add to this class extra_code = getattr(builder, 'extracode', getattr(sub_obj, 'extracode', "") or "" ) if extra_code: extra_code = re.sub(r'\\n', '\n', extra_code) extra_code = re.split(re.compile(r'^###\s*$', re.M), extra_code, 1) klass.extra_code_h.append(extra_code[0]) if len(extra_code) > 1: klass.extra_code_cpp.append(extra_code[1]) # if we are not overwriting existing source, warn the user about the presence of extra code if not self.multiple_files and self.previous_source: self.warning( '%s has extra code, but you are not overwriting existing sources: please check ' 'that the resulting code is correct!' % sub_obj.name ) klass.ids.extend(ids) if sub_obj.klass != 'spacer': # attribute is a special property which control whether sub_obj must be accessible as an attribute of # top_obj, or as a local variable in the do_layout method if self.store_as_attr(sub_obj): klass.sub_objs.append((sub_obj.klass, sub_obj.name)) elif sub_obj.klass != "sizerslot": # the object is a sizer if self.store_as_attr(sub_obj): klass.sub_objs.append((sub_obj.klass, sub_obj.name)) klass.sizers_init.extend(init) klass.props.extend(props) klass.layout.extend(layout) if self.multiple_files and (sub_obj.is_toplevel and sub_obj.base != sub_obj.klass): klass.dependencies.append(sub_obj.klass) else: if sub_obj.base in self.obj_builders: headers = getattr(self.obj_builders[sub_obj.base], 'import_modules', []) klass.dependencies.extend(headers) def generate_code_event_handler(self, code_obj, is_new, tab, prev_src, event_handlers): """Generate the event handler stubs Parameters: code_obj: Object to generate code for (CodeObject) is_new: Indicates if previous source code exists (bool) tab: Indentation of function body (str) prev_src: Previous source code (SourceFileContent) event_handlers: List of event handlers @see: L{tmpl_func_event_stub}""" code_lines = [] swrite = code_lines.append if not event_handlers: return [] tmpl_handler = """ void %(klass)s::%(handler)s(%(evt_type)s &event) // wxGlade: %(klass)s. { %(tab)sevent.Skip(); %(tab)s// notify the user that he hasn't implemented the event handler yet %(tab)swxLogDebug(wxT("Event handler (%(klass)s::%(handler)s) not implemented yet")); } """ if prev_src: already_there = prev_src.event_handlers.get(code_obj.klass, {}) else: already_there = {} for win_id, event, handler, evt_type in event_handlers: if handler not in already_there: swrite( tmpl_handler % {'evt_type': evt_type, 'handler': handler, 'klass': code_obj.klass, 'tab': tab} ) already_there[handler] = 1 if is_new or not prev_src: swrite('\n\n') swrite('// wxGlade: add %s event handlers\n' % code_obj.klass) if is_new or not prev_src: swrite('\n') return code_lines def generate_code_event_table(self, code_obj, is_new, tab, prev_src, event_handlers): """Generate code for event table declaration. code_obj: Object to generate code for (CodeObject) is_new: Indicates if previous source code exists (bool) tab: Indentation of function body (str) prev_src: Previous source code (SourceFileContent) event_handlers: List of event handlers (strings)""" code_lines = [] write = code_lines.append if not event_handlers: return code_lines if prev_src and code_obj.klass in prev_src.event_table_decl: has_event_table = True else: has_event_table = False if is_new or not has_event_table: write('\nBEGIN_EVENT_TABLE(%s, %s)\n' % (code_obj.klass, code_obj.base)) write(tab + '// begin wxGlade: %s::event_table\n' % code_obj.klass) for win_id, event, handler, evt_type in event_handlers: if win_id is None: continue if 'EVT_NAVIGATION_KEY' in event: tmpl = '%(tab)s%(event)s(%(klass)s::%(handler)s)\n' else: tmpl = '%(tab)s%(event)s(%(win_id)s, %(klass)s::%(handler)s)\n' details = { 'tab': tab, 'event': event, 'win_id': win_id, 'klass': code_obj.klass, 'handler': handler } write(tmpl % details) write(tab + '// end wxGlade\n') if is_new or not has_event_table: write('END_EVENT_TABLE();\n\n') return code_lines def generate_code_id(self, obj, id=None): if id is None: id = obj.window_id if not id: if obj is not None and "stockitem" in obj.properties and obj.stockitem: return '', "wxID_" + obj.stockitem return '', 'wxID_ANY' id = str(id) tokens = id.split('=', 1) if len(tokens) == 2: name, val = tokens else: return '', tokens[0] # we assume name is declared elsewhere if not name: return '', val name = name.strip() val = val.strip() if val == '?': val = self.generated_ids.get(name) if val is None: val = 'wxID_HIGHEST + %d' % self.last_generated_id self.last_generated_id += 1 self.generated_ids[name] = val else: val = val return '%s = %s' % (name, val), name def generate_code_size(self, obj): objname = self.format_generic_access(obj) if obj.is_toplevel: name2 = 'this' else: name2 = obj.name size = obj.properties["size"].get_string_value() use_dialog_units = (size[-1] == 'd') if not obj.parent: method = 'SetSize' else: method = 'SetMinSize' if use_dialog_units: return '%s%s(wxDLG_UNIT(%s, wxSize(%s)));\n' % (objname, method, name2, size[:-1]) else: return '%s%s(wxSize(%s));\n' % (objname, method, size) def quote_path(self, s): path = super(CPPCodeWriter, self).quote_path(s) # path starts and ends with double quotes already return 'wxT(%s)' % path def _quote_str(self, s): if self._use_gettext: return '_("%s")' % s else: return 'wxT("%s")' % s def format_generic_access(self, obj): if obj.is_toplevel: return '' else: return '%s->' % obj.name def _format_dependencies(self, dependencies): "Format a list of header files for the dependencies output" dep_list = [] for dependency in sorted( set(dependencies) ): # unique and sorted if dependency and ('"' != dependency[0] != '<'): dep_list.append('#include "%s.h"\n' % dependency) else: dep_list.append('#include %s\n' % dependency) code = self._tagcontent( '::dependencies', dep_list ) return code writer = CPPCodeWriter() # The code writer is an instance of CPPCodeWriter language = writer.language # Language generated by this code generator wxGlade-0.9.4/codegen/lisp_codegen.py000066400000000000000000000602671352706171500175520ustar00rootroot00000000000000"""\ Lisp code generator How the code is generated: every time the end of an object is reached during the parsing of the xml tree, either the function 'add_object' or the function 'add_class' is called: the latter when the object is a toplevel one, the former when it is not. In the last case, 'add_object' calls the appropriate ``writer'' function for the specific object, found in the 'obj_builders' dict. Such function accepts one argument, the CodeObject representing the object for which the code has to be written, and returns 3 lists of strings, representing the lines to add to the '__init__', '__set_properties' and '__do_layout' methods of the parent object. @copyright: 2005 Surendra K Singhi @copyright: 2012-2016 Carsten Grohmann @license: MIT (see LICENSE.txt) - THIS PROGRAM COMES WITH NO WARRANTY """ import os import os.path import re from codegen import BaseLangCodeWriter, BaseSourceFileContent, BaseWidgetHandler import errors import wcodegen class SourceFileContent(BaseSourceFileContent): rec_block_start = re.compile( r'^(?P\s*)' # leading spaces r';;;\s*' # comment sign r'begin\s+wxGlade:\s*' # "begin wxGlade:" statement and tailing spaces r'(?P[a-zA-Z_]+\w*)??' # class or function name (non-greedy) r'[.]?' # separator between class and function / block (non-greedy) r'(?P\w+)' # function / block name r'\s*$' # tailing spaces ) rec_block_end = re.compile( r'^\s*' # leading spaces r';;;\s*' # comment sign r'end\s+wxGlade' # "end exGlade" statement r'\s*$' # tailing spaces ) rec_class_decl = re.compile( r'^\s*' # leading spaces r'\(defclass\s+([a-zA-Z_]\w*)\s*(\(\s*\))' # "class " statement r'\s*$' # tailing spaces ) rec_event_handler = re.compile( r'^\s+' # leading spaces (mandatory) r'def\s+(?P[A-Za-z_]+\w*)' # event handler name r'\s*' # optional spaces r'\(.*\):' # function parameters r'\s*' # optional spaces r';;;\s*wxGlade:\s*(?P\w+)\.' # wxGlade event handler statement with class name r'\s*$' # tailing spaces ) def build_untouched_content(self): BaseSourceFileContent.build_untouched_content(self) inside_block = False inside_triple_quote = False triple_quote_str = None tmp_in = self._load_file(self.name) out_lines = [] for line in tmp_in: quote_index = -1 if not inside_triple_quote: triple_dquote_index = line.find('"""') triple_squote_index = line.find("'''") if triple_squote_index == -1: quote_index = triple_dquote_index tmp_quote_str = '"""' elif triple_dquote_index == -1: quote_index = triple_squote_index tmp_quote_str = "'''" else: quote_index, tmp_quote_str = min( (triple_squote_index, "'''"), (triple_dquote_index, '"""') ) if not inside_triple_quote and quote_index != -1: inside_triple_quote = True triple_quote_str = tmp_quote_str if inside_triple_quote: end_index = line.rfind(triple_quote_str) if quote_index < end_index and end_index != -1: inside_triple_quote = False result = self.rec_class_decl.match(line) if not inside_triple_quote and result: if not self.class_name: # this is the first class declared in the file: insert the new ones before this out_lines.append('<%swxGlade insert new_classes>' % self.nonce) self.new_classes_inserted = True self.class_name = result.group(1) self.class_name = self.format_classname(self.class_name) self.classes[self.class_name] = 1 # add the found class to the list of classes of this module out_lines.append(line) elif not inside_block: result = self.rec_block_start.match(line) if not inside_triple_quote and result: # replace the lines inside a wxGlade block with a tag that will be used later by add_class spaces = result.group('spaces') which_class = result.group('classname') which_block = result.group('block') if not which_class: which_class = self.class_name else: which_class = self.format_classname(which_class) self.spaces[which_class] = spaces inside_block = True if not self.class_name: out_lines.append( '<%swxGlade replace %s>' % (self.nonce, which_block) ) else: out_lines.append( '<%swxGlade replace %s %s>' % (self.nonce, which_class, which_block) ) else: result = self.rec_event_handler.match(line) if not inside_triple_quote and result: which_handler = result.group('handler') which_class = self.format_classname(result.group('class')) self.event_handlers.setdefault( which_class, {})[which_handler] = 1 if self.class_name and self.is_end_of_class(line): # add extra event handlers here... out_lines.append( '<%swxGlade event_handlers %s>' % (self.nonce, self.class_name) ) out_lines.append(line) if self.is_import_line(line): # add a tag to allow extra modules out_lines.append( '<%swxGlade extra_modules>\n' % self.nonce ) else: # ignore all the lines inside a wxGlade block if self.rec_block_end.match(line): inside_block = False if not self.new_classes_inserted: # if we are here, the previous ``version'' of the file did not contain any class, so we must add the # new_classes tag at the end of the file out_lines.append('<%swxGlade insert new_classes>' % self.nonce) # set the ``persistent'' content of the file self.content = out_lines def is_import_line(self, line): return line.startswith('(use-package :wx') class WidgetHandler(BaseWidgetHandler): pass class LispCodeWriter(BaseLangCodeWriter, wcodegen.LispMixin): "Code writer class for writing Lisp code out of the designed GUI elements" _code_statements = { 'backgroundcolour': "(wxWindow_SetBackgroundColour %(objname)s %(value)s)\n", 'disabled': "(wxWindow_IsEnabled %(objname)s0)\n", 'extraproperties': "(%(klass)s_Set%(propname_cap)s (slot-%(objname)s obj) %(value)s)\n", 'focused': "(wxWindow_SetFocus %(objname)s)\n", 'foregroundcolour': "(wxWindow_SetForegroundColour %(objname)s %(value)s)\n", 'hidden': "(wxWindow_Hide %(objname)s)\n", 'setfont': "(wxWindow_SetFont %(objname)s (wxFont_Create %(size)s %(family)s " "%(style)s %(weight)s %(underlined)s %(face)s wxFONTENCODING_DEFAULT))\n", 'tooltip': "(wxWindow_SetToolTip %(objname)s%(tooltip)s)\n", 'wxcolour': "(wxColour_CreateRGB %(value)s)", 'wxnullcolour': "wxNullColour", 'wxsystemcolour': "(wxSystemSettings_GetColour %(value)s)", } class_separator = '.' classattr_always = ['wxBoxSizer', 'wxStaticBoxSizer', 'wxGridSizer', 'wxFlexGridSizer'] #global_property_writers = { #'font': BaseLangCodeWriter.FontPropertyHandler, #'events': BaseLangCodeWriter.EventsPropertyHandler, #'extraproperties': BaseLangCodeWriter.ExtraPropertiesPropertyHandler, #} indent_level_func_body = 2 name_ctor = '__init__' shebang = '#!/usr/bin/env lisp\n;;;\n' SourceFileContent = SourceFileContent tmpl_name_do_layout = '__do_layout' tmpl_name_set_properties = '__set_properties' tmpl_cfunc_end = '%(tab)s)\n' tmpl_class_end = '\n%(comment)s end of class %(klass)s\n\n\n' tmpl_class_end_nomarker = '\n\n\n' tmpl_func_do_layout = '\n' \ '(defmethod do-layout ((obj %(klass)s))\n' \ '%(content)s' \ '%(tab)s)\n' tmpl_func_event_stub = """\ (defun %(handler)s (function data event) ;;; wxGlade: %(klass)s. %(tab)s(print "Event handler '%(handler)s' not implemented!") %(tab)s(when event %(tab)s%(tab)s(wxEvent:wxEvent_Skip event))) """ tmpl_func_set_properties = '\n' \ '(defmethod set-properties ((obj %(klass)s))\n' \ '%(content)s' \ '%(tab)s)\n' tmpl_func_empty = '%(tab)spass\n' tmpl_appfile = """\ %(overwrite)s\ %(header_lines)s\ (require "%(top_win_class)s") """ tmpl_detailed = """\ (defun init-func (fun data evt) %(tab)s%(tab)s(let ((%(top_win)s (make-%(top_win_class)s))) %(tab)s%(tab)s(ELJApp_SetTopWindow (slot-top-window %(top_win)s)) %(tab)s%(tab)s(wxWindow_Show (slot-top-window %(top_win)s)))) ;;; end of class %(klass)s (unwind-protect %(tab)s(Eljapp_initializeC (wxclosure_Create #'init-func nil) 0 nil) %(tab)s(ffi:close-foreign-library "../miscellaneous/wxc-msw2.6.2.dll")) """ # ZZZ merge tmpl_gettext_detailed and tmpl_simple tmpl_gettext_detailed = """\ (defun init-func (fun data evt) %(tab)s%(tab)s(let ((%(top_win)s (make-%(top_win_class)s))) %(tab)s%(tab)s(ELJApp_SetTopWindow (slot-top-window %(top_win)s)) %(tab)s%(tab)s(wxWindow_Show (slot-top-window %(top_win)s)))) ;;; end of class %(klass)s %(tab)s(setf (textdomain) "%(textdomain)s") ;; replace with the appropriate catalog name %(tab)s(defun _ (msgid) (gettext msgid "%(textdomain)s")) (unwind-protect %(tab)s(Eljapp_initializeC (wxclosure_Create #'init-func nil) 0 nil) %(tab)s(ffi:close-foreign-library "../miscellaneous/wxc-msw2.6.2.dll")) """ tmpl_simple = """\ (defun init-func (fun data evt) %(tab)s(let ((%(top_win)s (make-%(top_win_class)s))) %(tab)s(ELJApp_SetTopWindow (slot-top-window %(top_win)s)) %(tab)s(wxWindow_Show (slot-top-window %(top_win)s)))) (unwind-protect %(tab)s(Eljapp_initializeC (wxclosure_Create #'init-func nil) 0 nil) %(tab)s(ffi:close-foreign-library "../miscellaneous/wxc-msw2.6.2.dll")) """ tmpl_gettext_simple = """\ (defun init-func (fun data evt) %(tab)s(setf (textdomain) "%(textdomain)s") ;; replace with the appropriate catalog name %(tab)s(defun _ (msgid) (gettext msgid "%(textdomain)s")) %(tab)s(let ((%(top_win)s (make-%(top_win_class)s))) %(tab)s(ELJApp_SetTopWindow (slot-top-window %(top_win)s)) %(tab)s(wxWindow_Show (slot-top-window %(top_win)s)))) (unwind-protect %(tab)s(Eljapp_initializeC (wxclosure_Create #'init-func nil) 0 nil) %(tab)s(ffi:close-foreign-library "../miscellaneous/wxc-msw2.6.2.dll")) """ def _get_app_template(self, app, top_win): # check for templates for detailed startup code if not self.app_name: return None klass = app.klass ret = None if klass and self._use_gettext: ret = self.tmpl_gettext_detailed elif klass and not self._use_gettext: ret = self.tmpl_detailed if ret: if not self._mark_blocks: ret.replace(";;; end of class %(klass)s\n", "") return ret # check for templates for simple startup code elif not klass and self._use_gettext: return self.tmpl_gettext_simple elif not klass and not self._use_gettext: return self.tmpl_simple def init_lang(self, app_attrs): self.class_lines = [] self.header_lines = [ """(asdf:operate 'asdf:load-op 'wxcl)\n""", """(use-package "FFI")\n""", """(ffi:default-foreign-language :stdc)\n\n""", ] self.dependencies = { '(use-package :wxCL)': 1, '(use-package :wxFrame)': 1, '(use-package :wx_main)': 1, '(use-package :wx_wrapper)': 1, '(use-package :wxWindow)': 1, '(use-package :wxColour)': 1, '(use-package :wxEvtHandler)': 1, '(use-package :wxEvent)': 1, } def check_values(self): BaseLangCodeWriter.check_values(self) if self.for_version > (2, 8): raise errors.WxgLispWx3NotSupported("%d.%d" % self.for_version) def add_app(self, app, top_win_class): top_win = app.top_window # do nothing if there is no top window if not top_win: return # add language specific mappings self.lang_mapping = { 'top_win': self._format_name(top_win), } BaseLangCodeWriter.add_app(self, app, top_win_class) def add_object(self, sub_obj): # the lisp code gen add some hard coded depedencies # TODO: Move the hard coded dependencies to the widgets resp. sizers # XXX temporarily disabled... #sub_obj.name = self._format_name(sub_obj.name) #sub_obj.parent.name = self._format_name(sub_obj.parent.name) # get top level source code object and the widget builder instance klass, builder = self._add_object_init(sub_obj) if not klass or not builder: return if sub_obj.name not in ("spacer","sizerslot"): self.class_lines.append( self._format_name(sub_obj.name) ) if (sub_obj.klass == "wxBoxSizer" or sub_obj.klass == "wxStaticBoxSizer" or sub_obj.klass == "wxGridSizer" or sub_obj.klass == "wxFlexGridSizer"): self.dependencies['(use-package :wxSizer)'] = 1 else: if sub_obj.klass not in ("spacer", "sizerslot"): key = '(use-package :%s)' % sub_obj.klass self.dependencies[key] = 1 if sub_obj.klass == "wxMenuBar": self.dependencies['(use-package :wxMenu)'] = 1 BaseLangCodeWriter.add_object(self, sub_obj) def add_sizeritem(self, toplevel, sizer, obj, option, flag, border): # XXX remove this hack if obj.is_sizer: self.tmpl_sizeritem = '(wxSizer_AddSizer (%s obj) (%s obj) %s %s %s nil)\n' else: self.tmpl_sizeritem = '(wxSizer_AddWindow (%s obj) (%s obj) %s %s %s nil)\n' BaseLangCodeWriter.add_sizeritem( self, toplevel, sizer, obj, option, flag, border ) def add_spacer(self, toplevel, sizer, obj=None, proportion=0, flag='0', border=0): # XXX remove this hack self.tmpl_sizeritem = '(wxSizer_AddWindow (%s obj) (%s obj) %s %s %s nil)\n' BaseLangCodeWriter.add_spacer(self, toplevel, sizer, obj, proportion, flag, border) def generate_code_background(self, obj): self.dependencies['(use-package :wxColour)'] = 1 return BaseLangCodeWriter.generate_code_background(self, obj) def generate_code_ctor(self, code_obj, is_new, tab): code_lines = [] write = code_lines.append builder = self.obj_builders[code_obj.base] mycn = getattr(builder, 'cn', self.cn) mycn_f = getattr(builder, 'cn_f', self.cn_f) # custom base classes support custom_base = getattr( code_obj, 'custom_base', code_obj.properties.get('custom_base', None) ) if self.preview or (custom_base and not custom_base.strip()): custom_base = None # generate constructor code if is_new: base = mycn(code_obj.base) klass = code_obj.klass write('\n(defclass %s()\n' % klass) write(tab + "((top-window :initform nil :accessor slot-top-window)") for l in self.class_lines: write("\n") write(tab + "(" + l + " :initform nil :accessor slot-" + l + ")") write("))\n") write("\n(defun make-%s ()\n" % klass) write(tab + "(let ((obj (make-instance '%s)))\n" % klass) write(tab + " (init obj)\n") write(tab + " (set-properties obj)\n") write(tab + " (do-layout obj)\n") write(tab + " obj))\n") write('\n(defmethod init ((obj %s))\n' % klass) write("\"Method creates the objects contained in the class.\"\n") elif custom_base: # custom base classes set, but "overwrite existing sources" not # set. Issue a warning about this self.warning( '%s has custom base classes, but you are not overwriting existing sources: please check that ' 'the resulting code is correct!' % code_obj.name ) if self._mark_blocks: # __init__ begin tag write( self.tmpl_block_begin % {'class_separator':self.class_separator, 'comment_sign':self.comment_sign, 'function':self.name_ctor, 'klass':self.cn_class(code_obj.klass), 'tab':tab} ) style_p = code_obj.properties.get("style") if style_p and style_p.value_set != style_p.default_value: m_style = mycn_f( style_p.get_string_value() ) if m_style: stmt_style = self._format_style(m_style, code_obj) write(stmt_style % {'style': m_style, 'tab': tab} ) # set size here to avoid problems with splitter windows if 'size' in code_obj.properties and code_obj.properties["size"].is_active(): write( tab + self.generate_code_size(code_obj) ) # classes[code_obj.klass].deps now contains a mapping of child to # parent for all children we processed... object_order = [] for obj in self.classes[code_obj.klass].child_order: # Don't add it again if already present if obj in object_order: continue object_order.append(obj) # Insert parent and ancestor objects before the current object current_object = obj for child, parent in self.classes[code_obj.klass].deps[:]: if child is current_object: if parent not in object_order: idx = object_order.index(current_object) object_order.insert(idx, parent) current_object = parent # We processed the dependency: remove it self.classes[code_obj.klass].deps.remove((child, parent)) # Write out the initialisation in the order we just generated for obj in object_order: if obj in self.classes[code_obj.klass].init_lines: for l in self.classes[code_obj.klass].init_lines[obj]: write(tab + l) return code_lines def generate_code_event_bind(self, code_obj, tab, event_handlers): code_lines = [] write = code_lines.append if event_handlers: write('\n') for win_id, event, handler, unused in event_handlers: if win_id.startswith('#'): win_id = win_id[1:] win_id = self._format_name(win_id) write( "%(tab)s(wxEvtHandler_Connect (slot-top-window obj) %(win_id)s (exp%(event)s)\n%(tab2)s" \ "(wxClosure_Create #'%(handler)s obj))\n" % {'tab':tab, 'tab2':self.tabs(2), 'win_id':win_id, 'event':self.cn(event), 'handler':handler} ) return code_lines def generate_code_font(self, obj): self.dependencies['(use-package :wxFont)'] = 1 return BaseLangCodeWriter.generate_code_font(self, obj) def generate_code_foreground(self, obj): self.dependencies['(use-package :wxColour)'] = 1 return BaseLangCodeWriter.generate_code_foreground(self, obj) def generate_code_id(self, obj, id=None): if id is None: id = obj.window_id if not id: if obj is not None and "stockitem" in obj.properties and obj.stockitem: return '', self.cn("wxID_" + obj.stockitem) return '', self.cn('wxID_ANY') tokens = id.split('=', 1) if len(tokens) == 2: name, val = tokens else: return '', self.cn(tokens[0]) # we assume name is declared elsewhere if not name: return '', self.cn(val) name = name.strip() val = val.strip() if val == '?': val = self.cn('wxNewId()') else: val = self.cn(val) # check to see if we have to make the var global or not... if '.' in name: return '%s = %s\n' % (name, val), name return 'global %s; %s = %s\n' % (name, name, val), name def generate_code_size(self, obj): objname = self.format_generic_access(obj) size = obj.properties["size"].get_string_value() use_dialog_units = (size[-1] == 'd') if not obj.parent: method = 'wxWindow_SetSize' else: method = 'SetMinSize' if use_dialog_units: return '(%s %s(%s(%s (%s))))\n' % ( method, objname, self.cn('wxDLG_SZE'), objname, size[:-1] ) else: return '%s.%s((%s))\n' % (objname, method, size) def _quote_str(self, s): if self._use_gettext: return '(_"%s")' % s else: return '"%s"' % s def add_object_format_name(self, name): return '#obj.%s' % name def _format_classattr(self, obj): res = BaseLangCodeWriter._format_classattr(self, obj) if not res: return res elif obj.name.startswith('slot-'): return obj.name # spacer.name is ", " already, but wxLisp expect # a tuple instead of two single values elif obj.klass in ('spacer','sizerslot'): return '(%s)' % obj.name # wxList use class attributes always (unfortunately) # elif self.store_as_attr(obj): # return "slot-%s" % self._format_name(obj.name) # return self._format_name(obj.name) return 'slot-%s' % self._format_name(obj.name) def _format_import(self, klass): stmt = '(require "%s")\n' % klass return stmt def _format_style(self, style, code_obj): builder = self.obj_builders[code_obj.base] mycn_f = getattr(builder, 'cn_f', self.cn_f) if not style: return '' style = mycn_f(style) if not style: return '' style = style.strip().replace('.', '') if code_obj.base == "wxFrame": stmt = '%%(tab)s(setf (slot-top-window obj) (wxFrame_create nil wxID_ANY \"\" -1 -1 -1 -1 %s))\n' % style elif code_obj.base == "wxDialog": stmt = '%%(tab)s(setf (slot-top-window obj) (wxDialog_create nil wxID_ANY \"\" -1 -1 -1 -1 %s))\n' % style self.dependencies['(use-package :wxButton)'] = 1 else: stmt = '' return stmt def _get_class_filename(self, klass): filename = os.path.join( self.out_dir, klass.replace('.', '_') + '.lisp' ) return filename def format_generic_access(self, obj): if obj.is_toplevel: return '(slot-top-window obj)' else: obj_name = self._format_name(obj.name) if self.store_as_attr(obj): return '(slot-%s obj)' % obj_name else: return obj_name def _format_name(self, name): return name.replace('_', '-') writer = LispCodeWriter() # The code writer is an instance of L{LispCodeWriter}. language = writer.language # Language generated by this code generator wxGlade-0.9.4/codegen/perl_codegen.py000066400000000000000000000572271352706171500175470ustar00rootroot00000000000000"""\ Perl code generator How the code is generated: every time the end of an object is reached during the parsing of the xml tree, either the function 'add_object' or the function 'add_class' is called: the latter when the object is a toplevel one, the former when it is not. In the last case, 'add_object' calls the appropriate ``writer'' function for the specific object, found in the 'obj_builders' dict. Such function accepts one argument, the CodeObject representing the object for which the code has to be written, and returns 3 lists of strings, representing the lines to add to the '__init__', '__set_properties' and '__do_layout' methods of the parent object. Like all other perl parts, based on the pre-existing python generators @copyright: 2002-2004 D.H. aka crazyinsomniac on sourceforge.net @copyright: 2012-2016 Carsten Grohmann @copyright: 2017 Dietmar Schwertberger @license: MIT (see LICENSE.txt) - THIS PROGRAM COMES WITH NO WARRANTY """ import os, os.path, re from codegen import BaseLangCodeWriter, BaseSourceFileContent, BaseWidgetHandler import wcodegen import compat class SourceFileContent(BaseSourceFileContent): rec_block_start = re.compile( r'^(?P\s*)' # leading spaces r'#\s*' # comment sign r'begin\s+wxGlade:\s*' # "begin wxGlade:" statement and tailing spaces r'(?P[a-zA-Z_]+[\w:]*?)??' # class or function name (non-greedy) r'(?::{2}|\s*)' # separator between class and function / block (non-greedy) r'(?P\w+)' # function / block name r'\s*$' # tailing spaces ) rec_block_end = re.compile( r'^\s*' # leading spaces r'#\s*' # comment sign r'end\s+wxGlade' # "end exGlade" statement r'\s*$' # tailing spaces ) # Less precise regex, but working :-P # Should match: package Foo; or package Foo::bar::baz ; rec_class_decl = re.compile( r'^\s*' # leading spaces r'package\s+([a-zA-Z_][\w:]*)\s*;' # "package " statement r'.*$' # any character till eol ) rec_event_handler = re.compile( r'^\s*' # leading spaces r'#\s*wxGlade:\s*(?P[\w:]+)::(?P\w+) ' # wxGlade event handler # statement with class and # event handler name r'\s*$' # tailing spaces ) rec_pod = re.compile( r'^\s*' # leading spaces r'=[A-Za-z_]+\w*' # match POD statement r'.*$' # any character till eol ) """\ Regexp to match Perl's Plain Old Documentation format @see: manpage perlpod """ def build_untouched_content(self): """\ Builds a string with the contents of the file that must be left as is, and replaces the wxGlade blocks with tags that in turn will be replaced by the new wxGlade blocks WARNING: NOT YET COMPLETE -- crazyinsomniac alb - almost done :) WARNING: There is *NO* support for here documents: if you put wxGlade blocks inside a here document, you're likely going into troubles... """ BaseSourceFileContent.build_untouched_content(self) inside_block = False inside_pod = False tmp_in = self._load_file(self.name) out_lines = [] for line in tmp_in: result = self.rec_pod.match(line) if result: inside_pod = True if inside_pod: out_lines.append(line) if line.startswith('=cut'): inside_pod = False continue result = self.rec_class_decl.match(line) if result: if not self.class_name: # this is the first class declared in the file: insert the # new ones before this out_lines.append( '<%swxGlade insert new_classes>' % self.nonce ) self.new_classes_inserted = True self.class_name = result.group(1) self.class_name = self.format_classname(self.class_name) self.classes[self.class_name] = 1 # add the found class to the list # of classes of this module out_lines.append(line) elif not inside_block: result = self.rec_block_start.match(line) if result: # replace the lines inside a wxGlade block with a tag that will be used later by add_class spaces = result.group('spaces') which_class = result.group('classname') which_block = result.group('block') if not which_class: which_class = self.class_name else: which_class = self.format_classname(which_class) self.spaces[which_class] = spaces inside_block = True if not self.class_name: out_lines.append( '<%swxGlade replace %s>' % (self.nonce, which_block) ) else: out_lines.append( '<%swxGlade replace %s %s>' % (self.nonce, which_class, which_block) ) else: result = self.rec_event_handler.match(line) if result: which_handler = result.group('handler') which_class = self.format_classname(result.group('class')) self.event_handlers.setdefault( which_class, {})[which_handler] = 1 if self.class_name and self.is_end_of_class(line): # add extra event handlers here... out_lines.append( '<%swxGlade event_handlers %s>' % (self.nonce, self.class_name) ) out_lines.append(line) if self.is_import_line(line): # add a tag to allow extra modules out_lines.append( '<%swxGlade extra_modules>\n' % self.nonce ) else: # ignore all the lines inside a wxGlade block if self.rec_block_end.match(line): ## self._logger.debug('end block') inside_block = False if not self.new_classes_inserted: # if we are here, the previous ``version'' of the file did not contain any class, so we must add the # new_classes tag at the end of the file out_lines.append( '<%swxGlade insert new_classes>' % self.nonce ) # set the ``persistent'' content of the file self.content = out_lines def is_import_line(self, line): return line.lstrip().startswith('use Wx') class WidgetHandler(BaseWidgetHandler): "Interface the various code generators for the widgets must implement" new_signature = [] # Constructor signature ($self->SUPER::new(@stuff)); see PerlCodeWriter.new_defaults class PerlCodeWriter(BaseLangCodeWriter, wcodegen.PerlMixin): "Code writer class for writing Perl code out of the designed GUI elements; see: BaseLangCodeWriter" _code_statements = { 'backgroundcolour': "%(objname)s->SetBackgroundColour(%(value)s);\n", 'disabled': "%(objname)s->Enable(0);\n", 'extraproperties': "%(objname)s->Set%(propname_cap)s(%(value)s);\n", 'focused': "%(objname)s->SetFocus();\n", 'foregroundcolour': "%(objname)s->SetForegroundColour(%(value)s);\n", 'hidden': "%(objname)s->Show(0);\n", 'setfont': "%(objname)s->SetFont(Wx::Font->new(%(size)s, %(family)s, " "%(style)s, %(weight)s, %(underlined)s, %(face)s));\n", 'tooltip': "%(objname)s->SetToolTipString(%(tooltip)s);\n", 'tooltip_3': "%(objname)s->SetToolTip(%(tooltip)s);\n", 'wxcolour': "Wx::Colour->new(%(value)s)", 'wxnullcolour': "Wx::NullColour", 'wxsystemcolour': "Wx::SystemSettings::GetColour(%(value)s)", } class_separator = '::' classattr_always = ['wxBoxSizer', 'wxStaticBoxSizer', 'wxGridSizer', 'wxFlexGridSizer'] indent_amount = 1 indent_symbol = '\t' indent_level_func_body = 1 language_note = '# To get wxPerl visit http://www.wxperl.it\n' \ '#\n' name_ctor = 'new' new_defaults = [] # Default class members, will be initialised during new_project() shebang = '#!/usr/bin/perl -w -- \n#\n' SourceFileContent = SourceFileContent tmpl_name_do_layout = '__do_layout' tmpl_name_set_properties = '__set_properties' tmpl_cfunc_end = '%(tab)sreturn $self;\n' \ '\n' \ '}\n' \ '\n' tmpl_class_end = '\n%(comment)s end of class %(klass)s\n\n1;\n\n' tmpl_class_end_nomarker = '\n\n1;\n\n' tmpl_ctor_call_layout = '\n' \ '%(tab)s$self->__set_properties();\n' \ '%(tab)s$self->__do_layout();\n\n' tmpl_func_do_layout = '\n' \ 'sub __do_layout {\n' \ '%(tab)smy $self = shift;\n' \ '%(content)s' \ '}\n' tmpl_func_event_stub = """\ sub %(handler)s { %(tab)smy ($self, $event) = @_; %(tab)s# wxGlade: %(klass)s::%(handler)s %(tab)swarn "Event handler (%(handler)s) not implemented"; %(tab)s$event->Skip; %(tab)s# end wxGlade } """ tmpl_func_set_properties = '\n' \ 'sub __set_properties {\n' \ '%(tab)smy $self = shift;\n' \ '%(content)s' \ '}\n' tmpl_func_empty = '%(tab)sreturn;\n' tmpl_sizeritem = '%s->Add(%s, %s, %s, %s);\n' tmpl_gridbagsizeritem = '%s->Add(%s, %s, %s, %s, %s);\n' tmpl_gridbagsizerspacer = '%s->Add(%s, %s, %s, %s, %s, %s);\n' tmpl_spacersize = '%s, %s' tmpl_style = \ '%(tab)s$style = %(style)s\n' \ '%(tab)s%(tab)sunless defined $style;\n' \ '\n' tmpl_toplevel_style = tmpl_style tmpl_appfile = """%(overwrite)s%(header_lines)s""" def _get_app_template(self, app, top_win): 'build template string for application' if not self.app_name: return None # XXX use Show() for frames/panels and ShowModal()/Destroy for dialogs klass = app.klass if self._use_gettext: gettext1 = ['%(tab)smy $local = Wx::Locale->new("English", "en", "en"); # replace with ??', '%(tab)s$local->AddCatalog("%(textdomain)s"); # replace with the appropriate catalog name\n'] else: gettext1 = [] if klass: ret = [ 'package %(klass)s;', '', 'use base qw(Wx::App);', 'use strict;', '%(pl_import)s', 'sub OnInit {', '%(tab)smy( $self ) = shift;', '', '%(tab)sWx::InitAllImageHandlers();', '', '%(tab)smy $%(top_win)s = %(top_win_class)s->new();', '', '%(tab)s$self->SetTopWindow($%(top_win)s);', '%(tab)s$%(top_win)s->Show(1);', '', '%(tab)sreturn 1;', '}'] if self._mark_blocks: ret.append('# end of class %(klass)s') ret += ['', 'package main;', '', 'unless(caller){'] + gettext1 + [ '%(tab)smy $%(name)s = %(klass)s->new();', '%(tab)s$%(name)s->MainLoop();', '}', ''] else: ret = ['1;', '', 'package main;', '%(pl_import)s', 'unless(caller){'] + gettext1 + [ '%(tab)slocal *Wx::App::OnInit = sub{1};', '%(tab)smy $%(name)s = Wx::App->new();', '%(tab)sWx::InitAllImageHandlers();', '', '%(tab)smy $%(top_win)s = %(top_win_class)s->new();', '', '%(tab)s$%(name)s->SetTopWindow($%(top_win)s);', '%(tab)s$%(top_win)s->Show(1);', '%(tab)s$%(name)s->MainLoop();', '}', ''] return '\n'.join(ret) def init_lang(self, app_attrs): # initial new defaults late to use the proper indent characters tab = self.tabs(1) self.new_defaults = { '$parent' : '%s$parent = undef unless defined $parent;\n' % tab, '$id' : '%s$id = -1 unless defined $id;\n' % tab, '$title' : '%s$title = "" unless defined $title;\n' % tab, '$pos' : '%s$pos = wxDefaultPosition unless defined $pos;\n' % tab, '$size' : '%s$size = wxDefaultSize unless defined $size;\n' % tab, '$name' : '%s$name = "" unless defined $name;\n\n' % tab, #'$style' is a special case } self.header_lines = [ 'use Wx qw[:allclasses];\n', 'use strict;\n' ] def add_app(self, app_attrs, top_win): # add language specific mappings if self.multiple_files: self.lang_mapping['pl_import'] = "\nuse %s;\n" % top_win.klass else: self.lang_mapping['pl_import'] = '' BaseLangCodeWriter.add_app(self, app_attrs, top_win) def generate_code_ctor(self, code_obj, is_new, tab): code_lines = [] write = code_lines.append builder = self.obj_builders[code_obj.base] mycn = getattr(builder, 'cn', self.cn) mycn_f = getattr(builder, 'cn_f', self.cn_f) # custom base classes support custom_base = getattr( code_obj, 'custom_base', code_obj.properties.get('custom_base', None) ) if self.preview or (custom_base and not custom_base.strip()): custom_base = None new_signature = getattr(builder, 'new_signature', []) # generate constructor code if is_new: write('package %s;\n\n' % code_obj.klass) write('use Wx qw[:everything];\nuse base qw(%s);\nuse strict;\n\n' % code_obj.base.replace('wx', 'Wx::', 1)) if self._use_gettext: if self.multiple_files: self.classes[code_obj.klass].dependencies["use Wx::Locale gettext => '_T';\n"] = 1 else: write("use Wx::Locale gettext => '_T';\n") # The dependencies have to add to the package block too because global imports are not visible inside the # package block # TODO: Don't add dependencies twice with Perl # write the module dependencies for this class (package) dep_list = sorted( self.classes[code_obj.klass].dependencies.keys() ) if dep_list: code = self._tagcontent('dependencies', dep_list, True) write(code) write('sub new {\n') write(tab + "my( $self, %s ) = @_;\n" % ", ".join(new_signature)) if new_signature: for k in new_signature: if k in self.new_defaults: write(self.new_defaults[k]) else: new_signature = ['@_[1 .. $#_]'] # shift(@_)->SUPER::new(@_); self._logger.info( "%s did not declare self.new_defaults ", code_obj.klass ) elif custom_base: # custom base classes set, but "overwrite existing sources" not # set. Issue a warning about this self.warning( '%s has custom base classes, but you are not overwriting existing sources: ' 'please check that the resulting code is correct!' % code_obj.name ) if self._mark_blocks: # __init__ begin tag write(self.tmpl_block_begin % {'class_separator':self.class_separator, 'comment_sign':self.comment_sign, 'function':self.name_ctor, 'klass':self.cn_class(code_obj.klass), 'tab':tab} ) style_p = code_obj.properties.get("style") if style_p and style_p.value_set != style_p.default_value: style = style_p.get_string_value() m_style = mycn_f( style ) if m_style: stmt_style = self._format_style(style, code_obj) write( stmt_style % {'style':m_style, 'tab':tab} ) # class parent constructor write(tab + '$self = $self->SUPER::new( %s );\n' % ", ".join(new_signature)) # set size here to avoid problems with splitter windows if 'size' in code_obj.properties and code_obj.properties["size"].is_active(): write( tab+ self.generate_code_size(code_obj) ) # classes[code_obj.klass].deps now contains a mapping of child to # parent for all children we processed... object_order = [] for obj in self.classes[code_obj.klass].child_order: # Don't add it again if already present if obj in object_order: continue object_order.append(obj) # Insert parent and ancestor objects before the current object current_object = obj for child, parent in self.classes[code_obj.klass].deps[:]: if child is current_object: if parent not in object_order: idx = object_order.index(current_object) object_order.insert(idx, parent) current_object = parent # We processed the dependency: remove it self.classes[code_obj.klass].deps.remove((child, parent)) # Write out the initialisation in the order we just generated for obj in object_order: if obj in self.classes[code_obj.klass].init_lines: for l in self.classes[code_obj.klass].init_lines[obj]: write(tab + l) return code_lines def generate_code_event_bind(self, code_obj, tab, event_handlers): code_lines = [] write = code_lines.append for win_id, event, handler, unused in event_handlers: if win_id.startswith('#'): win_id = '$self->{%s}->GetId' % win_id[8:] if 'EVT_NAVIGATION_KEY' in event: tmpl = '''%(tab)s%(event)s($self, $self->can('%(handler)s'));\n''' else: tmpl = '''%(tab)s%(event)s($self, %(win_id)s, $self->can('%(handler)s'));\n''' details = { 'tab': tab, 'event': self.cn(event), 'handler': handler, 'win_id': win_id } write(tmpl % details) if event_handlers: write('\n') return code_lines def generate_code_id(self, obj, id=None): if id is None: id = obj.window_id if not id: if obj is not None and "stockitem" in obj.properties and obj.stockitem: return '', self.cn("wxID_" + obj.stockitem) return '', self.cn('wxID_ANY') id = str(id) tokens = id.split('=', 1) if len(tokens) == 2: name, val = tokens else: return '', self.cn(tokens[0]) # we assume name is declared elsewhere if not name: return '', self.cn(val) name = name.strip() val = val.strip() if val == '?': val = self.cn('wxNewId()') else: val = self.cn(val) # check to see if we have to make the var global or not... return 'use constant %s => %s;\n' % (name, val), name def generate_code_size(self, obj): objname = self.format_generic_access(obj) size = obj.properties["size"].get_string_value() use_dialog_units = (size[-1] == 'd') if not obj.parent: method = 'SetSize' else: method = 'SetMinSize' if use_dialog_units: return '%s->%s(%s->ConvertDialogSizeToPixels(Wx::Size->new(%s)));\n' % ( objname, method, objname, size[:-1], ) else: return '%s->%s(Wx::Size->new(%s));\n' % (objname, method, size) def _quote_str(self, s): """\ Escape all unicode characters to there unicode code points in form of \\uxxxx. The returned string is a pure ascii string. Normal ascii characters like \\n or \\t won't be escaped. @note: wxGlade don't handles file encoding well currently. Thereby we escape all unicode characters. @note: The string 's' is encoded with L{self.app_encoding} already. @see: L{BaseLangCodeWriter._quote_str} for additional details @see: L{_recode_x80_xff()} """ s = s.replace('$', r'\$') s = s.replace('@', r'\@') # convert all strings to unicode first if not isinstance(s, compat.unicode): s = s.decode(self.app_encoding) # check if it's pure ascii try: dummy = s.encode('ascii') if self._use_gettext: return '_T("%s")' % s else: return '"%s"' % s except UnicodeError: pass # convert unicode strings to pure ascii # use "raw-unicode-escape" just escaped unicode characters and not default escape sequences s = s.encode('raw-unicode-escape') s = self._recode_x80_xff(s) if compat.PYTHON3: # convert back to str (unicode) s = s.decode("ASCII") # convert Python style to Perl style s = re.sub(r'\\u([0-9a-f]{4})', r'\\N{U+\1}', s) if self._use_gettext: return '_T("%s")' % s else: return '"%s"' % s def add_object_format_name(self, name): return '#$self->%s' % name def _format_classattr(self, obj): res = BaseLangCodeWriter._format_classattr(self, obj) if not res: return res elif obj.name.startswith('$self->'): return obj.name elif obj.name.startswith('$'): return obj.name # spacer.name is ", " already elif obj.klass == 'spacer': return obj.name # Perl stores sizers always in class attributes elif self.store_as_attr(obj) or obj.is_sizer: return '$self->{%s}' % obj.name return '$%s' % obj.name def _format_import(self, klass): stmt = 'use %s;\n' % klass return stmt def _get_class_filename(self, klass): "Returns the name for a Perl module (.pm) to store a single class in multi file projects" filename = os.path.join( self.out_dir, klass.replace('::', os.sep) + '.pm' ) return filename def format_generic_access(self, obj): if obj.is_toplevel: return '$self' return self._format_classattr(obj) writer = PerlCodeWriter() # the code writer instance language = writer.language # Language generated by this code generator wxGlade-0.9.4/codegen/py_codegen.py000066400000000000000000000607731352706171500172350ustar00rootroot00000000000000"""\ Python code generator How the code is generated: every time the end of an object is reached during the parsing of the xml tree, either the function 'add_object' or the function 'add_class' is called: the latter when the object is a toplevel one, the former when it is not. In the last case, 'add_object' calls the appropriate ``writer'' function for the specific object, found in the 'obj_builders' dict. Such function accepts one argument, the CodeObject representing the object for which the code has to be written, and returns 3 lists of strings, representing the lines to add to the '__init__', '__set_properties' and '__do_layout' methods of the parent object. @copyright: John Dubery @copyright: 2002-2007 Alberto Griggio @copyright: 2012-2016 Carsten Grohmann @copyright: 2016-2018 Dietmar Schwertberger @license: MIT (see LICENSE.txt) - THIS PROGRAM COMES WITH NO WARRANTY """ import os, os.path, random, re from codegen import BaseLangCodeWriter, BaseSourceFileContent, BaseWidgetHandler import wcodegen import compat class SourceFileContent(BaseSourceFileContent): rec_block_start = re.compile( r'^(?P\s*)' # leading spaces r'#\s*' # comment sign r'begin\s+wxGlade:\s*' # "begin wxGlade:" statement and tailing spaces r'(?P[a-zA-Z_]+\w*)??' # class or function name (non-greedy) r'[.]?' # separator between class and function / block (non-greedy) r'(?P\w+)' # function / block name r'\s*$' ) # tailing spaces rec_block_end = re.compile( r'^\s*' # leading spaces r'#\s*' # comment sign r'end\s+wxGlade' # "end exGlade" statement r'\s*$' ) # tailing spaces # Less precise regex, but matches definitions with base classes having module qualified names. rec_class_decl = re.compile( r'^\s*' # leading spaces r'class\s+([a-zA-Z_]\w*)\s*(\([\s\w.,]*\))?:' # "class " statement r'\s*$' ) # tailing spaces rec_event_handler = re.compile( r'^\s+' # leading spaces (mandatory) r'def\s+(?P[A-Za-z_]+\w*)' # event handler name r'\s*' # optional spaces r'\(.*\):' # function parameters r'\s*' # optional spaces r'#\s*wxGlade:\s*(?P\w+)\.' # wxGlade event handler statement with class name r'\s*$' ) # tailing spaces def build_untouched_content(self): BaseSourceFileContent.build_untouched_content(self) inside_block = False inside_triple_quote = False triple_quote_str = None tmp_in = self._load_file(self.name) out_lines = [] for line in tmp_in: if line.endswith("\r\n"): # normalize line ending for files on Windows line = "%s\n"%line[:-2] quote_index = -1 if not inside_triple_quote: triple_dquote_index = line.find('"""') triple_squote_index = line.find("'''") if triple_squote_index == -1: quote_index = triple_dquote_index tmp_quote_str = '"""' elif triple_dquote_index == -1: quote_index = triple_squote_index tmp_quote_str = "'''" else: quote_index, tmp_quote_str = min( (triple_squote_index, "'''"), (triple_dquote_index, '"""') ) if not inside_triple_quote and quote_index != -1: inside_triple_quote = True triple_quote_str = tmp_quote_str if inside_triple_quote: end_index = line.rfind(triple_quote_str) if quote_index < end_index and end_index != -1: inside_triple_quote = False result = self.rec_class_decl.match(line) if not inside_triple_quote and not inside_block and result: if not self.class_name: # this is the first class declared in the file: insert the # new ones before this out_lines.append('<%swxGlade insert new_classes>' % self.nonce) self.new_classes_inserted = True self.class_name = result.group(1) self.class_name = self.format_classname(self.class_name) self.classes[self.class_name] = 1 # add the found class to the list of classes of this module out_lines.append(line) elif not inside_block: result = self.rec_block_start.match(line) if not inside_triple_quote and result: # replace the lines inside a wxGlade block with a tag that will be used later by add_class spaces = result.group('spaces') which_class = result.group('classname') which_block = result.group('block') if not which_class: which_class = self.class_name else: which_class = self.format_classname(which_class) self.spaces[which_class] = spaces inside_block = True if not self.class_name: out_lines.append('<%swxGlade replace %s>' % (self.nonce, which_block)) else: out_lines.append('<%swxGlade replace %s %s>' % (self.nonce, which_class, which_block)) else: result = self.rec_event_handler.match(line) if not inside_triple_quote and result: which_handler = result.group('handler') which_class = self.format_classname(result.group('class')) self.event_handlers.setdefault(which_class, {})[which_handler] = 1 if self.class_name and self.is_end_of_class(line): # add extra event handlers here... out_lines.append('<%swxGlade event_handlers %s>' % (self.nonce, self.class_name)) out_lines.append(line) if self.is_import_line(line): # add a tag to allow extra modules out_lines.append('<%swxGlade extra_modules>\n' % self.nonce) else: # ignore all the lines inside a wxGlade block if self.rec_block_end.match(line): inside_block = False if not self.new_classes_inserted: # if we are here, the previous ``version'' of the file did not contain any class, # so we must add the new_classes tag at the end of the file out_lines.append('<%swxGlade insert new_classes>' % self.nonce) # set the ``persistent'' content of the file self.content = out_lines #"".join(out_lines) def is_import_line(self, line): return line.startswith('import wx') def format_classname(self, class_name): """Format class name read from existing source file. If we're in a subpackage, we should include the package name in the class name.""" if not self.multiple_files: return class_name name = self.name if self.out_dir: name = name.replace(self.out_dir, '') pkg = os.path.dirname(name).replace(os.sep, '.') if pkg.startswith('.'): pkg = pkg[1:] if pkg: return pkg + '.' + class_name else: return class_name class WidgetHandler(BaseWidgetHandler): pass class PythonCodeWriter(BaseLangCodeWriter, wcodegen.PythonMixin): "Code writer class for writing Python code out of the designed GUI elements" _code_statements = {'backgroundcolour': "%(objname)s.SetBackgroundColour(%(value)s)\n", 'contentnotfound': "pass", 'disabled': "%(objname)s.Enable(False)\n", 'extraproperties': "%(objname)s.Set%(propname_cap)s(%(value)s)\n", 'focused': "%(objname)s.SetFocus()\n", 'foregroundcolour': "%(objname)s.SetForegroundColour(%(value)s)\n", 'hidden': "%(objname)s.Hide()\n", 'setfont': "%(objname)s.SetFont(%(cnfont)s(%(size)s, %(family)s, " "%(style)s, %(weight)s, %(underlined)s, %(face)s))\n", 'tooltip': "%(objname)s.SetToolTipString(%(tooltip)s)\n", 'wxcolour': "wxColour(%(value)s)", 'wxnullcolour': "wxNullColour"} if compat.IS_CLASSIC: _code_statements['wxsystemcolour'] = "wxSystemSettings_GetColour(%(value)s)" _code_statements['tooltip_3' ] = "%(objname)s.SetToolTip(wx.ToolTip(%(tooltip)s))\n" else: _code_statements['wxsystemcolour'] = "wxSystemSettings.GetColour(%(value)s)" _code_statements['tooltip_3' ] = "%(objname)s.SetToolTip(%(tooltip)s)\n" class_separator = '.' indent_level_func_body = 2 name_ctor = '__init__' shebang = '#!/usr/bin/env python\n' SourceFileContent = SourceFileContent tmpl_name_do_layout = '__do_layout' tmpl_name_set_properties = '__set_properties' tmpl_encoding = "# -*- coding: %s -*-\n#\n" tmpl_class_end = '\n%(comment)s end of class %(klass)s\n' tmpl_class_end_nomarker = '\n' tmpl_ctor_call_layout = '\n%(tab)sself.__set_properties()\n%(tab)sself.__do_layout()\n' tmpl_func_empty = '%(tab)spass\n' tmpl_sizeritem = '%s.Add(%s, %s, %s, %s)\n' tmpl_gridbagsizeritem = '%s.Add(%s, %s, %s, %s, %s)\n' if compat.IS_CLASSIC: tmpl_gridbagsizerspacer = '%s.Add((%s, %s), %s, %s, %s, %s)\n' else: tmpl_gridbagsizerspacer = '%s.Add(%s, %s, %s, %s, %s, %s)\n' tmpl_style = '%(tab)skwds["style"] = %(style)s\n' tmpl_toplevel_style = '%(tab)skwds["style"] = kwds.get("style", 0) | %(style)s\n' tmpl_style0 = '%(tab)skwds["style"] = 0\n' tmpl_toplevel_style0 = '%(tab)skwds["style"] = kwds.get("style", 0)\n' tmpl_appfile = """\ %(overwrite)s\ %(header_lines)s\ %(import_gettext)s\ from %(top_win_module)s import %(top_win_class)s\n\n""" def _get_app_template(self, app, top_win): 'build template string for application' klass = app.klass if not self.app_name and not app.klass: return None ret = [''] if klass: # create application class if top_win and top_win.base=="wxDialog": # use ShowModal()/Destroy for dialogs show_code = ['%(tab)s%(tab)sself.%(top_win)s.ShowModal()', '%(tab)s%(tab)sself.%(top_win)s.Destroy()'] else: # use Show() for other toplevel windows show_code = ['%(tab)s%(tab)sself.%(top_win)s.Show()'] ret += ['class %(klass)s(%(cn_wxApp)s):', '%(tab)sdef OnInit(self):', '%(tab)s%(tab)sself.%(top_win)s = %(top_win_class)s(None, %(cn_wxIDANY)s, "")', '%(tab)s%(tab)sself.SetTopWindow(self.%(top_win)s)' ] + show_code + [ '%(tab)s%(tab)sreturn True', ''] if self._mark_blocks: ret.append( '# end of class %(klass)s\n' ) if self.app_name: # instantiate application class or PySimpleApp ret.append( 'if __name__ == "__main__":' ) if self._use_gettext: ret.append( '%(tab)sgettext.install("%(textdomain)s") # replace with the appropriate catalog name\n' ) if klass: ret.append( '%(tab)s%(name)s = %(klass)s(0)' ) ret.append( '%(tab)s%(name)s.MainLoop()' ) else: # use PySimpleApp if top_win and top_win.base=="wxDialog": show_code = ['%(tab)s%(top_win)s.ShowModal()', '%(tab)s%(top_win)s.Destroy()'] else: show_code = ['%(tab)s%(top_win)s.Show()'] ret += ['%(tab)s%(name)s = wx.PySimpleApp()', '%(tab)s%(top_win)s = %(top_win_class)s(None, %(cn_wxIDANY)s, "")', '%(tab)s%(name)s.SetTopWindow(%(top_win)s)' ] + show_code + [ '%(tab)s%(name)s.MainLoop()'] ret.append('') return '\n'.join(ret) def __init__(self): BaseLangCodeWriter.__init__(self) def init_lang(self, app): if self.preview and compat.PYTHON2: self.header_lines.append('from __future__ import print_function\n') self.header_lines.append('import wx\n') def add_app(self, app, top_win): # add language specific mappings self.lang_mapping = { 'cn_wxApp': self.cn('wxApp'), 'cn_wxIDANY': self.cn('wxID_ANY'), 'import_gettext': ''} # Add gettext import statements if self._use_gettext: if self.multiple_files: self.lang_mapping['import_gettext'] = 'import gettext\n' else: self.dependencies['import gettext\n'] = 1 BaseLangCodeWriter.add_app(self, app, top_win) def generate_code_ctor(self, code_obj, is_new, tab): code_lines = [] write = code_lines.append builder = self.obj_builders[code_obj.base] mycn = getattr(builder, 'cn', self.cn) mycn_f = getattr(builder, 'cn_f', self.cn_f) fmt_klass = self.cn_class(code_obj.klass) # custom base classes support custom_base = getattr(code_obj, 'custom_base', getattr(code_obj, 'custom_base', None) ) if self.preview or (custom_base and not custom_base.strip()): custom_base = None # generate constructor code if is_new: base = mycn(code_obj.base) if custom_base: base = ", ".join([b.strip() for b in custom_base.split(',')]) if self.preview and code_obj.klass == base: klass = code_obj.klass + ('_%d' % random.randrange(10 ** 8, 10 ** 9)) else: klass = code_obj.klass write('\nclass %s(%s):\n' % (self.get_class(fmt_klass), base)) write(self.tabs(1) + 'def __init__(self, *args, **kwds):\n') elif custom_base: # custom base classes set, but "overwrite existing sources" not set. Issue a warning about this self.warning( '%s has custom base classes, but you are not overwriting ' 'existing sources: please check that the resulting code is correct!' % code_obj.name ) if self._mark_blocks: # __init__ begin tag write(self.tmpl_block_begin % {'class_separator': self.class_separator, 'comment_sign': self.comment_sign, 'function':self.name_ctor, 'klass':fmt_klass, 'tab':tab} ) style_p = code_obj.properties.get("style") if style_p:# and style_p.value_set != style_p.default_value: style = style_p.get_string_value() m_style = mycn_f( style ) stmt_style = self._format_style(style, code_obj) if stmt_style: write(stmt_style % {'style': m_style, 'tab': tab} ) # initialise custom base class if custom_base: bases = [b.strip() for b in custom_base.split(',')] for i, b in enumerate(bases): if not i: write(tab + '%s.__init__(self, *args, **kwds)\n' % b) else: write(tab + '%s.__init__(self)\n' % b) else: write(tab + '%s.__init__(self, *args, **kwds)\n' % mycn(code_obj.base)) # set size here to avoid problems with splitter windows if 'size' in code_obj.properties and code_obj.properties["size"].is_active(): write( tab + self.generate_code_size(code_obj) ) # classes[code_obj.klass].deps now contains a mapping of child to parent for all children we processed... object_order = [] for obj in self.classes[code_obj.klass].child_order: # Don't add it again if already present if obj in object_order: continue object_order.append(obj) # Insert parent and ancestor objects before the current object current_object = obj for child, parent in self.classes[code_obj.klass].deps[:]: if child is current_object: if parent not in object_order: idx = object_order.index(current_object) object_order.insert(idx, parent) current_object = parent # We processed the dependency: remove it self.classes[code_obj.klass].deps.remove((child, parent)) # Write out the initialisation in the order we just generated for obj in object_order: if obj in self.classes[code_obj.klass].init_lines: for l in self.classes[code_obj.klass].init_lines[obj]: write(tab + l) return code_lines def generate_code_do_layout(self, builder, code_obj, is_new, tab): # Python has two indentation levels # 1st) for function declaration # 2nd) for function body self.tmpl_func_do_layout = '\n' + self.tabs(1) + 'def __do_layout(self):\n%(content)s' return BaseLangCodeWriter.generate_code_do_layout( self, builder, code_obj, is_new, tab ) def generate_code_event_bind(self, code_obj, tab, event_handlers): code_lines = [] write = code_lines.append if event_handlers: write('\n') for win_id, event, handler, unused in event_handlers: if win_id is None: continue # bound already, the entry is just for creation of the method stub if win_id.startswith('#'): win_id = win_id[1:] else: win_id = 'id=%s' % win_id if not handler.startswith("lambda "): handler = 'self.%s'%handler if 'EVT_NAVIGATION_KEY' in event: tmpl = '%(tab)sself.Bind(%(event)s, %(handler)s)\n' else: tmpl = '%(tab)sself.Bind(%(event)s, %(handler)s, %(win_id)s)\n' details = {'tab':tab, 'event':self.cn(event), 'handler':handler, 'win_id':win_id} write(tmpl % details) return code_lines def generate_code_event_handler(self, code_obj, is_new, tab, prev_src, event_handlers): # generate default event handler, calling event.Skip() # Python has two indentation levels # 1st) for function declaration # 2nd) for function body stub = [self.tabs(1), "def %(handler)s(self, event):"] if self._mark_blocks: stub.append(" # wxGlade: %(klass)s.") stub.append( """\n%(tab)sprint("Event handler '%(handler)s' not implemented!")\n""" ) stub.append( '%(tab)sevent.Skip()\n' ) self.tmpl_func_event_stub = "".join(stub) event_handlers = [handler for handler in event_handlers if not handler[2].startswith("lambda ")] return BaseLangCodeWriter.generate_code_event_handler( self, code_obj, is_new, tab, prev_src, event_handlers ) def generate_code_id(self, obj, id=None): if obj and self.preview: return '', '-1' # never generate ids for preview code if id is None: id = obj.window_id if not id: if obj is not None and "stockitem" in obj.properties and obj.stockitem: return '', self.cn("wxID_" + obj.stockitem) return '', self.cn('wxID_ANY') id = str(id) tokens = id.split('=', 1) if len(tokens) == 2: name, val = tokens else: return '', self.cn(tokens[0]) # we assume name is declared elsewhere if not name: return '', self.cn(val) name = name.strip() val = val.strip() if val == '?': val = self.cn('wxNewId()') else: val = self.cn(val) # check to see if we have to make the var global or not... if '.' in name: return '%s = %s\n' % (name, val), name return 'global %s; %s = %s\n' % (name, name, val), name def generate_code_set_properties(self, builder, code_obj, is_new, tab): # Python has two indentation levels # 1st) for function declaration # 2nd) for function body self.tmpl_func_set_properties = '\n' + self.tabs(1) + 'def __set_properties(self):\n%(content)s' return BaseLangCodeWriter.generate_code_set_properties( self, builder, code_obj, is_new, tab ) def generate_code_size(self, obj, size=None): objname = self.format_generic_access(obj) if size is None: size = obj.properties["size"].get_string_value() use_dialog_units = (size[-1] == 'd') if not obj.parent: method = 'SetSize' else: method = 'SetMinSize' if use_dialog_units: if compat.IS_CLASSIC: return '%s.%s(%s(%s, (%s)))\n' % ( objname, method, self.cn('wxDLG_SZE'), objname, size[:-1] ) else: return '%s.%s(%s(%s, %s(%s)))\n' % ( objname, method, self.cn('wxDLG_UNIT'), objname, self.cn("wxSize"), size[:-1] ) else: return '%s.%s((%s))\n' % (objname, method, size) def _quote_str(self, s): """\ Escape all unicode characters to there unicode code points in form of \\uxxxx. The returned string is a pure ascii string. Normal ascii characters like \\n or \\t won't be escaped. @note: wxGlade don't handles file encoding well currently. Thereby we escape all unicode characters. @note: The string 's' is encoded with L{self.app_encoding} already. @see: L{BaseLangCodeWriter._quote_str} for additional details @see: L{_recode_x80_xff()} """ # convert all strings to unicode first if not isinstance(s, compat.unicode): s = s.decode(self.app_encoding) # check if it's pure ascii try: dummy = s.encode('ascii') if self._use_gettext: return '_("%s")' % s else: return '"%s"' % s except UnicodeError: pass # escape the unicode characters if given encoding requires it try: s.encode(self.app_encoding) except UnicodeEncodeError: s = s.encode('raw-unicode-escape') s = self._recode_x80_xff(s) s = s.decode("ASCII") # convert unicode strings to pure ascii # use "raw-unicode-escape" just escaped unicode characters and not default escape sequences if self._use_gettext: return '_(u"%s")' % s # XXX omit u for Python 3 else: return 'u"%s"' % s # XXX omit u for Python 3 def add_object_format_name(self, name): return '#self.%s' % name def _format_classattr(self, obj): res = BaseLangCodeWriter._format_classattr(self, obj) if not res: return res elif obj.name.startswith('self.'): return obj.name # spacer.name is ", " already, but wxPython expect a tuple instead of two single values elif obj.klass in ('spacer','sizerslot'): return '(%s)' % obj.name elif self.store_as_attr(obj): return 'self.%s' % obj.name return obj.name def _format_import(self, klass): stmt = 'from %s import %s\n' % (klass, self.get_class(klass)) return stmt def _get_class_filename(self, klass): filename = os.path.join( self.out_dir, klass.replace('.', os.sep) + '.py' ) return filename def format_generic_access(self, obj): if obj.is_toplevel: return 'self' else: return self._format_classattr(obj) writer = PythonCodeWriter() # The code writer is an instance of L{PythonCodeWriter}. language = writer.language # Language generated by this code generator wxGlade-0.9.4/codegen/xrc_codegen.py000066400000000000000000000407321352706171500173720ustar00rootroot00000000000000"""\ XRC code generator Generates the xml code for the app in XRC format. Calls the appropriate ``writers'' of the various objects. These functions return an instance of XrcObject @copyright: 2002-2007 Alberto Griggio @copyright: 2012-2016 Carsten Grohmann @license: MIT (see LICENSE.txt) - THIS PROGRAM COMES WITH NO WARRANTY """ from xml.sax.saxutils import escape, quoteattr from codegen import BaseLangCodeWriter from collections import OrderedDict import common, compat, errors import new_properties as np import wcodegen class XrcObject(wcodegen.XrcWidgetCodeWriter): "Class to produce the XRC code for a given widget. This is a base class which does nothing" def __init__(self, klass=None): wcodegen.XrcWidgetCodeWriter.__init__(self, klass) self.properties = {} self.children = [] # sub-objects def write_child_prologue(self, child, output, ntabs): pass def write_child_epilogue(self, child, output, ntabs): pass def write_property(self, name, val, outfile, ntabs): pass def write(self, output, ntabs, properties=None): pass def warning(self, msg): "Show a warning message" self._logger.warning(msg) class SizerItemXrcObject(XrcObject): "XrcObject to handle sizer items" def __init__(self, obj, proportion, flag, border): XrcObject.__init__(self) self.obj = obj # the XrcObject representing the widget self.proportion = proportion self.flag = flag self.border = border def write(self, output, ntabs, properties=None): tabs = self.tabs(ntabs) tabs1 = self.tabs(ntabs + 1) output.append(tabs + '\n') if self.proportion != '0': output.append(tabs1 + '\n' % self.proportion) if self.flag and self.flag != '0': output.append(tabs1 + '%s\n' % self.cn_f(self.flag)) if self.border != '0': output.append(tabs1 + '%s\n' % self.border) # write the widget self.obj.write(output, ntabs + 1) output.append(tabs + '\n') class SpacerXrcObject(XrcObject): "XrcObject to handle widgets" def __init__(self, size_str, option, flag, border): XrcObject.__init__(self) self.size_str = size_str self.proportion = option self.flag = flag self.border = border def write(self, output, ntabs): tabs = self.tabs(ntabs) tabs1 = self.tabs(ntabs + 1) output.append(tabs + '\n') output.append(tabs1 + '%s\n' % self.size_str.strip()) if self.proportion != '0': output.append(tabs1 + '\n' % self.proportion) if self.flag and self.flag != '0': output.append(tabs1 + '%s\n' % self.cn_f(self.flag)) if self.border != '0': output.append(tabs1 + '%s\n' % self.border) output.append(tabs + '\n') class DefaultXrcObject(XrcObject): "Standard XrcObject for every widget, used if no specific XrcObject is available" def __init__(self, widget): XrcObject.__init__(self, widget.klass) self.widget = widget self.name = widget.name self.klass = widget.base # custom classes aren't allowed in XRC self.subclass = widget.klass def write_property(self, name, val, output, ntabs): if not val: return if isinstance(val, np.BitmapProperty): # rename: no '..._bitmap' and some renames if name.endswith('_bitmap'): name = name[:-7] if name=="pressed": name = "selected" elif name=="current": name = "hover" prop = self._format_bitmap_property(name, val.get_value(), ntabs) else: prop = common.format_xml_prop(name, val, ntabs) output.append(prop) def _format_bitmap_property(self, name, val, ntabs): "Return formatted bitmap/icon XRC property (as string)." if val.startswith('art:'): content = val[4:] elements = [item.strip() for item in content.split(',')] art_id = elements[0] art_client = elements[1] if art_client != 'wxART_OTHER': return common.format_xml_prop( name, '', ntabs, stock_id=art_id, stock_client=art_client ) else: return common.format_xml_prop(name, u'', ntabs, stock_id=art_id) elif val.startswith('code:') or val.startswith('empty:') or val.startswith('var:'): self._logger.warn( _('XRC: Unsupported bitmap statement "%s" for %s "%s"'), val, self.klass, self.name ) return None return common.format_xml_prop(name, val, ntabs) def write(self, output, ntabs, properties=None): if properties is None: properties = {} if "name" in properties: name = properties["name"] del properties["name"] else: name = self.name if self.widget.is_sizer: output.append(self.tabs(ntabs) + '\n' % quoteattr(self.klass)) else: if self.subclass and self.subclass != self.klass: output.append(self.tabs(ntabs) + '\n' % ( quoteattr(self.klass), quoteattr(name), quoteattr(self.subclass)) ) else: output.append(self.tabs(ntabs) + '\n' % (quoteattr(self.klass), quoteattr(name))) tab_str = self.tabs(ntabs + 1) # write the properties import edit_sizers active_properties = self.widget.get_properties(without=set(edit_sizers.SizerBase.MANAGED_PROPERTIES)) font = None for prop in active_properties: if not prop.is_active(): continue if prop.value==prop.default_value: continue name = prop.name if name in properties: continue # set already value = None if name=='foreground': value = prop.get_string_value() if not value.startswith('#'): # XRC does not support colors from system settings continue name = 'fg' elif name=='background': value = prop.get_string_value() if not value.startswith('#'): # XRC does not support colors from system settings continue name = "bg" elif name=='font': font = prop.value continue elif name=="style": if hasattr(prop, "value_set"): if prop.value_set==prop.default_value: continue value = prop.get_string_value() if value: value = self.cn_f(value) elif name=='id': continue # id has no meaning for XRC elif name=='events': for win_id, event, handler, event_type in self.get_event_handlers(self.widget): output.append(tab_str + '%s\n' % (quoteattr(event), escape(handler))) continue elif name=='disabled': # 'disabled' property is actually 'enabled' for XRC if prop.get(): properties['enabled'] = '0' continue elif name=='custom_base' in self.properties: # custom base classes are ignored for XRC... continue elif name=='extraproperties': value = prop.get() if value: properties.update(value) continue if isinstance(prop, np.BitmapProperty): value = prop else: if value is None: value = prop.get_string_value() if value is None: continue properties[name] = value for name in sorted( properties.keys() ): value = properties[name] if value is None: continue self.write_property( name, value, output, ntabs + 1) # write the font, if present if font: output.append(tab_str + '\n') tab_str = self.tabs(ntabs + 2) data = sorted( zip(['size','family','style','weight','underlined','face'], font) ) for key, val in data: if isinstance(val, int): val = str(val) if val: output.append(tab_str + '<%s>%s\n' % (escape(key), escape(val), escape(key))) output.append(self.tabs(ntabs + 1) + '\n') # write the children for c in self.children: self.write_child_prologue(c, output, ntabs + 1) c.write(output, ntabs + 1) self.write_child_epilogue(c, output, ntabs + 1) output.append(self.tabs(ntabs) + '\n') class NotImplementedXrcObject(XrcObject): """XrcObject used when no code for the widget can be generated (for example, because XRC does not currently handle such widget)""" def __init__(self, code_obj): XrcObject.__init__(self) self.code_obj = code_obj def write(self, output, ntabs): msg = 'code generator for %s objects not available' % self.code_obj.base self.warning('%s' % msg) output.append( '%s%s\n' % (self.tabs(ntabs), self._format_comment(msg)) ) class XRCCodeWriter(BaseLangCodeWriter, wcodegen.XRCMixin): "Code writer class for writing XRC XML code out of the designed GUI elements" # dict of active XrcObject instances: during the code generation it stores all the non-sizer objects that have # children (i.e. frames, dialogs, panels, notebooks, etc.), while at the end of the code generation, # before finalize is called, it contains only the true toplevel objects (frames and dialogs), and is used to write # their XML code (see finalize). The other objects are deleted when add_object is called with their corresponding # code_object as argument (see add_object) xrc_objects = None property_writers = {} # dict of dicts of property handlers specific for a widget; keys: class names of the widgets obj_builders = {} # Dictionary of ``writers'' for the various objects tmpl_encoding = '\n' tmpl_generated_by = '' use_names_for_binding_events = False # inject different XRC objects XrcObject = XrcObject SizerItemXrcObject = SizerItemXrcObject SpacerXrcObject = SpacerXrcObject DefaultXrcObject = DefaultXrcObject NotImplementedXrcObject = NotImplementedXrcObject def __init__(self): BaseLangCodeWriter.__init__(self) # Inject to all classed derived from WrcObject if not hasattr(XrcObject, 'tabs'): XrcObject.tabs = self.tabs if not hasattr(XrcObject, '_format_comment'): XrcObject._format_comment = self._format_comment def init_lang(self, app): # for now we handle only single-file code generation if self.multiple_files: raise errors.WxgXRCMultipleFilesNotSupported() # overwrite existing sources always self._overwrite = True self.output_file_name = app.output_path self.out_file = [] self.out_file.append('\n\n') self.curr_tab = 1 self.xrc_objects = OrderedDict() def finalize(self): # write the code for every toplevel object for obj in self.xrc_objects.values(): obj.write(self.out_file, 1) self.out_file.append('\n') # store the contents to file self.save_file( self.output_file_name, self.out_file ) self.out_file = None def _clean_up_node(self, node): if hasattr(node.widget, "xrc"): del node.widget.xrc for c in node.children or []: self._clean_up_node(c) def clean_up(self, root): # root is a Tree node self._clean_up_node(root) def add_app(self, app, top_win_class): "In the case of XRC output, there's no wxApp code to generate" pass def add_object(self, sub_obj): "Adds the object sub_obj to the XRC tree. The first argument is unused." # what we need in XRC is not top_obj, but sub_obj's true parent we don't need the sizer, but the window top_obj = sub_obj.node.parent.widget while top_obj.is_sizer: top_obj = top_obj.node.parent.widget builder = self.obj_builders.get( sub_obj.base, DefaultXrcObject ) try: # check whether we already created the xrc_obj xrc_obj = sub_obj.xrc except AttributeError: xrc_obj = builder(sub_obj) # builder functions must return a subclass of XrcObject sub_obj.xrc = xrc_obj else: # if we found it, remove it from the self.xrc_objects dictionary # (if it was there, i.e. the object is not a sizer), because this isn't a true toplevel object if sub_obj in self.xrc_objects: del self.xrc_objects[sub_obj] # let's see if sub_obj's parent already has an XrcObject: if so, it's temporarily stored in self.xrc_objects if top_obj in self.xrc_objects: top_xrc = self.xrc_objects[top_obj] else: # ...otherwise, create it and store it in the self.xrc_objects dict top_xrc = self.obj_builders.get( top_obj.base, DefaultXrcObject )(top_obj) top_obj.xrc = top_xrc self.xrc_objects[top_obj] = top_xrc top_obj.xrc.children.append(xrc_obj) def add_sizeritem(self, unused, sizer, obj, option, flag, border): "Adds a sizeritem to the XRC tree. The first argument is unused." # what we need in XRC is not toplevel, but sub_obj's true parent toplevel = obj.node.parent.widget while toplevel.is_sizer: toplevel = toplevel.node.parent.widget top_xrc = toplevel.xrc obj_xrc = obj.xrc try: sizer_xrc = sizer.xrc except AttributeError: # if the sizer has not an XrcObject yet, create it now sizer_xrc = self.obj_builders.get( sizer.base, DefaultXrcObject )(sizer) sizer.xrc = sizer_xrc # we now have to move the children from 'toplevel' to 'sizer' index = top_xrc.children.index(obj_xrc) if obj.klass == 'spacer': w = obj.properties.get('width', '0') h = obj.properties.get('height', '0') obj_xrc = SpacerXrcObject( '%s, %s' % (w, h), str(option), str(flag), str(border) ) sizer.xrc.children.append(obj_xrc) elif obj.klass == 'sizerslot': obj_xrc = SpacerXrcObject( '0, 0', '0', '0', '0' ) sizer.xrc.children.append(obj_xrc) else: sizeritem_xrc = SizerItemXrcObject( obj_xrc, str(option), str(flag), str(border) ) sizer.xrc.children.append(sizeritem_xrc) del top_xrc.children[index] def add_spacer(self, topl, sizer, obj=None, option=0, flag='0', border=0): if obj is not None: w = obj.width h = obj.height else: h = w = 0 obj_xrc = SpacerXrcObject( '%s, %s' % (w,h), str(option), str(flag), str(border) ) if not hasattr(sizer, "xrc"): # if the sizer has not an XrcObject yet, create it now sizer.xrc = self.obj_builders.get( sizer.base, DefaultXrcObject )(sizer) sizer.xrc.children.append(obj_xrc) def add_class(self, code_obj): """Add class behaves very differently for XRC output than for other languages (i.e. python): since custom classes are not supported in XRC, this has effect only for true toplevel widgets, i.e. frames and dialogs. For other kinds of widgets, this is equivalent to add_object""" if not code_obj in self.xrc_objects: builder = self.obj_builders.get( code_obj.base, DefaultXrcObject ) xrc_obj = builder(code_obj) code_obj.xrc = xrc_obj # add the xrc_obj to the dict of the toplevel ones self.xrc_objects[code_obj] = xrc_obj def generate_code_id(self, obj, id=None): return '', '' def _format_comment(self, msg): return '' % escape(msg.rstrip()) def _quote_str(self, s): return s writer = XRCCodeWriter() # The code writer is an instance of XRCCodeWriter language = writer.language # Language generated by this code generator wxGlade-0.9.4/color_dialog.py000066400000000000000000000147731352706171500161510ustar00rootroot00000000000000""" Dialog to select a color @copyright: 2007 Marcello Semboli @copyright: 2016 Carsten Grohmann @copyright: 2016 Dietmar Schwertberger @license: MIT (see LICENSE.txt) - THIS PROGRAM COMES WITH NO WARRANTY """ import wx from wx.lib.colourchooser import PyColourChooser import misc, compat try: from wx.lib.colourchooser import ColourChangedEvent, ColourChangedEventBase ColourChangedEvent(None) except TypeError: class ColourChangedEvent(ColourChangedEventBase): """Adds GetColour()/GetValue() for compatibility with ColourPickerCtrl and colourselect""" def __init__(self, newColour): super(ColourChangedEvent, self).__init__(newColour = newColour) def GetColour(self): return self.newColour def GetValue(self): return self.newColour class PyColourChooser(PyColourChooser): def updateDisplayColour(self, colour): """Update the displayed color box (solid) and send the EVT_COLOUR_CHANGED""" self.solid.SetColour(colour) evt = ColourChangedEvent(newColour=colour) wx.PostEvent(self, evt) except ImportError: pass # for wxPython 2.8 class wxGladeColorDialog(wx.Dialog): def __init__(self, colors_dict, parent=None): wx.Dialog.__init__(self, parent, -1, "") self.colors_dict = colors_dict choices = list( self.colors_dict.keys() ) choices.sort() self.panel_1 = wx.Panel(self, -1) self.use_null_color = wx.RadioButton( self.panel_1, -1, "wxNullColour", style=wx.RB_GROUP ) self.use_sys_color = wx.RadioButton( self.panel_1, -1, _("System Color") ) self.sys_color = wx.ComboBox( self.panel_1, -1, choices=choices, style=wx.CB_DROPDOWN | wx.CB_READONLY) self.sys_color_panel = wx.Panel(self.panel_1, -1, size=(250, 20)) self.sys_color_panel.SetBackgroundColour(wx.RED) self.use_chooser = wx.RadioButton(self.panel_1, -1, _("Custom Color")) self.color_chooser = PyColourChooser(self, -1) self.ok = wx.Button(self, wx.ID_OK, _("OK")) self.cancel = wx.Button(self, wx.ID_CANCEL, _("Cancel")) self.__set_properties() self.__do_layout() self.use_null_color.Bind(wx.EVT_RADIOBUTTON, self.on_use_null_color) self.use_sys_color.Bind(wx.EVT_RADIOBUTTON, self.on_use_sys_color) self.use_chooser.Bind(wx.EVT_RADIOBUTTON, self.on_use_chooser) self.sys_color.Bind(wx.EVT_COMBOBOX, self.display_sys_color) self.display_sys_color() for ctrl in (self.use_null_color, self.use_sys_color, self.use_chooser): ctrl.Bind(wx.EVT_LEFT_DCLICK, lambda evt: self.EndModal(wx.ID_OK) ) def display_sys_color(self, event=None): colour = self.sys_color.GetValue().strip() if colour.startswith("wxSYS_COLOUR_"): colour = getattr(wx, colour[2:], None) else: colour = None if colour: self.sys_color.SetBackgroundColour(wx.WHITE) colour = compat.wx_SystemSettings_GetColour(colour) else: self.sys_color.SetBackgroundColour(wx.RED) colour = wx.NullColour self.sys_color_panel.SetBackgroundColour(colour) self.sys_color_panel.Refresh() def on_use_null_color(self, event): self.sys_color.Enable(False) self.color_chooser.Enable(False) self.use_chooser.SetValue(0) self.use_sys_color.SetValue(0) def on_use_sys_color(self, event): self.sys_color.Enable(True) self.color_chooser.Enable(False) self.use_chooser.SetValue(0) self.use_null_color.SetValue(0) def on_use_chooser(self, event): self.sys_color.Enable(False) self.color_chooser.Enable(True) self.use_sys_color.SetValue(0) self.use_null_color.SetValue(0) def get_value(self): if self.use_null_color.GetValue(): return "wxNullColour" if self.use_sys_color.GetValue(): return self.sys_color.GetStringSelection() else: return misc.color_to_string(self.color_chooser.GetValue()) def set_value(self, value): value = value.strip() if value=="wxNullColour": self.use_null_color.SetValue(1) self.use_sys_color.SetValue(0) self.use_chooser.SetValue(0) self.sys_color.Enable(False) self.color_chooser.Enable(False) elif value in self.colors_dict: self.use_sys_color.SetValue(1) self.use_chooser.SetValue(0) self.use_null_color.SetValue(0) self.sys_color.SetValue(value) self.sys_color.Enable(True) self.color_chooser.Enable(False) else: self.use_chooser.SetValue(1) self.use_sys_color.SetValue(0) self.use_null_color.SetValue(0) try: self.color_chooser.SetValue(misc.string_to_color(value)) except: pass self.sys_color.Enable(False) self.color_chooser.Enable(True) def __set_properties(self): self.SetTitle(_("Select widget colour")) self.use_sys_color.SetValue(1) self.sys_color.SetSelection(0) self.ok.SetDefault() self.use_chooser.SetValue(0) self.color_chooser.Enable(False) def __do_layout(self): sizer_1 = wx.BoxSizer(wx.VERTICAL) sizer_3 = wx.BoxSizer(wx.HORIZONTAL) sizer_2 = wx.BoxSizer(wx.VERTICAL) sizer_2.Add(self.use_null_color, 0, wx.LEFT|wx.RIGHT|wx.TOP|wx.EXPAND, 5) sizer_2.Add(wx.StaticLine(self.panel_1, -1), 0, wx.ALL|wx.EXPAND, 5) sizer_2.Add(self.use_sys_color, 0, wx.LEFT|wx.RIGHT|wx.TOP|wx.EXPAND, 5) sizer_2.Add(self.sys_color, 0, wx.ALL|wx.EXPAND, 5) sizer_2.Add(self.sys_color_panel, 0, wx.ALL|wx.EXPAND, 5) sizer_2.Add(wx.StaticLine(self.panel_1, -1), 0, wx.ALL|wx.EXPAND, 5) sizer_2.Add(self.use_chooser, 0, wx.LEFT|wx.RIGHT|wx.TOP|wx.EXPAND, 5) self.panel_1.SetAutoLayout(1) self.panel_1.SetSizer(sizer_2) sizer_2.Fit(self.panel_1) sizer_2.SetSizeHints(self.panel_1) sizer_1.Add(self.panel_1, 0, wx.EXPAND, 0) sizer_1.Add(self.color_chooser, 0, wx.ALL, 5) sizer_2.Add(wx.StaticLine(self.panel_1, -1), 0, wx.ALL|wx.EXPAND, 5) sizer_3.Add(self.ok, 0, wx.RIGHT, 13) sizer_3.Add(self.cancel, 0, 0, 5) sizer_1.Add(sizer_3, 0, wx.ALL|wx.ALIGN_RIGHT, 10) self.SetAutoLayout(1) self.SetSizer(sizer_1) sizer_1.Fit(self) sizer_1.SetSizeHints(self) self.Layout() wxGlade-0.9.4/common.py000066400000000000000000001067531352706171500150040ustar00rootroot00000000000000"""\ Global functions and variables @copyright: 2002-2007 Alberto Griggio @copyright: 2013-2016 Carsten Grohmann @copyright: 2016 Dietmar Schwertberger @license: MIT (see LICENSE.txt) - THIS PROGRAM COMES WITH NO WARRANTY """ import codecs, errno try: # Python 2 import ConfigParser from md5 import new as md5 except: # Python 3 import configparser as ConfigParser from hashlib import md5 from collections import OrderedDict import logging, os, os.path, sys, tempfile from xml.sax.saxutils import escape, quoteattr import config, compat, plugins widgets = {} # all widgets: EditWidget class name -> factory(parent, sizer, pos) widgets_from_xml = {} # Factory functions to build objects from a XML file class_names = {} # maps the name of the classes used by wxGlade to the correspondent classes of wxWindows toplevels = {} # names of the Edit classes that can be toplevels, i.e. class declaration will be generated in the code # references to windows: main = None # main window palette = None # the panel which contains the various buttons to add the different widgets property_panel = None # panel for editing the current widgets properties app_tree = None # widget hierarchy of the application; root is application itself; a tree.WidgetTree instance # these will be set when clicking an item on the palette window: adding_widget = False # If True, the user is adding a widget to some sizer adding_sizer = False # "Needed to add toplevel sizers" widget_to_add = None # widget class name that is being added adding_window = None # the tree or the design window; used for centering dialogs pin_design_window = False # Dictionary which maps the ids used in the event handlers to the corresponding widgets: # used to call the appropriate builder function when a dropping of a widget occurs, knowing only the id of the event refs = {} history = None ######################################################################################################################## # application initialization code_writers = {} """Dictionary of language name -> BaseLangCodeWriter objects used to generate the code in a given language. @note: A code writer object must implement this interface: - new_project(out_path, multi_files) - language - setup - add_widget_handler(widget_name, handler[, properties_handler]) - add_property_handler(property_name, handler[, widget_name]) - add_object(top_obj, sub_obj) - add_class(obj) - add_sizeritem(toplevel, sizer, obj_name, option, flag, border) - add_app(app_attrs, top_win_class) - ... """ def init_codegen(): """Load available code generators, built-in and user widgets as well as sizers @return: In GUI-Mode: a dict with module sections as key and assigned list of wxBitmapButtons, the dict is empty in batch mode. @rtype: OrderedDict @see: L{load_config()} @see: L{load_code_writers()} @see: L{load_widgets()} @see: L{load_sizers()}""" # process generic related style attributes style_attrs_to_sets(config.widget_config['generic_styles']) load_config() load_code_writers() all_widgets = load_widgets() sizer_buttons = load_sizers() # merge sizer buttons for section in sizer_buttons: if section not in all_widgets: all_widgets[section] = sizer_buttons[section] else: all_widgets[section].extend(sizer_buttons[section]) return all_widgets def load_code_writers(): "Fills the common.code_writers dictionary: to do so, loads the modules found in the 'codegen/' subdir" logging.info('Load code generators:') codegen_path = os.path.join(config.wxglade_path, 'codegen') sys.path.insert(0, codegen_path) for module in os.listdir(codegen_path): name, ext = os.path.splitext(module) # skip __init__ if name == "__init__": continue # allow regular files only if not os.path.isfile(os.path.join(codegen_path, module)): continue # ignore none python files if ext not in ['.py', '.pyo', '.pyc']: continue # skip already imported modules if name in sys.modules: continue # import file and initiate code writer try: writer = __import__(name).writer except (AttributeError, ImportError, NameError, SyntaxError, ValueError): logging.exception( _('"%s" is not a valid code generator module'), module ) else: code_writers[writer.language] = writer if config.use_gui: logging.info( _(' %s generator loaded'), writer.language ) def load_config(): "Load widget configuration; @see: L{plugins.load_widgets_from_dir()}" # load the "built-in" and "user" widgets plugins.load_widgets_from_dir( config.widgets_path, 'wconfig' ) plugins.load_widgets_from_dir( config.preferences.local_widget_path, 'wconfig' ) return def load_sizers(): """Load and initialise the sizer support modules into ordered dict instance. See edit_sizers.edit_sizers.init_all.""" logging.info('Load sizer generators:') for lang in code_writers.keys(): module_name = 'edit_sizers.%s_sizers_codegen' % code_writers[lang].lang_prefix try: sizer_module = plugins.import_module(config.wxglade_path, module_name) if not sizer_module: # error already logged pass elif hasattr(sizer_module, 'initialize'): sizer_module.initialize() else: logging.warning( _('Missing function "initialize()" in imported module %s. Skip initialisation.'), module_name) if config.use_gui: logging.info(_(' for %s'), lang) except (AttributeError, ImportError, NameError, SyntaxError, ValueError): logging.exception( _('ERROR loading module "%s"'), module_name ) except: logging.exception( _('Unexpected error during import of widget module %s'), module_name ) # initialise sizer GUI elements import edit_sizers return edit_sizers.init_gui() def load_widgets(): """Load built-in and user widgets. Scans the built-in and user widget directories to find the installed widgets and loads it. @rtype: OrderedDict @see: L{plugins.load_widgets_from_dir()} for more details e.g. the structure of the dictionary.""" # load the "built-in" and "user" widgets core_buttons = plugins.load_widgets_from_dir(config.widgets_path, default_section=_('Core widgets')) local_buttons = plugins.load_widgets_from_dir(config.preferences.local_widget_path, default_section=_('Custom widgets')) # load (remaining) widget code generators # Python, C++ and XRC are often loaded via plugins.load_widgets_from_dir() above for path in [config.widgets_path, config.preferences.local_widget_path]: for lang in ['perl', 'lisp']: if lang not in code_writers: continue codegen_name = '%s_codegen' % code_writers[lang].lang_prefix plugins.load_widgets_from_dir( path, submodule=codegen_name ) all_widgets = OrderedDict() all_widgets.update(core_buttons) for section in local_buttons: if section not in all_widgets: all_widgets[section] = local_buttons[section] else: all_widgets[section].extend(local_buttons[section]) return all_widgets ######################################################################################################################## # user interaction def add_object(event): "Adds a widget or a sizer to the current app" global adding_widget, adding_sizer, widget_to_add tmp = event.GetId() widget_to_add = refs[tmp] adding_widget = True adding_sizer = "Sizer" in widget_to_add btn = event.GetEventObject() if compat.version >= (3,0): btn.SetValue(True) palette.reset_togglebuttons(keep=btn) msg = "Adding %s; click on free (hatched) sizer slot to place it" main.user_message( msg%widget_to_add.lstrip("Edit") ) def add_toplevel_object(event): "Adds a toplevel widget (Frame or Dialog) to the current app" palette.reset_togglebuttons() widgets[refs[event.GetId()]](None, None, 0) app_tree.app.saved = False ######################################################################################################################## # application GUI initialization def make_object_button(widget, icon_path, toplevel=False, tip=None): """Creates a button for the widgets toolbar. Function used by the various widget modules to add a button to the widgets toolbar. Icons with a relative path will be loaded from config.icon_path. widget: (name of) the widget the button will add to the app icon_path: Path to the icon_path used for the button toplevel: True if the widget is a toplevel object (frame, dialog) tip: Tool tip to display return: The newly created wxBitmapButton instance""" if not config.use_gui: return None import wx import misc from tree import WidgetTree if not os.path.isabs(icon_path): icon_path = os.path.join(config.icons_path, icon_path) bmp = misc.get_xpm_bitmap(icon_path) if compat.version < (3,0): # old wx version: use BitmapButton tmp = wx.BitmapButton(palette, -1, bmp, size=(31,31)) if not toplevel: tmp.Bind(wx.EVT_BUTTON, add_object) else: tmp.Bind(wx.EVT_BUTTON, add_toplevel_object) else: if not toplevel: tmp = wx.ToggleButton(palette, -1, size=(31,31)) tmp.Bind(wx.EVT_TOGGLEBUTTON, add_object) else: tmp = wx.Button(palette, -1, size=(31,31)) tmp.Bind(wx.EVT_BUTTON, add_toplevel_object) tmp.SetBitmap( bmp ) refs[tmp.GetId()] = widget if not tip: tip = _('Add a %s') % widget.replace(_('Edit'), '') tmp.SetToolTip(wx.ToolTip(tip)) WidgetTree.images[widget] = icon_path return tmp def encode_to_unicode(item, encoding=None): """Decode the item to a Unicode string. The encoding to UTF-8 will be done later. Non-string items will be converted to string automatically. If no encoding given, app_tree.app.encoding or 'UFT-8' will be used.""" if not isinstance(item, compat.basestring): item = str(item) if isinstance(item, compat.unicode): return item encoding = encoding or (app_tree and app_tree.app.encoding) or "UTF-8" item = item.decode(encoding) return item def register(lang, klass_name, code_writer, property_name=None, property_handler=None, widget_name=None): """Initialise and register widget code generator instance. The property handler will registered additionally. lang: Code code_writer language klass_name: wxWidget class name code_writer: Code generator class property_name: Property name property_handler: Property handler widget_name: Widget name see: L{codegen.BaseLangCodeWriter.add_widget_handler(), codegen.BaseLangCodeWriter.add_property_handler()""" codegen = code_writers[lang] if codegen: codegen.add_widget_handler(klass_name, code_writer) if property_name and property_handler: codegen.add_property_handler(property_name, property_handler, widget_name) ######################################################################################################################## # file utilities def _smart_checksum(content): """Generate a "smart" checksum of the given content. The version line "generated by wxGlade" as well as tailing whitespaces will ignored during generation of the checksum. Returns a strings. The version line will be ignored within the first ten lines only. content: Content to generate a checksum for; list of bytes""" chksum = md5() # use md5 to be compatible with Python 2.4 for i,line in enumerate(content): if isinstance(line, compat.unicode): line = line.encode('utf-8') if b'generated by wxGlade' in line and i<10: continue chksum.update(line.rstrip()) return chksum.hexdigest() def _read_file(filename): "read file into a list of lines (bytes); line ending is normalized to \n" ret = [] with open(filename, "rb") as f: for line in f.readlines(): if line.endswith(b"\r\n"): line = line[:-2]+b"\n" yield line def save_file(filename, content, which='wxg'): """Save content to named file and, if user's preferences say so and filename exists, makes a backup copy of it. The content of 'wxg' files must be Unicode always! Exceptions that may occur while performing the operations are not handled. see: config.backed_up filename: Name of the file to create content: list of strings to store into 'filename' which: Kind of backup: 'wxg' or 'codegen'""" if which == 'wxg': content = [line.encode('utf-8') for line in content] # encode from unicode to utf-8 do_backup = config.preferences.wxg_backup elif which == 'codegen': do_backup = config.preferences.codegen_backup else: raise NotImplementedError( 'Unknown value "%s" for parameter "which"!' % which ) if os.path.isfile(filename): # read existing file to check content chksum_oldcontent = _smart_checksum( _read_file(filename) ) # nothing changed? chksum_content = _smart_checksum(content) if chksum_oldcontent == chksum_content: return # create the backup file only with the first save need_backup = do_backup and filename not in config.backed_up and os.path.isfile(filename) outfile = None try: if need_backup: backup_name = filename + config.preferences.backup_suffix if os.path.isfile(backup_name): os.remove(backup_name) os.rename(filename, backup_name) config.backed_up[filename] = True # create necessary subdirectories on demand directory = os.path.dirname(filename) if directory and not os.path.isdir(directory): os.makedirs(directory) outfile = open(filename, 'wb') for line in content: if sys.platform.startswith("win"): line = line.replace(b"\n", b"\r\n") outfile.write(line) outfile.close() finally: if outfile: outfile.close() ######################################################################################################################## # files and paths def get_name_for_autosave(filename=None): "Return filename for the automatic backup of named file or current file (app_tree.app.filename)" if not filename: filename = app_tree.app.filename if not filename: path, name = config.home_path, "" else: path, name = os.path.split(filename) ret = os.path.join(path, "#~wxg.autosave~%s#" % name) return ret class _Writer(object): # file with a list compatible interface: append and extend def __init__(self, filename): self.outfile = codecs.open(filename, 'w', 'utf-8') def append(self, line): self.outfile.write(line) def extend(self, lines): for line in lines: self.outfile.write(line) def close(self): self.outfile.close() def autosave_current(): "Save automatic backup copy for the current and un-saved design; returns 0: error; 1: no changes to save; 2: saved" if app_tree.app.saved: return 1 # do nothing in this case... autosave_name = get_name_for_autosave() try: outfile = _Writer(autosave_name) app_tree.write(outfile) outfile.close() except EnvironmentError as details: logging.warning( _('Saving the autosave file "%s" failed: %s'), autosave_name, details ) return 0 return 2 def remove_autosaved(filename=None): "Remove the automatic backup; @see: L{get_name_for_autosave()}" autosave_name = get_name_for_autosave(filename) if os.path.exists(autosave_name): try: os.unlink(autosave_name) except EnvironmentError: logging.exception(_('Internal Error')) def check_autosaved(filename): "Returns True if there are an automatic backup for filename" if filename is not None and filename == app_tree.app.filename: # this happens when reloading, no auto-save-restoring in this case... return False autosave_name = get_name_for_autosave(filename) try: if filename: orig = os.stat(filename) auto = os.stat(autosave_name) if orig.st_mtime > auto.st_mtime: return False else: if not os.path.exists(autosave_name): return False auto = os.stat(autosave_name) # check contents for empty or incomplete file if auto.st_size < 50: return False f = open(autosave_name, "rb") f.seek(-16,2) # from the end file_end = f.read(16) f.close() return b"" in file_end except EnvironmentError as inst: # File doesn't exists if inst.errno == errno.ENOENT: pass # Security frameworks like SELinux may deny the write access even if # the check for write permissions was successful. elif inst.errno in [errno.EPERM, errno.EACCES]: logging.info( _('Ignore autosave permission error: %s'), str(inst)) else: logging.exception(_('Internal Error')) return False def restore_from_autosaved(filename): """Copy the content of an auto-saved file to the current file. The auto-saved file will still remain as a kind of backup. Returns True on success.""" autosave_name = get_name_for_autosave(filename) if os.access(autosave_name, os.R_OK): try: content = codecs.open(autosave_name, encoding='UTF-8').read() save_file(filename, content, 'wxg') except EnvironmentError: logging.exception(_('Internal Error')) return False return True return False def init_paths(options): "Set all wxGlade related paths; the paths will be stored in L{config}." # use directory of the exe in case of frozen packages e.g. PyInstaller or py2exe if hasattr(sys, 'frozen'): wxglade_path = os.path.dirname(sys.argv[0]) else: wxglade_path = __file__ if os.path.islink(wxglade_path): wxglade_path = os.path.realpath(wxglade_path) wxglade_path = os.path.dirname(os.path.abspath(wxglade_path)) # set the program's paths config.wxglade_path = wxglade_path share_dir = _get_share_path() if _get_install_method() == 'single_directory': config.docs_path = os.path.join(share_dir, 'docs') config.icons_path = os.path.join(share_dir, 'icons') config.templates_path = os.path.join(share_dir, 'templates') else: config.docs_path = os.path.join(share_dir, 'doc', 'wxglade') config.icons_path = os.path.join(share_dir, 'wxglade', 'icons') config.templates_path = os.path.join(share_dir, 'wxglade', 'templates') _set_home_path() _set_appdata_path() _set_file_paths(options) _normalise_paths() _create_appdata_path() def _create_appdata_path(): """Create missing application data directory. Otherwise log initialisation will fail with an IOError "No such file or directory". The file logger will be initialised after this function returns.""" if not os.path.isdir(config.appdata_path): try: os.makedirs(config.appdata_path, 0o700) except EnvironmentError as e: logging.error(_('Failed to create config directory: "%s"'), e) def _set_appdata_path(): "Set the path of the application data directory" if 'WXGLADE_CONFIG_PATH' in os.environ: config.appdata_path = os.path.expandvars( os.environ['WXGLADE_CONFIG_PATH'] ) return if os.name == 'nt' and 'APPDATA' in os.environ: path = os.path.expandvars(os.environ['APPDATA']) old_name = '%s/.wxglade' % path new_name = '%s/wxglade' % path if os.path.isdir(new_name): path = new_name elif os.path.isdir(old_name): logging.info( _('Rename appdata path from "%s" to "%s"'), old_name, new_name) try: os.rename(old_name, new_name) path = new_name except EnvironmentError as e: # ignore rename errors and just write an info message logging.info(_('Renaming failed: "%s"'), e) logging.info(_('Using the old path "%s" instead'), old_name) path = old_name else: path = new_name config.appdata_path = path return if os.name == 'nt': path = os.path.join(config.home_path, 'wxglade') else: path = os.path.join(config.home_path, '.wxglade') config.appdata_path = path def _set_home_path(): "Set the path of the home directory" home_path = os.path.expanduser('~') # to prevent unexpanded "%HOMEDRIVE%%HOMEPATH%" as reported in SF Bug #185 home_path = os.path.expandvars(home_path) if home_path == '~': home_path = tempfile.gettempdir() logging.info( _('Expansion of the home directory shortcut "~" failed. Use temp directory "%s" instead'), home_path ) if not os.path.isdir(home_path): tmp_dir = tempfile.gettempdir() logging.info( _('The home path "%s" is not a directory. Use the temp directory "%s" instead.'), home_path, tmp_dir ) home_path = tmp_dir if not os.access(home_path, os.W_OK): logging.info(_('The home path "%s" is not writable.'), home_path) tmp_dir = tempfile.gettempdir() logging.info(_('The home path "%s" is not writable. Use the temp directory "%s" instead.'), home_path, tmp_dir) home_path = tmp_dir config.home_path = home_path return def _get_install_method(): """Return a string indicating the installation method as string: - 'single_directory' - just extract the source into an empty directory - 'filesystem_installation' - install the software below /usr resp. C:/Program Files""" # on Windows or installation in a single directory if os.name == 'nt' or os.path.isdir(os.path.join(config.wxglade_path, 'icons')): return 'single_directory' else: return 'filesystem_installation' def _get_share_path(): """Return the path of the "share" directory (architecture independent data files). That's something like "/usr/share" or "/usr/local/share" on Unix or the installation directory on Windows. see: _get_install_method()""" # all in a single directory (extract and run) if _get_install_method() == 'single_directory': share_dir = config.wxglade_path # alternative installation path else: assert config.wxglade_path.endswith('wxglade') # split path into single components to check the last four elements dir_list = split_path(os.path.normpath(config.wxglade_path)) if len(dir_list) > 4 and dir_list[-1] == 'wxglade' and dir_list[-2] in ['site-packages', 'dist-packages'] and \ dir_list[-3].startswith('python') and dir_list[-4].startswith('lib'): share_dir = os.path.join(*dir_list[:-4]) share_dir = os.path.join(share_dir, 'share') elif len(dir_list) > 4 and dir_list[-1] == 'wxglade' and dir_list[-2].endswith('.egg'): # egg installation share_dir = os.path.join(*dir_list[:-1]) share_dir = os.path.join(share_dir, 'share') else: logging.error(_('Unknown path structure %s'), config.wxglade_path) share_dir = '' if not share_dir: logging.error(_('Share directory not found')) elif not os.path.exists(share_dir): logging.error(_('Share directory "%s" does not exists'), share_dir) elif not os.path.isdir(share_dir): logging.error(_('Share directory "%s" is not a directory'), share_dir) return share_dir def split_path(path): "Split the path into single components; e.g. split_path('/usr/local/share') -> ['/', 'usr', 'local', 'share']" drive, path = os.path.splitdrive(path) components = [] while True: path, tail = os.path.split(path) if tail: components.append(tail) else: if path: components.append(path) break components.reverse() if drive: components.insert(0, drive) return components def _normalise_paths(): "Normalise all paths stored in config module" for name in ['appdata_path', 'credits_file', 'docs_path', 'history_file', 'home_path', 'icons_path', 'license_file', 'manual_file', 'rc_file', 'templates_path', 'tutorial_file', 'widgets_path', 'wxglade_path']: assert hasattr(config, name) path = getattr(config, name) path = os.path.normpath(path) setattr(config, name, path) def _set_file_paths(options): "Set the full path for all files (config.*_file except default_output_file)" install_method = _get_install_method() if install_method == 'single_directory': config.credits_file = os.path.join(config.wxglade_path, 'CREDITS.txt') config.license_file = os.path.join(config.wxglade_path, 'LICENSE.txt') config.manual_file = os.path.join(config.docs_path, 'html', 'index.html') config.bmp_manual_file = os.path.join(config.docs_path, 'html', 'bitmaps.html') #config.tutorial_file = os.path.join(config.docs_path, 'Tutorial.html') else: config.credits_file = os.path.join(config.docs_path, 'CREDITS.txt') config.license_file = os.path.join(config.docs_path, 'LICENSE.txt') config.manual_file = os.path.join(config.docs_path, 'html', 'index.html') config.bmp_manual_file = os.path.join(config.docs_path, 'html', 'bitmaps.html') #config.tutorial_file = os.path.join(config.docs_path, 'html', 'tutorial.html') if not os.path.exists(config.credits_file): logging.error(_('Credits file "CREDITS.txt" not found!')) config.credits_file = '' if not os.path.exists(config.license_file): logging.error(_('License file "LICENSE.txt" not found!')) config.license_file = '' config.widgets_path = os.path.join(config.wxglade_path, 'widgets') # complete path to rc file if options and options.rc_file: if not os.path.exists(options.rc_file): logging.error(_('Specified config file does not exist')) config.rc_file = options.rc_file elif os.name == 'nt': config.rc_file = os.path.join(config.appdata_path, 'wxglade.ini') else: config.rc_file = os.path.join(config.appdata_path, 'wxgladerc') config.history_file = os.path.join(config.appdata_path, 'file_history.txt') config.log_file = os.path.join(config.appdata_path, 'wxglade.log') def init_preferences(): "Load / initialise preferences" if config.preferences is None: config.preferences = Preferences() config.preferences.read(config.rc_file) if not config.preferences.has_section('wxglade'): config.preferences.add_section('wxglade') def save_preferences(): "Save current settings as well as the file history; @see: L{config.history_file} and L{config.use_file_history}" # let the exception be raised path = os.path.dirname(config.rc_file) if not os.path.isdir(path): os.makedirs(path) # always save the file history if config.use_file_history: content = u'# -*- coding: utf-8 -*-\n' for pos in range(min(config.preferences.number_history, main.file_history.GetCount())): content += u'%s\n' % main.file_history.GetHistoryFile(pos) outfile = codecs.open(config.history_file, 'w', encoding='utf-8') outfile.write(content) outfile.close() if config.preferences.changed: outfile = open(config.rc_file, 'w') # let the exception be raised to signal abnormal behaviour config.preferences.write(outfile) outfile.close() def load_file_history(): "Loads the file history and returns a list of paths; @see: L{config.history_file} and L{config.use_file_history}" try: infile = codecs.open(config.history_file, encoding='utf-8') lines = infile.readlines() if lines and lines[0].startswith(u'# -*- coding:'): lines = lines[1:] infile.close() return lines except EnvironmentError: # don't consider this an error return [] class Preferences(ConfigParser.ConfigParser): _defaults = { 'open_save_path': '', 'codegen_path': '', 'use_dialog_units': False, 'number_history': 12, 'show_progress': True, 'wxg_backup': True, 'codegen_backup': True, 'backup_suffix': sys.platform == 'win32' and '.bak' or '~', 'remember_geometry': True, 'local_widget_path': '', 'default_border': False, 'default_border_size': 3, 'show_sizer_handle': True, 'allow_duplicate_names': False, 'autosave': True, 'autosave_delay': 120, # in seconds 'show_completion': True, 'write_timestamp': True, 'write_generated_from': False } def __init__(self, defaults=None): # set defaults of 'codegen_path', 'local_widget_path', and 'open_save_path' and 'codegen_path' if the class is # instantiated first time, because the home_path is set later if config.home_path and not self._defaults['open_save_path']: self._defaults['open_save_path'] = config.home_path self._defaults['codegen_path'] = config.home_path if config.appdata_path and not self._defaults['local_widget_path']: self._defaults['local_widget_path'] = os.path.join( config.appdata_path, 'widgets' ) self.def_vals = defaults if self.def_vals is None: self.def_vals = Preferences._defaults self.changed = False ConfigParser.ConfigParser.__init__(self) def __getattr__(self, attr): val = self.def_vals.get(attr, "") # UGLY!!! cast = type(val) if cast is bool: cast = self._cast_to_bool # ...but I haven't found a better way: the problem is that bool('0') == True, while int('0') == False, # and we want the latter behaviour try: return cast(self.get('wxglade', attr)) except (ConfigParser.NoOptionError, ValueError): return val def __iter__(self): def do_iter(): for key in self.def_vals: yield key, self[key] return do_iter() def _cast_to_bool(self, val): try: return int(val) except ValueError: val = val.lower().strip() if val in ('true', 'on'): return 1 elif val in ('false', 'off'): return 0 else: raise def __getitem__(self, attr): return self.__getattr__(attr) def __setitem__(self, attr, val): self.set('wxglade', attr, str(val)) self.changed = True def set_struct(self, section, option, value): # recursively store a dictionary if not self.has_section(section): self.add_section(section) if not isinstance(option, list): option = [option] if isinstance(value, dict): for key in sorted(value.keys()): self.set_struct(section, option+[key], value[key]) elif isinstance(value, list): for i,item in enumerate(value): self.set_struct(section, option+["l%d"%i], item) elif isinstance(value, tuple): for i,item in enumerate(value): self.set_struct(section, option+["t%d"%i], item) else: option = "_".join(option) self.set(section, option, str(value)) def set_dict(self, section, value): self.set_struct(section, [], value) def get_int(self, section, option): return int(self.get(section, option)) ######################################################################################################################## # XML utilities def style_attrs_to_sets(styles): """Convert the style attributes 'combination', 'exclude', 'include' and 'require' from string to a set. styles: Style dictionary returns: Style dictionary with modified attributes""" for style_name in styles.keys(): for attr in ['combination', 'exclude', 'include', 'require', ]: try: styles[style_name][attr] = set(styles[style_name][attr].split('|')) except (AttributeError, KeyError): pass return styles def format_xml_tag(tag, value, indentlevel=0, **kwargs): r"""Generate a valid XML tag as string. The content will be proper escaped and quoted. Example:: >>> common.format_xml_tag(u'label', 'Exit', 1) u'