Vadim Zeitlin [Tue, 14 Dec 2010 18:43:49 +0000 (18:43 +0000)]
Make wxRefCounter non copyable.
wxRefCounter copy ctor was wrong as the new object had the same reference
count as the old one instead of starting its life with reference count set to
1 as any new object should.
While we could fix its copy ctor, it seems to be better to forbid copying
wxRefCounter objects at all because the semantics of doing this is not obvious
and the compiler-generated copy ctor in the derived classes often doesn't do
what the code using it expects it to do, as was discovered by making
wxRefCounter non copyable: see the fixes in the previous commits.
To uncover all such bugs, make wxRefCounter and classes deriving from it non
copyable. If this uncovers more problems, they should be fixed by implementing
copying properly (and explicitly) in the derived classes.
Vadim Zeitlin [Tue, 14 Dec 2010 18:43:39 +0000 (18:43 +0000)]
Fail in CloneGDIRefData() instead of implementing it incorrectly in wxOSX.
wxIcon and wxMetaFile implemented CloneGDIRefData() using copy ctors of the
corresponding ref data classes but the copy ctors were either wrong (for
wxIconRefData as using it would result in messing up IconRef reference count)
or had wrong semantics (wxMetafileRefData copy ctor performed shallow copy
only while CloneGDIRefData() supposes a deep copy is done).
Replace the wrong implementations of these functions with assert that will be
triggered if they are ever used (which doesn't seem to be the case so far).
Vadim Zeitlin [Tue, 14 Dec 2010 18:43:32 +0000 (18:43 +0000)]
Don't use implicit wxBitmapRefData copy ctor in wxGTK code.
wxBitmapRefData didn't have a proper copy ctor but the code in wxGTK wxBitmap
implementation used it nevertheless and then manually patched the newly copied
object to avoid double pointer deletion and other unpleasantness.
Make the code more obviously correct by not using (nor providing) copy ctor at
all. There are no real changes otherwise.
Vadim Zeitlin [Tue, 14 Dec 2010 18:43:25 +0000 (18:43 +0000)]
Fail instead of crashing in wxGTK wxCursor::CloneGDIRefData().
CloneGDIRefData() used wxCursorRefData copy ctor which wasn't implemented
correctly and simply copied its internal m_cursor member without incrementing
its reference count which resulted in a crash when it was then dereferenced
twice.
Unfortunately there doesn't seem to be any simple way to clone GDK cursors but
as this should be something only rarely (if ever?) needed, simply don't
implement CloneGDIRefData() at all for now and just leave an assert in it if
it's ever really called. Also don't define wxCursorRefData copy ctor at all as
it can't be done correctly.
Vadim Zeitlin [Mon, 13 Dec 2010 18:10:02 +0000 (18:10 +0000)]
Preserve value when changing range of inverted wxSlider in wxMSW.
The logical value of wxSlider was changed when its range was changed in wxMSW
if the slider had wxSL_INVERSE style because the logical value was actually
computed using the range and the actual physical control value and we forgot
to update the latter when changing the range.
Do update it now in SetRange() to fix this.
Also add unit tests checking for this and, more generally, for other
operations with inversed sliders.
Jaakko Salli [Mon, 13 Dec 2010 16:07:49 +0000 (16:07 +0000)]
Have wxPropertyGrid::DoubleToString() to also take comma into account as a decimal separator. In addition, the function now returns target wxString (makes writing tests easier).
Vadim Zeitlin [Fri, 3 Dec 2010 14:00:31 +0000 (14:00 +0000)]
Set the window in focus event sent by wxComboCtrl correctly.
The window parameter wasn't copied correctly in the forwarded event. Fix this
and avoid future problems of the same kind by using the copy ctor for creating
the new event and then override the fields that we need to change from the
original event instead of recreating the new event from bits and pieces of the
original one.
Vadim Zeitlin [Fri, 3 Dec 2010 12:40:28 +0000 (12:40 +0000)]
Update AUI bitmaps when its colours change.
Extract the bitmaps initialization in wxAuiDefaultDockArt::InitBitmaps() and
call it from SetColour() to ensure that the bitmaps are updated when the
colour scheme changes.
Vadim Zeitlin [Fri, 3 Dec 2010 12:40:15 +0000 (12:40 +0000)]
Update the directory icon in wxGenericDirCtrl::ExpandDir().
Calling ExpandDir() to notify the control that a new item was added in a
previously empty directory didn't work as wxTreeCtrl::SetItemHasChildren()
wasn't called.
Fix this by moving SetItemHasChildren() to ExpandDir() from OnExpandItem(), it
must be always done and not just in response to an interactive action.
Vadim Zeitlin [Fri, 3 Dec 2010 12:39:57 +0000 (12:39 +0000)]
Don't require leading TAB in wxAcceleratorEntry::FromString().
FromString() should parse string returned by ToString() successfully but this
wasn't the case because the accelerator parsing functions always insisted on
having a TAB in the string.
Fix this, document the string format and add a unit test checking for the
correct behaviour.
Vadim Zeitlin [Fri, 3 Dec 2010 12:39:48 +0000 (12:39 +0000)]
Don't try to extract accelerators from menu items which don't have any.
We don't need to call wxAcceleratorEntry::Create() in wxMenuItem::GetAccel()
if the menu item doesn't have any accelerator at all, i.e. if there is no TAB
in its label.
Calling wxAcceleratorEntry::Create() is useless and won't work correctly any
more when Create() is updated to allow passing it strings without TAB in them
in the next commit.
Vadim Zeitlin [Sun, 28 Nov 2010 15:14:49 +0000 (15:14 +0000)]
Don't compare invalid iterators in wxCommandProcessor code.
Comparing invalid iterators results in an assert failure in STL build.
We might also change wxList::compatibility_iterator::operator==() to allow
comparing invalid iterators (which should be different from all the other ones
but what about comparing two invalid iterators?) but it would probably be
better to get rid of all uses of compatibility_iterator in the code instead in
the long term.
Vadim Zeitlin [Fri, 26 Nov 2010 13:31:15 +0000 (13:31 +0000)]
Update configure helper scripts to latest versions from GNU project.
The new version (the one we used was 6 years out of date) notably detects 64
bit MinGW platforms correctly which closes #12356.
Also update config.{guess,sub} scripts in 3rd party libraries directories to
bring them all in sync with the main one and ensure that MinGW 64 is supported
by them too.
Vadim Zeitlin [Fri, 26 Nov 2010 13:30:43 +0000 (13:30 +0000)]
No real changes, just remove unnecessary const workaround.
The comment about "wxString doesn't having enough const members" was totally
incomprehensible and clearly wrong. Just remove the hack it was explaining.
Vadim Zeitlin [Fri, 26 Nov 2010 13:30:37 +0000 (13:30 +0000)]
Allow wxAutomationObject::GetInstance() create new instance if needed.
When getting an instance of an OLE automation object, it is often useful to
connect to the existing instance if any or start a new one otherwise. Make
GetInstance() behave like this by default while still allowing to use the
wxAutomationInstance_UseExistingOnly flag to reestablish the old behaviour.
Also improve the error reporting in wxAutomationObject.
Vadim Zeitlin [Thu, 25 Nov 2010 00:53:44 +0000 (00:53 +0000)]
Add wxVersionInfo and functions returning it for 3rd party libraries.
Add simple wxVersionInfo class holding the version information.
Also add GetLibraryVersionInfo() static method to wx{JPEG,PNG,TIFF}Handler,
wxStyledTextCtrl and wxXmlDocument classes and wxGetZlibVersionInfo() and
wxGetLibraryVersionInfo() global functions using it.
Vadim Zeitlin [Wed, 24 Nov 2010 00:42:53 +0000 (00:42 +0000)]
Add support for negatable command line switches.
Add wxCMD_LINE_SWITCH_NEGATABLE which allows to use a dash after a command
line switch to inverse its meaning (i.e. use "/X-" form). Also add new
wxCmdLineParser::FoundSwitch() allowing to check for whether the switch was
specified in normal or negated form.
Vadim Zeitlin [Wed, 24 Nov 2010 00:42:45 +0000 (00:42 +0000)]
Rewind the input stream after failing to load image from it.
For seekable streams, don't change the current position when loading image
fails. This allows the subsequent image handlers to succeed during image
format auto-detection even if a previous, erroneously chosen, handler failed.
Vadim Zeitlin [Wed, 24 Nov 2010 00:42:35 +0000 (00:42 +0000)]
Improve error messages from wxImage::LoadFile().
The error given when loading an image file failed was not very useful because
they didn't specify which file exactly we failed to load and also because the
numeric handler type which means nothing at all to the end user (and not much
to the developer) was used.
Use the description of the file format instead and also always give the name
of the file that we failed to load.
Finally, remove the test for file existence: this is one of many reasons why
opening the file could fail and it doesn't make sense to handle it specially,
just let the underlying stream generate the appropriate error message in all
cases.
Vadim Zeitlin [Wed, 24 Nov 2010 00:42:19 +0000 (00:42 +0000)]
Skip mouse events outside of item area in wxDataViewCtrl.
Don't consume mouse events outside of the area occupied by the items in the
generic implementation of wxDataViewCtrl as this prevented wxEVT_CONTEXT_MENU
events from being generated.
Vadim Zeitlin [Tue, 23 Nov 2010 13:11:02 +0000 (13:11 +0000)]
Center task dialog-based wxProgressDialog on the parent window.
wxProgressDialog was created without the parent when using task dialogs so it
was centred on screen and not on its parent as usual. Fix this by explicitly
positioning it so that it's centered over the parent.
Vadim Zeitlin [Tue, 23 Nov 2010 13:10:54 +0000 (13:10 +0000)]
Deselect all items in wxMSW wxListBox when selection is set to -1.
Even though this behaviour is somewhat counterintuitive, the documentation
mentions that this is what should happen and wxGTK and wxOSX already behave
like this so bring wxMSW in line.
wxListBox::DeselectAll() should probably just call SetSelection(wxNOT_FOUND)
when the item to leave selected is not specified too now.
Vadim Zeitlin [Mon, 22 Nov 2010 16:18:47 +0000 (16:18 +0000)]
Initialize time zone information before using it in wxGetTimeZone().
We must call _tzset() before calling _get_timezone() as while this is normally
done implicitly by the other time functions, it might not have been done yet
if create a wxDateTime::TimeZone before calling any of them.
Jaakko Salli [Mon, 22 Nov 2010 14:28:16 +0000 (14:28 +0000)]
Have wxPropertyGridEditorEventForwarder::ProcessEvent() return true more often - that is when the event was recognized as being 'handled', and specifically for the case of property editor's button being pressed (fixes #12487).
Vadim Zeitlin [Mon, 22 Nov 2010 12:51:05 +0000 (12:51 +0000)]
Fix wxUniv build after deriving wxStatusBar from wxControl.
wxUniv build was broken since the base class of wxStatusBar was changed from
wxWindow to wxControl in r66226 because it derived twice from wxInputConsumer
now.
Fix this by simply not inheriting wxStatusBarUniv from wxInputConsumer any
more, it already derives from it via wxControl now.
Vadim Zeitlin [Mon, 22 Nov 2010 12:48:47 +0000 (12:48 +0000)]
Set the width of the last status bar pane correctly in wxMSW.
The total width of status bar panes must add up to the size of the status bar
as otherwise an extra unwanted border is drawn after the last pane and we did
have this border for status bar with a size grip.
So while we still use the width without the size grip for calculating the
fields widths, pass the width with the size grip to Windows to prevent this
from happening.
Also, don't pretend that the last field stretches up to the status bar edge
when it should end before the size grip and Windows even already helpfully
does it for us.
Vadim Zeitlin [Mon, 22 Nov 2010 12:48:35 +0000 (12:48 +0000)]
Put WINDRES_CPU_DEFINE in RESFLAGS and not RESCOMP in configure.
WINDRES_CPU_DEFINE is just another resource compiler flag which should be part
of RESFLAGS instead of being added to RESCOMP definition itself. This is not
only more logical but also fixes the problem with matching RESCOMP against
"windres" or "wrc" in wx-config.
Vadim Zeitlin [Mon, 22 Nov 2010 01:23:16 +0000 (01:23 +0000)]
Deprecate not working wxSplitterWindow::SetSashSize().
Setting sash size to non default value didn't work correctly and didn't make
much sense anyhow as the sash appearance is platform-dependent and current
code for drawing it doesn't work for arbitrary sizes.
Simply remove the possibility to set the sash size.
Vadim Zeitlin [Mon, 22 Nov 2010 01:23:09 +0000 (01:23 +0000)]
Don't set explicit background colour for wxStatusBar in wxMSW.
Setting the background colour for the status bar explicitly is unnecessary and
probably prevents it from rendering correctly with some themes. Simply remove
the call to SetBackgroundColour() from wxStatusBar::Create().
We should also define Get[Class]DefaultAttributes() in wxStatusBar in the
future.
Vadim Zeitlin [Mon, 22 Nov 2010 01:23:02 +0000 (01:23 +0000)]
Don't forbid creating wxSplitterWindow with border style.
Any border specified for wxSplitterWindow was explicitly discarded when
creating it but there doesn't seem to be any reason to forbid it, the original
code probably predated the addition of wxWindow::GetDefaultBorder() which
allowed to have different borders by default for different classes.
In any case, simply remove this code now to allow creating splitters with
borders if so desired.
Vadim Zeitlin [Mon, 22 Nov 2010 01:22:56 +0000 (01:22 +0000)]
Delete pending objects in wxApp::ProcessPendingEvents() and not ProcessIdle().
Move DeletePendingObjects() call from ProcessPendingEvents() to ProcessIdle()
to ensure that we delete the objects marked for destruction even if the
application is sitting in a tight OnIdle() loop, i.e. if the idle event
handler keeps requesting more events.
Also make sure that the event loop terminates if its OnExit() was called even
if the idle event handler continues to request more events.
Vadim Zeitlin [Mon, 22 Nov 2010 01:22:47 +0000 (01:22 +0000)]
Silently ignore timer events from timers which were just stopped.
An assert in wxTimerWndProc() could be provoked by valid user code which
simply started and stopped the timers quickly enough because a WM_TIMER could
have been already generated just before we stopped the timer.
Simply ignore events from unknown timer under assumption that they must come
from the recently stopped ones instead of asserting.
Ideally we'd somehow distinguish between the situation described above and the
really bogus events which could indicate bugs in wx code or a change in
behaviour in a future version of Windows but there is no easy way to do it so
for now just settle for not asserting in normal case.
Vadim Zeitlin [Mon, 22 Nov 2010 01:22:41 +0000 (01:22 +0000)]
Refactor wxStatusBar creation in wxMSW to do it in standard way.
Use wxControl-provided CreateControl() and MSWCreateControl() methods to
create the status bar instead of duplicating their code in its Create().
Also translate wx styles to MSW ones in overridden MSWGetStyle() now.
In addition to making the code smaller and more clear, this fixes the
non-respect of the styles specified at status bar creation (e.g. border),
see #12655.
Vadim Zeitlin [Mon, 22 Nov 2010 01:22:36 +0000 (01:22 +0000)]
Derive wxStatusBar from wxControl and not wxWindow.
wxStatusBar is no less a control than wxToolBar and deriving it from wxControl
gives access to convenient native control creation functions under MSW (which
will be used by the next commit).
Vadim Zeitlin [Mon, 22 Nov 2010 01:22:25 +0000 (01:22 +0000)]
Send page changed event after changing the page in wxMSW wxNotebook.
Update the currently selected page before generating
wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED event in wxMSW wxNotebook. This is more
consistent with other ports and more logical as "-ED" events are supposed to
be sent after the action they notify about is completed. And it also allows to
set the focus in this event handler whereas any attempts to do it would have
been disregarded before as changing the active page resets focus.
Notice that this does introduce an incompatibility: calling
wxNotebook::GetSelection() from PAGE_CHANGED event handler now returns the new
page and not the old one as before. Again, this is more logical and more
consistent.
Vadim Zeitlin [Mon, 22 Nov 2010 01:22:17 +0000 (01:22 +0000)]
Use correct wxDEBUG_LEVEL value when building wxscintilla library.
wxScintilla code uses wxVector<> which brings in wxDEBUG_LEVEL-dependent code
so we must use the wxDEBUG_LEVEL value consistent with the rest of the library
when building it.
Simply pass wxDEBUG_LEVEL definition on the compiler command line if it's
different from the default.
Vadim Zeitlin [Mon, 22 Nov 2010 01:22:07 +0000 (01:22 +0000)]
Always define WXUSINGDLL when compiling Scintilla in shared wx build.
We need WXUSINGDLL even in monolithic build because Scintilla references wx
debugging functions (wxOnAssert(), wxTheAssertHandler &c) which still must be
seen as being exported from the (monolithic) DLL in this case.
Vadim Zeitlin [Sun, 21 Nov 2010 13:00:06 +0000 (13:00 +0000)]
Revert r66070: "Unload bogus XRC resources in "garbage" unit test."
This change is not needed any longer after r66219 which fixed the real
underlying problem, i.e. that attempting to load an invalid XRC file resulted
in failures when loading all subsequent XRC files.
Vadim Zeitlin [Sat, 20 Nov 2010 23:53:34 +0000 (23:53 +0000)]
Don't keep entries for XRC resources that failed to load in wxXmlResource.
Attempting to load a resource that couldn't be loaded resulted in
wxXmlResource::Load() returning false for this and _all_the_subsequent_ calls
to it because each call to Load() reattempted to reload all resources,
including the one(s) that failed to load initially.
Instead, try to load just the resource(s) that we should load right now and
ignore all the other ones. Also, don't add entries for the one(s) that we fail
to load.
This fixes the unit test failures in the XRC test case which was affected by
the test checking that XRC couldn't be loaded from garbage that ran before it.
It also makes the code simpler by ensuring that wxXmlResourceDataRecords
elements always have a valid wxXmlDocument associated with them.
Also clean up the code: use wxScopedPtr instead of manually deleting pointers
and reorganize #if checks to be easier to follow.
Vadim Zeitlin [Sat, 20 Nov 2010 23:53:28 +0000 (23:53 +0000)]
Don't consider extra ".." an error in wxFileName::Normalize().
The path being normalized could have come from user and there doesn't seem to
be any point in complaining about too many ".."s in it when we can handle them
correctly instead.
So simply ignore the extra ".."s for the absolute paths and keep them
unchanged for the relative ones instead of returning an error.
Jaakko Salli [Sat, 20 Nov 2010 11:58:54 +0000 (11:58 +0000)]
Reworked wxSystemColourProperty::StringToValue() to use wxColour::Set() instead of doing string-to-colour conversion by itself. This adds support for HTML-colours, among other things (closes #12696).
Vadim Zeitlin [Thu, 18 Nov 2010 12:41:13 +0000 (12:41 +0000)]
Check wxDateTime components validity more rigorously.
Check that the provided day is strictly positive and also that the month is in
valid range: while it should always be, considering that it's an enum element,
in practice people often cast ints to wxDateTime::Month with potentially fatal
results. Catch this with an assert in wxDateTime::Tm::IsValid().