const wxChar* wxSTCNameStr = "stcwindow";
+
+DEFINE_EVENT_TYPE( wxEVT_STC_CHANGE )
+DEFINE_EVENT_TYPE( wxEVT_STC_STYLENEEDED )
+DEFINE_EVENT_TYPE( wxEVT_STC_CHARADDED )
+DEFINE_EVENT_TYPE( wxEVT_STC_UPDATEUI )
+DEFINE_EVENT_TYPE( wxEVT_STC_SAVEPOINTREACHED )
+DEFINE_EVENT_TYPE( wxEVT_STC_SAVEPOINTLEFT )
+DEFINE_EVENT_TYPE( wxEVT_STC_ROMODIFYATTEMPT )
+DEFINE_EVENT_TYPE( wxEVT_STC_DOUBLECLICK )
+DEFINE_EVENT_TYPE( wxEVT_STC_MODIFIED )
+DEFINE_EVENT_TYPE( wxEVT_STC_KEY )
+DEFINE_EVENT_TYPE( wxEVT_STC_MACRORECORD )
+DEFINE_EVENT_TYPE( wxEVT_STC_MARGINCLICK )
+DEFINE_EVENT_TYPE( wxEVT_STC_NEEDSHOWN )
+DEFINE_EVENT_TYPE( wxEVT_STC_POSCHANGED )
+
+
BEGIN_EVENT_TABLE(wxStyledTextCtrl, wxControl)
EVT_PAINT (wxStyledTextCtrl::OnPaint)
EVT_SCROLLWIN (wxStyledTextCtrl::OnScrollWin)
EVT_SIZE (wxStyledTextCtrl::OnSize)
EVT_LEFT_DOWN (wxStyledTextCtrl::OnMouseLeftDown)
+#ifdef __WXMSW__
+ // Let Scintilla see the double click as a second click
+ EVT_LEFT_DCLICK (wxStyledTextCtrl::OnMouseLeftDown)
+#endif
EVT_MOTION (wxStyledTextCtrl::OnMouseMove)
EVT_LEFT_UP (wxStyledTextCtrl::OnMouseLeftUp)
EVT_RIGHT_UP (wxStyledTextCtrl::OnMouseRightUp)
+ EVT_MOUSEWHEEL (wxStyledTextCtrl::OnMouseWheel)
EVT_CHAR (wxStyledTextCtrl::OnChar)
EVT_KEY_DOWN (wxStyledTextCtrl::OnKeyDown)
EVT_KILL_FOCUS (wxStyledTextCtrl::OnLoseFocus)
wxString wxStyledTextCtrl::GetStyledText(int startPos, int endPos) {
wxString text;
int len = endPos - startPos;
+ if (!len) return "";
TextRange tr;
- tr.lpstrText = text.GetWriteBuf(len*2+1);
+ tr.lpstrText = text.GetWriteBuf(len*2);
tr.chrg.cpMin = startPos;
tr.chrg.cpMax = endPos;
SendMsg(2015, 0, (long)&tr);
wxString wxStyledTextCtrl::GetCurLine(int* linePos) {
wxString text;
int len = LineLength(GetCurrentLine());
- char* buf = text.GetWriteBuf(len+1);
+ if (!len) return "";
+ char* buf = text.GetWriteBuf(len);
int pos = SendMsg(2027, len, (long)buf);
- text.UngetWriteBuf();
+ text.UngetWriteBuf(len);
if (linePos) *linePos = pos;
return text;
wxString wxStyledTextCtrl::GetLine(int line) {
wxString text;
int len = LineLength(line);
- char* buf = text.GetWriteBuf(len+1);
+ if (!len) return "";
+ char* buf = text.GetWriteBuf(len);
int pos = SendMsg(2153, line, (long)buf);
- text.UngetWriteBuf();
+ text.UngetWriteBuf(len);
return text;
}
GetSelection(&start, &end);
int len = end - start;
- char* buff = text.GetWriteBuf(len+1);
+ if (!len) return "";
+ char* buff = text.GetWriteBuf(len);
SendMsg(2161, 0, (long)buff);
- text.UngetWriteBuf();
+ text.UngetWriteBuf(len);
return text;
}
wxString wxStyledTextCtrl::GetTextRange(int startPos, int endPos) {
wxString text;
int len = endPos - startPos;
- char* buff = text.GetWriteBuf(len+1);
+ if (!len) return "";
+ char* buff = text.GetWriteBuf(len);
TextRange tr;
tr.lpstrText = buff;
tr.chrg.cpMin = startPos;
tr.chrg.cpMax = endPos;
SendMsg(2162, 0, (long)&tr);
- text.UngetWriteBuf();
+ text.UngetWriteBuf(len);
return text;
}
// Retrieve all the text in the document.
wxString wxStyledTextCtrl::GetText() {
wxString text;
- int len = GetTextLength();
- char* buff = text.GetWriteBuf(len+1);
+ int len = GetTextLength()+1;
+ char* buff = text.GetWriteBuf(len);
SendMsg(2182, len, (long)buff);
- buff[len] = 0;
- text.UngetWriteBuf();
+ text.UngetWriteBuf(len-1);
return text;
}
return wxPoint(x, y);
}
-
// Scroll enough to make the given line visible
void wxStyledTextCtrl::ScrollToLine(int line) {
m_swx->DoScrollToLine(line);
}
+
//----------------------------------------------------------------------
// Event handlers
}
+void wxStyledTextCtrl::OnMouseWheel(wxMouseEvent& evt) {
+ m_swx->DoMouseWheel(evt.GetWheelRotation(),
+ evt.GetWheelDelta(),
+ evt.GetLinesPerAction());
+}
+
+
void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) {
long key = evt.KeyCode();
- switch (key) {
- // Special handling for charcters that must be typed with AltGr down on
- // foreign keyboards. (Comes to us as Ctrl+Alt, and so would get
- // filtered out by the default case below.)
- //
- // There should be a better way to do this...
- //
- case '\\':
- case '|':
- case '@':
- case '#':
- case '¬':
- case '[':
- case ']':
- case '{':
- case '}':
- case '?':
- m_swx->DoAddChar(key);
- break;
-
- default:
- if ((key > WXK_ESCAPE) && (key != WXK_DELETE) && (key < 255) &&
- !evt.ControlDown() && !evt.AltDown()) {
-
- m_swx->DoAddChar(key);
- }
- else {
- evt.Skip();
- }
+ if ((key > WXK_ESCAPE) &&
+ (key != WXK_DELETE) && (key < 255) &&
+ !evt.ControlDown() && !evt.AltDown()) {
+
+ m_swx->DoAddChar(key);
+ }
+ else {
+ evt.Skip();
}
}
evt.Skip();
}
-
void wxStyledTextCtrl::OnLoseFocus(wxFocusEvent& evt) {
m_swx->DoLoseFocus();
}