Hi the attached patch fixes bug 7257

http://www.freepascal.org/mantis/view.php?id=7257

Regards

Andrew
Index: lcl/interfaces/gtk2/gtk2wsstdctrls.pp
===================================================================
--- lcl/interfaces/gtk2/gtk2wsstdctrls.pp   (revision 10195)
+++ lcl/interfaces/gtk2/gtk2wsstdctrls.pp   (working copy)
@@ -132,9 +132,13 @@
     class procedure SetCallbacks(const AGtkWidget: PGtkWidget; const AWidgetInfo: PWidgetInfo); virtual;
   public
     class function  CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; override;
+    class function  GetSelStart(const ACustomEdit: TCustomEdit): integer; override;
+    class function  GetSelLength(const ACustomEdit: TCustomEdit): integer; override;
     class function  GetStrings(const ACustomMemo: TCustomMemo): TStrings; override;
     class procedure SetColor(const AWinControl: TWinControl);override;
     class procedure SetFont(const AWinControl: TWinControl;const AFont : TFont);override;
+    class procedure SetSelStart(const ACustomEdit: TCustomEdit; NewStart: integer); override;
+    class procedure SetSelLength(const ACustomEdit: TCustomEdit; NewLength: integer); override;
   end;
 
   { TGtk2WSEdit }
Index: lcl/interfaces/gtk2/gtk2wscustommemo.inc
===================================================================
--- lcl/interfaces/gtk2/gtk2wscustommemo.inc    (revision 10195)
+++ lcl/interfaces/gtk2/gtk2wscustommemo.inc    (working copy)
@@ -169,5 +169,89 @@
   end;
 end;
 
+class procedure TGtk2WSCustomMemo.SetSelStart(const ACustomEdit: TCustomEdit;
+  NewStart: integer);
+var
+  TextView: PGtkTextView;
+  TextBuffer: PGtkTextBuffer;
+  TextIter: TGtkTextIter;
+begin
+  if not ACustomEdit.HandleAllocated then exit;
+  TextView := PGtkTextView(GetWidgetInfo(Pointer(ACustomEdit.Handle), False)^.CoreWidget);  if not ACustomEdit.HandleAllocated then exit;
+  TextBuffer := gtk_text_view_get_buffer(TextView);
+  gtk_text_buffer_get_iter_at_offset(TextBuffer, @TextIter, NewStart);
+  gtk_text_buffer_place_cursor(TextBuffer, @TextIter);
+end;
 
+class procedure TGtk2WSCustomMemo.SetSelLength(const ACustomEdit: TCustomEdit;
+  NewLength: integer);
+var
+  TextView: PGtkTextView;
+  TextBuffer: PGtkTextBuffer;
+  StartIter, EndIter: TGtkTextIter;
+  SelStart: Integer;
+begin
+  if not ACustomEdit.HandleAllocated then exit;
+  TextView := PGtkTextView(GetWidgetInfo(Pointer(ACustomEdit.Handle), False)^.CoreWidget);  if not ACustomEdit.HandleAllocated then exit;
+  TextBuffer := gtk_text_view_get_buffer(TextView);
+  SelStart := GetSelStart(ACustomEdit);
 
+  gtk_text_buffer_get_iter_at_offset(TextBuffer, @StartIter, SelStart);
+  gtk_text_buffer_get_iter_at_offset(TextBuffer, @StartIter, SelStart+NewLength);
+
+  // missing in the bindings!
+  //gtk_text_buffer_select_range(TextBuffer, @StartIter, @EndIter);
+  
+  // remove this line when gtk_text_buffer_select_range is available
+  gtk_text_buffer_move_mark(TextBuffer, gtk_text_buffer_get_insert(TextBuffer), @StartIter);
+end;
+
+class function TGtk2WSCustomMemo.GetSelStart(const ACustomEdit: TCustomEdit
+  ): integer;
+var
+  TextView: PGtkTextView;
+  TextBuffer: PGtkTextBuffer;
+  TextMark: PGtkTextMark;
+  TextIter: TGtkTextIter;
+  StartIter, EndIter: TGtkTextIter;
+  StartPos, EndPos: Integer;
+begin
+  Result := 0;
+  if not ACustomEdit.HandleAllocated then exit;
+  
+  TextView := PGtkTextView(GetWidgetInfo(Pointer(ACustomEdit.Handle), False)^.CoreWidget);  if not ACustomEdit.HandleAllocated then exit;
+  TextBuffer := gtk_text_view_get_buffer(TextView);
+  TextMark := gtk_text_buffer_get_insert(TextBuffer);
+  gtk_text_buffer_get_iter_at_mark(TextBuffer, @TextIter, TextMark);
+  
+  Result := gtk_text_iter_get_offset(@TextIter);
+  if GetSelLength(ACustomEdit) = 0 then Exit;
+  
+  if not gtk_text_buffer_get_selection_bounds(TextBuffer, @StartIter, @EndIter) then Exit;
+  
+  StartPos := gtk_text_iter_get_offset(@StartIter);
+  EndPos := gtk_text_iter_get_offset(@EndIter);
+  
+  Result := Min(StartPos, EndPos);
+end;
+
+class function TGtk2WSCustomMemo.GetSelLength(const ACustomEdit: TCustomEdit
+  ): integer;
+var
+  TextView: PGtkTextView;
+  TextBuffer: PGtkTextBuffer;
+  StartIter, EndIter: TGtkTextIter;
+  TmpStr: String;
+begin
+  Result := 0;
+  if not ACustomEdit.HandleAllocated then exit;
+
+  TextView := PGtkTextView(GetWidgetInfo(Pointer(ACustomEdit.Handle), False)^.CoreWidget);  if not ACustomEdit.HandleAllocated then exit;
+  TextBuffer := gtk_text_view_get_buffer(TextView);
+  if not gtk_text_buffer_get_selection_bounds(TextBuffer, @StartIter, @EndIter) then Exit;
+
+  Result := Abs(gtk_text_iter_get_offset(@EndIter) - gtk_text_iter_get_offset(@StartIter));
+end;
+
+
+

Reply via email to