UNIVERSITA’ DEGLI STUDI DI NAPOLI “FEDERICO II” FACOLTA’ DI SCIENZE MM.FF.NN. TESI DI LAUREA IN INFORMATICA (TRIENNALE) Progetto S.I.Re.Na. integrazione di risorse per i Quartieri Spagnoli: un’interfaccia di accesso alle risorse Relatore Candidato prof. Francesco Mele Gennaro Gambardella matricola 566/136 Tutor Aziendale arch. Brunella Como ANNO ACCADEMICO 2005-2006 La teoria è quando si sa tutto e niente funziona. La pratica è quando tutto funziona e nessuno sa il perché. Noi abbiamo messo insieme la teoria e la pratica: non c'è niente che funzioni... e nessuno sa il perché! Albert Einstein RINGRAZIAMENTI Questo stage è stata una bella “avventura”, supportata da due amici, oltre che colleghi eccezionali, come Diego e Dario ed è per questo che a loro vanno i mie primi ringraziamenti. Grazie a loro durante questo periodo di lavoro ci sono stati momenti di grande divertimento oltre a quelli di intenso lavoro. Inizialmente non è stato facile poiché molte delle cose che affrontavamo erano nuove per noi, ma con l’aiuto reciproco queste prime difficoltà sono state subito superate. Ringrazio Luca e Nino per i loro preziosi cosigli che spesso ci hanno sbloccato da situazioni di stallo. Ringrazio il prof. F. Mele innanzitutto per avermi offerto la possibilità di partecipare a questo stage oltre che per i suoi saggi consigli. Ringrazio i mie genitori che fin dall’inizio del mio percorso universitario mi hanno sostenuto e spronato ad andare avanti. Ringrazio infine Sara, una persona speciale, che mi è sempre stata vicina nei momenti del bisogno con tutto il suo amore. Sommario 1. INTRODUZIONE 5 2. STRUMENTI E LINGUAGGI 7 2.1 ONTOLOGIE 2.2 PROTÉGÉ E ONTOVIZ 2.3 XSB PROLOG 2.4 FLORA2 2.5 LIBRERIA JAVA-SWING 7 10 12 15 17 3. ARCHITETTURA DEL SISTEMA REALIZZATO 21 3.1 ARCHITETTURA 3.2 STRUMENTI DI CONNESSIONE 3.2.1 L’INTERFACCIA ODBC PER XSB PROLOG 3.2.2 L’INTERFACCIA JDBC 3.3 JAVA2FLORA E LA CLASSE XSBFLORA 21 24 24 27 29 4. INTEGRAZIONE DI SORGENTI DATI MEDIANTE ONTOLOGIA 32 4.1 ANALISI DEL PROBLEMA 4.2 IL DATABASE ACCESS DELLA SOCIETÀ S.I.RE.NA. 4.3 UN’ONTOLOGIA PER RAPPRESENTARE I METADATI DEL DATABASE ACCESS 4.3.1 CLASSI E CORRISPONDENZE 4.4 IL DATABASE POSTGRES DEI LIBRETTI DI MANUTENZIONE 4.5 UN’ONTOLOGIA PER RAPPRESENTARE I METADATI DEL LIBRETTO DI MANUTENZIONE 4.5.1 LE CLASSI 4.5.2 CORRISPONDENZE FRA LE TUPLE DEL DB E LE CLASSI FLORA2 DELL’ONTOLOGIA 4.6 INTEGRAZIONE DI ONTOLOGIE 4.7 INTRODUZIONE DI NUOVI METADATI 4.7.1 DATABASE DIA, RELAZIONE TECNICA, APPROVAZIONE BENI CULTURALI 4.7.2 DATABASE POPOLAMENTO BASSI 32 33 36 36 37 49 49 52 53 56 56 57 5. INTERFACCIA DEL SISTEMA ED ESEMPI DI FUNZIONAMENTO 59 5.1 L’INTERFACCIA DEL SISTEMA 5.2 ESEMPIO DI FUNZIONAMENTO 59 60 6. CONCLUSIONI E SVILUPPI FUTURI 67 BIBLIOGRAFIA 68 APPENDICE 72 CODICE XSB CODICE FLORA CODICE JAVA 72 80 101 Capitolo 1: Introduzione 1. Introduzione Il lavoro di tesi è stato svolto nell’ambito di un progetto software della Società S.I.Re.Na che aveva come principale scopo la creazione di un sistema in grado integrare tutte le risorse possedute dall’azienda S.I.Re.Na., di fornire un servizio di supporto che permettesse di tener conto della trasformazione dei bassi dei Quartieri Spagnoli di Napoli nel tempo e che aiutasse in tal modo il gruppo di lavoro di S.I.Re.Na ed altri operatori nella decisione di quali edifici sia più urgente apportare ristrutturazioni. L’obbiettivo principale di questa tesi (presentato in dettaglio nel Capitolo 4) è stato quello di costruire un sistema in grado di integrare tutte le risorse possedute da S.I.Re.Na. e di fornire un’interfaccia d’accesso a tali risorse. Per raggiungere tale obbiettivo ho costruito un’ontologia [1, 2] di riferimento che fosse in grado di “catturare” attraverso una rappresentazione tutte le risorse possedute dall’azienda. In particolare l’ontologia è stata definita mediante la fusione di due ontologie: una per il database Access contenente dati sugli edifici ed un'altra per il database Postgres [3] dei libretti di manutenzione, una raccolta di documenti presenti in S.I.Re.Na. dove sono contenuti i dati e le informazioni della manutenzione di un gruppo di edifici storici di Napoli. L’ontologia, anche se progettata in Protegé [4], è stata costruita in Flora2 [5], un sistema basato sulla F-Logic [6] orientato ad oggetti per lo sviluppo di programmi logici. Per popolare l’ontologia di riferimento, precedentemente menzionata, ho costruito un programma in XSB Prolog [7], in grado di prelevare i dati dalle diverse sorgenti dati ed immetterli in predicati da richiamare in Flora2. Alcune risorse possedute da S.I.Re.Na. erano contenute in documenti cartacei, in particolare tali documenti erano: la relazione tecnica asseverata di un edificio, la denuncia di inizio attività di un edificio, l’approvazione dei beni cultura per l’adempimento dei lavori su di un edificio e schede sul popolamento e la destinazione d’uso dei bassi. La conversione dei documenti cartacei, anche se è stata un’attività presa in considerazione in questo lavoro di tesi, è stata posticipata in tempi futuri del progetto di integrazione globale di S.I.Re.Na. Al fine di effettuare però un’analisi completa delle risorse disponibili, e per la futura attività di conversione cartecea-digitale di S.I.Re.Na, ho definito per tali documenti dei metadati e creato dei database (presentati nel dettaglio nel paragrafo 4.7). Ho effettuato prima una metadatazione e poi costruito le relative tabelle messe in corrispondenze con le classi dell’ontologia scelta come riferimento. 5 Capitolo 1: Introduzione Per accedere ai dati contenuti nell’ontologia ho costruito un’interfaccia in Java presentata nel Capitolo 5. Nell’interfaccia realizzata sono state utilizzate le librerie Swing di Java 2 [8], che permettono di costruire potenti GUI (Graphical User Interface) in maniera semplice e veloce. Le librerie Swing contengono tutti i componenti adatti alla costruzione di un’interfaccia utente moderna, dai pulsanti che contengono immagini alle strutture ad alberi e tabelle. Swing di Java 2 è una libreria di grandi dimensioni, concepita per avere tutte le componenti adeguate al compito da affrontare e cioè quello di costruire programmi per interfacce utenti. Il sistema realizzato ha reso necessaria l’integrazione di due ambienti di programmazione: Flora2, implementazione di Frame Logic basata su XSB (un sistema Prolog Open Source) e Java, messi in connessione mediante un bridge denominato Java2Flora [9], che permette di effettuare interrogazioni Flora2 da Java. Java2Flora (presentato nel capitolo 3), è dunque lo strumento utilizzato per poter richiamare comandi Flora2 da Java. La tesi è articolata in sei capitoli più un’appendice contenente il codice XSB, Flora2 e Java creato. Nel Capitolo 2 si affrontano i temi riguardanti tutti gli strumenti utilizzati per la realizzazione del sistema: Flora2, XSB, Protégé ecc. Il Capitolo 3 è dedicato all’architettura che è stata utilizzata per la creazione del sistema software realizzato. Nel Capitolo 4 viene descritto l’argomento principale della tesi che è l’attività di integrazione delle risorse possedute dall’azienda. Nel Capitolo 5 viene presenta l’interfaccia del sistema costruita in Java utilizzando le librerie Swing e degli esempi di funzionamento della stessa. Nel Capitolo 6, infine, vengono tracciate le conclusioni e quello che in futuro potrebbe essere realizzato come estensione del sistema realizzato. Nell’appendice viene presentato il codice realizzato in Flora2, XSB Prolog e Java. 6 Capitolo 2: Strumenti e linguaggi 2. Strumenti e linguaggi In questo capitolo sono presentati i principali strumenti adoperati per la realizzazione dell’integrazione delle sorgenti dati e della costruzione dell’interfaccia per l’accesso a tali risorse. In particolare saranno presentate le Ontologie, Protégé, XSB Prolog, Flora2 e le librerie Swing di Java2. 2.1 Ontologie Il concetto di ontologia deriva dalla teologia, dove ha il significato dello studio dell’essere o dell’esistere. Aristotele, dopo aver cercato una risposta a tutte le domande dell'uomo, pensò infine a come ordinare il sapere. Questa fatica era in fondo dettata dalla sua stessa opera che spaziava dalla Fisica alla Metafisica, dall'Etica all'Estetica. Nell'avviare questa ampia sistematizzazione dovette definire gli argomenti ed i sotto-argomenti, come diremmo oggi con un linguaggio moderno. A questi avrebbe poi assegnato i vari contenuti del sapere. Aristotele chiamò categorie universali gli argomenti che riguardano tutte le entità del mondo, e quindi le categorie sussidiarie che definiscono aspetti speciali e particolari. In questo modo per primo varò l'Ontologia, per secoli rimasta una specializzazione della filosofia. Con la definizione data da Gruber [10], un’ontologia è una specifica esplicita di una concettualizzazione. Seguendo tale definizione, in informatica una ontologia è il tentativo di formulare uno schema concettuale esaustivo e rigoroso nell'ambito di un dato dominio. Un’ontologia definisce i termini usati per descrivere e rappresentare un‘area di conoscenza. Le ontologie sono utilizzate dalla gente comune, dai database e dalle applicazioni che hanno bisogno di scambiarsi informazioni di un certo dominio. L’ontologia [11] è vista come un vocabolario (tassonomia) di concetti, che rappresenta un determinato dominio d’interesse, dotato di un insieme di relazioni tra i concetti stessi che consentono di capire come sono legati tra loro. Come si vede il termine “ontologia” può avere diversi significati per la comunità scientifica; nel suo articolo [12] Guarino prova ad isolare questi diversi significati in sette possibili interpretazioni: 1. Ontologia come una disciplina filosofica. 2. Ontologia come una concettualizzazione informale di un sistema. 3. Onntologia come una relazione semantica formale. 4. Ontologia come una specifica esplicita di una “concettualizzazione”. 7 Capitolo 2: Strumenti e linguaggi 2.1 Ontologie 5. Ontologia come rappresentazione di un sistema concettuale attraverso una teoria logica. i. Caratterizzata da specifiche proprità formali ii. Caratterizzata solo dal suo scopo specifico 6. Ontologia come vocabolario utilizzato in una teoria logica. 7. Ontologia come una specificazione (meta-livello) di una teoria logica. Solitamente un’ontologia (figura 1) è rappresentata mediante una struttura dati gerarchica che contiene tutte le entità principali classi (o concetti), le relazioni esistenti fra di esse (is a, part of…), le proprietà (slot, ruoli) attribuite a ciascun concetto, che permettono di caratterizzare una classe, e le restrizioni sulle proprietà. Figura 1. Esempio di ontologia in Protégé. I programmi nei computer possono utilizzare un'ontologia per una grande varietà di scopi, fra cui il ragionamento induttivo e la classificazione, ma in generale sono lo strumento principe da utilizzare tutte le volte in cui si desidera descrivere la conoscenza di una sorgente informativa e realizzare uno scambio di informazioni in ambito distribuito. Un campo in cui le ontologie sono comunemente utilizzate è quello dell’intelligenza artificiale. Le ontologie insomma possono aiutarci a rendere i nostri programmi più “intelligenti” e a migliorare il recupero d’informazioni, basti pensare ad Internet: una mole enorme di dati viene messa a disposizione dalla rete ma la sua consultazione è tutt'oggi onerosa. La classificazione e l’ordinamento delle informazioni mediante l’uso di ontologie può migliorare la situazione. 8 Capitolo 2: Strumenti e linguaggi 2.1 Ontologie In un’ontologia basata su frame, le classi rappresentano l’entità di base e sono in rapporto tra loro mediante relazioni gerarchiche del tipo classe – sottoclasse (o classe – superclasse). Ogni classe esprime le sue caratteristiche mediante degli slot (o attributi) e ad ogni slot è associato un insieme di entità detti valori degli slot. All’interno della struttura gerarchica di un’ontologia le classi che sono più vicine alla radice solitamente contengono meno slot e sono astratte, mentre man mano che si scende nell’albero gli slot aumentano e le classi diventano più specializzate. Una notazione di tipo ontologico gode inoltre di una delle proprità fondamentali della programmazione ad oggetti, vale a dire la proprietà per la quale ogni classe eredita dalle sue superclassi membri e metodi, nota con il nome di Ereditarietà. Altri concetti fondamentali (figura 2) per questo tipo di rappresentazione sono quello di istanza di una classe, cioè la creazione di un oggetto che abbia le caratteristiche possedute dalla classe d’appartenenza e quello di constraints (vincoli) sugli slot di una classe. acquista istanze Figura 2. Esempio di ontologia in Protégé: relazioni ed istanze 9 Capitolo 2: Strumenti e linguaggi 2.2 Protégé e Ontoviz 2.2 Protégé e Ontoviz Protégé [4] è un tool Open Source, sviluppato presso l’Università di Stanford, per la creazione e sviluppo di Ontologie basate su frame. Esso vuole essere di aiuto agli ingegneri della conoscenza ed agli esperti di dominio per la realizzazione di ontologie. Ognuna delle componenti principali di Protégé ha una interfaccia ben definita con il resto del sistema ed è perfettamente sostituibile da componenti analoghe. Le caratteristiche principali di Protégé sono quelle di avere un editor per creare, visualizzare e gestire ontologie, API (Application Programming Interface) per un accesso universale ed una interfaccia utente (GUI Graphical User Interface) estensibile. L’interfaccia grafica di Protégé è realizzata in maniera molto semplice ed intuitiva, la barra dei componenti è composta da linguette selezionabili chiamate tab, ognuna delle linguette rappresenta un elemento distinto dell’ontologia. Selezionando un tab l’utente può navigare tra i diversi elementi (classes, slots, forms, instances,…) dell’ontologia in fase di definizione. Nella figura 3 viene riportata la schermata che si presenta all’apertura di Protégé, come si può notare il tab selezionato di default è quello Classes. Classes è il pannello che gestisce la parte di costruzione dell’albero e di definizione delle relazioni esistenti tra i concetti che ne fanno parte. In esso si possono distinguere chiaramente quattro componenti principali. Il primo, in alto a sinistra, è il pannello che definisce la tassonomia dell’ontologia: quali sono gli elementi dell’albero e la loro gerarchia. Il secondo, in basso a sinistra, serve per gestire la relazione di ereditarietà tra i concetti, e permette di aggiungere o rimuovere parenti ad un nodo dell’albero. Nella parte alta di destra, invece, si trova il pannello che mostra gli attributi legati al concetto selezionato sull’albero. Così organizzato, i progettisti di ontologie possono accedere alle informazioni velocemente ogni qual volta ne hanno bisogno e possono modificare ed interagire con l’ontologia direttamente navigando l’albero che la rappresenta. 10 Capitolo 2: Strumenti e linguaggi 2.2 Protégé e Ontoviz Barra dei Componenti Classi Attributi classe selezionata Figura 3. GUI Protégé. Uno dei maggiori vantaggi derivanti dall’architettura di Protégé è di essere uno strumento aperto e modulare. I programmatori, grazie a ciò, possono aggiungere nuove funzionalità semplicemente creando gli appropriati plug-ins in Java. Come già detto Protégé è dotato di numerosi plug-ins che ne aumentano le potenzialità, uno di questi è Ontoviz [13]. Questo plug-in permette di visualizzare le ontologie precedentemente create, con l’aiuto di un software per la visualizzazione grafica chiamato GraphViz, che è un software open source sviluppato dai laboratori di ricerca AT&T. La rappresentazione grafica dell’ontologia data da Ontoviz è fornita sotto forma di grafo (figura 4), anziché nella classica forma ad albero. Con Ontoviz si può navigare nel grafo, da un nodo all’altro cliccando sul nodo stesso nel grafo o sulla classe corrispondente nello schema ad albero dell’ontologia. Ontoviz oltre a permettere di rimpicciolire o ingrandire l’immagine a proprio piacimento grazie alla funzione di zoom permette di personalizzare la visualizzazione del grafo. L’utente ha la possibilità di scegliere cosa visualizzare per ogni classe come le sottoclassi, le superclassi, le proprietà o le istanze e gli slot. 11 Capitolo 2: Strumenti e linguaggi 2.2 Protégé e Ontoviz Altre personalizzazioni possibili riguardano i colori dei nodi che rappresentano le classi, le istanze o gli archi che rappresentano relazioni is-a e le proprietà delle classi. La cosa importante da ricordare è che comunque Ontoviz è solo un visualizzatore e non consente come tale modifiche alle definizioni delle classi e alle relazioni fra esse. Classi da visualizzare e personalizzazione della visualizzazione Grafo dell’ontologia navigabile cliccando su di un nodo Albero ontologia navigabile Figura 4. GUI di Ontoviz. 2.3 XSB Prolog L'uso della logica come linguaggio di programmazione è molto recente. Sino agli anni '70 era stata solo un indispensabile supporto teorico nell'ambito della ricerca in Intelligenza Artificiale per la formalizzazione di concetti e la definizione di sistemi di deduzione automatica, ma non costituiva un vero è proprio modello di calcolo. Solamente in seguito ai risultati di Robinson sul Principio di risoluzione, Colmerauer sviluppò il primo linguaggio logico denominato Prolog, che è ancora oggi il più diffuso. L'affermazione crescente della programmazione logica è dovuta principalmente alla sua importante proprietà di essere dichiarativa: il programma cioè definisce 12 Capitolo 2: Strumenti e linguaggi 2.3 XSB Prolog che cosa si vuol calcolare senza dover specificare come questo deve essere calcolato. Il Prolog è un linguaggio che si presta a risolvere problemi che riguardano oggetti e loro relazioni, esso è caratterizzato essenzialmente da 3 proprietà: • dichiarare fatti • definire regole • porre domande su fatti e relazioni XSB [7] è un sistema deduttivo e di programmazione logica sviluppato per piattaforme Windows e Unix. Oltre a fornire tutte le funzionalità del Prolog, XSB contiene diverse caratteristiche che solitamente non sono incluse nei sistemi di programmazione logica come: un elevato numero di interfacce verso altri sistemi (C, Java, Perl, ODBC, SModels , and Oracle), una migliore portabilità ed estendibilità, un insieme di packages che estendono XSB a valutare F-Logic tramite il package Flora2 e tante altre. Per quanto riguarda un po’ la sintassi di XSB diciamo che: 1- le costanti iniziano per lettera minuscola: a, b, c, f7, u6, penna, carta, andrea, camilleri, numeroStudenti, prezzoLibri; 2- gli interi sono costanti: 1,3, 44, 100; 3- le stringhe sono costanti: 'penna', 'il corso delle cose', 'Andrea' 4- Le variabili iniziano con la lettera maiuscola: X, Y, F1, F2, Testi, Titoli, MarcheProdotti, ListaLibri 13 Capitolo 2: Strumenti e linguaggi 2.3 XSB Prolog Abbiamo detto che un programma Prolog è composto da fatti, regole e query, in XSB la sintassi è: Fatti personaggio(montalbano). personaggio(maigret). personaggio('Pepe Carvalho'). scrittore(georges,simenon). scrittore(andrea,camilleri). scrittore(manuel,montalban). libro('Tatuaggio', montalban, 'Universale Economica Feltrinelli'). libro('La gita a Tindari',camilleri,'Sellerio'). libro('Il profumo della notte',camilleri,'Sellerio'). Query | ?- personaggio(X). X = montalbano ; Risposte del sistema X = maigret | ?- 14 Capitolo 2: Strumenti e linguaggi 2.4 Flora2 2.4 Flora2 In questo paragrafo si introduce una breve descrizione della Frame Logic, il linguaggio adottato per implementare l’ontologia (paragrafo 4.6) definita per il processo d’integrazioni di dati. La Frame Logic (o F-logic) [6] fornisce un formalismo logico per linguaggi basati su frame per la rappresentazione di dati e di conoscenza. Inoltre F-Logic combina la semantica dichiarativa e l’espressività di un linguaggio di database deduttivo con le capacità della programmazione ad oggetti. E’ stata sviluppata al fine di fornire delle basi teoriche per un linguaggio di programmazione logica orientata agli oggetti, che possa essere usato sia come strumento di rappresentazione dati che come strumento di computazione. Si è parlato precedentemente di cos’è un’ontologia definendola come il tentativo di formulare uno schema concettuale esaustivo e rigoroso nell'ambito di un dato dominio, che è solitamente rappresentata mediante una struttura gerarchica le cui componenti principali sono: Concetti, Relazioni, Attributi, Istanze, Assiomi. F-Logic permette di descrivere ontologie basate su frame [14] e quindi classi di oggetti e gerarchie di classi allo stesso modo dello stile della programmazione orientata agli oggetti. Inoltre, consente di effettuare interrogazioni e computazioni su classi, attributi, oggetti e valori degli attributi. Flora2 (F-Logic Translator) [5] è una piattaforma di sviluppo di applicazioni e un sofisticato compilatore per basi di conoscenza orientato ad oggetti. Il linguaggio di programmazione supportato da Flora2 è un dialetto di F-Logic con numerose estensioni, che include naturalmente stili di meta-programmazione. Flora2 fu creato con l’idea di sviluppare un nuovo linguaggio di programmazione estensibile e flessibile che permettesse di supportare eventuali nuovi moduli sviluppati in futuro. In genere, Flora2 viene implementato come modulo XSB, il quale come accennato nel precedente paragrafo, è un sistema deduttivo e di programmazione logica. Diamo un esempio di come si crea una semplice ontologia in Flora2, supponiamo di avere un’ontologia come quella rappresentata in figura 4bis. 15 Capitolo 2: Strumenti e linguaggi 2.4 Flora2 Figura 4bis. Esempio di ontologia. In Flora2 la sintassi per definire le classi è: y::x è sottoclasse x; x[a =>string] a è uno slot di tipo string di x; y[s=>string,d=>string] s e d sono slot di tipo string di y; Un oggetto si definisce: i:y i è istanza di y; i: y[s->v1,d->v2,a->v3] v1, v2, v3 sono rispettivamente i valori degli slot s, d, a della classe y; Nei programmi Flora2 è resa possibile l’inclusione di tipici programmi o predicati Prolog. L’invocazione di predicati Prolog avviene attraverso il semplice simbolo ‘@’.La sintassi è la seguente: ?- predicate@prolog module. oppure ?- predicate@prolog(module). 16 Capitolo 2: Strumenti e linguaggi 2.5 Libreria Java Swing 2.5 Libreria Java-Swing Java Swing [8] è una libreria di grandi dimensioni che contiene un insieme di controlli GUI (Graphical User Interface) atti alla creazione di un’interfaccia utente moderna composta da bottoni, menu, liste di elementi, spazi per disegnare oggetti e immagini. Swing fa parte delle JFC (Java Foundation Classes) introdotte in Java 2. Il nuovo pacchetto JFC/Swing di Java2 si sovrappone ad AWT (Abstract Windowing Toolkit) della precedente versione di Java introducendo alcuni nuovi componenti grafici e migliorando l’aspetto esteriore di altri. Le Swing sono state realizzate con l’architettura MVC (Model - View - Conrtroller). Tale logica crea una netta separazione della veste grafica del cmponente dalla sua logica di controllo. Le classi di Swing sono contenute nel pacchetto javax.swing. Per assicurare la velocità, tutti i componenti sono “leggeri” e Swing è interamente scritto in Java per garantire la trasferibilità. La navigazione tramite tastiera è automatica, si può eseguire un applicazione Swing senza utilizzare il mouse e per questo non occorre alcun lavoro supplementare di programmazione. Una caratteristica degli oggetti swing è il “pluggable look and feel”, ovvero “aspetto inseribile”, che permette di individuare l’aspetto grafico dinamicamente al fine di adattarsi alle aspettative di utenti che lavorano su piattaforme e sistemi diversi. E’ possibile fare in modo che l'utente modifichi l'aspetto visuale dell'applicazione o applet a runtime senza riavviare l'applicazione, utilizzando sempre un aspetto a loro familiare. La classe più importante della libreria swing e Container (figura 5). Le sottoclassi di Container servono a contenere componenti e controllano la disposizione degli elementi all'interno tramite Layout Managers. Un container a sua volta può contenere un altro container o più. Container JApplet JFrame JDialog Figura 5. La classe Container. 17 JWindow JComponen Capitolo 2: Strumenti e linguaggi 2.5 Libreria Java Swing JApplet, JFrame, JDialog, JWindow sono container toplevel, che possono essere visualizzati senza essere contenuti in altri. Tutti hanno un “pannello dei contenuti” (JRootPane) nel quale vanno aggiunti i componenti, tramite il metodo add() ereditato dalla classe Container. Una sottoclasse di Container è la classe JComponent le cui sottoclassi rappresentano i componenti grafici delle GUI quali JButton, JMenu, JLabel e tanti altri (figura 5 bis). Figura 5 bis. La classe JComponent. Il modo col quale si posizionano i componenti su un form Java è diverso da molti sistemi GUI: come prima cosa si può dire che si fa tutto con il codice; per secondo che il modo in cui i componenti vengono posizionati su un form è governato non da posizionamenti assoluti, ma da un “gestore di layout”, che decide come si collocano i componenti in base all’ordine col quali li si 18 Capitolo 2: Strumenti e linguaggi 2.5 Libreria Java Swing aggiunge tramite il metodo add(). Dimensione, forma e piazzamento dei componenti variano in modo notevole da un gestore di layout all’altro. Inoltre, i gestori di layout si adattano alle dimensioni delle finestre dell’applicazione o applet. Ogni oggetto Container ha associato un oggetto LayoutManager di default ed esistono diversi LayoutManager per disporre i componenti all'interno del Container in base a regole differenti. Il LayoutManager associato al Container può essere cambiato dal programmatore al momento della creazione del Container utilizzando il metodo setLayout(). Come si evince dalla figura 8 i gestori di layout disponibili sono: FlowLayout, BorderLayout, GridLayout, GridBagLayout, CardLayout e BoxLayout. java.lang.Object FlowLayout BorderLayout GridLayout GridBagLayout BoxLayout CardLayout javax.swing java.awt Figura 6. I LayoutManager disponibili Gli oggetti grafici (JButton, JMenu, JFrame …) producono eventi collegati alle azioni dell'utente: • Click del mouse su un elemento; • Ridimensionamento di una finestra; • Selezione di un elemento; • Attraversamento di un’area con il cursore 19 Capitolo 2: Strumenti e linguaggi 2.5 Libreria Java Swing Ciascun tipo di evento è rappresentato da una classe distinta. Quando un evento viene innescato, e ricevuto da uno o più “ascoltatori” o “listener”, che agisce su quell’evento. Di conseguenza, l’origine dell’evento e il luogo nel quale viene gestito possono essere separati. Ciascun ascoltatore di eventi è un oggetto di una classe che implementa una particolare interfaccia dell’ascoltatore. Quindi, tutto ciò che i programmatori devono fare è creare un oggetto ascoltatore e registralo presso il componente che innesca l’evento. Questa registrazione viene eseguita chiamando l metodo addXXXListener() nel componente che innesca l’evento, nel quale “XXX” rappresenta il tipo di evento che viene ascoltato. Tutta la logica di un evento, quindi, si troverà all’interno di una classe listener. Quando si crea una classe listener, l’unico vincolo è che deve implementare l’interfaccia appropriata. 20 Capitolo 3: Architettura del sistema realizzato 3. Architettura del sistema realizzato In questo capitolo verrà innanzitutto presentata l’architettura generale del sistema, definita in concomitanza dei lavori in [15, 16], realizzata per far fronte alle esigenze del progetto S.I.Re.Na. In particolare si focalizzerà poi l’attenzione sul sottositema riguardante il mio lavoro di tesi, che interessa il processo di mediazione integrazione delle sorgenti dati e lo sviluppo dell’interfaccia d’accesso a tali risorse. Nel paragrafo 3.2 si mostrano le interfacce di connessione utilizzate: ODBC per XSB Prolog e JDBC per Java. Ricordiamo che la prima è stata usata per prelevare dati dai database Access e Postgres per importarli in XSB e Flora2; mentre l’interfaccia JDBC è stata utilizzata in Java per prelevare ed immettere i dati nei nuovi database creati. Nel paragrafo 3.3 viene presentato il bridge denominato Java2Flora, che permette l’integrazione di due ambienti di programmazione: Flora2, implementazione di Frame Logic basata su XSB (un sistema Prolog Open Source) e Java, in modo che si possano effettuare interrogazioni Flora2 da Java. 3.1 Architettura L’architettura utilizzata visibile in figura 7 è stata definita in base alle esigenze e all’organizzazione delle risorse dell’azienda S.I.Re.Na. La presenza di più database e di materiale cartaceo, da cui ricavare nuovi database, ha richiesto l’utilizzo di un procedimento di d’ integrazione delle sorgenti. Partendo dai dati in possesso dell’azienda, è stata creata un’ontologia che integra l’insieme dei metadati utili a rappresentare le informazioni di interesse al progetto. Il popolamento dell’ontologia definita avviene attraverso un processo di mediazione . Tale processo preleva le informazioni dalle verie fonti e le adatta all’ontologia. La fase di interfacciamento del sistema con le varie sorgenti avviene mediante un modulo creato in XSB che permette di connettersi ai vari databases in modo semplice. Inoltre, con alcuni dei dati è stato costruito un GIS [15] dell’area riquardante i quartieri spagnoli che permette all’utente di visualizzare geograficamente sul territorio i singoli edifici. Ogni edificio è stato corredato di un insieme di informazioni provenienti dalle sorgenti mediante una loro catalogalizzazione definita tramite una serie di specifiche quali Popolazione, Descrizione,ecc… 21 Capitolo 3: Architettura del sistema realizzato 3.1 Architettura Infine è stato creato un algoritmo [16], che sfrutta le librerie di Java 3D e ricostruisce un basso appartenente all’area inclusa nel progetto di rivalutazione territoriale dei quartieri spagnoli dell’azienda S.I.Re.Na. L’insieme delle informazioni sono fruibili mediante un’interfaccia, definita in Java, la quale permette agli utenti di eseguire le seguenti operazioni: i. accedere alle risorse integrate mediante l’ontologia di riferimento utilizzando il bridge Java2Flora che permette di effettuare interrogazione Flora2 da Java; ii. accedere ad un GIS dell’area lanciando il browser locale della macchina sulla quale “gira” l’interfaccia; iii. visualizzare in 3D i modelli di bassi appartenenti all’area inclusa nel progetto di rivalutazione territoriale dei quartieri spagnoli dell’azienda S.I.Re.Na. Figura 7. Architettura del sistema globale d’integrazione 22 Capitolo 3: Architettura del sistema realizzato 3.1 Architettura La scelta di quest’architettura è stata compiuta in previsione del fatto che il progetto realizzato, potrà essere esteso con nuove funzionalità e nuove sorgenti di dati. L’ introduzione di un nuovo database contenente ulteriori informazioni comporterebbe solo l’aggiunta di un nuovo ramo nell’ontologia di riferimento; l’inserimento di nuovi palazzi comporterà solo l’aumento di nuovi punti o poligoni (a seconda del caso in cui si aggiunga un basso o un palazzo) nello shapefile del GIS, che si relazioneranno automaticamente con i dati presenti nei database; anche l’immissione di un nuovo modello di basso comporterà la sola catalogazione del modello attraverso alcuni parametri per la visualizzazione tridimensionale. Nei successivi paragrafi viene spiegata in maniere più dettagliata la parte di architettura che è stata realizzata per il processo d’integrazione delle sorgenti dati e lo sviluppo dell’interfaccia d’accesso a tali risorse, argomenti di questa tesi (figura 7 bis). In particolare si spiegheranno le interfacce di connessioni utilizzate (paragrafo 3.2) ed il bridge Java2Flora utilizzato per richiamare predicati Flora2 da Java (paragrafo 3.3). Figura 7 bis. Elementi dell’architettura realizzata in questa tesi 23 Capitolo 3: Architettura del sistema realizzato 3.2 Strumenti di connessione 3.2 Strumenti di connessione Per poter importare i dati dai database ed inserirli nelle ontologie, occorre uno strumento che sia capace di effettuare la connessione ai database selezionati ed estrarre i dati. Nei paragrafi 3.2.1 e 3.2.2 verranno presentate brevemente le interfacce ODBC e JDBC. Ricordiamo che la prima è stata usata per prelevare dati dai database Access e Postgres per importarli in XSB e Flora2; mentre l’interfaccia JDBC è stata utilizzata in Java per prelevare ed immettere i dati nei nuovi database creati. 3.2.1 L’interfaccia ODBC per XSB Prolog ODBC è l’abbreviazione di Open Database Connectivity, un metodo standard (o Application Programming Interface, API) di accesso a database. ODBC è stato creato da SQL Access Group e rilasciato per la prima volta nel settembre1992. Microsoft Windows è stato il primo sistema operativo ad avere un prodotto ODBC, ma esistono versioni anche per piattaforme UNIX, OS/2, e Macintosh. ODBC è un “linguaggio” (o meglio, un protocollo) che i client possono usare per interrogare un server database. I client che supportano ODBC passano le richieste ad un ODBC Driver manager, che decide quale sorgente dati è appropriata e quale driver ODBC corrisponde a quella sorgente dati. La richiesta è trasmessa attraverso il driver al database e la risposta attraverso ODBC Driver Manager raggiunge il client. ODBC permette ai programmi che lo usano di inviare ai database stringhe SQL senza il bisogno di conoscerne le API proprietarie, genera automaticamente richieste che il sistema di database utilizzato sia in grado di capire. In tal modo, i programmi possono connettersi a diversi tipi di database utilizzando più o meno lo stesso codice. Il linguaggio supportato da ODBC è un SQL particolarmente ristretto, ovvero, è caratterizzato da un insieme minino di istruzioni, definito dal SAG ( SQL Access Group). L’interfaccia XSB-ODBC [17] è un sottosistema che permette agli utenti XSB di accedere a basi di dati attraverso una connessione ODBC. Questa interfaccia permette agli utenti XSB di accedere ai dati contenuti in un Database Management System (DBMS). Usando questa interfaccia è possibile dunque prelevare differenti informazioni da diversi DBMS e trasferirli come fatti Prolog. L’interfaccia XSB-ODBC permette agli utenti di interrogare un database in diversi modi. Ad esempio gli utenti possono passare all’interfaccia specifiche query, o dichiarare predicati XSB che si connettono a singole tabelle di un database e prelevano i dati a run-time da 24 Capitolo 3: Architettura del sistema realizzato 3.2 Strumenti di connessione inserire in altri predicati, oppure ancora di utilizzare complesse query che includono operazioni di congiunzione, negazione o aggregazione. Le principali funzionalità fornite dal modulo XSB-ODBC sono: • accesso concorrente da più processi XSB ad un singolo DBMS; • accesso da un singolo processo XSB a più DBMS; • un potente compilatore Prolog/SQL, il quale serve a generare codice SQL necessario per effettuare le query sui database, a partire da i predicati Prolog, definiti per la connessione e l’importazione; • disponibilità di codice sorgente. Nelle prossime righe verrà mostrata la sintassi XSB per connettersi ad un database ed effettuare una query [17]. L’insieme dei predicati per gestire l’interfaccia XSB-ODBC sono definiti nel modulo odbc_call da cui devono essere importati prima di essere invocati. Vediamo come si effettua una connessione ad una sorgente dati. Una volta che l’amministratore ha registrato il database nel DSN di sistema, la connessione avviene invocando il comando: | ?- odbc_open(nome_sorgente_dati, username, passwd). Prima di poter utilizzare il predicato odbc_open bisogna importarlo: | ?- import odbc_open/3 from odbc_call. Per chiudere la sessione in uso, dopo averlo importato: | ?- import odbc_close/0 from odbc_call. | ?- odbc_close. Esiste anche un altro modo per aprire la connessione ad una Sorgente Dati. Tale metodo utilizza rispetto al precedente un parametro in più che specifica il nome della connessione: | ?- odbc_open(nome_sorgente_dati,username, passwd,nome_connessione). 25 Capitolo 3: Architettura del sistema realizzato 3.2 Strumenti di connessione La chiusura della sessione sarà: | ?- odbc_close(nome_connessione). Utilizzando questi due predicati le importazioni da fare saranno rispettivamente: | ?- import odbc_open/4 from odbc_call. | ?- import odbc_close/1 from odbc_call. Diciamo che in generale la sintassi per importare un predicato sarà sempre: import nome_del_predicato/numero_di_parametri from odbc_call Per poter vedere una lista dei nomi e delle descrizioni delle Sorgenti Dati esistenti sul computer importando il modulo odbc_data_sources/2 basta fare: | ?- odbc_data_sources(DSN,DSNDescr). /* Risultati */ DSN = mycdf DSNDescr = MySQL driver; DSN = mywincdf DSNDescr = TDS driver (Sybase/MS SQL); Ora vediamo come si effettua una query su una tabella di una sorgente dati usando SQL. Esistono diversi modi per estrarre informazioni da una sorgente Dati, uno di questi consiste nel passare uno statement SQL direttamente al driver ODBC. /* Ricordarsi di importare odbc_sql/2 */ | ?- odbc_sql(ListaVal,SQLStmt,RigaRisultato). 26 Capitolo 3: Architettura del sistema realizzato 3.2 Strumenti di connessione Il significato dei tre parametri è: • ListaVal: E’ una lista di valori corrispondenti ai parametri indicati nell’ SQL statement dal simbolo ? (dall’esempio sarà più chiaro). Tale parametro se non utilizzato sarà rappresentato da una lista vuota; • SQLStmt: E’ la query di estrazione dei dati in SQL; • RigaRisultato: E’ la variabile in cui vengono messi i risultati ottenuti. Esempio: /* Elencare i titoli dei Supporti che sono dvd dal database MioDB */ | ?- odbc_sql([‘dvd’],’SELECT titolo FROM Supporto WHERE tipo =?’,TitRis). /* Risultati */ TitRis = Il Padrino; TitRis = 8 mile 3.2.2 L’interfaccia JDBC Un pregio di Java è la capacità di costruire applicazioni database client/server indipendenti dalla piattaforma. Caratteristica ottenuta grazie alla Java Database Connectivity (JDBC) [8]. Siccome uno dei problemi principali dei database è stato il conflitto sulle specifiche fra le società produttrici, l’interfaccia JDBC è stata concepita per essere indipendente dalla piattaforma, quindi mentre si programma non è necessario preoccuparsi del database che si sta utilizzando. Per consentire l’indipendenza dalla piattaforma, JDBC mette a disposizione un gestore dei driver che gestisce dinamicamente tutti gli oggetti driver di cui avranno bisogno le query eseguite sul database. Per cui se dovremo connetterci con tre database di tre diversi fornitori, ci serviranno tre oggetti driver diversi. Gli oggetti driver si registrano presso il gestore dei driver al momento del caricamento utilizzando il metodo static Class.forName(). Per aprire un database bisogna creare un “URL del database” che specifichi: 1. che si sta utilizzando JDBC, con “jdbc” 27 Capitolo 3: Architettura del sistema realizzato 3.2 Strumenti di connessione 2. il “sotto protocollo”: il nome del driver o il nome del meccanismo per la connettività del database. 3. l’identificatore del database. Ad esempio, per connettersi tramite il sottoprotocollo ODBC a un database identificato dal nome “pippo”, l’URL del database potrebbe essere: String url = “jdbc:odbc:pippo”; Impostato l’URL del database, lo si passa al metodo static DriverManager.getConnection() il quale restituisce un oggetto Connection che può essere utilizzato per interrogare e manipolare il database. Una volta stabilita la connessione con quest’ultimo metodo si può utilizzare l’oggetto Connction risultante per creare un oggetto Statement mediante il metodo creteStatement(). Con lo Statement che ne risulta, si può chiamare executeQuery(), passandogli una stringa che contiene un enunciato SQL. Il metodo executeQuery() restituisce un oggetto ResultSet, che è un iteratore contenente i record che sono il risultato della query che possono essere estratti utilizzando opportuni metodi (getInt(), getString(), …). Un semplice esempio di connessione ad un database utilizzado i driver jdbc è riportato nella figura 8. 28 Capitolo 3: Architettura del sistema realizzato 3.2 Strumenti di connessione Figura 8. Esempio connessione ad un db con JDBC. 3.3 Java2Flora e la classe XSBFlora Java2Flora [9] è lo strumento utilizzato per poter richiamare comandi Flora2 da Java. Per accedere ad XSB da Java, Java2Flora usa interprolog mediante una porzione di codice addizionale, contenuta nel file jutils.P, che è utilizzato per inizializzare la shell Flora2. Interprolog permette di chiamare un qualsiasi predicato XSB Prolog da Java, attraverso un oggetto PrologEngine. Nel package com.ontotext.flora2 si trova la classe XSBFlora, attraverso la quale è possibile valutare arbitrarie espressioni Prolog e F-logic. La classe XSBFlora è sottoclasse di java.lang.Object ed il suo costruttore ha un singolo argomento, che rappresenta la root di XSB. Nella variabile di classe XSBFlora.sFloraRootDir bisogna settare la root di flora2. Nelle figure 9-10-11 vengono riportate le specifiche della classe XSBFlora 29 Capitolo 3: Architettura del sistema realizzato 3.3 Java2Flora e la classe XSBFlora Figura 9. Attributi di classe della classe XSBFlora. Figura 10. Sintassi del costruttore della classe XSBFlora. Figura 11. I metodi della classe XSBFlora. 30 Capitolo 3: Architettura del sistema realizzato 3.3 Java2Flora e la classe XSBFlora Nella figura 12 viene riportato un semplice esempio di utilizzo della classe XSBFlora import com.declarativa.interprolog.TermModel; ... // Istanzio la variabile flora di classe XSBFlora XSBFlora flora = new XSBFlora(XSBRoot); ... // Interrogo flora chiedendo di darmi tutte le istanze della // classe someClass Object[] bindings = flora.FLogicCommand("Inst : someClass."); for (int i = 0; i < bindings.length; i++) { TermModel tm = (TermModel)bindings[i]; System.out.println("Inst="+flora.findValue(tm,"Inst")); } Figura 12. Utilizzo della classe XSBFlora. 31 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4. Integrazione di sorgenti dati mediante ontologia Il lavoro svolto per questa tesi si pone nell’ambito dell’integrazione di sorgenti dati eterogenee. Nei prossimi paragrafi saranno presentati i passi necessari alla realizzazione di questo lavoro. 4.1 Analisi del problema L’azienda S.I.Re.Na. possiede una serie d’informazioni su progetti di ristrutturazione e manutenzione d’edifici. In particolare tale informazioni riguardano il progetto di ristrutturazione e rivalutazione dei quartieri spagnoli [18, 19, 20, 21]. E’ stato richiesto al nostro team di creare un sistema in grado integrare tutte le risorse possedute dall’azienda e di fornire un servizio di supporto che permetta di tener conto della trasformazione dei bassi nel tempo e aiuti in tal modo l’azienda a decidere a quali edifici è più urgente apportare le ristrutturazioni. La parte che riguarda questa tesi è l’integrazione della risorsa posseduta da S.I.Re.Na.. In particolare le risorse possedute dall’azienda sono: • un database access (sirena_struttura.mdb) gestito mediante un applicazione visual basic contenente i dati relativi ai singoli condomini (paragrafo 4.2); • un database in Postgres gestito mediante un’applicazione java contenente i dati relativi ai libretti di manutenzione associati ad un edificio (paragrafo 4.4); • alcuni documenti cartacei, sempre ognuno relativo ad un edificio, come la DIA (Denuncia Inizio Attività), la relazione tecnica asseverata e l’approvazione dei beni culturali. Per gestire questi documenti cartacei di cui non esiste alcuna implementazione elettronica ne è stata realizzata una per gestirli nel modo più efficace (paragrafo 4.7). Si è scelta la strada dell’integrazione perché consente di non distruggere le strutture di archiviazione presenti, nel nostro caso gli archivi S.I.Re.Na., e non obbliga il personale abituato a ragionare in termini della vecchia tipologia di archiviazione a dover imparare ad utilizzarne una nuova. 32 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.1 Analisi del problema Dunque il lavoro svolto (presentato nei prossimi paragrafi) al fine di riuscire ad integrare le risorse possedute dall’azienda S.I.Re.Na. è stato: • La costruzione di un’ontologia per il database access sirena_struttura.mdb (paragrafo 4.3) • La costruzione di un’ontologia per il database Postgres contenente i libretti di manutenzione (paragrafo 4.5) • L’integrazione delle ontologie dette nei precedenti due punti (paragrafo 4.6). • La realizzazione dei nuovi database con le rispettive ontologie da integrare con quella detta al punto precedente (paragrafo 4.7). 4.2 Il Database Access della società S.I.Re.Na. Il database Access posseduto dall’azienda S.I.Re.Na. contiene le informazioni relative ad un condominio che partecipa al progetto di ristrutturazione del territorio ricoperto dall’azienda S.I.Re.Na. Un approssimazione del modello E/R del database è rappresentato in figura. . Figura 13. Approssimazione del modello E/R del database access. 33 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.2 Il Database Access della società S.I.Re.Na. Nel diagramma E/R sono stati omessi gli attributi perché il loro numero è molto elevato è sarebbe stato impossibile rappresentarli in figura. Le entità CONDOMINIO, RICHIEDENTE, CIRCOSCRIZIONE, TECNICO, IMPRESA, FOTO sono rispettivamente realizzate nel database con le tabelle condomini, richiedenti, circoscrizione, tecnici, imprese, archivio foto. L’entità VISITE invece è realizzata nel DB con le due tabelle visite_cpt e visite_sirena. Adesso andiamo ad analizzare le relazioni: 1. la relazione “ha_chiesto_lavori” è implementata mediante la chiave esterna della tabella condominio sulla tabella richiedenti. 2. la relazione “appartiene_ha” è implementata mediante la chiave esterna della tabella condominio sulla tabella circoscrizione.. 3. la relazione “è_riparato_da” è implementata mediante la chiave esterna della tabella condominio sulla tabella imprese. 4. la relazione “è corredato_di” è implementata mediante la chiave esterna della tabella archivio_foto sulla tabella condominio. Figura 14. Relazioni dei punti 1-2-3-4. 34 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.2 Il Database Access della società S.I.Re.Na. 5. la relazione “partecipa_ai_lavori” è implementata mediante le chiavi esterne della tabella condominio sulla tabella tecnici. Figura 15. Relazione dei punto 5. 6. la relazione “sono_stati_fatti_sopralluoghi” è tradotta dalle chiavi esterne delle tabelle visite_sirena e visite_cpt sulla tabella condominio. Figura 16. Relazione del punto 6. 35 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.3 Un’Ontologia per rappresentare i metadati del database Access 4.3 Un’Ontologia per rappresentare i metadati del database Access Vedremo adesso come è stata strutturata l’ontologia che rappresenta i metadati del database access. 4.3.1 Classi e corrispondenze Per meglio progettare la struttura dell’ontologia è stata realizzata una versione in Protégé da cui sono tratte le immagini presenti in questo paragrafo; si ricordi comunque che l’ontologia è stata realizzata in Flora2 e che il codice è presentato in appendice. In questo paragrafo vedremo le classi principali dell’ontologia e la loro corrispondenza nel database. Come si evince dalla figura 17 l’ontologia creata è abbastanza semplice da capire, una classe interessante è comunque la classe Tecnici (figura 18), che ha un attributo “ruolo” che può essere istanza multipla della classe Ruoli. Questo vuol dire che un Tecnico può avere più ruoli ovvero può essere Progettista, Direttore_Lavori ecc. Figura 17. L’ontologia del db access. Figura 18. Attributo Ruolo della classe Tecnici. 36 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.3 Un’Ontologia per rappresentare i metadati del database Access La classe principale dell’ontologia è Edifici (figura 19) i cui attributi sono alcuni degli attributi (riguardanti l’edificio) contenuti nella tabella condominio del database. La classe Edifici ha inoltre l’attributo ha_progetto che può essere istanza della classe Progetto che contiene tutti gli altri dati dalla tabella condominio. Figura 19. L’attributo “ha progetto della” classe Edifici. 4.4 Il Database Postgres dei libretti di manutenzione Il database Postgres posseduto dall’azienda S.I.Re.Na. contiene le informazioni relative al libretto di manutenzione di un edificio. Prima di cominciare a spiegare come è strutturato tale database è necessario però definire cosa sia un libretto di manutenzione. Brevemente possiamo dire che un libretto di manutenzione [22] relativo ad un edificio permette di tener traccia del suo piano di manutenzione ed è composto da due sezioni: • la sezione “Anagrafe”, che riporta i dati caratteristici dell’edificio (geometrici, morfologici, tipologici, tecnologici, ecc.) . • la sezione “Programmazione della manutenzione”, suddivisa a sua volta in due sottosezioni costituite da altrettanti elaborati: 37 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.4 Il Database Postgres dei libretti di manutenzione o il manuale di manutenzione (nel quale viene esplicitato come intervenire), composto da schede di intervento, nelle quali si individuano le caratteristiche salienti di ogni attività di manutenzione prevista (fasi di lavoro, risorse da impiegare, provvedimenti nei riguardi della sicurezza, ecc.); o il programma di manutenzione (che indica quando intervenire), strutturato come un planning nel quale è indicato il calendario degli interventi programmati, e nel quale ognuna delle attività comprese nel manuale di manutenzione ha la sua collocazione temporale. Figura 20. Una parte della sezione “Anagrafe” del libretto di manutenzione. Data la definizione di libretto di manutenzione, possiamo vedere come è struttura il database posseduto da S.I.Re.Na.. In particolare nella figura 21 viene riportato il modello E/R del database. 38 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.4 Il Database Postgres dei libretti di manutenzione Figura 21. modello E/R del database “libretti di manutenzione”. Nel diagramma E/R sono stati omessi gli attributi perché il loro numero è molto elevato è sarebbe stato impossibile rappresentarli in figura. Andiamo ad analizzare lo schema del database 1. Nell’implementazione del database l’entità edificio viene tradotta con 11 tabelle, essendo i dati inerenti un edificio troppi per essere gestiti con una sola tabella. La tabella principale delle 11 è Edifici-dati_generali; tutte le altre si collegano a queste tramite l’attributo di chiave esterno cod_sirena. Le 11 tabelle sono: a. Edifici-dati_catastali b. Edifici-dati_generali c. Edifici-dati_quantitativi d. Edifici-dati_storici e. Edifici-dati_tecnologici1 f. Edifici-dati_tecnologici2 39 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.4 Il Database Postgres dei libretti di manutenzione g. Edifici-dati_tecnologici3 h. Edifici-dati_tecnologici_prospetti i. Edifici-dati_tipologici j. Edifici-dati_urb_normativi k. Edifici-inq_territoriale Figura 22. Realizzazione dell’entità EDIFICIO nel database 2. L’entità FOTO database è implementata mediante 6 tabelle, per meglio specificare l’ambito di riferimento. Foto è la tabella principale, tutte le altre, ad eccezione di Foto_prospetti, si collegano ad Edifici-dati_generali tramite l’attributo di chiave esterno 40 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.4 Il Database Postgres dei libretti di manutenzione cod_sirena, Foto_prospetti invece si collega alla tabella Edifici-dati_tecnologici_prospetti. Le tabelle sono: a. b. c. d. e. f. Foto Foto_altre Foto_inquadramento_planimetrico Foto_piante Foto_sezioni Foto_prospetti Figura 23. Realizzazione dell’entità FOTO nel database. 41 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.4 Il Database Postgres dei libretti di manutenzione 3. Le entità TIPO ELEMENTO TECNICO, FUNZIONE, TIPO MATERIALE e MATERIALE vengono implementate nel database con le tabelle Tipi_elementi_tecnici, Funzioni, Tipi_materiali e Materiali; le relazioni “è_composto_di” e “può_essere_di” vengono tradotte mettendo un vincolo di chiave esterna, in particolare viene aggiunto un attributo nella tabella che traduce l’entità del lato N della relazione. La relazione “comprende” viene tradotta con la tabella Materiali_dei_tipi Figura 24. Realizzazione dell’entità TIPO ELEMENTO TECNICO, FUNZIONE, TIPO_MATERIALE e MATERIALE nel database. 42 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.4 Il Database Postgres dei libretti di manutenzione 4. L’entità SOLUZIONE RICORRENTE corrisponde nel database implementato a Soluzioni_tipi_elementi_tecnici e la relazione “prevede”, viene implementata tramite l’attributo di chiave esterna id_tipi_elementi_tecnici. La relazione “caratterizzata_da” viene tradotta mediante la tabella Composizione_soluzione Figura 25. Realizzazione dell’entità SOLUZIONE RICCORENTE nel database 43 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.4 Il Database Postgres dei libretti di manutenzione 5. l’entità ANOMALIA corrisponde alla tabella Anomalie del db implementato; la relazione “si_presenta_con” è tradotta dalla chiave esterna della tabella Anomalie sulla tabella Tipi_materiali. Praticamente, data un’anomalia, essa si può presentare con un solo tipo di materiale e quindi con una sola funzione essendo un tipo di materiale collegato con una sola funzione Figura 26. Realizzazione dell’entità ANOMALIA nel database 44 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.4 Il Database Postgres dei libretti di manutenzione 6. l’entità scheda di diagnosi viene tradotta dalla tabella Schede_diagnosi, le relazioni “si_riferisce_a” e “fa_riferimento_a” sono tradotte mettendo chiavi esterne in Schede_diagnosi; in particolare la relazione si_riferisce_a viene tradotta con una chiave esterna su Edifici-dati_tecnologici_prospetti, essendo una scheda di diagnosi riferita ad un prospetto di un edificio; quindi data una scheda di diagnosi, essa fa riferimento ad una data soluzione ricorrente di un dato tipo di elemento tecnico (ad es. la soluzione ppv1 delle pareti perimetrali verticali) posta su un dato prospetto di un dato edificio. Figura 27. Realizzazione dell’entità SCHEDA DI DIAGNOSI nel database 45 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.4 Il Database Postgres dei libretti di manutenzione 7. L’entità OPERAZIONE è tradotta nel database dalla tabella Operazioni, mentre la relazione “è_riparata_da” è tradotta con una chiave esterna di Operazioni sulla tabella Anomalie. Figura 28. Realizzazione dell’entità OPERAZIONE nel database 8. l’entità SCHEDA OPERAZIONE viene descritta dalla tabella Schede_operazioni, Schede_interventi e Schede_controlli; Schede_operazioni è la tabella madre mentre le altre due sono sottotabelle e descrivono rispettivamente le operazioni di intervento e le operazioni di controllo. La relazione “è_descritta_da” è tradotta da una chiave esterna in Schede_interventi o Schede_controlli. In definitiva, ciascun tipo di operazione, sia esso un controllo o un intervento (ad es. il rifacimento dell’intonaco) può essere eseguito in 46 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.4 Il Database Postgres dei libretti di manutenzione vari modi; ciascuna modalità di esecuzione è descritta da un record in Schede_controlli o Schede_interventi Figura 29. Realizzazione dell’entità SCHEDA OPERAZIONE nel database 9. La relazione “presenta_la_scelta_di” viene tradotta nel database mediante la tabella Scelta_operazioni che presenta una chiave esterna sulla tabella Schede_diagnosi, una chiave esterna sulla tabella Operazioni e una chiave esterna sulla tabella Schede_operazioni (quest’ultima è garantita via software), quindi, data una scheda di diagnosi ciascun record della tabella Scelta_operazioni che fa riferimento a tale scheda indica quale operazione è stata scelta e con quale modalità essa viene eseguita (si fa 47 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.4 Il Database Postgres dei libretti di manutenzione riferimento cioè ad un record di Schede_interventi e Schede_controlli a seconda che l’operazione sia un intervento o un controllo). Figura 30. Realizzazione della “relazione presenta_la_scelta di” nel database. 10. Nel db vi sono poi altre tre tabelle: Info_libretto, Planning e Validazione che per semplicità non sono state indicate nel diagramma E/R. Tutte e tre le tabelle hanno una chiave esterna su Edifici-dati_generali. In particolare: a. Info_libretto indica informazioni di carattere generale sul libretto (progettista, revisione, ..). b. Planning indica il planning ottenuto per l’edificio in esame e che ha una chiave esterna anche sulla tabella Operazioni. c. Validazione indica il giudizio espresso dal tecnico sul libretto 48 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.4 Il Database Postgres dei libretti di manutenzione Prima di terminare però, occorre fare ancora alcune considerazioni. Per quanto riguarda i punti 3 e 4 vale quindi che: dato un tipo di elemento tecnico (ad es. una parete perimetrale verticale), essa è formata da un numero preciso di funzioni; ogni funzione di detto tipo di elemento tecnico può essere di vari tipi materiale (ad es. pittura), ciascuno dei quali prevede vari materiali (pittura acrilica, pittura al quarzo e cosi via). Data una istanza di un tipo di elemento tecnico (ad es. la parete perimetrale verticale X del prospetto Y dell’edificio Z), essa è di tipo ricorrente (o soluzione ricorrente); ogni soluzione ricorrente prevede un certo numero di funzioni tra quelle possibili per l’elemento tecnico, e ogni funzione è fatta di un certo tipo di materiale. Una soluzione ricorrente di un tipo di elemento tecnico specifica il tipo di materiale per ogni funzione, ma non il materiale; ad es. se ppv1 è la soluzione ricorrente per le pareti perimetrali verticali che prevede la pittura per la funzione finitura esterna, essa non mi specifica che tipo di pittura; per fare ciò nel database (non c’è nel diagramma ER) è presente la tabella Specifiche_elementi_tecnici la quale, data una scheda di diagnosi, specifica quale è il materiale di ogni funzione della soluzione ricorrente cui fa riferimento la scheda stessa 4.5 Un’Ontologia per rappresentare i metadati del libretto di manutenzione Vedremo adesso come è stata strutturata l’ontologia che rappresenta i metadati del libretto di manutenzione presenti nel database Postgres. 4.5.1 Le classi Per meglio progettare la struttura dell’ontologia è stata realizzata una versione in Protégé da cui sono tratte le immagini presenti in questo paragrafo; si ricordi comunque che l’ontologia è stata realizzata in Flora2 e che il codice è presente nell’appendice 49 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.5 Un’Ontologia per rappresentare i metadati del libretto di manutenzione Figura 31. L’ontologia del database Postgres. La classe principale dell’ontologia è Dati_edifici in quanto tutte le altre classi ad eccezione di Anomalia sono sue sottoclassi. La classe Dati_edifici è astratta e contiene il solo attributo cod_sirena che ereditano tutte le sue sottoclassi. Le sottoclassi di Dati_edifici (Figura 32) sono Validazione, Dati_anagrafici, Info_libretto, Planning, schede_di_diagnosi, Dati_multimediali e Schede_operazioni. Figura 32. La classe Dati_Edifici e le sue sottoclassi. 50 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.5 Un’Ontologia per rappresentare i metadati del libretto di manutenzione La classe Dati_anagrafici contiene tutti i dati anagrafici corrispondenti ad un determinato edificio e le sue sottoclassi Edifici_dati_quantitativi, (figur 33 Edifici_dati_storici, Edifici_dati_tecnologici_prospetti, e 34) sono: Edifici_dati_inq_territoriale, Edifici_dati_catastali, Edifici_dati_tecnologici1, Edifici_dati_generali, Edifici_dati_tecnologici2, Edifici_dati_tecnologici3, Edifici_dati_urbanistici_normativi, Edifici_dati_tipologici. Figura 33. La classe Dati_anagrafici e le sue sottoclassi (parte 1di2). Figura 34. La classe Dati_anagrafici e le sue sottoclassi (parte 2di2). La classe Dati_multimediali contiene tutti i dati multimediali come le foto ( o video se in futuro servissero) e le sue sottoclassi sono Foto e Video 51 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.5 Un’Ontologia per rappresentare i metadati del libretto di manutenzione Figura 35. La classe Dati_multimediali e le sue sottoclassi. La classe Schede_operazioni ha due sottoclassi che sono: Schede_interventi e Schede_controlli. Figura 36. La classe Schede_operazioni e le sue sottoclassi. 4.5.2 Corrispondenze fra le tuple del DB e le classi Flora2 dell’ontologia Nel paragrafo precedente sono state riportate le classi che compongono l’ontologia e la loro gerarchie in questo paragrafo verranno invece riportate le corrispondenze tra classi e tabelle del database. In particolare in tale corrispondenze per ogni tabella del database esiste una classe corrispondente nell’ontologia i cui slot coincidono con gli attributi della suddetta tabella. Questo implica che ogni tupla di una tabella presente nel database corrisponde ad un oggetto (o istanza) dell’ontologia. Figura 37. Corrispondenze Classe-Tabella, slot-attributo. 52 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.6 Integrazione di Ontologie 4.6 Integrazione di Ontologie Per effettuare il processo d’integrazione delle sorgenti dati possedute da S.I.Re.Na è stata costruita un’ontologia di riferimento che fosse in grado di “catturare” attraverso una rappresentazione tutte le risorse possedute dall’azienda [2]. In particolare l’ontologia di riferimento è stata definita mediante l’integrazione e il riuso [23] dell’ontologia ricavata dai metadati del database Access con quella costruita a partire dai metadati del database Postgress. Esistono diversi modi per integrare ontologie, supponiamo di avere due ontologie p e q come in figura 38. Figura 38. Due generiche ontologie. Come scritto da S. Pinto [24] è possibile integrare ontologie in tre diversi modi: 1. creazione di una nuova ontologia riutilizzando le esistenti. In pratica viene creata una terza ontologia alla quale “attaccare” le precedenti due; Figura 39. Integrazione di ontologie: creazione. 53 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.6 Integrazione di Ontologie 2. fusione delle ontologie. Le due ontologie vengono fuse in una soltanto utilizzando una classe comune. Se le classi comuni alle due ontologie hanno attributi diversi all’ora nel momento in cui le due ontologie vengono fuse (facendo collassare le due classi comuni) la nuova classe risultane avrà gli attributi di ambedue le classi; Figura 40. Integrazione di ontologie: fusione. 3. uso, l’integrazione avviene mediante un’applicazione che fa da mediatore utilizzando regole ponte per passare da un’ontologia all’altra. Figura 41. Integrazione di ontologie: uso. 54 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.6 Integrazione di Ontologie Una considerazione molto importante da fare è che le integrazione 1 e 2 (creazione e fusione) sono due tipi di integrazioni completamente diverse dalla 3 (uso): nelle prime due dopo l’integrazione le ontologie integrate perdono la propria identità, mentre con il terzo metodo (uso) le ontologie integrate dopo il processo d’integrazione mantengono la propria identità. Il tipo di integrazione utilizzato in questa tesi è stato quello della fusione, infatti una volta costruite le due ontologie (quella per il database access e quella per il database Postgres) si è visto che queste avevano due classi molto “simili”. In particolare le due classi erano Edifici (per l’ontologia ricavata dal db Access) e Edifici_dati_generali (per l’ontologia ricavata dal db Postgres) che sono state fuse formandone una sola avente attributi pari all’unione degli attributi delle due. Nel processo d’integrazione sono state affrontate le problematiche legate all’adattamento delle sorgenti allo schema globale rappresentato dall’ontologia sopra descritta. Il problema era che alcuni degli attributi chiave di un database erano rappresentati con un altro tipo di dato nell’altro database, oppure una chiave di un database era riportata come coppia di chiavi nell’altro DB. Ad esempio nel DB Postgres la chiave di molte tabelle è l’attributo cod_sirena che corrisponde nel DB Access all’unione delle due chiavi protocollo e anno_protocollo. Il problema era che cod_sirena è di tipo varchar, mentre protocollo ed anno protocollo sono di tipo intero, è stato quindi costruito un piccolo modulo XSB crea_cod_sirena in grado di costruire il cod_sirena a partire dal numero di protocollo e l’anno del protocollo di un condominio presente nel database Access. Di seguito viene riportato il modulo crea_cod_sirena che crea il cod_sirena nella variabile Cod: crea_cod_sir(Protocollo,Anno,Cod):int2char(Anno,Str), % Anno viene trasformato da intero a stringa di caratteri Str str_cat(-,Str,Str3), % Ad Str viene concatenate il carattere – che diventa Str3 int2char(Protocollo,Str2), % Protocollo è trasformato da intero a stringa di caratteri Str2 str_cat(Str2,Str3,Cod). % Ad Str2 viene concatenata Str3 Il modulo crea_cod_sirena utilizza il modulo int2char che permette di trasformare un intero in stringa di caratteri: 55 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.6 Integrazione di Ontologie int2char(Int,Char):term_to_codes(Int,_L1), % append([39],_L1,_L2), % append(_L2,[39],_L3), % codes_to_term(_L3,Char). Metto in _L1 lista di valori ASCII che rappresenta variabile Int Per essere trasformata in stringa _L1 viene racchiusa dai caratteri ‘ ’ (il cui codice ASCII è 39) e diviene _L3 % Traformo _L3 da lista dei codici ASCII a stringa 4.7 Introduzione di nuovi metadati Tra le risorse messe a disposizione dall’azienda S.I.Re.Na. ce ne sono alcune che sono solo documenti cartacei. Tali documenti ognuno relativo ad un edificio, sono la DIA (Denuncia Inizio Attività), relazione tecnica asseverata, approvazione beni culturali e popolamento dei bassi. Sono stati proposti dei database in grado di gestire tali documenti. 4.7.1 Database DIA, Relazione Tecnica, Approvazione Beni Culturali Si.Re.Na dispone dei documenti DIA, relazione tecnica, approvazione beni culturali in formato elettronico (documenti word, excel o pdf) e siccome all’azienda solitamente importa sapere solo se questi documenti sono presenti oppure no, si è pensato di costruire un semplice db che permetta di tener traccia di dove sono locati sul disco questi file. La struttura del database è banale, esso è composto di tre tabelle una per tener tracce delle denuncie di inizio attività (DIA), un’altra per le relazioni tecniche ed una per le approvazioni dei beni culturali, ogniuna delle tabelle ha tre attributi: 1. cod_sirena che permette di associarlo ad un edificio 2. id che è la chiave 3. url che contiene il percorso del file Nel capitolo 5 è presentata l’interfaccia costruita in java per l’accesso a tale database. Anche l’ontologia ricavata come si vede in figura 42 è molto banale, si compone di tre classi Rel_Tecnica, DIA e App_Beni_Cult, ogniuna delle quali ha i tre attributi cod_sirena, id e url. 56 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.8 Introduzione di nuovi metadati Figura 42. Ontologia dei documenti cartacei in Protégé. 4.7.2 Database popolamento bassi Sempre nell’ambito della ristrutturazione e rivalutazione dei quartieri spagnoli S.I.Re.Na. ha in programma di fare una valutazione del popolamento dei bassi. L’azienda effettuerà una sorta di censimento facendo compilare ad ogni famiglia locata in un basso una scheda contenete alcune domande. Ci è stato chiesto dunque di realizzare un database in grado di contenere le informazioni che verranno un giorno acquisite. Il database è stato costruito a partire da suddette schede e anche in questo caso la sua struttura è abbastanza semplice, come si vede in figura 43 esso si compone di dieci tabelle. La tabella principale è localizzazione che contiene informazioni come l’indirizzo, l’edificio a cui il basso fa riferimento e così via. Figura 43. struttura del database di popolamento e destinazione d’uso bassi. 57 Capitolo 4: Integrazione di sorgenti dati mediante ontologia 4.8 Introduzione di nuovi metadati Nel capitolo 5 è presentata l’interfaccia costruita in java per l’accesso a tale database. Una definizione più dettagliata del database è definita nel lavoro del mio collega riportato in bibliografia [15]. 58 Capitolo 5: Interfaccia del sistema ed esempi di funzionamento 5. Interfaccia del sistema ed esempi di funzionamento In questo capitolo viene presentata l’interfaccia realizzata per accedere alle risorse integrate tramite l’ontologia ed un esempio di funzionamento del sistema realizzato. 5.1 L’interfaccia del sistema La parte grafica dell’interfaccia utente è stata realizzata usando il linguaggio Java della Sun Microsystems, ed in particolare, la libreria Swing. Il programma è composto da una singola finestra con la quale l’utente può interagire. Il layout della finestra (figura 44) è strutturato come segue: nella parte sinistra appare un elenco di edifici identificati dal numero_protocollo-anno mentre nella parte destra appare la barra dei componenti composta da linguette selezionabili chiamate tab, ognuna delle linguette rappresenta un insieme distinto di informazioni da visualizzare. Selezionando un edificio dalla tabella sulla sinistra e cliccando su una linguetta e possibile visualizzare un insieme di informazioni su di un edificio. Barra dei componenti Elenco degli edifici rappresentati da numero_protocollo-anno Figura 44. Struttura dell’interfaccia costruita. 59 Capitolo 5: Interfaccia del sistema ed esempi di funzionamento 5.1 L’interfaccia del sistema Come si vede in figura alcuni edifici sono evidenziati in giallo, ciò significa che sono edifici che hanno stipulato un libretto di manutenzione Le linguette selezionabili del tab sono otto e sono: • Dati Generali: sono alcuni dati riguardanti l’edificio (in origine questi dati si trovano nel db Access); • Dati Generali – LM: sono alcuni dati riguardanti il libretto di manutenzione associato all’edificio (in origine questi dati si trovano nel db Postgres); • Dati Catastali – Storici: sono i dati catastali e storici riguardanti l’edificio selezionato (in origine questi dati si trovano nel db Postgres); • Imprese: sono i dati riguardanti le imprese che partecipano al rifacimento dell’edificio (in origine questi dati si trovano nel db Access); • Rel. Tecnica Ass – DIA – Beni Culturali: selezionando questa linguetta è possibile visualizzare se sono presenti i file riguardanti la relazione tecnica asseverata, la denuncia di inizio attività e l’approvazione dei beni culturali ed eventualmente di visualizzarli (questo è uno dei nuovi db realizzati). • Inserimento caratt. e dest. d’uso bassi: selezionando questo tab è possibile inserire informazioni riguardanti la destinazione d’uso di un basso facente parte dell’edificio selezionato (questo è uno dei nuovi db realizzati). • Visualizza/Modifica info bassi: selezionando questa linguetta è possibile modificare le info di un basso inserito utilizzando il tab spigato al punto precedente. • Bassi 3D – Gis: in questo tab sono presenti i tasti per lanciare il sistema GIS e la visualizzazione 3D di un basso 5.2 Esempio di funzionamento Quando il programma viene avviato la prima schermata che ci compare è quella di caricamento dei dati (figura 45). Una volta che ciò è avvenuto il pulsante OK si attiverà e cliccando su di esso si potrà andare avanti. 60 Figura 45. Il caricamento dei dati. Capitolo 5: Interfaccia del sistema ed esempi di funzionamento 5.2 Esempio di funzionamento La situazione che ci apparirà dopo il caricamento dei dati (figura 46) è la seguente: la linguetta selezionata di default è Dati Generali nella quale però non compaiono inizialmente dati perchè bisogna ancora selezionare un edificio dalla tabella alla sinistra. Inoltre si può notare che gli edifici contenuti nella tabella di sinistra non sono ordinati alfabeticamente, questo lo si può ottenere cliccando sull’intestazione della tabella. Cliccando gli edifici si ordinano Figura 46. La schermata dopo il caricamento dei dati. Se si prova a cliccare su una linguetta senza aver selezionato un edificio viene lanciato un messaggio di avvertimento (figura 47). Figura 47. Messaggio d’avvertimento. 61 Capitolo 5: Interfaccia del sistema ed esempi di funzionamento 5.2 Esempio di funzionamento Selezionando la linguetta Dati Generali – LM possiamo accedere ai dati riguardanti il libretto di manutenzione associato all’edificio come in figura 48. Figura 48. Il pannello Dati-Generali LM Se l’edificio selezionato non ha un libretto di manutenzione la schermata che appare è quella mostrata in figura 49. Figura 49. L’edificio non ha un libretto di manutenzione. 62 Capitolo 5: Interfaccia del sistema ed esempi di funzionamento 5.2 Esempio di funzionamento Lo stesso comportamento della linguetta Dati Generali – LM lo ha il tab Dati Catastali – Storici, anche in quest’ultimo essendo i dati prelevati dal db Postgres, se l’edificio selezionato non ha un libretto di manutenzione alla selezione del tab comparirà la scritta “Libretto di Manutenzione non presente”. Il tab Imprese contiene le informazioni riguardanti l’impresa che si occupa dei lavori nell’edificio (figura 50). Figura 50. La linguetta Imprese. Cliccando sulla linguetta Rel. Tecnica Ass – DIA – Beni Culturali è possibile visualizzare la relazione tecnica osseverata, la denuncia di inizio attività e l’approvazione dei beni culturali ed eventualmente di visualizzarli (figura 51). 63 Capitolo 5: Interfaccia del sistema ed esempi di funzionamento 5.2 Esempio di funzionamento Figura 51. Il tab Rel. Tecnica Ass – DIA – Beni Culturali. L’uso di questa parte dell’interfaccia è molto semplice: spuntando si o no è possibile indicare se il documento in questione è presente, dopodiché cliccando sul tasto seleziona file e possibile aprire una finestra di dialogo (figura 52) nella quale esplorare le risorse del computer locale e selezionare il file desiderato. Cliccando invece sul tasto Apri Relazione Tecnica oppure sul tasto Apri Dia oppure ancora sul tasto Apri File Approvazione è possibile lanciare il documento selezionato. Figura 52. La finestra di dialogo per selezionare il file 64 Capitolo 5: Interfaccia del sistema ed esempi di funzionamento 5.2 Esempio di funzionamento Cliccando invece sul tab Inserimento caratt. e dest. d’uso bassi (figura 53) è possibile inserire informazioni riguardanti la destinazione d’uso di un basso facente parte dell’edificio selezionato. In pratica questo tab contiene un semplice form riguardante il popolamento e la destinazione d’uso dei bassi presenti nell’edificio da compilare. Se si osserva bene la figura sottostante si noterà che le voci Ricadente nell’edificio sito in (Via, Piazza, ecc.) e n. civico sono già compilate e corrisponde all’indirizzo dell’edificio selezionato sulla sinistra, questo per evitare che l’utente possa sbagliare ad immettere i dati. Il form continua Figura 53. Il tab Inserimento caratt. e dest. d’uso bassi. In fine selezionando la linguetta Visualizza/Modifica info bassi (figura 54) è possibile modificare le info di un basso inserito utilizzando il tab precedente (Inserimento caratt. e dest. d’uso bassi). Come si vede nella figura sottostante, nella parte alta del tab è presente una tabella che riassume tutti i bassi presenti nell’edificio, mentre nella parte bassa sono riportate le informazioni riguardanti la locazione del basso selezionato nella tabella. 65 Capitolo 5: Interfaccia del sistema ed esempi di funzionamento 5.2 Esempio di funzionamento Figura 54. Il tab Visualizza/Modifica info bassi. Con il tasto Modifica Localizzazione Basso è possibile modificare le info di localizzazione del basso, mentre premendo il tasto Visualizza le altre info si aprirà una finestra di dialogo (figura 55) in cui ci sono le altre informazioni riguardante il basso, inoltre in tale finestra è anche possibile modificare le informazioni del basso. Figura 55. La finestra di dialogo che visualizza le altre info relative ad un basso. 66 Capitolo 6: Conclusioni e sviluppi futuri 6. Conclusioni e sviluppi futuri Nei mesi trascorsi a lavorare su questo progetto, l’obbiettivo è sempre stato quello di riuscire a creare un qualcosa che fosse in grado di fornire un aiuto a coloro che lavorano nell’azienda S.I.Re.Na. al progetto di ristrutturazione e rivalutazione dei Quartieri Spagnoli. Certamente far coincidere i tempi di uno stage con quelli di un’azienda che lavora ad un progetto che dura molti anni non è stato semplice. Spero in ogni caso che il mio impegno come quello degli altri due miei colleghi nel creare questo sistema sia stato apprezzato. Al termine di questo stage il risultato ottenuto è stato di costruire un sistema in grado di integrare tutte le risorse possedute dall’azienda ed un’interfaccia d’accesso a tali risorse. Alle risorse già possedute da S.I.Re.Na. ne sono state aggiunte delle altre a loro volta integrate nel sistema. Struttura portante dell’intero sistema è stata l’ontologia creata in Flora2 che ha permesso di integrare tutte le risorse di S.I.Re.Na. Per quanto riguarda gli sviluppi futuri ritengo che il sistema realizzato sia compatibile e si possa facilmente integrare con quello che saranno le nuove funzionalità che saranno definite. A tal proposto si può pensare di costruire nuove funzioni all’interfaccia che riguarderanno ulteriori viste di dati, come ad esempio il computo metrico degli edifici. Per quanto concerne la rappresentazione il sistema realizzato, si presta a future integrazioni con nuove sorgenti dati, mediante la definizione di nuove classi dell’ontologia costruita. 67 Bibliografia Bibliografia [1] N. Guarino(1997) Understanding, building, and using ontologies. ”Using Explicit Ontologies in KBS Development", by van Heijst, Schreiber, and Wielinga.” International Journal of Human and Computer Studies 46: 293-310. [2] N. Guarino Il ruolo dell’ontologia formale per l’integrazione e la condivisione di conoscenze. Attivita' di Ricerca presso il LADSEB-CNR. Giornata di Lavoro AI*IA su "Accesso, Estrazione e Integrazione di Conoscenza", Napoli, 28/9/96. http://www.ladseb.pd.cnr.it/infor/Ontology/Papers/AIIA96.pdf http://www.ladseb.pd.cnr.it/infor/Ontology/Papers/AIIA96.doc [3] The PostgreSQL Global Development Group PostgreSQL 8.1.0 Documentation http://www.postgresql.org/docs/manuals/ [4] University of Stanford Protégé-Frames User's Guide http://protege.stanford.edu [5] Guizhen Yang, Michael Kifer, Chang Zhao, Vishal Chowdhary Flora-2 : User's Manual http://flora.sourceforge.net/docs/floraManual.pdf [6] Kifer M., Lausen G., Wu J. Dawson, M. Kifer Logical Foundations of Object-Oriented and Frame-Based languages. In journal of the Association fo Computing Machinery, May 1995. 68 Bibliografia [7] K. Sagonas, T. Swift, D. S. Warren, J. Freire, P. Rao, B. Cui, E. Johnson, L. de Castro, S. Dawson, M. Kifer The XSB System - Volume 1: Programmer’s Manual http://xsb.sourceforge.net/manual1/manual1.pdf [8] B. Eckel Thinking in Java - Apogeo http://www.bruceeckel.com [9] Java2Flora Utility Ontotext – Semantic Tecnhnology Lab. http://www.ontotext.com/java2flora [10] Groub “What is an Ontology?” http://www-kls.stanford.edu/kst/what-is-an-ontology.html [11] C. Lagoze, J. B. Chandrasekaran, John R. Josephson, V. Richard Benjamins What are the Ontologies, and why do we need them? IEEE Intelligent System January/February 1999 [12] N. Guarino, P. Giaretta. (1995). Ontologies and Knowledge Bases: To-wards a Terminological Clarification. In N. Mars (ed.) Towards Very Large Knowledge Bases: Knowledge Building and Knowledge Sharing 1995. IOS Press, Amsterdam: 25-32. [13] I. Agarossi, N. Bunkheila Tool per la visualizzazione grafica di Ontologie http://ra.crema.unimi.it/turing/MATERIALE/paolo/allegati/ToolVisualizzazioneOntologie.pdf 69 Bibliografia [14] J. Angele, G. Lausen Ontologies in F-Logic http://www.deri.at/teaching/seminars/interna/literature/ontologyhandbookV217.pdp [15] D. Donato Progetto S.I.Re.Na. integrazione di risorse per i quartieri spagnoli: un GIS dell’area. Università degli studi di Napoli Federico II – Facolta di Scienze MM. FF. NN. – CDL in Informatica - Tesi di Laurea triennale (triennale), anno accademico 2005-2006 [16] D. Fiore Progetto S.I.Re.Na. integrazione di risorse per i quartieri spagnoli: modello 3D di bassi. Università degli studi di Napoli Federico II – Facolta di Scienze MM. FF. NN. – CDL in Informatica - Tesi di Laurea triennale (triennale), anno accademico 2005-2006 [17] K. Sagonas, T. Swift, D. S. Warren, J. Freire, P. Rao, B. Cui, E. Johnson, L. de Castro, S. Dawson, M. Kifer The XSB System - Volume 2: Libraries, Interfaces and Packages http://xsb.sourceforge.net/manual2/manua2.pdf [18] S.I.Re.Na. Studio di fattibilità per l'avvio di un programma pilota di intervento per l'eliminazione dei "bassi" ricadenti in un'area dei quartieri spagnoli di napoli a monte di via Toledo: Sintesi dello studio A cura di S.I.RE.NA. Città Storica Scpa con il contributo dell'Università Federico II di Napoli, SEDIM, Napoli, 2002 [19] S.I.Re.Na. Studio di fattibilità per l'avvio di un programma pilota di intervento per l'eliminazione dei "bassi" ricadenti in un'area dei quartieri spagnoli di napoli a monte di via Toledo - Questioni di metodo A cura di S.I.RE.NA. Città Storica Scpa con il contributo dell'Università Federico II di Napoli, SEDIM, Napoli, 2002 70 Bibliografia [20] S.I.Re.Na. Studio di fattibilità per l'avvio di un programma pilota di intervento per l'eliminazione dei "bassi" ricadenti in un'area dei quartieri spagnoli di napoli a monte di via Toledo: I quartieri spagnoli e l'area di studio - letture critiche A cura di S.I.RE.NA. Città Storica Scpa con il contributo dell'Università Federico II di Napoli, SEDIM, Napoli, 2002 [21] S.I.Re.Na. Studio di fattibilità per l'avvio di un programma pilota di intervento per l'eliminazione dei "bassi" ricadenti in un'area dei quartieri spagnoli di napoli a monte di via Toledo: Elementi per la redazione del programma pilota A cura di S.I.RE.NA. Città Storica Scpa con il contributo dell'Università Federico II di Napoli, SEDIM, Napoli, 2002 [22] M. Nicolella Programmazione degli interventi in edilizia Sirena città storica - Università degli Studi di Napoli Federico II D.I.N.E. (Dipartimento di ingegneria Edile) [23] Calabrese A., Mele F., Serino L., Sorgente A., Talamo O. Rappresentazioni di Conoscenze Spaziali di Siti Archeologici Workshop intelligenza artificiale per i beni culturali 23/9/2003 Pisa [24] Pinto Sofia H., Some Issue on Ontologies Integration, Proceedings of IJCAI-99 Workshop on Ontologies and Problem-solving methods Stockholm, Sweden 71 Appendice Appendice Nell’ampendice è riportato il codice XSB, Flora e Java realizzato. Codice XSB :-import :-import :-import :-import :-import :-import :-import :-import :-import :-import :-import :-import odbc_open/3 from odbc_call. odbc_open/4 from odbc_call. odbc_close/0 from odbc_call. odbc_close/1 from odbc_call. odbc_sql/4 from odbc_call. odbc_import/2 from odbc_call. odbc_import/3 from odbc_call. odbc_query/2 from odbc_call. odbc_insert/2 from odbc_call. odbc_delete/2 from odbc_call. odbc_create_table/2 from odbc_call. member/2 from lists. :-odbc_open('PostgreSQL','SIRENA','SIRENA','ConPostgres'). :-odbc_open('SirenaDB','','','ConAccess'). :-odbc_open('SirenaDB2','','','ConAccess2'). :-carica_circoscrizioni. :-carica_tecnici. :-carica_utenti. :-carica_richiedenti. :-carica_raccomandata. :-carica_imprese. :-carica_riconferma. :-carica_visiteSIR. :-carica_visiteCPT. :-carica_foto_SIR. :-carica_foto_CPT. :-carica_foto_cond. :-carica_progetti. :-carica_anomalie. :-carica_foto. :-carica_foto_piante. :-carica_foto_prospetti. :-carica_foto_sezioni. :-carica_foto_altre. :-carica_foto_inquadramento_planimetrico. :-carica_materiali. :-carica_schede_operazioni. :-carica_schede_interventi. :-carica_schede_controlli. :-carica_tipi_elementi_tecnici. :-carica_composizione_soluzioni. :-carica_funzioni. :-carica_scelta_operazioni. :-carica_materiali_dei_tipi. :-carica_soluzione_tipi_elementi_tecnici. :-carica_tipi_materiali. :-carica_edifici_dati_generali. :-carica_edifici_dati_catastali. :-carica_edifici_dati_storici. :-carica_edifici_dati_quantitativi. :-carica_edifici_inq_territoriali. :-carica_edifici_dati_normativi. :-carica_edifici_dati_tecnologici1. :-carica_edifici_dati_tecnologici2. 72 Appendice Codice XSB :-carica_edifici_dati_tecnologici3. :-carica_edifici_dati_tecnologici_prospetti. :-carica_edifici_dati_tipologici. :-carica_infolibretto. :-carica_operazioni. :-carica_schede_diagnosi. :-carica_specifiche_elementi_tecnici. :-carica_validazione. :-carica_planning. :-carica_computo. :-carica_designazione. :-carica_prospetto. :-carica_relazione_tecnica. :-carica_approvazione_beni. :-carica_dia. :-odbc_close('ConPostgres'). :-odbc_close('ConAccess'). :-odbc_close('ConAccess2'). carica_circoscrizioni:odbc_sql('ConAccess',[],'SELECT * FROM Circoscrizioni',[CODICE,CIRCOSCRIZIONE]), asserta(pred_circoscrizione(CODICE,CIRCOSCRIZIONE)), fail. carica_circoscrizioni. carica_tecnici:odbc_sql('ConAccess',[],'SELECT * FROM TECNICI',[CODICE,TITOLO,NOMINATIVO,DOMICILIO,CITTA,CAP,TELEFONO,TELEFONO2,FAX,MAIL]), asserta(pred_tecnici(CODICE,TITOLO,NOMINATIVO,DOMICILIO,CITTA,CAP,TELEFONO,TELEFONO2,FAX,MAIL)), fail. carica_tecnici. carica_utenti:odbc_sql('ConAccess',[],'SELECT * FROM UTENTI',[CODICE,ID,PASS,SOGGETTO]), asserta(pred_utenti(CODICE,ID,PASS,SOGGETTO)), fail. carica_utenti. carica_richiedenti:odbc_sql('ConAccess',[],'SELECT * FROM RICHIEDENTI',[CODICE,TIPO,NOMINATIVO,DOMICILIO,CITTA,CAP,TELEFONO,TELEFONO2,FAX,MAIL,X]), asserta(pred_richiedenti(CODICE,TIPO,NOMINATIVO,DOMICILIO,CITTA,CAP,TELEFONO,TELEFONO2,FAX,MAIL, X)), fail. carica_richiedenti. carica_raccomandata:odbc_sql('ConAccess',[],'SELECT "CODICE","DATA INVIO RACCOMANDATA 2004","DATA INVIO RACCOMANDATA 2005","CODICE ULTIMA RACCOM 2004","CODICE ULTIMA RACCOM 2005" FROM IMPRESE',[CODICE,DATA_INVIO_RACCOMANDATA_2004,DATA_INVIO_RACCOMANDATA_2005,CODICE_ULTIMA_RACCOM_2004,CO DICE_ULTIMA_RACCOM_2005]), asserta(pred_raccomandata(CODICE,DATA_INVIO_RACCOMANDATA_2004,DATA_INVIO_RACCOMANDATA_2005,CODIC E_ULTIMA_RACCOM_2004,CODICE_ULTIMA_RACCOM_2005)), fail. carica_raccomandata. carica_imprese:odbc_sql('ConAccess',[],'SELECT "CODICE","RAGIONE SOCIALE","TIPO IMPRESA","SEDE LEGALE","CAP","CITTA","SEDE OPERATIVA","CAP1","CITTA1","TELEFONO","TELEFONO2","FAX","EMAIL","PARTITA IVA","ALTRE INFORMAZIONI","DATA INSERIMENTO" FROM IMPRESE',[CODICE,RAGIONE_SOCIALE,TIPO_IMPRESA,SEDE_LEGALE,CAP,CITTA,SEDE_OPERATIVA,CAP1,CITTA1,TELEFONO ,TELEFONO2,FAX,EMAIL,PARTITA_IVA,ALTRE_INFORMAZIONI,DATA_INSERIMENTO]), 73 Appendice Codice XSB asserta(pred_imprese(CODICE,RAGIONE_SOCIALE,TIPO_IMPRESA,SEDE_LEGALE,CAP,CITTA,SEDE_OPERATIVA,CA P1,CITTA1,TELEFONO,TELEFONO2,FAX,EMAIL,PARTITA_IVA,ALTRE_INFORMAZIONI,DATA_INSERIMENTO)), fail. carica_imprese. carica_riconferma:odbc_sql('ConAccess',[],'SELECT "CODICE","RICONFERMA 2004","RICONFERMA 2005" FROM IMPRESE',[CODICE,RICONFERMA_2004,RICONFERMA_2005]), asserta(pred_riconferma(CODICE,RICONFERMA_2004,RICONFERMA_2005)), fail. carica_riconferma. carica_visiteSIR:odbc_sql('ConAccess',[],'SELECT "Protocollo servizio","Anno Protocollo","CENTRO STORICO URBANO O PERIFERICO","data","rilevatore","risultato","nota" FROM "VISITE SIRENA"',[Protocollo_servizio,Anno_Protocollo,CENTRO_STORICO_U_O_P,Data,Rilevatore,Risultato,Nota]), asserta(pred_visiteSIR(Protocollo_servizio,Anno_Protocollo,CENTRO_STORICO_U_O_P,Data,Rilevatore, Risultato,Nota)), fail. carica_visiteSIR. carica_visiteCPT:odbc_sql('ConAccess',[],'SELECT "Protocollo servizio","Anno Protocollo","CENTRO STORICO URBANO O PERIFERICO","data","rilevatore","risultato","nota" FROM "VISITE CPT"',[Protocollo_servizio,Anno_Protocollo,CENTRO_STORICO_U_O_P,Data,Rilevatore,Risultato,Nota]), asserta(pred_visiteCPT(Protocollo_servizio,Anno_Protocollo,CENTRO_STORICO_U_O_P,Data,Rilevatore, Risultato,Nota)), fail. carica_visiteCPT. carica_foto_SIR:odbc_sql('ConAccess',[],'SELECT "Protocollo servizio","FOTO" FROM "VISITE SIRENA"',[Protocollo_servizio,FOTO]), asserta(pred_foto_visiteSIR(Protocollo_servizio,FOTO)), fail. carica_foto_SIR. carica_foto_CPT:odbc_sql('ConAccess',[],'SELECT "Protocollo servizio","FOTO" FROM "VISITE CPT"',[Protocollo_servizio,FOTO]), asserta(pred_foto_visiteCPT(Protocollo_servizio,FOTO)), fail. carica_foto_CPT. carica_foto_cond:odbc_sql('ConAccess',[],'SELECT ID,FOTO FROM CONDOMINI',[ID,FOTO]), asserta(pred_foto_cond(ID,FOTO)), fail. carica_foto_cond. carica_progetti:odbc_sql('ConAccess',[],'SELECT * FROM CONDOMINI',[ID,Protocollo_servizio,Anno_Protocollo,PROGETTO,Numero_elenco_aggiornato,Aggiornamento,Prop rieta,INDIRIZZO,COMUNE,CODICE_CIRCOSCRIZIONE,POSSIBILE_INTERESSE_ARC,VINCOLATO_SENSI_1089,VINCOLATO_SEN SI_1497,Riserva_20,CENTRO_STORICO_URBANO_PERIFERICO,CODICE_RICHIEDENTE,CODICE_PROGETTISTA,CODICE_DIRETT ORE_LAVORI,CODICE_coordinatore_sicurezza,CODICE_coordinatore_sicurezza,CODICE_IMPRESA_APPALTATRICE,IMPR ESE_SUBAPPALTATRICI,CODICE_DIRETTORE_TECNICO,TITOLO_EDILIZIO,DATA_ATTIVAZIONE_DIA,DATA_SCADENZA_DIA,TIP OLOGIA_INTERVENTO,LOCALIZZAZIONE_LAVORI,TIPOLOGIA_LAVORI,AVANZAMENTO_FATTURE,DATA_NOTA1_EVASA,DATA_NOTA 2_EVASA,AVANZAMENTO_FATTURE2,CONTRIBUTO_FINANZIATO,IMPORTO_INTERVENTO_PREVENTIVATO_RICHIESTO,DATA_RICHI ESTO_CONTRIBUTO_A_50,IMPORTO_INTERVENTO_PREVENTIVATO_OTTENUTO,IMPORTO_INTERVENTO_RIDETERMINATO,VARIAZIO NI_SPESA_PREVISTE,CONTRIBUTO_RIDETERMINATO,IMPORTO_INTERVENTO_PRESUNTO_INIZIALE,LIBRETTO_MANUTENZIONE,C ONTRIBUTI_OTTENUTI,DELTA_CONTRIBUTI,PERCENTUALE_CONTRIBUTI,IMPORTO_INTERVENTO_RICHIESTO,DATA_RICHIESTO_ CONTRIBUTO_A_SALDO,IMPORTO_INTERVENTO_OTTENUTO,DATA_ATTIVAZIONE_CANTIERE_PREVISTA,DATA_FINE_CANTIERE_PR EVISTA,DATA_ATTIVAZIONE_CANTIERE_EFFETTIVA,DATA_FINE_CANTIERE_EFFETTIVA,STATO_CANTIERE,TRASMISSIONE_VER BALE_O_INIZIO_LAVORI,TRASMISSIONE_COPIA_CONTRATTO,CONTRATTO_CONFORME_A_SIRENA,TRASMESSA_COPIA_POLIZZE,P OLIZZE_CONFORMI_SCHEMA_SIRENA,COMUNICATO_DA_CONDOMINIO_INIZIO_LAVORI_A_ENTI,COMUNICATO_DA_IMPRESE_INIZI O_LAVORI_A_ENTI,NUMERO_VISITE_SIRENA,ULTIMA_DATA_VISITA_SIRENA,NUMERO_VISITE_CPT,ULTIMA_DATA_VISITA_CPT 74 Appendice Codice XSB ,ATTIVATO_PROGETTO_EURECHO,INFORMAZIONI_PROGETTO_EURECHO,ATTIVATO_36,ATTIVATA_PUBBLICITA_PONTEGGI,AVANZ AMENTO_0_50,ULTIMATO_LAVORI,RICHIESTO_CONTRIBUTO_A_50,OTTENUTO_CONTRIBUTO_A_50,AVANZAMENTO_50_100,RICHI ESTO_CONTRIBUTO_A_SALDO,OTTENUTO_CONTRIBUTO_A_SALDO,CONSEGNATO_LIBRETTO_MANUTENZIONE,DATA_CONSEGNA_DEFI NITIVA_LM,CERTIFICATO_LIBRETTO_MANUTENZIONE,DATA_CERTIFICATO_LM,NOTA1,NOTA2,NOTA3,NOTA4,FOTO]), asserta(pred_progetti(ID,Protocollo_servizio,Anno_Protocollo,PROGETTO,Numero_elenco_aggiornato,A ggiornamento,Proprieta,INDIRIZZO,COMUNE,CODICE_CIRCOSCRIZIONE,POSSIBILE_INTERESSE_ARC,VINCOLATO_SENSI_1 089,VINCOLATO_SENSI_1497,Riserva_20,CENTRO_STORICO_URBANO_PERIFERICO,CODICE_RICHIEDENTE,CODICE_PROGETTI STA,CODICE_DIRETTORE_LAVORI,CODICE_coordinatore_sicurezza_prog,CODICE_coordinatore_sicurezza_esec,CODIC E_IMPRESA_APPALTATRICE,IMPRESE_SUBAPPALTATRICI,CODICE_DIRETTORE_TECNICO,TITOLO_EDILIZIO,DATA_ATTIVAZION E_DIA,DATA_SCADENZA_DIA,TIPOLOGIA_INTERVENTO,LOCALIZZAZIONE_LAVORI,TIPOLOGIA_LAVORI,AVANZAMENTO_FATTURE ,DATA_NOTA1_EVASA,DATA_NOTA2_EVASA,AVANZAMENTO_FATTURE2,CONTRIBUTO_FINANZIATO,IMPORTO_INTERVENTO_PREVEN TIVATO_RICHIESTO,DATA_RICHIESTO_CONTRIBUTO_A_50,IMPORTO_INTERVENTO_PREVENTIVATO_OTTENUTO,IMPORTO_INTERV ENTO_RIDETERMINATO,VARIAZIONI_SPESA_PREVISTE,CONTRIBUTO_RIDETERMINATO,IMPORTO_INTERVENTO_PRESUNTO_INIZI ALE,LIBRETTO_MANUTENZIONE,CONTRIBUTI_OTTENUTI,DELTA_CONTRIBUTI,PERCENTUALE_CONTRIBUTI,IMPORTO_INTERVENT O_RICHIESTO,DATA_RICHIESTO_CONTRIBUTO_A_SALDO,IMPORTO_INTERVENTO_OTTENUTO,DATA_ATTIVAZIONE_CANTIERE_PRE VISTA,DATA_FINE_CANTIERE_PREVISTA,DATA_ATTIVAZIONE_CANTIERE_EFFETTIVA,DATA_FINE_CANTIERE_EFFETTIVA,STAT O_CANTIERE,TRASMISSIONE_VERBALE_O_INIZIO_LAVORI,TRASMISSIONE_COPIA_CONTRATTO,CONTRATTO_CONFORME_A_SIREN A,TRASMESSA_COPIA_POLIZZE,POLIZZE_CONFORMI_SCHEMA_SIRENA,COMUNICATO_DA_CONDOMINIO_INIZIO_LAVORI_A_ENTI, COMUNICATO_DA_IMPRESE_INIZIO_LAVORI_A_ENTI,NUMERO_VISITE_SIRENA,ULTIMA_DATA_VISITA_SIRENA,NUMERO_VISITE _CPT,ULTIMA_DATA_VISITA_CPT,ATTIVATO_PROGETTO_EURECHO,INFORMAZIONI_PROGETTO_EURECHO,ATTIVATO_36,ATTIVAT A_PUBBLICITA_PONTEGGI,AVANZAMENTO_0_50,ULTIMATO_LAVORI,RICHIESTO_CONTRIBUTO_A_50,OTTENUTO_CONTRIBUTO_A_ 50,AVANZAMENTO_50_100,RICHIESTO_CONTRIBUTO_A_SALDO,OTTENUTO_CONTRIBUTO_A_SALDO,CONSEGNATO_LIBRETTO_MANU TENZIONE,DATA_CONSEGNA_DEFINITIVA_LM,CERTIFICATO_LIBRETTO_MANUTENZIONE,DATA_CERTIFICATO_LM,NOTA1,NOTA2, NOTA3,NOTA4,FOTO)), fail. carica_progetti. carica_anomalie:odbc_sql('ConPostgres',[],'SELECT * FROM "Anomalie"',[A,B,C,D,E,F,G,H,I]), asserta(pred_anomalie(A,B,C,D,E,F,G,H,I)), fail. carica_anomalie. carica_foto_piante:odbc_sql('ConPostgres',[],'SELECT * FROM "Foto_piante"',[A,B]), asserta(pred_foto_piante(A,B)), fail. carica_foto_piante. carica_foto:odbc_sql('ConPostgres',[],'SELECT * FROM "Foto"',[A,B]), asserta(pred_foto(A,B)), fail. carica_foto. carica_foto_prospetti:odbc_sql('ConPostgres',[],'SELECT * FROM "Foto_prospetti"',[A,B,C]), asserta(pred_foto_prospetti(A,B,C)), fail. carica_foto_prospetti. carica_foto_sezioni:odbc_sql('ConPostgres',[],'SELECT * FROM "Foto_sezioni"',[A,B]), asserta(pred_foto_sezioni(A,B)), fail. carica_foto_sezioni. carica_foto_altre:odbc_sql('ConPostgres',[],'SELECT * FROM "Foto_altre"',[A,B]), asserta(pred_foto_altre(A,B)), fail. carica_foto_altre. carica_foto_inquadramento_planimetrico:odbc_sql('ConPostgres',[],'SELECT * FROM "Foto_inquadramento_planimetrico"',[A,B]), asserta(pred_foto_inquadramento_planimetrico(A,B)), fail. carica_foto_inquadramento_planimetrico. 75 Appendice Codice XSB carica_materiali:odbc_sql('ConPostgres',[],'SELECT * FROM "Materiali"',[A,B]), asserta(pred_materiali(A,B)), fail. carica_materiali. carica_planning:odbc_sql('ConPostgres',[],'SELECT * FROM "Planning"',[A,B,C,D,E]), asserta(pred_planning(A,B,C,D,E)), fail. carica_planning. carica_schede_operazioni:odbc_sql('ConPostgres',[],'SELECT * FROM "Schede_operazioni"',[A,B,C,D,E,F,G,H,I]), asserta(pred_schede_operazioni(A,B,C,D,E,F,G,H,I)), fail. carica_schede_operazioni. carica_schede_interventi:odbc_sql('ConPostgres',[],'SELECT * FROM "Schede_interventi"',[A,B,C,D,E,F,G,H,I,L,M,N]), asserta(pred_schede_interventi(A,B,C,D,E,F,G,H,I,L,M,N)), fail. carica_schede_interventi. carica_schede_controlli:odbc_sql('ConPostgres',[],'SELECT * FROM "Schede_controlli"',[A,B,C,D,E,F,G,H,I,L,M,N,O,P]), asserta(pred_schede_controlli(A,B,C,D,E,F,G,H,I,L,M,N,O,P)), fail. carica_schede_controlli. carica_tipi_elementi_tecnici:odbc_sql('ConPostgres',[],'SELECT * FROM "Tipi_elementi_tecnici"',[A,B,C,D,E]), asserta(pred_tipi_elementi_tecnici(A,B,C,D,E)), fail. carica_tipi_elementi_tecnici. carica_composizione_soluzioni:odbc_sql('ConPostgres',[],'SELECT * FROM "Composizione_soluzioni"',[A,B,C]), asserta(pred_composizione_soluzioni(A,B,C)), fail. carica_composizione_soluzioni. carica_funzioni:odbc_sql('ConPostgres',[],'SELECT * FROM "Funzioni"',[A,B,C,D,E]), asserta(pred_funzioni(A,B,C,D,E)), fail. carica_funzioni. carica_materiali_dei_tipi:odbc_sql('ConPostgres',[],'SELECT * FROM "Schede_controlli"',[A,B]), asserta(pred_materiali_dei_tipi(A,B)), fail. carica_materiali_dei_tipi. carica_scelta_operazioni:odbc_sql('ConPostgres',[],'SELECT * FROM "Scelta_operazioni"',[A,B,C,D,E,F,G,H,I,L]), asserta(pred_scelta_operazioni(A,B,C,D,E,F,G,H,I,L)), fail. carica_scelta_operazioni. carica_soluzione_tipi_elementi_tecnici:odbc_sql('ConPostgres',[],'SELECT * FROM "Soluzioni_tipi_elementi_tecnici"',[A,B,C,D]), asserta(pred_soluzione_tipi_elementi_tecnici(A,B,C,D)), fail. carica_soluzione_tipi_elementi_tecnici. 76 Appendice Codice XSB carica_tipi_materiali:odbc_sql('ConPostgres',[],'SELECT * FROM "Tipi_materiali"',[A,B,C]), asserta(pred_tipi_materiali(A,B,C)), fail. carica_tipi_materiali. carica_edifici_dati_generali:odbc_sql('ConPostgres',[],'SELECT * FROM "Edificidati_generali"',[A,B,C,D,E,F,G,H,K,L,M,N,O,P,R,S,T,U,V,W,Y,Z]), asserta(pred_edifici_dati_generali(A,B,C,D,E,F,G,H,K,L,M,N,O,P,R,S,T,U,V,W,Y,Z)), fail. carica_edifici_dati_generali. carica_edifici_dati_catastali:odbc_sql('ConPostgres',[],'SELECT * FROM "Edifici-dati_catastali"',[A,B,C,D]), asserta(pred_edifici_dati_catastali(A,B,C,D)), fail. carica_edifici_dati_catastali. carica_edifici_dati_storici:odbc_sql('ConPostgres',[],'SELECT * FROM "Edifici-dati_storici"',[A,B,C,D,E,F,G,H,I,L,M,N]), asserta(pred_edifici_dati_storici(A,B,C,D,E,F,G,H,I,L,M,N)), fail. carica_edifici_dati_storici. carica_edifici_dati_quantitativi:odbc_sql('ConPostgres',[],'SELECT * FROM "Edificidati_quantitativi"',[A,B,C,D,E,F,G,H,I,K,L,M,N,O,P,Q,R,S,T,U,V,W,Y,Z,A1]), asserta(pred_edifici_dati_quantitativi(A,B,C,D,E,F,G,H,I,K,L,M,N,O,P,Q,R,S,T,U,V,W,Y,Z,A1)), fail. carica_edifici_dati_quantitativi. carica_edifici_inq_territoriali:odbc_sql('ConPostgres',[],'SELECT * FROM "Edifici-inq_territoriale"',[A,B,C,D,E,F,G,H,K]), asserta(pred_edifici_inq_territoriali(A,B,C,D,E,F,G,H,K)), fail. carica_edifici_inq_territoriali. carica_edifici_dati_normativi:odbc_sql('ConPostgres',[],'SELECT * FROM "Edifici-dati_urb_normativi"',[A,B,C,D,E,F,G,H]), asserta(pred_edifici_dati_urb_normativi(A,B,C,D,E,F,G,H)), fail. carica_edifici_dati_normativi. carica_edifici_dati_tecnologici1:odbc_sql('ConPostgres',[],'SELECT * FROM "Edificidati_tecnologici1"',[A,B,C,D,E,F,G,H,I,K,L,M,N,O,P,Q,R,S,T,U,V,W,Y,Z,A1,B1,C1,D1,E1]), asserta(pred_edifici_dati_tecnologici1(A,B,C,D,E,F,G,H,I,K,L,M,N,O,P,Q,R,S,T,U,V,W,Y,Z,A1,B1,C1, D1,E1)), fail. carica_edifici_dati_tecnologici1. carica_edifici_dati_tecnologici2:odbc_sql('ConPostgres',[],'SELECT * FROM "Edificidati_tecnologici2"',[A,B,C,D,E,F,G,H,I,K,L,M,N,O,P,Q,R,S,T,U,V,W,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,K1,L1,M 1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2,H2,I2,K2,L2,M2,N2,O2,P2,Q2,R2]), asserta(pred_edifici_dati_tecnologici2(A,B,C,D,E,F,G,H,I,K,L,M,N,O,P,Q,R,S,T,U,V,W,Y,Z,A1,B1,C1, D1,E1,F1,G1,H1,I1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2,H2,I2,K2,L2,M2,N2,O 2,P2,Q2,R2)), fail. carica_edifici_dati_tecnologici2. 77 Appendice Codice XSB carica_edifici_dati_tecnologici3:odbc_sql('ConPostgres',[],'SELECT * FROM "Edificidati_tecnologici3"',[A,B,C,D,E,F,G,H,I,K,L,M,N,O,P,Q,R,S,T,U,V,W,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1,K1,L1,M 1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2,H2,I2,K2,L2,M2,N2,O2,P2,Q2,R2,S2,T2,U2,V2,W2 ,Y2,Z2]), asserta(pred_edifici_dati_tecnologici3(A,B,C,D,E,F,G,H,I,K,L,M,N,O,P,Q,R,S,T,U,V,W,Y,Z,A1,B1,C1, D1,E1,F1,G1,H1,I1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2,H2,I2,K2,L2,M2,N2,O 2,P2,Q2,R2,S2,T2,U2,V2,W2,Y2,Z2)), fail. carica_edifici_dati_tecnologici3. carica_edifici_dati_tecnologici_prospetti:odbc_sql('ConPostgres',[],'SELECT * FROM "Edificidati_tecnologici_prospetti"',[A,B,C,D,E,F,G,H,I,K,L,M,N,O,P,Q]), asserta(pred_edifici_dati_tecnologici_prospetti(A,B,C,D,E,F,G,H,I,K,L,M,N,O,P,Q)), fail. carica_edifici_dati_tecnologici_prospetti. carica_edifici_dati_tipologici:odbc_sql('ConPostgres',[],'SELECT * FROM "Edifici-dati_tipologici"',[A,B,C,D,E,F,G,H,I]), asserta(pred_edifici_dati_tipologici(A,B,C,D,E,F,G,H,I)), fail. carica_edifici_dati_tipologici. carica_infolibretto:odbc_sql('ConPostgres',[],'SELECT * FROM "Info_libretto"',[A,B,C,D,E,F]), asserta(pred_infolibretto(A,B,C,D,E,F)), fail. carica_infolibretto. carica_operazioni:odbc_sql('ConPostgres',[],'SELECT * FROM "Operazioni"',[A,B,C,D,E,F,G]), asserta(pred_operazioni(A,B,C,D,E,F,G)), fail. carica_operazioni. carica_schede_diagnosi:odbc_sql('ConPostgres',[],'SELECT * FROM "Schede_diagnosi"',[A,B,C,D,E,F,G,H]), asserta(pred_schede_diagnosi(A,B,C,D,E,F,G,H)), fail. carica_schede_diagnosi. carica_specifiche_elementi_tecnici:odbc_sql('ConPostgres',[],'SELECT * FROM "Specifiche_elementi_tecnici"',[A,B,C,D,E]), asserta(pred_specifiche_elementi_tecnici(A,B,C,D,E)), fail. carica_specifiche_elementi_tecnici. carica_validazionie:odbc_sql('ConPostgres',[],'SELECT * FROM "Validazione"',[A,B,C,D,E,F,G,H]), asserta(pred_validazione(A,B,C,D,E,F,G,H)), fail. carica_validazione. carica_computo:odbc_sql('ConAccess2',[],'SELECT * FROM Computo_estimativo',[A,B,C,D,E]), asserta(pred_computo(A,B,C,D,E)), fail. carica_computo. carica_designazione:odbc_sql('ConAccess2',[],'SELECT * FROM Designazione_lavori',[A,B,C,D,E,F,G]), asserta(pred_designazione(A,B,C,D,E,F,G)), fail. carica_designazione. 78 Appendice Codice XSB carica_prospetto:odbc_sql('ConAccess2',[],'SELECT * FROM Prospetto',[A,B,C,D,E,F,G,H,I,L]), asserta(pred_prospetto(A,B,C,D,E,F,G,H,I,L)), fail. carica_prospetto. carica_relazione_tecnica:odbc_sql('ConAccess2',[],'SELECT * FROM Relazione_tecnica',[A,B,C]), asserta(pred_relazione_tecnica(A,B,C)), fail. carica_relazione_tecnica. carica_approvazione_beni:odbc_sql('ConAccess2',[],'SELECT * FROM Relazione_tecnica',[A,B,C]), asserta(pred_approvazione_beni(A,B,C)), fail. carica_approvazione_beni. carica_dia:odbc_sql('ConAccess2',[],'SELECT * FROM DIA',[A,B,C]), asserta(pred_dia(A,B,C)), fail. carica_dia. 79 Appendice Codice Flora2 Codice Flora edifici_dati[cod_sirena=>string]. /*DATI ANAGRAFICI*/ edifici_dati::dati_anagrafici. dati_anagrafici::edifici_dati_generali. dati_anagrafici::edifici_dati_catastali. dati_anagrafici::edifici_dati_quantitativi. dati_anagrafici::edifici_dati_storici. dati_anagrafici::edifici_dati_tecnologici1. dati_anagrafici::edifici_dati_tecnologici2. dati_anagrafici::edifici_dati_tecnologici3. dati_anagrafici::edifici_dati_tecnologici_prospetti. dati_anagrafici::edifici_dati_tipologici. dati_anagrafici::edifici_dati_urb_normativi. dati_anagrafici::edifici_inq_territoriale. /*ALTRI DATI*/ edifici_dati::info_libretto. edifici_dati::validazione. edifici_dati::planning. /*DATI MULTIMEDIALI*/ edifici_dati::dati_multimediali. dati_multimediali::foto. foto[path_foto=>string]. foto::foto_altre. foto::foto_inquadramento_planimetrico. foto::foto_piante. foto::foto_sezioni. foto::foto_prospetti. foto::foto_visite. foto_prospetti[nome=>string]. /*SCHEDA OPERAZIONE*/ edifici_dati::schede_operazioni. schede_operazioni::schede_interventi. schede_operazioni::schede_controlli. /*SCHEDA DI DIAGNOSI*/ edifici_dati::scheda_di_diagnosi. planning[ nome=>string, cod=>string, data=>number, tipo_planning=>number]. edifici_dati_generali[ via=>string, accessi=>string, denominazione=>string, circoscriz=>circoscrizione, tipo=>string, /*UNICO O APPARTENENTE A COMPLESSO*/ nomeprop=>string, cognomeprop=>string, qualifica=>string, domicilio=>string, tel=>string, licenza=>string,/*IMPLEMENTARE REGOLA PER ADERENZA A PROGETTI TRAMITE COD_SIRENA*/ cal_strut=>string, collaudatore=>string, centro_storico=>string, 80 Appendice Codice Flora2 comune=>string, possibile_interesse_arch_tec=>string, riserva_20_lavori_statici=>string, tipologia_edificio=>string,/*CONDOMINIO O PROPRIETA'*/ vincolato_sensi_1098=>string, prog_arch=>string, prog_imp=>string, prog_strut=>string, n_fabbricati=>string, n_scale=>string, certificato_ag=>string, impresa_esecutrice=>string, direttore_lavori=>string, vincolato_sensi_1497=>string]. edifici_dati_catastali[ foglio=>string, sezione=>string, p_lla=>string]. edifici_dati_storici[ epoca_costruzione=>string, tipo_epoca_costruzione=>string, scheda_post_sisma=>string, num_schede_post_sisma=>number, interventi_eseguiti=>string, int_provvisionali_spicconatura=>string, int_provvisionali_puntellamento=>string, int_provvisionali_altro=>string, data_verbale_diffida=>string, descrizione_verbale_diffida=>string, cep_verbale_diffida=>string]. edifici_dati_quantitativi[ area_sedime=>number, altezza_max_edificio=>number, num_piani_fuori_terra=>number, n_min=>number, n_max=>number, num_piani_entro_terra=>number, n_scale=>number, vol_entro_terra=>number, vol_fuori_terra=>number, cantinole=>number, parch_coperti=>number, parch_scoperti=>number, spazi_comuni=>number, loc_caldaia=>number, stenditoi=>number, giardini=>number, terrazzi=>number, altrodq=>string, destinazione_uni_immobiliari=>string, sup_tot=>number, sup_edi=>number, area_a_verde=>number, sup_scoperte=>number, altrodqmq=>number]. edifici_inq_territoriale[ cav_sotterranee=>string, scheda_cav_sotterranee=>string, num_vie_accesso=>number, acces_text=>string, int_traffico=>string, rapp_altri_edifici=>string, n_lati=>number, fabb_stat_autonomo=>string]. edifici_dati_tecnologici1[ fondazioni_profonde=>string, 81 Appendice Codice Flora2 fondazioni_su_pali=>string, fondazioni_superficiali=>string, fondazioni_superficiali_plinti_iso=>string, fondazioni_superficiali_plinti_coll=>string, fondazioni_superficiali_travi=>string, fondazioni_superficiali_platea=>string, fondazioni_superficiali_continue_tufo=>string, fondazioni_superficiali_continue_pietrame=>string, fondazioni_prof_piano_di_posa=>number, strutt_vert_muratura=>string, strutt_vert_muratura_tufo=>string, strutt_vert_muratura_tufo_con_irre=>string, strutt_vert_muratura_tufo_con_re=>string, strutt_vert_muratura_tufo_pietre_seg=>string, strutt_vert_muratura_tufo_mat_pieni=>string, strutt_vert_muratura_listata=>string, strutt_vert_muratura_matt_pieni=>string, strutt_vert_muratura_pietrame=>string, strutt_vert_muratura_cordoli=>string, strutt_vert_muratura_catene=>string, strutt_vert_cong_cementizio_armato=>string, strutt_vert_cong_cementizio_armato_setti=>string, strutt_vert_cong_cementizio_armato_telaio=>string, strutt_vert_mista=>string, strutt_vert_mista_vert=>string, strutt_vert_mista_orizz=>string, strutt_vert_acciaio=>string]. edifici_dati_tecnologici2[ strutt_orizz_volte=>string, strutt_orizz_volte_a_botte=>string, strutt_orizz_volte_a_botte_tufo=>number, strutt_orizz_volte_a_botte_mattoni=>number, strutt_orizz_volte_a_botte_mattoncelle=>number, strutt_orizz_volte_a_vela=>string, strutt_orizz_volte_a_vela_tufo=>number, strutt_orizz_volte_a_vela_mattoni=>number, strutt_orizz_volte_a_vela_mattoncelle=>number, strutt_orizz_volte_a_crociera=>string, strutt_orizz_volte_a_crociera_tufo=>number, strutt_orizz_volte_a_crociera_mattoni=>number, strutt_orizz_volte_a_crociera_mattoncelle=>number, strutt_orizz_volte_a_padiglione=>string, strutt_orizz_volte_a_padiglione_tufo=>number, strutt_orizz_volte_a_padiglione_mattoni=>number, strutt_orizz_volte_a_padiglione_mattoncelle=>number, strutt_orizz_volte_a_schifo=>string, strutt_orizz_volte_a_schifo_tufo=>number, strutt_orizz_volte_a_schifo_mattoni=>number, strutt_orizz_volte_a_schifo_mattoncelle=>number, strutt_orizz_solai=>string, strutt_orizz_solai_late_opera=>number, strutt_orizz_solai_late_semi=>number, strutt_orizz_solai_legno=>number, strutt_orizz_solai_ferro_tav=>number, strutt_orizz_solai_ferro_legno=>number, strutt_orizz_solai_non_noti=>number, strutt_orizz_solai_altro=>string, strutt_orizz_coperture=>string, strutt_orizz_coperture_a_tetto=>string, strutt_orizz_coperture_a_tetto_legno=>string, strutt_orizz_coperture_a_tetto_legno_lat=>string, strutt_orizz_coperture_a_tetto_cls_arm=>string, strutt_orizz_coperture_a_tetto_cls_pre=>string, strutt_orizz_coperture_a_tetto_cordolo=>string, strutt_orizz_coperture_a_volta=>string, strutt_orizz_coperture_a_volta_mur=>string, strutt_orizz_coperture_a_volta_cls_arm=>string, strutt_orizz_coperture_a_volta_cls_pre=>string, strutt_orizz_coperture_a_volta_cordolo=>string, strutt_orizz_coperture_piane=>string, strutt_orizz_coperture_piane_legno=>string, strutt_orizz_coperture_piane_legno_lat=>string, 82 Appendice Codice Flora2 strutt_orizz_coperture_piane_cls_arm=>string, strutt_orizz_coperture_piane_cls_pre=>string, strutt_orizz_coperture_piane_cordolo=>string, strutt_orizz_coperture_legg_non_portanti=>string, strutt_orizz_coperture_legg_non_portanti_lam=>string, strutt_orizz_coperture_legg_non_portanti_cem=>string, strutt_orizz_coperture_legg_non_portanti_fib=>string, strutt_orizz_coperture_legg_non_portanti_mat=>string, strutt_orizz_coperture_legg_non_portanti_cordolo=>string, strutt_orizz_scale=>string, strutt_orizz_scale_cls=>string, strutt_orizz_scale_cls_soletta=>string, strutt_orizz_scale_cls_trave=>string, strutt_orizz_scale_mur=>string, strutt_orizz_scale_mur_voltine=>string, strutt_orizz_scale_mur_altro=>string, strutt_orizz_scale_ferro_lat=>string, strutt_orizz_solai_altro_num=>number, strutt_orizz_coperture_a_tetto_ferro_lat=>string, strutt_orizz_coperture_piane_ferro_lat=>string]. edifici_dati_tecnologici3[ chiusure_esterne_mur_tufo=>string, chiusure_esterne_mat_pieni=>string, chiusure_esterne_lat=>string, chiusure_esterne_cem=>string, chiusure_esterne_pann=>string, chiusure_esterne_altro=>string, finiture_est_intonaco=>string, finiture_est_intonaco_liscio=>string, finiture_est_intonaco_spa=>string, finiture_est_intonaco_sag=>string, finiture_est_riv_ceramici=>string, finiture_est_riv_ceramici=>string, finiture_est_riv_ceramici_klinker=>string, finiture_est_riv_ceramici_altro=>string, finiture_est_facc_continue=>string, finiture_est_lastre_di_marmo=>string, finiture_est_altro=>string, finiture_est_ele_pregio_arch=>string, basamento_lastre_di_pietra=>string, basamento_blocchi_di_pietra=>string, basamento_lastre_di_marmo=>string, basamento_intonaco_lavorato=>string, basamento_altro=>string, serramenti_legno=>float, serramenti_all_preverniciato=>float, serramenti_all_anodizzato=>float, serramenti_ferro_verniciato=>float, serramenti_ferro_battuto=>float, serramenti_altro=>string, fin_interne_pav_piastrelle_gres=>number, fin_interne_pav_piastrelle_maiolica=>number, fin_interne_pav_lastre_marmo=>string, fin_interne_pav_bollettonato=>number, fin_interne_pav_lastre_di_piatre=>number, fin_interne_pav_cunetti=>number, fin_interne_pav_altro=>number, fin_interne_riv_intonaco=>number, fin_interne_riv_lastre_di_marmo=>number, fin_interne_riv_legno=>number, fin_interne_riv_linoleum=>number, fin_interne_riv_riv_ceramici=>number, fin_interne_riv_riv_plastici=>number, fin_interne_riv_altro=>string, impianti_imp_ele_ill_parti_comuni=>string, impianti_imp_ele_cancelli_moto=>string, impianti_imp_ele_impianto_di_terra=>string, impianti_imp_ele_imp_pro=>string, impianti_imp_idrico_allaccciato=>string, impianti_imp_idrico_scarico_misto=>string, impianti_imp_idrico_stazione_pompaggio=>string, 83 Appendice Codice Flora2 impianti_imp_idrico_relazione_ril=>string, impianti_imp_anti_incendio_allacciato=>string, impianti_imp_anti_incendio_serbatoio_autonomo=>string, impianti_imp_anti_incendio_estintori=>string, impianti_imp_riscaldamento_ali_caldaia=>string, impianti_imp_riscaldamento_camini_canne_fumarie=>string, altri_imp_distribuzione_gas=>string, altri_imp_idrico_di_carico=>string, altri_imp_citofonico=>string, altri_imp_ascensore=>string, altri_imp_montacarichi=>string, altri_imp_antenna_tv=>string, altri_imp_condizionamento=>string, altri_imp_antenne_tel_mobile=>string, altri_imp_altri=>string, serramenti_altro_val=>float, fin_interne_pav_lastre_marmo_val=>number, fin_interne_pav_altro_val=>number, fin_interne_pav_lastre_di_pietra_val=>number, fin_interne_pav_cunetti_val=>number, fin_interne_riv_altro_val=>number]. edifici_dati_tecnologici_prospetti[ nome=>string, carattere_unitario=>string, unif_vani=>string, unif_infissi=>string, pluv_esterne=>string, canne_fum_esterne=>string, ser_aggancio=>string, cara_unitario_piano_terra=>string, tabelle_insegne=>string, vetrine=>string, tende=>string, pensiline=>string, insegne_pubblicitarie=>string, ind_top_interesse_storico=>string, descrizione_ele_riscontrati=>string]. edifici_dati_tipologici[ tipo_edilizio_a_corte=>string, tipo_edilizio_a_schiera=>string, tipo_edilizio_a_blocco=>string, tipo_edilizio_in_linea=>string, tipo_edilizio_a_torre=>string, tipo_edilizio_a_ballatoio=>string, tipo_edilizio_a_galleria=>string, tipo_edilizio_altro=>string]. edifici_dati_urb_normativi[ var_salvaguardia_zona=>string, classificazione_tipologia_edificio=>string, reg_vincolistico_art_2=>string, reg_vincolistico_art_139=>string, reg_vincolistico_idro=>string, reg_vincolistico_archeo=>string, reg_vincolistico_altro=>string]. info_libretto[ progettista=>string, data_mese=>string, data_anno=>string, revisione=>string, imm_copertina=>string]. 84 Appendice Codice Flora2 validazione[ anagrafe=>string, sched_int=>string, strategia=>string, planning=>string, costi=>string, disagi=>string, giudizio=>string]. /*Ontologia Libretto Manutenzione OLM*/ funzioni[ id_funzioni=>number, nome_funzioni=>string, id_tipi_elementi_tecnici=>number, posizione=>string, codice_funzione=>string]. tipi_elemento_tecnico[ id_tipi_elementi_tecnici=>number, nome_tipo=>string, nome_tipo_esteso=>string, sottotipo=>string, rif_uni=>string]. tipi_materiali[ id=>number, nome_tipo=>string, id_funzioni=>number]. materiali[ id_materiali=>number, nome_material=>string]. anomalia[ nome_anomalie=>string, id=>number, id_anomalia=>number, descrizione=>string, localizzazione=>string, cause=>string, decadimenti=>string, norme=>string, path_foto=>string]. operazione[ id_operazione=>number, cod=>string, tipo_operazione=>string, nome=>string, periodicita=>number, id_anomalia=>number, categoria=>string]. specifiche_elementi_tecnici[ nome_prospetto=>string, cod_sirena_elem_tec=>string, cod_scheda_diagnosi=>string, id_funzioni=>number, id_materiali=>number]. 85 Appendice Codice Flora2 scheda_di_diagnosi[ nome_prospetto=>string, cod_scheda_diagnosi=>string, nome=>string, tipo_soluzione=>string, note=>string, immagini=>string, id_anomalia=>number]. schede_operazioni[ time_s=>string, elab_progettuali=>string, manodopera=>string, materiali=>string, attrezzature=>string, dispositivi=>string, note=>string, id_operazione=>number]. schede_interventi[ descrizione=>string, procedura_ese=>string, norme_rif=>string]. schede_controlli[ oggetto=>string, procedura_con=>string, durata=>string, procedure_pre=>string, procedure_con=>string]. soluzione_tipi_elementi_tecnici[ nome=>string, id_tipi_elementi_tecnici=>number, numero_soluzione=>number, tipo_soluzione=>string]. composizione_soluzioni[ nome=>string, tipo_soluzione=>string, id=>number]. materiali_dei_tipi[ id_materiale=>number, id_tipo_materiale=>number]. /*Ontologia database Access ODBS */ ruoli::direttore_lavori. ruoli::progettista. ruoli::coordinatore_sicurezza_progettazione. ruoli::coordinatore_sicurezza_esecuzione. ruoli::direttore_tecnico_impresa. partecipanti::tecnici. partecipanti::utenti. partecipanti::richiedenti. partecipanti[ 86 Appendice Codice Flora2 id_partecipante=>number, nominativo_partecipante=>string]. tecnici[ cap_tecnici=>string, citta_tecnici=>string, abitazione=>string, fax_tecnici=>string, mail_tecnici=>string, telefono_tecnici=>string, telefono2_tecnici=>string, titolo=>string]. utenti[ id_utente=>string, passwd=>string]. richiedenti[ cap_richiedenti=>string, titolo_richiedenti=>string, citta_richiedenti=>string, domicilio_richiedenti=>string, fax_richiedenti=>string, mail_richiedenti=>string, telefono_richiedenti=>string, telefono2_richiedenti=>string]. doc_raccomandata[ anno=>string, data=>string, id_impresa=>string, id_raccomandata=>string]. doc_riconferma[ anno=>string, riconfermato=>string, id_impresa=>string]. circoscrizioni[ id_circoscrizione=>string, nome_circ=>string]. imprese[ id=>string, ragione_sociale=>string, cap1=>string, cap2=>string, citta1=>string, citta2=>string, email=>string, partita_iva=>string, data_inserimento=>string, fax=>string, sede_legale=>string, sede_operativa=>string, telefono1=>string, telefono2=>string, raccomandata=>doc_raccomandata, riconferma=>doc_riconferma, tipo_impresa=>string, altre_info=>string ]. progetti[ anno_protocollo=>string, 87 Appendice Codice Flora2 attivato36_per_cento=>string, attivato_progetto_eurecho=>string, attivato_pubblicita_su_ponteggi=>string, avanzamento_0_50=>string, avanzamento_50_100=>string, avanzamento_fatture_1=>float, avanzamento_fatture_2=>float, certificato_LM=>string, circoscrizione_pr=>circoscrizioni, cod_sirena_prog=>string, comune_pr=>string, comunicazione_cond_inizio_lavori_a_enti=>string, comunicazione_impr_inizio_lavori_a_enti=>string, consegnato_LM=>string, contratto_conforme_a_sirena=>string, contributi_ottenuti=>float, contributo_finanziato=>float, contributo_rideterminato=>float, coordinatore_sicurezza_e_progettazione=>tecnici, coordinatore_sicurezza_esecuzione=>tecnici, data_attivazione_cantiere_effettiva=>number, data_attivazione_cantiere_prevista=>number, data_attivazione_dia=>number, data_certificato_LM=>number, data_consegna_definitiva_LM=>number, data_fine_cantiere_effettiva=>number, data_fine_canitere_prevista=>number, data_nota1_evasa=>number, data_nota2_evasa=>number, data_richiesta_contributo_a50=>number, data_richiesta_contributo_a_saldo=>number, data_scadenza_dia=>number, data_ultimo_aggiornamento=>number, delta_contributi=>float, dir_lavori=>tecnici, dir_tecnico=>tecnici, foto_edi=>foto, importo_intervento_ottenuto=>float, importo_intervento_presunto_iniziale=>float, importo_intervento_richiesto=>float, importo_intervento_rideterminato=>float, importo_preventivato_intervento_ottenuto=>float, importo_preventivato_intervento_richiesto=>float, impresa_appaltatrice=>imprese, imprese_sub_appaltatrici=>imprese, indirizzo_pr=>string, informazione_progetto_eurecho=>string, libretto_manutanzione=>string, localizzazione_lavori=>string, nota1=>string, nota2=>string, nota3=>string, nota4=>string, ottenuto_contributo_a50=>string, ottenuto_contributo_a_saldo=>string, percentuale_contributi=>float, polizze_conformi_a_schema_sirena=>string, progettista=>tecnici, prog_arch=>tecnici, /*CHIEDERE COSA SONO*/ prog_imp=>tecnici, prog_strut=>tecnici, protocollo_servizi=>string, richiedente=>richiedenti, richiesto_contributo_a50=>string, richiesto_contributo_a_saldo=>string, stato_cantiere=>string, tipologia_intervento=>string, tipologia_lavori=>string, titolo_edilizio=>string, trasmessa_copia_polizze=>string, trasmissione_copia_contratto=>string, trasmissione_verbale_inizio_lavori=>string, ultimati_lavori=>string, 88 Appendice Codice Flora2 variazione_di_spese_previste=>float, visiteCPT=>visite_cpt, visiteSIRENA=>visite_sirena]. ruoli[ id_ruolo=>string]. visite::visite_sirena. visite::visite_cpt. visite[ data_visita=>string, foto_visita=>>foto_visite, protocollo=>string, anno_protocollo=>string, nota=>string, rilevatore=>string, risultato=>string]. /*CLASSI DEL DATABASE DEI DOCUMENTI CARTACEI*/ edifici_dati::dati_cartacei. dati_cartacei::approvazione_beni_culturali. dati_cartacei::dia. dati_cartacei::prospetto. dati_cartacei::computo_estimativo. dati_cartacei::relazione_tecnica. dati_cartacei::designazione_lavori. computo_estimativo [ oggetto_computo=>string, committente_computo=>string, data_computo=>string, tecnico_computo=>string]. approvazione_beni_culturali[ id_approvazione=>string, url_approvazione=>string]. dia [ id_dia=>string, url_dia=>string]. designazione_lavori [ data_des=>string, id_designazione=>string, num_ordinativo_des=>number, categoria_des=>string, lavoro_des=>string, unita_misura_des=>string]. prospetto [ id_prospetto=>string, id_designazione=>string, nome_pros=>string, par_ug_pros=>number, lunghezza_pros=>number, larghezza_pros=>number, h_peso_pros=>number, quantita_pros=>number, importo_unitario_pros=>number ]. 89 Appendice Codice Flora2 relazione_tecnica[ id_relazione_tec=>string, url_relazione_tec=>string]. /*---------------------------------------------------------------------------------------------------------------*/ /*INSERIMENTO DATI DATABASE DEI FATTI*/ B:planning[ nome->A, cod_sirena->B, cod->C, data->D, tipo_planning->E]:-pred_planning(A,B,C,D,E)@prolog(). C:anomalia[nome_anomalie->A, id->B, id_anomalia->C, descrizione->D, localizzazione->E, cause->F, decadimenti->G, norme->H, path_foto->I]:-pred_anomalie(A,B,C,D,E,F,G,H,I)@prolog(). CODSIRENA:edifici_dati_generali[ cod_sirena->CODSIRENA, via->A, accessi->B, denominazione->C, circoscriz->D, tipo->E, n_fabbricati->F, nomeprop->G, cognomeprop->H, qualifica->K, domicilio->L, tel->M, licenza->N, cal_strut->T, collaudatore->W, prog_arch->P, prog_imp->R, prog_strut->S, n_scale->Z, certificato_ag->O, impresa_esecutrice->U, direttore_lavori->V, centro_storico->CENTRO_STORICO, comune->COMUNE, possibile_interesse_arch_tec->POSSIBILE_INTERESSE, riserva_20_lavori_statici->RISERVA20, tipologia_edificio->PROPRIETA, vincolato_sensi_1098->VINCOLATO1098, vincolato_sensi_1497->VINCOLATO1497]:pred_progetti(_,Protocollo,Anno,_,_,_,PROPRIETA,_,COMUNE,_,POSSIBILE_INTERESSE,VINCOLATO1098,VIN COLATO1497,RISERVA20,CENTRO_STORICO,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_ ,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_)@prolog(), crea_cod_sir(Protocollo,Anno,CODSIRENA)@prolog(), pred_edifici_dati_generali(A,B,C,D,E,F,G,H,K,L,M,N,O,P,R,S,T,U,V,W,CODSIRENA,Z)@prolog(). D:edifici_dati_catastali[ foglio->A, sezione->B, p_lla->C, 90 Appendice Codice Flora2 cod_sirena->D]:-pred_edifici_dati_catastali(A,B,C,D)@prolog(). N:edifici_dati_storici[epoca_costruzione->A, tipo_epoca_costruzione->B, scheda_post_sisma->C, num_schede_post_sisma->D, interventi_eseguiti->E, int_provvisionali_spicconatura->F, int_provvisionali_puntellamento->G, int_provvisionali_altro->H, data_verbale_diffida->I, descrizione_verbale_diffida->L, cep_verbale_diffida->M, cod_sirena->N]:-pred_edifici_dati_storici(A,B,C,D,E,F,G,H,I,L,M,N)@prolog(). Z:edifici_dati_quantitativi[area_sedime->A, altezza_max_edificio->B, num_piani_fuori_terra->C, n_min->D, n_max->E, num_piani_entro_terra->F, n_scale->G, vol_entro_terra->H, vol_fuori_terra->I, cantinole->L, parch_coperti->M, parch_scoperti->N, spazi_comuni->O, loc_caldaia->P, stenditoi->Q, giardini->R, terrazzi->S, altrodq->T, destinazione_uni_immobiliari->U, sup_tot->V, sup_edi->W, area_a_verde->X, sup_scoperte->Y, cod_sirena->Z, altrodqmq->A1]:pred_edifici_dati_quantitativi(A,B,C,D,E,F,G,H,I,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A1)@prolog(). K:edifici_inq_territoriale[ cav_sotterranee->A, scheda_cav_sotterranee->B, num_vie_accesso->C, acces_text->D, int_traffico->E, rapp_altri_edifici->F, n_lati->G, fabb_stat_autonomo->H, cod_sirena->K]:-pred_edifici_inq_territoriali(A,B,C,D,E,F,G,H,K)@prolog(). E1:edifici_dati_tecnologici1[ fondazioni_profonde->A, fondazioni_su_pali->B, fondazioni_superficiali->C, fondazioni_superficiali_plinti_iso->D, fondazioni_superficiali_plinti_coll->E, fondazioni_superficiali_travi->F, fondazioni_superficiali_platea->G, fondazioni_superficiali_continue_tufo->H, fondazioni_superficiali_continue_pietrame->I, fondazioni_prof_piano_di_posa->K, strutt_vert_muratura->L, strutt_vert_muratura_tufo->M, strutt_vert_muratura_tufo_con_irre->N, strutt_vert_muratura_tufo_con_re->O, strutt_vert_muratura_tufo_pietre_seg->P, 91 Appendice Codice Flora2 strutt_vert_muratura_tufo_mat_pieni->Q, strutt_vert_muratura_listata->R, strutt_vert_muratura_matt_pieni->S, strutt_vert_muratura_pietrame->T, strutt_vert_muratura_cordoli->U, strutt_vert_muratura_catene->V, strutt_vert_cong_cementizio_armato->W, strutt_vert_cong_cementizio_armato_setti->Y, strutt_vert_cong_cementizio_armato_telaio->Z, strutt_vert_mista->A1, strutt_vert_mista_vert->B1, strutt_vert_mista_orizz->C1, strutt_vert_acciaio->D1, cod_sirena->E1]:pred_edifici_dati_tecnologici1(A,B,C,D,E,F,G,H,I,K,L,M,N,O,P,Q,R,S,T,U,V,W,Y,Z,A1,B1,C1,D1,E1)@prolog() . O2:edifici_dati_tecnologici2[ strutt_orizz_volte->A, strutt_orizz_volte_a_botte->B, strutt_orizz_volte_a_botte_tufo->C, strutt_orizz_volte_a_botte_mattoni->D, strutt_orizz_volte_a_botte_mattoncelle->E, strutt_orizz_volte_a_vela->F, strutt_orizz_volte_a_vela_tufo->G, strutt_orizz_volte_a_vela_mattoni->H, strutt_orizz_volte_a_vela_mattoncelle->I, strutt_orizz_volte_a_crociera->K, strutt_orizz_volte_a_crociera_tufo->L, strutt_orizz_volte_a_crociera_mattoni->M, strutt_orizz_volte_a_crociera_mattoncelle->N, strutt_orizz_volte_a_padiglione->O, strutt_orizz_volte_a_padiglione_tufo->P, strutt_orizz_volte_a_padiglione_mattoni->Q, strutt_orizz_volte_a_padiglione_mattoncelle->R, strutt_orizz_volte_a_schifo->S, strutt_orizz_volte_a_schifo_tufo->T, strutt_orizz_volte_a_schifo_mattoni->U, strutt_orizz_volte_a_schifo_mattoncelle->V, strutt_orizz_solai->W, strutt_orizz_solai_late_opera->Y, strutt_orizz_solai_late_semi->Z, strutt_orizz_solai_legno->A1, strutt_orizz_solai_ferro_tav->B1, strutt_orizz_solai_ferro_legno->C1, strutt_orizz_solai_non_noti->D1, strutt_orizz_solai_altro->E1, strutt_orizz_coperture->F1, strutt_orizz_coperture_a_tetto->G1, strutt_orizz_coperture_a_tetto_legno->H1, strutt_orizz_coperture_a_tetto_legno_lat->I1, strutt_orizz_coperture_a_tetto_cls_arm->K1, strutt_orizz_coperture_a_tetto_cls_pre->L1, strutt_orizz_coperture_a_tetto_cordolo->M1, strutt_orizz_coperture_a_volta->N1, strutt_orizz_coperture_a_volta_mur->O1, strutt_orizz_coperture_a_volta_cls_arm->P1, strutt_orizz_coperture_a_volta_cls_pre->Q1, strutt_orizz_coperture_a_volta_cordolo->R1, strutt_orizz_coperture_piane->S1, strutt_orizz_coperture_piane_legno->T1, strutt_orizz_coperture_piane_legno_lat->U1, strutt_orizz_coperture_piane_cls_arm->V1, strutt_orizz_coperture_piane_cls_pre->W1, strutt_orizz_coperture_piane_cordolo->Y1, strutt_orizz_coperture_legg_non_portanti->Z1, strutt_orizz_coperture_legg_non_portanti_lam->A2, strutt_orizz_coperture_legg_non_portanti_cem->B2, strutt_orizz_coperture_legg_non_portanti_fib->C2, strutt_orizz_coperture_legg_non_portanti_mat->D2, strutt_orizz_coperture_legg_non_portanti_cordolo->E2, strutt_orizz_scale->F2, 92 Appendice Codice Flora2 strutt_orizz_scale_cls->G2, strutt_orizz_scale_cls_soletta->H2, strutt_orizz_scale_cls_trave->I2, strutt_orizz_scale_mur->K2, strutt_orizz_scale_mur_voltine->L2, strutt_orizz_scale_mur_altro->M2, strutt_orizz_scale_ferro_lat->N2, cod_sirena->O2, strutt_orizz_solai_altro_num->P2, strutt_orizz_coperture_a_tetto_ferro_lat->Q2, strutt_orizz_coperture_piane_ferro_lat->R2]:pred_edifici_dati_tecnologici2(A,B,C,D,E,F,G,H,I,K,L,M,N,O,P,Q,R,S,T,U,V,W,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1, I1,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2,H2,I2,K2,L2,M2,N2,O2,P2,Q2,R2)@pro log(). S2:edifici_dati_tecnologici3[ chiusure_esterne_mur_tufo->A, chiusure_esterne_mat_pieni->B, chiusure_esterne_lat->C, chiusure_esterne_cem->D, chiusure_esterne_pann->E, chiusure_esterne_altro->F, finiture_est_intonaco->G, finiture_est_intonaco_liscio->H, finiture_est_intonaco_spa->I, finiture_est_intonaco_sag->K, finiture_est_riv_ceramici->L, finiture_est_riv_ceramici_klinker->N, finiture_est_riv_ceramici_altro->O, finiture_est_facc_continue->P, finiture_est_lastre_di_marmo->Q, finiture_est_altro->R, finiture_est_ele_pregio_arch->S, basamento_lastre_di_pietra->T, basamento_blocchi_di_pietra->U, basamento_lastre_di_marmo->V, basamento_intonaco_lavorato->W, basamento_altro->Y, serramenti_legno->Z, serramenti_all_preverniciato->A1, serramenti_all_anodizzato->B1, serramenti_ferro_verniciato->C1, serramenti_ferro_battuto->D1, serramenti_altro->E1, fin_interne_pav_piastrelle_gres->F1, fin_interne_pav_piastrelle_maiolica->G1, fin_interne_pav_lastre_marmo->H1, fin_interne_pav_bollettonato->I1, fin_interne_pav_lastre_di_piatre->K1, fin_interne_pav_cunetti->L1, fin_interne_pav_altro->M1, fin_interne_riv_intonaco->N1, fin_interne_riv_lastre_di_marmo->O1, fin_interne_riv_legno->P1, fin_interne_riv_linoleum->Q1, fin_interne_riv_riv_ceramici->R1, fin_interne_riv_riv_plastici->S1, fin_interne_riv_altro->T1, impianti_imp_ele_ill_parti_comuni->U1, impianti_imp_ele_cancelli_moto->V1, impianti_imp_ele_impianto_di_terra->W1, impianti_imp_ele_imp_pro->Y1, impianti_imp_idrico_allaccciato->Z1, impianti_imp_idrico_scarico_misto->A2, impianti_imp_idrico_stazione_pompaggio->B2, impianti_imp_idrico_relazione_ril->C2, impianti_imp_anti_incendio_allacciato->D2, impianti_imp_anti_incendio_serbatoio_autonomo->E2, impianti_imp_anti_incendio_estintori->F2, impianti_imp_riscaldamento_ali_caldaia->G2, impianti_imp_riscaldamento_camini_canne_fumarie->H2, 93 Appendice Codice Flora2 altri_imp_distribuzione_gas->I2, altri_imp_idrico_di_carico->K2, altri_imp_citofonico->L2, altri_imp_ascensore->M2, altri_imp_montacarichi->N2, altri_imp_antenna_tv->O2, altri_imp_condizionamento->P2, altri_imp_antenne_tel_mobile->Q2, altri_imp_altri->R2, cod_sirena->S2, serramenti_altro_val->T2, fin_interne_pav_lastre_marmo_val->U2, fin_interne_pav_altro_val->V2, fin_interne_pav_lastre_di_pietra_val->W2, fin_interne_pav_cunetti_val->Y2, fin_interne_riv_altro_val->Z2, ciusurre_esterne_altro2->A3 ]:pred_edifici_dati_tecnologici3(A,B,C,D,E,F,G,H,I,K,L,N,O,P,Q,R,S,T,U,V,W,Y,Z,A1,B1,C1,D1,E1,F1,G1,H1,I1 ,K1,L1,M1,N1,O1,P1,Q1,R1,S1,T1,U1,V1,W1,Y1,Z1,A2,B2,C2,D2,E2,F2,G2,H2,I2,K2,L2,M2,N2,O2,P2,Q2,R2,S2,T2, V2,U2,W2,Y2,Z2,A3)@prolog(). Q:edifici_dati_tecnologici_prospetti[ nome->A, carattere_unitario->B, unif_vani->C, unif_infissi->D, pluv_esterne->E, canne_fum_esterne->F, ser_aggancio->G, cara_unitario_piano_terra->H, tabelle_insegne->I, vetrine->K, tende->L, pensiline->M, insegne_pubblicitarie->N, ind_top_interesse_storico->O, descrizione_ele_riscontrati->P, cod_sirena->Q]:pred_edifici_dati_tecnologici_prospetti(A,B,C,D,E,F,G,H,I,K,L,M,N,O,P,Q)@prolog(). I:edifici_dati_tipologici[ tipo_edilizio_a_corte->A, tipo_edilizio_a_schiera->B, tipo_edilizio_a_blocco->C, tipo_edilizio_in_linea->D, tipo_edilizio_a_torre->E, tipo_edilizio_a_ballatoio->F, tipo_edilizio_a_galleria->G, tipo_edilizio_altro->H, cod_sirena->I]:-pred_edifici_dati_tipologici(A,B,C,D,E,F,G,H,I)@prolog(). H:edifici_dati_urb_normativi[ var_salvaguardia_zona->A, classificazione_tipologia_edificio->B, reg_vincolistico_art_2->C, reg_vincolistico_art_139->D, reg_vincolistico_idro->E, reg_vincolistico_archeo->F, reg_vincolistico_altro->G, cod_sirena->H]:-pred_edifici_dati_urb_normativi(A,B,C,D,E,F,G,H)@prolog(). A:info_libretto[ cod_sirena->A, progettista->B, data_mese=>C, data_anno=>D, revisione=>E, imm_copertina->F]:-pred_infolibretto(A,B,C,D,E,F)@prolog(). 94 Appendice Codice Flora2 H:validazione[ anagrafe->A, sched_int->B, strategia->C, planning->D, costi->E, disagi->F, giudizio->G, cod_sirena->H]:-pred_validazione(A,B,C,D,E,F,G,H)@prolog(). A:funzioni[ id_funzioni->A, nome_funzioni->B, id_tipi_elementi_tecnici->C, posizione->D, codice_funzione->E]:-pred_funzioni(A,B,C,D,E)@prolog(). A:tipi_elemento_tecnico[ id_tipi_elementi_tecnici->A, nome_tipo->B, nome_tipo_esteso->C, sottotipo->D, rif_uni->E]:-pred_tipi_elementi_tecnici(A,B,C,D,E)@prolog(). A:tipi_materiali[ id->A, nome_tipo->B, id_funzioni->C]:-pred_tipi_materiali(A,B,C)@prolog(). A:materiali[ id_materiali->A, nome_material->B]:-pred_materiali(A,B)@prolog(). A:operazione[ id_operazione->A, cod->B, tipo_operazione->C, nome->D, periodicita->E, id_anomalia->F, categoria->G]:-pred_operazioni(A,B,C,D,E,F,G)@prolog(). B:specifiche_elementi_tecnici[ nome_prospetto->A, cod_sirena_elem_tec->B, cod_scheda_diagnosi->C, id_funzioni->D, id_materiali->E]:-pred_specifiche_elementi_tecnici(A,B,C,D,E)@prolog(). B:scheda_di_diagnosi[ nome_prospetto->A, cod_sirena->B, cod_scheda_diagnosi->C, nome->D, tipo_soluzione->E, note->F, immagini->G, id_anomalia->H]:-pred_schede_diagnosi(A,B,C,D,E,F,G,H)@prolog(). 95 Appendice Codice Flora2 [A,I]:schede_operazioni[ cod_sirena->A, time_s->B, elab_progettuali->C, manodopera->D, materiali->E, attrezzature->F, dispositivi->G, note->H, id_operazione->I]:-pred_schede_operazioni(A,B,C,D,E,F,G,H,I)@prolog(). [A,I]:schede_interventi[ cod_sirena->A, time_s->B, elab_progettuali->C, manodopera->D, materiali->E, attrezzature->F, dispositivi->G, note->H, id_operazione->I, descrizione->L, procedura_ese->M, norme_rif->N]:-pred_schede_interventi(A,B,C,D,E,F,G,H,I,L,M,N)@prolog(). [A,I]:schede_controlli[ cod_sirena->A, time_s->B, elab_progettuali->C, manodopera->D, materiali->E, attrezzature->F, dispositivi->G, note->H, id_operazione->I, oggetto->L, procedura_con->M, durata->N, procedure_pre->O, procedure_con->P]:-pred_schede_controlli(A,B,C,D,E,F,G,H,I,L,M,N,O,P)@prolog(). A:soluzione_tipi_elementi_tecnici[ nome->A, id_tipi_elementi_tecnici->B, numero_soluzione->C, tipo_soluzione->D]:-pred_soluzione_tipi_elementi_tecnici(A,B,C,D)@prolog(). [A,C]:composizione_soluzioni[ nome->A, tipo_soluzione->B, id->C]:-pred_composizione_soluzioni(A,B,C)@prolog(). /*----------------------------------------DATABASE ACCESS------------------------------------------*/ CODICE:tecnici[ id_partecipante->CODICE, nominativo_partecipante->NOMINATIVO, cap_tecnici->CAP, citta_tecnici->CITTA, abitazione->DOMICILIO, fax_tecnici->FAX, mail_tecnici->MAIL, telefono_tecnici->TELEFONO, telefono2_tecnici->TELEFONO2, titolo->TITOLO]:pred_tecnici(CODICE,TITOLO,NOMINATIVO,DOMICILIO,CITTA,CAP,TELEFONO,TELEFONO2,FAX,MAIL)@prolog(). 96 Appendice Codice Flora2 CODICE:utenti[ id_partecipante->CODICE, nominativo_partecipante->SOGGETTO, id_utente->ID, passwd->PASS]:-pred_utenti(CODICE,ID,PASS,SOGGETTO)@prolog(). CODICE:richiedenti[ id_partecipante->CODICE, nominativo_partecipante->NOMINATIVO, cap_richiedenti->CAP, titolo_richiedenti->TIPO, citta_richiedenti->CITTA, domicilio_richiedenti->DOMICILIO, fax_richiedenti->FAX, mail_richiedenti->MAIL, telefono_richiedenti->TELEFONO, telefono2_richiedenti->TELEFONO2]:pred_richiedenti(CODICE,TIPO,NOMINATIVO,DOMICILIO,CITTA,CAP,TELEFONO,TELEFONO2,FAX,MAIL,_)@prolog(). CODICE:circoscrizioni[ id_circoscrizione->CODICE, nome_circ->CIRCOSCRIZIONE]:-pred_circoscrizione(CODICE,CIRCOSCRIZIONE)@prolog(). CODICE:imprese[ id->CODICE, ragione_sociale->RAGIONE_SOCIALE, cap1->CAP, cap2->CAP1, citta1->CITTA, citta2->CITTA1, email->EMAIL, partita_iva->PARTITA_IVA, data_inserimento->DATA_INSERIMENTO, fax->FAX, sede_legale->SEDE_LEGALE, sede_operativa->SEDE_OPERATIVA, telefono1->TELEFONO, telefono2->TELEFONO2, /*raccomandata->doc_raccomandata,*/ /*riconferma->doc_riconferma,*/ tipo_impresa->TIPO_IMPRESA, altre_info->ALTRE_INFORMAZIONI ]:pred_imprese(CODICE,RAGIONE_SOCIALE,TIPO_IMPRESA,SEDE_LEGALE,CAP,CITTA,SEDE_OPERATIVA,CAP1,CITTA1,TELEF ONO,TELEFONO2,FAX,EMAIL,PARTITA_IVA,ALTRE_INFORMAZIONI,DATA_INSERIMENTO)@prolog(). CODSIRENA:progetti[ anno_protocollo->Anno_Protocollo, attivato36_per_cento->ATTIVATO_36, attivato_progetto_eurecho->ATTIVATO_PROGETTO_EURECHO, attivato_pubblicita_su_ponteggi->ATTIVATA_PUBBLICITA_PONTEGGI, avanzamento_0_50->AVANZAMENTO_0_50, avanzamento_50_100->AVANZAMENTO_50_100, avanzamento_fatture_1->AVANZAMENTO_FATTURE, avanzamento_fatture_2->AVANZAMENTO_FATTURE2, certificato_LM->CERTIFICATO_LIBRETTO_MANUTENZIONE, circoscrizione_pr->CIRC, cod_sirena_prog->CODSIRENA, comune_pr->COMUNE, comunicazione_cond_inizio_lavori_a_enti->COMUNICATO_DA_CONDOMINIO_INIZIO_LAVORI_A_ENTI, comunicazione_impr_inizio_lavori_a_enti->COMUNICATO_DA_IMPRESE_INIZIO_LAVORI_A_ENTI, consegnato_LM->CONSEGNATO_LIBRETTO_MANUTENZIONE, contratto_conforme_a_sirena->CONTRATTO_CONFORME_A_SIRENA, contributi_ottenuti->CONTRIBUTI_OTTENUTI, 97 Appendice Codice Flora2 contributo_finanziato->CONTRIBUTO_FINANZIATO, contributo_rideterminato->CONTRIBUTO_RIDETERMINATO, coordinatore_sicurezza_e_progettazione->CODICE_coordinatore_sicurezza_prog, coordinatore_sicurezza_esecuzione->CODICE_coordinatore_sicurezza_esec, data_attivazione_cantiere_effettiva->DATA_ATTIVAZIONE_CANTIERE_EFFETTIVA, data_attivazione_cantiere_prevista->DATA_ATTIVAZIONE_CANTIERE_PREVISTA, data_attivazione_dia->DATA_ATTIVAZIONE_DIA, data_certificato_LM->DATA_CERTIFICATO_LM, data_consegna_definitiva_LM->DATA_CONSEGNA_DEFINITIVA_LM, data_fine_cantiere_effettiva->DATA_FINE_CANTIERE_EFFETTIVA, data_fine_canitere_prevista->DATA_FINE_CANTIERE_PREVISTA, data_nota1_evasa->DATA_NOTA1_EVASA, data_nota2_evasa->DATA_NOTA2_EVASA, data_richiesta_contributo_a50->DATA_RICHIESTO_CONTRIBUTO_A_50, data_richiesta_contributo_a_saldo->DATA_RICHIESTO_CONTRIBUTO_A_SALDO, data_scadenza_dia->DATA_SCADENZA_DIA, data_ultimo_aggiornamento->Aggiornamento, delta_contributi->DELTA_CONTRIBUTI, dir_lavori>CODICE_DIRETTORE_LAVORI, dir_tecnico->CODICE_DIRETTORE_TECNICO, foto_edi->FOTO, importo_intervento_ottenuto->IMPORTO_INTERVENTO_OTTENUTO, importo_intervento_presunto_iniziale->IMPORTO_INTERVENTO_PRESUNTO_INIZIALE, importo_intervento_richiesto->IMPORTO_INTERVENTO_RICHIESTO, importo_intervento_rideterminato->IMPORTO_INTERVENTO_RIDETERMINATO, importo_preventivato_intervento_ottenuto->IMPORTO_INTERVENTO_PREVENTIVATO_OTTENUTO, importo_preventivato_intervento_richiesto->IMPORTO_INTERVENTO_PREVENTIVATO_RICHIESTO, impresa_appaltatrice->CODICE_IMPRESA_APPALTATRICE, imprese_sub_appaltatrici->IMPRESE_SUBAPPALTATRICI, indirizzo_pr->INDIRIZ, informazione_progetto_eurecho->INFORMAZIONI_PROGETTO_EURECHO, libretto_manutanzione->LIBRETTO_MANUTENZIONE, /*VERIFICARE PERCHE' ESISTONO PIU' VOCI SU LIBRETTO DI MANUTANZIONE*/ localizzazione_lavori->LOCALIZZAZIONE_LAVORI, nota1->NOTA1, nota2->NOTA2, nota3->NOTA3, nota4->NOTA4, ottenuto_contributo_a50->OTTENUTO_CONTRIBUTO_A_50, ottenuto_contributo_a_saldo->OTTENUTO_CONTRIBUTO_A_SALDO, percentuale_contributi->PERCENTUALE_CONTRIBUTI, polizze_conformi_a_schema_sirena->POLIZZE_CONFORMI_SCHEMA_SIRENA, progettista->CODICE_PROGETTISTA, protocollo_servizi->Protocollo_servizio, richiedente->CODICE_RICHIEDENTE, richiesto_contributo_a50->RICHIESTO_CONTRIBUTO_A_50, richiesto_contributo_a_saldo->RICHIESTO_CONTRIBUTO_A_SALDO, stato_cantiere->STATO_CANTIERE, tipologia_intervento->TIPOLOGIA_INTERVENTO, /*CONTROLLARE SE CORRISPONDE A QUALCHE ALTRA VOCE*/ tipologia_lavori->TIPOLOGIA_LAVORI, titolo_edilizio->TITOLO_EDILIZIO, trasmessa_copia_polizze->TRASMESSA_COPIA_POLIZZE, trasmissione_copia_contratto->TRASMISSIONE_COPIA_CONTRATTO, trasmissione_verbale_inizio_lavori->TRASMISSIONE_VERBALE_O_INIZIO_LAVORI, ultimati_lavori=>ULTIMATO_LAVORI, variazione_di_spese_previste->VARIAZIONI_SPESA_PREVISTE, visiteCPT=>visite_cpt, visiteSIRENA=>visite_sirena]:pred_progetti(ID,Protocollo_servizio,Anno_Protocollo,_,_,Aggiornamento,_,INDIRIZ,COMUNE,CIRC,_,_,_,_,_, CODICE_RICHIEDENTE,CODICE_PROGETTISTA,CODICE_DIRETTORE_LAVORI,CODICE_coordinatore_sicurezza_prog,CODICE _coordinatore_sicurezza_esec,CODICE_IMPRESA_APPALTATRICE,IMPRESE_SUBAPPALTATRICI,CODICE_DIRETTORE_TECNI CO,TITOLO_EDILIZIO,DATA_ATTIVAZIONE_DIA,DATA_SCADENZA_DIA,TIPOLOGIA_INTERVENTO,LOCALIZZAZIONE_LAVORI,TI POLOGIA_LAVORI,AVANZAMENTO_FATTURE,DATA_NOTA1_EVASA,DATA_NOTA2_EVASA,AVANZAMENTO_FATTURE2,CONTRIBUTO_FI NANZIATO,IMPORTO_INTERVENTO_PREVENTIVATO_RICHIESTO,DATA_RICHIESTO_CONTRIBUTO_A_50,IMPORTO_INTERVENTO_PR EVENTIVATO_OTTENUTO,IMPORTO_INTERVENTO_RIDETERMINATO,VARIAZIONI_SPESA_PREVISTE,CONTRIBUTO_RIDETERMINATO ,IMPORTO_INTERVENTO_PRESUNTO_INIZIALE,LIBRETTO_MANUTENZIONE,CONTRIBUTI_OTTENUTI,DELTA_CONTRIBUTI,PERCEN TUALE_CONTRIBUTI,IMPORTO_INTERVENTO_RICHIESTO,DATA_RICHIESTO_CONTRIBUTO_A_SALDO,IMPORTO_INTERVENTO_OTTE NUTO,DATA_ATTIVAZIONE_CANTIERE_PREVISTA,DATA_FINE_CANTIERE_PREVISTA,DATA_ATTIVAZIONE_CANTIERE_EFFETTIVA ,DATA_FINE_CANTIERE_EFFETTIVA,STATO_CANTIERE,TRASMISSIONE_VERBALE_O_INIZIO_LAVORI,TRASMISSIONE_COPIA_CO NTRATTO,CONTRATTO_CONFORME_A_SIRENA,TRASMESSA_COPIA_POLIZZE,POLIZZE_CONFORMI_SCHEMA_SIRENA,COMUNICATO_D A_CONDOMINIO_INIZIO_LAVORI_A_ENTI,COMUNICATO_DA_IMPRESE_INIZIO_LAVORI_A_ENTI,_,ULTIMA_DATA_VISITA_SIREN A,_,ULTIMA_DATA_VISITA_CPT,ATTIVATO_PROGETTO_EURECHO,INFORMAZIONI_PROGETTO_EURECHO,ATTIVATO_36,ATTIVATA _PUBBLICITA_PONTEGGI,AVANZAMENTO_0_50,ULTIMATO_LAVORI,RICHIESTO_CONTRIBUTO_A_50,OTTENUTO_CONTRIBUTO_A_5 98 Appendice Codice Flora2 0,AVANZAMENTO_50_100,RICHIESTO_CONTRIBUTO_A_SALDO,OTTENUTO_CONTRIBUTO_A_SALDO,CONSEGNATO_LIBRETTO_MANUT ENZIONE,DATA_CONSEGNA_DEFINITIVA_LM,CERTIFICATO_LIBRETTO_MANUTENZIONE,DATA_CERTIFICATO_LM,NOTA1,NOTA2,N OTA3,NOTA4,FOTO)@prolog(), crea_cod_sir(Protocollo_servizio,Anno_Protocollo,CODSIRENA)@prolog(). [Protocollo_servizio,Data]:visite_sirena[ data_visita->Data, foto_visita->FOTO, protocollo->Protocollo_servizio, anno_protocollo->Anno_Protocollo, nota->Nota, rilevatore->Rilevatore, risultato->Risultato]:pred_visiteSIR(Protocollo_servizio,Anno_Protocollo,_,Data,Rilevatore,Risultato,Nota,FOTO)@prolog(). FOTO:foto_visite[ path_foto->FOTO]:-pred_visiteSIR(_,_,_,_,_,_,_,FOTO)@prolog(). [Protocollo_servizio,Data]:visite_cpt[ data_visita->Data, foto_visita->FOTO, protocollo->Protocollo_servizio, anno_protocollo->Anno_Protocollo, nota->Nota, rilevatore->Rilevatore, risultato->Risultato]:pred_visiteCPT(Protocollo_servizio,Anno_Protocollo,_,Data,Rilevatore,Risultato,Nota,FOTO)@prolog(). [A,B]:materiali_dei_tipi[ id_materiale->A, id_tipo_materiale->B]:-pred_materiali_dei_tipi(A,B)@prolog(). /*--------------------------------------------DATABASE ACCESS DOC--------------------------------------------------*/ [A,D]:computo_estimativo [ cod_sirena->A, oggetto_computo->B, committente_computo->C, data_computo->D, tecnico_computo->E]:-pred_computo(A,B,C,D,E)@prolog(). B:approvazione_beni_culturali[ cod_sirena->A, id_app->B, url_dia->C]:-pred_approvazione_beni(A,B,C)@prolog(). B:dia [ cod_sirena->A, id->B, url_dia->C ]:-pred_dia(A,B,C)@prolog(). C:designazione_lavori [ cod_sirena->A, data_des->B, id_designazione->C, num_ordinativo_des->D, categoria_des->E, lavoro_des->F, unita_misura_des->G]:-pred_designazione(A,B,C,D,E,F,G)@prolog(). A:prospetto [ id_prospetto->A, 99 Appendice Codice Flora2 id_designazione_pros->B, nome_pros->C, par_ug_pros->D, lunghezza_pros->E, larghezza_pros->F, h_peso_pros->G, quantita_pros->H, importo_unitario_pros->I, importo_totale_pros->L]:-pred_prospetto(A,B,C,D,E,F,G,H,I,L)@prolog(). B:relazione_tecnica[ cod_sirena->A, id_rel->B, url_rel->C]:-pred_relazione_tecnica(A,B,C)@prolog(). 100 Appendice Codice Java Codice Java import sirena.interfaccia.MainFrame; public class Sirena { public static void main(String[] args) { MainFrame m; m = new MainFrame(); } } /* PACKAGE INTERFACCIA */ package sirena.interfaccia; import java.awt.*; import javax.swing.*; import com.ontotext.flora2.XSBFlora; import java.awt.Font; import java.awt.BorderLayout; import javax.swing.BorderFactory; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class MainFrame extends JFrame { JPanel display = new JPanel(); JProgressBar barraProgresso = new JProgressBar(); JLabel jLabel1 = new JLabel(); JButton jButton1 = new JButton(); BorderLayout borderLayout1 = new BorderLayout(); XSBFlora flora; Panello1 pan; GridBagLayout gridBagLayout1 = new GridBagLayout(); public MainFrame() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); jbInit(); } catch (Exception exception) { exception.printStackTrace(); } } private void jbInit() throws Exception { XSBFlora.sFloraRootDir = "C:\\sirena\\flora2"; flora = new XSBFlora("C:\\sirena\\XSB"); Object[] bindings = null; getContentPane().setLayout(borderLayout1); this.setSize(800,600); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLocale(new java.util.Locale("it", "", "")); this.setResizable(true); this.setTitle("SIRENA DB"); this.setVisible(true); barraProgresso.setStringPainted(true); jLabel1.setFont(new java.awt.Font("Arial", Font.PLAIN, 20)); jLabel1.setHorizontalAlignment(SwingConstants.CENTER); jLabel1.setText("CARICAMENTO DATI"); jButton1.setBorder(BorderFactory.createEtchedBorder()); jButton1.setText("OK"); jButton1.addActionListener(new MainFrame_jButton1_actionAdapter(this)); display.setLayout(gridBagLayout1); this.getContentPane().add(display, java.awt.BorderLayout.CENTER); display.add(jButton1, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(19, 350, 245, 356), 61, 17)); jButton1.setEnabled(false); 101 Appendice Codice Java display.add(barraProgresso, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(6, 250, 0, 250), 200, 2)); display.add(jLabel1, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(245, 250, 0, 250), 300, 39)); this.setVisible(true); flora.FLogicCommand("[loader]."); barraProgresso.setValue(30); flora.FLogicCommand("[sirena]."); barraProgresso.setValue(100); jButton1.setEnabled(true); this.setVisible(true); } public void jButton1_actionPerformed(ActionEvent e) { display.removeAll(); this.repaint(); this.setVisible(true); pan = new Panello1(this,display,flora); } } class MainFrame_jButton1_actionAdapter implements ActionListener { private MainFrame adaptee; MainFrame_jButton1_actionAdapter(MainFrame adaptee) { this.adaptee = adaptee; } } public void actionPerformed(ActionEvent e) { adaptee.jButton1_actionPerformed(e); } package sirena.interfaccia; import javax.swing.*; import java.awt.BorderLayout; import java.awt.Font; import java.awt.GridBagLayout; import java.awt.*; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class AvvisoEccezione extends JDialog { String testo; public AvvisoEccezione(JFrame padre,String t) { super(padre,"ERRORE",true); this.setSize(397,191); testo = t; try { jbInit(); } catch (Exception ex) { ex.printStackTrace(); } } private void jbInit() throws Exception { this.getContentPane().setLayout(gridBagLayout1); this.setDefaultCloseOperation(javax.swing.WindowConstants. DISPOSE_ON_CLOSE); jButton1.setText("CHIUDI"); jButton1.addActionListener(new AvvisoEccezione_jButton1_actionAdapter(this)); this.getContentPane().add(jScrollPane1, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); this.getContentPane().add(jButton1, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); 102 Appendice Codice Java jScrollPane1.getViewport().add(jTextArea1); jTextArea1.setMinimumSize(new Dimension(200, 100)); jTextArea1.setPreferredSize(new Dimension(300, 100)); jTextArea1.setEditable(false); jScrollPane1.setMinimumSize(new Dimension(200, 100)); jScrollPane1.setPreferredSize(new Dimension(300, 100)); jTextArea1.setText(testo); this.setVisible(true); } } GridBagLayout gridBagLayout1 = new GridBagLayout(); JScrollPane jScrollPane1 = new JScrollPane(); JTextArea jTextArea1 = new JTextArea(); JButton jButton1 = new JButton(); public void jButton1_actionPerformed(ActionEvent e) { this.dispose(); } class AvvisoEccezione_jButton1_actionAdapter implements ActionListener { private AvvisoEccezione adaptee; AvvisoEccezione_jButton1_actionAdapter(AvvisoEccezione adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.jButton1_actionPerformed(e); } } package sirena.interfaccia; import import import import import import import javax.swing.*; java.awt.BorderLayout; com.borland.jbcl.layout.XYLayout; com.borland.jbcl.layout.*; java.awt.Font; java.awt.event.ActionEvent; java.awt.event.ActionListener; public class AvvisoSelezione extends JDialog { XYLayout xYLayout1 = new XYLayout(); JLabel avviso = new JLabel(); JButton ok = new JButton(); public AvvisoSelezione(JFrame padre) { super(padre,"AVVISO",true); this.setSize(350,130); try { jbInit(); } catch (Exception ex) { ex.printStackTrace(); } } private void jbInit() throws Exception { this.setDefaultCloseOperation(javax.swing.WindowConstants. DISPOSE_ON_CLOSE); this.setResizable(false); this.getContentPane().setLayout(xYLayout1); xYLayout1.setWidth(350); xYLayout1.setHeight(130); avviso.setFont(new java.awt.Font("Verdana", Font.PLAIN, 13)); avviso.setHorizontalAlignment(SwingConstants.CENTER); avviso.setText("Devi prima selezionare una riga della tabella"); ok.addActionListener(new AvvisoSelezione_ok_actionAdapter(this)); this.getContentPane().add(ok, new XYConstraints(112, 56, 107, 29)); this.getContentPane().add(avviso, new XYConstraints(7, 5, 336, 47)); ok.setText("OK"); 103 Appendice Codice Java } this.setVisible(true); public void ok_actionPerformed(ActionEvent e) { dispose(); } } class AvvisoSelezione_ok_actionAdapter implements ActionListener { private AvvisoSelezione adaptee; AvvisoSelezione_ok_actionAdapter(AvvisoSelezione adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.ok_actionPerformed(e); } } package sirena.interfaccia; import import import import import import import javax.swing.*; java.awt.GridBagLayout; java.awt.*; java.awt.Dimension; java.awt.event.ActionEvent; java.awt.event.ActionListener; db.IterazioneDb; public class DialogModLocalBassi extends JDialog { int id; JTextField txtLocaliz[]; public DialogModLocalBassi(JFrame padre, int key, JTextField txtLocal[]) { super(padre,"Localizzazione Basso",true); this.setSize(600,200); IterazioneDb.caricaBassiInfo(key,txtArray); id = key; txtLocaliz = txtLocal; try { jbInit(); } catch (Exception ex) { ex.printStackTrace(); } } private void jbInit() throws Exception { this.setDefaultCloseOperation(javax.swing.WindowConstants. DISPOSE_ON_CLOSE); this.getContentPane().setLayout(gridBagLayout1); jLabel1.setText("(Via, Piazza, Vico, Largo, ecc)"); jLabel2.setText("n. civico"); jTextField1.setMinimumSize(new Dimension(251, 19)); jTextField1.setColumns(30); jTextField2.setMinimumSize(new Dimension(43, 19)); jTextField2.setColumns(4); jLabel3.setText("ricadente nell\'edificio (Via, Piazza, ecc)"); jTextField3.setMinimumSize(new Dimension(171, 19)); jTextField3.setColumns(20); jLabel4.setText("n. civico"); jTextField4.setMinimumSize(new Dimension(43, 19)); jTextField4.setColumns(4); jButton1.setText("CHIUDI/APPLICA"); jButton1.addActionListener(new DialogModLocalBassi_jButton1_actionAdapter(this)); this.getContentPane().add(jLabel2, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); this.getContentPane().add(jTextField2, 104 Appendice Codice Java new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 15, 0, 0), 0, 0)); this.getContentPane().add(jLabel1, new GridBagConstraints(0, 0, 1, 1, 0.0, , GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); this.getContentPane().add(jTextField4, new GridBagConstraints(3, 2, 1, 1, 0.0, , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 10, 0, 0), 0, 0)); this.getContentPane().add(jLabel4, new GridBagConstraints(2, 2, 1, 1, 0.0, , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); this.getContentPane().add(jTextField3, new GridBagConstraints(1, 2, 1, 1, 0.0, , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 15, 0, 0), 0, 0)); this.getContentPane().add(jLabel3, new GridBagConstraints(0, 2, 1, 1, 0.0, , GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); this.getContentPane().add(jTextField1, new GridBagConstraints(1, 0, 1, 1, 0.0, , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 15, 0, 0), 0, 0)); this.getContentPane().add(jButton1, new GridBagConstraints(0, 3, 4, 1, 0.0, , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); this.setVisible(true); } 0.0 0.0 0.0 0.0 0.0 0.0 0.0 GridBagLayout gridBagLayout1 = new GridBagLayout(); JLabel jLabel1 = new JLabel(); JTextField jTextField1 = new JTextField(); JLabel jLabel2 = new JLabel(); JTextField jTextField2 = new JTextField(); JLabel jLabel3 = new JLabel(); JTextField jTextField3 = new JTextField(); JLabel jLabel4 = new JLabel(); JTextField jTextField4 = new JTextField(); JButton jButton1 = new JButton(); JTextField txtArray[] = {jTextField1,jTextField2,jTextField3,jTextField4}; public void chiudiDialog(ActionEvent e) { IterazioneDb.insertLocalBassi(id,txtArray); txtLocaliz[0].setText(txtArray[0].getText()); txtLocaliz[1].setText(txtArray[1].getText()); txtLocaliz[2].setText(txtArray[2].getText()); txtLocaliz[3].setText(txtArray[3].getText()); this.dispose(); } } class DialogModLocalBassi_jButton1_actionAdapter implements ActionListener { private DialogModLocalBassi adaptee; DialogModLocalBassi_jButton1_actionAdapter(DialogModLocalBassi adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.chiudiDialog(e); } } package sirena.interfaccia; import javax.swing.*; import java.awt.BorderLayout; import java.awt.*; 105 Appendice Codice Java public class DialogAltreInfo extends JDialog { JFrame mainFrame; int id; public DialogAltreInfo(JFrame padre, int key) { super(padre,"Altre Info Bassi",true); this.setSize(800,500); mainFrame = padre; id = key; try { jbInit(); } catch (Exception ex) { ex.printStackTrace(); } } } private void jbInit() throws Exception { this.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); this.getContentPane().setLayout(borderLayout1); pannello = new PanAltreInfoBassi(mainFrame,id,this); jScrollPane1 = new JScrollPane(pannello); this.add(jScrollPane1); this.setVisible(true); } PanAltreInfoBassi pannello; JScrollPane jScrollPane1; BorderLayout borderLayout1 = new BorderLayout(); package sirena.interfaccia; import import import import import import import import javax.swing.*; java.awt.GridBagLayout; java.awt.*; javax.swing.border.TitledBorder; java.awt.Dimension; java.awt.event.ActionEvent; java.awt.event.ActionListener; javax.swing.table.DefaultTableModel; public class InserimentoComponente extends JDialog { public InserimentoComponente(JFrame padre,DefaultTableModel tab) { super(padre,"Inserimento nuovo componente",true); tabCompo = tab; this.setSize(550,250); try { jbInit(); } catch (Exception ex) { ex.printStackTrace(); } } private void jbInit() throws Exception { this.setDefaultCloseOperation(javax.swing.WindowConstants. DISPOSE_ON_CLOSE); this.getContentPane().setLayout(gridBagLayout1); jPanel1.setLayout(gridBagLayout2); jPanel1.setBorder(titledBorder1); jPanel1.setPreferredSize(new Dimension(500, 150)); jLabel1.setText("Sesso"); jLabel2.setText("Relazione di parentela"); jLabel3.setText("Età"); jTextField1.setMinimumSize(new Dimension(51, 19)); jTextField1.setColumns(5); jTextField2.setMinimumSize(new Dimension(91, 19)); jTextField2.setColumns(10); jLabel4.setText("Attività"); jTextField3.setMinimumSize(new Dimension(131, 19)); jTextField3.setColumns(15); jButton1.setText("Annulla"); jButton1.addActionListener(new InserimentoComponente_jButton1_actionAdapter(this)); jButton2.setText("Inserisci"); jButton2.addActionListener(new 106 Appendice Codice Java InserimentoComponente_jButton2_actionAdapter(this)); this.getContentPane().add(jPanel1, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jPanel1.add(jLabel1, new GridBagConstraints(0, 0, 2, 1, 0.0, 0.0 , GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jPanel1.add(jLabel2, new GridBagConstraints(0, 1, 2, 1, 0.0, 0.0 , GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); jPanel1.add(jComboBox1, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 20, 0, 0), 0, 0)); jPanel1.add(jLabel3, new GridBagConstraints(3, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 50, 0, 0), 0, 0)); jPanel1.add(jTextField1, new GridBagConstraints(4, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 20, 0, 0), 0, 0)); jPanel1.add(jTextField2, new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 20, 0, 0), 0, 0)); jPanel1.add(jLabel4, new GridBagConstraints(3, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 50, 0, 0), 0, 0)); jPanel1.add(jTextField3, new GridBagConstraints(4, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 20, 0, 0), 0, 0)); jPanel1.add(jButton1, new GridBagConstraints(3, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 15, 0, 0), 0, 0)); jPanel1.add(jButton2, new GridBagConstraints(2, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); this.setVisible(true); } DefaultTableModel tabCompo; String scelte[] = {"M","F"}; TitledBorder titledBorder1 = new TitledBorder("Nuovo Componente"); GridBagLayout gridBagLayout1 = new GridBagLayout(); JPanel jPanel1 = new JPanel(); GridBagLayout gridBagLayout2 = new GridBagLayout(); JLabel jLabel1 = new JLabel(); JLabel jLabel2 = new JLabel(); JComboBox jComboBox1 = new JComboBox(scelte); JLabel jLabel3 = new JLabel(); JTextField jTextField1 = new JTextField(); JTextField jTextField2 = new JTextField(); JLabel jLabel4 = new JLabel(); JTextField jTextField3 = new JTextField(); JButton jButton1 = new JButton(); JButton jButton2 = new JButton(); public void bottAnnulla(ActionEvent e) { this.dispose(); } public void insertCompo(ActionEvent e) { Object v[] = new Object[5]; v[0] = tabCompo.getRowCount() + 1; v[1] = jComboBox1.getSelectedItem().toString(); v[2] = jTextField1.getText(); v[3] = jTextField2.getText(); v[4] = jTextField3.getText(); tabCompo.addRow(v); this.dispose(); } } class InserimentoComponente_jButton2_actionAdapter implements ActionListener { 107 Appendice Codice Java private InserimentoComponente adaptee; InserimentoComponente_jButton2_actionAdapter(InserimentoComponente adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.insertCompo(e); } } class InserimentoComponente_jButton1_actionAdapter implements ActionListener { private InserimentoComponente adaptee; InserimentoComponente_jButton1_actionAdapter(InserimentoComponente adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.bottAnnulla(e); } } package sirena.interfaccia; import import import import import import import import import javax.swing.*; java.awt.GridBagLayout; java.awt.*; java.awt.Dimension; java.awt.Font; java.awt.event.ActionEvent; java.awt.event.ActionListener; db.IterazioneDb; javax.swing.table.DefaultTableModel; public class InserimentoLavori extends JDialog { DefaultTableModel tabella; String codSirena; public InserimentoLavori(JFrame padre, DefaultTableModel tab, String cod) { super(padre,"Lavori",true); this.setSize(585,352); tabella = tab; codSirena = cod; try { jbInit(); } catch (Exception ex) { ex.printStackTrace(); } } private void jbInit() throws Exception { this.getContentPane().setLayout(gridBagLayout1); labelOrd.setFont(new java.awt.Font("Verdana", Font.BOLD, 12)); labelOrd.setText("Num. Ord. TARIFFA:"); labelLavoro.setFont(new java.awt.Font("Verdana", Font.BOLD, 12)); labelLavoro.setText("Designazione Lavori:"); txtOrd.setMinimumSize(new Dimension(50, 20)); bottOK.setText("OK"); bottOK.addActionListener(new InserimentoLavori_bottOK_actionAdapter(this)); bottAnnulla.setText("Annulla"); bottAnnulla.addActionListener(new InserimentoLavori_bottAnnulla_actionAdapter(this)); scrollArea.setMinimumSize(new Dimension(200, 50)); scrollArea.setPreferredSize(new Dimension(300, 100)); labelTitolo.setFont(new java.awt.Font("Arial", Font.PLAIN, 18)); labelTitolo.setText("DESIGNAZIONE LAVORI"); txtOrd.setColumns(20); areaLavori.setMinimumSize(new Dimension(200, 30)); areaLavori.setPreferredSize(new Dimension(300, 100)); 108 Appendice Codice Java } this.getContentPane().add(scrollArea, new GridBagConstraints(2, 2, 1, 1, 0.0, , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); scrollArea.getViewport().add(areaLavori); this.getContentPane().add(bottAnnulla, new GridBagConstraints(2, 3, 1, 1, 0.0, , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(10, 15, 0, 0), 0, 0)); this.getContentPane().add(txtOrd, new GridBagConstraints(2, 1, 1, 1, 0.0, , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 30, 0), 0, 0)); this.getContentPane().add(labelOrd, new GridBagConstraints(0, 1, 1, 1, 0.0, , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 30, 0), 0, 0)); this.getContentPane().add(labelLavoro, new GridBagConstraints(0, 2, 1, 1, 0.0, , GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); this.getContentPane().add(bottOK, new GridBagConstraints(1, 3, 1, 1, 0.0, , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(10, 0, 0, 0), 0, 0)); this.getContentPane().add(labelTitolo, new GridBagConstraints(0, 0, 3, 1, 0.0, , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 50, 15), 0, 0)); this.setVisible(true); 0.0 0.0 0.0 0.0 0.0 0.0 0.0 GridBagLayout gridBagLayout1 = new GridBagLayout(); JLabel labelOrd = new JLabel(); JLabel labelLavoro = new JLabel(); JTextField txtOrd = new JTextField(); JScrollPane scrollArea = new JScrollPane(); JButton bottOK = new JButton(); JButton bottAnnulla = new JButton(); JLabel labelTitolo = new JLabel(); JTextPane areaLavori = new JTextPane(); public void bottAnnulla_actionPerformed(ActionEvent e) { this.dispose(); } public void bottOK_actionPerformed(ActionEvent e) { IterazioneDb.InsertLavoro(tabella,codSirena,txtOrd,areaLavori); this.dispose(); } } class InserimentoLavori_bottOK_actionAdapter implements ActionListener { private InserimentoLavori adaptee; InserimentoLavori_bottOK_actionAdapter(InserimentoLavori adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.bottOK_actionPerformed(e); } } class InserimentoLavori_bottAnnulla_actionAdapter implements ActionListener { private InserimentoLavori adaptee; InserimentoLavori_bottAnnulla_actionAdapter(InserimentoLavori adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.bottAnnulla_actionPerformed(e); 109 Appendice Codice Java } } package sirena.interfaccia; import import import import import import import import javax.swing.*; java.awt.GridBagLayout; java.awt.*; java.awt.Font; java.awt.Dimension; db.IterazioneDb; java.awt.event.ActionEvent; java.awt.event.ActionListener; public class ModificaComputo extends JDialog { String codSir; JTextField txtTP[] = new JTextField[4]; public ModificaComputo(JFrame padre, String cod,JTextField t[]) { super(padre,"Modifica Computo Estimativo",true); codSir = cod; txtTP = t; this.setSize(579,312); try { jbInit(); } catch (Exception ex) { ex.printStackTrace(); } } private void jbInit() throws Exception { this.getContentPane().setLayout(gridBagLayout1); titolo.setFont(new java.awt.Font("Verdana", Font.PLAIN, 18)); titolo.setText("COMPUTO ESTIMATIVO"); labelData.setFont(new java.awt.Font("Verdana", Font.BOLD, 12)); txtData.setColumns(25); labelData.setText("Data:"); txtComm.setColumns(25); labelComm.setFont(new java.awt.Font("Tahoma", Font.BOLD, 12)); labelComm.setText("Committente:"); labelOgg.setFont(new java.awt.Font("Verdana", Font.BOLD, 12)); labelTecnico.setFont(new java.awt.Font("Verdana", Font.BOLD, 12)); labelTecnico.setText("Tecnico"); txtTecnico.setColumns(25); jScrollPane1.setPreferredSize(new Dimension(300, 50)); jButton1.setText("CHIUDI"); jButton1.addActionListener(new ModificaComputo_jButton1_actionAdapter(this)); this.getContentPane().add(titolo, new GridBagConstraints(0, 0, 2, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 50, 0), 0, 0)); labelOgg.setText("Oggetto:"); this.getContentPane().add(labelComm, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 10, 0), 0, 0)); this.getContentPane().add(labelData, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 10, 0), 0, 0)); this.getContentPane().add(labelTecnico, new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 10, 0), 0, 0)); jScrollPane1.getViewport().add(jTextPane1); this.getContentPane().add(labelOgg, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0 , GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0, 0, 10, 0), 0, 0)); this.getContentPane().add(txtTecnico, new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 15, 10, 0), 0, 0)); this.getContentPane().add(jScrollPane1, 110 Appendice Codice Java new GridBagConstraints(1, 3, 1, 1, 0.0, , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 15, 10, 0), 0, 0)); this.getContentPane().add(txtComm, new GridBagConstraints(1, 2, 1, 1, 0.0, , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 15, 10, 0), 0, 0)); this.getContentPane().add(txtData, new GridBagConstraints(1, 1, 1, 1, 0.0, , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 15, 10, 0), 0, 0)); this.getContentPane().add(jButton1, new GridBagConstraints(1, 5, 1, 1, 0.0, , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); } txt[0] = txtData; txt[1] = txtComm; txt[2] = txtTecnico; IterazioneDb.CaricaComputoDaDialog(codSir,txt,jTextPane1); this.setVisible(true); GridBagLayout gridBagLayout1 = new GridBagLayout(); JLabel titolo = new JLabel(); JLabel labelData = new JLabel(); JTextField txtData = new JTextField(); JLabel labelComm = new JLabel(); JTextField txtComm = new JTextField(); JLabel labelOgg = new JLabel(); JLabel labelTecnico = new JLabel(); JTextField txtTecnico = new JTextField(); JScrollPane jScrollPane1 = new JScrollPane(); JTextPane jTextPane1 = new JTextPane(); JButton jButton1 = new JButton(); JTextField txt[] = new JTextField[3]; public void jButton1_actionPerformed(ActionEvent e) { txt[0] = txtData; txt[1] = txtComm; txt[2] = txtTecnico; IterazioneDb.ModificaComputo(codSir,txt,jTextPane1); IterazioneDb.CaricaComputo(codSir,txtTP); this.dispose(); } } class ModificaComputo_jButton1_actionAdapter implements ActionListener { private ModificaComputo adaptee; ModificaComputo_jButton1_actionAdapter(ModificaComputo adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.jButton1_actionPerformed(e); } } package sirena.interfaccia; import import import import import import import import import import javax.swing.*; java.awt.GridBagLayout; java.awt.*; java.awt.Dimension; javax.swing.border.TitledBorder; sirena.utility.ModelloTabellaResidenti; db.IterazioneDb; sirena.utility.AzioneBottAddComponente; java.awt.event.ActionEvent; java.awt.event.ActionListener; public class PanAltreInfoBassi extends JPanel { JFrame mainFrame; 111 0.0 0.0 0.0 0.0 Appendice Codice Java int id; JDialog dialog; public PanAltreInfoBassi(JFrame mf, int key, JDialog dial) { mainFrame = mf; id = key; dialog = dial; try { jbInit(); } catch (Exception ex) { ex.printStackTrace(); } } private void jbInit() throws Exception { this.setLayout(gridBagLayout1); this.setPreferredSize(new Dimension(750, 1100)); panUbi.setBorder(titledBorder2); panUbi.setMinimumSize(new Dimension(700, 100)); panUbi.setPreferredSize(new Dimension(700, 100)); panUbi.setLayout(gridBagLayout3); jCheckBox1.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox1.setText("direttamente sulla strada"); jCheckBox2.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox2.setText("all\'interno di un cortile"); jCheckBox3.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox3.setText("all\'interno di un androne"); jCheckBox4.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox4.setText("terreneo a livello di strada"); jCheckBox5.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox5.setText("seminterrato"); jCheckBox6.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox6.setText("rialzato"); panTipologia.setBorder(titledBorder3); panTipologia.setMinimumSize(new Dimension(700, 200)); panTipologia.setPreferredSize(new Dimension(700, 200)); panTipologia.setLayout(gridBagLayout4); jCheckBox7.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox7.setText("1 porta ingresso"); jCheckBox8.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox8.setText("1 porta ingresso + 1 finestra laterale"); jCheckBox9.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox9.setText("1 porta ingresso + 2 finestra laterale"); jLabel5.setText("numero vani"); jTextField5.setColumns(3); jLabel6.setText("n. vani ricavati in orizzontale"); jTextField6.setColumns(3); jLabel7.setText("n. vani ricavati in verticale"); jTextField7.setColumns(3); jCheckBox10.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox10.setText("altre aperture"); jLabel8.setText("tipo"); jTextField8.setColumns(20); jLabel9.setText("numero"); jTextField9.setColumns(3); panImm.setBorder(titledBorder4); panImm.setMinimumSize(new Dimension(700, 100)); panImm.setPreferredSize(new Dimension(700, 100)); panImm.setLayout(gridBagLayout5); jCheckBox11.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox11.setText("faticente"); jCheckBox12.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox12.setText("ristrutturata solo esternamente"); jCheckBox13.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox13.setText("ristrutturata solo internamente"); jCheckBox14.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox14.setText("ristrutturata esternamente ed internamente"); panEdi.setBorder(titledBorder5); panEdi.setMinimumSize(new Dimension(700, 100)); panEdi.setPreferredSize(new Dimension(700, 100)); panEdi.setLayout(gridBagLayout6); jCheckBox15.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox15.setText("fatiscente"); 112 Appendice Codice Java jCheckBox16.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox16.setText("ristrutturato solo esternamente"); jCheckBox17.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox17.setText("ristrutturato solo internamente"); jCheckBox18.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox18.setText("ristrutturato esternamente ed internamente"); panUso.setBorder(titledBorder6); panUso.setMinimumSize(new Dimension(700, 200)); panUso.setPreferredSize(new Dimension(700, 200)); panUso.setLayout(gridBagLayout7); jCheckBox19.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox19.setText("abitazione"); jCheckBox20.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox20.setText("commerciale"); jCheckBox21.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox21.setText("artigianale"); jCheckBox22.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox22.setText("non utilizzato"); jTextPane1.setMinimumSize(new Dimension(150, 70)); jTextPane1.setPreferredSize(new Dimension(300, 100)); jScrollPane1.setMinimumSize(new Dimension(150, 70)); jScrollPane1.setPreferredSize(new Dimension(200, 100)); jLabel10.setText( "(Se si tratta di uso non abitativo, specificare il tipo di attività, " + "l\'anzianità d\'esercizio, le condizioni di gestione e il numero di " + "addetti)"); panNucleo.setLayout(gridBagLayout8); panNucleo.setBorder(titledBorder7); panNucleo.setMinimumSize(new Dimension(700, 400)); panNucleo.setPreferredSize(new Dimension(700, 330)); jButton1.setText("Aggiungi"); jButton2.setText("Rimuovi"); jButton2.addActionListener(new PanAltreInfoBassi_jButton2_actionAdapter(this)); jScrollPane2.setPreferredSize(new Dimension(600, 100)); jTable1.setModel(modRes); jLabel11.setText("Anzianità della residenza nell\'unità immobiliare"); jLabel12.setText("numero anni"); jTextField10.setColumns(5); jLabel13.setText("Titolo di godimento dell\'unità immobiliare"); jCheckBox23.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox23.setText("proprietà"); jCheckBox24.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox24.setText("affitto"); jLabel14.setText( "In caso di affitto, indicare orientativamente importo canone mensile " + "tra le seguenti fasce"); jCheckBox25.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox25.setText("< 50 €"); jCheckBox26.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox26.setText("50 € - 100 €"); jCheckBox27.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox27.setText("100 € - 200 €"); jCheckBox28.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox28.setText("200 € - 300 €"); jCheckBox29.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox29.setText("> 300 €"); jButton3.setPreferredSize(new Dimension(187, 35)); jButton3.setText("CHIUDI/APPLICA CAMBIAMENTI"); jButton3.addActionListener(new PanAltreInfoBassi_jButton3_actionAdapter(this)); panUbi.add(jCheckBox1, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); panUbi.add(jCheckBox2, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 15, 0, 0), 0, 0)); panUbi.add(jCheckBox3, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 15, 0, 0), 0, 0)); panUbi.add(jCheckBox4, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); panUbi.add(jCheckBox5, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0 113 Appendice Codice Java , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 15, 0, 0), 0, 0)); panUbi.add(jCheckBox6, new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 15, 0, 0), 0, 0)); panTipologia.add(jCheckBox8, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 15, 0, 0), 0, 0)); panTipologia.add(jCheckBox9, new GridBagConstraints(4, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 15, 0, 0), 0, 0)); panTipologia.add(jTextField6, new GridBagConstraints(3, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 5, 0, 0), 0, 0)); panTipologia.add(jTextField7, new GridBagConstraints(5, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 5, 0, 0), 0, 0)); panTipologia.add(jCheckBox10, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); panTipologia.add(jLabel8, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); panTipologia.add(jTextField8, new GridBagConstraints(2, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 5, 0, 0), 0, 0)); panTipologia.add(jLabel9, new GridBagConstraints(3, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); panTipologia.add(jTextField9, new GridBagConstraints(4, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 5, 0, 0), 0, 0)); panImm.add(jCheckBox12, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 10, 0, 0), 0, 0)); panImm.add(jCheckBox13, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 10, 0, 0), 0, 0)); panImm.add(jCheckBox11, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); panEdi.add(jCheckBox15, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); panEdi.add(jCheckBox16, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 10, 0, 0), 0, 0)); panEdi.add(jCheckBox17, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 10, 0, 0), 0, 0)); panEdi.add(jCheckBox18, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); panUso.add(jCheckBox19, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); panImm.add(jCheckBox14, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); panUso.add(jCheckBox20, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 15, 0, 0), 0, 0)); panUso.add(jCheckBox21, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 15, 0, 0), 0, 0)); panUso.add(jScrollPane1, new GridBagConstraints(0, 1, 4, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(20, 0, 0, 0), 0, 0)); jScrollPane1.getViewport().add(jTextPane1); panUso.add(jCheckBox22, new GridBagConstraints(3, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 15, 0, 0), 0, 0)); panUso.add(jLabel10, new GridBagConstraints(0, 2, 4, 1, 0.0, 0.0 114 Appendice Codice Java , GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(5, 0, 0, 0), 0, 0)); jScrollPane2.getViewport().add(jTable1); panNucleo.add(jButton2, new GridBagConstraints(1, 1, 3, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 10, 0, 0), 0, 0)); panNucleo.add(jButton1, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 0, 0, 0), 0, 0)); panNucleo.add(jLabel12, new GridBagConstraints(2, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 60, 0, 0), 0, 0)); panNucleo.add(jTextField10, new GridBagConstraints(3, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 15, 0, 0), 0, 0)); panNucleo.add(jLabel13, new GridBagConstraints(0, 3, 2, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); panNucleo.add(jCheckBox23, new GridBagConstraints(2, 3, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 60, 0, 0), 0, 0)); panNucleo.add(jCheckBox24, new GridBagConstraints(3, 3, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 15, 0, 0), 0, 0)); panNucleo.add(jLabel14, new GridBagConstraints(0, 4, 3, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); panNucleo.add(jLabel11, new GridBagConstraints(0, 2, 2, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(30, 0, 0, 0), 0, 0)); panNucleo.add(jCheckBox25, new GridBagConstraints(0, 5, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(15, 0, 0, 0), 0, 0)); panNucleo.add(jScrollPane2, new GridBagConstraints(0, 0, 5, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); panNucleo.add(jCheckBox26, new GridBagConstraints(1, 5, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(15, 15, 0, 0), 0, 0)); panNucleo.add(jCheckBox27, new GridBagConstraints(2, 5, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(15, 15, 0, 0), 0, 0)); panNucleo.add(jCheckBox28, new GridBagConstraints(3, 5, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(15, 15, 0, 0), 0, 0)); panNucleo.add(jCheckBox29, new GridBagConstraints(4, 5, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(15, 15, 0, 0), 0, 0)); panTipologia.add(jLabel6, new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); panTipologia.add(jLabel7, new GridBagConstraints(4, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); jButton1.addActionListener(new AzioneBottAddComponente(mainFrame,modRes)); panTipologia.add(jTextField5, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); panTipologia.add(jCheckBox7, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); panTipologia.add(jLabel5, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); this.add(panUbi, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); this.add(panTipologia, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 115 Appendice Codice Java , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); this.add(panImm, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); this.add(panEdi, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); this.add(panUso, new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); this.add(panNucleo, new GridBagConstraints(0, 5, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); this.add(jButton3, new GridBagConstraints(0, 6, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(10, 0, 0, 0), 0, 0)); IterazioneDb.caricaBassiAltreInfo(id,txtArray,chkArray,jTextPane1,modRes); } GridBagLayout gridBagLayout1 = new GridBagLayout(); TitledBorder titledBorder1 = new TitledBorder("Locazione"); JPanel panUbi = new JPanel(); GridBagLayout gridBagLayout3 = new GridBagLayout(); TitledBorder titledBorder2 = new TitledBorder("Ubicazione"); JCheckBox jCheckBox1 = new JCheckBox(); JCheckBox jCheckBox2 = new JCheckBox(); JCheckBox jCheckBox3 = new JCheckBox(); JCheckBox jCheckBox4 = new JCheckBox(); JCheckBox jCheckBox5 = new JCheckBox(); JCheckBox jCheckBox6 = new JCheckBox(); JPanel panTipologia = new JPanel(); GridBagLayout gridBagLayout4 = new GridBagLayout(); JCheckBox jCheckBox7 = new JCheckBox(); JCheckBox jCheckBox8 = new JCheckBox(); JCheckBox jCheckBox9 = new JCheckBox(); JLabel jLabel5 = new JLabel(); JTextField jTextField5 = new JTextField(); JLabel jLabel6 = new JLabel(); JTextField jTextField6 = new JTextField(); JLabel jLabel7 = new JLabel(); JTextField jTextField7 = new JTextField(); JCheckBox jCheckBox10 = new JCheckBox(); JLabel jLabel8 = new JLabel(); JTextField jTextField8 = new JTextField(); JLabel jLabel9 = new JLabel(); JTextField jTextField9 = new JTextField(); TitledBorder titledBorder3 = new TitledBorder("Tipologia"); JPanel panImm = new JPanel(); TitledBorder titledBorder4 = new TitledBorder("Condizioni fisiche dell'unità immobiliare"); GridBagLayout gridBagLayout5 = new GridBagLayout(); JCheckBox jCheckBox11 = new JCheckBox(); JCheckBox jCheckBox12 = new JCheckBox(); JCheckBox jCheckBox13 = new JCheckBox(); JCheckBox jCheckBox14 = new JCheckBox(); JPanel panEdi = new JPanel(); GridBagLayout gridBagLayout6 = new GridBagLayout(); TitledBorder titledBorder5 = new TitledBorder("Condizioni fisiche dell'edificio"); JCheckBox jCheckBox15 = new JCheckBox(); JCheckBox jCheckBox16 = new JCheckBox(); JCheckBox jCheckBox17 = new JCheckBox(); JCheckBox jCheckBox18 = new JCheckBox(); JPanel panUso = new JPanel(); TitledBorder titledBorder6 = new TitledBorder("Destinazione d'uso"); GridBagLayout gridBagLayout7 = new GridBagLayout(); JCheckBox jCheckBox19 = new JCheckBox(); JCheckBox jCheckBox20 = new JCheckBox(); JCheckBox jCheckBox21 = new JCheckBox(); 116 Appendice Codice Java JCheckBox jCheckBox22 = new JCheckBox(); JScrollPane jScrollPane1 = new JScrollPane(); JTextPane jTextPane1 = new JTextPane(); JLabel jLabel10 = new JLabel(); JPanel panNucleo = new JPanel(); GridBagLayout gridBagLayout8 = new GridBagLayout(); TitledBorder titledBorder7 = new TitledBorder("Caratteristiche del nucle familiare residente"); ModelloTabellaResidenti modRes = new ModelloTabellaResidenti(); JButton jButton1 = new JButton(); JButton jButton2 = new JButton(); JScrollPane jScrollPane2 = new JScrollPane(); JTable jTable1 = new JTable(); JLabel jLabel11 = new JLabel(); JLabel jLabel12 = new JLabel(); JTextField jTextField10 = new JTextField(); JLabel jLabel13 = new JLabel(); JCheckBox jCheckBox23 = new JCheckBox(); JCheckBox jCheckBox24 = new JCheckBox(); JLabel jLabel14 = new JLabel(); JCheckBox jCheckBox25 = new JCheckBox(); JCheckBox jCheckBox26 = new JCheckBox(); JCheckBox jCheckBox27 = new JCheckBox(); JCheckBox jCheckBox28 = new JCheckBox(); JCheckBox jCheckBox29 = new JCheckBox(); JTextField txtArray[] = {null,null,null,null,jTextField5,jTextField6,jTextField7,jTextField8,jTextField9,jTextField10}; JCheckBox chkArray[] = {jCheckBox1,jCheckBox2,jCheckBox3,jCheckBox4,jCheckBox5,jCheckBox6,jCheckBox7,jCheckBox8,jCheckBox9,jCh eckBox10,jCheckBox11,jCheckBox12,jCheckBox13,jCheckBox14,jCheckBox15,jCheckBox16,jCheckBox17,jCheckBox1 8,jCheckBox19,jCheckBox20,jCheckBox21,jCheckBox22,jCheckBox23,jCheckBox24,jCheckBox25,jCheckBox26,jChec kBox27,jCheckBox28,jCheckBox29}; JButton jButton3 = new JButton(); public void aggionaAltreInfo(ActionEvent e) { IterazioneDb.insertAltreInfoBassi(id,txtArray,chkArray,jTextPane1,modRes); dialog.dispose(); } public void rimuoviCompo(ActionEvent e) { int r = jTable1.getSelectedRow(); if(r>=0){ modRes.removeRow(r); } } } class PanAltreInfoBassi_jButton2_actionAdapter implements ActionListener { private PanAltreInfoBassi adaptee; PanAltreInfoBassi_jButton2_actionAdapter(PanAltreInfoBassi adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.rimuoviCompo(e); } } class PanAltreInfoBassi_jButton3_actionAdapter implements ActionListener { private PanAltreInfoBassi adaptee; PanAltreInfoBassi_jButton3_actionAdapter(PanAltreInfoBassi adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.aggionaAltreInfo(e); } } package sirena.interfaccia; 117 Appendice Codice Java import import import import import import import import import import import javax.swing.*; java.awt.GridBagLayout; java.awt.*; java.awt.Dimension; javax.swing.border.TitledBorder; sirena.utility.ModelloTabellaResidenti; java.awt.Font; java.awt.event.ActionEvent; java.awt.event.ActionListener; db.IterazioneDb; sirena.utility.AzioneBottAddComponente; public class panBassiPopolazione extends JPanel { JFrame mainFrame; public panBassiPopolazione(JTable tab, JFrame mf, JTextField txt[]) { mainFrame = mf; tabCond = tab; jTextField3 = txt[0] ; jTextField4 = txt[1] ; txtArray[0] = jTextField1; txtArray[1] = jTextField2; txtArray[2] = jTextField3; txtArray[3] = jTextField4; txtArray[4] = jTextField5; txtArray[5] = jTextField6; txtArray[6] = jTextField7; txtArray[7] = jTextField8; txtArray[8] = jTextField9; txtArray[9] = jTextField10; try { jbInit(); } catch (Exception ex) { ex.printStackTrace(); } } private void jbInit() throws Exception { this.setLayout(gridBagLayout1); panLocazione.setBorder(titledBorder1); panLocazione.setMinimumSize(new Dimension(700, 200)); panLocazione.setPreferredSize(new Dimension(700, 200)); panLocazione.setLayout(gridBagLayout2); this.setPreferredSize(new Dimension(800, 1400)); jLabel1.setText("(Via, Piazza, Vico, Largo, ecc.)"); jTextField1.setMinimumSize(new Dimension(331, 19)); jTextField1.setColumns(40); jLabel2.setText("n. civico"); jTextField2.setMinimumSize(new Dimension(67, 19)); jTextField2.setColumns(7); jLabel3.setText("Ricadente nell\'edificio sito in (Via, Piazza, ecc.)"); jTextField3.setMinimumSize(new Dimension(251, 19)); jTextField3.setEditable(false); jTextField3.setColumns(30); jLabel4.setText("n. civico"); jTextField4.setMinimumSize(new Dimension(67, 19)); jTextField4.setEditable(false); jTextField4.setColumns(7); panUbi.setBorder(titledBorder2); panUbi.setMinimumSize(new Dimension(700, 100)); panUbi.setPreferredSize(new Dimension(700, 100)); panUbi.setLayout(gridBagLayout3); jCheckBox1.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox1.setText("direttamente sulla strada"); jCheckBox2.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox2.setText("all\'interno di un cortile"); jCheckBox3.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox3.setText("all\'interno di un androne"); jCheckBox4.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox4.setText("terreneo a livello di strada"); jCheckBox5.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox5.setText("seminterrato"); jCheckBox6.setHorizontalTextPosition(SwingConstants.LEFT); 118 Appendice Codice Java jCheckBox6.setText("rialzato"); panTipologia.setBorder(titledBorder3); panTipologia.setMinimumSize(new Dimension(700, 200)); panTipologia.setPreferredSize(new Dimension(700, 200)); panTipologia.setLayout(gridBagLayout4); jCheckBox7.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox7.setText("1 porta ingresso"); jCheckBox8.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox8.setText("1 porta ingresso + 1 finestra laterale"); jCheckBox9.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox9.setText("1 porta ingresso + 2 finestra laterale"); jLabel5.setText("numero vani"); jTextField5.setColumns(3); jLabel6.setText("n. vani ricavati in orizzontale"); jTextField6.setColumns(3); jLabel7.setText("n. vani ricavati in verticale"); jTextField7.setColumns(3); jCheckBox10.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox10.setText("altre aperture"); jLabel8.setText("tipo"); jTextField8.setColumns(20); jLabel9.setText("numero"); jTextField9.setColumns(3); panImm.setBorder(titledBorder4); panImm.setMinimumSize(new Dimension(700, 100)); panImm.setPreferredSize(new Dimension(700, 100)); panImm.setLayout(gridBagLayout5); jCheckBox11.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox11.setText("faticente"); jCheckBox12.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox12.setText("ristrutturata solo esternamente"); jCheckBox13.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox13.setText("ristrutturata solo internamente"); jCheckBox14.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox14.setText("ristrutturata esternamente ed internamente"); panEdi.setBorder(titledBorder5); panEdi.setMinimumSize(new Dimension(700, 100)); panEdi.setPreferredSize(new Dimension(700, 100)); panEdi.setLayout(gridBagLayout6); jCheckBox15.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox15.setText("fatiscente"); jCheckBox16.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox16.setText("ristrutturato solo esternamente"); jCheckBox17.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox17.setText("ristrutturato solo internamente"); jCheckBox18.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox18.setText("ristrutturato esternamente ed internamente"); panUso.setBorder(titledBorder6); panUso.setMinimumSize(new Dimension(700, 200)); panUso.setPreferredSize(new Dimension(700, 200)); panUso.setLayout(gridBagLayout7); jCheckBox19.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox19.setText("abitazione"); jCheckBox20.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox20.setText("commerciale"); jCheckBox21.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox21.setText("artigianale"); jCheckBox22.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox22.setText("non utilizzato"); jTextPane1.setMinimumSize(new Dimension(150, 70)); jTextPane1.setPreferredSize(new Dimension(300, 100)); jScrollPane1.setMinimumSize(new Dimension(150, 70)); jScrollPane1.setPreferredSize(new Dimension(200, 100)); jLabel10.setText( "(Se si tratta di uso non abitativo, specificare il tipo di attività, " + "l\'anzianità d\'esercizio, le condizioni di gestione e il numero di " + "addetti)"); panNucleo.setLayout(gridBagLayout8); panNucleo.setBorder(titledBorder7); panNucleo.setMinimumSize(new Dimension(700, 400)); panNucleo.setPreferredSize(new Dimension(700, 400)); jButton1.setText("Aggiungi"); jButton2.setText("Rimuovi"); 119 Appendice Codice Java jButton2.addActionListener(new panBassiPopolazione_jButton2_actionAdapter(this)); jScrollPane2.setPreferredSize(new Dimension(600, 100)); jTable1.setModel(modRes); jLabel11.setText("Anzianità della residenza nell\'unità immobiliare"); jLabel12.setText("numero anni"); jTextField10.setColumns(5); jLabel13.setText("Titolo di godimento dell\'unità immobiliare"); jCheckBox23.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox23.setText("proprietà"); jCheckBox24.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox24.setText("affitto"); jLabel14.setText( "In caso di affitto, indicare orientativamente importo canone mensile " + "tra le seguenti fasce"); jCheckBox25.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox25.setText("< 50 €"); jCheckBox26.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox26.setText("50 € - 100 €"); jCheckBox27.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox27.setText("100 € - 200 €"); jCheckBox28.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox28.setText("200 € - 300 €"); jCheckBox29.setHorizontalTextPosition(SwingConstants.LEFT); jCheckBox29.setText("> 300 €"); jPanel8.setPreferredSize(new Dimension(700, 50)); jPanel8.setLayout(gridBagLayout9); jButton3.setFont(new java.awt.Font("Verdana", Font.BOLD, 12)); jButton3.setPreferredSize(new Dimension(169, 40)); jButton3.setText("INSERISCI MODULO"); jButton3.addActionListener(new panBassiPopolazione_jButton3_actionAdapter(this)); this.add(panLocazione, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); panLocazione.add(jTextField2, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 15, 0, 0), 0, 0)); panLocazione.add(jTextField1, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 15, 0, 0), 0, 0)); panLocazione.add(jLabel2, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); panLocazione.add(jLabel1, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); panLocazione.add(jLabel3, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); panLocazione.add(jTextField3, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 15, 0, 0), 0, 0)); this.add(panUbi, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); panUbi.add(jCheckBox1, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); panUbi.add(jCheckBox2, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 15, 0, 0), 0, 0)); panUbi.add(jCheckBox3, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 15, 0, 0), 0, 0)); panUbi.add(jCheckBox4, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); panUbi.add(jCheckBox5, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 15, 0, 0), 0, 0)); 120 Appendice Codice Java panUbi.add(jCheckBox6, new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 15, 0, 0), 0, 0)); this.add(panTipologia, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); panLocazione.add(jLabel4, new GridBagConstraints(2, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); panTipologia.add(jCheckBox8, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 15, 0, 0), 0, 0)); panTipologia.add(jCheckBox9, new GridBagConstraints(4, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 15, 0, 0), 0, 0)); panTipologia.add(jTextField6, new GridBagConstraints(3, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 5, 0, 0), 0, 0)); panTipologia.add(jTextField7, new GridBagConstraints(5, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 5, 0, 0), 0, 0)); panTipologia.add(jCheckBox10, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); panTipologia.add(jLabel8, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); panTipologia.add(jTextField8, new GridBagConstraints(2, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 5, 0, 0), 0, 0)); panTipologia.add(jLabel9, new GridBagConstraints(3, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); panTipologia.add(jTextField9, new GridBagConstraints(4, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 5, 0, 0), 0, 0)); this.add(panImm, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); panImm.add(jCheckBox12, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 10, 0, 0), 0, 0)); panImm.add(jCheckBox13, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 10, 0, 0), 0, 0)); panImm.add(jCheckBox11, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); this.add(panEdi, new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); panEdi.add(jCheckBox15, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); panEdi.add(jCheckBox16, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 10, 0, 0), 0, 0)); panEdi.add(jCheckBox17, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 10, 0, 0), 0, 0)); panEdi.add(jCheckBox18, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); this.add(panUso, new GridBagConstraints(0, 5, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); panUso.add(jCheckBox19, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); 121 Appendice Codice Java panImm.add(jCheckBox14, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); panUso.add(jCheckBox20, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 15, 0, 0), 0, 0)); panUso.add(jCheckBox21, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 15, 0, 0), 0, 0)); panUso.add(jScrollPane1, new GridBagConstraints(0, 1, 4, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(20, 0, 0, 0), 0, 0)); jScrollPane1.getViewport().add(jTextPane1); panUso.add(jCheckBox22, new GridBagConstraints(3, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 15, 0, 0), 0, 0)); panUso.add(jLabel10, new GridBagConstraints(0, 2, 4, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(5, 0, 0, 0), 0, 0)); this.add(panNucleo, new GridBagConstraints(0, 6, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jScrollPane2.getViewport().add(jTable1); panNucleo.add(jButton2, new GridBagConstraints(1, 1, 3, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 10, 0, 0), 0, 0)); panNucleo.add(jButton1, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 0, 0, 0), 0, 0)); panNucleo.add(jLabel12, new GridBagConstraints(2, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 60, 0, 0), 0, 0)); panNucleo.add(jTextField10, new GridBagConstraints(3, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 15, 0, 0), 0, 0)); panNucleo.add(jLabel13, new GridBagConstraints(0, 3, 2, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); panNucleo.add(jCheckBox23, new GridBagConstraints(2, 3, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 60, 0, 0), 0, 0)); panNucleo.add(jCheckBox24, new GridBagConstraints(3, 3, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 15, 0, 0), 0, 0)); panNucleo.add(jLabel14, new GridBagConstraints(0, 4, 3, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); panNucleo.add(jLabel11, new GridBagConstraints(0, 2, 2, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(30, 0, 0, 0), 0, 0)); panNucleo.add(jCheckBox25, new GridBagConstraints(0, 5, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(15, 0, 0, 0), 0, 0)); panNucleo.add(jScrollPane2, new GridBagConstraints(0, 0, 5, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); panNucleo.add(jCheckBox26, new GridBagConstraints(1, 5, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(15, 15, 0, 0), 0, 0)); panNucleo.add(jCheckBox27, new GridBagConstraints(2, 5, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(15, 15, 0, 0), 0, 0)); panNucleo.add(jCheckBox28, new GridBagConstraints(3, 5, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(15, 15, 0, 0), 0, 0)); panNucleo.add(jCheckBox29, new GridBagConstraints(4, 5, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(15, 15, 0, 0), 0, 0)); jPanel8.add(jButton3, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); this.add(jPanel8, new GridBagConstraints(0, 7, 1, 1, 0.0, 0.0 122 Appendice Codice Java , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(10, 0, 20, 0), 0, 0)); panTipologia.add(jLabel6, new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); panTipologia.add(jLabel7, new GridBagConstraints(4, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); gruppoBott1.add(jCheckBox7); gruppoBott1.add(jCheckBox8); gruppoBott1.add(jCheckBox9); gruppoBott2.add(jCheckBox11); gruppoBott2.add(jCheckBox12); gruppoBott2.add(jCheckBox13); gruppoBott2.add(jCheckBox14); gruppoBott3.add(jCheckBox15); gruppoBott3.add(jCheckBox16); gruppoBott3.add(jCheckBox17); gruppoBott3.add(jCheckBox18); gruppoBott4.add(jCheckBox19); gruppoBott4.add(jCheckBox20); gruppoBott4.add(jCheckBox21); gruppoBott4.add(jCheckBox22); gruppoBott5.add(jCheckBox23); gruppoBott5.add(jCheckBox24); gruppoBott6.add(jCheckBox25); gruppoBott6.add(jCheckBox26); gruppoBott6.add(jCheckBox27); gruppoBott6.add(jCheckBox28); gruppoBott6.add(jCheckBox29); jButton1.addActionListener(new AzioneBottAddComponente(mainFrame,modRes)); panTipologia.add(jTextField5, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); panTipologia.add(jCheckBox7, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); panTipologia.add(jLabel5, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); panLocazione.add(jTextField4, new GridBagConstraints(3, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 10, 0, 0), 0, 0)); } GridBagLayout gridBagLayout1 = new GridBagLayout(); JPanel panLocazione = new JPanel(); TitledBorder titledBorder1 = new TitledBorder("Locazione"); GridBagLayout gridBagLayout2 = new GridBagLayout(); JLabel jLabel1 = new JLabel(); JTextField jTextField1 = new JTextField(); JLabel jLabel2 = new JLabel(); JTextField jTextField2 = new JTextField(); JLabel jLabel3 = new JLabel(); JTextField jTextField3 = new JTextField(); JLabel jLabel4 = new JLabel(); JTextField jTextField4 = new JTextField(); JPanel panUbi = new JPanel(); GridBagLayout gridBagLayout3 = new GridBagLayout(); TitledBorder titledBorder2 = new TitledBorder("Ubicazione"); JCheckBox jCheckBox1 = new JCheckBox(); JCheckBox jCheckBox2 = new JCheckBox(); JCheckBox jCheckBox3 = new JCheckBox(); JCheckBox jCheckBox4 = new JCheckBox(); JCheckBox jCheckBox5 = new JCheckBox(); JCheckBox jCheckBox6 = new JCheckBox(); 123 Appendice Codice Java JPanel panTipologia = new JPanel(); GridBagLayout gridBagLayout4 = new GridBagLayout(); JCheckBox jCheckBox7 = new JCheckBox(); JCheckBox jCheckBox8 = new JCheckBox(); JCheckBox jCheckBox9 = new JCheckBox(); JLabel jLabel5 = new JLabel(); JTextField jTextField5 = new JTextField(); JLabel jLabel6 = new JLabel(); JTextField jTextField6 = new JTextField(); JLabel jLabel7 = new JLabel(); JTextField jTextField7 = new JTextField(); JCheckBox jCheckBox10 = new JCheckBox(); JLabel jLabel8 = new JLabel(); JTextField jTextField8 = new JTextField(); JLabel jLabel9 = new JLabel(); JTextField jTextField9 = new JTextField(); TitledBorder titledBorder3 = new TitledBorder("Tipologia"); JPanel panImm = new JPanel(); TitledBorder titledBorder4 = new TitledBorder("Condizioni fisiche dell'unità immobiliare"); GridBagLayout gridBagLayout5 = new GridBagLayout(); JCheckBox jCheckBox11 = new JCheckBox(); JCheckBox jCheckBox12 = new JCheckBox(); JCheckBox jCheckBox13 = new JCheckBox(); JCheckBox jCheckBox14 = new JCheckBox(); JPanel panEdi = new JPanel(); GridBagLayout gridBagLayout6 = new GridBagLayout(); TitledBorder titledBorder5 = new TitledBorder("Condizioni fisiche dell'edificio"); JCheckBox jCheckBox15 = new JCheckBox(); JCheckBox jCheckBox16 = new JCheckBox(); JCheckBox jCheckBox17 = new JCheckBox(); JCheckBox jCheckBox18 = new JCheckBox(); JPanel panUso = new JPanel(); TitledBorder titledBorder6 = new TitledBorder("Destinazione d'uso"); GridBagLayout gridBagLayout7 = new GridBagLayout(); JCheckBox jCheckBox19 = new JCheckBox(); JCheckBox jCheckBox20 = new JCheckBox(); JCheckBox jCheckBox21 = new JCheckBox(); JCheckBox jCheckBox22 = new JCheckBox(); JScrollPane jScrollPane1 = new JScrollPane(); JTextPane jTextPane1 = new JTextPane(); JLabel jLabel10 = new JLabel(); JPanel panNucleo = new JPanel(); GridBagLayout gridBagLayout8 = new GridBagLayout(); TitledBorder titledBorder7 = new TitledBorder("Caratteristiche del nucle familiare residente"); ModelloTabellaResidenti modRes = new ModelloTabellaResidenti(); JButton jButton1 = new JButton(); JButton jButton2 = new JButton(); JScrollPane jScrollPane2 = new JScrollPane(); JTable jTable1 = new JTable(); JLabel jLabel11 = new JLabel(); JLabel jLabel12 = new JLabel(); JTextField jTextField10 = new JTextField(); JLabel jLabel13 = new JLabel(); JCheckBox jCheckBox23 = new JCheckBox(); JCheckBox jCheckBox24 = new JCheckBox(); JLabel jLabel14 = new JLabel(); JCheckBox jCheckBox25 = new JCheckBox(); JCheckBox jCheckBox26 = new JCheckBox(); JCheckBox jCheckBox27 = new JCheckBox(); JCheckBox jCheckBox28 = new JCheckBox(); JCheckBox jCheckBox29 = new JCheckBox(); JPanel jPanel8 = new JPanel(); GridBagLayout gridBagLayout9 = new GridBagLayout(); JButton jButton3 = new JButton(); JTextField txtArray[] = new JTextField[10]; JCheckBox chkArray[] = {jCheckBox1,jCheckBox2,jCheckBox3,jCheckBox4,jCheckBox5,jCheckBox6,jCheckBox7,jCheckBox8,jCheckBox9,jCh eckBox10,jCheckBox11,jCheckBox12,jCheckBox13,jCheckBox14,jCheckBox15,jCheckBox16,jCheckBox17,jCheckBox1 8,jCheckBox19,jCheckBox20,jCheckBox21,jCheckBox22,jCheckBox23,jCheckBox24,jCheckBox25,jCheckBox26,jChec kBox27,jCheckBox28,jCheckBox29}; JTable tabCond; ButtonGroup gruppoBott1 = new ButtonGroup(); 124 Appendice Codice Java ButtonGroup ButtonGroup ButtonGroup ButtonGroup ButtonGroup gruppoBott2 gruppoBott3 gruppoBott4 gruppoBott5 gruppoBott6 = = = = = new new new new new ButtonGroup(); ButtonGroup(); ButtonGroup(); ButtonGroup(); ButtonGroup(); public void insertModulo(ActionEvent e) { String cod = tabCond.getValueAt(tabCond.getSelectedRow(),0).toString(); IterazioneDb.insertPopolaBassi(cod,txtArray,chkArray,jTextPane1,jTable1,modRes); } public void rimuoviComponente(ActionEvent e) { int r = jTable1.getSelectedRow(); if(r>=0){ modRes.removeRow(r); int max = jTable1.getRowCount(); for(int i=0;i<max;i++){ modRes.setValueAt(i+1,i,0); } } } } class panBassiPopolazione_jButton2_actionAdapter implements ActionListener { private panBassiPopolazione adaptee; panBassiPopolazione_jButton2_actionAdapter(panBassiPopolazione adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.rimuoviComponente(e); } } class panBassiPopolazione_jButton3_actionAdapter implements ActionListener { private panBassiPopolazione adaptee; panBassiPopolazione_jButton3_actionAdapter(panBassiPopolazione adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.insertModulo(e); } } package sirena.interfaccia; import import import import import import import import import import import import import import import import javax.swing.JPanel; java.awt.GridBagLayout; java.awt.*; java.awt.Dimension; javax.swing.border.TitledBorder; javax.swing.JScrollPane; javax.swing.JTable; sirena.utility.ModelloTabellaBassiEsistenti; javax.swing.JLabel; javax.swing.JTextField; javax.swing.JButton; sirena.utility.TabellaBassiMouseListener; java.awt.event.ActionEvent; java.awt.event.ActionListener; db.IterazioneDb; javax.swing.JFrame; public class PanDatiBassi extends JPanel { JFrame mainFrame; public PanDatiBassi(ModelloTabellaBassiEsistenti m, JFrame mf) { mod = m; mainFrame = mf; jTable1.addMouseListener(new TabellaBassiMouseListener(jTable1,txtArray)); try { jbInit(); 125 Appendice Codice Java } catch (Exception ex) { ex.printStackTrace(); } } private void jbInit() throws Exception { this.setLayout(gridBagLayout1); jScrollPane1.setBorder(null); jScrollPane1.setMinimumSize(new Dimension(600, 100)); jScrollPane1.setPreferredSize(new Dimension(600, 100)); jPanel1.setBorder(titledBorder2); jPanel1.setMinimumSize(new Dimension(700, 200)); jPanel1.setPreferredSize(new Dimension(700, 200)); jPanel1.setLayout(gridBagLayout2); jTable1.setModel(mod); jLabel1.setText("(Via, Piazza, Vico, Largo, ecc.)"); jLabel2.setText("n. civico"); jLabel3.setText("Ricadente nell\'edificio sito in (Via, Piazza, ecc.)"); jTextField1.setEditable(false); jTextField1.setColumns(40); jTextField2.setEditable(false); jTextField2.setColumns(5); jTextField3.setEditable(false); jTextField3.setColumns(30); jLabel4.setText("n. civico"); jTextField4.setEditable(false); jTextField4.setColumns(5); jButton1.setText("Visualizza le altre info"); jButton1.addActionListener(new PanDatiBassi_jButton1_actionAdapter(this)); jPanel2.setBorder(titledBorder1); jPanel2.setMinimumSize(new Dimension(700, 200)); jPanel2.setPreferredSize(new Dimension(700, 200)); jPanel2.setLayout(gridBagLayout3); jButton2.setText("Rimuovi Basso"); jButton2.addActionListener(new PanDatiBassi_jButton2_actionAdapter(this)); jLabel5.setText( "(Selezionare una riga della tabella per visualizzare le informazioni " + "relative a quel Basso)"); jButton3.setText("Modifica Localizzazione Basso"); jButton3.addActionListener(new PanDatiBassi_jButton3_actionAdapter(this)); jPanel1.add(jLabel2, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); jPanel1.add(jLabel1, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jPanel1.add(jLabel3, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); jPanel1.add(jTextField2, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 15, 0, 0), 0, 0)); jPanel1.add(jTextField3, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 15, 0, 0), 0, 0)); jPanel1.add(jLabel4, new GridBagConstraints(2, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(20, 20, 0, 0), 0, 0)); jPanel1.add(jTextField4, new GridBagConstraints(3, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(20, 10, 0, 0), 0, 0)); jPanel1.add(jTextField1, new GridBagConstraints(1, 0, 3, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 15, 0, 0), 0, 0)); this.add(jPanel2, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jScrollPane1.getViewport().add(jTable1); this.add(jPanel1, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(40, 0, 0, 0), 0, 0)); 126 Appendice Codice Java jPanel2.add(jScrollPane1, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jPanel2.add(jButton2, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); jPanel2.add(jLabel5, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 0, 0, 0), 0, 0)); jPanel1.add(jButton1, new GridBagConstraints(2, 3, 2, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 15, 0, 0), 0, 0)); jPanel1.add(jButton3, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0 , GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(20, 15, 0, 0), 0, 0)); } ModelloTabellaBassiEsistenti mod; GridBagLayout gridBagLayout1 = new GridBagLayout(); TitledBorder titledBorder1 = new TitledBorder("Elenco dei Bassi registrati in questo edificio"); JScrollPane jScrollPane1 = new JScrollPane(); JPanel jPanel1 = new JPanel(); TitledBorder titledBorder2 = new TitledBorder("Info Basso localizzazione"); TitledBorder titledBorder3 = new TitledBorder("Tipologia Basso"); JTable jTable1 = new JTable(); GridBagLayout gridBagLayout2 = new GridBagLayout(); JLabel jLabel1 = new JLabel(); JLabel jLabel2 = new JLabel(); JLabel jLabel3 = new JLabel(); JTextField jTextField1 = new JTextField(); JTextField jTextField2 = new JTextField(); JTextField jTextField3 = new JTextField(); JLabel jLabel4 = new JLabel(); JTextField jTextField4 = new JTextField(); JButton jButton1 = new JButton(); JPanel jPanel2 = new JPanel(); GridBagLayout gridBagLayout3 = new GridBagLayout(); JButton jButton2 = new JButton(); JLabel jLabel5 = new JLabel(); JTextField txtArray[] = {jTextField1,jTextField2,jTextField3,jTextField4}; JButton jButton3 = new JButton(); public void rimuoviBasso(ActionEvent e) { int id=-1; int r = jTable1.getSelectedRow(); if(r>-1) { String idString = jTable1.getValueAt(r, 0).toString(); id = Integer.parseInt(idString); IterazioneDb.rimuoviBasso(id, jTable1, mod, txtArray); } } public void visualAltreInfo(ActionEvent e) { int id; int r = jTable1.getSelectedRow(); if(r>-1) { String idString = jTable1.getValueAt(r, 0).toString(); id = Integer.parseInt(idString); new DialogAltreInfo(mainFrame,id); } } public void modificaLocalizzazioneBasso(ActionEvent e) { int id; int r = jTable1.getSelectedRow(); if(r>-1) { String idString = jTable1.getValueAt(r, 0).toString(); id = Integer.parseInt(idString); new DialogModLocalBassi(mainFrame, id,txtArray); } } } 127 Appendice Codice Java class PanDatiBassi_jButton3_actionAdapter implements ActionListener { private PanDatiBassi adaptee; PanDatiBassi_jButton3_actionAdapter(PanDatiBassi adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.modificaLocalizzazioneBasso(e); } } class PanDatiBassi_jButton1_actionAdapter implements ActionListener { private PanDatiBassi adaptee; PanDatiBassi_jButton1_actionAdapter(PanDatiBassi adaptee) { this.adaptee = adaptee; } } public void actionPerformed(ActionEvent e) { adaptee.visualAltreInfo(e); } class PanDatiBassi_jButton2_actionAdapter implements ActionListener { private PanDatiBassi adaptee; PanDatiBassi_jButton2_actionAdapter(PanDatiBassi adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.rimuoviBasso(e); } } package sirena.interfaccia; import import import import import import javax.swing.*; java.awt.BorderLayout; java.awt.Dimension; javax.swing.border.TitledBorder; java.awt.GridBagLayout; java.awt.*; public class PanEdGen extends JPanel { public PanEdGen(JTextField txtArray[]) { txtArray[0] = jTextField1; txtArray[1] = jTextField2; txtArray[2] = jTextField3; txtArray[3] = jTextField4; txtArray[4] = jTextField5; try { jbInit(); } catch (Exception ex) { ex.printStackTrace(); } } private void jbInit() throws Exception { this.setLayout(gridBagLayout1); this.setPreferredSize(new Dimension(800, 600)); jPanel1.setBorder(titledBorder1); jPanel1.setMinimumSize(new Dimension(750, 400)); jPanel1.setPreferredSize(new Dimension(750, 400)); jPanel1.setLayout(gridBagLayout2); jLabel1.setText("Indirizzo"); jTextField1.setMinimumSize(new Dimension(251, 19)); jTextField1.setEditable(false); jTextField1.setColumns(30); jLabel2.setText("Comune"); jTextField2.setMinimumSize(new Dimension(171, 19)); jTextField2.setEditable(false); jTextField2.setColumns(20); 128 Appendice Codice Java } jLabel3.setText("Protocollo Servizio"); jLabel4.setText("Anno Protocollo"); jTextField3.setMinimumSize(new Dimension(171, 19)); jTextField3.setEditable(false); jTextField3.setColumns(20); jTextField4.setMinimumSize(new Dimension(91, 19)); jTextField4.setToolTipText(""); jTextField4.setEditable(false); jTextField4.setColumns(10); jLabel6.setText("Circoscrizione"); jTextField5.setMinimumSize(new Dimension(171, 19)); jTextField5.setEditable(false); jTextField5.setColumns(25); this.add(jPanel1, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jPanel1.add(jTextField1, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 15, 0, 0), 0, 0)); jPanel1.add(jLabel1, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); jPanel1.add(jTextField2, new GridBagConstraints(3, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 15, 0, 0), 0, 0)); jPanel1.add(jLabel2, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0 , GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 50, 0, 0), 0, 0)); jPanel1.add(jLabel3, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); jPanel1.add(jLabel4, new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(20, 50, 0, 0), 0, 0)); jPanel1.add(jTextField3, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 15, 0, 0), 0, 0)); jPanel1.add(jTextField4, new GridBagConstraints(3, 1, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 15, 0, 0), 0, 0)); jPanel1.add(jTextField5, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(20, 15, 0, 0), 0, 0)); jPanel1.add(jLabel6, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(20, 0, 0, 0), 0, 0)); TitledBorder titledBorder1 = new TitledBorder("Info Generali"); GridBagLayout gridBagLayout1 = new GridBagLayout(); JPanel jPanel1 = new JPanel(); GridBagLayout gridBagLayout2 = new GridBagLayout(); JLabel jLabel1 = new JLabel(); JTextField jTextField1 = new JTextField(); JLabel jLabel2 = new JLabel(); JTextField jTextField2 = new JTextField(); JLabel jLabel3 = new JLabel(); JLabel jLabel4 = new JLabel(); JTextField jTextField3 = new JTextField(); JTextField jTextField4 = new JTextField(); JLabel jLabel6 = new JLabel(); JTextField jTextField5 = new JTextField(); } package sirena.interfaccia; import import import import import import import java.awt.*; javax.swing.*; com.borland.jbcl.layout.XYLayout; com.declarativa.interprolog.TermModel; com.ontotext.flora2.XSBFlora; javax.swing.border.TitledBorder; sirena.utility.TabPaneMouseListener; 129 Appendice Codice Java import import import import import import import import import import import import import sirena.utility.ModelloTabella; sirena.utility.azioneRadioBottoneSi; java.awt.event.MouseAdapter; sirena.utility.AzioneRadioBottoneNo; sirena.utility.EseguiFile; sirena.utility.ModelloTabellaLavori; sirena.utility.ModelloTabellaProspetti; sirena.utility.AzioneBottAddLavoro; sirena.utility.AzioneBottVisualLav; sirena.utility.AzioneBottModificaComputo; sirena.utility.ModelloTabellaBassiEsistenti; sirena.utility.TableRenderCondomini; sirena.utility.TabellaCondomini; public class Panello1 { ImageIcon titolo = new ImageIcon("./../java/immagini/splash.jpg","TITOLO"); JLabel labelTitolo = new JLabel(); JFrame mainFrame; JPanel display; JPanel panMenu = new JPanel(); JPanel panMain = new JPanel(); PanEdGen panTab0; JPanel panTab1 = new JPanel(); JPanel panTab2 = new JPanel(); JPanel panTab3 = new JPanel(); JPanel panTab4 = new JPanel(); JPanel panTab5 = new JPanel(); panBassiPopolazione panTab6; PanDatiBassi panTab7; XYLayout xYLayout3 = new XYLayout(); XYLayout xYLayout2 = new XYLayout(); XSBFlora flora; JTabbedPane schede = new JTabbedPane(); Font Font Font Font fontLabel = new Font("Verdana",1,11); fontTxt = new Font("Verdana",0,11); fontTxt2 = new Font("Verdana",Font.ITALIC,11); fontBordo = new Font("Verdana",1,13); Box bv = Box.createVerticalBox(); ModelloTabella modTab = new ModelloTabella(); TabellaCondomini tabCondomini = new TabellaCondomini(modTab); ModelloTabellaLavori modLav = new ModelloTabellaLavori(); JTable tabLavori = new JTable(modLav); ModelloTabellaBassiEsistenti modBassi = new ModelloTabellaBassiEsistenti(); JTextField [][] txtEdDatGen = new JTextField[8][]; JRadioButton [][] radioBott = new JRadioButton[8][]; JButton [][] bottoni = new JButton[8][]; ButtonGroup gruppoBott1 = new ButtonGroup(); ButtonGroup gruppoBott2 = new ButtonGroup(); ButtonGroup gruppoBott3 = new ButtonGroup(); JCheckBox [][] chackBox = new JCheckBox[8][]; JTextArea [][] txtArea = new JTextArea[8][]; JLabel JLabel JLabel JLabel [] [] [] [] labelImprese = new JLabel[16]; labelRelTec = new JLabel[6]; labelDIA = new JLabel[7]; labelComputo = new JLabel[6]; public Panello1(JFrame frame, JPanel panel, XSBFlora fl) { mainFrame = frame; display = panel; display.setLayout(new BorderLayout()); flora = fl; try { jbInit(); 130 Appendice Codice Java } catch (Exception exception) { exception.printStackTrace(); } } private void jbInit() throws Exception { Object[] bindings = null; panMenu.setBorder(BorderFactory.createEtchedBorder()); panMenu.setSize(200,600); panMain.setBackground(Color.lightGray); panMain.setBorder(null); panMain.setLayout(new BorderLayout()); panMain.setSize(600,600); display.add("West",panMenu); display.add("Center",panMain); tabCondomini.setFont(fontTxt); Object o = new Object(); tabCondomini.setDefaultRenderer(o.getClass(),new TableRenderCondomini(flora)); JScrollPane sp = new JScrollPane(tabCondomini); tabCondomini.setPreferredScrollableViewportSize(new Dimension(100,400)); sp.setBackground(Color.lightGray); labelTitolo.setHorizontalAlignment(SwingConstants.CENTER); labelTitolo.setIcon(titolo); labelTitolo.setSize(195,90); txtEdDatGen[0] txtEdDatGen[1] txtEdDatGen[2] txtEdDatGen[3] txtEdDatGen[4] txtEdDatGen[5] txtEdDatGen[6] = = = = = = = new new new new new new new JTextField[5]; JTextField[23]; JTextField[7]; JTextField[15]; JTextField[3]; JTextField[6]; JTextField[2]; radioBott[2] = new JRadioButton[4]; radioBott[4] = new JRadioButton[6]; bottoni[4] = new JButton[6]; chackBox[2] = new JCheckBox[3]; chackBox[6] = new JCheckBox[29]; txtArea[2] = new JTextArea[2]; txtArea[3] = new JTextArea[1]; txtArea[4] = new JTextArea[1]; txtArea[5] = new JTextArea[1]; this.costrisciImprese(panTab3); this.costrusciDIA(panTab4); this.costruisciComputoEstimativo(panTab5); panTab0 = new PanEdGen(txtEdDatGen[0]); txtEdDatGen[6][0] = new JTextField(); txtEdDatGen[6][1] = new JTextField(); panTab6 = new panBassiPopolazione(tabCondomini,mainFrame,txtEdDatGen[6]); panTab7 = new PanDatiBassi(modBassi,mainFrame); JScrollPane JScrollPane JScrollPane JScrollPane scrollTab0 = new JScrollPane(panTab0); scrollTab = new JScrollPane(panTab1); scrollTab2 = new JScrollPane(panTab2); scrollTab3 = new JScrollPane(panTab3); JScrollPane JScrollPane JScrollPane JScrollPane scrollTab5 scrollTab6 scrollTab7 scrollTab8 = = = = new new new new JScrollPane(panTab4); JScrollPane(panTab5); JScrollPane(panTab6); JScrollPane(panTab7); schede.addTab("Dati Generali",scrollTab0); schede.addTab("Dati Generali - LM",scrollTab); schede.addTab("Dati Catastali - Dati Storici",scrollTab2); 131 Appendice Codice Java schede.addTab("Imprese",scrollTab3); schede.addTab("Rel. Tecnica Ass. - DIA - Beni Culturali",scrollTab5); schede.addTab("Computo estimativo",scrollTab6); schede.addTab("Inserimento caratt. e dest. d'uso bassi",scrollTab7); schede.addTab("Visualizza/Modifica Info Bassi",scrollTab8); MouseAdapter listenerMouse = new TabPaneMouseListener(schede,tabCondomini,txtEdDatGen,flora,mainFrame,radioBott,chackBox,txtArea,modLav, bottoni, modBassi,panTab1,panTab2); tabCondomini.addMouseListener(listenerMouse); schede.addMouseListener(listenerMouse); panMain.add(schede); bv.add(labelTitolo); bv.add(Box.createVerticalStrut(5)); bv.add(sp); panMenu.add(bv); mainFrame.setVisible(true); /* Costruzione della tabella dei condomini */ Object elem[] = new Object[1]; bindings = flora.FLogicCommand("X:progetti."); for (int i = 0; i < bindings.length; i++) { TermModel tm = (TermModel)bindings[i]; elem[0] = flora.findValue(tm,"X"); modTab.insertRow(0,elem); } System.gc(); } private int Box Box Box Box void costrisciImprese (JPanel pan) { i=0; bv[] = new Box[2]; bv2 = Box.createVerticalBox(); bh2 = Box.createHorizontalBox(); bh; JPanel imprese = new JPanel(); JPanel impreseSub = new JPanel(); TitledBorder bordoImprese = new TitledBorder("Dati Imprese"); bordoImprese.setTitleColor(Color.RED); bordoImprese.setTitleFont(fontBordo); imprese.setBorder(bordoImprese); TitledBorder bordoImpreseSub = new TitledBorder("Dati Imprese"); bordoImpreseSub.setTitleColor(Color.RED); bordoImpreseSub.setTitleFont(fontBordo); impreseSub.setBorder(bordoImprese); for(i=0;i<2;i++) { bv[i] = Box.createVerticalBox(); } for(i=0;i<=13;i++) { 132 Appendice Codice Java txtEdDatGen[3][i] = new JTextField(20); txtEdDatGen[3][i].setEditable(false); txtEdDatGen[3][i].setFont(fontTxt); labelImprese[i] = new JLabel(); labelImprese[i].setFont(fontLabel); bh = Box.createHorizontalBox(); if(i%2==0){ bh.add(labelImprese[i]); bh.add(Box.createHorizontalStrut(10)); bh.add(txtEdDatGen[3][i]); bv[0].add(bh); bv[0].add(Box.createVerticalStrut(15)); } if(i%2!=0) { bh.add(labelImprese[i]); bh.add(Box.createHorizontalStrut(10)); bh.add(txtEdDatGen[3][i]); bv[1].add(bh); bv[1].add(Box.createVerticalStrut(15)); } } bh2.add(Box.createHorizontalStrut(20)); bh2.add(bv[0]); bh2.add(Box.createHorizontalStrut(100)); bh2.add(bv[1]); bv2.add(bh2); bv2.add(Box.createVerticalStrut(15)); labelImprese[14] = new JLabel("Altre info"); labelImprese[14].setFont(fontLabel); txtArea[3][0] = new JTextArea(10,70); txtArea[3][0].setBorder(new TitledBorder("")); txtArea[3][0].setEditable(false); bh = Box.createHorizontalBox(); bh.add(labelImprese[14]); bh.add(Box.createHorizontalStrut(10)); JScrollPane sp = new JScrollPane(txtArea[3][0]); bh.add(sp); bv2.add(bh); imprese.add(bv2); bv2 = Box.createVerticalBox(); bv2.add(Box.createVerticalStrut(30)); bv2.add(imprese); bv2.add(Box.createVerticalStrut(30)); labelImprese[15] = new JLabel("Presente impresa subalpaltatrice"); labelImprese[15].setFont(fontLabel); txtEdDatGen[3][14] = new JTextField(5); txtEdDatGen[3][14].setEditable(false); txtEdDatGen[3][14].setFont(fontTxt); bh = Box.createHorizontalBox(); bh.add(labelImprese[15]); bh.add(Box.createHorizontalStrut(10)); bh.add(txtEdDatGen[3][14]); impreseSub.add(bh); bv2.add(impreseSub); pan.add(bv2); 133 Appendice Codice Java labelImprese[0].setText("Ragione sociale"); labelImprese[1].setText("CAP 1"); labelImprese[2].setText("CAP 2"); labelImprese[3].setText("Città 1"); labelImprese[4].setText("Città 2"); labelImprese[5].setText("E-mail"); labelImprese[6].setText("Partita IVA"); labelImprese[7].setText("Data inserimento"); labelImprese[8].setText("Fax"); labelImprese[9].setText("Sede legale"); labelImprese[10].setText("Sede Operativa"); labelImprese[11].setText("Telefono 1"); labelImprese[12].setText("Telefono 2"); labelImprese[13].setText("Tipo Impresa"); } private int Box Box Box void costrusciDIA (JPanel pan) { i = 0; bv[] = new Box[2]; bv2 = Box.createVerticalBox(); bh; JPanel relazione = new JPanel(); TitledBorder bordoRel = new TitledBorder("Relazione Tecnica Asseverata"); bordoRel.setTitleColor(Color.RED); bordoRel.setTitleFont(fontBordo); relazione.setBorder(bordoRel); JPanel dia = new JPanel(); TitledBorder bordoDia = new TitledBorder("Denuncia di Inizio Attività"); bordoDia.setTitleColor(Color.RED); bordoDia.setTitleFont(fontBordo); dia.setBorder(bordoDia); JPanel approvazione = new JPanel(); TitledBorder bordoApp = new TitledBorder("Approvazione Beni Culturali"); bordoApp.setTitleColor(Color.RED); bordoApp.setTitleFont(fontBordo); approvazione.setBorder(bordoApp); /* Pannello REL TECNICA */ labelDIA[0] = new JLabel(); labelDIA[0].setFont(fontLabel); radioBott[4][0] = new JRadioButton("Si"); radioBott[4][1] = new JRadioButton("No"); gruppoBott1.add(radioBott[4][0]); gruppoBott1.add(radioBott[4][1]); bh = Box.createHorizontalBox(); bh.add(labelDIA[0]); bh.add(Box.createHorizontalStrut(10)); bh.add(radioBott[4][0]); bh.add(Box.createHorizontalStrut(10)); bh.add(radioBott[4][1]); relazione.add(bh); bv[0] = Box.createVerticalBox(); bv[0].add(bh); bv[0].add(Box.createVerticalStrut(10)); bh = Box.createHorizontalBox(); bottoni[4][0] = new JButton("Seleziona File"); bh.add(bottoni[4][0]); bh.add(Box.createHorizontalStrut(15)); txtEdDatGen[4][0] = new JTextField(60); 134 Appendice Codice Java txtEdDatGen[4][0].setFont(fontTxt2); bh.add(txtEdDatGen[4][0]); bottoni[4][0].addActionListener(new SelectFileBeni(txtEdDatGen[4][0],mainFrame,tabCondomini,1)); bv[0].add(bh); bh = Box.createHorizontalBox(); bottoni[4][1] = new JButton(); bottoni[4][1].setText("Apri Relazione Tecnica"); labelDIA[0].setText("File Relazione Tecnica Asseverata:"); bottoni[4][1].addActionListener(new EseguiFile(txtEdDatGen[4][0])); bh.add(bottoni[4][1]); radioBott[4][0].addActionListener(new azioneRadioBottoneSi(bottoni[4][0],bottoni[4][1],txtEdDatGen[4][0])); radioBott[4][1].addActionListener(new AzioneRadioBottoneNo(bottoni[4][0],bottoni[4][1],txtEdDatGen[4][0],tabCondomini,1)); bv[0].add(Box.createVerticalStrut(10)); bv[0].add(bh); relazione.add(bv[0]); /* Pannello DIA */ labelDIA[1] = new JLabel(); labelDIA[1].setFont(fontLabel); radioBott[4][2] = new JRadioButton("Si"); radioBott[4][3] = new JRadioButton("No"); gruppoBott2.add(radioBott[4][2]); gruppoBott2.add(radioBott[4][3]); bh = Box.createHorizontalBox(); bh.add(labelDIA[1]); bh.add(Box.createHorizontalStrut(10)); bh.add(radioBott[4][2]); bh.add(Box.createHorizontalStrut(10)); bh.add(radioBott[4][3]); dia.add(bh); bv[0] = Box.createVerticalBox(); bv[0].add(bh); bv[0].add(Box.createVerticalStrut(10)); bh = Box.createHorizontalBox(); bottoni[4][2] = new JButton("Seleziona File"); bh.add(bottoni[4][2]); bh.add(Box.createHorizontalStrut(15)); txtEdDatGen[4][1] = new JTextField(60); txtEdDatGen[4][1].setFont(fontTxt2); bh.add(txtEdDatGen[4][1]); bottoni[4][2].addActionListener(new SelectFileBeni(txtEdDatGen[4][1],mainFrame,tabCondomini,2)); bv[0].add(bh); bh = Box.createHorizontalBox(); bottoni[4][3] = new JButton(); bottoni[4][3].setText("Apri File Dia"); labelDIA[1].setText("File Denuncia di Inizio Attività:"); bottoni[4][3].addActionListener(new EseguiFile(txtEdDatGen[3][1])); bh.add(bottoni[4][3]); 135 Appendice Codice Java radioBott[4][2].addActionListener(new azioneRadioBottoneSi(bottoni[4][2],bottoni[4][3],txtEdDatGen[4][1])); radioBott[4][3].addActionListener(new AzioneRadioBottoneNo(bottoni[4][2],bottoni[4][3],txtEdDatGen[4][1],tabCondomini,2)); bv[0].add(Box.createVerticalStrut(10)); bv[0].add(bh); dia.add(bv[0]); /* Pannello BENI CULTURALI */ labelDIA[2] = new JLabel(); labelDIA[2].setFont(fontLabel); radioBott[4][4] = new JRadioButton("Si"); radioBott[4][5] = new JRadioButton("No"); gruppoBott3.add(radioBott[4][4]); gruppoBott3.add(radioBott[4][5]); bh = Box.createHorizontalBox(); bh.add(labelDIA[2]); bh.add(Box.createHorizontalStrut(10)); bh.add(radioBott[4][4]); bh.add(Box.createHorizontalStrut(10)); bh.add(radioBott[4][5]); approvazione.add(bh); bv[0] = Box.createVerticalBox(); bv[0].add(bh); bv[0].add(Box.createVerticalStrut(10)); bh = Box.createHorizontalBox(); bottoni[4][4] = new JButton("Seleziona File"); bh.add(bottoni[4][4]); bh.add(Box.createHorizontalStrut(15)); txtEdDatGen[4][2] = new JTextField(60); txtEdDatGen[4][2].setFont(fontTxt2); bh.add(txtEdDatGen[4][2]); bottoni[4][4].addActionListener(new SelectFileBeni(txtEdDatGen[4][2],mainFrame,tabCondomini,3)); bv[0].add(bh); bh = Box.createHorizontalBox(); bottoni[4][5] = new JButton(); bottoni[4][5].setText("Apri File Approvazione"); labelDIA[2].setText("File Approvazione Beni Culturali:"); bottoni[4][5].addActionListener(new EseguiFile(txtEdDatGen[3][2])); bh.add(bottoni[4][5]); radioBott[4][4].addActionListener(new azioneRadioBottoneSi(bottoni[4][4],bottoni[4][5],txtEdDatGen[4][2])); radioBott[4][5].addActionListener(new AzioneRadioBottoneNo(bottoni[4][4],bottoni[4][5],txtEdDatGen[4][2],tabCondomini,3)); bv[0].add(Box.createVerticalStrut(10)); bv[0].add(bh); approvazione.add(bv[0]); bv2.add(Box.createVerticalStrut(30)); bv2.add(relazione); bv2.add(Box.createVerticalStrut(15)); bv2.add(dia); 136 Appendice Codice Java bv2.add(Box.createVerticalStrut(15)); bv2.add(approvazione); pan.add(bv2); } private int Box Box Box Box Box void costruisciComputoEstimativo (JPanel pan) { i = 0; bv[] = new Box[2]; bvTmp = Box.createVerticalBox(); bv2 = Box.createVerticalBox(); bh2 = Box.createHorizontalBox(); bh; JPanel intestazione = new JPanel(); TitledBorder bordoIntestazione = new TitledBorder("Intestazione"); bordoIntestazione.setTitleColor(Color.RED); bordoIntestazione.setTitleFont(fontBordo); intestazione.setBorder(bordoIntestazione); JPanel lavori = new JPanel(); TitledBorder bordoLavori = new TitledBorder("Lavori"); bordoLavori.setTitleColor(Color.RED); bordoLavori.setTitleFont(fontBordo); lavori.setBorder(bordoLavori); JPanel prospetti = new JPanel(); TitledBorder bordoProspetti = new TitledBorder("Prospetti"); bordoProspetti.setTitleColor(Color.RED); bordoProspetti.setTitleFont(fontBordo); prospetti.setBorder(bordoProspetti); JPanel addLavori = new JPanel(); JPanel addProspetto = new JPanel(); for(i=0;i<2;i++) { bv[i] = Box.createVerticalBox(); } for(i=0;i<=3;i++) { txtEdDatGen[5][i] = new JTextField(20); txtEdDatGen[5][i].setEditable(false); txtEdDatGen[5][i].setFont(fontTxt); labelComputo[i] = new JLabel(); labelComputo[i].setFont(fontLabel); bh = Box.createHorizontalBox(); if(i%2==0){ bh.add(labelComputo[i]); bh.add(Box.createHorizontalStrut(15)); bh.add(txtEdDatGen[5][i]); bv[0].add(bh); bv[0].add(Box.createVerticalStrut(20)); } if(i%2!=0) { bh.add(labelComputo[i]); bh.add(Box.createHorizontalStrut(15)); bh.add(txtEdDatGen[5][i]); bv[1].add(bh); bv[1].add(Box.createVerticalStrut(20)); } } bh2.add(bv[0]); bh2.add(Box.createHorizontalStrut(100)); bh2.add(bv[1]); 137 Appendice Codice Java bvTmp.add(bh2); JButton modComputo = new JButton("Modifica"); modComputo.addActionListener(new AzioneBottModificaComputo(mainFrame,tabCondomini,txtEdDatGen[5])); bh = Box.createHorizontalBox(); bh.add(modComputo); bvTmp.add(Box.createVerticalStrut(10)); bvTmp.add(bh); intestazione.add(bvTmp); //Tabella Lavori lavori.setLayout(new BorderLayout()); tabLavori.setPreferredScrollableViewportSize(new Dimension(700,100)); JScrollPane scrollTabLavori = new JScrollPane(tabLavori); scrollTabLavori.setViewportBorder(new TitledBorder("")); lavori.add("Center",scrollTabLavori); JButton addDesignazione = new JButton("Aggiungi"); addDesignazione.addActionListener(new AzioneBottAddLavoro(mainFrame,modLav,tabCondomini)); addLavori.add(addDesignazione); JButton removeDesignazione = new JButton("Rimuovi"); addLavori.add(removeDesignazione); JButton visualDesignazione = new JButton("Visualizza"); visualDesignazione.addActionListener(new AzioneBottVisualLav(mainFrame,tabLavori)); addLavori.add(visualDesignazione); lavori.add("North",addLavori); //Tabella Prospetti prospetti.setLayout(new BorderLayout()); JTable tabProspetti = new JTable(new ModelloTabellaProspetti()); tabProspetti.setPreferredScrollableViewportSize(new Dimension(700,100)); JScrollPane scrollTabProspetti = new JScrollPane(tabProspetti); scrollTabProspetti.setViewportBorder(new TitledBorder("")); prospetti.add("Center",scrollTabProspetti); JButton bottAdd = new JButton("Aggiungi"); addProspetto.add(bottAdd); JButton removeProspetto = new JButton("Rimuovi"); addProspetto.add(removeProspetto); JButton visualProspetto = new JButton("Visualizza"); addProspetto.add(visualProspetto); prospetti.add("North",addProspetto); bv2.add(Box.createVerticalStrut(30)); bv2.add(intestazione); bv2.add(Box.createVerticalStrut(15)); bv2.add(lavori); bv2.add(Box.createVerticalStrut(15)); bv2.add(prospetti); pan.add(bv2); labelComputo[0].setText("Data:"); labelComputo[1].setText("Committente:"); labelComputo[2].setText("Oggetto:"); labelComputo[3].setText("Tecnico:"); } } package sirena.interfaccia; import javax.swing.table.DefaultTableModel; 138 Appendice Codice Java import import import import import java.sql.DriverManager; java.sql.ResultSet; java.sql.Statement; java.sql.Connection; java.sql.SQLException; public class RiempiTabellaLavori { String cod_sirena; DefaultTableModel tabella; public RiempiTabellaLavori(String cod, DefaultTableModel tab) { cod_sirena = cod; tabella = tab; riempi(); } private void riempi() { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection conn = DriverManager.getConnection("jdbc:odbc:SirenaDB2", "", ""); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery( "SELECT * FROM Designazione_lavori WHERE (Cod_sirena = '" + cod_sirena + "') ORDER BY id_designazione desc"); if(rs.next()){ Object array[] = new Object[3]; array[0] = rs.getInt("id_designazione"); array[1] = rs.getString("Num_ordinativo"); array[2] = rs.getString("Lavoro"); tabella.insertRow(0,array); } }catch(SQLException e) { System.out.println(e.getMessage()); e.printStackTrace(System.out); System.exit(1); } catch(ClassNotFoundException e) { System.out.println(e.toString()); System.out.println("Il driver non può essere caricato"); System.exit(1); } } } package sirena.interfaccia; import import import import import import java.awt.event.*; javax.swing.JTextField; javax.swing.JFileChooser; javax.swing.JFrame; javax.swing.JTable; db.IterazioneDb; public class SelectFileBeni implements ActionListener { private JTextField dir = new JTextField(); private JFrame mainFrame = new JFrame(); private JTable tabEdi; private int tipoFile; public SelectFileBeni(JTextField txt, JFrame mf,JTable tabEd, int tipo) { dir = txt; mainFrame = mf; tabEdi = tabEd; tipoFile = tipo; } 139 Appendice Codice Java public void actionPerformed(ActionEvent e) { JFileChooser c = new JFileChooser(); // Dimostra la finestra di dialogo Open int rVal = c.showOpenDialog(mainFrame); if (rVal == JFileChooser.APPROVE_OPTION) { String percorso = c.getSelectedFile().toString(); String codSir = tabEdi.getValueAt(tabEdi.getSelectedRow(),0).toString(); IterazioneDb.InsertFileSelezionato (codSir, percorso, tipoFile); dir.setText(percorso); } } } package sirena.interfaccia; import javax.swing.*; import import import import import import import javax.swing.*; java.awt.GridBagLayout; java.awt.*; java.awt.Dimension; java.awt.Font; java.awt.event.ActionEvent; java.awt.event.ActionListener; public class VisualizzaLavori extends JDialog { String ordinativo,lavoro; public VisualizzaLavori(JFrame padre, String ord, String lav) { super(padre,"Lavori",true); this.setSize(585,352); ordinativo = ord; lavoro = lav; try { jbInit(); } catch (Exception ex) { ex.printStackTrace(); } } private void jbInit() throws Exception { this.getContentPane().setLayout(gridBagLayout1); labelOrd.setFont(new java.awt.Font("Verdana", Font.BOLD, 12)); labelOrd.setText("Num. Ord. TARIFFA:"); labelLavoro.setFont(new java.awt.Font("Verdana", Font.BOLD, 12)); labelLavoro.setText("Designazione Lavori:"); areaLavori.setMinimumSize(new Dimension(200, 50)); txtOrd.setMinimumSize(new Dimension(50, 20)); bottOK.setText("CHIUDI"); bottOK.addActionListener(new VisualizzaLavori_bottOK_actionAdapter(this)); scrollArea.setMinimumSize(new Dimension(200, 50)); scrollArea.setPreferredSize(new Dimension(250,100)); labelTitolo.setFont(new java.awt.Font("Arial", Font.PLAIN, 18)); labelTitolo.setText("DESIGNAZIONE LAVORI"); areaLavori.setPreferredSize(new Dimension(250,100)); txtOrd.setColumns(20); this.getContentPane().add(scrollArea, new GridBagConstraints(2, 2, 1, 1, 0.0, 0.0 , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); scrollArea.getViewport().add(areaLavori); this.getContentPane().add(txtOrd, 140 Appendice Codice Java } new GridBagConstraints(2, 1, 1, 1, 0.0, , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 30, 0), 0, 0)); this.getContentPane().add(labelOrd, new GridBagConstraints(0, 1, 1, 1, 0.0, , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 30, 0), 0, 0)); this.getContentPane().add(labelLavoro, new GridBagConstraints(0, 2, 1, 1, 0.0, , GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); this.getContentPane().add(bottOK, new GridBagConstraints(1, 3, 1, 1, 0.0, , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(10, 0, 0, 0), 0, 0)); this.getContentPane().add(labelTitolo, new GridBagConstraints(0, 0, 3, 1, 0.0, , GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 50, 15), 0, 0)); areaLavori.setText(lavoro); txtOrd.setText(ordinativo); this.setVisible(true); GridBagLayout gridBagLayout1 = new GridBagLayout(); JLabel labelOrd = new JLabel(); JLabel labelLavoro = new JLabel(); JTextField txtOrd = new JTextField(); JScrollPane scrollArea = new JScrollPane(); JTextPane areaLavori = new JTextPane(); JButton bottOK = new JButton(); JLabel labelTitolo = new JLabel(); public void bottOK_actionPerformed(ActionEvent e) { this.dispose(); } } class VisualizzaLavori_bottOK_actionAdapter implements ActionListener { private VisualizzaLavori adaptee; VisualizzaLavori_bottOK_actionAdapter(VisualizzaLavori adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.bottOK_actionPerformed(e); } } /* Package Utility*/ package sirena.utility; import import import import import import import import import import import import import import import import import java.awt.event.MouseAdapter; javax.swing.JTable; javax.swing.JTabbedPane; javax.swing.JTextField; java.awt.event.MouseEvent; com.declarativa.interprolog.TermModel; com.ontotext.flora2.XSBFlora; sirena.interfaccia.AvvisoSelezione; javax.swing.JFrame; javax.swing.JRadioButton; javax.swing.JCheckBox; javax.swing.JTextArea; db.IterazioneDb; javax.swing.JButton; javax.swing.border.TitledBorder; javax.swing.JPanel; javax.swing.JLabel; 141 0.0 0.0 0.0 0.0 0.0 Appendice Codice Java import import import import java.awt.Color; javax.swing.Box; java.awt.Font; javax.swing.JScrollPane; public class TabPaneMouseListener extends MouseAdapter { private private private private private private private private private private private private private JTable tabella; JTabbedPane scheda; JTextField arrayTxt[][]; XSBFlora flora; JFrame mainFrame; JRadioButton radioBott[][]; JCheckBox chackBox[][]; JTextArea txtArea[][]; JButton bottoni[][]; ModelloTabellaLavori tabLav; ModelloTabellaBassiEsistenti modBassi; JPanel panLM; JPanel panDatStoCat; public TabPaneMouseListener (JTabbedPane sched,JTable tab, JTextField txt[][], XSBFlora fl, JFrame fr,JRadioButton rB[][],JCheckBox cB[][], JTextArea tA[][], ModelloTabellaLavori tab2, JButton bot[][],ModelloTabellaBassiEsistenti modBas,JPanel pan1,JPanel pan2) { tabella = tab; scheda = sched; arrayTxt = txt; flora = fl; mainFrame = fr; radioBott = rB; chackBox = cB; txtArea = tA; tabLav = tab2; bottoni = bot; modBassi = modBas; panLM = pan1; panDatStoCat = pan2; } public void mouseClicked(MouseEvent e) { int r = tabella.getSelectedRow(); int index = scheda.getSelectedIndex(); if ((r>=0)&&(index>=0)) { String codSirena = tabella.getValueAt(r, 0).toString(); switch(index) { case 0 : riempiDaSirena(codSirena,arrayTxt[index]); break; case 1 : riempiEdDatGen(arrayTxt[index], codSirena,panLM); break; case 2 riempiDatiCatSto(arrayTxt[index],radioBott[index],chackBox[index],txtArea[index], codSirena,panDatStoCat); break; case 3 : riempiImprese(arrayTxt[index],txtArea[index], codSirena); break; case 4 riempiFileSelezionati(arrayTxt[index],codSirena,radioBott[index],bottoni[index]); break; case 5 : riempiComputo(arrayTxt[index], codSirena,tabLav); break; case 6 : riempiTxtBassiInsert(arrayTxt[index],codSirena); break; case 7 : riempiBassi(modBassi,codSirena); break; } } else new AvvisoSelezione(mainFrame); } : : private void riempiEdDatGen (JTextField txt[], String codSir, JPanel panLM) { Object[] bindings2 = flora.FLogicCommand("''"+ codSir + "'':edifici_dati_generali."); if (bindings2.length > 0) { panLM.removeAll(); costrisciEdiDatiGen (panLM, txt); mainFrame.repaint(); System.gc(); String s = new String(); s = "''" + codSir + "'':edifici_dati_generali[via->A,accessi->B,denominazione>C,circoscriz->D,certificato_ag->O,impresa_esecutrice->U,direttore_lavori->V,tipo->E,n_fabbricati>F,n_scale->Z,nomeprop->G,cognomeprop->H,qualifica->K,domicilio->L,tel->M,licenza->N,cal_strut- 142 Appendice Codice Java >T,collaudatore->W,prog_arch->P,prog_imp->R,prog_strut->S,centro_storico->CENTRO_STORICO,comune>COMUNE,possibile_interesse_arch_tec->POSSIBILE_INTERESSE,riserva_20_lavori_statici>RISERVA20,tipologia_edificio->PROPRIETA,vincolato_sensi_1098->VINCOLATO1098,vincolato_sensi_1497>VINCOLATO1497]."; Object bindings[] = flora.FLogicCommand(s); if (bindings.length != 0) { TermModel tm = (TermModel) bindings[0]; txt[0].setText(" " + flora.findValue(tm, "A")); txt[1].setText(" " + flora.findValue(tm, "B")); txt[2].setText(" " + flora.findValue(tm, "C")); txt[3].setText(" " + flora.findValue(tm, "D")); txt[4].setText(" " + flora.findValue(tm, "COMUNE")); txt[5].setText(" " + flora.findValue(tm, "CENTRO_STORICO")); txt[6].setText(" " + flora.findValue(tm, "F")); txt[7].setText(" " + flora.findValue(tm, "Z")); txt[8].setText(" " + flora.findValue(tm, "E")); txt[9].setText(" " + flora.findValue(tm, "H")); txt[10].setText(" " + flora.findValue(tm, "G")); txt[11].setText(" " + flora.findValue(tm, "K")); txt[12].setText(" " + flora.findValue(tm, "L")); txt[13].setText(" " + flora.findValue(tm, "M")); txt[14].setText(" " + flora.findValue(tm, "N")); txt[15].setText(" " + flora.findValue(tm, "O")); txt[16].setText(" " + flora.findValue(tm, "P")); txt[17].setText(" " + flora.findValue(tm, "U")); txt[18].setText(" " + flora.findValue(tm, "S")); txt[19].setText(" " + flora.findValue(tm, "V")); txt[20].setText(" " + flora.findValue(tm, "R")); txt[21].setText(" " + flora.findValue(tm, "W")); txt[22].setText(" " + flora.findValue(tm, "T")); } } else { panLM.removeAll(); JLabel avviso = new JLabel("Libretto di Manutenzione avviso.setFont(new Font("Verdana",1,14)); panLM.add(avviso); panLM.repaint(); mainFrame.repaint(); non presente"); } } private void riempiDatiCatSto tA[], String codSir, JPanel panDSC) { (JTextField txt[],JRadioButton rB[],JCheckBox cB[],JTextArea Object[] bindings3 = flora.FLogicCommand("''"+ codSir + "'':edifici_dati_generali."); if (bindings3.length > 0) { panDSC.removeAll(); costrisciDatiStorCat (panDSC, txt, rB, cB, tA); mainFrame.repaint(); System.gc(); String s = new String(); s = "''" + codSir + "'':edifici_dati_catastali[foglio->A,sezione->B,p_lla->C]."; Object bindings[] = flora.FLogicCommand(s); if (bindings.length != 0) { TermModel tm = (TermModel) bindings[0]; txt[0].setText(" " + flora.findValue(tm, "A")); txt[1].setText(" " + flora.findValue(tm, "B")); txt[2].setText(" " + flora.findValue(tm, "C")); } String str = new String(); 143 Appendice Codice Java str = "''" + codSir + "'':edifici_dati_storici[epoca_costruzione->A,tipo_epoca_costruzione>B,scheda_post_sisma->C,num_schede_post_sisma->D,interventi_eseguiti->E,int_provvisionali_spicconatura>F,int_provvisionali_puntellamento->G,int_provvisionali_altro->H,data_verbale_diffida>I,descrizione_verbale_diffida->L,cep_verbale_diffida->M]."; Object bindings2[] = flora.FLogicCommand(str); if (bindings2.length != 0) { TermModel tm = (TermModel) bindings2[0]; txt[3].setText(" " + flora.findValue(tm, txt[4].setText(" " + flora.findValue(tm, txt[5].setText(" " + flora.findValue(tm, txt[6].setText(" " + flora.findValue(tm, "A")); "D")); "I")); "M")); String tmp = new String(); tmp = flora.findValue(tm, "B"); if(tmp.compareToIgnoreCase("c")==0) { rB[0].setSelected(true); rB[1].setSelected(false); } else { rB[0].setSelected(false); rB[1].setSelected(true); } tmp = flora.findValue(tm, "C"); if(tmp.compareToIgnoreCase("1")==0) { rB[2].setSelected(true); rB[3].setSelected(false); } else { rB[2].setSelected(false); rB[3].setSelected(true); } tmp = flora.findValue(tm, "F"); if(tmp.compareToIgnoreCase("1")==0) cB[0].setSelected(true); else cB[0].setSelected(false); tmp = flora.findValue(tm, "G"); if(tmp.compareToIgnoreCase("1")==0) cB[1].setSelected(true); else cB[1].setSelected(false); tmp = flora.findValue(tm, "H"); if(tmp.compareToIgnoreCase("1")==0) cB[2].setSelected(true); else cB[2].setSelected(false); tA[0].setText(flora.findValue(tm, "E")); tA[1].setText(flora.findValue(tm, "L")); } } else { panDSC.removeAll(); JLabel avviso = new JLabel("Libretto di Manutenzione avviso.setFont(new Font("Verdana",1,14)); panDSC.add(avviso); panDSC.repaint(); mainFrame.repaint(); } } 144 non presente"); Appendice Codice Java private void riempiImprese (JTextField txt[],JTextArea tA[], String codSir) { String s; String s2= new String(); String idImpresa = new String(); String impresaSub = new String(); s= new String("''" + codSir >A,imprese_sub_appaltatrici->B]."); Object bindings[] = flora.FLogicCommand(s); + "'':progetti[impresa_appaltatrice- if(bindings.length!=0) { TermModel tm = (TermModel) bindings[0]; idImpresa = flora.findValue(tm, "A"); impresaSub = flora.findValue(tm, "B"); s2 = idImpresa + ":imprese[ragione_sociale->A,cap1->B,cap2->C,citta1->D,citta2>H,email->I,partita_iva->F,data_inserimento->Z,fax->E,sede_legale->W,sede_operativa->G,telefono1>K,telefono2->L,tipo_impresa->M,altre_info->N]."; Object bindings2[] = flora.FLogicCommand(s2); if (bindings2.length != 0) { TermModel tm2 = (TermModel) bindings2[0]; } txt[0].setText(" " + flora.findValue(tm2, "A")); txt[1].setText(" " + flora.findValue(tm2, "B")); txt[2].setText(" " + flora.findValue(tm2, "C")); txt[3].setText(" " + flora.findValue(tm2, "D")); txt[4].setText(" " + flora.findValue(tm2, "H")); txt[5].setText(" " + flora.findValue(tm2, "I")); txt[6].setText(" " + flora.findValue(tm2, "F")); txt[7].setText(" " + flora.findValue(tm2, "Z")); txt[8].setText(" " + flora.findValue(tm2, "E")); txt[9].setText(" " + flora.findValue(tm2, "W")); txt[10].setText(" " + flora.findValue(tm2, "G")); txt[11].setText(" " + flora.findValue(tm2, "K")); txt[12].setText(" " + flora.findValue(tm2, "L")); txt[13].setText(" " + flora.findValue(tm2, "M")); txt[14].setText(" " + impresaSub); tA[0].setText(flora.findValue(tm2, "N")); } else { txt[0].setText(""); txt[1].setText(""); txt[2].setText(""); txt[3].setText(""); txt[4].setText(""); txt[5].setText(""); txt[6].setText(""); txt[7].setText(""); txt[8].setText(""); txt[9].setText(""); txt[10].setText(""); txt[11].setText(""); txt[12].setText(""); txt[13].setText(""); txt[14].setText(""); tA[0].setText(""); } } private void riempiComputo (JTextField txt[], String codSir, ModelloTabellaLavori tabLavori) { IterazioneDb.CaricaComputo(codSir,txt); IterazioneDb.caricaTabellaLavori(codSir,tabLavori); } private void JButton bott[]) { riempiFileSelezionati (JTextField 145 txt[],String codSir, JRadioButton radio[], Appendice Codice Java IterazioneDb.CaricaFileSelezionati(codSir,1,txt[0],radio,bott); IterazioneDb.CaricaFileSelezionati(codSir,2,txt[1],radio,bott); IterazioneDb.CaricaFileSelezionati(codSir,3,txt[2],radio,bott); } private void riempiTxtBassiInsert (JTextField t[],String codSir) { OperazioniStringhe op = new OperazioniStringhe(); String s= new String(); String indirizzo[] = new String[2]; s="''" + codSir + "'':progetti[indirizzo_pr->A]."; Object bindings[] = flora.FLogicCommand(s); if( bindings.length!=0) { TermModel tm = (TermModel) bindings[0]; String via = flora.findValue(tm, "A").toString(); System.out.println("VIA = " + via); indirizzo = op.separaCivico(via); t[0].setText(indirizzo[0]); t[1].setText(indirizzo[1]); } } private void riempiBassi (ModelloTabellaBassiEsistenti mod,String codSir) { IterazioneDb.caricaBassiTab(mod, codSir); } private void costrisciEdiDatiGen (JPanel pan, JTextField txtEdDatGen[]) { JLabel [] labelEdDatGen = new JLabel[23]; int i=0,j=0; Box bv[] = new Box[2]; Box bv2 = Box.createVerticalBox(); Box bh2 = Box.createHorizontalBox(); Box bh; Font fontLabel = new Font("Verdana",1,11); Font fontTxt = new Font("Verdana",0,11); Font fontBordo = new Font("Verdana",1,13); JPanel ubiFabb = new JPanel(); JPanel datiP = new JPanel(); JPanel costEman = new JPanel(); TitledBorder bordoUbi = new TitledBorder("Ubicazione Fabbricato"); bordoUbi.setTitleColor(Color.RED); bordoUbi.setTitleFont(fontBordo); ubiFabb.setBorder(bordoUbi); TitledBorder bordoDatiP = new TitledBorder("Dati del proprietario, titolare o amministratore dell'immobile"); bordoDatiP.setTitleColor(Color.RED); bordoDatiP.setTitleFont(fontBordo); datiP.setBorder(bordoDatiP); TitledBorder bordoCostruzione = new TitledBorder("Costruzione e manutenzione"); bordoCostruzione.setTitleColor(Color.RED); bordoCostruzione.setTitleFont(fontBordo); costEman.setBorder(bordoCostruzione); for(i=0;i<2;i++) { bv[i] = Box.createVerticalBox(); } for(i=0;i<=8;i++) { txtEdDatGen[i] = new JTextField(20); txtEdDatGen[i].setEditable(false); txtEdDatGen[i].setFont(fontTxt); 146 Appendice Codice Java labelEdDatGen[i] = new JLabel(); labelEdDatGen[i].setFont(fontLabel); bh = Box.createHorizontalBox(); if(i%2==0){ bh.add(labelEdDatGen[i]); bh.add(Box.createHorizontalStrut(10)); bh.add(txtEdDatGen[i]); bv[0].add(bh); bv[0].add(Box.createVerticalStrut(15)); } if(i%2!=0) { bh.add(labelEdDatGen[i]); bh.add(Box.createHorizontalStrut(10)); bh.add(txtEdDatGen[i]); bv[1].add(bh); bv[1].add(Box.createVerticalStrut(15)); } } bh2.add(bv[0]); bh2.add(Box.createHorizontalStrut(50)); bh2.add(bv[1]); ubiFabb.add(bh2); for(i=0;i<2;i++) { bv[i] = Box.createVerticalBox(); } bh2 = Box.createHorizontalBox(); for(i=9;i<=13;i++) { txtEdDatGen[i] = new JTextField(20); txtEdDatGen[i].setEditable(false); txtEdDatGen[i].setFont(fontTxt); labelEdDatGen[i] = new JLabel(); labelEdDatGen[i].setFont(fontLabel); bh = Box.createHorizontalBox(); } if(i%2==0){ bh.add(labelEdDatGen[i]); bh.add(Box.createHorizontalStrut(10)); bh.add(txtEdDatGen[i]); bv[0].add(bh); bv[0].add(Box.createVerticalStrut(15)); } if(i%2!=0) { bh.add(labelEdDatGen[i]); bh.add(Box.createHorizontalStrut(10)); bh.add(txtEdDatGen[i]); bv[1].add(bh); bv[1].add(Box.createVerticalStrut(15)); } bh2.add(bv[0]); bh2.add(Box.createHorizontalStrut(50)); bh2.add(bv[1]); datiP.add(bh2); for(i=0;i<2;i++) { bv[i] = Box.createVerticalBox(); } bh2 = Box.createHorizontalBox(); 147 Appendice Codice Java for(i=14;i<=22;i++) { txtEdDatGen[i] = new JTextField(20); txtEdDatGen[i].setEditable(false); txtEdDatGen[i].setFont(fontTxt); labelEdDatGen[i] = new JLabel(); labelEdDatGen[i].setFont(fontLabel); bh = Box.createHorizontalBox(); } if(i%2==0){ bh.add(labelEdDatGen[i]); bh.add(Box.createHorizontalStrut(10)); bh.add(txtEdDatGen[i]); bv[0].add(bh); bv[0].add(Box.createVerticalStrut(15)); } if(i%2!=0) { bh.add(labelEdDatGen[i]); bh.add(Box.createHorizontalStrut(10)); bh.add(txtEdDatGen[i]); bv[1].add(bh); bv[1].add(Box.createVerticalStrut(15)); } bh2.add(bv[0]); bh2.add(Box.createHorizontalStrut(50)); bh2.add(bv[1]); costEman.add(bh2); bv2.add(Box.createVerticalStrut(30)); bv2.add(ubiFabb); bv2.add(Box.createVerticalStrut(15)); bv2.add(datiP); bv2.add(Box.createVerticalStrut(15)); bv2.add(costEman); pan.add(bv2); labelEdDatGen[0].setText("Accesso Principale"); labelEdDatGen[1].setText("Altri Accessi "); labelEdDatGen[2].setText("Denominazione "); labelEdDatGen[3].setText("Circoscrizione"); labelEdDatGen[4].setText("Comune "); labelEdDatGen[5].setText("Centro Storico"); labelEdDatGen[6].setText("N° Fabbricati "); labelEdDatGen[7].setText("N° Scale "); labelEdDatGen[8].setText("Tipo Fabbricato "); labelEdDatGen[9].setText("Cognome"); labelEdDatGen[10].setText("Nome "); labelEdDatGen[11].setText("Qualifica "); labelEdDatGen[12].setText("Domicilio"); labelEdDatGen[13].setText("Tel "); labelEdDatGen[14].setText("Licenza o concessione "); labelEdDatGen[15].setText("Certificato di agibilità"); labelEdDatGen[16].setText("Progettista Architettonico "); labelEdDatGen[17].setText("Impresa esecutrice "); labelEdDatGen[18].setText("Progettista strutturale "); labelEdDatGen[19].setText("Direttore dei Lavori "); labelEdDatGen[20].setText("Proggettista impiantista "); labelEdDatGen[21].setText("Collaudatore "); labelEdDatGen[22].setText("Disponibilità Calcoli strutturali"); } private void costrisciDatiStorCat (JPanel pan, JTextField txtEdDatGen[], JRadioButton radioBott[], JCheckBox chackBox[], JTextArea txtArea[]) { int i=0; 148 Appendice Codice Java Box bv2 = Box.createVerticalBox(); Box bh2 = Box.createHorizontalBox(); Box bh,bv; JPanel datiCat = new JPanel(); JPanel datiSto = new JPanel(); JLabel [] labelEdDatCat = new JLabel[3]; JLabel [] labelEdDatSto = new JLabel[9]; Font fontLabel = new Font("Verdana",1,11); Font fontTxt = new Font("Verdana",0,11); Font fontBordo = new Font("Verdana",1,13); TitledBorder bordoDCat = new TitledBorder("Dati Catastali"); bordoDCat.setTitleColor(Color.RED); bordoDCat.setTitleFont(fontBordo); datiCat.setBorder(bordoDCat); TitledBorder bordoDSto = new TitledBorder("Dati Storici"); bordoDSto.setTitleColor(Color.RED); bordoDSto.setTitleFont(fontBordo); datiSto.setBorder(bordoDSto); bh2 = Box.createHorizontalBox(); for(i=0;i<=2;i++) { txtEdDatGen[i] = new JTextField(20); txtEdDatGen[i].setEditable(false); txtEdDatGen[i].setFont(fontTxt); labelEdDatCat[i] = new JLabel(); labelEdDatCat[i].setFont(fontLabel); bh2.add(labelEdDatCat[i]); bh2.add(Box.createHorizontalStrut(10)); bh2.add(txtEdDatGen[i]); if(i!=2) bh2.add(Box.createHorizontalStrut(20)); } datiCat.add(bh2); /*---------------------------------------*/ /*Epoca Costruzione*/ bh = Box.createHorizontalBox(); bv = Box.createVerticalBox(); labelEdDatSto[0] = new JLabel(); labelEdDatSto[0].setFont(fontLabel); bh.add(labelEdDatSto[0]); bh.add(Box.createHorizontalStrut(20)); txtEdDatGen[3] = new JTextField(40); txtEdDatGen[3].setEditable(false); txtEdDatGen[3].setFont(fontTxt); bh.add(txtEdDatGen[3]); bh.add(Box.createHorizontalStrut(40)); radioBott[0] = new JRadioButton("Certa"); radioBott[0].setEnabled(false); radioBott[0].setFont(fontTxt); radioBott[1] = new JRadioButton("Presunta"); radioBott[1].setEnabled(false); radioBott[1].setFont(fontTxt); bh.add(radioBott[0]); bh.add(Box.createHorizontalStrut(20)); bh.add(radioBott[1]); 149 Appendice Codice Java bv.add(bh); bv.add(Box.createVerticalStrut(20)); /*Scheda Rilevazione post-sisma*/ bh = Box.createHorizontalBox(); labelEdDatSto[1] = new JLabel(); labelEdDatSto[1].setFont(fontLabel); bh.add(labelEdDatSto[1]); bh.add(Box.createHorizontalStrut(40)); radioBott[2] = new JRadioButton(" Si"); radioBott[3] = new JRadioButton(" No"); radioBott[2].setEnabled(false); radioBott[2].setFont(fontTxt); radioBott[3].setEnabled(false); radioBott[3].setFont(fontTxt); bh.add(radioBott[2]); bh.add(Box.createHorizontalStrut(20)); bh.add(radioBott[3]); bh.add(Box.createHorizontalStrut(40)); labelEdDatSto[2] = new JLabel(); labelEdDatSto[2].setFont(fontLabel); bh.add(labelEdDatSto[2]); bh.add(Box.createHorizontalStrut(20)); txtEdDatGen[4] = new JTextField(20); txtEdDatGen[4].setEditable(false); txtEdDatGen[4].setFont(fontTxt); bh.add(txtEdDatGen[4]); bv.add(bh); bv.add(Box.createVerticalStrut(20)); /*---------------------------------------*/ /* Interventi eseguiti*/ bh = Box.createHorizontalBox(); labelEdDatSto[3] = new JLabel(); labelEdDatSto[3].setFont(fontLabel); bh.add(labelEdDatSto[3]); bh.add(Box.createHorizontalStrut(20)); txtArea[0] = new JTextArea(8,70); txtArea[0].setFont(fontTxt); txtArea[0].setEditable(false); txtArea[0].setBorder(new TitledBorder("")); JScrollPane paneInter = new JScrollPane(txtArea[0]); bh.add(paneInter); bv.add(bh); bv.add(Box.createVerticalStrut(20)); /*Interventi Provvisionali*/ bh = Box.createHorizontalBox(); labelEdDatSto[4] = new JLabel(); labelEdDatSto[4].setFont(fontLabel); bh.add(labelEdDatSto[4]); bh.add(Box.createHorizontalStrut(150)); chackBox[0] = new JCheckBox(" Spicconatura"); chackBox[0].setEnabled(false); chackBox[0].setFont(fontTxt); chackBox[1] = new JCheckBox(" Puntellamento"); chackBox[1].setEnabled(false); chackBox[1].setFont(fontTxt); chackBox[2] = new JCheckBox(" Altro"); chackBox[2].setEnabled(false); chackBox[2].setFont(fontTxt); 150 Appendice Codice Java bh.add(chackBox[0]); bh.add(Box.createHorizontalStrut(100)); bh.add(chackBox[1]); bh.add(Box.createHorizontalStrut(100)); bh.add(chackBox[2]); bh.add(Box.createHorizontalStrut(150)); bv.add(bh); bv.add(Box.createVerticalStrut(20)); /*---------------------------------------*/ /*Verbali di diffida*/ bh = Box.createHorizontalBox(); labelEdDatSto[5] = new JLabel(); labelEdDatSto[5].setFont(fontLabel); bh.add(labelEdDatSto[5]); bh.add(Box.createHorizontalStrut(20)); labelEdDatSto[6] = new JLabel(); labelEdDatSto[6].setFont(fontLabel); bh.add(labelEdDatSto[6]); bh.add(Box.createHorizontalStrut(10)); txtEdDatGen[5] = new JTextField(20); txtEdDatGen[5].setEditable(false); txtEdDatGen[5].setFont(fontTxt); bh.add(txtEdDatGen[5]); bh.add(Box.createHorizontalStrut(40)); labelEdDatSto[7] = new JLabel(); labelEdDatSto[7].setFont(fontLabel); bh.add(labelEdDatSto[7]); bh.add(Box.createHorizontalStrut(20)); txtEdDatGen[6] = new JTextField(20); txtEdDatGen[6].setEditable(false); txtEdDatGen[6].setFont(fontTxt); bh.add(txtEdDatGen[6]); bv.add(bh); bv.add(Box.createVerticalStrut(20)); /*---------------------------------------*/ /*Descrizione verbali diffida e ordinanza:*/ bh = Box.createHorizontalBox(); labelEdDatSto[8] = new JLabel(); labelEdDatSto[8].setFont(fontLabel); bh.add(labelEdDatSto[8]); bh.add(Box.createHorizontalStrut(20)); txtArea[1] = new JTextArea(7,40); txtArea[1].setFont(fontTxt); txtArea[1].setEditable(false); txtArea[1].setBorder(new TitledBorder("")); JScrollPane paneDes = new JScrollPane(txtArea[1]); bh.add(paneDes); bv.add(bh); bv.add(Box.createVerticalStrut(10)); /*---------------------------------------*/ datiSto.add(bv); bv2.add(Box.createVerticalStrut(30)); bv2.add(datiCat); bv2.add(Box.createVerticalStrut(30)); bv2.add(datiSto); 151 Appendice Codice Java pan.add(bv2); labelEdDatCat[0].setText("Foglio:"); labelEdDatCat[1].setText("Sezione:"); labelEdDatCat[2].setText("P.lla:"); labelEdDatSto[0].setText("Epoca di Costruzione:"); labelEdDatSto[1].setText("Scheda di rilevazione post-sisma:"); labelEdDatSto[2].setText("N°"); labelEdDatSto[3].setText("Interventi eseguiti:"); labelEdDatSto[4].setText("Interventi provvisionali:"); labelEdDatSto[5].setText("Verbali di diffida e ordinanza:"); labelEdDatSto[6].setText("Data:"); labelEdDatSto[7].setText("CEP:"); labelEdDatSto[8].setText("Descrizione verbali diffida e ordinanza:"); } public void riempiDaSirena(String codSir, JTextField t[]){ String s = new String("''" + codSir + "'':progetti[indirizzo_pr->A,comune_pr->B,protocollo_servizi->C,anno_protocollo>D,circoscrizione_pr->E]."); Object bindings[] = flora.FLogicCommand(s); if (bindings.length != 0) { TermModel tm = (TermModel) bindings[0]; t[0].setText(" " + flora.findValue(tm, "A")); t[1].setText(" " + flora.findValue(tm, "B")); t[2].setText(" " + flora.findValue(tm, "C")); t[3].setText(" " + flora.findValue(tm, "D")); String circ = flora.findValue(tm, "E"); } Object bindings2[] = flora.FLogicCommand(circ + ":circoscrizioni[nome_circ->F]."); if (bindings2.length != 0) { TermModel tm2 = (TermModel) bindings2[0]; t[4].setText(" " + flora.findValue(tm2, "F")); } } } package sirena.utility; import import import import java.awt.event.*; javax.swing.JFrame; sirena.interfaccia.InserimentoComponente; javax.swing.table.DefaultTableModel; public class AzioneBottAddComponente implements ActionListener { JFrame mainFrame; DefaultTableModel tabCompo; public AzioneBottAddComponente(JFrame mf, DefaultTableModel tab) { mainFrame = mf; tabCompo = tab; } /** * Invoked when an action occurs. * * @param e ActionEvent * @todo Implement this java.awt.event.ActionListener method */ public void actionPerformed(ActionEvent e) { new InserimentoComponente(mainFrame,tabCompo); } } package sirena.utility; import import import import java.awt.event.*; javax.swing.JFrame; sirena.interfaccia.InserimentoLavori; javax.swing.JTextField; 152 Appendice Codice Java import javax.swing.table.DefaultTableModel; import javax.swing.JTextArea; import javax.swing.JTable; public class AzioneBottAddLavoro implements ActionListener { JFrame mainFrame; DefaultTableModel tabellaLav; JTable tabellaEd; String codSirena; public AzioneBottAddLavoro(JFrame mf,DefaultTableModel tab, JTable tab2) { mainFrame = mf; tabellaLav = tab; tabellaEd = tab2; } /** * Invoked when an action occurs. * * @param e ActionEvent * @todo Implement this java.awt.event.ActionListener method */ public void actionPerformed(ActionEvent e) { String cod = tabellaEd.getValueAt(tabellaEd.getSelectedRow(),0).toString(); new InserimentoLavori(mainFrame,tabellaLav,cod); } } package sirena.utility; import import import import import import java.awt.event.*; javax.swing.JTable; sirena.interfaccia.ModificaComputo; javax.swing.JFrame; javax.swing.JTabbedPane; javax.swing.JTextField; public class AzioneBottModificaComputo implements ActionListener { JTable tabellaEd; JFrame mainFrame; JTextField txtTP[] = new JTextField[4]; public AzioneBottModificaComputo(JFrame mf,JTable tab,JTextField t[]) { tabellaEd = tab; mainFrame = mf; txtTP = t; } /** * Invoked when an action occurs. * * @param e ActionEvent * @todo Implement this java.awt.event.ActionListener method */ public void actionPerformed(ActionEvent e) { String codSir = tabellaEd.getValueAt(tabellaEd.getSelectedRow(),0).toString(); new ModificaComputo(mainFrame,codSir,txtTP); } } package sirena.utility; import import import import java.awt.event.*; javax.swing.JFrame; sirena.interfaccia.VisualizzaLavori; javax.swing.JTable; 153 Appendice Codice Java public class AzioneBottVisualLav implements ActionListener { JFrame mainFrame; JTable tabLavoro; public AzioneBottVisualLav(JFrame padre, JTable lav) { mainFrame = padre; tabLavoro = lav; } /** * Invoked when an action occurs. * * @param e ActionEvent * @todo Implement this java.awt.event.ActionListener method */ public void actionPerformed(ActionEvent e) { String ordinativo,lavoro; if(tabLavoro.getValueAt(tabLavoro.getSelectedRow(),1) != null) { ordinativo = tabLavoro.getValueAt(tabLavoro.getSelectedRow(), 1). toString(); } lavoro = tabLavoro.getValueAt(tabLavoro.getSelectedRow(), 2). toString(); new VisualizzaLavori(mainFrame, ordinativo, lavoro); } } package sirena.utility; import import import import import java.awt.event.*; javax.swing.JTextField; javax.swing.JButton; javax.swing.JTable; db.IterazioneDb; public class AzioneRadioBottoneNo implements ActionListener { JButton bottone,bottone2; JTextField dir; JTable tabEdi; int tipoFile; public AzioneRadioBottoneNo(JButton b,JButton b2,JTextField txt, JTable tabEd, int tipo) { bottone=b; bottone2=b2; dir = txt; tabEdi = tabEd; tipoFile = tipo; } /** * Invoked when an action occurs. * * @param e ActionEvent * @todo Implement this java.awt.event.ActionListener method */ public void actionPerformed(ActionEvent e) { bottone.setEnabled(false); bottone2.setEnabled(false); dir.setText(""); dir.setEditable(false); String codSir = tabEdi.getValueAt(tabEdi.getSelectedRow(),0).toString(); IterazioneDb.RemoveFileSelezionato (codSir, tipoFile); } } package sirena.utility; import java.awt.event.*; import javax.swing.JButton; import javax.swing.JTextField; 154 Appendice Codice Java public class azioneRadioBottoneSi implements ActionListener { JButton bottone,bottone2; JTextField dir; public azioneRadioBottoneSi(JButton b,JButton b2,JTextField txt) { bottone=b; bottone2=b2; dir = txt; } /** * Invoked when an action occurs. * * @param e ActionEvent * @todo Implement this java.awt.event.ActionListener method */ public void actionPerformed(ActionEvent e) { bottone.setEnabled(true); bottone2.setEnabled(true); dir.setText("Seleziona il file contenete la lettera Culturali"); dir.setEditable(true); } } package sirena.utility; d'approvazione da parte import java.util.*; public class ComparatoreAlfabetico implements Comparator { public ComparatoreAlfabetico() { } public int String String return } compare(Object o1, Object o2) { s1 = (String) o1; s2 = (String) o2; s1.toLowerCase().compareTo(s2.toLowerCase()); } package sirena.utility; import java.awt.event.*; import javax.swing.JTextField; public class EseguiFile implements ActionListener { JTextField dir; public EseguiFile(JTextField txt) { dir=txt; } /** * Invoked when an action occurs. * * @param e ActionEvent * @todo Implement this java.awt.event.ActionListener method */ public void actionPerformed(ActionEvent e) { try{ Runtime rt = Runtime.getRuntime(); Process proc = rt.exec("rundll32 SHELL32.DLL,ShellExec_RunDLL " + dir.getText()); }catch (Exception ex){System.out.println("Eccezione");} } } package sirena.utility; import javax.swing.table.DefaultTableModel; public class ModelloTabella extends DefaultTableModel { public ModelloTabella() { addColumn("Num. Protocollo Servizio - Anno"); 155 dei Benni Appendice Codice Java } public boolean isCellEditable(int row, int col){ return false; } } package sirena.utility; import javax.swing.table.*; public class ModelloTabellaBassiEsistenti extends DefaultTableModel { public ModelloTabellaBassiEsistenti() { addColumn("ID"); addColumn("Via"); addColumn("Civico"); } public boolean isCellEditable(int row, int col){ return false; } } package sirena.utility; import javax.swing.table.DefaultTableModel; public class ModelloTabellaLavori extends DefaultTableModel { public ModelloTabellaLavori() { this.setRowCount(4); this.setColumnCount(3); } public String getColumnName(int col) { if (col == 0) return "ID"; else if (col == 1) return "Num. Ord. TARIFFE"; else return "DESIGNAZIONE LAVORI"; } public boolean isCellEditable(int row, int col){ return false; } } package sirena.utility; import javax.swing.table.DefaultTableModel; public class ModelloTabellaProspetti extends DefaultTableModel { public ModelloTabellaProspetti() { addColumn("ID"); addColumn("PROSPETTO"); addColumn("par.ug"); addColumn("lung."); addColumn("larg"); addColumn("H/peso"); addColumn("Quantità"); this.setRowCount(4); } public boolean isCellEditable(int row, int col){ return false; } } package sirena.utility; 156 Appendice Codice Java import javax.swing.table.*; public class ModelloTabellaResidenti extends DefaultTableModel { public ModelloTabellaResidenti() { addColumn("ID Componente"); addColumn("Sesso"); addColumn("Età"); addColumn("Relazione di parentela"); addColumn("Attività"); } public boolean isCellEditable(int row, int col){ return false; } } package sirena.utility; public class OperazioniStringhe { public String[] separaCivico (String str){ int max = str.length(); char c; String abita[] = new String[2]; String indirizzo; String civico; for(int i=0;i<max;i++){ c = str.charAt(i); if(numero(c)) { civico = estraiCivico(str,i); indirizzo = estraiIndirizzo(str,i); abita[0] = indirizzo; abita[1] = civico; break; } } return abita; } private boolean numero(char c) { char s[] ={'1','2','3','4','5','6','7','8','9','0'} ; int max = s.length; for(int i=0;i<max;i++){ if(s[i] == c) return true; } return false; } private String estraiCivico(String s, int pos){ char str[] = s.toCharArray(); char temp[] = new char[(str.length - pos)]; System.arraycopy(str,pos,temp,0,(str.length - pos)); return new String(temp); } private String estraiIndirizzo(String s, int pos){ char str[] = s.toCharArray(); if(str[pos-1] == ' '){ pos--; } char temp[] = new char[pos]; System.arraycopy(str,0,temp,0,pos); return new String(temp); } } 157 Appendice Codice Java package sirena.utility; import import import import java.awt.event.*; javax.swing.JTable; javax.swing.JTextField; db.IterazioneDb; public class TabellaBassiMouseListener extends MouseAdapter { JTable tabBassi; JTextField txtBassi[]; public TabellaBassiMouseListener(JTable tab, JTextField txt[]) { tabBassi = tab; txtBassi = txt; } public void mouseClicked(MouseEvent e) { int id=-1; String idString = tabBassi.getValueAt(tabBassi.getSelectedRow(),0).toString(); id = Integer.parseInt(idString); IterazioneDb.caricaBassiInfo(id,txtBassi); } } package sirena.utility; import import import import import import javax.swing.*; javax.swing.table.JTableHeader; java.awt.Point; java.awt.event.MouseAdapter; java.awt.event.MouseEvent; java.util.Arrays; public class TabellaCondomini extends JTable { private ModelloTabella modelloTab; public TabellaCondomini(ModelloTabella mod) { super(mod); modelloTab = mod; final JTableHeader tableHeader = getTableHeader(); tableHeader.addMouseListener( new MouseAdapter() { public void mouseClicked(MouseEvent e) { int x = e.getX(); int y = e.getY(); int columnIndex = tableHeader.columnAtPoint( new Point(x,y) ); sort( columnIndex ); } } ); } public void sort(int coloum){ int n = modelloTab.getRowCount(); String elem[] = new String[n]; for(int i=0;i<n;i++){ elem[i] = modelloTab.getValueAt(i,0).toString(); } Arrays.sort(elem,new ComparatoreAlfabetico()); ModelloTabella newModel = new ModelloTabella(); for(int j=n-1;j>=0;j--){ String tmp[] = new String[1]; tmp[0] = elem[j]; newModel.insertRow(0,tmp); } this.setModel(newModel); } } package sirena.utility; import import import import import javax.swing.table.*; java.awt.Color; java.awt.Component; javax.swing.JTable; javax.swing.JLabel; 158 Appendice Codice Java import com.ontotext.flora2.XSBFlora; public class TableRenderCondomini extends DefaultTableCellRenderer { private static final Color SELECTED_COLOR = new Color(61,128,223); private static final Color ALTERNATE_COLOR = new Color(232,242,254); private XSBFlora flora; public TableRenderCondomini(XSBFlora fl){ flora = fl; } public Component getTableCellRendererComponent(JTable boolean hasFocus, int row, int col) { JLabel testLabel; testLabel = new JLabel( value.toString() ); testLabel.setOpaque(true); table, Object value, boolean isSelected, if (isSelected) { Object[] bindings2 = flora.FLogicCommand("''"+ value.toString() + "'':edifici_dati_generali."); if (bindings2.length > 0) { testLabel.setBackground(Color.BLACK); testLabel.setForeground(Color.YELLOW); }else{ testLabel.setForeground(Color.WHITE); testLabel.setBackground(SELECTED_COLOR); } } else { Object[] bindings2 = flora.FLogicCommand("''"+ value.toString() + "'':edifici_dati_generali."); if (bindings2.length > 0) { testLabel.setBackground(Color.YELLOW); testLabel.setForeground(Color.BLACK); }else { testLabel.setBackground(table.getBackground()); testLabel.setForeground(table.getForeground()); } } return testLabel; } } 159