unit uPantallaPrincipal; interface uses Windows, Forms, SysUtils, Messages, JvMenus, Menus, Graphics, AppEvnts, JvAppStorage, JvAppRegistryStorage, JvFormPlacement, JvComponentBase, JvNavigationPane, ImgList, Controls, PngImageList, Classes, ActnList, XPMan, TBXStatusBars, JvXPCore, JvXPContainer, pngimage, ExtCtrls, StdCtrls, JvPageList, JvExControls, JvExExtCtrls, JvSplitter, JvSyncSplitter, TBXDkPanels, uCustomEditor, uHostManager, uGUIBase, Dialogs, cxLocalization; type IMainForm = interface(IHostForm) ['{7F6F5574-5E5C-486C-AA24-D3AEAA52D243}'] 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; actLogin: TAction; StyleManagerButtons: TJvNavPaneStyleManager; JvFormStorage: TJvFormStorage; JvAppRegistryStorage: TJvAppRegistryStorage; actAdministracion: TAction; ApplicationEvents: TApplicationEvents; actCambiarPass: TAction; actConexion: TAction; actAcerca: TAction; pnlBorde: TJvXPContainer; HostMenu: TMainMenu; 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; Opciones1_OLD: TMenuItem; Edicin1_OLD: TMenuItem; N1: TMenuItem; Compras1: TMenuItem; Ventas1: TMenuItem; actMenuCompras: TAction; actMenuLogistica: TAction; actMenuVentas: TAction; Logistica1: TMenuItem; pagInicio: TJvNavPanelPage; Panel1: TPanel; Label1: TLabel; Image1: TImage; actVerPanel: TAction; actVerBarraEstado: TAction; Paneldeexploracin1: TMenuItem; Paneldeexploracin2: TMenuItem; Informacindeempresa1: TMenuItem; Administracin1: TMenuItem; N2: TMenuItem; Usuarios1: TMenuItem; Perfiles1: TMenuItem; N3: TMenuItem; N4: TMenuItem; Datos1: TMenuItem; N5: TMenuItem; N6: TMenuItem; N7: TMenuItem; N8: TMenuItem; N9: TMenuItem; N10: TMenuItem; Contabilidad1: TMenuItem; actConfigurar: TAction; ConfigurarFactuGES1: TMenuItem; actMenuContabilidad: TAction; actMenuEmpresa: TAction; Informes1: TMenuItem; actMenuInformes: TAction; actInformacionEmpresa: TAction; cxLocalizer1: TcxLocalizer; procedure FormCreate(Sender: TObject); procedure Salir1Click(Sender: TObject); procedure actSalirExecute(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 actMenuLogisticaExecute(Sender: TObject); procedure actMenuVentasExecute(Sender: TObject); procedure actActualizacionesExecute(Sender: TObject); procedure actVerPanelUpdate(Sender: TObject); procedure actVerPanelExecute(Sender: TObject); procedure actVerBarraEstadoUpdate(Sender: TObject); procedure actVerBarraEstadoExecute(Sender: TObject); procedure Acercade1Click(Sender: TObject); procedure Usuarios1Click(Sender: TObject); procedure Perfiles1Click(Sender: TObject); procedure FormShow(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure actConfigurarExecute(Sender: TObject); procedure actMenuContabilidadExecute(Sender: TObject); procedure actMenuEmpresaExecute(Sender: TObject); procedure actMenuInformesExecute(Sender: TObject); procedure Listadeempresas1_OLDClick(Sender: TObject); procedure actInformacionEmpresaExecute(Sender: TObject); private FContenido : TCustomEditor; procedure ShowEmbedded(AEditor : ICustomEditor); procedure ReleaseEmbedded; procedure AplicarPerfil; procedure InicializarUI; procedure CargarIdioma; procedure OnThemeChange(Sender: TObject); procedure ExecuteActionMenu(Sender : TObject); //procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND; protected function GetWorkPanel : TWinControl; procedure CreateParams(var Params: TCreateParams); public procedure RefrescarUI; function IsShortcut(var Message: TWMKey): Boolean; override; procedure OnWorkPanelChanged(AEditor : ICustomEditor); constructor Create(AOwner: TComponent); override; property WorkPanel : TWinControl read GetWorkPanel; end; var fPantallaPrincipal: TfPantallaPrincipal; implementation {$INCLUDE ..\FactuGES.inc} uses uSplash, uAcercaDe, UxTheme, Themes, uMenuUtils, uBizEmpresas, uFactuGES_App, uDMBase, uDataModuleConexion, uModuleController, uMainMenuController, uNavPaneController, uDialogUtils, cxControls; {$R *.dfm} { ***************************** TfPantallaPrincipal ****************************** } procedure TfPantallaPrincipal.FormClose(Sender: TObject; var Action: TCloseAction); begin //Tiene que ser en este método porque salta antes que liberar la aplicación, si lo dejamos //en el evento onDestroy no le da tiempo a liberar el contenido y se pone a liberar la aplicación //provocando un error de memoria ReleaseEmbedded; ApplicationEvents.CancelDispatch; end; 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; Application.Title := AppFactuGES.AppName + ' ' + AppFactuGES.AppVersion; Caption := Application.Title; JvNavigationPane.StyleManager := dmBase.StyleManager; dmBase.OnThemeChange := Self.OnThemeChange; Self.OnThemeChange(Self); // Forzar el refresco de los colores del tema activo end; procedure TfPantallaPrincipal.FormShow(Sender: TObject); begin //El usuario vendedor de graden solo podrá ver ventas y caja (Graden-Vendedor(2)) if (AppFactuGES.UsuarioActivo.ID_PERFIL = CTE_PERFIL_VENDEDOR_GRADEN) or (AppFactuGES.UsuarioActivo.ID_PERFIL = CTE_PERFIL_VENDEDOR_MARBELLA) or (AppFactuGES.UsuarioActivo.ID_PERFIL = CTE_PERFIL_VENDEDOR_DONOSTI) or (AppFactuGES.UsuarioActivo.ID_PERFIL = CTE_PERFIL_VENDEDOR_GRADEN_UECKO) then begin Compras1.Enabled := False; Compras1.Visible := False; Logistica1.Enabled := False; Logistica1.Visible := False; ConfigurarFactuGES1.Enabled := False; ConfigurarFactuGES1.Visible := False; end //El usuario normal de uecko solo no verá contabilidad else if (AppFactuGES.UsuarioActivo.ID_PERFIL = CTE_PERFIL_USUARIO) then begin Contabilidad1.Enabled := False; Contabilidad1.Visible := False; ConfigurarFactuGES1.Enabled := False; ConfigurarFactuGES1.Visible := False; end; //El usuario COMPRAS if (AppFactuGES.UsuarioActivo.ID_PERFIL = CTE_PERFIL_COMPRAS) then begin Contabilidad1.Enabled := False; Contabilidad1.Visible := False; Ventas1.Enabled := False; Ventas1.Visible := False; ConfigurarFactuGES1.Enabled := False; ConfigurarFactuGES1.Visible := False; end; //El usuario GERENCIA) if (AppFactuGES.UsuarioActivo.ID_PERFIL = CTE_PERFIL_GERENCIA) or (AppFactuGES.UsuarioActivo.ID_PERFIL = CTE_PERFIL_ADMINISTRADOR) then begin Informes1.Enabled := True; Informes1.Visible := True; end else begin Informes1.Enabled := False; Informes1.Visible := False; end; InicializarUI; //Solo verá administracion de usuarios el perfil Administrador(3), están en la tabla usuarios if (AppFactuGES.UsuarioActivo.ID_PERFIL <> CTE_PERFIL_ADMINISTRADOR) then begin // Perfiles1.Visible := False; Administracin1.Visible := False; end; end; procedure TfPantallaPrincipal.RefrescarUI; var ATitulo : String; i: Integer; begin ATitulo := AppFactuGES.GetAppFullName; if Assigned(AppFactuGES.EmpresaActiva) then begin ATitulo := AppFactuGES.EmpresaActiva.NOMBRE + ' - ' + ATitulo; actMenuLogistica.Enabled := AppFactuGES.EmpresaActiva.ID = CTE_EMPRESA_ABETO; actMenuLogistica.Visible := AppFactuGES.EmpresaActiva.ID = CTE_EMPRESA_ABETO; end; Application.Title := ATitulo; Caption := Application.Title; if dmConexion.HayConexion then TBXStatusBar1.Panels[0].Caption := 'Conectado a: ' + dmConexion.TargetURL else TBXStatusBar1.Panels[0].Caption := 'Desconectado'; if Assigned(AppFactuGES.UsuarioActivo) then TBXStatusBar1.Panels[1].Caption := AppFactuGES.UsuarioActivo.UserName else TBXStatusBar1.Panels[1].Caption := ''; if Assigned(AppFactuGES.TiendaActiva) then TBXStatusBar1.Panels[2].Caption := AppFactuGES.TiendaActiva.NOMBRE else TBXStatusBar1.Panels[2].Caption := 'Sin tienda por defecto'; // Comprobar que el panel lateral tiene la empresa activa if Assigned(AppFactuGES.EmpresaActiva) then for i := 0 to JvNavigationPane.PageCount - 1 do if (JvNavigationPane.Pages[i].Tag = AppFactuGES.EmpresaActiva.ID) and (JvNavigationPane.ActivePageIndex <> i) then JvNavigationPane.ActivePageIndex := i; 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.actMenuVentasExecute(Sender: TObject); begin // end; procedure TfPantallaPrincipal.actVerBarraEstadoExecute(Sender: TObject); begin TBXStatusBar1.Visible := not TBXStatusBar1.Visible; end; procedure TfPantallaPrincipal.actVerBarraEstadoUpdate(Sender: TObject); begin (Sender as TAction).Checked := TBXStatusBar1.Visible; end; procedure TfPantallaPrincipal.actVerPanelExecute(Sender: TObject); begin JvNavigationPane.Visible := not JvNavigationPane.Visible; if (JvNavigationPane.Visible) and (JvNavigationPane.Width = 0) then JvNavigationPane.Width := 210; end; procedure TfPantallaPrincipal.actVerPanelUpdate(Sender: TObject); begin (Sender as TAction).Checked := JvNavigationPane.Visible and (JvNavigationPane.Width > 0); end; procedure TfPantallaPrincipal.OnThemeChange(Sender: TObject); begin LockWindowUpdate(Handle); try Color := dmBase.StyleManager.Colors.DividerColorTo; 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; finally LockWindowUpdate(0); Refresh; end; end; function TfPantallaPrincipal.GetWorkPanel: TWinControl; begin Result := pnlMain; end; procedure TfPantallaPrincipal.InicializarUI; var AListaEmpresas : IBizEmpresa; i : Integer; begin ShowHourglassCursor; try CargarIdioma; for i := 0 to AppFactuGES.ModuleManager.ModulesCount - 1 do MainMenuController.RegisterModule(AppFactuGES.ModuleManager.Modules[i]); MainMenuController.SortMenuByTag; MainMenuController.InitMainMenu; for i := 0 to AppFactuGES.ModuleManager.ModulesCount - 1 do NavPaneController.RegisterModule(AppFactuGES.ModuleManager.Modules[i]); NavPaneController.InitNavPane; try AListaEmpresas := AppFactuGES.EmpresasController.BuscarTodos(AppFactuGES.UsuarioActivo.ID_PERFIL); if Assigned(AListaEmpresas) then begin AListaEmpresas.Active := True; if AListaEmpresas.RecordCount > 0 then begin // Oculto la página de inicio cuando // se pueden manejar varias empresas. JvNavigationPane.ActivePageIndex := 1; pagInicio.PageList := NIL; pagInicio.Visible := False; end; end; finally AListaEmpresas.Close; AListaEmpresas := NIL; end; RefrescarUI; finally HideHourglassCursor; end; end; procedure TfPantallaPrincipal.actMenuComprasExecute(Sender: TObject); begin // end; procedure TfPantallaPrincipal.actMenuComprasUpdate(Sender: TObject); begin (Sender as TAction).Enabled := Assigned(AppFactuGES.EmpresaActiva); end; procedure TfPantallaPrincipal.actMenuContabilidadExecute(Sender: TObject); begin // end; procedure TfPantallaPrincipal.actMenuEmpresaExecute(Sender: TObject); begin // end; procedure TfPantallaPrincipal.actMenuInformesExecute(Sender: TObject); begin // end; procedure TfPantallaPrincipal.actMenuLogisticaExecute(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 // OJOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO if not dmUsuarios.Login then ShowMessage(E.Message); end else} ShowMessage(E.Message); //ShowErrorMessage('Se ha producido un error', '', E); end; procedure TfPantallaPrincipal.OnWorkPanelChanged(AEditor: ICustomEditor); begin // end; procedure TfPantallaPrincipal.Perfiles1Click(Sender: TObject); begin AppFactuGES.UsuariosController.VerPerfiles 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.Usuarios1Click(Sender: TObject); begin AppFactuGES.UsuariosController.VerUsuarios end; {procedure TfPantallaPrincipal.WMSysCommand(var Msg: TWMSysCommand); begin} // sirve para recuperar el foco el formulario principal cuando // tenemos varios formularios hijos abiertos a la vez. { case (Msg.cmdtype and $FFF0) of SC_MINIMIZE: begin ShowWindow(handle, SW_MINIMIZE); Msg.result := 0; end; SC_RESTORE: begin ShowWindow(handle, SW_RESTORE); Msg.result := 0; end; else DefaultHandler(Msg); end; end;} procedure TfPantallaPrincipal.CargarIdioma; begin cxLocalizer1.LoadFromFile(ExtractFilePath(Application.ExeName) + '\languages.ini'); cxLocalizer1.Locale := 1034; // Código para castellano cxLocalizer1.Translate; end; constructor TfPantallaPrincipal.Create(AOwner: TComponent); begin inherited; {$IFDEF MULTIEMPRESA} // {$ELSE} Listadeempresas1_OLD.Destroy; {$ENDIF} FContenido := NIL; with AppFactuGES.ModuleManager do begin MainMenu := Self.Menu; MainForm := Self; end; 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.CreateParams(var Params: TCreateParams); begin { ¡¡¡No quitar este procedimiento aunque no haga nada!!!!! Si se quita, esta pantalla principal se queda en el fondo después de desaparecer la pantalla de login. } inherited CreateParams(Params); end; procedure TfPantallaPrincipal.actActualizacionesExecute(Sender: TObject); begin { fActualizacion := TfActualizacion.Create(Self); try fActualizacion.ShowModal; finally FreeAndNil(fActualizacion); end;} end; procedure TfPantallaPrincipal.actCambiarPassExecute(Sender: TObject); begin AppFactuGES.UsuariosController._ShowChangePassword; RefrescarUI; end; procedure TfPantallaPrincipal.Acercade1Click(Sender: TObject); begin AppFactuGES.UsuariosController.StartLogin; end; procedure TfPantallaPrincipal.actAcercaExecute(Sender: TObject); begin with TfAcercaDe.Create(NIL) do try HostManager := AppFactuGES.ModuleManager; 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; AppFactuGES.CambiarEmpresa(JvNavigationPane.ActivePage.Tag); RefrescarUI; end; procedure TfPantallaPrincipal.Listadeempresas1_OLDClick(Sender: TObject); begin AppFactuGES.SeleccionarEmpresa; RefrescarUI; end; procedure TfPantallaPrincipal.actConexionExecute(Sender: TObject); begin dmConexion.ConfigurarConexion; RefrescarUI; end; procedure TfPantallaPrincipal.actConfigurarExecute(Sender: TObject); begin AppFactuGES.Configurar; end; procedure TfPantallaPrincipal.actInformacionEmpresaExecute(Sender: TObject); begin AppFactuGES.EmpresasController.Ver(AppFactuGES.EmpresaActiva); end; end.