diff options
| author | nyamatongwe <devnull@localhost> | 2001-09-01 03:01:09 +0000 |
|---|---|---|
| committer | nyamatongwe <devnull@localhost> | 2001-09-01 03:01:09 +0000 |
| commit | 310e00f780d3fbf65a69405404849e140ff20739 (patch) | |
| tree | a90dfa88218a698f1a689abd2caa2e0b54772405 /gtk | |
| parent | 669deeb6407f674b4017f2f7393e3ccce1b3a58a (diff) | |
| download | scintilla-mirror-310e00f780d3fbf65a69405404849e140ff20739.tar.gz | |
Using new SelectionText type to handle text that is the subject of copy,
cut, paste and drag operations.
Mouse wheel scrolling moved into platform subclasses.
Macro support always included so MACRO_SUPPORT definition and use removed.
Allowing menu popup moved from Editor to ScintillaBase.
Diffstat (limited to 'gtk')
| -rw-r--r-- | gtk/ScintillaGTK.cxx | 127 |
1 files changed, 58 insertions, 69 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(); |
