it.fub.jardin.client.mvc.JardinController.java Source code

Java tutorial

Introduction

Here is the source code for it.fub.jardin.client.mvc.JardinController.java

Source

/*
 * Copyright (c) 2010 Jardin Development Group <jardin.project@gmail.com>.
 * 
 * Jardin is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * Jardin 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 General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with Jardin.  If not, see <http://www.gnu.org/licenses/>.
 */

package it.fub.jardin.client.mvc;

import it.fub.jardin.client.EventList;
import it.fub.jardin.client.Jardin;
import it.fub.jardin.client.ManagerServiceAsync;
import it.fub.jardin.client.SearchStringParser;
import it.fub.jardin.client.model.Credentials;
import it.fub.jardin.client.model.ForeignKey;
import it.fub.jardin.client.model.HeaderPreferenceList;
import it.fub.jardin.client.model.IncomingForeignKeyInformation;
import it.fub.jardin.client.model.MassiveUpdateObject;
import it.fub.jardin.client.model.Message;
import it.fub.jardin.client.model.NewObjects;
import it.fub.jardin.client.model.Plugin;
import it.fub.jardin.client.model.RegistrationInfo;
import it.fub.jardin.client.model.Resultset;
import it.fub.jardin.client.model.ResultsetImproved;
import it.fub.jardin.client.model.SearchParams;
import it.fub.jardin.client.model.SearchResult;
import it.fub.jardin.client.model.Template;
import it.fub.jardin.client.model.User;
import it.fub.jardin.client.widget.JardinGrid;
import it.fub.jardin.client.widget.JardinGridToolBar;
import it.fub.jardin.client.widget.JardinSelectColumnsForChartPopUp;
import it.fub.jardin.client.widget.JardinTabItem;
import it.fub.jardin.client.widget.Jungle;
import it.fub.jardin.client.widget.UploadDialog;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.extjs.gxt.charts.client.Chart;
import com.extjs.gxt.charts.client.model.BarDataProvider;
import com.extjs.gxt.charts.client.model.ChartModel;
import com.extjs.gxt.charts.client.model.PieDataProvider;
import com.extjs.gxt.charts.client.model.charts.BarChart;
import com.extjs.gxt.charts.client.model.charts.BarChart.BarStyle;
import com.extjs.gxt.charts.client.model.charts.PieChart;
import com.extjs.gxt.ui.client.Registry;
import com.extjs.gxt.ui.client.data.BaseModelData;
import com.extjs.gxt.ui.client.data.BasePagingLoader;
import com.extjs.gxt.ui.client.data.LoadEvent;
import com.extjs.gxt.ui.client.data.PagingLoadConfig;
import com.extjs.gxt.ui.client.data.PagingLoadResult;
import com.extjs.gxt.ui.client.data.PagingLoader;
import com.extjs.gxt.ui.client.data.RpcProxy;
import com.extjs.gxt.ui.client.event.EventType;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.LoadListener;
import com.extjs.gxt.ui.client.event.MessageBoxEvent;
import com.extjs.gxt.ui.client.mvc.AppEvent;
import com.extjs.gxt.ui.client.mvc.Controller;
import com.extjs.gxt.ui.client.mvc.Dispatcher;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.store.Record;
import com.extjs.gxt.ui.client.widget.Dialog;
import com.extjs.gxt.ui.client.widget.Info;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.ProgressBar;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;

public class JardinController extends Controller {

    private static String webKitSuggest = "Jardin  ottimizzato per <i>WebKit</i>."
            + " Per ottenere prestazioni migliori si consiglia di usare"
            + " <a href=\"http://www.google.com/chrome/\">Chrome</a></li>" + " o Safari";

    private User user;
    private JardinView view;
    private ManagerServiceAsync service;

    private enum ChartType {
        PIE, BAR;
    }

    private static final String[] chartColors = { "#204a87", "#4e9a06", "#cc0000", "#75507b", "#f57900",
            "#edd400" };

    /**
     * Creazione del controller generale per l'applicazione. Vengono registrati
     * gli eventi che saranno gestiti da questo controller.
     */
    public JardinController() {
        this.registerEventTypes(EventList.Login);
        this.registerEventTypes(EventList.Error);
        this.registerEventTypes(EventList.CheckUser);
        this.registerEventTypes(EventList.CheckCredential);
        this.registerEventTypes(EventList.LoginError);
        this.registerEventTypes(EventList.Logout);
        this.registerEventTypes(EventList.Init);
        this.registerEventTypes(EventList.CreateUI);
        this.registerEventTypes(EventList.CreateFirstTab);
        this.registerEventTypes(EventList.Search);
        this.registerEventTypes(EventList.CommitChanges);
        // this.registerEventTypes(EventList.AddRow);
        this.registerEventTypes(EventList.RemoveRows);
        this.registerEventTypes(EventList.ExportAllStoreAllColumns);
        this.registerEventTypes(EventList.ExportAllStoreSomeColumns);
        this.registerEventTypes(EventList.ExportSomeStoreAllColumns);
        this.registerEventTypes(EventList.ExportSomeStoreSomeColumns);
        this.registerEventTypes(EventList.ExportSomeRowsAllColumns);
        this.registerEventTypes(EventList.ExportSomeRowsSomeColumns);
        this.registerEventTypes(EventList.ShowAllColumns);
        this.registerEventTypes(EventList.SaveGridView);
        this.registerEventTypes(EventList.GetGridViews);
        this.registerEventTypes(EventList.UploadTemplate);
        this.registerEventTypes(EventList.UploadImport);
        this.registerEventTypes(EventList.UploadInsert);
        this.registerEventTypes(EventList.UpdateColumnModel);
        this.registerEventTypes(EventList.Jungle);
        this.registerEventTypes(EventList.ShowPieChart);
        this.registerEventTypes(EventList.ShowBarChart);
        this.registerEventTypes(EventList.ShowChart);
        this.registerEventTypes(EventList.SendMessage);
        this.registerEventTypes(EventList.NewMessage);
        this.registerEventTypes(EventList.ViewLinkedTable);
        this.registerEventTypes(EventList.ViewPopUpDetail);
        this.registerEventTypes(EventList.GetPlugins);
        this.registerEventTypes(EventList.GotPlugins);
        this.registerEventTypes(EventList.ViewPlugin);
        this.registerEventTypes(EventList.getResultsetImproved);
        // this.registerEventTypes(EventList.getResultsetPlus);
        this.registerEventTypes(EventList.gotResultsetImproved);
        // this.registerEventTypes(EventList.gotResultsetPlus);
        this.registerEventTypes(EventList.initialChangePassword);
        this.registerEventTypes(EventList.CheckCredentialAndChangePassword);
        this.registerEventTypes(EventList.changePasswordError);
        this.registerEventTypes(EventList.getResultsetImprovedFromContextMenu);
        this.registerEventTypes(EventList.ViewAddingPopup);
        this.registerEventTypes(EventList.saveNewRecord);
        this.registerEventTypes(EventList.GetValuesOfAField);
        this.registerEventTypes(EventList.GotValuesOfAField);
        this.registerEventTypes(EventList.MassUpdate);
        this.registerEventTypes(EventList.UpdateObjects);
        this.registerEventTypes(EventList.RetrievePkValues);
        this.registerEventTypes(EventList.OpenRegistrationForm);
        this.registerEventTypes(EventList.CheckRegistrationInfo);

        service = (ManagerServiceAsync) Registry.get(Jardin.SERVICE);
    }

