extern LexerModule lmAVE;
extern LexerModule lmConf;
extern LexerModule lmCPP;
+ extern LexerModule lmNncrontab;
extern LexerModule lmEiffel;
extern LexerModule lmHTML;
extern LexerModule lmLISP;
&& &lmAVE
&& &lmConf
&& &lmCPP
+ && &lmNncrontab
&& &lmEiffel
&& &lmHTML
&& &lmLISP
{
m_swx = new ScintillaWX(this);
m_stopWatch.Start();
+ m_lastKeyDownConsumed = FALSE;
}
wxString wxStyledTextCtrl::GetCurLine(int* linePos) {
wxString text;
int len = LineLength(GetCurrentLine());
- if (!len) return "";
- char* buf = text.GetWriteBuf(len);
-
- int pos = SendMsg(2027, len, (long)buf);
+ if (!len) {
+ if (linePos) *linePos = 0;
+ return "";
+ }
+ // Need an extra byte because SCI_GETCURLINE writes a null to the string
+ char* buf = text.GetWriteBuf(len+1);
+
+ int pos = SendMsg(2027, len+1, (long)buf);
text.UngetWriteBuf(len);
if (linePos) *linePos = pos;
// Retrieve all the text in the document.
wxString wxStyledTextCtrl::GetText() {
wxString text;
- int len = GetTextLength()+1;
- char* buff = text.GetWriteBuf(len);
+ int len = GetTextLength();
+ char* buff = text.GetWriteBuf(len+1); // leave room for the null...
- SendMsg(2182, len, (long)buff);
- text.UngetWriteBuf(len-1);
+ SendMsg(2182, len+1, (long)buff);
+ text.UngetWriteBuf(len);
return text;
}
}
// Replace the target text with the argument text.
+// Text is counted so it can contain nulls.
// Returns the length of the replacement text.
int wxStyledTextCtrl::ReplaceTarget(const wxString& text) {
}
// Replace the target text with the argument text after \d processing.
+// Text is counted so it can contain nulls.
// Looks for \d where d is between 1 and 9 and replaces these with the strings
// matched in the last search operation which were surrounded by \( and \).
// Returns the length of the replacement text including any change
}
// Search for a counted string in the target and set the target to the found
-// range.
+// range. Text is counted so it can contain nulls.
// Returns length of range or -1 for failure in which case target is not moved.
int wxStyledTextCtrl::SearchInTarget(const wxString& text) {
}
// Change internal focus flag
-void wxStyledTextCtrl::SetFocus(bool focus) {
+void wxStyledTextCtrl::SetSTCFocus(bool focus) {
SendMsg(2380, focus, 0);
}
// Get internal focus flag
-bool wxStyledTextCtrl::GetFocus() {
+bool wxStyledTextCtrl::GetSTCFocus() {
return SendMsg(2381, 0, 0) != 0;
}
void wxStyledTextCtrl::OnChar(wxKeyEvent& evt) {
long key = evt.KeyCode();
- if ((key > WXK_ESCAPE) &&
- (key != WXK_DELETE) && (key < 255) &&
- !evt.ControlDown() && !evt.AltDown()) {
+// printf("OnChar key:%d consumed:%d ctrl:%d alt:%d\n",
+// key, m_lastKeyDownConsumed, evt.ControlDown(), evt.AltDown());
+
+ // AltGr keys???
+ // \|@#¬[]{}?£$~ ã,õ,Ã,Õ, ñ, Ñ
+
+ // On (some?) non-US keyboards the AltGr key is required to enter some
+ // common characters. It comes to us as both Alt and Ctrl down so we need
+ // to let the char through in that case, otherwise if only ctrl or only
+ // alt let's skip it.
+ bool ctrl = evt.ControlDown();
+ bool alt = evt.AltDown();
+ bool skip = (ctrl || alt && ! (ctrl && alt));
+
+ if (key <= 0xff && !iscntrl(key) && !m_lastKeyDownConsumed && !skip) {
m_swx->DoAddChar(key);
+ return;
}
- else {
- evt.Skip();
- }
+ evt.Skip();
}
+
void wxStyledTextCtrl::OnKeyDown(wxKeyEvent& evt) {
long key = evt.KeyCode();
- //key = toupper(key); //**** ????
- bool consumed = FALSE;
- int processed = m_swx->DoKeyDown(key,
- evt.ShiftDown(),
- evt.ControlDown(),
- evt.AltDown(),
- &consumed);
- if (!processed && !consumed)
+ bool shift = evt.ShiftDown(),
+ ctrl = evt.ControlDown(),
+ alt = evt.AltDown();
+
+ int processed = m_swx->DoKeyDown(key, shift, ctrl, alt, &m_lastKeyDownConsumed);
+
+// printf("key: %d shift: %d ctrl: %d alt: %d processed: %d consumed: %d\n",
+// key, shift, ctrl, alt, processed, m_lastKeyDownConsumed);
+
+ if (!processed && !m_lastKeyDownConsumed)
evt.Skip();
}
+
void wxStyledTextCtrl::OnLoseFocus(wxFocusEvent& evt) {
m_swx->DoLoseFocus();
}
+
void wxStyledTextCtrl::OnGainFocus(wxFocusEvent& evt) {
m_swx->DoGainFocus();
}
+
void wxStyledTextCtrl::OnSysColourChanged(wxSysColourChangedEvent& evt) {
m_swx->DoSysColourChange();
}
+
void wxStyledTextCtrl::OnEraseBackground(wxEraseEvent& evt) {
// do nothing to help avoid flashing
}