mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-30 21:03:43 +02:00
132 lines
3.3 KiB
ObjectPascal
132 lines
3.3 KiB
ObjectPascal
unit SynPopupMenu;
|
|
|
|
{$mode ObjFPC}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, Menus, SynEdit, SynEditStrConst;
|
|
|
|
type
|
|
TSynDefaultPopupMenu = (dpmDisabled, dpmBefore, dpmAfter);
|
|
|
|
TSynPopupMenu = class(TPopupMenu)
|
|
private
|
|
FDefaultPopupMenu: TSynDefaultPopupMenu;
|
|
procedure FillDefaultMenu;
|
|
procedure ClearDefaultMenu;
|
|
protected
|
|
procedure ItemOnClick(Sender: TObject);
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
procedure PopUp(X, Y: Integer); override;
|
|
published
|
|
property DefaultPopupMenu: TSynDefaultPopupMenu read
|
|
FDefaultPopupMenu write FDefaultPopupMenu default dpmBefore;
|
|
end;
|
|
|
|
implementation
|
|
|
|
type
|
|
TMenuEntry = (meNone, meUndo, meRedo, meCut, meCopy, mePaste,
|
|
meDelete, meSelectAll);
|
|
|
|
{ TSynPopupMenu }
|
|
|
|
constructor TSynPopupMenu.Create(AOwner: TComponent);
|
|
begin
|
|
inherited;
|
|
FDefaultPopupMenu := dpmBefore;
|
|
end;
|
|
|
|
procedure TSynPopupMenu.FillDefaultMenu;
|
|
var
|
|
i: Integer;
|
|
|
|
procedure AddMenuItem(const ACaption: string; const ATag: TMenuEntry);
|
|
var
|
|
FItem: TMenuItem;
|
|
begin
|
|
FItem := TMenuItem.Create(Self);
|
|
FItem.Caption := ACaption;
|
|
FItem.OnClick := @ItemOnClick;
|
|
FItem.Tag := Integer(ATag);
|
|
if FDefaultPopupMenu = dpmAfter then
|
|
Items.Add(FItem)
|
|
else
|
|
Items.Insert(i, FItem);
|
|
Inc(i);
|
|
end;
|
|
|
|
var
|
|
FEmpty: Boolean;
|
|
begin
|
|
if FDefaultPopupMenu = dpmDisabled then
|
|
Exit;
|
|
i := 0;
|
|
FEmpty := Items.Count = 0;
|
|
if not FEmpty and (FDefaultPopupMenu = dpmAfter) then // separator
|
|
AddMenuItem('-', meNone);
|
|
AddMenuItem(SYNS_Undo, meUndo);
|
|
AddMenuItem(SYNS_Redo, meRedo);
|
|
AddMenuItem('-', meNone);
|
|
AddMenuItem(SYNS_Cut, meCut);
|
|
AddMenuItem(SYNS_Copy, meCopy);
|
|
AddMenuItem(SYNS_Paste, mePaste);
|
|
AddMenuItem('-', meNone);
|
|
AddMenuItem(SYNS_Delete, meDelete);
|
|
AddMenuItem(SYNS_SelectAll, meSelectAll);
|
|
if not FEmpty and (FDefaultPopupMenu = dpmBefore) then // separator
|
|
AddMenuItem('-', meNone);
|
|
end;
|
|
|
|
procedure TSynPopupMenu.ClearDefaultMenu;
|
|
var
|
|
i: Integer;
|
|
begin
|
|
for i := Items.Count - 1 downto 0 do
|
|
if Items[i].OnClick = @ItemOnClick then
|
|
Items.Delete(i);
|
|
end;
|
|
|
|
procedure TSynPopupMenu.ItemOnClick(Sender: TObject);
|
|
begin
|
|
with TCustomSynEdit(PopupComponent) do
|
|
case TMenuEntry(TMenuItem(Sender).Tag) of
|
|
meUndo: Undo;
|
|
meRedo: Redo;
|
|
meCut: CutToClipboard;
|
|
meCopy: CopyToClipboard;
|
|
mePaste: PasteFromClipboard;
|
|
meDelete: SelText := '';
|
|
meSelectAll: SelectAll;
|
|
end;
|
|
end;
|
|
|
|
procedure TSynPopupMenu.PopUp(X, Y: Integer);
|
|
var
|
|
i: Integer;
|
|
begin
|
|
ClearDefaultMenu;
|
|
if PopupComponent is TCustomSynEdit then
|
|
begin
|
|
FillDefaultMenu;
|
|
for i := 0 to Items.Count - 1 do
|
|
with TCustomSynEdit(PopupComponent) do
|
|
if Items[i].OnClick = @ItemOnClick then // make sure it's ours
|
|
case TMenuEntry(Items[i].Tag) of
|
|
meUndo: Items[i].Enabled := CanUndo;
|
|
meRedo: Items[i].Enabled := CanRedo;
|
|
meCut: Items[i].Enabled := SelAvail and not ReadOnly;
|
|
meCopy: Items[i].Enabled := SelAvail;
|
|
mePaste: Items[i].Enabled := CanPaste;
|
|
meDelete: Items[i].Enabled := SelAvail and not ReadOnly;
|
|
meSelectAll: Items[i].Enabled := HasText([shtIncludeVirtual]);
|
|
end;
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
end.
|
|
|