    @Override
    public void initialize() {
        this.view = new JardinView(this);
    }

    /**
     * Gestione degli eventi. (non-Javadoc)
     * 
     * @see com.extjs.gxt.ui.client.mvc.Controller#handleEvent(com.extjs.gxt.ui.client.mvc.AppEvent)
     */
    @Override
    public void handleEvent(final AppEvent event) {
        EventType t = event.getType();
        // System.out.println("CONTROLLER catturato evento: " + t.toString());
        // if (t == EventList.GetPlugins) {
        // System.out.println("CONTROLLER: catturato plugins " + t.toString());
        // }
        if (t == EventList.Login) {
            this.forwardToView(this.view, EventList.Login, null);
        } else if (t == EventList.CheckUser) {
            if (event.getData() instanceof Credentials) {
                Credentials credentials = (Credentials) event.getData();
                this.onCheckUser(credentials);
            } else {
                // TODO Gestire errore nei dati di EventList.CheckUser
            }
        } else if (t == EventList.CheckCredential) {
            if (event.getData() instanceof Credentials) {
                Credentials credentials = (Credentials) event.getData();
                this.onCheckCredential(credentials);
            } else {
                // TODO Gestire errore nei dati di EventList.CheckUser
            }
        } else if (t == EventList.OpenRegistrationForm) {
            forwardToView(view, new AppEvent(EventList.OpenRegistrationForm));
        } else if (t == EventList.CheckRegistrationInfo) {
            if (event.getData() instanceof RegistrationInfo) {
                RegistrationInfo regInfo = (RegistrationInfo) event.getData();
                this.onCheckRegistrationInfo(regInfo);
            } else {
                // TODO Gestire errore nei dati di EventList.CheckUser
            }
        } else if (t == EventList.CheckCredentialAndChangePassword) {
            if (event.getData() instanceof Credentials) {
                Credentials credentials = (Credentials) event.getData();
                this.onCheckCredentialAndChangePassword(credentials);
            } else {
                // TODO Gestire errore nei dati di EventList.CheckUser
                // System.out.println("ERRORE!!!!");
                forwardToView(view, new AppEvent(EventList.Login));
            }
        } else if (t == EventList.Init) {
            if (event.getData() instanceof User) {
                User user = (User) event.getData();
                this.onInit(user);
            } else {
                // TODO Gestire errore nei dati di EventList.Init
            }
        } else if (t == EventList.Logout) {
            this.onLogout(event);
        } else if (t == EventList.Error) {
            if (event.getData() instanceof String) {
                this.onError((String) event.getData());
            } else {
                // TODO Gestire errore nei dati di EventList.Error
            }
        } else if (t == EventList.LoginError) {
            this.onLoginError(event);
        } else if (t == EventList.changePasswordError) {
            this.onChangePasswordError(event);
        } else if (t == EventList.CreateFirstTab) {
            this.onCreateFirstTab();
        } else if (t == EventList.CreateUI) {
            this.onCreateUI();
        } else if (t == EventList.Search) {
            if (event.getData() instanceof SearchParams) {
                SearchParams searchParams = (SearchParams) event.getData();
                this.onSearch(searchParams);
            } else {
                // TODO Gestire errore nei dati di EventList.Search
            }
        } else if (t == EventList.saveNewRecord) {
            if (event.getData("object") instanceof List<?>) {
                this.onSaveNewRecord((List<BaseModelData>) event.getData("object"),
                        (Integer) event.getData("resultsetid"));
            }
        } else if (t == EventList.CommitChanges) {

            if (event.getData() instanceof JardinGrid) {
                JardinGrid grid = (JardinGrid) event.getData();
                this.onCommitChanges(grid);
            } else {
                // TODO Gestire errore nei dati di EventList.CommitChanges
            }
            /*
             * ------------------------------------------------------------------
             * ----- Gestione eventi della toolbar ------------------------------
             * -----------------------------------------
             */
        }
        // else if (t == EventList.AddRow) {
        // if (event.getData() instanceof Integer) {
        // this.onAddRow((Integer) event.getData());
        // } else {
        // // TODO Gestire errore nei dati di EventList.AddRow
        // // Log.error("Errore nei dati di EventList.AddRow");
        // }
        // }
        else if (t == EventList.ViewPopUpDetail) {
            if (event.getData() instanceof BaseModelData) {
                this.onViewPopUpDetail((BaseModelData) event.getData());
            } else {
                // TODO Gestire errore nei dati di EventList.ViewPopUpDetail
                // Log.error("Errore nei dati di EventList.ViewPopUpDetail");
            }
        } else if (t == EventList.RemoveRows) {
            if (event.getData() instanceof NewObjects) {
                this.onRemoveRows((NewObjects) event.getData());
            } else {
                // TODO Gestire errore nei dati di EventList.RemoveRows
                // Log.error("Errore nei dati di EventList.RemoveRows");
            }
        } else if (t == EventList.ExportAllStoreAllColumns) {
            if (event.getData() instanceof Integer) {
                this.onExport((Integer) event.getData(), false, true, true);
            } else {
                // TODO Gestire errore nei dati di
                // EventList.ExportAllStoreAllColumns
                // Log.error("Errore nei dati di EventList.ExportAllStoreAllColumns");
            }
        } else if (t == EventList.ExportAllStoreSomeColumns) {
            if (event.getData() instanceof Integer) {
                this.onExport((Integer) event.getData(), false, true, false);
            } else {
                // TODO Gestire errore nei dati di
                // EventList.ExportAllStoreSomeColumns
                // Log.error("Errore nei dati di EventList.ExportAllStoreSomeColumns");
            }
        } else if (t == EventList.ExportSomeStoreAllColumns) {
            if (event.getData() instanceof Integer) {
                this.onExport((Integer) event.getData(), false, false, true);
            } else {
                // TODO Gestire errore nei dati di
                // EventList.ExportAllStoreAllColumns
                // Log.error("Errore nei dati di EventList.ExportAllStoreAllColumns");
            }
        } else if (t == EventList.ExportSomeStoreSomeColumns) {
            if (event.getData() instanceof Integer) {
                this.onExport((Integer) event.getData(), false, false, false);
            } else {
                // TODO Gestire errore nei dati di
                // EventList.ExportSomeStoreSomeColumns
                // Log.error("Errore nei dati di EventList.ExportAllStoreSomeColumns");
            }
        } else if (t == EventList.ExportSomeRowsAllColumns) {
            if (event.getData() instanceof Integer) {
                this.onExport((Integer) event.getData(), true, true, true);
            } else {
                // TODO Gestire errore nei dati di EventList.ExportAllStoreAllColumns
                // Log.error("Errore nei dati di EventList.ExportSomeRowAllColumns");
            }
        } else if (t == EventList.ExportSomeRowsSomeColumns) {
            if (event.getData() instanceof Integer) {
                this.onExport((Integer) event.getData(), true, true, false);
            } else {
                // TODO Gestire errore nei dati di EventList.ExportSomeStoreSomeColumns
                // Log.error("Errore nei dati di EventList.ExportSomeRowSomeColumns");
            }
        } else if (t == EventList.ShowAllColumns) {
            if (event.getData() instanceof Integer) {
                this.onShowAllColumns((Integer) event.getData());
            } else {
                // TODO Gestire errore nei dati di EventList.ShowAllColumns
                // Log.error("Errore nei dati di EventList.ShowAllColumns");
            }
        } else if (t == EventList.SaveGridView) {
            if (event.getData() instanceof Integer) {
                this.onSaveGridView((Integer) event.getData());
            } else {
                // TODO Gestire errore nei dati di EventList.SaveGridView
                // Log.error("Errore nei dati di EventList.SaveGridView");
            }
        } else if (t == EventList.GetGridViews) {
            if (event.getData() instanceof Integer) {
                this.onGetGridViews((Integer) event.getData());
            } else {
                // TODO Gestire errore nei dati di EventList.GetGridViews
                // Log.error("Errore nei dati di EventList.GetGridViews");
            }
        } else if (t == EventList.UploadTemplate) {
            if (event.getData() instanceof Integer) {
                this.onUploadTemplate((Integer) event.getData());
            } else {
                // TODO Gestire errore nei dati di EventList.UploadTemplate
                // Log.error("Errore nei dati di EventList.UploadTemplate");
            }
        } else if (t == EventList.UploadImport) {
            if (event.getData() instanceof Integer) {
                this.onUploadImport((Integer) event.getData());
            } else {
                // TODO Gestire errore nei dati di EventList.UploadImport
                // Log.error("Errore nei dati di EventList.UploadImport");
            }
        } else if (t == EventList.UploadInsert) {
            if (event.getData() instanceof Integer) {
                this.onUploadInsert((Integer) event.getData());
            } else {
                // TODO Gestire errore nei dati di EventList.UploadInsert
                // Log.error("Errore nei dati di EventList.UploadInsert");
            }
        } else if (t == EventList.UpdateColumnModel) {
            // TODO CAMBIARE!!!
            if (event.getData() instanceof JardinGrid) {
                this.onUpdateColumnModel((JardinGrid) event.getData());
            } else {
                // TODO Gestire errore nei dati di EventList.UpdateColumnModel
                // Log.error("Errore nei dati di EventList.UpdateColumnModel");
            }
        } else if (t == EventList.Jungle) {
            if (event.getData() instanceof Integer) {
                this.onJungle((Integer) event.getData());
            } else {
                // TODO Gestire errore nei dati di EventList.Jungle
                // Log.error("Errore nei dati di EventList.Jungle");
            }
        } else if (t == EventList.ShowChart) {
            if (event.getData() instanceof ArrayList) {
                this.onShowChart((ArrayList<String>) event.getData());
            } else {
                // TODO Gestire errore nei dati di EventList.SelectColumnsForChart
                // Log.error("Errore nei dati di EventList.ShowChart");
            }
        } else if (t == EventList.ShowPieChart) {
            if (event.getData() instanceof Integer) {
                this.onSelectColumnsForChart(ChartType.PIE, (Integer) event.getData());
                // onShowChart(ChartType.PIE, (Integer) event.getData());
            } else {
                // TODO Gestire errore nei dati di EventList.ShowPieChart
                // Log.error("Errore nei dati di EventList.ShowPieChart");
            }
        } else if (t == EventList.ShowBarChart) {
            if (event.getData() instanceof Integer) {
                this.onSelectColumnsForChart(ChartType.BAR, (Integer) event.getData());
                // onShowChart(ChartType.BAR, (Integer) event.getData());
            } else {
                // TODO Gestire errore nei dati di EventList.ShowBarChart
                // Log.error("Errore nei dati di EventList.ShowBarChart");
            }
            /*
             * ------------------------------------------------------------------
             * ----- Altri eventi ------------------------------------------------
             * -----------------------
             */
        } else if (t == EventList.UpdateTemplates) {
            if (event.getData() instanceof Integer) {
                this.onUpdateTemplates((Integer) event.getData());
            } else {
                // TODO Gestire errore nei dati di EventList.UpdateTemplates
                // Log.error("Errore nei dati di EventList.UpdateTemplates");
            }
        } else if (t == EventList.SendMessage) {
            if (event.getData() instanceof Message) {
                this.onSendMessage((Message) event.getData());
            } else {
                // TODO Gestire errore nei dati di EventList.SendMessage
                // Log.error("Errore nei dati di EventList.SendMessage");
            }
        } else if (t == EventList.NewMessage) {
            this.onNewMessage();
        } else if (t == EventList.ViewLinkedTable) {
            if (event.getData() instanceof IncomingForeignKeyInformation) {
                this.onViewLinkedResultset((IncomingForeignKeyInformation) event.getData());
            } else {
                // TODO Gestire errore nei dati di EventList.ViewLinkedTable
                // Log.error("Errore nei dati di EventList.ViewLinkedTable");
            }
        } else if (t == EventList.ViewAddingPopup) {
            if (event.getData() instanceof IncomingForeignKeyInformation) {
                this.onViewLinkedResultset((IncomingForeignKeyInformation) event.getData());
            } else {
                // TODO Gestire errore nei dati di EventList.ViewLinkedTable
                // Log.error("Errore nei dati di EventList.ViewLinkedTable");
            }
        } else if (t == EventList.GetPlugins) {
            // System.out.println("CONTROLLER: richiesto men plugins per "
            // +event.getData().toString()+ "!!!");
            if (event.getData() instanceof Integer) {
                this.onGetPlugins((Integer) event.getData());
            } else {
                // TODO Gestire errore nei dati di EventList.GetPlugins
                // Log.error("Errore nei dati di EventList.GetPlugins");
            }
        } else if (t == EventList.ViewPlugin) {
            if (event.getData() instanceof String) {
                this.forwardToView(this.view, EventList.ViewPlugin, event.getData());
            } else {
                // TODO Gestire errore nei dati di EventList.ViewPlugin
                // Log.error("Errore nei dati di EventList.ViewPlugin");
            }
        } else if (t == EventList.getResultsetImproved) {
            if (event.getData() instanceof Integer) {
                this.onGetResultsetImproved((Integer) event.getData());
            } else if (event.getData() instanceof SearchParams) {
                // VUOL DIRE CHE IL RESULTSET NON  ANCORA APERTO!!!!!!!
            }
            // else Log.error("ERRORE recupero resultset cliccato");
        } else if (t == EventList.GetValuesOfAField) {
            //      System.out.println("sorgente evento: " + event.getData("source"));
            this.onGetValuesOfaField(event.getData("object"), event.getData("source").toString());

        } else if (t == EventList.MassUpdate) {
            if (event.getData() instanceof MassiveUpdateObject) {
                this.onMassiveUpdate((MassiveUpdateObject) event.getData());
            } else
                System.out.println("ERRORE!!! che ?? no MassiveUpdateObject");
        } else if (t == EventList.UpdateObjects) {
            if (event.getData() instanceof NewObjects) {
                this.onUpdateObjects((NewObjects) event.getData());
            } else
                System.out.println("ERRORE!!! che ?? no NewObjects");
        } else if (t == EventList.RetrievePkValues) {
            if (event.getData() instanceof SearchParams) {
                this.onRetrievePkValues((SearchParams) event.getData());
            } else
                System.out.println("errore! non  un searchparams!");
            // else Log.error("ERRORE recupero resultset cliccato");
        }

    }

    private void onCheckRegistrationInfo(RegistrationInfo regInfo) {
        // TODO Auto-generated method stub
        AsyncCallback<Integer> callback = new AsyncCallback<Integer>() {
            public void onFailure(final Throwable caught) {
                forwardToView(view, EventList.RegistrationError, caught.getLocalizedMessage());
            }

            public void onSuccess(final Integer output) {
                forwardToView(view, EventList.RegistrationSuccessfull, output);
            }

        };

        /* Make the call */
        service.checkRegistrationInfo(regInfo, callback);
    }

    private void onUpdateObjects(NewObjects data) {
        final MessageBox waitbox = MessageBox.wait("Attendere", "Salvataggio in corso...", "");

        /* Set up the callback */
        AsyncCallback<Integer> callback = new AsyncCallback<Integer>() {
            public void onFailure(final Throwable caught) {
                waitbox.close();
                Dispatcher.forwardEvent(EventList.Error, caught.getLocalizedMessage());
            }

            public void onSuccess(final Integer result) {
                waitbox.close();
                if (result.intValue() > 0) {
                    Info.display("Informazione", "Dati salvati", "");

                } else {
                    Dispatcher.forwardEvent(EventList.Error, "Impossibile salvare le modifiche");
                }
            }
        };

        /* Make the call */
        service.updateObjects(data.getResultsetId(), data.getNewObjectList(), "$-notspec-$", user.getUid(),
                callback);

    }

