// declarations
// ============================================================================
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "textctrl.h"
#endif
// event tables and other macros
// ----------------------------------------------------------------------------
+#if wxUSE_EXTENDED_RTTI
+WX_DEFINE_FLAGS( wxTextCtrlStyle )
+
+WX_BEGIN_FLAGS( wxTextCtrlStyle )
+ // new style border flags, we put them first to
+ // use them for streaming out
+ WX_FLAGS_MEMBER(wxBORDER_SIMPLE)
+ WX_FLAGS_MEMBER(wxBORDER_SUNKEN)
+ WX_FLAGS_MEMBER(wxBORDER_DOUBLE)
+ WX_FLAGS_MEMBER(wxBORDER_RAISED)
+ WX_FLAGS_MEMBER(wxBORDER_STATIC)
+ WX_FLAGS_MEMBER(wxBORDER_NONE)
+
+ // old style border flags
+ WX_FLAGS_MEMBER(wxSIMPLE_BORDER)
+ WX_FLAGS_MEMBER(wxSUNKEN_BORDER)
+ WX_FLAGS_MEMBER(wxDOUBLE_BORDER)
+ WX_FLAGS_MEMBER(wxRAISED_BORDER)
+ WX_FLAGS_MEMBER(wxSTATIC_BORDER)
+ WX_FLAGS_MEMBER(wxNO_BORDER)
+
+ // standard window styles
+ WX_FLAGS_MEMBER(wxTAB_TRAVERSAL)
+ WX_FLAGS_MEMBER(wxCLIP_CHILDREN)
+ WX_FLAGS_MEMBER(wxTRANSPARENT_WINDOW)
+ WX_FLAGS_MEMBER(wxWANTS_CHARS)
+ WX_FLAGS_MEMBER(wxNO_FULL_REPAINT_ON_RESIZE)
+ WX_FLAGS_MEMBER(wxALWAYS_SHOW_SB )
+ WX_FLAGS_MEMBER(wxVSCROLL)
+ WX_FLAGS_MEMBER(wxHSCROLL)
+
+ WX_FLAGS_MEMBER(wxTE_PROCESS_ENTER)
+ WX_FLAGS_MEMBER(wxTE_PROCESS_TAB)
+ WX_FLAGS_MEMBER(wxTE_MULTILINE)
+ WX_FLAGS_MEMBER(wxTE_PASSWORD)
+ WX_FLAGS_MEMBER(wxTE_READONLY)
+ WX_FLAGS_MEMBER(wxHSCROLL)
+ WX_FLAGS_MEMBER(wxTE_RICH)
+ WX_FLAGS_MEMBER(wxTE_RICH2)
+ WX_FLAGS_MEMBER(wxTE_AUTO_URL)
+ WX_FLAGS_MEMBER(wxTE_NOHIDESEL)
+ WX_FLAGS_MEMBER(wxTE_LEFT)
+ WX_FLAGS_MEMBER(wxTE_CENTRE)
+ WX_FLAGS_MEMBER(wxTE_RIGHT)
+ WX_FLAGS_MEMBER(wxTE_DONTWRAP)
+ WX_FLAGS_MEMBER(wxTE_LINEWRAP)
+ WX_FLAGS_MEMBER(wxTE_WORDWRAP)
+
+WX_END_FLAGS( wxTextCtrlStyle )
+
+IMPLEMENT_DYNAMIC_CLASS_XTI(wxTextCtrl, wxControl,"wx/textctrl.h")
+
+WX_BEGIN_PROPERTIES_TABLE(wxTextCtrl)
+ WX_PROPERTY( Font , wxFont , SetFont , GetFont ,, 0 /*flags*/ , wxT("Helpstring") , wxT("group") )
+ WX_PROPERTY( Value , wxString , SetValue, GetValue, wxEmptyString , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
+ WX_PROPERTY_FLAGS( WindowStyle , wxTextCtrlStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style
+WX_END_PROPERTIES_TABLE()
+
+WX_BEGIN_HANDLERS_TABLE(wxTextCtrl)
+WX_END_HANDLERS_TABLE()
+
+WX_CONSTRUCTOR_6( wxTextCtrl , wxWindow* , Parent , wxWindowID , Id , wxString , Value , wxPoint , Position , wxSize , Size , long , WindowStyle)
+#else
IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl)
+#endif
+
BEGIN_EVENT_TABLE(wxTextCtrl, wxControl)
EVT_CHAR(wxTextCtrl::OnChar)
#ifdef __WIN16__
EVT_ERASE_BACKGROUND(wxTextCtrl::OnEraseBackground)
#endif
+
+ EVT_SET_FOCUS(wxTextCtrl::OnSetFocus)
END_EVENT_TABLE()
// ============================================================================
m_privateContextMenu = NULL;
m_suppressNextUpdate = FALSE;
+ m_isNativeCaretShown = true;
}
wxTextCtrl::~wxTextCtrl()
int len = GetWindowTextLength(GetHwnd());
if ( len > from )
{
- // alloc one extra WORD as needed by the control
- wxChar *p = str.GetWriteBuf(++len);
+ {
+ // alloc one extra WORD as needed by the control
+ wxStringBuffer tmp(str, ++len);
+ wxChar *p = tmp;
- TEXTRANGE textRange;
- textRange.chrg.cpMin = from;
- textRange.chrg.cpMax = to == -1 ? len : to;
- textRange.lpstrText = p;
+ TEXTRANGE textRange;
+ textRange.chrg.cpMin = from;
+ textRange.chrg.cpMax = to == -1 ? len : to;
+ textRange.lpstrText = p;
- (void)SendMessage(GetHwnd(), EM_GETTEXTRANGE, 0, (LPARAM)&textRange);
+ (void)SendMessage(GetHwnd(), EM_GETTEXTRANGE,
+ 0, (LPARAM)&textRange);
- if ( m_verRichEdit > 1 )
- {
- // RichEdit 2.0 uses just CR ('\r') for the newlines which is
- // neither Unix nor Windows style - convert it to something
- // reasonable
- for ( ; *p; p++ )
+ if ( m_verRichEdit > 1 )
{
- if ( *p == _T('\r') )
- *p = _T('\n');
+ // RichEdit 2.0 uses just CR ('\r') for the
+ // newlines which is neither Unix nor Windows
+ // style - convert it to something reasonable
+ for ( ; *p; p++ )
+ {
+ if ( *p == _T('\r') )
+ *p = _T('\n');
+ }
}
}
- str.UngetWriteBuf();
-
if ( m_verRichEdit == 1 )
{
// convert to the canonical form - see comment below
{
DoWriteText(value, FALSE /* not selection only */);
}
+ else // same text
+ {
+ // still send an event for consistency
+ SendUpdateEvent();
+ }
// we should reset the modified flag even if the value didn't really change
len += sizeof(WORD);
wxString str;
- wxChar *buf = str.GetWriteBuf(len);
-
- *(WORD *)buf = (WORD)len;
- len = (size_t)::SendMessage(GetHwnd(), EM_GETLINE, lineNo, (LPARAM)buf);
- buf[len] = 0;
+ {
+ wxStringBufferLength tmp(str, len);
+ wxChar *buf = tmp;
- str.UngetWriteBuf(len);
+ *(WORD *)buf = (WORD)len;
+ len = (size_t)::SendMessage(GetHwnd(), EM_GETLINE,
+ lineNo, (LPARAM)buf);
+ buf[len] = 0;
+ tmp.SetLength(len);
+ }
return str;
}
return ::SendMessage(GetHwnd(), EM_CANUNDO, 0, 0) != 0;
}
+// ----------------------------------------------------------------------------
+// caret handling (Windows only)
+// ----------------------------------------------------------------------------
+
+bool wxTextCtrl::ShowNativeCaret(bool show)
+{
+ if ( show != m_isNativeCaretShown )
+ {
+ if ( !(show ? ::ShowCaret(GetHwnd()) : ::HideCaret(GetHwnd())) )
+ {
+ // not an error, may simply indicate that it's not shown/hidden
+ // yet (i.e. it had been hidden/showh 2 times before)
+ return false;
+ }
+
+ m_isNativeCaretShown = show;
+ }
+
+ return true;
+}
+
// ----------------------------------------------------------------------------
// implemenation details
// ----------------------------------------------------------------------------
Redo();
}
-void wxTextCtrl::OnDelete(wxCommandEvent& event)
+void wxTextCtrl::OnDelete(wxCommandEvent& WXUNUSED(event))
{
long from, to;
GetSelection(& from, & to);
Remove(from, to);
}
-void wxTextCtrl::OnSelectAll(wxCommandEvent& event)
+void wxTextCtrl::OnSelectAll(wxCommandEvent& WXUNUSED(event))
{
SetSelection(-1, -1);
}
event.Skip();
}
+void wxTextCtrl::OnSetFocus(wxFocusEvent& WXUNUSED(event))
+{
+ // be sure the caret remains invisible if the user had hidden it
+ if ( !m_isNativeCaretShown )
+ {
+ ::HideCaret(GetHwnd());
+ }
+}
+
// the rest of the file only deals with the rich edit controls
#if wxUSE_RICHEDIT
}
return TRUE;
}
-
+
// not processed, leave it to the base class
return wxTextCtrlBase::MSWOnNotify(idCtrl, lParam, result);
}