Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Próxima revisión
Revisión previa
wiki:2.-desarrollo-app:2.3.-codigo:b.-controles-xone:2.-menu:start [2018/01/30 15:29] – editor externo 127.0.0.1wiki:2.-desarrollo-app:2.3.-codigo:b.-controles-xone:2.-menu:start [2023/11/24 15:41] (actual) ary
Línea 2: Línea 2:
 ====== Menús de la Aplicación ===== ====== Menús de la Aplicación =====
 \\ \\
-==== Colección de Menús Personalizada (Sustituye al APPWIZARD) ====+Para la creación de Menús de las aplicaciones en sus inicios, obsoleto en la actualidad, el uso del **APPWIZARD**, el cual brindaba viables bondades pero a la vez un poco estáticas y limitadas en cuanto a diseño. Es por esto que XOne ha implementado nuevas herramientas para dotar a las aplicaciones de Menús con mejor diseño y funcionalidad, así como orientados a los diseños que demandan las nuevas tendencias en Aplicaciones móviles.
 \\ \\
-En algunos casosel APPWIZARD (2 niveles de menús) puede quedarse pequeño, o bien queremos personalizar aún más profundamente el diseño de los menús de la aplicación.\\+Estas nuevas funcionalidades van orientadas inicialmente a la plataforma y conjuntamente al dispositivo. Quiere decir estoque podremos personalizar tantos diseños de menús dentro de la aplicación como a los dispositivos que van dirigidos. 
 + 
 +Por ejemplo, podemos diseñar orientados a cual Plataforma Android o IOS y conjuntamente a que dispositivo va dirigido: móvil, tableta, smartwatch, etc. Así como según las orientaciones que queramos darle a las aplicaciones, portrait o landscape. 
 + 
 +En este acápite nos centraremos en la creación y desarrollo de los diferentes Menús para nuestras aplicaciones.
 \\ \\
