⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 umainmodule.pas

📁 ESS-Model is a powerful, reverse engine, UML-tool for Delphi/Kylix and Java-files.
💻 PAS
📖 第 1 页 / 共 2 页
字号:
{
  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 + -