Add wxSpinCtrl::SetBase() to allow entering hexadecimal numbers.
[wxWidgets.git] / docs / doxygen / overviews / changes_since28.h
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: changes_since28.h
3 // Purpose: topic overview
4 // Author: Vadim Zeitlin
5 // Created: 2008-05-08
6 // RCS-ID: $Id$
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
9
10 /**
11
12 @page overview_changes_since28 Changes Since wxWidgets 2.8
13
14 This topic describes backwards-incompatible changes in wxWidgets 3.0 compared
15 to the last stable release.
16
17 The incompatible changes can be grouped into the following categories:
18
19 @li @ref overview_changes_unicode
20 @li @ref overview_changes_other
21
22
23 <hr>
24
25 @section overview_changes_unicode Unicode-related Changes
26
27 If you used Unicode build of wxWidgets 2.8 or previous version, please read
28 @ref overview_unicode for the details about how the API changed in 3.0 as a lot
29 of the information which was correct before doesn't apply any longer.
30
31 For example, the notorious (due to the confusion they created) macros @c wxT()
32 and @c _T() are not needed at all any longer. Basically, you can remove them
33 from any code which used them. On the other hand, there is no particular harm
34 in leaving them neither as the code will still compile and work correctly --
35 you only need to remove them if you think that your code looks tidier without
36 them. You also don't need to use @c wxChar any longer but can directly use the
37 standard @c wchar_t type even if, again, @c wxChar continues to work.
38
39 The most serious backwards-incompatible change is related to the change of
40 return type of wxString::c_str() method: it returns a special proxy object
41 instead of a simple @c char* or @c wchar_t* now. Because of this, you cannot
42 pass its result to any standard vararg functions such as @c printf() any more
43 as described in @ref overview_unicode_compilation_errors. All wxWidgets
44 functions, such as wxPrintf(), wxLogMessage() &c still work with it, but
45 passing it to @c printf() will now result in a crash. It is strongly advised to
46 recompile your code with a compiler warning about passing non-POD objects to
47 vararg functions, such as g++.
48
49 The change of the type of wxString::c_str() can also result in compilation
50 errors when passing its result to a function overloaded to take both narrow and
51 wide strings and in this case you must select the version which you really want
52 to use, e.g.:
53 @code
54 void OpenLogFile(const char *filename);
55 void OpenLogFile(const wchar_t *filename);
56
57 wxString s;
58 OpenLogFile(s); // ERROR: ambiguity
59 OpenLogFile(s.c_str()); // ERROR: ambiguity
60 OpenLogFile(s.wx_str()); // OK: function called depends on the build
61 OpenLogFile(s.mb_str()); // OK: always calls narrow string overload
62 OpenLogFile(s.wc_str()); // OK: always calls wide string overload
63 @endcode
64 A common example of such problem arises with @c std::fstream class constructor
65 in Microsoft Visual C++ standard library implementation. In addition to a
66 constructor from @c const @c char * which this class must have, it also
67 provides a constructor taking a wide character file name. Because of this, code
68 like the following
69 @code
70 #include <fstream>
71
72 void MyFunc(const wxString& filename)
73 {
74 std::ifstream ifs(filename.c_str());
75 ...
76 }
77 @endcode
78 does not compile when using Microsoft Visual C++ and needs to be changed to use
79 mb_str() (which will not work for file names containing Unicode characters,
80 consider using wxWidgets classes and functions to work with such file names as
81 they are not supported by standard C++ library).
82
83 The other class of incompatible changes is due to modifying some virtual
84 methods to use @c wxString parameters instead of @c const @c wxChar* ones to
85 make them accept both narrow and wide strings. This is not a problem if you
86 simply call these functions but you need to change the signature of the derived
87 class versions if you override them as otherwise they wouldn't be called any
88 more. Again, the best way to ensure that this problem doesn't arise is to
89 rebuild your code using a compiler which warns about function signature
90 mismatch (you can use @c -Woverloaded-virtual g++ option).
91
92 Finally, a few structure fields, notable @c wxCmdLineEntryDesc::shortName,
93 @c longName and @c description fields have been changed to be of type @c const
94 @c char* instead of @c const @c wxChar* so you will need to remove @c wxT() or
95 @c _T() if you used it with their initializers.
96
97 @section overview_changes_other Miscellaneous Other Changes
98
99 - Default location of wxFileConfig files has changed under Windows, you will
100 need to update your code if you access these files directly.
101
102 - wxWindow::IsEnabled() now returns false if a window parent (and not
103 necessarily the window itself) is disabled, new function IsThisEnabled()
104 with the same behaviour as old IsEnabled() was added.
105
106 - Generating wxNavigationKeyEvent events doesn't work any more under wxGTK (and
107 other platforms in the future), use wxWindow::Navigate() or NavigateIn()
108 instead.
109
110 - Sizers distribute only the extra space between the stretchable items
111 according to their proportions and not all available space. We believe the
112 new behaviour corresponds better to user expectations but if you did rely
113 on the old behaviour you will have to update your code to set the minimal
114 sizes of the sizer items to be in the same proportion as the items
115 proportions to return to the old behaviour.
116
117 - wxWindow::Freeze/Thaw() are not virtual any more, if you overrode them in
118 your code you need to override DoFreeze/Thaw() instead now.
119
120 - wxCalendarCtrl has native implementation in wxGTK, but it has less features
121 than the generic one. The native implementation is used by default, but you
122 can still use wxGenericCalendarCtrl instead of wxCalendarCtrl in your code if
123 you need the extra features.
124
125 - wxDocument::FileHistoryLoad() and wxFileHistory::Load() now take const
126 reference to wxConfigBase argument and not just a reference, please update
127 your code if you overrode these functions and change the functions in the
128 derived classes to use const reference as well.
129
130 - Calling wxConfig::Write() with an enum value will fail to compile because
131 wxConfig now tries to convert all unknown types to wxString automatically
132 using wxToString() function.
133
134 The simplest solution is to cast the enum value to int, e.g.
135 @code
136 enum Colour { Red, Green, Blue };
137
138 wxConfig conf;
139 conf.Write("MyFavouriteColour", Red); // ERROR: no match
140 conf.Write("MyFavouriteColour", int(Red)); // OK
141 @endcode
142
143 Another possibility which exists now is to provide an overload of
144 wxToString() (and wxFromString()) for your own type, e.g.
145
146 @code
147 wxString wxToString(Colour col)
148 {
149 return col == Red ? "R" : col == Green ? "G" : "B";
150 }
151
152 bool wxFromString(const wxString& s, Colour* col)
153 {
154 if ( s.length() != 1 )
155 return false;
156
157 switch ( s[0].GetValue() )
158 {
159 case 'R': *col = Red; return true;
160 case 'G': *col = Green; return true;
161 case 'B': *col = Blue; return true;
162 }
163
164 return false;
165 }
166 @endcode
167
168 Of course, this will change the format of the wxConfig output which may be
169 undesirable.
170
171 - wxTE_AUTO_SCROLL style is deprecated as it's always on by default anyhow in
172 the ports which support it so you should simply remove any mentions of it
173 from your code.
174
175 - If you use wxScrolled<T>::SetTargetWindow() you must override
176 wxScrolled<T>::GetSizeAvailableForScrollTarget() method to compute the size
177 available for the scroll target as function of the main window size, please
178 see the documentation of this method for more details.
179
180 - Signature of wxDataViewCustomRenderer::StartDrag() virtual method changed.
181 You will need to change it in your derived renderer class too if you override
182 it.
183
184 - wxDataViewCustomRenderer::Activate() and
185 wxDataViewCustomRenderer::LeftClick() were replaced with the new
186 wxDataViewCustomRenderer::ActivateCell() method. You will need to change it
187 in your derived renderer class accordingly.
188
189 */
190