always show vert SB for multiline text ctrls without wxTE_RICH style
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/wxUNIVERSAL@8715 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -263,6 +263,7 @@ protected:
|
|||||||
// more readable flag testing methods
|
// more readable flag testing methods
|
||||||
bool IsSingleLine() const { return !(GetWindowStyle() & wxTE_MULTILINE); }
|
bool IsSingleLine() const { return !(GetWindowStyle() & wxTE_MULTILINE); }
|
||||||
bool IsPassword() const { return (GetWindowStyle() & wxTE_PASSWORD) != 0; }
|
bool IsPassword() const { return (GetWindowStyle() & wxTE_PASSWORD) != 0; }
|
||||||
|
bool WrapLines() const { return !(GetWindowStyle() & wxHSCROLL); }
|
||||||
|
|
||||||
// get the extent (width) of the text
|
// get the extent (width) of the text
|
||||||
wxCoord GetTextWidth(const wxString& text) const;
|
wxCoord GetTextWidth(const wxString& text) const;
|
||||||
|
@@ -80,6 +80,7 @@ enum
|
|||||||
#endif // 0
|
#endif // 0
|
||||||
|
|
||||||
TextTest_Password,
|
TextTest_Password,
|
||||||
|
TextTest_HScroll,
|
||||||
TextTest_Textctrl,
|
TextTest_Textctrl,
|
||||||
TextTest_Quit
|
TextTest_Quit
|
||||||
};
|
};
|
||||||
@@ -158,6 +159,7 @@ protected:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
void OnUpdateUIPasswordCheckbox(wxUpdateUIEvent& event);
|
void OnUpdateUIPasswordCheckbox(wxUpdateUIEvent& event);
|
||||||
|
void OnUpdateUIHScrollCheckbox(wxUpdateUIEvent& event);
|
||||||
|
|
||||||
void OnUpdateUIResetButton(wxUpdateUIEvent& event);
|
void OnUpdateUIResetButton(wxUpdateUIEvent& event);
|
||||||
|
|
||||||
@@ -169,17 +171,11 @@ protected:
|
|||||||
// (re)create the textctrl
|
// (re)create the textctrl
|
||||||
void CreateText();
|
void CreateText();
|
||||||
|
|
||||||
// textctrl parameters
|
// is the control currently single line?
|
||||||
// ------------------
|
bool IsSingleLine() const
|
||||||
|
{
|
||||||
// single or multi line?
|
return m_radioTextLines->GetSelection() == TextLines_Single;
|
||||||
bool m_isSingleLine;
|
}
|
||||||
|
|
||||||
// readonly or can be modified?
|
|
||||||
bool m_isReadOnly;
|
|
||||||
|
|
||||||
// in password or normal mode?
|
|
||||||
bool m_isPassword;
|
|
||||||
|
|
||||||
// the controls
|
// the controls
|
||||||
// ------------
|
// ------------
|
||||||
@@ -190,8 +186,9 @@ protected:
|
|||||||
// the radiobox to choose between single and multi line
|
// the radiobox to choose between single and multi line
|
||||||
wxRadioBox *m_radioTextLines;
|
wxRadioBox *m_radioTextLines;
|
||||||
|
|
||||||
// the checkboxes
|
// the checkboxes controlling text ctrl styles
|
||||||
wxCheckBox *m_chkPassword,
|
wxCheckBox *m_chkPassword,
|
||||||
|
*m_chkHScroll,
|
||||||
*m_chkReadonly;
|
*m_chkReadonly;
|
||||||
|
|
||||||
// the textctrl itself and the sizer it is in
|
// the textctrl itself and the sizer it is in
|
||||||
@@ -270,6 +267,7 @@ BEGIN_EVENT_TABLE(TextTestFrame, wxFrame)
|
|||||||
#endif // 0
|
#endif // 0
|
||||||
|
|
||||||
EVT_UPDATE_UI(TextTest_Password, TextTestFrame::OnUpdateUIPasswordCheckbox)
|
EVT_UPDATE_UI(TextTest_Password, TextTestFrame::OnUpdateUIPasswordCheckbox)
|
||||||
|
EVT_UPDATE_UI(TextTest_HScroll, TextTestFrame::OnUpdateUIHScrollCheckbox)
|
||||||
|
|
||||||
EVT_UPDATE_UI(TextTest_Reset, TextTestFrame::OnUpdateUIResetButton)
|
EVT_UPDATE_UI(TextTest_Reset, TextTestFrame::OnUpdateUIResetButton)
|
||||||
|
|
||||||
@@ -310,6 +308,7 @@ TextTestFrame::TextTestFrame(const wxString& title)
|
|||||||
m_radioTextLines = (wxRadioBox *)NULL;
|
m_radioTextLines = (wxRadioBox *)NULL;
|
||||||
|
|
||||||
m_chkPassword =
|
m_chkPassword =
|
||||||
|
m_chkHScroll =
|
||||||
m_chkReadonly = (wxCheckBox *)NULL;
|
m_chkReadonly = (wxCheckBox *)NULL;
|
||||||
|
|
||||||
m_text =
|
m_text =
|
||||||
@@ -353,6 +352,7 @@ TextTestFrame::TextTestFrame(const wxString& title)
|
|||||||
1, wxRA_SPECIFY_COLS);
|
1, wxRA_SPECIFY_COLS);
|
||||||
|
|
||||||
m_chkPassword = new wxCheckBox(m_panel, TextTest_Password, _T("&Password control"));
|
m_chkPassword = new wxCheckBox(m_panel, TextTest_Password, _T("&Password control"));
|
||||||
|
m_chkHScroll = new wxCheckBox(m_panel, TextTest_HScroll, _T("&Horz scrollbar"));
|
||||||
m_chkReadonly = new wxCheckBox(m_panel, -1, _T("&Read-only mode"));
|
m_chkReadonly = new wxCheckBox(m_panel, -1, _T("&Read-only mode"));
|
||||||
|
|
||||||
sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL);
|
sizerLeft = new wxStaticBoxSizer(box, wxVERTICAL);
|
||||||
@@ -360,6 +360,7 @@ TextTestFrame::TextTestFrame(const wxString& title)
|
|||||||
sizerLeft->Add(m_radioTextLines, 0, wxGROW | wxALL, 5);
|
sizerLeft->Add(m_radioTextLines, 0, wxGROW | wxALL, 5);
|
||||||
sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer
|
sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer
|
||||||
sizerLeft->Add(m_chkPassword, 0, wxLEFT | wxRIGHT, 5);
|
sizerLeft->Add(m_chkPassword, 0, wxLEFT | wxRIGHT, 5);
|
||||||
|
sizerLeft->Add(m_chkHScroll, 0, wxLEFT | wxRIGHT, 5);
|
||||||
sizerLeft->Add(m_chkReadonly, 0, wxLEFT | wxRIGHT, 5);
|
sizerLeft->Add(m_chkReadonly, 0, wxLEFT | wxRIGHT, 5);
|
||||||
|
|
||||||
wxButton *btn = new wxButton(m_panel, TextTest_Reset, _T("&Reset"));
|
wxButton *btn = new wxButton(m_panel, TextTest_Reset, _T("&Reset"));
|
||||||
@@ -552,6 +553,7 @@ void TextTestFrame::Reset()
|
|||||||
{
|
{
|
||||||
m_radioTextLines->SetSelection(TextLines_Single);
|
m_radioTextLines->SetSelection(TextLines_Single);
|
||||||
m_chkPassword->SetValue(FALSE);
|
m_chkPassword->SetValue(FALSE);
|
||||||
|
m_chkHScroll->SetValue(TRUE);
|
||||||
m_chkReadonly->SetValue(FALSE);
|
m_chkReadonly->SetValue(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -576,6 +578,8 @@ void TextTestFrame::CreateText()
|
|||||||
flags |= wxTE_PASSWORD;
|
flags |= wxTE_PASSWORD;
|
||||||
if ( m_chkReadonly->GetValue() )
|
if ( m_chkReadonly->GetValue() )
|
||||||
flags |= wxTE_READONLY;
|
flags |= wxTE_READONLY;
|
||||||
|
if ( m_chkHScroll->GetValue() )
|
||||||
|
flags |= wxHSCROLL;
|
||||||
|
|
||||||
wxString valueOld;
|
wxString valueOld;
|
||||||
if ( m_text )
|
if ( m_text )
|
||||||
@@ -776,17 +780,23 @@ void TextTestFrame::OnUpdateUIClearButton(wxUpdateUIEvent& event)
|
|||||||
event.Enable(!m_text->GetValue().empty());
|
event.Enable(!m_text->GetValue().empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TextTestFrame::OnUpdateUIHScrollCheckbox(wxUpdateUIEvent& event)
|
||||||
|
{
|
||||||
|
event.Enable( !IsSingleLine() );
|
||||||
|
}
|
||||||
|
|
||||||
void TextTestFrame::OnUpdateUIPasswordCheckbox(wxUpdateUIEvent& event)
|
void TextTestFrame::OnUpdateUIPasswordCheckbox(wxUpdateUIEvent& event)
|
||||||
{
|
{
|
||||||
// can't put multiline control in password mode
|
// can't put multiline control in password mode
|
||||||
event.Enable( m_radioTextLines->GetSelection() == TextLines_Single );
|
event.Enable( IsSingleLine() );
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextTestFrame::OnUpdateUIResetButton(wxUpdateUIEvent& event)
|
void TextTestFrame::OnUpdateUIResetButton(wxUpdateUIEvent& event)
|
||||||
{
|
{
|
||||||
event.Enable( (m_radioTextLines->GetSelection() != TextLines_Single) ||
|
event.Enable( (m_radioTextLines->GetSelection() != TextLines_Single) ||
|
||||||
m_chkReadonly->GetValue() ||
|
m_chkReadonly->GetValue() ||
|
||||||
m_chkPassword->GetValue() );
|
m_chkPassword->GetValue() ||
|
||||||
|
!m_chkHScroll->GetValue() );
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextTestFrame::OnText(wxCommandEvent& event)
|
void TextTestFrame::OnText(wxCommandEvent& event)
|
||||||
|
@@ -277,6 +277,20 @@ bool wxTextCtrl::Create(wxWindow *parent,
|
|||||||
const wxValidator& validator,
|
const wxValidator& validator,
|
||||||
const wxString &name)
|
const wxString &name)
|
||||||
{
|
{
|
||||||
|
if ( style & wxTE_MULTILINE )
|
||||||
|
{
|
||||||
|
// for compatibility with wxMSW we create the controls with vertical
|
||||||
|
// scrollbar always shown unless they have wxTE_RICH style (because
|
||||||
|
// Windows text controls always has vert scrollbar but richedit one
|
||||||
|
// doesn't)
|
||||||
|
if ( !(style & wxTE_RICH) )
|
||||||
|
{
|
||||||
|
style |= wxALWAYS_SHOW_SB;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: support wxTE_NO_VSCROLL (?)
|
||||||
|
}
|
||||||
|
|
||||||
if ( !wxControl::Create(parent, id, pos, size, style,
|
if ( !wxControl::Create(parent, id, pos, size, style,
|
||||||
validator, name) )
|
validator, name) )
|
||||||
{
|
{
|
||||||
@@ -294,16 +308,6 @@ bool wxTextCtrl::Create(wxWindow *parent,
|
|||||||
// support it anyhow
|
// support it anyhow
|
||||||
wxASSERT_MSG( !(style & wxTE_PASSWORD),
|
wxASSERT_MSG( !(style & wxTE_PASSWORD),
|
||||||
_T("wxTE_PASSWORD can't be used with multiline ctrls") );
|
_T("wxTE_PASSWORD can't be used with multiline ctrls") );
|
||||||
|
|
||||||
// create vertical scrollbar if necessary (on by default)
|
|
||||||
if ( !(style & wxTE_NO_VSCROLL) )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// and the horizontal one
|
|
||||||
if ( style & wxHSCROLL )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SetValue(value);
|
SetValue(value);
|
||||||
@@ -2627,8 +2631,8 @@ void wxTextCtrl::DoDraw(wxControlRenderer *renderer)
|
|||||||
dc.SetTextForeground(GetForegroundColour());
|
dc.SetTextForeground(GetForegroundColour());
|
||||||
|
|
||||||
// get the intersection of the update region with the text area: note that
|
// get the intersection of the update region with the text area: note that
|
||||||
// the update region is in window coord and text area is in the client
|
// the update region is in window coords and text area is in the client
|
||||||
// ones, so it must be shifted before computing intesection
|
// ones, so it must be shifted before computing intersection
|
||||||
wxRegion rgnUpdate = GetUpdateRegion();
|
wxRegion rgnUpdate = GetUpdateRegion();
|
||||||
wxRect rectTextArea = GetRealTextArea();
|
wxRect rectTextArea = GetRealTextArea();
|
||||||
wxPoint pt = GetClientAreaOrigin();
|
wxPoint pt = GetClientAreaOrigin();
|
||||||
@@ -2652,16 +2656,21 @@ void wxTextCtrl::DoDraw(wxControlRenderer *renderer)
|
|||||||
for ( ; iter.HaveRects(); iter++ )
|
for ( ; iter.HaveRects(); iter++ )
|
||||||
{
|
{
|
||||||
wxRect r = iter.GetRect();
|
wxRect r = iter.GetRect();
|
||||||
|
|
||||||
|
// this is a workaround for wxGTK::wxRegion bug
|
||||||
|
#ifdef __WXGTK__
|
||||||
if ( !r.width || !r.height )
|
if ( !r.width || !r.height )
|
||||||
{
|
{
|
||||||
// this happens under wxGTK
|
// ignore invalid rect
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
#endif // __WXGTK__
|
||||||
|
|
||||||
DoDrawTextInRect(dc, r);
|
DoDrawTextInRect(dc, r);
|
||||||
}
|
}
|
||||||
|
|
||||||
// show caret first time only
|
// show caret first time only: we must show it after drawing the text or
|
||||||
|
// the display can be corrupted when it's hidden
|
||||||
if ( !m_hasCaret && GetCaret() )
|
if ( !m_hasCaret && GetCaret() )
|
||||||
{
|
{
|
||||||
GetCaret()->Show();
|
GetCaret()->Show();
|
||||||
|
Reference in New Issue
Block a user