diff options
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/fpgui_package.lpk | 8 | ||||
-rw-r--r-- | src/gui/gui_edit.pas | 106 |
2 files changed, 107 insertions, 7 deletions
diff --git a/src/gui/fpgui_package.lpk b/src/gui/fpgui_package.lpk index 2c957e1e..a9716935 100644 --- a/src/gui/fpgui_package.lpk +++ b/src/gui/fpgui_package.lpk @@ -143,12 +143,12 @@ <LazDoc Paths="../../docs/xml/gui/"/> <RequiredPkgs Count="2"> <Item1> - <PackageName Value="fpgfx_package"/> - <MinVersion Minor="5" Valid="True"/> - </Item1> - <Item2> <PackageName Value="FCL"/> <MinVersion Major="1" Valid="True"/> + </Item1> + <Item2> + <PackageName Value="fpgfx_package"/> + <MinVersion Minor="5" Valid="True"/> </Item2> </RequiredPkgs> <UsageOptions> diff --git a/src/gui/gui_edit.pas b/src/gui/gui_edit.pas index 133def39..369379ba 100644 --- a/src/gui/gui_edit.pas +++ b/src/gui/gui_edit.pas @@ -26,7 +26,8 @@ uses SysUtils, gfxbase, fpgfx, - gfx_widget; + gfx_widget, + gui_menu; type TfpgEditBorderStyle = (bsNone, bsDefault, bsSingle); @@ -36,6 +37,8 @@ type private FAutoSelect: Boolean; FHideSelection: Boolean; + FPopupMenu: TfpgPopupMenu; + FDefaultPopupMenu: TfpgPopupMenu; FText: string; FBackgroundColor: TfpgColor; FFont: TfpgFont; @@ -56,6 +59,11 @@ type function GetFontDesc: string; procedure SetFontDesc(const AValue: string); procedure SetText(const AValue: string); + procedure DefaultPopupCut(Sender: TObject); + procedure DefaultPopupCopy(Sender: TObject); + procedure DefaultPopupPaste(Sender: TObject); + procedure DefaultPopupClearAll(Sender: TObject); + procedure SetDefaultPopupMenuItemsState; protected FMouseDragPos: integer; FDrawOffset: integer; @@ -63,10 +71,12 @@ type FSelStart: integer; FSelOffset: integer; FCursorPos: integer; + procedure ShowDefaultPopupMenu(const x, y: integer; const shiftstate: TShiftState); virtual; procedure HandlePaint; override; procedure HandleKeyChar(var AText: String; var shiftstate: TShiftState; var consumed: Boolean); override; procedure HandleKeyPress(var keycode: word; var shiftstate: TShiftState; var consumed: Boolean); override; procedure HandleLMouseDown(x, y: integer; shiftstate: TShiftState); override; + procedure HandleRMouseDown(x, y: integer; shiftstate: TShiftState); override; procedure HandleMouseMove(x, y: integer; btnstate: word; shiftstate: TShiftState); override; procedure HandleDoubleClick(x, y: integer; button: word; shiftstate: TShiftState); override; procedure HandleMouseEnter; override; @@ -76,13 +86,14 @@ type function GetDrawText: String; property AutoSelect: Boolean read FAutoSelect write SetAutoSelect default True; property BackgroundColor: TfpgColor read FBackgroundColor write SetBackgroundColor default clBoxColor; + property BorderStyle: TfpgEditBorderStyle read FBorderStyle write SetBorderStyle default bsDefault; property Font: TfpgFont read FFont; property FontDesc: String read GetFontDesc write SetFontDesc; property HideSelection: Boolean read FHideSelection write SetHideSelection default True; + property MaxLength: Integer read FMaxLength write FMaxLength; property PasswordMode: Boolean read FPasswordMode write SetPasswordMode default False; - property BorderStyle: TfpgEditBorderStyle read FBorderStyle write SetBorderStyle default bsDefault; + property PopupMenu: TfpgPopupMenu read FPopupMenu write FPopupMenu; property Text: String read FText write SetText; - property MaxLength: Integer read FMaxLength write FMaxLength; property OnChange: TNotifyEvent read FOnChange write FOnChange; public constructor Create(AOwner: TComponent); override; @@ -98,6 +109,8 @@ type TfpgEdit = class(TfpgCustomEdit) + public + property PopupMenu; // UI Designer doesn't fully support it yet published property AutoSelect; property BackgroundColor; @@ -125,6 +138,14 @@ implementation uses gfx_UTF8utils, gfx_clipboard; + +const + // internal popupmenu item names + ipmCut = 'miDefaultCut'; + ipmCopy = 'miDefaultCopy'; + ipmPaste = 'miDefaultPaste'; + ipmClearAll = 'miDefaultClearAll'; + function CreateEdit(AOwner: TComponent; x, y, w, h: TfpgCoord): TfpgEdit; begin @@ -483,6 +504,15 @@ begin Repaint; end; +procedure TfpgCustomEdit.HandleRMouseDown(x, y: integer; shiftstate: TShiftState); +begin + inherited HandleRMouseDown(x, y, shiftstate); + if Assigned(PopupMenu) then + PopupMenu.ShowAt(self, x, y) + else + ShowDefaultPopupMenu(x, y, ShiftState); +end; + procedure TfpgCustomEdit.HandleMouseMove(x, y: integer; btnstate: word; shiftstate: TShiftState); var n: integer; @@ -586,11 +616,15 @@ begin FDrawOffset := 0; FPasswordMode := False; FBorderStyle := bsDefault; + FPopupMenu := nil; + FDefaultPopupMenu := nil; FOnChange := nil; end; destructor TfpgCustomEdit.Destroy; begin + if Assigned(FDefaultPopupMenu) then + FDefaultPopupMenu.Free; FFont.Free; inherited Destroy; end; @@ -657,6 +691,72 @@ begin RePaint; end; +procedure TfpgCustomEdit.DefaultPopupCut(Sender: TObject); +begin + CutToClipboard; +end; + +procedure TfpgCustomEdit.DefaultPopupCopy(Sender: TObject); +begin + CopyToClipboard; +end; + +procedure TfpgCustomEdit.DefaultPopupPaste(Sender: TObject); +begin + PasteFromClipboard +end; + +procedure TfpgCustomEdit.DefaultPopupClearAll(Sender: TObject); +begin + Clear; +end; + +procedure TfpgCustomEdit.SetDefaultPopupMenuItemsState; +var + i: integer; + itm: TfpgMenuItem; +begin + for i := 0 to FDefaultPopupMenu.ComponentCount-1 do + begin + if FDefaultPopupMenu.Components[i] is TfpgMenuItem then + begin + itm := TfpgMenuItem(FDefaultPopupMenu.Components[i]); + // enabled/disable menu items + if itm.Name = ipmCut then + itm.Enabled := FSelOffset <> 0 + else if itm.Name = ipmCopy then + itm.Enabled := FSelOffset <> 0 + else if itm.Name = ipmPaste then + itm.Enabled := fpgClipboard.Text <> '' + else if itm.Name = ipmClearAll then + itm.Enabled := Text <> ''; + end; + end; +end; + +procedure TfpgCustomEdit.ShowDefaultPopupMenu(const x, y: integer; + const shiftstate: TShiftState); +var + itm: TfpgMenuItem; +begin + if not Assigned(FDefaultPopupMenu) then + begin + { todo: This text needs to be localized } + FDefaultPopupMenu := TfpgPopupMenu.Create(nil); + itm := FDefaultPopupMenu.AddMenuItem('Cut', '', @DefaultPopupCut); + itm.Name := ipmCut; + itm := FDefaultPopupMenu.AddMenuItem('Copy', '', @DefaultPopupCopy); + itm.Name := ipmCopy; + itm := FDefaultPopupMenu.AddMenuItem('Paste', '', @DefaultPopupPaste); + itm.Name := ipmPaste; + itm := FDefaultPopupMenu.AddMenuItem('Clear all text', '', @DefaultPopupClearAll); + itm.Name := ipmClearAll; + end; + + SetDefaultPopupMenuItemsState; + FDefaultPopupMenu.ShowAt(self, x, y); +end; + procedure TfpgCustomEdit.DeleteSelection; begin if FSelOffset <> 0 then |