328 lines
11 KiB
ObjectPascal
328 lines
11 KiB
ObjectPascal
{
|
|
File name: kasbarfiles.pas
|
|
|
|
Author: Dmitry Kolomiets (B4rr4cuda@rambler.ru)
|
|
Class working with *.bar files.
|
|
|
|
Based on KASToolBar functions
|
|
Copyright (C) 2006-2007 Koblov Alexander (Alexx2000@mail.ru)
|
|
|
|
contributors:
|
|
|
|
|
|
|
|
This program 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 program 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.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
in a file called COPYING along with this program; if not, write to
|
|
the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA
|
|
02139, USA.
|
|
}
|
|
|
|
unit KASBarFiles;
|
|
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils,IniFiles;
|
|
|
|
type
|
|
|
|
//Button property's type
|
|
//------------------------------------------------------
|
|
TInfor=(ButtonX,
|
|
CmdX,
|
|
ParamX,
|
|
PathX,
|
|
MenuX,
|
|
IconicX,
|
|
MiskX
|
|
);
|
|
//------------------------------------------------------
|
|
|
|
//Class of button
|
|
//---------------------------------
|
|
TKButton=class
|
|
ButtonX:string; //Icon
|
|
CmdX:string; //Command or path
|
|
ParamX:string; //parameters
|
|
PathX:string;
|
|
MenuX:string; //Description
|
|
IconicX:Integer; //-1 0 1 full default minimized ( as TC use)
|
|
MiskX:string; //Aditional info (shortCut or extention or something else)
|
|
end;
|
|
//---------------------------------
|
|
|
|
{ TBarClass }
|
|
|
|
TBarClass=class
|
|
CurrentBar:string;
|
|
|
|
private
|
|
XButtons:Tlist;
|
|
FEnvVar : String;
|
|
FChangePath : String;
|
|
function GetButton(Index: Integer): TKButton;
|
|
function GetButtonCount: Integer;
|
|
function GetCmdDirFromEnvVar(sPath: String): String;
|
|
function SetCmdDirAsEnvVar(sPath: String): String;
|
|
procedure SetButton(Index:Integer; const AValue: TKButton);
|
|
//------------------------------------------------------
|
|
|
|
public
|
|
|
|
Constructor Create;
|
|
destructor Destroy; override;
|
|
//---------------------
|
|
function GetButtonX(Index:integer; What:TInfor):string;
|
|
function InsertButtonX(InsertAt: Integer; ButtonX, CmdX, ParamX, PathX, MenuX, MiskX: String): Integer;
|
|
function AddButtonX(ButtonX, CmdX, ParamX, PathX, MenuX, MiskX: String): Integer;
|
|
//---------------------
|
|
procedure RemoveButton(Index: Integer);
|
|
procedure DeleteAllButtons;
|
|
procedure SetButtonX(Index:integer; What:Tinfor;Value: string);
|
|
procedure LoadFromIniFile(IniFile : TIniFile);
|
|
procedure SaveToIniFile(IniFile : TIniFile);
|
|
procedure LoadFromFile(FileName : String);
|
|
procedure LoadFromStringList(List:TStringList);
|
|
procedure SaveToFile(FileName : String);
|
|
//---------------------
|
|
property ButtonCount: Integer read GetButtonCount;
|
|
property Buttons[Index:Integer]: TKButton read GetButton write SetButton;
|
|
property EnvVar : String read FEnvVar write FEnvVar;
|
|
property ChangePath : String read FChangePath write FChangePath;
|
|
//------------------------------------------------------
|
|
end;
|
|
|
|
implementation
|
|
{ TBarClass }
|
|
|
|
constructor TBarClass.Create;
|
|
begin
|
|
XButtons:=TList.Create;
|
|
end;
|
|
|
|
destructor TBarClass.Destroy;
|
|
var i:integer;
|
|
begin
|
|
if Assigned(XButtons) then
|
|
begin
|
|
if XButtons.Count>0 then
|
|
for I := 0 to XButtons.Count - 1 do
|
|
TKButton(XButtons.Items[I]).Free;
|
|
FreeAndNil(XButtons);
|
|
end;
|
|
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TBarClass.SetButtonX(Index: integer; What: Tinfor; Value: string);
|
|
begin
|
|
If Index>=XButtons.Count then XButtons.Add(TKButton.Create);
|
|
|
|
case What of
|
|
ButtonX: TKButton(XButtons.Items[Index]).ButtonX:=Value;
|
|
cmdX: TKButton(XButtons.Items[Index]).cmdX:=Value;
|
|
paramX: TKButton(XButtons.Items[Index]).paramX:=Value;
|
|
pathX: TKButton(XButtons.Items[Index]).pathX:=Value;
|
|
MenuX: TKButton(XButtons.Items[Index]).menuX:=Value;
|
|
iconicX: begin
|
|
if Value='' then
|
|
TKButton(XButtons.Items[Index]).iconicX:=0
|
|
else
|
|
TKButton(XButtons.Items[Index]).iconicX:=StrToInt(Value);
|
|
end;
|
|
MiskX: TKButton(XButtons.Items[Index]).MiskX:=Value;
|
|
end;
|
|
|
|
end;
|
|
|
|
procedure TBarClass.LoadFromIniFile(IniFile: TIniFile);
|
|
var
|
|
BtnCount, I : Integer;
|
|
begin
|
|
BtnCount := IniFile.ReadInteger('Buttonbar', 'Buttoncount', 0);
|
|
CurrentBar:= IniFile.FileName;
|
|
for I := 1 to BtnCount do
|
|
begin
|
|
XButtons.Add(TKButton.Create);
|
|
TKButton(XButtons[I-1]).ButtonX :=IniFile.ReadString('Buttonbar', 'button' + IntToStr(I), '');
|
|
TKButton(XButtons[I-1]).CmdX := IniFile.ReadString('Buttonbar', 'cmd' + IntToStr(I), '');
|
|
TKButton(XButtons[I-1]).ParamX := IniFile.ReadString('Buttonbar', 'param' + IntToStr(I), '');
|
|
TKButton(XButtons[I-1]).PathX := IniFile.ReadString('Buttonbar', 'path' + IntToStr(I), '');
|
|
TKButton(XButtons[I-1]).MenuX := IniFile.ReadString('Buttonbar', 'menu' + IntToStr(I), '');
|
|
TKButton(XButtons[I-1]).IconicX := IniFile.ReadInteger('Buttonbar', 'icon' + IntToStr(I),0);
|
|
TKButton(XButtons[I-1]).MiskX := IniFile.ReadString('Buttonbar', 'misk' + IntToStr(I), '');
|
|
end;
|
|
end;
|
|
|
|
procedure TBarClass.SaveToIniFile(IniFile: TIniFile);
|
|
var
|
|
I : Integer;
|
|
begin
|
|
//For cleaning. Without this saved file will contain removed buttons
|
|
IniFile.EraseSection('Buttonbar');
|
|
IniFile.WriteInteger('Buttonbar', 'Buttoncount', XButtons.Count);
|
|
|
|
for I := 0 to XButtons.Count - 1 do
|
|
begin
|
|
IniFile.WriteString('Buttonbar', 'button' + IntToStr(I + 1), SetCmdDirAsEnvVar(GetButtonX(I,ButtonX)));
|
|
IniFile.WriteString('Buttonbar', 'cmd' + IntToStr(I + 1), SetCmdDirAsEnvVar(GetButtonX(I,CmdX)));
|
|
IniFile.WriteString('Buttonbar', 'param' + IntToStr(I + 1), GetButtonX(I,ParamX) );
|
|
IniFile.WriteString('Buttonbar', 'path' + IntToStr(I + 1), GetButtonX(I,PathX) );
|
|
IniFile.WriteString('Buttonbar', 'menu' + IntToStr(I + 1),GetButtonX(I,MenuX) );
|
|
IniFile.WriteString('Buttonbar', 'misk' + IntToStr(I + 1),GetButtonX(I,MiskX) );
|
|
end;
|
|
end;
|
|
|
|
function TBarClass.GetButtonX(Index: integer; What: TInfor): string;
|
|
begin
|
|
if (index>=XButtons.Count) or (Index<0) then Exit;
|
|
case What of
|
|
ButtonX: Result := TKButton(XButtons.Items[Index]).ButtonX;
|
|
cmdX: Result := TKButton(XButtons.Items[Index]).CmdX;
|
|
paramX: Result := TKButton(XButtons.Items[Index]).ParamX;
|
|
pathX: Result := TKButton(XButtons.Items[Index]).PathX;
|
|
menuX: Result := TKButton(XButtons.Items[Index]).MenuX;
|
|
iconicX: Result := IntToStr(TKButton(XButtons.Items[Index]).IconicX);
|
|
MiskX: Result := TKButton(XButtons.Items[Index]).MiskX;
|
|
end;
|
|
end;
|
|
|
|
function TBarClass.InsertButtonX(InsertAt: Integer; ButtonX, CmdX, ParamX, PathX, MenuX, MiskX: String): Integer;
|
|
begin
|
|
if InsertAt < 0 then
|
|
InsertAt:= 0;
|
|
if InsertAt > XButtons.Count then
|
|
InsertAt:= XButtons.Count;
|
|
|
|
XButtons.Insert(InsertAt, TKButton.Create);
|
|
|
|
TKButton(XButtons[InsertAt]).CmdX:= CmdX;
|
|
TKButton(XButtons[InsertAt]).ButtonX:= ButtonX;
|
|
TKButton(XButtons[InsertAt]).ParamX:= ParamX;
|
|
TKButton(XButtons[InsertAt]).PathX:= PathX;
|
|
TKButton(XButtons[InsertAt]).MenuX:= MenuX;
|
|
TKButton(XButtons[InsertAt]).MiskX:= MiskX;
|
|
|
|
Result:= InsertAt;
|
|
end;
|
|
|
|
function TBarClass.AddButtonX(ButtonX, CmdX, ParamX, PathX, MenuX, MiskX: String): Integer;
|
|
begin
|
|
Result := InsertButtonX(XButtons.Count, ButtonX, CmdX, ParamX, PathX, MenuX, MiskX);
|
|
end;
|
|
|
|
procedure TBarClass.LoadFromFile(FileName: String);
|
|
var
|
|
IniFile : Tinifile;
|
|
begin
|
|
DeleteAllButtons;
|
|
IniFile := Tinifile.Create(FileName);
|
|
LoadFromIniFile(IniFile);
|
|
IniFile.Free;
|
|
end;
|
|
|
|
|
|
procedure TBarClass.LoadFromStringList(List: TStringList);
|
|
|
|
function ItemOfList(Item:string):string;
|
|
begin
|
|
if (List.IndexOfName(Item)>0) then
|
|
Result:=List.ValueFromIndex[List.IndexOfName(Item)]
|
|
else
|
|
Result:='';
|
|
end;
|
|
|
|
var BtnCount, I : Integer;
|
|
begin
|
|
DeleteAllButtons;
|
|
if (List.IndexOfName('Buttoncount')<>0) then exit;
|
|
BtnCount:=StrToInt(List.ValueFromIndex[List.IndexOfName('Buttoncount')]);
|
|
|
|
CurrentBar:='Virtual';
|
|
for I := 1 to BtnCount do
|
|
begin
|
|
XButtons.Add(TKButton.Create);
|
|
TKButton(XButtons[I-1]).ButtonX :=ItemOfList('button' + IntToStr(I));
|
|
TKButton(XButtons[I-1]).CmdX := ItemOfList('cmd' + IntToStr(I));
|
|
TKButton(XButtons[I-1]).ParamX :=ItemOfList('param' + IntToStr(I));
|
|
TKButton(XButtons[I-1]).PathX := ItemOfList('path' + IntToStr(I));
|
|
TKButton(XButtons[I-1]).MenuX := ItemOfList('menu' + IntToStr(I));
|
|
if (ItemOfList('icon' + IntToStr(I))<>'') then
|
|
TKButton(XButtons[I-1]).IconicX := StrToInt(ItemOfList('icon' + IntToStr(I)));
|
|
TKButton(XButtons[I-1]).MiskX := ItemOfList('misk' + IntToStr(I));
|
|
end;
|
|
|
|
end;
|
|
|
|
procedure TBarClass.SaveToFile(FileName: String);
|
|
var
|
|
IniFile : Tinifile;
|
|
begin
|
|
IniFile := Tinifile.Create(FileName);
|
|
SaveToIniFile(IniFile);
|
|
IniFile.Free;
|
|
end;
|
|
|
|
procedure TBarClass.RemoveButton(Index: Integer);
|
|
begin
|
|
TKButton(XButtons[Index]).Free;
|
|
XButtons.Delete(Index);
|
|
end;
|
|
|
|
procedure TBarClass.DeleteAllButtons;
|
|
begin
|
|
while XButtons.Count>0 do
|
|
begin
|
|
TKButton(XButtons[0]).Free;
|
|
XButtons.Delete(0);
|
|
end;
|
|
end;
|
|
|
|
function TBarClass.GetButtonCount: Integer;
|
|
begin
|
|
Result := XButtons.Count;
|
|
end;
|
|
|
|
function TBarClass.GetButton(Index:Integer): TKButton;
|
|
begin
|
|
Result:=TKButton(XButtons[Index]);
|
|
end;
|
|
|
|
function TBarClass.GetCmdDirFromEnvVar(sPath: String): String;
|
|
begin
|
|
DoDirSeparators(sPath);
|
|
if Pos(FEnvVar, sPath) <> 0 then
|
|
Result := StringReplace(sPath, FEnvVar, ExcludeTrailingPathDelimiter(FChangePath), [rfIgnoreCase])
|
|
else
|
|
Result := sPath;
|
|
end;
|
|
|
|
procedure TBarClass.SetButton(Index:Integer; const AValue: TKButton);
|
|
begin
|
|
XButtons[Index]:=AValue;
|
|
end;
|
|
|
|
function TBarClass.SetCmdDirAsEnvVar(sPath: String): String;
|
|
begin
|
|
DoDirSeparators(sPath);
|
|
if Pos(FChangePath, sPath) <> 0 then
|
|
Result := StringReplace(sPath, ExcludeTrailingPathDelimiter(FChangePath), FEnvVar, [rfIgnoreCase])
|
|
else
|
|
Result := sPath;
|
|
end;
|
|
|
|
end.
|
|
|