    private void onRetrievePkValues(final SearchParams searchParams) {
        // TODO Auto-generated method stub
        new MessageBox();
        final MessageBox waitBox = MessageBox.wait("Caricamento valori di primary key interessati",
                "Attendere prego...", "Loading...");

        AsyncCallback<PagingLoadResult<BaseModelData>> callback = new AsyncCallback<PagingLoadResult<BaseModelData>>() {

            @Override
            public void onFailure(Throwable arg0) {
                // TODO Auto-generated method stub
                MessageBox.alert("Errore", "Errore nel recupero dei valori di primary key per la modifica massiva",
                        null);
            }

            @Override
            public void onSuccess(PagingLoadResult<BaseModelData> arg0) {
                // TODO Auto-generated method stub
                ListStore<BaseModelData> store = new ListStore<BaseModelData>();
                store.add(arg0.getData());
                SearchResult searchResult = new SearchResult();
                searchResult.setResultsetId(searchParams.getResultsetId());
                searchResult.setStore(store);
                searchResult.setSearchParams(searchParams);
                waitBox.close();
                forwardToView(view, EventList.FkValuesRetrieved, searchResult);
            }
        };

        service.getRecords(null, searchParams, callback);

    }

    private void onMassiveUpdate(MassiveUpdateObject data) {
        // TODO Auto-generated method stub
        AsyncCallback<Integer> callback = new AsyncCallback<Integer>() {

            @Override
            public void onFailure(Throwable arg0) {
                // TODO Auto-generated method stub
                MessageBox.alert("ERRORE interno", "Impossibile eseguire update!", null);
            }

            @Override
            public void onSuccess(Integer result) {
                // TODO Auto-generated method stub
                if (result > 0) {
                    MessageBox.info("SUCCESS", "Update riuscito!", null);
                } else
                    MessageBox.alert("ERRORE", "Impossibile eseguire update!", null);
            }
        };

        service.massiveUpdate(data, user.getUid(), callback);
    }

    private void onGetValuesOfaField(final Object object, final String source) {
        // TODO Auto-generated method stub
        if (object instanceof ForeignKey) {
            AsyncCallback<List<BaseModelData>> callback = new AsyncCallback<List<BaseModelData>>() {

                @Override
                public void onFailure(Throwable arg0) {
                    // TODO Auto-generated method stub
                    MessageBox.alert(
                            "Recupero store autocompletamento campo " + ((ForeignKey) object).getPointingFieldName()
                                    + " per foreign key: " + ((ForeignKey) object).getPointedFieldName(),
                            "loaderLoadException: " + arg0.getLocalizedMessage(), null);
                    arg0.printStackTrace();
                }

                @Override
                public void onSuccess(List<BaseModelData> values) {
                    // TODO Auto-generated method stub
                    ForeignKey newData = new ForeignKey();
                    newData.setPointingFieldName(((ForeignKey) object).getPointingFieldName());
                    newData.setPointingResultsetId(((ForeignKey) object).getPointingResultsetId());
                    newData.setPointedTableName(((ForeignKey) object).getPointedTableName());
                    newData.setPointedFieldName(((ForeignKey) object).getPointedFieldName());
                    List<String> newValues = new ArrayList<String>();
                    for (BaseModelData m : values) {
                        newValues.add((String) m.get(((ForeignKey) object).getPointedFieldName()));
                    }
                    newData.setValues(newValues);
                    // System.out.println("lunghezza lista sul controller: "
                    // + newValues.size());
                    // System.out.println("recuperati valori per "
                    // + ((ForeignKey) object).getPointedFieldName() + " del rs "
                    // + ((ForeignKey) object).getPointedTableName());

                    AppEvent event = new AppEvent(EventList.GotValuesOfAField);
                    event.setData("object", newData);
                    event.setData("source", source);

                    forwardToView(view, event);

                }
            };

            service.getValuesOfAFieldFromTableName(((ForeignKey) object).getPointedTableName().toString(),
                    ((ForeignKey) object).getPointedFieldName().toString(), callback);
        }

        if (object instanceof SearchParams) {
            AsyncCallback<List<BaseModelData>> callback = new AsyncCallback<List<BaseModelData>>() {

                @Override
                public void onFailure(Throwable arg0) {
                    // TODO Auto-generated method stub
                    MessageBox.alert(
                            "Recupero store autocompletamento campo " + ((ForeignKey) object).getPointingFieldName()
                                    + " per foreign key: " + ((ForeignKey) object).getPointedFieldName(),
                            "loaderLoadException: " + arg0.getLocalizedMessage(), null);
                    arg0.printStackTrace();
                }

                @Override
                public void onSuccess(List<BaseModelData> values) {
                    // TODO Auto-generated method stub
                    SearchResult searchResult = new SearchResult();
                    searchResult.setResultsetId(((SearchParams) object).getResultsetId());

                    ListStore<BaseModelData> resultStore = new ListStore<BaseModelData>();
                    resultStore.add(values);

                    searchResult.setStore(resultStore);
                    searchResult.setSearchParams((SearchParams) object);

                    AppEvent event = new AppEvent(EventList.GotValuesOfAField, searchResult);
                    event.setData("object", searchResult);
                    event.setData("source", source);

                    forwardToView(view, event);

                }
            };

            service.getValuesOfAField(((SearchParams) object).getResultsetId(),
                    (String) ((SearchParams) object).getFieldsValuesList().get(0).get("field"), callback);
        }
    }

