204 lines
5.2 KiB
ObjectPascal
204 lines
5.2 KiB
ObjectPascal
{
|
|
File name: kasbarmenu.pas
|
|
|
|
KASBarMenu Copyright (C) 2008 Dmitry Kolomiets (B4rr4cuda@rambler.ru)
|
|
Popup menu with *.bar's buttons as MenuItems
|
|
|
|
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 KASBarMenu;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
|
|
Menus, KASBarFiles, FileUtil, IniFiles;
|
|
|
|
type
|
|
|
|
TOnLoadButtonGlyph = function (sIconFileName : String; iIconSize : Integer; clBackColor : TColor) : TBitmap of object;
|
|
TOnMenuButtonClick = procedure (Sender: TObject; NumberOfButton : Integer) of object;
|
|
|
|
{ TKASBarMenu }
|
|
|
|
TKASBarMenu = class(TPopupMenu)
|
|
private
|
|
FBar:TBarClass;
|
|
FOnLoadButtonGlyph : TOnLoadButtonGlyph;
|
|
FOnMenuButtonClick : TOnMenuButtonClick;
|
|
|
|
//------------------------------------------------------
|
|
procedure MenuOnClick(Sender: TObject);
|
|
function LoadBtnIcon(IconPath: String): TBitMap;
|
|
//------------------------------------------------------
|
|
|
|
protected
|
|
public
|
|
constructor Create(TheOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
//---------------------
|
|
|
|
procedure Clear;
|
|
procedure LoadFromStringList(List: TStringList);
|
|
procedure LoadFromIniFile(IniFile : TIniFile);
|
|
procedure SaveToIniFile(IniFile : TIniFile);
|
|
procedure LoadBarFile(FileName:string);
|
|
procedure SaveToFile(FileName : String);
|
|
|
|
procedure MakeMenu;
|
|
//------------------------------------------------------
|
|
|
|
published
|
|
property BarFile: TBarClass read FBar write FBar;
|
|
property OnLoadButtonGlyph : TOnLoadButtonGlyph read FOnLoadButtonGlyph write FOnLoadButtonGlyph;
|
|
property OnMenuButtonClick: TOnMenuButtonClick read FOnMenuButtonClick write FOnMenuButtonClick;
|
|
//------------------------------------------------------
|
|
end;
|
|
|
|
procedure Register;
|
|
|
|
implementation
|
|
|
|
procedure Register;
|
|
begin
|
|
RegisterComponents('KASComponents',[TKASBarMenu]);
|
|
end;
|
|
|
|
{ TKASBarMenu }
|
|
|
|
function TKASBarMenu.LoadBtnIcon(IconPath: String): TBitMap;
|
|
var
|
|
PNG : TPortableNetworkGraphic;
|
|
begin
|
|
Result := Graphics.TBitmap.Create;
|
|
if (IconPath <> '') and FileExists(IconPath) then
|
|
begin
|
|
if CompareFileExt(IconPath, 'png', false) = 0 then
|
|
begin
|
|
PNG := TPortableNetworkGraphic.Create;
|
|
try
|
|
PNG.LoadFromFile(IconPath);
|
|
Result.Assign(PNG);
|
|
finally
|
|
FreeAndNil(PNG);
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
Result.LoadFromFile(IconPath);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TKASBarMenu.MenuOnClick(Sender: TObject);
|
|
begin
|
|
if Assigned(FOnMenuButtonClick) then
|
|
FOnMenuButtonClick(Self, (Sender as TMenuItem).Tag);
|
|
end;
|
|
|
|
constructor TKASBarMenu.Create(TheOwner: TComponent);
|
|
begin
|
|
FBar:=TBarClass.Create;
|
|
inherited Create(TheOwner);
|
|
end;
|
|
|
|
destructor TKASBarMenu.Destroy;
|
|
begin
|
|
FBar.DeleteAllButtons;
|
|
FreeAndNil(FBar);
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TKASBarMenu.Clear;
|
|
begin
|
|
FBar.DeleteAllButtons;
|
|
end;
|
|
|
|
procedure TKASBarMenu.MakeMenu;
|
|
var
|
|
I:Integer;
|
|
Item:TMenuItem;
|
|
BitmapTmp: TBitmap;
|
|
begin
|
|
For I:=0 to Fbar.ButtonCount-1 do
|
|
begin
|
|
Item:=TMenuItem.Create(Self);
|
|
if Fbar.GetButtonX(I,MiskX) <> '' then
|
|
Item.Caption:=Fbar.GetButtonX(I,MenuX)+' ('+Fbar.GetButtonX(I,MiskX)+')'
|
|
else
|
|
Item.Caption:=Fbar.GetButtonX(I,MenuX);
|
|
//------------------------------------------------------
|
|
if Assigned(FOnLoadButtonGlyph) then
|
|
BitmapTmp := FOnLoadButtonGlyph(FBar.GetButtonX(I,ButtonX), 16, clMenu)
|
|
else
|
|
BitmapTmp := LoadBtnIcon(FBar.GetButtonX(I,ButtonX));
|
|
|
|
Item.Bitmap := BitmapTmp;
|
|
if Assigned(BitmapTmp) then
|
|
FreeAndNil(BitmapTmp);
|
|
//------------------------------------------------------
|
|
Item.Tag:=I;
|
|
Item.OnClick:=TNotifyEvent(@MenuOnClick);
|
|
Self.Items.Insert(I,Item);
|
|
end;
|
|
end;
|
|
|
|
procedure TKASBarMenu.LoadBarFile(FileName: string);
|
|
begin
|
|
FBar.DeleteAllButtons;
|
|
Self.Items.Clear;
|
|
FBar.LoadFromFile(FileName);
|
|
MakeMenu;
|
|
end;
|
|
|
|
procedure TKASBarMenu.LoadFromStringList(List: TStringList);
|
|
begin
|
|
FBar.DeleteAllButtons;
|
|
Self.Items.Clear;
|
|
FBar.LoadFromStringList(List);
|
|
MakeMenu;
|
|
end;
|
|
|
|
procedure TKASBarMenu.LoadFromIniFile(IniFile: TIniFile);
|
|
begin
|
|
FBar.DeleteAllButtons;
|
|
Self.Items.Clear;
|
|
FBar.LoadFromIniFile(IniFile);
|
|
MakeMenu;
|
|
end;
|
|
|
|
procedure TKASBarMenu.SaveToIniFile(IniFile: TIniFile);
|
|
begin
|
|
FBar.SaveToIniFile(IniFile);
|
|
end;
|
|
|
|
procedure TKASBarMenu.SaveToFile(FileName: String);
|
|
begin
|
|
FBar.SaveToFile(FileName);
|
|
end;
|
|
|
|
end.
|