You've already forked lazarus-ccr
richmemo: gtk2 fix scrollbars property to match TMemo rules. implemented tab stops
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@4044 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -77,6 +77,11 @@ type
|
|||||||
class procedure SetParaNumbering(const AWinControl: TWinControl; TextStart,
|
class procedure SetParaNumbering(const AWinControl: TWinControl; TextStart,
|
||||||
TextLen: Integer; const ANumber: TIntParaNumbering); override;
|
TextLen: Integer; const ANumber: TIntParaNumbering); override;
|
||||||
|
|
||||||
|
class procedure SetParaTabs(const AWinControl: TWinControl; TextStart, TextLen: Integer;
|
||||||
|
const AStopList: TTabStopList); override;
|
||||||
|
class function GetParaTabs(const AWinControl: TWinControl; TextStart: integer;
|
||||||
|
var AStopList: TTabStopList): Boolean; 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;
|
||||||
|
|
||||||
@ -601,6 +606,7 @@ var
|
|||||||
TempWidget: PGtkWidget;
|
TempWidget: PGtkWidget;
|
||||||
WidgetInfo: PWidgetInfo;
|
WidgetInfo: PWidgetInfo;
|
||||||
buffer: PGtkTextBuffer;
|
buffer: PGtkTextBuffer;
|
||||||
|
SS:TPoint;
|
||||||
begin
|
begin
|
||||||
Widget := gtk_scrolled_window_new(nil, nil);
|
Widget := gtk_scrolled_window_new(nil, nil);
|
||||||
Result := TLCLIntfHandle(PtrUInt(Widget));
|
Result := TLCLIntfHandle(PtrUInt(Widget));
|
||||||
@ -616,9 +622,10 @@ begin
|
|||||||
|
|
||||||
GTK_WIDGET_UNSET_FLAGS(PGtkScrolledWindow(Widget)^.hscrollbar, GTK_CAN_FOCUS);
|
GTK_WIDGET_UNSET_FLAGS(PGtkScrolledWindow(Widget)^.hscrollbar, GTK_CAN_FOCUS);
|
||||||
GTK_WIDGET_UNSET_FLAGS(PGtkScrolledWindow(Widget)^.vscrollbar, GTK_CAN_FOCUS);
|
GTK_WIDGET_UNSET_FLAGS(PGtkScrolledWindow(Widget)^.vscrollbar, GTK_CAN_FOCUS);
|
||||||
gtk_scrolled_window_set_policy(PGtkScrolledWindow(Widget),
|
|
||||||
GTK_POLICY_AUTOMATIC,
|
SS:=Gtk2TranslateScrollStyle(TCustomMemo(AWinControl).ScrollBars);
|
||||||
GTK_POLICY_AUTOMATIC);
|
gtk_scrolled_window_set_policy(PGtkScrolledWindow(Widget),SS.X, SS.Y);
|
||||||
|
|
||||||
// add border for memo
|
// add border for memo
|
||||||
gtk_scrolled_window_set_shadow_type(PGtkScrolledWindow(Widget),
|
gtk_scrolled_window_set_shadow_type(PGtkScrolledWindow(Widget),
|
||||||
BorderStyleShadowMap[TCustomControl(AWinControl).BorderStyle]);
|
BorderStyleShadowMap[TCustomControl(AWinControl).BorderStyle]);
|
||||||
@ -626,10 +633,10 @@ begin
|
|||||||
SetMainWidget(Widget, TempWidget);
|
SetMainWidget(Widget, TempWidget);
|
||||||
GetWidgetInfo(Widget, True)^.CoreWidget := TempWidget;
|
GetWidgetInfo(Widget, True)^.CoreWidget := TempWidget;
|
||||||
|
|
||||||
gtk_text_view_set_editable(PGtkTextView(TempWidget), True);
|
gtk_text_view_set_editable(PGtkTextView(TempWidget), not TCustomMemo(AWinControl).ReadOnly);
|
||||||
gtk_text_view_set_wrap_mode(PGtkTextView(TempWidget), GTK_WRAP_WORD);
|
gtk_text_view_set_wrap_mode(PGtkTextView(TempWidget), GTK_WRAP_WORD);
|
||||||
|
|
||||||
gtk_text_view_set_accepts_tab(PGtkTextView(TempWidget), True);
|
gtk_text_view_set_accepts_tab(PGtkTextView(TempWidget), TCustomMemo(AWinControl).WantTabs);
|
||||||
|
|
||||||
gtk_widget_show_all(Widget);
|
gtk_widget_show_all(Widget);
|
||||||
|
|
||||||
@ -972,6 +979,83 @@ begin
|
|||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
class procedure TGtk2WSCustomRichMemo.SetParaTabs(
|
||||||
|
const AWinControl: TWinControl; TextStart, TextLen: Integer;
|
||||||
|
const AStopList: TTabStopList);
|
||||||
|
var
|
||||||
|
w : PGtkWidget;
|
||||||
|
buffer : PGtkTextBuffer;
|
||||||
|
tag : PGtkTextTag;
|
||||||
|
parr : PPangoTabArray;
|
||||||
|
i : Integer;
|
||||||
|
const
|
||||||
|
ScreenDPI = 96; // todo: might change, should be received dynamically
|
||||||
|
PageDPI = 72; // not expected to be changed
|
||||||
|
DPIFactor = ScreenDPI / PageDPI;
|
||||||
|
begin
|
||||||
|
GetWidgetBuffer(AWinControl, w, buffer);
|
||||||
|
if not Assigned(w) or not Assigned(buffer) then Exit;
|
||||||
|
|
||||||
|
GetWidgetBuffer(AWinControl, w, buffer);
|
||||||
|
|
||||||
|
if AStopList.Count=0 then
|
||||||
|
parr:=nil
|
||||||
|
else begin
|
||||||
|
parr:=pango_tab_array_new(AStopList.Count, true);
|
||||||
|
for i:=0 to AStopList.Count-1 do begin
|
||||||
|
pango_tab_array_set_tab(parr, i, PANGO_TAB_LEFT, round(AStopList.Tabs[i].Offset * DPIFactor) );
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
tag := gtk_text_buffer_create_tag (buffer, nil,
|
||||||
|
'tabs', [ parr,
|
||||||
|
'tabs-set', gboolean(AStopList.Count>0),
|
||||||
|
nil]);
|
||||||
|
ApplyTag(buffer, tag, TextStart, TextLen, true);
|
||||||
|
|
||||||
|
if Assigned(parr) then pango_tab_array_free(parr);
|
||||||
|
end;
|
||||||
|
|
||||||
|
class function TGtk2WSCustomRichMemo.GetParaTabs(
|
||||||
|
const AWinControl: TWinControl; TextStart: integer;
|
||||||
|
var AStopList: TTabStopList): Boolean;
|
||||||
|
const
|
||||||
|
ScreenDPI = 96; // todo: might change, should be received dynamically
|
||||||
|
PageDPI = 72; // not expected to be changed
|
||||||
|
PixToPt = PageDPI / ScreenDPI;
|
||||||
|
var
|
||||||
|
w : PGtkWidget;
|
||||||
|
buffer : PGtkTextBuffer;
|
||||||
|
tag : PGtkTextTag;
|
||||||
|
parr : PPangoTabArray;
|
||||||
|
i : Integer;
|
||||||
|
attr : PGtkTextAttributes;
|
||||||
|
loc : gint;
|
||||||
|
al : TPangoTabAlign;
|
||||||
|
f : Double;
|
||||||
|
begin
|
||||||
|
InitTabStopList(AStopList);
|
||||||
|
attr:=GetAttrAtPos(AWinControl, TextStart, true);
|
||||||
|
Result:=Assigned(attr);
|
||||||
|
if not Result then Exit;
|
||||||
|
if not Assigned(attr^.tabs) then Exit;
|
||||||
|
|
||||||
|
AStopList.Count:=pango_tab_array_get_size(attr^.tabs);
|
||||||
|
if AStopList.Count=0 then Exit;
|
||||||
|
|
||||||
|
f := PixToPt;
|
||||||
|
if not pango_tab_array_get_positions_in_pixels(attr^.tabs) then
|
||||||
|
f:= f / PANGO_SCALE;
|
||||||
|
|
||||||
|
SetLength(AStopList.Tabs, AStopList.Count);
|
||||||
|
for i:=0 to AStopList.Count-1 do begin
|
||||||
|
pango_tab_array_get_tab(attr^.tabs, i, @al, @loc);
|
||||||
|
AStopList.Tabs[i].Offset:=loc*f;
|
||||||
|
AStopList.Tabs[i].Align:=taLeft;
|
||||||
|
end;
|
||||||
|
gtk_text_attributes_unref(attr);
|
||||||
|
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