view flys-client/src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java @ 526:96e60e0a4345

Added a service stub to update/modify the attribute of a collection (used in the theme control panel). flys-client/trunk@2005 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Wed, 25 May 2011 14:58:42 +0000
parents ba238f917b94
children 902609b5cc79
line wrap: on
line source
package de.intevation.flys.client.client.ui.chart;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;

import com.smartgwt.client.types.ListGridFieldType;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.grid.events.EditCompleteEvent;
import com.smartgwt.client.widgets.grid.events.EditCompleteHandler;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.layout.VLayout;

import de.intevation.flys.client.shared.model.Collection;
import de.intevation.flys.client.shared.model.FacetRecord;
import de.intevation.flys.client.shared.model.OutputMode;
import de.intevation.flys.client.shared.model.Theme;
import de.intevation.flys.client.shared.model.ThemeList;

import de.intevation.flys.client.client.Config;
import de.intevation.flys.client.client.FLYSConstants;
import de.intevation.flys.client.client.services.CollectionAttributeService;
import de.intevation.flys.client.client.services.CollectionAttributeServiceAsync;


/**
 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
 */
public class ChartThemePanel extends Canvas implements EditCompleteHandler {

    /** The interface that provides i18n messages. */
    private FLYSConstants MSG = GWT.create(FLYSConstants.class);


    /** The service that is used to modify collection attributes.*/
    protected CollectionAttributeServiceAsync updater =
        GWT.create(CollectionAttributeService.class);


    public static final String GRID_FIELD_ACTIVE = "active";
    public static final String GRID_FIELD_NAME   = "name";


    protected Collection collection;

    protected OutputMode mode;

    protected ListGrid list;



    public ChartThemePanel(Collection collection, OutputMode mode) {
        this.collection = collection;
        this.mode       = mode;
        this.list       = new ListGrid();

        initGrid();
        initLayout();

        updateGrid();
    }


    /**
     * Initializes the layout of this panel.
     */
    protected void initLayout() {
        setWidth100();
        setHeight100();

        VLayout layout = new VLayout();
        layout.setWidth100();
        layout.setHeight100();

        layout.addMember(list);

        addChild(layout);
    }


    /**
     * Initializes the components (columns) of the theme grid.
     */
    protected void initGrid() {
        list.setCanEdit(true);
        list.setCanSort(false);
        list.setShowRecordComponents(false);
        list.setShowRecordComponentsByCell(true);
        list.setShowHeader(true);
        list.setShowHeaderContextMenu(false);
        list.setWidth100();
        list.setHeight100();

        list.addEditCompleteHandler(this);

        ListGridField active = new ListGridField(GRID_FIELD_ACTIVE, " ", 20);
        active.setType(ListGridFieldType.BOOLEAN);

        ListGridField name = new ListGridField(
            GRID_FIELD_NAME, MSG.chart_themepanel_header_themes());
        name.setType(ListGridFieldType.TEXT);

        list.setFields(active, name);
    }


    /**
     * Replace the current collection with a new one. <b>NOTE: this operation
     * triggers updateGrid() which modifies the themes in the grid.</b>
     *
     * @param collection The new collection object.
     */
    protected void setCollection(Collection collection) {
        this.collection = collection;

        updateGrid();
    }


    /**
     * A method that removes all records from theme grid.
     */
    protected void clearGrid() {
        ListGridRecord[] records = list.getRecords();

        if (records == null || records.length == 0) {
            return;
        }

        for (ListGridRecord record: records) {
            list.removeData(record);
        }
    }


    /**
     * This method is used to clear the current theme grid and add new updated
     * data.
     */
    protected void updateGrid() {
        GWT.log("ChartThemePanel.updateGrid");

        clearGrid();

        ThemeList themeList = collection.getThemeList(mode.getName());

        if (themeList == null) {
            GWT.log("ERROR: No theme list.");
            return;
        }

        int count = themeList.getThemeCount();

        for (int i = 1; i <= count; i++) {
            Theme theme = themeList.getThemeAt(i);

            if (theme == null) {
                continue;
            }

            list.addData(new FacetRecord(theme));
        }
    }


    /**
     * This method is called after a cell in the theme grid has been modified.
     *
     * @param event The event that stores information about the modified record.
     */
    public void onEditComplete(EditCompleteEvent event) {
        GWT.log("Edited record.");

        int         row = event.getRowNum();
        FacetRecord rec = (FacetRecord) list.getRecord(row);

        updateThemeList(rec.getTheme());
    }


    /**
     * Update the theme list of the current collection with a modified theme. If
     * a theme is really modified, the CollectionAttributeService is triggered
     * to save the changes to the artifact server.
     *
     * @param theme The modified theme.
     */
    protected void updateThemeList(Theme theme) {
        GWT.log("Update theme: " + theme.getFacet());

        ThemeList themeList = collection.getThemeList(mode.getName());

        String a = theme.getArtifact();
        String f = theme.getFacet();

        int num = themeList != null ? themeList.getThemeCount() : 0;

        boolean updateRequired = false;

        for (int i = 1; i <= num; i++) {
            Theme old = themeList.getThemeAt(i);

            if (f.equals(old.getFacet()) && a.equals(old.getArtifact())) {
                themeList.removeTheme(old);
                themeList.addTheme(theme);

                updateRequired = true;

                break;
            }
        }

        if (updateRequired) {
            updateCollection();
        }
    }


    /**
     * This method triggers the CollectionAttributeService. Based on the current
     * collectin settings, the attribute of the collection is modified or not.
     * But in every case, we will get a new collection object - which might be
     * the same as the current one.
     */
    public void updateCollection() {
        final Config config = Config.getInstance();
        final String url    = config.getServerUrl();
        final String loc    = config.getLocale();

        GWT.log("ChartThemePanel.updateCollection via RPC now");

        updater.update(collection, url, loc, new AsyncCallback<Collection>() {
            public void onFailure(Throwable caught) {
                GWT.log("Could not update collection attributes.");
                SC.warn(MSG.getString(caught.getMessage()));
            }


            public void onSuccess(Collection collection) {
                setCollection(collection);
            }
        });
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org