lazarus/components/education/educomppalette.pas
2009-10-19 12:01:05 +00:00

288 lines
8.3 KiB
ObjectPascal

{
*****************************************************************************
* *
* This file is part of the EducationLaz package *
* *
* See the file COPYING.modifiedLGPL.txt, included in this distribution, *
* for details about the copyright. *
* *
* 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. *
* *
*****************************************************************************
Author: Mattias Gaertner
Abstract:
Frame to setup the component palette.
}
unit EduCompPalette;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LCLProc, FileUtil, LResources, Forms, Controls, Graphics,
Dialogs, ComCtrls, ExtCtrls, StdCtrls, AvgLvlTree,
FormEditingIntf, LazConfigStorage, IDEOptionsIntf, ComponentReg,
IDEImagesIntf, LazIDEIntf,
EduOptions;
type
{ TEduComponentPaletteOptions }
TEduComponentPaletteOptions = class(TEduOptionsNode)
private
fVisible: TStringToStringTree;
function GetComponentVisible(ComponentName: string): boolean;
procedure SetComponentVisible(ComponentName: string; const AValue: boolean);
public
constructor Create;
destructor Destroy; override;
function Load(Config: TConfigStorage): TModalResult; override;
function Save(Config: TConfigStorage): TModalResult; override;
procedure Apply(Enable: boolean); override;
property ComponentVisible[ComponentName: string]: boolean read GetComponentVisible write SetComponentVisible;
end;
{ TEduCompPaletteFrame }
TEduCompPaletteFrame = class(TAbstractIDEOptionsEditor)
ComponentsGroupBox: TGroupBox;
ComponentsTreeView: TTreeView;
procedure ComponentsTreeViewMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
private
HideImgID: LongInt;
ShowImgID: LongInt;
procedure FillComponentTreeView;
procedure SaveFillComponentTreeView;
public
function GetTitle: String; override;
procedure ReadSettings(AOptions: TAbstractIDEOptions); override;
procedure Setup(ADialog: TAbstractOptionsEditorDialog); override;
class function SupportedOptionsClass: TAbstractIDEOptionsClass; override;
procedure WriteSettings(AOptions: TAbstractIDEOptions); override;
end;
var
EduComponentPaletteOptions: TEduComponentPaletteOptions = nil;
procedure Register;
implementation
procedure Register;
begin
EduComponentPaletteOptions:=TEduComponentPaletteOptions.Create;
EducationOptions.Root.Add(EduComponentPaletteOptions);
RegisterIDEOptionsEditor(EduOptionID,TEduCompPaletteFrame,EduOptionCompPaletteID);
end;
{ TEduCompPaletteFrame }
procedure TEduCompPaletteFrame.ComponentsTreeViewMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
Node: TTreeNode;
Hit: THitTests;
begin
if Button<>mbLeft then exit;
Node:=ComponentsTreeView.GetNodeAt(X,Y);
if (Node=nil) then exit;
if Node.Parent=nil then exit;
Hit:=ComponentsTreeView.GetHitTestInfoAt(X,Y);
if htOnStateIcon in Hit then begin
if Node.StateIndex=ShowImgID then
Node.StateIndex:=HideImgID
else
Node.StateIndex:=ShowImgID;
end;
end;
procedure TEduCompPaletteFrame.FillComponentTreeView;
var
i: Integer;
Page: TBaseComponentPage;
j: Integer;
Comp: TRegisteredComponent;
PageNode: TTreeNode;
CompNode: TTreeNode;
ResHandle: TLResource;
Image: TCustomBitmap;
CompName: String;
begin
if ComponentsTreeView.Images=nil then begin
ComponentsTreeView.Images:=TImageList.Create(Self);
ComponentsTreeView.Images.Width:=ComponentPaletteImageWidth;
ComponentsTreeView.Images.Height:=ComponentPaletteImageHeight;
ComponentsTreeView.StateImages:=IDEImages.Images_16;
end else
ComponentsTreeView.Images.Clear;
ShowImgID:=IDEImages.LoadImage(16,'menu_run');
HideImgID:=IDEImages.LoadImage(16,'menu_stop');
ComponentsTreeView.BeginUpdate;
ComponentsTreeView.Items.Clear;
for i:=0 to IDEComponentPalette.Count-1 do begin
Page:=IDEComponentPalette[i];
if Page.PageName='' then continue;
PageNode:=ComponentsTreeView.Items.Add(nil,Page.PageName);
for j:=0 to Page.Count-1 do begin
Comp:=Page[j];
CompName:=Comp.ComponentClass.ClassName;
CompNode:=ComponentsTreeView.Items.AddChild(PageNode,CompName);
ResHandle := LazarusResources.Find(CompName);
if ResHandle <> nil then
Image := CreateBitmapFromLazarusResource(ResHandle)
else
Image := nil;
if Image = nil then
Image := CreateBitmapFromLazarusResource('default');
CompNode.ImageIndex:=ComponentsTreeView.Images.Add(Image,nil);
Image.Free;
CompNode.SelectedIndex:=CompNode.ImageIndex;
if EduComponentPaletteOptions.ComponentVisible[CompName] then
CompNode.StateIndex:=ShowImgID
else
CompNode.StateIndex:=HideImgID;
end;
PageNode.Expanded:=true;
end;
ComponentsTreeView.EndUpdate;
end;
procedure TEduCompPaletteFrame.SaveFillComponentTreeView;
var
Node: TTreeNode;
CompName: String;
begin
Node:=ComponentsTreeView.Items.GetFirstNode;
while Node<>nil do begin
if Node.Parent<>nil then begin
CompName:=Node.Text;
EduComponentPaletteOptions.ComponentVisible[CompName]:=
Node.StateIndex=ShowImgID;
end else begin
end;
Node:=Node.GetNext;
end;
end;
function TEduCompPaletteFrame.GetTitle: String;
begin
Result:='Component palette';
end;
procedure TEduCompPaletteFrame.ReadSettings(AOptions: TAbstractIDEOptions);
begin
end;
procedure TEduCompPaletteFrame.Setup(ADialog: TAbstractOptionsEditorDialog);
begin
ComponentsGroupBox.Caption:='Visible components';
FillComponentTreeView;
end;
class function TEduCompPaletteFrame.SupportedOptionsClass: TAbstractIDEOptionsClass;
begin
Result:=nil;
end;
procedure TEduCompPaletteFrame.WriteSettings(AOptions: TAbstractIDEOptions);
begin
SaveFillComponentTreeView;
end;
{ TEduComponentPaletteOptions }
function TEduComponentPaletteOptions.GetComponentVisible(ComponentName: string
): boolean;
begin
Result:=fVisible[ComponentName]='1';
end;
procedure TEduComponentPaletteOptions.SetComponentVisible(
ComponentName: string; const AValue: boolean);
begin
if AValue then
fVisible[ComponentName]:='1'
else
fVisible.Delete(ComponentName);
end;
constructor TEduComponentPaletteOptions.Create;
begin
inherited Create;
Name:='ComponentPalette';
fVisible:=TStringToStringTree.Create(false);
end;
destructor TEduComponentPaletteOptions.Destroy;
begin
FreeAndNil(fVisible);
inherited Destroy;
end;
function TEduComponentPaletteOptions.Load(Config: TConfigStorage
): TModalResult;
var
Cnt: LongInt;
i: Integer;
ComponentName: String;
begin
fVisible.Clear;
Cnt:=Config.GetValue('Visible/Count',0);
for i:=1 to Cnt do begin
ComponentName:=Config.GetValue('Visible/Item'+IntToStr(i),'');
if ComponentName='' then continue;
fVisible[ComponentName]:='1';
end;
Result:=inherited Load(Config);
end;
function TEduComponentPaletteOptions.Save(Config: TConfigStorage
): TModalResult;
var
Node: TAvgLvlTreeNode;
Item: PStringToStringItem;
Cnt: Integer;
begin
Cnt:=0;
Node:=fVisible.Tree.FindLowest;
while Node<>nil do begin
inc(Cnt);
Item:=PStringToStringItem(Node.Data);
Config.SetDeleteValue('Visible/Item'+IntToStr(Cnt),Item^.Name,'');
Node:=fVisible.Tree.FindSuccessor(Node);
end;
Config.SetDeleteValue('Visible/Count',Cnt,0);
Result:=inherited Save(Config);
end;
procedure TEduComponentPaletteOptions.Apply(Enable: boolean);
var
i: Integer;
Page: TBaseComponentPage;
j: Integer;
Comp: TRegisteredComponent;
begin
inherited Apply(Enable);
for i:=0 to IDEComponentPalette.Count-1 do begin
Page:=IDEComponentPalette[i];
for j:=0 to Page.Count-1 do begin
Comp:=Page[j];
Comp.Visible:=(not Enable) or ComponentVisible[Comp.ComponentClass.ClassName];
end;
end;
end;
initialization
{$I educomppalette.lrs}
end.