📄 umainmodule.pas
字号:
{
ESS-Model
Copyright (C) 2002 Eldean AB, Peter S鰀erman, Ville Krumlinde
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
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
}
unit uMainModule;
interface
{$ifdef LINUX}
uses
Types, SysUtils, Classes, uModel, uIntegrator, uCodeIntegrator, uDelphiIntegrator, uViewIntegrator,
QForms, QControls, QMenus, uFeedback, QActnList, QGraphics, QDialogs,
ActnList, ExtCtrls;
{$endif}
{$ifdef WIN32}
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
uModel, uIntegrator, uCodeIntegrator, uDelphiIntegrator, ActnList, uViewIntegrator,
{$IFDEF DRAG_SUPPORT}DropSource, DropTarget, {$ENDIF}Menus, uFeedback, uTreeViewIntegrator,ExtCtrls;
{$endif}
type
TMainModule = class(TDataModule)
ActionList: TActionList;
CopyDiagramClipboardAction: TAction;
PrintDiagramAction: TAction;
DocGenAction: TAction;
AboutAction: TAction;
ExportXmiAction: TAction;
LayoutDiagramAction: TAction;
FileOpenAction: TAction;
ExitAction: TAction;
SettingsAction: TAction;
UnhideElementsAction: TAction;
SaveDiagramAction: TAction;
DocGenPreviewAction: TAction;
CloseTimer: TTimer;
OpenFolderAction: TAction;
procedure DataModuleCreate(Sender: TObject);
procedure DataModuleDestroy(Sender: TObject);
procedure CopyDiagramClipboardActionExecute(Sender: TObject);
procedure DocGenActionExecute(Sender: TObject);
procedure DropFileTargetDrop(Sender: TObject; ShiftState: TShiftState; Point: TPoint; var Effect: Integer);
procedure AboutActionExecute(Sender: TObject);
procedure ExportXmiActionExecute(Sender: TObject);
procedure LayoutDiagramActionExecute(Sender: TObject);
procedure FileOpenActionExecute(Sender: TObject);
procedure ExitActionExecute(Sender: TObject);
procedure SettingsActionExecute(Sender: TObject);
procedure UnhideElementsActionUpdate(Sender: TObject);
procedure UnhideElementsActionExecute(Sender: TObject);
procedure SaveDiagramActionExecute(Sender: TObject);
procedure DocGenPreviewActionExecute(Sender: TObject);
procedure CloseTimerTimer(Sender: TObject);
procedure OpenFolderActionExecute(Sender: TObject);
private
{ Private declarations }
FModel: TObjectModel;
FDiagram: TDiagramIntegrator;
//FBackEnd: TCodeIntegrator;
RecentFiles : TStringList;
FTreeView : TTreeViewIntegrator;
{$if Defined(WIN32) and Defined(DRAG_SUPPORT)}
Drop : TDropFileTarget;
{$ifend}
Feedback : IEldeanFeedback;
procedure ProcessCommandLine;
procedure DoDocGen(IsPreview : boolean; const DestPath : string = '');
procedure DoXmiFile(const DestFile : string = '');
procedure RefreshRecentFiles;
procedure OnRecentFilesClicked(Sender : TObject);
protected
//property BackEnd: TCodeIntegrator read FBackEnd;
property Diagram: TDiagramIntegrator read FDiagram;
public
{ Public declarations }
procedure LoadProject(FileNames : TStrings); overload;
procedure LoadProject(FileName : string); overload;
property Model: TObjectModel read FModel;
end;
var
MainModule: TMainModule;
implementation
{$ifdef WIN32}
uses uMainForm,
Clipbrd,
Printers,
uFileProvider,
uDocGen,
uConfig,
uJavaClassImport,
uJavaParser,
{$IFDEF ARGO_XMI}uXmiExportArgoUML, {$ELSE}uXmiExport, {$ENDIF}
uConst,
uError,
Contnrs,
uAboutForm,
uSettingsForm,
uZoomFrame,
uOpenFolderForm;
{$endif}
{$ifdef LINUX}
uses uMainForm,
QClipbrd,
QPrinters,
uFileProvider,
uDocGen,
uConfig,
uJavaClassImport,
uJavaParser,
uXmiExport,
uConst,
uError,
Contnrs,
uAboutForm,
uSettingsForm;
{$endif}
{$ifdef WIN32}
{$R *.DFM}
{$endif}
{$ifdef LINUX}
{$R *.xfm}
{$endif}
procedure TMainModule.DataModuleCreate(Sender: TObject);
begin
RecentFiles := TStringList.Create;
RecentFiles.CommaText := Config.ReadStr('RecentFiles','');
RefreshRecentFiles;
Feedback := TGuiFeedback.Create(MainForm.StatusPanel);
FModel := TObjectModel.Create;
FDiagram := TDiagramIntegrator.CreateDiagram(FModel, MainForm.DiagramPanel, Feedback);
// FBackEnd := TDelphiIntegrator.Create(FModel);
// FBackend.CodeProvider := TFileProvider.Create;
FTreeView := TTreeViewIntegrator.Create(FModel,MainForm.TreePanel,Feedback);
TZoomFrame.Create(MainForm.ZoomPanel,Diagram);
{$if Defined(WIN32) and Defined(DRAG_SUPPORT)}
Drop := TDropFileTarget.Create(Self);
Drop.DragTypes := [dtCopy];
Drop.OnDrop := DropFileTargetDrop;
Drop.Register(MainForm);
{$ifend}
if ParamCount>0 then
ProcessCommandLine;
end;
procedure TMainModule.DataModuleDestroy(Sender: TObject);
begin
Config.IsTerminating := True;
Config.WriteStr('RecentFiles',RecentFiles.CommaText);
{$if Defined(WIN32) and Defined(DRAG_SUPPORT)}
if Assigned(Drop) then
Drop.Unregister;
{$ifend}
FreeAndNil(FDiagram);
// FreeAndNil(FBackEnd);
FreeAndNil(FTreeView);
FreeAndNil(FModel);
FreeAndNil(RecentFiles);
end;
procedure TMainModule.LoadProject(FileNames : TStrings);
var
Ext : string;
Imp : TImportIntegrator;
Ints : TClassList;
Exts : TStringList;
I,J : integer;
begin
// Examine fileextension and call the correct integrator
Screen.Cursor := crHourGlass;
Ext := LowerCase(ExtractFileExt(FileNames[0]));
Imp := nil;
Ints := Integrators.Get(TImportIntegrator);
try
for I := 0 to Ints.Count - 1 do
begin
Exts := TImportIntegratorClass(Ints[I]).GetFileExtensions;
try
if Exts.IndexOfName(Ext)>-1 then
begin
Imp := TImportIntegratorClass(Ints[I]).Create(Model, TFileProvider.Create(Feedback) );
J := 0;
while J<FileNames.Count do
if Exts.IndexOfName(LowerCase(ExtractFileExt(FileNames[J])))=-1 then
FileNames.Delete(J)
else
Inc(J);
Break;
end;
finally
Exts.Free;
end;
end;
if Imp<>nil then
try
Imp.BuildModelFrom(FileNames);
finally
Imp.Free;
end;
finally
Ints.Free;
Screen.Cursor := crArrow;
end;
//Add to RecentFiles
for I := 0 to FileNames.Count-1 do
begin
J := RecentFiles.IndexOf(FileNames[I]);
if J<>-1 then
RecentFiles.Delete(J);
RecentFiles.Insert(0,FileNames[I]);
end;
RefreshRecentFiles;
// These actions are intially disabled
DocGenAction.Enabled := True;
DocGenPreviewAction.Enabled := True;
ExportXmiAction.Enabled := True;
LayoutDiagramAction.Enabled := True;
SaveDiagramAction.Enabled := True;
CopyDiagramClipboardAction.Enabled := True;
end;
procedure TMainModule.LoadProject(FileName : string);
var
L : TStringList;
begin
L := TStringList.Create;
L.Add(FileName);
LoadProject(L);
L.Free;
end;
procedure TMainModule.CopyDiagramClipboardActionExecute(Sender: TObject);
var
{$ifdef WIN32}
Wmf, Wmf1: TMetaFile;
WmfCanvas, WmfCanvas1: TMetaFileCanvas;
{$endif}
{$ifdef LINUX}
Bitmap : QGraphics.TBitmap;
{$endif}
W,H : integer;
SrcRect: TRect;
begin
Diagram.GetDiagramSize(W,H);
SrcRect := Diagram.GetSelectedRect;
{$ifdef WIN32}
Wmf := TMetafile.Create;
Wmf1 := TMetafile.Create;
try
if (SrcRect.Right - SrcRect.Left) <> 0 then
begin
Wmf1.Width := SrcRect.Right - SrcRect.Left;
Wmf1.Height := SrcRect.Bottom - SrcRect.Top;
end;
Wmf.Width := W;
Wmf.Height := H;
WmfCanvas := TMetafileCanvas.Create(Wmf, 0);
try
//**This works in w2k since we have fixed controls.pas
Diagram.PaintTo(WmfCanvas, 0, 0, True);
finally
WmfCanvas.Free;
end;
if (SrcRect.Right - SrcRect.Left) <> 0 then
begin
WmfCanvas1 := TMetafileCanvas.Create(Wmf1, 0);
try
WmfCanvas1.Draw(-SrcRect.Left,-SrcRect.Top,Wmf);
finally
WmfCanvas1.Free;
end;
end else
begin
FreeAndNil(Wmf1);
Wmf1 := Wmf;
Wmf := nil;
end;
Clipboard.Assign(Wmf1);
finally
if Assigned(Wmf) then FreeAndNil(Wmf);
if Assigned(Wmf1) then FreeAndNil(Wmf1);
end;
{$endif}
{$ifdef LINUX}
Bitmap := QGraphics.TBitmap.Create;
try
Bitmap.Width := W;
Bitmap.Height := H;
Diagram.PaintTo(Bitmap.Canvas,0,0);
Bitmap.PixelFormat := pf8bit;
Clipboard.Assign(Bitmap);
finally
Bitmap.Free;
end;
{$endif}
end;
procedure TMainModule.DocGenActionExecute(Sender: TObject);
begin
DoDocGen(False);
end;
procedure TMainModule.DropFileTargetDrop(Sender: TObject; ShiftState: TShiftState; Point: TPoint; var Effect: Integer);
begin
{$if Defined(WIN32) and Defined(DRAG_SUPPORT)}
LoadProject(Drop.Files);
{$ifend}
{$ifdef LINUX}
{ TODO : Fix for Linux DropFileTargetDrop}
{$endif}
end;
procedure TMainModule.AboutActionExecute(Sender: TObject);
var
F : TAboutForm;
begin
F := TAboutForm.Create(nil);
try
{$ifdef WIN32}
F.IconImage.Picture.Icon.Handle := LoadIcon(HInstance,'MAINICON');
{$endif}
{$ifdef LINUX}
{ TODO : Fix for Linux }
{$endif}
F.NameLabel.Caption := uConst.ProgName + ' ' + uConst.ProgVersion;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -