Menús de la Aplicación


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.
Estas nuevas funcionalidades van orientadas inicialmente a la plataforma y conjuntamente al dispositivo. Quiere decir esto, que 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.

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

A continuación expondremos algunos diseños y como implementar sus funcionalidades.

Tipos de Menus
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
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:Grupo DRAWER


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.



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.



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.



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.

<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="18" class="xnTituloHeaderC" width="75%" label-wrap="true" newline="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="xnBotonMenuFooter" img="Artboard 49.png" visible="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_FOOT2A" type="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_ICONO4B" type="B" class="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>


function irColl(collname){
    var coll = appData.getCollection(collname);
    var obj = coll.createObject();
    coll.addItem(obj);
    appData.pushValue(obj);
}




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.


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.


Veáse también: Grupo DRAWER

Ejemplo:

 <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>
 


<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>
 


Ejemplo donde se combina el uso de Menú con botones y Menu con Drawer:

<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>
<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>
 
  1. Editando el fichero APPWIZARD.XML (Tenemos 2 niveles de Menús).
  2. Si queremos personalizar los menús para hacerlos completamente a nuestro gusto o tenemos más de dos niveles de menús, podemos hacer nuestra propia colección de menús personalizada, con el diseño que queramos. Para indicarle al Framework que no utilice el fichero APPWIZARD.XML y que utilice en su lugar nuestra colección personalizada de menús, tenemos que definir el atributo entry-point=“NombreColeccionConMenuPersonalizado“ en el nodo app.



El fichero Appwizard.xml define la estructura de menús para la aplicación.

Estructura del fichero APPWIZARD.XML


<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Línea que define la codificación del fichero -->
<xml>
<!-- Lugar donde se abre el nodo XML. Aquí no hace falta tener otro fichero de configuración de propiedades.  -->
	<app name="Xone" caption="Titulo Aplicación"/>
	<!-- Titulo de la aplicación, que se muestra en la parte de arriba al entrar en el FrameWork. -->
	<menus>
	<!-- Tendremos un nodo menus por cada tipo de usuario distinto que tengamos en la aplicación -->
		<user>
			<prop name="TIPO_USUARIO" value="Administrador"></prop>
			<!-- 
			Nodo para decidir que tipo de usuario entra. 
			Para ello el nodo busca en la coll 'usuarios' del mappings, buscando el campo que está en el atributo 'name', 
			para aquellos que tengan el valor igual que el que está en el atributo 'value'
			Esto lanzaria: SELECT * FROM Gen_Usuarios WHERE TIPO_USUARIO="Administrador"
			-->	
		</user>
 
		<item name="Personal">
		<props caption="Personal" imgbk="logo.gif"/>  
		<!-- 
			Nodo para crear los distintos menús en forma de pestañas. 
			Posteriormente dentro de este nodo, se insertan las opciones que pueda haber dentro de la pestaña. 
				name: Su valor debe ser único en todo el Appwizard.			
				caption: Título de la pestaña-menu. 
				imgbk: Imagen que saldrá de fondo en la pestaña.
		-->
			<item menu="personal" name="mnUsuarios">
			<props caption="Personal" icon="../icons/cliente.bmp"/>				 
			<!-- 
				menu: Se suele poner el nombre de la pestaña donde va ésta opción.
				name: Su valor debe ser único en todo el Appwizard. 
				caption: Titulo del icono que sale en pantalla. 
				icon: Ruta hacia el icono.
 
			-->
				<coll name="Centros" mode="0">
				<props caption="Los Usuarios del sistema" mask="31"/>
				<!-- 
					name: Nombre de la Colección del Mappings. 
					mode: Como se entra en la colección por defecto, modo listado (0) ó modo edición (1). 
					caption: Titulo de la opción. 
					mask: Acciones que se pueden realizar, como editar, crear, borrar o filtrar. 
					loadall: Para cargar o no todos los datos de la coll. 
				-->
				</coll>
			</item>
		</item>
	</menus>
</xml>



  • En la estructura anterior se repetirá el nodo <menus> tantas veces como usuarios distintos vayamos a tener en nuestra aplicación.
  • Dentro del nodo ”<item menu…“, tenemos otro nodo ”<item menu…“ anidado, el primero corresponderá a la pestaña, y el anidado a los iconos que hay dentro de dicha pestaña, como se puede ver en las ilustraciones siguientes:


pda.jpg


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=”ColeccionConMenuPersonalizado“ 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, 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.

<?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>


Atributos


Atributo Descripción
menu es donde se pone el nombre del menú utilizado
name su valor debe ser único en todo el Appwizard
Imgbk sirve para llamar a una imagen, que saldrá de fondo en la pestaña
mode define como se va a entrar en la opción por defecto, si en modo listado (0) o modo edición (1)
Mask acciones que se pueden realizar, como editar, crear, borrar o filtrar
Loadall para cargar o no todos los datos de la coll


mask="valor"

Es un número que en binario indicará las operaciones que se podrán hacer sobre la colección.

La codificación de ese número es la siguiente:

Posición BIT en Binario Icono Opción Asociada Modo Listado (GRID) Modo Edición (FORMULARIO)
1 ( 0 0 0 0 0 0 1 ) Crear nuevo SI SI
2 ( 0 0 0 0 0 1 0 ) Editar SI NO
4 ( 0 0 0 0 1 0 0 ) Borrar SI SI
8 ( 0 0 0 1 0 0 0 ) Salir SI SI
16 ( 0 0 1 0 0 0 0 ) Filtrar SI NO
32 ( 0 1 0 0 0 0 0 ) inline (Solo Pocket PC) NO SI
64 ( 1 0 0 0 0 0 0 ) Guardar NO SI



Hay varios sitios donde podemos definir la máscara(permisos) a una colección:

Atributo Nodo
mask En fichero appwizard.xml en la llamada a la colección
editmask En el nodo COLL de definición de una colección
mask En el PROP de llamada a una colección CONTENTS
nomenmask En el nodo COLL de definición de una colección (Máscara cuando se llama desde una lupa a esta colección)