    private void onSaveNewRecord(List<BaseModelData> data, final int resultsetId) {
        final MessageBox waitbox = MessageBox.wait("Attendere", "Salvataggio in corso...", "");

        // List<BaseModelData> appList = new ArrayList<BaseModelData>();
        // appList.add(data);
        /* Set up the callback */
        AsyncCallback<Integer> callback = new AsyncCallback<Integer>() {
            public void onFailure(final Throwable caught) {
                waitbox.close();
                Dispatcher.forwardEvent(EventList.Error, caught.getLocalizedMessage());
            }

            public void onSuccess(final Integer result) {
                waitbox.close();
                if (result.intValue() > 0) {
                    Info.display("Informazione", "Dati salvati", "");
                    forwardToView(view, EventList.refreshStore, resultsetId);
                } else {
                    Dispatcher.forwardEvent(EventList.Error, "Impossibile salvare il nuovo record");
                }
            }
        };

        /* Make the call */
        service.setObjects(resultsetId, data, user.getUid(), callback);

    }

    private void onCheckCredential(Credentials credentials) {
        // TODO Auto-generated method stub
        AsyncCallback<User> callback = new AsyncCallback<User>() {
            public void onFailure(final Throwable caught) {
                Dispatcher.forwardEvent(EventList.LoginError, caught.getLocalizedMessage());
            }

            public void onSuccess(final User user) {
                if (user.getLogin() == 0) {
                    forwardToView(view, EventList.initialChangePassword, user);
                } else
                    Dispatcher.forwardEvent(EventList.Init, user);
            }
        };

        /* Make the call */
        service.getSimpleUser(credentials, callback);
    }

    private void onCheckCredentialAndChangePassword(Credentials credentials) {
        // TODO Auto-generated method stub
        AsyncCallback<User> callback = new AsyncCallback<User>() {
            public void onFailure(final Throwable caught) {
                Dispatcher.forwardEvent(EventList.changePasswordError, caught.getLocalizedMessage());
            }

            public void onSuccess(final User user) {
                if (user == null) {
                    System.out.println("problema nel cambio password...utente nullo");
                    forwardToView(view, EventList.changePasswordError, user);
                } else {
                    Info.display("Aggiornamento Riuscito", "password aggiornata correttamente");
                    Dispatcher.forwardEvent(EventList.Init, user);
                }
            }
        };

        /* Make the call */
        service.changePassword(credentials, callback);
    }

    private void onGetResultsetImproved(final int resultsetId) {
        final MessageBox box = MessageBox.progress("Please wait", "Loading items...", "Initializing...");
        final ProgressBar bar = box.getProgressBar();
        bar.auto();
        // TODO Auto-generated method stub
        AsyncCallback<ResultsetImproved> callback = new AsyncCallback<ResultsetImproved>() {

            @Override
            public void onFailure(Throwable caught) {
                // TODO Auto-generated method stub
                box.close();
                Info.display("ERRORE", "Impossibile caricare resultset");
                // Log.error("Errore nel caricamento della lista del resultSet "
                // + resultsetId);
            }

            @Override
            public void onSuccess(ResultsetImproved result) {
                // TODO Auto-generated method stub
                box.close();
                Info.display("OK", "Resultset caricato");
                onGotResultsetImproved(result);

            }

        };

        service.getResultsetImproved(resultsetId, user.getUid(), callback);
    }

    private void onCreateFirstTab() {
        // TODO Auto-generated method stub
        final MessageBox box = MessageBox.progress("Please wait", "Loading main men...", "Initializing...");
        final ProgressBar bar = box.getProgressBar();
        bar.auto();
        AsyncCallback<List<Resultset>> callback = new AsyncCallback<List<Resultset>>() {

            @Override
            public void onFailure(Throwable caught) {
                // TODO Auto-generated method stub
                box.close();
                // Log.error("Errore nel caricamento della lista dei resultSet per l'utente "
                // + user.getName());
            }

            @Override
            public void onSuccess(List<Resultset> resultsetList) {
                // TODO Auto-generated method stub
                box.close();
                Info.display("Informazione", "Lista ResultSet caricata");
                //            user.setResultsetList(resultsetList);
                onGotFirstTab(resultsetList);
            }

        };

        service.getUserResultsetList(this.user.getUid(), callback);
    }

    private void onGotResultsetImproved(ResultsetImproved result) {
        // TODO Auto-generated method stub

        if (this.user.getResultsetImprovedFromId(result.getId()) == null) {
            // System.out.println("resultsetIMPROVED " + result.getName() +
            // " aggiunto alla lista");
            this.user.addResultsetToList(result);
        }
        this.forwardToView(this.view, EventList.gotResultsetImproved, result);
    }

    private void onGotFirstTab(List<Resultset> resultsetList) {
        // TODO Auto-generated method stub
        this.user.setResultsetList(resultsetList);
        this.forwardToView(this.view, EventList.GotResultsetList, user);
    }

    private void onNewMessage() {
        // final ManagerServiceAsync service =
        // (ManagerServiceAsync) Registry.get(Jardin.SERVICE);

        /* Set up the callback */
        AsyncCallback<List<Message>> callback = new AsyncCallback<List<Message>>() {

            public void onFailure(final Throwable caught) {
                // TODO Auto-generated method stub

            }

            public void onSuccess(final List<Message> messages) {
                JardinController.this.user.setMessages(messages);
                Info.display("Informazione", "Hai ricevuto un nuovo messaggio");
                // forwardToView(view, EventList.NewMessage, null);
            }
        };

        /* Make the call */
        service.getUserMessages(this.user.getUid(), callback);
    }

    private void onSendMessage(final Message message) {

        /* Fill message with sender id */
        if (message.getSender() < 0) {
            message.setSender(this.user.getUid());
        }

        // final ManagerServiceAsync service =
        // (ManagerServiceAsync) Registry.get(Jardin.SERVICE);

        /* Set up the callback */
        AsyncCallback callback = new AsyncCallback() {

            public void onFailure(final Throwable caught) {
                // TODO Auto-generated method stub

            }

            public void onSuccess(final Object result) {
                Info.display("Informazione", "Messaggio inviato e memorizzato.");
                // TODO Auto-generated method stub

            }
        };

        /* Make the call */
        service.sendMessage(message, callback);
    }

    public User getUser() {
        return this.user;
    }

    private String loginMessage() {
        // if (GXT.isWebKit) {
        // return null;
        // } else {
        // return webKitSuggest;
        // }
        return null;
    }

    private void onError(final String error) {
        MessageBox.alert("Errore", error, null);
    }

    private void onCheckUser(final Credentials credentials) {

        // final ManagerServiceAsync service =
        // (ManagerServiceAsync) Registry.get(Jardin.SERVICE);

        /* Set up the callback */
        AsyncCallback<User> callback = new AsyncCallback<User>() {
            public void onFailure(final Throwable caught) {
                Dispatcher.forwardEvent(EventList.LoginError, caught.getLocalizedMessage());
            }

            public void onSuccess(final User user) {
                Dispatcher.forwardEvent(EventList.Init, user);
            }
        };

        /* Make the call */
        service.getUser(credentials, callback);
    }

    private void onLoginError(final AppEvent event) {
        this.forwardToView(this.view, event);
    }

    private void onChangePasswordError(final AppEvent event) {
        this.forwardToView(this.view, event);
    }

    private void onLogout(final AppEvent event) {
        this.forwardToView(this.view, event);
    }

