unit MouseActionDialog; {$mode objfpc}{$H+} interface uses Classes, LResources, Forms, Controls, ExtCtrls, StdCtrls, ButtonPanel, Spin, SynEditMouseCmds, LazarusIDEStrConsts, KeyMapping, IDECommands; var ButtonName: Array [TMouseButton] of String; ClickName: Array [TSynMAClickCount] of String; ButtonDirName: Array [TSynMAClickDir] of String; type { TMouseaActionDialog } TMouseaActionDialog = class(TForm) ActionBox: TComboBox; ActionLabel: TLabel; AltCheck: TCheckBox; BtnDefault: TButton; BtnLabel: TLabel; ButtonBox: TComboBox; ButtonPanel1: TButtonPanel; CaretCheck: TCheckBox; ClickBox: TComboBox; PriorLabel: TLabel; OptBox: TComboBox; CtrlCheck: TCheckBox; DirCheck: TCheckBox; CapturePanel: TPanel; OptLabel: TLabel; ShiftCheck: TCheckBox; PriorSpin: TSpinEdit; procedure ActionBoxChange(Sender: TObject); procedure BtnDefaultClick(Sender: TObject); procedure CapturePanelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); private FKeyMap: TKeyCommandRelationList; public { public declarations } Procedure ResetInputs; Procedure ReadFromAction(MAct: TSynEditMouseAction); Procedure WriteToAction(MAct: TSynEditMouseAction); property KeyMap: TKeyCommandRelationList read FKeyMap write FKeyMap; end; function KeyMapIndexOfCommand(AKeyMap: TKeyCommandRelationList; ACmd: Word) : Integer; implementation const BtnToIndex: array [mbLeft..mbExtra2] of Integer = (0, 1, 2, 3, 4); ClickToIndex: array [ccSingle..ccAny] of Integer = (0, 1, 2, 3, 4); IndexToBtn: array [0..4] of TMouseButton = (mbLeft, mbRight, mbMiddle, mbExtra1, mbExtra2); IndexToClick: array [0..4] of TSynMAClickCount = (ccSingle, ccDouble, ccTriple, ccQuad, ccAny); function KeyMapIndexOfCommand(AKeyMap: TKeyCommandRelationList; ACmd: Word): Integer; var i: Integer; begin for i := 0 to AKeyMap.RelationCount - 1 do if AKeyMap.Relations[i].Command = ACmd then exit(i); Result := -1; end; { MouseaActionDialog } procedure TMouseaActionDialog.FormCreate(Sender: TObject); var i: Integer; CName: String; mb: TMouseButton; cc: TSynMAClickCount; begin ButtonName[mbLeft]:=dlgMouseOptBtnLeft; ButtonName[mbRight]:=dlgMouseOptBtnRight; ButtonName[mbMiddle]:=dlgMouseOptBtnMiddle; ButtonName[mbExtra1]:=dlgMouseOptBtnExtra1; ButtonName[mbExtra2]:=dlgMouseOptBtnExtra2; ClickName[ccSingle]:=dlgMouseOptBtn1; ClickName[ccDouble]:=dlgMouseOptBtn2; ClickName[ccTriple]:=dlgMouseOptBtn3; ClickName[ccQuad]:=dlgMouseOptBtn4; ClickName[ccAny]:=dlgMouseOptBtnAny; ButtonDirName[cdUp]:=dlgMouseOptBtnUp; ButtonDirName[cdDown]:=dlgMouseOptBtnDown; Caption := dlgMouseOptDlgTitle; CapturePanel.Caption := dlgMouseOptCapture; CapturePanel.ControlStyle := ControlStyle + [csTripleClicks, csQuadClicks]; CaretCheck.Caption := dlgMouseOptCaretMove; ActionBox.Clear; for i:= 0 to emcMax do begin CName := MouseCommandName(i); if CName <> '' then ActionBox.Items.AddObject(CName, TObject(ptrint(i))); end; ButtonBox.Clear; for mb := low(TMouseButton) to high(TMouseButton) do ButtonBox.Items.add(ButtonName[mb]); ClickBox.Clear; for cc:= low(TSynMAClickCount) to high(TSynMAClickCount) do ClickBox.Items.add(ClickName[cc]); DirCheck.Caption := dlgMouseOptCheckUpDown; ShiftCheck.Caption := dlgMouseOptModShift; AltCheck.Caption := dlgMouseOptModAlt; CtrlCheck.Caption := dlgMouseOptModCtrl; ActionLabel.Caption := dlgMouseOptDescAction; BtnLabel.Caption := dlgMouseOptDescButton; BtnDefault.Caption := dlgMouseOptBtnModDef; PriorLabel.Caption := dlgMouseOptPriorLabel; end; procedure TMouseaActionDialog.ResetInputs; begin ActionBox.ItemIndex := 0; ButtonBox.ItemIndex := 0; ClickBox.ItemIndex := 0; DirCheck.Checked := False; ShiftCheck.State := cbGrayed; AltCheck.State := cbGrayed; CtrlCheck.State := cbGrayed; ActionBoxChange(nil); OptBox.ItemIndex := 0; end; procedure TMouseaActionDialog.BtnDefaultClick(Sender: TObject); begin ShiftCheck.State := cbGrayed; AltCheck.State := cbGrayed; CtrlCheck.State := cbGrayed; end; procedure TMouseaActionDialog.ActionBoxChange(Sender: TObject); var ACmd: TSynEditorMouseCommand; i: Integer; begin OptBox.Items.Clear; ACmd := TSynEditorMouseCommand(PtrUInt(Pointer(ActionBox.items.Objects[ActionBox.ItemIndex]))); if ACmd = emcSynEditCommand then begin OptBox.Enabled := True; OptBox.Clear; for i := 0 to KeyMap.RelationCount - 1 do if (KeyMap.Relations[i].Category.Scope = IDECmdScopeSrcEdit) or (KeyMap.Relations[i].Category.Scope = IDECmdScopeSrcEditOnly) then OptBox.Items.AddObject(KeyMap.Relations[i].GetLocalizedName, TObject(Pointer(PtrUInt(KeyMap.Relations[i].Command)))); OptLabel.Caption := dlgMouseOptionsynCommand; OptBox.ItemIndex := 0; end else begin OptBox.Items.CommaText := MouseCommandConfigName(ACmd); if OptBox.Items.Count > 0 then begin OptLabel.Caption := OptBox.Items[0]; OptBox.Items.Delete(0); OptBox.Enabled := True; OptBox.ItemIndex := 0; end else begin OptLabel.Caption := ''; OptBox.Enabled := False end; end; end; procedure TMouseaActionDialog.CapturePanelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin ButtonBox.ItemIndex := BtnToIndex[Button]; ClickBox.ItemIndex := 0; if ssDouble in Shift then ClickBox.ItemIndex := 1; if ssTriple in Shift then ClickBox.ItemIndex := 2; if ssQuad in Shift then ClickBox.ItemIndex := 3; ShiftCheck.Checked := ssShift in Shift ; AltCheck.Checked := ssAlt in Shift ; CtrlCheck.Checked := ssCtrl in Shift ; end; procedure TMouseaActionDialog.ReadFromAction(MAct: TSynEditMouseAction); begin ActionBox.ItemIndex := ActionBox.Items.IndexOfObject(TObject(Pointer(PtrUInt(MAct.Command)))); ButtonBox.ItemIndex := BtnToIndex[MAct.Button]; ClickBox.ItemIndex := ClickToIndex[MAct.ClickCount]; DirCheck.Checked := MAct.ClickDir = cdUp; CaretCheck.Checked := MAct.MoveCaret; ShiftCheck.Checked := (ssShift in MAct.ShiftMask) and (ssShift in MAct.Shift); if not(ssShift in MAct.ShiftMask) then ShiftCheck.State := cbGrayed; AltCheck.Checked := (ssAlt in MAct.ShiftMask) and (ssAlt in MAct.Shift); if not(ssAlt in MAct.ShiftMask) then AltCheck.State := cbGrayed; CtrlCheck.Checked := (ssCtrl in MAct.ShiftMask) and (ssCtrl in MAct.Shift); if not(ssCtrl in MAct.ShiftMask) then CtrlCheck.State := cbGrayed; PriorSpin.Value := MAct.Priority; ActionBoxChange(nil); if OptBox.Enabled then begin if MAct.Command = emcSynEditCommand then OptBox.ItemIndex := OptBox.Items.IndexOfObject(TObject(Pointer(PtrUInt(MAct.Option)))) else OptBox.ItemIndex := MAct.Option; end; end; procedure TMouseaActionDialog.WriteToAction(MAct: TSynEditMouseAction); begin MAct.Command := TSynEditorMouseCommand(PtrUInt(Pointer(ActionBox.items.Objects[ActionBox.ItemIndex]))); MAct.Button := IndexToBtn[ButtonBox.ItemIndex]; MAct.ClickCount := IndexToClick[ClickBox.ItemIndex]; MAct.MoveCaret := CaretCheck.Checked; if DirCheck.Checked then MAct.ClickDir := cdUp else MAct.ClickDir := cdDown; MAct.Shift := []; MAct.ShiftMask := []; if ShiftCheck.State <> cbGrayed then MAct.ShiftMask := MAct.ShiftMask + [ssShift]; if AltCheck.State <> cbGrayed then MAct.ShiftMask := MAct.ShiftMask + [ssAlt]; if CtrlCheck.State <> cbGrayed then MAct.ShiftMask := MAct.ShiftMask + [ssCtrl]; if ShiftCheck.Checked then MAct.Shift := MAct.Shift + [ssShift]; if AltCheck.Checked then MAct.Shift := MAct.Shift + [ssAlt]; if CtrlCheck.Checked then MAct.Shift := MAct.Shift + [ssCtrl]; MAct.Priority := PriorSpin.Value; if OptBox.Enabled then begin if MAct.Command = emcSynEditCommand then begin MAct.Option := TSynEditorMouseCommandOpt(PtrUInt(Pointer(OptBox.Items.Objects[OptBox.ItemIndex]))); end else MAct.Option := OptBox.ItemIndex; end else MAct.Option := 0; end; initialization {$I mouseactiondialog.lrs} end.