You've already forked lazarus-ccr
richmemo: gtk initial numbering implementation
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3852 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -37,6 +37,11 @@ uses
|
|||||||
// RichMemo
|
// RichMemo
|
||||||
RichMemo, WSRichMemo, RichMemoUtils;
|
RichMemo, WSRichMemo, RichMemoUtils;
|
||||||
|
|
||||||
|
const
|
||||||
|
TagNameNumeric = 'numeric';
|
||||||
|
BulletChar = #$E2#$80#$A2;
|
||||||
|
TabChar = #$09;
|
||||||
|
|
||||||
{ TGtk2WSCustomRichMemo }
|
{ TGtk2WSCustomRichMemo }
|
||||||
type
|
type
|
||||||
TGtk2WSCustomRichMemo = class(TWSCustomRichMemo)
|
TGtk2WSCustomRichMemo = class(TWSCustomRichMemo)
|
||||||
@ -65,6 +70,9 @@ type
|
|||||||
class procedure SetParaMetric(const AWinControl: TWinControl; TextStart, TextLen: Integer;
|
class procedure SetParaMetric(const AWinControl: TWinControl; TextStart, TextLen: Integer;
|
||||||
const AMetric: TIntParaMetric); override;
|
const AMetric: TIntParaMetric); override;
|
||||||
|
|
||||||
|
class procedure SetParaNumbering(const AWinControl: TWinControl; TextStart,
|
||||||
|
TextLen: Integer; const ANumber: TIntParaNumbering); override;
|
||||||
|
|
||||||
class function GetParaRange(const AWinControl: TWinControl; TextStart: Integer; var rng: TParaRange): Boolean; override;
|
class function GetParaRange(const AWinControl: TWinControl; TextStart: Integer; var rng: TParaRange): Boolean; override;
|
||||||
class procedure InDelText(const AWinControl: TWinControl; const TextUTF8: String; DstStart, DstLen: Integer); override;
|
class procedure InDelText(const AWinControl: TWinControl; const TextUTF8: String; DstStart, DstLen: Integer); override;
|
||||||
|
|
||||||
@ -135,6 +143,28 @@ type
|
|||||||
TGtk2WSCustomMemoInt = class(TGtk2WSCustomMemo);
|
TGtk2WSCustomMemoInt = class(TGtk2WSCustomMemo);
|
||||||
TCustomRichMemoInt = class(TCustomRichMemo);
|
TCustomRichMemoInt = class(TCustomRichMemo);
|
||||||
|
|
||||||
|
procedure Gtk2WS_MemoSelChanged_Before(Textbuffer: PGtkTextBuffer;
|
||||||
|
StartIter: PGtkTextIter; mark: PGtkTextMark; WidgetInfo: PWidgetInfo); cdecl;
|
||||||
|
var
|
||||||
|
tag : PGtkTextTag;
|
||||||
|
begin
|
||||||
|
tag := gtk_text_tag_table_lookup( gtk_text_buffer_get_tag_table(TextBuffer)
|
||||||
|
, TagNameNumeric);
|
||||||
|
if gtk_text_iter_has_tag( StartIter, tag) then begin
|
||||||
|
if gtk_text_iter_begins_tag(StartIter, tag) then begin
|
||||||
|
gtk_text_iter_forward_to_tag_toggle(StartIter, nil);
|
||||||
|
gtk_text_buffer_move_mark(TextBuffer, mark, StartIter);
|
||||||
|
end else begin
|
||||||
|
gtk_text_iter_forward_char(StartIter);
|
||||||
|
if gtk_text_iter_ends_tag(StartIter, tag) then begin
|
||||||
|
gtk_text_iter_backward_to_tag_toggle(StartIter, nil);
|
||||||
|
gtk_text_iter_backward_char(StartIter);
|
||||||
|
gtk_text_buffer_move_mark(TextBuffer, mark, StartIter);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure Gtk2WS_MemoSelChanged (Textbuffer: PGtkTextBuffer;
|
procedure Gtk2WS_MemoSelChanged (Textbuffer: PGtkTextBuffer;
|
||||||
StartIter: PGtkTextIter; mark: PGtkTextMark; WidgetInfo: PWidgetInfo); cdecl;
|
StartIter: PGtkTextIter; mark: PGtkTextMark; WidgetInfo: PWidgetInfo); cdecl;
|
||||||
begin
|
begin
|
||||||
@ -185,6 +215,7 @@ begin
|
|||||||
TGtk2WSCustomMemoInt.SetCallbacks(AGtkWidget, AWidgetInfo);
|
TGtk2WSCustomMemoInt.SetCallbacks(AGtkWidget, AWidgetInfo);
|
||||||
|
|
||||||
TextBuf := gtk_text_view_get_buffer(PGtkTextView(AWidgetInfo^.CoreWidget));
|
TextBuf := gtk_text_view_get_buffer(PGtkTextView(AWidgetInfo^.CoreWidget));
|
||||||
|
SignalConnect(PGtkWidget(TextBuf), 'mark-set', @Gtk2WS_MemoSelChanged_Before, AWidgetInfo);
|
||||||
SignalConnectAfter(PGtkWidget(TextBuf), 'mark-set', @Gtk2WS_MemoSelChanged, AWidgetInfo);
|
SignalConnectAfter(PGtkWidget(TextBuf), 'mark-set', @Gtk2WS_MemoSelChanged, AWidgetInfo);
|
||||||
SignalConnectAfter(PGtkWidget(TextBuf), 'insert-text', @Gtk2WS_RichMemoInsert, AWidgetInfo);
|
SignalConnectAfter(PGtkWidget(TextBuf), 'insert-text', @Gtk2WS_RichMemoInsert, AWidgetInfo);
|
||||||
end;
|
end;
|
||||||
@ -249,6 +280,7 @@ var
|
|||||||
Widget,
|
Widget,
|
||||||
TempWidget: PGtkWidget;
|
TempWidget: PGtkWidget;
|
||||||
WidgetInfo: PWidgetInfo;
|
WidgetInfo: PWidgetInfo;
|
||||||
|
buffer: PGtkTextBuffer;
|
||||||
begin
|
begin
|
||||||
Widget := gtk_scrolled_window_new(nil, nil);
|
Widget := gtk_scrolled_window_new(nil, nil);
|
||||||
Result := TLCLIntfHandle(PtrUInt(Widget));
|
Result := TLCLIntfHandle(PtrUInt(Widget));
|
||||||
@ -281,6 +313,13 @@ begin
|
|||||||
|
|
||||||
gtk_widget_show_all(Widget);
|
gtk_widget_show_all(Widget);
|
||||||
|
|
||||||
|
buffer := gtk_text_view_get_buffer (PGtkTextView(TempWidget));
|
||||||
|
//tag:=gtk_text_tag_new(TagNameNumeric);
|
||||||
|
gtk_text_buffer_create_tag (buffer, TagNameNumeric,
|
||||||
|
'editable', [ gboolean(gFALSE),
|
||||||
|
'editable-set', gboolean(gTRUE),
|
||||||
|
nil]);
|
||||||
|
|
||||||
Set_RC_Name(AWinControl, Widget);
|
Set_RC_Name(AWinControl, Widget);
|
||||||
SetCallbacks(Widget, WidgetInfo);
|
SetCallbacks(Widget, WidgetInfo);
|
||||||
end;
|
end;
|
||||||
@ -484,6 +523,88 @@ begin
|
|||||||
ApplyTag(buffer, tag, TextStart, TextLen, true);
|
ApplyTag(buffer, tag, TextStart, TextLen, true);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
class procedure TGtk2WSCustomRichMemo.SetParaNumbering(
|
||||||
|
const AWinControl: TWinControl; TextStart, TextLen: Integer;
|
||||||
|
const ANumber: TIntParaNumbering);
|
||||||
|
var
|
||||||
|
w : PGtkWidget;
|
||||||
|
b : PGtkTextBuffer;
|
||||||
|
istart : TGtkTextIter;
|
||||||
|
iend : TGtkTextIter;
|
||||||
|
txt : String;
|
||||||
|
len : Integer;
|
||||||
|
ln : Integer;
|
||||||
|
ls : Integer;
|
||||||
|
ofs : Integer;
|
||||||
|
numidx : Integer;
|
||||||
|
tag : PGtkTextTag;
|
||||||
|
begin
|
||||||
|
inherited SetParaNumbering(AWinControl, TextStart, TextLen, ANumber);
|
||||||
|
GetWidgetBuffer(AWinControl, w, b);
|
||||||
|
if not Assigned(w) or not Assigned(b) then Exit;
|
||||||
|
|
||||||
|
tag := gtk_text_tag_table_lookup( gtk_text_buffer_get_tag_table(b)
|
||||||
|
, TagNameNumeric);
|
||||||
|
|
||||||
|
gtk_text_buffer_get_iter_at_offset (b, @istart, TextStart);
|
||||||
|
iend:=istart;
|
||||||
|
gtk_text_iter_forward_chars(@iend, TextLen);
|
||||||
|
ln:=gtk_text_iter_get_line(@istart);
|
||||||
|
ls:=gtk_text_iter_get_line(@iend);
|
||||||
|
|
||||||
|
|
||||||
|
numidx:=1;
|
||||||
|
if ANumber.Style=pnNumber then numidx:=ANumber.NumberStart;
|
||||||
|
|
||||||
|
repeat
|
||||||
|
gtk_text_iter_set_line_offset(@istart, 0);
|
||||||
|
case ANumber.Style of
|
||||||
|
pnBullet: txt := BulletChar;
|
||||||
|
pnNumber: txt := IntToStr(numidx);
|
||||||
|
pnLowLetter: txt := 'a';
|
||||||
|
pnLowRoman: txt := 'i';
|
||||||
|
pnUpLetter: txt := 'A';
|
||||||
|
pnUpRoman: txt := 'I';
|
||||||
|
pnCustomChar: txt:= UTF8Encode(ANumber.CustomChar);
|
||||||
|
end;
|
||||||
|
if not (ANumber.Style in [pnBullet, pnCustomChar]) and (ANumber.SepChar<>#0) then
|
||||||
|
txt:=txt+UTF8Encode(ANumber.SepChar);
|
||||||
|
txt:=txt+TabChar;
|
||||||
|
|
||||||
|
//gtk_text_buffer_get_iter_at_offset (b, @iend, TextStart);
|
||||||
|
//gtk_text_buffer_move
|
||||||
|
ofs:=gtk_text_iter_get_offset(@istart);
|
||||||
|
|
||||||
|
// remove existing number
|
||||||
|
if gtk_text_iter_begins_tag(@istart, tag) then begin
|
||||||
|
iend:=istart;
|
||||||
|
gtk_text_iter_forward_to_tag_toggle(@iend, nil);
|
||||||
|
gtk_text_buffer_delete(b, @istart, @iend);
|
||||||
|
gtk_text_buffer_get_iter_at_offset (b, @istart, ofs);
|
||||||
|
end;
|
||||||
|
// insert new number
|
||||||
|
gtk_text_buffer_insert(b, @istart, @txt[1], length(txt));
|
||||||
|
|
||||||
|
// restoring iterators
|
||||||
|
gtk_text_buffer_get_iter_at_offset (b, @istart, ofs);
|
||||||
|
gtk_text_iter_set_line_offset(@istart, 0);
|
||||||
|
iend := istart;
|
||||||
|
|
||||||
|
len:=UTF8Length(txt);
|
||||||
|
gtk_text_iter_forward_chars(@iend, len);
|
||||||
|
// aplying tag
|
||||||
|
gtk_text_buffer_apply_tag_by_name(b, TagNameNumeric, @istart, @iend);
|
||||||
|
|
||||||
|
// next line!
|
||||||
|
gtk_text_iter_forward_line(@istart);
|
||||||
|
|
||||||
|
inc(ln);
|
||||||
|
inc(numidx);
|
||||||
|
until ln>ls;
|
||||||
|
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
class function TGtk2WSCustomRichMemo.GetParaRange(
|
class function TGtk2WSCustomRichMemo.GetParaRange(
|
||||||
const AWinControl: TWinControl; TextStart: Integer; var rng: TParaRange
|
const AWinControl: TWinControl; TextStart: Integer; var rng: TParaRange
|
||||||
): Boolean;
|
): Boolean;
|
||||||
|
Reference in New Issue
Block a user