Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
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> | ||
- | 1 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> | |
- | 2 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 | ||
- | 1 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> | ||