FIX: Issue [0000715] Language change does not update toolbar buttons text.

Now Hint for Command menu items is not saved to xml file if it is the same as default text for the action. Then on loading the toolbar the hint is set based on current language.
This commit is contained in:
cobines 2013-08-23 20:07:51 +00:00
commit 7e69ed448b
4 changed files with 95 additions and 34 deletions

View file

@ -93,6 +93,10 @@ type
strict private
FID: String; // Unique identificator of the button
function GetID: String;
strict protected
procedure SaveHint(Config: TXmlConfig; Node: TXmlNode); virtual;
procedure SaveIcon(Config: TXmlConfig; Node: TXmlNode); virtual;
procedure SaveText(Config: TXmlConfig; Node: TXmlNode); virtual;
public
Icon: String;
Text: String;
@ -495,11 +499,26 @@ end;
procedure TKASNormalItem.SaveContents(Config: TXmlConfig; Node: TXmlNode);
begin
Config.AddValue(Node, 'ID', ID);
Config.AddValueDef(Node, 'Text', Text, '');
Config.AddValueDef(Node, 'Icon', Icon, '');
SaveText(Config, Node);
SaveIcon(Config, Node);
SaveHint(Config, Node);
end;
procedure TKASNormalItem.SaveHint(Config: TXmlConfig; Node: TXmlNode);
begin
Config.AddValueDef(Node, 'Hint', Hint, '');
end;
procedure TKASNormalItem.SaveIcon(Config: TXmlConfig; Node: TXmlNode);
begin
Config.AddValueDef(Node, 'Icon', Icon, '');
end;
procedure TKASNormalItem.SaveText(Config: TXmlConfig; Node: TXmlNode);
begin
Config.AddValueDef(Node, 'Text', Text, '');
end;
{ TKASToolBarItems }
constructor TKASToolBarItems.Create;

View file

@ -547,7 +547,6 @@ type
procedure AddVirtualDriveButton(dskPanel: TKASToolBar);
procedure AddSpecialButtons(dskPanel: TKASToolBar);
procedure HideToTray;
procedure LoadMainToolbar;
procedure RestoreFromTray;
procedure ShowTrayIcon(bShow: Boolean);
procedure HideTrayIconDelayed(Data: PtrInt);
@ -648,6 +647,7 @@ type
procedure LoadTabsCommandLine(Params: TCommandLineParams);
procedure LoadWindowState;
procedure SaveWindowState;
procedure LoadMainToolbar;
procedure SaveMainToolBar;
function IsCommandLineVisible: Boolean;
procedure ShowDrivesList(APanel: TFilePanelSelect);
@ -986,7 +986,7 @@ begin
begin
if mbFileExists(BarFileName) then
begin
ToolBarLoader := TKASToolBarIniLoader.Create;
ToolBarLoader := TKASToolBarIniLoader.Create(Commands.Commands);
try
ToolBarLoader.Load(BarFileName, MainToolBar, nil, @ConvertIniToolbarItem);
SaveMainToolBar;
@ -1698,24 +1698,6 @@ begin
SetPanelDrive(fpLeft, DriveItem.Drive, True);
end;
procedure TfrmMain.LoadMainToolbar;
var
ToolBarLoader: TKASToolBarExtendedLoader;
ToolBarNode: TXmlNode;
begin
MainToolBar.BeginUpdate;
ToolBarLoader := TKASToolBarExtendedLoader.Create;
try
MainToolBar.Clear;
ToolBarNode := gConfig.FindNode(gConfig.RootNode, 'Toolbars/MainToolbar', False);
if Assigned(ToolBarNode) then
MainToolBar.LoadConfiguration(gConfig, ToolBarNode, ToolBarLoader);
finally
ToolBarLoader.Free;
MainToolBar.EndUpdate;
end;
end;
procedure TfrmMain.MainToolBarDragDrop(Sender, Source: TObject; X, Y: Integer);
var
aFile: TFile;
@ -2311,10 +2293,10 @@ procedure TfrmMain.CreateDefaultToolbar;
var
CommandItem: TKASCommandItem;
begin
CommandItem := TKASCommandItem.Create;
CommandItem := TKASCommandItem.Create(Commands.Commands);
CommandItem.Icon := Icon;
CommandItem.Command := Command;
CommandItem.Hint := Commands.Commands.GetCommandCaption(Command, cctLong);
// Leave CommandItem.Hint empty. It will be loaded at startup based on language.
MainToolBar.AddButton(CommandItem);
end;
procedure AddSeparator;
@ -4402,7 +4384,7 @@ begin
begin
Stream.Position := Length(DCToolItemClipboardHeader);
Serializer := TKASToolBarSerializer.Create;
Loader := TKASToolBarExtendedLoader.Create;
Loader := TKASToolBarExtendedLoader.Create(Commands.Commands);
try
ToolItem := Serializer.Deserialize(Stream, Loader);
MainToolBar.InsertButton(Button, ToolItem);
@ -4700,6 +4682,24 @@ begin
gConfig.SetValue(ANode, 'Splitter', FMainSplitterPos);
end;
procedure TfrmMain.LoadMainToolbar;
var
ToolBarLoader: TKASToolBarExtendedLoader;
ToolBarNode: TXmlNode;
begin
MainToolBar.BeginUpdate;
ToolBarLoader := TKASToolBarExtendedLoader.Create(Commands.Commands);
try
MainToolBar.Clear;
ToolBarNode := gConfig.FindNode(gConfig.RootNode, 'Toolbars/MainToolbar', False);
if Assigned(ToolBarNode) then
MainToolBar.LoadConfiguration(gConfig, ToolBarNode, ToolBarLoader);
finally
ToolBarLoader.Free;
MainToolBar.EndUpdate;
end;
end;
procedure TfrmMain.SaveMainToolBar;
var
ToolBarNode: TXmlNode;