    private void onInit(final User user) {
        this.user = user;
        user.addEvent(EventList.NewMessage);

        // final ManagerServiceAsync service =
        // (ManagerServiceAsync) Registry.get(Jardin.SERVICE);

        AsyncCallback<List<EventType>> callback = new AsyncCallback<List<EventType>>() {

            public void onSuccess(final List<EventType> eventTypes) {

                for (EventType eventType : eventTypes) {
                    JardinController.this.handleEvent(new AppEvent(eventType));
                }
                service.getEvents(user.getUid(), this);
            }

            public void onFailure(final Throwable caught) {
                // TODO Auto-generated method stub

            }
        };

        service.getEvents(user.getUid(), callback);

        this.forwardToView(this.view, EventList.Init, user);
    }

    private void onCreateUI() {
        /* Vedi sequence diagram init_sd.pic */

        /* Per ogni resultset carica da service le sue propriet */
        for (ResultsetImproved resultset : this.user.getResultsets()) {
            final Integer resultsetId = resultset.getId();
            /* Avvisa la view che si sta creando un nuovo resultset */
            this.forwardToView(this.view, EventList.NewResultset, resultsetId);
            this.forwardToView(this.view, EventList.GotValuesOfFields, resultsetId);
            // forwardToView(view, EventList.gotValuesOfForeignKeys,
            // resultsetId);

            // final ManagerServiceAsync service =
            // (ManagerServiceAsync) Registry.get(Jardin.SERVICE);
            //
            // /*
            // * Carica i valori dei vincoli di integrit referenziale attualmente
            // * presenti: sever per il binding dei campi del dettaglio e per il row
            // * editor
            // */
            //
            // AsyncCallback<FieldsMatrix> callbackValuesOfForeignKeys =
            // new AsyncCallback<FieldsMatrix>() {
            // public void onFailure(Throwable caught) {
            // Dispatcher.forwardEvent(EventList.Error,
            // caught.getLocalizedMessage());
            // }
            //
            // public void onSuccess(FieldsMatrix fieldsMatrix) {
            // ResultsetImproved rs = user.getResultsetFromId(resultsetId);
            // rs.setForeignKeyList(fieldsMatrix);
            // forwardToView(view, EventList.GotValuesOfForeignKeys, resultsetId);
            // }
            // };
            //
            // service.getValuesOfForeignKeys(resultsetId,
            // callbackValuesOfForeignKeys);
            this.forwardToView(this.view, EventList.GotValuesOfForeignKeys, resultsetId);
        }
    }

    private void onSearch(final SearchParams searchParams) {
        new MessageBox();
        final MessageBox waitBox = MessageBox.wait("Caricamento dati", "Attendere prego...", "Loading...");
        // TODO Modificare per gestire il solo resultsetId come parametro
        // if
        // (this.user.getResultsetImprovedFromId(searchParams.getResultsetId()).isRead())
        // {
        if (this.user.getResultsetFromId(searchParams.getResultsetId()) != null) {
            if (this.user.getResultsetFromId(searchParams.getResultsetId()).getPermissions().isReadperm()) {

                // ///////////////////////////////////////////
                // alla griglia servono i searchParams

                this.forwardToView(this.view, EventList.Search, searchParams);

                final boolean limit = searchParams.isLimit();
                // final ManagerServiceAsync service =
                // (ManagerServiceAsync) Registry.get(Jardin.SERVICE);

                RpcProxy<PagingLoadResult<BaseModelData>> proxy = new RpcProxy<PagingLoadResult<BaseModelData>>() {
                    @Override
                    public void load(final Object loadConfig,
                            final AsyncCallback<PagingLoadResult<BaseModelData>> callback) {
                        PagingLoadConfig plc = (PagingLoadConfig) loadConfig;
                        if (!limit) {
                            plc.setLimit(-1);
                        }
                        service.getRecords(plc, searchParams, callback);
                    }
                };

                PagingLoader<PagingLoadResult<BaseModelData>> loader = new BasePagingLoader<PagingLoadResult<BaseModelData>>(
                        proxy);

                loader.setRemoteSort(true);
                ListStore<BaseModelData> store = new ListStore<BaseModelData>(loader);

                loader.addLoadListener(new LoadListener() {
                    @Override
                    public void loaderLoad(final LoadEvent le) {
                        waitBox.close();
                    }

                    @Override
                    public void loaderLoadException(final LoadEvent le) {
                        waitBox.close();
                        Dispatcher.forwardEvent(EventList.Error, le.exception);
                    }
                });

                SearchResult searchResult = new SearchResult();
                searchResult.setResultsetId(searchParams.getResultsetId());
                searchResult.setStore(store);
                this.forwardToView(this.view, EventList.Searched, searchResult);
                // ///////////////////////////////////////////

                // forwardToView(view, EventList.Search, searchParams);
            } else {
                Dispatcher.forwardEvent(EventList.Error, "L'utente non dispone dei permessi di lettura");
            }
        } else { // questo resultsetimproved non  stato ancora caricato-->niente
                 // tab sulla griglia
                 // Dispatcher.forwardEvent(EventList.getResultsetImprovedFromContextMenu,
                 // searchParams.getResultsetId());
        }
    }

    private void onCommitChanges(final JardinGrid grid) {

        // TODO Modificare per gestire il solo resultsetID come parametro
        ResultsetImproved resultset = grid.getResultset();
        if (resultset.isInsert() || resultset.isModify()) {

            List<BaseModelData> newItemList = new ArrayList<BaseModelData>();
            for (Record rec : grid.getStore().getModifiedRecords()) {
                newItemList.add((BaseModelData) rec.getModel());
            }

            if (newItemList.size() > 0) {
                final MessageBox waitbox = MessageBox.wait("Attendere", "Salvataggio modifiche in corso...", "");

                /* Set up the callback */
                AsyncCallback<Integer> callback = new AsyncCallback<Integer>() {
                    public void onFailure(final Throwable caught) {
                        waitbox.close();
                        grid.getStore().rejectChanges();
                        Dispatcher.forwardEvent(EventList.Error, caught.getLocalizedMessage());
                    }

                    public void onSuccess(final Integer retCode) {
                        waitbox.close();
                        grid.getStore().commitChanges();
                        Info.display("Informazione", "Modifiche salvate sul Database");
                    }
                };

                /* Make the call */
                // service.setObjects(resultset.getId(), newItemList, callback);
                service.updateObjects(resultset.getId(), newItemList, new String("$-notspec-$"),
                        grid.getUser().getUid(), callback);
            } else {
                Info.display("Informazione", "Nessuna modifica da salvare", "");
            }
        } else {
            Dispatcher.forwardEvent(EventList.Error, "L'utente non dispone dei permessi di modifica");
        }
    }

    // private void onAddRow(final int resultset) {
    // if (this.user.getResultsetImprovedFromId(resultset).isInsert()) {
    // this.forwardToView(this.view, EventList.AddRow, resultset);
    // } else {
    // Dispatcher.forwardEvent(EventList.Error,
    // "L'utente non dispone dei permessi di inserimento");
    // }
    // }

