clsFormul.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Windows.Forms;
4 using System.Xml;
5 using System.Drawing;
6 using System.Reflection;
7 using System.Runtime.InteropServices;
8 using System.ComponentModel;
9 using System.Data;
10 
11 using sage.ew.functions;
12 using sage.ew.netvfp;
13 using sage.ew.global;
14 using sage.ew.ewbase;
15 using sage.ew.db;
16 using sage.ew.empresa;
17 
18 // PE-86617. Botón en la barra de título
20 using sage.ew.usuario;
21 using sage.ew.listados.Clases;
22 using sage.ew.formul.Forms;
23 using sage.ew.perfiles.Forms;
24 using sage.ew.interficies;
25 using sage.ew.objetos;
28 using Sage.ES.Onboarding.Clases;
29 using Sage.ES.Onboarding.Forms;
30 using sage.ew.functions.Clases;
31 using Sage.ES.S50.Addons;
32 using System.Linq;
33 using sage.ew.ewbase.Clases;
34 using sage.ew.formul.Clases;
35 using System.Diagnostics;
37 using sage.ew.images.Properties;
38 using sage.ew.botones;
42 using sage.ew.ewbase.Forms;
43 using mshtml;
44 using System.Web.Script.Serialization;
45 
46 namespace sage.ew.formul
47 {
48  #region ENUMERATIONS
49 
53  public enum TeclasRapidas
54  {
58  ninguna,
62  Control_A,
66  Control_B,
70  Control_C,
74  Control_D,
78  Control_E,
82  Control_F,
86  Control_G,
90  Control_H,
94  Control_I,
98  Control_J,
102  Control_K,
106  Control_L,
110  Control_M,
114  Control_N,
118  Control_O,
122  Control_P,
126  Control_Q,
130  Control_R,
134  Control_S,
138  Control_T,
142  Control_U,
146  Control_V,
150  Control_X,
154  Control_Y,
158  Control_Z
159  }
160 
164  public enum TeclasFuncion
165  {
169  ninguna,
173  F1,
177  F2,
181  F3,
185  F4,
189  F5,
193  F6,
197  F7,
201  F8,
205  F9,
209  Shift_F1,
213  Shift_F2,
217  Shift_F3,
221  Shift_F4,
225  Shift_F5,
229  Shift_F6,
233  Shift_F7,
237  Shift_F8,
241  Shift_F9,
245  Control_F1,
249  Control_F2,
253  Control_F3,
257  Control_F4,
261  Control_F5,
265  Control_F6,
269  Control_F7,
273  Control_F8,
277  Control_F9,
281  Alt_F1,
285  Alt_F2,
289  Alt_F3,
293  Alt_F4,
297  Alt_F5,
301  Alt_F6,
305  Alt_F7,
309  Alt_F8,
313  Alt_F9,
317  Escape
318  }
319 
323  public enum _TiposFormulario
324  {
328  Normal,
332  Tactil
333  }
334 
339  {
343  Denegado,
347  SoloLectura,
351  Completo,
356  }
357 
361  public enum _TiposAccesosMenu
362  {
366  Denegado,
370  Completo
371  }
372 
376  public enum eMotivoSoloLectura
377  {
381  Indeterminado = 0,
385  Normal = 1,
389  VersionDemo = 2
390  }
391 
392  #endregion ENUMERATIONS
393 
397  [
398  System.Drawing.ToolboxBitmap(typeof(System.Windows.Forms.Form)),
399  ]
400  public class FormBase : Form, IFormBase
401  {
402  #region Propiedades
403 
404  // PE-103236. Propiedad interna para que en caso de haber alguna irregularidad en la tabla Connect, sólo nos presente el mensaje de aviso una vez en cada pantalla
405  private bool _lConnectFallido = false;
406 
410  private bool _lAutomatico = false;
411 
412  private eMotivoSoloLectura _motivoDeSoloLectura = eMotivoSoloLectura.Indeterminado;
413 
414  private Timer _oTimerProperties;
415 
416  private string _cPantalla = "";
420  [
421  Browsable(false), // PE-87741
422  Bindable(false),
423  Category("Varios"),
424  DefaultValue(typeof(string), ""),
425  Description("Nombre del formulario equivalente de Eurowin."),
426  Localizable(false)
427  ]
428  public virtual string _Pantalla
429  {
430  get { return _cPantalla; }
431  set
432  {
433  bool llConstructor = (_cPantalla != value); // PARTE 92446. En gunas pantallas se ejecuta hasta 3 veces y presenta 3 mensajes si no tenemos acceso a la pantalla
434 
435  _cPantalla = value;
436 
437  // Asegurar que se controla el tema de accesos, readonly cuando se informe la pantalla correspondiente (PE-87996)
438  // PE-87841 Se mira que no estemos en modo diseño ya que sino no se podía establecer la propiedad al crear formularios
439  if (llConstructor && !string.IsNullOrWhiteSpace(_cPantalla) && !DesignMode) // PARTE 92446
440  Constructor_Privado();
441  }
442  }
443 
447  public virtual string _IDScreen { get;}
448 
454  public Dictionary<string, object> _ValoresAccesoDirecto = new Dictionary<string, object>();
455 
456  //PE-105409
461  [Browsable(false),
462  Bindable(false),
463  Category("Varios"),
464  DefaultValue(false),
465  Description("Estilos revisados."),
466  Localizable(false)]
467  public virtual bool _EstiloRevisado
468  {
469  get { return estiloRevisado; }
470  set { estiloRevisado = value; }
471  }
472  private bool estiloRevisado = false;
473 
477  public string _Sufijo
478  {
479  get { return _cSufijo; }
480  }
481  private string _cSufijo = string.Empty;
482 
486  public bool _SaveReuseFormSettings { get; set; } = true;
487 
491  protected bool _ReusingFormSettings { get; set; } = false;
492 
496  public Boolean _MostrarAcronimo
497  {
498  get
499  {
500  return _bMostrarAcronimo;
501  }
502  set
503  {
504  _bMostrarAcronimo = value;
505  Revisar_Titulo_Formulario();
506  }
507  }
508  private Boolean _bMostrarAcronimo = true;
509 
513  public Boolean _MostrarSufijo
514  {
515  get
516  {
517  return _bMostrarSufijo;
518  }
519  set
520  {
521  _bMostrarSufijo = value;
522  Revisar_Titulo_Formulario();
523  }
524  }
525  private Boolean _bMostrarSufijo = true;
526 
527  private String _Acronimo
528  {
529  get
530  {
531  String lcAcronimo = String.Empty;
532 
533  if (EW_GLOBAL._Empresa is Empresa && !String.IsNullOrEmpty(EW_GLOBAL._Empresa._Acronimo))
534  {
535  lcAcronimo = String.Format("{0} |", EW_GLOBAL._Empresa._Acronimo);
536  }
537  return lcAcronimo;
538  }
539  }
540 
541  private InfoTooltip _oInfoToolTip = null;
542 
543  private InfoTooltip _InfoToolTip
544  {
545  get
546  {
547  if (_oInfoToolTip == null)
548  {
549  _oInfoToolTip = new InfoTooltip();
550  _oInfoToolTip._Font = Font;
551  _oInfoToolTip.AutoPopDelay = 5000;
552  _oInfoToolTip.InitialDelay = 0;
553  _oInfoToolTip.ReshowDelay = 250;
554  _oInfoToolTip.ShowAlways = true;
555  _oInfoToolTip.Active = false;
556  }
557 
558  return _oInfoToolTip;
559  }
560  }
561 
567  public String _ObtenerText(Boolean tlAcronimo)
568  {
569  String lcTitulo = Text;
570 
571  if ((_MostrarAcronimo && tlAcronimo) || (!_MostrarAcronimo && !tlAcronimo))
572  {
573  lcTitulo = Text;
574  }
575  else if (tlAcronimo)
576  {
577  lcTitulo = String.Format("{0} {1}", _Acronimo, Text);
578  }
579  else if (_MostrarAcronimo)
580  {
581  lcTitulo = _EliminarAcronimo(Text);
582  }
583 
584  return lcTitulo;
585  }
586 
590  [
591  Browsable(false),
592  Bindable(false),
593  Category("Varios"),
594  DefaultValue(true),
595  Description("Obtiene o establece si el formulario debe controlar los permisos de usuario."),
596  Localizable(false)
597  ]
598  public virtual bool _Gestionar_permisos
599  {
600  get { return _lGestionPermisos; }
601  set { _lGestionPermisos = value; }
602  }
603  private bool _lGestionPermisos = true;
604 
608  [
609  Browsable(false),
610  Bindable(false),
611  Category("Varios"),
612  DefaultValue(false),
613  Description("Obtiene o establece si se tiene acceso al formulario en modo Listas previas"),
614  Localizable(false)
615  ]
616  public bool AccesoListasPrevias
617  {
618  get { return _lAccesoListasPrevias; }
619  set { _lAccesoListasPrevias = value; }
620  }
621  private bool _lAccesoListasPrevias = false;
622 
623  //private PictureBox pbPantalla;
624  private ContextMenuStrip contextMenuStripPantalla;
625  private IContainer components;
626  private ToolStripMenuItem nombreFormularioToolStripMenuItem;
627  private ToolStripMenuItem gestiónDeFavoritosToolStripMenuItem;
628  private ToolStripMenuItem gestiónDeAccesosToolStripMenuItem;
629  private ToolStripMenuItem crearAccesoDirectoToolStripMenuItem;
630  private ToolStripMenuItem crearApunteCalendarioItem; //PE-96746
631  private ToolStripMenuItem listadosPersonalizablesEditarItem; //PE-103520
632  private ToolStripMenuItem listadosPersonalizablesDuplicarItem; //PE-103520
633  private ToolStripMenuItem ayudaPantallaToolStripMenuItem; // PARTE 101745
634  private ToolStripMenuItem crearTareaProgramadaItem;
635  private ToolStripMenuItem configuracionesUsuarioItem;
636  private ToolStripMenuItem toolConfiguracionesToolStripMenuItem;
637  private ToolStripSeparator configuracionesUsuarioItemSeparator;
638  private ToolStripMenuItem ShowPropertiesToolStripMenuItem;
639 
640  //private ToolStripMenuItem reordenarPantallasToolStripMenuItem; // PE-102903,103085
641 
645  private oResultadoAyuda _oResultadoAyuda = new oResultadoAyuda();
646 
647  private List<Control> lstOpcionesMenuAddon = new List<Control>(); // Task 123210: Creación de botones en la barra de herramientas de los Mantes. Lista de controles para las opciones que se pueden añadir a los mantes y en el formulario de asientos
648 
652  [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
653  public ewcontextmenustrip _MenuContext_Opciones = new sage.ew.objetos.ewcontextmenustrip(); // Task 123210: Creación de botones en la barra de herramientas de los Mantes
654 
655  // PARTE 88665
659  [
660  Browsable(false),
661  Bindable(false),
662  Category("Varios"),
663  DefaultValue(_TiposAccesosPantalla.Completo),
664  Description("Nivel de acceso del usuario en el formulario actual."),
665  Localizable(false)
666  ]
667  public virtual _TiposAccesosPantalla _NivelAcceso
668  {
669  get { return _nNivelAcceso; }
670  set { _nNivelAcceso = value; }
671  }
672  private _TiposAccesosPantalla _nNivelAcceso = _TiposAccesosPantalla.Completo;
673  // PARTE 88665
674 
683  [DllImport("user32.dll")]
684  public static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParam);
685 
689  public objetos.ewErrorProvider _oErrorProvider;
690  private const int WM_SETREDRAW = 11;
691 
692  [DllImport("user32.dll")]
693  internal static extern bool EnableWindow(IntPtr hwnd, Boolean bEnable);
694 
695  [DllImport("user32.dll")]
696  static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
697 
701  public _TiposFormulario _TipoFormulario
702  {
703  get { return _eTipoFormulario; }
704  set { _eTipoFormulario = value; }
705  }
706  private _TiposFormulario _eTipoFormulario;
707 
711  public ConfigUserForm _ConfigUserForm
712  {
713  get { return _oConfigUserForm; }
714  set { _oConfigUserForm = value; }
715  }
716  private ConfigUserForm _oConfigUserForm = null;
717 
721  public ConfigUserForm _ConfigUserFormPredet
722  {
723  get { return _oConfigUserFormPredet; }
724  set { _oConfigUserFormPredet = value; }
725  }
726  private ConfigUserForm _oConfigUserFormPredet = null;
727 
731  private Dictionary<string, IConfigUserOption> dicAllConfigUserOptions = null;
732 
736  private Dictionary<string, Control> dicNoConfigUserOptions = null;
737 
741  private List<string> listConfigUserOptionsDisabled = null;
742 
743  private Color _eBackColor = SystemColors.Control, _eDefaultBackColor = SystemColors.Control;
747  [
748  Bindable(false),
749  Category("Varios_Apariencia"),
750  DefaultValue(typeof(Color), "Control"),
751  Description("Obtiene o establece el color de fondo del control."),
752  Localizable(false),
753  DisplayName("Color del fondo")
754  ]
755  public Color _BackColor
756  {
757  get { return _eBackColor; }
758  set
759  {
760  _eBackColor = value;
761  _AplicarEstilo();
762  }
763  }
764 
769  protected bool _ConfigUserOptionsAllowed = false;
770 
774  protected bool _ConfigUserOptionsEditing = false;
775 
779  protected bool _ConfigUserOptionsLoading = false;
780 
781  // PE-69326. Guardamos el último control activo para asignarle el foco al activar el formulario
782  //Control _oActiveControl = null;
783 
784  // PE-94010
788  protected bool _CargandoEstilo = false;
789 
793  protected bool _CambiarFuente { get; set; } = true;
794 
808  protected List<string> _AddonsExtVisualCreacionAplazada = new List<string>();
809 
810  private bool _bAplicarEstilos = true;
814  [
815  Category("Varios_Apariencia"),
816  DefaultValue(true),
817  Description("Aplicar estilos visuales al control."),
818  DisplayName("Aplicar estilos")
819  ]
820  public bool _AplicarEstilos
821  {
822  get { return _bAplicarEstilos; }
823  set
824  {
825  _bAplicarEstilos = value;
826 
827  _AplicarEstilo();
828  }
829  }
830 
834  public virtual void _ResetAllProperties(bool tbRestablecer = false)
835  {
836  _BackColor = _eDefaultBackColor;
837 
838  // PE-
839  if (tbRestablecer)
840  {
841  sage.ew.objetos.FUNCIONESESTILOS._RepintarObjectesForm(this, true);
842  }
843  }
844 
850  public Control _FindControl(string tcControlName)
851  {
852  Control loControl = null;
853 
854  Control[] loControls = this.Controls.Find(tcControlName, true);
855 
856  if (loControls.Length > 0)
857  {
858  loControl = loControls[0];
859  }
860 
861  return loControl;
862  }
863 
864  private ToolTip _oToolTip;
868  [
869  Bindable(false),
870  Category("Varios"),
871  DefaultValue(typeof(string), ""),
872  Description("Permite asignar tooltips a los controles del formulario.\n Es necesario agregar una clase ToolTip al formulario y asignarla a esta propiedad."),
873  Localizable(false),
874  DisplayName("ToolTip")
875  ]
876  public ToolTip _ToolTip
877  {
878  get
879  {
880  if (_oToolTip == null) //Task 105418 Añadimos "lazy instantiation" para evitar errores de NullReferenceException
881  _oToolTip = new ToolTip();
882  return _oToolTip;
883  }
884  set { _oToolTip = value; }
885  }
886 
887  //PE-75827. Poder definir tecles ràpides als botons
888  private Dictionary<string, object> ldicBotons = new Dictionary<string, object>();
889 
890  //PE-76605 : El objetivo de esta propiedad será dar al usuario (programador) si el formulario es de solo lectura.
891  private bool _oReadOnly = false;
895  [DefaultValue(false)]
896  public virtual bool _ReadOnly
897  {
898  get { return _oReadOnly; }
899  set
900  {
901  _oReadOnly = value;
902  setReadOnly(this, _oReadOnly);
903  }
904  }
905 
906  private bool _bMenuOpcionesBoton = true;
911  [
912  Bindable(false),
913  Category("Varios"),
914  DefaultValue(false),
915  Description("Muestra el botón opciones de pantalla en la barra de título del formulario."),
916  Localizable(false),
917  DisplayName("MenuOpcionesBoton")
918  ]
919  public bool _MenuOpcionesBoton
920  {
921  get { return _bMenuOpcionesBoton; }
922  set
923  {
924  _bMenuOpcionesBoton = value;
925 
926  //if (EW_GLOBAL._EsEjecutable)
927  //{
928  // _MostrarMenuOpcionesBoton();
929  //}
930  }
931  }
932 
933  private bool _bMostrarAccesoFavoritos = true;
937  [
938  Bindable(false),
939  Category("Varios"),
940  DefaultValue(true),
941  Description("Muestra el acceso a favoritos en el menú de opciones de la barra"),
942  Localizable(false),
943  DisplayName("MostrarAccesoFavoritos")
944  ]
945  public bool _MostrarAccesoFavoritos
946  {
947  get { return _bMostrarAccesoFavoritos; }
948  set { _bMostrarAccesoFavoritos = value; }
949  }
950 
951  private bool _bMostrarCrearAccesoDirecto = true;
955  [
956  Bindable(false),
957  Category("Varios"),
958  DefaultValue(true),
959  Description("Muestra el acceso a crear accesos directos en el menú de opciones de la barra"),
960  Localizable(false),
961  DisplayName("MostrarCrearAccesoDirecto")
962  ]
963  public bool _MostrarCrearAccesoDirecto
964  {
965  get { return _bMostrarCrearAccesoDirecto; }
966  set { _bMostrarCrearAccesoDirecto = value; }
967  }
968 
969  private bool _bMostrarGestionAccesos = true;
970 
974  public bool _MostrarCrearTareaProgramada
975  {
976  get { return _bMostrarCrearTareaProgramada; }
977  set { _bMostrarCrearTareaProgramada = value; }
978  }
979  private bool _bMostrarCrearTareaProgramada = false;
980 
984  public bool _MostrarDuplicarListado
985  {
986  get { return _bMostrarDuplicarListado; }
987  set { _bMostrarDuplicarListado = value; }
988  }
989  private bool _bMostrarDuplicarListado = false;
990 
994  [
995  Bindable(false),
996  Category("Varios"),
997  DefaultValue(true),
998  Description("Muestra el acceso a gestión de accesos en el menú de opciones de la barra"),
999  Localizable(false),
1000  DisplayName("MostrarGestionAccesos")
1001  ]
1002  public bool _MostrarGestionAccesos
1003  {
1004  get { return _bMostrarGestionAccesos; }
1005  set { _bMostrarGestionAccesos = value; }
1006  }
1007 
1008 
1012  [
1013  Bindable(false),
1014  Category("Varios"),
1015  DefaultValue(true),
1016  Description("Muestra el triangulo para titulo, favoritos, accesos"),
1017  Localizable(false),
1018  DisplayName("_TrianguloPantallaActivo")
1019  ]
1020  public bool _TrianguloPantallaActivo
1021  {
1022  get { return false; } // this.pbPantalla.Visible; }
1023  set
1024  {
1025  //this.pbPantalla.Visible = false;
1026  //this.pbPantalla.Enabled = false;
1027  //if (value)
1028  // this.pbPantalla.SendToBack();
1029  //else
1030  // this.pbPantalla.BringToFront();
1031  }
1032  }
1033 
1034  private eAyudaContextual botonayuda = eAyudaContextual.No;
1038  [
1039  Bindable(false),
1040  Category("Varios"),
1041  DefaultValue(true),
1042  Description("Muestra el botón ayuda en el título del formulario"),
1043  Localizable(false),
1044  DisplayName("_BotonAyuda")
1045  ]
1046  public eAyudaContextual _BotonAyuda
1047  {
1048  get { return botonayuda; }
1049  set
1050  {
1051  botonayuda = value;
1052 
1053  //if (EW_GLOBAL._EsEjecutable)
1054  //{
1055  // _MostrarMenuOpcionesBoton();
1056  //}
1057  }
1058  }
1059 
1060  private bool mostrarayudaf1 = true;
1064  [
1065  Bindable(false),
1066  Category("Varios"),
1067  DefaultValue(true),
1068  Description("Muestrar la ayuda de Sage50 al pulsar F1"),
1069  Localizable(false),
1070  DisplayName("MostrarAyudaF1")
1071  ]
1072  public bool _MostrarAyudaF1
1073  {
1074  get { return mostrarayudaf1; }
1075  set { mostrarayudaf1 = value; }
1076  }
1077 
1078  //PE-86617. get an instance of IActiveMenu
1079  private IActiveMenu menu;
1080 
1081  // Para controlar que el mensaje de acceso sólo se muestre una vez
1082  private bool _lMensajeAccesoMostrado = false;
1083 
1087  public Dictionary<string, IDisposable> _BindForm
1088  {
1089  get { return _dictBindForm; }
1090  }
1091  private Dictionary<string, IDisposable> _dictBindForm = new Dictionary<string, IDisposable>();
1092 
1093  private FormSagePanel _oFormSagePanel = null;
1094  private FormSagePanel _FormSagePanel
1095  {
1096  get
1097  {
1098  if (!EsPantalla0 && _MenuOpcionesBoton && FormBorderStyle != FormBorderStyle.None)
1099  {
1100  if (_oFormSagePanel == null) _oFormSagePanel = new FormSagePanel(this);
1101  return _oFormSagePanel;
1102  }
1103  else
1104  {
1105  return null;
1106  }
1107  }
1108  }
1109 
1113  public new FormWindowState WindowState
1114  {
1115  get
1116  {
1117  return base.WindowState;
1118  }
1119  set
1120  {
1121  if (value == FormWindowState.Maximized && _FormSagePanel is FormSagePanel) MaximumSize = _FormSagePanel._GetMaximunSize(this);
1122  base.WindowState = value;
1123  }
1124  }
1125 
1130  public bool _MessageBoxAutomatic
1131  {
1132  get { return _messageBoxAutomatic; }
1133  }
1137  protected bool _messageBoxAutomatic = false;
1138 
1139  #endregion Propiedades
1140 
1141  #region Eventos Messagebox
1142 
1147  public delegate void onMessageBoxBefore_Handler(ref MessageBoxParam toParam);
1148 
1152  public event onMessageBoxBefore_Handler onMessageBoxBefore;
1153 
1158  public delegate void onMessageBoxAfter_Handler(ref MessageBoxParam toParam);
1159 
1163  public event onMessageBoxAfter_Handler onMessageBoxAfter;
1164 
1169  public delegate void onMessageBoxInvalidate_Handler(ref MessageBoxParam toParam);
1170 
1174  public event onMessageBoxInvalidate_Handler onMessageBoxInvalidate;
1175 
1176 
1177  #endregion Eventos Messagebox
1178 
1179  #region Eventos y delegados
1180 
1181  const int WM_SYSCOMMAND = 0x112;
1182 
1189  public delegate bool _ExecuteCommandBeforeHandler(Form toForm, IntPtr toParam);
1190 
1194  public event _ExecuteCommandBeforeHandler _ExecuteCommandBefore;
1195 
1196 
1201  public delegate void GetOpciones_Handler(EventArgsOpciones toEnventArgOpciones);
1202 
1206  public event GetOpciones_Handler _GetOpciones;
1207 
1212  public delegate void GetOpcionesHerramientas_Handler(EventArgsOpciones toEnventArgOpciones);
1213 
1217  public event GetOpcionesHerramientas_Handler _GetOpcionesHerramientas;
1218 
1219  #endregion Eventos y delegados
1220 
1221  #region Métodos privados
1222  private void _MostrarMenuOpcionesBoton()
1226  {
1227  if (!_bMenuOpcionesBoton || this.FormBorderStyle == FormBorderStyle.None || IsDisposed || Disposing) return;
1228 
1229  // PE-90831. Volver a activar el botón´de opciones del titulo de las ventanas
1230 
1231 
1232  //PE-86617 IActiveMenu used to attach buttons to the form
1233  if (this is sage.ew.perfiles.Forms.frmGestionPerfil && !Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_sage50")))
1234  {
1235  // Res
1236  }
1237  else
1238  {
1239  if (this.FormBorderStyle != FormBorderStyle.None && !IsDisposed && !Disposing)
1240  {
1241  // PARTE 92958. Las pantallas relacionadas con la pantalla de frmgestionPerfil se quedaban por detras en algunos casos
1242  menu = ActiveMenu.GetInstance(this);
1243 
1244  bool existeboton = false;
1245 
1246  foreach (ActiveButton item in menu.Items)
1247  {
1248  if (item.Name == "MenuPantalla")
1249  {
1250  existeboton = true;
1251 
1252  if (_bMenuOpcionesBoton == false)
1253  {
1254  menu.Items.Remove(item);
1255  }
1256 
1257  break;
1258  }
1259  }
1260 
1261  if (_bMenuOpcionesBoton && existeboton == false && !EsPantalla0)
1262  {
1264  ActiveButtonAyuda buttonMenu = new ActiveButtonAyuda();
1265  buttonMenu.Name = "MenuPantalla";
1266  buttonMenu.Text = " ";
1267  buttonMenu.Image = sage.ew.images.Properties.Resources.settings_16;
1268  menu.ToolTip.SetToolTip(buttonMenu, "Opciones de pantalla ...");
1269  buttonMenu.Click += new EventHandler(buttonMenu_Click);
1270 
1271  // add the button to the menu
1272  menu.Items.Add(buttonMenu);
1273 
1274  // Configure colors
1275  buttonMenu.ChangeColors();
1276 
1277 
1279  ActiveButtonAyuda buttonHelp = new ActiveButtonAyuda();
1280  buttonHelp.Name = "Help";
1281  buttonHelp.Text = " ";
1282  buttonHelp.Image = sage.ew.images.Properties.Resources.help_black_16;
1283  menu.ToolTip.SetToolTip(buttonHelp, "Ayuda (F1)");
1284  buttonHelp.Click += new EventHandler(buttonHelp_Click);
1285 
1286  // add the button to the menu
1287  menu.Items.Add(buttonHelp);
1288 
1289  // Configure colors
1290  buttonHelp.ChangeColors();
1291  }
1292 
1293  existeboton = false;
1294 
1295  foreach (ActiveButton item in menu.Items)
1296  {
1297  if (item.Name == "Ayuda")
1298  {
1299  existeboton = true;
1300 
1301  if (botonayuda != eAyudaContextual.Si)
1302  {
1303  menu.Items.Remove(item);
1304  }
1305 
1306  break;
1307  }
1308  }
1309 
1310  if (botonayuda == eAyudaContextual.Si && existeboton == false && !EsPantalla0)
1311  {
1313  ActiveButtonAyuda buttonAyuda = new ActiveButtonAyuda();
1314  buttonAyuda.Name = "Ayuda";
1315  buttonAyuda.Text = " ";
1316  buttonAyuda.Image = sage.ew.images.Properties.Resources.info_16;
1317  menu.ToolTip.SetToolTip(buttonAyuda, "Panel de notificaciones");
1318  buttonAyuda.Click += ButtonAyuda_Click;
1319 
1320  // add the button to the menu
1321  menu.Items.Add(buttonAyuda);
1322 
1323  // Configure colors
1324  buttonAyuda.ChangeColors();
1325  }
1326  }
1327  else
1328  {
1329  if (menu != null)
1330  menu.Items.Clear();
1331  }
1332  }
1333  // FPARTE 92958
1334  }
1335 
1336  private Color GetPixel(Point position)
1337  {
1338  using (var bitmap = new Bitmap(1, 1))
1339  {
1340  using (var graphics = Graphics.FromImage(bitmap))
1341  {
1342  graphics.CopyFromScreen(position, new Point(0, 0), new Size(1, 1));
1343  }
1344  return bitmap.GetPixel(0, 0);
1345  }
1346  }
1347 
1348  private void buttonHelp_Click(object sender, EventArgs e)
1349  {
1350  // Llamar al método para mostrar la ayuda
1351  _MostrarAyudaPantalla();
1352  }
1353 
1354  private void ButtonAyuda_Click(object sender, EventArgs e)
1355  {
1356  // Llamar al método para mostrar la ayuda de onboarding
1357  _MostrarAyuda();
1358  }
1359 
1363  public virtual void _MostrarAyuda()
1364  {
1365  MostrarAyuda();
1366  }
1367 
1371  public virtual void _MostrarCfgUsabilidad()
1372  {
1373  MostrarCfgUsabilidad();
1374  }
1375 
1376  private void buttonMenu_Click(object sender, EventArgs e)
1377  {
1378  Point loPoint;
1379  ActiveButton loButton = (ActiveButton)sender;
1380  ActiveMenuImpl loFrm = (ActiveMenuImpl)loButton.Parent;
1381 
1382  loPoint = new Point(loFrm.Location.X + loFrm.Size.Width, loFrm.Location.Y + loFrm.Size.Height);
1383 
1384  _MostrarOpcionesPantalla(loPoint);
1385  }
1386 
1391  public void _MostrarOpcionesPantalla(Point toLocation)
1392  {
1393  // Mostra el menú d'opcions del botó clicat
1394 
1395  // 92968 -
1396  // Miro si el form està al diccionari
1397  if (!_PresentarGestionAccesos()) // PARTE 93077
1398  contextMenuStripPantalla.Items["gestiónDeAccesosToolStripMenuItem"].Visible = false;
1399  // fi 92698
1400 
1401  //PE-96200: Comprobamos si hay que mostrar el acceso a la gestión de favoritos
1402  if (!_PresentarAccesoFavoritos())
1403  contextMenuStripPantalla.Items["gestiónDeFavoritosToolStripMenuItem"].Visible = false;
1404 
1405  //PE-96746 Apuntes de calendario
1406  contextMenuStripPantalla.Items["crearApunteCalendarioItem"].Visible = _PresentarApunteCalendario();
1407 
1408  //Task 104592: Creacion de tarea programada
1409  contextMenuStripPantalla.Items["crearTareaProgramadaItem"].Visible = _PresentarTareaProgramada();
1410 
1411  // Ahora se muestra en una opción directa en la barra
1412  contextMenuStripPantalla.Items["ayudaPantallaToolStripMenuItem"].Visible = false;
1413 
1414  contextMenuStripPantalla.Items["ShowPropertiesToolStripMenuItem"].Visible = Debugger.IsAttached;
1415 
1416  GetOpcionesHerramientas();
1417 
1418  contextMenuStripPantalla.Show(toLocation, ToolStripDropDownDirection.Left);
1419  }
1420 
1424  private void GetOpcionesHerramientas()
1425  {
1426  if (_GetOpcionesHerramientas == null)
1427  return;
1428 
1429  // Preparamos la lista de opciones que se van a presentar en la pantalla
1430  List<ToolStripMenuItemBase> lstToolStripMenuItemsBase = new List<ToolStripMenuItemBase>();
1431 
1432  contextMenuStripPantalla.Items.OfType<ToolStripMenuItem>().ToList<ToolStripMenuItem>().
1433  ForEach(item => lstToolStripMenuItemsBase.Add(new ToolStripMenuItemBase(item.Text, item.Name, item.ToolTipText)));
1434 
1435  GetOpcionesHerramientasInvoke(contextMenuStripPantalla, lstToolStripMenuItemsBase);
1436  }
1437 
1438 
1442  private void DisposeBindFormClass()
1443  {
1444  if (_dictBindForm == null)
1445  return;
1446 
1447 
1448  if (_dictBindForm.Count > 0)
1449  {
1450  try // Encapsulamos en un TRY por seguridad
1451  {
1452  foreach (KeyValuePair<string, IDisposable> loClassIDisposable in _dictBindForm)
1453  loClassIDisposable.Value.Dispose();
1454 
1455  _dictBindForm.Clear();
1456  }
1457  catch (Exception) // NO gestionamos el posible error
1458  {
1459  }
1460  }
1461 
1462  _dictBindForm = null;
1463 
1464  }
1465  #endregion Métodos privados
1466 
1467  #region Métodos Protected
1468 
1469  // PARTE 93077
1474  protected bool _PresentarGestionAccesos()
1475  {
1476  //bool llShow = (EW_GLOBAL._GetFomsHera(this._Pantalla) != 1);
1477  //return llShow;
1478 
1479  //PE-95447: Cambiamos la comprobación de _GetFormsHera que permitía hacer salir o no la gestión de accesos para que el ToolStrip de Accesos salga siempre
1480  //return true;
1481 
1482  //PE-101487: Retornamos si se muestra o no la gestion de accesos
1483  return _bMostrarGestionAccesos;
1484  }
1485 
1491  protected virtual bool _PresentarTareaProgramada()
1492  {
1493  return _bMostrarCrearTareaProgramada;
1494  }
1495 
1496  // FPARTE 93077
1497 
1503  protected bool _PresentarAccesoFavoritos()
1504  {
1505  return _MostrarAccesoFavoritos;
1506  }
1507 
1513  protected bool _StateServiceForm(string tcPantalla = "")
1514  {
1515  bool llOk = true;
1516  string lcError = string.Empty;
1517  string lcPantalla = (string.IsNullOrWhiteSpace(tcPantalla) ? _Pantalla : tcPantalla).ToUpper();
1518 
1519  List<string> lstExluirPantallas = new List<string>() { "CENTRO_USUARIOS" };
1520 
1521  if (!string.IsNullOrWhiteSpace(lcPantalla) && !lstExluirPantallas.Contains(lcPantalla))
1522  llOk = FUNCTIONS._StateServiceForm(lcPantalla, out lcError);
1523 
1524  lstExluirPantallas.Clear();
1525  lstExluirPantallas = null;
1526 
1527  if (!llOk)
1528  {
1529  Opacity = 0;
1530  Close();
1531  }
1532 
1533  return llOk;
1534  }
1535 
1541  private bool ControlReadOnly(Control loCtrl)
1542  {
1543  Type loType = loCtrl.GetType();
1544  List<Type> loListTypes = new List<Type>() { typeof(ewlabel), typeof(ewSello), typeof(btNavegacion), typeof(ewWebBrowser), typeof(WebBrowser), typeof(EditorHTML), typeof(btDocSalir), typeof(btSalir), typeof(btDocCancelar) };
1545  List<string> loListNameTypes = new List<string>() { "Sage.ES.S50.Modelos.UserWebBrowserModelo", "sage.addons.gestdoc.Visual.UserControls.usercontrolGestDoc" };
1546 
1547  return !(loListTypes.Any(f => f == loType || f.IsAssignableFrom(loType)) || loListNameTypes.Any(f => f == loType.FullName));
1548 
1549  }
1550 
1555  private bool FormularioExcluidoReadOnly()
1556  {
1557  bool llExcluido = false;
1558 
1559  // PE-87996. Saltar el seteo de sólo lectura en los formularios de tipo frmGestionPerfil
1560  // Bug 199355 => Primera ejecución con asistente no debe bloquearlo
1561  // Bug 205406 => La consola de administración no se debe bloquear para poder cambiar licencia,...
1562  if ((this is sage.ew.perfiles.Forms.frmGestionPerfil) ||
1564  (this is sage._50.Forms.frmConsolaAdmin))
1565  {
1566  llExcluido = true;
1567  }
1568 
1569  return llExcluido;
1570  }
1571 
1577  protected void setReadOnly(Control toControl, bool tbReadOnly)
1578  {
1579  bool llPropOk = false;
1580 
1581  // Excluimos algunos formularios del control de readonly
1582  if (FormularioExcluidoReadOnly())
1583  tbReadOnly = false;
1584 
1585  // PE-80756. Bloqueamos los controles
1586  foreach (Control loCtrl in toControl.Controls)
1587  {
1588  llPropOk = false;
1589 
1590  if (!ControlReadOnly(loCtrl))
1591  continue;
1592 
1593  PropertyInfo propInfo = loCtrl.GetType().GetProperty("_ReadOnly");
1594  if (propInfo != null)
1595  {
1596  propInfo.SetValue(loCtrl, tbReadOnly, null);
1597 
1598  // PE-87966
1599  if (loCtrl.HasChildren && loCtrl is sage.ew.objetos.ewtablelayoutpanel) setReadOnly(loCtrl, tbReadOnly);
1600  }
1601  else
1602  {
1603  //PE-97998 : Hay algun control que nos da AmbiguousMatchException al intentar recuperar la propiedad "Controls".
1604  //Tratamos la excepcion como un caso especial
1605  try
1606  {
1607  propInfo = loCtrl.GetType().GetProperty("Controls"); // , BindingFlags.DeclaredOnly); PE-87103. Que tambien tenga en cuenta los controles heredados
1608  llPropOk = (propInfo != null);
1609  }
1610  catch (Exception loEx)
1611  {
1612  if (loEx is AmbiguousMatchException)
1613  {
1614  if (loCtrl.Controls.Count > 0) llPropOk = true;
1615  }
1616  else throw loEx;
1617  }
1618  //FI PE-97998
1619 
1620 
1621  if (llPropOk && loCtrl.Controls.Count > 0)
1622  {
1623  setReadOnly(loCtrl, tbReadOnly);
1624  }
1625  else
1626  {
1627  propInfo = loCtrl.GetType().GetProperty("ReadOnly");
1628  if (propInfo != null)
1629  {
1630  propInfo.SetValue(loCtrl, tbReadOnly, null);
1631  }
1632  else
1633  {
1634  propInfo = null;
1635  propInfo = loCtrl.GetType().GetProperty("Enabled");
1636  if (propInfo != null && !(loCtrl is TabPage))
1637  {
1638  propInfo.SetValue(loCtrl, !tbReadOnly, null);
1639  }
1640  }
1641  }
1642  }
1643  }
1644  }
1645 
1646  //Task 152825 => Encapsulamos el método de evaluación para informar un eventual motivo de solo lectura
1654  protected _TiposAccesosPantalla EvaluarNivelAccesoFormularioPorCantidadDeRegistrosEn(string nombreTabla, int maxRegistros = -1)
1655  {
1656  //Acceso base
1657  _TiposAccesosPantalla nivelDeAcceso = _nNivelAcceso;
1658  _motivoDeSoloLectura = eMotivoSoloLectura.Normal;
1659 
1660  if (TengoAccesoCompleto())
1661  {
1662  if (EvaluarRegistrosTabla(nombreTabla, maxRegistros))
1663  {
1664  nivelDeAcceso = _TiposAccesosPantalla.SoloLectura;
1665  _motivoDeSoloLectura = eMotivoSoloLectura.VersionDemo;
1666  }
1667  }
1668  return nivelDeAcceso;
1669  }
1670 
1678  {
1679  //Acceso base
1680  _TiposAccesosPantalla nivelDeAcceso = _nNivelAcceso;
1681  _motivoDeSoloLectura = eMotivoSoloLectura.Normal;
1682 
1683  if (TengoAccesoCompleto())
1684  {
1685  if (documento._Es_Version_Evaluacion())
1686  {
1687  nivelDeAcceso = _TiposAccesosPantalla.SoloLectura;
1688  _motivoDeSoloLectura = eMotivoSoloLectura.VersionDemo;
1689  }
1690  }
1691  return nivelDeAcceso;
1692  }
1693 
1694  #endregion Métodos Protected
1695 
1696 
1697  private bool EvaluarRegistrosTabla(string nombreTabla, int registros = -1)
1698  {
1699  if (registros > 0)
1700  {
1701  return FUNCTIONS._Es_Version_Evaluacion(nombreTabla, tnRegistros: registros, tlPresentarMensaje: false);
1702  }
1703  //Evaluacion sin especificar registros
1704  return FUNCTIONS._Es_Version_Evaluacion(nombreTabla, tlPresentarMensaje: false);
1705  }
1706 
1712  {
1713  return _motivoDeSoloLectura == eMotivoSoloLectura.VersionDemo;
1714  }
1715 
1716  private bool TengoAccesoCompleto()
1717  {
1718  return _nNivelAcceso == _TiposAccesosPantalla.Completo;
1719  }
1720 
1725  public virtual void _AddonsAddCustomObject(Control objeto)
1726  {
1727  throw new Exception("Este formulario no se permite la personalización para Add-ons");
1728  }
1729 
1730 
1731  #region Constructor
1732 
1736  public FormBase()
1737  : this(false)
1738  {
1739  }
1740 
1744  public FormBase(bool tlPrincipal = false)
1745  {
1746  InitializeComponent();
1747 
1748  if (!DesignMode)
1749  {
1750  //if (tlPrincipal)
1751  //{
1752  // Text = EW_GLOBAL._nHandleVfp.ToString();
1753  // EW_GLOBAL._nHandleNet = (long)Handle;
1754  //}
1755 
1756  //Eventos que se declaraban en la capa visual
1757  SuscripcionEventosVisuales();
1758 
1759  if (EW_GLOBAL._EsEjecutable) //PE-97646 Añado condición _EsEjecutable para evitar errores en tiempo de diseño de formularios derivados
1760  {
1761  SuscripcionEventosDeEjecutable();
1762  }
1763  }
1764  }
1765 
1766  #endregion Constructor
1767 
1768 
1772  protected override void OnCreateControl()
1773  {
1774  _AfterConstructorBase();
1775  base.OnCreateControl();
1776  }
1777 
1778  private void _AfterConstructorBase()
1779  {
1780  if (EW_GLOBAL._EsEjecutable)
1781  {
1782  _CargarEstilo();
1783  _AplicarEstilo();
1784  }
1785 
1786  if (EW_GLOBAL._EsEjecutable) //PE-97646 Añado condición _EsEjecutable para evitar errores en tiempo de diseño de formularios derivados
1787  {
1788  if (EW_GLOBAL._Moneda == null)
1789  {
1790  EW_GLOBAL._Moneda = new Divisa();
1791  EW_GLOBAL._Moneda._Codigo = Convert.ToString(EW_GLOBAL._GetVariable("wc_moneda")); //el codigo ja fa el load
1792  }
1793 
1794  //PE81699
1795  if (EW_GLOBAL._Empresa == null)
1796  {
1797  EW_GLOBAL._Empresa = new Empresa(Convert.ToString(EW_GLOBAL._GetVariable("wc_empresa")));
1798  }
1799 
1800  //Bug 102910: Si la empresa ha cambiado tenemos que recargar el objeto _Empresa
1801  if (((Empresa)EW_GLOBAL._Empresa)._Codigo != Convert.ToString(EW_GLOBAL._GetVariable("wc_empresa")))
1802  {
1803  ((Empresa)EW_GLOBAL._Empresa)._Codigo = Convert.ToString(EW_GLOBAL._GetVariable("wc_empresa"));
1804  //EW_GLOBAL._Empresa = new Empresa(Convert.ToString(EW_GLOBAL._GetVariable("wc_empresa")));
1805  }
1806 
1807  // PE-94362. Inicializamos una instancia de la clase Terminal
1808  if (EW_GLOBAL._Terminal == null)
1809  {
1810  EW_GLOBAL._Terminal = new tpv.Clases.Terminal();
1811  }
1812 
1813  Constructor_Privado();
1814 
1815  if (WindowState == FormWindowState.Maximized && _FormSagePanel is FormSagePanel && !_ReusingFormSettings)
1816  {
1817  WindowState = FormWindowState.Normal;
1818  MaximumSize = _FormSagePanel._GetMaximunSize(this);
1819  WindowState = FormWindowState.Maximized;
1820  }
1821  }
1822  }
1823 
1824  // Flag: Has Dispose already been called?
1825  bool disposed = false;
1826 
1831  protected override void Dispose(bool disposing)
1832  {
1833  if (disposed)
1834  return;
1835 
1836  if (disposing)
1837  {
1838  // Free any other managed objects here.
1839  CancelarSuscripcionEventosDeEjecutable();
1840  CancelarSuscripcionEventosVisuales();
1841 
1842  //if (timer is Timer)
1843  //{
1844  // timer.Tick -= timer_Tick;
1845  // timer.Dispose();
1846  // timer = null;
1847  //}
1848 
1849  if (_oTimerProperties is Timer)
1850  {
1851  _oTimerProperties.Tick -= _oTimerProperties_Tick;
1852  _oTimerProperties.Dispose();
1853  _oTimerProperties = null;
1854  }
1855 
1856  DisposeToolStripMenuItems();
1857 
1858  lstOpcionesMenuAddon?.Clear();
1859  lstOpcionesMenuAddon = null;
1860 
1861  _ToolStripMenuItemsBase?.Clear();
1862  _ToolStripMenuItemsBase = null;
1863 
1864  _MenuContext_Opciones.Items.Clear();
1865  _MenuContext_Opciones.Dispose();
1866  _MenuContext_Opciones = null;
1867 
1868  _AddonsExtVisualCreacionAplazada?.Clear();
1869  _AddonsExtVisualCreacionAplazada = null;
1870 
1871  ldicBotons?.Clear();
1872  ldicBotons = null;
1873 
1874  if (menu != null)
1875  {
1876  menu.Items.Clear();
1877  menu = null;
1878  }
1879 
1880  if (contextMenuStripPantalla != null)
1881  {
1882  contextMenuStripPantalla.Items.Clear();
1883  contextMenuStripPantalla?.Dispose();
1884  contextMenuStripPantalla = null;
1885  }
1886 
1887  //El tooltip es un control propicio a generar memory leaks ya que mantiene referencias a los controles
1888  _oToolTip?.Dispose();
1889  _oToolTip = null;
1890  _oErrorProvider?.Dispose();
1891  _oBackgroundWorker?.Dispose();
1892  _oBackgroundWorker = null;
1893 
1894  if (_oFormAyuda != null)
1895  _oFormAyuda._RefreshNoticiasPendientes -= FormAyuda__RefreshNoticiasPendientes;
1896 
1897  _oFormAyuda?.Dispose();
1898  _oFormAyuda = null;
1899 
1900  if (_ConfigUserOptionsAllowed && _ConfigUserOptionsEditing) _SubcripcionEventosEdicionOpcionesUsuario(false);
1901 
1902  DisposeBindFormClass();
1903  }
1904 
1905  // Free any unmanaged objects here.
1906  //
1907 
1908  disposed = true;
1909  // Call base class implementation.
1910  base.Dispose(disposing);
1911  }
1912 
1913 
1917  private void SuscripcionEventosDeEjecutable()
1918  {
1919  Load += FormBase_Load;
1920  KeyUp += FormBase_KeyUp;
1921  Activated += FormBase_Activated;
1922  FormClosed += FormBase_FormClosed;
1923  FormClosing += FormBase_FormClosing;
1924  Shown += FormBase_Shown;
1925  TextChanged += FormBase_TextChanged;
1926  Activated += Ayuda_Activated;
1927  Deactivate += Ayuda_Deactivate;
1928  }
1929 
1933  private void CancelarSuscripcionEventosDeEjecutable()
1934  {
1935  Load -= FormBase_Load;
1936  KeyUp -= FormBase_KeyUp;
1937  Activated -= FormBase_Activated;
1938  FormClosed -= FormBase_FormClosed;
1939  FormClosing -= FormBase_FormClosing;
1940  Shown -= FormBase_Shown;
1941  TextChanged -= FormBase_TextChanged;
1942  Activated -= Ayuda_Activated;
1943  Deactivate -= Ayuda_Deactivate;
1944  }
1945 
1949  private void SuscripcionEventosVisuales()
1950  {
1951  contextMenuStripPantalla.Opening += new CancelEventHandler(contextMenuStripPantalla_Opening);
1952  nombreFormularioToolStripMenuItem.Click += nombreFormularioToolStripMenuItem_Click;
1953  gestiónDeFavoritosToolStripMenuItem.Click += gestiónDeFavoritosToolStripMenuItem_Click;
1954  gestiónDeAccesosToolStripMenuItem.Click += gestiónDeAccesosToolStripMenuItem_Click;
1955  crearAccesoDirectoToolStripMenuItem.Click += crearAccesoDirectoToolStripMenuItem_Click;
1956  crearApunteCalendarioItem.Click += crearApunteCalendarioItem_Click;
1957  listadosPersonalizablesEditarItem.Click += listadosPersonalizablesEditarItem_Click;
1958  listadosPersonalizablesDuplicarItem.Click += listadosPersonalizablesDuplicarItem_Click;
1959  ayudaPantallaToolStripMenuItem.Click += ayudaPantallaToolStripMenuItem_Click;
1960  crearTareaProgramadaItem.Click += crearTareaProgramadaItem_Click;
1961  toolConfiguracionesToolStripMenuItem.Click += ConfiguracionesUsuarioItem_Click;
1962  ShowPropertiesToolStripMenuItem.Click += ShowPropertiesToolStripMenuItem_Click;
1963  }
1964 
1968  private void CancelarSuscripcionEventosVisuales()
1969  {
1970  contextMenuStripPantalla.Opening -= new CancelEventHandler(contextMenuStripPantalla_Opening);
1971  nombreFormularioToolStripMenuItem.Click -= nombreFormularioToolStripMenuItem_Click;
1972  gestiónDeFavoritosToolStripMenuItem.Click -= gestiónDeFavoritosToolStripMenuItem_Click;
1973  gestiónDeAccesosToolStripMenuItem.Click -= gestiónDeAccesosToolStripMenuItem_Click;
1974  crearAccesoDirectoToolStripMenuItem.Click -= crearAccesoDirectoToolStripMenuItem_Click;
1975  crearApunteCalendarioItem.Click -= crearApunteCalendarioItem_Click;
1976  listadosPersonalizablesEditarItem.Click -= listadosPersonalizablesEditarItem_Click;
1977  listadosPersonalizablesDuplicarItem.Click -= listadosPersonalizablesDuplicarItem_Click;
1978  ayudaPantallaToolStripMenuItem.Click -= ayudaPantallaToolStripMenuItem_Click;
1979  crearTareaProgramadaItem.Click -= crearTareaProgramadaItem_Click;
1980  toolConfiguracionesToolStripMenuItem.Click -= ConfiguracionesUsuarioItem_Click;
1981  }
1982 
1986  private void DisposeToolStripMenuItems()
1987  {
1988  nombreFormularioToolStripMenuItem?.Dispose();
1989  nombreFormularioToolStripMenuItem = null;
1990 
1991  gestiónDeFavoritosToolStripMenuItem?.Dispose();
1992  gestiónDeFavoritosToolStripMenuItem = null;
1993 
1994  gestiónDeAccesosToolStripMenuItem?.Dispose();
1995  gestiónDeAccesosToolStripMenuItem = null;
1996 
1997  crearAccesoDirectoToolStripMenuItem?.Dispose();
1998  crearAccesoDirectoToolStripMenuItem = null;
1999 
2000  listadosPersonalizablesEditarItem?.Dispose();
2001  listadosPersonalizablesEditarItem = null;
2002 
2003  listadosPersonalizablesDuplicarItem?.Dispose();
2004  listadosPersonalizablesDuplicarItem = null;
2005 
2006  ayudaPantallaToolStripMenuItem?.Dispose();
2007  ayudaPantallaToolStripMenuItem = null;
2008 
2009  configuracionesUsuarioItem?.Dispose();
2010  configuracionesUsuarioItem = null;
2011 
2012  configuracionesUsuarioItemSeparator?.Dispose();
2013  configuracionesUsuarioItemSeparator = null;
2014 
2015  crearApunteCalendarioItem?.Dispose();
2016  crearApunteCalendarioItem = null;
2017 
2018  crearTareaProgramadaItem?.Dispose();
2019  crearTareaProgramadaItem = null;
2020 
2021  crearTareaProgramadaItem?.Dispose();
2022  crearTareaProgramadaItem = null;
2023 
2024  ShowPropertiesToolStripMenuItem?.Dispose();
2025  ShowPropertiesToolStripMenuItem = null;
2026  }
2027 
2028  // 99599
2029  private void FormBase_TextChanged(object sender, EventArgs e)
2030  {
2031  if (!String.IsNullOrWhiteSpace(_Sufijo) || !String.IsNullOrWhiteSpace(_Acronimo))
2032  {
2033  Revisar_Titulo_Formulario();
2034  }
2035  }
2036 
2040  private void Revisar_Titulo_Formulario()
2041  {
2042  // Obtener el título del formulario sólo, sin acrónimo ni sufijos.
2043  if (!Text.Contains("(") && !Text.Contains(")") && (!_MostrarAcronimo || (_MostrarAcronimo && ((!string.IsNullOrWhiteSpace(_Acronimo) && !Text.Contains(_Acronimo)) || string.IsNullOrWhiteSpace(_Acronimo)))))
2044  {
2045  _cTituloFormulario = Text.Trim();
2046  }
2047  else //Listados de balances anuales etc tienen paréntesis en el título. Trato de repescarlos
2048  {
2049  if (_cTituloFormulario.Equals("FormFiltro")) //Nombre por defecto de un listado => Doy por bueno lo que sea que tenga en text
2050  _cTituloFormulario = Text.Trim();
2051  }
2052 
2053 
2054  // Revisión de acrónimo y sufijos
2055  bool llRevisarAcronimo = (!Text.StartsWith(_Acronimo) && _MostrarAcronimo) || (Text.StartsWith(_Acronimo) && !_MostrarAcronimo);
2056  bool llRevisarSufijo = (!Text.Contains(_Sufijo) && _MostrarSufijo) || (Text.Contains(_Sufijo) && !_MostrarSufijo);
2057 
2058  if (llRevisarAcronimo || llRevisarSufijo)
2059  {
2060  // Desmonto el event handler
2061  TextChanged -= new EventHandler(FormBase_TextChanged);
2062 
2063  // Revisar el acronimo y sufijo en el caption del formulario
2064  Text = String.Format("{0}{1}{2}", _MostrarAcronimo ? _Acronimo + " " : "", _cTituloFormulario, _MostrarSufijo ? _Sufijo : "");
2065 
2066  // Vuelvo a montar el event handler
2067  TextChanged += new EventHandler(FormBase_TextChanged);
2068  }
2069  }
2070  // fi 99599
2071 
2079  private void FormBase_Shown(object sender, EventArgs e)
2080  {
2081 
2082  if (!string.IsNullOrWhiteSpace(_Pantalla) && !_StateServiceForm())
2083  return;
2084 
2085  //if (timer != null) // Si el Timer es null es que ya se ha ejecutado una vez y se ha realizado el Dispose ... Si se ha programado en un buble que va presentando el formulario no es neceasrio la gestión de la ayuda, refresco del caption ....
2086  //{
2087  // // PE-99611. Retardem mostrar el menú de pantalla per evitar efectes raros
2088  // timer.Enabled = false;
2089  // timer.Interval = 300;
2090  // timer.Tick += new EventHandler(timer_Tick);
2091  // timer.Enabled = true;
2092  //}
2093 
2094  Text = Text.Trim();
2095 
2096  if (!_cSufijo.Contains("(SQL_LOG)") && Convert.ToString(EW_GLOBAL._GetVariable("wc_sql_log")).Trim().ToUpper() == "SI")
2097  {
2098  _cSufijo += " (SQL_LOG)";
2099  Revisar_Titulo_Formulario();
2100  }
2101 
2102  if (!_lAutomatico) //Bug 206971: Sólo llamamos a AyudaOnBoarding() si no estamos en modo de tarea automática/acceso directo
2103  AyudaOnBoarding();
2104 
2105  // PE-102586. En sage50 hacemos que al abrir un formulario se muestre encima de todo
2106  if (Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_sage50")))
2107  {
2108  TopMost = true;
2109  Focus();
2110  BringToFront();
2111  TopMost = false;
2112  }
2113  }
2114 
2115  // PE-99611. Retardem mostrar el menú de pantalla per evitar efectes raros
2116  private Timer timer = new Timer();
2117  private void timer_Tick(object sender, EventArgs e)
2118  {
2119  timer.Enabled = false;
2120  timer.Dispose();
2121  timer = null;
2122 
2123  if (EW_GLOBAL._EsEjecutable && !IsDisposed && !Disposing) //PE-99878 Añado control de destruido por si no se llega a completar la carga (pe. no tiene perfil)
2124  {
2125  SuspendLayout();
2126  _MostrarMenuOpcionesBoton();
2127  //PE-94935 : Añadir la etiqueta del SQL_LOG al titulo del formulario
2128  Text = Text.Trim();
2129 
2130  if (!_cSufijo.Contains("(SQL_LOG)") && Convert.ToString(EW_GLOBAL._GetVariable("wc_sql_log")).Trim().ToUpper() == "SI")
2131  {
2132  _cSufijo += " (SQL_LOG)";
2133  Revisar_Titulo_Formulario();
2134  }
2135 
2136  AyudaOnBoarding();
2137 
2138  ResumeLayout();
2139  }
2140  }
2141 
2142  //PE-88499
2143  #region Asignar ErrorProvider a los controles
2144 
2145  //PE-88499
2150  protected override void OnLoad(EventArgs e)
2151  {
2152  base.OnLoad(e);
2153 
2154  _Asignar_ErrorProvider();
2155 
2156  // Configuraciones de pantalla
2157  ConfigUserOptionsUpdatePredet();
2158  ConfigUserOptionsLoad(ConfigUserOptionsGetPantalla());
2159 
2160  }
2161 
2162  private void _Asignar_ErrorProvider()
2163  {
2164  foreach (Control loControl in Controls)
2165  {
2166  _Asignar_ErrorProvider_Recursivo(loControl);
2167  }
2168  }
2169 
2170  //PE-88499
2175  private void _Asignar_ErrorProvider_Recursivo(Control toControl)
2176  {
2177  //Busco la propiedad _oErrorProvider
2178  PropertyInfo loPropiedad = toControl.GetType().GetProperty("_ErrorProvider", BindingFlags.Instance | BindingFlags.NonPublic);
2179  if (loPropiedad != null)
2180  {
2181  loPropiedad.SetValue(toControl, _oErrorProvider, null);
2182  }
2183 
2184  //Si el control contiene otros controles
2185  if (toControl.HasChildren)
2186  {
2187  //Por cada control hijo
2188  foreach (Control loChildControl in toControl.Controls)
2189  {
2190  _Asignar_ErrorProvider_Recursivo(loChildControl); //me llamo recursivamente
2191  }
2192  }
2193  }
2194 
2195  #endregion Asignar ErrorProvider a los controles
2196 
2197 
2198  // PE-79517.
2202  public virtual void _CargarEstilo()
2203  {
2204  if (!EW_GLOBAL._EsEjecutable) return;
2205 
2206  _CargandoEstilo = true;
2207 
2208  // PE-86800. Forzar el tipo base para pintar el fondo del formulario
2209  XmlNode loNode = FUNCIONESESTILOS._Get_Aparence_Config(typeof(FormBase), "sage.ew.formul.FormBase");
2210 
2211  // Si em trobat node, apliquem les propietats
2212  Color loColor;
2213  string lcColor;
2214 
2215  if (loNode != null)
2216  {
2217  foreach (XmlElement element in loNode)
2218  {
2219  PropertyInfo propInfo = GetType().GetProperty(element.Name);
2220  if (propInfo != null)
2221  {
2222  // Anem assignant els valors a les propietats
2223  switch (element.Name)
2224  {
2225  case "_AplicarEstilos":
2226  _AplicarEstilos = element.InnerText.Trim().ToLower() == "true";
2227  break;
2228 
2229  case "_BackColor":
2230  // Parsejem el valor per a assignar el RGB
2231  lcColor = element.InnerText;
2232  loColor = Name_To_Color(lcColor);
2233  _BackColor = loColor;
2234  break;
2235  }
2236  }
2237  }
2238  }
2239  else
2240  {
2241  // PE-95175. Si no hi ha node, forcem _AplicarEstilos a false
2242  _AplicarEstilos = false;
2243  }
2244 
2245  _CargandoEstilo = false;
2246  }
2247 
2248  // PE-93830.
2252  public virtual void _AplicarEstilo()
2253  {
2254  if (!EW_GLOBAL._EsEjecutable) return;
2255 
2256  if (_CargandoEstilo) return;
2257 
2258  if (_AplicarEstilos)
2259  {
2260  BackColor = _BackColor;
2261  }
2262  else
2263  {
2264  BackColor = _eDefaultBackColor;
2265  }
2266  }
2267 
2273  private void FormBase_FormClosing(object sender, FormClosingEventArgs e)
2274  {
2275  if (_SaveReuseFormSettings && Usuario._This._PosicionFormulario)
2276  {
2277  using (FormManagerProperties loFormManagerProperties = new FormManagerProperties(this))
2278  {
2279  loFormManagerProperties._Save();
2280  }
2281  }
2282 
2283  FormBase_FormClosed_MenuItemsClear();
2284 
2285 
2286  // PE-79119. Antes de que la pantalla principal tome el foco, la activamos
2287  if (Application.OpenForms.Count == 2)
2288  {
2289  EnableWindow((IntPtr)EW_GLOBAL._nHandleVfp, true);
2290  }
2291 
2292  // Guardar configuraciones actuales de usuario
2293  if (_ConfigUserOptionsAllowed)
2294  ConfigUserOptionsUpdateLastValues();
2295 
2296  // Liberar memoria
2297  GC.Collect();
2298  }
2299 
2305  protected override void OnFormClosing(FormClosingEventArgs e)
2306  {
2307  base.OnFormClosing(e);
2308 
2309  if (!e.Cancel)
2310  FormBase_FormCling_OpemForms();
2311  }
2312 
2318  private void FormBase_FormClosed(object sender, FormClosedEventArgs e)
2319  {
2320  FUNCTIONS._GarbageCollect();
2321 
2322  // PE-79119. Activar la ventana principal
2323  if (Name == "frmDocVentaTpv" || Name == "frmGestionPerfil" || Name == "frmDocVentaPed" || Name == "frmPerfilSeleccion" || Name == "frmSincroniza")
2324  {
2325  EnableWindow((IntPtr)EW_GLOBAL._nHandleVfp, true);
2326  }
2327  }
2328 
2332  private void FormBase_FormClosed_MenuItemsClear()
2333  {
2334  // PE-86617. Limpiar el menu de la barra de títulos
2335  if (this is frmGestionPerfil)
2336  {
2337  // PE-90831. No mostramos el botón en los formularios basados en frmGestionPerfil
2338  }
2339  else
2340  {
2341  // PE-91209. Controla null
2342  if (menu != null)
2343  menu.Items.Clear();
2344  }
2345  }
2346 
2350  private void FormBase_FormCling_OpemForms()
2351  {
2352  // PE-100744. Eliminar de la pila la referencia del último formulario abierto
2353  if (EW_GLOBAL._OpenForms.Count > 1) // PE-100977, 101030 -> No quitar de la pila el formulario principal para evitar errores ya que es el primer formulario
2354  {
2355  List<Form> loOpenForms = EW_GLOBAL._OpenForms.AsEnumerable().Reverse().ToList();
2356  EW_GLOBAL._OpenForms.Clear();
2357  loOpenForms.Where(f => f != this).ToList().ForEach(f => EW_GLOBAL._OpenForms.Push(f));
2358 
2359  // PE-103236. Actualizar la tabla CONNECT sólo en caso de quedar frmPrincipal, el resto ya se tratan des del Activated.
2360  if (EW_GLOBAL._OpenForms.Count == 1 && !_lConnectFallido)
2361  {
2362  if (!Usuario._This._Revisar_Connect_Formulario((FormBase)EW_GLOBAL._OpenForms.Peek()))
2363  {
2364  // PE-103711. Mostrar el mensaje desde fuera de la clase de negocio para no interferir en el funcionamiento
2365  MessageBox.Show(Usuario._This._Error_Message, Convert.ToString(EW_GLOBAL._GetVariable("wc_nameproducto")), MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
2366  }
2367  }
2368  }
2369  }
2370 
2371 
2378  private void FormBase_Activated(object sender, EventArgs e)
2379  {
2380  // PE-103236. Revisar y actualizar tabla CONNECT
2381 
2382  if (!_lConnectFallido && !Usuario._This._Revisar_Connect_Formulario(this))
2383  {
2384  _lConnectFallido = true;
2385 
2386  // PE-103711. Mostrar el mensaje desde fuera de la clase de negocio para no interferir en el funcionamiento
2387  MessageBox.Show(Usuario._This._Error_Message, Convert.ToString(EW_GLOBAL._GetVariable("wc_nameproducto")), MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
2388 
2389  if (Name != "frmPrincipal")
2390  Close();
2391  }
2392 
2393  // En caso de sage50 no hay que hacer nada (PE-93758)
2394  if (!Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_sage50")))
2395  {
2396  long lnHandle;
2397  lnHandle = (long)Handle;
2398 
2399  // PE-79119. No pasar el Handle de la pantalla principal
2400  if (Name == "frmDocVentaTpv" || Name == "frmGestionPerfil" || Name == "frmDocVentaPed" || Name == "frmPerfilSeleccion" || Name == "frmSincroniza")
2401  {
2402  // PE-79276. Forcem a primer pla la pantalla de selcció de perfils perque si s'obre un segon perfil (damunt d'un obert ja) quedava per sota
2403  if (Name == "frmPerfilSeleccion")
2404  {
2405  IntPtr HWND_TOPMOST = new IntPtr(-1);
2406  const UInt32 SWP_NOSIZE = 0x0001;
2407  const UInt32 SWP_NOMOVE = 0x0002;
2408  const UInt32 SWP_SHOWWINDOW = 0x0040;
2409 
2410  // Call this way:
2411  SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
2412  }
2413 
2414  // Només activar les pantalles principals
2415  EnableWindow((IntPtr)EW_GLOBAL._nHandleNet, true);
2416  EnableWindow((IntPtr)EW_GLOBAL._nHandleVfp, true);
2417  return;
2418  }
2419 
2420  // PE-79498. Fem una copia dels paràmetres que hi havia abans per curar-nos en salut
2421  Dictionary<string, object> loParTmp;
2422  loParTmp = NETVFP._Parametros;
2423  // FI PE-79498
2424 
2425  // Enviem el Handle de la finestra filla a Fox per a que es pugui bloquejar
2426  NETVFP._Parametros["responder"] = false;
2427  NETVFP._Parametros["opcion"] = "newhandle";
2428  NETVFP._Parametros["tipo"] = "valor";
2429  NETVFP._Parametros["valor"] = lnHandle;
2430  NETVFP._Parametros["paradi1"] = "";
2431  NETVFP._Parametros["paradi2"] = "";
2432  NETVFP._Parametros["paradi3"] = "";
2433 
2434  NETVFP._SendMessageToVfp();
2435  NETVFP._Parametros.Clear();
2436 
2437  NETVFP._Parametros = loParTmp; // Restaurem els paràmetres que hi havia inicialment
2438  }
2439  }
2440 
2441  private void FormBase_KeyUp(object sender, KeyEventArgs e)
2442  {
2443  // PARTE 79873. Si estamos en edición de perfiles salimos
2444  if (EW_GLOBAL._EdicionPerfiles)
2445  return;
2446 
2447  // Analitzo la tecla pitjada
2448  string lcTecla = "";
2449 
2450  // Task 144651. Capturamos la tecla F1 para mostrar siempre la ayuda
2451  if (e.KeyCode == Keys.F1)
2452  {
2453  _MostrarAyudaPantalla();
2454  }
2455 
2456  // PE-87855. Capturamos las teclas de función
2457  if (e.KeyCode == Keys.F2 ||
2458  e.KeyCode == Keys.F3 ||
2459  e.KeyCode == Keys.F4 ||
2460  e.KeyCode == Keys.F5 ||
2461  e.KeyCode == Keys.F6 ||
2462  e.KeyCode == Keys.F7 ||
2463  e.KeyCode == Keys.F8 ||
2464  e.KeyCode == Keys.F9 ||
2465  e.KeyCode == Keys.Escape)
2466  {
2467  if (e.Shift)
2468  lcTecla = "Shift_" + e.KeyCode.ToString();
2469  else if (e.Control)
2470  lcTecla = "Control_" + e.KeyCode.ToString();
2471  else if (e.Alt)
2472  lcTecla = "Alt_" + e.KeyCode.ToString();
2473  else
2474  lcTecla = e.KeyCode.ToString();
2475  }
2476  else if (e.Control && !e.Alt) // CCR-104926. Comprobar que no se hay pulsado AltGr
2477  {
2478  lcTecla = "Control_" + e.KeyCode.ToString();
2479  }
2480 
2481  if (!string.IsNullOrWhiteSpace(lcTecla))
2482  {
2483  // Miro si la tecla està al diccionari
2484  if (ldicBotons.ContainsKey(lcTecla))
2485  {
2486  object loCtrl = ldicBotons[lcTecla];
2487 
2488  //PE-83434 Teclas rapida a un control de tipus codi de barres
2489  if (loCtrl is UserControls.ctBusCodBarras)
2490  {
2491  ((UserControls.ctBusCodBarras)loCtrl)._Focus();
2492  }
2493  //FPE-83434
2494  else
2495  {
2496  ewbutton loewButton = (ewbutton)ldicBotons[lcTecla];
2497  loewButton._ClickFrom = ewbutton.ClickFrom.TeclaFuncion;
2498 
2499  //loewButton.Focus(); // PARTE 79873. Pasamos el foco
2500 
2501  //if (loewButton.Focused) // PARTE 105207. Si el botón no tiene el foco no ejecutamos el click
2502  loewButton.PerformClick();
2503 
2504  loewButton._ClickFrom = ewbutton.ClickFrom.MouseClick;
2505  }
2506  }
2507  }
2508  }
2509 
2516  public void Capturar_TeclesRapides(Control toCtrl, Boolean tlBuidar)
2517  {
2518 
2519  try
2520  {
2521  if (tlBuidar)
2522  {
2523  ldicBotons.Clear();
2524  }
2525 
2526  foreach (Control loCtrl in toCtrl.Controls)
2527  {
2528  if (loCtrl.Controls.Count > 0)
2529  {
2530  Capturar_TeclesRapides(loCtrl, false);
2531  }
2532  else
2533  {
2534  // Teclas rápidas
2535  PropertyInfo propInfo = loCtrl.GetType().GetProperty("_TeclaRapida");
2536  if (propInfo != null)
2537  {
2538  // Té tecla ràpida, l'afegim al diccionari
2539  object loTecla = propInfo.GetValue(loCtrl, null);
2540 
2541  if (loTecla != null)
2542  {
2543  string lcTecla = loTecla.ToString();
2544  if (lcTecla != TeclasRapidas.ninguna.ToString())
2545  {
2546  if (!ldicBotons.ContainsKey(loTecla.ToString()))
2547  {
2548  ldicBotons.Add(loTecla.ToString(), loCtrl);
2549 
2550  // PE-75821. Comprovar que s'hagi assignat l'objecte tooltip al formulari
2551  if (_ToolTip != null)
2552  {
2553  // Afegim al tooltip la tecla ràpida
2554  string lcToolTop = _ToolTip.GetToolTip(loCtrl);
2555  if (!string.IsNullOrWhiteSpace(lcToolTop))
2556  {
2557  string lcTeclaCtrl = " (" + lcTecla.Trim().Replace("Control_", "Ctrl+") + ")";
2558  // PE-77988. És possible que ja la tingui assignada
2559  if (lcToolTop.Substring(lcToolTop.Length - lcTeclaCtrl.Length) != lcTeclaCtrl)
2560  {
2561  lcToolTop = lcToolTop + " (" + lcTecla.Trim().Replace("Control_", "Ctrl+") + ")";
2562  _ToolTip.SetToolTip(loCtrl, lcToolTop);
2563  }
2564  }
2565  }
2566  }
2567  }
2568  }
2569  }
2570 
2571  // PE-87855 Teclas de funcion
2572  propInfo = loCtrl.GetType().GetProperty("_TeclaFuncion");
2573  if (propInfo != null)
2574  {
2575  // Té tecla de funció, l'afegim al diccionari
2576  object loTecla = propInfo.GetValue(loCtrl, null);
2577 
2578  if (loTecla != null)
2579  {
2580  string lcTecla = loTecla.ToString();
2581  if (lcTecla != TeclasFuncion.ninguna.ToString())
2582  {
2583  if (!ldicBotons.ContainsKey(loTecla.ToString()))
2584  {
2585  ldicBotons.Add(loTecla.ToString(), loCtrl);
2586 
2587  // PE-75821. Comprovar que s'hagi assignat l'objecte tooltip al formulari
2588  if (_ToolTip != null)
2589  {
2590  // Afegim al tooltip la tecla ràpida
2591  string lcToolTop = _ToolTip.GetToolTip(loCtrl);
2592  if (!string.IsNullOrWhiteSpace(lcToolTop))
2593  {
2594  string lcTeclaCtrl = " (" + lcTecla.Trim() + ")";
2595  lcTeclaCtrl = lcTeclaCtrl.Replace("Control_", "Ctrl + ");
2596  lcTeclaCtrl = lcTeclaCtrl.Replace("Shift_", "Mayús. + ");
2597  lcTeclaCtrl = lcTeclaCtrl.Replace("Alt_", "Alt + ");
2598 
2599  // PE-77988. És possible que ja la tingui assignada
2600  if (lcToolTop.Length <= lcTeclaCtrl.Length || lcToolTop.Substring(lcToolTop.Length - lcTeclaCtrl.Length) != lcTeclaCtrl)
2601  {
2602  lcToolTop = lcToolTop + lcTeclaCtrl;
2603  _ToolTip.SetToolTip(loCtrl, lcToolTop);
2604  }
2605  }
2606  }
2607  }
2608  }
2609  }
2610 
2611  }
2612  }
2613  }
2614  }
2615  catch (Exception loEx)
2616  {
2617  DB.Registrar_Error(loEx);
2618  throw;
2619  }
2620  }
2621 
2622 
2629  {
2630  return _ReadOnly;
2631  }
2632 
2638  public virtual void _CellContentClick(object sender, DataGridViewCellEventArgs e)
2639  {
2640  DataGridView loTemp = (DataGridView)sender;
2641  loTemp.CommitEdit(DataGridViewDataErrorContexts.Commit);
2642  }
2643 
2649  protected virtual void FormBase_Load(object sender, EventArgs e)
2650  {
2651  FUNCTIONS._GarbageCollect();
2652 
2653  // PE-81566,81700. Sino es ejecutable que no haga nada ya que peta el modo visual de Visual Studio y no permite diseñar los formularios
2654  if (EW_GLOBAL._EsEjecutable)
2655  Load_Privado();
2656  // FI PE-81566,81700
2657 
2658  if (!(this is frmGestionPerfil))
2659  _Addons_BindForms();
2660 
2661  // PE-100744. Añadir a la pila la referencia del formulario abierto
2662  EW_GLOBAL._OpenForms.Push(this);
2663 
2664  }
2665 
2669  protected String _cConfigUserOptionsPantalla = "";
2670 
2675  protected virtual String ConfigUserOptionsGetPantalla()
2676  {
2677  return String.IsNullOrEmpty(_cConfigUserOptionsPantalla) ? _Pantalla : _cConfigUserOptionsPantalla;
2678  }
2679 
2683  private void ConfigUserOptionsUpdatePredet()
2684  {
2685  if (_ConfigUserOptionsAllowed)
2686  {
2687  // Crear/Actualizar configuración predeterminada por defecto
2688  _oConfigUserFormPredet = new ConfigUserForm(Usuario._This._Codigo, ConfigUserOptionsGetPantalla(), ConfigUserForm.ConfigUserType.PredetValuesConfig.__GetDescription());
2689 
2690  if (!_ConfigUserOptionsEditing)
2691  {
2692  // Crear diccionarios con controles configurables
2693  ConfigUserOptionsGetDictionaries();
2694 
2695  // Obtener valores configurados actualmente
2696  Dictionary<string, ConfigUserOption> dicUserOptionsAct = _ConfigUserOptionsGetCurrent();
2697 
2698  // Guardar configuración predeterminada
2699  _oConfigUserFormPredet._Save(dicUserOptionsAct, true);
2700  }
2701  }
2702  }
2703 
2707  private void ConfigUserOptionsUpdateLastValues()
2708  {
2709  if (!_ConfigUserOptionsAllowed || _ConfigUserOptionsEditing)
2710  return;
2711 
2712  // Actualizar "Última configuración"
2713  ConfigUserForm loLast = new ConfigUserForm(Usuario._This._Codigo, ConfigUserOptionsGetPantalla(), ConfigUserForm.ConfigUserType.LastValuesConfig.__GetDescription());
2714 
2715  // Obtener valores configurados actualmente
2716  Dictionary<string, ConfigUserOption> dicUserOptionsAct = _ConfigUserOptionsGetCurrent();
2717 
2718  // Guardar configuración
2719  loLast._Save(dicUserOptionsAct, false, false);
2720  loLast = null;
2721  }
2722 
2727  protected virtual void ConfigUserOptionsLoad(string tcPantalla)
2728  {
2729  if (!_ConfigUserOptionsAllowed)
2730  return;
2731 
2732  _cConfigUserOptionsPantalla = tcPantalla;
2733 
2734  // Obtener controles actuales
2735  ConfigUserOptionsGetDictionaries();
2736 
2737  // Cargar negocio para las configuraciones
2738  _oConfigUserForm = new ConfigUserForm(Usuario._This._Codigo, tcPantalla);
2739 
2740  // Cargar configuraciones actuales
2741  _ConfigUserOptionsLoad(_oConfigUserForm._dicOpciones);
2742  }
2743 
2748  private void ConfigUserOptionsDisabled(List<string> listOptionsDisabled)
2749  {
2750  listConfigUserOptionsDisabled = new List<string>();
2751 
2752  // Añadir a la lista los controles desactivados para el formulario actual
2753  if (listOptionsDisabled != null && listOptionsDisabled.Count > 0)
2754  listConfigUserOptionsDisabled = listConfigUserOptionsDisabled.Concat(listOptionsDisabled).ToList();
2755 
2756  // Añadir a la lista los controles desactivados para el formulario actual desde Addons
2757  List<string> listOptionsAddonsDisabled = AddonsController.Instance.Methods.ConfigUserOptionsDisabled(this);
2758  if (listOptionsAddonsDisabled != null && listOptionsAddonsDisabled.Count > 0)
2759  listConfigUserOptionsDisabled = listConfigUserOptionsDisabled.Concat(listOptionsAddonsDisabled).ToList();
2760  }
2761 
2765  private void ConfigUserOptionsGetDictionaries()
2766  {
2767  // Obtener lista de controles desactivados en la pantalla actual
2768  ConfigUserOptionsDisabled(_ConfigUserOptionsDisabled());
2769 
2770  // Antes de empezar, guardamos en un diccionario todos los controles configurables del formulario actual.
2771  // Para optimizar el recorrido por estos controles en las distintas operativas.
2772  dicAllConfigUserOptions = new Dictionary<string, IConfigUserOption>();
2773  dicNoConfigUserOptions = new Dictionary<string, Control>();
2774  ConfigUserOptionsGetAll(this);
2775  }
2776 
2781  public virtual List<string> _ConfigUserOptionsDisabled()
2782  {
2783  return null;
2784  }
2785 
2793  public virtual void _ConfigUserOptionsLoad(Dictionary<string, ConfigUserOption> dicUserOptions)
2794  {
2795  if (!this._ConfigUserOptionsAllowed)
2796  return;
2797 
2798  // Si no tenemos ninguna opción configurada, no hay que hacer nada más
2799  if (dicUserOptions == null)
2800  return;
2801 
2802  // Marcamos que estamos cargando configuraciones
2803  _ConfigUserOptionsLoading = true;
2804 
2805  Dictionary<string, ConfigUserOption> loDicConfigUserOptionPredet;
2806 
2807  loDicConfigUserOptionPredet = _oConfigUserFormPredet._dicOpciones;
2808 
2809  foreach (KeyValuePair<string, ConfigUserOption> loOption in dicUserOptions)
2810  {
2811  try
2812  {
2813  IConfigUserOption loConfigControl;
2814 
2815  if (dicAllConfigUserOptions.TryGetValue(loOption.Key, out loConfigControl))
2816  {
2817  ConfigUserOption loConfigUserOption;
2818 
2819  loConfigUserOption = loOption.Value;
2820 
2821  if (_ConfigUserForm._Tipo == ConfigUserForm.ConfigUserType.UserValuesConfig && loConfigControl._EsOpcionalConfigUser && !loConfigUserOption.UserOptionalValue)
2822  {
2823  loConfigUserOption = loDicConfigUserOptionPredet[loOption.Key];
2824  }
2825 
2826 
2827  loConfigControl._SetValueUserOption(loConfigUserOption.Value);
2828  loConfigControl._UsuarioPermiteConfigUser = loConfigUserOption.UserOptionalValue;
2829  }
2830  }
2831  catch (Exception loEx)
2832  {
2833  DB.Registrar_Error(loEx);
2834  }
2835  }
2836 
2837  Dictionary<string, object> loDic = (from loOption in dicUserOptions.Values
2838  select loOption).ToDictionary(f => f.Key, f => f.Value);
2839 
2840  // Extensión Addons para la carga de configuraciones
2842 
2843  // Marcamos que hemos terminado la carga de configuraciones
2844  _ConfigUserOptionsLoading = false;
2845  }
2846 
2852  {
2853  return !_ConfigUserOptionsAllowed || (_ConfigUserOptionsAllowed && _ConfigUserForm is ConfigUserForm);
2854  }
2855 
2863  public virtual void _ConfigUserOptionsLoad(IConfigUserOption toConfigUserOption)
2864  {
2865  string lcName;
2866 
2867  lcName = ((Control)toConfigUserOption).Name;
2868 
2869  if (_ConfigUserForm._dicOpciones.ContainsKey(lcName))
2870  {
2871  ConfigUserOption loOption = _ConfigUserForm._dicOpciones[lcName];
2872  toConfigUserOption._SetValueUserOption(loOption.Value);
2873  }
2874  }
2875 
2880  protected void _ConfigUserOptionsReLoad(string tcPantalla)
2881  {
2882  ConfigUserOptionsLoad(tcPantalla);
2883  }
2884 
2890  public virtual void _ConfigUserOptionsSave(Dictionary<string, ConfigUserOption> dicUserOptions)
2891  {
2892  if (!this._ConfigUserOptionsAllowed)
2893  return;
2894 
2895  // Guardar configuraciones en BD
2896  _oConfigUserForm._Save(dicUserOptions);
2897 
2898 
2899  Dictionary<string, object> loDic = (from loOption in dicUserOptions.Values
2900  select loOption).ToDictionary(f => f.Key, f => f.Value);
2901 
2902  // Extensión Addons para guardar configuraciones
2904  }
2905 
2910  {
2911  if (this._ConfigUserOptionsAllowed) _ConfigUserOptionsSave(_ConfigUserOptionsGetCurrent());
2912  }
2913 
2918  public Dictionary<string, ConfigUserOption> _ConfigUserOptionsGetCurrent()
2919  {
2920  ConfigUserOption loConfigUserOption;
2921  Dictionary<string, ConfigUserOption> dicUserOptionsAct = new Dictionary<string, ConfigUserOption>();
2922 
2923  foreach (KeyValuePair<string, IConfigUserOption> loOption in dicAllConfigUserOptions)
2924  {
2925  IConfigUserOption loConfigUser = (IConfigUserOption)loOption.Value;
2926  loConfigUserOption = new ConfigUserOption(loOption.Key, loConfigUser._GetValueUserOption(), loConfigUser._UsuarioPermiteConfigUser);
2927 
2928  dicUserOptionsAct.Add(loOption.Key, loConfigUserOption);
2929  }
2930 
2931  return dicUserOptionsAct;
2932  }
2933 
2937  public virtual void _ConfigUserOptionsEdit(bool tlEditar)
2938  {
2939  if (!_ConfigUserOptionsAllowed)
2940  return;
2941 
2942  _ConfigUserOptionsEditing = tlEditar;
2943 
2944  foreach (IConfigUserOption loConfigControl in dicAllConfigUserOptions.Values)
2945  {
2946  if (loConfigControl._PermitirConfigUser)
2947  loConfigControl._EditMode = tlEditar;
2948 
2949  // Los controles que no permiten configuración y tienen una descripción de error, también los ponemos en modo edición
2950  // para mostrar sólo este mensaje en modo edición.
2951  if (!loConfigControl._PermitirConfigUser && !string.IsNullOrWhiteSpace(loConfigControl._DescripcionError))
2952  loConfigControl._EditMode = tlEditar;
2953  }
2954 
2955  if (tlEditar) _SubcripcionEventosEdicionOpcionesUsuario();
2956 
2957  }
2958 
2963  private void _SubcripcionEventosEdicionOpcionesUsuario(bool tbSubscribirse = true)
2964  {
2965  if (_ConfigUserOptionsAllowed)
2966  {
2967  // Recorrido por los controles que no se configuran en la pantalla actual
2968  // De momento sólo tratamos ewbutton y ewTabPage de forma nativa para invalidar el click y acceso en modo edición.
2969  foreach (Control loControl in dicNoConfigUserOptions.Values)
2970  {
2971  if (loControl is ewbutton)
2972  {
2973  ((ewbutton)loControl).OnClickInvalidate -= FormBase_OnClickInvalidate;
2974  if (tbSubscribirse) ((ewbutton)loControl).OnClickInvalidate += FormBase_OnClickInvalidate;
2975  }
2976  else if (loControl is TabPage)
2977  {
2978  Control loTabControl = ((TabPage)loControl).Parent;
2979  if (loTabControl is TabControl)
2980  {
2981  ((TabControl)loTabControl).Selecting -= FormBase_SelectingTabPage;
2982  if (tbSubscribirse) ((TabControl)loTabControl).Selecting += FormBase_SelectingTabPage;
2983  }
2984  }
2985  else if (loControl is ewcombobox)
2986  {
2987  ((ewcombobox)loControl).DropDown -= FormBase_DropDownComboBox;
2988  if (tbSubscribirse) ((ewcombobox)loControl).DropDown += FormBase_DropDownComboBox;
2989  }
2990  }
2991 
2992  List<IConfigUserOption> loList = (from loConfigUser in dicAllConfigUserOptions.Values
2993  where loConfigUser._EsOpcionalConfigUser
2994  select loConfigUser).ToList();
2995 
2996  foreach (IConfigUserOption loControl in loList)
2997  {
2998  loControl.OnConfigUserValueChanged -= FormBase_OnConfigUserValueChanged;
2999  if (tbSubscribirse) loControl.OnConfigUserValueChanged += FormBase_OnConfigUserValueChanged;
3000  }
3001  }
3002  }
3003 
3004 
3005  private void FormBase_OnConfigUserValueChanged(object sender, EventArgs e)
3006  {
3007  IConfigUserOption loConfig;
3008 
3009  if (sender is IConfigUserOption && !_ConfigUserOptionsLoading)
3010  {
3011  loConfig = (IConfigUserOption)sender;
3012  loConfig._UsuarioPermiteConfigUser = DialogResult.Yes == _MessageBox(loConfig._DescripcionOpcional, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2, DialogResult.No);
3013 
3014  _ConfigUserOptionsLoading = true;
3015 
3016  if (!loConfig._UsuarioPermiteConfigUser) _ConfigUserOptionsLoad(loConfig);
3017 
3018  _ConfigUserOptionsLoading = false;
3019 
3020  }
3021  }
3022 
3028  private void FormBase_DropDownComboBox(object sender, EventArgs e)
3029  {
3030  _MessageBox("Control no operativo en modo edición.", "Configuraciones de usuario", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
3031  ((ewcombobox)sender).DropDownHeight = 1;
3032  ((ewcombobox)sender).Enabled = false;
3033  }
3034 
3040  private void FormBase_SelectingTabPage(object sender, TabControlCancelEventArgs e)
3041  {
3042  if (listConfigUserOptionsDisabled.Contains(e.TabPage.Name))
3043  {
3044  _MessageBox("Página no operativa en modo edición.", "Configuraciones de usuario", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
3045  e.Cancel = true;
3046  }
3047  }
3048 
3054  private void FormBase_OnClickInvalidate(ewbutton toButton, ref bool tlCancel)
3055  {
3056  _MessageBox("Control no operativo en modo edición.", "Configuraciones de usuario", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
3057  tlCancel = true;
3058  }
3059 
3065  private void ConfigUserOptionsGetAll(Control toContainer)
3066  {
3067  string lcName = "";
3068 
3069  foreach (Control loControl in toContainer.Controls)
3070  {
3071  lcName = loControl.Name;
3072 
3073  // Añadimos los ewbuttons y los controles desactivados en esta pantalla en el diccionario de controles no configurables.
3074  if ((loControl is ewbutton || listConfigUserOptionsDisabled.Contains(lcName)) && !dicNoConfigUserOptions.ContainsKey(lcName))
3075  dicNoConfigUserOptions.Add(lcName, loControl);
3076 
3077  // Si un control es configurable o está en la lista de controles desactivados, los posibles controles que tena dentro no hay que configurarlos
3078  if (!(loControl is IConfigUserOption || listConfigUserOptionsDisabled.Contains(lcName)))
3079  ConfigUserOptionsGetAll(loControl);
3080 
3081  // Añadir el resto de los controles configurables al diccionario
3082  if (loControl is IConfigUserOption && !dicAllConfigUserOptions.ContainsKey(lcName) && !listConfigUserOptionsDisabled.Contains(lcName))
3083  dicAllConfigUserOptions.Add(lcName, (IConfigUserOption)loControl);
3084  }
3085  }
3086 
3087  // PE-103321
3091  public void _Addons_BindForms()
3092  {
3093  AddonsController.Instance.Methods.BindForm(this, Name, _AddonsExtVisualCreacionAplazada, false);
3094  // PE-96322. Recorrer los addons para enviarles una referencia del form
3095  //foreach (KeyValuePair<string, object> loModulo in AddonsController.Instance.AddonsManager.GetAddons())
3096  //{
3097  // Si no se ha especificado en el formulario (propiedad _AddonsExtVisualCreacionAplazada) que la extensión visual del Addon se cargue de forma aplazada
3098  // (frmclientes p.e.) la cargo ahora mismo.
3099  //
3100  // Las extensiones visuales de addons con carga aplazada se cargaran desde el propio formulario cuando se llame a form._Addons_BindForms_CargaAplazada()
3101  // según lo prepare el programador y en el punto en que lo decida el programador.
3102  //
3103  // El comportamiento por defecto es que todos las extensiones visuales de addons, si no se especifica lo contrario en el formulario en
3104  // la propiedad _AddonsExtVisualCreacionAplazada, se cargan en el arranque de la pantalla y ésto es lo que se hace aquí.
3105  //
3106  // if (!_AddonsExtVisualCreacionAplazada.Contains(Convert.ToString(loModulo.Key)))
3107  // {
3108  // ((IModulo)loModulo.Value)._BindForm(Name, this);
3109  // }
3110  //}
3111  }
3112 
3125  {
3126  // Recorrer los addons.
3127  AddonsController.Instance.Methods.BindForm(this, Name, _AddonsExtVisualCreacionAplazada, true);
3128  //foreach (KeyValuePair<string, object> loModulo in AddonsController.Instance.AddonsManager.GetAddons())
3129  //{
3130  // // Si es un addon cuya extensión visual para este formulario es de carga aplazada la cargo ahora en la llamada a este método que lo que hace es precisamente eso.
3131  // // Las extension visual de addons que no son de carga aplazada ya se ejecutaron en la carga de la pantalla desde FormBase.
3132  // if (_AddonsExtVisualCreacionAplazada.Contains(Convert.ToString(loModulo.Key)))
3133  // {
3134  // ((IModulo)loModulo.Value)._BindForm(Name, this);
3135  // }
3136  //}
3137  }
3138 
3144  public void _AddBindFormClass(IDisposable toClass)
3145  {
3146  if (!_dictBindForm.ContainsValue(toClass))
3147  {
3148  try
3149  {
3150  _dictBindForm.Add(System.Guid.NewGuid().ToString(), toClass); // De momento no es necesario añadir el nombre de la clase. Podemos tener instancias con el mismo nombre...
3151  }
3152  catch (Exception)
3153  {
3154  }
3155  }
3156  }
3157 
3161  private void Load_Privado()
3162  {
3163  // PE- Volver a capturar las teclas aquí para los formularios que no son frmGestionPerfil
3164  Capturar_TeclesRapides(this, true);
3165  }
3166 
3173  private void Constructor_Privado()
3174  {
3175  if (!EW_GLOBAL._EsEjecutable)
3176  return;
3177 
3178  try
3179  {
3180  // PE-74827
3181  // Comprobamos el tipo de acceso que tiene el usuario activo en esta pantalla (0 restringido, 1 solo lectura, 2 total, 3 Baja suscripción)
3182  //sage.ew.usuario.Usuario loUsuario = new sage.ew.usuario.Usuario();
3183  if (!string.IsNullOrEmpty(_Pantalla))
3184  {
3185  // PARTE 88665. Asignamos el acceso a la propiedad del formulario, para poder utilizarla posteriormente si nos interesa
3186  determinarNivelAccesoDelUsuario(); // PE-92757. Usamos Usuario estático
3187 
3188  if (tengoElAccesoDenegadoParaEstaPantalla())
3189  {
3190  // FPARTE 88665
3191 
3192  // PE-80758. Mostrem missatge i sortim
3193  string lcDescripcio = Usuario._This._Descripcion_Pantalla(_Pantalla); // PE-79824 // PE-92757
3194 
3195  //PE-97302
3196  if (!_lMensajeAccesoMostrado)
3197  {
3198  string lcMessage = string.Format("El usuario {0} no tiene acceso a {1}. Consulte con su supervisor.", Usuario._This._Nombre, lcDescripcio);
3199  FUNCTIONS._MessageBox(lcMessage, MessageBoxButtons.OK, MessageBoxIcon.Stop, MessageBoxDefaultButton.Button1, DialogResult.OK);
3200  _lMensajeAccesoMostrado = true;
3201  }
3202 
3203  //PE-97667 Descomentamos el codigo de Santi, ya que si cerrarmos el formulario en plena ejecución se pueden producen errores
3204  Load += (s, e) => Close();
3205  //this.Close();
3206 
3207  AccesoListasPrevias = false;
3208 
3209  return;
3210  }
3211 
3212  // PE-80965. Solo si es solo lectura, ponemos el texto y bloqueamos
3213  if (!_cSufijo.Contains("(Sólo lectura)") && tengoElAccesoDeSoloLecturaParaEstaPantalla())
3214  {
3215  // Bloqueamos la pantalla
3216  _cSufijo += " (Sólo lectura)";
3217  Revisar_Titulo_Formulario();
3218  _ReadOnly = true;
3219  }
3220 
3221  // PE-87103. Si tiene acceso BajaSuscripción, modificar caption y bloquear como si fuera de sólo lectura
3222  if (!_cSufijo.Contains("(Baja suscripción)") && tengoElAccesoEnBajaSuscripcionParaEstaPantalla())
3223  {
3224  _cSufijo += " (Baja suscripción)";
3225  Revisar_Titulo_Formulario();
3226  _ReadOnly = true;
3227  }
3228  // FI PE-87103
3229 
3230  AccesoListasPrevias = true;
3231  }
3232  else
3233  {
3234  //Miro si debe gestionar los permisos (se hace por la propiedad pública para que tenga en cuenta las sobreescrituras de las clases deribadas
3235  //durante la evalución de la base
3236  if (!_Gestionar_permisos) _ReadOnly = false;
3237  else
3238  {
3239  // Mirar si hay formulario padre y obtener de ahí el estado de sólo lectura (PE-79824)
3240  FormBase loFrm = (FormBase)FindForm();
3241 
3242  if (loFrm != null)
3243  _ReadOnly = loFrm._ReadOnly;
3244  else
3245  _ReadOnly = false;
3246  }
3247  }
3248  }
3249  catch (Exception loEx)
3250  {
3251  db.DB.Registrar_Error(loEx);
3252  throw;
3253  }
3254 
3255  }
3256 
3257  private bool tengoElAccesoEnBajaSuscripcionParaEstaPantalla()
3258  {
3259  return _NivelAcceso == _TiposAccesosPantalla.BajaSuscripcion;
3260  }
3261 
3262  private bool tengoElAccesoDeSoloLecturaParaEstaPantalla()
3263  {
3264  return _NivelAcceso == _TiposAccesosPantalla.SoloLectura;
3265  }
3266 
3267  private bool tengoElAccesoDenegadoParaEstaPantalla()
3268  {
3269  return _NivelAcceso == _TiposAccesosPantalla.Denegado;
3270  }
3271 
3272  private void determinarNivelAccesoDelUsuario()
3273  {
3274  if (!DesignMode)
3275  _NivelAcceso = Usuario._This._Acceso(this._Pantalla.Trim().ToUpper());
3276  else
3277  _NivelAcceso = _TiposAccesosPantalla.Completo;
3278  }
3279 
3280  private Color Name_To_Color(string tcNomColor)
3281  {
3282  Color loColor;
3283 
3284  // Primer mirem si és un SystemColor
3285  if (tcNomColor.Substring(0, 1) == "#")
3286  loColor = ColorTranslator.FromHtml(tcNomColor);
3287  else
3288  loColor = Color.FromName(tcNomColor);
3289 
3290  return loColor;
3291  }
3292 
3293 
3306  public void _ShowMessageBoxAutomatic(PanelAvisoRespAuto.TipoAviso toTipoAviso, string tcTitulo, string tcPregunta, string tcRespuesta,
3307  string tcId, int tnSegundos=15, int tnAnchoMaxCampoPregunta = 600)
3308  {
3309  try
3310  {
3311  Form loForm = this.FindForm();
3312 
3313  if (loForm != null)
3314  {
3315  PanelAvisoRespAuto loMensajePopUp;
3316 
3317  // Detectar si tenemos el usercontrol de mensaje respuesta automática ya en pantalla pero oculto.
3318  //
3319  Control loControlMensajePopUp = loForm.__FindControlRecursive("oMensajePopUpAvisoRespAuto");
3320  if (loControlMensajePopUp == null)
3321  {
3322  loMensajePopUp = new PanelAvisoRespAuto(toTipoAviso, tcTitulo, tcPregunta, tcRespuesta, tcId, tnSegundos, tnAnchoMaxCampoPregunta);
3323  loMensajePopUp.Name = "oMensajePopUpAvisoRespAuto";
3324  loForm.Controls.Add(loMensajePopUp);
3325  }
3326  else
3327  {
3328  loMensajePopUp = (PanelAvisoRespAuto)loControlMensajePopUp;
3329  loMensajePopUp._TipoAviso = toTipoAviso;
3330  loMensajePopUp._TextoTitulo = tcTitulo;
3331  loMensajePopUp._TextoPregunta = tcPregunta;
3332  loMensajePopUp._TextoRespuesta = tcRespuesta;
3333  loMensajePopUp._IdPregunta = tcId;
3334  loMensajePopUp._Segundos = tnSegundos;
3335  loMensajePopUp._AnchoMaxPregunta = tnAnchoMaxCampoPregunta;
3336 
3337  }
3338  // El mensaje popup se muestra ajustado al borde derecho del formulario, a 10 pixels aproximadamente del .Top del
3339  // mismo.
3340  //
3341  loMensajePopUp.Location = new Point(this.Width - loMensajePopUp.Width - 25, 10);
3342  loMensajePopUp.Visible = true;
3343  loMensajePopUp.BringToFront();
3344  }
3345  }
3346  catch (Exception e)
3347  {
3348  DB.Registrar_Error(e);
3349  }
3350 
3351  return;
3352  }
3353 
3364  public DialogResult _MessageBox(String tcMensaje, MessageBoxButtons toBotones, MessageBoxIcon toIcono,
3365  MessageBoxDefaultButton toBotonDefecto, DialogResult toResultadoDefecte)
3366  {
3367  DialogResult toResultado;
3368  MessageBoxAutomatico pantalla = new MessageBoxAutomatico();
3369 
3370 
3371  toResultado = _MessageBox(tcMensaje, toBotones, toIcono, toBotonDefecto, toResultadoDefecte, pantalla);
3372 
3373 
3374  return toResultado;
3375  }
3376 
3388  public DialogResult _MessageBox(String tcMensaje, MessageBoxButtons toBotones, MessageBoxIcon toIcono,
3389  MessageBoxDefaultButton toBotonDefecto, DialogResult toResultadoDefecte, MessageBoxAutomatico toPantalla)
3390  {
3391  DialogResult toResultado;
3392 
3393  if (Application.OpenForms.Count > 0 || Debugger.IsAttached)
3394  {
3395  //PE-88559
3396  string lcTitulo = "";
3397  if (!Text.__IsNumeric()) lcTitulo = Text;
3398 
3399  // PE-87573. Cridem a la següent sobrecàrrega
3400  toResultado = _MessageBox(tcMensaje, lcTitulo, toBotones, toIcono, toBotonDefecto, toPantalla);
3401  }
3402  else
3403  {
3404  Exception ex = new Exception("Se ha lanzado este mensaje visual: '" + tcMensaje + "'");
3405  throw ex;
3406  }
3407 
3408  return toResultado;
3409  }
3410 
3425  public DialogResult _MessageBox(String tcMensaje, MessageBoxButtons toBotones, MessageBoxIcon toIcono,
3426  MessageBoxDefaultButton toBotonDefecto, DialogResult toResultadoDefecte,
3427  Link toLink)
3428  {
3429  DialogResult toResultado;
3430  MessageBoxAutomatico pantalla = new MessageBoxAutomatico();
3431 
3432  toResultado = _MessageBox(tcMensaje, toBotones, toIcono, toBotonDefecto, toResultadoDefecte, toLink, pantalla);
3433 
3434  return toResultado;
3435  }
3436 
3452  public DialogResult _MessageBox(String tcMensaje, MessageBoxButtons toBotones, MessageBoxIcon toIcono,
3453  MessageBoxDefaultButton toBotonDefecto, DialogResult toResultadoDefecte,
3454  Link toLink, MessageBoxAutomatico toPantalla)
3455  {
3456  DialogResult toResultado;
3457 
3458  if (Application.OpenForms.Count > 0 || Debugger.IsAttached)
3459  {
3460  //PE-88559
3461  string lcTitulo = "";
3462  if (!Text.__IsNumeric()) lcTitulo = Text;
3463 
3464  // PE-87573. Cridem a la següent sobrecàrrega
3465  toResultado = _MessageBox(tcMensaje, lcTitulo, toBotones, toIcono, toBotonDefecto, toLink, toPantalla);
3466  }
3467  else
3468  {
3469  Exception ex = new Exception("Se ha lanzado este mensaje visual: '" + tcMensaje + "'");
3470  throw ex;
3471  }
3472 
3473  return toResultado;
3474  }
3475 
3487  public DialogResult _MessageBox(String tcMensaje, MessageBoxButtons toBotones, MessageBoxIcon toIcono,
3488  MessageBoxDefaultButton toBotonDefecto, DialogResult toResultadoDefecte,
3489  Dictionary<eBotonesMessagebox, string> tdicLiteralesBoton)
3490  {
3491  DialogResult toResultado;
3492  MessageBoxAutomatico pantalla = new MessageBoxAutomatico();
3493 
3494  toResultado = _MessageBox(tcMensaje, toBotones, toIcono, toBotonDefecto, toResultadoDefecte, tdicLiteralesBoton, pantalla);
3495 
3496  return toResultado;
3497  }
3498 
3511  public DialogResult _MessageBox(String tcMensaje, MessageBoxButtons toBotones, MessageBoxIcon toIcono,
3512  MessageBoxDefaultButton toBotonDefecto, DialogResult toResultadoDefecte,
3513  Dictionary<eBotonesMessagebox, string> tdicLiteralesBoton, MessageBoxAutomatico toPantalla)
3514  {
3515  DialogResult toResultado;
3516 
3517  if (Application.OpenForms.Count > 0 || Debugger.IsAttached)
3518  {
3519  //PE-88559
3520  string lcTitulo = "";
3521  if (!this.Text.__IsNumeric()) lcTitulo = this.Text;
3522 
3523  // PE-87573. Cridem a la següent sobrecàrrega
3524  toResultado = _MessageBox(tcMensaje, lcTitulo, toBotones, toIcono, toBotonDefecto, tdicLiteralesBoton, toPantalla);
3525  }
3526  else
3527  {
3528  Exception ex = new Exception("Se ha lanzado este mensaje visual: " + tcMensaje);
3529  throw ex;
3530  }
3531 
3532  return toResultado;
3533  }
3534 
3547  public DialogResult _MessageBox(String tcMensaje, MessageBoxButtons toBotones, MessageBoxIcon toIcono,
3548  MessageBoxDefaultButton toBotonDefecto, DialogResult toResultadoDefecte,
3549  Dictionary<eBotonesMessagebox, string> tdicLiteralesBoton,
3550  Dictionary<eBotonesMessagebox, Image> tdicImagenesBoton)
3551  {
3552  DialogResult toResultado;
3553  MessageBoxAutomatico pantalla = new MessageBoxAutomatico();
3554 
3555  toResultado = _MessageBox(tcMensaje, toBotones, toIcono, toBotonDefecto, toResultadoDefecte, tdicLiteralesBoton, tdicImagenesBoton, pantalla);
3556 
3557  return toResultado;
3558  }
3559 
3573  public DialogResult _MessageBox(String tcMensaje, MessageBoxButtons toBotones, MessageBoxIcon toIcono,
3574  MessageBoxDefaultButton toBotonDefecto, DialogResult toResultadoDefecte,
3575  Dictionary<eBotonesMessagebox, string> tdicLiteralesBoton,
3576  Dictionary<eBotonesMessagebox, Image> tdicImagenesBoton, MessageBoxAutomatico toPantalla)
3577  {
3578  DialogResult toResultado;
3579 
3580  if (Application.OpenForms.Count > 0 || Debugger.IsAttached)
3581  {
3582  string lcTitulo = "";
3583  if (!Text.__IsNumeric()) lcTitulo = Text;
3584 
3585  toResultado = _MessageBox(tcMensaje, lcTitulo, toBotones, toIcono, toBotonDefecto, tdicLiteralesBoton, tdicImagenesBoton, toPantalla);
3586  }
3587  else
3588  {
3589  Exception ex = new Exception("Se ha lanzado este mensaje visual: " + tcMensaje);
3590  throw ex;
3591  }
3592 
3593  return toResultado;
3594  }
3595 
3606  public DialogResult _MessageBox(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon,
3607  MessageBoxDefaultButton defaultButton)
3608  {
3609  // Evento before
3610  MessageBoxParam loParam = new MessageBoxParam(text, caption, buttons, icon, defaultButton, new DialogResult());
3611  MessageBoxAutomatico pantalla = new MessageBoxAutomatico();
3612 
3613  loParam._DialogResult = _MessageBox(text, caption, buttons, icon, defaultButton, pantalla);
3614 
3615  return loParam._DialogResult;
3616  }
3617 
3629  public DialogResult _MessageBox(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon,
3630  MessageBoxDefaultButton defaultButton, MessageBoxAutomatico toPantalla)
3631  {
3632  // Evento before
3633  MessageBoxParam loParam = new MessageBoxParam(text, caption, buttons, icon, defaultButton, new DialogResult());
3634 
3635  if (Application.OpenForms.Count > 0 || Debugger.IsAttached)
3636  {
3637  onMessageBoxBefore?.Invoke(ref loParam);
3638 
3639  // Si hay algún mensaje durante la carga de opciones de configuración, lo evitamos
3640  if (_ConfigUserOptionsLoading)
3641  return loParam._DialogResultDefecto;
3642 
3643  // Si aún no hemos realizado el login de usuario, para evitar problemas de mensajes en blanco con windows 10,... utilizamos el messagebox nativo.
3644  if (!EW_GLOBAL._lLoginFinalizado)
3645  {
3646  loParam._DialogResult = MessageBox.Show(loParam._Mensaje, loParam._Caption, loParam._Botones, loParam._Icono, loParam._BotonDefecto);
3647  return loParam._DialogResult;
3648  }
3649 
3650  // Evento invalidate
3651  onMessageBoxInvalidate?.Invoke(ref loParam);
3652  if (loParam._Cancel)
3653  return loParam._DialogResultDefecto;
3654 
3655  DialogResult dialogResult = new DialogResult();
3656  if (_RespuestaEncontrada(toPantalla, ref dialogResult))
3657  {
3658  loParam._DialogResult = dialogResult;
3659  }
3660  else
3661  {
3662  //PE-90150 : Todos los message box deben pasar por MessageBoxTactil
3663  using (MessageBoxTactil frmMessage = new MessageBoxTactil())
3664  {
3665  // Bug 213372 Si la pantalla que lanza el mensaje no debe sacar mensajes automaticos ponemos a null el parametro _toPantalla para que no salga el check de guardar
3666  MessageBoxAutomatico _toPantalla = !this._MessageBoxAutomatic ? null : toPantalla;
3667 
3668  loParam._DialogResult = frmMessage.Show(loParam._Mensaje, _toPantalla, loParam._Caption, loParam._Botones, loParam._Icono, loParam._BotonDefecto);
3669 
3670  if (frmMessage._EwchkGuardar_Checked)
3671  {
3672  _GuardarRespuesta(toPantalla, frmMessage._DiccionarioBotonesRespuestas, loParam._Mensaje, loParam._DialogResult.ToString());
3673  }
3674  }
3675  }
3676 
3677  // Evento after
3678  onMessageBoxAfter?.Invoke(ref loParam);
3679  }
3680  else
3681  {
3682  Exception ex = new Exception("Se ha lanzado este mensaje visual: " + text);
3683  throw ex;
3684  }
3685 
3686  return loParam._DialogResult;
3687  }
3688 
3703  public DialogResult _MessageBox(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon,
3704  MessageBoxDefaultButton defaultButton, Link toLink)
3705  {
3706  MessageBoxParam loParam = new MessageBoxParam(text, caption, buttons, icon, defaultButton, new DialogResult(), toLink);
3707  MessageBoxAutomatico pantalla = new MessageBoxAutomatico();
3708 
3709  loParam._DialogResult = _MessageBox(text, caption, buttons, icon, defaultButton, toLink, pantalla);
3710 
3711  return loParam._DialogResult;
3712  }
3713 
3729  public DialogResult _MessageBox(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon,
3730  MessageBoxDefaultButton defaultButton, Link toLink, MessageBoxAutomatico toPantalla)
3731  {
3732  // Evento before
3733  MessageBoxParam loParam = new MessageBoxParam(text, caption, buttons, icon, defaultButton, new DialogResult(), toLink);
3734 
3735  if (Application.OpenForms.Count > 0 || Debugger.IsAttached)
3736  {
3737  onMessageBoxBefore?.Invoke(ref loParam);
3738 
3739  // Si hay algún mensaje durante la carga de opciones de configuración, lo evitamos
3740  if (_ConfigUserOptionsLoading)
3741  return loParam._DialogResultDefecto;
3742 
3743  // Si aún no hemos realizado el login de usuario, para evitar problemas de mensajes en blanco con windows 10,... utilizamos el messagebox nativo.
3744  if (!EW_GLOBAL._lLoginFinalizado)
3745  {
3746  loParam._DialogResult = MessageBox.Show(loParam._Mensaje, loParam._Caption, loParam._Botones, loParam._Icono, loParam._BotonDefecto);
3747  return loParam._DialogResult;
3748  }
3749 
3750  // Evento invalidate
3751  onMessageBoxInvalidate?.Invoke(ref loParam);
3752  if (loParam._Cancel)
3753  return loParam._DialogResultDefecto;
3754 
3755  DialogResult dialogResult = new DialogResult();
3756  if (_RespuestaEncontrada(toPantalla, ref dialogResult))
3757  {
3758  loParam._DialogResult = dialogResult;
3759  }
3760  else
3761  {
3762  //PE-90150 : Todos los message box deben pasar por MessageBoxTactil
3763  using (MessageBoxTactil frmMessage = new MessageBoxTactil())
3764  {
3765  // Bug 213372 Si la pantalla que lanza el mensaje no debe sacar mensajes automaticos ponemos a null el parametro _toPantalla para que no salga el check de guardar
3766  MessageBoxAutomatico _toPantalla = !this._MessageBoxAutomatic ? null : toPantalla;
3767 
3768  loParam._DialogResult = frmMessage.Show(loParam._Mensaje, _toPantalla, loParam._Link, loParam._Caption, loParam._Botones, loParam._Icono, loParam._BotonDefecto);
3769  if (frmMessage._EwchkGuardar_Checked)
3770  {
3771  _GuardarRespuesta(toPantalla, frmMessage._DiccionarioBotonesRespuestas, loParam._Mensaje, loParam._DialogResult.ToString());
3772  }
3773  }
3774  }
3775 
3776  // Evento after
3777  onMessageBoxAfter?.Invoke(ref loParam);
3778  }
3779  else
3780  {
3781  Exception ex = new Exception("Se ha lanzado este mensaje visual: " + text);
3782  throw ex;
3783  }
3784 
3785  return loParam._DialogResult;
3786  }
3787 
3799  public DialogResult _MessageBox(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon,
3800  MessageBoxDefaultButton defaultButton,
3801  Dictionary<eBotonesMessagebox, string> tdicLiteralesBoton)
3802  {
3803  // Evento before
3804  MessageBoxParam loParam = new MessageBoxParam(text, caption, buttons, icon, defaultButton, new DialogResult(), tdicLiteralesBoton);
3805  MessageBoxAutomatico pantalla = new MessageBoxAutomatico();
3806 
3807  loParam._DialogResult = _MessageBox(text, caption, buttons, icon, defaultButton, tdicLiteralesBoton, pantalla);
3808 
3809  return loParam._DialogResult;
3810  }
3811 
3824  public DialogResult _MessageBox(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon,
3825  MessageBoxDefaultButton defaultButton,
3826  Dictionary<eBotonesMessagebox, string> tdicLiteralesBoton, MessageBoxAutomatico toPantalla)
3827  {
3828  // Evento before
3829  MessageBoxParam loParam = new MessageBoxParam(text, caption, buttons, icon, defaultButton, new DialogResult(), tdicLiteralesBoton);
3830 
3831  if (Application.OpenForms.Count > 0 || Debugger.IsAttached)
3832  {
3833  onMessageBoxBefore?.Invoke(ref loParam);
3834 
3835  // Si hay algún mensaje durante la carga de opciones de configuración, lo evitamos
3836  if (_ConfigUserOptionsLoading)
3837  return loParam._DialogResultDefecto;
3838 
3839  // Si aún no hemos realizado el login de usuario, para evitar problemas de mensajes en blanco con windows 10,... utilizamos el messagebox nativo.
3840  if (!EW_GLOBAL._lLoginFinalizado)
3841  {
3842  loParam._DialogResult = MessageBox.Show(loParam._Mensaje, loParam._Caption, loParam._Botones, loParam._Icono, loParam._BotonDefecto);
3843  return loParam._DialogResult;
3844  }
3845 
3846  // Evento invalidate
3847  onMessageBoxInvalidate?.Invoke(ref loParam);
3848  if (loParam._Cancel)
3849  return loParam._DialogResultDefecto;
3850 
3851  DialogResult dialogResult = new DialogResult();
3852  if (_RespuestaEncontrada(toPantalla, ref dialogResult))
3853  {
3854  loParam._DialogResult = dialogResult;
3855  }
3856  else
3857  {
3858  //PE-90150 : Todos los message box deben pasar por MessageBoxTactil
3859  using (MessageBoxTactil frmMessage = new MessageBoxTactil())
3860  {
3861  frmMessage._DiccionarioLiteralesBotones = loParam._DicLiteralesBotones;
3862 
3863  // Bug 213372 Si la pantalla que lanza el mensaje no debe sacar mensajes automaticos ponemos a null el parametro _toPantalla para que no salga el check de guardar
3864  MessageBoxAutomatico _toPantalla = !this._MessageBoxAutomatic ? null : toPantalla;
3865 
3866  loParam._DialogResult = frmMessage.Show(loParam._Mensaje, _toPantalla, loParam._Caption, loParam._Botones, loParam._Icono, loParam._BotonDefecto);
3867 
3868  if (frmMessage._EwchkGuardar_Checked)
3869  {
3870  _GuardarRespuesta(toPantalla, frmMessage._DiccionarioBotonesRespuestas, loParam._Mensaje, loParam._DialogResult.ToString());
3871  }
3872  }
3873  }
3874 
3875  // Evento after
3876  onMessageBoxAfter?.Invoke(ref loParam);
3877  }
3878  else
3879  {
3880  Exception ex = new Exception("Se ha lanzado este mensaje visual: " + text);
3881  throw ex;
3882  }
3883 
3884  return loParam._DialogResult;
3885  }
3886 
3902  public DialogResult _MessageBox(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon,
3903  MessageBoxDefaultButton defaultButton,
3904  Dictionary<eBotonesMessagebox, string> tdicLiteralesBoton,
3905  Link toLink)
3906  {
3907  // Evento before
3908  MessageBoxParam loParam = new MessageBoxParam(text, caption, buttons, icon, defaultButton, new DialogResult(), tdicLiteralesBoton, toLink);
3909  MessageBoxAutomatico pantalla = new MessageBoxAutomatico();
3910 
3911  loParam._DialogResult = _MessageBox(text, caption, buttons, icon, defaultButton, tdicLiteralesBoton, toLink, pantalla);
3912 
3913  return loParam._DialogResult;
3914  }
3915 
3932  public DialogResult _MessageBox(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon,
3933  MessageBoxDefaultButton defaultButton,
3934  Dictionary<eBotonesMessagebox, string> tdicLiteralesBoton,
3935  Link toLink, MessageBoxAutomatico toPantalla)
3936  {
3937  // Evento before
3938  MessageBoxParam loParam = new MessageBoxParam(text, caption, buttons, icon, defaultButton, new DialogResult(), tdicLiteralesBoton, toLink);
3939 
3940  if (Application.OpenForms.Count > 0 || Debugger.IsAttached)
3941  {
3942  onMessageBoxBefore?.Invoke(ref loParam);
3943 
3944  // Si hay algún mensaje durante la carga de opciones de configuración, lo evitamos
3945  if (_ConfigUserOptionsLoading)
3946  return loParam._DialogResultDefecto;
3947 
3948  // Si aún no hemos realizado el login de usuario, para evitar problemas de mensajes en blanco con windows 10,... utilizamos el messagebox nativo.
3949  if (!EW_GLOBAL._lLoginFinalizado)
3950  {
3951  loParam._DialogResult = MessageBox.Show(loParam._Mensaje, loParam._Caption, loParam._Botones, loParam._Icono, loParam._BotonDefecto);
3952  return loParam._DialogResult;
3953  }
3954 
3955  // Evento invalidate
3956  onMessageBoxInvalidate?.Invoke(ref loParam);
3957  if (loParam._Cancel)
3958  return loParam._DialogResultDefecto;
3959 
3960  DialogResult dialogResult = new DialogResult();
3961  if (_RespuestaEncontrada(toPantalla, ref dialogResult))
3962  {
3963  loParam._DialogResult = dialogResult;
3964  }
3965  else
3966  {
3967  //PE-90150 : Todos los message box deben pasar por MessageBoxTactil
3968  using (MessageBoxTactil frmMessage = new MessageBoxTactil())
3969  {
3970  frmMessage._DiccionarioLiteralesBotones = loParam._DicLiteralesBotones;
3971 
3972  // Bug 213372 Si la pantalla que lanza el mensaje no debe sacar mensajes automaticos ponemos a null el parametro _toPantalla para que no salga el check de guardar
3973  MessageBoxAutomatico _toPantalla = !this._MessageBoxAutomatic ? null : toPantalla;
3974 
3975  loParam._DialogResult = frmMessage.Show(loParam._Mensaje, _toPantalla, loParam._Link, loParam._Caption, loParam._Botones, loParam._Icono, loParam._BotonDefecto);
3976 
3977  if (frmMessage._EwchkGuardar_Checked)
3978  {
3979  _GuardarRespuesta(toPantalla, frmMessage._DiccionarioBotonesRespuestas, loParam._Mensaje, loParam._DialogResult.ToString());
3980  }
3981  }
3982  }
3983 
3984  // Evento after
3985  onMessageBoxAfter?.Invoke(ref loParam);
3986  }
3987  else
3988  {
3989  Exception ex = new Exception("Se ha lanzado este mensaje visual: " + text);
3990  throw ex;
3991  }
3992 
3993  return loParam._DialogResult;
3994  }
3995 
4008  public DialogResult _MessageBox(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon,
4009  MessageBoxDefaultButton defaultButton,
4010  Dictionary<eBotonesMessagebox, string> tdicLiteralesBoton,
4011  Dictionary<eBotonesMessagebox, Image> tdicImagenesBoton)
4012  {
4013  // Evento before
4014  MessageBoxParam loParam = new MessageBoxParam(text, caption, buttons, icon, defaultButton, new DialogResult(), tdicLiteralesBoton, tdicImagenesBoton);
4015  MessageBoxAutomatico pantalla = new MessageBoxAutomatico();
4016 
4017  loParam._DialogResult = _MessageBox(text, caption, buttons, icon, defaultButton, tdicLiteralesBoton, tdicImagenesBoton, pantalla);
4018 
4019  return loParam._DialogResult;
4020  }
4021 
4035  public DialogResult _MessageBox(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon,
4036  MessageBoxDefaultButton defaultButton,
4037  Dictionary<eBotonesMessagebox, string> tdicLiteralesBoton,
4038  Dictionary<eBotonesMessagebox, Image> tdicImagenesBoton, MessageBoxAutomatico toPantalla)
4039  {
4040  // Evento before
4041  MessageBoxParam loParam = new MessageBoxParam(text, caption, buttons, icon, defaultButton, new DialogResult(), tdicLiteralesBoton, tdicImagenesBoton);
4042 
4043  if (Application.OpenForms.Count > 0 || Debugger.IsAttached)
4044  {
4045  onMessageBoxBefore?.Invoke(ref loParam);
4046 
4047  // Si hay algún mensaje durante la carga de opciones de configuración, lo evitamos
4048  if (_ConfigUserOptionsLoading)
4049  return loParam._DialogResultDefecto;
4050 
4051 
4052  // Si aún no hemos realizado el login de usuario, para evitar problemas de mensajes en blanco con windows 10,... utilizamos el messagebox nativo.
4053  if (!EW_GLOBAL._lLoginFinalizado)
4054  {
4055  loParam._DialogResult = MessageBox.Show(loParam._Mensaje, loParam._Caption, loParam._Botones, loParam._Icono, loParam._BotonDefecto);
4056  return loParam._DialogResult;
4057  }
4058 
4059  // Evento invalidate
4060  onMessageBoxInvalidate?.Invoke(ref loParam);
4061  if (loParam._Cancel)
4062  return loParam._DialogResultDefecto;
4063 
4064  DialogResult dialogResult = new DialogResult();
4065  if (_RespuestaEncontrada(toPantalla, ref dialogResult))
4066  {
4067  loParam._DialogResult = dialogResult;
4068  }
4069  else
4070  {
4071  //PE-90150 : Todos los message box deben pasar por MessageBoxTactil
4072  using (MessageBoxTactil frmMessage = new MessageBoxTactil())
4073  {
4074  frmMessage._DiccionarioLiteralesBotones = loParam._DicLiteralesBotones;
4075  frmMessage._DiccionarioImagenesBotones = loParam._DicImagenesBotones;
4076 
4077  // Bug 213372 Si la pantalla que lanza el mensaje no debe sacar mensajes automaticos ponemos a null el parametro _toPantalla para que no salga el check de guardar
4078  MessageBoxAutomatico _toPantalla = !this._MessageBoxAutomatic ? null : toPantalla;
4079 
4080  loParam._DialogResult = frmMessage.Show(loParam._Mensaje, _toPantalla, loParam._Caption, loParam._Botones, loParam._Icono, loParam._BotonDefecto);
4081 
4082  if (frmMessage._EwchkGuardar_Checked)
4083  {
4084  _GuardarRespuesta(toPantalla, frmMessage._DiccionarioBotonesRespuestas, loParam._Mensaje, loParam._DialogResult.ToString());
4085  }
4086  }
4087  }
4088 
4089  // Evento after
4090  onMessageBoxAfter?.Invoke(ref loParam);
4091  }
4092  else
4093  {
4094  Exception ex = new Exception("Se ha lanzado este mensaje visual: " + text);
4095  throw ex;
4096  }
4097 
4098  return loParam._DialogResult;
4099  }
4100 
4112  public DialogResult _MessageBox(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon,
4113  MessageBoxDefaultButton defaultButton,
4114  Dictionary<MessageBoxButtons, List<string>> tdicTextoBotones)
4115  {
4116  // Evento before
4117  MessageBoxParam loParam = new MessageBoxParam(text, caption, buttons, icon, defaultButton, new DialogResult(), tdicTextoBotones);
4118  MessageBoxAutomatico pantalla = new MessageBoxAutomatico();
4119 
4120  loParam._DialogResult = _MessageBox(text, caption, buttons, icon, defaultButton, tdicTextoBotones, pantalla);
4121  return loParam._DialogResult;
4122  }
4123 
4136  public DialogResult _MessageBox(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon,
4137  MessageBoxDefaultButton defaultButton,
4138  Dictionary<MessageBoxButtons, List<string>> tdicTextoBotones, MessageBoxAutomatico toPantalla)
4139  {
4140 
4141  // Evento before
4142  MessageBoxParam loParam = new MessageBoxParam(text, caption, buttons, icon, defaultButton, new DialogResult(), tdicTextoBotones);
4143 
4144  if (Application.OpenForms.Count > 0 || Debugger.IsAttached)
4145  {
4146  onMessageBoxBefore?.Invoke(ref loParam);
4147 
4148  // Si hay algún mensaje durante la carga de opciones de configuración, lo evitamos
4149  if (_ConfigUserOptionsLoading)
4150  return loParam._DialogResultDefecto;
4151 
4152  // Si aún no hemos realizado el login de usuario, para evitar problemas de mensajes en blanco con windows 10,... utilizamos el messagebox nativo.
4153  if (!EW_GLOBAL._lLoginFinalizado)
4154  {
4155  loParam._DialogResult = MessageBox.Show(loParam._Mensaje, loParam._Caption, loParam._Botones, loParam._Icono, loParam._BotonDefecto);
4156  return loParam._DialogResult;
4157  }
4158 
4159  // Evento invalidate
4160  onMessageBoxInvalidate?.Invoke(ref loParam);
4161  if (loParam._Cancel)
4162  return loParam._DialogResultDefecto;
4163 
4164  DialogResult dialogResult = new DialogResult();
4165  if (_RespuestaEncontrada(toPantalla, ref dialogResult))
4166  {
4167  loParam._DialogResult = dialogResult;
4168  }
4169  else
4170  {
4171  //PE-90150 : Todos los message box deben pasar por MessageBoxTactil
4172  using (MessageBoxTactil frmMessage = new MessageBoxTactil())
4173  {
4174  // Bug 213372 Si la pantalla que lanza el mensaje no debe sacar mensajes automaticos ponemos a null el parametro _toPantalla para que no salga el check de guardar
4175  MessageBoxAutomatico _toPantalla = !this._MessageBoxAutomatic ? null : toPantalla;
4176 
4177  loParam._DialogResult = frmMessage.Show(loParam._Mensaje, _toPantalla, loParam._Caption, loParam._Botones, loParam._Icono, loParam._BotonDefecto);
4178 
4179  if (frmMessage._EwchkGuardar_Checked)
4180  {
4181  _GuardarRespuesta(toPantalla, frmMessage._DiccionarioBotonesRespuestas, loParam._Mensaje, loParam._DialogResult.ToString());
4182  }
4183  }
4184  }
4185 
4186  // Evento after
4187  onMessageBoxAfter?.Invoke(ref loParam);
4188  }
4189  else
4190  {
4191  Exception ex = new Exception("Se ha lanzado este mensaje visual :" + text);
4192  loParam._DialogResult = DialogResult.OK;
4193  }
4194 
4195  return loParam._DialogResult;
4196  }
4197 
4198  private void _GuardarRespuesta(MessageBoxAutomatico toPantalla, Dictionary<string, string> toDiccionarioBotonesRespuestas, string toMensaje, string toDialogResult)
4199  {
4200  if( toPantalla != null && !string.IsNullOrWhiteSpace(toPantalla._Guid) && !string.IsNullOrWhiteSpace(toPantalla._Pantalla))
4201  {
4202  string lcUsuario = Convert.ToString(EW_GLOBAL._GetVariable("wc_usuario"));
4203  UserMessageBox userMessageBox = new UserMessageBox();
4204  userMessageBox._MsgBox = toPantalla._Guid.ToUpper();
4205  userMessageBox._Pantalla = toPantalla._Pantalla.ToUpper();
4206  userMessageBox._Usuario = lcUsuario;
4207  userMessageBox._Pregunta = toMensaje;
4208 
4209  userMessageBox._CargarOpciones(toDiccionarioBotonesRespuestas, toDialogResult);
4210 
4211  userMessageBox._Save();
4212  }
4213  }
4214 
4215  private bool _RespuestaEncontrada(MessageBoxAutomatico toPantalla, ref DialogResult toDialogResult)
4216  {
4217  bool respuestaEncontrada = false;
4218 
4219  if (toPantalla != null && !string.IsNullOrWhiteSpace(toPantalla._Guid) && !string.IsNullOrWhiteSpace(toPantalla._Pantalla))
4220  {
4221  string lcUsuario = Convert.ToString(EW_GLOBAL._GetVariable("wc_usuario"));
4222  UserMessageBox userMessageBox = new UserMessageBox();
4223  userMessageBox._MsgBox = toPantalla._Guid.ToUpper();
4224  userMessageBox._Pantalla = toPantalla._Pantalla.ToUpper();
4225  userMessageBox._Usuario = lcUsuario;
4226 
4227  if( userMessageBox._Load())
4228  {
4229  UserMessageBoxOpcion opcionSel = userMessageBox._DialogOpcionSel();
4230  string resultDefault = opcionSel._DialogResult;
4231  toDialogResult = (DialogResult)Enum.Parse(typeof(DialogResult), resultDefault);
4232  respuestaEncontrada = true;
4233  if (userMessageBox._AvisoActivo)
4234  {
4235  _ShowMessageBoxAutomatic(PanelAvisoRespAuto.TipoAviso.Info, "Respuesta automática activada", userMessageBox._Pregunta, opcionSel._Respuesta, userMessageBox._MsgBox);
4236  }
4237  }
4238  }
4239  return respuestaEncontrada;
4240  }
4241 
4246  public void _LockScreen(bool tlBloquear)
4247  {
4248  // Bug 162319. Si el formualrio no estaba visible se mostraba vacío. Si el formulario no está visible, no hace falta bloquear
4249  if (!Visible)
4250  {
4251  return;
4252  }
4253 
4254  SendMessage(Handle, WM_SETREDRAW, !tlBloquear, 0);
4255 
4256  if (!tlBloquear)
4257  Refresh();
4258  }
4259 
4264  protected virtual FormBase Clone()
4265  {
4266  return (FormBase)Activator.CreateInstance(this.GetType());
4267  }
4268 
4272  private void InitializeComponent()
4273  {
4274  this.components = new System.ComponentModel.Container();
4275  System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormBase));
4276  this._oErrorProvider = new sage.ew.objetos.ewErrorProvider();
4277  this.contextMenuStripPantalla = new System.Windows.Forms.ContextMenuStrip(this.components);
4278  this.configuracionesUsuarioItem = new System.Windows.Forms.ToolStripMenuItem();
4279  this.toolConfiguracionesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
4280  this.configuracionesUsuarioItemSeparator = new System.Windows.Forms.ToolStripSeparator();
4281  this.nombreFormularioToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
4282  this.ShowPropertiesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
4283  this.gestiónDeFavoritosToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
4284  this.gestiónDeAccesosToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
4285  this.crearAccesoDirectoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
4286  this.crearTareaProgramadaItem = new System.Windows.Forms.ToolStripMenuItem();
4287  this.crearApunteCalendarioItem = new System.Windows.Forms.ToolStripMenuItem();
4288  this.listadosPersonalizablesEditarItem = new System.Windows.Forms.ToolStripMenuItem();
4289  this.listadosPersonalizablesDuplicarItem = new System.Windows.Forms.ToolStripMenuItem();
4290  this.ayudaPantallaToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
4291  this._MenuContext_Opciones = new sage.ew.objetos.ewcontextmenustrip(this.components);
4292  ((System.ComponentModel.ISupportInitialize)(this._oErrorProvider)).BeginInit();
4293  this.contextMenuStripPantalla.SuspendLayout();
4294  this.SuspendLayout();
4295  //
4296  // _oErrorProvider
4297  //
4298  this._oErrorProvider._ErrorToolTipActive = true;
4299  this._oErrorProvider.BlinkStyle = System.Windows.Forms.ErrorBlinkStyle.NeverBlink;
4300  this._oErrorProvider.ContainerControl = this;
4301  this._oErrorProvider.Icon = ((System.Drawing.Icon)(resources.GetObject("_oErrorProvider.Icon")));
4302  //
4303  // contextMenuStripPantalla
4304  //
4305  this.contextMenuStripPantalla.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
4306  this.configuracionesUsuarioItem,
4307  this.configuracionesUsuarioItemSeparator,
4308  this.nombreFormularioToolStripMenuItem,
4309  this.gestiÃnDeFavoritosToolStripMenuItem, this.gestiónDeAccesosToolStripMenuItem, this.crearAccesoDirectoToolStripMenuItem, this.crearTareaProgramadaItem, this.crearApunteCalendarioItem, this.listadosPersonalizablesEditarItem, this.listadosPersonalizablesDuplicarItem, this.ayudaPantallaToolStripMenuItem, this.ShowPropertiesToolStripMenuItem}); this.contextMenuStripPantalla.Name = "contextMenuStripPantalla"; this.contextMenuStripPantalla.Size = new System.Drawing.Size(289, 230); // // configuracionesUsuarioItem // this.configuracionesUsuarioItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolConfiguracionesToolStripMenuItem}); this.configuracionesUsuarioItem.Name = "configuracionesUsuarioItem"; this.configuracionesUsuarioItem.Size = new System.Drawing.Size(288, 22); this.configuracionesUsuarioItem.Text = "Configuraciones de usuario"; // // toolConfiguracionesToolStripMenuItem // this.toolConfiguracionesToolStripMenuItem.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.toolConfiguracionesToolStripMenuItem.Name = "toolConfiguracionesToolStripMenuItem"; this.toolConfiguracionesToolStripMenuItem.Size = new System.Drawing.Size(221, 22); this.toolConfiguracionesToolStripMenuItem.Text = "Diseñador configuraciones"; // // configuracionesUsuarioItemSeparator // this.configuracionesUsuarioItemSeparator.Name = "configuracionesUsuarioItemSeparator"; this.configuracionesUsuarioItemSeparator.Size = new System.Drawing.Size(285, 6); // // nombreFormularioToolStripMenuItem // this.nombreFormularioToolStripMenuItem.Name = "nombreFormularioToolStripMenuItem"; this.nombreFormularioToolStripMenuItem.Size = new System.Drawing.Size(288, 22); this.nombreFormularioToolStripMenuItem.Text = "Nombre del formulario"; // // ShowPropertiesToolStripMenuItem // this.ShowPropertiesToolStripMenuItem.Name = "ShowPropertiesToolStripMenuItem"; this.ShowPropertiesToolStripMenuItem.Size = new System.Drawing.Size(288, 22); this.ShowPropertiesToolStripMenuItem.Text = "Mostrar propiedades controles"; // // gestiónDeFavoritosToolStripMenuItem // this.gestiónDeFavoritosToolStripMenuItem.Name = "gestiónDeFavoritosToolStripMenuItem"; this.gestiónDeFavoritosToolStripMenuItem.Size = new System.Drawing.Size(288, 22); this.gestiónDeFavoritosToolStripMenuItem.Text = "Gestión de favoritos"; // // gestiónDeAccesosToolStripMenuItem // this.gestiónDeAccesosToolStripMenuItem.Name = "gestiónDeAccesosToolStripMenuItem"; this.gestiónDeAccesosToolStripMenuItem.Size = new System.Drawing.Size(288, 22); this.gestiónDeAccesosToolStripMenuItem.Text = "Gestión de accesos"; // // crearAccesoDirectoToolStripMenuItem // this.crearAccesoDirectoToolStripMenuItem.Name = "crearAccesoDirectoToolStripMenuItem"; this.crearAccesoDirectoToolStripMenuItem.Size = new System.Drawing.Size(288, 22); this.crearAccesoDirectoToolStripMenuItem.Text = "Crear acceso directo"; // // crearTareaProgramadaItem // this.crearTareaProgramadaItem.Name = "crearTareaProgramadaItem"; this.crearTareaProgramadaItem.Size = new System.Drawing.Size(288, 22); this.crearTareaProgramadaItem.Text = "Crear tarea programada"; // // crearApunteCalendarioItem // this.crearApunteCalendarioItem.Name = "crearApunteCalendarioItem"; this.crearApunteCalendarioItem.Size = new System.Drawing.Size(288, 22); this.crearApunteCalendarioItem.Text = "Nue&vo apunte calendario"; // // listadosPersonalizablesEditarItem // this.listadosPersonalizablesEditarItem.Name = "listadosPersonalizablesEditarItem"; this.listadosPersonalizablesEditarItem.Size = new System.Drawing.Size(288, 22); this.listadosPersonalizablesEditarItem.Text = "Editar el listado personalizable"; // // listadosPersonalizablesDuplicarItem // this.listadosPersonalizablesDuplicarItem.Name = "listadosPersonalizablesDuplicarItem"; this.listadosPersonalizablesDuplicarItem.Size = new System.Drawing.Size(288, 22); this.listadosPersonalizablesDuplicarItem.Text = "Duplicar y editar el listado personalizable"; // // ayudaPantallaToolStripMenuItem // this.ayudaPantallaToolStripMenuItem.Name = "ayudaPantallaToolStripMenuItem"; this.ayudaPantallaToolStripMenuItem.Size = new System.Drawing.Size(288, 22); this.ayudaPantallaToolStripMenuItem.Text = "Ayuda"; // // _MenuContext_Opciones // this._MenuContext_Opciones.Font = new System.Drawing.Font("Segoe UI", 9.5F); this._MenuContext_Opciones.Name = "ewcontextmenustripOpcProc"; this._MenuContext_Opciones.Size = new System.Drawing.Size(61, 4); // // FormBase // this.ClientSize = new System.Drawing.Size(284, 262); this.KeyPreview = true; this.Name = "FormBase"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; ((System.ComponentModel.ISupportInitialize)(this._oErrorProvider)).EndInit(); this.contextMenuStripPantalla.ResumeLayout(false); this.ResumeLayout(false); } /// <summary> /// Devuelve una lista de los controles del tipo especificado /// Si no pasamos ningún control lo busca en todo el formulario /// </summary> /// <typeparam name="T"></typeparam> /// <param name="toControl"></param> /// <returns></returns> public List<T> _FindControl<T>(Control toControl = null) { if (toControl == null) toControl = this; List<T> lstControls = new List<T>(); lstControls = AllControls(toControl).OfType<T>().ToList(); return lstControls; } /// <summary> /// Devuelve todos los controles /// </summary> /// <param name="container"></param> /// <returns></returns> private IEnumerable<Control> AllControls(Control container) { foreach (Control control in container.Controls) { yield return control; foreach (var innerControl in AllControls(control)) yield return innerControl; } } /// <summary> /// Capturamos el metodo para capturar los posibles mensajes enviados desde Eurowin (VFP) /// </summary> /// <param name="msgEW"></param> protected override void WndProc(ref Message msgEW) { if (msgEW.Msg != WM_SYSCOMMAND || (msgEW.Msg == WM_SYSCOMMAND && ( _ExecuteCommandBefore == null || _ExecuteCommandBefore.Invoke(this, msgEW.WParam)))) { base.WndProc(ref msgEW); if (EW_GLOBAL._EsEjecutable) { //TODO: Temporal hasta que veamos que pasa realmente if (!System.Diagnostics.Debugger.IsAttached && !NETVFP._ReceiveMessageFromVfp(ref msgEW)) return; } } } /// <summary> /// PE-77741 /// Evento para realizar las mismas comprobaciones que en el método análogo de la pantalla de fox /// En los distintos formularios de .net donde se quiera realizar este control, habrá que sobreescribir este evento /// teniendo en cuenta que el objeto "taParams" es un array de objetos con los mismos parámetros y valores que en el /// formulario equivalente de fox. /// </summary> /// <param name="taParams"></param> /// <returns></returns> public virtual bool _Init(object[] taParams) { if (taParams.Count() > 0) { _lAutomatico = true; //Bug 206971: Para poder saber en el formbase si estamos en una tarea programada } return true; } // FI PE-77741 /// <summary> /// Método virtual que se invoca siempre que se muestra un formulario. /// Nos sirve para recuperar los parametros del acceso directo. /// </summary> /// <param name="taParams">Parametros de inicio</param> public virtual bool _InitAccesoDirecto(object[] taParams) { // Obtención de los parámetros según pantalla if (taParams != null && taParams.Length > 0) { foreach (object loItem in taParams) { //Si trobem un parametre que començi per "idparam:" es que tenin propietats guardades a COMUNES!ACDIRPARAM if (loItem.ToString().StartsWith(FUNCTIONS._AccesoDirectoParametro)) { //Recuperem les propietats que mes tard asignarem al OnShown return FUNCTIONS._RecuperarParametrosAccesoDirecto(loItem.ToString(), ref this._ValoresAccesoDirecto); } } } return false; } /// <summary> /// Método virtual genérico para asignar los valores de los parametros de acceso directo en los controls del formulario a partir de la propiedad _ValoresAccesoDirecto. /// Se llama en el OnShown del formulario. Si se añade logica al OnShown del formulario hijo, recordar hacer la llamada al padre (base.OnShown()) /// al finalizar la asignación de valores en los controles del propio formulario, así evitaremos que los parametros del A.D. se machaquen con los nuestros /// </summary> public virtual bool _EstablecerParametrosFormulario() { if (DesignMode) return true; bool llOk = false; if (this._ValoresAccesoDirecto.Count > 0) { string lcControl = "", lcPropiedad = ""; object lcValor = ""; foreach (KeyValuePair<string, object> loItem in this._ValoresAccesoDirecto) { //La key estara composada del "nom_control:propietat_a_definir" //El value contindra el valor de la propietat if (loItem.Key.Contains(":")) { lcControl = loItem.Key.Substring(0, loItem.Key.IndexOf(":")); lcPropiedad = loItem.Key.Substring(loItem.Key.IndexOf(":") + 1); lcValor = loItem.Value; //Recuperamos el control del formulario Control loControl = this.__FindControlRecursive(lcControl); if (loControl != null) { //Recuperamos la propiedad del Control Type myType = loControl.GetType(); PropertyInfo myPropInfo = myType.GetProperty(lcPropiedad); if (myPropInfo != null) { if (loControl is txtFiltroBase) { llOk = true; if (lcPropiedad == "_Desde") (loControl as txtFiltroBase)._oFiltroDesde._Codigo = Convert.ToString(lcValor); else if (lcPropiedad == "_Hasta") (loControl as txtFiltroBase)._oFiltroHasta._Codigo = Convert.ToString(lcValor); else if (lcPropiedad == "_Todos") (loControl as txtFiltroBase)._Todos = Convert.ToBoolean(lcValor); else if (lcPropiedad == "_Lista") (loControl as txtFiltroBase)._Lista = new List<string>(lcValor.ToString().Split(',')); } else { //Tratamiento de valores object lcRealValue = lcValor; if (loControl is ewcombobox && lcPropiedad.ToLower() == "selectedindex") lcRealValue = Convert.ToInt32(lcRealValue); else if ((loControl is ewcheckbox || loControl is ewradiobutton) && lcPropiedad.ToLower() == "checked") lcRealValue = Convert.ToBoolean(lcRealValue); //Establecemos el valor a la propiedad try { myPropInfo.SetValue(loControl, lcRealValue, null); llOk = true; } catch (Exception)// loEx) { //TODO : Errores derivados de establecer propiedades con tipos que no corresponden? //loEx = loEx; } } } } } } } return llOk; } //PE-85758 /// <summary> /// Método específico para disponer ShapeContainers /// </summary> /// <param name="toShapeContainer"></param> protected void _DisposeShapeContainer(Microsoft.VisualBasic.PowerPacks.ShapeContainer toShapeContainer) { if (toShapeContainer != null && !toShapeContainer.IsDisposed) { if (toShapeContainer.Shapes != null) { List<Microsoft.VisualBasic.PowerPacks.Shape> llisShapes = new List<Microsoft.VisualBasic.PowerPacks.Shape>(); foreach (Microsoft.VisualBasic.PowerPacks.Shape tshape in toShapeContainer.Shapes) { llisShapes.Add(tshape); } toShapeContainer.Shapes.Clear(); toShapeContainer.Shapes.Dispose(); foreach (Microsoft.VisualBasic.PowerPacks.Shape loShape in llisShapes) { loShape.Dispose(); } } toShapeContainer.Dispose(); } } [DllImport("user32")] private static extern IntPtr GetWindowDC(IntPtr hwnd); /// <summary> /// Método para el control de errores mediante objetos de tipo ErrorProvider. /// Se muestra un icono de error junto al control, sin efecto Blink y /// con el icono alineado al centro de la parte izquierda del control. /// => Es equivalente a _oErrorProvider.SetError(NombreControl, TextoError) pero alineando al icono /// Para liberar al control del error basta con repetir la llamada al método pero con el texto de /// error en blanco. /// </summary> /// <param name="toControl">Control sobre el que se va a establecer un icono de error.</param> /// <param name="tcMensaje">Mensaje de error. Si esta en blanco libera el control de la notificación de error</param> /// <param name="toAlineamiento">Alineamiento de la imagen</param> public virtual void _ControlError(Control toControl, string tcMensaje, ErrorIconAlignment toAlineamiento = ErrorIconAlignment.MiddleLeft) { _oErrorProvider.BlinkStyle = ErrorBlinkStyle.NeverBlink; _oErrorProvider.SetIconAlignment(toControl, toAlineamiento); // PARTE 93189. Se ha añadido el parámetro para poder pasarle la alineación _oErrorProvider.SetError(toControl, tcMensaje); // PE-92786. Obtener si ya hay algun error y concatenarlo string lcError = ""; if (!string.IsNullOrWhiteSpace(tcMensaje)) { lcError = this._oErrorProvider.GetError(this); lcError += (!string.IsNullOrWhiteSpace(lcError) ? Environment.NewLine : string.Empty) + tcMensaje; //if (toControl is IValidationControl) //{ // ((IValidationControl)toControl)._ErrorValidation = true; //} } //else //{ // if (toControl is IValidationControl) // { // ((IValidationControl)toControl)._ErrorValidation = false; // } //} } /// <summary> /// PE92638 /// Fa el ShowDialog però abans comprova l'accès al formulari /// </summary> public virtual void _ShowDialog() { if(CanShow()) ShowDialog(); } /// <summary> /// PE92638 /// Fa el Show però abans comprova l'accès al formulari /// </summary> public virtual void _Show() { if (CanShow()) Show(); } private bool CanShow() { if (this._NivelAcceso != _TiposAccesosPantalla.Denegado && !this.IsDisposed) //T114218 { if (_SaveReuseFormSettings && Usuario._This._PosicionFormulario) { using (FormManagerProperties loFormManagerProperties = new FormManagerProperties(this)) { _ReusingFormSettings = loFormManagerProperties._SetProperties(); } } return true; } return false; } private List<IButtonBarraHerram> _oListButtonsSagePanel = null; /// <summary> /// Lista de botones para el panel Sage50 /// </summary> internal List<IButtonBarraHerram> _ButtonsSagePanel { get { List<IButtonBarraHerram> loListButtonsAddons; if ( _oListButtonsSagePanel == null ) { _oListButtonsSagePanel = new List<IButtonBarraHerram>(); //Si la ayuda esta activa y hay ayuda o noticias if(AyudaActiva() && _oResultadoAyuda._Ayuda) _oListButtonsSagePanel.Add(new AyudaNoticiasPantalla(this, _oResultadoAyuda)); _oListButtonsSagePanel.Add(new AyudaPantalla(this)); _oListButtonsSagePanel.Add(new OpcionesPantalla(this)); // Comprobar si hay que mostrar la opción de configuración de mensajes por usuario/pantalla if (_messageBoxAutomatic) _oListButtonsSagePanel.Add(new CfgUsabilidad(this)); loListButtonsAddons = AddonsController.Instance.Methods.BindFormBarraHerram(_Pantalla); if (loListButtonsAddons is List<IButtonBarraHerram> && loListButtonsAddons.Count > 0) _oListButtonsSagePanel.AddRange(loListButtonsAddons); } return _oListButtonsSagePanel; } } /// <summary> /// PE-87849: Mostrar formulario de accesos mediante el usuario actual /// </summary> protected virtual void _Show_Accesos() { _Show_Accesos(_Pantalla); } /// <summary> /// Mostrar formulario de accesos mediante el usuario actual, para un formulario específico /// </summary> /// <param name="lcPantalla"></param> protected void _Show_Accesos(String lcPantalla) { // PE-92757. Usamos usuario estático if (!Usuario._This._Show_Gestion_Accesos(lcPantalla, _EliminarAcronimo(this.Text))) //PE-90297: pasamos el título de la pantalla también por si no existe en los accesos añadirlo { _MessageBox("El usuario activo no tiene permisos para gestionar accesos a pantallas.", MessageBoxButtons.OK, MessageBoxIcon.Stop, MessageBoxDefaultButton.Button1, DialogResult.OK); } } /// <summary> /// PE-87840: Mostrar formulario de favoritos mediante el usuario actual /// </summary> protected void _Show_Favoritos() { // PE-92757. Usamos usuario estático Usuario._This._Show_Favoritos(this._Pantalla, _EliminarAcronimo(this.Text)); //PE-92094: pasamos el título de la pantalla también, igual que en los accesos } /// <summary> /// PE-86720: mostrar la gestión de favoritos /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void gestiónDeFavoritosToolStripMenuItem_Click(object sender, EventArgs e) { this._Show_Favoritos(); } /// <summary> /// PE-86720: mostrar la gestión de accesos /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void gestiónDeAccesosToolStripMenuItem_Click(object sender, EventArgs e) { this._Show_Accesos(); } /// <summary> /// Crear acceso directo al formulario /// PE-95995 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void crearAccesoDirectoToolStripMenuItem_Click(object sender, EventArgs e) { this._AsignarValoresAccesoDirecto(); //Creem el acces directe sage.ew.functions.FUNCTIONS._CrearAccesoDirecto(_EliminarAcronimo(this.Text), this._Pantalla.Trim(), this._ValoresAccesoDirecto); } /// <summary> /// Método virtual que se invoca antes de crear el acceso directo y que nos servirá para definir /// los parámetros que se guradaran para el acceso directo a esta pantalla. /// </summary> /// <returns></returns> public virtual bool _AsignarValoresAccesoDirecto() { return false; } //PE-96746 /// <summary> /// Respuesta al click de crear apunte de calendario /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void crearApunteCalendarioItem_Click(object sender, EventArgs e) { functions.FUNCTIONS._CrearNuevoApunteCalendario(this, _Pantalla); } // PARTE 101745 /// <summary> /// Respuesta al click de ayuda de la pantalla /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ayudaPantallaToolStripMenuItem_Click(object sender, EventArgs e) { _MostrarAyudaPantalla(); } /// <summary> /// Mostrar la ayuda de la pantalla /// </summary> public void _MostrarAyudaPantalla() { // Bug 154751. Mostrar o no la ayuda // _PantallaAyuda tiene el valor de _Pantalla inicialmente // De este modo podemos tener una pantalla sin gestión de accesos con la ayuda correspondiente if (_MostrarAyudaF1) FUNCTIONS._MostrarAyudaPantalla(this._PantallaAyuda); } // FPARTE 101745 /// <summary> /// Task 104592: Evento para ejecutar la creación de tarea programada /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void crearTareaProgramadaItem_Click(object sender, EventArgs e) { _CrearTareaProgramada(this._Pantalla); } /// <summary> /// Evento para cargar una configuración de usuario/pantalla /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ConfiguracionesUsuarioItem_Click(object sender, EventArgs e) { ConfigUserForm loConfig; // Guardar "Última configuración" antes de abrir el editor de configuraciones //ConfigUserOptionsUpdateLastValues(); FormBase loFormClon = this.Clone(); loFormClon._ConfigUserForm = this._ConfigUserForm; loFormClon._ConfigUserOptionsEditing = true; loConfig = ConfigurationDesignManager.ShowInDesign(loFormClon, this._ConfigUserForm); if (loConfig is ConfigUserForm) { _ConfigUserForm = loConfig; _ConfigUserOptionsLoad(_ConfigUserForm._dicOpciones); } loFormClon.Close(); loFormClon.Dispose(); loFormClon = null; } #region Opciones de menu para listados personalizables /// <summary> /// Task 104592: Método virtual para crear una tarea programada (principalmente para el FormListado) /// </summary> /// <param name="tcPantalla"></param> protected virtual void _CrearTareaProgramada(string tcPantalla) { } /// <summary> /// Generar un nuevo listado personalizable a partir de un listado existente previamente /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void listadosPersonalizablesDuplicarItem_Click(object sender, EventArgs e) { this.Close(); ListadosPersonalizables loList = new ListadosPersonalizables(); if (!loList._DuplicarListado(this._Pantalla)) { sage.ew.functions.FUNCTIONS._MessageBox(loList._Error_Message, this.Text, //"Informes personalizables" MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1); } } /// <summary> /// Editar un listado personalizable previamente creado /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void listadosPersonalizablesEditarItem_Click(object sender, EventArgs e) { this.Close(); ListadosPersonalizables loList = new ListadosPersonalizables(); if (!loList._CargarListado(this._Pantalla)) { sage.ew.functions.FUNCTIONS._MessageBox(loList._Error_Message, this.Text, //"Informes personalizables" MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1); } } #endregion Opciones de menu para listados personalizables private void ShowPropertiesToolStripMenuItem_Click(object sender, EventArgs e) { if (Debugger.IsAttached) { if (_oTimerProperties is Timer) { ShowPropertiesToolStripMenuItem.Text = "Mostrar propiedades controles"; _InfoToolTip.Active = false; _oTimerProperties.Stop(); _oTimerProperties.Tick -= _oTimerProperties_Tick; _oTimerProperties.Dispose(); _oTimerProperties = null; } else { ShowPropertiesToolStripMenuItem.Text = "Ocultar propiedades controles"; _InfoToolTip.Active = true; _oTimerProperties = new Timer(); _oTimerProperties.Tick += _oTimerProperties_Tick; _oTimerProperties.Interval = 500; _oTimerProperties.Start(); } } } private void _oTimerProperties_Tick(object sender, EventArgs e) { Control loControl; Point loPos = Cursor.Position; if (Bounds.Contains(loPos)) { loControl = _GetChild(loPos, this); if ((loControl is Control && string.IsNullOrEmpty(_ControlNameShowing)) || (loControl is Control && loControl.Name != _ControlNameShowing)) { _ControlNameShowing = _InfoToolTip._GetControl(loControl).Name; _CreateTooltipInfo(loControl, loControl.DataBindings.Count > 0 ? loControl.Name : ""); if(!loControl.Enabled) _InfoToolTip.Show(loControl.Name, this, PointToClient(loPos)); } else if(loControl == null && !string.IsNullOrEmpty(_ControlNameShowing)) { _InfoToolTip.Hide(this); _ControlNameShowing = string.Empty; } } else { _ControlNameShowing = string.Empty; } } private void _CreateTooltipInfo(Control toControl, string tcText = "") { string lcText; lcText = string.IsNullOrEmpty(tcText) ? toControl.DataBindings.Count > 0 ? toControl.Name : "" : tcText; if (!string.IsNullOrEmpty(lcText)) _InfoToolTip._ControlToolTip(toControl, lcText); if (toControl.Controls.Count > 0) { foreach (Control loControl in toControl.Controls) { lcText = string.IsNullOrEmpty(tcText) ? loControl.DataBindings.Count > 0 ? loControl.Name : "" : tcText; if (!string.IsNullOrEmpty(lcText)) { _InfoToolTip._ControlToolTip(loControl, lcText); } if (loControl.Controls.Count > 0) { _CreateTooltipInfo(loControl, lcText); } } } } private string _ControlNameShowing; /// <summary> /// Obtener un Control situado en un point /// </summary> /// <param name="toPoint"></param> /// <param name="toBase"></param> /// <returns></returns> public Control _GetChild(Point toPoint, Control toBase) { Control loControl = null; if(toBase is Control) loControl = toBase.GetChildAtPoint(toBase.PointToClient(toPoint), GetChildAtPointSkip.Invisible | GetChildAtPointSkip.Transparent); return loControl?.Controls.Count > 0 && loControl?.DataBindings.Count == 0? _GetChild(toPoint, loControl) : loControl; } /// <summary> /// Mostrar la información relevante de la pantalla que llama este método. /// Se presentara la siguiente información: /// - Titulo del formulario /// - Librearia en la que esta contenido /// - Nombre de la clase del formulario /// - Pantalla (en caso de que esta definida) /// En mantenimientos y documentos se presentara también la información de los addons que modifiquen el formulario: /// - Nombre del addon / Libreria que carga (Si esta o no firmada y por quien) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void nombreFormularioToolStripMenuItem_Click(object sender, EventArgs e) { frmInfoFormul loFormul = new frmInfoFormul(); //Cabecera Información loFormul.AddHeader("Información"); //Titulo del formulario loFormul.AddLine("Título", _EliminarAcronimo(this.Text)); //Libreria loFormul.AddLine("Librería", System.Reflection.Assembly.GetAssembly(this.GetType()).Location); //Clase loFormul.AddLine("Clase", this.GetType().Name); //Pantalla. Presentamos el valo de _PantallaAyuda if (!string.IsNullOrWhiteSpace(_PantallaAyuda)) loFormul.AddLine("Pantalla", _PantallaAyuda.Trim().ToUpper()); //S50MIG-3188 Añadir namespace loFormul.AddLine("Namespace", GetType().Namespace); //Addons Dictionary<string, object> loAddons = null; if (this is FormMante && (this as FormMante)._ewMante != null && (this as FormMante)._ewMante._Addons != null) { loAddons = (this as FormMante)._ewMante._Addons; } else if (this is frmGestionPerfil && (this as frmGestionPerfil)._Documento != null && (this as frmGestionPerfil)._Documento._Addons != null) { loAddons = (this as frmGestionPerfil)._Documento._Addons; } else if (this is FormListado && (this as FormListado)._Addons != null) { loAddons = (this as FormListado)._Addons; } if (loAddons != null && loAddons.Count > 0) { //Cabecera addons loFormul.AddHeader("Add-ons"); //Info de addons string lcDllAddon = "", lcSubjectName = ""; foreach (KeyValuePair<string, object> loItem in loAddons) { try { // Obtenemos el objeto de extensiones y lo configuramos //loExtension = (_ExtensionMante)loItem.Value; string lcName = "", lcTmp = ""; if (AddonsController.Instance.AddonsManager.IsLoaded(loItem.Key)) { //Ruta a la dll lcDllAddon = (AddonsController.Instance.AddonsManager.GetAddon(loItem.Key) as IModulo)._Libreria + ".dll"; lcTmp = lcDllAddon; //Qui la firma lcSubjectName = FUNCTIONS.GetDllNameInfo(lcDllAddon); if (!string.IsNullOrWhiteSpace(lcSubjectName)) lcTmp += " (" + lcSubjectName + ")"; else lcTmp += " (Sin firmar)"; //Quin tipus es int lnTipo = (AddonsController.Instance.AddonsManager.GetAddon(loItem.Key) as IModulo)._Tipo; switch (lnTipo) { case 2: lcTmp += " - Extensión contratable"; break; case 3: lcTmp += " - Extensión personalizada"; break; case 1: case 0: default: lcTmp += " - Extensión incluida"; break; } //Nom del addon a mostrar lcName = (AddonsController.Instance.AddonsManager.GetAddon(loItem.Key) as IModulo)._Nombre2; if (string.IsNullOrWhiteSpace(lcName)) lcName = loItem.Key; //Afegim una linia per cada addon loFormul.AddLine(lcName, lcTmp); } } catch (Exception loError) { DB.Registrar_Error(loError); } } } //Mostramos el formulario loFormul._ShowDialog(); } /// <summary> /// Elimina el acronimo del texto /// </summary> /// <param name="toText"></param> /// <returns></returns> protected string _EliminarAcronimo(String toText) { String lcText = toText; if (!String.IsNullOrEmpty(_Acronimo)) lcText = lcText.Replace(_Acronimo, ""); lcText = lcText.TrimStart(); return lcText; } /// <summary> /// Respuesta al click de "Reordenar pantallas" (PE-120903) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void reordenarPantallasToolStripMenuItem_Click(object sender, EventArgs e) { // PE-103085 //NETVFP._Reordenar_Pantallas(); //NETVFP._Ejecutar_Funcion_VFP("fPripals50.Reordenar_pantallas"); } private void contextMenuStripPantalla_Opening(object sender, CancelEventArgs e) { contextMenuStripPantalla.Items["gestiónDeFavoritosToolStripMenuItem"].Image = sage.ew.images.Properties.Resources.favorite_16; contextMenuStripPantalla.Items["gestiónDeAccesosToolStripMenuItem"].Image = sage.ew.images.Properties.Resources.access_16; contextMenuStripPantalla.Items["crearAccesoDirectoToolStripMenuItem"].Image = sage.ew.images.Properties.Resources.link_16; contextMenuStripPantalla.Items["crearTareaProgramadaItem"].Image = sage.ew.images.Properties.Resources.TimeProgram; //TODO: utilizar otro icono contextMenuStripPantalla.Items["ShowPropertiesToolStripMenuItem"].Image = _oTimerProperties is null ? Resources.led_green_16 : Resources.led_red_16; bool lbSage50 = Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_sage50")); //Acces directe sols per a Sage50 if (!lbSage50) contextMenuStripPantalla.Items["crearAccesoDirectoToolStripMenuItem"].Visible = false; else contextMenuStripPantalla.Items["crearAccesoDirectoToolStripMenuItem"].Visible = _MostrarCrearAccesoDirecto; // PE-99866. Comprobar si mostar el ménu crear acceos directos //Task 104592: Crear tarea programada if (!lbSage50) contextMenuStripPantalla.Items["crearTareaProgramadaItem"].Visible = false; else contextMenuStripPantalla.Items["crearTareaProgramadaItem"].Visible = _MostrarCrearTareaProgramada; //PE-96746 contextMenuStripPantalla.Items["crearApunteCalendarioItem"].Image = sage.ew.images.Properties.Resources.calendar_16; //PE-103520 : listados personalizables contextMenuStripPantalla.Items["listadosPersonalizablesEditarItem"].Image = sage.ew.images.Properties.Resources.mant_edit_16; contextMenuStripPantalla.Items["listadosPersonalizablesDuplicarItem"].Image = sage.ew.images.Properties.Resources.duplicate_16; if (this is sage.ew.formul.Forms.FormListado) { if (!((sage.ew.formul.Forms.FormListado)this)._Personalizado) { contextMenuStripPantalla.Items["listadosPersonalizablesEditarItem"].Visible = false; if (!lbSage50) { contextMenuStripPantalla.Items["listadosPersonalizablesDuplicarItem"].Visible = false; } else { contextMenuStripPantalla.Items["listadosPersonalizablesDuplicarItem"].Visible = _MostrarDuplicarListado; } } } else { contextMenuStripPantalla.Items["listadosPersonalizablesEditarItem"].Visible = false; contextMenuStripPantalla.Items["listadosPersonalizablesDuplicarItem"].Visible = false; } ConfigureConfigUserOptions(); //PE-104540 - PE-104527 : Amagar l'opció de "Duplicar y editar el listado personalizable" //contextMenuStripPantalla.Items["listadosPersonalizablesDuplicarItem"].Visible = false; } /// <summary> /// Preparar menú de Configuraciones de usuario /// </summary> private void ConfigureConfigUserOptions() { configuracionesUsuarioItem.Image = sage.ew.images.Properties.Resources.icon_wrench; if (Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_sage50")) && _ConfigUserOptionsAllowed) { // Guardar "Última configuración" //ConfigUserOptionsUpdateLastValues(); configuracionesUsuarioItem.Visible = true; configuracionesUsuarioItemSeparator.Visible = true; configuracionesUsuarioItem.DropDownItems.Clear(); configuracionesUsuarioItem.DropDownItems.Add(toolConfiguracionesToolStripMenuItem); // Mostrar configuraciones de usuario IEnumerable<ConfigUserForm> loList = _ConfigUserForm._ListaConfiguraciones().AsEnumerable(); IEnumerable<ConfigUserForm> loListConfUsers = loList.Where(f => f._Tipo == ConfigUserForm.ConfigUserType.UserValuesConfig); IEnumerable<ConfigUserForm> loListDefaultConfUsers = loList.Where(f => f._Tipo != ConfigUserForm.ConfigUserType.UserValuesConfig); // Mostrar configuraciones del usuario _GenerateMenuItemsConfigUser(loListConfUsers.Where(f => !f._Publico)); // Mostrar configuraciones públicas _GenerateMenuItemsConfigUser(loListConfUsers.Where(f => f._Publico)); // Mostrar configuraciones base _GenerateMenuItemsConfigUser(loListDefaultConfUsers); } else { configuracionesUsuarioItem.Visible = false; configuracionesUsuarioItemSeparator.Visible = false; } } private void _GenerateMenuItemsConfigUser(IEnumerable<ConfigUserForm> toListConfigUsers) { if (toListConfigUsers != null && toListConfigUsers.Count() > 0) { configuracionesUsuarioItem.DropDownItems.Add(new ToolStripSeparator()); foreach (ConfigUserForm loConfig in toListConfigUsers) { ToolStripMenuItem loMenuItem = new ToolStripMenuItem(); loMenuItem.Text = loConfig._Config; loMenuItem.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); loMenuItem.Click += LoadConfigUserMenuItem_Click; loMenuItem.Tag = loConfig; if (_ConfigUserForm._Config.Trim() == loConfig._Config.Trim()) loMenuItem.Image = sage.ew.images.Properties.Resources.icon_right; configuracionesUsuarioItem.DropDownItems.Add(loMenuItem); } } } /// <summary> /// Evento para cargar configuración de usuario/pantalla des del menú de opciones /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void LoadConfigUserMenuItem_Click(object sender, EventArgs e) { if (sender is ToolStripMenuItem && ((ToolStripMenuItem)sender).Tag is ConfigUserForm) { ConfigUserForm loConfig = ((ToolStripMenuItem)sender).Tag as ConfigUserForm; // Antes de cargar la nueva configuración, guardamos "Última configuración" //ConfigUserOptionsUpdateLastValues(); // Cargar nueva configuración _ConfigUserForm = loConfig; _ConfigUserOptionsLoad(_oConfigUserForm._dicOpciones); } } /// <summary> /// PE-96746: Comprobamos si hay que mostrar o no el la opció de apunte de calendario /// </summary> /// <returns>True si es visible</returns> protected bool _PresentarApunteCalendario() { return sage.ew.functions.FUNCTIONS._PermitirApunteCalendario(_Pantalla); } #region Forzar Fuente /// <summary> /// Override OnShown /// </summary> /// <param name="e"></param> protected override void OnShown(EventArgs e) { base.OnShown(e); if (EW_GLOBAL._EsEjecutable && _CambiarFuente) { if (Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_sage50"))) { if (estiloRevisado == false) { foreach (Control loControl in Controls) { FUNCTIONS._Cambiar_Font(loControl, "Segoe UI"); } } } else { foreach (Control loControl in Controls) { FUNCTIONS._Cambiar_Font(loControl, "Arial"); } } } // Bug 111565. En caso de abrir un formulario en modo MODAL, no dejamos minimizarlo if (this.Modal) this.MinimizeBox = false; //Asignem els parametres del formulari suposant que en tingui this._EstablecerParametrosFormulario(); } #endregion Forzar Fuente /// <summary> /// Lista de toolStripMenuItems privada que se utiliza para poder gestionar las opciones del botón de opciones /// </summary> protected List<ToolStripMenuItemBase> _ToolStripMenuItemsBase = new List<ToolStripMenuItemBase>(); /// <summary> /// Nuevo ítems del menú de opciones /// /// Añade el ítem a la lista lstToolStripMenuItemBase para su posterior personalización /// </summary> /// <param name="tcNombre">Text del toolStripIEtem</param> /// <param name="tcNombre_Objeto">Nombre del objeto</param> /// <param name="tcTooltip">Tooltip del toolStripIEtem</param> /// <returns></returns> protected internal ToolStripMenuItemBase _AddToolStripMenuItemBase(string tcNombre, string tcNombre_Objeto, string tcTooltip) { ToolStripMenuItemBase loToolStripMenuItem = new ToolStripMenuItemBase(tcNombre, tcNombre_Objeto, tcTooltip); _ToolStripMenuItemsBase.Add(loToolStripMenuItem); return loToolStripMenuItem; } /// <summary> /// Notificamos a los subscriptores por si desean realizar una configuración de las opciones a presentar /// /// NOTA: únicamente operativo en los documentos de perfiles y asientos /// </summary> /// <param name="sender">Referencia al objeto de opciones</param> protected internal void _GetOpcionesInvoke(object sender) { if (this is frmGestionPerfil || this is contabilidad.frmAsientos || this is frmListasPrevias || this.Name == "frmPrincipal") _GetOpciones?.Invoke(new EventArgsOpciones(sender, _ToolStripMenuItemsBase)); else throw new Exception("Este formulario no tiene ningún botón de Opciones o no está preparado para acceder a él"); } /// <summary> /// Notificamos a los subscriptores por si desean añadir opciones en el botón de herramientas /// </summary> /// <param name="sender">Referencia al ContextMenu de opciones del botón de herramientas</param> /// <param name="tlstToolStripMenuItemsBase">Lista de ToolStripMenuItemBase</param> private void GetOpcionesHerramientasInvoke(object sender , List<ToolStripMenuItemBase> tlstToolStripMenuItemsBase) { _GetOpcionesHerramientas?.Invoke(new EventArgsOpciones(sender, tlstToolStripMenuItemsBase)); } // Task 111119 - 115209 /// <summary> /// Inserta un control a los formularios, actualmente solo implementado en el formulario de perfiles /// </summary> /// <param name="toControl">Control a añadir al formulario, ha de cumplir la interfaz IAddonTabDoc, IAddonBotonMenuDoc, ...</param> /// <returns>Devuelve si ha agregado el control al formulario</returns> public virtual bool _InsertarObjetoAddon(Control toControl) { bool lITabDocAddon = false, llOk = true; Control loControlContenedor = this; // Asignamos donde vamos a agregar los controles string lcNombre_Objeto = toControl.Name; lITabDocAddon = toControl is IAddonTabDoc; if (lITabDocAddon) llOk = AddonInsertarTabDocAddon(toControl, ref loControlContenedor); else if ((toControl is IAddonBotonMenuDoc) && (toControl is Button)) // Task 123210: Creación de botones en la barra de herramientas de los Mantes llOk = AddonBotonMenuDoc(toControl); if (llOk) loControlContenedor.Controls.Add(toControl); return llOk; } /// <summary> /// Inserta un sage.ew.botones.ToolStripButtonAddonMante a la barra de botones en los FormMante /// </summary> /// <param name="toolStripButtonAddonMante"></param> /// <returns></returns> public virtual bool _InsertarObjetoAddon(ToolStripItem toolStripButtonAddonMante) { return true; } /// <summary> /// Para agregar opciones mediante los Addons en los mantenimientos y en el formulario de asientos /// </summary> /// <param name="toMenuStrip"></param> protected internal virtual void _AddonPrepararMenu(ewcontextmenustrip toMenuStrip) { if (this.lstOpcionesMenuAddon != null && this.lstOpcionesMenuAddon.Count > 0) { string lcTituloMenu, lcName; bool llSeparador = true; foreach (Control loControl in this.lstOpcionesMenuAddon) { lcTituloMenu = ((IAddonBotonMenuDoc)loControl)._TituloMenu.Trim(); if (llSeparador && toMenuStrip.Items.Count > 0) // Añadimos un separador { toMenuStrip.Items.Add("-"); llSeparador = false; } toMenuStrip.Items.Add(lcTituloMenu); lcName = loControl.Name; if (string.IsNullOrWhiteSpace(lcName)) // Si el botón no tiene nombre le voy a asignar uno. Luego se realizará una búsqueda por el nombre del control { lcName = Convert.ToString(Guid.NewGuid()).ToUpper(); loControl.Name = lcName; } toMenuStrip.Items[toMenuStrip.Items.Count - 1].Name = lcName; toMenuStrip.Items[toMenuStrip.Items.Count - 1].Click += new EventHandler(FormManteOpcionesAddon_Click); } } } // FTask 123210: Creación de botones en la barra de herramientas de los Mantes /// <summary> /// Ejecutamos la acción del botón correspondiente añadido mediante los Addons /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FormManteOpcionesAddon_Click(object sender, EventArgs e) { string lcName = (sender as ToolStripMenuItem).Name; Control[] loControl = this.Controls.Find(lcName, true); if (loControl != null) { try { ((ewbutton)loControl[0]).Enabled = true; ((ewbutton)loControl[0]).PerformClick(); // No sabemos el código que se ha programado. Si da error ... } catch (Exception loEx) { if (Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_prueva")) || System.Diagnostics.Debugger.IsAttached) // Gestión de error this._MessageBox("Se ha producido la siguiente incidencia en la ejecución de la opción " + (sender as ToolStripMenuItem).Text.Trim() + ": " + Environment.NewLine + Environment.NewLine + loEx.Message, MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, DialogResult.OK); } } } /// <summary> /// Configuramos la clase "clsElementos" para poder instanciar correctamente el control dque cumple la interfaz "IAddonBotonMenuDoc" que se añadirán en el botón de opciones correspondiente /// </summary> /// <param name="toControl"></param> private bool AddonBotonMenuDoc(Control toControl) { IAddonBotonMenuDoc loIAddonBotonMenuDoc = (IAddonBotonMenuDoc)toControl; this.lstOpcionesMenuAddon.Add(toControl); // Añadimos la opción a la lista // La propiedad _Menu no la vamos a utilizar, únicamente es para los perfiles if (string.IsNullOrWhiteSpace(loIAddonBotonMenuDoc._TituloMenu) && toControl is ewbutton && !string.IsNullOrWhiteSpace(toControl.Text)) // Si no tiene título la opción, asignaremos el texto del botón loIAddonBotonMenuDoc._TituloMenu = toControl.Text; // Cambiamos la posición del control para que no se vea. No lo podemos hacer invisible o al hacer el PerformClick no se ejecutará toControl.Left = -10000; toControl.Top = -10000; toControl.Width = 1; toControl.Height = 1; AddonBotonMenuDocDocumento(toControl); return true; } /// <summary> /// Asignamos la referencia al documento al botón para realizar las acciones pertinentes /// </summary> /// <param name="toControl">Control de tipo IAddonBotonMenuDoc</param> private void AddonBotonMenuDocDocumento(Control toControl) { dynamic loDocumento = null; if (toControl is IAddonBotonMenuDoc) { if (this is FormMante) loDocumento = ((FormMante)this)._ewMante; else if (this is FormBaseDocumento) loDocumento = ((FormBaseDocumento)this)._Documento; if (loDocumento != null) { IAddonBotonMenuDoc loIAddonBotonMenuDoc = ((IAddonBotonMenuDoc)toControl); loIAddonBotonMenuDoc._Documento = loDocumento; } } } /// <summary> /// Realizamos el refresco recursivamente de los controles /// </summary> /// <param name="toContenedor">Objeto que puede ser contenedor de otros objetos</param> /// <param name="tlChild">Recorre si los diferentes controles del UserControl para ejecutar el _Refresh</param> private void ControlRefreshRecursive(Control toContenedor, bool tlChild = false) { if (!toContenedor.HasChildren) return; foreach (Control loControlChild in toContenedor.Controls) _ControlRefresh(loControlChild, tlChild); } /// <summary> /// Ejercución del método _Refresh del control /// </summary> /// <param name="toControl">Control al que se ejecutará el _Refresh</param> /// <param name="tlChild">Recorre si los diferentes controles del UserControl para ejecutar el _Refresh</param> public void _ControlRefresh(Control toControl, bool tlChild = false) { if (toControl == null) return; dynamic loControlDynamic = toControl; bool llRefresh = (toControl is IAddonTabDoc); if (llRefresh) { Type ltType = Type.GetType(loControlDynamic.GetType().AssemblyQualifiedName); MethodInfo objMethod = ltType.GetMethod("_Refresh"); // Busca la propiedad pública con el nombre especificado, si no la encuentra devuelve null llRefresh = (objMethod != null); } if (llRefresh) { try { loControlDynamic._Refresh(); } catch (Exception loEx) { if (Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_prueva")) || System.Diagnostics.Debugger.IsAttached) this._MessageBox("Se ha producido la siguiente incidencia en la ejecución del método Refresh del control " + toControl.Name + ": " + Environment.NewLine + Environment.NewLine + loEx.Message, MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, DialogResult.OK); } } ControlRefreshRecursive(toControl); } /// <summary> /// Asociación de la propiedad _Documento al Addon recursivamente /// </summary> /// <param name="toContenedor">Objeto que puede ser contenedor de otros objetos</param> /// /// <param name="toDocumento"></param> /// <param name="tlChild">Recorre si los diferentes controles del UserControl para asociar el _Documento</param> private void ControlDocumentoRecursive(Control toContenedor, dynamic toDocumento, bool tlChild = false) { if (!toContenedor.HasChildren) return; foreach (Control loControlChild in toContenedor.Controls) _ControlDocumento(loControlChild, toDocumento, tlChild); } /// <summary> /// Asociación de la propiedad _Documento al Addon /// </summary> /// <param name="toControl">Control al que se asignará el _Documento</param> /// <param name="toDocumento">Referencia al documento</param> /// <param name="tlChild">Recorre si los diferentes controles del UserControl para asociar el _Documento</param> public void _ControlDocumento(Control toControl, dynamic toDocumento, bool tlChild = false) { if (toControl == null || toDocumento == null) return; dynamic loControlDynamic = toControl; bool llDocumento = (toControl is IAddonTabDoc); if (!llDocumento) { Type ltType = Type.GetType(loControlDynamic.GetType().AssemblyQualifiedName); MemberInfo[] objMember = ltType.GetMember("_Documento"); llDocumento = (objMember.Length > 0); } if (llDocumento) { try { loControlDynamic._Documento = toDocumento; } catch (Exception loEx) { if (Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_prueva")) || System.Diagnostics.Debugger.IsAttached) this._MessageBox("Se ha producido la siguiente incidencia en la asignación del documento al control " + toControl.Name + ": " + Environment.NewLine + Environment.NewLine + loEx.Message, MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, DialogResult.OK); } } ControlDocumentoRecursive(toControl, toDocumento, tlChild); } /// <summary> /// Añadimos una addon en la página de en un ewtabcontrol /// </summary> /// <param name="toControl"></param> /// <param name="toControlContenedor"></param> /// <returns></returns> private bool AddonInsertarTabDocAddon(Control toControl, ref Control toControlContenedor) { bool llOk = false; ewtabcontrol loewtabcontrol = null; foreach (Control loControl in Controls) // De momento no es necesario realizarlo recursivamente { if (loControl is ewtabcontrol) { loewtabcontrol = (ewtabcontrol)loControl; break; } } if (loewtabcontrol != null) { Control loPagina = AddonNuevaPaginaTabDoc(toControl, loewtabcontrol); ewFlowLayoutPanel loewFlowLayoutPanel = this.AddonNuevoFlowLayoutPanel(); loewFlowLayoutPanel.Size = loewtabcontrol.TabPages[0].Size; // Asignamos las dimensiones de la primera página loewFlowLayoutPanel.Dock = DockStyle.Fill; loPagina.Controls.Add(loewFlowLayoutPanel); // Agregamos el flowlayout a la página para la gestión de las barras loPagina.Dock = DockStyle.Fill; toControlContenedor = loewFlowLayoutPanel; // Agregaremos el addon en el flowlayout de la página, por tanto actualizamos el controlContenedor llOk = true; } return llOk; } /// <summary> /// Instanciación de un "ewFlowLayoutPanel" que para que presenta las barras de desplazamiento si no cabe la totalidad del control que se pueda añadir /// </summary> /// <returns>Devuelve un "ewFlowLayoutPanel" para añadirlo en la página</returns> private ewFlowLayoutPanel AddonNuevoFlowLayoutPanel() { ewFlowLayoutPanel loewFlowLayoutPanel = new ewFlowLayoutPanel(); loewFlowLayoutPanel.AutoScroll = true; loewFlowLayoutPanel.WrapContents = true; //if llResizeAddon // loewFlowLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; // MEJORA: _Resize: Si nos interesa que el usuario gestiona el resize // loewFlowLayoutPanel.Size = toControl.Size; // Asignamos las dimensiones del control return loewFlowLayoutPanel; } /// <summary> /// Obtener el nombre de una página /// </summary> /// <param name="toewtabcontrol"></param> /// <returns></returns> private string AddonNombrePagina(ewtabcontrol toewtabcontrol) { string lcName = string.Empty; lcName = "AddonPagina" + Convert.ToString(toewtabcontrol.TabPages.Count); return lcName; } /// <summary> /// Añadimos una nueva página en un tabcontrol /// </summary> /// <param name="toControl"></param> /// <param name="toewtabcontrol"></param> /// <returns></returns> private Control AddonNuevaPaginaTabDoc(Control toControl, ewtabcontrol toewtabcontrol) { Control loControlewTabPage = null; string lcewtabcontrol = toewtabcontrol.Name, lcTitulo = string.Empty, lcName = string.Empty; IAddonTabDoc loIAddonTabDoc = (IAddonTabDoc)toControl; loControlewTabPage = new ewTabPage(); lcName = toControl.Name; if (string.IsNullOrWhiteSpace(lcName)) lcName = AddonNombrePagina(toewtabcontrol); loControlewTabPage.Name = lcName; loControlewTabPage.Text = loIAddonTabDoc._TituloPagina; // Indicamos el título de la página toewtabcontrol.Controls.Add(loControlewTabPage); if (loIAddonTabDoc._Principal) // Añadimos el tabpage como página principal { ewTabPage loewTabPage = (ewTabPage)loControlewTabPage; CambiarIndiceTabpage(toewtabcontrol, loewTabPage, 0); } return loControlewTabPage; } /// <summary> /// Reordenamos las páginas /// </summary> /// <param name="toewtabcontrol"></param> /// <param name="toewTabPage"></param> /// <param name="tnNuevoIndice"></param> private void CambiarIndiceTabpage(ewtabcontrol toewtabcontrol, ewTabPage toewTabPage, int tnNuevoIndice) { ewTabPage loewTabPage; int lnIndiceTabPage = toewtabcontrol.TabPages.IndexOf(toewTabPage); // Buscamos el índice de la página que hemos agregado for (int lnIndice = 0; lnIndice < lnIndiceTabPage; lnIndice++) { loewTabPage = (ewTabPage)toewtabcontrol.TabPages[0]; toewtabcontrol.TabPages.Remove(loewTabPage); toewtabcontrol.TabPages.Add(loewTabPage); } // toewtabcontrol.TabPages.Insert(tnNuevoIndice, toewTabPage); // De momento como no funciona, hemos realizado el recorrido de las diferentes páginas } // FTask 111119 - 115209 #region Ayuda contextual private bool _lFormActivated = true; private bool _lPresentandoAyuda = false; private BackgroundWorker _oBackgroundWorker; private FormPanelNotificaciones _oFormAyuda = null; /// <summary> /// Para guardar el título del formulario sin acrónimo ni sufijos /// </summary> private string _cTituloFormulario = ""; /// <summary> /// Estructura para gestionar el resultado del BakcGroundWorker /// </summary> public struct oResultadoAyuda { /// <summary> /// Indica si ha de presentar la ayuda /// </summary> public bool _Ayuda { get { return _lAyuda; } set { _lAyuda = value; } } bool _lAyuda; /// <summary> /// Instancia de la ayuda contextual /// </summary> public IAyudaContextual _AyudaContextual { get { return _oAyudaContextual; } set { _oAyudaContextual = value; } } IAyudaContextual _oAyudaContextual; /// <summary> /// Instancia del OnBoardingController /// </summary> public IOnBoardingController _OnBoardingController { get { return _oOnBoardingController; } set { _oOnBoardingController = value; } } IOnBoardingController _oOnBoardingController; } /// <summary> /// Controlamos que tenemos la ayuda activa /// </summary> /// <returns></returns> private bool AyudaActiva() { if (Usuario._This._Opcesp("5004")) // No presentar ayuda en pantallas de Sage 50c return false; bool llActiva = true; object loObject = EW_GLOBAL._GetVariable("wl_DesactivarOnBoarding"); if (loObject != null) { try { llActiva = !Convert.ToBoolean(loObject); // Tendremos que "wl_DesactivarOnBoarding" es true por eso negamos } catch (Exception) { } } return llActiva; } /// <summary> /// Indica que la pantalla relacionada con la ayuda contextual / ayuda de Sage 50 /// </summary> /// <returns></returns> protected virtual string _PantallaAyuda { get { return _Pantalla; } } /// <summary> /// Indica si ha de presentar el WalkTrought de la pantalla 0 /// </summary> private bool _lPantalla0Showed = false; /// <summary> /// Marcamos que ya ha realizado el Login y no teniamos cargada aún la ayuda contextual al entrar la primera vez /// </summary> private bool _lPantalla0ShowAfterLogin = false; /// <summary> /// Instanciación del BackgroundWorker de la ayuda contextual /// </summary> private void AyudaOnBoarding() { if (!IsDisposed && !Disposing ) { if (BarrasAyudaActivas()) { if (string.IsNullOrWhiteSpace(_PantallaAyuda) || !AyudaActiva() || botonayuda == eAyudaContextual.Desactivada) { _FormSagePanel?._Show(_ButtonsSagePanel, this); } else { // Declaro un nuevo elemento _oBackgroundWorker = new BackgroundWorker(); _oBackgroundWorker.WorkerSupportsCancellation = true; _oBackgroundWorker.WorkerReportsProgress = false; // Declaro los procesos _oBackgroundWorker.DoWork += new DoWorkEventHandler(_ExecuteRunWorkerAyuda); _oBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_RunWorkerCompletedAyuda); // Ejecución asíncrona _oBackgroundWorker.RunWorkerAsync(); } } } } private bool BarrasAyudaActivas() { DataTable loDt = new DataTable(); string lcDataBase, lcComunes, lcSql; if (!EW_GLOBAL._ContainsKey("wl_barras_ayuda_form")) { lcComunes = GrupoEmpresa._DbComunesRealGrupoPripal(); lcDataBase = DB.SQLDatabaseReal(lcComunes, "VARIABLE"); lcSql = $"SELECT VALOR FROM {lcDataBase} WHERE VARIABLE = 'NO_AYUDA' "; if(DB.SQLExec(lcSql, ref loDt)) EW_GLOBAL.ValorEnClave_VarGlob("wl_barras_ayuda_form", loDt.Rows.Count == 0); } return Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_barras_ayuda_form", true)); } /// <summary> /// Método que define el proceso que se va a ejecutar en segundo plano de la ayuda contextual /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void _ExecuteRunWorkerAyuda(object sender, DoWorkEventArgs e) { oResultadoAyuda loResult = new oResultadoAyuda(); loResult._Ayuda = false; // Asignamos el false por defecto try { IOnBoardingController loOnBoardingController = FUNCTIONS._OnBoardingController(); if (loOnBoardingController != null && !loOnBoardingController._PlayingVideo) { IAyudaContextual loAyudaContextual = new AyudaContextual(loOnBoardingController); loAyudaContextual._Load(_PantallaAyuda.ToUpper()); if (loAyudaContextual != null && (loAyudaContextual._Categorias.Count > 0 || loAyudaContextual._NumeroTotalNoticias > 0)) { loResult._OnBoardingController = loOnBoardingController; loResult._AyudaContextual = loAyudaContextual; loResult._Ayuda = true; } } } catch (Exception loEx) { DB.Registrar_Error(loEx); } e.Result = loResult; // Asignamos el retorno } /// <summary> /// Método que se ejecutará al finalizar el proceso de consulta de la ayuda contextual /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void _RunWorkerCompletedAyuda(object sender, RunWorkerCompletedEventArgs e) { if (!e.Cancelled && e.Error == null &&!FormDisposed()) // Si no he sido cancelado ni he registrado excepción { _oResultadoAyuda = ((oResultadoAyuda)e.Result); if (_oResultadoAyuda._Ayuda) _BotonAyuda = eAyudaContextual.Si; //CambiarBotonAyudaMensaje(); if (PresentarAyudaNuevasNoticias(_oResultadoAyuda)) { if (EsPantalla0) { _oResultadoAyuda._Ayuda = true; if (_lPantalla0ShowAfterLogin && !_lPantalla0Showed && Ayuda_FormularioActivo()) // Si ha entrado el Usuario y no ha presentado aún el WalkTrought, ahora lo presentamos si no hay ninguna pantalla abierta _WalkthroughsPantalla0(); } //else // MostrarAyuda(_oResultadoAyuda._AyudaContextual); } _FormSagePanel?._Show(_ButtonsSagePanel, this); } } /// <summary> /// Controlamos si es necesario presentar las noticias relacionadas con la pantalla /// Tenemos dos casos: /// /// 1. Si tenemos activada la ayuda y tenemos noticias /// 2. Existe alguna noticia nueva. La presentamos igualmente /// </summary> /// <param name="toResultadoAyuda"></param> /// <returns></returns> private bool PresentarAyudaNuevasNoticias(oResultadoAyuda toResultadoAyuda) { // Si la pantalla no tiene ayuda podemos salir if (!_oResultadoAyuda._Ayuda) return false; // Tenemos activada la ayuda if ( _oResultadoAyuda._AyudaContextual._PresentacionAyuda != Presentacion.No) return true; // Existe alguna noticia nueva a partir de la fecha que el usuario marcó no volver a presentar la ayuda if (_oResultadoAyuda._AyudaContextual._NoticiasNuevasPendientesLeer > 0) return true; return false; } /// <summary> /// Devuelve si es la pantalla 0 donde presentaremos el formulario frmWalktrhoughs si es necesario /// </summary> private bool EsPantalla0 { get { return _PantallaAyuda == "PANTALLA0"; } } /// <summary> /// Presentamos la pantalla de los Walktrhough si es necesario /// </summary> /// <returns></returns> protected bool _WalkthroughsPantalla0() { _lPantalla0ShowAfterLogin = true; // Marcamos que ya ha pasado por el AfterLogin que es el único lugar de donde se realiza la llamada if (EsPantalla0 && !FUNCTIONS._CanUseWebView()) // No presentamos mensaje, validamos si tenemos el RunTime del WebView2 independientemente de que tengamos o no información de la pantalla 0 return false; if (_oResultadoAyuda._Ayuda == false || !EsPantalla0 || _lPantalla0Showed) return false; _lPantalla0Showed = true; // De momento marcamos que ya se ha visto o podrian salir dos instancias IOnBoardingController loOnBoardingController = FUNCTIONS._OnBoardingController(); if (loOnBoardingController != null) { _lPantalla0Showed = ((OnBoardingControllerSage50)loOnBoardingController)._ShowWalkthroughs(_oResultadoAyuda._AyudaContextual); return _lPantalla0Showed; } else return false; } /// <summary> /// Calculamos la posición del formulario de ayuda del OnBoarding /// </summary> /// <param name="toRectangle">Rectangle del formualrio de ayuda</param> /// <returns></returns> private Point CalculateLocationAyuda(Rectangle toRectangle) { Rectangle loRectScreen = Screen.PrimaryScreen.WorkingArea; Point loPoint = toRectangle.Location; int lnOffsetX = 20, lnOffsetY = 50; if (Location.X < 0) // Tenemos pantallas como los mantenimientos o perfiles donde el formulario se presenta en una posición fuera de la area visible { loPoint.X = (loRectScreen.Width / 2) + (Size.Width / 2) - lnOffsetX; loPoint.Y = (loRectScreen.Height / 2) - (Size.Height / 2) + lnOffsetY; } else { loPoint.X = Location.X + Size.Width - lnOffsetX; loPoint.Y = Location.Y + lnOffsetY; } if (loPoint.X + toRectangle.Size.Width > loRectScreen.Width) loPoint.X = loRectScreen.Width - lnOffsetX - toRectangle.Width; if (loPoint.Y + toRectangle.Size.Height > loRectScreen.Height) loPoint.Y = (loRectScreen.Height / 2) - (toRectangle.Height / 2); return loPoint; } /// <summary> /// Posicionaremos la pantalla donde el usuario la dejó previamente /// Controlamos que sea en una area visible /// </summary> /// <param name="toAyudaContextual">Referencia a la ayuda contextual</param> private void LocationAyuda(IAyudaContextual toAyudaContextual) { Point loPoint = new Point(toAyudaContextual._Left, toAyudaContextual._Top); if (loPoint == new Point(0, 0) || loPoint.X > Screen.PrimaryScreen.Bounds.Size.Width || loPoint.Y > Screen.PrimaryScreen.Bounds.Size.Height) { loPoint = CalculateLocationAyuda(_oFormAyuda.Bounds); } if (toAyudaContextual._Height > 0) { Size loSize = _oFormAyuda.Size; loSize.Height = toAyudaContextual._Height; if (_oFormAyuda.Size != loSize) _oFormAyuda.Size = loSize; } _oFormAyuda.Location = loPoint; } /// <summary> /// Controlamos si el formulario se está destruyendo /// </summary> /// <returns></returns> protected virtual bool FormDisposed() { return (IsDisposed || Disposing); } private void CambiarBotonAyudaMensaje() { if (!EsPantalla0 && _oResultadoAyuda._AyudaContextual != null && !FormDisposed()) { int numnoticias = _oResultadoAyuda._AyudaContextual._NoticiasPendientesLeer; if(menu is IActiveMenu) { foreach (ActiveButton item in menu.Items) { if (item.Name == "Ayuda") { // NOTICIAS ONBOARDING. Si tenemos noticias, sustituimos icono de Info por la Campana if (numnoticias > 0) { string lcTooltip = " Noticias"; item.ForeColor = Color.FromArgb(0, 129, 70); item.Font = new Font("Segoe UI", 8.5F); item._ModColors = false; if (numnoticias == 1) { item.Text = "1"; lcTooltip = " Noticia"; } else if (numnoticias < 100) item.Text = numnoticias.ToString().Trim(); else item.Text = "99+"; item.Image = sage.ew.images.Properties.Resources.bell_green_16; menu.ToolTip.SetToolTip(item, item.Text+lcTooltip); item.ChangeColors(); } break; } } } } } /// <summary> /// Gestión de la presentación del formulario de configuración de usabilidad /// </summary> private void MostrarCfgUsabilidad() { // En el formulario de configuración se comprueba si hay mensajes configurados en el formulario/usuario actual // y se muestra mensaje sino hay y se cierra. frmUserFormConfig frmCfg = new frmUserFormConfig(Usuario._This._Codigo, this._Pantalla, this._ObtenerText(false)); frmCfg._ShowDialog(); } /// <summary> /// Gestión de la presentación de la ayuda contextual /// </summary> /// <param name="toAyudaContextual">Instancia de la ayuda contextual cuando venimos del BackGroundWordker</param> private void MostrarAyuda(IAyudaContextual toAyudaContextual = null) { if (_oFormAyuda != null && !_oFormAyuda.IsDisposed && !_oFormAyuda.Disposing) { ShowAyuda(); return; } if (FormDisposed()) return; IOnBoardingController loOnBoardingController = FUNCTIONS._OnBoardingController(); if (toAyudaContextual == null) // Venimos del botón de opciones. Se ha de instanciar la ayuda contextual { toAyudaContextual = new AyudaContextual(loOnBoardingController); toAyudaContextual._Load(_Pantalla.ToUpper()); ((OnBoardingControllerSage50)loOnBoardingController)._WebService("mostrar", tcPantalla: _Pantalla.ToUpper()); // Acción de mostrar ayuda } if (FormDisposed()) return; _oFormAyuda = new FormPanelNotificaciones(_Pantalla.ToUpper(), Text, loOnBoardingCont³nDeFavoritosToolStripMenuItem,
4310  this.gestiÃnDeAccesosToolStripMenuItem, this.crearAccesoDirectoToolStripMenuItem, this.crearTareaProgramadaItem, this.crearApunteCalendarioItem, this.listadosPersonalizablesEditarItem, this.listadosPersonalizablesDuplicarItem, this.ayudaPantallaToolStripMenuItem, this.ShowPropertiesToolStripMenuItem}); this.contextMenuStripPantalla.Name = "contextMenuStripPantalla"; this.contextMenuStripPantalla.Size = new System.Drawing.Size(289, 230); // // configuracionesUsuarioItem // this.configuracionesUsuarioItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolConfiguracionesToolStripMenuItem}); this.configuracionesUsuarioItem.Name = "configuracionesUsuarioItem"; this.configuracionesUsuarioItem.Size = new System.Drawing.Size(288, 22); this.configuracionesUsuarioItem.Text = "Configuraciones de usuario"; // // toolConfiguracionesToolStripMenuItem // this.toolConfiguracionesToolStripMenuItem.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.toolConfiguracionesToolStripMenuItem.Name = "toolConfiguracionesToolStripMenuItem"; this.toolConfiguracionesToolStripMenuItem.Size = new System.Drawing.Size(221, 22); this.toolConfiguracionesToolStripMenuItem.Text = "Diseñador configuraciones"; // // configuracionesUsuarioItemSeparator // this.configuracionesUsuarioItemSeparator.Name = "configuracionesUsuarioItemSeparator"; this.configuracionesUsuarioItemSeparator.Size = new System.Drawing.Size(285, 6); // // nombreFormularioToolStripMenuItem // this.nombreFormularioToolStripMenuItem.Name = "nombreFormularioToolStripMenuItem"; this.nombreFormularioToolStripMenuItem.Size = new System.Drawing.Size(288, 22); this.nombreFormularioToolStripMenuItem.Text = "Nombre del formulario"; // // ShowPropertiesToolStripMenuItem // this.ShowPropertiesToolStripMenuItem.Name = "ShowPropertiesToolStripMenuItem"; this.ShowPropertiesToolStripMenuItem.Size = new System.Drawing.Size(288, 22); this.ShowPropertiesToolStripMenuItem.Text = "Mostrar propiedades controles"; // // gestiónDeFavoritosToolStripMenuItem // this.gestiónDeFavoritosToolStripMenuItem.Name = "gestiónDeFavoritosToolStripMenuItem"; this.gestiónDeFavoritosToolStripMenuItem.Size = new System.Drawing.Size(288, 22); this.gestiónDeFavoritosToolStripMenuItem.Text = "Gestión de favoritos"; // // gestiónDeAccesosToolStripMenuItem // this.gestiónDeAccesosToolStripMenuItem.Name = "gestiónDeAccesosToolStripMenuItem"; this.gestiónDeAccesosToolStripMenuItem.Size = new System.Drawing.Size(288, 22); this.gestiónDeAccesosToolStripMenuItem.Text = "Gestión de accesos"; // // crearAccesoDirectoToolStripMenuItem // this.crearAccesoDirectoToolStripMenuItem.Name = "crearAccesoDirectoToolStripMenuItem"; this.crearAccesoDirectoToolStripMenuItem.Size = new System.Drawing.Size(288, 22); this.crearAccesoDirectoToolStripMenuItem.Text = "Crear acceso directo"; // // crearTareaProgramadaItem // this.crearTareaProgramadaItem.Name = "crearTareaProgramadaItem"; this.crearTareaProgramadaItem.Size = new System.Drawing.Size(288, 22); this.crearTareaProgramadaItem.Text = "Crear tarea programada"; // // crearApunteCalendarioItem // this.crearApunteCalendarioItem.Name = "crearApunteCalendarioItem"; this.crearApunteCalendarioItem.Size = new System.Drawing.Size(288, 22); this.crearApunteCalendarioItem.Text = "Nue&vo apunte calendario"; // // listadosPersonalizablesEditarItem // this.listadosPersonalizablesEditarItem.Name = "listadosPersonalizablesEditarItem"; this.listadosPersonalizablesEditarItem.Size = new System.Drawing.Size(288, 22); this.listadosPersonalizablesEditarItem.Text = "Editar el listado personalizable"; // // listadosPersonalizablesDuplicarItem // this.listadosPersonalizablesDuplicarItem.Name = "listadosPersonalizablesDuplicarItem"; this.listadosPersonalizablesDuplicarItem.Size = new System.Drawing.Size(288, 22); this.listadosPersonalizablesDuplicarItem.Text = "Duplicar y editar el listado personalizable"; // // ayudaPantallaToolStripMenuItem // this.ayudaPantallaToolStripMenuItem.Name = "ayudaPantallaToolStripMenuItem"; this.ayudaPantallaToolStripMenuItem.Size = new System.Drawing.Size(288, 22); this.ayudaPantallaToolStripMenuItem.Text = "Ayuda"; // // _MenuContext_Opciones // this._MenuContext_Opciones.Font = new System.Drawing.Font("Segoe UI", 9.5F); this._MenuContext_Opciones.Name = "ewcontextmenustripOpcProc"; this._MenuContext_Opciones.Size = new System.Drawing.Size(61, 4); // // FormBase // this.ClientSize = new System.Drawing.Size(284, 262); this.KeyPreview = true; this.Name = "FormBase"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; ((System.ComponentModel.ISupportInitialize)(this._oErrorProvider)).EndInit(); this.contextMenuStripPantalla.ResumeLayout(false); this.ResumeLayout(false); } /// <summary> /// Devuelve una lista de los controles del tipo especificado /// Si no pasamos ningún control lo busca en todo el formulario /// </summary> /// <typeparam name="T"></typeparam> /// <param name="toControl"></param> /// <returns></returns> public List<T> _FindControl<T>(Control toControl = null) { if (toControl == null) toControl = this; List<T> lstControls = new List<T>(); lstControls = AllControls(toControl).OfType<T>().ToList(); return lstControls; } /// <summary> /// Devuelve todos los controles /// </summary> /// <param name="container"></param> /// <returns></returns> private IEnumerable<Control> AllControls(Control container) { foreach (Control control in container.Controls) { yield return control; foreach (var innerControl in AllControls(control)) yield return innerControl; } } /// <summary> /// Capturamos el metodo para capturar los posibles mensajes enviados desde Eurowin (VFP) /// </summary> /// <param name="msgEW"></param> protected override void WndProc(ref Message msgEW) { if (msgEW.Msg != WM_SYSCOMMAND || (msgEW.Msg == WM_SYSCOMMAND && ( _ExecuteCommandBefore == null || _ExecuteCommandBefore.Invoke(this, msgEW.WParam)))) { base.WndProc(ref msgEW); if (EW_GLOBAL._EsEjecutable) { //TODO: Temporal hasta que veamos que pasa realmente if (!System.Diagnostics.Debugger.IsAttached && !NETVFP._ReceiveMessageFromVfp(ref msgEW)) return; } } } /// <summary> /// PE-77741 /// Evento para realizar las mismas comprobaciones que en el método análogo de la pantalla de fox /// En los distintos formularios de .net donde se quiera realizar este control, habrá que sobreescribir este evento /// teniendo en cuenta que el objeto "taParams" es un array de objetos con los mismos parámetros y valores que en el /// formulario equivalente de fox. /// </summary> /// <param name="taParams"></param> /// <returns></returns> public virtual bool _Init(object[] taParams) { if (taParams.Count() > 0) { _lAutomatico = true; //Bug 206971: Para poder saber en el formbase si estamos en una tarea programada } return true; } // FI PE-77741 /// <summary> /// Método virtual que se invoca siempre que se muestra un formulario. /// Nos sirve para recuperar los parametros del acceso directo. /// </summary> /// <param name="taParams">Parametros de inicio</param> public virtual bool _InitAccesoDirecto(object[] taParams) { // Obtención de los parámetros según pantalla if (taParams != null && taParams.Length > 0) { foreach (object loItem in taParams) { //Si trobem un parametre que començi per "idparam:" es que tenin propietats guardades a COMUNES!ACDIRPARAM if (loItem.ToString().StartsWith(FUNCTIONS._AccesoDirectoParametro)) { //Recuperem les propietats que mes tard asignarem al OnShown return FUNCTIONS._RecuperarParametrosAccesoDirecto(loItem.ToString(), ref this._ValoresAccesoDirecto); } } } return false; } /// <summary> /// Método virtual genérico para asignar los valores de los parametros de acceso directo en los controls del formulario a partir de la propiedad _ValoresAccesoDirecto. /// Se llama en el OnShown del formulario. Si se añade logica al OnShown del formulario hijo, recordar hacer la llamada al padre (base.OnShown()) /// al finalizar la asignación de valores en los controles del propio formulario, así evitaremos que los parametros del A.D. se machaquen con los nuestros /// </summary> public virtual bool _EstablecerParametrosFormulario() { if (DesignMode) return true; bool llOk = false; if (this._ValoresAccesoDirecto.Count > 0) { string lcControl = "", lcPropiedad = ""; object lcValor = ""; foreach (KeyValuePair<string, object> loItem in this._ValoresAccesoDirecto) { //La key estara composada del "nom_control:propietat_a_definir" //El value contindra el valor de la propietat if (loItem.Key.Contains(":")) { lcControl = loItem.Key.Substring(0, loItem.Key.IndexOf(":")); lcPropiedad = loItem.Key.Substring(loItem.Key.IndexOf(":") + 1); lcValor = loItem.Value; //Recuperamos el control del formulario Control loControl = this.__FindControlRecursive(lcControl); if (loControl != null) { //Recuperamos la propiedad del Control Type myType = loControl.GetType(); PropertyInfo myPropInfo = myType.GetProperty(lcPropiedad); if (myPropInfo != null) { if (loControl is txtFiltroBase) { llOk = true; if (lcPropiedad == "_Desde") (loControl as txtFiltroBase)._oFiltroDesde._Codigo = Convert.ToString(lcValor); else if (lcPropiedad == "_Hasta") (loControl as txtFiltroBase)._oFiltroHasta._Codigo = Convert.ToString(lcValor); else if (lcPropiedad == "_Todos") (loControl as txtFiltroBase)._Todos = Convert.ToBoolean(lcValor); else if (lcPropiedad == "_Lista") (loControl as txtFiltroBase)._Lista = new List<string>(lcValor.ToString().Split(',')); } else { //Tratamiento de valores object lcRealValue = lcValor; if (loControl is ewcombobox && lcPropiedad.ToLower() == "selectedindex") lcRealValue = Convert.ToInt32(lcRealValue); else if ((loControl is ewcheckbox || loControl is ewradiobutton) && lcPropiedad.ToLower() == "checked") lcRealValue = Convert.ToBoolean(lcRealValue); //Establecemos el valor a la propiedad try { myPropInfo.SetValue(loControl, lcRealValue, null); llOk = true; } catch (Exception)// loEx) { //TODO : Errores derivados de establecer propiedades con tipos que no corresponden? //loEx = loEx; } } } } } } } return llOk; } //PE-85758 /// <summary> /// Método específico para disponer ShapeContainers /// </summary> /// <param name="toShapeContainer"></param> protected void _DisposeShapeContainer(Microsoft.VisualBasic.PowerPacks.ShapeContainer toShapeContainer) { if (toShapeContainer != null && !toShapeContainer.IsDisposed) { if (toShapeContainer.Shapes != null) { List<Microsoft.VisualBasic.PowerPacks.Shape> llisShapes = new List<Microsoft.VisualBasic.PowerPacks.Shape>(); foreach (Microsoft.VisualBasic.PowerPacks.Shape tshape in toShapeContainer.Shapes) { llisShapes.Add(tshape); } toShapeContainer.Shapes.Clear(); toShapeContainer.Shapes.Dispose(); foreach (Microsoft.VisualBasic.PowerPacks.Shape loShape in llisShapes) { loShape.Dispose(); } } toShapeContainer.Dispose(); } } [DllImport("user32")] private static extern IntPtr GetWindowDC(IntPtr hwnd); /// <summary> /// Método para el control de errores mediante objetos de tipo ErrorProvider. /// Se muestra un icono de error junto al control, sin efecto Blink y /// con el icono alineado al centro de la parte izquierda del control. /// => Es equivalente a _oErrorProvider.SetError(NombreControl, TextoError) pero alineando al icono /// Para liberar al control del error basta con repetir la llamada al método pero con el texto de /// error en blanco. /// </summary> /// <param name="toControl">Control sobre el que se va a establecer un icono de error.</param> /// <param name="tcMensaje">Mensaje de error. Si esta en blanco libera el control de la notificación de error</param> /// <param name="toAlineamiento">Alineamiento de la imagen</param> public virtual void _ControlError(Control toControl, string tcMensaje, ErrorIconAlignment toAlineamiento = ErrorIconAlignment.MiddleLeft) { _oErrorProvider.BlinkStyle = ErrorBlinkStyle.NeverBlink; _oErrorProvider.SetIconAlignment(toControl, toAlineamiento); // PARTE 93189. Se ha añadido el parámetro para poder pasarle la alineación _oErrorProvider.SetError(toControl, tcMensaje); // PE-92786. Obtener si ya hay algun error y concatenarlo string lcError = ""; if (!string.IsNullOrWhiteSpace(tcMensaje)) { lcError = this._oErrorProvider.GetError(this); lcError += (!string.IsNullOrWhiteSpace(lcError) ? Environment.NewLine : string.Empty) + tcMensaje; //if (toControl is IValidationControl) //{ // ((IValidationControl)toControl)._ErrorValidation = true; //} } //else //{ // if (toControl is IValidationControl) // { // ((IValidationControl)toControl)._ErrorValidation = false; // } //} } /// <summary> /// PE92638 /// Fa el ShowDialog però abans comprova l'accès al formulari /// </summary> public virtual void _ShowDialog() { if(CanShow()) ShowDialog(); } /// <summary> /// PE92638 /// Fa el Show però abans comprova l'accès al formulari /// </summary> public virtual void _Show() { if (CanShow()) Show(); } private bool CanShow() { if (this._NivelAcceso != _TiposAccesosPantalla.Denegado && !this.IsDisposed) //T114218 { if (_SaveReuseFormSettings && Usuario._This._PosicionFormulario) { using (FormManagerProperties loFormManagerProperties = new FormManagerProperties(this)) { _ReusingFormSettings = loFormManagerProperties._SetProperties(); } } return true; } return false; } private List<IButtonBarraHerram> _oListButtonsSagePanel = null; /// <summary> /// Lista de botones para el panel Sage50 /// </summary> internal List<IButtonBarraHerram> _ButtonsSagePanel { get { List<IButtonBarraHerram> loListButtonsAddons; if ( _oListButtonsSagePanel == null ) { _oListButtonsSagePanel = new List<IButtonBarraHerram>(); //Si la ayuda esta activa y hay ayuda o noticias if(AyudaActiva() && _oResultadoAyuda._Ayuda) _oListButtonsSagePanel.Add(new AyudaNoticiasPantalla(this, _oResultadoAyuda)); _oListButtonsSagePanel.Add(new AyudaPantalla(this)); _oListButtonsSagePanel.Add(new OpcionesPantalla(this)); // Comprobar si hay que mostrar la opción de configuración de mensajes por usuario/pantalla if (_messageBoxAutomatic) _oListButtonsSagePanel.Add(new CfgUsabilidad(this)); loListButtonsAddons = AddonsController.Instance.Methods.BindFormBarraHerram(_Pantalla); if (loListButtonsAddons is List<IButtonBarraHerram> && loListButtonsAddons.Count > 0) _oListButtonsSagePanel.AddRange(loListButtonsAddons); } return _oListButtonsSagePanel; } } /// <summary> /// PE-87849: Mostrar formulario de accesos mediante el usuario actual /// </summary> protected virtual void _Show_Accesos() { _Show_Accesos(_Pantalla); } /// <summary> /// Mostrar formulario de accesos mediante el usuario actual, para un formulario específico /// </summary> /// <param name="lcPantalla"></param> protected void _Show_Accesos(String lcPantalla) { // PE-92757. Usamos usuario estático if (!Usuario._This._Show_Gestion_Accesos(lcPantalla, _EliminarAcronimo(this.Text))) //PE-90297: pasamos el título de la pantalla también por si no existe en los accesos añadirlo { _MessageBox("El usuario activo no tiene permisos para gestionar accesos a pantallas.", MessageBoxButtons.OK, MessageBoxIcon.Stop, MessageBoxDefaultButton.Button1, DialogResult.OK); } } /// <summary> /// PE-87840: Mostrar formulario de favoritos mediante el usuario actual /// </summary> protected void _Show_Favoritos() { // PE-92757. Usamos usuario estático Usuario._This._Show_Favoritos(this._Pantalla, _EliminarAcronimo(this.Text)); //PE-92094: pasamos el título de la pantalla también, igual que en los accesos } /// <summary> /// PE-86720: mostrar la gestión de favoritos /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void gestiónDeFavoritosToolStripMenuItem_Click(object sender, EventArgs e) { this._Show_Favoritos(); } /// <summary> /// PE-86720: mostrar la gestión de accesos /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void gestiónDeAccesosToolStripMenuItem_Click(object sender, EventArgs e) { this._Show_Accesos(); } /// <summary> /// Crear acceso directo al formulario /// PE-95995 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void crearAccesoDirectoToolStripMenuItem_Click(object sender, EventArgs e) { this._AsignarValoresAccesoDirecto(); //Creem el acces directe sage.ew.functions.FUNCTIONS._CrearAccesoDirecto(_EliminarAcronimo(this.Text), this._Pantalla.Trim(), this._ValoresAccesoDirecto); } /// <summary> /// Método virtual que se invoca antes de crear el acceso directo y que nos servirá para definir /// los parámetros que se guradaran para el acceso directo a esta pantalla. /// </summary> /// <returns></returns> public virtual bool _AsignarValoresAccesoDirecto() { return false; } //PE-96746 /// <summary> /// Respuesta al click de crear apunte de calendario /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void crearApunteCalendarioItem_Click(object sender, EventArgs e) { functions.FUNCTIONS._CrearNuevoApunteCalendario(this, _Pantalla); } // PARTE 101745 /// <summary> /// Respuesta al click de ayuda de la pantalla /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ayudaPantallaToolStripMenuItem_Click(object sender, EventArgs e) { _MostrarAyudaPantalla(); } /// <summary> /// Mostrar la ayuda de la pantalla /// </summary> public void _MostrarAyudaPantalla() { // Bug 154751. Mostrar o no la ayuda // _PantallaAyuda tiene el valor de _Pantalla inicialmente // De este modo podemos tener una pantalla sin gestión de accesos con la ayuda correspondiente if (_MostrarAyudaF1) FUNCTIONS._MostrarAyudaPantalla(this._PantallaAyuda); } // FPARTE 101745 /// <summary> /// Task 104592: Evento para ejecutar la creación de tarea programada /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void crearTareaProgramadaItem_Click(object sender, EventArgs e) { _CrearTareaProgramada(this._Pantalla); } /// <summary> /// Evento para cargar una configuración de usuario/pantalla /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ConfiguracionesUsuarioItem_Click(object sender, EventArgs e) { ConfigUserForm loConfig; // Guardar "Última configuración" antes de abrir el editor de configuraciones //ConfigUserOptionsUpdateLastValues(); FormBase loFormClon = this.Clone(); loFormClon._ConfigUserForm = this._ConfigUserForm; loFormClon._ConfigUserOptionsEditing = true; loConfig = ConfigurationDesignManager.ShowInDesign(loFormClon, this._ConfigUserForm); if (loConfig is ConfigUserForm) { _ConfigUserForm = loConfig; _ConfigUserOptionsLoad(_ConfigUserForm._dicOpciones); } loFormClon.Close(); loFormClon.Dispose(); loFormClon = null; } #region Opciones de menu para listados personalizables /// <summary> /// Task 104592: Método virtual para crear una tarea programada (principalmente para el FormListado) /// </summary> /// <param name="tcPantalla"></param> protected virtual void _CrearTareaProgramada(string tcPantalla) { } /// <summary> /// Generar un nuevo listado personalizable a partir de un listado existente previamente /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void listadosPersonalizablesDuplicarItem_Click(object sender, EventArgs e) { this.Close(); ListadosPersonalizables loList = new ListadosPersonalizables(); if (!loList._DuplicarListado(this._Pantalla)) { sage.ew.functions.FUNCTIONS._MessageBox(loList._Error_Message, this.Text, //"Informes personalizables" MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1); } } /// <summary> /// Editar un listado personalizable previamente creado /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void listadosPersonalizablesEditarItem_Click(object sender, EventArgs e) { this.Close(); ListadosPersonalizables loList = new ListadosPersonalizables(); if (!loList._CargarListado(this._Pantalla)) { sage.ew.functions.FUNCTIONS._MessageBox(loList._Error_Message, this.Text, //"Informes personalizables" MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1); } } #endregion Opciones de menu para listados personalizables private void ShowPropertiesToolStripMenuItem_Click(object sender, EventArgs e) { if (Debugger.IsAttached) { if (_oTimerProperties is Timer) { ShowPropertiesToolStripMenuItem.Text = "Mostrar propiedades controles"; _InfoToolTip.Active = false; _oTimerProperties.Stop(); _oTimerProperties.Tick -= _oTimerProperties_Tick; _oTimerProperties.Dispose(); _oTimerProperties = null; } else { ShowPropertiesToolStripMenuItem.Text = "Ocultar propiedades controles"; _InfoToolTip.Active = true; _oTimerProperties = new Timer(); _oTimerProperties.Tick += _oTimerProperties_Tick; _oTimerProperties.Interval = 500; _oTimerProperties.Start(); } } } private void _oTimerProperties_Tick(object sender, EventArgs e) { Control loControl; Point loPos = Cursor.Position; if (Bounds.Contains(loPos)) { loControl = _GetChild(loPos, this); if ((loControl is Control && string.IsNullOrEmpty(_ControlNameShowing)) || (loControl is Control && loControl.Name != _ControlNameShowing)) { _ControlNameShowing = _InfoToolTip._GetControl(loControl).Name; _CreateTooltipInfo(loControl, loControl.DataBindings.Count > 0 ? loControl.Name : ""); if(!loControl.Enabled) _InfoToolTip.Show(loControl.Name, this, PointToClient(loPos)); } else if(loControl == null && !string.IsNullOrEmpty(_ControlNameShowing)) { _InfoToolTip.Hide(this); _ControlNameShowing = string.Empty; } } else { _ControlNameShowing = string.Empty; } } private void _CreateTooltipInfo(Control toControl, string tcText = "") { string lcText; lcText = string.IsNullOrEmpty(tcText) ? toControl.DataBindings.Count > 0 ? toControl.Name : "" : tcText; if (!string.IsNullOrEmpty(lcText)) _InfoToolTip._ControlToolTip(toControl, lcText); if (toControl.Controls.Count > 0) { foreach (Control loControl in toControl.Controls) { lcText = string.IsNullOrEmpty(tcText) ? loControl.DataBindings.Count > 0 ? loControl.Name : "" : tcText; if (!string.IsNullOrEmpty(lcText)) { _InfoToolTip._ControlToolTip(loControl, lcText); } if (loControl.Controls.Count > 0) { _CreateTooltipInfo(loControl, lcText); } } } } private string _ControlNameShowing; /// <summary> /// Obtener un Control situado en un point /// </summary> /// <param name="toPoint"></param> /// <param name="toBase"></param> /// <returns></returns> public Control _GetChild(Point toPoint, Control toBase) { Control loControl = null; if(toBase is Control) loControl = toBase.GetChildAtPoint(toBase.PointToClient(toPoint), GetChildAtPointSkip.Invisible | GetChildAtPointSkip.Transparent); return loControl?.Controls.Count > 0 && loControl?.DataBindings.Count == 0? _GetChild(toPoint, loControl) : loControl; } /// <summary> /// Mostrar la información relevante de la pantalla que llama este método. /// Se presentara la siguiente información: /// - Titulo del formulario /// - Librearia en la que esta contenido /// - Nombre de la clase del formulario /// - Pantalla (en caso de que esta definida) /// En mantenimientos y documentos se presentara también la información de los addons que modifiquen el formulario: /// - Nombre del addon / Libreria que carga (Si esta o no firmada y por quien) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void nombreFormularioToolStripMenuItem_Click(object sender, EventArgs e) { frmInfoFormul loFormul = new frmInfoFormul(); //Cabecera Información loFormul.AddHeader("Información"); //Titulo del formulario loFormul.AddLine("Título", _EliminarAcronimo(this.Text)); //Libreria loFormul.AddLine("Librería", System.Reflection.Assembly.GetAssembly(this.GetType()).Location); //Clase loFormul.AddLine("Clase", this.GetType().Name); //Pantalla. Presentamos el valo de _PantallaAyuda if (!string.IsNullOrWhiteSpace(_PantallaAyuda)) loFormul.AddLine("Pantalla", _PantallaAyuda.Trim().ToUpper()); //S50MIG-3188 Añadir namespace loFormul.AddLine("Namespace", GetType().Namespace); //Addons Dictionary<string, object> loAddons = null; if (this is FormMante && (this as FormMante)._ewMante != null && (this as FormMante)._ewMante._Addons != null) { loAddons = (this as FormMante)._ewMante._Addons; } else if (this is frmGestionPerfil && (this as frmGestionPerfil)._Documento != null && (this as frmGestionPerfil)._Documento._Addons != null) { loAddons = (this as frmGestionPerfil)._Documento._Addons; } else if (this is FormListado && (this as FormListado)._Addons != null) { loAddons = (this as FormListado)._Addons; } if (loAddons != null && loAddons.Count > 0) { //Cabecera addons loFormul.AddHeader("Add-ons"); //Info de addons string lcDllAddon = "", lcSubjectName = ""; foreach (KeyValuePair<string, object> loItem in loAddons) { try { // Obtenemos el objeto de extensiones y lo configuramos //loExtension = (_ExtensionMante)loItem.Value; string lcName = "", lcTmp = ""; if (AddonsController.Instance.AddonsManager.IsLoaded(loItem.Key)) { //Ruta a la dll lcDllAddon = (AddonsController.Instance.AddonsManager.GetAddon(loItem.Key) as IModulo)._Libreria + ".dll"; lcTmp = lcDllAddon; //Qui la firma lcSubjectName = FUNCTIONS.GetDllNameInfo(lcDllAddon); if (!string.IsNullOrWhiteSpace(lcSubjectName)) lcTmp += " (" + lcSubjectName + ")"; else lcTmp += " (Sin firmar)"; //Quin tipus es int lnTipo = (AddonsController.Instance.AddonsManager.GetAddon(loItem.Key) as IModulo)._Tipo; switch (lnTipo) { case 2: lcTmp += " - Extensión contratable"; break; case 3: lcTmp += " - Extensión personalizada"; break; case 1: case 0: default: lcTmp += " - Extensión incluida"; break; } //Nom del addon a mostrar lcName = (AddonsController.Instance.AddonsManager.GetAddon(loItem.Key) as IModulo)._Nombre2; if (string.IsNullOrWhiteSpace(lcName)) lcName = loItem.Key; //Afegim una linia per cada addon loFormul.AddLine(lcName, lcTmp); } } catch (Exception loError) { DB.Registrar_Error(loError); } } } //Mostramos el formulario loFormul._ShowDialog(); } /// <summary> /// Elimina el acronimo del texto /// </summary> /// <param name="toText"></param> /// <returns></returns> protected string _EliminarAcronimo(String toText) { String lcText = toText; if (!String.IsNullOrEmpty(_Acronimo)) lcText = lcText.Replace(_Acronimo, ""); lcText = lcText.TrimStart(); return lcText; } /// <summary> /// Respuesta al click de "Reordenar pantallas" (PE-120903) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void reordenarPantallasToolStripMenuItem_Click(object sender, EventArgs e) { // PE-103085 //NETVFP._Reordenar_Pantallas(); //NETVFP._Ejecutar_Funcion_VFP("fPripals50.Reordenar_pantallas"); } private void contextMenuStripPantalla_Opening(object sender, CancelEventArgs e) { contextMenuStripPantalla.Items["gestiónDeFavoritosToolStripMenuItem"].Image = sage.ew.images.Properties.Resources.favorite_16; contextMenuStripPantalla.Items["gestiónDeAccesosToolStripMenuItem"].Image = sage.ew.images.Properties.Resources.access_16; contextMenuStripPantalla.Items["crearAccesoDirectoToolStripMenuItem"].Image = sage.ew.images.Properties.Resources.link_16; contextMenuStripPantalla.Items["crearTareaProgramadaItem"].Image = sage.ew.images.Properties.Resources.TimeProgram; //TODO: utilizar otro icono contextMenuStripPantalla.Items["ShowPropertiesToolStripMenuItem"].Image = _oTimerProperties is null ? Resources.led_green_16 : Resources.led_red_16; bool lbSage50 = Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_sage50")); //Acces directe sols per a Sage50 if (!lbSage50) contextMenuStripPantalla.Items["crearAccesoDirectoToolStripMenuItem"].Visible = false; else contextMenuStripPantalla.Items["crearAccesoDirectoToolStripMenuItem"].Visible = _MostrarCrearAccesoDirecto; // PE-99866. Comprobar si mostar el ménu crear acceos directos //Task 104592: Crear tarea programada if (!lbSage50) contextMenuStripPantalla.Items["crearTareaProgramadaItem"].Visible = false; else contextMenuStripPantalla.Items["crearTareaProgramadaItem"].Visible = _MostrarCrearTareaProgramada; //PE-96746 contextMenuStripPantalla.Items["crearApunteCalendarioItem"].Image = sage.ew.images.Properties.Resources.calendar_16; //PE-103520 : listados personalizables contextMenuStripPantalla.Items["listadosPersonalizablesEditarItem"].Image = sage.ew.images.Properties.Resources.mant_edit_16; contextMenuStripPantalla.Items["listadosPersonalizablesDuplicarItem"].Image = sage.ew.images.Properties.Resources.duplicate_16; if (this is sage.ew.formul.Forms.FormListado) { if (!((sage.ew.formul.Forms.FormListado)this)._Personalizado) { contextMenuStripPantalla.Items["listadosPersonalizablesEditarItem"].Visible = false; if (!lbSage50) { contextMenuStripPantalla.Items["listadosPersonalizablesDuplicarItem"].Visible = false; } else { contextMenuStripPantalla.Items["listadosPersonalizablesDuplicarItem"].Visible = _MostrarDuplicarListado; } } } else { contextMenuStripPantalla.Items["listadosPersonalizablesEditarItem"].Visible = false; contextMenuStripPantalla.Items["listadosPersonalizablesDuplicarItem"].Visible = false; } ConfigureConfigUserOptions(); //PE-104540 - PE-104527 : Amagar l'opció de "Duplicar y editar el listado personalizable" //contextMenuStripPantalla.Items["listadosPersonalizablesDuplicarItem"].Visible = false; } /// <summary> /// Preparar menú de Configuraciones de usuario /// </summary> private void ConfigureConfigUserOptions() { configuracionesUsuarioItem.Image = sage.ew.images.Properties.Resources.icon_wrench; if (Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_sage50")) && _ConfigUserOptionsAllowed) { // Guardar "Última configuración" //ConfigUserOptionsUpdateLastValues(); configuracionesUsuarioItem.Visible = true; configuracionesUsuarioItemSeparator.Visible = true; configuracionesUsuarioItem.DropDownItems.Clear(); configuracionesUsuarioItem.DropDownItems.Add(toolConfiguracionesToolStripMenuItem); // Mostrar configuraciones de usuario IEnumerable<ConfigUserForm> loList = _ConfigUserForm._ListaConfiguraciones().AsEnumerable(); IEnumerable<ConfigUserForm> loListConfUsers = loList.Where(f => f._Tipo == ConfigUserForm.ConfigUserType.UserValuesConfig); IEnumerable<ConfigUserForm> loListDefaultConfUsers = loList.Where(f => f._Tipo != ConfigUserForm.ConfigUserType.UserValuesConfig); // Mostrar configuraciones del usuario _GenerateMenuItemsConfigUser(loListConfUsers.Where(f => !f._Publico)); // Mostrar configuraciones públicas _GenerateMenuItemsConfigUser(loListConfUsers.Where(f => f._Publico)); // Mostrar configuraciones base _GenerateMenuItemsConfigUser(loListDefaultConfUsers); } else { configuracionesUsuarioItem.Visible = false; configuracionesUsuarioItemSeparator.Visible = false; } } private void _GenerateMenuItemsConfigUser(IEnumerable<ConfigUserForm> toListConfigUsers) { if (toListConfigUsers != null && toListConfigUsers.Count() > 0) { configuracionesUsuarioItem.DropDownItems.Add(new ToolStripSeparator()); foreach (ConfigUserForm loConfig in toListConfigUsers) { ToolStripMenuItem loMenuItem = new ToolStripMenuItem(); loMenuItem.Text = loConfig._Config; loMenuItem.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); loMenuItem.Click += LoadConfigUserMenuItem_Click; loMenuItem.Tag = loConfig; if (_ConfigUserForm._Config.Trim() == loConfig._Config.Trim()) loMenuItem.Image = sage.ew.images.Properties.Resources.icon_right; configuracionesUsuarioItem.DropDownItems.Add(loMenuItem); } } } /// <summary> /// Evento para cargar configuración de usuario/pantalla des del menú de opciones /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void LoadConfigUserMenuItem_Click(object sender, EventArgs e) { if (sender is ToolStripMenuItem && ((ToolStripMenuItem)sender).Tag is ConfigUserForm) { ConfigUserForm loConfig = ((ToolStripMenuItem)sender).Tag as ConfigUserForm; // Antes de cargar la nueva configuración, guardamos "Última configuración" //ConfigUserOptionsUpdateLastValues(); // Cargar nueva configuración _ConfigUserForm = loConfig; _ConfigUserOptionsLoad(_oConfigUserForm._dicOpciones); } } /// <summary> /// PE-96746: Comprobamos si hay que mostrar o no el la opció de apunte de calendario /// </summary> /// <returns>True si es visible</returns> protected bool _PresentarApunteCalendario() { return sage.ew.functions.FUNCTIONS._PermitirApunteCalendario(_Pantalla); } #region Forzar Fuente /// <summary> /// Override OnShown /// </summary> /// <param name="e"></param> protected override void OnShown(EventArgs e) { base.OnShown(e); if (EW_GLOBAL._EsEjecutable && _CambiarFuente) { if (Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_sage50"))) { if (estiloRevisado == false) { foreach (Control loControl in Controls) { FUNCTIONS._Cambiar_Font(loControl, "Segoe UI"); } } } else { foreach (Control loControl in Controls) { FUNCTIONS._Cambiar_Font(loControl, "Arial"); } } } // Bug 111565. En caso de abrir un formulario en modo MODAL, no dejamos minimizarlo if (this.Modal) this.MinimizeBox = false; //Asignem els parametres del formulari suposant que en tingui this._EstablecerParametrosFormulario(); } #endregion Forzar Fuente /// <summary> /// Lista de toolStripMenuItems privada que se utiliza para poder gestionar las opciones del botón de opciones /// </summary> protected List<ToolStripMenuItemBase> _ToolStripMenuItemsBase = new List<ToolStripMenuItemBase>(); /// <summary> /// Nuevo ítems del menú de opciones /// /// Añade el ítem a la lista lstToolStripMenuItemBase para su posterior personalización /// </summary> /// <param name="tcNombre">Text del toolStripIEtem</param> /// <param name="tcNombre_Objeto">Nombre del objeto</param> /// <param name="tcTooltip">Tooltip del toolStripIEtem</param> /// <returns></returns> protected internal ToolStripMenuItemBase _AddToolStripMenuItemBase(string tcNombre, string tcNombre_Objeto, string tcTooltip) { ToolStripMenuItemBase loToolStripMenuItem = new ToolStripMenuItemBase(tcNombre, tcNombre_Objeto, tcTooltip); _ToolStripMenuItemsBase.Add(loToolStripMenuItem); return loToolStripMenuItem; } /// <summary> /// Notificamos a los subscriptores por si desean realizar una configuración de las opciones a presentar /// /// NOTA: únicamente operativo en los documentos de perfiles y asientos /// </summary> /// <param name="sender">Referencia al objeto de opciones</param> protected internal void _GetOpcionesInvoke(object sender) { if (this is frmGestionPerfil || this is contabilidad.frmAsientos || this is frmListasPrevias || this.Name == "frmPrincipal") _GetOpciones?.Invoke(new EventArgsOpciones(sender, _ToolStripMenuItemsBase)); else throw new Exception("Este formulario no tiene ningún botón de Opciones o no está preparado para acceder a él"); } /// <summary> /// Notificamos a los subscriptores por si desean añadir opciones en el botón de herramientas /// </summary> /// <param name="sender">Referencia al ContextMenu de opciones del botón de herramientas</param> /// <param name="tlstToolStripMenuItemsBase">Lista de ToolStripMenuItemBase</param> private void GetOpcionesHerramientasInvoke(object sender , List<ToolStripMenuItemBase> tlstToolStripMenuItemsBase) { _GetOpcionesHerramientas?.Invoke(new EventArgsOpciones(sender, tlstToolStripMenuItemsBase)); } // Task 111119 - 115209 /// <summary> /// Inserta un control a los formularios, actualmente solo implementado en el formulario de perfiles /// </summary> /// <param name="toControl">Control a añadir al formulario, ha de cumplir la interfaz IAddonTabDoc, IAddonBotonMenuDoc, ...</param> /// <returns>Devuelve si ha agregado el control al formulario</returns> public virtual bool _InsertarObjetoAddon(Control toControl) { bool lITabDocAddon = false, llOk = true; Control loControlContenedor = this; // Asignamos donde vamos a agregar los controles string lcNombre_Objeto = toControl.Name; lITabDocAddon = toControl is IAddonTabDoc; if (lITabDocAddon) llOk = AddonInsertarTabDocAddon(toControl, ref loControlContenedor); else if ((toControl is IAddonBotonMenuDoc) && (toControl is Button)) // Task 123210: Creación de botones en la barra de herramientas de los Mantes llOk = AddonBotonMenuDoc(toControl); if (llOk) loControlContenedor.Controls.Add(toControl); return llOk; } /// <summary> /// Inserta un sage.ew.botones.ToolStripButtonAddonMante a la barra de botones en los FormMante /// </summary> /// <param name="toolStripButtonAddonMante"></param> /// <returns></returns> public virtual bool _InsertarObjetoAddon(ToolStripItem toolStripButtonAddonMante) { return true; } /// <summary> /// Para agregar opciones mediante los Addons en los mantenimientos y en el formulario de asientos /// </summary> /// <param name="toMenuStrip"></param> protected internal virtual void _AddonPrepararMenu(ewcontextmenustrip toMenuStrip) { if (this.lstOpcionesMenuAddon != null && this.lstOpcionesMenuAddon.Count > 0) { string lcTituloMenu, lcName; bool llSeparador = true; foreach (Control loControl in this.lstOpcionesMenuAddon) { lcTituloMenu = ((IAddonBotonMenuDoc)loControl)._TituloMenu.Trim(); if (llSeparador && toMenuStrip.Items.Count > 0) // Añadimos un separador { toMenuStrip.Items.Add("-"); llSeparador = false; } toMenuStrip.Items.Add(lcTituloMenu); lcName = loControl.Name; if (string.IsNullOrWhiteSpace(lcName)) // Si el botón no tiene nombre le voy a asignar uno. Luego se realizará una búsqueda por el nombre del control { lcName = Convert.ToString(Guid.NewGuid()).ToUpper(); loControl.Name = lcName; } toMenuStrip.Items[toMenuStrip.Items.Count - 1].Name = lcName; toMenuStrip.Items[toMenuStrip.Items.Count - 1].Click += new EventHandler(FormManteOpcionesAddon_Click); } } } // FTask 123210: Creación de botones en la barra de herramientas de los Mantes /// <summary> /// Ejecutamos la acción del botón correspondiente añadido mediante los Addons /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FormManteOpcionesAddon_Click(object sender, EventArgs e) { string lcName = (sender as ToolStripMenuItem).Name; Control[] loControl = this.Controls.Find(lcName, true); if (loControl != null) { try { ((ewbutton)loControl[0]).Enabled = true; ((ewbutton)loControl[0]).PerformClick(); // No sabemos el código que se ha programado. Si da error ... } catch (Exception loEx) { if (Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_prueva")) || System.Diagnostics.Debugger.IsAttached) // Gestión de error this._MessageBox("Se ha producido la siguiente incidencia en la ejecución de la opción " + (sender as ToolStripMenuItem).Text.Trim() + ": " + Environment.NewLine + Environment.NewLine + loEx.Message, MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, DialogResult.OK); } } } /// <summary> /// Configuramos la clase "clsElementos" para poder instanciar correctamente el control dque cumple la interfaz "IAddonBotonMenuDoc" que se añadirán en el botón de opciones correspondiente /// </summary> /// <param name="toControl"></param> private bool AddonBotonMenuDoc(Control toControl) { IAddonBotonMenuDoc loIAddonBotonMenuDoc = (IAddonBotonMenuDoc)toControl; this.lstOpcionesMenuAddon.Add(toControl); // Añadimos la opción a la lista // La propiedad _Menu no la vamos a utilizar, únicamente es para los perfiles if (string.IsNullOrWhiteSpace(loIAddonBotonMenuDoc._TituloMenu) && toControl is ewbutton && !string.IsNullOrWhiteSpace(toControl.Text)) // Si no tiene título la opción, asignaremos el texto del botón loIAddonBotonMenuDoc._TituloMenu = toControl.Text; // Cambiamos la posición del control para que no se vea. No lo podemos hacer invisible o al hacer el PerformClick no se ejecutará toControl.Left = -10000; toControl.Top = -10000; toControl.Width = 1; toControl.Height = 1; AddonBotonMenuDocDocumento(toControl); return true; } /// <summary> /// Asignamos la referencia al documento al botón para realizar las acciones pertinentes /// </summary> /// <param name="toControl">Control de tipo IAddonBotonMenuDoc</param> private void AddonBotonMenuDocDocumento(Control toControl) { dynamic loDocumento = null; if (toControl is IAddonBotonMenuDoc) { if (this is FormMante) loDocumento = ((FormMante)this)._ewMante; else if (this is FormBaseDocumento) loDocumento = ((FormBaseDocumento)this)._Documento; if (loDocumento != null) { IAddonBotonMenuDoc loIAddonBotonMenuDoc = ((IAddonBotonMenuDoc)toControl); loIAddonBotonMenuDoc._Documento = loDocumento; } } } /// <summary> /// Realizamos el refresco recursivamente de los controles /// </summary> /// <param name="toContenedor">Objeto que puede ser contenedor de otros objetos</param> /// <param name="tlChild">Recorre si los diferentes controles del UserControl para ejecutar el _Refresh</param> private void ControlRefreshRecursive(Control toContenedor, bool tlChild = false) { if (!toContenedor.HasChildren) return; foreach (Control loControlChild in toContenedor.Controls) _ControlRefresh(loControlChild, tlChild); } /// <summary> /// Ejercución del método _Refresh del control /// </summary> /// <param name="toControl">Control al que se ejecutará el _Refresh</param> /// <param name="tlChild">Recorre si los diferentes controles del UserControl para ejecutar el _Refresh</param> public void _ControlRefresh(Control toControl, bool tlChild = false) { if (toControl == null) return; dynamic loControlDynamic = toControl; bool llRefresh = (toControl is IAddonTabDoc); if (llRefresh) { Type ltType = Type.GetType(loControlDynamic.GetType().AssemblyQualifiedName); MethodInfo objMethod = ltType.GetMethod("_Refresh"); // Busca la propiedad pública con el nombre especificado, si no la encuentra devuelve null llRefresh = (objMethod != null); } if (llRefresh) { try { loControlDynamic._Refresh(); } catch (Exception loEx) { if (Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_prueva")) || System.Diagnostics.Debugger.IsAttached) this._MessageBox("Se ha producido la siguiente incidencia en la ejecución del método Refresh del control " + toControl.Name + ": " + Environment.NewLine + Environment.NewLine + loEx.Message, MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, DialogResult.OK); } } ControlRefreshRecursive(toControl); } /// <summary> /// Asociación de la propiedad _Documento al Addon recursivamente /// </summary> /// <param name="toContenedor">Objeto que puede ser contenedor de otros objetos</param> /// /// <param name="toDocumento"></param> /// <param name="tlChild">Recorre si los diferentes controles del UserControl para asociar el _Documento</param> private void ControlDocumentoRecursive(Control toContenedor, dynamic toDocumento, bool tlChild = false) { if (!toContenedor.HasChildren) return; foreach (Control loControlChild in toContenedor.Controls) _ControlDocumento(loControlChild, toDocumento, tlChild); } /// <summary> /// Asociación de la propiedad _Documento al Addon /// </summary> /// <param name="toControl">Control al que se asignará el _Documento</param> /// <param name="toDocumento">Referencia al documento</param> /// <param name="tlChild">Recorre si los diferentes controles del UserControl para asociar el _Documento</param> public void _ControlDocumento(Control toControl, dynamic toDocumento, bool tlChild = false) { if (toControl == null || toDocumento == null) return; dynamic loControlDynamic = toControl; bool llDocumento = (toControl is IAddonTabDoc); if (!llDocumento) { Type ltType = Type.GetType(loControlDynamic.GetType().AssemblyQualifiedName); MemberInfo[] objMember = ltType.GetMember("_Documento"); llDocumento = (objMember.Length > 0); } if (llDocumento) { try { loControlDynamic._Documento = toDocumento; } catch (Exception loEx) { if (Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_prueva")) || System.Diagnostics.Debugger.IsAttached) this._MessageBox("Se ha producido la siguiente incidencia en la asignación del documento al control " + toControl.Name + ": " + Environment.NewLine + Environment.NewLine + loEx.Message, MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, DialogResult.OK); } } ControlDocumentoRecursive(toControl, toDocumento, tlChild); } /// <summary> /// Añadimos una addon en la página de en un ewtabcontrol /// </summary> /// <param name="toControl"></param> /// <param name="toControlContenedor"></param> /// <returns></returns> private bool AddonInsertarTabDocAddon(Control toControl, ref Control toControlContenedor) { bool llOk = false; ewtabcontrol loewtabcontrol = null; foreach (Control loControl in Controls) // De momento no es necesario realizarlo recursivamente { if (loControl is ewtabcontrol) { loewtabcontrol = (ewtabcontrol)loControl; break; } } if (loewtabcontrol != null) { Control loPagina = AddonNuevaPaginaTabDoc(toControl, loewtabcontrol); ewFlowLayoutPanel loewFlowLayoutPanel = this.AddonNuevoFlowLayoutPanel(); loewFlowLayoutPanel.Size = loewtabcontrol.TabPages[0].Size; // Asignamos las dimensiones de la primera página loewFlowLayoutPanel.Dock = DockStyle.Fill; loPagina.Controls.Add(loewFlowLayoutPanel); // Agregamos el flowlayout a la página para la gestión de las barras loPagina.Dock = DockStyle.Fill; toControlContenedor = loewFlowLayoutPanel; // Agregaremos el addon en el flowlayout de la página, por tanto actualizamos el controlContenedor llOk = true; } return llOk; } /// <summary> /// Instanciación de un "ewFlowLayoutPanel" que para que presenta las barras de desplazamiento si no cabe la totalidad del control que se pueda añadir /// </summary> /// <returns>Devuelve un "ewFlowLayoutPanel" para añadirlo en la página</returns> private ewFlowLayoutPanel AddonNuevoFlowLayoutPanel() { ewFlowLayoutPanel loewFlowLayoutPanel = new ewFlowLayoutPanel(); loewFlowLayoutPanel.AutoScroll = true; loewFlowLayoutPanel.WrapContents = true; //if llResizeAddon // loewFlowLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; // MEJORA: _Resize: Si nos interesa que el usuario gestiona el resize // loewFlowLayoutPanel.Size = toControl.Size; // Asignamos las dimensiones del control return loewFlowLayoutPanel; } /// <summary> /// Obtener el nombre de una página /// </summary> /// <param name="toewtabcontrol"></param> /// <returns></returns> private string AddonNombrePagina(ewtabcontrol toewtabcontrol) { string lcName = string.Empty; lcName = "AddonPagina" + Convert.ToString(toewtabcontrol.TabPages.Count); return lcName; } /// <summary> /// Añadimos una nueva página en un tabcontrol /// </summary> /// <param name="toControl"></param> /// <param name="toewtabcontrol"></param> /// <returns></returns> private Control AddonNuevaPaginaTabDoc(Control toControl, ewtabcontrol toewtabcontrol) { Control loControlewTabPage = null; string lcewtabcontrol = toewtabcontrol.Name, lcTitulo = string.Empty, lcName = string.Empty; IAddonTabDoc loIAddonTabDoc = (IAddonTabDoc)toControl; loControlewTabPage = new ewTabPage(); lcName = toControl.Name; if (string.IsNullOrWhiteSpace(lcName)) lcName = AddonNombrePagina(toewtabcontrol); loControlewTabPage.Name = lcName; loControlewTabPage.Text = loIAddonTabDoc._TituloPagina; // Indicamos el título de la página toewtabcontrol.Controls.Add(loControlewTabPage); if (loIAddonTabDoc._Principal) // Añadimos el tabpage como página principal { ewTabPage loewTabPage = (ewTabPage)loControlewTabPage; CambiarIndiceTabpage(toewtabcontrol, loewTabPage, 0); } return loControlewTabPage; } /// <summary> /// Reordenamos las páginas /// </summary> /// <param name="toewtabcontrol"></param> /// <param name="toewTabPage"></param> /// <param name="tnNuevoIndice"></param> private void CambiarIndiceTabpage(ewtabcontrol toewtabcontrol, ewTabPage toewTabPage, int tnNuevoIndice) { ewTabPage loewTabPage; int lnIndiceTabPage = toewtabcontrol.TabPages.IndexOf(toewTabPage); // Buscamos el índice de la página que hemos agregado for (int lnIndice = 0; lnIndice < lnIndiceTabPage; lnIndice++) { loewTabPage = (ewTabPage)toewtabcontrol.TabPages[0]; toewtabcontrol.TabPages.Remove(loewTabPage); toewtabcontrol.TabPages.Add(loewTabPage); } // toewtabcontrol.TabPages.Insert(tnNuevoIndice, toewTabPage); // De momento como no funciona, hemos realizado el recorrido de las diferentes páginas } // FTask 111119 - 115209 #region Ayuda contextual private bool _lFormActivated = true; private bool _lPresentandoAyuda = false; private BackgroundWorker _oBackgroundWorker; private FormPanelNotificaciones _oFormAyuda = null; /// <summary> /// Para guardar el título del formulario sin acrónimo ni sufijos /// </summary> private string _cTituloFormulario = ""; /// <summary> /// Estructura para gestionar el resultado del BakcGroundWorker /// </summary> public struct oResultadoAyuda { /// <summary> /// Indica si ha de presentar la ayuda /// </summary> public bool _Ayuda { get { return _lAyuda; } set { _lAyuda = value; } } bool _lAyuda; /// <summary> /// Instancia de la ayuda contextual /// </summary> public IAyudaContextual _AyudaContextual { get { return _oAyudaContextual; } set { _oAyudaContextual = value; } } IAyudaContextual _oAyudaContextual; /// <summary> /// Instancia del OnBoardingController /// </summary> public IOnBoardingController _OnBoardingController { get { return _oOnBoardingController; } set { _oOnBoardingController = value; } } IOnBoardingController _oOnBoardingController; } /// <summary> /// Controlamos que tenemos la ayuda activa /// </summary> /// <returns></returns> private bool AyudaActiva() { if (Usuario._This._Opcesp("5004")) // No presentar ayuda en pantallas de Sage 50c return false; bool llActiva = true; object loObject = EW_GLOBAL._GetVariable("wl_DesactivarOnBoarding"); if (loObject != null) { try { llActiva = !Convert.ToBoolean(loObject); // Tendremos que "wl_DesactivarOnBoarding" es true por eso negamos } catch (Exception) { } } return llActiva; } /// <summary> /// Indica que la pantalla relacionada con la ayuda contextual / ayuda de Sage 50 /// </summary> /// <returns></returns> protected virtual string _PantallaAyuda { get { return _Pantalla; } } /// <summary> /// Indica si ha de presentar el WalkTrought de la pantalla 0 /// </summary> private bool _lPantalla0Showed = false; /// <summary> /// Marcamos que ya ha realizado el Login y no teniamos cargada aún la ayuda contextual al entrar la primera vez /// </summary> private bool _lPantalla0ShowAfterLogin = false; /// <summary> /// Instanciación del BackgroundWorker de la ayuda contextual /// </summary> private void AyudaOnBoarding() { if (!IsDisposed && !Disposing ) { if (BarrasAyudaActivas()) { if (string.IsNullOrWhiteSpace(_PantallaAyuda) || !AyudaActiva() || botonayuda == eAyudaContextual.Desactivada) { _FormSagePanel?._Show(_ButtonsSagePanel, this); } else { // Declaro un nuevo elemento _oBackgroundWorker = new BackgroundWorker(); _oBackgroundWorker.WorkerSupportsCancellation = true; _oBackgroundWorker.WorkerReportsProgress = false; // Declaro los procesos _oBackgroundWorker.DoWork += new DoWorkEventHandler(_ExecuteRunWorkerAyuda); _oBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_RunWorkerCompletedAyuda); // Ejecución asíncrona _oBackgroundWorker.RunWorkerAsync(); } } } } private bool BarrasAyudaActivas() { DataTable loDt = new DataTable(); string lcDataBase, lcComunes, lcSql; if (!EW_GLOBAL._ContainsKey("wl_barras_ayuda_form")) { lcComunes = GrupoEmpresa._DbComunesRealGrupoPripal(); lcDataBase = DB.SQLDatabaseReal(lcComunes, "VARIABLE"); lcSql = $"SELECT VALOR FROM {lcDataBase} WHERE VARIABLE = 'NO_AYUDA' "; if(DB.SQLExec(lcSql, ref loDt)) EW_GLOBAL.ValorEnClave_VarGlob("wl_barras_ayuda_form", loDt.Rows.Count == 0); } return Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_barras_ayuda_form", true)); } /// <summary> /// Método que define el proceso que se va a ejecutar en segundo plano de la ayuda contextual /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void _ExecuteRunWorkerAyuda(object sender, DoWorkEventArgs e) { oResultadoAyuda loResult = new oResultadoAyuda(); loResult._Ayuda = false; // Asignamos el false por defecto try { IOnBoardingController loOnBoardingController = FUNCTIONS._OnBoardingController(); if (loOnBoardingController != null && !loOnBoardingController._PlayingVideo) { IAyudaContextual loAyudaContextual = new AyudaContextual(loOnBoardingController); loAyudaContextual._Load(_PantallaAyuda.ToUpper()); if (loAyudaContextual != null && (loAyudaContextual._Categorias.Count > 0 || loAyudaContextual._NumeroTotalNoticias > 0)) { loResult._OnBoardingController = loOnBoardingController; loResult._AyudaContextual = loAyudaContextual; loResult._Ayuda = true; } } } catch (Exception loEx) { DB.Registrar_Error(loEx); } e.Result = loResult; // Asignamos el retorno } /// <summary> /// Método que se ejecutará al finalizar el proceso de consulta de la ayuda contextual /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void _RunWorkerCompletedAyuda(object sender, RunWorkerCompletedEventArgs e) { if (!e.Cancelled && e.Error == null &&!FormDisposed()) // Si no he sido cancelado ni he registrado excepción { _oResultadoAyuda = ((oResultadoAyuda)e.Result); if (_oResultadoAyuda._Ayuda) _BotonAyuda = eAyudaContextual.Si; //CambiarBotonAyudaMensaje(); if (PresentarAyudaNuevasNoticias(_oResultadoAyuda)) { if (EsPantalla0) { _oResultadoAyuda._Ayuda = true; if (_lPantalla0ShowAfterLogin && !_lPantalla0Showed && Ayuda_FormularioActivo()) // Si ha entrado el Usuario y no ha presentado aún el WalkTrought, ahora lo presentamos si no hay ninguna pantalla abierta _WalkthroughsPantalla0(); } //else // MostrarAyuda(_oResultadoAyuda._AyudaContextual); } _FormSagePanel?._Show(_ButtonsSagePanel, this); } } /// <summary> /// Controlamos si es necesario presentar las noticias relacionadas con la pantalla /// Tenemos dos casos: /// /// 1. Si tenemos activada la ayuda y tenemos noticias /// 2. Existe alguna noticia nueva. La presentamos igualmente /// </summary> /// <param name="toResultadoAyuda"></param> /// <returns></returns> private bool PresentarAyudaNuevasNoticias(oResultadoAyuda toResultadoAyuda) { // Si la pantalla no tiene ayuda podemos salir if (!_oResultadoAyuda._Ayuda) return false; // Tenemos activada la ayuda if ( _oResultadoAyuda._AyudaContextual._PresentacionAyuda != Presentacion.No) return true; // Existe alguna noticia nueva a partir de la fecha que el usuario marcó no volver a presentar la ayuda if (_oResultadoAyuda._AyudaContextual._NoticiasNuevasPendientesLeer > 0) return true; return false; } /// <summary> /// Devuelve si es la pantalla 0 donde presentaremos el formulario frmWalktrhoughs si es necesario /// </summary> private bool EsPantalla0 { get { return _PantallaAyuda == "PANTALLA0"; } } /// <summary> /// Presentamos la pantalla de los Walktrhough si es necesario /// </summary> /// <returns></returns> protected bool _WalkthroughsPantalla0() { _lPantalla0ShowAfterLogin = true; // Marcamos que ya ha pasado por el AfterLogin que es el único lugar de donde se realiza la llamada if (EsPantalla0 && !FUNCTIONS._CanUseWebView()) // No presentamos mensaje, validamos si tenemos el RunTime del WebView2 independientemente de que tengamos o no información de la pantalla 0 return false; if (_oResultadoAyuda._Ayuda == false || !EsPantalla0 || _lPantalla0Showed) return false; _lPantalla0Showed = true; // De momento marcamos que ya se ha visto o podrian salir dos instancias IOnBoardingController loOnBoardingController = FUNCTIONS._OnBoardingController(); if (loOnBoardingController != null) { _lPantalla0Showed = ((OnBoardingControllerSage50)loOnBoardingController)._ShowWalkthroughs(_oResultadoAyuda._AyudaContextual); return _lPantalla0Showed; } else return false; } /// <summary> /// Calculamos la posición del formulario de ayuda del OnBoarding /// </summary> /// <param name="toRectangle">Rectangle del formualrio de ayuda</param> /// <returns></returns> private Point CalculateLocationAyuda(Rectangle toRectangle) { Rectangle loRectScreen = Screen.PrimaryScreen.WorkingArea; Point loPoint = toRectangle.Location; int lnOffsetX = 20, lnOffsetY = 50; if (Location.X < 0) // Tenemos pantallas como los mantenimientos o perfiles donde el formulario se presenta en una posición fuera de la area visible { loPoint.X = (loRectScreen.Width / 2) + (Size.Width / 2) - lnOffsetX; loPoint.Y = (loRectScreen.Height / 2) - (Size.Height / 2) + lnOffsetY; } else { loPoint.X = Location.X + Size.Width - lnOffsetX; loPoint.Y = Location.Y + lnOffsetY; } if (loPoint.X + toRectangle.Size.Width > loRectScreen.Width) loPoint.X = loRectScreen.Width - lnOffsetX - toRectangle.Width; if (loPoint.Y + toRectangle.Size.Height > loRectScreen.Height) loPoint.Y = (loRectScreen.Height / 2) - (toRectangle.Height / 2); return loPoint; } /// <summary> /// Posicionaremos la pantalla donde el usuario la dejó previamente /// Controlamos que sea en una area visible /// </summary> /// <param name="toAyudaContextual">Referencia a la ayuda contextual</param> private void LocationAyuda(IAyudaContextual toAyudaContextual) { Point loPoint = new Point(toAyudaContextual._Left, toAyudaContextual._Top); if (loPoint == new Point(0, 0) || loPoint.X > Screen.PrimaryScreen.Bounds.Size.Width || loPoint.Y > Screen.PrimaryScreen.Bounds.Size.Height) { loPoint = CalculateLocationAyuda(_oFormAyuda.Bounds); } if (toAyudaContextual._Height > 0) { Size loSize = _oFormAyuda.Size; loSize.Height = toAyudaContextual._Height; if (_oFormAyuda.Size != loSize) _oFormAyuda.Size = loSize; } _oFormAyuda.Location = loPoint; } /// <summary> /// Controlamos si el formulario se está destruyendo /// </summary> /// <returns></returns> protected virtual bool FormDisposed() { return (IsDisposed || Disposing); } private void CambiarBotonAyudaMensaje() { if (!EsPantalla0 && _oResultadoAyuda._AyudaContextual != null && !FormDisposed()) { int numnoticias = _oResultadoAyuda._AyudaContextual._NoticiasPendientesLeer; if(menu is IActiveMenu) { foreach (ActiveButton item in menu.Items) { if (item.Name == "Ayuda") { // NOTICIAS ONBOARDING. Si tenemos noticias, sustituimos icono de Info por la Campana if (numnoticias > 0) { string lcTooltip = " Noticias"; item.ForeColor = Color.FromArgb(0, 129, 70); item.Font = new Font("Segoe UI", 8.5F); item._ModColors = false; if (numnoticias == 1) { item.Text = "1"; lcTooltip = " Noticia"; } else if (numnoticias < 100) item.Text = numnoticias.ToString().Trim(); else item.Text = "99+"; item.Image = sage.ew.images.Properties.Resources.bell_green_16; menu.ToolTip.SetToolTip(item, item.Text+lcTooltip); item.ChangeColors(); } break; } } } } } /// <summary> /// Gestión de la presentación del formulario de configuración de usabilidad /// </summary> private void MostrarCfgUsabilidad() { // En el formulario de configuración se comprueba si hay mensajes configurados en el formulario/usuario actual // y se muestra mensaje sino hay y se cierra. frmUserFormConfig frmCfg = new frmUserFormConfig(Usuario._This._Codigo, this._Pantalla, this._ObtenerText(false)); frmCfg._ShowDialog(); } /// <summary> /// Gestión de la presentación de la ayuda contextual /// </summary> /// <param name="toAyudaContextual">Instancia de la ayuda contextual cuando venimos del BackGroundWordker</param> private void MostrarAyuda(IAyudaContextual toAyudaContextual = null) { if (_oFormAyuda != null && !_oFormAyuda.IsDisposed && !_oFormAyuda.Disposing) { ShowAyuda(); return; } if (FormDisposed()) return; IOnBoardingController loOnBoardingController = FUNCTIONS._OnBoardingController(); if (toAyudaContextual == null) // Venimos del botón de opciones. Se ha de instanciar la ayuda contextual { toAyudaContextual = new AyudaContextual(loOnBoardingController); toAyudaContextual._Load(_Pantalla.ToUpper()); ((OnBoardingControllerSage50)loOnBoardingController)._WebService("mostrar", tcPantalla: _Pantalla.ToUpper()); // Acción de mostrar ayuda } if (FormDisposed()) return; _oFormAyuda = new FormPanelNotificaciones(_Pantalla.ToUpper(), Text, loOnBoardingCont³nDeAccesosToolStripMenuItem,
4311  this.crearAccesoDirectoToolStripMenuItem,
4312  this.crearTareaProgramadaItem,
4313  this.crearApunteCalendarioItem,
4314  this.listadosPersonalizablesEditarItem,
4315  this.listadosPersonalizablesDuplicarItem,
4316  this.ayudaPantallaToolStripMenuItem,
4317  this.ShowPropertiesToolStripMenuItem});
4318  this.contextMenuStripPantalla.Name = "contextMenuStripPantalla";
4319  this.contextMenuStripPantalla.Size = new System.Drawing.Size(289, 230);
4320  //
4321  // configuracionesUsuarioItem
4322  //
4323  this.configuracionesUsuarioItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
4324  this.toolConfiguracionesToolStripMenuItem});
4325  this.configuracionesUsuarioItem.Name = "configuracionesUsuarioItem";
4326  this.configuracionesUsuarioItem.Size = new System.Drawing.Size(288, 22);
4327  this.configuracionesUsuarioItem.Text = "Configuraciones de usuario";
4328  //
4329  // toolConfiguracionesToolStripMenuItem
4330  //
4331  this.toolConfiguracionesToolStripMenuItem.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
4332  this.toolConfiguracionesToolStripMenuItem.Name = "toolConfiguracionesToolStripMenuItem";
4333  this.toolConfiguracionesToolStripMenuItem.Size = new System.Drawing.Size(221, 22);
4334  this.toolConfiguracionesToolStripMenuItem.Text = "Diseñador configuraciones";
4335  //
4336  // configuracionesUsuarioItemSeparator
4337  //
4338  this.configuracionesUsuarioItemSeparator.Name = "configuracionesUsuarioItemSeparator";
4339  this.configuracionesUsuarioItemSeparator.Size = new System.Drawing.Size(285, 6);
4340  //
4341  // nombreFormularioToolStripMenuItem
4342  //
4343  this.nombreFormularioToolStripMenuItem.Name = "nombreFormularioToolStripMenuItem";
4344  this.nombreFormularioToolStripMenuItem.Size = new System.Drawing.Size(288, 22);
4345  this.nombreFormularioToolStripMenuItem.Text = "Nombre del formulario";
4346  //
4347  // ShowPropertiesToolStripMenuItem
4348  //
4349  this.ShowPropertiesToolStripMenuItem.Name = "ShowPropertiesToolStripMenuItem";
4350  this.ShowPropertiesToolStripMenuItem.Size = new System.Drawing.Size(288, 22);
4351  this.ShowPropertiesToolStripMenuItem.Text = "Mostrar propiedades controles";
4352  //
4353  // gestiónDeFavoritosToolStripMenuItem
4354  //
4355  this.gestiónDeFavoritosToolStripMenuItem.Name = "gestiónDeFavoritosToolStripMenuItem";
4356  this.gestiónDeFavoritosToolStripMenuItem.Size = new System.Drawing.Size(288, 22);
4357  this.gestiónDeFavoritosToolStripMenuItem.Text = "Gestión de favoritos";
4358  //
4359  // gestiónDeAccesosToolStripMenuItem
4360  //
4361  this.gestiónDeAccesosToolStripMenuItem.Name = "gestiónDeAccesosToolStripMenuItem";
4362  this.gestiónDeAccesosToolStripMenuItem.Size = new System.Drawing.Size(288, 22);
4363  this.gestiónDeAccesosToolStripMenuItem.Text = "Gestión de accesos";
4364  //
4365  // crearAccesoDirectoToolStripMenuItem
4366  //
4367  this.crearAccesoDirectoToolStripMenuItem.Name = "crearAccesoDirectoToolStripMenuItem";
4368  this.crearAccesoDirectoToolStripMenuItem.Size = new System.Drawing.Size(288, 22);
4369  this.crearAccesoDirectoToolStripMenuItem.Text = "Crear acceso directo";
4370  //
4371  // crearTareaProgramadaItem
4372  //
4373  this.crearTareaProgramadaItem.Name = "crearTareaProgramadaItem";
4374  this.crearTareaProgramadaItem.Size = new System.Drawing.Size(288, 22);
4375  this.crearTareaProgramadaItem.Text = "Crear tarea programada";
4376  //
4377  // crearApunteCalendarioItem
4378  //
4379  this.crearApunteCalendarioItem.Name = "crearApunteCalendarioItem";
4380  this.crearApunteCalendarioItem.Size = new System.Drawing.Size(288, 22);
4381  this.crearApunteCalendarioItem.Text = "Nue&vo apunte calendario";
4382  //
4383  // listadosPersonalizablesEditarItem
4384  //
4385  this.listadosPersonalizablesEditarItem.Name = "listadosPersonalizablesEditarItem";
4386  this.listadosPersonalizablesEditarItem.Size = new System.Drawing.Size(288, 22);
4387  this.listadosPersonalizablesEditarItem.Text = "Editar el listado personalizable";
4388  //
4389  // listadosPersonalizablesDuplicarItem
4390  //
4391  this.listadosPersonalizablesDuplicarItem.Name = "listadosPersonalizablesDuplicarItem";
4392  this.listadosPersonalizablesDuplicarItem.Size = new System.Drawing.Size(288, 22);
4393  this.listadosPersonalizablesDuplicarItem.Text = "Duplicar y editar el listado personalizable";
4394  //
4395  // ayudaPantallaToolStripMenuItem
4396  //
4397  this.ayudaPantallaToolStripMenuItem.Name = "ayudaPantallaToolStripMenuItem";
4398  this.ayudaPantallaToolStripMenuItem.Size = new System.Drawing.Size(288, 22);
4399  this.ayudaPantallaToolStripMenuItem.Text = "Ayuda";
4400  //
4401  // _MenuContext_Opciones
4402  //
4403  this._MenuContext_Opciones.Font = new System.Drawing.Font("Segoe UI", 9.5F);
4404  this._MenuContext_Opciones.Name = "ewcontextmenustripOpcProc";
4405  this._MenuContext_Opciones.Size = new System.Drawing.Size(61, 4);
4406  //
4407  // FormBase
4408  //
4409  this.ClientSize = new System.Drawing.Size(284, 262);
4410  this.KeyPreview = true;
4411  this.Name = "FormBase";
4412  this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
4413  ((System.ComponentModel.ISupportInitialize)(this._oErrorProvider)).EndInit();
4414  this.contextMenuStripPantalla.ResumeLayout(false);
4415  this.ResumeLayout(false);
4416 
4417  }
4418 
4426  public List<T> _FindControl<T>(Control toControl = null)
4427  {
4428  if (toControl == null)
4429  toControl = this;
4430 
4431  List<T> lstControls = new List<T>();
4432 
4433  lstControls = AllControls(toControl).OfType<T>().ToList();
4434 
4435  return lstControls;
4436  }
4437 
4443  private IEnumerable<Control> AllControls(Control container)
4444  {
4445  foreach (Control control in container.Controls)
4446  {
4447  yield return control;
4448 
4449  foreach (var innerControl in AllControls(control))
4450  yield return innerControl;
4451  }
4452  }
4453 
4454 
4459  protected override void WndProc(ref Message msgEW)
4460  {
4461  if (msgEW.Msg != WM_SYSCOMMAND || (msgEW.Msg == WM_SYSCOMMAND && ( _ExecuteCommandBefore == null || _ExecuteCommandBefore.Invoke(this, msgEW.WParam))))
4462  {
4463  base.WndProc(ref msgEW);
4464 
4465  if (EW_GLOBAL._EsEjecutable)
4466  {
4467  //TODO: Temporal hasta que veamos que pasa realmente
4468  if (!System.Diagnostics.Debugger.IsAttached && !NETVFP._ReceiveMessageFromVfp(ref msgEW))
4469  return;
4470  }
4471  }
4472  }
4473 
4483  public virtual bool _Init(object[] taParams)
4484  {
4485  if (taParams.Count() > 0)
4486  {
4487  _lAutomatico = true; //Bug 206971: Para poder saber en el formbase si estamos en una tarea programada
4488  }
4489  return true;
4490  }
4491  // FI PE-77741
4492 
4498  public virtual bool _InitAccesoDirecto(object[] taParams)
4499  {
4500  // Obtención de los parámetros según pantalla
4501  if (taParams != null && taParams.Length > 0)
4502  {
4503  foreach (object loItem in taParams)
4504  {
4505  //Si trobem un parametre que començi per "idparam:" es que tenin propietats guardades a COMUNES!ACDIRPARAM
4506  if (loItem.ToString().StartsWith(FUNCTIONS._AccesoDirectoParametro))
4507  {
4508  //Recuperem les propietats que mes tard asignarem al OnShown
4509  return FUNCTIONS._RecuperarParametrosAccesoDirecto(loItem.ToString(), ref this._ValoresAccesoDirecto);
4510  }
4511  }
4512  }
4513  return false;
4514  }
4515 
4521  public virtual bool _EstablecerParametrosFormulario()
4522  {
4523  if (DesignMode)
4524  return true;
4525 
4526  bool llOk = false;
4527  if (this._ValoresAccesoDirecto.Count > 0)
4528  {
4529  string lcControl = "", lcPropiedad = "";
4530  object lcValor = "";
4531  foreach (KeyValuePair<string, object> loItem in this._ValoresAccesoDirecto)
4532  {
4533  //La key estara composada del "nom_control:propietat_a_definir"
4534  //El value contindra el valor de la propietat
4535  if (loItem.Key.Contains(":"))
4536  {
4537  lcControl = loItem.Key.Substring(0, loItem.Key.IndexOf(":"));
4538  lcPropiedad = loItem.Key.Substring(loItem.Key.IndexOf(":") + 1);
4539  lcValor = loItem.Value;
4540  //Recuperamos el control del formulario
4541  Control loControl = this.__FindControlRecursive(lcControl);
4542  if (loControl != null)
4543  {
4544  //Recuperamos la propiedad del Control
4545  Type myType = loControl.GetType();
4546  PropertyInfo myPropInfo = myType.GetProperty(lcPropiedad);
4547  if (myPropInfo != null)
4548  {
4549  if (loControl is txtFiltroBase)
4550  {
4551  llOk = true;
4552  if (lcPropiedad == "_Desde")
4553  (loControl as txtFiltroBase)._oFiltroDesde._Codigo = Convert.ToString(lcValor);
4554  else if (lcPropiedad == "_Hasta")
4555  (loControl as txtFiltroBase)._oFiltroHasta._Codigo = Convert.ToString(lcValor);
4556  else if (lcPropiedad == "_Todos")
4557  (loControl as txtFiltroBase)._Todos = Convert.ToBoolean(lcValor);
4558  else if (lcPropiedad == "_Lista")
4559  (loControl as txtFiltroBase)._Lista = new List<string>(lcValor.ToString().Split(','));
4560  }
4561  else
4562  {
4563  //Tratamiento de valores
4564  object lcRealValue = lcValor;
4565  if (loControl is ewcombobox && lcPropiedad.ToLower() == "selectedindex")
4566  lcRealValue = Convert.ToInt32(lcRealValue);
4567  else if ((loControl is ewcheckbox || loControl is ewradiobutton) && lcPropiedad.ToLower() == "checked")
4568  lcRealValue = Convert.ToBoolean(lcRealValue);
4569 
4570  //Establecemos el valor a la propiedad
4571  try
4572  {
4573  myPropInfo.SetValue(loControl, lcRealValue, null);
4574  llOk = true;
4575  }
4576  catch (Exception)// loEx)
4577  {
4578  //TODO : Errores derivados de establecer propiedades con tipos que no corresponden?
4579  //loEx = loEx;
4580  }
4581  }
4582  }
4583  }
4584  }
4585  }
4586  }
4587  return llOk;
4588  }
4589 
4590  //PE-85758
4595  protected void _DisposeShapeContainer(Microsoft.VisualBasic.PowerPacks.ShapeContainer toShapeContainer)
4596  {
4597  if (toShapeContainer != null && !toShapeContainer.IsDisposed)
4598  {
4599  if (toShapeContainer.Shapes != null)
4600  {
4601 
4602  List<Microsoft.VisualBasic.PowerPacks.Shape> llisShapes = new List<Microsoft.VisualBasic.PowerPacks.Shape>();
4603  foreach (Microsoft.VisualBasic.PowerPacks.Shape tshape in toShapeContainer.Shapes)
4604  {
4605  llisShapes.Add(tshape);
4606  }
4607  toShapeContainer.Shapes.Clear();
4608  toShapeContainer.Shapes.Dispose();
4609 
4610  foreach (Microsoft.VisualBasic.PowerPacks.Shape loShape in llisShapes)
4611  {
4612  loShape.Dispose();
4613  }
4614  }
4615  toShapeContainer.Dispose();
4616  }
4617  }
4618 
4619  [DllImport("user32")]
4620  private static extern IntPtr GetWindowDC(IntPtr hwnd);
4621 
4633  public virtual void _ControlError(Control toControl, string tcMensaje, ErrorIconAlignment toAlineamiento = ErrorIconAlignment.MiddleLeft)
4634  {
4635  _oErrorProvider.BlinkStyle = ErrorBlinkStyle.NeverBlink;
4636  _oErrorProvider.SetIconAlignment(toControl, toAlineamiento); // PARTE 93189. Se ha añadido el parámetro para poder pasarle la alineación
4637  _oErrorProvider.SetError(toControl, tcMensaje);
4638 
4639  // PE-92786. Obtener si ya hay algun error y concatenarlo
4640  string lcError = "";
4641  if (!string.IsNullOrWhiteSpace(tcMensaje))
4642  {
4643  lcError = this._oErrorProvider.GetError(this);
4644  lcError += (!string.IsNullOrWhiteSpace(lcError) ? Environment.NewLine : string.Empty) + tcMensaje;
4645  //if (toControl is IValidationControl)
4646  //{
4647  // ((IValidationControl)toControl)._ErrorValidation = true;
4648  //}
4649  }
4650  //else
4651  //{
4652  // if (toControl is IValidationControl)
4653  // {
4654  // ((IValidationControl)toControl)._ErrorValidation = false;
4655  // }
4656  //}
4657  }
4658 
4659 
4664  public virtual void _ShowDialog()
4665  {
4666  if(CanShow()) ShowDialog();
4667  }
4668 
4673  public virtual void _Show()
4674  {
4675  if (CanShow()) Show();
4676  }
4677 
4678  private bool CanShow()
4679  {
4680  if (this._NivelAcceso != _TiposAccesosPantalla.Denegado && !this.IsDisposed) //T114218
4681  {
4682  if (_SaveReuseFormSettings && Usuario._This._PosicionFormulario)
4683  {
4684  using (FormManagerProperties loFormManagerProperties = new FormManagerProperties(this))
4685  {
4686  _ReusingFormSettings = loFormManagerProperties._SetProperties();
4687  }
4688  }
4689 
4690  return true;
4691  }
4692 
4693  return false;
4694  }
4695 
4696 
4697 
4698  private List<IButtonBarraHerram> _oListButtonsSagePanel = null;
4699 
4703  internal List<IButtonBarraHerram> _ButtonsSagePanel
4704  {
4705  get
4706  {
4707  List<IButtonBarraHerram> loListButtonsAddons;
4708 
4709  if ( _oListButtonsSagePanel == null )
4710  {
4711  _oListButtonsSagePanel = new List<IButtonBarraHerram>();
4712 
4713  //Si la ayuda esta activa y hay ayuda o noticias
4714  if(AyudaActiva() && _oResultadoAyuda._Ayuda) _oListButtonsSagePanel.Add(new AyudaNoticiasPantalla(this, _oResultadoAyuda));
4715 
4716  _oListButtonsSagePanel.Add(new AyudaPantalla(this));
4717  _oListButtonsSagePanel.Add(new OpcionesPantalla(this));
4718 
4719  // Comprobar si hay que mostrar la opción de configuración de mensajes por usuario/pantalla
4720  if (_messageBoxAutomatic)
4721  _oListButtonsSagePanel.Add(new CfgUsabilidad(this));
4722 
4723  loListButtonsAddons = AddonsController.Instance.Methods.BindFormBarraHerram(_Pantalla);
4724  if (loListButtonsAddons is List<IButtonBarraHerram> && loListButtonsAddons.Count > 0) _oListButtonsSagePanel.AddRange(loListButtonsAddons);
4725  }
4726 
4727  return _oListButtonsSagePanel;
4728  }
4729  }
4730 
4734  protected virtual void _Show_Accesos()
4735  {
4736  _Show_Accesos(_Pantalla);
4737  }
4738 
4743  protected void _Show_Accesos(String lcPantalla)
4744  {
4745  // PE-92757. Usamos usuario estático
4746  if (!Usuario._This._Show_Gestion_Accesos(lcPantalla, _EliminarAcronimo(this.Text))) //PE-90297: pasamos el título de la pantalla también por si no existe en los accesos añadirlo
4747  {
4748  _MessageBox("El usuario activo no tiene permisos para gestionar accesos a pantallas.", MessageBoxButtons.OK, MessageBoxIcon.Stop, MessageBoxDefaultButton.Button1, DialogResult.OK);
4749  }
4750  }
4751 
4755  protected void _Show_Favoritos()
4756  {
4757  // PE-92757. Usamos usuario estático
4758  Usuario._This._Show_Favoritos(this._Pantalla, _EliminarAcronimo(this.Text)); //PE-92094: pasamos el título de la pantalla también, igual que en los accesos
4759  }
4760 
4766  private void gestiónDeFavoritosToolStripMenuItem_Click(object sender, EventArgs e)
4767  {
4768  this._Show_Favoritos();
4769  }
4770 
4776  private void gestiónDeAccesosToolStripMenuItem_Click(object sender, EventArgs e)
4777  {
4778  this._Show_Accesos();
4779  }
4780 
4787  private void crearAccesoDirectoToolStripMenuItem_Click(object sender, EventArgs e)
4788  {
4789  this._AsignarValoresAccesoDirecto();
4790  //Creem el acces directe
4791  sage.ew.functions.FUNCTIONS._CrearAccesoDirecto(_EliminarAcronimo(this.Text), this._Pantalla.Trim(), this._ValoresAccesoDirecto);
4792  }
4793 
4799  public virtual bool _AsignarValoresAccesoDirecto()
4800  {
4801  return false;
4802  }
4803 
4804  //PE-96746
4810  private void crearApunteCalendarioItem_Click(object sender, EventArgs e)
4811  {
4812  functions.FUNCTIONS._CrearNuevoApunteCalendario(this, _Pantalla);
4813  }
4814 
4815  // PARTE 101745
4821  private void ayudaPantallaToolStripMenuItem_Click(object sender, EventArgs e)
4822  {
4823  _MostrarAyudaPantalla();
4824  }
4825 
4830  {
4831  // Bug 154751. Mostrar o no la ayuda
4832  // _PantallaAyuda tiene el valor de _Pantalla inicialmente
4833  // De este modo podemos tener una pantalla sin gestión de accesos con la ayuda correspondiente
4834  if (_MostrarAyudaF1) FUNCTIONS._MostrarAyudaPantalla(this._PantallaAyuda);
4835  }
4836  // FPARTE 101745
4837 
4843  private void crearTareaProgramadaItem_Click(object sender, EventArgs e)
4844  {
4845  _CrearTareaProgramada(this._Pantalla);
4846  }
4847 
4853  private void ConfiguracionesUsuarioItem_Click(object sender, EventArgs e)
4854  {
4855  ConfigUserForm loConfig;
4856 
4857  // Guardar "Última configuración" antes de abrir el editor de configuraciones
4858  //ConfigUserOptionsUpdateLastValues();
4859 
4860  FormBase loFormClon = this.Clone();
4861  loFormClon._ConfigUserForm = this._ConfigUserForm;
4862  loFormClon._ConfigUserOptionsEditing = true;
4863 
4864  loConfig = ConfigurationDesignManager.ShowInDesign(loFormClon, this._ConfigUserForm);
4865 
4866  if (loConfig is ConfigUserForm)
4867  {
4868  _ConfigUserForm = loConfig;
4869  _ConfigUserOptionsLoad(_ConfigUserForm._dicOpciones);
4870  }
4871 
4872  loFormClon.Close();
4873  loFormClon.Dispose();
4874  loFormClon = null;
4875  }
4876 
4877  #region Opciones de menu para listados personalizables
4878 
4883  protected virtual void _CrearTareaProgramada(string tcPantalla)
4884  {
4885  }
4886 
4887 
4893  private void listadosPersonalizablesDuplicarItem_Click(object sender, EventArgs e)
4894  {
4895  this.Close();
4896 
4898  if (!loList._DuplicarListado(this._Pantalla))
4899  {
4900  sage.ew.functions.FUNCTIONS._MessageBox(loList._Error_Message, this.Text, //"Informes personalizables"
4901  MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
4902  }
4903  }
4904 
4910  private void listadosPersonalizablesEditarItem_Click(object sender, EventArgs e)
4911  {
4912  this.Close();
4913 
4915  if (!loList._CargarListado(this._Pantalla))
4916  {
4917  sage.ew.functions.FUNCTIONS._MessageBox(loList._Error_Message, this.Text, //"Informes personalizables"
4918  MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
4919  }
4920  }
4921 
4922  #endregion Opciones de menu para listados personalizables
4923 
4924  private void ShowPropertiesToolStripMenuItem_Click(object sender, EventArgs e)
4925  {
4926  if (Debugger.IsAttached)
4927  {
4928  if (_oTimerProperties is Timer)
4929  {
4930  ShowPropertiesToolStripMenuItem.Text = "Mostrar propiedades controles";
4931 
4932  _InfoToolTip.Active = false;
4933 
4934  _oTimerProperties.Stop();
4935  _oTimerProperties.Tick -= _oTimerProperties_Tick;
4936  _oTimerProperties.Dispose();
4937  _oTimerProperties = null;
4938  }
4939  else
4940  {
4941  ShowPropertiesToolStripMenuItem.Text = "Ocultar propiedades controles";
4942 
4943  _InfoToolTip.Active = true;
4944 
4945  _oTimerProperties = new Timer();
4946  _oTimerProperties.Tick += _oTimerProperties_Tick;
4947  _oTimerProperties.Interval = 500;
4948  _oTimerProperties.Start();
4949  }
4950  }
4951  }
4952 
4953  private void _oTimerProperties_Tick(object sender, EventArgs e)
4954  {
4955  Control loControl;
4956  Point loPos = Cursor.Position;
4957 
4958  if (Bounds.Contains(loPos))
4959  {
4960  loControl = _GetChild(loPos, this);
4961 
4962  if ((loControl is Control && string.IsNullOrEmpty(_ControlNameShowing)) || (loControl is Control && loControl.Name != _ControlNameShowing))
4963  {
4964  _ControlNameShowing = _InfoToolTip._GetControl(loControl).Name;
4965  _CreateTooltipInfo(loControl, loControl.DataBindings.Count > 0 ? loControl.Name : "");
4966  if(!loControl.Enabled) _InfoToolTip.Show(loControl.Name, this, PointToClient(loPos));
4967  }
4968  else if(loControl == null && !string.IsNullOrEmpty(_ControlNameShowing))
4969  {
4970  _InfoToolTip.Hide(this);
4971  _ControlNameShowing = string.Empty;
4972  }
4973  }
4974  else
4975  {
4976  _ControlNameShowing = string.Empty;
4977  }
4978  }
4979 
4980  private void _CreateTooltipInfo(Control toControl, string tcText = "")
4981  {
4982  string lcText;
4983 
4984  lcText = string.IsNullOrEmpty(tcText) ? toControl.DataBindings.Count > 0 ? toControl.Name : "" : tcText;
4985 
4986  if (!string.IsNullOrEmpty(lcText)) _InfoToolTip._ControlToolTip(toControl, lcText);
4987 
4988  if (toControl.Controls.Count > 0)
4989  {
4990  foreach (Control loControl in toControl.Controls)
4991  {
4992  lcText = string.IsNullOrEmpty(tcText) ? loControl.DataBindings.Count > 0 ? loControl.Name : "" : tcText;
4993 
4994  if (!string.IsNullOrEmpty(lcText))
4995  {
4996  _InfoToolTip._ControlToolTip(loControl, lcText);
4997  }
4998 
4999  if (loControl.Controls.Count > 0)
5000  {
5001  _CreateTooltipInfo(loControl, lcText);
5002  }
5003  }
5004  }
5005  }
5006 
5007  private string _ControlNameShowing;
5008 
5015  public Control _GetChild(Point toPoint, Control toBase)
5016  {
5017  Control loControl = null;
5018 
5019  if(toBase is Control) loControl = toBase.GetChildAtPoint(toBase.PointToClient(toPoint), GetChildAtPointSkip.Invisible | GetChildAtPointSkip.Transparent);
5020 
5021  return loControl?.Controls.Count > 0 && loControl?.DataBindings.Count == 0? _GetChild(toPoint, loControl) : loControl;
5022  }
5023 
5036  private void nombreFormularioToolStripMenuItem_Click(object sender, EventArgs e)
5037  {
5038  frmInfoFormul loFormul = new frmInfoFormul();
5039 
5040  //Cabecera Información
5041  loFormul.AddHeader("Información");
5042 
5043  //Titulo del formulario
5044  loFormul.AddLine("Título", _EliminarAcronimo(this.Text));
5045 
5046  //Libreria
5047  loFormul.AddLine("Librería", System.Reflection.Assembly.GetAssembly(this.GetType()).Location);
5048 
5049  //Clase
5050  loFormul.AddLine("Clase", this.GetType().Name);
5051 
5052  //Pantalla. Presentamos el valo de _PantallaAyuda
5053  if (!string.IsNullOrWhiteSpace(_PantallaAyuda))
5054  loFormul.AddLine("Pantalla", _PantallaAyuda.Trim().ToUpper());
5055 
5056  //S50MIG-3188 Añadir namespace
5057  loFormul.AddLine("Namespace", GetType().Namespace);
5058 
5059  //Addons
5060  Dictionary<string, object> loAddons = null;
5061  if (this is FormMante && (this as FormMante)._ewMante != null && (this as FormMante)._ewMante._Addons != null)
5062  {
5063  loAddons = (this as FormMante)._ewMante._Addons;
5064  }
5065  else if (this is frmGestionPerfil && (this as frmGestionPerfil)._Documento != null && (this as frmGestionPerfil)._Documento._Addons != null)
5066  {
5067  loAddons = (this as frmGestionPerfil)._Documento._Addons;
5068  }
5069  else if (this is FormListado && (this as FormListado)._Addons != null)
5070  {
5071  loAddons = (this as FormListado)._Addons;
5072  }
5073 
5074  if (loAddons != null && loAddons.Count > 0)
5075  {
5076  //Cabecera addons
5077  loFormul.AddHeader("Add-ons");
5078  //Info de addons
5079  string lcDllAddon = "", lcSubjectName = "";
5080  foreach (KeyValuePair<string, object> loItem in loAddons)
5081  {
5082  try
5083  {
5084  // Obtenemos el objeto de extensiones y lo configuramos
5085  //loExtension = (_ExtensionMante)loItem.Value;
5086  string lcName = "", lcTmp = "";
5088  {
5089  //Ruta a la dll
5090  lcDllAddon = (AddonsController.Instance.AddonsManager.GetAddon(loItem.Key) as IModulo)._Libreria + ".dll";
5091  lcTmp = lcDllAddon;
5092  //Qui la firma
5093  lcSubjectName = FUNCTIONS.GetDllNameInfo(lcDllAddon);
5094  if (!string.IsNullOrWhiteSpace(lcSubjectName))
5095  lcTmp += " (" + lcSubjectName + ")";
5096  else
5097  lcTmp += " (Sin firmar)";
5098  //Quin tipus es
5099  int lnTipo = (AddonsController.Instance.AddonsManager.GetAddon(loItem.Key) as IModulo)._Tipo;
5100  switch (lnTipo)
5101  {
5102  case 2:
5103  lcTmp += " - Extensión contratable";
5104  break;
5105  case 3:
5106  lcTmp += " - Extensión personalizada";
5107  break;
5108  case 1:
5109  case 0:
5110  default:
5111  lcTmp += " - Extensión incluida";
5112  break;
5113  }
5114  //Nom del addon a mostrar
5115  lcName = (AddonsController.Instance.AddonsManager.GetAddon(loItem.Key) as IModulo)._Nombre2;
5116  if (string.IsNullOrWhiteSpace(lcName))
5117  lcName = loItem.Key;
5118 
5119  //Afegim una linia per cada addon
5120  loFormul.AddLine(lcName, lcTmp);
5121  }
5122  }
5123  catch (Exception loError)
5124  {
5125  DB.Registrar_Error(loError);
5126  }
5127  }
5128  }
5129 
5130  //Mostramos el formulario
5131  loFormul._ShowDialog();
5132  }
5133 
5139  protected string _EliminarAcronimo(String toText)
5140  {
5141  String lcText = toText;
5142 
5143  if (!String.IsNullOrEmpty(_Acronimo)) lcText = lcText.Replace(_Acronimo, "");
5144  lcText = lcText.TrimStart();
5145 
5146  return lcText;
5147  }
5148 
5149 
5155  private void reordenarPantallasToolStripMenuItem_Click(object sender, EventArgs e)
5156  {
5157  // PE-103085
5158  //NETVFP._Reordenar_Pantallas();
5159  //NETVFP._Ejecutar_Funcion_VFP("fPripals50.Reordenar_pantallas");
5160  }
5161 
5162  private void contextMenuStripPantalla_Opening(object sender, CancelEventArgs e)
5163  {
5164  contextMenuStripPantalla.Items["gestiónDeFavoritosToolStripMenuItem"].Image = sage.ew.images.Properties.Resources.favorite_16;
5165  contextMenuStripPantalla.Items["gestiónDeAccesosToolStripMenuItem"].Image = sage.ew.images.Properties.Resources.access_16;
5166  contextMenuStripPantalla.Items["crearAccesoDirectoToolStripMenuItem"].Image = sage.ew.images.Properties.Resources.link_16;
5167  contextMenuStripPantalla.Items["crearTareaProgramadaItem"].Image = sage.ew.images.Properties.Resources.TimeProgram; //TODO: utilizar otro icono
5168  contextMenuStripPantalla.Items["ShowPropertiesToolStripMenuItem"].Image = _oTimerProperties is null ? Resources.led_green_16 : Resources.led_red_16;
5169 
5170  bool lbSage50 = Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_sage50"));
5171 
5172  //Acces directe sols per a Sage50
5173  if (!lbSage50)
5174  contextMenuStripPantalla.Items["crearAccesoDirectoToolStripMenuItem"].Visible = false;
5175  else
5176  contextMenuStripPantalla.Items["crearAccesoDirectoToolStripMenuItem"].Visible = _MostrarCrearAccesoDirecto; // PE-99866. Comprobar si mostar el ménu crear acceos directos
5177 
5178  //Task 104592: Crear tarea programada
5179  if (!lbSage50)
5180  contextMenuStripPantalla.Items["crearTareaProgramadaItem"].Visible = false;
5181  else
5182  contextMenuStripPantalla.Items["crearTareaProgramadaItem"].Visible = _MostrarCrearTareaProgramada;
5183 
5184  //PE-96746
5185  contextMenuStripPantalla.Items["crearApunteCalendarioItem"].Image = sage.ew.images.Properties.Resources.calendar_16;
5186 
5187  //PE-103520 : listados personalizables
5188  contextMenuStripPantalla.Items["listadosPersonalizablesEditarItem"].Image = sage.ew.images.Properties.Resources.mant_edit_16;
5189  contextMenuStripPantalla.Items["listadosPersonalizablesDuplicarItem"].Image = sage.ew.images.Properties.Resources.duplicate_16;
5190 
5191 
5192  if (this is sage.ew.formul.Forms.FormListado)
5193  {
5194  if (!((sage.ew.formul.Forms.FormListado)this)._Personalizado)
5195  {
5196  contextMenuStripPantalla.Items["listadosPersonalizablesEditarItem"].Visible = false;
5197  if (!lbSage50)
5198  {
5199  contextMenuStripPantalla.Items["listadosPersonalizablesDuplicarItem"].Visible = false;
5200  }
5201  else
5202  {
5203  contextMenuStripPantalla.Items["listadosPersonalizablesDuplicarItem"].Visible = _MostrarDuplicarListado;
5204  }
5205  }
5206  }
5207  else
5208  {
5209  contextMenuStripPantalla.Items["listadosPersonalizablesEditarItem"].Visible = false;
5210  contextMenuStripPantalla.Items["listadosPersonalizablesDuplicarItem"].Visible = false;
5211  }
5212 
5213  ConfigureConfigUserOptions();
5214 
5215  //PE-104540 - PE-104527 : Amagar l'opció de "Duplicar y editar el listado personalizable"
5216  //contextMenuStripPantalla.Items["listadosPersonalizablesDuplicarItem"].Visible = false;
5217  }
5218 
5222  private void ConfigureConfigUserOptions()
5223  {
5224  configuracionesUsuarioItem.Image = sage.ew.images.Properties.Resources.icon_wrench;
5225 
5226  if (Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_sage50")) && _ConfigUserOptionsAllowed)
5227  {
5228  // Guardar "Última configuración"
5229  //ConfigUserOptionsUpdateLastValues();
5230 
5231  configuracionesUsuarioItem.Visible = true;
5232  configuracionesUsuarioItemSeparator.Visible = true;
5233  configuracionesUsuarioItem.DropDownItems.Clear();
5234 
5235  configuracionesUsuarioItem.DropDownItems.Add(toolConfiguracionesToolStripMenuItem);
5236 
5237  // Mostrar configuraciones de usuario
5238  IEnumerable<ConfigUserForm> loList = _ConfigUserForm._ListaConfiguraciones().AsEnumerable();
5239  IEnumerable<ConfigUserForm> loListConfUsers = loList.Where(f => f._Tipo == ConfigUserForm.ConfigUserType.UserValuesConfig);
5240  IEnumerable<ConfigUserForm> loListDefaultConfUsers = loList.Where(f => f._Tipo != ConfigUserForm.ConfigUserType.UserValuesConfig);
5241 
5242  // Mostrar configuraciones del usuario
5243  _GenerateMenuItemsConfigUser(loListConfUsers.Where(f => !f._Publico));
5244  // Mostrar configuraciones públicas
5245  _GenerateMenuItemsConfigUser(loListConfUsers.Where(f => f._Publico));
5246  // Mostrar configuraciones base
5247  _GenerateMenuItemsConfigUser(loListDefaultConfUsers);
5248  }
5249  else
5250  {
5251  configuracionesUsuarioItem.Visible = false;
5252  configuracionesUsuarioItemSeparator.Visible = false;
5253  }
5254  }
5255 
5256  private void _GenerateMenuItemsConfigUser(IEnumerable<ConfigUserForm> toListConfigUsers)
5257  {
5258  if (toListConfigUsers != null && toListConfigUsers.Count() > 0)
5259  {
5260  configuracionesUsuarioItem.DropDownItems.Add(new ToolStripSeparator());
5261 
5262  foreach (ConfigUserForm loConfig in toListConfigUsers)
5263  {
5264  ToolStripMenuItem loMenuItem = new ToolStripMenuItem();
5265 
5266  loMenuItem.Text = loConfig._Config;
5267  loMenuItem.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
5268  loMenuItem.Click += LoadConfigUserMenuItem_Click;
5269  loMenuItem.Tag = loConfig;
5270 
5271  if (_ConfigUserForm._Config.Trim() == loConfig._Config.Trim()) loMenuItem.Image = sage.ew.images.Properties.Resources.icon_right;
5272 
5273  configuracionesUsuarioItem.DropDownItems.Add(loMenuItem);
5274  }
5275  }
5276  }
5277 
5283  private void LoadConfigUserMenuItem_Click(object sender, EventArgs e)
5284  {
5285  if (sender is ToolStripMenuItem && ((ToolStripMenuItem)sender).Tag is ConfigUserForm)
5286  {
5287  ConfigUserForm loConfig = ((ToolStripMenuItem)sender).Tag as ConfigUserForm;
5288 
5289  // Antes de cargar la nueva configuración, guardamos "Última configuración"
5290  //ConfigUserOptionsUpdateLastValues();
5291 
5292  // Cargar nueva configuración
5293  _ConfigUserForm = loConfig;
5294  _ConfigUserOptionsLoad(_oConfigUserForm._dicOpciones);
5295  }
5296  }
5297 
5303  {
5304  return sage.ew.functions.FUNCTIONS._PermitirApunteCalendario(_Pantalla);
5305  }
5306 
5307  #region Forzar Fuente
5308 
5313  protected override void OnShown(EventArgs e)
5314  {
5315  base.OnShown(e);
5316 
5317  if (EW_GLOBAL._EsEjecutable && _CambiarFuente)
5318  {
5319  if (Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_sage50")))
5320  {
5321  if (estiloRevisado == false)
5322  {
5323  foreach (Control loControl in Controls)
5324  {
5325  FUNCTIONS._Cambiar_Font(loControl, "Segoe UI");
5326  }
5327  }
5328  }
5329  else
5330  {
5331  foreach (Control loControl in Controls)
5332  {
5333  FUNCTIONS._Cambiar_Font(loControl, "Arial");
5334  }
5335  }
5336  }
5337 
5338  // Bug 111565. En caso de abrir un formulario en modo MODAL, no dejamos minimizarlo
5339  if (this.Modal)
5340  this.MinimizeBox = false;
5341 
5342  //Asignem els parametres del formulari suposant que en tingui
5343  this._EstablecerParametrosFormulario();
5344  }
5345 
5346  #endregion Forzar Fuente
5347 
5351  protected List<ToolStripMenuItemBase> _ToolStripMenuItemsBase = new List<ToolStripMenuItemBase>();
5352 
5362  protected internal ToolStripMenuItemBase _AddToolStripMenuItemBase(string tcNombre, string tcNombre_Objeto, string tcTooltip)
5363  {
5364  ToolStripMenuItemBase loToolStripMenuItem = new ToolStripMenuItemBase(tcNombre, tcNombre_Objeto, tcTooltip);
5365 
5366  _ToolStripMenuItemsBase.Add(loToolStripMenuItem);
5367 
5368  return loToolStripMenuItem;
5369  }
5370 
5377  protected internal void _GetOpcionesInvoke(object sender)
5378  {
5379  if (this is frmGestionPerfil || this is contabilidad.frmAsientos || this is frmListasPrevias || this.Name == "frmPrincipal")
5380  _GetOpciones?.Invoke(new EventArgsOpciones(sender, _ToolStripMenuItemsBase));
5381  else
5382  throw new Exception("Este formulario no tiene ningún botón de Opciones o no está preparado para acceder a él");
5383  }
5384 
5390  private void GetOpcionesHerramientasInvoke(object sender , List<ToolStripMenuItemBase> tlstToolStripMenuItemsBase)
5391  {
5392  _GetOpcionesHerramientas?.Invoke(new EventArgsOpciones(sender, tlstToolStripMenuItemsBase));
5393  }
5394 
5395  // Task 111119 - 115209
5401  public virtual bool _InsertarObjetoAddon(Control toControl)
5402  {
5403  bool lITabDocAddon = false, llOk = true;
5404  Control loControlContenedor = this; // Asignamos donde vamos a agregar los controles
5405  string lcNombre_Objeto = toControl.Name;
5406 
5407  lITabDocAddon = toControl is IAddonTabDoc;
5408 
5409  if (lITabDocAddon)
5410  llOk = AddonInsertarTabDocAddon(toControl, ref loControlContenedor);
5411  else if ((toControl is IAddonBotonMenuDoc) && (toControl is Button)) // Task 123210: Creación de botones en la barra de herramientas de los Mantes
5412  llOk = AddonBotonMenuDoc(toControl);
5413 
5414  if (llOk)
5415  loControlContenedor.Controls.Add(toControl);
5416 
5417  return llOk;
5418  }
5419 
5425  public virtual bool _InsertarObjetoAddon(ToolStripItem toolStripButtonAddonMante)
5426  {
5427  return true;
5428  }
5429 
5434  protected internal virtual void _AddonPrepararMenu(ewcontextmenustrip toMenuStrip)
5435  {
5436  if (this.lstOpcionesMenuAddon != null && this.lstOpcionesMenuAddon.Count > 0)
5437  {
5438  string lcTituloMenu, lcName;
5439  bool llSeparador = true;
5440 
5441  foreach (Control loControl in this.lstOpcionesMenuAddon)
5442  {
5443  lcTituloMenu = ((IAddonBotonMenuDoc)loControl)._TituloMenu.Trim();
5444 
5445  if (llSeparador && toMenuStrip.Items.Count > 0) // Añadimos un separador
5446  {
5447  toMenuStrip.Items.Add("-");
5448  llSeparador = false;
5449  }
5450 
5451  toMenuStrip.Items.Add(lcTituloMenu);
5452 
5453  lcName = loControl.Name;
5454 
5455  if (string.IsNullOrWhiteSpace(lcName)) // Si el botón no tiene nombre le voy a asignar uno. Luego se realizará una búsqueda por el nombre del control
5456  {
5457  lcName = Convert.ToString(Guid.NewGuid()).ToUpper();
5458  loControl.Name = lcName;
5459  }
5460 
5461  toMenuStrip.Items[toMenuStrip.Items.Count - 1].Name = lcName;
5462  toMenuStrip.Items[toMenuStrip.Items.Count - 1].Click += new EventHandler(FormManteOpcionesAddon_Click);
5463  }
5464  }
5465  }
5466  // FTask 123210: Creación de botones en la barra de herramientas de los Mantes
5467 
5473  private void FormManteOpcionesAddon_Click(object sender, EventArgs e)
5474  {
5475  string lcName = (sender as ToolStripMenuItem).Name;
5476 
5477  Control[] loControl = this.Controls.Find(lcName, true);
5478 
5479  if (loControl != null)
5480  {
5481  try
5482  {
5483  ((ewbutton)loControl[0]).Enabled = true;
5484  ((ewbutton)loControl[0]).PerformClick(); // No sabemos el código que se ha programado. Si da error ...
5485  }
5486  catch (Exception loEx)
5487  {
5488  if (Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_prueva")) || System.Diagnostics.Debugger.IsAttached) // Gestión de error
5489  this._MessageBox("Se ha producido la siguiente incidencia en la ejecución de la opción " + (sender as ToolStripMenuItem).Text.Trim() + ": " + Environment.NewLine + Environment.NewLine + loEx.Message, MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, DialogResult.OK);
5490  }
5491  }
5492  }
5493 
5498  private bool AddonBotonMenuDoc(Control toControl)
5499  {
5500  IAddonBotonMenuDoc loIAddonBotonMenuDoc = (IAddonBotonMenuDoc)toControl;
5501 
5502  this.lstOpcionesMenuAddon.Add(toControl); // Añadimos la opción a la lista
5503 
5504  // La propiedad _Menu no la vamos a utilizar, únicamente es para los perfiles
5505  if (string.IsNullOrWhiteSpace(loIAddonBotonMenuDoc._TituloMenu) && toControl is ewbutton && !string.IsNullOrWhiteSpace(toControl.Text)) // Si no tiene título la opción, asignaremos el texto del botón
5506  loIAddonBotonMenuDoc._TituloMenu = toControl.Text;
5507 
5508  // Cambiamos la posición del control para que no se vea. No lo podemos hacer invisible o al hacer el PerformClick no se ejecutará
5509  toControl.Left = -10000;
5510  toControl.Top = -10000;
5511  toControl.Width = 1;
5512  toControl.Height = 1;
5513 
5514  AddonBotonMenuDocDocumento(toControl);
5515 
5516  return true;
5517  }
5518 
5523  private void AddonBotonMenuDocDocumento(Control toControl)
5524  {
5525  dynamic loDocumento = null;
5526 
5527  if (toControl is IAddonBotonMenuDoc)
5528  {
5529  if (this is FormMante)
5530  loDocumento = ((FormMante)this)._ewMante;
5531  else if (this is FormBaseDocumento)
5532  loDocumento = ((FormBaseDocumento)this)._Documento;
5533 
5534  if (loDocumento != null)
5535  {
5536  IAddonBotonMenuDoc loIAddonBotonMenuDoc = ((IAddonBotonMenuDoc)toControl);
5537  loIAddonBotonMenuDoc._Documento = loDocumento;
5538  }
5539  }
5540  }
5541 
5547  private void ControlRefreshRecursive(Control toContenedor, bool tlChild = false)
5548  {
5549  if (!toContenedor.HasChildren)
5550  return;
5551 
5552  foreach (Control loControlChild in toContenedor.Controls)
5553  _ControlRefresh(loControlChild, tlChild);
5554  }
5555 
5561  public void _ControlRefresh(Control toControl, bool tlChild = false)
5562  {
5563  if (toControl == null)
5564  return;
5565 
5566  dynamic loControlDynamic = toControl;
5567  bool llRefresh = (toControl is IAddonTabDoc);
5568 
5569  if (llRefresh)
5570  {
5571  Type ltType = Type.GetType(loControlDynamic.GetType().AssemblyQualifiedName);
5572 
5573  MethodInfo objMethod = ltType.GetMethod("_Refresh"); // Busca la propiedad pública con el nombre especificado, si no la encuentra devuelve null
5574  llRefresh = (objMethod != null);
5575  }
5576 
5577  if (llRefresh)
5578  {
5579  try
5580  {
5581  loControlDynamic._Refresh();
5582  }
5583  catch (Exception loEx)
5584  {
5585  if (Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_prueva")) || System.Diagnostics.Debugger.IsAttached)
5586  this._MessageBox("Se ha producido la siguiente incidencia en la ejecución del método Refresh del control " + toControl.Name + ": " + Environment.NewLine + Environment.NewLine + loEx.Message, MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, DialogResult.OK);
5587  }
5588  }
5589 
5590  ControlRefreshRecursive(toControl);
5591  }
5592 
5599  private void ControlDocumentoRecursive(Control toContenedor, dynamic toDocumento, bool tlChild = false)
5600  {
5601  if (!toContenedor.HasChildren)
5602  return;
5603 
5604  foreach (Control loControlChild in toContenedor.Controls)
5605  _ControlDocumento(loControlChild, toDocumento, tlChild);
5606  }
5607 
5614  public void _ControlDocumento(Control toControl, dynamic toDocumento, bool tlChild = false)
5615  {
5616  if (toControl == null || toDocumento == null)
5617  return;
5618 
5619  dynamic loControlDynamic = toControl;
5620  bool llDocumento = (toControl is IAddonTabDoc);
5621 
5622  if (!llDocumento)
5623  {
5624  Type ltType = Type.GetType(loControlDynamic.GetType().AssemblyQualifiedName);
5625 
5626  MemberInfo[] objMember = ltType.GetMember("_Documento");
5627  llDocumento = (objMember.Length > 0);
5628  }
5629 
5630  if (llDocumento)
5631  {
5632  try
5633  {
5634  loControlDynamic._Documento = toDocumento;
5635  }
5636  catch (Exception loEx)
5637  {
5638  if (Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_prueva")) || System.Diagnostics.Debugger.IsAttached)
5639  this._MessageBox("Se ha producido la siguiente incidencia en la asignación del documento al control " + toControl.Name + ": " + Environment.NewLine + Environment.NewLine + loEx.Message, MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, DialogResult.OK);
5640  }
5641  }
5642 
5643  ControlDocumentoRecursive(toControl, toDocumento, tlChild);
5644  }
5645 
5652  private bool AddonInsertarTabDocAddon(Control toControl, ref Control toControlContenedor)
5653  {
5654  bool llOk = false;
5655  ewtabcontrol loewtabcontrol = null;
5656 
5657  foreach (Control loControl in Controls) // De momento no es necesario realizarlo recursivamente
5658  {
5659  if (loControl is ewtabcontrol)
5660  {
5661  loewtabcontrol = (ewtabcontrol)loControl;
5662  break;
5663  }
5664  }
5665 
5666  if (loewtabcontrol != null)
5667  {
5668  Control loPagina = AddonNuevaPaginaTabDoc(toControl, loewtabcontrol);
5669 
5670  ewFlowLayoutPanel loewFlowLayoutPanel = this.AddonNuevoFlowLayoutPanel();
5671  loewFlowLayoutPanel.Size = loewtabcontrol.TabPages[0].Size; // Asignamos las dimensiones de la primera página
5672  loewFlowLayoutPanel.Dock = DockStyle.Fill;
5673  loPagina.Controls.Add(loewFlowLayoutPanel); // Agregamos el flowlayout a la página para la gestión de las barras
5674  loPagina.Dock = DockStyle.Fill;
5675 
5676  toControlContenedor = loewFlowLayoutPanel; // Agregaremos el addon en el flowlayout de la página, por tanto actualizamos el controlContenedor
5677 
5678  llOk = true;
5679  }
5680 
5681  return llOk;
5682  }
5683 
5688  private ewFlowLayoutPanel AddonNuevoFlowLayoutPanel()
5689  {
5690  ewFlowLayoutPanel loewFlowLayoutPanel = new ewFlowLayoutPanel();
5691 
5692  loewFlowLayoutPanel.AutoScroll = true;
5693  loewFlowLayoutPanel.WrapContents = true;
5694 
5695  //if llResizeAddon
5696  // loewFlowLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; // MEJORA: _Resize: Si nos interesa que el usuario gestiona el resize
5697  // loewFlowLayoutPanel.Size = toControl.Size; // Asignamos las dimensiones del control
5698 
5699  return loewFlowLayoutPanel;
5700  }
5701 
5707  private string AddonNombrePagina(ewtabcontrol toewtabcontrol)
5708  {
5709  string lcName = string.Empty;
5710 
5711  lcName = "AddonPagina" + Convert.ToString(toewtabcontrol.TabPages.Count);
5712 
5713  return lcName;
5714  }
5715 
5722  private Control AddonNuevaPaginaTabDoc(Control toControl, ewtabcontrol toewtabcontrol)
5723  {
5724  Control loControlewTabPage = null;
5725  string lcewtabcontrol = toewtabcontrol.Name, lcTitulo = string.Empty, lcName = string.Empty;
5726  IAddonTabDoc loIAddonTabDoc = (IAddonTabDoc)toControl;
5727 
5728  loControlewTabPage = new ewTabPage();
5729 
5730  lcName = toControl.Name;
5731 
5732  if (string.IsNullOrWhiteSpace(lcName))
5733  lcName = AddonNombrePagina(toewtabcontrol);
5734 
5735  loControlewTabPage.Name = lcName;
5736  loControlewTabPage.Text = loIAddonTabDoc._TituloPagina; // Indicamos el título de la página
5737 
5738  toewtabcontrol.Controls.Add(loControlewTabPage);
5739 
5740  if (loIAddonTabDoc._Principal) // Añadimos el tabpage como página principal
5741  {
5742  ewTabPage loewTabPage = (ewTabPage)loControlewTabPage;
5743 
5744  CambiarIndiceTabpage(toewtabcontrol, loewTabPage, 0);
5745  }
5746 
5747  return loControlewTabPage;
5748  }
5749 
5756  private void CambiarIndiceTabpage(ewtabcontrol toewtabcontrol, ewTabPage toewTabPage, int tnNuevoIndice)
5757  {
5758  ewTabPage loewTabPage;
5759 
5760  int lnIndiceTabPage = toewtabcontrol.TabPages.IndexOf(toewTabPage); // Buscamos el índice de la página que hemos agregado
5761 
5762  for (int lnIndice = 0; lnIndice < lnIndiceTabPage; lnIndice++)
5763  {
5764  loewTabPage = (ewTabPage)toewtabcontrol.TabPages[0];
5765 
5766  toewtabcontrol.TabPages.Remove(loewTabPage);
5767  toewtabcontrol.TabPages.Add(loewTabPage);
5768  }
5769 
5770  // toewtabcontrol.TabPages.Insert(tnNuevoIndice, toewTabPage); // De momento como no funciona, hemos realizado el recorrido de las diferentes páginas
5771  }
5772 
5773  // FTask 111119 - 115209
5774 
5775  #region Ayuda contextual
5776  private bool _lFormActivated = true;
5777  private bool _lPresentandoAyuda = false;
5778  private BackgroundWorker _oBackgroundWorker;
5779  private FormPanelNotificaciones _oFormAyuda = null;
5780 
5784  private string _cTituloFormulario = "";
5785 
5789  public struct oResultadoAyuda
5790  {
5794  public bool _Ayuda
5795  {
5796  get { return _lAyuda; }
5797  set { _lAyuda = value; }
5798  }
5799  bool _lAyuda;
5800 
5804  public IAyudaContextual _AyudaContextual
5805  {
5806  get { return _oAyudaContextual; }
5807  set { _oAyudaContextual = value; }
5808  }
5810 
5814  public IOnBoardingController _OnBoardingController
5815  {
5816  get { return _oOnBoardingController; }
5817  set { _oOnBoardingController = value; }
5818  }
5820  }
5821 
5826  private bool AyudaActiva()
5827  {
5828 
5829  if (Usuario._This._Opcesp("5004")) // No presentar ayuda en pantallas de Sage 50c
5830  return false;
5831 
5832  bool llActiva = true;
5833 
5834  object loObject = EW_GLOBAL._GetVariable("wl_DesactivarOnBoarding");
5835 
5836  if (loObject != null)
5837  {
5838  try
5839  {
5840  llActiva = !Convert.ToBoolean(loObject); // Tendremos que "wl_DesactivarOnBoarding" es true por eso negamos
5841  }
5842  catch (Exception)
5843  {
5844  }
5845  }
5846 
5847  return llActiva;
5848  }
5849 
5854  protected virtual string _PantallaAyuda
5855  {
5856  get { return _Pantalla; }
5857  }
5858 
5862  private bool _lPantalla0Showed = false;
5863 
5867  private bool _lPantalla0ShowAfterLogin = false;
5868 
5872  private void AyudaOnBoarding()
5873  {
5874  if (!IsDisposed && !Disposing )
5875  {
5876  if (BarrasAyudaActivas())
5877  {
5878  if (string.IsNullOrWhiteSpace(_PantallaAyuda) || !AyudaActiva() || botonayuda == eAyudaContextual.Desactivada)
5879  {
5880  _FormSagePanel?._Show(_ButtonsSagePanel, this);
5881  }
5882  else
5883  {
5884  // Declaro un nuevo elemento
5885  _oBackgroundWorker = new BackgroundWorker();
5886  _oBackgroundWorker.WorkerSupportsCancellation = true;
5887  _oBackgroundWorker.WorkerReportsProgress = false;
5888 
5889  // Declaro los procesos
5890  _oBackgroundWorker.DoWork += new DoWorkEventHandler(_ExecuteRunWorkerAyuda);
5891  _oBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_RunWorkerCompletedAyuda);
5892 
5893  // Ejecución asíncrona
5894  _oBackgroundWorker.RunWorkerAsync();
5895  }
5896  }
5897  }
5898  }
5899 
5900  private bool BarrasAyudaActivas()
5901  {
5902  DataTable loDt = new DataTable();
5903  string lcDataBase, lcComunes, lcSql;
5904 
5905  if (!EW_GLOBAL._ContainsKey("wl_barras_ayuda_form"))
5906  {
5908  lcDataBase = DB.SQLDatabaseReal(lcComunes, "VARIABLE");
5909 
5910  lcSql = $"SELECT VALOR FROM {lcDataBase} WHERE VARIABLE = 'NO_AYUDA' ";
5911  if(DB.SQLExec(lcSql, ref loDt)) EW_GLOBAL.ValorEnClave_VarGlob("wl_barras_ayuda_form", loDt.Rows.Count == 0);
5912  }
5913 
5914  return Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_barras_ayuda_form", true));
5915  }
5916 
5922  private void _ExecuteRunWorkerAyuda(object sender, DoWorkEventArgs e)
5923  {
5924  oResultadoAyuda loResult = new oResultadoAyuda();
5925  loResult._Ayuda = false; // Asignamos el false por defecto
5926 
5927  try
5928  {
5929  IOnBoardingController loOnBoardingController = FUNCTIONS._OnBoardingController();
5930 
5931  if (loOnBoardingController != null && !loOnBoardingController._PlayingVideo)
5932  {
5933  IAyudaContextual loAyudaContextual = new AyudaContextual(loOnBoardingController);
5934  loAyudaContextual._Load(_PantallaAyuda.ToUpper());
5935 
5936  if (loAyudaContextual != null && (loAyudaContextual._Categorias.Count > 0 || loAyudaContextual._NumeroTotalNoticias > 0))
5937  {
5938  loResult._OnBoardingController = loOnBoardingController;
5939  loResult._AyudaContextual = loAyudaContextual;
5940  loResult._Ayuda = true;
5941  }
5942  }
5943  }
5944  catch (Exception loEx)
5945  {
5946  DB.Registrar_Error(loEx);
5947  }
5948 
5949  e.Result = loResult; // Asignamos el retorno
5950  }
5951 
5957  private void _RunWorkerCompletedAyuda(object sender, RunWorkerCompletedEventArgs e)
5958  {
5959  if (!e.Cancelled && e.Error == null &&!FormDisposed()) // Si no he sido cancelado ni he registrado excepción
5960  {
5961  _oResultadoAyuda = ((oResultadoAyuda)e.Result);
5962 
5963  if (_oResultadoAyuda._Ayuda)
5964  _BotonAyuda = eAyudaContextual.Si;
5965 
5966  //CambiarBotonAyudaMensaje();
5967 
5968  if (PresentarAyudaNuevasNoticias(_oResultadoAyuda))
5969  {
5970  if (EsPantalla0)
5971  {
5972  _oResultadoAyuda._Ayuda = true;
5973 
5974  if (_lPantalla0ShowAfterLogin && !_lPantalla0Showed && Ayuda_FormularioActivo()) // Si ha entrado el Usuario y no ha presentado aún el WalkTrought, ahora lo presentamos si no hay ninguna pantalla abierta
5975  _WalkthroughsPantalla0();
5976  }
5977  //else
5978  // MostrarAyuda(_oResultadoAyuda._AyudaContextual);
5979  }
5980 
5981  _FormSagePanel?._Show(_ButtonsSagePanel, this);
5982  }
5983  }
5984 
5994  private bool PresentarAyudaNuevasNoticias(oResultadoAyuda toResultadoAyuda)
5995  {
5996 
5997  // Si la pantalla no tiene ayuda podemos salir
5998  if (!_oResultadoAyuda._Ayuda)
5999  return false;
6000 
6001  // Tenemos activada la ayuda
6002  if ( _oResultadoAyuda._AyudaContextual._PresentacionAyuda != Presentacion.No)
6003  return true;
6004 
6005  // Existe alguna noticia nueva a partir de la fecha que el usuario marcó no volver a presentar la ayuda
6006  if (_oResultadoAyuda._AyudaContextual._NoticiasNuevasPendientesLeer > 0)
6007  return true;
6008 
6009  return false;
6010  }
6011 
6015  private bool EsPantalla0
6016  {
6017  get { return _PantallaAyuda == "PANTALLA0"; }
6018  }
6019 
6024  protected bool _WalkthroughsPantalla0()
6025  {
6026  _lPantalla0ShowAfterLogin = true; // Marcamos que ya ha pasado por el AfterLogin que es el único lugar de donde se realiza la llamada
6027 
6028  if (EsPantalla0 && !FUNCTIONS._CanUseWebView()) // No presentamos mensaje, validamos si tenemos el RunTime del WebView2 independientemente de que tengamos o no información de la pantalla 0
6029  return false;
6030 
6031  if (_oResultadoAyuda._Ayuda == false || !EsPantalla0 || _lPantalla0Showed)
6032  return false;
6033 
6034  _lPantalla0Showed = true; // De momento marcamos que ya se ha visto o podrian salir dos instancias
6035 
6036  IOnBoardingController loOnBoardingController = FUNCTIONS._OnBoardingController();
6037 
6038  if (loOnBoardingController != null)
6039  {
6040  _lPantalla0Showed = ((OnBoardingControllerSage50)loOnBoardingController)._ShowWalkthroughs(_oResultadoAyuda._AyudaContextual);
6041 
6042  return _lPantalla0Showed;
6043  }
6044  else
6045  return false;
6046  }
6047 
6053  private Point CalculateLocationAyuda(Rectangle toRectangle)
6054  {
6055  Rectangle loRectScreen = Screen.PrimaryScreen.WorkingArea;
6056  Point loPoint = toRectangle.Location;
6057  int lnOffsetX = 20, lnOffsetY = 50;
6058 
6059  if (Location.X < 0) // Tenemos pantallas como los mantenimientos o perfiles donde el formulario se presenta en una posición fuera de la area visible
6060  {
6061  loPoint.X = (loRectScreen.Width / 2) + (Size.Width / 2) - lnOffsetX;
6062  loPoint.Y = (loRectScreen.Height / 2) - (Size.Height / 2) + lnOffsetY;
6063  }
6064  else
6065  {
6066  loPoint.X = Location.X + Size.Width - lnOffsetX;
6067  loPoint.Y = Location.Y + lnOffsetY;
6068  }
6069 
6070  if (loPoint.X + toRectangle.Size.Width > loRectScreen.Width)
6071  loPoint.X = loRectScreen.Width - lnOffsetX - toRectangle.Width;
6072 
6073  if (loPoint.Y + toRectangle.Size.Height > loRectScreen.Height)
6074  loPoint.Y = (loRectScreen.Height / 2) - (toRectangle.Height / 2);
6075 
6076  return loPoint;
6077  }
6078 
6084  private void LocationAyuda(IAyudaContextual toAyudaContextual)
6085  {
6086  Point loPoint = new Point(toAyudaContextual._Left, toAyudaContextual._Top);
6087 
6088  if (loPoint == new Point(0, 0) ||
6089  loPoint.X > Screen.PrimaryScreen.Bounds.Size.Width || loPoint.Y > Screen.PrimaryScreen.Bounds.Size.Height)
6090  {
6091  loPoint = CalculateLocationAyuda(_oFormAyuda.Bounds);
6092  }
6093 
6094  if (toAyudaContextual._Height > 0)
6095  {
6096  Size loSize = _oFormAyuda.Size;
6097  loSize.Height = toAyudaContextual._Height;
6098 
6099  if (_oFormAyuda.Size != loSize)
6100  _oFormAyuda.Size = loSize;
6101  }
6102 
6103  _oFormAyuda.Location = loPoint;
6104  }
6105 
6110  protected virtual bool FormDisposed()
6111  {
6112  return (IsDisposed || Disposing);
6113  }
6114 
6115  private void CambiarBotonAyudaMensaje()
6116  {
6117  if (!EsPantalla0 && _oResultadoAyuda._AyudaContextual != null && !FormDisposed())
6118  {
6119  int numnoticias = _oResultadoAyuda._AyudaContextual._NoticiasPendientesLeer;
6120 
6121  if(menu is IActiveMenu)
6122  {
6123  foreach (ActiveButton item in menu.Items)
6124  {
6125 
6126  if (item.Name == "Ayuda")
6127  {
6128  // NOTICIAS ONBOARDING. Si tenemos noticias, sustituimos icono de Info por la Campana
6129  if (numnoticias > 0)
6130  {
6131  string lcTooltip = " Noticias";
6132  item.ForeColor = Color.FromArgb(0, 129, 70);
6133  item.Font = new Font("Segoe UI", 8.5F);
6134  item._ModColors = false;
6135 
6136  if (numnoticias == 1)
6137  {
6138  item.Text = "1";
6139  lcTooltip = " Noticia";
6140  }
6141  else if (numnoticias < 100)
6142  item.Text = numnoticias.ToString().Trim();
6143  else
6144  item.Text = "99+";
6145 
6147  menu.ToolTip.SetToolTip(item, item.Text+lcTooltip);
6148  item.ChangeColors();
6149  }
6150 
6151  break;
6152  }
6153  }
6154  }
6155  }
6156  }
6157 
6161  private void MostrarCfgUsabilidad()
6162  {
6163  // En el formulario de configuración se comprueba si hay mensajes configurados en el formulario/usuario actual
6164  // y se muestra mensaje sino hay y se cierra.
6165  frmUserFormConfig frmCfg = new frmUserFormConfig(Usuario._This._Codigo, this._Pantalla, this._ObtenerText(false));
6166  frmCfg._ShowDialog();
6167  }
6168 
6173  private void MostrarAyuda(IAyudaContextual toAyudaContextual = null)
6174  {
6175  if (_oFormAyuda != null && !_oFormAyuda.IsDisposed && !_oFormAyuda.Disposing)
6176  {
6177  ShowAyuda();
6178  return;
6179  }
6180 
6181  if (FormDisposed())
6182  return;
6183 
6184  IOnBoardingController loOnBoardingController = FUNCTIONS._OnBoardingController();
6185 
6186  if (toAyudaContextual == null) // Venimos del botón de opciones. Se ha de instanciar la ayuda contextual
6187  {
6188  toAyudaContextual = new AyudaContextual(loOnBoardingController);
6189  toAyudaContextual._Load(_Pantalla.ToUpper());
6190 
6191  ((OnBoardingControllerSage50)loOnBoardingController)._WebService("mostrar", tcPantalla: _Pantalla.ToUpper()); // Acción de mostrar ayuda
6192  }
6193 
6194  if (FormDisposed())
6195  return;
6196 
6197  _oFormAyuda = new FormPanelNotificaciones(_Pantalla.ToUpper(), Text, loOnBoardingController, toAyudaContextual);
6198  _oFormAyuda.Owner = this;
6199  _oFormAyuda.Opacity = 0;
6200  _oFormAyuda._RefreshNoticiasPendientes += FormAyuda__RefreshNoticiasPendientes;
6201 
6202  _oFormAyuda.Show();
6203 
6204  LocationAyuda(toAyudaContextual);
6205 
6206  if (FormDisposed())
6207  {
6208  _oFormAyuda.Dispose();
6209  _oFormAyuda = null;
6210  return;
6211  }
6212 
6213  if (_lFormActivated)
6214  _oFormAyuda.Opacity = 1;
6215  else
6216  _oFormAyuda._Hide();
6217 
6218  AyudaSubscripcionEventos();
6219  }
6220 
6224  private void FormAyuda__RefreshNoticiasPendientes()
6225  {
6226  CambiarBotonAyudaMensaje();
6227  }
6228 
6232  private void DevolverFocusAyuda()
6233  {
6234  _oFormAyuda._FormParentStateActived = true;
6235  Focus(); // Pasamos el foco al formulario de origen
6236 
6237  RepaintActiveButton();
6238  }
6239 
6243  private void RepaintActiveButton()
6244  {
6245  foreach (Control loItem in menu.Items)
6246  {
6247  if (loItem is ActiveButton)
6248  ((ActiveButton)loItem)._Refresh();
6249  }
6250  }
6251 
6255  private void AyudaSubscripcionEventos()
6256  {
6257  FormClosed += Ayuda_FormClosed;
6258  SizeChanged += Ayuda_SizeChanged;
6259  }
6260 
6266  private void Ayuda_SizeChanged(object sender, EventArgs e)
6267  {
6268  if (AyudaIsPlayingVideo())
6269  return;
6270 
6271  if (WindowState == FormWindowState.Minimized)
6272  {
6273  if (_oFormAyuda != null && !_oFormAyuda.IsDisposed && !_oFormAyuda.Disposing && _oFormAyuda.Visible && !_lPresentandoAyuda)
6274  OcultarAyuda();
6275  }
6276  else
6277  {
6278  if (AyudaOcultada())
6279  TimerAyuda();
6280  }
6281  }
6282 
6288  private void Ayuda_FormClosed(object sender, FormClosedEventArgs e)
6289  {
6290  if (_oFormAyuda != null && !_oFormAyuda.IsDisposed && !_oFormAyuda.Disposing)
6291  _oFormAyuda.Close();
6292  }
6293 
6299  private void OcultarAyuda()
6300  {
6301  _oFormAyuda._Hide();
6302  }
6303 
6309  private bool AyudaIsPlayingVideo()
6310  {
6311  return _oFormAyuda != null && _oFormAyuda._PlayingVideo;
6312  }
6313 
6317  private void TimerAyuda()
6318  {
6319  Timer loTimerAyuda = new Timer();
6320  loTimerAyuda.Interval = 100;
6321  loTimerAyuda.Tick += new EventHandler(TimerAyuda_Tick);
6322  loTimerAyuda.Start();
6323  }
6324 
6330  private void TimerAyuda_Tick(object sender, EventArgs e)
6331  {
6332  Timer loTimer = (Timer)sender;
6333  loTimer.Dispose();
6334 
6335  ShowAyuda();
6336  }
6337 
6341  private void ShowAyuda()
6342  {
6343  if (AyudaOcultada())
6344  {
6345  _lPresentandoAyuda = true;
6346  _oFormAyuda._RelocatePoint(); // Reposicionamos la pantalla
6347 
6348  DevolverFocusAyuda();
6349 
6350  _lPresentandoAyuda = false;
6351  }
6352  }
6353 
6359  private bool AyudaOcultada()
6360  {
6361  return (!Disposing && !IsDisposed && _oFormAyuda != null && !_oFormAyuda.IsDisposed && !_oFormAyuda.Disposing && (!_oFormAyuda.Visible || _oFormAyuda.Opacity == 0) && !_oFormAyuda._OcultandoAyuda && (WindowState != FormWindowState.Minimized || Location.X > 0)); // Cuando está minimizada la posición es la -32000
6362  }
6363 
6370  private void Ayuda_Deactivate(object sender, EventArgs e)
6371  {
6372  if (_oFormAyuda == null || AyudaIsPlayingVideo() || Ayuda_FormularioActivo())
6373  return;
6374 
6375  _lFormActivated = false;
6376 
6377  _oFormAyuda._FormParentStateActived = false;
6378 
6379  if (_oFormAyuda != null && !_oFormAyuda.IsDisposed && !_oFormAyuda.Disposing && _oFormAyuda.Visible && !_oFormAyuda.Focused && !_lPresentandoAyuda)
6380  {
6381  Point loPoint = new Point(Cursor.Position.X, Cursor.Position.Y);
6382  Rectangle loRect = new Rectangle(loPoint, new Size(10, 10));
6383 
6384  if (!_oFormAyuda.Bounds.IntersectsWith(loRect)) // Si estamos pasando el foco a la pantalla de ayuda no la ocultamos
6385  OcultarAyuda();
6386  }
6387  }
6388 
6395  private bool Ayuda_FormularioActivo()
6396  {
6397  return (EW_GLOBAL._OpenForms.Count > 0 && EW_GLOBAL._OpenForms.Peek() == this);
6398  }
6399 
6405  private void Ayuda_Activated(object sender, EventArgs e)
6406  {
6407  _lFormActivated = true;
6408 
6409  if (_oFormAyuda == null || _lPresentandoAyuda)
6410  return;
6411 
6412  _oFormAyuda._FormParentStateActived = true;
6413 
6414  if (AyudaOcultada())
6415  TimerAyuda();
6416  }
6417  #endregion Ayuda contextual
6418  }
6419 
6420  #region classe O365CalendarEntryPoint
6421 
6425  public class O365CalendarEntryPoint : ewbase.ewMante
6426  {
6433  public static bool _IsAllowed(string tcPantalla, out O365CalendarEntryPoint toClass)
6434  {
6435  //string lcSql = "";
6436 
6437 
6438  toClass = null;
6439  return false;
6440  }
6441 
6445  public override void _Show()
6446  {
6448  //loForm._Asunto =
6449 
6450  }
6451 
6455  public int _Id { get; set; }
6459  public new string _Pantalla { get; set; }
6463  public new string _Nombre { get; set; }
6467  public string _Valor { get; set; }
6471  public string _Propiedad { get; set; }
6472 
6477  private bool _LoadCalendarEntryPoint()
6478  {
6479  // Declaración de variables
6480  DataTable ldtMante = new DataTable();
6481  string lcClase = string.Empty;
6482  string lcSql = string.Empty;
6483 
6484  // Certificamos que tenemos asignado el nombre del mantenimiento
6485  if (!string.IsNullOrWhiteSpace(_Pantalla))
6486  {
6487  // Consultamos el ID máximo por si tenemos modificaciones
6488  lcSql = "SELECT pantalla AS pantalla,MAX(id) AS id " +
6489  "FROM " + DB.SQLDatabase("comunes", "calendar") + " " +
6490  "WHERE pantalla = " + DB.SQLString(_Pantalla) + " " +
6491  "GROUP BY pantalla ";
6492 
6493  DB.SQLExec(lcSql, ref ldtMante);
6494 
6495  // Certificamos que existe el mantenimiento
6496  if (ldtMante != null && ldtMante.Rows.Count > 0)
6497  {
6498  int lnId = Convert.ToInt32(ldtMante.Rows[0]["Id"]);
6499 
6500  // Preparamos la consulta
6501  lcSql = "SELECT pantalla, clase, libreria, nombre, menu, lista " +
6502  "FROM " + DB.SQLDatabase("comunes", "calendar") + " " +
6503  "WHERE pantalla = " + DB.SQLString(this._Pantalla) + " AND id = " + DB.SQLString(lnId) + " ";
6504 
6505  DB.SQLExec(lcSql, ref ldtMante);
6506 
6507  // Certificamos que existe el mantenimiento
6508  if (ldtMante != null && ldtMante.Rows.Count > 0)
6509  {
6510  lcClase = Convert.ToString(ldtMante.Rows[0]["Clase"]).Trim() + "," + Convert.ToString(ldtMante.Rows[0]["Libreria"]).Trim();
6511 
6512  Type elementType = Type.GetType(lcClase);
6513 
6514  if (elementType != null)
6515  {
6516 
6517  // Todo ha ido correcto
6518  return true;
6519  }
6520  }
6521  }
6522  }
6523 
6524  return false;
6525  }
6526  }
6527 
6528  #endregion classe O365CalendarEntryPoint
6529 }
string _TituloPagina
Nos indica el título de la página
Definition: IAddonTabDoc.cs:27
Boolean _Show_Gestion_Accesos(String tcPantalla, string tcDescripcion="")
PE-86721 Este método presentará el formulario de Gestión de Accesos. PE-90297: añadimos el parámetro ...
Definition: clsUsuario.cs:6802