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:
skalogryz
2015-03-17 03:43:59 +00:00
parent 3f4026e7c4
commit e36746f27d

View File

@ -77,6 +77,11 @@ type
class procedure SetParaNumbering(const AWinControl: TWinControl; TextStart,
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 procedure InDelText(const AWinControl: TWinControl; const TextUTF8: String; DstStart, DstLen: Integer); override;
@ -601,6 +606,7 @@ var
TempWidget: PGtkWidget;
WidgetInfo: PWidgetInfo;
buffer: PGtkTextBuffer;
SS:TPoint;
begin
Widget := gtk_scrolled_window_new(nil, nil);
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)^.vscrollbar, GTK_CAN_FOCUS);
gtk_scrolled_window_set_policy(PGtkScrolledWindow(Widget),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
SS:=Gtk2TranslateScrollStyle(TCustomMemo(AWinControl).ScrollBars);
gtk_scrolled_window_set_policy(PGtkScrolledWindow(Widget),SS.X, SS.Y);
// add border for memo
gtk_scrolled_window_set_shadow_type(PGtkScrolledWindow(Widget),
BorderStyleShadowMap[TCustomControl(AWinControl).BorderStyle]);
@ -626,10 +633,10 @@ begin
SetMainWidget(Widget, 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_accepts_tab(PGtkTextView(TempWidget), True);
gtk_text_view_set_accepts_tab(PGtkTextView(TempWidget), TCustomMemo(AWinControl).WantTabs);
gtk_widget_show_all(Widget);
@ -972,6 +979,83 @@ begin
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(
const AWinControl: TWinControl; TextStart: Integer; var rng: TParaRange
): Boolean;