    private void onViewPopUpDetail(final BaseModelData data) {
        // if (((Resultset) data.get("RSLINKED")).getPermissions().isReadperm()) {
        // restituisce il BaseModelData con la riga interessata

        // final ManagerServiceAsync service =
        // (ManagerServiceAsync) Registry.get(Jardin.SERVICE);

        AsyncCallback<ArrayList<BaseModelData>> callbackPopUpDetailEntry = new AsyncCallback<ArrayList<BaseModelData>>() {
            public void onFailure(final Throwable caught) {
                Dispatcher.forwardEvent(EventList.Error, caught.getLocalizedMessage());
            }

            public void onSuccess(final ArrayList<BaseModelData> infoToView) {
                forwardToView(view, EventList.ViewPopUpDetail, infoToView);
            }
        };

        service.getPopUpDetailEntry(data, callbackPopUpDetailEntry);

        // } else {
        // Dispatcher.forwardEvent(EventList.Error,
        // "L'utente non dispone dei permessi di visualizzazione");
        // }
    }

    private void onRemoveRows(final NewObjects removingObjs) {
        if (this.user.getResultsetImprovedFromId(removingObjs.getResultsetId()).isDelete()) {
            final JardinGrid grid = this.view.getItemByResultsetId(removingObjs.getResultsetId()).getGrid();

            /* Set up the callback */
            AsyncCallback<Integer> callback = new AsyncCallback<Integer>() {
                public void onFailure(final Throwable caught) {
                    //                  waitbox.close();
                    Dispatcher.forwardEvent(EventList.Error, caught.getLocalizedMessage());
                }

                @Override
                public void onSuccess(Integer result) {
                    //                  waitbox.close();
                    if (Integer.valueOf(result) <= 0) {
                        Dispatcher.forwardEvent(EventList.Error, "Nessuna riga eliminata");
                    } else {
                        ListStore<BaseModelData> store = grid.getStore();
                        for (BaseModelData row : removingObjs.getNewObjectList()) {
                            store.remove(row);
                        }
                        store.commitChanges();
                        Info.display("Informazione", "Dati cancellati", "");
                    }
                }

            };

            /* Make the call */
            service.removeObjects(removingObjs.getResultsetId(), removingObjs.getNewObjectList(), user.getUid(),
                    callback);

        } else {
            Dispatcher.forwardEvent(EventList.Error, "L'utente non dispone dei permessi di eliminazione");
        }
    }

    /**
     * Esporta tutti i dati contenuti nella griglia in formato CSV
     * 
     * @param grid
     *          la griglia che contiene i dati da esportare
     * @param allStore
     *          se esportare o no tutti i record dello store o solo quelli
     *          visualizzati nella griglia
     * @param allColumns
     *          se esportare o no tutte le colonne dello store o solo quelle
     *          visualizate nella griglia
     */
    // private void onExport(BaseModelData dataForExport) {
    // int resultset = dataForExport.get("resultsetId");
    // boolean allRows = dataForExport.get("allRows");
    // boolean allColumns = dataForExport.get("allColumns");
    // boolean allStore = dataForExport.get("allStore");
    // String fs = dataForExport.get("fs");
    // String ts = dataForExport.get("ts");
    private void onExport(final int resultset, final boolean allRows, final boolean allStore,
            final boolean allColumns) {

        new MessageBox();
        final MessageBox waitBox = MessageBox.wait("Caricamento dati", "Attendere prego...", "Loading...");

        /* Nome del file da creare */
        String filename = this.user.getResultsetImprovedFromId(resultset).getAlias().replace(" ", "_");

        /*
         * Prendi il tabItem per recuperare la toolbar (formato d'esportazione) e la
         * grid (config dei record da esportare, colonne visibili e criteri di
         * ricerca)
         */
        JardinTabItem item = this.view.getItemByResultsetId(resultset);

        /* Prendi il formato di esportazione */
        JardinGridToolBar toolbar = item.getToolbar();
        Template template = toolbar.getTemplate();

        // Prendi i separatori per l'export csv
        // if toolbar
        char fs = toolbar.getFieldSeparator();
        char ts = toolbar.getTextSeparator();

        /* Prendi la griglia */
        JardinGrid grid = item.getGrid();

        /* Config dei record da esportare (tutti se allStore = true) */
        PagingLoadConfig config = null;
        List<BaseModelData> selectedRows = null;
        if (!allStore) {
            config = (PagingLoadConfig) grid.getStore().getLoadConfig();
        } else if (allRows) {
            selectedRows = grid.getSelectionModel().getSelection();
        }

        /* Colonne visibili (tutte se allColumns = true) */
        ColumnModel cm = grid.getColumnModel();
        List<String> columns = new ArrayList<String>();
        for (int i = 0; i < cm.getColumnCount(); i++) {
            if (allColumns || !cm.getColumn(i).isHidden()) {
                columns.add(cm.getColumn(i).getId());
            }
        }

        /* Criteri di ricerca */
        SearchParams searchParams = grid.getSearchparams();

        /* Effettua la chiamata RPC */
        // final ManagerServiceAsync service =
        // (ManagerServiceAsync) Registry.get(Jardin.SERVICE);

        AsyncCallback<String> callback = new AsyncCallback<String>() {
            public void onFailure(final Throwable caught) {
                waitBox.close();
                Dispatcher.forwardEvent(EventList.Error, caught.getLocalizedMessage());
            }

            public void onSuccess(final String result) {
                waitBox.close();
                if ((result != null) && (result.length() > 0)) {
                    // Log.debug("Export file: " + result);
                    String url = GWT.getModuleBaseURL() + "download?file=" + result;
                    Window.open(url, "Download", null);
                } else {
                    // Log.warn("File d'esportazione vuoto");
                }
            }
        };

        service.createReport("/tmp/" + filename, template, config, selectedRows, columns, searchParams, fs, ts,
                callback);
    }

    private void onShowAllColumns(final int resultset) {
        this.forwardToView(this.view, EventList.ShowAllColumns, resultset);
    }

    private void onSaveGridView(final int resultset) {
        this.forwardToView(this.view, EventList.SaveGridView, resultset);
    }

    private void onGetGridViews(final int resultset) {
        // final ManagerServiceAsync service =
        // (ManagerServiceAsync) Registry.get(Jardin.SERVICE);

        AsyncCallback<HeaderPreferenceList> callback = new AsyncCallback<HeaderPreferenceList>() {
            public void onFailure(final Throwable caught) {
                Dispatcher.forwardEvent(EventList.Error, caught.getLocalizedMessage());
            }

            public void onSuccess(final HeaderPreferenceList result) {
                Info.display("Informazione", "Lista delle preferenze caricata");
                JardinController.this.forwardToView(JardinController.this.view, EventList.GotHeaderPreference,
                        result);
            }
        };

        service.getGridViews(this.user.getUid(), resultset, callback);
    }

    private void onUploadTemplate(final int resultset) {
        UploadDialog d = new UploadDialog(this.user, UploadDialog.TYPE_TEMPLATE, resultset);
        d.show();
    }

    private void onUploadImport(final int resultset) {
        UploadDialog d = new UploadDialog(this.user, UploadDialog.TYPE_IMPORT, resultset);
        d.show();
    }

    private void onUploadInsert(final int resultset) {
        UploadDialog d = new UploadDialog(this.user, UploadDialog.TYPE_INSERT, resultset);
        d.show();
    }

    private void onUpdateColumnModel(final JardinGrid grid) {
        // final ManagerServiceAsync service =
        // (ManagerServiceAsync) Registry.get(Jardin.SERVICE);

        AsyncCallback<List<Integer>> callback = new AsyncCallback<List<Integer>>() {
            public void onFailure(final Throwable caught) {
                Dispatcher.forwardEvent(EventList.Error, caught.getLocalizedMessage());
            }

            public void onSuccess(final List<Integer> result) {
                grid.updateGridHeader(result);
            }
        };

        service.getHeaderUserPreference(this.user.getUid(), grid.getUserPreferenceHeaderId(), callback);
    }

