/*
* Copyright (C) 2012 AXIA Studio (http://www.axiastudio.com)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.axiastudio.suite.protocollo.forms;
import com.axiastudio.pypapi.Register;
import com.axiastudio.pypapi.db.Controller;
import com.axiastudio.pypapi.db.Database;
import com.axiastudio.pypapi.db.IDatabase;
import com.axiastudio.pypapi.db.Store;
import com.axiastudio.pypapi.plugins.IPlugin;
import com.axiastudio.pypapi.ui.*;
import com.axiastudio.pypapi.ui.widgets.PyPaPiComboBox;
import com.axiastudio.suite.base.entities.IUtente;
import com.axiastudio.suite.base.entities.Ufficio;
import com.axiastudio.suite.base.entities.UfficioUtente;
import com.axiastudio.suite.base.entities.Utente;
import com.axiastudio.suite.plugins.cmis.CmisPlugin;
import com.axiastudio.suite.protocollo.ProfiloUtenteProtocollo;
import com.axiastudio.suite.protocollo.entities.Attribuzione;
import com.axiastudio.suite.protocollo.entities.Protocollo;
import com.axiastudio.suite.protocollo.entities.SoggettoProtocollo;
import com.axiastudio.suite.protocollo.entities.UfficioProtocollo;
import com.axiastudio.suite.richieste.entities.DestinatarioUfficio;
import com.axiastudio.suite.richieste.entities.IDestinatarioRichiesta;
import com.axiastudio.suite.richieste.entities.Richiesta;
import com.trolltech.qt.core.QByteArray;
import com.trolltech.qt.core.QFile;
import com.trolltech.qt.core.QModelIndex;
import com.trolltech.qt.designer.QUiLoader;
import com.trolltech.qt.designer.QUiLoaderException;
import com.trolltech.qt.gui.*;
import javax.persistence.EntityManager;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Tiziano Lattisi <tiziano at axiastudio.it>
*/
public class FormScrivania extends QMainWindow {
private Store<Attribuzione> attribuzioneStoreGenerale = new Store<Attribuzione>(null);
private List<Attribuzione> selectionProtocollo = new ArrayList<Attribuzione>();
private List<DestinatarioUfficio> selectionRichiesta = new ArrayList<DestinatarioUfficio>();
private final Integer DEFAULT_ROW_HEIGHT = 24;
public ScrivaniaMenuBar scrivaniaMenuBar;
public FormScrivania(){
QFile file = Util.ui2jui(new QFile("classpath:com/axiastudio/suite/protocollo/forms/scrivania.ui"));
this.loadUi(file);
this.scrivaniaMenuBar = new ScrivaniaMenuBar("Scrivania", this);
this.addToolBar(scrivaniaMenuBar);
/* table view protocolli */
QTableView tableView = (QTableView) this.findChild(QTableView.class, "attribuzioni");
tableView.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows);
//tableView.setSortingEnabled(true); // TODO: gestire l'ordinamento sulla tabella scrivania
//tableView.installEventFilter(this);
tableView.setItemDelegate(new DelegateScrivania(tableView));
tableView.verticalHeader().setDefaultSectionSize(DEFAULT_ROW_HEIGHT);
tableView.doubleClicked.connect(this, "apriProtocollo()");
PyPaPiComboBox ufficio = (PyPaPiComboBox) this.findChild(QComboBox.class, "comboBoxUfficio");
Store storeUffici = storeUfficioFiltro();
ufficio.setLookupStore(storeUffici);
ufficio.setCurrentIndex(storeUffici.size()-1);
QPushButton pushButtonFiltra = (QPushButton) this.findChild(QPushButton.class, "pushButtonFiltra");
pushButtonFiltra.clicked.connect(this, "filtraPerUfficio()");
/* table view richieste */
QTableView tableViewRichieste = (QTableView) this.findChild(QTableView.class, "richieste");
tableViewRichieste.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows);
//tableViewRichieste.setSortingEnabled(true); // TODO: gestire l'ordinamento sulla tabella scrivania
//tableView.setItemDelegate(new DelegateScrivania(tableView));
tableViewRichieste.verticalHeader().setDefaultSectionSize(DEFAULT_ROW_HEIGHT);
tableViewRichieste.doubleClicked.connect(this, "apriRichiesta()");
this.popolaAttribuzioni();
// disabilito le richieste
((QTabWidget) this.findChild(QTabWidget.class, "tabWidget")).setTabEnabled(1, false);
//this.popolaRichieste();
}
private void loadUi(QFile uiFile){
QMainWindow window = null;
try {
window = (QMainWindow) QUiLoader.load(uiFile);
} catch (QUiLoaderException ex) {
Logger.getLogger(Window.class.getName()).log(Level.SEVERE, null, ex);
}
for( QByteArray name: window.dynamicPropertyNames()){
this.setProperty(name.toString(), window.property(name.toString()));
}
this.setCentralWidget(window.centralWidget());
this.setWindowTitle(window.windowTitle());
}
private void popolaAttribuzioni() {
Database db = (Database) Register.queryUtility(IDatabase.class);
EntityManager em = db.getEntityManagerFactory().createEntityManager();
Utente autenticato = (Utente) Register.queryUtility(IUtente.class);
List<Attribuzione> attribuzioni = em.createNamedQuery("trovaAttribuzioniUtente", Attribuzione.class)
.setParameter("id", autenticato.getId())
.getResultList();
// Store store = new Store(attribuzioni);
attribuzioneStoreGenerale.clear();
attribuzioneStoreGenerale.addAll(attribuzioni);
List<Column> colonne = new ArrayList();
QTableView tableView = (QTableView) this.findChild(QTableView.class, "attribuzioni");
colonne.add(new Column("evidenza", "Ev.", "Attribuzione in evidenza"));
colonne.add(new Column("iddocumento", "Protocollo", "Numero di protocollo"));
colonne.add(new Column("tipoprotocollo", "E/U/I", "Entrata / Uscita / Interno"));
colonne.add(new Column("dataprotocollo", "Data", "Data di protocollazione"));
colonne.add(new Column("ufficio", "Ufficio", "Ufficio di attribuzione"));
colonne.add(new Column("principale", "Pr.", "Attribuzione in via principale"));
colonne.add(new Column("oggetto", "Oggetto", "Oggetto del protocollo"));
TableModel model = new TableModel(attribuzioneStoreGenerale, colonne);
tableView.clearSelection();
model.setEditable(false);
tableView.setModel(model);
QItemSelectionModel selectionModel = new QItemSelectionModel(model);
tableView.setSelectionModel(selectionModel);
selectionModel.selectionChanged.connect(this, "selectRows(QItemSelection, QItemSelection)");
tableView.horizontalHeader().setResizeMode(0, QHeaderView.ResizeMode.ResizeToContents); // evidenza
tableView.horizontalHeader().setResizeMode(1, QHeaderView.ResizeMode.ResizeToContents); // iddocumento
tableView.horizontalHeader().setResizeMode(2, QHeaderView.ResizeMode.ResizeToContents); // tipoprotocollo
tableView.horizontalHeader().setResizeMode(3, QHeaderView.ResizeMode.ResizeToContents); // dataprotocollo
tableView.horizontalHeader().setResizeMode(4, QHeaderView.ResizeMode.ResizeToContents); // ufficio
tableView.horizontalHeader().setResizeMode(5, QHeaderView.ResizeMode.ResizeToContents); // principale
tableView.horizontalHeader().setResizeMode(6, QHeaderView.ResizeMode.Stretch); // oggetto
}
private void popolaRichieste() {
Database db = (Database) Register.queryUtility(IDatabase.class);
EntityManager em = db.getEntityManagerFactory().createEntityManager();
Utente autenticato = (Utente) Register.queryUtility(IUtente.class);
List<IDestinatarioRichiesta> destinatariUtente = em.createNamedQuery("trovaDestinatarioUtente", IDestinatarioRichiesta.class)
.setParameter("id", autenticato.getId())
.getResultList();
List<IDestinatarioRichiesta> destinatari = em.createNamedQuery("trovaDestinatarioUfficio", IDestinatarioRichiesta.class)
.setParameter("id", autenticato.getId())
.getResultList();
destinatari.addAll(destinatariUtente);
Store store = new Store(destinatari);
List<Column> colonne = new ArrayList();
QTableView tableView = (QTableView) this.findChild(QTableView.class, "richieste");
colonne.add(new Column("mittente", "Mittente", "Mittente della richiesta"));
colonne.add(new Column("datascadenza", "Data scadenza", "Data di scadenza della richiesta"));
colonne.add(new Column("nomedestinatario", "Inviata a", "Richiesta inviata a..."));
colonne.add(new Column("testo", "Testo", "Testo della richiesta"));
colonne.add(new Column("data", "Data invio", "Data della richiesta"));
colonne.add(new Column("conoscenza", "cc", "Per conoscenza"));
colonne.add(new Column("letto", "Evasa", "Richiesta evasa/conclusa"));
TableModel model = new TableModel(store, colonne);
tableView.clearSelection();
model.setEditable(false);
tableView.setModel(model);
QItemSelectionModel selectionModel = new QItemSelectionModel(model);
tableView.setSelectionModel(selectionModel);
selectionModel.selectionChanged.connect(this, "selectRowsRichieste(QItemSelection, QItemSelection)");
tableView.horizontalHeader().setResizeMode(0, QHeaderView.ResizeMode.ResizeToContents); // data
tableView.horizontalHeader().setResizeMode(1, QHeaderView.ResizeMode.ResizeToContents); // data
tableView.horizontalHeader().setResizeMode(2, QHeaderView.ResizeMode.ResizeToContents); // data
tableView.horizontalHeader().setResizeMode(3, QHeaderView.ResizeMode.Stretch); // testo
tableView.horizontalHeader().setResizeMode(4, QHeaderView.ResizeMode.ResizeToContents); // data
tableView.horizontalHeader().setResizeMode(5, QHeaderView.ResizeMode.ResizeToContents); // data
tableView.horizontalHeader().setResizeMode(6, QHeaderView.ResizeMode.ResizeToContents); // data
}
private void selectRowsRichieste(QItemSelection selected, QItemSelection deselected){
QTableView tableView = (QTableView) this.findChild(QTableView.class, "richieste");
TableModel model = (TableModel) tableView.model();
List<Integer> selectedIndexes = new ArrayList();
List<Integer> deselectedIndexes = new ArrayList();
for (QModelIndex i: selected.indexes()){
if(!selectedIndexes.contains(i.row())){
selectedIndexes.add(i.row());
}
}
for (QModelIndex i: deselected.indexes()){
if(!deselectedIndexes.contains(i.row())){
deselectedIndexes.add(i.row());
}
}
for (Integer idx: selectedIndexes){
boolean res = this.selectionRichiesta.add((DestinatarioUfficio) model.getEntityByRow(idx));
}
for (Integer idx: deselectedIndexes){
boolean res = this.selectionRichiesta.remove((DestinatarioUfficio) model.getEntityByRow(idx));
}
}
private void selectRows(QItemSelection selected, QItemSelection deselected){
QTableView tableView = (QTableView) this.findChild(QTableView.class, "attribuzioni");
TableModel model = (TableModel) tableView.model();
List<Integer> selectedIndexes = new ArrayList();
List<Integer> deselectedIndexes = new ArrayList();
for (QModelIndex i: selected.indexes()){
if(!selectedIndexes.contains(i.row())){
selectedIndexes.add(i.row());
}
}
for (QModelIndex i: deselected.indexes()){
if(!deselectedIndexes.contains(i.row())){
deselectedIndexes.add(i.row());
}
}
for (Integer idx: selectedIndexes){
boolean res = this.selectionProtocollo.add((Attribuzione) model.getEntityByRow(idx));
}
for (Integer idx: deselectedIndexes){
boolean res = this.selectionProtocollo.remove((Attribuzione) model.getEntityByRow(idx));
}
refreshInfo();
}
private void refreshInfo() {
this.scrivaniaMenuBar.actionByName("daiPerLetto").setEnabled(this.selectionProtocollo.size()>0);
this.scrivaniaMenuBar.actionByName("apriProtocollo").setEnabled(this.selectionProtocollo.size()==1);
this.scrivaniaMenuBar.actionByName("apriDocumenti").setEnabled(this.selectionProtocollo.size() == 1);
// oggetto, uffici, soggetti
QTextEdit textEdit_oggetto = (QTextEdit) this.findChild(QTextEdit.class, "textEdit_oggetto");
QListWidget listWidget_uffici = (QListWidget) this.findChild(QListWidget.class, "listWidget_uffici");
QListWidget listWidget_attribuzioni = (QListWidget) this.findChild(QListWidget.class, "listWidget_attribuzioni");
QListWidget listWidget_soggetti = (QListWidget) this.findChild(QListWidget.class, "listWidget_soggetti");
listWidget_uffici.clear();
listWidget_soggetti.clear();
listWidget_attribuzioni.clear();
if( this.selectionProtocollo.size() == 1 ){
Attribuzione attribuzione = this.selectionProtocollo.get(0);
Protocollo protocollo = attribuzione.getProtocollo();
textEdit_oggetto.setText(protocollo.getOggetto());
for( UfficioProtocollo up: protocollo.getUfficioProtocolloCollection() ){
QListWidgetItem item = new QListWidgetItem();
item.setText(up.getUfficio().toString());
listWidget_uffici.addItem(item);
}
for( Attribuzione a: protocollo.getAttribuzioneCollection() ){
QListWidgetItem item = new QListWidgetItem();
String pre = "";
if( a.getPrincipale() ){
pre = "* ";
}
item.setText(pre+a.getUfficio().toString());
listWidget_attribuzioni.addItem(item);
}
for( SoggettoProtocollo sp: protocollo.getSoggettoProtocolloCollection() ){
if ( ! sp.getAnnullato() ) {
QListWidgetItem item = new QListWidgetItem();
item.setText(sp.toString());
listWidget_soggetti.addItem(item);
}
}
} else {
textEdit_oggetto.setText("");
}
}
private void daiPerLetto(){
Database db = (Database) Register.queryUtility(IDatabase.class);
Controller controller = db.createController(Attribuzione.class);
for(Attribuzione attribuzione: this.selectionProtocollo){
attribuzione.setLetto(Boolean.TRUE);
controller.commit(attribuzione);
}
// this.popolaAttribuzioni();
attribuzioneStoreGenerale.removeAll(this.selectionProtocollo);
QTableView tableView = (QTableView) this.findChild(QTableView.class, "attribuzioni");
TableModel model = (TableModel) tableView.model();
Store store=model.getStore();
store.removeAll(this.selectionProtocollo);
model.setStore(store);
this.selectionProtocollo.clear();
this.refreshInfo();
}
private void apriProtocollo(){
Protocollo protocollo = this.selectionProtocollo.get(0).getProtocollo();
IForm form = Util.formFromEntity(protocollo);
if( form == null ){
return;
}
QMdiArea workspace = Util.findParentMdiArea(this);
if( workspace != null ){
workspace.addSubWindow((QMainWindow) form);
}
form.show();
}
private void apriRichiesta(){
Richiesta richiesta = this.selectionRichiesta.get(0).getRichiesta();
IForm form = Util.formFromEntity(richiesta);
if( form == null ){
return;
}
QMdiArea workspace = Util.findParentMdiArea(this);
if( workspace != null ){
workspace.addSubWindow((QMainWindow) form);
}
form.show();
}
private void apriDocumenti(){
Protocollo protocollo = this.selectionProtocollo.get(0).getProtocollo();
Utente autenticato = (Utente) Register.queryUtility(IUtente.class);
ProfiloUtenteProtocollo pup = new ProfiloUtenteProtocollo(protocollo, autenticato);
List<IPlugin> plugins = (List) Register.queryPlugins(FormScrivania.class);
for(IPlugin plugin: plugins){
if( "CMIS".equals(plugin.getName()) ){
Boolean view = false;
Boolean delete = false;
Boolean download = false;
Boolean parent = false;
Boolean upload = false;
Boolean version = false;
if( protocollo.getRiservato() ){
view = pup.inSportelloOAttribuzioneV() && pup.inSportelloOAttribuzioneR();
download = view;
} else {
view = autenticato.getSupervisoreprotocollo() || pup.inSportelloOAttribuzioneV();
download = view;
}
if( protocollo.getConsolidadocumenti() ){
delete = false;
version = pup.inAttribuzionePrincipaleC();
upload = version;
} else {
upload = pup.inSportelloOAttribuzionePrincipale();
delete = upload;
version = upload;
}
((CmisPlugin) plugin).showForm(protocollo, delete, download, parent, upload, version);
}
}
}
private void aggiornaLista(){
this.popolaAttribuzioni();
}
private void filtraPerUfficio(){
/* QTableView tableView = (QTableView) this.findChild(QTableView.class, "attribuzioni");
TableModel model = (TableModel) tableView.model();
Store store = model.getStore();
*/
Store<Attribuzione> store = new Store<Attribuzione>(null);
PyPaPiComboBox comboUfficio = (PyPaPiComboBox) this.findChild(QComboBox.class, "comboBoxUfficio");
int idx = comboUfficio.currentIndex();
Ufficio ufficio = (Ufficio) comboUfficio.itemData(idx);
if (ufficio == null) {
store = attribuzioneStoreGenerale;
} else {
for (Object obj: attribuzioneStoreGenerale) {
Attribuzione attribuzione=(Attribuzione) obj;
if (attribuzione.getUfficio().equals(ufficio)) {
store.add(attribuzione);
}
}
}
QTableView tableView = (QTableView) this.findChild(QTableView.class, "attribuzioni");
TableModel model = (TableModel) tableView.model();
model.setStore(store);
this.selectionProtocollo.clear();
this.refreshInfo();
}
/*
* Uno store contenente solo gli uffici dell'utente
*/
public Store storeUfficioFiltro(){
Utente autenticato = (Utente) Register.queryUtility(IUtente.class);
List<Ufficio> uffici = new ArrayList();
for(UfficioUtente uu: autenticato.getUfficioUtenteCollection()){
if( uu.getRicerca() ){
uffici.add(uu.getUfficio());
}
}
return new Store(uffici);
}
}