custom:development_creazione_plugin_maplayout2d

Differenze

Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.

Link a questa pagina di confronto

Entrambe le parti precedenti la revisione Revisione precedente
Prossima revisione
Revisione precedente
custom:development_creazione_plugin_maplayout2d [2020/11/23 10:31]
giorgio.scali
custom:development_creazione_plugin_maplayout2d [2020/11/24 18:38] (versione attuale)
giorgio.scali
Linea 1: Linea 1:
 ======MapLayout2D PLUGGABILITY====== ======MapLayout2D PLUGGABILITY======
 +
 +Questo file è disponibile anche i formato .docx {{ :​custom:​maplayout2d_-_pluggability.docx|qui}}
  
 Guida rivolta agli svluppatori. Guida rivolta agli svluppatori.
-Questa guida permette di rendere disponibili,​ qual’ora il plugin fosse presente nell’ambiente deployato, delle funzionalità aggiuntive che possono essere configurate,​ gwMap per gwMap, nell’apposita sezione del webadmin (vedi apposita guida) 
  
-Un primo meccanismo di pluggabilità dell’OlMapWidget (LEGACY), che verrà descritto in fondo, è presente fin dalla versione 4.0.0. +Questa guida permette di rendere disponibili,​ qual’ora il plugin fosse presente nell’ambiente deployato, delle funzionalità aggiuntive che possono essere configurate,​ gwMap per gwMap, nell’apposita sezione del webadmin (vedi apposita [[https://​wiki.geowebframework.com/​doku.php?​id=gwusermanual:​interface:​interface:​mappe_e_planimetrie|guida]]). 
-Dalla versione 4.5.0 e successive è stato introdotto un ulteriore meccanismo di plugin, sulla falsa riga del 3D.+ 
 +Un primo meccanismo di pluggabilità dell’OlMapWidget (**LEGACY**), che verrà descritto in fondo, è presente fin dalla versione 4.0.0. 
 + 
 +Dalla **versione 4.5.0 e successive** è stato introdotto un ulteriore meccanismo di plugin, sulla falsa riga del 3D.
 Di base, nell’xml del gwMap si possono configurare (rendere o meno visibili) le seguenti entità: Di base, nell’xml del gwMap si possono configurare (rendere o meno visibili) le seguenti entità:
- * ButtonGroup (gruppo di bottoni), in genere omogenei per ambito d’azione (‘selection’,​ ‘navigation’,​ ‘info’, etc..) +  ​* ButtonGroup (gruppo di bottoni), in genere omogenei per ambito d’azione (‘selection’,​ ‘navigation’,​ ‘info’, etc..) 
- * Tab, fra quelli disponibili di default, e quelli introdotti da eventuali plugin+  * Tab, fra quelli disponibili di default, e quelli introdotti da eventuali plugin
  
 Tipicamente un plugin di geoweb per il MapLayout2D può: Tipicamente un plugin di geoweb per il MapLayout2D può:
- * [[:​custom:​development_creazione_plugin_maplayout2d#​ButtonGroup|aggiungere un ButtonGroup]] (gruppo di bottoni) alla toolbar ed aggiungerci contestualmente uno o più mapCommand (comandi-mappa) +  ​* [[:​custom:​development_creazione_plugin_maplayout2d#​AGGIUNGERE BUTTON-GROUP E RELATIVI MAP-COMMAND ALLA TOOLBAR|aggiungere un ButtonGroup]] (gruppo di bottoni) alla toolbar ed aggiungerci contestualmente uno o più mapCommand (comandi-mappa) 
- * [[:​custom:​development_creazione_plugin_maplayout2d#​TAB|aggiungere una tipologia di TAB]] a quelle disponibili +  * [[:​custom:​development_creazione_plugin_maplayout2d#​AGGIUNGERE ​TAB A QUELLI DISPONIBILI|aggiungere una tipologia di TAB]] a quelle disponibili 
- * [[:​custom:​development_creazione_plugin_maplayout2d#​Marker|registrare un marker]] gestito con varie convenzioni,​ per l’esecuzione di codice in hook-point, utili a predisporre funzionalità usate nel plugin+  * [[:​custom:​development_creazione_plugin_maplayout2d#​REGISTRARE PLUGIN MARKER PER HOOKPOINT|registrare un marker]] gestito con varie convenzioni,​ per l’esecuzione di codice in hook-point, utili a predisporre funzionalità usate nel plugin
  
 Queste operazioni partono sempre lato java, tipicamente in un [pluginName]initializerService.class,​ dentro un metodo annotato @PostCostruct,​ eseguito all’avvio del framework. Queste operazioni partono sempre lato java, tipicamente in un [pluginName]initializerService.class,​ dentro un metodo annotato @PostCostruct,​ eseguito all’avvio del framework.
-<code java>+<​code ​java postConstruct.java>
 @PostConstruct @PostConstruct
  public void init(){  public void init(){
Linea 46: Linea 50:
 </​code>​ </​code>​
  
-AGGIUNGERE BUTTON-GROUP E RELATIVI MAP-COMMAND ALLA TOOLBAR+====AGGIUNGERE BUTTON-GROUP E RELATIVI MAP-COMMAND ALLA TOOLBAR====
 Nel [pluginName]initializerService.java registrare ButtonGroup e commandList:​ Nel [pluginName]initializerService.java registrare ButtonGroup e commandList:​
  
Linea 53: Linea 57:
  registerTwoDMainToolbarButtons(twoDSelectionButtonList,​ "​pluginCommandSection"​);​  registerTwoDMainToolbarButtons(twoDSelectionButtonList,​ "​pluginCommandSection"​);​
  
-CustomPluginCommand è tipicamente definito in un file javascript "​debug/​customDojo/​pluginCommands.js"​ , registrato sempre nell’ [pluginName]initializerService. java, con eventualmente le sue risorse css con i soliti meccanismi generali dei plugin in geoweb. Esempio pluginCommands.js: ​+CustomPluginCommand è tipicamente definito in un file javascript "​debug/​customDojo/​pluginCommands.js"​ , registrato sempre nell’ [pluginName]initializerService. java, con eventualmente le sue risorse css con i soliti meccanismi generali dei plugin in geoweb. Esempio pluginCommands.js:​
  
 +<code javascript pluginCommands.js>​
 require([ require([
  '​dojo/​topic',​  '​dojo/​topic',​
Linea 109: Linea 114:
  }  }
 ); );
- +</​code>​ 
-AGGIUNGERE TAB A QUELLI DISPONIBILI+ 
 +====AGGIUNGERE TAB A QUELLI DISPONIBILI====
 Nel [pluginName]initializerService.class registrar ButtonGroup e commandList:​ Nel [pluginName]initializerService.class registrar ButtonGroup e commandList:​
  
 +<code java example.java>​
 List<​String>​ tabList = new ArrayList<​String>​();​ List<​String>​ tabList = new ArrayList<​String>​();​
  tabList.add("​pluginTab"​);​  tabList.add("​pluginTab"​);​
  gwRegistry.registerTwoDTabList(tabList);​  gwRegistry.registerTwoDTabList(tabList);​
 +</​code>​
  
 La lista di tutti i tab registrati viene elaborata nel jsp della scheda mappa cosi: La lista di tutti i tab registrati viene elaborata nel jsp della scheda mappa cosi:
  
 +<code jsp>
 <​c:​forEach items="​${tabList}"​ var="​tab">​ <​c:​forEach items="​${tabList}"​ var="​tab">​
 <​jsp:​include page="/​layout2D/​tab/​${tab.type}.html?​tabName=${tab.name}&​tabLabel=${tab.label}&​tabIcon=${tab.icon}&​tabIcon16=${tab.icon16}&​tabIcon32=${tab.icon32}">​ <​jsp:​include page="/​layout2D/​tab/​${tab.type}.html?​tabName=${tab.name}&​tabLabel=${tab.label}&​tabIcon=${tab.icon}&​tabIcon16=${tab.icon16}&​tabIcon32=${tab.icon32}">​
 </​jsp:​include>​ </​jsp:​include>​
 </​c:​forEach>​ </​c:​forEach>​
 +</​code>​
  
 Deve quindi essere previsto nel plugin un qualche XController.java,​ come da esempio: Deve quindi essere previsto nel plugin un qualche XController.java,​ come da esempio:
  
 +<code java pluginTabMAV.java>​
 @RequestMapping("​layout2D/​tab/​pluginTab"​) @RequestMapping("​layout2D/​tab/​pluginTab"​)
  public ModelAndView pluginTabMAV(  public ModelAndView pluginTabMAV(
Linea 167: Linea 178:
  return modelAndView;​  return modelAndView;​
  }  }
 +</​code>​
  
 E relativo jsp, come da esempio (qui il contenuto del tab è gestito da un apposito componente customDojo):​ E relativo jsp, come da esempio (qui il contenuto del tab è gestito da un apposito componente customDojo):​
  
 +<code jsp pluginTab.jsp>​
 <%@ page language="​java"​ contentType="​text/​html;​ charset=UTF-8"​ pageEncoding="​UTF-8"​%>​ <%@ page language="​java"​ contentType="​text/​html;​ charset=UTF-8"​ pageEncoding="​UTF-8"​%>​
 <%@ taglib prefix="​spring"​ uri="​http://​www.springframework.org/​tags"​%>​ <%@ taglib prefix="​spring"​ uri="​http://​www.springframework.org/​tags"​%>​
Linea 235: Linea 248:
   
 </​html>​ </​html>​
 +</​code>​
  
 A determinare il contenuto del tab sarà di fatto customDojo/​map/​plugin/​GwPlugin.js A determinare il contenuto del tab sarà di fatto customDojo/​map/​plugin/​GwPlugin.js
  
-REGISTRARE PLUGIN MARKER PER HOOKPOINT+====REGISTRARE PLUGIN MARKER PER HOOKPOINT====
  
 Nel [pluginName]initializerService.class registrar ButtonGroup e commandList:​ Nel [pluginName]initializerService.class registrar ButtonGroup e commandList:​
  
 +<code jsp>
 //in aim to evaluate furnitureLayout2DPlugin.jsp (tooltip handling) //in aim to evaluate furnitureLayout2DPlugin.jsp (tooltip handling)
 gwRegistry.registerTwoDPlugin("​furniture"​);​ gwRegistry.registerTwoDPlugin("​furniture"​);​
 +</​code>​
  
 Per ogni plugin-marker,​ all’apertura del MapLayout2D,​ vengono in automatico importati i javascript, con nome e path seguenti il pattern: Per ogni plugin-marker,​ all’apertura del MapLayout2D,​ vengono in automatico importati i javascript, con nome e path seguenti il pattern:
  
 +<code jsp>
 <​c:​forEach items="​${pluginList}"​ var="​plugin">​ <​c:​forEach items="​${pluginList}"​ var="​plugin">​
- ${plugin}Commands:​ '​${context}/​resources/'​+gwRevision+'/​debug/​customDojo/​${plugin}Commands.js',​ + ${plugin}Commands:​ '​${context}/​resources/'​+gwRevision+'/​debug/​customDojo/​${plugin}Commands.js',​ 
- </​c:​forEach>​+</​c:​forEach
 +</code>
  
 Questo è un meccanismo di import js parallelo al registrare le risorse sul [pluginName]initializerService. ​ Questo è un meccanismo di import js parallelo al registrare le risorse sul [pluginName]initializerService. ​
Linea 255: Linea 273:
 Inoltre, per ogni plugin-marker,​ viene eseguito uno script “dojo/​method” relativo al widget customDojo/​map/​MapLayout Inoltre, per ogni plugin-marker,​ viene eseguito uno script “dojo/​method” relativo al widget customDojo/​map/​MapLayout
  
 +<code jsp>
 <​c:​forEach items="​${pluginList}"​ var="​plugin">​ <​c:​forEach items="​${pluginList}"​ var="​plugin">​
-<script type="​dojo/​method">​+ <script type="​dojo/​method">​
  <​jsp:​include page="/​${plugin}Layout2DPlugin.html"​ ></​jsp:​include>​  <​jsp:​include page="/​${plugin}Layout2DPlugin.html"​ ></​jsp:​include>​
- </​script>​ + </​script>​ 
- </​c:​forEach>​+</​c:​forEach
 +</code>
  
 Qui si riesce, predisponendo un apposito controller ad eseguire codice javascript, ed altre possibili inizializzazioni JSTL, presenti su un .jsp fornito dal plugin stesso. Qui si riesce, predisponendo un apposito controller ad eseguire codice javascript, ed altre possibili inizializzazioni JSTL, presenti su un .jsp fornito dal plugin stesso.
Linea 265: Linea 285:
 Controller di supporto Controller di supporto
  
 +<code java furnitureLayout2DPlugin.java>​
 @RequestMapping(value = "​furniture"​+"​Layout2DPlugin"​) @RequestMapping(value = "​furniture"​+"​Layout2DPlugin"​)
  public ModelAndView furnitureLayout2DPlugin(   public ModelAndView furnitureLayout2DPlugin(
Linea 296: Linea 317:
  
 window['​plugin_globallyAvailableLabel] = '​${myLabel}';​ window['​plugin_globallyAvailableLabel] = '​${myLabel}';​
 +</​code>​
  
  
Linea 303: Linea 324:
 Rimane il fatto che siamo nel dojo/method del MapLayout e possiamo eseguire tutta una serie di cose, in base alle necessità Rimane il fatto che siamo nel dojo/method del MapLayout e possiamo eseguire tutta una serie di cose, in base alle necessità
  
-MECCANISMO DI PLUGIN LEGACY+====MECCANISMO DI PLUGIN LEGACY==== 
 Si tratta di un meccanismo precedente alla revisione del componente MapLayout2D. E’ ancora pienamente supportato, e lavora in parallelo a quello precedentemente descritto. Si tratta di un meccanismo precedente alla revisione del componente MapLayout2D. E’ ancora pienamente supportato, e lavora in parallelo a quello precedentemente descritto.
 E’ reso pluggabile il componente customDojo.map.OLMapWidget. Funziona in maniera molto similare al meccanismo di plugin della griglia dojo dojox.grid.EnhancedGrid (al quale è stata solo tolta la gestione specifica dei meccanismi della griglia). E’ reso pluggabile il componente customDojo.map.OLMapWidget. Funziona in maniera molto similare al meccanismo di plugin della griglia dojo dojox.grid.EnhancedGrid (al quale è stata solo tolta la gestione specifica dei meccanismi della griglia).
 Ad essere stata mantenuta è la possibilità di  Ad essere stata mantenuta è la possibilità di 
-avere punti di intervento multipli dove opera il widget: +  * avere punti di intervento multipli dove opera il widget: 
-onPreInit, prima del postCreate del OLMapWidget (solo con parametro preInit==true) +    ​* ​onPreInit, prima del postCreate del OLMapWidget (solo con parametro preInit==true) 
-onPostInit, dopo del postCreate del OLMapWidget (solo con parametro preInit==false) +    ​* ​onPostInit, dopo del postCreate del OLMapWidget (solo con parametro preInit==false) 
-onStartUp, allo startup OLMapWidget,​ è quello dove di norma verrà fatto il grosso delle modifiche apportate dal plugin +    ​* ​onStartUp, allo startup OLMapWidget,​ è quello dove di norma verrà fatto il grosso delle modifiche apportate dal plugin 
-o aggiungendo tasti +      ​* ​aggiungendo tasti 
-o sovrascrivendo funzioni tramite prototype +      ​* ​sovrascrivendo funzioni tramite prototype 
-o etc.. +      ​* ​etc.. 
-la possibilità di collegarsi, alla creazione del plugin, a specifici eventi o invocazioni di metodo lanciati dall'​oggetto pluggato (OLMapWidget),​ e fare azioni ad hoc +  ​* ​la possibilità di collegarsi, alla creazione del plugin, a specifici eventi o invocazioni di metodo lanciati dall'​oggetto pluggato (OLMapWidget),​ e fare azioni ad hoc 
-• e la possibilità di registrare plugin che a loro volta dipendono da altri plugin, e risolvere coerentemente le dipendenze:+  ​* ​la possibilità di registrare plugin che a loro volta dipendono da altri plugin, e risolvere coerentemente le dipendenze:
    
 +<code javascript>​
  olMapWidget.registerPlugin(  olMapWidget.registerPlugin(
 customDojo.map.plugins.PluginExample,​ // full class name of a plugin customDojo.map.plugins.PluginExample,​ // full class name of a plugin
Linea 327: Linea 350:
 //    Note: recursive cycle dependencies are not supported e.g. following dependency is invalid: //    Note: recursive cycle dependencies are not supported e.g. following dependency is invalid:
 //    ​pluginA -> pluginB -> pluginA //    ​pluginA -> pluginB -> pluginA
 +</​code>​
   
 I plugin vengono registrati in automatico all OLMapWidget alla sola richiesta fatta tramite require. I plugin vengono registrati in automatico all OLMapWidget alla sola richiesta fatta tramite require.
 Anche su EnhancedGrid i plugin si autoregistrano alla sola richiesta con require, ma in più vanno esplicitamente abilitati popolando adeguatamente la variabile plugins di ogni nuova istanza di EnhancedGrid. (ex: plugins: {indirextSelection:​ true} Anche su EnhancedGrid i plugin si autoregistrano alla sola richiesta con require, ma in più vanno esplicitamente abilitati popolando adeguatamente la variabile plugins di ogni nuova istanza di EnhancedGrid. (ex: plugins: {indirextSelection:​ true}
 Cio' puo essere fatto in automatico alla registrazione semplicemente sovrascrivendo registerPlugin() Cio' puo essere fatto in automatico alla registrazione semplicemente sovrascrivendo registerPlugin()
 +
 +<code javascript>​
  registerPlugin:​ function(clazz,​ props){  registerPlugin:​ function(clazz,​ props){
  //added part  //added part
Linea 339: Linea 365:
  _PluginManager.registerPlugin(clazz,​ props);  _PluginManager.registerPlugin(clazz,​ props);
  }  }
-Esempio Implementazione PLUGIN+</​code>​ 
 + 
 +===Esempio Implementazione PLUGIN===
 Mettiamo di voler creare ex novo, il plugin PluginExample,​ definito magari su un plugin di geoweb. Mettiamo di voler creare ex novo, il plugin PluginExample,​ definito magari su un plugin di geoweb.
 +
 +<code javascript PluginExample.js>​
 define([ define([
  "​dojo/​_base/​declare",​  "​dojo/​_base/​declare",​
Linea 390: Linea 420:
  return PluginExample;​  return PluginExample;​
 }); });
 +</​code>​
  
  
  • custom/development_creazione_plugin_maplayout2d.1606123902.txt.gz
  • Ultima modifica: 2020/11/23 10:31
  • da giorgio.scali