    private void onJungle(final int resultset) {
        /* Nome del file da creare */
        String filename = this.user.getResultsetImprovedFromId(resultset).getAlias();

        /*
         * Prendi il tabItem per recuperare la toolbar (formato d'esportazione) e la
         * grid (config dei record da esportare, colonne visibili e criteri di
         * ricerca)
         */
        JardinTabItem item = this.view.getItemByResultsetId(resultset);

        /* Prendi la griglia */
        JardinGrid grid = item.getGrid();

        /* Colonne */
        ColumnModel cm = grid.getColumnModel();
        final List<String> columns = new ArrayList<String>();
        for (int i = 0; i < cm.getColumnCount(); i++) {
            if (!(cm.getColumn(i).isHidden())) {
                columns.add(cm.getColumn(i).getId());
            }
        }

        /* Criteri di ricerca */
        SearchParams searchParams = grid.getSearchparams();

        /* Effettua la chiamata RPC */
        // final ManagerServiceAsync service =
        // (ManagerServiceAsync) Registry.get(Jardin.SERVICE);

        AsyncCallback<String> callback = new AsyncCallback<String>() {
            public void onFailure(final Throwable caught) {
                Dispatcher.forwardEvent(EventList.Error, caught.getLocalizedMessage());
            }

            public void onSuccess(final String result) {
                if ((result != null) && (result.length() > 0)) {
                    Jungle j = new Jungle(JardinController.this.user.getResultsetImprovedFromId(resultset), columns,
                            result);
                    j.show();
                } else {
                    // Log.warn("File d'esportazione vuoto");
                }
            }
        };
        char noChar = 0;
        service.createReport("/tmp/" + filename, Template.XML, null, null, columns, searchParams, noChar, noChar,
                callback);

    }

    /**
     * Recupera i 2 campi da utilizzare come testo - valore nel grafico
     * 
     * @param ct
     * 
     * @param type
     * @param resultset
     */
    private void onSelectColumnsForChart(final ChartType ct, final Integer resultset) {
        JardinTabItem item = this.view.getItemByResultsetId(resultset);
        JardinGrid grid = item.getGrid();

        JardinSelectColumnsForChartPopUp popup = new JardinSelectColumnsForChartPopUp(grid, ct.toString());

        popup.show();

    }

    /**
     * Genera un grafico prendendo le prime due colonne visibili della griglia. La
     * prima deve essere di tipo stringa o numerico, la seconda deve essere di
     * tipo numerico
     * 
     * @param type
     * @param resultset
     */
    private void onShowChart(final ArrayList<String> dataToChart) {

        /*
         * Prendi il tabItem per recuperare la toolbar (formato d'esportazione) e la
         * grid (config dei record da esportare, colonne visibili e criteri di
         * ricerca)
         */
        Integer resultset = Integer.valueOf(dataToChart.get(1));
        String title = dataToChart.get(2);
        String value = dataToChart.get(3);
        ChartType type = ChartType.valueOf(dataToChart.get(0));

        JardinTabItem item = this.view.getItemByResultsetId(resultset);

        /* Prendi la griglia */
        JardinGrid grid = item.getGrid();

        /* Prendi gli ID delle prime due colonne visibili */
        // ColumnModel columnModel = grid.getColumnModel();
        String cx = title;
        String cy = value;

        String url = "resources/chart/open-flash-chart.swf";

        Chart chart = new Chart(url);
        chart.setBorders(false);

        String resultsetAlias = this.user.getResultsetImprovedFromId(resultset).getAlias();
        ChartModel cm = new ChartModel(resultsetAlias);
        cm.setBackgroundColour("#ffffff");

        // SearchParams searchParams = grid.getSearchparams();
        // ListStore<BaseModelData> store = view.getStore(searchParams, false);
        ListStore<BaseModelData> store = grid.getStore();
        store.getLoader().load();

        switch (type) {
        case BAR:
            BarChart bar = new BarChart(BarStyle.GLASS);
            bar.setAnimateOnShow(true);
            bar.setTooltip("#val#");
            BarDataProvider bdp = new BarDataProvider(cy, cx);
            bdp.bind(store);
            System.out.println(store);
            bar.setDataProvider(bdp);
            // cm.setScaleProvider(ScaleProvider.ROUNDED_NEAREST_SCALE_PROVIDER);
            cm.addChartConfig(bar);
            break;
        case PIE:
        default:
            PieChart pie = new PieChart();
            pie.setAlpha(0.5f);
            pie.setNoLabels(false);
            pie.setTooltip("#label# #val#<br>#percent#");
            pie.setGradientFill(true);
            pie.setColours(chartColors);
            PieDataProvider pdp = new PieDataProvider(cy, cx);
            pdp.bind(store);
            pie.setDataProvider(pdp);
            cm.addChartConfig(pie);
            break;
        }
        chart.setChartModel(cm);

        Dialog d = new Dialog();
        d.getButtonBar().removeAll();
        d.setMaximizable(true);
        d.setTitle("Grafico " + resultsetAlias);
        d.setIconStyle("icon-chart");
        d.setLayout(new FitLayout());
        d.setSize(500, 500);
        d.add(chart);
        d.show();
    }

    private void onUpdateTemplates(final int resultset) {
        // TODO Auto-generated method stub
    }

    private void onViewLinkedResultset(final IncomingForeignKeyInformation ifki) {

        ResultsetImproved rs = ifki.getInterestedResultset();
        SearchParams searchParams = new SearchParams(rs.getId());
        searchParams.setGroupId(user.getGid());
        searchParams.setAccurate(true);
        searchParams.setUserId(user.getUid());
        List<BaseModelData> queryFieldList = new ArrayList<BaseModelData>();
        SearchStringParser parser = new SearchStringParser(
                ifki.getLinkingField() + "=\"" + ifki.getFieldValue() + "\"");

        Map<String, String> searchMap = parser.getSearchMap();
        for (String key : parser.getSearchMap().keySet()) {
            BaseModelData m = new BaseModelData();
            m.set(key, searchMap.get(key));
            queryFieldList.add(m);
        }
        searchParams.setFieldsValuesList(queryFieldList);
        Dispatcher.forwardEvent(EventList.Search, searchParams);
    }

    private void onGetPlugins(final Integer data) {
        ResultsetImproved rs = this.user.getResultsetImprovedFromId(data);
        // final JardinGrid grid = view.getItemByResultsetId(data).getGrid();

        // final ManagerServiceAsync service =
        // (ManagerServiceAsync) Registry.get(Jardin.SERVICE);

        AsyncCallback<List<Plugin>> callback = new AsyncCallback<List<Plugin>>() {
            public void onFailure(final Throwable caught) {
                Dispatcher.forwardEvent(EventList.Error, caught.getLocalizedMessage());
            }

            public void onSuccess(final List<Plugin> result) {
                JardinController.this.forwardToView(JardinController.this.view, EventList.GotPlugins, result);
                // System.out.println("CONTROLLER: fine recupero plugin");
            }
        };

        service.getPlugins(this.user.getGid(), rs.getId(), callback);

    }
}