View file

@ -325,7 +325,7 @@ procedure TfrmOptionsToolbar.LoadToolbar(ToolBar: TKASToolBar; Config: TXmlConfi
var
ToolBarLoader: TKASToolBarExtendedLoader;
begin
ToolBarLoader := TKASToolBarExtendedLoader.Create;
ToolBarLoader := TKASToolBarExtendedLoader.Create(FFormCommands);
try
if Assigned(RootNode) then
ToolBar.LoadConfiguration(Config, RootNode, ToolBarLoader);
@ -403,7 +403,7 @@ begin
begin
case rgToolItemType.ItemIndex of
0: ToolItem := TKASSeparatorItem.Create;
1: ToolItem := TKASCommandItem.Create;
1: ToolItem := TKASCommandItem.Create(FFormCommands);
2: ToolItem := TKASProgramItem.Create;
3: ToolItem := TKASMenuItem.Create;
end;
@ -485,7 +485,7 @@ function TfrmOptionsToolbar.AddNewSubToolbar(ToolItem: TKASMenuItem): TKASToolBa
begin
Result := CreateToolbar(ToolItem.SubItems);
if Result.ButtonCount = 0 then
Result.AddButton(TKASCommandItem.Create);
Result.AddButton(TKASCommandItem.Create(FFormCommands));
end;
procedure TfrmOptionsToolbar.ApplyEditControls;
@ -535,7 +535,7 @@ begin
if Assigned(ToolBar) then
begin
FCurrentButton := ToolBar.InsertButton(FCurrentButton, TKASCommandItem.Create);
FCurrentButton := ToolBar.InsertButton(FCurrentButton, TKASCommandItem.Create(FFormCommands));
PressButtonDown(FCurrentButton);
end;
end;

View file

@ -28,14 +28,20 @@ interface
uses
Classes, SysUtils, KASToolItems, KASToolBar, IniFiles, DCXmlConfig,
uDrive, DCBasicTypes;
uDrive, DCBasicTypes, uFormCommands;
type
{ TKASCommandItem }
TKASCommandItem = class(TKASNormalItem)
strict private
FCommands: IFormCommands;
strict protected
procedure SaveHint(Config: TXmlConfig; Node: TXmlNode); override;
public
Command: String;
Params: TDynamicStringArray;
constructor Create(AFormCommands: IFormCommands); reintroduce;
procedure Assign(OtherItem: TKASToolItem); override;
function Clone: TKASToolItem; override;
function ConfigNodeName: String; override;
@ -72,17 +78,23 @@ type
{ TKASToolBarIniLoader }
TKASToolBarIniLoader = class
private
strict private
FCommands: IFormCommands;
FDepthLevel: Integer; // In case .bar files reference each other
public
constructor Create(AFormCommands: IFormCommands); reintroduce;
procedure Load(IniFileName: String; ToolBar: TKASToolBar; ToolItemMenu: TKASMenuItem; OnLoadIniItem: TOnLoadIniItem);
end;
{ TKASToolBarExtendedLoader }
TKASToolBarExtendedLoader = class(TKASToolBarLoader)
strict private
FCommands: IFormCommands;
protected
function CreateItem(Node: TXmlNode): TKASToolItem; override;
public
constructor Create(AFormCommands: IFormCommands); reintroduce;
end;
implementation
@ -137,7 +149,7 @@ end;
function TKASCommandItem.Clone: TKASToolItem;
begin
Result := TKASCommandItem.Create;
Result := TKASCommandItem.Create(FCommands);
Result.Assign(Self);
end;
@ -146,6 +158,11 @@ begin
Result := CommandItemConfigNode;
end;
constructor TKASCommandItem.Create(AFormCommands: IFormCommands);
begin
FCommands := AFormCommands;
end;
procedure TKASCommandItem.Load(Config: TXmlConfig; Node: TXmlNode; Loader: TKASToolBarLoader);
begin
inherited Load(Config, Node, Loader);
@ -159,6 +176,11 @@ begin
AddString(Params, Config.GetContent(Node));
Node := Node.NextSibling;
end;
if Hint = EmptyStr then
begin
Hint := FCommands.GetCommandCaption(Command, cctLong);
end;
end;
procedure TKASCommandItem.SaveContents(Config: TXmlConfig; Node: TXmlNode);
@ -171,6 +193,16 @@ begin
Config.AddValueDef(Node, 'Param', AParam, '');
end;
procedure TKASCommandItem.SaveHint(Config: TXmlConfig; Node: TXmlNode);
begin
if Hint <> FCommands.GetCommandCaption(Command, cctLong) then
begin
Config.AddValueDef(Node, 'Hint', Hint, '');
end;
// else don't save default text for the hint so that a different text
// can be loaded if the language changes.
end;
{ TKASProgramItem }
procedure TKASProgramItem.Assign(OtherItem: TKASToolItem);
@ -224,13 +256,18 @@ end;
{ TKASToolBarExtendedLoader }
constructor TKASToolBarExtendedLoader.Create(AFormCommands: IFormCommands);
begin
FCommands := AFormCommands;
end;
function TKASToolBarExtendedLoader.CreateItem(Node: TXmlNode): TKASToolItem;
begin
Result := inherited CreateItem(Node);
if not Assigned(Result) then
begin
if Node.CompareName(CommandItemConfigNode) = 0 then
Result := TKASCommandItem.Create
Result := TKASCommandItem.Create(FCommands)
else if Node.CompareName(ProgramItemConfigNode) = 0 then
Result := TKASProgramItem.Create
else if Node.CompareName(DriveItemConfigNode) = 0 then
@ -240,6 +277,11 @@ end;
{ TKASToolBarIniLoader }
constructor TKASToolBarIniLoader.Create(AFormCommands: IFormCommands);
begin
FCommands := AFormCommands;
end;
procedure TKASToolBarIniLoader.Load(IniFileName: String; ToolBar: TKASToolBar; ToolItemMenu: TKASMenuItem; OnLoadIniItem: TOnLoadIniItem);
var
BtnCount, I: Integer;
@ -272,7 +314,7 @@ begin
end
else if (Length(Command) > 3) and (Copy(Command, 1, 3) = 'cm_') then
begin
CommandItem := TKASCommandItem.Create;
CommandItem := TKASCommandItem.Create(FCommands);
CommandItem.Command := Command;
CommandItem.Hint := Menu;
CommandItem.Icon := Button;