INCOMPATIBLE CHANGES SINCE 2.6.x
================================
-- wxFontData::GetColour() now returns a const colour
+- wxFontData::GetColour() now returns a const colour.
- wxDC objects can't be created directly now (this never worked, now it doesn't
- even compile)
+ even compile).
- For all wxInputStreams, Eof() becomes true after an attempt has been made
to read _past_ the end of file.
-- wxCHECK family of macros now must be followed by a semicolon
+- wxCHECK family of macros now must be followed by a semicolon.
- wxMBConv::cMB2WC() and cWC2MB() take size of the input buffer and return
length of the converted string in all cases now.
- wxHtmlWindow::OnCellClicked() now returns bool.
continue to work with WXWIN_COMPATIBILITY_2_6, but should be rewritten to
use GetMouseCursor().
- wxHtmlCell::AdjustPagebreak() signature has changed, update your code if you
- override it
+ override it.
- wxFontEnumerator::GetFacenames() and GetEncodings() now return arrays and
- not pointers to arrays
-- wxStaticBoxSizer now deletes the associated wxStaticBox when it is deleted
+ not pointers to arrays.
+- wxStaticBoxSizer now deletes the associated wxStaticBox when it is deleted.
Deprecated methods since 2.6.x and their replacements
-----------------------------------------------------
-- wxGetWorkingDirectory() deprecated in favour of wxGetCwd()
-- wxDC::BeginDrawing() and wxDC::EndDrawing() deprecated, just don't use them
+- wxGetWorkingDirectory() deprecated in favour of wxGetCwd().
+- wxDC::BeginDrawing() and wxDC::EndDrawing() deprecated, just don't use them.
2.7.0
All:
-- Added positional parameters support to wxVsnprintf() (Francesco Montorsi)
-- wx(F)File, wxTextFile and wxInputStreams recognize Unicode BOM now
-- Many fixes for UTF-16/32 handling in Unicode builds
+- Added positional parameters support to wxVsnprintf() (Francesco Montorsi).
+- wx(F)File, wxTextFile and wxInputStreams recognize Unicode BOM now.
+- Many fixes for UTF-16/32 handling in Unicode builds.
- wxLaunchDefaultBrowser() now supports wxBROWSER_NEW_WINDOW flag.
- Added wxStandardPaths::GetResourcesDir() and GetLocalizedResourcesDir()
-- Added wxStandardPaths::GetDocumentsDir() (Ken Thomases)
+- Added wxStandardPaths::GetDocumentsDir() (Ken Thomases).
- Added wxStringTokenizer::GetLastDelimiter(); improved documentation.
-- Fixed wxTextFile in Unicode build
-- Added possibility to specify dependencies for a wxModule
+- Fixed wxTextFile in Unicode build.
+- Added possibility to specify dependencies for a wxModule.
- Speed improvements to wxRegEx when matching is done in a loop such as
during a search and replace.
- Fix regerror and regfree name conficts when built-in regex and system regex
- Added support for wxLongLong in wx stream classes (Mark Junker).
- wxSOCKET_REUSEADDR can be used with wxSocketClient.
- Overloaded Connect() and SetLocal() methods for binding to local address/port.
-- Albanian translation added (Besnik Bleta)
-- Assert messages now show the function in which assert failed
-- wxApp::OnAssertFailure() should now be used instead the old wxApp::OnAssert()
-- Fixed several bugs in wxDateTime::ParseDate()
+- Albanian translation added (Besnik Bleta).
+- Assert messages now show the function in which assert failed.
+- wxApp::OnAssertFailure() should now be used instead the old wxApp::OnAssert().
+- Fixed several bugs in wxDateTime::ParseDate().
- The WXK*PRIOR and WXK*NEXT constants are now aliases for WXK*PAGEUP
and WXK*PAGEDOWN. If you have switch statements that use both
constants from a set then you need to remove the PRIOR/NEXT
versions in order to eliminate compiler errors.
- Fixed bug where wxDateTime::Now() would sometimes return an incorrect value
the first time it was called.
-- Added wxString::rbegin() and rend()
-- Added wxString::EndsWith()
+- Added wxString::rbegin() and rend().
+- Added wxString::EndsWith().
- wxSocket::_Read continues reading from socket after exhausting pushback buffer.
Previously, only the buffer would be returned, even if more data was requested.
-- Added wxPowerEvent (currently MSW-only)
-- Make wx-config compatible with Bourne shells
+- Added wxPowerEvent (currently MSW-only).
+- Make wx-config compatible with Bourne shells.
All (GUI):
-- Added wxComboCtrl and wxOwnerDrawnComboBox (Jaakko Salli)
+- Added wxComboCtrl and wxOwnerDrawnComboBox (Jaakko Salli).
- Added wxTreebook (uses a wxTreeCtrl to control pages).
-- Added wxColour/Dir/File/Font/PickerCtrls (Francesco Montorsi)
-- Added wxDC::GradientFillLinear/Concentric()
-- Added wxHyperlinkCtrl (Francesco Montorsi)
-- Added clipboard events (wxEVT_COMMAND_TEXT_COPY/CUT/PASTE)
-- Allow to reorder wxGrid columns by drag-and-drop (Santiago Palacios)
-- Added wxRadioBox::SetItemToolTip()
-- Added support for CMYK JPEG images loading (Robert Wruck)
-- Added wxListCtrl::GetSubItemRect() and subitem hit testing (Agron Selimaj)
-- Added wxKeyEvent::GetModifiers()
+- Added wxColour/Dir/File/Font/PickerCtrls (Francesco Montorsi).
+- Added wxDC::GradientFillLinear/Concentric().
+- Added wxHyperlinkCtrl (Francesco Montorsi).
+- Added clipboard events (wxEVT_COMMAND_TEXT_COPY/CUT/PASTE).
+- Allow to reorder wxGrid columns by drag-and-drop (Santiago Palacios).
+- Added wxRadioBox::SetItemToolTip().
+- Added support for CMYK JPEG images loading (Robert Wruck).
+- Added wxListCtrl::GetSubItemRect() and subitem hit testing (Agron Selimaj).
+- Added wxKeyEvent::GetModifiers().
- Added wxDialog::SetEscapeId().
- wxItemContainerImmutable::FindString unified (affects wxRadioBox, wxListBox,
wxComboBox and wxChoice).
- Access to titles through Get/SetTitle is available now only for top level
windows (wxDialog, wxFrame).
- Fixed memory leak of pending events in wxEvtHandler.
-- Added wxRadioBox::IsItemEnabled/Shown()
+- Added wxRadioBox::IsItemEnabled/Shown().
- Added space after list item number in wxHTML.
- Implemented <sub> and <sup> handling in wxHTML (based on patch
by Sandro Sigala).
- wxCalendarCtrl positioning and hit-testing fixes for dimensions other than
best size.
- wxCalendarCtrl colour schema changed and adjusted to system settings.
-- wxImage::Mirror() and GetSubBitmap() now support alpha (Mickey Rose)
+- wxImage::Mirror() and GetSubBitmap() now support alpha (Mickey Rose).
- More checking of image validity before loading into wxImage.
- Added wxImage::ConvertToGreyscale.
- Added ability to use templates with static event tables
- Indices and counts in wxControlWithItems derived API are unsigned.
- Added support for links to wxHtmlListBox; use code has to override
wxHtmlListBox::OnLinkClicked() to take advantage of it.
-- Added an easier to use wxMenu::AppendSubMenu()
+- Added an easier to use wxMenu::AppendSubMenu().
- wxString <-> wxColour conversions in wxColour class (Francesco Montorsi).
-- Fixed bug with ignoring blank lines in multiline wxGrid cell labels
-- Added wxTextAttr::Merge() (Marcin Simonides)
-- Added wxTB_NO_TOOLTIPS style (Igor Korot)
-- Added wxGenericDirCtrl::CollapsePath() (Christian Buhtz)
+- Fixed bug with ignoring blank lines in multiline wxGrid cell labels.
+- Added wxTextAttr::Merge() (Marcin Simonides).
+- Added wxTB_NO_TOOLTIPS style (Igor Korot).
+- Added wxGenericDirCtrl::CollapsePath() (Christian Buhtz).
- Fixed 64-bit issue in wxNotebook causing segfaults on Tru64 Unix.
-- Made it possible to associate context help to a region of a window
+- Made it possible to associate context help to a region of a window.
+- Added support for tabs in wxRichTextCtrl (Ashish More).
wxMSW:
- Fixed wxChoice/wxComboBox slow appending and infinite recursion
if its size is set within a paint handler (for example when embedded in a
wxHtmlWindow). [Now reverted due to problems in W2K and below.]
-- wxDC::GetTextExtent() width calculation is more precise for italics fonts now
-- Warning fixes for VC++ 5.0 (Igor Korot)
+- wxDC::GetTextExtent() width calculation is more precise for italics fonts now.
+- Warning fixes for VC++ 5.0 (Igor Korot).
wxGTK:
- Fixed problems with CJK input method.
- Implemented ScrollLines/Pages() for all windows (Paul Cornett).
- Support underlined fonts in wxTextCtrl.
-- Support all border styles; wxListBox honours the borders now
+- Support all border styles; wxListBox honours the borders now.
- wxWindow and wxScrolledWindow now generate line, page and thumb-release scroll events.
wxMac:
/// Get the object size for the given range. Returns false if the range
/// is invalid for this object.
- virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags) const = 0;
+ virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags, wxPoint position = wxPoint(0,0)) const = 0;
/// Do a split, returning an object containing the second part, and setting
/// the first part in 'this'.
/// Get/set the object size for the given range. Returns false if the range
/// is invalid for this object.
- virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags) const;
+ virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags, wxPoint position = wxPoint(0,0)) const;
// Accessors
/// Get/set the object size for the given range. Returns false if the range
/// is invalid for this object.
- virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags) const;
+ virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags, wxPoint position = wxPoint(0,0)) const;
/// Delete range
virtual bool DeleteRange(const wxRichTextRange& range);
/// Get/set the object size for the given range. Returns false if the range
/// is invalid for this object.
- virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags) const;
+ virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags, wxPoint position = wxPoint(0,0)) const;
/// Finds the absolute position and row height for the given character position
virtual bool FindPosition(wxDC& dc, long index, wxPoint& pt, int* height, bool forceLineStart);
/// Get/set the object size for the given range. Returns false if the range
/// is invalid for this object.
- virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags) const;
+ virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags, wxPoint position/* = wxPoint(0,0)*/) const;
/// Get any text in this object for the given range
virtual wxString GetTextForRange(const wxRichTextRange& range) const;
/// Clone
virtual wxRichTextObject* Clone() const { return new wxRichTextPlainText(*this); }
+private:
+ bool wxRichTextPlainText::DrawTabbedString(wxDC& dc,const wxRect& rect,wxString& str, wxCoord& x, wxCoord& y, bool selected);
protected:
wxString m_text;
/// Get the object size for the given range. Returns false if the range
/// is invalid for this object.
- virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags) const;
+ virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags, wxPoint position = wxPoint(0,0)) const;
/// Returns true if the object is empty
virtual bool IsEmpty() const { return !m_image.Ok(); }
# =========================================================================
# This makefile was generated by
-# Bakefile 0.1.9 (http://bakefile.sourceforge.net)
+# Bakefile 0.2.0 (http://bakefile.sourceforge.net)
# Do not modify, all changes will be overwritten!
# =========================================================================
rm -f config.cache config.log config.status bk-deps bk-make-pch shared-ld-sh Makefile
richtext$(EXEEXT): $(RICHTEXT_OBJECTS) $(__richtext___win32rc)
- $(CXX) -o $@ $(RICHTEXT_OBJECTS) $(LDFLAGS) -L$(LIBDIRNAME) $(LDFLAGS_GUI) $(SAMPLES_RPATH_FLAG) $(__WXLIB_HTML_p) $(EXTRALIBS_HTML) $(__WXLIB_ADV_p) $(PLUGIN_ADV_EXTRALIBS) $(__WXLIB_CORE_p) $(__WXLIB_XML_p) $(EXTRALIBS_XML) $(__WXLIB_BASE_p) $(__WXLIB_MONO_p) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) $(__LIB_ZLIB_p) $(__LIB_ODBC_p) $(__LIB_REGEX_p) $(__LIB_EXPAT_p) $(EXTRALIBS_FOR_BASE) $(EXTRALIBS_FOR_GUI)
+ $(CXX) -o $@ $(RICHTEXT_OBJECTS) $(LDFLAGS) -L$(LIBDIRNAME) $(LDFLAGS_GUI) $(SAMPLES_RPATH_FLAG) $(__WXLIB_HTML_p) $(EXTRALIBS_HTML) $(__WXLIB_ADV_p) $(PLUGIN_ADV_EXTRALIBS) $(__WXLIB_CORE_p) $(__WXLIB_XML_p) $(EXTRALIBS_XML) $(__WXLIB_BASE_p) $(__WXLIB_MONO_p) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) $(EXTRALIBS_FOR_GUI) $(__LIB_ZLIB_p) $(__LIB_ODBC_p) $(__LIB_REGEX_p) $(__LIB_EXPAT_p) $(EXTRALIBS_FOR_BASE)
$(__richtext___mac_rezcmd)
$(__richtext___mac_setfilecmd)
$(__richtext___os2_emxbindcmd)
# =========================================================================
# This makefile was generated by
-# Bakefile 0.1.9 (http://bakefile.sourceforge.net)
+# Bakefile 0.2.0 (http://bakefile.sourceforge.net)
# Do not modify, all changes will be overwritten!
# =========================================================================
$(__OPTIMIZEFLAG_2) $(__THREADSFLAG_6) -D__WXMSW__ $(__WXUNIV_DEFINE_p) \
$(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) \
$(__THREAD_DEFINE_p) $(__UNICODE_DEFINE_p) $(__MSLU_DEFINE_p) \
- -I.\..\..\include -I$(SETUPHDIR) -I. $(__DLLFLAG_p) -I.\..\..\samples -DNOPCH \
+ -I$(SETUPHDIR) -I.\..\..\include -I. $(__DLLFLAG_p) -I.\..\..\samples -DNOPCH \
$(CPPFLAGS) $(CXXFLAGS)
RICHTEXT_OBJECTS = \
$(OBJS)\richtext_richtext.obj
$(OBJS)\richtext.exe: $(RICHTEXT_OBJECTS) $(OBJS)\richtext_sample.res
ilink32 -Tpe -q $(LDFLAGS) -L$(BCCDIR)\lib -L$(BCCDIR)\lib\psdk $(__DEBUGINFO) -L$(LIBDIRNAME) -aa @&&|
- c0w32.obj $(RICHTEXT_OBJECTS),$@,, $(__WXLIB_HTML_p) $(__WXLIB_ADV_p) $(__WXLIB_CORE_p) $(__WXLIB_XML_p) $(__WXLIB_BASE_p) $(__WXLIB_MONO_p) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) wxzlib$(WXDEBUGFLAG).lib wxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG).lib wxexpat$(WXDEBUGFLAG).lib $(EXTRALIBS_FOR_BASE) $(__UNICOWS_LIB_p) ole2w32.lib oleacc.lib odbc32.lib import32.lib cw32$(__THREADSFLAG_5)$(__RUNTIME_LIBS_8).lib,, $(OBJS)\richtext_sample.res
+ c0w32.obj $(RICHTEXT_OBJECTS),$@,, $(__WXLIB_HTML_p) $(__WXLIB_ADV_p) $(__WXLIB_CORE_p) $(__WXLIB_XML_p) $(__WXLIB_BASE_p) $(__WXLIB_MONO_p) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) wxzlib$(WXDEBUGFLAG).lib wxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG).lib wxexpat$(WXDEBUGFLAG).lib $(EXTRALIBS_FOR_BASE) $(__UNICOWS_LIB_p) ole2w32.lib oleacc.lib odbc32.lib import32.lib cw32$(__THREADSFLAG_5)$(__RUNTIME_LIBS_8).lib,, $(OBJS)\richtext_sample.res
|
$(OBJS)\richtext_sample.res: .\..\..\samples\sample.rc
- brcc32 -32 -r -fo$@ -i$(BCCDIR)\include -d__WXMSW__ $(__WXUNIV_DEFINE_p_1) $(__DEBUG_DEFINE_p_1) $(__EXCEPTIONS_DEFINE_p_1) $(__RTTI_DEFINE_p_1) $(__THREAD_DEFINE_p_1) $(__UNICODE_DEFINE_p_1) $(__MSLU_DEFINE_p_1) -i.\..\..\include -i$(SETUPHDIR) -i. $(__DLLFLAG_p_1) -i.\..\..\samples $**
+ brcc32 -32 -r -fo$@ -i$(BCCDIR)\include -d__WXMSW__ $(__WXUNIV_DEFINE_p_1) $(__DEBUG_DEFINE_p_1) $(__EXCEPTIONS_DEFINE_p_1) $(__RTTI_DEFINE_p_1) $(__THREAD_DEFINE_p_1) $(__UNICODE_DEFINE_p_1) $(__MSLU_DEFINE_p_1) -i$(SETUPHDIR) -i.\..\..\include -i. $(__DLLFLAG_p_1) -i.\..\..\samples $**
$(OBJS)\richtext_richtext.obj: .\richtext.cpp
$(CXX) -q -c -P -o$@ $(RICHTEXT_CXXFLAGS) $**
# =========================================================================
# This makefile was generated by
-# Bakefile 0.1.9 (http://bakefile.sourceforge.net)
+# Bakefile 0.2.0 (http://bakefile.sourceforge.net)
# Do not modify, all changes will be overwritten!
# =========================================================================
$(GCCFLAGS) -DHAVE_W32API_H -D__WXMSW__ $(__WXUNIV_DEFINE_p) \
$(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) \
$(__THREAD_DEFINE_p) $(__UNICODE_DEFINE_p) $(__MSLU_DEFINE_p) \
- -I.\..\..\include -I$(SETUPHDIR) -W -Wall -I. $(__DLLFLAG_p) -I.\..\..\samples \
+ -I$(SETUPHDIR) -I.\..\..\include -W -Wall -I. $(__DLLFLAG_p) -I.\..\..\samples \
-DNOPCH $(__RTTIFLAG_5) $(__EXCEPTIONSFLAG_6) -Wno-ctor-dtor-privacy \
$(CPPFLAGS) $(CXXFLAGS)
RICHTEXT_OBJECTS = \
-if exist $(OBJS)\richtext.exe del $(OBJS)\richtext.exe
$(OBJS)\richtext.exe: $(RICHTEXT_OBJECTS) $(OBJS)\richtext_sample_rc.o
- $(CXX) -o $@ $(RICHTEXT_OBJECTS) $(LDFLAGS) $(__DEBUGINFO) $(__THREADSFLAG) -L$(LIBDIRNAME) -Wl,--subsystem,windows -mwindows $(__WXLIB_HTML_p) $(__WXLIB_ADV_p) $(__WXLIB_CORE_p) $(__WXLIB_XML_p) $(__WXLIB_BASE_p) $(__WXLIB_MONO_p) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) -lwxzlib$(WXDEBUGFLAG) -lwxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG) -lwxexpat$(WXDEBUGFLAG) $(EXTRALIBS_FOR_BASE) $(__UNICOWS_LIB_p) -lkernel32 -luser32 -lgdi32 -lcomdlg32 -lwinspool -lwinmm -lshell32 -lcomctl32 -lole32 -loleaut32 -luuid -lrpcrt4 -ladvapi32 -lwsock32 -lodbc32
+ $(CXX) -o $@ $(RICHTEXT_OBJECTS) $(LDFLAGS) $(__DEBUGINFO) $(__THREADSFLAG) -L$(LIBDIRNAME) -Wl,--subsystem,windows -mwindows $(__WXLIB_HTML_p) $(__WXLIB_ADV_p) $(__WXLIB_CORE_p) $(__WXLIB_XML_p) $(__WXLIB_BASE_p) $(__WXLIB_MONO_p) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) -lwxzlib$(WXDEBUGFLAG) -lwxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG) -lwxexpat$(WXDEBUGFLAG) $(EXTRALIBS_FOR_BASE) $(__UNICOWS_LIB_p) -lkernel32 -luser32 -lgdi32 -lcomdlg32 -lwinspool -lwinmm -lshell32 -lcomctl32 -lole32 -loleaut32 -luuid -lrpcrt4 -ladvapi32 -lwsock32 -lodbc32
$(OBJS)\richtext_sample_rc.o: ./../../samples/sample.rc
- windres --use-temp-file -i$< -o$@ --define __WXMSW__ $(__WXUNIV_DEFINE_p_1) $(__DEBUG_DEFINE_p_1) $(__EXCEPTIONS_DEFINE_p_1) $(__RTTI_DEFINE_p_1) $(__THREAD_DEFINE_p_1) $(__UNICODE_DEFINE_p_1) $(__MSLU_DEFINE_p_1) --include-dir ./../../include --include-dir $(SETUPHDIR) --include-dir . $(__DLLFLAG_p_1) --include-dir ./../../samples
+ windres --use-temp-file -i$< -o$@ --define __WXMSW__ $(__WXUNIV_DEFINE_p_1) $(__DEBUG_DEFINE_p_1) $(__EXCEPTIONS_DEFINE_p_1) $(__RTTI_DEFINE_p_1) $(__THREAD_DEFINE_p_1) $(__UNICODE_DEFINE_p_1) $(__MSLU_DEFINE_p_1) --include-dir $(SETUPHDIR) --include-dir ./../../include --include-dir . $(__DLLFLAG_p_1) --include-dir ./../../samples
$(OBJS)\richtext_richtext.o: ./richtext.cpp
$(CXX) -c -o $@ $(RICHTEXT_CXXFLAGS) $(CPPDEPS) $<
wxFont boldFont = wxFont(12, wxROMAN, wxNORMAL, wxBOLD);
wxFont italicFont = wxFont(12, wxROMAN, wxITALIC, wxNORMAL);
- m_richTextCtrl = new wxRichTextCtrl(splitter, wxID_ANY, wxDefaultPosition, wxSize(200, 200), wxVSCROLL|wxHSCROLL|wxNO_BORDER);
+ m_richTextCtrl = new wxRichTextCtrl(splitter, wxID_ANY, wxDefaultPosition, wxSize(200, 200), wxVSCROLL|wxHSCROLL|wxNO_BORDER|wxWANTS_CHARS);
wxFont font(12, wxROMAN, wxNORMAL, wxNORMAL);
#ifdef __WXMAC__
r.EndLineSpacing();
r.EndAlignment();
+ wxArrayInt tabs;
+ tabs.Add(400);
+ tabs.Add(600);
+ tabs.Add(800);
+ tabs.Add(1000);
+ wxTextAttrEx attr;
+ attr.SetFlags(wxTEXT_ATTR_TABS);
+ attr.SetTabs(tabs);
+ r.SetDefaultStyle(attr);
+
+ r.Newline();
+ r.WriteText(wxT("This line contains tabs:\tFirst tab\tSecond tab\tThird tab"));
+
r.Newline();
r.WriteText(wxT("Other notable features of wxRichTextCtrl include:"));
}
/// Get/set the size for the given range. Assume only has one child.
-bool wxRichTextBox::GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags) const
+bool wxRichTextBox::GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags, wxPoint position) const
{
wxRichTextObjectList::compatibility_iterator node = m_children.GetFirst();
if (node)
{
wxRichTextObject* child = node->GetData();
- return child->GetRangeSize(range, size, descent, dc, flags);
+ return child->GetRangeSize(range, size, descent, dc, flags, position);
}
else
return false;
}
/// Get/set the size for the given range.
-bool wxRichTextParagraphLayoutBox::GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags) const
+bool wxRichTextParagraphLayoutBox::GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags, wxPoint position) const
{
wxSize sz;
wxSize childSize;
int childDescent = 0;
- child->GetRangeSize(rangeToFind, childSize, childDescent, dc, flags);
+ child->GetRangeSize(rangeToFind, childSize, childDescent, dc, flags, position);
descent = wxMax(childDescent, descent);
wxSize objectSize;
int descent = 0;
- child->GetRangeSize(objectRange, objectSize, descent, dc, wxRICHTEXT_UNFORMATTED);
+ child->GetRangeSize(objectRange, objectSize, descent, dc, wxRICHTEXT_UNFORMATTED, objectPosition);
// Use the child object's width, but the whole line's height
wxRect childRect(objectPosition, wxSize(objectSize.x, line->GetSize().y));
childDescent = child->GetDescent();
}
else
- GetRangeSize(wxRichTextRange(lastEndPos+1, child->GetRange().GetEnd()), childSize, childDescent, dc, wxRICHTEXT_UNFORMATTED);
+ GetRangeSize(wxRichTextRange(lastEndPos+1, child->GetRange().GetEnd()), childSize, childDescent, dc, wxRICHTEXT_UNFORMATTED,rect.GetPosition());
if (childSize.x + currentWidth > availableSpaceForText)
{
/// Get/set the object size for the given range. Returns false if the range
/// is invalid for this object.
-bool wxRichTextParagraph::GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags) const
+bool wxRichTextParagraph::GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags, wxPoint position) const
{
if (!range.IsWithin(GetRange()))
return false;
rangeToUse.LimitTo(child->GetRange());
int childDescent = 0;
- if (child->GetRangeSize(rangeToUse, childSize, childDescent, dc, flags))
+ if (child->GetRangeSize(rangeToUse, childSize, childDescent, dc, flags, position))
{
sz.y = wxMax(sz.y, childSize.y);
sz.x += childSize.x;
wxSize childSize;
int childDescent = 0;
- if (child->GetRangeSize(rangeToUse, childSize, childDescent, dc, flags))
+ if (child->GetRangeSize(rangeToUse, childSize, childDescent, dc, flags, position))
{
lineSize.y = wxMax(lineSize.y, childSize.y);
lineSize.x += childSize.x;
// then we can add this size to the line start position and
// paragraph start position to find the actual position.
- if (GetRangeSize(r, rangeSize, descent, dc, wxRICHTEXT_UNFORMATTED))
+ if (GetRangeSize(r, rangeSize, descent, dc, wxRICHTEXT_UNFORMATTED, line->GetPosition()+ GetPosition()))
{
pt.x = line->GetPosition().x + GetPosition().x + rangeSize.x;
*height = line->GetSize().y;
wxRichTextRange rangeToUse(lineRange.GetStart(), i);
- GetRangeSize(rangeToUse, childSize, descent, dc, wxRICHTEXT_UNFORMATTED);
+ GetRangeSize(rangeToUse, childSize, descent, dc, wxRICHTEXT_UNFORMATTED, linePos);
int nextX = childSize.x + linePos.x;
// (a) All selected.
if (selectionRange.GetStart() <= range.GetStart() && selectionRange.GetEnd() >= range.GetEnd())
- {
+ {/*
// Draw all selected
dc.SetBrush(*wxBLACK_BRUSH);
dc.SetPen(*wxBLACK_PEN);
dc.DrawRectangle(selRect);
dc.SetTextForeground(*wxWHITE);
dc.SetBackgroundMode(wxTRANSPARENT);
- dc.DrawText(stringChunk, x, y);
+ dc.DrawText(stringChunk, x, y);*/
+ DrawTabbedString(dc, rect,stringChunk, x, y, true);
}
// (b) None selected.
else if (selectionRange.GetEnd() < range.GetStart() || selectionRange.GetStart() > range.GetEnd())
{
// Draw all unselected
+ /*
dc.SetTextForeground(GetAttributes().GetTextColour());
dc.SetBackgroundMode(wxTRANSPARENT);
- dc.DrawText(stringChunk, x, y);
+ dc.DrawText(stringChunk, x, y);*/
+ DrawTabbedString(dc, rect,stringChunk, x, y, false);
}
else
{
if (fragmentLen < 0)
wxLogDebug(wxT("Mid(%d, %d"), (int)(r1 - offset), (int)fragmentLen);
wxString stringFragment = m_text.Mid(r1 - offset, fragmentLen);
-
+/*
dc.SetTextForeground(GetAttributes().GetTextColour());
dc.DrawText(stringFragment, x, y);
wxCoord w, h;
dc.GetTextExtent(stringFragment, & w, & h);
- x += w;
+ x += w;*/
+ DrawTabbedString(dc, rect,stringFragment, x, y, false);
}
// 2. Selected chunk, if any.
if (fragmentLen < 0)
wxLogDebug(wxT("Mid(%d, %d"), (int)(s1 - offset), (int)fragmentLen);
wxString stringFragment = m_text.Mid(s1 - offset, fragmentLen);
-
+/*
wxCoord w, h;
dc.GetTextExtent(stringFragment, & w, & h);
wxRect selRect(x, rect.y, w, rect.GetHeight());
dc.SetTextForeground(*wxWHITE);
dc.DrawText(stringFragment, x, y);
- x += w;
+ x += w;*/
+ DrawTabbedString(dc, rect,stringFragment, x, y, true);
}
// 3. Remaining unselected chunk, if any
if (fragmentLen < 0)
wxLogDebug(wxT("Mid(%d, %d"), (int)(s2 - offset), (int)fragmentLen);
wxString stringFragment = m_text.Mid(s2 - offset, fragmentLen);
-
+/*
dc.SetTextForeground(GetAttributes().GetTextColour());
- dc.DrawText(stringFragment, x, y);
+ dc.DrawText(stringFragment, x, y);*/
+ DrawTabbedString(dc, rect,stringFragment, x, y, false);
}
}
return true;
}
+
+bool wxRichTextPlainText::DrawTabbedString(wxDC& dc,const wxRect& rect,wxString& str, wxCoord& x, wxCoord& y, bool selected)
+{
+ wxArrayInt tab_array = GetAttributes().GetTabs();
+ if(tab_array.IsEmpty()){// create a default tab list at 10 mm each.
+ for( int i = 0; i < 20; ++i){
+ tab_array.Add(i*100);
+ }
+ }
+ int map_mode = dc.GetMapMode();
+ dc.SetMapMode(wxMM_LOMETRIC );
+ int num_tabs = tab_array.GetCount();
+ for( int i = 0; i < num_tabs; ++i){
+ tab_array[i] = dc.LogicalToDeviceXRel(tab_array[i]);
+ }
+ dc.SetMapMode(map_mode );
+ int next_tab_pos = -1;
+ int tab_pos = -1;
+ wxCoord w, h;
+ if(selected){
+ dc.SetBrush(*wxBLACK_BRUSH);
+ dc.SetPen(*wxBLACK_PEN);
+ dc.SetTextForeground(*wxWHITE);
+ dc.SetBackgroundMode(wxTRANSPARENT);
+ }
+ else{
+ dc.SetTextForeground(GetAttributes().GetTextColour());
+ dc.SetBackgroundMode(wxTRANSPARENT);
+ }
+ while(str.Find(wxT('\t')) >= 0){// the string has a tab
+ // break up the string at the Tab
+ wxString stringChunk = str.BeforeFirst(wxT('\t'));
+ str = str.AfterFirst(wxT('\t'));
+ dc.GetTextExtent(stringChunk, & w, & h);
+ tab_pos = x + w;
+ bool not_found = true;
+ for( int i = 0; i < num_tabs && not_found; ++i){
+ next_tab_pos = tab_array.Item(i);
+ if( next_tab_pos > tab_pos){
+ not_found = false;
+ if(selected){
+ w = next_tab_pos - x;
+ wxRect selRect(x, rect.y, w, rect.GetHeight());
+ dc.DrawRectangle(selRect);
+ }
+ dc.DrawText(stringChunk, x, y);
+ x = next_tab_pos;
+ }
+ }
+ }
+
+ dc.GetTextExtent(str, & w, & h);
+ if(selected){
+ wxRect selRect(x, rect.y, w, rect.GetHeight());
+ dc.DrawRectangle(selRect);
+ }
+ dc.DrawText(str, x, y);
+ x += w;
+ return true;
+}
/// Lay the item out
bool wxRichTextPlainText::Layout(wxDC& dc, const wxRect& WXUNUSED(rect), int WXUNUSED(style))
{
/// Get/set the object size for the given range. Returns false if the range
/// is invalid for this object.
-bool wxRichTextPlainText::GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int WXUNUSED(flags)) const
+bool wxRichTextPlainText::GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int WXUNUSED(flags), wxPoint position) const
{
if (!range.IsWithin(GetRange()))
return false;
long len = range.GetLength();
wxString stringChunk = m_text.Mid(startPos, (size_t) len);
wxCoord w, h;
+ int width = 0;
+ if(stringChunk.Find(wxT('\t')) >= 0){// the string has a tab
+ wxArrayInt tab_array = GetAttributes().GetTabs();
+ if(tab_array.IsEmpty()){// create a default tab list at 10 mm each.
+ for( int i = 0; i < 20; ++i){
+ tab_array.Add(i*100);
+ }
+ }
+ int map_mode = dc.GetMapMode();
+ dc.SetMapMode(wxMM_LOMETRIC );
+ int num_tabs = tab_array.GetCount();
+ for( int i = 0; i < num_tabs; ++i){
+ tab_array[i] = dc.LogicalToDeviceXRel(tab_array[i]);
+ }
+ dc.SetMapMode(map_mode );
+ int next_tab_pos = -1;
+
+ while(stringChunk.Find(wxT('\t')) >= 0){// the string has a tab
+ // break up the string at the Tab
+ wxString stringFragment = stringChunk.BeforeFirst(wxT('\t'));
+ stringChunk = stringChunk.AfterFirst(wxT('\t'));
+ dc.GetTextExtent(stringFragment, & w, & h);
+ width += w;
+ int absolute_width = width + position.x;
+ bool not_found = true;
+ for( int i = 0; i < num_tabs && not_found; ++i){
+ next_tab_pos = tab_array.Item(i);
+ if( next_tab_pos > absolute_width){
+ not_found = false;
+ width = next_tab_pos - position.x;
+ }
+ }
+ }
+ }
dc.GetTextExtent(stringChunk, & w, & h, & descent);
- size = wxSize(w, dc.GetCharHeight());
-
+ width += w;
+ size = wxSize(width, dc.GetCharHeight());
+
return true;
}
/// Get/set the object size for the given range. Returns false if the range
/// is invalid for this object.
-bool wxRichTextImage::GetRangeSize(const wxRichTextRange& range, wxSize& size, int& WXUNUSED(descent), wxDC& WXUNUSED(dc), int WXUNUSED(flags)) const
+bool wxRichTextImage::GetRangeSize(const wxRichTextRange& range, wxSize& size, int& WXUNUSED(descent), wxDC& WXUNUSED(dc), int WXUNUSED(flags), wxPoint WXUNUSED(position)) const
{
if (!range.IsWithin(GetRange()))
return false;