diff options
-rw-r--r-- | gtk/ScintillaGTK.cxx | 127 | ||||
-rw-r--r-- | include/Scintilla.h | 13 | ||||
-rw-r--r-- | src/Editor.cxx | 117 | ||||
-rw-r--r-- | src/Editor.h | 40 | ||||
-rw-r--r-- | src/ScintillaBase.cxx | 5 | ||||
-rw-r--r-- | src/ScintillaBase.h | 1 | ||||
-rw-r--r-- | win32/ScintillaWin.cxx | 31 |
7 files changed, 138 insertions, 196 deletions
diff --git a/gtk/ScintillaGTK.cxx b/gtk/ScintillaGTK.cxx index 254648080..271fddf88 100644 --- a/gtk/ScintillaGTK.cxx +++ b/gtk/ScintillaGTK.cxx @@ -52,12 +52,15 @@ class ScintillaGTK : public ScintillaBase { GtkObject *adjustmenth; int scrollBarWidth; int scrollBarHeight; - char *pasteBuffer; - bool pasteBufferIsRectangular; + + // Because clipboard access is asynchronous, copyText is created by Copy + SelectionText copyText; + + SelectionText primary; + GdkEventButton evbtn; bool capturedMouse; bool dragWasDropped; - char *primarySelectionCopy; GtkWidgetClass *parentClass; @@ -72,6 +75,7 @@ class ScintillaGTK : public ScintillaBase { GdkICAttr *ic_attr; // Wheel mouse support + unsigned int linesPerScroll; GTimeVal lastWheelMouseTime; gint lastWheelMouseDirection; gint wheelMouseIntensity; @@ -118,7 +122,7 @@ private: virtual void ClaimSelection(); void ReceivedSelection(GtkSelectionData *selection_data); void ReceivedDrop(GtkSelectionData *selection_data); - void GetSelection(GtkSelectionData *selection_data, guint info, char *text, bool isRectangular); + void GetSelection(GtkSelectionData *selection_data, guint info, SelectionText *selected); void UnclaimSelection(GdkEventSelection *selection_event); void Resize(int width, int height); @@ -142,6 +146,7 @@ private: static void ScrollSignal(GtkAdjustment *adj, ScintillaGTK *sciThis); static void ScrollHSignal(GtkAdjustment *adj, ScintillaGTK *sciThis); + gint PressThis(GdkEventButton *event); static gint Press(GtkWidget *widget, GdkEventButton *event); static gint MouseRelease(GtkWidget *widget, GdkEventButton *event); #if PLAT_GTK_WIN32 @@ -201,9 +206,8 @@ static ScintillaGTK *ScintillaFromWidget(GtkWidget *widget) { ScintillaGTK::ScintillaGTK(_ScintillaObject *sci_) : adjustmentv(0), adjustmenth(0), scrollBarWidth(30), scrollBarHeight(30), - pasteBuffer(0), pasteBufferIsRectangular(false), capturedMouse(false), dragWasDropped(false), - primarySelectionCopy(0), parentClass(0), + parentClass(0), ic(NULL), ic_attr(NULL), lastWheelMouseDirection(0), wheelMouseIntensity(0) { sci = sci_; @@ -220,7 +224,7 @@ ScintillaGTK::ScintillaGTK(_ScintillaObject *sci_) : #ifndef SPI_GETWHEELSCROLLLINES #define SPI_GETWHEELSCROLLLINES 104 #endif - ::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &ucWheelScrollLines, 0); + ::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &linesPerScroll, 0); #else ucWheelScrollLines = 4; #endif @@ -231,7 +235,6 @@ ScintillaGTK::ScintillaGTK(_ScintillaObject *sci_) : } ScintillaGTK::~ScintillaGTK() { - delete []primarySelectionCopy; } void ScintillaGTK::RealizeThis(GtkWidget *widget) { @@ -457,9 +460,6 @@ void ScintillaGTK::Initialise() { parentClass = reinterpret_cast<GtkWidgetClass *>( gtk_type_class(gtk_container_get_type())); - pasteBuffer = 0; - pasteBufferIsRectangular = false; - GTK_WIDGET_SET_FLAGS(wMain.GetID(), GTK_CAN_FOCUS); GTK_WIDGET_SET_FLAGS(GTK_WIDGET(wMain.GetID()), GTK_SENSITIVE); gtk_widget_set_events(wMain.GetID(), @@ -764,9 +764,7 @@ int ScintillaGTK::KeyDefault(int key, int modifiers) { void ScintillaGTK::Copy() { if (currentPos != anchor) { - delete []pasteBuffer; - pasteBuffer = CopySelectionRange(); - pasteBufferIsRectangular = selType == selRectangle; + CopySelectionRange(©Text); gtk_selection_owner_set(GTK_WIDGET(wMain.GetID()), clipboard_atom, GDK_CURRENT_TIME); @@ -829,16 +827,14 @@ void ScintillaGTK::ClaimSelection() { primarySelection = true; gtk_selection_owner_set(GTK_WIDGET(wMain.GetID()), GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME); - delete []primarySelectionCopy; - primarySelectionCopy = NULL; + primary.Set(0, 0); } else if (OwnPrimarySelection()) { - if (primarySelectionCopy == NULL) - gtk_selection_owner_set(NULL, GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME); primarySelection = true; + if (primary.s == NULL) + gtk_selection_owner_set(NULL, GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME); } else { - delete []primarySelectionCopy; - primarySelectionCopy = NULL; primarySelection = false; + primary.Set(0, 0); } } @@ -927,30 +923,21 @@ void ScintillaGTK::ReceivedDrop(GtkSelectionData *selection_data) { Redraw(); } -// Preprocessor used to avoid warnings here -#if PLAT_GTK_WIN32 -void ScintillaGTK::GetSelection(GtkSelectionData *selection_data, guint info, char *text, bool) -#else -void ScintillaGTK::GetSelection(GtkSelectionData *selection_data, guint info, char *text, bool isRectangular) -#endif -{ - char *selBuffer = text; - char *tmpBuffer = NULL; // Buffer to be freed - +void ScintillaGTK::GetSelection(GtkSelectionData *selection_data, guint info, SelectionText *text) { if (selection_data->selection == GDK_SELECTION_PRIMARY) { - if (primarySelectionCopy != NULL) { - selBuffer = primarySelectionCopy; - } else { - tmpBuffer = CopySelectionRange(); - selBuffer = tmpBuffer; + if (primary.s == NULL) { + CopySelectionRange(&primary); } + text = &primary; } + char *selBuffer = text->s; + #if PLAT_GTK_WIN32 // win32gtk requires \n delimited lines and doesn't work right with // other line formats, so make a copy of the clip text now with // newlines converted - char *tmpstr = new char[strlen(selBuffer) + 1]; + char *tmpstr = new char[text->len + 1]; char *sptr = selBuffer; char *dptr = tmpstr; while (*sptr != '\0') { @@ -979,7 +966,7 @@ void ScintillaGTK::GetSelection(GtkSelectionData *selection_data, guint info, ch // The #if is here because on Windows cfColumnSelect clip entry is used // instead as standard indicator of rectangularness (so no need to kludge) #if PLAT_GTK_WIN32 == 0 - if (isRectangular) + if (text->rectangular) len++; #endif gtk_selection_data_set(selection_data, GDK_SELECTION_TYPE_STRING, @@ -997,7 +984,6 @@ void ScintillaGTK::GetSelection(GtkSelectionData *selection_data, guint info, ch gdk_free_compound_text(text); } - delete []tmpBuffer; #if PLAT_GTK_WIN32 delete []tmpstr; #endif @@ -1008,8 +994,7 @@ void ScintillaGTK::UnclaimSelection(GdkEventSelection *selection_event) { if (selection_event->selection == GDK_SELECTION_PRIMARY) { //Platform::DebugPrintf("UnclaimPrimarySelection\n"); if (!OwnPrimarySelection()) { - delete []primarySelectionCopy; - primarySelectionCopy = NULL; + primary.Set(0, 0); primarySelection = false; FullPaint(); } @@ -1053,20 +1038,17 @@ void ScintillaGTK::Resize(int width, int height) { SetScrollBars(); } -gint ScintillaGTK::Press(GtkWidget *widget, GdkEventButton *event) { - ScintillaGTK *sciThis = ScintillaFromWidget(widget); - //Platform::DebugPrintf("Press %x time=%d state = %x button = %x\n",sciThis,event->time, event->state, event->button); +gint ScintillaGTK::PressThis(GdkEventButton *event) { + //Platform::DebugPrintf("Press %x time=%d state = %x button = %x\n",this,event->time, event->state, event->button); // Do not use GTK+ double click events as Scintilla has its own double click detection if (event->type != GDK_BUTTON_PRESS) return FALSE; - sciThis->evbtn = *event; + evbtn = *event; Point pt; pt.x = int(event->x); pt.y = int(event->y); - if (event->window != widget->window) - return FALSE; - PRectangle rcClient = sciThis->GetClientRectangle(); + PRectangle rcClient = GetClientRectangle(); //Platform::DebugPrintf("Press %0d,%0d in %0d,%0d %0d,%0d\n", // pt.x, pt.y, rcClient.left, rcClient.top, rcClient.right, rcClient.bottom); if ((pt.x > rcClient.right) || (pt.y > rcClient.bottom)) { @@ -1076,54 +1058,61 @@ gint ScintillaGTK::Press(GtkWidget *widget, GdkEventButton *event) { bool ctrl = event->state & GDK_CONTROL_MASK; - gtk_widget_grab_focus(sciThis->wMain.GetID()); + gtk_widget_grab_focus(wMain.GetID()); if (event->button == 1) { - //sciThis->ButtonDown(pt, event->time, + //ButtonDown(pt, event->time, // event->state & GDK_SHIFT_MASK, // event->state & GDK_CONTROL_MASK, // event->state & GDK_MOD1_MASK); // Instead of sending literal modifiers use control instead of alt // This is because all the window managers seem to grab alt + click for moving - sciThis->ButtonDown(pt, event->time, + ButtonDown(pt, event->time, event->state & GDK_SHIFT_MASK, event->state & GDK_CONTROL_MASK, event->state & GDK_CONTROL_MASK); } else if (event->button == 2) { // Grab the primary selection if it exists - Position pos = sciThis->PositionFromLocation(pt); - if (sciThis->OwnPrimarySelection() && sciThis->primarySelectionCopy == NULL) - sciThis->primarySelectionCopy = sciThis->CopySelectionRange(); + Position pos = PositionFromLocation(pt); + if (OwnPrimarySelection() && primary.s == NULL) + CopySelectionRange(&primary); - sciThis->SetSelection(pos, pos); - gtk_selection_convert(GTK_WIDGET(sciThis->wMain.GetID()), GDK_SELECTION_PRIMARY, + SetSelection(pos, pos); + gtk_selection_convert(GTK_WIDGET(wMain.GetID()), GDK_SELECTION_PRIMARY, gdk_atom_intern("STRING", FALSE), event->time); - } else if (event->button == 3 && sciThis->displayPopupMenu) { + } else if (event->button == 3 && displayPopupMenu) { // PopUp menu // Convert to screen int ox = 0; int oy = 0; - gdk_window_get_origin(sciThis->wMain.GetID()->window, &ox, &oy); - sciThis->ContextMenu(Point(pt.x + ox, pt.y + oy)); + gdk_window_get_origin(wMain.GetID()->window, &ox, &oy); + ContextMenu(Point(pt.x + ox, pt.y + oy)); } else if (event->button == 4) { // Wheel scrolling up (only xwin gtk does it this way) if (ctrl) - gtk_adjustment_set_value(GTK_ADJUSTMENT(sciThis->adjustmenth), ( - (sciThis->xOffset) / 2 ) - 6); + gtk_adjustment_set_value(GTK_ADJUSTMENT(adjustmenth), ( + (xOffset) / 2 ) - 6); else - gtk_adjustment_set_value(GTK_ADJUSTMENT(sciThis->adjustmentv), - sciThis->topLine - 3); + gtk_adjustment_set_value(GTK_ADJUSTMENT(adjustmentv), + topLine - 3); } else if ( event->button == 5 ) { // Wheel scrolling down (only xwin gtk does it this way) if (ctrl) - gtk_adjustment_set_value(GTK_ADJUSTMENT(sciThis->adjustmenth), ( - (sciThis->xOffset) / 2 ) + 6); + gtk_adjustment_set_value(GTK_ADJUSTMENT(adjustmenth), ( + (xOffset) / 2 ) + 6); else - gtk_adjustment_set_value(GTK_ADJUSTMENT(sciThis->adjustmentv), - sciThis->topLine + 3); + gtk_adjustment_set_value(GTK_ADJUSTMENT(adjustmentv), + topLine + 3); } return FALSE; } +gint ScintillaGTK::Press(GtkWidget *widget, GdkEventButton *event) { + if (event->window != widget->window) + return FALSE; + ScintillaGTK *sciThis = ScintillaFromWidget(widget); + return sciThis->PressThis(event); +} + gint ScintillaGTK::MouseRelease(GtkWidget *widget, GdkEventButton *event) { ScintillaGTK *sciThis = ScintillaFromWidget(widget); //Platform::DebugPrintf("Release %x %d %d\n",sciThis,event->time,event->state); @@ -1170,7 +1159,7 @@ gint ScintillaGTK::ScrollEvent(GtkWidget *widget, sciThis->wheelMouseIntensity++; cLineScroll = sciThis->wheelMouseIntensity; } else { - cLineScroll = sciThis->ucWheelScrollLines; + cLineScroll = sciThis->linesPerScroll; if (cLineScroll == 0) cLineScroll = 4; sciThis->wheelMouseIntensity = cLineScroll; @@ -1420,7 +1409,7 @@ void ScintillaGTK::SelectionGet(GtkWidget *widget, GtkSelectionData *selection_data, guint info, guint) { ScintillaGTK *sciThis = ScintillaFromWidget(widget); //Platform::DebugPrintf("Selection get\n"); - sciThis->GetSelection(selection_data, info, sciThis->pasteBuffer, sciThis->pasteBufferIsRectangular); + sciThis->GetSelection(selection_data, info, &sciThis->copyText); } gint ScintillaGTK::SelectionClear(GtkWidget *widget, GdkEventSelection *selection_event) { @@ -1486,7 +1475,7 @@ void ScintillaGTK::DragDataGet(GtkWidget *widget, GdkDragContext *context, ScintillaGTK *sciThis = ScintillaFromWidget(widget); sciThis->dragWasDropped = true; if (sciThis->currentPos != sciThis->anchor) { - sciThis->GetSelection(selection_data, info, sciThis->dragChars, sciThis->dragIsRectangle); + sciThis->GetSelection(selection_data, info, &sciThis->drag); } if (context->action == GDK_ACTION_MOVE) { int selStart = sciThis->SelectionStart(); diff --git a/include/Scintilla.h b/include/Scintilla.h index 0185d3e5b..285f81a96 100644 --- a/include/Scintilla.h +++ b/include/Scintilla.h @@ -11,9 +11,6 @@ #ifndef SCINTILLA_H #define SCINTILLA_H -// Compile-time configuration options -#define MACRO_SUPPORT 1 // Comment out to remove macro hooks - #if PLAT_WIN #ifdef STATIC_BUILD void Scintilla_RegisterClasses(HINSTANCE hInstance); @@ -507,12 +504,6 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, #define SCN_DWELLEND 2017 //--Autogenerated -- end of section automatically generated from Scintilla.iface -// Optional module for macro recording -#ifdef MACRO_SUPPORT -typedef void (tMacroRecorder)(unsigned int iMessage, unsigned long wParam, - long lParam, void *userData); -#endif - // These structures are defined to be exactly the same shape as the Win32 // CHARRANGE, TEXTRANGE, FINDTEXTEX, FORMATRANGE, and NMHDR structs. // So older code that treats Scintilla as a RichEdit will work. @@ -566,11 +557,9 @@ struct SCNotification { const char *text; // SCN_MODIFIED int length; // SCN_MODIFIED int linesAdded; // SCN_MODIFIED -#ifdef MACRO_SUPPORT int message; // SCN_MACRORECORD uptr_t wParam; // SCN_MACRORECORD - sptr_t lParam; // SCN_MACRORECORD -#endif + sptr_t lParam; // SCN_MACRORECORD int line; // SCN_MODIFIED int foldLevelNow; // SCN_MODIFIED int foldLevelPrev; // SCN_MODIFIED diff --git a/src/Editor.cxx b/src/Editor.cxx index 346d1e1fd..73114f103 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -58,7 +58,6 @@ Editor::Editor() { dwelling = false; ptMouseLast.x = 0; ptMouseLast.y = 0; - firstExpose = true; inDragDrop = false; dropWentOutside = false; posDrag = invalidPosition; @@ -69,9 +68,6 @@ Editor::Editor() { lineAnchor = 0; originalAnchorPos = 0; - dragChars = 0; - lenDrag = 0; - dragIsRectangle = false; selType = selStream; xStartSelect = 0; xEndSelect = 0; @@ -111,15 +107,11 @@ Editor::Editor() { modEventMask = SC_MODEVENTMASKALL; - displayPopupMenu = true; - pdoc = new Document(); pdoc ->AddRef(); pdoc->AddWatcher(this, 0); -#ifdef MACRO_SUPPORT - recordingMacro = 0; -#endif + recordingMacro = false; foldFlags = 0; } @@ -128,10 +120,6 @@ Editor::~Editor() { pdoc->Release(); pdoc = 0; DropGraphics(); - - delete []dragChars; - dragChars = 0; - lenDrag = 0; } void Editor::Finalise() { @@ -1914,14 +1902,12 @@ void Editor::NotifyChar(int ch) { scn.nmhdr.code = SCN_CHARADDED; scn.ch = ch; NotifyParent(scn); -#ifdef MACRO_SUPPORT if (recordingMacro) { char txt[2]; txt[0] = static_cast<char>(ch); txt[1] = '\0'; NotifyMacroRecord(SCI_REPLACESEL, 0, reinterpret_cast<long>(txt)); } -#endif } void Editor::NotifySavePoint(bool isSavePoint) { @@ -2147,7 +2133,6 @@ void Editor::NotifyDeleted(Document *, void *) { /* Do nothing */ } -#ifdef MACRO_SUPPORT void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long lParam) { // Enumerates all macroable messages @@ -2233,7 +2218,6 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long scn.lParam = lParam; NotifyParent(scn); } -#endif // Force scroll and keep position relative to top of window void Editor::PageMove(int direction, bool extend) { @@ -2797,33 +2781,23 @@ char *Editor::CopyRange(int start, int end) { return text; } -int Editor::SelectionRangeLength() { +void Editor::CopySelectionRange(SelectionText *ss) { + char *text = 0; + int size = 0; if (selType == selRectangle) { int lineStart = pdoc->LineFromPosition(SelectionStart()); int lineEnd = pdoc->LineFromPosition(SelectionEnd()); - int totalSize = 0; - for (int line = lineStart; line <= lineEnd; line++) { - totalSize += SelectionEnd(line) - SelectionStart(line) + 1; + int line; + for (line = lineStart; line <= lineEnd; line++) { + size += SelectionEnd(line) - SelectionStart(line) + 1; if (pdoc->eolMode == SC_EOL_CRLF) - totalSize++; + size++; } - return totalSize; - } else { - return SelectionEnd() - SelectionStart(); - } -} - -char *Editor::CopySelectionRange() { - if (selType == selRectangle) { - char *text = 0; - int lineStart = pdoc->LineFromPosition(SelectionStart()); - int lineEnd = pdoc->LineFromPosition(SelectionEnd()); - int totalSize = SelectionRangeLength(); - if (totalSize > 0) { - text = new char[totalSize + 1]; + if (size > 0) { + text = new char[size + 1]; if (text) { int j = 0; - for (int line = lineStart; line <= lineEnd; line++) { + for (line = lineStart; line <= lineEnd; line++) { for (int i = SelectionStart(line);i < SelectionEnd(line);i++) { text[j++] = pdoc->CharAt(i); } @@ -2832,24 +2806,14 @@ char *Editor::CopySelectionRange() { if (pdoc->eolMode != SC_EOL_CR) text[j++] = '\n'; } - text[totalSize] = '\0'; + text[size] = '\0'; } } - return text; } else { - return CopyRange(SelectionStart(), SelectionEnd()); - } -} - -void Editor::CopySelectionIntoDrag() { - delete []dragChars; - dragChars = 0; - lenDrag = SelectionRangeLength(); - dragChars = CopySelectionRange(); - dragIsRectangle = selType == selRectangle; - if (!dragChars) { - lenDrag = 0; + size = SelectionEnd() - SelectionStart(); + text = CopyRange(SelectionStart(), SelectionEnd()); } + ss->Set(text, size, selType == selRectangle); } void Editor::SetDragPosition(int newPos) { @@ -2879,8 +2843,6 @@ void Editor::StartDrag() { //DisplayCursor(Window::cursorArrow); } - - void Editor::DropAt(int position, const char *value, bool moving, bool rectangular) { //Platform::DebugPrintf("DropAt %d\n", inDragDrop); if (inDragDrop) @@ -3112,7 +3074,7 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b if (inDragDrop) { SetMouseCapture(false); SetDragPosition(newPos); - CopySelectionIntoDrag(); + CopySelectionRange(&drag); StartDrag(); } else { xStartSelect = pt.x - vs.fixedColumnWidth + xOffset; @@ -3217,25 +3179,23 @@ void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) { int selStart = SelectionStart(); int selEnd = SelectionEnd(); if (selStart < selEnd) { - if (dragChars && lenDrag) { + if (drag.len) { if (ctrl) { - pdoc->InsertString(newPos, dragChars, lenDrag); - SetSelection(newPos, newPos + lenDrag); + pdoc->InsertString(newPos, drag.s, drag.len); + SetSelection(newPos, newPos + drag.len); } else if (newPos < selStart) { - pdoc->DeleteChars(selStart, lenDrag); - pdoc->InsertString(newPos, dragChars, lenDrag); - SetSelection(newPos, newPos + lenDrag); + pdoc->DeleteChars(selStart, drag.len); + pdoc->InsertString(newPos, drag.s, drag.len); + SetSelection(newPos, newPos + drag.len); } else if (newPos > selEnd) { - pdoc->DeleteChars(selStart, lenDrag); - newPos -= lenDrag; - pdoc->InsertString(newPos, dragChars, lenDrag); - SetSelection(newPos, newPos + lenDrag); + pdoc->DeleteChars(selStart, drag.len); + newPos -= drag.len; + pdoc->InsertString(newPos, drag.s, drag.len); + SetSelection(newPos, newPos + drag.len); } else { SetEmptySelection(newPos); } - delete []dragChars; - dragChars = 0; - lenDrag = 0; + drag.Set(0, 0); } selectionType = selChar; } @@ -3542,10 +3502,8 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { //Platform::DebugPrintf("S start wnd proc %d %d %d\n",iMessage, wParam, lParam); // Optional macro recording hook -#ifdef MACRO_SUPPORT if (recordingMacro) NotifyMacroRecord(iMessage, wParam, lParam); -#endif switch (iMessage) { @@ -3777,15 +3735,14 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_GETSELTEXT: { if (lParam == 0) return 0; + SelectionText selectedText; + CopySelectionRange(&selectedText); char *ptr = reinterpret_cast<char *>(lParam); - int selSize = SelectionRangeLength(); - char *text = CopySelectionRange(); int iChar = 0; - if (text) { - for (; iChar < selSize; iChar++) - ptr[iChar] = text[iChar]; + if (selectedText.len) { + for (; iChar < selectedText.len; iChar++) + ptr[iChar] = selectedText.s[iChar]; ptr[iChar] = '\0'; - delete []text; } else { ptr[0] = '\0'; } @@ -4664,10 +4621,6 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_LINESONSCREEN: return LinesOnScreen(); - case SCI_USEPOPUP: - displayPopupMenu = wParam; - break; - case SCI_SETSELFORE: vs.selforeset = wParam; vs.selforeground.desired = Colour(lParam); @@ -4912,15 +4865,13 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_GETCURSOR: return cursorMode; -#ifdef MACRO_SUPPORT case SCI_STARTRECORD: - recordingMacro = 1; + recordingMacro = true; return 0; case SCI_STOPRECORD: - recordingMacro = 0; + recordingMacro = false; return 0; -#endif case SCI_MOVECARETINSIDEVIEW: MoveCaretInsideView(); diff --git a/src/Editor.h b/src/Editor.h index 1c1a13660..658161088 100644 --- a/src/Editor.h +++ b/src/Editor.h @@ -50,6 +50,26 @@ public: int positions[maxLineLength+1]; }; +class SelectionText { +public: + char *s; + int len; + bool rectangular; + SelectionText() : s(0), len(0), rectangular(false) {} + ~SelectionText() { + Set(0, 0); + } + void Set(char *s_, int len_, bool rectangular_=false) { + delete []s; + s = s_; + if (s) + len = len_; + else + len = 0; + rectangular = rectangular_; + } +}; + /** */ class Editor : public DocWatcher { @@ -68,6 +88,7 @@ protected: // ScintillaBase subclass needs access to much of Editor bool stylesValid; ViewStyle vs; Palette palette; + int printMagnification; int printColourMode; int cursorMode; @@ -106,7 +127,6 @@ protected: // ScintillaBase subclass needs access to much of Editor bool dwelling; enum { selChar, selWord, selLine } selectionType; Point ptMouseLast; - bool firstExpose; bool inDragDrop; bool dropWentOutside; int posDrag; @@ -135,9 +155,7 @@ protected: // ScintillaBase subclass needs access to much of Editor int modEventMask; - char *dragChars; - int lenDrag; - bool dragIsRectangle; + SelectionText drag; enum { selStream, selRectangle, selRectangleFixed } selType; int xStartSelect; int xEndSelect; @@ -151,11 +169,7 @@ protected: // ScintillaBase subclass needs access to much of Editor int searchAnchor; - int displayPopupMenu; - -#ifdef MACRO_SUPPORT - int recordingMacro; -#endif + bool recordingMacro; int foldFlags; ContractionState cs; @@ -267,11 +281,7 @@ protected: // ScintillaBase subclass needs access to much of Editor void NotifyModified(Document *document, DocModification mh, void *userData); void NotifyDeleted(Document *document, void *userData); void NotifyStyleNeeded(Document *doc, void *userData, int endPos); - - -#ifdef MACRO_SUPPORT void NotifyMacroRecord(unsigned int iMessage, unsigned long wParam, long lParam); -#endif void PageMove(int direction, bool extend=false); void ChangeCaseOfSelection(bool makeUpperCase); @@ -293,9 +303,7 @@ protected: // ScintillaBase subclass needs access to much of Editor void GoToLine(int lineNo); char *CopyRange(int start, int end); - int SelectionRangeLength(); - char *CopySelectionRange(); - void CopySelectionIntoDrag(); + void CopySelectionRange(SelectionText *ss); void SetDragPosition(int newPos); void DisplayCursor(Window::Cursor c); virtual void StartDrag(); diff --git a/src/ScintillaBase.cxx b/src/ScintillaBase.cxx index 707f59b9f..75a8ffffa 100644 --- a/src/ScintillaBase.cxx +++ b/src/ScintillaBase.cxx @@ -35,6 +35,7 @@ #include "ScintillaBase.h" ScintillaBase::ScintillaBase() { + displayPopupMenu = true; listType = 0; #ifdef SCI_LEXER lexLanguage = SCLEX_CONTAINER; @@ -514,6 +515,10 @@ sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lPara InvalidateStyleRedraw(); break; + case SCI_USEPOPUP: + displayPopupMenu = wParam; + break; + #ifdef SCI_LEXER case SCI_SETLEXER: SetLexer(wParam); diff --git a/src/ScintillaBase.h b/src/ScintillaBase.h index d5b1e8ba0..acf70e000 100644 --- a/src/ScintillaBase.h +++ b/src/ScintillaBase.h @@ -30,6 +30,7 @@ protected: idcmdSelectAll=16 }; + bool displayPopupMenu; Menu popup; AutoComplete ac; diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index de1e8fc34..a26dcb9fd 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -231,7 +231,7 @@ public: friend class DataObject; friend class DropTarget; bool DragIsRectangularOK(CLIPFORMAT fmt) { - return dragIsRectangle && (fmt == cfColumnSelect); + return drag.rectangular && (fmt == cfColumnSelect); } }; @@ -1320,34 +1320,33 @@ void ScintillaWin::GetIntelliMouseParameters() { } void ScintillaWin::CopySelTextToClipboard() { - int bytes = SelectionRangeLength(); - char *selChars = CopySelectionRange(); - if (!selChars) + SelectionText selectedText; + CopySelectionRange(&selectedText); + if (selectedText.len == 0) return; HGLOBAL hand = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, - bytes + 1); + selectedText.len + 1); if (hand) { char *ptr = static_cast<char *>(::GlobalLock(hand)); - memcpy(ptr, selChars, bytes); - ptr[bytes] = '\0'; + memcpy(ptr, selectedText.s, selectedText.len); + ptr[selectedText.len] = '\0'; ::GlobalUnlock(hand); } ::SetClipboardData(CF_TEXT, hand); if (IsUnicodeMode()) { - int uchars = UCS2Length(selChars, bytes); + int uchars = UCS2Length(selectedText.s, selectedText.len); HGLOBAL uhand = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, 2 * (uchars + 1)); if (uhand) { wchar_t *uptr = static_cast<wchar_t *>(::GlobalLock(uhand)); - UCS2FromUTF8(selChars, bytes, uptr, uchars); + UCS2FromUTF8(selectedText.s, selectedText.len, uptr, uchars); uptr[uchars] = 0; ::GlobalUnlock(uhand); } ::SetClipboardData(CF_UNICODETEXT, uhand); } - delete []selChars; } void ScintillaWin::ScrollMessage(WPARAM wParam) { @@ -1627,21 +1626,21 @@ STDMETHODIMP ScintillaWin::GetData(FORMATETC *pFEIn, STGMEDIUM *pSTM) { HGLOBAL hand; if (pFEIn->cfFormat == CF_UNICODETEXT) { - int uchars = UCS2Length(dragChars, lenDrag); + int uchars = UCS2Length(drag.s, drag.len); hand = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, 2 * (uchars + 1)); if (hand) { wchar_t *uptr = static_cast<wchar_t *>(::GlobalLock(hand)); - UCS2FromUTF8(dragChars, lenDrag, uptr, uchars); + UCS2FromUTF8(drag.s, drag.len, uptr, uchars); uptr[uchars] = 0; } } else { - hand = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, lenDrag + 1); + hand = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, drag.len + 1); if (hand) { char *ptr = static_cast<char *>(::GlobalLock(hand)); - for (int i = 0; i < lenDrag; i++) { - ptr[i] = dragChars[i]; + for (int i = 0; i < drag.len; i++) { + ptr[i] = drag.s[i]; } - ptr[lenDrag] = '\0'; + ptr[drag.len] = '\0'; } } ::GlobalUnlock(hand); |