📄 treeed.pas
字号:
private
{ Private declarations }
FHide : TTreeEditWindows;
FMaximized : Boolean;
FPersist : Boolean;
FPosition : TPosition;
FTitle : String;
FOnClose : TNotifyEvent;
protected
{ Protected declarations }
public
{ Public declarations }
Constructor Create(AOwner:TComponent); override;
Procedure Execute; virtual;
published
{ Published declarations }
property Hide:TTreeEditWindows read FHide write FHide default [teEditors];
property Maximized:Boolean read FMaximized write FMaximized default False;
property PersistOptions:Boolean read FPersist write FPersist default False;
property Position:TPosition read FPosition write FPosition default poDefault;
property Title:String read FTitle write FTitle;
{ events }
property OnClose: TNotifyEvent read FOnClose write FOnClose;
end;
TTreeEditorPanel=class(TCustomPanelTreeLink)
private
FEditor : TTreeEditor;
FHide : TTreeEditWindows;
Procedure CreateEditor;
function GetEditor: TTreeEditor;
Procedure SetHide(Value:TTreeEditWindows);
protected
Procedure Loaded; override;
procedure SetTree(const Value: TCustomTree); override;
public
Constructor Create(AOwner:TComponent); override;
Destructor Destroy; override;
Procedure PreviewMode;
property Editor:TTreeEditor read GetEditor;
published
property Align;
property Anchors;
property BevelInner;
property BevelOuter;
property BevelWidth;
property BorderStyle;
property BorderWidth;
property Color;
property Enabled;
property TabOrder;
property TabStop;
property HideWindows:TTreeEditWindows read FHide write SetHide default [teEditors];
property Tree;
end;
{ Shows the Tree EDITOR dialog }
Procedure EditTree(AOwner:TComponent; ATree:TCustomTree);
{ Shows the Tree EDITOR dialog without about box}
Procedure EditTreeNoAbout(AOwner:TComponent; ATree:TCustomTree);
{ Shows the Tree EDITOR dialog and calls AEvent }
Procedure EditTreeEvent(AOwner:TComponent; ATree:TCustomTree;
AEvent:TTreeNotifyEvent);
{ Shows the Tree EXPORT dialog }
Procedure ShowTreeExport(AOwner:TComponent; ATree:TCustomTree);
{ Shows the Tree PRINT PREVIEW dialog }
procedure TreePreview(AOwner:TComponent; Tree:TCustomTree; PrintPanel:Boolean=False);
Procedure LoadTreeChildsFromFile( ANode:TTreeNodeShape; Const AName:String);
{ Shows the About-Box dialog... }
Procedure TeeShowTreeAbout(const BuildNumber:String);
{ internal }
Procedure TreeLogoSetPicture(APicture:TPicture);
{ for help support in editor }
Function GetTeeTreeHelpFile:String;
Function GetTeeTreeUserHelpFile:String;
Procedure CreateColorBitmap(Item: TMenuItem; AColor:TColor);
implementation
{$IFNDEF CLX}
{$R *.DFM}
{$ELSE}
{$R *.xfm}
{$ENDIF}
Uses TreeConst, TeePrevi, TreeExport, TeeExport,
TeeBrushDlg, TeeConst, TeeEdiGrad,
TreeShEd, TreeCoEd, TreeTeEd, TypInfo,
{$IFNDEF CLX}
Registry, Printers,
{$ELSE}
QPrinters,
{$ENDIF}
{$IFDEF CLR}
Variants,
Types,
{$ENDIF}
TeeTranslate,
TeeAbout;
{$IFDEF CLR}
{$R 'treelogo.bmp'}
{$ELSE}
{$R TreeLogo.res}
{$ENDIF}
const TeeTreeRecentKey=TeeTreeKey+'\RecentFiles';
stPanelName=0;
stPanelText=1;
stPanelCoords=2;
stPanelPage=3;
stPanelModified=4;
stPanelCaps=5;
stPanelNum=6;
stPanelScr=7;
// Returns Help File path from Windows Registry.
Function GetRegistryHelpPath(Const HelpFile:String):String;
Const WindowsHelp='SOFTWARE\Microsoft\Windows\Help';
begin
result:='';
{$IFNDEF CLX}
With TRegistry.Create do
try
RootKey:=HKEY_LOCAL_MACHINE;
if {$IFDEF D4}OpenKeyReadOnly{$ELSE}OpenKey{$ENDIF}(WindowsHelp{$IFNDEF D4},False{$ENDIF}) then
result:=ReadString(HelpFile)+'\'+HelpFile;
finally
Free;
end;
{$ENDIF}
end;
// Sets TeeTree logo image in APicture parameter.
Procedure TreeLogoSetPicture(APicture:TPicture);
begin
{$IFDEF CLR}
TeeLoadBitmap(APicture.Bitmap,'TreeLogo','');
{$ELSE}
APicture.Bitmap.LoadFromResourceName(HInstance,'TREELOGOBMP');
{$ENDIF}
end;
// Show TeeTree About... box dialog.
Procedure TeeShowTreeAbout(const BuildNumber:String);
var tmp : TTeeAboutForm;
begin
tmp:=TTeeAboutForm.Create(nil);
with tmp do
try
LabelVersion.Caption:=TreeMsg_TeeTree+' '+BuildNumber;
Caption:=Format(TreeMsg_About,[TreeMsg_TeeTree]);
Image1.Picture:=nil;
Image2.Transparent:=False;
Image2.AutoSize:=False;
Image2.Center:=True;
TreeLogoSetPicture(Image2.Picture);
TeeTranslateControl(tmp);
ShowModal;
finally
Free;
end;
end;
// Show TeeTree Print Preview dialog.
procedure TreePreview(AOwner:TComponent; Tree:TCustomTree; PrintPanel:Boolean=False);
var OldPrintTeePanel : Boolean;
OldChange : Boolean;
OldPage : Integer; //tom:24/09/2002
begin
OldPrintTeePanel:=PrintTeePanel;
PrintTeePanel:=PrintPanel;
OldChange:=TeeChangePaperOrientation;
OldPage := Tree.Page.Page;
TeeChangePaperOrientation:=False;
try
with TChartPreview.Create(AOwner) do
try
PageNavigatorClass:=TTreePageNavigator;
TeePreviewPanel1.Panel:=Tree;
Tree.Page.Refresh; //tom:24/09/2002; Sync PageNavigator with active page
ShowModal;
finally
Free;
Tree.Page.Page := OldPage; //tom:24/09/2002
Tree.Invalidate;
end;
finally
TeeChangePaperOrientation:=OldChange;
PrintTeePanel:=OldPrintTeePanel;
end;
end;
// Show the TeeTree Export dialog.
Procedure ShowTreeExport(AOwner:TComponent; ATree:TCustomTree);
begin
With TTreeExportForm.Create(AOwner) do
try
NativeFilter:=TeeMsg_TreeFiles;
NativeExtension:=TreeMsg_TeeExtension;
ExportPanel:=ATree;
Caption:=TreeMsg_ExportTree;
ShowModal;
finally
Free;
end;
end;
// Opens "Aname.ttr" file and loads all nodes into a temporary Tree.
// Then adds all childs to "ANode" and frees the temp Tree.
Procedure LoadTreeChildsFromFile( ANode:TTreeNodeShape; Const AName:String);
var t : Integer;
tmpTree : TCustomTree;
begin
tmpTree:=TTree.Create(nil);
try
tmpTree.Parent:=ANode.Tree;
LoadTreeFromFile(tmpTree,AName);
if tmpTree.Shapes.Count>0 then
for t:=0 to tmpTree.Shapes.Count-1 do
ANode.AddChild(tmpTree.Shapes[t].SimpleText);
finally
tmpTree.Free;
end;
end;
// Internal. Show the Tree editor dialog.
Procedure InternalEditTree(AOwner:TComponent; ATree:TCustomTree; AShowAbout:Boolean;
AEvent:TTreeNotifyEvent);
var tmp : TTreeEditor;
{$IFDEF CLX}
tmpAction: TCloseAction;
{$ENDIF}
begin
tmp:=TTreeEditor.Create(AOwner);
try
tmp.TheTree:=ATree;
if not AShowAbout then tmp.N3.Free;
if Assigned(AEvent) then AEvent(tmp);
TeeTranslateControl(tmp);
tmp.ShowModal;
{$IFDEF CLX}
tmp.FormClose(tmp,tmpAction); { K bug ? }
{$ENDIF}
finally
tmp.Free;
end;
end;
// Show the TeeTree editor dialog to edit ATree parameter.
Procedure EditTree(AOwner:TComponent; ATree:TCustomTree);
begin
InternalEditTree(AOwner,ATree,True,nil);
end;
// Shows the Tree EDITOR dialog without About boxes
Procedure EditTreeNoAbout(AOwner:TComponent; ATree:TCustomTree);
begin
InternalEditTree(AOwner,ATree,False,nil);
end;
// Shows the Tree EDITOR dialog and calls AEvent
Procedure EditTreeEvent(AOwner:TComponent; ATree:TCustomTree;
AEvent:TTreeNotifyEvent);
begin
InternalEditTree(AOwner,ATree,True,AEvent);
end;
// Shows an Open Picture file dialog and then loads it into
// the Tree "BackImage" to fill then Tree background.
Procedure TTreeEditor.DoLoadTreeImage;
begin
with PictureDialog do
try
if Execute then
begin
TheTree.BackImage.LoadFromFile(FileName);
BBackImage.Caption:=TreeMsg_Clear;
TeeModified;
end;
finally
Free;
end;
end;
procedure TTreeEditor.BBackImageClick(Sender: TObject);
begin
if BBackImage.Caption=TreeMsg_Browse then
begin
DoLoadTreeImage;
end
else
with TheTree do
begin
if HasBackImage then
begin
BackImage:=nil;
Invalidate;
TeeModified;
end;
BBackImage.Caption:=TreeMsg_Browse;
end;
CBImageStyle.Enabled:=TheTree.HasBackImage;
end;
type
TTreeSpeedButton=class(TSpeedButton)
protected
procedure Paint; override;
end;
TMyCustomTreeShape=class(TTreeNodeShape);
procedure TTreeSpeedButton.Paint;
var tmpC : TTeeCanvas3D;
tmp : TTreeNodeShape;
tmpR : TRect;
tmpP : PTreeTagShape;
begin
inherited Paint;
tmpP:=PTreeTagShape(Tag);
with tmpP{$IFNDEF CLR}^{$ENDIF} do
begin
if AInstance=nil then
begin
AInstance:=AClass.Create(nil);
with AInstance.Shadow do
begin
HorizSize:=2;
VertSize:=2;
Color:=clDkGray;
end;
{ special trick for TPolygonShape }
if AInstance is TPolygonShape then
TPolygonShape(AInstance).FillSample;
{ set shape style }
if UseStyle then
AInstance.Style:=Style;
end;
tmp:=AInstance;
end;
tmpC:=TTeeCanvas3D.Create;
try
tmpC.UseBuffer:=False;
tmpC.InitWindow(Canvas,nil,Color,False,TeeRect(0,0,Width,Height));
tmpR:=TeeRect(4,4,Self.Width-5,Self.Height-5);
if tmp is TTextShape then
begin
tmpC.Font.Style:=[fsBold];
tmpC.Font.Size:=16;
tmpC.TextOut(5,1,'A');
end
else
TMyCustomTreeShape(tmp).DrawShapeCanvas(tmpC,tmpR);
finally
tmpC.Free;
end;
end;
Procedure TTreeEditor.InternalAddCustomShape( Const AGroup:String;
Const AName:String;
AClass:TTreeNodeShapeClass);
var tmp : Integer;
t : Integer;
tmpP : TTabSheet;
begin
tmp:=-1;
with PageShapes do
for t:=0 to PageCount-1 do
if Uppercase(Pages[t].Caption)=Uppercase(AGroup) then
begin
tmp:=t;
break;
end;
if tmp=-1 then
begin
tmpP:=TTabSheet.Create(Self);
tmpP.Caption:=AGroup;
tmpP.PageControl:=PageShapes;
tmp:=PageShapes.PageCount-1;
end;
InternalAddShape(tmp,AName,AClass,False,tssRectangle);
end;
Procedure TTreeEditor.RegisterTreeShape(AGroup:Integer;
Const AName:String;
AStyle:TTreeShapeStyle);
begin
InternalAddShape(AGroup,AName,nil,True,AStyle);
end;
Procedure TTreeEditor.InternalAddShape( AGroup:Integer;
Const AName:String;
AClass:TTreeNodeShapeClass;
UseStyle:Boolean;
AStyle:TTreeShapeStyle);
var ATab : TTabSheet;
tmp : TSpeedButton;
Num : Integer;
TagShapeStyle : PTreeTagShape;
begin
ATab:=PageShapes.Pages[AGroup];
Num:=ATab.ControlCount;
if ATab=PageShapes.ActivePage then Dec(Num,2);
tmp:=TTreeSpeedButton.Create(Self);
with tmp do
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -