diff --git a/components/synedit/allsynedit.pas b/components/synedit/allsynedit.pas
index 03eb2ad055..6b61149258 100644
--- a/components/synedit/allsynedit.pas
+++ b/components/synedit/allsynedit.pas
@@ -32,10 +32,9 @@ uses
SynHighlighterIni, SynEditMarkupSpecialChar, SynEditTextDoubleWidthChars,
SynEditTextSystemCharWidth, SynEditMarkupIfDef, SynPluginMultiCaret,
synhighlighterpike, SynEditMarkupFoldColoring, SynEditViewedLineMap,
- SynEditWrappedView, SynBeautifierPascal, LazSynIMMBase, LazarusPackageIntf;
+ SynEditWrappedView, SynBeautifierPascal, LazSynIMMBase, SynPopupMenu, LazarusPackageIntf;
implementation
-
procedure Register;
begin
RegisterUnit('SynEdit', @SynEdit.Register);
diff --git a/components/synedit/design/syneditlazdsgn.pas b/components/synedit/design/syneditlazdsgn.pas
index ca467c57b9..aab9ba01d8 100644
--- a/components/synedit/design/syneditlazdsgn.pas
+++ b/components/synedit/design/syneditlazdsgn.pas
@@ -43,7 +43,7 @@ uses
SynHighlighterCss, SynHighlighterPHP, SynHighlighterTeX, SynHighlighterSQL,
SynHighlighterPython, SynHighlighterVB, SynHighlighterAny, SynHighlighterDiff,
SynHighlighterBat, SynHighlighterIni, SynHighlighterPo,
- SynPluginSyncroEdit,
+ SynPluginSyncroEdit, SynPopupMenu,
SynPropertyEditObjectList, SynDesignStringConstants, SynHighlighterJScript,
LazarusPackageIntf, LResources, PropEdits, ComponentEditors;
@@ -88,6 +88,11 @@ begin
{$EndIF}
end;
+procedure RegisterSynPopupMenu;
+begin
+ RegisterComponents('SynEdit',[TSynPopupMenu]);
+end;
+
procedure RegisterSynHighlighterPas;
begin
RegisterComponents('SynEdit',[TSynPasSyn, TSynFreePascalSyn]);
@@ -233,6 +238,7 @@ begin
RegisterSynMacroRecorder;
RegisterSynExportHTML;
RegisterSynSyncroEdit;
+ RegisterSynPopupMenu;
RegisterSynHighlighterPas;;
RegisterSynHighlighterCPP;
diff --git a/components/synedit/design/syneditlazdsgn.res b/components/synedit/design/syneditlazdsgn.res
index b1982c8184..93b71adfa7 100644
Binary files a/components/synedit/design/syneditlazdsgn.res and b/components/synedit/design/syneditlazdsgn.res differ
diff --git a/components/synedit/design/syneditlazdsgn.txt b/components/synedit/design/syneditlazdsgn.txt
index 66c0b5a748..95f5e18639 100644
--- a/components/synedit/design/syneditlazdsgn.txt
+++ b/components/synedit/design/syneditlazdsgn.txt
@@ -85,3 +85,6 @@ tsynvbsyn_200.png
tsynxmlsyn.png
tsynxmlsyn_150.png
tsynxmlsyn_200.png
+tsynpopupmenu.png
+tsynpopupmenu_150.png
+tsynpopupmenu_200.png
\ No newline at end of file
diff --git a/components/synedit/design/tsynpopupmenu.png b/components/synedit/design/tsynpopupmenu.png
new file mode 100644
index 0000000000..ee72916e06
Binary files /dev/null and b/components/synedit/design/tsynpopupmenu.png differ
diff --git a/components/synedit/design/tsynpopupmenu_150.png b/components/synedit/design/tsynpopupmenu_150.png
new file mode 100644
index 0000000000..dfaee8f685
Binary files /dev/null and b/components/synedit/design/tsynpopupmenu_150.png differ
diff --git a/components/synedit/design/tsynpopupmenu_200.png b/components/synedit/design/tsynpopupmenu_200.png
new file mode 100644
index 0000000000..1409e1571a
Binary files /dev/null and b/components/synedit/design/tsynpopupmenu_200.png differ
diff --git a/components/synedit/synedit.lpk b/components/synedit/synedit.lpk
index 41318a1334..96fdca1515 100644
--- a/components/synedit/synedit.lpk
+++ b/components/synedit/synedit.lpk
@@ -403,6 +403,10 @@ If you wish to allow use of your version of these files only under the terms of
+ -
+
+
+
diff --git a/components/synedit/synpopupmenu.pas b/components/synedit/synpopupmenu.pas
new file mode 100644
index 0000000000..d2caf6443d
--- /dev/null
+++ b/components/synedit/synpopupmenu.pas
@@ -0,0 +1,140 @@
+unit SynPopupMenu;
+
+{$mode ObjFPC}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, Menus, SynEdit;
+
+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);
+
+resourcestring
+ SYNS_Undo = '&Undo';
+ SYNS_Redo = '&Redo';
+ SYNS_Cut = 'C&ut';
+ SYNS_Copy = '&Copy';
+ SYNS_Paste = '&Paste';
+ SYNS_Delete = '&Delete';
+ SYNS_SelectAll = 'Select &all';
+
+{ 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 := Trim(Lines.Text) <> '';
+ end;
+ end;
+ inherited;
+end;
+
+end.
+