-Para ello, disponemos del atributo **entry-point="<nowiki>ColeccionConMenuPersonalizado</nowiki>"** en el nodo app, para señalar la colección que queremos que se ejecute inmediatamente después de que el usuario se haya logueado (Independientemente de que se haga el login normal o este también se haya personalizado, [[ http://www.xoneisp.com/xonewiki/doku.php?id=b.-programacion:b02.-menus-aplicacion:start&#pantalla_de_login_personalizada | ver opción anterior ]]). Utilizando este atributo, ignoraremos por completo el fichero appwizard.xml y será el programador el encargado de diseñar sus propios menús en la colección indicada en dicho atributo. 
-<code xml> 
-<?xml version="1.0" encoding="iso-8859-1"?> 
-<xml> 
- <app prefix="gen" version="0.0.0.26" entry-point="MenuPersonalizado"> 
- <!-- 
- <style url="default.css"> 
- <style url="default_hor.css" conditions="phone:horizontal"/> 
- <style url="default_tablet.css" conditions="tablet:vertical"/> 
- <style url="default_hor.css" conditions="tablet:horizontal"/> 
- --> 
- </app> 
  
- <collprops type="general">+La base del funcionamiento de los menus actuales de las App de XOne, no es más que un diseño atractivo que lo que hace es dirigir al usuario a navegar dentro de la App según sus funcionalidades, esta navegación es a través de llamadas a diferentes grupos y colecciones\\
  
- <coll name="Empresas" ...> +A continuación expondremos algunos diseños y como implementar sus funcionalidades
- <group name="General" id="1" /> +\\  
- <prop name="..." ... /> +\\
- </coll> +
- <coll name="Usuarios" ... > +
- <group name="General" id="1" /> +
- <prop name="IDEMPRESA" group="1" visible="0" type="N" mapcol="Empresas" mapfld="ID" /> +
- <prop name="LOGIN" visible="3" group="1" type="T" fieldsize="10" fixed-text="true" size="10" /> +
- <prop name="PWD" group="1" type="T" fieldsize="10" fixed-text="true" size="10" visible="" /> +
- <prop name="NOMBRE" visible="3" group="1" type="T" fieldsize="30" fixed-text="true" size="30" /> +
- <prop name="USERTYPE" visible="1" group="1" type="T" fieldsize="30" fixed-text="true" size="50" /> +
- <create> +
- <action name="setval" field="IDEMPRESA" value="##ENTID##" /> +
- </create> +
- </coll>+
  
- <coll name="MenuPersonalizado" title="Menu" fontsize="8sql="" objname="" updateobj="" filter="" sort="" progid="ASData.CASBasicDataObj"> +^ Tipos de Menus                                                                                                                        ^                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ^ 
- <group name="General" id="1" /> +| [[wiki:2.-desarrollo-app:2.3.-codigo:b.-controles-xone:2.-menu:start#A través de íconos o botones|A través de íconos o botones]]      | Se definen iconos o botones desde pantalla principal que permiten acceso a diferentes funcionalidades y demás opciones en la App                                                                                                                                                                                                                                                                                                                                                            | 
- <prop name="MAP_TEST" group="1" type="TL" visible="3" title="Aquí va el menúfieldsize="10size="10" /> +| [[wiki:2.-desarrollo-app:2.3.-codigo:b.-controles-xone:2.-menu:start#A través del Grupo tipo Drawer|A través del Grupo tipo Drawer]]  | Este menú es el que su diseño nos permite acceder desde cualquier pantalla y momento dentro de la App, se accede al hacer swipe desde uno de los bordes de la pantalla, tanto vertical como horizontal y no es más que un grupo de controles que es invisible hasta que se saca arrastrando con el dedo desde uno de los bordes laterales de la pantalla. Véase también:[[wiki:2.-desarrollo-app:2.3.-codigo:a.-estructura-xml:3.-nodo-group:start#grupo_desplegable_drawer|Grupo DRAWER]] 
- </coll>+\\ 
 +<note tip>Estos tipos de menus no son exclusivos, ellos pueden combinarse en una misma App, brindando mejor funcionalidad y apariencia. Actualmente la combinación de estos diseños es lo que destaca en las Apps XOne.</note> 
 +\\ 
 +=====  A través de íconos o botones ===== 
 +\\ 
 +Se implementa desde la creación de un diseño que puede contener íconos, botones, frases,, etc que defina el programador para acceder a las opciones dentro de la App. 
 +\\ 
 +\\ 
 +{{:wiki:2.-desarrollo-app:2.3.-codigo:b.-controles-xone:2.-menu:screenshot_20231123-140433.png?190|}} {{:wiki:2.-desarrollo-app:2.3.-codigo:b.-controles-xone:2.-menu:screenshot_20231123-151101.png?190|}} {{:wiki:2.-desarrollo-app:2.3.-codigo:b.-controles-xone:2.-menu:img_3027.png?190|}} {{:wiki:2.-desarrollo-app:2.3.-codigo:b.-controles-xone:2.-menu:img_3028.png?190|}} {{:wiki:2.-desarrollo-app:2.3.-codigo:b.-controles-xone:2.-menu:screenshot_20231123-140110.png?190|}}   
 +\\ 
 + 
 + 
 +\\ 
 + 
 +<WRAP round help 60%> 
 +Definimos una colección Menu que contiene las propiedades para definir botones, iconos o imágene y a cada uno estos se le asigna una funcionalidad que nos llevará a otras opciones dentro de la App, generalmente definido por un pushValue que nos lanza a otras pontallas, declaradas de igual forma en otra colección. Puede también definirse una propiedad tipo Contents para controlar las funcionalidades de íconos y botones. 
 +</WRAP> 
 +\\ 
 +\\ 
 + 
 +**Ejemplo:** 
 +\\ 
 +\\ 
 +En este caso se crea una colección que contiene varias propiedades type="B" y a través del atributo "onclick" le hemos asociado la función que nos lanza a la siguiente opción. 
 +\\ 
 +\\ 
 +<code javascript> 
 +<coll name="EntradaApp" special="true" notab="true" group-swipe="true"> 
 +     
 +     <group name="GHeader" id="10" class="groupfixed_header" fixed="true" orientation="top" xheight="180p"> 
 +         <frame name="frmTop" class="xnHeaderC bgcolorazul2" Xdisablevisible="MAP_SELECCION&lt;&gt;1" framebox="false" align="center|center"
 +                <prop name="MAP_BT_SALIR" type="B" visible="1" method="ExecuteNode(Logout)" class="xnButtonExit" width="80p" height="80p"/> 
 +                <prop name="MAP_TLTOP" type="TL" visible="1" title="LIGAL" height="80%" fontsize="18class="xnTituloHeaderCwidth="75%label-wrap="truenewline="false"/> 
 +                <prop name="MAP_BT_INFO" type="B" xxlmargin="500p" visible="1" method="ExecuteNode(abrirColl('ConsolaReplica'))" class="xnButtonReplica" width="80p" height="80p" newline="false" /> 
 +         </frame> 
 +         
 +    </group>      
 +     
 +     
 +     
 +    <group name="GFooter" id="11" class="groupfixed_header" fixed="true" orientation="bottom" disablevisible="MAP_DERECHOS&lt;&gt;1"> 
 +      <frame name="FLOAT_FOOTER_FRAME" class="xnFooterC bgcolorazul1" xalign="bottom|center" framebox="false"> 
 +             
 +                <prop name="MAP_BT_FOOT1" type="B" class="xnBotonMenuFooterimg="Artboard 49.pngvisible="1" xkeep-aspect-ratio="true" onclick="javascript:irGrupoMenu(1);"/        
 +                <prop name="MAP_BT_FOOT2" type="B" class="xnBotonMenuFooter" img="Artboard 47.png" visible="1" newline="false" xxxkeep-aspect-ratio="true" onclick="javascript:irGrupoMenu(2);"/>         
 +                <prop name="MAP_BT_FOOT3" type="B" class="xnBotonMenuFooter" img="Artboard 46.png" visible="1" newline="false" xxxkeep-aspect-ratio="true" onclick="javascript:irGrupoMenu(3);"/>         
 +       </frame>   
 +      </group>   
 +       
 +      <group name="GFooterA" id="12" class="groupfixed_header" fixed="true" orientation="bottom" xxxdisablevisible="MAP_DERECHOS&lt;&gt;2"> 
 +         
 +      <frame name="FLOAT_FOOTER_FRAME_A" class="xnFooterC bgcolorazul1"  xalign="bottom|center" framebox="false" disablevisible="MAP_DERECHOS&lt;&gt;2"> 
 +               <frame name="BT_1A" class="xnBotonMenuFooter2"  bgcolor="#00000000" width="384p" height="102p"> 
 +                    <prop name="MAP_BT_FOOT1A" type="B" class="xnBotonMenuFooter" img="Artboard 49.png" visible="1" align="center|center" lmargin="64p" xkeep-aspect-ratio="true" onclick="javascript:irGrupoMenu(1);"/>         
 +                </frame> 
 +                
 +                <prop name="MAP_BT_FOOT2Atype="B" class="xnBotonMenuFooter"  XXimg="Artboard 47.png" visible="0" newline="false" xxxkeep-aspect-ratio="true" onclick="javascript:irGrupoMenu(2);"/>         
 +                
 +                <frame name="BT_3A" class="xnBotonMenuFooter2" bgcolor="#00000000" width="384p" height="102p" newline="false"> 
 +                    <prop name="MAP_BT_FOOT3A" type="B" class="xnBotonMenuFooter" img="Artboard 49.png" visible="1" align="center|center" lmargin="64p" newline="false" xxxkeep-aspect-ratio="true" onclick="javascript:irGrupoMenu(3);"/>         
 +                </frame> 
 +       </frame>   
 +        
 +       <frame name="FLOAT_FOOTER_FRAME_B" class="xnFooterC bgcolorazul1"  xalign="bottom|center" framebox="false" disablevisible="MAP_DERECHOS&lt;&gt;3"> 
 +              
 +                    <prop name="MAP_BT_FOOT1B" type="B" class="xnBotonMenuFooter" img="Artboard 50.png" visible="0" align="center|center" lmargin="64p" xkeep-aspect-ratio="true" onclick="javascript:irGrupoMenu(1);"/>         
 +                
 +                 <frame name="BT_2B" class="xnBotonMenuFooter2"  bgcolor="#00000000" width="384p" height="102p"> 
 +                    <prop name="MAP_BT_FOOT2B" type="B" class="xnBotonMenuFooter"  img="Artboard 50.png" lmargin="64p" visible="1" newline="false" xxxkeep-aspect-ratio="true" onclick="javascript:irGrupoMenu(2);"/>         
 +                </frame> 
 +                <frame name="BT_3B" class="xnBotonMenuFooter2" bgcolor="#00000000" width="384p" height="102p" newline="false"> 
 +                    <prop name="MAP_BT_FOOT3B" type="B" class="xnBotonMenuFooter" img="Artboard 46.png" visible="1" align="center|center" lmargin="64p" newline="false" xxxkeep-aspect-ratio="true" onclick="javascript:irGrupoMenu(3);"/>         
 +                </frame> 
 +       </frame>   
 +        
 +    </group>   
 +      
 +       
 +    <group name="MenuRecogidas" id="1" class="xnFondoGroupC" xxbgcolor="#FFFFFF" onfocus="ExecuteNode(onfocusgrupo(1))" disablevisible="MAP_DERECHOS=3" height="998p"> 
 +     
 +    <frame name="frmDownFlot5" width="177p" bgcolor="#00000000" floating="true" height="107p" lmargin="620p"> 
 +            <prop name="MAP_LOGO_BT" type="B" xalign="center|center" xxbgcolor="#00000000" keep-aspect-ratio="true" width="65%" visible="1" img="Ligal Inspector.png" /> 
 +        </frame> 
 +     
 +          <frame name="frmMidle" width="100%" height="100%" class="xnFondoGroupC" xxbgcolor="#FFFFFF" align="center|top"> 
 +            <prop name="MAP_ICONO1" type="B" class="xnBotonMenu" img="Artboard 20.png" visible="1" tmargin="90p" keep-aspect-ratio="true" onclick="javascript:irColl('ListPuntosRecogida');" />         
 +            <prop name="MAP_ICONO2" type="B" class="xnBotonMenu" newline="false" img="Artboard 21.png" visible="1" tmargin="90p" lmargin="20p" keep-aspect-ratio="true" onclick="javascript:irColl('ListRecogidasDia');"/>         
 +            <prop name="MAP_ICONO3" type="B" class="xnBotonMenu" newline="true"  img="Artboard 23.png" tmargin="50p" visible="1" keep-aspect-ratio="true" onclick="javascript:irColl('ListProgramacionRecogida');"/>             
 +            <prop name="MAP_ICONO4" type="B" class="xnBotonMenu" newline="false" img="Artboard 22.png" tmargin="50p" visible="1" lmargin="20p" keep-aspect-ratio="true" onclick="javascript:irColl('ListControlTemperaturaRec');"/>         
 +       </frame>     
 +           
 +     
 +         
 +    </group>       
 +     
 +    <group name="MenuConsultas" id="2" class="xnFondoGroupC" onfocus="ExecuteNode(onfocusgrupo(2))" height="998p" disablevisible="MAP_DERECHOS=2"> 
 +      
 +            <frame name="frmMidle2"  width="100%" height="-2" bgcolor="#FFFFFF" align="top|center" scroll="true"> 
 +              
 +                    <prop name="MAP_ICONO1B" type="B" class="xnBotonConsultas" img="Artboard 24.png" visible="1" keep-aspect-ratio="true" onclick="javascript:EscogeOpcion(1);"/>         
 +                    <prop name="MAP_ICONO2B" type="B" class="xnBotonConsultas" newline="false" img="Artboard 27.png" visible="1" keep-aspect-ratio="true" onclick="javascript:EscogeOpcion(2);"/>         
 +                    <prop name="MAP_ICONO3B" type="B" class="xnBotonConsultas" newline="true" img="Artboard 25.png" visible="1" keep-aspect-ratio="true" onclick="javascript:EscogeOpcion(3);"/>             
 +                    <prop name="MAP_ICONO4Btype="Bclass="xnBotonConsultas" newline="false" img="Artboard 26.png" visible="1" keep-aspect-ratio="true" onclick="javascript:EscogeOpcion(4);"/>         
 +                    <prop name="MAP_ICONO7B" type="B" class="xnBotonConsultas" newline="true" img="Artboard 30.png" visible="1" keep-aspect-ratio="true" onclick="javascript:irColl('ListCoordSerieGanadero');"/>   
 +                    <prop name="MAP_ICONO5B" type="B" class="xnBotonConsultas" newline="false" img="Artboard 29.png" visible="1" keep-aspect-ratio="true" onclick="javascript:irColl('ListVisitasGanaderos');"/>    
 +                    <prop name="MAP_ICONO6B" type="B" class="xnBotonConsultas" newline="false" img="Artboard 28.png" visible="0" keep-aspect-ratio="true" onclick="javascript:irColl('ListControlTemperatura');"/>    
 +                     
 +                    <prop name="MAP_ICONO8B" type="B" class="xnBotonConsultas" newline="true" img="Artboard 31.png" visible="1" keep-aspect-ratio="true" onclick="javascript:irColl('ListDiarioMatricula');"/>    
 +                    <prop name="MAP_ICONO9B" type="B" class="xnBotonConsultas" newline="false" img="Artboard 33.png" visible="1" keep-aspect-ratio="true" onclick="javascript:irColl('ListVehiculoAdm');"/>  
 +                    <prop name="MAP_ICONO10B" type="B" class="xnBotonConsultas" disablevisible="MAP_DERECHOS=3" newline="true" img="Artboard 32.png" visible="1" keep-aspect-ratio="true" onclick="javascript:EscogeOpcion(5);"/>    
 +                    <prop name="MAP_ICONO10B2" type="B" class="xnBotonConsultas" disablevisible="MAP_DERECHOS&lt;&gt;3" newline="false" bgcolor="#00000000" locked="true" visible="1"/>  
 +            </frame> 
 +        </group>  
 +        <group name="MenuInfo" id="3"  class="xnFondoGroupC" height="998p" onfocus="ExecuteNode(onfocusgrupo(3))"> 
 +            <frame name="frmMidle3"  width="100%" height="100%" bgcolor="#0000000" align="top|left"
 +               <prop name="MAP_ICONO1C" type="B" class="xnBotonMenu" xtmargin="50p" lmargin="20p" img="Artboard 34.png" visible="1" keep-aspect-ratio="true" onclick="javascript:irColl('InfoApp');"/>         
 +           </frame> 
 +    </group>       
 +        <prop name="MAP_SELECCION" visible="0" type="N" /> 
 +        <prop name="MAP_DERECHOS" visible="0" type="N" /> 
 +       
 +   <before-edit> 
 +        <action name="runscript"> 
 +          <script language="javascript"> 
 +             
 + self.MAP_GROUP=1; 
 + self.MAP_TOTAL_PAGES=3; 
 +     self.MAP_DERECHOS=user.DERECHOS;  
 +   //  ui.showToast(self.MAP_DERECHOS);  
 + 
 +             
 + </script> 
 +        </action> 
 +      </before-edit>  
 +     
 +    <abrirColl show-wait-dialog="false" refresh="false"> 
 +        <action name="runscript"> 
 +            <param name="coll"/> 
 +            <script language="javascript"> 
 + ui.startReplica(); 
 +                irColl(coll); 
 +            </script> 
 +        </action> 
 +    </abrirColl> 
 +     
 +    <onfocusgrupo show-wait-dialog="false" refresh-prop="MAP_BT_FOOT1,MAP_BT_FOOT2,MAP_BT_FOOT3"> 
 +        <action name="runscript"> 
 +          <param name="grupo" /> 
 +          <script language="javascript"> 
 +      self.MAP_GROUP = grupo; 
 +      // ui.showToast(self.MAP_GROUP); 
 +      irGrupoMenu(self.MAP_GROUP); 
 + </script> 
 +        </action> 
 +      </onfocusgrupo> 
 +    
 +  
 +     
 + <permissions> 
 + <permission name="camera" /> 
 +     <permission name="phone" /> 
 +     <permission name="location-foreground" /> 
 + </permissions> 
 +  
 +  
 + <Logout> 
 +        <action name="runscript"> 
 +            <script language="javascript"> 
 +       appData.failWithMessage(-11888,"##EXITAPP##"); 
 +     </script> 
 +        </action> 
 +    </Logout> 
 +  
 +</coll>
 </code> </code>
 \\ \\
-Actualmente tenemos dos formas de hacer los menús para la aplicación:\\+<code javascript> 
 +function irColl(collname){ 
 +    var coll = appData.getCollection(collname); 
 +    var obj = coll.createObject(); 
 +    coll.addItem(obj); 
 +    appData.pushValue(obj); 
 +
 +</code> 
 +\\ 
 +\\ 
 +===== A través del Grupo tipo Drawer ===== 
 +\\ 
 +Este es el tipo de menú que se puede mostrar u ocultar a través deslizar el dedo sobre la pantalla del dispositivo, la ventaja es que este menu puede ser accesible desde cualquier momento dentro de la App, aún sin estar en el Menu Principal, y si se combina con el menu antes descrito podremos crear una App más dinámica, que no necesita navegarse solo por un menú estático que nos hace avanzar o retroceder en una única dirección, a la vez que le proporciona agilidad y bondades asequibles al usuario.\\ 
 +\\ 
 +{{:wiki:2.-desarrollo-app:2.3.-codigo:b.-controles-xone:2.-menu:screenshot_20231123-145217.png?215|}} {{:wiki:2.-desarrollo-app:2.3.-codigo:b.-controles-xone:2.-menu:screenshot_20231124-132054.png?215|}} {{:wiki:2.-desarrollo-app:2.3.-codigo:b.-controles-xone:2.-menu:screenshot_20231124-132144.png?215|}} 
 +\\ 
 +<WRAP center round tip 60%> 
 +Para que un grupo se comporte como DRAWER se tiene que definir el atributo **drawer-orientation**="left o right" en la declaración del grupo, este atributo indica que el grupo es un drawer y desde donde se despliega.  
 +</WRAP> 
 +\\ 
 +Veáse también: [[wiki:2.-desarrollo-app:2.3.-codigo:a.-estructura-xml:3.-nodo-group:start#grupo_desplegable_drawer|Grupo DRAWER]] 
 +\\ 
 +\\ 
 + 
 +**Ejemplo:** 
 +\\ 
 +<code javascript> 
 + <group name="Drawer" id="999" drawer-orientation="left" class="DrawerC"> 
 +        <frame name="drawer0" width="100%" height="20%">    
 +            <prop name="MAP_IMG_IMAGE" type="IMG" visible="1" path="imgdrawer.png" width="100%" keep-aspect-ratio="true" /> 
 +            <prop name="MAP_NOM_USER" type="T" visible="1" class="nomuser font4 bordebot" locked="true" /> 
 +        </frame> 
 +        <frame name="drawer1" width="100%" height="60%" lmargin="0"> 
 +            <prop name="MAP_BT_OPCION1_DR" tmargin="25p" title="Ficha" type="B" visible="1" method="ExecuteNode(abrirOpcion(1,'Ficha',1))" xonclick="javascript:irOpcion(0,7,'fmrOpcion',1);ocultarGrupo(999);" class="xnTituloDrawerC font5" img="ficha.png" /> 
 +            <prop name="MAP_BT_OPCION2_DR" title="Socios" type="B" visible="1" method="ExecuteNode(abrirOpcion(2,'CabSocios',2))" class="xnTituloDrawerC font5" img="socios.png" /> 
 +            <prop name="MAP_BT_OPCION7_DR" title="Clientes" type="B" visible="1" method="ExecuteNode(abrirOpcion(7,'CabClientes',2))" class="xnTituloDrawerC font5" img="clientes.png" /> 
 +            <prop name="MAP_BT_OPCION3_DR" title="Crear Oportunidad" type="B" visible="1" method="ExecuteNode(abrirOpcion(3,'Oportunidad',2))" class="xnTituloDrawerC font5" img="nuevasoportunidades.png" />  
 +            <prop name="MAP_BT_OPCION4_DR" title="Mis oportunidades" type="B" visible="1" method="ExecuteNode(abrirOpcion(4,'MiOportunidad',2))" class="xnTituloDrawerC font5" img="misoportunidades.png" /> 
 +            <prop name="MAP_BT_OPCION5_DR" title="Agenda" type="B" visible="1" method="ExecuteNode(abrirOpcion(5,'Agenda',2))" class="xnTituloDrawerC font5" img="agenda.png" /> 
 +            <prop name="MAP_BT_OPCION6_DR" title="Estadisticas" type="B" visible="1" method="ExecuteNode(abrirOpcion(6,'CabEstadisticas',2))" class="xnTituloDrawerC font5" img="estadisticas.png" /> 
 +        </frame> 
 +        <frame name="drawer2" width="100%" height="20%"> 
 +            <prop name="MAP_BT_SALIR_DR" title="Salir" type="B" visible="1" method="executenode(onback)" img="salir.png" class="xnTituloDrawerC font5" /> 
 +            <prop name="MAP_BT_LINEA" tmargin="10p" width="100%" height="5p" type="B" visible="1" labelwidth="0" forecolor="#000000" bgcolor="#000000" /> 
 +            <prop name="MAP_T_VERSIONES" type="T" visible="1" align="center|center" class="BotonColor font3" labelwidth="0" width="100%" locked="true" />  
 +        </frame> 
 +    </group> 
 + </code>   
 +\\ 
 +<code javascript> 
 +<onback show-wait-dialog="false" refresh="false"> 
 +        <action name="runscript"> 
 +            <script language="javascript"> 
 +        appData.failWithMessage(-11888, "##EXITAPP##"); 
 +            </script> 
 +        </action> 
 +    </onback> 
 +     
 +     
 +    <abrirOpcion show-wait-dialog="false" refresh="false"> 
 +        <action name="runscript"> 
 +            <param name="opcion" /> 
 +            <param name="mycol" /> 
 +            <param name="permiso" /> 
 +            <script language="javascript"> 
 +             
 +               user.MAP_OBJETO=self; 
 +             
 + ui.startReplica(); 
 + if (permiso==1){ 
 +     
 +                    var myfiltro="1=0"; 
 +             
 +                switch (opcion.toString()) { 
 +                        case "1": 
 +                            myfiltro="ID="+ user.ID; 
 +                            break; 
 +                        case "2": 
 +                            break; 
 +                        case "3": 
 +                            break; 
 +                        case "4": 
 +                            break; 
 +                        case "5": 
 +                            break; 
 +                        case "6": 
 +                            break; 
 +                        case "7": 
 +                            break; 
 +                    } 
 +             
 +                    var sFilter=myfiltro;  
 +                    var col=appData.getCollection(mycol).findObject(sFilter); 
 +                    if (col) 
 +                    { 
 +                        appData.pushValue(col);     
 +                    } else  
 +                    { 
 +                        col=appData.getCollection(mycol); 
 +                        var obj=col.createObject(); 
 +                        appData.pushValue(obj); 
 +                    }  
 + } else{ 
 +                    var col2=appData.getCollection(mycol); 
 +                    var obj2=col2.createObject(); 
 +                    appData.pushValue(obj2); 
 +
 +                ui.hideGroup(999); 
 +            </script> 
 +        </action> 
 +    </abrirOpcion> 
 +     
 +     
 +    <irOpcion show-wait-dialog="false" refresh="false"> 
 +        <action name="runscript"> 
 +            <param name="opcion" /> 
 +            <param name="numeroOpciones" /> 
 +            <param name="frame" /> 
 +            <param name="haveSelector" /> 
 +            <script language="javascript"> 
 + ui.startReplica(); 
 +                irOpcion(opcion,numeroOpciones,frame,haveSelector); 
 +            </script> 
 +        </action> 
 +    </irOpcion> 
 +   
 +    <abrirDrawer show-wait-dialog="false" refresh="false"> 
 +        <action name="runscript"> 
 +            <param name="grupo" /> 
 +            <script language="javascript"> 
 + ui.startReplica(); 
 +                irGrupo(grupo); 
 +                ui.refresh("MAP_IMAGE_DRAWER"); 
 +            </script> 
 +        </action> 
 +    </abrirDrawer> 
 + </code>    
 +\\ 
 +**Ejemplo donde se combina el uso de Menú con botones y Menu con Drawer:** 
 +\\ 
 +\\ 
 +<code javascript> 
 +<coll name="Menu" title="Menu" sql="" objname="" updateobj="" progid="" filter="" sort="" XXXnotab="false" group-swipe="true" special="true"> 
 +      <group name="Invisibles" id="0"> 
 +        <prop name="MAP_TIPOPER" type="T" visible="0" /> 
 +        <prop name="FILTROCONTROL" type="T" visible="0" />   
 +        <prop name="MAP_IDVALORES" type="T" visible="0" mapcol-values="CADA 3 SG,CADA 60 SG" mapfld="DATA" /> 
 +        <prop name="MAP_TIMEAUTO" type="T" visible="0" class="classT" showinline="true" title="Tiempo" linkedto="MAP_IDVALORES" height="80p" tmargin="20p" linkedfield="DATA" lmargin="1%" /> 
 +        <prop name="MAP_TIMEVALOR" type="T" visible="0" /> 
 +        <prop name="MAP_FLOAT1" type="N" visible="0" /> 
 +        <prop name="MAP_FLOAT2" type="N" visible="0" /> 
 +        <prop name="IMAGEN" type="T" visible="0" />   
 +        <prop name="MAP_MENU" type="T" visible="0" /> 
 +        <prop name="MAP_COLOR1" type="T" visible="0" /> 
 +        <prop name="MAP_COLOR2" type="T" visible="0" /> 
 +        <prop name="MAP_COLOR3" type="T" visible="0" /> 
 +        <prop name="MAP_COLOR4" type="T" visible="0" /> 
 +        <prop name="MAP_COLOR5" type="T" visible="0" /> 
 +        <prop name="MAP_COLOR6" type="T" visible="0" /> 
 +        <prop name="MAP_COLORACTIVO" type="T" visible="0" /> 
 +        <prop name="MAP_SUBOPCION" type="N" visible="0" onchange="refresh" /> 
 +      </group>    
 +      <group name="General" id="1" imgbk="wallpaper.jpg"> 
 +        <frame name="mainFrame" width="100%" height="100%" XXXbgcolor="#33f72d9c"> 
 +          <frame name="frmtitulo" class="frmsuperior" height="120p"> 
 +            <prop name="SALIR" type="B" class="btsalirsuper" /> 
 +  
 +            <prop name="MENU" type="TL" class="tlsuper" title="##FLD_MAP_MENU##" /> 
 +            <prop name="BTMENU" type="B" class="btmenuicon" method="ExecuteNode(showDrawer)" /> 
 +          </frame> 
 +          <prop name="MAP_VERSIONAPP" type="T" text-align="center" visible="1" width="600p" lmargin="60p" height="80p" locked="true" labelwidth="0" /> 
 +          <frame name="frmgriview" width="650p" height="820p" framebox="true" border-corner-radius="10" lmargin="35p" tmargin="28p" bgcolor="#FFFFFF"> 
 +            <prop name="@MenuControles" type="Z" contents="MenuControles"  class="contentgridview" width="646p" height="816p" tmargin="2p" lmargin="2p" viewmodex="recyclerview" xorientation="horizontal" /> 
 +            <contents name="MenuControles" src="MenuControles" filter="FILTRO=##FLD_FILTROCONTROL##" sort="FILTRO,ORDEN" /> 
 +          </frame> 
 +           
 +          <prop name="MAP_IMAGEN" type="IMG" width="100%" height="50p" tmargin="42p" /> 
 +          <frame name="frmMENU" width="100%" height="144p" bgcolor="#000000"> 
 +            <frame name="frmbasico" class="menufijo" bgcolor="##FLD_MAP_COLOR1##"> 
 +              <prop name="MAP_MENUBASICOS" class="menufijo" img="basicos.png" type="B" method="ExecuteNode(cambiarMenu('BASICO','1SELECT.png',##FLD_MAP_COLOR1##))" /> 
 +            </frame> 
 +            <frame name="frmcontents" class="menufijo" bgcolor="##FLD_MAP_COLOR2##"> 
 +              <prop name="MAP_MENUCONTENTS" class="menufijo" newline="false" img="contents.png" type="B" method="ExecuteNode(cambiarMenu('CONTENTS','2SELECT.png',##FLD_MAP_COLOR2##))" /> 
 +            </frame> 
 +            <frame name="frmperifericos" class="menufijo" bgcolor="##FLD_MAP_COLOR3##"> 
 +              <prop name="MAP_MENUPERIFERICOS" class="menufijo" newline="false" img="perifericos.png" type="B" method="ExecuteNode(cambiarMenu('PERIFERICOS','3SELECT.png',##FLD_MAP_COLOR3##))" /> 
 +            </frame> 
 +            <frame name="frmreglas" class="menufijo" bgcolor="##FLD_MAP_COLOR4##"> 
 +              <prop name="MAP_MENUREGLAS" class="menufijo" newline="false" img="reglas.png" type="B" method="ExecuteNode(cambiarMenu('REGLAS DE NEGOCIO','4SELECT.png',##FLD_MAP_COLOR4##))" /> 
 +            </frame> 
 +            <frame name="frmconsola" class="menufijo" bgcolor="##FLD_MAP_COLOR5##"> 
 +              <prop name="MAP_MENUCONSOLA" class="menufijo" newline="false" img="consola.png" type="B" method="ExecuteNode(cambiarMenu('UTILIDADES','5SELECT.png',##FLD_MAP_COLOR5##))" /> 
 +            </frame> 
 +          </frame> 
 +        </frame> 
 +      </group> 
 +      <group name="DRAWER" id="99" drawer-orientation="right" width="550p"> 
 +          <prop name="MAP_TRANSPARENTEINI" type="B" width="100%" height="120p" method="ExecuteNode(showDrawer)" bgcolor="#00000000" title=" " /> 
 +          <frame name="frmdrawerbasico" class="frameopciondrawer" bgcolor="##FLD_MAP_COLOR1##"> 
 +            <prop name="MAP_MENUDRAWERBASICOS" class="icondrawer" img="basicos.png" type="B" method="executenode(toggleSUBMENU(1))" /> 
 +            <prop name="MAP_BASICO" type="B" class="botondrawer" method="executenode(toggleSUBMENU(1))" title="BASICO" /> 
 +          </frame> 
 +          <frame name="Subopciones1" disablevisible="MAP_SUBOPCION&lt;&gt;1" class="framesubopciondrawer"> 
 +            <prop name="MAP_BT_OPCION1_012" type="B" method="executenode(pulsar('EspecialBasicos',0))" class="botonsubopciondrawer" title="BÁSICOS" /> 
 +            <prop name="MAP_BT_OPCION1_022" type="B" method="executenode(pulsar('EspecialBasicosPlus',0))" class="botonsubopciondrawer" title="BÁSICOS PLUS" /> 
 +            <prop name="MAP_BT_OPCION1_032" type="B" method="executenode(pulsar('EspecialFontSize',0))" class="botonsubopciondrawer" title="TAMAÑO LETRAS" /> 
 +            <prop name="MAP_BT_OPCION1_042" type="B" method="executenode(pulsar('EspecialMargins',0))" class="botonsubopciondrawer" title="BORDES" /> 
 +            <prop name="MAP_BT_OPCION1_052" type="B" method="executenode(pulsar('EspecialColores',0))" class="botonsubopciondrawer" title="COLORES" /> 
 +            <prop name="MAP_BT_OPCION1_062" type="B" method="executenode(pulsar('EspecialFrames',0))" class="botonsubopciondrawer" title="FRAMES" /> 
 +            <prop name="MAP_BT_OPCION1_072" type="B" method="executenode(pulsar('EspecialButtons',0))" class="botonsubopciondrawer" title="BOTONES" /> 
 +            <prop name="MAP_BT_OPCION1_082" type="B" method="executenode(pulsar('EspecialControlesDinamicos',0))" class="botonsubopciondrawer" title="DINÁMICOS" /> 
 +            <prop name="MAP_BT_OPCION1_092" type="B" method="executenode(pulsar('EspecialRefresh',0))" class="botonsubopciondrawer" title="REFRESCOS" /> 
 +            <prop name="MAP_BT_OPCION1_102" type="B" method="executenode(pulsar('EspecialHerencia',0))" class="botonsubopciondrawer" title="HERENCIA" /> 
 +          </frame> 
 +          <frame name="frmdrawercontents" class="frameopciondrawer" bgcolor="##FLD_MAP_COLOR2##"> 
 +            <prop name="MAP_MENUDRAWERCONTENTS" class="icondrawer" img="contents.png" type="B" method="executenode(toggleSUBMENU(2))" /> 
 +            <prop name="MAP_CONTENTS" class="botondrawer" type="B" title="CONTENTS" method="executenode(toggleSUBMENU(2))" /> 
 +          </frame> 
 +          <frame name="Subopciones2" disablevisible="MAP_SUBOPCION&lt;&gt;2" class="framesubopciondrawer"> 
 +            <prop name="MAP_BT_OPCION2_012" type="B" method="executenode(pulsar('EspecialContents',1))" class="botonsubopciondrawer" title="CONTENTS" /> 
 +            <prop name="MAP_BT_OPCION2_022" type="B" method="executenode(pulsar('EspecialCalendario',1))" class="botonsubopciondrawer" title="CALENDARIO" /> 
 +            <prop name="MAP_BT_OPCION2_032" type="B" method="executenode(pulsar('EspecialGraficos',1))" class="botonsubopciondrawer" title="GRAFICOS" /> 
 +            <prop name="MAP_BT_OPCION2_042" type="B" method="executenode(pulsar('EspecialMapa',1))" class="botonsubopciondrawer" title="MAPA" /> 
 +            <prop name="MAP_BT_OPCION2_082" type="B" method="executenode(pulsar('OpenStreetMap',1))" class="botonsubopciondrawer" title="OPEN STREET MAP" /> 
 +            <prop name="MAP_BT_OPCION2_052" type="B" method="executenode(pulsar('EspecialPictureMap',1))" class="botonsubopciondrawer" title="PICTUREMAP" /> 
 +            <prop name="MAP_BT_OPCION2_062" type="B" method="executenode(pulsar('EspecialTreeview',1))" class="botonsubopciondrawer" title="TREEVIEW" /> 
 +            <prop name="MAP_BT_OPCION2_072" type="B" method="executenode(pulsar('EspecialSlideView',1))" class="botonsubopciondrawer" title="SLIDEVIEW" /> 
 +          </frame> 
 +          <frame name="frmdrawerperifericos" class="frameopciondrawer" bgcolor="##FLD_MAP_COLOR3##"> 
 +            <prop name="MAP_MENUDRAWERPERIFERICOS" class="icondrawer" img="perifericos.png" type="B" method="executenode(toggleSUBMENU(3))" /> 
 +            <prop name="MAP_PERIFERICOS" class="botondrawer" type="B" title="PERIFERICOS" method="executenode(toggleSUBMENU(3))" /> 
 +          </frame> 
 +          <frame name="Subopciones3" disablevisible="MAP_SUBOPCION&lt;&gt;3" class="framesubopciondrawer"> 
 +            <prop name="MAP_BT_OPCION3_012" type="B" method="executenode(pulsar('EspecialPerifericos',2,'MAIL'))" class="botonsubopciondrawer" title="MAIL" /> 
 +            <prop name="MAP_BT_OPCION3_022" type="B" method="executenode(pulsar('EspecialPerifericos',2,'PDF'))" class="botonsubopciondrawer" title="PDF" /> 
 +            <prop name="MAP_BT_OPCION3_032" type="B" method="executenode(pulsar('EspecialPerifericos',2,'STARTSCANNER'))" class="botonsubopciondrawer" title="STARTSCANNER" /> 
 +            <prop name="MAP_BT_OPCION3_042" type="B" method="executenode(pulsar('EspecialSonidos',2))" class="botonsubopciondrawer" title="SONIDO" /> 
 +            <prop name="MAP_BT_OPCION3_052" type="B" method="executenode(pulsar('EspecialPerifericos',2,'COMPARTIR'))" class="botonsubopciondrawer" title="COMPARTIR" /> 
 +            <prop name="MAP_BT_OPCION3_062" type="B" method="executenode(pulsar('CustomCamera',2))" class="botonsubopciondrawer" title="CAMARA PERSONALIZADA" /> 
 +          </frame>             
 +          <frame name="frmdrawerreglas" class="frameopciondrawer" bgcolor="##FLD_MAP_COLOR4##"> 
 +            <prop name="MAP_MENUDRAWERREGLAS" class="icondrawer" img="reglas.png" type="B" method="executenode(toggleSUBMENU(4))" /> 
 +            <prop name="MAP_REGLAS" class="botondrawer" type="B" title="REGLAS DE NEGOCIO" method="executenode(toggleSUBMENU(4))" /> 
 +          </frame> 
 +          <frame name="Subopciones4" disablevisible="MAP_SUBOPCION&lt;&gt;4" class="framesubopciondrawer"> 
 +            <prop name="MAP_BT_OPCION4_012" type="B" method="executenode(pulsar('EspecialEventos',3))" class="botonsubopciondrawer" title="EVENTOS" /> 
 +            <prop name="MAP_BT_OPCION4_022" type="B" method="executenode(pulsar('EspecialNotificaciones',3))" class="botonsubopciondrawer" title="NOTIFICACIONES" /> 
 +            <prop name="MAP_BT_OPCION4_032" type="B" method="executenode(pulsar('EspecialDatosOnline',3,'JSON'))" class="botonsubopciondrawer" title="JSON" /> 
 +            <prop name="MAP_BT_OPCION4_042" type="B" method="executenode(pulsar('EspecialDatosOnline',3,'WEBSERVICE'))" class="botonsubopciondrawer" title="WEBSERVICE" /> 
 +            <prop name="MAP_BT_OPCION4_052" type="B" method="executenode(pulsar('EspecialJavascript',3))" class="botonsubopciondrawer" title="JAVASCRIPT" /> 
 +            <prop name="MAP_BT_OPCION4_062" type="B" method="executenode(pulsar('EspecialFileManager',3))" class="botonsubopciondrawer" title="FILEMANAGER" /> 
 +          </frame> 
 +          <frame name="frmdrawerconsola" class="frameopciondrawer" bgcolor="##FLD_MAP_COLOR5##"> 
 +            <prop name="MAP_MENUDRAWERUTILES" class="icondrawer" img="consola.png" type="B" method="executenode(toggleSUBMENU(5))" /> 
 +            <prop name="MAP_CONSOLA" class="botondrawer" type="B" title="UTILIDADES" method="ExecuteNode(toggleSUBMENU(5))" /> 
 +          </frame>           
 +          <frame name="Subopciones5" disablevisible="MAP_SUBOPCION&lt;&gt;5" class="framesubopciondrawer"> 
 +            <prop name="MAP_BT_OPCION5_012" type="B" method="executenode(pulsar('ContentConsolaReplica',5))" class="botonsubopciondrawer" title="CONSOLA DE RÉPLICA" /> 
 +            <prop name="MAP_BT_OPCION5_022" type="B" method="executenode(pulsar('MenuWifiManager',5))" class="botonsubopciondrawer" title="WIFI MANAGER" /> 
 +            <prop name="MAP_BT_OPCION5_032" type="B" method="executenode(pulsar('EspecialMultiLanguage',5))" class="botonsubopciondrawer" title="EJEMPLO MULTILANGUAGE" /> 
 +            <prop name="MAP_BT_OPCION5_042" type="B" method="executenode(pulsar('EspecialBrillo',5))" class="botonsubopciondrawer" title="EJEMPLO BRILLO" /> 
 +            <prop name="MAP_BT_OPCION5_052" type="B" method="executenode(pulsar('HuellaDactilar',5))" class="botonsubopciondrawer" title="HUELLA DACTILAR" /> 
 +            <!--<prop name="MAP_BT_OPCION5_062" type="B" method="executenode(pulsar('EspecialBluetooth',5))" class="botonsubopciondrawer" title="EJEMPLO BLUETOOTH" />--> 
 +            <prop name="MAP_BT_OPCION5_072" type="B" method="executenode(pulsar('ImageDrawing',5))" class="botonsubopciondrawer" title="IMAGEDRAWING" /> 
 +          </frame> 
 +          <frame name="frmdrawerLogout" class="frameopciondrawer" bgcolor="##FLD_MAP_COLOR6##"> 
 +            <prop name="MAP_MENUDRAWERLOGOUT" class="icondrawer" img="salir.png" type="B" method="executenode(toggleSUBMENU(6))" /> 
 +            <prop name="MAP_LOGOUT" class="botondrawer" type="B" title="LOGOUT" method="ExecuteNode(toggleSUBMENU(6))" /> 
 +          </frame> 
 +          <prop name="MAP_TRANSPARENTEFIN" type="B" width="100%" height="800p" method="ExecuteNode(showDrawer)" bgcolor="#00000000" title=" " /> 
 +      </group> 
 +      <create>        
 +        <action name="setval" field="MAP_SUBOPCION" value="0" /> 
 +        <action name="setval" field="MAP_COLOR1" value="#F72D9C" /> 
 +        <action name="setval" field="MAP_COLOR2" value="#037DB7" /> 
 +        <action name="setval" field="MAP_COLOR3" value="#59A51C" /> 
 +        <action name="setval" field="MAP_COLOR4" value="#DC2204" /> 
 +        <action name="setval" field="MAP_COLOR5" value="#FDD328" /> 
 +        <action name="setval" field="MAP_COLOR6" value="#FF0000" /> 
 +        <action name="setval" field="MAP_TIMEAUTO" value="CADA 60 SG" /> 
 +        <action name="setval" field="MAP_VERSIONAPP" value="Version App: ##VERSION##" /> 
 +      </create> 
 +                  
 +      <CargarURL>    
 +        <action name="runscript">    
 +        <param name="URL" />     
 +            <script language="javascript">           
 +                try { 
 +                    ui.openUrl(URL);                             
 +                } catch(err) { 
 +                    ui.msgBox(err.message,"Aviso JS",0); 
 +                } 
 +            </script>          
 +        </action>  
 +    </CargarURL> 
 +       
 +       
 +      <cambiarMenu refresh="false" show-wait-dialog="false"> 
 +        <action name="runscript"> 
 +          <param name="Titulo" /> 
 +          <param name="Imagen" /> 
 +          <param name="ColorFondo" /> 
 +          <script language="javascript"> 
 +           self.FILTROCONTROL=Titulo; 
 +           self.MAP_IMAGEN=Imagen; 
 +           self.MAP_MENU=Titulo; 
 +           self.MAP_COLORACTIVO=ColorFondo; 
 +           // Quitamos el drawer por si estuviera visible 
 +           // ui.hidegroup("99"
 + ui.refresh ("@MenuControles","MAP_IMAGEN","frmtitulo"); 
 + </script> 
 +        </action> 
 +      </cambiarMenu> 
 +      <before-edit> 
 +        <action name="runscript"> 
 +          <script language="javascript"> 
 + self.executeNode ("cambiarMenu('BASICO','1SELECT.png',##FLD_MAP_COLOR1##)");  
 + </script> 
 +        </action> 
 +      </before-edit> 
 +      <showDrawer refresh="false" show-wait-dialog="false"> 
 +        <action name="runscript"> 
 +          <script language="javascript"> 
 + ui.toggleGroup("99"); 
 + </script> 
 +        </action> 
 +      </showDrawer> 
 +      <toggleSUBMENU  show-wait-dialog="false"> 
 +        <action name="runscript"> 
 +          <param name="subopcion" /> 
 +          <script language="javascript"> 
 +                if ( subopcion == 6){ 
 +     self.executeNode("logout"); 
 +     }else{ 
 +      // Pasamos como parámetro la opcion principal en que ha pinchado. 
 +      // Preguntamos y si le ha vuelto a dar a la que estaba desplegada, la colapsamos. 
 +         
 +      if (self.MAP_SUBOPCION==subopcion){ 
 +        self.MAP_SUBOPCION=0; 
 +        }else{ 
 +        self.MAP_SUBOPCION=subopcion; 
 +        } 
 +     } 
 + </script> 
 +        </action> 
 +      </toggleSUBMENU> 
 +      <pulsar show-wait-dialog="false"> 
 +        <action name="runscript"> 
 +          <param name="coll" /> 
 +          <param name="tipo" /> 
 +          <param name="subtipo" /> 
 +          <script language="javascript"> 
 +              if (tipo) { 
 +              if (tipo===0) 
 +              self.executeNode("cambiarMenu('BASICO','1SELECT.png',##FLD_MAP_COLOR1##)"); 
 +               
 +    if (tipo===1) 
 +              self.executeNode ("cambiarMenu('CONTENTS','2SELECT.png',##FLD_MAP_COLOR2##)"); 
 +               
 +              if (tipo===2) 
 +              self.executeNode ("cambiarMenu('PERIFERICOS','3SELECT.png',##FLD_MAP_COLOR3##)"); 
 +               
 +    if (tipo===3) 
 +              self.executeNode ("cambiarMenu('REGLAS DE NEGOCIO','4SELECT.png',##FLD_MAP_COLOR4##)"); 
 +               
 +              } 
 +               
 +              var param = {TIPO:"",MAP_COLORACTIVO:""}; 
 +              if ( coll === "EspecialPerifericos" || coll === "EspecialDatosOnline"){ 
 +                  param.TIPO = subtipo||""; 
 +              } 
 +              if (coll==="ContentConsolaReplica" || tipo == 5){ 
 +           param.MAP_COLORACTIVO = self.MAP_COLOR5; 
 +   }else{ 
 +           param.MAP_COLORACTIVO = self.MAP_COLORACTIVO; 
 +   } 
 +    
 +              var obj = appData.getCollection(coll).createObject(param,true); 
 +              ui.openEditView(obj); 
 +        
 +     
 + </script> 
 +        </action> 
 +      </pulsar> 
 +      <onchange show-wait-dialog="false"> 
 +        <field name="MAP_TIMEAUTO"> 
 +          <action name="runscript"> 
 +            <script language="javascript">  
 + if (self.MAP_TIMEAUTO==="CADA 3 SG") 
 + self.MAP_TIMEVALOR=3; 
 + if (self.MAP_TIMEAUTO==="CADA 60 SG") 
 + self.MAP_TIMEVALOR=60; 
 + </script> 
 +          </action> 
 +        </field> 
 +      </onchange> 
 +      <onback show-wait-dialog="false"> 
 +        <action name="runscript"> 
 +          <script language="javascript"> 
 + // appData.failWithMessage (-11888, "##EXITAPP##"); 
 + exit(); 
 + </script> 
 +        </action> 
 +      </onback> 
 +      <logout> 
 +            <action name="runscript"> 
 +                <script language="javascript"> 
 +     doLogout(); 
 +     </script> 
 +            </action> 
 +      </logout> 
 +       
 +      <permissions>  
 +     
 +        <!-- Acceso a la SDCard/almacenamiento externo. Necesario para la réplica y en general el funcionamiento del framework --> 
 +        <!--<permission name="external-storage" /> --> 
 +         
 +        <!-- Acceso al hardware de telefonía, para hacer llamadas y poder obtener IMEI y otros identificadores de dispositivo. --> 
 +        <!--<permission name="phone" /> --> 
 +         
 +        <!-- Acceso a la cámara. Necesario para multitud de plugins. --> 
 +        <permission name="camera" /> 
 +         
 +        <!-- Acceso al GPS y la localización por wifi. --> 
 +        <permission name="location-foreground" /> 
 +         
 +        <!-- Acceso al calendario del usuario para leer/añadir eventos. --> 
 +        <!--<permission name="calendar" />--> 
 +         
 +        <!-- Leer los contactos. --> 
 +        <!--<permission name="contacts" />--> 
 +         
 +        <!-- Acceso al micrófono. --> 
 +        <permission name="microphone" /> 
 +         
 +        <!-- Lectura y envío de SMS. Los frameworks que estén alojados en el Play Store NO pueden utilizar el permiso de SMS, salvo causa justificada y obteniendo los permisos necesarios por parte de Google. --> 
 +        <!--<permission name="sms" />--> 
 +         
 +    </permissions> 
 +    </coll> 
 +</code> 
 +<code javascript> 
 +<coll name="MenuControles" title="XoneCollvacia" sql="select ID,IMAGEN,TITULO,DESCRIPCION,ORDEN from gen_controles" 
 +objname="controles" updateobj="controles" progid="ASData.CASBasicDataObj"  cell-height="440p" cell-border-width="0" cell-border-color="#00000000" cell-odd-color="#FFFFFF" cell-even-color="#F2F2F2"> 
 +      <platform name="iphone" screen-orientation="portrait" /> 
 +       
 +      <group name="GRID" id="1">                
 +        <!--<frame name="grid" width="324p" alignx="center">--> 
 +        <prop name="IMAGEN" type="IMG" width="240p" height="240p" labelwidth="0" lmargin="5p" tmargin="1p" visible="4" /> 
 +        <prop name="TITULO" type="T" visible="4" class="classgrid" width="240p" lmargin="5p" text-align="center" textfont-bold="true" /> 
 +            
 +        <prop name="DESCRIPCION" type="T" visible="0" /> 
 +        <prop name="FILTRO" type="T" visible="0" /> 
 +        <prop name="ORDEN" type="N" visible="0" /> 
 +        <!--</frame>--> 
 +      </group>                
 +      <selecteditem show-wait-dialog="false"> 
 +        <action name="runscript"> 
 +          <script language="javascript">            
 + self.getOwnerCollection().getOwnerObject().executeNode("pulsar(" + cstr(self.DESCRIPCION) + ",99,"+cstr(self.TITULO)+")"); 
 + </script>        
 +        </action>             
 +      </selecteditem>            
 +    </coll> 
 +   </code>  
 +===== Menú a través del fichero APPWIZARD.XML  (OBSOLETO) ===== 
  
   - Editando el fichero **APPWIZARD.XML** (Tenemos 2 niveles de Menús).   - Editando el fichero **APPWIZARD.XML** (Tenemos 2 niveles de Menús).
Línea 49: Línea 668:
  
 \\ \\
-===== Appwizard.xml =====+==== Appwizard.xml ====
 \\ \\
 El fichero **Appwizard.xml** define la estructura de menús para la aplicación.  El fichero **Appwizard.xml** define la estructura de menús para la aplicación. 
  
  
-==== Estructura del fichero APPWIZARD.XML ====+=== Estructura del fichero APPWIZARD.XML ===
 \\ \\
 <code xml> <code xml>
Línea 116: Línea 735:
 {{wiki:pda.jpg}} {{wiki:9700-14.png}}  {{wiki:screenshot_2011.02.17_14.03.27.png}}   {{wiki:pda.jpg}} {{wiki:9700-14.png}}  {{wiki:screenshot_2011.02.17_14.03.27.png}}  
 \\ \\
-===== Atributos =====+ 
 +==== Colección de Menús Personalizada (Sustituye al APPWIZARD) ===
 +\\ 
 +Como ya referimos al inicio, en algunos casos, el APPWIZARD (2 niveles de menús) puede quedarse pequeño, y necesitamos personalizar aún más el diseño de los menús de la aplicación.\\ 
 +\\ 
 +Para ello, disponemos del atributo **entry-point="<nowiki>ColeccionConMenuPersonalizado</nowiki>"** en el nodo app, para señalar la colección que queremos que se ejecute inmediatamente después de que el usuario se haya logueado (Independientemente de que se haga el login normal o este también se haya personalizado, [[ http://www.xoneisp.com/xonewiki/doku.php?id=b.-programacion:b02.-menus-aplicacion:start&#pantalla_de_login_personalizada | ver opción anterior ]]). Utilizando este atributo, ignoraremos por completo el fichero appwizard.xml y será el programador el encargado de diseñar sus propios menús en la colección indicada en dicho atributo. 
 +<code xml> 
 +<?xml version="1.0" encoding="iso-8859-1"?> 
 +<xml> 
 + <app prefix="gen" version="0.0.0.26" entry-point="MenuPersonalizado"> 
 + <!-- 
 + <style url="default.css"> 
 + <style url="default_hor.css" conditions="phone:horizontal"/> 
 + <style url="default_tablet.css" conditions="tablet:vertical"/> 
 + <style url="default_hor.css" conditions="tablet:horizontal"/> 
 + --> 
 + </app> 
 + 
 + <collprops type="general"> 
 + 
 + <coll name="Empresas" ...> 
 + <group name="General" id="1" /> 
 + <prop name="..." ... /> 
 + </coll> 
 + <coll name="Usuarios" ... > 
 + <group name="General" id="1" /> 
 + <prop name="IDEMPRESA" group="1" visible="0" type="N" mapcol="Empresas" mapfld="ID" /> 
 + <prop name="LOGIN" visible="3" group="1" type="T" fieldsize="10" fixed-text="true" size="10" /> 
 + <prop name="PWD" group="1" type="T" fieldsize="10" fixed-text="true" size="10" visible="" /> 
 + <prop name="NOMBRE" visible="3" group="1" type="T" fieldsize="30" fixed-text="true" size="30" /> 
 + <prop name="USERTYPE" visible="1" group="1" type="T" fieldsize="30" fixed-text="true" size="50" /> 
 + <create> 
 + <action name="setval" field="IDEMPRESA" value="##ENTID##" /> 
 + </create> 
 + </coll> 
 + 
 + <coll name="MenuPersonalizado" title="Menu" fontsize="8" sql="" objname="" updateobj="" filter="" sort="" progid="ASData.CASBasicDataObj"> 
 + <group name="General" id="1" /> 
 + <prop name="MAP_TEST" group="1" type="TL" visible="3" title="Aquí va el menú" fieldsize="10" size="10" /> 
 + </coll> 
 +</code> 
 +\\ 
 +=== Atributos ===
 \\ \\
 ^ Atributo ^ Descripción ^ ^ Atributo ^ Descripción ^
Línea 126: Línea 787:
 | Loadall | para cargar o no todos los datos de la coll | | Loadall | para cargar o no todos los datos de la coll |
 \\ \\
-==== mask="valor" ====+=== mask="valor" ===
  
 Es un número que en binario indicará las operaciones que se podrán hacer sobre la colección.\\ Es un número que en binario indicará las operaciones que se podrán hacer sobre la colección.\\