198 lines
4.0 KiB
ObjectPascal
198 lines
4.0 KiB
ObjectPascal
unit ATSynEdit_Edits;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, Graphics, Controls,
|
|
Menus, Math,
|
|
ATSynEdit,
|
|
ATSynEdit_CanvasProc,
|
|
ATStringProc;
|
|
|
|
type
|
|
{ TATEdit }
|
|
|
|
TATEdit = class(TATSynEdit)
|
|
protected
|
|
function DoGetTextString: atString; override;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
end;
|
|
|
|
type
|
|
{ TATComboEdit }
|
|
|
|
TATComboEdit = class(TATEdit)
|
|
private
|
|
FItems: TStringList;
|
|
FMenu: TPopupMenu;
|
|
FArrowSize: integer;
|
|
FSelectedIndex: integer;
|
|
procedure DoComboUpDown(ADown: boolean);
|
|
procedure MicromapClick(Sender: TObject; AX, AY: integer);
|
|
procedure MicromapDraw(Sender: TObject; C: TCanvas; const ARect: TRect);
|
|
procedure DoMenu;
|
|
procedure MenuItemClick(Sender: TObject);
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
property Items: TStringList read FItems;
|
|
procedure DoCommand(ACmd: integer; const AText: atString = ''); override;
|
|
procedure DoAddLineToHistory(const AStr: atString; AMaxItems: integer);
|
|
published
|
|
property OptComboboxArrowSize: integer read FArrowSize write FArrowSize;
|
|
end;
|
|
|
|
|
|
implementation
|
|
|
|
uses
|
|
Types,
|
|
ATSynEdit_Commands,
|
|
ATSynEdit_Keymap_Init;
|
|
|
|
{ TATEdit }
|
|
|
|
function TATEdit.DoGetTextString: atString;
|
|
begin
|
|
Result:= inherited;
|
|
//gets text with EOLs, strip them
|
|
while (Result<>'') and
|
|
IsCharEol(Result[Length(Result)]) do
|
|
SetLength(Result, Length(Result)-1);
|
|
end;
|
|
|
|
constructor TATEdit.Create(AOwner: TComponent);
|
|
begin
|
|
inherited;
|
|
|
|
WantTabs:= false;
|
|
ModeOneLine:= true;
|
|
BorderStyle:= bsSingle;
|
|
|
|
Keymap:= KeymapCombo;
|
|
|
|
OptTextOffsetTop:= 2;
|
|
Height:= 26;
|
|
end;
|
|
|
|
{ TATComboEdit }
|
|
|
|
constructor TATComboEdit.Create(AOwner: TComponent);
|
|
begin
|
|
inherited;
|
|
|
|
FItems:= TStringList.Create;
|
|
FMenu:= TPopupMenu.Create(Self);
|
|
FSelectedIndex:= -1;
|
|
|
|
OptMicromapVisible:= true;
|
|
OptMicromapWidth:= 22;
|
|
OptComboboxArrowSize:= 4;
|
|
OnClickMicromap:= @MicromapClick;
|
|
OnDrawMicromap:= @MicromapDraw;
|
|
end;
|
|
|
|
procedure TATComboEdit.MicromapClick(Sender: TObject; AX, AY: integer);
|
|
begin
|
|
DoMenu;
|
|
end;
|
|
|
|
procedure TATComboEdit.MicromapDraw(Sender: TObject; C: TCanvas;
|
|
const ARect: TRect);
|
|
begin
|
|
C.Brush.Color:= Colors.ComboboxArrowBG;
|
|
C.FillRect(ARect);
|
|
|
|
CanvasPaintTriangleDown(C, Colors.ComboboxArrow,
|
|
Point(
|
|
(ARect.Left+ARect.Right) div 2 - FArrowSize,
|
|
(ARect.Top+ARect.Bottom) div 2 - FArrowSize div 2),
|
|
FArrowSize);
|
|
end;
|
|
|
|
procedure TATComboEdit.DoMenu;
|
|
var
|
|
p: TPoint;
|
|
i: integer;
|
|
mi: TMenuItem;
|
|
begin
|
|
p:= ClientToScreen(Point(Width-OptMicromapWidth, Height));
|
|
with FMenu.Items do
|
|
begin
|
|
Clear;
|
|
for i:= 0 to FItems.Count-1 do
|
|
begin
|
|
mi:= TMenuItem.Create(Self);
|
|
mi.Caption:= FItems[i];
|
|
mi.Tag:= i;
|
|
mi.OnClick:= @MenuItemClick;
|
|
Add(mi);
|
|
end;
|
|
end;
|
|
FMenu.PopUp(p.x, p.y);
|
|
end;
|
|
|
|
procedure TATComboEdit.MenuItemClick(Sender: TObject);
|
|
var
|
|
n: integer;
|
|
begin
|
|
n:= (Sender as TMenuItem).Tag;
|
|
if n>=0 then
|
|
begin
|
|
Text:= UTF8Decode(FItems[n]);
|
|
DoEventChange;
|
|
|
|
//scroll to left, select all
|
|
DoScrollByDelta(-10000, 0);
|
|
DoCommand(cCommand_SelectAll);
|
|
end;
|
|
end;
|
|
|
|
procedure TATComboEdit.DoCommand(ACmd: integer; const AText: atString);
|
|
begin
|
|
inherited;
|
|
case ACmd of
|
|
cCommand_ComboboxRecentsMenu:
|
|
begin
|
|
DoMenu;
|
|
end;
|
|
cCommand_KeyDown,
|
|
cCommand_KeyUp:
|
|
begin
|
|
DoComboUpDown(ACmd=cCommand_KeyDown);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TATComboEdit.DoAddLineToHistory(const AStr: atString;
|
|
AMaxItems: integer);
|
|
begin
|
|
FSelectedIndex:= -1;
|
|
SAddStringToHistory(Utf8Encode(AStr), FItems, AMaxItems);
|
|
end;
|
|
|
|
procedure TATComboEdit.DoComboUpDown(ADown: boolean);
|
|
begin
|
|
if FItems.Count=0 then exit;
|
|
if ADown then Inc(FSelectedIndex) else Dec(FSelectedIndex);
|
|
FSelectedIndex:= Max(0, Min(FItems.Count-1, FSelectedIndex));
|
|
|
|
Text:= Utf8Decode(FItems[FSelectedIndex]);
|
|
DoEventChange;
|
|
DoCommand(cCommand_SelectAll);
|
|
end;
|
|
|
|
destructor TATComboEdit.Destroy;
|
|
begin
|
|
FreeAndNil(FMenu);
|
|
FreeAndNil(FItems);
|
|
inherited;
|
|
end;
|
|
|
|
|
|
end.
|
|
|