mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-16 20:49:30 +02:00
IDE: replaced key grabbing with new TShortCutGrabBox and TShortCutDialog
git-svn-id: trunk@15887 -
This commit is contained in:
parent
a562835ecc
commit
7d530305f0
3
.gitattributes
vendored
3
.gitattributes
vendored
@ -2157,6 +2157,9 @@ ide/keymapping.pp svneol=native#text/pascal
|
||||
ide/keymapschemedlg.lfm svneol=native#text/plain
|
||||
ide/keymapschemedlg.lrs svneol=native#text/pascal
|
||||
ide/keymapschemedlg.pas svneol=native#text/pascal
|
||||
ide/keymapshortcutdlg.lfm svneol=native#text/plain
|
||||
ide/keymapshortcutdlg.lrs svneol=native#text/plain
|
||||
ide/keymapshortcutdlg.pas svneol=native#text/plain
|
||||
ide/lazarus.lpi svneol=native#text/plain
|
||||
ide/lazarus.pp svneol=native#text/pascal
|
||||
ide/lazarus.rc svneol=native#text/plain
|
||||
|
@ -52,7 +52,7 @@ uses
|
||||
IDECommands, IDEWindowIntf, SrcEditorIntf,
|
||||
// IDE
|
||||
LazarusIDEStrConsts, IDEOptionDefs, IDEProcs, InputHistory, KeyMapping,
|
||||
KeymapSchemeDlg, LazConf;
|
||||
KeymapSchemeDlg, KeyMapShortCutDlg, LazConf;
|
||||
|
||||
type
|
||||
TPreviewEditor = TSynEdit;
|
||||
@ -2854,7 +2854,7 @@ procedure TEditorOptionsForm.KeyMappingFindKeyButtonClick(Sender: TObject);
|
||||
var
|
||||
KeyFilter: TIDEShortCut;
|
||||
begin
|
||||
if ShowKeyMappingGrabForm(EditingKeyMap,KeyFilter)<>mrOK then exit;
|
||||
if ShowKeyMappingGrabForm(KeyFilter)<>mrOK then exit;
|
||||
//debugln(['TEditorOptionsForm.KeyMappingFindKeyButtonClick ',KeyAndShiftStateToEditorKeyString(KeyFilter)]);
|
||||
KeyMapKeyFilter:=KeyFilter;
|
||||
FillKeyMappingTreeView;
|
||||
@ -3978,7 +3978,6 @@ end;
|
||||
|
||||
procedure TEditorOptionsForm.OkButtonClick(Sender: TObject);
|
||||
var
|
||||
SynOptions: TSynEditorOptions;
|
||||
i: Integer;
|
||||
begin
|
||||
IDEDialogLayoutList.SaveLayout(Self);
|
||||
|
@ -3,8 +3,6 @@ object ExternalToolOptionDlg: TExternalToolOptionDlg
|
||||
Height = 501
|
||||
Top = 210
|
||||
Width = 661
|
||||
HorzScrollBar.Page = 660
|
||||
VertScrollBar.Page = 500
|
||||
ActiveControl = TitleEdit
|
||||
Caption = 'ExternalToolOptionDlg'
|
||||
ClientHeight = 501
|
||||
@ -14,7 +12,6 @@ object ExternalToolOptionDlg: TExternalToolOptionDlg
|
||||
KeyPreview = True
|
||||
OnCreate = FormCreate
|
||||
OnDestroy = FormDestroy
|
||||
OnKeyUp = FormKeyUp
|
||||
Position = poScreenCenter
|
||||
LCLVersion = '0.9.25'
|
||||
object TitleLabel: TLabel
|
||||
@ -194,92 +191,15 @@ object ExternalToolOptionDlg: TExternalToolOptionDlg
|
||||
AnchorSideRight.Control = OptionsGroupBox
|
||||
AnchorSideRight.Side = asrBottom
|
||||
Left = 6
|
||||
Height = 49
|
||||
Height = 25
|
||||
Top = 220
|
||||
Width = 649
|
||||
Anchors = [akTop, akLeft, akRight]
|
||||
AutoSize = True
|
||||
BorderSpacing.Top = 6
|
||||
Caption = 'KeyGroupBox'
|
||||
ClientHeight = 30
|
||||
ClientWidth = 645
|
||||
Constraints.MinHeight = 25
|
||||
TabOrder = 6
|
||||
object KeyCtrlCheckBox: TCheckBox
|
||||
AnchorSideLeft.Control = KeyGroupBox
|
||||
AnchorSideTop.Control = KeyGroupBox
|
||||
AnchorSideBottom.Control = KeyGroupBox
|
||||
AnchorSideBottom.Side = asrBottom
|
||||
Left = 6
|
||||
Height = 22
|
||||
Top = 2
|
||||
Width = 131
|
||||
Anchors = [akTop, akLeft, akBottom]
|
||||
BorderSpacing.Left = 6
|
||||
BorderSpacing.Top = 2
|
||||
BorderSpacing.Bottom = 6
|
||||
Caption = 'KeyCtrlCheckBox'
|
||||
TabOrder = 0
|
||||
end
|
||||
object KeyAltCheckBox: TCheckBox
|
||||
AnchorSideLeft.Control = KeyCtrlCheckBox
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
AnchorSideTop.Control = KeyCtrlCheckBox
|
||||
Left = 143
|
||||
Height = 22
|
||||
Top = 2
|
||||
Width = 126
|
||||
BorderSpacing.Left = 6
|
||||
Caption = 'KeyAltCheckBox'
|
||||
TabOrder = 1
|
||||
end
|
||||
object KeyShiftCheckBox: TCheckBox
|
||||
AnchorSideLeft.Control = KeyAltCheckBox
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
AnchorSideTop.Control = KeyCtrlCheckBox
|
||||
Left = 275
|
||||
Height = 22
|
||||
Top = 2
|
||||
Width = 138
|
||||
BorderSpacing.Left = 6
|
||||
Caption = 'KeyShiftCheckBox'
|
||||
TabOrder = 2
|
||||
end
|
||||
object KeyComboBox: TComboBox
|
||||
AnchorSideLeft.Control = KeyShiftCheckBox
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
AnchorSideTop.Control = KeyCtrlCheckBox
|
||||
AnchorSideTop.Side = asrCenter
|
||||
AnchorSideRight.Control = KeyGrabButton
|
||||
Left = 419
|
||||
Height = 29
|
||||
Top = -1
|
||||
Width = 106
|
||||
Anchors = [akTop, akLeft, akRight]
|
||||
AutoCompleteText = [cbactEndOfLineComplete, cbactSearchAscending]
|
||||
BorderSpacing.Left = 6
|
||||
BorderSpacing.Right = 6
|
||||
MaxLength = 0
|
||||
TabOrder = 3
|
||||
Text = 'KeyComboBox'
|
||||
end
|
||||
object KeyGrabButton: TButton
|
||||
AnchorSideTop.Control = KeyCtrlCheckBox
|
||||
AnchorSideTop.Side = asrCenter
|
||||
AnchorSideRight.Control = KeyGroupBox
|
||||
AnchorSideRight.Side = asrBottom
|
||||
AnchorSideBottom.Side = asrBottom
|
||||
Left = 531
|
||||
Height = 29
|
||||
Top = -2
|
||||
Width = 108
|
||||
Anchors = [akRight]
|
||||
AutoSize = True
|
||||
BorderSpacing.Left = 6
|
||||
BorderSpacing.Right = 6
|
||||
Caption = 'KeyGrabButton'
|
||||
OnClick = KeyGrabButtonClick
|
||||
TabOrder = 4
|
||||
end
|
||||
end
|
||||
object MacrosGroupbox: TGroupBox
|
||||
AnchorSideLeft.Control = Owner
|
||||
@ -289,13 +209,13 @@ object ExternalToolOptionDlg: TExternalToolOptionDlg
|
||||
AnchorSideRight.Side = asrBottom
|
||||
AnchorSideBottom.Control = BtnPanel
|
||||
Left = 6
|
||||
Height = 172
|
||||
Top = 275
|
||||
Height = 196
|
||||
Top = 251
|
||||
Width = 649
|
||||
Anchors = [akTop, akLeft, akRight, akBottom]
|
||||
BorderSpacing.Around = 6
|
||||
Caption = 'MacrosGroupbox'
|
||||
ClientHeight = 153
|
||||
ClientHeight = 177
|
||||
ClientWidth = 645
|
||||
TabOrder = 7
|
||||
object MacrosListbox: TListBox
|
||||
@ -305,7 +225,7 @@ object ExternalToolOptionDlg: TExternalToolOptionDlg
|
||||
AnchorSideBottom.Control = MacrosGroupbox
|
||||
AnchorSideBottom.Side = asrBottom
|
||||
Left = 6
|
||||
Height = 145
|
||||
Height = 169
|
||||
Top = 2
|
||||
Width = 490
|
||||
Anchors = [akTop, akLeft, akRight, akBottom]
|
||||
|
@ -2,136 +2,107 @@
|
||||
|
||||
LazarusResources.Add('TExternalToolOptionDlg','FORMDATA',[
|
||||
'TPF0'#22'TExternalToolOptionDlg'#21'ExternalToolOptionDlg'#4'Left'#3'\'#1#6
|
||||
+'Height'#3#245#1#3'Top'#3#210#0#5'Width'#3#149#2#18'HorzScrollBar.Page'#3#148
|
||||
+#2#18'VertScrollBar.Page'#3#244#1#13'ActiveControl'#7#9'TitleEdit'#7'Caption'
|
||||
+#6#21'ExternalToolOptionDlg'#12'ClientHeight'#3#245#1#11'ClientWidth'#3#149#2
|
||||
+#21'Constraints.MinHeight'#3'^'#1#20'Constraints.MinWidth'#3'^'#1#10'KeyPrev'
|
||||
+'iew'#9#8'OnCreate'#7#10'FormCreate'#9'OnDestroy'#7#11'FormDestroy'#7'OnKeyU'
|
||||
+'p'#7#9'FormKeyUp'#8'Position'#7#14'poScreenCenter'#10'LCLVersion'#6#6'0.9.2'
|
||||
+'5'#0#6'TLabel'#10'TitleLabel'#22'AnchorSideLeft.Control'#7#5'Owner'#21'Anch'
|
||||
+'orSideTop.Control'#7#9'TitleEdit'#18'AnchorSideTop.Side'#7#9'asrCenter'#4'L'
|
||||
+'eft'#2#6#6'Height'#2#20#3'Top'#2#7#5'Width'#2'='#18'BorderSpacing.Left'#2#6
|
||||
+#7'Caption'#6#10'TitleLabel'#11'ParentColor'#8#0#0#6'TLabel'#13'FilenameLabe'
|
||||
+'l'#22'AnchorSideLeft.Control'#7#5'Owner'#21'AnchorSideTop.Control'#7#12'Fil'
|
||||
+'enameEdit'#18'AnchorSideTop.Side'#7#9'asrCenter'#4'Left'#2#6#6'Height'#2#20
|
||||
+#3'Top'#2'$'#5'Width'#2'\'#18'BorderSpacing.Left'#2#6#7'Caption'#6#13'Filena'
|
||||
+'meLabel'#11'ParentColor'#8#0#0#6'TLabel'#15'ParametersLabel'#22'AnchorSideL'
|
||||
+'eft.Control'#7#5'Owner'#21'AnchorSideTop.Control'#7#14'ParametersEdit'#18'A'
|
||||
+'nchorSideTop.Side'#7#9'asrCenter'#4'Left'#2#6#6'Height'#2#20#3'Top'#2'A'#5
|
||||
+'Width'#2'm'#18'BorderSpacing.Left'#2#6#7'Caption'#6#15'ParametersLabel'#11
|
||||
+'ParentColor'#8#0#0#6'TLabel'#15'WorkingDirLabel'#22'AnchorSideLeft.Control'
|
||||
+#7#5'Owner'#21'AnchorSideTop.Control'#7#14'WorkingDirEdit'#18'AnchorSideTop.'
|
||||
+'Side'#7#9'asrCenter'#4'Left'#2#6#6'Height'#2#20#3'Top'#2'^'#5'Width'#2'f'#18
|
||||
+'BorderSpacing.Left'#2#6#7'Caption'#6#15'WorkingDirLabel'#11'ParentColor'#8#0
|
||||
+#0#5'TEdit'#9'TitleEdit'#21'AnchorSideTop.Control'#7#5'Owner'#23'AnchorSideR'
|
||||
+'ight.Control'#7#5'Owner'#20'AnchorSideRight.Side'#7#9'asrBottom'#4'Left'#3
|
||||
+#128#0#6'Height'#2#23#3'Top'#2#6#5'Width'#3#15#2#7'Anchors'#11#5'akTop'#6'ak'
|
||||
+'Left'#7'akRight'#0#20'BorderSpacing.Around'#2#6#8'TabOrder'#2#0#4'Text'#6#9
|
||||
+'TitleEdit'#0#0#5'TEdit'#12'FilenameEdit'#22'AnchorSideLeft.Control'#7#9'Tit'
|
||||
+'leEdit'#21'AnchorSideTop.Control'#7#9'TitleEdit'#18'AnchorSideTop.Side'#7#9
|
||||
+'asrBottom'#23'AnchorSideRight.Control'#7#10'OpenButton'#4'Left'#3#128#0#6'H'
|
||||
+'eight'#2#23#3'Top'#2'#'#5'Width'#3#241#1#7'Anchors'#11#5'akTop'#6'akLeft'#7
|
||||
+'akRight'#0#17'BorderSpacing.Top'#2#6#19'BorderSpacing.Right'#2#6#8'TabOrder'
|
||||
+#2#1#4'Text'#6#12'FilenameEdit'#0#0#7'TButton'#10'OpenButton'#21'AnchorSideT'
|
||||
+'op.Control'#7#12'FilenameEdit'#23'AnchorSideRight.Control'#7#5'Owner'#20'An'
|
||||
+'chorSideRight.Side'#7#9'asrBottom'#24'AnchorSideBottom.Control'#7#12'Filena'
|
||||
+'meEdit'#21'AnchorSideBottom.Side'#7#9'asrBottom'#4'Left'#3'w'#2#6'Height'#2
|
||||
+#23#3'Top'#2'#'#5'Width'#2#24#7'Anchors'#11#5'akTop'#7'akRight'#8'akBottom'#0
|
||||
+#8'AutoSize'#9#19'BorderSpacing.Right'#2#6#7'Caption'#6#3'...'#7'OnClick'#7
|
||||
+#15'OpenButtonClick'#14'ParentShowHint'#8#8'ShowHint'#9#8'TabOrder'#2#2#0#0#5
|
||||
+'TEdit'#14'ParametersEdit'#22'AnchorSideLeft.Control'#7#9'TitleEdit'#21'Anch'
|
||||
+'orSideTop.Control'#7#12'FilenameEdit'#18'AnchorSideTop.Side'#7#9'asrBottom'
|
||||
+#23'AnchorSideRight.Control'#7#5'Owner'#20'AnchorSideRight.Side'#7#9'asrBott'
|
||||
+'om'#4'Left'#3#128#0#6'Height'#2#23#3'Top'#2'@'#5'Width'#3#15#2#7'Anchors'#11
|
||||
+#5'akTop'#6'akLeft'#7'akRight'#0#17'BorderSpacing.Top'#2#6#19'BorderSpacing.'
|
||||
+'Right'#2#6#8'TabOrder'#2#3#4'Text'#6#14'ParametersEdit'#0#0#5'TEdit'#14'Wor'
|
||||
+'kingDirEdit'#22'AnchorSideLeft.Control'#7#9'TitleEdit'#21'AnchorSideTop.Con'
|
||||
+'trol'#7#14'ParametersEdit'#18'AnchorSideTop.Side'#7#9'asrBottom'#23'AnchorS'
|
||||
+'ideRight.Control'#7#5'Owner'#20'AnchorSideRight.Side'#7#9'asrBottom'#4'Left'
|
||||
+#3#128#0#6'Height'#2#23#3'Top'#2']'#5'Width'#3#15#2#7'Anchors'#11#5'akTop'#6
|
||||
+'Height'#3#245#1#3'Top'#3#210#0#5'Width'#3#149#2#13'ActiveControl'#7#9'Title'
|
||||
+'Edit'#7'Caption'#6#21'ExternalToolOptionDlg'#12'ClientHeight'#3#245#1#11'Cl'
|
||||
+'ientWidth'#3#149#2#21'Constraints.MinHeight'#3'^'#1#20'Constraints.MinWidth'
|
||||
+#3'^'#1#10'KeyPreview'#9#8'OnCreate'#7#10'FormCreate'#9'OnDestroy'#7#11'Form'
|
||||
+'Destroy'#8'Position'#7#14'poScreenCenter'#10'LCLVersion'#6#6'0.9.25'#0#6'TL'
|
||||
+'abel'#10'TitleLabel'#22'AnchorSideLeft.Control'#7#5'Owner'#21'AnchorSideTop'
|
||||
+'.Control'#7#9'TitleEdit'#18'AnchorSideTop.Side'#7#9'asrCenter'#4'Left'#2#6#6
|
||||
+'Height'#2#20#3'Top'#2#7#5'Width'#2'='#18'BorderSpacing.Left'#2#6#7'Caption'
|
||||
+#6#10'TitleLabel'#11'ParentColor'#8#0#0#6'TLabel'#13'FilenameLabel'#22'Ancho'
|
||||
+'rSideLeft.Control'#7#5'Owner'#21'AnchorSideTop.Control'#7#12'FilenameEdit'
|
||||
+#18'AnchorSideTop.Side'#7#9'asrCenter'#4'Left'#2#6#6'Height'#2#20#3'Top'#2'$'
|
||||
+#5'Width'#2'\'#18'BorderSpacing.Left'#2#6#7'Caption'#6#13'FilenameLabel'#11
|
||||
+'ParentColor'#8#0#0#6'TLabel'#15'ParametersLabel'#22'AnchorSideLeft.Control'
|
||||
+#7#5'Owner'#21'AnchorSideTop.Control'#7#14'ParametersEdit'#18'AnchorSideTop.'
|
||||
+'Side'#7#9'asrCenter'#4'Left'#2#6#6'Height'#2#20#3'Top'#2'A'#5'Width'#2'm'#18
|
||||
+'BorderSpacing.Left'#2#6#7'Caption'#6#15'ParametersLabel'#11'ParentColor'#8#0
|
||||
+#0#6'TLabel'#15'WorkingDirLabel'#22'AnchorSideLeft.Control'#7#5'Owner'#21'An'
|
||||
+'chorSideTop.Control'#7#14'WorkingDirEdit'#18'AnchorSideTop.Side'#7#9'asrCen'
|
||||
+'ter'#4'Left'#2#6#6'Height'#2#20#3'Top'#2'^'#5'Width'#2'f'#18'BorderSpacing.'
|
||||
+'Left'#2#6#7'Caption'#6#15'WorkingDirLabel'#11'ParentColor'#8#0#0#5'TEdit'#9
|
||||
+'TitleEdit'#21'AnchorSideTop.Control'#7#5'Owner'#23'AnchorSideRight.Control'
|
||||
+#7#5'Owner'#20'AnchorSideRight.Side'#7#9'asrBottom'#4'Left'#3#128#0#6'Height'
|
||||
+#2#23#3'Top'#2#6#5'Width'#3#15#2#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'
|
||||
+#0#20'BorderSpacing.Around'#2#6#8'TabOrder'#2#0#4'Text'#6#9'TitleEdit'#0#0#5
|
||||
+'TEdit'#12'FilenameEdit'#22'AnchorSideLeft.Control'#7#9'TitleEdit'#21'Anchor'
|
||||
+'SideTop.Control'#7#9'TitleEdit'#18'AnchorSideTop.Side'#7#9'asrBottom'#23'An'
|
||||
+'chorSideRight.Control'#7#10'OpenButton'#4'Left'#3#128#0#6'Height'#2#23#3'To'
|
||||
+'p'#2'#'#5'Width'#3#241#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#17'B'
|
||||
+'orderSpacing.Top'#2#6#19'BorderSpacing.Right'#2#6#8'TabOrder'#2#1#4'Text'#6
|
||||
+#12'FilenameEdit'#0#0#7'TButton'#10'OpenButton'#21'AnchorSideTop.Control'#7
|
||||
+#12'FilenameEdit'#23'AnchorSideRight.Control'#7#5'Owner'#20'AnchorSideRight.'
|
||||
+'Side'#7#9'asrBottom'#24'AnchorSideBottom.Control'#7#12'FilenameEdit'#21'Anc'
|
||||
+'horSideBottom.Side'#7#9'asrBottom'#4'Left'#3'w'#2#6'Height'#2#23#3'Top'#2'#'
|
||||
+#5'Width'#2#24#7'Anchors'#11#5'akTop'#7'akRight'#8'akBottom'#0#8'AutoSize'#9
|
||||
+#19'BorderSpacing.Right'#2#6#7'Caption'#6#3'...'#7'OnClick'#7#15'OpenButtonC'
|
||||
+'lick'#14'ParentShowHint'#8#8'ShowHint'#9#8'TabOrder'#2#2#0#0#5'TEdit'#14'Pa'
|
||||
+'rametersEdit'#22'AnchorSideLeft.Control'#7#9'TitleEdit'#21'AnchorSideTop.Co'
|
||||
+'ntrol'#7#12'FilenameEdit'#18'AnchorSideTop.Side'#7#9'asrBottom'#23'AnchorSi'
|
||||
+'deRight.Control'#7#5'Owner'#20'AnchorSideRight.Side'#7#9'asrBottom'#4'Left'
|
||||
+#3#128#0#6'Height'#2#23#3'Top'#2'@'#5'Width'#3#15#2#7'Anchors'#11#5'akTop'#6
|
||||
+'akLeft'#7'akRight'#0#17'BorderSpacing.Top'#2#6#19'BorderSpacing.Right'#2#6#8
|
||||
+'TabOrder'#2#4#4'Text'#6#14'WorkingDirEdit'#0#0#9'TGroupBox'#15'OptionsGroup'
|
||||
+'Box'#22'AnchorSideLeft.Control'#7#5'Owner'#21'AnchorSideTop.Control'#7#14'W'
|
||||
+'orkingDirEdit'#18'AnchorSideTop.Side'#7#9'asrBottom'#23'AnchorSideRight.Con'
|
||||
+'trol'#7#5'Owner'#20'AnchorSideRight.Side'#7#9'asrBottom'#4'Left'#2#6#6'Heig'
|
||||
+'ht'#2'\'#3'Top'#2'z'#5'Width'#3#137#2#7'Anchors'#11#5'akTop'#6'akLeft'#7'ak'
|
||||
+'Right'#0#8'AutoSize'#9#20'BorderSpacing.Around'#2#6#7'Caption'#6#15'Options'
|
||||
+'GroupBox'#18'ChildSizing.Layout'#7#29'cclTopToBottomThenLeftToRight'#27'Chi'
|
||||
+'ldSizing.ControlsPerLine'#2#5#12'ClientHeight'#2'I'#11'ClientWidth'#3#133#2
|
||||
+#8'TabOrder'#2#5#0#9'TCheckBox&OptionScanOutputForFPCMessagesCheckBox'#6'Hei'
|
||||
+'ght'#2#22#5'Width'#3'C'#1#7'Caption'#6'&OptionScanOutputForFPCMessagesCheck'
|
||||
+'Box'#8'TabOrder'#2#0#0#0#9'TCheckBox''OptionScanOutputForMakeMessagesCheckB'
|
||||
+'ox'#18'AnchorSideTop.Side'#7#9'asrBottom'#21'AnchorSideBottom.Side'#7#9'asr'
|
||||
+'Bottom'#6'Height'#2#22#3'Top'#2#22#5'Width'#3'C'#1#7'Caption'#6'''OptionSca'
|
||||
+'nOutputForMakeMessagesCheckBox'#8'TabOrder'#2#1#0#0#7'TButton'#14'ScannersB'
|
||||
+'utton'#6'Height'#2#29#3'Top'#2','#5'Width'#3'C'#1#7'Caption'#6#14'ScannersB'
|
||||
,'utton'#7'OnClick'#7#19'ScannersButtonClick'#8'TabOrder'#2#2#0#0#0#9'TGroupB'
|
||||
+'ox'#11'KeyGroupBox'#22'AnchorSideLeft.Control'#7#15'OptionsGroupBox'#21'Anc'
|
||||
+'horSideTop.Control'#7#15'OptionsGroupBox'#18'AnchorSideTop.Side'#7#9'asrBot'
|
||||
+'tom'#23'AnchorSideRight.Control'#7#15'OptionsGroupBox'#20'AnchorSideRight.S'
|
||||
+'ide'#7#9'asrBottom'#4'Left'#2#6#6'Height'#2'1'#3'Top'#3#220#0#5'Width'#3#137
|
||||
+#2#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#8'AutoSize'#9#17'BorderSpac'
|
||||
+'ing.Top'#2#6#7'Caption'#6#11'KeyGroupBox'#12'ClientHeight'#2#30#11'ClientWi'
|
||||
+'dth'#3#133#2#8'TabOrder'#2#6#0#9'TCheckBox'#15'KeyCtrlCheckBox'#22'AnchorSi'
|
||||
+'deLeft.Control'#7#11'KeyGroupBox'#21'AnchorSideTop.Control'#7#11'KeyGroupBo'
|
||||
+'x'#24'AnchorSideBottom.Control'#7#11'KeyGroupBox'#21'AnchorSideBottom.Side'
|
||||
+#7#9'asrBottom'#4'Left'#2#6#6'Height'#2#22#3'Top'#2#2#5'Width'#3#131#0#7'Anc'
|
||||
+'hors'#11#5'akTop'#6'akLeft'#8'akBottom'#0#18'BorderSpacing.Left'#2#6#17'Bor'
|
||||
+'derSpacing.Top'#2#2#20'BorderSpacing.Bottom'#2#6#7'Caption'#6#15'KeyCtrlChe'
|
||||
+'ckBox'#8'TabOrder'#2#0#0#0#9'TCheckBox'#14'KeyAltCheckBox'#22'AnchorSideLef'
|
||||
+'t.Control'#7#15'KeyCtrlCheckBox'#19'AnchorSideLeft.Side'#7#9'asrBottom'#21
|
||||
+'AnchorSideTop.Control'#7#15'KeyCtrlCheckBox'#4'Left'#3#143#0#6'Height'#2#22
|
||||
+#3'Top'#2#2#5'Width'#2'~'#18'BorderSpacing.Left'#2#6#7'Caption'#6#14'KeyAltC'
|
||||
+'heckBox'#8'TabOrder'#2#1#0#0#9'TCheckBox'#16'KeyShiftCheckBox'#22'AnchorSid'
|
||||
+'eLeft.Control'#7#14'KeyAltCheckBox'#19'AnchorSideLeft.Side'#7#9'asrBottom'
|
||||
+#21'AnchorSideTop.Control'#7#15'KeyCtrlCheckBox'#4'Left'#3#19#1#6'Height'#2
|
||||
+#22#3'Top'#2#2#5'Width'#3#138#0#18'BorderSpacing.Left'#2#6#7'Caption'#6#16'K'
|
||||
+'eyShiftCheckBox'#8'TabOrder'#2#2#0#0#9'TComboBox'#11'KeyComboBox'#22'Anchor'
|
||||
+'SideLeft.Control'#7#16'KeyShiftCheckBox'#19'AnchorSideLeft.Side'#7#9'asrBot'
|
||||
+'tom'#21'AnchorSideTop.Control'#7#15'KeyCtrlCheckBox'#18'AnchorSideTop.Side'
|
||||
+#7#9'asrCenter'#23'AnchorSideRight.Control'#7#13'KeyGrabButton'#4'Left'#3#163
|
||||
+#1#6'Height'#2#29#3'Top'#2#255#5'Width'#2'j'#7'Anchors'#11#5'akTop'#6'akLeft'
|
||||
+#7'akRight'#0#16'AutoCompleteText'#11#22'cbactEndOfLineComplete'#20'cbactSea'
|
||||
+'rchAscending'#0#18'BorderSpacing.Left'#2#6#19'BorderSpacing.Right'#2#6#9'Ma'
|
||||
+'xLength'#2#0#8'TabOrder'#2#3#4'Text'#6#11'KeyComboBox'#0#0#7'TButton'#13'Ke'
|
||||
+'yGrabButton'#21'AnchorSideTop.Control'#7#15'KeyCtrlCheckBox'#18'AnchorSideT'
|
||||
+'op.Side'#7#9'asrCenter'#23'AnchorSideRight.Control'#7#11'KeyGroupBox'#20'An'
|
||||
+'chorSideRight.Side'#7#9'asrBottom'#21'AnchorSideBottom.Side'#7#9'asrBottom'
|
||||
+#4'Left'#3#19#2#6'Height'#2#29#3'Top'#2#254#5'Width'#2'l'#7'Anchors'#11#7'ak'
|
||||
+'Right'#0#8'AutoSize'#9#18'BorderSpacing.Left'#2#6#19'BorderSpacing.Right'#2
|
||||
+#6#7'Caption'#6#13'KeyGrabButton'#7'OnClick'#7#18'KeyGrabButtonClick'#8'TabO'
|
||||
+'rder'#2#4#0#0#0#9'TGroupBox'#14'MacrosGroupbox'#22'AnchorSideLeft.Control'#7
|
||||
+#5'Owner'#21'AnchorSideTop.Control'#7#11'KeyGroupBox'#18'AnchorSideTop.Side'
|
||||
+#7#9'asrBottom'#23'AnchorSideRight.Control'#7#5'Owner'#20'AnchorSideRight.Si'
|
||||
+'de'#7#9'asrBottom'#24'AnchorSideBottom.Control'#7#8'BtnPanel'#4'Left'#2#6#6
|
||||
+'Height'#3#172#0#3'Top'#3#19#1#5'Width'#3#137#2#7'Anchors'#11#5'akTop'#6'akL'
|
||||
+'eft'#7'akRight'#8'akBottom'#0#20'BorderSpacing.Around'#2#6#7'Caption'#6#14
|
||||
+'MacrosGroupbox'#12'ClientHeight'#3#153#0#11'ClientWidth'#3#133#2#8'TabOrder'
|
||||
+#2#7#0#8'TListBox'#13'MacrosListbox'#22'AnchorSideLeft.Control'#7#14'MacrosG'
|
||||
+'roupbox'#21'AnchorSideTop.Control'#7#18'MacrosInsertButton'#23'AnchorSideRi'
|
||||
+'ght.Control'#7#18'MacrosInsertButton'#24'AnchorSideBottom.Control'#7#14'Mac'
|
||||
+'rosGroupbox'#21'AnchorSideBottom.Side'#7#9'asrBottom'#4'Left'#2#6#6'Height'
|
||||
+#3#145#0#3'Top'#2#2#5'Width'#3#234#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRi'
|
||||
+'ght'#8'akBottom'#0#18'BorderSpacing.Left'#2#6#19'BorderSpacing.Right'#2#6#20
|
||||
+'BorderSpacing.Bottom'#2#6#7'OnClick'#7#18'MacrosListboxClick'#8'TabOrder'#2
|
||||
+#0#8'TopIndex'#2#255#0#0#7'TButton'#18'MacrosInsertButton'#21'AnchorSideTop.'
|
||||
+'Control'#7#14'MacrosGroupbox'#23'AnchorSideRight.Control'#7#14'MacrosGroupb'
|
||||
+'ox'#20'AnchorSideRight.Side'#7#9'asrBottom'#4'Left'#3#246#1#6'Height'#2#29#3
|
||||
+'Top'#2#2#5'Width'#3#137#0#7'Anchors'#11#5'akTop'#7'akRight'#0#8'AutoSize'#9
|
||||
+#17'BorderSpacing.Top'#2#2#19'BorderSpacing.Right'#2#6#7'Caption'#6#18'Macro'
|
||||
+'sInsertButton'#7'Enabled'#8#7'OnClick'#7#23'MacrosInsertButtonClick'#8'TabO'
|
||||
+'rder'#2#1#0#0#0#6'TPanel'#8'BtnPanel'#6'Height'#2'0'#3'Top'#3#197#1#5'Width'
|
||||
+#3#149#2#5'Align'#7#8'alBottom'#8'AutoSize'#9#10'BevelOuter'#7#6'bvNone'#12
|
||||
+'ClientHeight'#2'0'#11'ClientWidth'#3#149#2#8'TabOrder'#2#8#0#7'TBitBtn'#8'O'
|
||||
+'KButton'#21'AnchorSideBottom.Side'#7#9'asrBottom'#4'Left'#3#245#1#6'Height'
|
||||
+#2'$'#3'Top'#2#6#5'Width'#2'I'#5'Align'#7#7'alRight'#20'BorderSpacing.Around'
|
||||
+#2#6#7'Caption'#6#2'Ok'#7'Default'#9#4'Kind'#7#4'bkOK'#11'ModalResult'#2#1#9
|
||||
+'NumGlyphs'#2#0#7'OnClick'#7#13'OKButtonClick'#8'TabOrder'#2#0#0#0#7'TBitBtn'
|
||||
+#12'CancelButton'#20'AnchorSideRight.Side'#7#9'asrBottom'#21'AnchorSideBotto'
|
||||
+'m.Side'#7#9'asrBottom'#4'Left'#3'D'#2#6'Height'#2'$'#3'Top'#2#6#5'Width'#2
|
||||
,'K'#5'Align'#7#7'alRight'#20'BorderSpacing.Around'#2#6#6'Cancel'#9#7'Caption'
|
||||
+#6#6'Cancel'#4'Kind'#7#8'bkCancel'#11'ModalResult'#2#2#9'NumGlyphs'#2#0#8'Ta'
|
||||
+'bOrder'#2#1#0#0#0#11'TOpenDialog'#10'OpenDialog'#7'Options'#11#15'ofPathMus'
|
||||
+'tExist'#15'ofFileMustExist'#14'ofEnableSizing'#12'ofViewDetail'#0#4'left'#2
|
||||
+'X'#3'top'#2' '#0#0#0
|
||||
+'TabOrder'#2#3#4'Text'#6#14'ParametersEdit'#0#0#5'TEdit'#14'WorkingDirEdit'
|
||||
+#22'AnchorSideLeft.Control'#7#9'TitleEdit'#21'AnchorSideTop.Control'#7#14'Pa'
|
||||
+'rametersEdit'#18'AnchorSideTop.Side'#7#9'asrBottom'#23'AnchorSideRight.Cont'
|
||||
+'rol'#7#5'Owner'#20'AnchorSideRight.Side'#7#9'asrBottom'#4'Left'#3#128#0#6'H'
|
||||
+'eight'#2#23#3'Top'#2']'#5'Width'#3#15#2#7'Anchors'#11#5'akTop'#6'akLeft'#7
|
||||
+'akRight'#0#17'BorderSpacing.Top'#2#6#19'BorderSpacing.Right'#2#6#8'TabOrder'
|
||||
+#2#4#4'Text'#6#14'WorkingDirEdit'#0#0#9'TGroupBox'#15'OptionsGroupBox'#22'An'
|
||||
+'chorSideLeft.Control'#7#5'Owner'#21'AnchorSideTop.Control'#7#14'WorkingDirE'
|
||||
+'dit'#18'AnchorSideTop.Side'#7#9'asrBottom'#23'AnchorSideRight.Control'#7#5
|
||||
+'Owner'#20'AnchorSideRight.Side'#7#9'asrBottom'#4'Left'#2#6#6'Height'#2'\'#3
|
||||
+'Top'#2'z'#5'Width'#3#137#2#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#8
|
||||
+'AutoSize'#9#20'BorderSpacing.Around'#2#6#7'Caption'#6#15'OptionsGroupBox'#18
|
||||
+'ChildSizing.Layout'#7#29'cclTopToBottomThenLeftToRight'#27'ChildSizing.Cont'
|
||||
+'rolsPerLine'#2#5#12'ClientHeight'#2'I'#11'ClientWidth'#3#133#2#8'TabOrder'#2
|
||||
+#5#0#9'TCheckBox&OptionScanOutputForFPCMessagesCheckBox'#6'Height'#2#22#5'Wi'
|
||||
+'dth'#3'C'#1#7'Caption'#6'&OptionScanOutputForFPCMessagesCheckBox'#8'TabOrde'
|
||||
+'r'#2#0#0#0#9'TCheckBox''OptionScanOutputForMakeMessagesCheckBox'#18'AnchorS'
|
||||
+'ideTop.Side'#7#9'asrBottom'#21'AnchorSideBottom.Side'#7#9'asrBottom'#6'Heig'
|
||||
+'ht'#2#22#3'Top'#2#22#5'Width'#3'C'#1#7'Caption'#6'''OptionScanOutputForMake'
|
||||
+'MessagesCheckBox'#8'TabOrder'#2#1#0#0#7'TButton'#14'ScannersButton'#6'Heigh'
|
||||
+'t'#2#29#3'Top'#2','#5'Width'#3'C'#1#7'Caption'#6#14'ScannersButton'#7'OnCli'
|
||||
+'ck'#7#19'ScannersButtonClick'#8'TabOrder'#2#2#0#0#0#9'TGroupBox'#11'KeyGrou'
|
||||
,'pBox'#22'AnchorSideLeft.Control'#7#15'OptionsGroupBox'#21'AnchorSideTop.Con'
|
||||
+'trol'#7#15'OptionsGroupBox'#18'AnchorSideTop.Side'#7#9'asrBottom'#23'Anchor'
|
||||
+'SideRight.Control'#7#15'OptionsGroupBox'#20'AnchorSideRight.Side'#7#9'asrBo'
|
||||
+'ttom'#4'Left'#2#6#6'Height'#2#25#3'Top'#3#220#0#5'Width'#3#137#2#7'Anchors'
|
||||
+#11#5'akTop'#6'akLeft'#7'akRight'#0#8'AutoSize'#9#17'BorderSpacing.Top'#2#6#7
|
||||
+'Caption'#6#11'KeyGroupBox'#21'Constraints.MinHeight'#2#25#8'TabOrder'#2#6#0
|
||||
+#0#9'TGroupBox'#14'MacrosGroupbox'#22'AnchorSideLeft.Control'#7#5'Owner'#21
|
||||
+'AnchorSideTop.Control'#7#11'KeyGroupBox'#18'AnchorSideTop.Side'#7#9'asrBott'
|
||||
+'om'#23'AnchorSideRight.Control'#7#5'Owner'#20'AnchorSideRight.Side'#7#9'asr'
|
||||
+'Bottom'#24'AnchorSideBottom.Control'#7#8'BtnPanel'#4'Left'#2#6#6'Height'#3
|
||||
+#196#0#3'Top'#3#251#0#5'Width'#3#137#2#7'Anchors'#11#5'akTop'#6'akLeft'#7'ak'
|
||||
+'Right'#8'akBottom'#0#20'BorderSpacing.Around'#2#6#7'Caption'#6#14'MacrosGro'
|
||||
+'upbox'#12'ClientHeight'#3#177#0#11'ClientWidth'#3#133#2#8'TabOrder'#2#7#0#8
|
||||
+'TListBox'#13'MacrosListbox'#22'AnchorSideLeft.Control'#7#14'MacrosGroupbox'
|
||||
+#21'AnchorSideTop.Control'#7#18'MacrosInsertButton'#23'AnchorSideRight.Contr'
|
||||
+'ol'#7#18'MacrosInsertButton'#24'AnchorSideBottom.Control'#7#14'MacrosGroupb'
|
||||
+'ox'#21'AnchorSideBottom.Side'#7#9'asrBottom'#4'Left'#2#6#6'Height'#3#169#0#3
|
||||
+'Top'#2#2#5'Width'#3#234#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#8'akB'
|
||||
+'ottom'#0#18'BorderSpacing.Left'#2#6#19'BorderSpacing.Right'#2#6#20'BorderSp'
|
||||
+'acing.Bottom'#2#6#7'OnClick'#7#18'MacrosListboxClick'#8'TabOrder'#2#0#8'Top'
|
||||
+'Index'#2#255#0#0#7'TButton'#18'MacrosInsertButton'#21'AnchorSideTop.Control'
|
||||
+#7#14'MacrosGroupbox'#23'AnchorSideRight.Control'#7#14'MacrosGroupbox'#20'An'
|
||||
+'chorSideRight.Side'#7#9'asrBottom'#4'Left'#3#246#1#6'Height'#2#29#3'Top'#2#2
|
||||
+#5'Width'#3#137#0#7'Anchors'#11#5'akTop'#7'akRight'#0#8'AutoSize'#9#17'Borde'
|
||||
+'rSpacing.Top'#2#2#19'BorderSpacing.Right'#2#6#7'Caption'#6#18'MacrosInsertB'
|
||||
+'utton'#7'Enabled'#8#7'OnClick'#7#23'MacrosInsertButtonClick'#8'TabOrder'#2#1
|
||||
+#0#0#0#6'TPanel'#8'BtnPanel'#6'Height'#2'0'#3'Top'#3#197#1#5'Width'#3#149#2#5
|
||||
+'Align'#7#8'alBottom'#8'AutoSize'#9#10'BevelOuter'#7#6'bvNone'#12'ClientHeig'
|
||||
+'ht'#2'0'#11'ClientWidth'#3#149#2#8'TabOrder'#2#8#0#7'TBitBtn'#8'OKButton'#21
|
||||
+'AnchorSideBottom.Side'#7#9'asrBottom'#4'Left'#3#245#1#6'Height'#2'$'#3'Top'
|
||||
+#2#6#5'Width'#2'I'#5'Align'#7#7'alRight'#20'BorderSpacing.Around'#2#6#7'Capt'
|
||||
+'ion'#6#2'Ok'#7'Default'#9#4'Kind'#7#4'bkOK'#11'ModalResult'#2#1#9'NumGlyphs'
|
||||
+#2#0#7'OnClick'#7#13'OKButtonClick'#8'TabOrder'#2#0#0#0#7'TBitBtn'#12'Cancel'
|
||||
+'Button'#20'AnchorSideRight.Side'#7#9'asrBottom'#21'AnchorSideBottom.Side'#7
|
||||
+#9'asrBottom'#4'Left'#3'D'#2#6'Height'#2'$'#3'Top'#2#6#5'Width'#2'K'#5'Align'
|
||||
+#7#7'alRight'#20'BorderSpacing.Around'#2#6#6'Cancel'#9#7'Caption'#6#6'Cancel'
|
||||
+#4'Kind'#7#8'bkCancel'#11'ModalResult'#2#2#9'NumGlyphs'#2#0#8'TabOrder'#2#1#0
|
||||
+#0#0#11'TOpenDialog'#10'OpenDialog'#7'Options'#11#15'ofPathMustExist'#15'ofF'
|
||||
+'ileMustExist'#14'ofEnableSizing'#12'ofViewDetail'#0#4'left'#2'X'#3'top'#2' '
|
||||
+#0#0#0
|
||||
]);
|
||||
|
@ -45,7 +45,8 @@ uses
|
||||
Classes, SysUtils, LCLType, Controls, Forms, Buttons, StdCtrls, ComCtrls,
|
||||
Dialogs, LResources, ExtCtrls, LCLProc,
|
||||
IDEMsgIntf, IDEExternToolIntf,
|
||||
KeyMapping, TransferMacros, LazarusIDEStrConsts, EditMsgScannersDlg;
|
||||
KeyMapping, KeyMapShortCutDlg, TransferMacros, LazarusIDEStrConsts,
|
||||
EditMsgScannersDlg;
|
||||
|
||||
type
|
||||
{ TExternalToolOptions }
|
||||
@ -82,11 +83,6 @@ type
|
||||
OptionScanOutputForFPCMessagesCheckBox: TCheckBox;
|
||||
OptionScanOutputForMakeMessagesCheckBox: TCheckBox;
|
||||
KeyGroupBox: TGroupBox;
|
||||
KeyCtrlCheckBox: TCheckBox;
|
||||
KeyAltCheckBox: TCheckBox;
|
||||
KeyShiftCheckBox: TCheckBox;
|
||||
KeyComboBox: TComboBox;
|
||||
KeyGrabButton: TButton;
|
||||
MacrosGroupbox: TGroupbox;
|
||||
MacrosListbox: TListbox;
|
||||
MacrosInsertButton: TButton;
|
||||
@ -94,8 +90,6 @@ type
|
||||
CancelButton: TBitBtn;
|
||||
procedure FormCreate(Sender: TObject);
|
||||
procedure FormDestroy(Sender: TObject);
|
||||
procedure FormKeyUp(Sender: TObject; var Key: Word; Shift:TShiftState);
|
||||
procedure KeyGrabButtonClick(Sender: TObject);
|
||||
procedure MacrosInsertButtonClick(Sender: TObject);
|
||||
procedure MacrosListboxClick(Sender: TObject);
|
||||
procedure OKButtonClick(Sender: TObject);
|
||||
@ -105,9 +99,7 @@ type
|
||||
fOptions: TExternalToolOptions;
|
||||
fTransferMacros: TTransferMacroList;
|
||||
fScanners: TStrings;
|
||||
GrabbingKey: integer; // 0=none, 1=Default key
|
||||
procedure ActivateGrabbing(AGrabbingKey: integer);
|
||||
procedure DeactivateGrabbing;
|
||||
fKeyBox: TShortCutGrabBox;
|
||||
procedure FillMacroList;
|
||||
procedure LoadFromOptions;
|
||||
procedure SaveToOptions;
|
||||
@ -168,16 +160,8 @@ begin
|
||||
fOptions.Filename:=FilenameEdit.Text;
|
||||
fOptions.CmdLineParams:=ParametersEdit.Text;
|
||||
fOptions.WorkingDirectory:=WorkingDirEdit.Text;
|
||||
fOptions.Key:=EditorKeyStringToVKCode(KeyComboBox.Text);
|
||||
fOptions.Shift:=[];
|
||||
if fOptions.Key<>VK_UNKNOWN then begin
|
||||
if KeyCtrlCheckBox.Checked then
|
||||
fOptions.Shift := fOptions.Shift + [ssCtrl];
|
||||
if KeyAltCheckBox.Checked then
|
||||
fOptions.Shift := fOptions.Shift + [ssAlt];
|
||||
if KeyShiftCheckBox.Checked then
|
||||
fOptions.Shift := fOptions.Shift + [ssShift];
|
||||
end;
|
||||
fOptions.Key:=fKeyBox.Key;
|
||||
fOptions.Shift:=fKeyBox.ShiftState;
|
||||
fOptions.ScanOutputForFPCMessages:=
|
||||
OptionScanOutputForFPCMessagesCheckBox.Checked;
|
||||
fOptions.ScanOutputForMakeMessages:=
|
||||
@ -222,10 +206,8 @@ begin
|
||||
FilenameEdit.Text:=fOptions.Filename;
|
||||
ParametersEdit.Text:=fOptions.CmdLineParams;
|
||||
WorkingDirEdit.Text:=fOptions.WorkingDirectory;
|
||||
SetComboBox(KeyComboBox,KeyAndShiftStateToEditorKeyString(fOptions.Key,[]));
|
||||
KeyCtrlCheckBox.Checked:=(ssCtrl in fOptions.Shift);
|
||||
KeyShiftCheckBox.Checked:=(ssShift in fOptions.Shift);
|
||||
KeyAltCheckBox.Checked:=(ssAlt in fOptions.Shift);
|
||||
fKeyBox.Key:=fOptions.Key;
|
||||
fKeyBox.ShiftState:=fOptions.Shift;
|
||||
OptionScanOutputForFPCMessagesCheckBox.Checked:=
|
||||
fOptions.ScanOutputForFPCMessages;
|
||||
OptionScanOutputForMakeMessagesCheckBox.Checked:=
|
||||
@ -235,12 +217,8 @@ begin
|
||||
end;
|
||||
|
||||
procedure TExternalToolOptionDlg.FormCreate(Sender: TObject);
|
||||
var
|
||||
i: word;
|
||||
s: string;
|
||||
begin
|
||||
fScanners:=TStringList.Create;
|
||||
GrabbingKey:=0;
|
||||
Caption:=lisEdtExtToolEditTool;
|
||||
|
||||
TitleLabel.Caption:=dlgPOTitle;
|
||||
@ -269,30 +247,14 @@ begin
|
||||
with KeyGroupBox do
|
||||
Caption:=lisEdtExtToolKey;
|
||||
|
||||
with KeyCtrlCheckBox do
|
||||
Caption:=lisEdtExtToolCtrl;
|
||||
|
||||
with KeyAltCheckBox do
|
||||
Caption:=lisEdtExtToolAlt;
|
||||
|
||||
with KeyShiftCheckBox do
|
||||
Caption:=lisEdtExtToolShift;
|
||||
|
||||
with KeyComboBox do begin
|
||||
Items.BeginUpdate;
|
||||
Items.Add(srVK_NONE);
|
||||
for i:=1 to 145 do begin
|
||||
s:=KeyAndShiftStateToEditorKeyString(i,[]);
|
||||
if not EditorKeyStringIsIrregular(s) then
|
||||
Items.Add(s);
|
||||
end;
|
||||
Items.EndUpdate;
|
||||
ItemIndex:=0;
|
||||
fKeyBox:=TShortCutGrabBox.Create(Self);
|
||||
with fKeyBox do begin
|
||||
Name:='fKeyBox';
|
||||
Align:=alClient;
|
||||
BorderSpacing.Around:=6;
|
||||
Parent:=KeyGroupBox;
|
||||
end;
|
||||
|
||||
with KeyGrabButton do
|
||||
Caption:=srkmGrabKey;
|
||||
|
||||
with MacrosGroupbox do
|
||||
Caption:=lisEdtExtToolMacros;
|
||||
|
||||
@ -311,11 +273,6 @@ begin
|
||||
FreeAndNil(fScanners);
|
||||
end;
|
||||
|
||||
procedure TExternalToolOptionDlg.KeyGrabButtonClick(Sender: TObject);
|
||||
begin
|
||||
ActivateGrabbing(1);
|
||||
end;
|
||||
|
||||
procedure TExternalToolOptionDlg.SetOptions(TheOptions: TExternalToolOptions);
|
||||
begin
|
||||
if fOptions=TheOptions then exit;
|
||||
@ -364,58 +321,6 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TExternalToolOptionDlg.DeactivateGrabbing;
|
||||
var i: integer;
|
||||
begin
|
||||
if GrabbingKey=0 then exit;
|
||||
// enable all components
|
||||
for i:=0 to ComponentCount-1 do begin
|
||||
if (Components[i] is TWinControl) then
|
||||
TWinControl(Components[i]).Enabled:=true;
|
||||
end;
|
||||
if GrabbingKey=1 then
|
||||
KeyGrabButton.Caption:=srkmGrabKey;
|
||||
GrabbingKey:=0;
|
||||
end;
|
||||
|
||||
procedure TExternalToolOptionDlg.ActivateGrabbing(AGrabbingKey: integer);
|
||||
var i: integer;
|
||||
begin
|
||||
if GrabbingKey>0 then exit;
|
||||
GrabbingKey:=AGrabbingKey;
|
||||
if GrabbingKey=0 then exit;
|
||||
// disable all components
|
||||
for i:=0 to ComponentCount-1 do begin
|
||||
if (Components[i] is TWinControl) then begin
|
||||
if ((GrabbingKey=1) and (Components[i]<>KeyGrabButton)
|
||||
and (Components[i]<>KeyGroupBox)) then
|
||||
TWinControl(Components[i]).Enabled:=false;
|
||||
end;
|
||||
end;
|
||||
if GrabbingKey=1 then
|
||||
KeyGrabButton.Caption:=srkmPressKey;
|
||||
end;
|
||||
|
||||
procedure TExternalToolOptionDlg.FormKeyUp(Sender: TObject; var Key: Word;
|
||||
Shift:TShiftState);
|
||||
begin
|
||||
//writeln('TExternalToolOptionDlg.FormKeyUp Sender=',Classname
|
||||
// ,' Key=',Key,' Ctrl=',ssCtrl in Shift,' Shift=',ssShift in Shift
|
||||
// ,' Alt=',ssAlt in Shift,' AsString=',KeyAndShiftStateToStr(Key,Shift)
|
||||
// );
|
||||
if Key in [VK_CONTROL, VK_SHIFT, VK_LCONTROL, VK_RCONTROl,
|
||||
VK_LSHIFT, VK_RSHIFT] then exit;
|
||||
if (GrabbingKey in [1]) then begin
|
||||
if GrabbingKey=1 then begin
|
||||
KeyCtrlCheckBox.Checked:=(ssCtrl in Shift);
|
||||
KeyShiftCheckBox.Checked:=(ssShift in Shift);
|
||||
KeyAltCheckBox.Checked:=(ssAlt in Shift);
|
||||
SetComboBox(KeyComboBox,KeyAndShiftStateToEditorKeyString(Key,[]));
|
||||
end;
|
||||
DeactivateGrabbing;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TExternalToolOptionDlg.MacrosInsertButtonClick(Sender: TObject);
|
||||
var i: integer;
|
||||
s: string;
|
||||
|
@ -36,7 +36,7 @@ uses
|
||||
Forms, Classes, SysUtils, Buttons, LResources, StdCtrls, Controls,
|
||||
Dialogs, StringHashList, ExtCtrls,
|
||||
SynEditKeyCmds, Laz_XMLCfg,
|
||||
LazarusIDEStrConsts, IDECommands;
|
||||
IDECommands, LazarusIDEStrConsts;
|
||||
|
||||
type
|
||||
TKeyMapScheme = (
|
||||
@ -136,159 +136,10 @@ type
|
||||
property Relations[Index:integer]:TKeyCommandRelation read GetRelation; default;
|
||||
property RelationCount:integer read GetRelationCount;
|
||||
end;
|
||||
|
||||
|
||||
{ TCustomShortCutGrabBox }
|
||||
|
||||
TCustomShortCutGrabBox = class(TCustomPanel)
|
||||
private
|
||||
FAllowedShifts: TShiftState;
|
||||
FGrabButton: TButton;
|
||||
FKey: Word;
|
||||
FKeyComboBox: TComboBox;
|
||||
FShiftButtons: TShiftState;
|
||||
FShiftState: TShiftState;
|
||||
FCheckBoxes: array[TShiftStateEnum] of TCheckBox;
|
||||
FGrabForm: TForm;
|
||||
function GetShiftCheckBox(Shift: TShiftStateEnum): TCheckBox;
|
||||
procedure SetAllowedShifts(const AValue: TShiftState);
|
||||
procedure SetKey(const AValue: Word);
|
||||
procedure SetShiftButtons(const AValue: TShiftState);
|
||||
procedure SetShiftState(const AValue: TShiftState);
|
||||
procedure OnGrabButtonClick(Sender: TObject);
|
||||
procedure OnShitCheckBoxClick(Sender: TObject);
|
||||
procedure OnGrabFormKeyDown(Sender: TObject; var AKey: Word;
|
||||
AShift: TShiftState);
|
||||
procedure OnKeyComboboxEditingDone(Sender: TObject);
|
||||
protected
|
||||
procedure Loaded; override;
|
||||
procedure UpdateShiftButons;
|
||||
procedure Notification(AComponent: TComponent; Operation: TOperation);
|
||||
override;
|
||||
function ShiftToStr(s: TShiftStateEnum): string;
|
||||
public
|
||||
constructor Create(TheOwner: TComponent); override;
|
||||
function GetDefaultShiftButtons: TShiftState;
|
||||
property ShiftState: TShiftState read FShiftState write SetShiftState;
|
||||
property Key: Word read FKey write SetKey;
|
||||
property ShiftButtons: TShiftState read FShiftButtons write SetShiftButtons;
|
||||
property AllowedShifts: TShiftState read FAllowedShifts write SetAllowedShifts;
|
||||
property KeyComboBox: TComboBox read FKeyComboBox;
|
||||
property GrabButton: TButton read FGrabButton;
|
||||
property ShiftCheckBox[Shift: TShiftStateEnum]: TCheckBox read GetShiftCheckBox;
|
||||
end;
|
||||
|
||||
{ TShortCutGrabBox }
|
||||
|
||||
TShortCutGrabBox = class(TCustomShortCutGrabBox)
|
||||
published
|
||||
property Align;
|
||||
property Alignment;
|
||||
property Anchors;
|
||||
property AutoSize;
|
||||
property BorderSpacing;
|
||||
property BevelInner;
|
||||
property BevelOuter;
|
||||
property BevelWidth;
|
||||
property BorderWidth;
|
||||
property BorderStyle;
|
||||
property Caption;
|
||||
property ChildSizing;
|
||||
property ClientHeight;
|
||||
property ClientWidth;
|
||||
property Color;
|
||||
property Constraints;
|
||||
property DockSite;
|
||||
property DragCursor;
|
||||
property DragKind;
|
||||
property DragMode;
|
||||
property Enabled;
|
||||
property Font;
|
||||
property FullRepaint;
|
||||
property ParentColor;
|
||||
property ParentFont;
|
||||
property ParentShowHint;
|
||||
property PopupMenu;
|
||||
property ShowHint;
|
||||
property TabOrder;
|
||||
property TabStop;
|
||||
property UseDockManager default True;
|
||||
property Visible;
|
||||
property OnClick;
|
||||
property OnDockDrop;
|
||||
property OnDockOver;
|
||||
property OnDblClick;
|
||||
property OnDragDrop;
|
||||
property OnDragOver;
|
||||
property OnEndDock;
|
||||
property OnEndDrag;
|
||||
property OnEnter;
|
||||
property OnExit;
|
||||
property OnGetSiteInfo;
|
||||
property OnGetDockCaption;
|
||||
property OnMouseDown;
|
||||
property OnMouseMove;
|
||||
property OnMouseUp;
|
||||
property OnResize;
|
||||
property OnStartDock;
|
||||
property OnStartDrag;
|
||||
property OnUnDock;
|
||||
end;
|
||||
|
||||
|
||||
TKMEditFormMode = (
|
||||
kmefmEdit,
|
||||
kmefmGrab
|
||||
);
|
||||
|
||||
{ TKeyMappingEditForm - form for editing one command - key relationship }
|
||||
|
||||
TKeyMappingEditForm = class(TForm)
|
||||
public
|
||||
OkButton: TButton;
|
||||
CancelButton: TButton;
|
||||
CommandLabel: TLabel;
|
||||
KeyGroupBox: array[0..1] of TGroupBox;
|
||||
KeyCtrlCheckBox: array[0..3] of TCheckBox;
|
||||
KeyAltCheckBox: array[0..3] of TCheckBox;
|
||||
KeyShiftCheckBox: array[0..3] of TCheckBox;
|
||||
KeyComboBox: array[0..3] of TComboBox;
|
||||
KeyGrabButton: array[0..3] of TButton;
|
||||
procedure OkButtonClick(Sender: TObject);
|
||||
procedure CancelButtonClick(Sender: TObject);
|
||||
procedure KeyGrabButtonClick(Sender: TObject);
|
||||
protected
|
||||
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
|
||||
private
|
||||
FMode: TKMEditFormMode;
|
||||
GrabbingKey: integer; { 0=none,
|
||||
1=Default key (1st in sequence),
|
||||
2=Default key (second in sequence),
|
||||
3=Alternative key (1st in sequence)
|
||||
4=Alternative key (second in sequence) }
|
||||
procedure ActivateGrabbing(AGrabbingKey: integer);
|
||||
procedure DeactivateGrabbing;
|
||||
procedure SetComboBox(AComboBox: TComboBox; const AValue: string);
|
||||
function ResolveConflicts(Key: TIDEShortCut; Scope: TIDECommandScope): boolean;
|
||||
procedure SetMode(const AValue: TKMEditFormMode);
|
||||
procedure SetupFindView;
|
||||
procedure CheckEditModeInput;
|
||||
procedure CheckGrabModeInput;
|
||||
public
|
||||
constructor Create(TheOwner: TComponent); override;
|
||||
KeyCommandRelationList: TKeyCommandRelationList;
|
||||
KeyIndex: integer;
|
||||
NewKeyA, NewKeyB: TIDEShortCut;
|
||||
property Mode: TKMEditFormMode read FMode write SetMode;
|
||||
end;
|
||||
|
||||
function KeyAndShiftStateToEditorKeyString(
|
||||
Key: word; ShiftState: TShiftState): String;
|
||||
function KeyAndShiftStateToEditorKeyString(const Key: TIDEShortCut): String;
|
||||
function ShowKeyMappingEditForm(Index: integer;
|
||||
AKeyCommandRelationList: TKeyCommandRelationList): TModalResult;
|
||||
function ShowKeyMappingGrabForm(AKeyCommandRelationList: TKeyCommandRelationList;
|
||||
out Key: TIDEShortCut): TModalResult;
|
||||
function FindKeymapConflicts(Keymap: TKeyCommandRelationList;
|
||||
Protocol: TStrings; out Index1, Index2: integer): integer;
|
||||
function EditorCommandToDescriptionString(cmd: word): String;
|
||||
@ -308,8 +159,6 @@ function ShiftStateToStr(Shift: TShiftState): string;
|
||||
function KeyValuesToStr(const ShortcutA, ShortcutB: TIDEShortCut): string;
|
||||
function EditorKeyStringIsIrregular(const s: string): boolean;
|
||||
|
||||
var KeyMappingEditForm: TKeyMappingEditForm = nil;
|
||||
|
||||
const
|
||||
UnknownVKPrefix = 'Word(''';
|
||||
UnknownVKPostfix = ''')';
|
||||
@ -1295,74 +1144,6 @@ begin
|
||||
Result:=false;
|
||||
end;
|
||||
|
||||
function ShowKeyMappingEditForm(Index:integer;
|
||||
AKeyCommandRelationList: TKeyCommandRelationList):TModalResult;
|
||||
|
||||
procedure InitComboBox(AComboBox: TComboBox; AKey: word);
|
||||
var s: string;
|
||||
i: integer;
|
||||
begin
|
||||
s:=KeyAndShiftStateToEditorKeyString(AKey,[]);
|
||||
i:=AComboBox.Items.IndexOf(s);
|
||||
if i>=0 then
|
||||
AComboBox.ItemIndex:=i
|
||||
else if EditorKeyStringIsIrregular(s) then begin
|
||||
AComboBox.Items.Add(s);
|
||||
AComboBox.ItemIndex:=AComboBox.Items.IndexOf(s);
|
||||
end else
|
||||
AComboBox.ItemIndex:=0;
|
||||
end;
|
||||
|
||||
begin
|
||||
Result:=mrCancel;
|
||||
if KeyMappingEditForm<>nil then exit;
|
||||
KeyMappingEditForm:=TKeyMappingEditForm.Create(nil);
|
||||
with KeyMappingEditForm do
|
||||
try
|
||||
KeyCommandRelationList:=AKeyCommandRelationList;
|
||||
KeyIndex:=Index;
|
||||
Caption:=srkmEditKeys;
|
||||
|
||||
with KeyCommandRelationList.Relations[Index] do
|
||||
begin
|
||||
CommandLabel.Caption:=srkmCommand+' "'+LocalizedName+'"';
|
||||
if (ShortcutA.Key1<>VK_UNKNOWN) then
|
||||
begin
|
||||
KeyCtrlCheckBox[0].Checked:=ssCtrl in ShortcutA.Shift1;
|
||||
KeyAltCheckBox[0].Checked:=ssAlt in ShortcutA.Shift1;
|
||||
KeyShiftCheckBox[0].Checked:=ssShift in ShortcutA.Shift1;
|
||||
InitComboBox(KeyComboBox[0],ShortcutA.Key1);
|
||||
end;
|
||||
if (ShortcutA.Key2<>VK_UNKNOWN) then
|
||||
begin
|
||||
KeyCtrlCheckBox[1].Checked:=ssCtrl in ShortcutA.Shift2;
|
||||
KeyAltCheckBox[1].Checked:=ssAlt in ShortcutA.Shift2;
|
||||
KeyShiftCheckBox[1].Checked:=ssShift in ShortcutA.Shift2;
|
||||
InitComboBox(KeyComboBox[1],ShortcutA.Key2);
|
||||
end;
|
||||
|
||||
if (ShortcutB.Key1<>VK_UNKNOWN) then
|
||||
begin
|
||||
KeyCtrlCheckBox[2].Checked:=ssCtrl in ShortcutB.Shift1;
|
||||
KeyAltCheckBox[2].Checked:=ssAlt in ShortcutB.Shift1;
|
||||
KeyShiftCheckBox[2].Checked:=ssShift in ShortcutB.Shift1;
|
||||
InitComboBox(KeyComboBox[2],ShortcutB.Key1);
|
||||
end;
|
||||
if (ShortcutB.Key2<>VK_UNKNOWN) then
|
||||
begin
|
||||
KeyCtrlCheckBox[3].Checked:=ssCtrl in ShortcutB.Shift2;
|
||||
KeyAltCheckBox[3].Checked:=ssAlt in ShortcutB.Shift2;
|
||||
KeyShiftCheckBox[3].Checked:=ssShift in ShortcutB.Shift2;
|
||||
InitComboBox(KeyComboBox[3],ShortcutB.Key2);
|
||||
end;
|
||||
end;
|
||||
Result:=ShowModal;
|
||||
finally
|
||||
Free;
|
||||
KeyMappingEditForm:=nil;
|
||||
end;
|
||||
end;
|
||||
|
||||
function EditorCommandToDescriptionString(cmd: word): String;
|
||||
begin
|
||||
case cmd of
|
||||
@ -1660,26 +1441,6 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
function ShowKeyMappingGrabForm(
|
||||
AKeyCommandRelationList: TKeyCommandRelationList; out Key: TIDEShortCut
|
||||
): TModalResult;
|
||||
begin
|
||||
Result:=mrCancel;
|
||||
if KeyMappingEditForm<>nil then exit;
|
||||
KeyMappingEditForm:=TKeyMappingEditForm.Create(nil);
|
||||
with KeyMappingEditForm do begin
|
||||
try
|
||||
KeyCommandRelationList:=AKeyCommandRelationList;
|
||||
KeyIndex:=-1;
|
||||
Mode:=kmefmGrab;
|
||||
Result:=ShowModal;
|
||||
Key:=NewKeyA;
|
||||
finally
|
||||
FreeThenNil(KeyMappingEditForm);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
function FindKeymapConflicts(Keymap: TKeyCommandRelationList;
|
||||
Protocol: TStrings; out Index1,Index2:integer):integer;
|
||||
// 0 = ok, no errors
|
||||
@ -1871,449 +1632,6 @@ begin
|
||||
Result := Result + ', ' + KeyAndShiftStateToEditorKeyString(Key.Key2, Key.Shift2);
|
||||
end;
|
||||
|
||||
{ TKeyMappingEditForm }
|
||||
|
||||
constructor TKeyMappingEditForm.Create(TheOwner:TComponent);
|
||||
var
|
||||
a, j, k, n: word;
|
||||
s: string;
|
||||
begin
|
||||
inherited Create(TheOwner);
|
||||
NewKeyA:=CleanIDEShortCut;
|
||||
NewKeyB:=CleanIDEShortCut;
|
||||
if LazarusResources.Find(ClassName)=nil then
|
||||
begin
|
||||
SetBounds((Screen.Width-432) div 2, (Screen.Height-310) div 2, 432, 340);
|
||||
Caption := srkmEditForCmd;
|
||||
|
||||
OkButton := TButton.Create(Self);
|
||||
with OkButton do begin
|
||||
Name := 'OkButton';
|
||||
Parent := Self;
|
||||
Caption := 'Ok';
|
||||
Left := 15;
|
||||
Top := Self.ClientHeight-Height-15;
|
||||
Width := 80;
|
||||
OnClick := @OkButtonClick;
|
||||
end;
|
||||
|
||||
CancelButton := TButton.Create(Self);
|
||||
with CancelButton do begin
|
||||
Name := 'CancelButton';
|
||||
Parent := Self;
|
||||
Caption := dlgCancel;
|
||||
Left := 125;
|
||||
Top := OkButton.Top;
|
||||
Width := OkButton.Width;
|
||||
OnClick := @CancelButtonClick;
|
||||
end;
|
||||
|
||||
CommandLabel := TLabel.Create(Self);
|
||||
with CommandLabel do begin
|
||||
Name := 'CommandLabel';
|
||||
Parent := Self;
|
||||
Caption := srkmCommand;
|
||||
Left := 5;
|
||||
Top := 5;
|
||||
Width := Self.ClientWidth-Left-Left;
|
||||
Height := 20;
|
||||
end;
|
||||
|
||||
for j := 0 to 1 do // Create the key groups
|
||||
begin
|
||||
KeyGroupBox[j] := TGroupBox.Create(Self);
|
||||
with KeyGroupBox[j] do begin
|
||||
Name := 'KeyGroupBox' + IntToStr(j);
|
||||
Parent := Self;
|
||||
Left := 5;
|
||||
if (j=0) then begin
|
||||
Top := CommandLabel.Top + CommandLabel.Height+8;
|
||||
Caption := srkmKey
|
||||
end else begin
|
||||
Top := KeyGroupBox[0].Top + KeyGroupBox[0].Height+8;
|
||||
Caption := srkmAlternKey;
|
||||
end;
|
||||
Width := Self.ClientWidth-Left-Left;
|
||||
Height := 110;
|
||||
end;
|
||||
|
||||
for k := 0 to 1 do // create the components for each group
|
||||
begin
|
||||
n := j*2+k;
|
||||
KeyCtrlCheckBox[n] := TCheckBox.Create(Self);
|
||||
with KeyCtrlCheckBox[n] do begin
|
||||
Name := 'KeyCtrlCheckBox' + IntToStr(n);
|
||||
Parent := KeyGroupBox[j];
|
||||
Caption := srkm_Ctrl;
|
||||
Left := 5 + (k * (TGroupBox(Parent).Width div 2));
|
||||
Top := 2;
|
||||
Width := 55;
|
||||
Height := 20;
|
||||
end;
|
||||
|
||||
KeyAltCheckBox[n] := TCheckBox.Create(Self);
|
||||
with KeyAltCheckBox[n] do begin
|
||||
Name := 'KeyAltCheckBox' + IntToStr(n);
|
||||
Parent := KeyGroupBox[j];
|
||||
Caption := srkm_Alt;
|
||||
Left := KeyCtrlCheckBox[n].Left + KeyCtrlCheckBox[n].Width+10;
|
||||
Top := KeyCtrlCheckBox[n].Top;
|
||||
Height := 20;
|
||||
Width := KeyCtrlCheckBox[n].Width;
|
||||
end;
|
||||
|
||||
KeyShiftCheckBox[n] := TCheckBox.Create(Self);
|
||||
with KeyShiftCheckBox[n] do begin
|
||||
Name := 'KeyShiftCheckBox' + IntToStr(n);
|
||||
Parent := KeyGroupBox[j];
|
||||
Caption := srVK_SHIFT;
|
||||
Left := KeyAltCheckBox[n].Left + KeyAltCheckBox[n].Width+10;
|
||||
Top := KeyCtrlCheckBox[n].Top;
|
||||
Height := 20;
|
||||
Width := KeyCtrlCheckBox[n].Width;
|
||||
end;
|
||||
|
||||
KeyComboBox[n] := TComboBox.Create(Self);
|
||||
with KeyComboBox[n] do begin
|
||||
Name := 'KeyComboBox' + IntToStr(n);
|
||||
Parent := KeyGroupBox[j];
|
||||
Left := KeyCtrlCheckBox[n].Left;
|
||||
Top := KeyCtrlCheckBox[n].Top + KeyCtrlCheckBox[n].Height+5;
|
||||
Width := 190;
|
||||
Items.BeginUpdate;
|
||||
Items.Add(lisNone2);
|
||||
for a := 1 to 145 do
|
||||
begin
|
||||
s := KeyAndShiftStateToEditorKeyString(a, []);
|
||||
if not EditorKeyStringIsIrregular(s) then
|
||||
Items.Add(s);
|
||||
end;
|
||||
Items.EndUpdate;
|
||||
ItemIndex := 0;
|
||||
end;
|
||||
|
||||
KeyGrabButton[n] := TButton.Create(Self);
|
||||
with KeyGrabButton[n] do begin
|
||||
Parent := KeyGroupBox[j];
|
||||
Left := KeyCtrlCheckBox[n].Left;
|
||||
Top := KeyComboBox[n].Top+KeyComboBox[n].Height+5;
|
||||
Width := KeyComboBox[n].Width;
|
||||
Height := 25;
|
||||
if k=0 then
|
||||
Caption := srkmGrabKey
|
||||
else
|
||||
Caption := srkmGrabSecondKey;
|
||||
Name := 'KeyGrabButton' + IntToStr(n);
|
||||
Tag := n;
|
||||
OnClick := @KeyGrabButtonClick;
|
||||
end;
|
||||
end; // for k
|
||||
end; // for j
|
||||
|
||||
end;
|
||||
GrabbingKey := 0;
|
||||
end;
|
||||
|
||||
procedure TKeyMappingEditForm.SetupFindView;
|
||||
begin
|
||||
KeyGroupBox[1].Visible:=false;
|
||||
CommandLabel.Caption:='Choose a key to find';
|
||||
end;
|
||||
|
||||
procedure TKeyMappingEditForm.CheckEditModeInput;
|
||||
var
|
||||
CurRelation: TKeyCommandRelation;
|
||||
begin
|
||||
// set defaults
|
||||
NewKeyA:=CleanIDEShortCut;
|
||||
NewKeyB:=CleanIDEShortCut;
|
||||
|
||||
//debugln('TKeyMappingEditForm.OkButtonClick A ShortcutA=',KeyAndShiftStateToEditorKeyString(NewKeyA),' ShortcutB=',KeyAndShiftStateToEditorKeyString(NewKeyB));
|
||||
|
||||
// get old relation
|
||||
CurRelation:=KeyCommandRelationList.Relations[KeyIndex];
|
||||
|
||||
// get settings for key1
|
||||
NewKeyA.Key1:=EditorKeyStringToVKCode(KeyComboBox[0].Text);
|
||||
if NewKeyA.Key1<>VK_UNKNOWN then
|
||||
begin
|
||||
if KeyCtrlCheckBox[0].Checked then include(NewKeyA.Shift1,ssCtrl);
|
||||
if KeyAltCheckBox[0].Checked then include(NewKeyA.Shift1,ssAlt);
|
||||
if KeyShiftCheckBox[0].Checked then include(NewKeyA.Shift1,ssShift);
|
||||
|
||||
NewKeyA.Key2:=EditorKeyStringToVKCode(KeyComboBox[1].Text);
|
||||
if NewKeyA.Key2<>VK_UNKNOWN then
|
||||
begin
|
||||
if KeyCtrlCheckBox[1].Checked then include(NewKeyA.Shift2,ssCtrl);
|
||||
if KeyAltCheckBox[1].Checked then include(NewKeyA.Shift2,ssAlt);
|
||||
if KeyShiftCheckBox[1].Checked then include(NewKeyA.Shift2,ssShift);
|
||||
end;
|
||||
end;
|
||||
|
||||
if not ResolveConflicts(NewKeyA,
|
||||
CurRelation.Category.Scope) then
|
||||
begin
|
||||
debugln('TKeyMappingEditForm.OkButtonClick ResolveConflicts failed for key1');
|
||||
exit;
|
||||
end;
|
||||
|
||||
//debugln('TKeyMappingEditForm.OkButtonClick B ShortcutA=',KeyAndShiftStateToEditorKeyString(NewKeyA),' ShortcutB=',KeyAndShiftStateToEditorKeyString(NewKeyB));
|
||||
|
||||
// get settings for key2
|
||||
NewKeyB.Key1:=EditorKeyStringToVKCode(KeyComboBox[2].Text);
|
||||
//debugln('TKeyMappingEditForm.OkButtonClick B2 ShortcutA=',KeyAndShiftStateToEditorKeyString(NewKeyA),' ShortcutB=',KeyAndShiftStateToEditorKeyString(NewKeyB),' ',Key2KeyComboBox.Text);
|
||||
if NewKeyB.Key1<>VK_UNKNOWN then
|
||||
begin
|
||||
if KeyCtrlCheckBox[2].Checked then include(NewKeyB.Shift1,ssCtrl);
|
||||
if KeyAltCheckBox[2].Checked then include(NewKeyB.Shift1,ssAlt);
|
||||
if KeyShiftCheckBox[2].Checked then include(NewKeyB.Shift1,ssShift);
|
||||
|
||||
NewKeyB.Key2:=EditorKeyStringToVKCode(KeyComboBox[3].Text);
|
||||
if NewKeyB.Key2<>VK_UNKNOWN then
|
||||
begin
|
||||
if KeyCtrlCheckBox[3].Checked then include(NewKeyB.Shift2,ssCtrl);
|
||||
if KeyAltCheckBox[3].Checked then include(NewKeyB.Shift2,ssAlt);
|
||||
if KeyShiftCheckBox[3].Checked then include(NewKeyB.Shift2,ssShift);
|
||||
end;
|
||||
end;
|
||||
|
||||
if (NewKeyA.Key1=NewKeyB.Key1) and (NewKeyA.Shift1=NewKeyB.Shift1) and
|
||||
(NewKeyA.Key2=NewKeyB.Key2) and (NewKeyA.Shift2=NewKeyB.Shift2) then
|
||||
begin
|
||||
NewKeyB.Key1:=VK_UNKNOWN;
|
||||
NewKeyB.Shift1:=[];
|
||||
NewKeyB.Key2:=VK_UNKNOWN;
|
||||
NewKeyB.Shift2:=[];
|
||||
end
|
||||
else if not ResolveConflicts(NewKeyB,CurRelation.Category.Scope)
|
||||
then begin
|
||||
debugln('TKeyMappingEditForm.OkButtonClick ResolveConflicts failed for key1');
|
||||
exit;
|
||||
end;
|
||||
|
||||
//debugln('TKeyMappingEditForm.OkButtonClick C ShortcutA=',KeyAndShiftStateToEditorKeyString(NewKeyA),' ShortcutB=',KeyAndShiftStateToEditorKeyString(NewKeyB));
|
||||
|
||||
if NewKeyA.Key1=VK_UNKNOWN then
|
||||
begin
|
||||
NewKeyA:=NewKeyB;
|
||||
NewKeyB.Key1:=VK_UNKNOWN;
|
||||
NewKeyB.Shift1:=[];
|
||||
NewKeyB.Key2:=VK_UNKNOWN;
|
||||
NewKeyB.Shift2:=[];
|
||||
end;
|
||||
|
||||
//debugln('TKeyMappingEditForm.OkButtonClick D ShortcutA=',KeyAndShiftStateToEditorKeyString(NewKeyA),' ShortcutB=',KeyAndShiftStateToEditorKeyString(NewKeyB));
|
||||
|
||||
CurRelation.ShortcutA:=NewKeyA;
|
||||
CurRelation.ShortcutB:=NewKeyB;
|
||||
|
||||
//debugln('TKeyMappingEditForm.OkButtonClick B ShortcutA=',KeyAndShiftStateToEditorKeyString(NewKeyA),' ShortcutB=',KeyAndShiftStateToEditorKeyString(NewKeyB));
|
||||
ModalResult:=mrOk;
|
||||
end;
|
||||
|
||||
procedure TKeyMappingEditForm.CheckGrabModeInput;
|
||||
begin
|
||||
// set defaults
|
||||
NewKeyA:=CleanIDEShortCut;
|
||||
|
||||
//debugln('TKeyMappingEditForm.OkButtonClick A ShortcutA=',KeyAndShiftStateToEditorKeyString(NewKeyA),' ShortcutB=',KeyAndShiftStateToEditorKeyString(NewKeyB));
|
||||
|
||||
// get settings for key1
|
||||
NewKeyA.Key1:=EditorKeyStringToVKCode(KeyComboBox[0].Text);
|
||||
if NewKeyA.Key1<>VK_UNKNOWN then
|
||||
begin
|
||||
if KeyCtrlCheckBox[0].Checked then include(NewKeyA.Shift1,ssCtrl);
|
||||
if KeyAltCheckBox[0].Checked then include(NewKeyA.Shift1,ssAlt);
|
||||
if KeyShiftCheckBox[0].Checked then include(NewKeyA.Shift1,ssShift);
|
||||
|
||||
NewKeyA.Key2:=EditorKeyStringToVKCode(KeyComboBox[1].Text);
|
||||
if NewKeyA.Key2<>VK_UNKNOWN then
|
||||
begin
|
||||
if KeyCtrlCheckBox[1].Checked then include(NewKeyA.Shift2,ssCtrl);
|
||||
if KeyAltCheckBox[1].Checked then include(NewKeyA.Shift2,ssAlt);
|
||||
if KeyShiftCheckBox[1].Checked then include(NewKeyA.Shift2,ssShift);
|
||||
end;
|
||||
end;
|
||||
|
||||
if NewKeyA.Key1=VK_UNKNOWN then
|
||||
begin
|
||||
NewKeyA:=NewKeyB;
|
||||
NewKeyB.Key1:=VK_UNKNOWN;
|
||||
NewKeyB.Shift1:=[];
|
||||
NewKeyB.Key2:=VK_UNKNOWN;
|
||||
NewKeyB.Shift2:=[];
|
||||
end;
|
||||
|
||||
//debugln('TKeyMappingEditForm.OkButtonClick D ShortcutA=',KeyAndShiftStateToEditorKeyString(NewKeyA),' ShortcutB=',KeyAndShiftStateToEditorKeyString(NewKeyB));
|
||||
|
||||
ModalResult:=mrOk;
|
||||
end;
|
||||
|
||||
procedure TKeyMappingEditForm.OkButtonClick(Sender:TObject);
|
||||
begin
|
||||
if Mode=kmefmGrab then
|
||||
CheckGrabModeInput
|
||||
else
|
||||
CheckEditModeInput;
|
||||
end;
|
||||
|
||||
procedure TKeyMappingEditForm.CancelButtonClick(Sender:TObject);
|
||||
begin
|
||||
ModalResult:=mrCancel;
|
||||
end;
|
||||
|
||||
procedure TKeyMappingEditForm.KeyGrabButtonClick(Sender: TObject);
|
||||
begin
|
||||
ActivateGrabbing(TButton(Sender).Tag+1);
|
||||
end;
|
||||
|
||||
procedure TKeyMappingEditForm.DeactivateGrabbing;
|
||||
var i: integer;
|
||||
begin
|
||||
KeyPreview:=false;
|
||||
if GrabbingKey=0 then exit;
|
||||
// enable all components
|
||||
for i:=0 to ComponentCount-1 do
|
||||
begin
|
||||
if (Components[i] is TWinControl) then
|
||||
TWinControl(Components[i]).Enabled:=true;
|
||||
end;
|
||||
|
||||
KeyGrabButton[GrabbingKey-1].Caption:=srkmGrabKey;
|
||||
GrabbingKey:=0;
|
||||
end;
|
||||
|
||||
procedure TKeyMappingEditForm.SetComboBox(AComboBox: TComboBox;
|
||||
const AValue: string);
|
||||
var i: integer;
|
||||
begin
|
||||
i:=AComboBox.Items.IndexOf(AValue);
|
||||
if i>=0 then
|
||||
AComboBox.ItemIndex:=i
|
||||
else
|
||||
begin
|
||||
AComboBox.Items.Add(AValue);
|
||||
AComboBox.ItemIndex:=AComboBox.Items.IndexOf(AValue);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TKeyMappingEditForm.ResolveConflicts(Key: TIDEShortCut;
|
||||
Scope: TIDECommandScope): boolean;
|
||||
type
|
||||
TConflictType = (ctNone,ctConflictKeyA,ctConflictKeyB);
|
||||
var
|
||||
ConflictRelation: TKeyCommandRelation;
|
||||
ConflictName: String;
|
||||
CurRelation: TKeyCommandRelation;
|
||||
CurName: String;
|
||||
j: integer;
|
||||
conflictType: TConflictType;
|
||||
begin
|
||||
// search for conflict
|
||||
CurRelation:=KeyCommandRelationList.Relations[KeyIndex];
|
||||
if Key.Key1=VK_UNKNOWN then
|
||||
begin
|
||||
Result:=true;
|
||||
exit;
|
||||
end;
|
||||
//Try to find an IDE command that conflicts
|
||||
for j:=0 to KeyCommandRelationList.RelationCount-1 do begin
|
||||
conflictType:=ctNone;
|
||||
ConflictRelation:=KeyCommandRelationList.Relations[j];
|
||||
with ConflictRelation do
|
||||
begin
|
||||
if (j=KeyIndex) then continue;
|
||||
|
||||
if not Category.ScopeIntersects(Scope) then continue;
|
||||
|
||||
if ((Key.Key1=ShortcutA.Key1) and (Key.Shift1=ShortcutA.Shift1))
|
||||
and (((Key.Key2=ShortcutA.Key2) and (Key.Shift2=ShortcutA.Shift2))
|
||||
or (Key.Key2=VK_UNKNOWN) or (ShortcutA.Key2=VK_UNKNOWN))
|
||||
then begin
|
||||
conflictType:=ctConflictKeyA; // ShortcutA bites
|
||||
end
|
||||
else if ((Key.Key1=ShortcutB.Key1) and (Key.Shift1=ShortcutB.Shift1))
|
||||
and (((Key.Key2=ShortcutB.Key2) and (Key.Shift2=ShortcutB.Shift2))
|
||||
or (Key.Key2<>VK_UNKNOWN) or (ShortcutB.Key2=VK_UNKNOWN))
|
||||
then begin
|
||||
conflictType:=ctConflictKeyB; // ShortcutB bites
|
||||
end;
|
||||
end;
|
||||
if (conflictType<>ctNone) then begin
|
||||
CurName:=CurRelation.GetCategoryAndName;
|
||||
ConflictName:=ConflictRelation.GetCategoryAndName;
|
||||
if conflictType=ctConflictKeyA then
|
||||
ConflictName:=ConflictName
|
||||
+' ('+KeyAndShiftStateToEditorKeyString(ConflictRelation.ShortcutA)
|
||||
else
|
||||
ConflictName:=ConflictName
|
||||
+' ('+KeyAndShiftStateToEditorKeyString(ConflictRelation.ShortcutB);
|
||||
if MessageDlg('Conflict found',
|
||||
'The key '+KeyAndShiftStateToEditorKeyString(Key)+#13+
|
||||
'is already assigned to '+ConflictName+'.'#13+#13+
|
||||
'Remove the old assignment and assign the key to the new function'#13+
|
||||
CurName+'?', mtConfirmation,[mbOk,mbCancel],0) <> mrOk then
|
||||
begin
|
||||
Result:=false;
|
||||
exit;
|
||||
end;
|
||||
if (conflictType=ctConflictKeyA) then
|
||||
ConflictRelation.ShortcutA:=ConflictRelation.ShortcutB;
|
||||
ConflictRelation.ClearShortcutB;
|
||||
end;
|
||||
end;
|
||||
|
||||
Result:=true;
|
||||
end;
|
||||
|
||||
procedure TKeyMappingEditForm.SetMode(const AValue: TKMEditFormMode);
|
||||
begin
|
||||
if FMode=AValue then exit;
|
||||
FMode:=AValue;
|
||||
if FMode=kmefmGrab then SetupFindView;
|
||||
end;
|
||||
|
||||
procedure TKeyMappingEditForm.ActivateGrabbing(AGrabbingKey: integer);
|
||||
var i: integer;
|
||||
begin
|
||||
if GrabbingKey>0 then exit;
|
||||
GrabbingKey:=AGrabbingKey;
|
||||
if GrabbingKey=0 then exit;
|
||||
KeyPreview:=true;
|
||||
// disable all components
|
||||
for i:=0 to ComponentCount-1 do
|
||||
begin
|
||||
if (Components[i] is TWinControl) then
|
||||
begin
|
||||
if (Components[i]<>KeyGrabButton[GrabbingKey-1]) and
|
||||
(Components[i]<>KeyGroupBox[(GrabbingKey-1) div 2]) then
|
||||
TWinControl(Components[i]).Enabled:=false;
|
||||
end;
|
||||
end;
|
||||
KeyGrabButton[GrabbingKey-1].Caption:=srkmPressKey;
|
||||
end;
|
||||
|
||||
procedure TKeyMappingEditForm.KeyDown(var Key: Word; Shift: TShiftState);
|
||||
begin
|
||||
debugln(['TKeyMappingEditForm.FormKeyUp Sender=',Classname
|
||||
,' Key=',Key,' Shift=',dbgs(Shift),' AsString=',KeyAndShiftStateToEditorKeyString(Key,[]),
|
||||
'']);
|
||||
if (GrabbingKey>0)
|
||||
and not (Key in [VK_CONTROL, VK_LCONTROL, VK_RCONTROL,
|
||||
VK_SHIFT, VK_LSHIFT, VK_RSHIFT,
|
||||
VK_MENU, VK_LMENU, VK_RMENU]) then
|
||||
begin
|
||||
KeyCtrlCheckBox[GrabbingKey-1].Checked:=(ssCtrl in Shift);
|
||||
KeyShiftCheckBox[GrabbingKey-1].Checked:=(ssShift in Shift);
|
||||
KeyAltCheckBox[GrabbingKey-1].Checked:=(ssAlt in Shift);
|
||||
SetComboBox(KeyComboBox[GrabbingKey-1], KeyAndShiftStateToEditorKeyString(Key,[]));
|
||||
Key:=0;
|
||||
DeactivateGrabbing;
|
||||
end;
|
||||
inherited;
|
||||
end;
|
||||
|
||||
|
||||
{ TKeyCommandRelation }
|
||||
|
||||
procedure TKeyCommandRelation.SetShortcutA(const AValue: TIDEShortCut);
|
||||
@ -3369,241 +2687,6 @@ end;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
{ TCustomShortCutGrabBox }
|
||||
|
||||
procedure TCustomShortCutGrabBox.SetKey(const AValue: Word);
|
||||
begin
|
||||
if FKey=AValue then exit;
|
||||
FKey:=AValue;
|
||||
FKeyComboBox.Text:=KeyAndShiftStateToEditorKeyString(Key,[]);
|
||||
end;
|
||||
|
||||
procedure TCustomShortCutGrabBox.OnGrabButtonClick(Sender: TObject);
|
||||
begin
|
||||
FGrabForm:=TForm.Create(Self);
|
||||
FGrabForm.KeyPreview:=true;
|
||||
FGrabForm.Position:=poDesktopCenter;
|
||||
FGrabForm.OnKeyDown:=@OnGrabFormKeyDown;
|
||||
FGrabForm.Caption:='Press a key ...';
|
||||
with TLabel.Create(Self) do begin
|
||||
Caption:='Press a key ...';
|
||||
BorderSpacing.Around:=25;
|
||||
Parent:=FGrabForm;
|
||||
end;
|
||||
FGrabForm.AutoSize:=true;
|
||||
FGrabForm.ShowModal;
|
||||
FreeThenNil(FGrabForm);
|
||||
end;
|
||||
|
||||
procedure TCustomShortCutGrabBox.OnShitCheckBoxClick(Sender: TObject);
|
||||
var
|
||||
s: TShiftStateEnum;
|
||||
begin
|
||||
for s:=Low(TShiftStateEnum) to High(TShiftStateEnum) do
|
||||
if FCheckBoxes[s]=Sender then
|
||||
if FCheckBoxes[s].Checked then
|
||||
Include(FShiftState,s)
|
||||
else
|
||||
Exclude(FShiftState,s);
|
||||
end;
|
||||
|
||||
procedure TCustomShortCutGrabBox.OnGrabFormKeyDown(Sender: TObject;
|
||||
var AKey: Word; AShift: TShiftState);
|
||||
begin
|
||||
//DebugLn(['TCustomShortCutGrabBox.OnGrabFormKeyDown ',AKey,' ',dbgs(AShift)]);
|
||||
if not (AKey in [VK_CONTROL, VK_LCONTROL, VK_RCONTROL,
|
||||
VK_SHIFT, VK_LSHIFT, VK_RSHIFT,
|
||||
VK_MENU, VK_LMENU, VK_RMENU,
|
||||
VK_UNKNOWN, VK_UNDEFINED])
|
||||
then begin
|
||||
Key:=AKey;
|
||||
ShiftState:=AShift;
|
||||
FGrabForm.ModalResult:=mrOk;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCustomShortCutGrabBox.OnKeyComboboxEditingDone(Sender: TObject);
|
||||
begin
|
||||
Key:=EditorKeyStringToVKCode(KeyComboBox.Text);
|
||||
end;
|
||||
|
||||
function TCustomShortCutGrabBox.GetShiftCheckBox(Shift: TShiftStateEnum
|
||||
): TCheckBox;
|
||||
begin
|
||||
Result:=FCheckBoxes[Shift];
|
||||
end;
|
||||
|
||||
procedure TCustomShortCutGrabBox.SetAllowedShifts(const AValue: TShiftState);
|
||||
begin
|
||||
if FAllowedShifts=AValue then exit;
|
||||
FAllowedShifts:=AValue;
|
||||
ShiftState:=ShiftState*FAllowedShifts;
|
||||
end;
|
||||
|
||||
procedure TCustomShortCutGrabBox.SetShiftButtons(const AValue: TShiftState);
|
||||
begin
|
||||
if FShiftButtons=AValue then exit;
|
||||
FShiftButtons:=AValue;
|
||||
UpdateShiftButons;
|
||||
end;
|
||||
|
||||
procedure TCustomShortCutGrabBox.SetShiftState(const AValue: TShiftState);
|
||||
var
|
||||
s: TShiftStateEnum;
|
||||
begin
|
||||
if FShiftState=AValue then exit;
|
||||
FShiftState:=AValue;
|
||||
for s:=low(TShiftStateEnum) to High(TShiftStateEnum) do
|
||||
if FCheckBoxes[s]<>nil then
|
||||
FCheckBoxes[s].Checked:=s in FShiftState;
|
||||
end;
|
||||
|
||||
procedure TCustomShortCutGrabBox.Loaded;
|
||||
begin
|
||||
inherited Loaded;
|
||||
UpdateShiftButons;
|
||||
end;
|
||||
|
||||
procedure TCustomShortCutGrabBox.UpdateShiftButons;
|
||||
var
|
||||
s: TShiftStateEnum;
|
||||
LastCheckBox: TCheckBox;
|
||||
begin
|
||||
if [csLoading,csDestroying]*ComponentState<>[] then exit;
|
||||
LastCheckBox:=nil;
|
||||
DisableAlign;
|
||||
try
|
||||
for s:=low(TShiftStateEnum) to High(TShiftStateEnum) do begin
|
||||
if s in FShiftButtons then begin
|
||||
if FCheckBoxes[s]=nil then begin
|
||||
FCheckBoxes[s]:=TCheckBox.Create(Self);
|
||||
with FCheckBoxes[s] do begin
|
||||
Name:='CheckBox'+ShiftToStr(s);
|
||||
Caption:=ShiftToStr(s);
|
||||
AutoSize:=true;
|
||||
Checked:=s in FShiftState;
|
||||
if LastCheckBox<>nil then
|
||||
AnchorToNeighbour(akLeft,6,LastCheckBox)
|
||||
else
|
||||
AnchorParallel(akLeft,0,Self);
|
||||
AnchorParallel(akTop,0,Self);
|
||||
AnchorParallel(akBottom,0,Self);
|
||||
Parent:=Self;
|
||||
OnClick:=@OnShitCheckBoxClick;
|
||||
end;
|
||||
end;
|
||||
LastCheckBox:=FCheckBoxes[s];
|
||||
end else begin
|
||||
FreeThenNil(FCheckBoxes[s]);
|
||||
end;
|
||||
end;
|
||||
if LastCheckBox<>nil then
|
||||
FKeyComboBox.AnchorToNeighbour(akLeft,6,LastCheckBox)
|
||||
else
|
||||
FKeyComboBox.AnchorParallel(akLeft,0,Self);
|
||||
finally
|
||||
EnableAlign;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCustomShortCutGrabBox.Notification(AComponent: TComponent;
|
||||
Operation: TOperation);
|
||||
var
|
||||
s: TShiftStateEnum;
|
||||
begin
|
||||
inherited Notification(AComponent, Operation);
|
||||
if Operation=opRemove then begin
|
||||
if AComponent=FGrabButton then
|
||||
FGrabButton:=nil;
|
||||
if AComponent=FKeyComboBox then
|
||||
FKeyComboBox:=nil;
|
||||
if AComponent=FGrabForm then
|
||||
FGrabForm:=nil;
|
||||
for s:=Low(TShiftStateEnum) to High(TShiftStateEnum) do
|
||||
if FCheckBoxes[s]=AComponent then begin
|
||||
FCheckBoxes[s]:=nil;
|
||||
Exclude(FShiftButtons,s);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TCustomShortCutGrabBox.ShiftToStr(s: TShiftStateEnum): string;
|
||||
begin
|
||||
case s of
|
||||
ssShift: Result:='Shift';
|
||||
ssAlt: Result:='Alt';
|
||||
ssCtrl: Result:='Ctrl';
|
||||
ssMeta: Result:='Meta';
|
||||
ssSuper: Result:='Super';
|
||||
ssHyper: {$IFDEF Darwin}
|
||||
Result:='Cmd';
|
||||
{$ELSE}
|
||||
Result:='Hyper';
|
||||
{$ENDIF}
|
||||
ssAltGr: Result:='AltGr';
|
||||
ssCaps: Result:='Caps';
|
||||
ssNum: Result:='Numlock';
|
||||
ssScroll: Result:='Scroll';
|
||||
else Result:='Modifier'+IntToStr(ord(s));
|
||||
end;
|
||||
end;
|
||||
|
||||
constructor TCustomShortCutGrabBox.Create(TheOwner: TComponent);
|
||||
var
|
||||
i: Integer;
|
||||
s: String;
|
||||
begin
|
||||
inherited Create(TheOwner);
|
||||
|
||||
FAllowedShifts:=[ssShift, ssAlt, ssCtrl,
|
||||
ssMeta, ssSuper, ssHyper, ssAltGr,
|
||||
ssCaps, ssNum, ssScroll];
|
||||
|
||||
FGrabButton:=TButton.Create(Self);
|
||||
with FGrabButton do begin
|
||||
Name:='GrabButton';
|
||||
Caption:='Grab key';
|
||||
Align:=alRight;
|
||||
AutoSize:=true;
|
||||
Parent:=Self;
|
||||
OnClick:=@OnGrabButtonClick;
|
||||
end;
|
||||
|
||||
FKeyComboBox:=TComboBox.Create(Self);
|
||||
with FKeyComboBox do begin
|
||||
Name:='FKeyComboBox';
|
||||
AutoSize:=true;
|
||||
Items.BeginUpdate;
|
||||
for i:=1 to 145 do begin
|
||||
s := KeyAndShiftStateToEditorKeyString(i, []);
|
||||
if not EditorKeyStringIsIrregular(s) then
|
||||
Items.Add(s);
|
||||
end;
|
||||
Items.EndUpdate;
|
||||
OnEditingDone:=@OnKeyComboboxEditingDone;
|
||||
Parent:=Self;
|
||||
AnchorToNeighbour(akRight,6,FGrabButton);
|
||||
AnchorVerticalCenterTo(FGrabButton);
|
||||
end;
|
||||
|
||||
ShiftButtons:=GetDefaultShiftButtons;
|
||||
ShiftState:=[];
|
||||
Key:=VK_UNKNOWN;
|
||||
KeyComboBox.Text:=KeyAndShiftStateToEditorKeyString(Key,[]);
|
||||
end;
|
||||
|
||||
function TCustomShortCutGrabBox.GetDefaultShiftButtons: TShiftState;
|
||||
begin
|
||||
{$IFDEF Darwin}
|
||||
Result:=[ssCtrl,ssShift,ssAlt,ssHyper];
|
||||
{$ELSE}
|
||||
Result:=[ssCtrl,ssShift,ssAlt];
|
||||
{$ENDIF}
|
||||
end;
|
||||
|
||||
initialization
|
||||
KeyMappingEditForm:=nil;
|
||||
|
||||
finalization
|
||||
VirtualKeyStrings.Free;
|
||||
VirtualKeyStrings:=nil;
|
||||
|
71
ide/keymapshortcutdlg.lfm
Normal file
71
ide/keymapshortcutdlg.lfm
Normal file
@ -0,0 +1,71 @@
|
||||
object ShortCutDialog: TShortCutDialog
|
||||
Left = 290
|
||||
Height = 257
|
||||
Top = 189
|
||||
Width = 545
|
||||
Caption = 'ShortCutDialog'
|
||||
ClientHeight = 257
|
||||
ClientWidth = 545
|
||||
OnCreate = FormCreate
|
||||
LCLVersion = '0.9.25'
|
||||
object BtnPanel: TPanel
|
||||
Height = 41
|
||||
Top = 216
|
||||
Width = 545
|
||||
Align = alBottom
|
||||
AutoSize = True
|
||||
BevelOuter = bvNone
|
||||
ChildSizing.LeftRightSpacing = 6
|
||||
ChildSizing.TopBottomSpacing = 6
|
||||
ChildSizing.HorizontalSpacing = 6
|
||||
ChildSizing.VerticalSpacing = 6
|
||||
ClientHeight = 41
|
||||
ClientWidth = 545
|
||||
TabOrder = 0
|
||||
object CancelButton: TButton
|
||||
Left = 441
|
||||
Height = 29
|
||||
Top = 6
|
||||
Width = 98
|
||||
Align = alRight
|
||||
AutoSize = True
|
||||
Caption = 'CancelButton'
|
||||
Constraints.MinWidth = 75
|
||||
ModalResult = 2
|
||||
OnClick = CancelButtonClick
|
||||
TabOrder = 0
|
||||
end
|
||||
object OkButton: TButton
|
||||
Left = 360
|
||||
Height = 29
|
||||
Top = 6
|
||||
Width = 75
|
||||
Align = alRight
|
||||
AutoSize = True
|
||||
Caption = 'OkButton'
|
||||
Constraints.MinWidth = 75
|
||||
OnClick = OkButtonClick
|
||||
TabOrder = 1
|
||||
end
|
||||
end
|
||||
object PrimaryGroupBox: TGroupBox
|
||||
Left = 6
|
||||
Height = 93
|
||||
Top = 6
|
||||
Width = 533
|
||||
Align = alTop
|
||||
BorderSpacing.Around = 6
|
||||
Caption = 'PrimaryGroupBox'
|
||||
TabOrder = 1
|
||||
end
|
||||
object SecondaryGroupBox: TGroupBox
|
||||
Left = 6
|
||||
Height = 105
|
||||
Top = 105
|
||||
Width = 533
|
||||
Align = alTop
|
||||
BorderSpacing.Around = 6
|
||||
Caption = 'SecondaryGroupBox'
|
||||
TabOrder = 2
|
||||
end
|
||||
end
|
24
ide/keymapshortcutdlg.lrs
Normal file
24
ide/keymapshortcutdlg.lrs
Normal file
@ -0,0 +1,24 @@
|
||||
{ This is an automatically generated lazarus resource file }
|
||||
|
||||
LazarusResources.Add('TShortCutDialog','FORMDATA',[
|
||||
'TPF0'#15'TShortCutDialog'#14'ShortCutDialog'#4'Left'#3'"'#1#6'Height'#3#1#1#3
|
||||
+'Top'#3#189#0#5'Width'#3'!'#2#7'Caption'#6#14'ShortCutDialog'#12'ClientHeigh'
|
||||
+'t'#3#1#1#11'ClientWidth'#3'!'#2#8'OnCreate'#7#10'FormCreate'#10'LCLVersion'
|
||||
+#6#6'0.9.25'#0#6'TPanel'#8'BtnPanel'#6'Height'#2')'#3'Top'#3#216#0#5'Width'#3
|
||||
+'!'#2#5'Align'#7#8'alBottom'#8'AutoSize'#9#10'BevelOuter'#7#6'bvNone'#28'Chi'
|
||||
+'ldSizing.LeftRightSpacing'#2#6#28'ChildSizing.TopBottomSpacing'#2#6#29'Chil'
|
||||
+'dSizing.HorizontalSpacing'#2#6#27'ChildSizing.VerticalSpacing'#2#6#12'Clien'
|
||||
+'tHeight'#2')'#11'ClientWidth'#3'!'#2#8'TabOrder'#2#0#0#7'TButton'#12'Cancel'
|
||||
+'Button'#4'Left'#3#185#1#6'Height'#2#29#3'Top'#2#6#5'Width'#2'b'#5'Align'#7#7
|
||||
+'alRight'#8'AutoSize'#9#7'Caption'#6#12'CancelButton'#20'Constraints.MinWidt'
|
||||
+'h'#2'K'#11'ModalResult'#2#2#7'OnClick'#7#17'CancelButtonClick'#8'TabOrder'#2
|
||||
+#0#0#0#7'TButton'#8'OkButton'#4'Left'#3'h'#1#6'Height'#2#29#3'Top'#2#6#5'Wid'
|
||||
+'th'#2'K'#5'Align'#7#7'alRight'#8'AutoSize'#9#7'Caption'#6#8'OkButton'#20'Co'
|
||||
+'nstraints.MinWidth'#2'K'#7'OnClick'#7#13'OkButtonClick'#8'TabOrder'#2#1#0#0
|
||||
+#0#9'TGroupBox'#15'PrimaryGroupBox'#4'Left'#2#6#6'Height'#2']'#3'Top'#2#6#5
|
||||
+'Width'#3#21#2#5'Align'#7#5'alTop'#20'BorderSpacing.Around'#2#6#7'Caption'#6
|
||||
+#15'PrimaryGroupBox'#8'TabOrder'#2#1#0#0#9'TGroupBox'#17'SecondaryGroupBox'#4
|
||||
+'Left'#2#6#6'Height'#2'i'#3'Top'#2'i'#5'Width'#3#21#2#5'Align'#7#5'alTop'#20
|
||||
+'BorderSpacing.Around'#2#6#7'Caption'#6#17'SecondaryGroupBox'#8'TabOrder'#2#2
|
||||
+#0#0#0
|
||||
]);
|
750
ide/keymapshortcutdlg.pas
Normal file
750
ide/keymapshortcutdlg.pas
Normal file
@ -0,0 +1,750 @@
|
||||
{
|
||||
***************************************************************************
|
||||
* *
|
||||
* This source is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This code is distributed in the hope that it will be useful, but *
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||
* General Public License for more details. *
|
||||
* *
|
||||
* A copy of the GNU General Public License is available on the World *
|
||||
* Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also *
|
||||
* obtain it by writing to the Free Software Foundation, *
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
***************************************************************************
|
||||
|
||||
Author: Mattias Gaertner
|
||||
|
||||
Abstract:
|
||||
TShortCutGrabBox - a control to edit a shortcut
|
||||
TShortCutDialog - a dialog to edit ide shortcuts
|
||||
}
|
||||
unit KeyMapShortCutDlg;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils, LResources, LCLProc, Forms, Controls, Graphics, Dialogs,
|
||||
ExtCtrls, StdCtrls, LCLType,
|
||||
IDECommands, IDEWindowIntf,
|
||||
KeyMapping, LazarusIDEStrConsts;
|
||||
|
||||
type
|
||||
{ TCustomShortCutGrabBox }
|
||||
|
||||
TCustomShortCutGrabBox = class(TCustomPanel)
|
||||
private
|
||||
FAllowedShifts: TShiftState;
|
||||
FGrabButton: TButton;
|
||||
FKey: Word;
|
||||
FKeyComboBox: TComboBox;
|
||||
FShiftButtons: TShiftState;
|
||||
FShiftState: TShiftState;
|
||||
FCheckBoxes: array[TShiftStateEnum] of TCheckBox;
|
||||
FGrabForm: TForm;
|
||||
function GetShiftCheckBox(Shift: TShiftStateEnum): TCheckBox;
|
||||
procedure SetAllowedShifts(const AValue: TShiftState);
|
||||
procedure SetKey(const AValue: Word);
|
||||
procedure SetShiftButtons(const AValue: TShiftState);
|
||||
procedure SetShiftState(const AValue: TShiftState);
|
||||
procedure OnGrabButtonClick(Sender: TObject);
|
||||
procedure OnShitCheckBoxClick(Sender: TObject);
|
||||
procedure OnGrabFormKeyDown(Sender: TObject; var AKey: Word;
|
||||
AShift: TShiftState);
|
||||
procedure OnKeyComboboxEditingDone(Sender: TObject);
|
||||
protected
|
||||
procedure Loaded; override;
|
||||
procedure UpdateShiftButons;
|
||||
procedure Notification(AComponent: TComponent; Operation: TOperation);
|
||||
override;
|
||||
function ShiftToStr(s: TShiftStateEnum): string;
|
||||
public
|
||||
constructor Create(TheOwner: TComponent); override;
|
||||
function GetDefaultShiftButtons: TShiftState;
|
||||
property ShiftState: TShiftState read FShiftState write SetShiftState;
|
||||
property Key: Word read FKey write SetKey;
|
||||
property ShiftButtons: TShiftState read FShiftButtons write SetShiftButtons;
|
||||
property AllowedShifts: TShiftState read FAllowedShifts write SetAllowedShifts;
|
||||
property KeyComboBox: TComboBox read FKeyComboBox;
|
||||
property GrabButton: TButton read FGrabButton;
|
||||
property ShiftCheckBox[Shift: TShiftStateEnum]: TCheckBox read GetShiftCheckBox;
|
||||
end;
|
||||
|
||||
{ TShortCutGrabBox }
|
||||
|
||||
TShortCutGrabBox = class(TCustomShortCutGrabBox)
|
||||
published
|
||||
property Align;
|
||||
property Alignment;
|
||||
property AllowedShifts;
|
||||
property Anchors;
|
||||
property AutoSize;
|
||||
property BevelInner;
|
||||
property BevelOuter;
|
||||
property BevelWidth;
|
||||
property BorderSpacing;
|
||||
property BorderStyle;
|
||||
property BorderWidth;
|
||||
property Caption;
|
||||
property ChildSizing;
|
||||
property ClientHeight;
|
||||
property ClientWidth;
|
||||
property Color;
|
||||
property Constraints;
|
||||
property DockSite;
|
||||
property DragCursor;
|
||||
property DragKind;
|
||||
property DragMode;
|
||||
property Enabled;
|
||||
property Font;
|
||||
property FullRepaint;
|
||||
property Key;
|
||||
property OnClick;
|
||||
property OnDblClick;
|
||||
property OnDockDrop;
|
||||
property OnDockOver;
|
||||
property OnDragDrop;
|
||||
property OnDragOver;
|
||||
property OnEndDock;
|
||||
property OnEndDrag;
|
||||
property OnEnter;
|
||||
property OnExit;
|
||||
property OnGetDockCaption;
|
||||
property OnGetSiteInfo;
|
||||
property OnMouseDown;
|
||||
property OnMouseMove;
|
||||
property OnMouseUp;
|
||||
property OnResize;
|
||||
property OnStartDock;
|
||||
property OnStartDrag;
|
||||
property OnUnDock;
|
||||
property ParentColor;
|
||||
property ParentFont;
|
||||
property ParentShowHint;
|
||||
property PopupMenu;
|
||||
property ShiftButtons;
|
||||
property ShiftState;
|
||||
property ShowHint;
|
||||
property TabOrder;
|
||||
property TabStop;
|
||||
property UseDockManager default True;
|
||||
property Visible;
|
||||
end;
|
||||
|
||||
{ TShortCutDialog }
|
||||
|
||||
TShortCutDialog = class(TForm)
|
||||
BtnPanel: TPanel;
|
||||
PrimaryGroupBox: TGroupBox;
|
||||
SecondaryGroupBox: TGroupBox;
|
||||
OkButton: TButton;
|
||||
CancelButton: TButton;
|
||||
procedure CancelButtonClick(Sender: TObject);
|
||||
procedure FormCreate(Sender: TObject);
|
||||
procedure OkButtonClick(Sender: TObject);
|
||||
private
|
||||
FKeyCommandRelationList: TKeyCommandRelationList;
|
||||
FPrimaryKey1Box: TShortCutGrabBox;
|
||||
FPrimaryKey2Box: TShortCutGrabBox;
|
||||
FRelationIndex: integer;
|
||||
FSecondaryKey1Box: TShortCutGrabBox;
|
||||
FSecondaryKey2Box: TShortCutGrabBox;
|
||||
FShowSecondary: boolean;
|
||||
FShowSequence: boolean;
|
||||
function GetPrimaryShortCut: TIDEShortCut;
|
||||
function GetSecondaryShortCut: TIDEShortCut;
|
||||
procedure SetPrimaryShortCut(const AValue: TIDEShortCut);
|
||||
procedure SetSecondaryShortCut(const AValue: TIDEShortCut);
|
||||
procedure SetShowSecondary(const AValue: boolean);
|
||||
procedure SetShowSequence(const AValue: boolean);
|
||||
function ResolveConflicts(Key: TIDEShortCut; Scope: TIDECommandScope): boolean;
|
||||
procedure UpdateCaptions;
|
||||
public
|
||||
procedure ClearKeys;
|
||||
procedure SetRelation(AKeyCommandRelationList: TKeyCommandRelationList;
|
||||
Index: integer);
|
||||
property KeyCommandRelationList: TKeyCommandRelationList
|
||||
read FKeyCommandRelationList write FKeyCommandRelationList;
|
||||
property RelationIndex: integer read FRelationIndex write FRelationIndex;
|
||||
property ShowSecondary: boolean read FShowSecondary write SetShowSecondary;
|
||||
property ShowSequence: boolean read FShowSequence write SetShowSequence;
|
||||
property PrimaryKey1Box: TShortCutGrabBox read FPrimaryKey1Box;
|
||||
property PrimaryKey2Box: TShortCutGrabBox read FPrimaryKey2Box;
|
||||
property SecondaryKey1Box: TShortCutGrabBox read FSecondaryKey1Box;
|
||||
property SecondaryKey2Box: TShortCutGrabBox read FSecondaryKey2Box;
|
||||
property PrimaryShortCut: TIDEShortCut read GetPrimaryShortCut write SetPrimaryShortCut;
|
||||
property SecondaryShortCut: TIDEShortCut read GetSecondaryShortCut write SetSecondaryShortCut;
|
||||
end;
|
||||
|
||||
function ShowKeyMappingEditForm(Index: integer;
|
||||
AKeyCommandRelationList: TKeyCommandRelationList): TModalResult;
|
||||
function ShowKeyMappingGrabForm(out Key: TIDEShortCut;
|
||||
AllowSequence: boolean = false): TModalResult;
|
||||
|
||||
implementation
|
||||
|
||||
function ShowKeyMappingEditForm(Index: integer;
|
||||
AKeyCommandRelationList: TKeyCommandRelationList): TModalResult;
|
||||
var
|
||||
ShortCutDialog: TShortCutDialog;
|
||||
begin
|
||||
ShortCutDialog:=TShortCutDialog.Create(nil);
|
||||
try
|
||||
ShortCutDialog.ShowSecondary:=true;
|
||||
ShortCutDialog.ShowSequence:=true;
|
||||
ShortCutDialog.SetRelation(AKeyCommandRelationList,Index);
|
||||
Result:=ShortCutDialog.ShowModal;
|
||||
finally
|
||||
ShortCutDialog.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
function ShowKeyMappingGrabForm(out Key: TIDEShortCut;
|
||||
AllowSequence: boolean): TModalResult;
|
||||
var
|
||||
ShortCutDialog: TShortCutDialog;
|
||||
begin
|
||||
ShortCutDialog:=TShortCutDialog.Create(nil);
|
||||
try
|
||||
ShortCutDialog.ShowSecondary:=false;
|
||||
ShortCutDialog.ShowSequence:=AllowSequence;
|
||||
ShortCutDialog.Caption:=lisChooseAKey;
|
||||
Result:=ShortCutDialog.ShowModal;
|
||||
Key:=ShortCutDialog.PrimaryShortCut;
|
||||
finally
|
||||
ShortCutDialog.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
{ TCustomShortCutGrabBox }
|
||||
|
||||
procedure TCustomShortCutGrabBox.SetKey(const AValue: Word);
|
||||
var
|
||||
s: String;
|
||||
i: LongInt;
|
||||
begin
|
||||
if FKey=AValue then exit;
|
||||
FKey:=AValue;
|
||||
s:=KeyAndShiftStateToEditorKeyString(FKey,[]);
|
||||
i:=KeyComboBox.Items.IndexOf(s);
|
||||
if i>=0 then
|
||||
KeyComboBox.ItemIndex:=i
|
||||
else if EditorKeyStringIsIrregular(s) then begin
|
||||
KeyComboBox.Items.Add(s);
|
||||
KeyComboBox.ItemIndex:=KeyComboBox.Items.IndexOf(s);
|
||||
end else
|
||||
KeyComboBox.ItemIndex:=0;
|
||||
end;
|
||||
|
||||
procedure TCustomShortCutGrabBox.OnGrabButtonClick(Sender: TObject);
|
||||
begin
|
||||
FGrabForm:=TForm.Create(Self);
|
||||
FGrabForm.KeyPreview:=true;
|
||||
FGrabForm.Position:=poDesktopCenter;
|
||||
FGrabForm.OnKeyDown:=@OnGrabFormKeyDown;
|
||||
FGrabForm.Caption:='Press a key ...';
|
||||
with TLabel.Create(Self) do begin
|
||||
Caption:='Press a key ...';
|
||||
BorderSpacing.Around:=25;
|
||||
Parent:=FGrabForm;
|
||||
end;
|
||||
FGrabForm.AutoSize:=true;
|
||||
FGrabForm.ShowModal;
|
||||
FreeAndNil(FGrabForm);
|
||||
end;
|
||||
|
||||
procedure TCustomShortCutGrabBox.OnShitCheckBoxClick(Sender: TObject);
|
||||
var
|
||||
s: TShiftStateEnum;
|
||||
begin
|
||||
for s:=Low(TShiftStateEnum) to High(TShiftStateEnum) do
|
||||
if FCheckBoxes[s]=Sender then
|
||||
if FCheckBoxes[s].Checked then
|
||||
Include(FShiftState,s)
|
||||
else
|
||||
Exclude(FShiftState,s);
|
||||
end;
|
||||
|
||||
procedure TCustomShortCutGrabBox.OnGrabFormKeyDown(Sender: TObject;
|
||||
var AKey: Word; AShift: TShiftState);
|
||||
begin
|
||||
//DebugLn(['TCustomShortCutGrabBox.OnGrabFormKeyDown ',AKey,' ',dbgs(AShift)]);
|
||||
if not (AKey in [VK_CONTROL, VK_LCONTROL, VK_RCONTROL,
|
||||
VK_SHIFT, VK_LSHIFT, VK_RSHIFT,
|
||||
VK_MENU, VK_LMENU, VK_RMENU,
|
||||
VK_UNKNOWN, VK_UNDEFINED])
|
||||
then begin
|
||||
Key:=AKey;
|
||||
ShiftState:=AShift;
|
||||
FGrabForm.ModalResult:=mrOk;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCustomShortCutGrabBox.OnKeyComboboxEditingDone(Sender: TObject);
|
||||
begin
|
||||
Key:=EditorKeyStringToVKCode(KeyComboBox.Text);
|
||||
end;
|
||||
|
||||
function TCustomShortCutGrabBox.GetShiftCheckBox(Shift: TShiftStateEnum
|
||||
): TCheckBox;
|
||||
begin
|
||||
Result:=FCheckBoxes[Shift];
|
||||
end;
|
||||
|
||||
procedure TCustomShortCutGrabBox.SetAllowedShifts(const AValue: TShiftState);
|
||||
begin
|
||||
if FAllowedShifts=AValue then exit;
|
||||
FAllowedShifts:=AValue;
|
||||
ShiftState:=ShiftState*FAllowedShifts;
|
||||
end;
|
||||
|
||||
procedure TCustomShortCutGrabBox.SetShiftButtons(const AValue: TShiftState);
|
||||
begin
|
||||
if FShiftButtons=AValue then exit;
|
||||
FShiftButtons:=AValue;
|
||||
UpdateShiftButons;
|
||||
end;
|
||||
|
||||
procedure TCustomShortCutGrabBox.SetShiftState(const AValue: TShiftState);
|
||||
var
|
||||
s: TShiftStateEnum;
|
||||
begin
|
||||
if FShiftState=AValue then exit;
|
||||
FShiftState:=AValue;
|
||||
for s:=low(TShiftStateEnum) to High(TShiftStateEnum) do
|
||||
if FCheckBoxes[s]<>nil then
|
||||
FCheckBoxes[s].Checked:=s in FShiftState;
|
||||
end;
|
||||
|
||||
procedure TCustomShortCutGrabBox.Loaded;
|
||||
begin
|
||||
inherited Loaded;
|
||||
UpdateShiftButons;
|
||||
end;
|
||||
|
||||
procedure TCustomShortCutGrabBox.UpdateShiftButons;
|
||||
var
|
||||
s: TShiftStateEnum;
|
||||
LastCheckBox: TCheckBox;
|
||||
begin
|
||||
if [csLoading,csDestroying]*ComponentState<>[] then exit;
|
||||
LastCheckBox:=nil;
|
||||
DisableAlign;
|
||||
try
|
||||
for s:=low(TShiftStateEnum) to High(TShiftStateEnum) do begin
|
||||
if s in FShiftButtons then begin
|
||||
if FCheckBoxes[s]=nil then begin
|
||||
FCheckBoxes[s]:=TCheckBox.Create(Self);
|
||||
with FCheckBoxes[s] do begin
|
||||
Name:='CheckBox'+ShiftToStr(s);
|
||||
Caption:=ShiftToStr(s);
|
||||
AutoSize:=true;
|
||||
Checked:=s in FShiftState;
|
||||
if LastCheckBox<>nil then
|
||||
AnchorToNeighbour(akLeft,6,LastCheckBox)
|
||||
else
|
||||
AnchorParallel(akLeft,0,Self);
|
||||
AnchorParallel(akTop,0,Self);
|
||||
AnchorParallel(akBottom,0,Self);
|
||||
Parent:=Self;
|
||||
OnClick:=@OnShitCheckBoxClick;
|
||||
end;
|
||||
end;
|
||||
LastCheckBox:=FCheckBoxes[s];
|
||||
end else begin
|
||||
FreeAndNil(FCheckBoxes[s]);
|
||||
end;
|
||||
end;
|
||||
if LastCheckBox<>nil then
|
||||
FKeyComboBox.AnchorToNeighbour(akLeft,6,LastCheckBox)
|
||||
else
|
||||
FKeyComboBox.AnchorParallel(akLeft,0,Self);
|
||||
finally
|
||||
EnableAlign;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCustomShortCutGrabBox.Notification(AComponent: TComponent;
|
||||
Operation: TOperation);
|
||||
var
|
||||
s: TShiftStateEnum;
|
||||
begin
|
||||
inherited Notification(AComponent, Operation);
|
||||
if Operation=opRemove then begin
|
||||
if AComponent=FGrabButton then
|
||||
FGrabButton:=nil;
|
||||
if AComponent=FKeyComboBox then
|
||||
FKeyComboBox:=nil;
|
||||
if AComponent=FGrabForm then
|
||||
FGrabForm:=nil;
|
||||
for s:=Low(TShiftStateEnum) to High(TShiftStateEnum) do
|
||||
if FCheckBoxes[s]=AComponent then begin
|
||||
FCheckBoxes[s]:=nil;
|
||||
Exclude(FShiftButtons,s);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TCustomShortCutGrabBox.ShiftToStr(s: TShiftStateEnum): string;
|
||||
begin
|
||||
case s of
|
||||
ssShift: Result:='Shift';
|
||||
ssAlt: Result:='Alt';
|
||||
ssCtrl: Result:='Ctrl';
|
||||
ssMeta: Result:='Meta';
|
||||
ssSuper: Result:='Super';
|
||||
ssHyper: {$IFDEF Darwin}
|
||||
Result:='Cmd';
|
||||
{$ELSE}
|
||||
Result:='Hyper';
|
||||
{$ENDIF}
|
||||
ssAltGr: Result:='AltGr';
|
||||
ssCaps: Result:='Caps';
|
||||
ssNum: Result:='Numlock';
|
||||
ssScroll: Result:='Scroll';
|
||||
else Result:='Modifier'+IntToStr(ord(s));
|
||||
end;
|
||||
end;
|
||||
|
||||
constructor TCustomShortCutGrabBox.Create(TheOwner: TComponent);
|
||||
var
|
||||
i: Integer;
|
||||
s: String;
|
||||
begin
|
||||
inherited Create(TheOwner);
|
||||
|
||||
FAllowedShifts:=[ssShift, ssAlt, ssCtrl,
|
||||
ssMeta, ssSuper, ssHyper, ssAltGr,
|
||||
ssCaps, ssNum, ssScroll];
|
||||
|
||||
FGrabButton:=TButton.Create(Self);
|
||||
with FGrabButton do begin
|
||||
Name:='GrabButton';
|
||||
Caption:='Grab key';
|
||||
Align:=alRight;
|
||||
AutoSize:=true;
|
||||
Parent:=Self;
|
||||
OnClick:=@OnGrabButtonClick;
|
||||
end;
|
||||
|
||||
FKeyComboBox:=TComboBox.Create(Self);
|
||||
with FKeyComboBox do begin
|
||||
Name:='FKeyComboBox';
|
||||
AutoSize:=true;
|
||||
Items.BeginUpdate;
|
||||
for i:=1 to 145 do begin
|
||||
s := KeyAndShiftStateToEditorKeyString(i, []);
|
||||
if not EditorKeyStringIsIrregular(s) then
|
||||
Items.Add(s);
|
||||
end;
|
||||
Items.EndUpdate;
|
||||
OnEditingDone:=@OnKeyComboboxEditingDone;
|
||||
Parent:=Self;
|
||||
AnchorToNeighbour(akRight,6,FGrabButton);
|
||||
AnchorVerticalCenterTo(FGrabButton);
|
||||
end;
|
||||
|
||||
BevelOuter:=bvNone;
|
||||
ShiftButtons:=GetDefaultShiftButtons;
|
||||
ShiftState:=[];
|
||||
Key:=VK_UNKNOWN;
|
||||
KeyComboBox.Text:=KeyAndShiftStateToEditorKeyString(Key,[]);
|
||||
end;
|
||||
|
||||
function TCustomShortCutGrabBox.GetDefaultShiftButtons: TShiftState;
|
||||
begin
|
||||
{$IFDEF Darwin}
|
||||
Result:=[ssCtrl,ssShift,ssAlt,ssHyper];
|
||||
{$ELSE}
|
||||
Result:=[ssCtrl,ssShift,ssAlt];
|
||||
{$ENDIF}
|
||||
end;
|
||||
|
||||
{ TShortCutDialog }
|
||||
|
||||
procedure TShortCutDialog.FormCreate(Sender: TObject);
|
||||
begin
|
||||
Caption := srkmEditForCmd;
|
||||
OkButton.Caption:=lisOkBtn;
|
||||
CancelButton.Caption:=dlgCancel;
|
||||
|
||||
IDEDialogLayoutList.ApplyLayout(Self, 480, 480);
|
||||
|
||||
FShowSecondary:=true;
|
||||
FShowSequence:=true;
|
||||
|
||||
FPrimaryKey1Box:=TShortCutGrabBox.Create(Self);
|
||||
with FPrimaryKey1Box do begin
|
||||
Name:='FPrimaryKey1Box';
|
||||
Align:=alClient;
|
||||
AutoSize:=true;
|
||||
BorderSpacing.Around:=6;
|
||||
Parent:=PrimaryGroupBox;
|
||||
end;
|
||||
FPrimaryKey2Box:=TShortCutGrabBox.Create(Self);
|
||||
with FPrimaryKey2Box do begin
|
||||
Name:='FPrimaryKey2Box';
|
||||
Align:=alBottom;
|
||||
AutoSize:=true;
|
||||
BorderSpacing.Around:=6;
|
||||
Parent:=PrimaryGroupBox;
|
||||
end;
|
||||
PrimaryGroupBox.AutoSize:=true;
|
||||
|
||||
FSecondaryKey1Box:=TShortCutGrabBox.Create(Self);
|
||||
with FSecondaryKey1Box do begin
|
||||
Name:='FSecondaryKey1Box';
|
||||
Align:=alClient;
|
||||
AutoSize:=true;
|
||||
BorderSpacing.Around:=6;
|
||||
Parent:=SecondaryGroupBox;
|
||||
end;
|
||||
FSecondaryKey2Box:=TShortCutGrabBox.Create(Self);
|
||||
with FSecondaryKey2Box do begin
|
||||
Name:='FSecondaryKey2Box';
|
||||
Align:=alBottom;
|
||||
AutoSize:=true;
|
||||
BorderSpacing.Around:=6;
|
||||
Parent:=SecondaryGroupBox;
|
||||
end;
|
||||
SecondaryGroupBox.AutoSize:=true;
|
||||
|
||||
UpdateCaptions;
|
||||
ClearKeys;
|
||||
end;
|
||||
|
||||
procedure TShortCutDialog.CancelButtonClick(Sender: TObject);
|
||||
begin
|
||||
IDEDialogLayoutList.SaveLayout(Self);
|
||||
end;
|
||||
|
||||
procedure TShortCutDialog.OkButtonClick(Sender: TObject);
|
||||
var
|
||||
NewKeyA: TIDEShortCut;
|
||||
NewKeyB: TIDEShortCut;
|
||||
CurRelation: TKeyCommandRelation;
|
||||
begin
|
||||
IDEDialogLayoutList.SaveLayout(Self);
|
||||
|
||||
if KeyCommandRelationList=nil then begin
|
||||
ModalResult:=mrOk;
|
||||
exit;
|
||||
end;
|
||||
|
||||
// set defaults
|
||||
NewKeyA:=PrimaryShortCut;
|
||||
NewKeyB:=SecondaryShortCut;
|
||||
|
||||
//debugln('TShortCutDialog.OkButtonClick A ShortcutA=',KeyAndShiftStateToEditorKeyString(NewKeyA),' ShortcutB=',KeyAndShiftStateToEditorKeyString(NewKeyB));
|
||||
|
||||
// get old relation
|
||||
CurRelation:=KeyCommandRelationList.Relations[RelationIndex];
|
||||
|
||||
if not ResolveConflicts(NewKeyA,CurRelation.Category.Scope) then
|
||||
begin
|
||||
debugln('TShortCutDialog.OkButtonClick ResolveConflicts failed for key1');
|
||||
exit;
|
||||
end;
|
||||
|
||||
//debugln('TShortCutDialog.OkButtonClick B ShortcutA=',KeyAndShiftStateToEditorKeyString(NewKeyA),' ShortcutB=',KeyAndShiftStateToEditorKeyString(NewKeyB));
|
||||
|
||||
if (NewKeyA.Key1=NewKeyB.Key1) and (NewKeyA.Shift1=NewKeyB.Shift1) and
|
||||
(NewKeyA.Key2=NewKeyB.Key2) and (NewKeyA.Shift2=NewKeyB.Shift2) then
|
||||
begin
|
||||
NewKeyB.Key1:=VK_UNKNOWN;
|
||||
NewKeyB.Shift1:=[];
|
||||
NewKeyB.Key2:=VK_UNKNOWN;
|
||||
NewKeyB.Shift2:=[];
|
||||
end
|
||||
else if not ResolveConflicts(NewKeyB,CurRelation.Category.Scope)
|
||||
then begin
|
||||
debugln('TShortCutDialog.OkButtonClick ResolveConflicts failed for key1');
|
||||
exit;
|
||||
end;
|
||||
|
||||
//debugln('TShortCutDialog.OkButtonClick C ShortcutA=',KeyAndShiftStateToEditorKeyString(NewKeyA),' ShortcutB=',KeyAndShiftStateToEditorKeyString(NewKeyB));
|
||||
|
||||
if NewKeyA.Key1=VK_UNKNOWN then
|
||||
begin
|
||||
NewKeyA:=NewKeyB;
|
||||
NewKeyB.Key1:=VK_UNKNOWN;
|
||||
NewKeyB.Shift1:=[];
|
||||
NewKeyB.Key2:=VK_UNKNOWN;
|
||||
NewKeyB.Shift2:=[];
|
||||
end;
|
||||
|
||||
//debugln('TShortCutDialog.OkButtonClick D ShortcutA=',KeyAndShiftStateToEditorKeyString(NewKeyA),' ShortcutB=',KeyAndShiftStateToEditorKeyString(NewKeyB));
|
||||
|
||||
CurRelation.ShortcutA:=NewKeyA;
|
||||
CurRelation.ShortcutB:=NewKeyB;
|
||||
|
||||
//debugln('TShortCutDialog.OkButtonClick B ShortcutA=',KeyAndShiftStateToEditorKeyString(NewKeyA),' ShortcutB=',KeyAndShiftStateToEditorKeyString(NewKeyB));
|
||||
ModalResult:=mrOk;
|
||||
end;
|
||||
|
||||
procedure TShortCutDialog.SetShowSecondary(const AValue: boolean);
|
||||
begin
|
||||
if FShowSecondary=AValue then exit;
|
||||
FShowSecondary:=AValue;
|
||||
SecondaryGroupBox.Visible:=FShowSecondary;
|
||||
end;
|
||||
|
||||
procedure TShortCutDialog.SetPrimaryShortCut(const AValue: TIDEShortCut);
|
||||
var
|
||||
APrimaryShortCut: TIDEShortCut;
|
||||
begin
|
||||
APrimaryShortCut:=GetPrimaryShortCut;
|
||||
if CompareIDEShortCuts(@APrimaryShortCut,@AValue)=0 then exit;
|
||||
PrimaryKey1Box.Key:=AValue.Key1;
|
||||
PrimaryKey1Box.ShiftState:=AValue.Shift1;
|
||||
PrimaryKey2Box.Key:=AValue.Key2;
|
||||
PrimaryKey2Box.ShiftState:=AValue.Shift2;
|
||||
end;
|
||||
|
||||
function TShortCutDialog.GetPrimaryShortCut: TIDEShortCut;
|
||||
begin
|
||||
Result.Key1:=PrimaryKey1Box.Key;
|
||||
Result.Shift1:=PrimaryKey1Box.ShiftState;
|
||||
Result.Key2:=PrimaryKey2Box.Key;
|
||||
Result.Shift2:=PrimaryKey2Box.ShiftState;
|
||||
end;
|
||||
|
||||
function TShortCutDialog.GetSecondaryShortCut: TIDEShortCut;
|
||||
begin
|
||||
Result.Key1:=SecondaryKey1Box.Key;
|
||||
Result.Shift1:=SecondaryKey1Box.ShiftState;
|
||||
Result.Key2:=SecondaryKey2Box.Key;
|
||||
Result.Shift2:=SecondaryKey2Box.ShiftState;
|
||||
end;
|
||||
|
||||
procedure TShortCutDialog.SetSecondaryShortCut(const AValue: TIDEShortCut);
|
||||
var
|
||||
ASecondaryShortCut: TIDEShortCut;
|
||||
begin
|
||||
ASecondaryShortCut:=SecondaryShortCut;
|
||||
if CompareIDEShortCuts(@ASecondaryShortCut,@AValue)=0 then exit;
|
||||
SecondaryKey1Box.Key:=AValue.Key1;
|
||||
SecondaryKey1Box.ShiftState:=AValue.Shift1;
|
||||
SecondaryKey2Box.Key:=AValue.Key2;
|
||||
SecondaryKey2Box.ShiftState:=AValue.Shift2;
|
||||
end;
|
||||
|
||||
procedure TShortCutDialog.SetShowSequence(const AValue: boolean);
|
||||
begin
|
||||
if FShowSequence=AValue then exit;
|
||||
FShowSequence:=AValue;
|
||||
FPrimaryKey2Box.Visible:=FShowSequence;
|
||||
FSecondaryKey2Box.Visible:=FShowSequence;
|
||||
UpdateCaptions;
|
||||
end;
|
||||
|
||||
function TShortCutDialog.ResolveConflicts(Key: TIDEShortCut;
|
||||
Scope: TIDECommandScope): boolean;
|
||||
type
|
||||
TConflictType = (ctNone,ctConflictKeyA,ctConflictKeyB);
|
||||
var
|
||||
ConflictRelation: TKeyCommandRelation;
|
||||
ConflictName: String;
|
||||
CurRelation: TKeyCommandRelation;
|
||||
CurName: String;
|
||||
j: integer;
|
||||
conflictType: TConflictType;
|
||||
begin
|
||||
// search for conflict
|
||||
CurRelation:=KeyCommandRelationList.Relations[RelationIndex];
|
||||
if Key.Key1=VK_UNKNOWN then
|
||||
begin
|
||||
Result:=true;
|
||||
exit;
|
||||
end;
|
||||
//Try to find an IDE command that conflicts
|
||||
for j:=0 to KeyCommandRelationList.RelationCount-1 do begin
|
||||
conflictType:=ctNone;
|
||||
ConflictRelation:=KeyCommandRelationList.Relations[j];
|
||||
with ConflictRelation do
|
||||
begin
|
||||
if (j=RelationIndex) then continue;
|
||||
|
||||
if not Category.ScopeIntersects(Scope) then continue;
|
||||
|
||||
if ((Key.Key1=ShortcutA.Key1) and (Key.Shift1=ShortcutA.Shift1))
|
||||
and (((Key.Key2=ShortcutA.Key2) and (Key.Shift2=ShortcutA.Shift2))
|
||||
or (Key.Key2=VK_UNKNOWN) or (ShortcutA.Key2=VK_UNKNOWN))
|
||||
then begin
|
||||
conflictType:=ctConflictKeyA; // ShortcutA bites
|
||||
end
|
||||
else if ((Key.Key1=ShortcutB.Key1) and (Key.Shift1=ShortcutB.Shift1))
|
||||
and (((Key.Key2=ShortcutB.Key2) and (Key.Shift2=ShortcutB.Shift2))
|
||||
or (Key.Key2<>VK_UNKNOWN) or (ShortcutB.Key2=VK_UNKNOWN))
|
||||
then begin
|
||||
conflictType:=ctConflictKeyB; // ShortcutB bites
|
||||
end;
|
||||
end;
|
||||
if (conflictType<>ctNone) then begin
|
||||
CurName:=CurRelation.GetCategoryAndName;
|
||||
ConflictName:=ConflictRelation.GetCategoryAndName;
|
||||
if conflictType=ctConflictKeyA then
|
||||
ConflictName:=ConflictName
|
||||
+' ('+KeyAndShiftStateToEditorKeyString(ConflictRelation.ShortcutA)
|
||||
else
|
||||
ConflictName:=ConflictName
|
||||
+' ('+KeyAndShiftStateToEditorKeyString(ConflictRelation.ShortcutB);
|
||||
if MessageDlg(lisPEConflictFound,
|
||||
Format(lisTheKeyIsAlreadyAssignedToRemoveTheOldAssignmentAnd, [
|
||||
KeyAndShiftStateToEditorKeyString(Key), #13, ConflictName, #13, #13,
|
||||
#13, CurName]), mtConfirmation, [mbYes, mbNo], 0) <> mrYes then
|
||||
begin
|
||||
Result:=false;
|
||||
exit;
|
||||
end;
|
||||
if (conflictType=ctConflictKeyA) then
|
||||
ConflictRelation.ShortcutA:=ConflictRelation.ShortcutB;
|
||||
ConflictRelation.ClearShortcutB;
|
||||
end;
|
||||
end;
|
||||
|
||||
Result:=true;
|
||||
end;
|
||||
|
||||
procedure TShortCutDialog.UpdateCaptions;
|
||||
begin
|
||||
if ShowSequence then begin
|
||||
PrimaryGroupBox.Caption:=lisKeyOr2KeySequence;
|
||||
SecondaryGroupBox.Caption:=lisAlternativeKeyOr2KeySequence;
|
||||
end else begin
|
||||
PrimaryGroupBox.Caption:=lisEdtExtToolKey;
|
||||
SecondaryGroupBox.Caption:=lisAlternativeKey;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TShortCutDialog.ClearKeys;
|
||||
begin
|
||||
PrimaryShortCut:=CleanIDEShortCut;
|
||||
SecondaryShortCut:=CleanIDEShortCut;
|
||||
end;
|
||||
|
||||
procedure TShortCutDialog.SetRelation(
|
||||
AKeyCommandRelationList: TKeyCommandRelationList; Index: integer);
|
||||
var
|
||||
CurRelation: TKeyCommandRelation;
|
||||
begin
|
||||
KeyCommandRelationList:=AKeyCommandRelationList;
|
||||
RelationIndex:=Index;
|
||||
CurRelation:=AKeyCommandRelationList.Relations[RelationIndex];
|
||||
PrimaryShortCut:=CurRelation.ShortcutA;
|
||||
SecondaryShortCut:=CurRelation.ShortcutB;
|
||||
Caption:=srkmCommand+' "'+CurRelation.LocalizedName+'"';
|
||||
end;
|
||||
|
||||
initialization
|
||||
{$I keymapshortcutdlg.lrs}
|
||||
|
||||
end.
|
||||
|
@ -1691,11 +1691,17 @@ resourcestring
|
||||
//
|
||||
srkmEditKeys ='Edit Keys';
|
||||
srkmCommand = 'Command:';
|
||||
lisKeyOr2KeySequence = 'Key (or 2 key sequence)';
|
||||
lisTheKeyIsAlreadyAssignedToRemoveTheOldAssignmentAnd = 'The key %s%sis '
|
||||
+'already assigned to %s.%s%sRemove the old assignment and assign the key '
|
||||
+'to the new function%s%s?';
|
||||
lisAlternativeKeyOr2KeySequence = 'Alternative key (or 2 key sequence)';
|
||||
srkmConflic = 'Conflict ';
|
||||
srkmConflicW = ' conflicts with ';
|
||||
srkmCommand1 = ' command1 "';
|
||||
srkmCommand2 = ' command2 "';
|
||||
srkmEditForCmd='Edit keys of command';
|
||||
lisChooseAKey = 'Choose a key ...';
|
||||
srkmKey = 'Key (or 2 keys combination)';
|
||||
srkmGrabKey = 'Grab key';
|
||||
srkmGrabSecondKey = 'Grab second key';
|
||||
@ -2713,6 +2719,7 @@ resourcestring
|
||||
+'Free Pascal Compiler messages';
|
||||
lisEdtExtToolScanOutputForMakeMessages = 'Scan output for make messages';
|
||||
lisEdtExtToolKey = 'Key';
|
||||
lisAlternativeKey = 'Alternative key';
|
||||
lisEdtExtToolCtrl = 'Ctrl';
|
||||
lisEdtExtToolAlt = 'Alt';
|
||||
lisEdtExtToolShift = 'Shift';
|
||||
|
Loading…
Reference in New Issue
Block a user