unit uPantallaPrincipal;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, XPMan, uGUIBase, uCustomEditor,
  JvNavigationPane, JvExExtCtrls, JvComponent, Menus, ImgList,
  PngImageList, ActnList, uHostManager, JvExControls, JvPageList, JvPanel,
  TBX, TB2Item, TB2Dock, TB2Toolbar, ComCtrls, TBXToolPals, TBXLists,
  TBXExtItems, TB2ExtItems, TBXMDI, TBXDkPanels, JvSplitter, JvSyncSplitter,
  JvXPBar, JvXPCore, JvXPContainer, JvLookOut, JvOutlookBar, Buttons,
  JvExButtons, JvBitBtn, JvSpeedButton, JvExStdCtrls, JvButton, JvCtrls,
  JvStartMenuButton, JvTransparentButton, JvExComCtrls, JvListView,
  JvAppStorage, JvAppRegistryStorage, JvFormPlacement, JvBaseDlg,
  JvJVCLAboutForm, AppEvnts, JvWaitingGradient, JvGradient,
  cxControls, JvComponentBase, JvMenus, TBXStatusBars, uEmpresasController,
  pngimage;
type

  IMainForm = interface(IHostForm)
    ['{56FCE1D7-E163-4A36-A468-A6324A4E3911}']
    function GetEmpresasController : IEmpresasController;
    property EmpresasController : IEmpresasController read GetEmpresasController;
    procedure ReleaseEmbedded;
  end;


  TfPantallaPrincipal = class(TForm, IHostForm, IMainForm)
    GeneralActionList: TActionList;
    ModulesSmallImageList: TPngImageList;
    XPManifest1: TXPManifest;
    actSalir: TAction;
    ModulesActionList: TActionList;
    ModulesLargeImageList: TPngImageList;
    pnlContenido: TTBXAlignmentPanel;
    JvNavigationPane: TJvNavigationPane;
    pnlMain: TTBXAlignmentPanel;
    JvSyncSplitter1: TJvSyncSplitter;
    HostManager: THostManager;
    actLogin: TAction;
    pagInicio: TJvNavPanelPage;
    StyleManagerButtons: TJvNavPaneStyleManager;
    JvFormStorage: TJvFormStorage;
    JvAppRegistryStorage: TJvAppRegistryStorage;
    actAdministracion: TAction;
    ApplicationEvents: TApplicationEvents;
    actCambiarPass: TAction;
    actConexion: TAction;
    actAcerca: TAction;
    pnlBorde: TJvXPContainer;
    HostMenu: TJvMainMenu;
    JvXPMenuItemPainter1: TJvXPMenuItemPainter;
    Archivo2_OLD: TMenuItem;
    Ayuda2_OLD: TMenuItem;
    Cambiarmicontrasea2_OLD: TMenuItem;
    N3_OLD: TMenuItem;
    Configurarconexin2_OLD: TMenuItem;
    Paneldeadministracin2_OLD: TMenuItem;
    N4_OLD: TMenuItem;
    Salir2_OLD: TMenuItem;
    Acercade2_OLD: TMenuItem;
    lblBienvenido: TLabel;
    Label22: TLabel;
    TBXStatusBar1: TTBXStatusBar;
    StatusPanelImageList: TPngImageList;
    Empresa1_OLD: TMenuItem;
    Listadeempresas1_OLD: TMenuItem;
    N1_OLD: TMenuItem;
    Opciones1_OLD: TMenuItem;
    Edicin1_OLD: TMenuItem;
    N1: TMenuItem;
    Panel1: TPanel;
    Label1: TLabel;
    Image1: TImage;
    Compras1: TMenuItem;
    Montajes1: TMenuItem;
    Ventas1: TMenuItem;
    actMenuCompras: TAction;
    actMontajesMenu: TAction;
    actVentasMenu: TAction;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure HostManagerAfterLoad(Sender: TObject; AModuleInfo: TModuleInfo);
    procedure Salir1Click(Sender: TObject);
    procedure actSalirExecute(Sender: TObject);
    procedure actLoginExecute(Sender: TObject);
    procedure actCambiarPassExecute(Sender: TObject);
    procedure actAcercaExecute(Sender: TObject);
    procedure actConexionExecute(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure JvNavigationPaneChange(Sender: TObject);
    procedure ApplicationEventsException(Sender: TObject; E: Exception);
    procedure actMenuComprasExecute(Sender: TObject);
    procedure actMenuComprasUpdate(Sender: TObject);
    procedure actMontajesMenuExecute(Sender: TObject);
    procedure actVentasMenuExecute(Sender: TObject);
  private
    FContenido : TCustomEditor;
    FStartDefaultAction : TBasicAction;
    FEmpresasController : IEmpresasController;
    procedure ShowEmbedded(AEditor : ICustomEditor);
    procedure ReleaseEmbedded;
    procedure AplicarPerfil;
    procedure RefrescarUI;
    procedure InicializarUI;
    procedure CargarModulos;
    procedure OnThemeChange(Sender: TObject);
    procedure RegisterModule(AModuleInfo : TModuleInfo);
    procedure ExecuteActionMenu(Sender : TObject);
  protected
    function GetWorkPanel : TWinControl;
    function GetEmpresasController : IEmpresasController;
  public
    function IsShortcut(var Message: TWMKey): Boolean; override;
    procedure OnWorkPanelChanged(AEditor : ICustomEditor);
    constructor Create(AOwner: TComponent); override;
    property WorkPanel : TWinControl read GetWorkPanel;
    property EmpresasController : IEmpresasController read GetEmpresasController;
  end;

var
  fPantallaPrincipal: TfPantallaPrincipal;

implementation

uses
  uDataModuleConexion, uModuleController, uDataModuleBase, Math, uMenuUtils,
  uSplash, uAcercaDe, UxTheme, Themes, uDataModuleUsuarios, uPluginEmpresas,
  uNavPaneController, uMainMenuController, uROSessions, FactuGES_Intf;

{$R *.dfm}

function OpenThemeData(hwnd: HWND; pszClassList: LPCWSTR): THandle; stdcall;
  external 'uxtheme.dll';

function CloseThemeData(hTheme: THandle): HRESULT; stdcall;
  external 'uxtheme.dll';

function DrawThemeBackground(hTheme: THandle; hdc: HDC; iPartId, iStateId:
Integer; const pRect: TRect;
  pClipRect: PRECT): HRESULT; stdcall;
  external 'uxtheme.dll'; 

{
***************************** TfPantallaPrincipal ******************************
}

procedure TfPantallaPrincipal.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  CanClose := True;
  if Assigned(FContenido) then
    CanClose := FContenido.CloseQuery;
end;

procedure TfPantallaPrincipal.FormCreate(Sender: TObject);
begin
  ApplicationEvents.Activate;
  Caption := Application.Title + ' - ' + dmBase.DarVersion;
  SplashScreen := TSplashScreen.Create(Application) ;
  SplashScreen.Show;

  JvNavigationPane.StyleManager := dmBase.StyleManager;
  dmBase.OnThemeChange := Self.OnThemeChange;
  Self.OnThemeChange(Self); // Forzar el refresco de los colores del tema activo

  with HostManager do
  begin
    BPLPath := ExtractFilePath(Application.ExeName) + '\';
    MainMenu := Self.Menu;
    MainForm := Self;
    OnAfterLoad := HostManagerAfterLoad;
  end;

  actLogin.Execute;
end;

procedure TfPantallaPrincipal.FormDestroy(Sender: TObject);
begin
//  ReleaseEmbedded;
  HostManager.UnloadModules;
  ApplicationEvents.CancelDispatch;
end;

procedure TfPantallaPrincipal.HostManagerAfterLoad(Sender: TObject;
        AModuleInfo: TModuleInfo);
begin
  RegisterModule(AModuleInfo);
end;

procedure TfPantallaPrincipal.RefrescarUI;
var
  ATitulo : String;
begin
  ATitulo := Application.Title + ' - ' + dmBase.DarVersion;
  if Assigned(dmUsuarios.EmpresaActual) then
    ATitulo := ATitulo + ' - ' + dmUsuarios.EmpresaActual.NOMBRE;
  Caption := ATitulo;

  if dmConexion.HayConexion then 
    TBXStatusBar1.Panels[0].Caption := 'Conectado a: ' + dmConexion.TargetURL
  else
    TBXStatusBar1.Panels[0].Caption := 'Desconectado';

  if Assigned(dmUsuarios.LoginInfo) then
    TBXStatusBar1.Panels[1].Caption := dmUsuarios.LoginInfo.Usuario
  else
    TBXStatusBar1.Panels[1].Caption := '';
end;

procedure TfPantallaPrincipal.RegisterModule(AModuleInfo : TModuleInfo);
var
  AModule: TModuleController;
  AEmpresasPlugin : IEmpresasPlugin;
begin
  AModule := AModuleInfo.Module;

  SplashScreen.Texto := 'Cargando ''' + AModule.ModuleName + '''...';

  if Supports(AModule, IEmpresasPlugin, AEmpresasPlugin) then
    FEmpresasController := AEmpresasPlugin.Controller;
end;

procedure TfPantallaPrincipal.ReleaseEmbedded;
begin
  if Assigned(FContenido) then
    FContenido.Release;
  FContenido := Nil;  
  Application.ProcessMessages;
end;

procedure TfPantallaPrincipal.Salir1Click(Sender: TObject);
begin
  Close;
end;

procedure TfPantallaPrincipal.actSalirExecute(Sender: TObject);
begin
  Close;
end;

procedure TfPantallaPrincipal.actVentasMenuExecute(Sender: TObject);
begin
  //
end;

procedure TfPantallaPrincipal.OnThemeChange(Sender: TObject);
begin
  LockWindowUpdate(Handle);
  try
    Color := dmBase.StyleManager.Colors.DividerColorTo;
    //pnlBorde.Color := dmBase.StyleManager.Colors.FrameColor;
    pnlBorde.BoundColor := dmBase.StyleManager.Colors.FrameColor;
    with StyleManagerButtons do
    begin
      Colors.ButtonColorFrom := clWindow;
      Colors.ButtonColorTo := clWindow;
      Colors.ButtonSeparatorColor := clWindow;
      Colors.SplitterColorFrom := clWindow;
      Colors.SplitterColorTo := clWindow;
      Colors.DividerColorFrom := clWindow;
      Colors.DividerColorTo := clWindow;
      Colors.HeaderColorFrom := clWindow;
      Colors.HeaderColorTo := clWindow;
      Colors.FrameColor := clWindow;
      Colors.ToolPanelHeaderColorFrom := clWindow;
      Colors.ToolPanelHeaderColorTo := clWindow;

      Colors.ButtonHotColorFrom := dmBase.StyleManager.Colors.ButtonHotColorFrom;
      Colors.ButtonHotColorTo := dmBase.StyleManager.Colors.ButtonHotColorTo;

      Colors.ButtonSelectedColorFrom := dmBase.StyleManager.Colors.ButtonSelectedColorFrom;
      Colors.ButtonSelectedColorTo := dmBase.StyleManager.Colors.ButtonSelectedColorTo;
    end;
    lblBienvenido.Font.Color := JvNavigationPane.Colors.ButtonColorTo;
{    JvGradient1.StartColor := JvNavigationPane.Colors.ButtonColorFrom;
    JvGradient1.EndColor := JvNavigationPane.Colors.ButtonColorTo;}
  finally
    LockWindowUpdate(0);
    Refresh;
  end;
end;

function TfPantallaPrincipal.GetEmpresasController: IEmpresasController;
begin
  Result := FEmpresasController;
end;

function TfPantallaPrincipal.GetWorkPanel: TWinControl;
begin
  Result := pnlMain;
end;

procedure TfPantallaPrincipal.InicializarUI;
var
  i : Integer;
  AMenuItem : TMenuItem;
  APageIndex : Integer;
  AStringList : TStringList;
  APanel : TScrollBox;
begin
  for i := 0 to HostManager.ModulesCount - 1 do
    MainMenuController.RegisterModule(HostManager.Modules[i]);

  MainMenuController.SortMenuByTag;
  MainMenuController.InitMainMenu;

  for i := 0 to HostManager.ModulesCount - 1 do
    NavPaneController.RegisterModule(HostManager.Modules[i]);

  NavPaneController.InitNavPane;

  RefrescarUI;  
end;


procedure TfPantallaPrincipal.actLoginExecute(Sender: TObject);
begin
  HostManager.UnloadModules;

  if dmUsuarios.Login then
  begin
    ShowHourglassCursor;
    SplashScreen.Update;
    Application.ProcessMessages;
    CargarModulos;
    try
      InicializarUI;
      Application.ProcessMessages;
      Visible := True;
      AplicarPerfil;
    finally
      SplashScreen.Update;
      SplashScreen.Hide;
      FreeAndNIL(SplashScreen);
      HideHourglassCursor;
    end;
  end
  else
    Application.Terminate;
end;

procedure TfPantallaPrincipal.actMenuComprasExecute(Sender: TObject);
begin
  //
end;

procedure TfPantallaPrincipal.actMenuComprasUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled := Assigned(dmUsuarios.EmpresaActual);
end;

procedure TfPantallaPrincipal.actMontajesMenuExecute(Sender: TObject);
begin
  //
end;

procedure TfPantallaPrincipal.ExecuteActionMenu(Sender: TObject);
var
  i : integer;
begin
  for i := 0 to JvNavigationPane.PageCount - 1 do
  begin
    if JvNavigationPane.NavPages[i].Caption = (Sender as TAction).Caption then
    begin
      JvNavigationPane.ActivePageIndex := i;
      Break;
    end;
  end;
end;

procedure TfPantallaPrincipal.AplicarPerfil;
begin
  //
end;

procedure TfPantallaPrincipal.ApplicationEventsException(Sender: TObject;
  E: Exception);
begin
  if E is EROSessionNotFound then
  begin
    if not dmUsuarios.Login then
      ShowMessage(E.Message);
  end
  else
    ShowMessage(E.Message);
end;

procedure TfPantallaPrincipal.OnWorkPanelChanged(AEditor: ICustomEditor);
begin
  //
end;

procedure TfPantallaPrincipal.ShowEmbedded(AEditor: ICustomEditor);
begin
  if Assigned(FContenido) and not FContenido.CloseQuery then
  begin
    AEditor.Release;
    AEditor := NIL;
    Exit;
  end;

  ShowHourglassCursor;
  LockWindowUpdate(Handle);
  ReleaseEmbedded;
  try
    FContenido := TCustomEditor(AEditor.GetInstance);
    with (FContenido) do
    begin
      Visible := False;
      BorderIcons := [];
      BorderStyle := bsNone;
      Parent := WorkPanel;
      FContenido.Show;
      Align := alClient;
      FContenido.SetFocus;
    end;
  finally
    Application.ProcessMessages;
    LockWindowUpdate(0);
    HideHourglassCursor;
  end;
  OnWorkPanelChanged(FContenido);
end;

procedure TfPantallaPrincipal.CargarModulos;
begin
    HostManager.LoadModule('Empresas_plugin.bpl');
    HostManager.LoadModule('Contactos_plugin.bpl');
    HostManager.LoadModule('Presupuestos_plugin.bpl');
    HostManager.LoadModule('Montajes_plugin.bpl');    
    HostManager.LoadModule('FacturasCliente_plugin.bpl');
    HostManager.LoadModule('PedidosProveedor_plugin.bpl');
    HostManager.LoadModule('CobrosCliente_plugin.bpl');

    HostManager.LoadModule('PedidosMontaje_plugin.bpl');
    HostManager.LoadModule('CobrosMontaje_plugin.bpl');
    HostManager.LoadModule('MontajesDetalle_plugin.bpl');
    HostManager.LoadModule('MontajesCompleto_plugin.bpl');                
end;

constructor TfPantallaPrincipal.Create(AOwner: TComponent);
begin
  inherited;
  FContenido := NIL;

  with NavPaneController do
  begin
    SmallImages := ModulesSmallImageList;
    LargeImages := ModulesLargeImageList;
    NavigationPane := JvNavigationPane;
    MainForm := Self;
  end;

  with MainMenuController do
  begin
    SmallImages := ModulesSmallImageList;
    LargeImages := ModulesLargeImageList;
    MainMenu := HostMenu;
    MainForm := Self;
  end;
end;

procedure TfPantallaPrincipal.actCambiarPassExecute(Sender: TObject);
begin
//  dmUsuarios.CambiarPassword;
  RefrescarUI;
end;

procedure TfPantallaPrincipal.actAcercaExecute(Sender: TObject);
begin
  with TfAcercaDe.Create(NIL) do
    try
      HostManager := Self.HostManager;
      ShowModal;
    finally
      Free;
    end;
end;

function TfPantallaPrincipal.IsShortcut(var Message: TWMKey): Boolean;
Var
   ctrl: TWinControl;
   comp: TComponent;
   i: Integer;
 Begin
   ctrl := ActiveControl;
   If ctrl <> Nil Then Begin
     Repeat
       ctrl := ctrl.Parent
     Until (ctrl = nil) or (ctrl Is TCustomForm);
     // Note: replace TCustomFrame with TForm, check if the found form is
     // self, if not, execute the following block of code.
     If ctrl <> nil Then Begin
       For i:= 0 To ctrl.componentcount-1 Do Begin
         comp:= ctrl.Components[i];
         If comp Is TCustomActionList Then Begin
           result := TCustomActionList(comp).IsShortcut( message );
           If result Then
             Exit;
         End;
       End;
     End;
   End;
   //Result := inherited IsShortCut(Message);
end;

procedure TfPantallaPrincipal.JvNavigationPaneChange(Sender: TObject);
begin
  { Cuando se destruye el formulario este evento salta pero no
    hay que cambiar de empresa }
  if (csDestroying in ComponentState) then
    Exit;

  //Se libera el contenido que tenga ya que cambiamos de empresa;
  ReleaseEmbedded;

  dmUsuarios.IDEmpresaActual := JvNavigationPane.ActivePage.Tag;
  RefrescarUI;
end;

procedure TfPantallaPrincipal.actConexionExecute(Sender: TObject);
begin
  dmConexion.ConfigurarConexion;
  RefrescarUI;  
end;


end.
