mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-28 06:43:44 +02:00
171 lines
4.7 KiB
ObjectPascal
171 lines
4.7 KiB
ObjectPascal
unit charactermap_reg;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, LCLIntf, LCLType, Forms, SynEdit, Laz2_XMLCfg,
|
|
MenuIntf, IDECommands, IDEHelpIntf, SrcEditorIntf, EnvironmentOpts,
|
|
CharacterMapFrm;
|
|
|
|
type
|
|
|
|
{ TCharacterMapDialog }
|
|
|
|
TCharacterMapDialog = class(TCharacterMapForm)
|
|
private
|
|
FXMLCfg: TXMLConfig;
|
|
procedure HelpButtonClick(Sender: TObject);
|
|
procedure InsertCharacter(const C: TUTF8Char);
|
|
procedure CloseQueryHandler(Sender: TObject; var CanClose: Boolean);
|
|
procedure LoadConfig;
|
|
procedure SaveConfig;
|
|
protected
|
|
procedure Activate; override;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
end;
|
|
|
|
procedure Register;
|
|
|
|
|
|
implementation
|
|
|
|
var
|
|
CharacterMapDialog: TCharacterMapDialog = nil;
|
|
|
|
procedure ShowCharacterMapProc({%H-}ASender: TObject);
|
|
begin
|
|
if CharacterMapDialog = nil then
|
|
Application.CreateForm(TCharacterMapDialog, CharacterMapDialog);
|
|
CharacterMapDialog.LoadConfig;
|
|
CharacterMapDialog.Show;
|
|
end;
|
|
|
|
{ TCharacterMapDialog }
|
|
|
|
const
|
|
Path = 'CharacterMap/';
|
|
|
|
constructor TCharacterMapDialog.Create(AOwner: TComponent);
|
|
begin
|
|
inherited;
|
|
OnInsertCharacter := @InsertCharacter;
|
|
OnCloseQuery := @CloseQueryHandler;
|
|
FXMLCfg := TXMLConfig.Create(ExtractFilePath(EnvironmentOptions.FileName) + 'charactermap.xml');
|
|
end;
|
|
|
|
destructor TCharacterMapDialog.Destroy;
|
|
begin
|
|
FXMLCfg.Free;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TCharacterMapDialog.Activate;
|
|
begin
|
|
OnShowHelp := @HelpButtonClick;
|
|
end;
|
|
|
|
procedure TCharacterMapDialog.CloseQueryHandler(Sender: TObject;
|
|
var CanClose: Boolean);
|
|
begin
|
|
if CanClose then
|
|
SaveConfig;
|
|
end;
|
|
|
|
procedure TCharacterMapDialog.HelpButtonClick(Sender: TObject);
|
|
begin
|
|
LazarusHelp.ShowHelpForIDEControl(Self);
|
|
end;
|
|
|
|
procedure TCharacterMapDialog.InsertCharacter(const C: TUTF8Char);
|
|
var
|
|
FActiveEdit: TSourceEditorInterface;
|
|
begin
|
|
FActiveEdit := SourceEditorManagerIntf.ActiveSourceWindow.ActiveEditor;
|
|
if Assigned(FActiveEdit) then
|
|
begin
|
|
if FActiveEdit.ReadOnly then Exit;
|
|
if (FActiveEdit.EditorControl is TSynEdit) then
|
|
TSynEdit(FActiveEdit.EditorControl).InsertTextAtCaret(C);
|
|
end;
|
|
end;
|
|
|
|
procedure TCharacterMapDialog.LoadConfig;
|
|
var
|
|
L, T, W, H: Integer;
|
|
R: TRect;
|
|
begin
|
|
L := FXMLCfg.GetValue(Path + 'Position/Left', Left);
|
|
T := FXMLCfg.GetValue(Path + 'Position/Top', Top);
|
|
W := FXMLCfg.GetValue(Path + 'Position/Width', Width);
|
|
H := FXMLCfg.GetValue(Path + 'Position/Height', Height);
|
|
R := Screen.WorkAreaRect;
|
|
if W > R.Width then W := R.Width;
|
|
if H > R.Height then H := R.Height;
|
|
if L < R.Left then L := R.Left;
|
|
if T < R.Top then T := R.Top;
|
|
if L + W > R.Right then L := R.Right - W - GetSystemMetrics(SM_CXSIZEFRAME);
|
|
if T + H > R.Bottom then T := R.Bottom - H - GetSystemMetrics(SM_CYCAPTION) - GetSystemMetrics(SM_CYSIZEFRAME);
|
|
SetBounds(L, T, W, H);
|
|
WindowState := TWindowState(FXMLCfg.GetValue(Path + 'Position/WindowState', 0));
|
|
FontSize := FXMLCfg.GetValue(Path + 'FontSize', 12);
|
|
ActivePage := TCharMapPage(FXMLCfg.GetValue(Path + 'ActivePage', Integer(ActivePage)));
|
|
AlphaSort := FXMLCfg.GetValue(Path + 'SortedUnicodeRangeList', AlphaSort);
|
|
|
|
DropDownCount := EnvironmentOptions.DropDownCount;
|
|
end;
|
|
|
|
procedure TCharacterMapDialog.SaveConfig;
|
|
begin
|
|
FXMLCfg.SetValue(Path + 'Position/Top', RestoredTop);
|
|
FXMLCfg.SetValue(Path + 'Position/Left', RestoredLeft);
|
|
FXMLCfg.SetValue(Path + 'Position/Width', RestoredWidth);
|
|
FXMLCfg.SetValue(Path + 'Position/Height', RestoredHeight);
|
|
FXMLCfg.SetValue(Path + 'Position/WindowState', Integer(WindowState));
|
|
FXMLCfg.SetValue(Path + 'FontSize', FontSize);
|
|
FXMLCfg.SetValue(Path + 'ActivePage', ord(ActivePage));
|
|
FXMLCfg.SetValue(Path + 'SortedUnicodeRangeList', AlphaSort);
|
|
|
|
EnvironmentOptions.DropDownCount := DropDownCount;
|
|
end;
|
|
|
|
|
|
{ Registration }
|
|
|
|
procedure Register;
|
|
const
|
|
cmdInsertCharName = 'cmdInsertCharacter';
|
|
mnuInsertCharName = 'mnuInsertCharacter';
|
|
var
|
|
shortcut: TIDEShortCut;
|
|
category: TIDECommandCategory;
|
|
cmdSP: TIDECommand;
|
|
begin
|
|
shortCut := CleanIDEShortCut;
|
|
|
|
category := IDECommandList.FindIDECommand(ecMultiPaste).Category;
|
|
cmdSP := RegisterIDECommand(
|
|
category,
|
|
cmdInsertCharName, // Name of command
|
|
lisInsertCharacter, // Description of command
|
|
shortcut, // Shortcut
|
|
nil, // OnExecuteMethod
|
|
@ShowCharacterMapProc // OnExecuteProc
|
|
);
|
|
RegisterIDEMenuCommand(
|
|
itmEditInsertions, // Parent
|
|
mnuInsertCharName, // Name
|
|
lisInsertCharacter, // Caption
|
|
nil, // OnClickMethod
|
|
@ShowCharacterMapProc, // OnClickProc
|
|
cmdSP, // Command
|
|
'menu_charmap' // ResourceName of the menu icon
|
|
);
|
|
end;
|
|
|
|
end.
|
|
|