view flys-client/src/main/java/de/intevation/flys/client/client/ui/ProjectList.java @ 220:35094660f91a

Implemented a context menu for the project list. flys-client/trunk@1663 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Mon, 11 Apr 2011 15:38:43 +0000
parents b92281182c6b
children 9040663aee01
line wrap: on
line source
package de.intevation.flys.client.client.ui;

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

import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.Label;
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.grid.events.RowContextClickEvent;
import com.smartgwt.client.widgets.grid.events.RowContextClickHandler;
import com.smartgwt.client.widgets.layout.VLayout;
import com.smartgwt.client.widgets.menu.Menu;
import com.smartgwt.client.widgets.menu.MenuItem;
import com.smartgwt.client.widgets.menu.events.MenuItemClickEvent;
import com.smartgwt.client.widgets.menu.events.ClickHandler;
import com.smartgwt.client.types.VerticalAlignment;

import de.intevation.flys.client.shared.model.Collection;
import de.intevation.flys.client.shared.model.CollectionRecord;
import de.intevation.flys.client.shared.model.User;

import de.intevation.flys.client.client.Config;
import de.intevation.flys.client.client.FLYSConstants;
import de.intevation.flys.client.client.event.CollectionChangeEvent;
import de.intevation.flys.client.client.event.CollectionChangeHandler;
import de.intevation.flys.client.client.services.UserCollectionsService;
import de.intevation.flys.client.client.services.UserCollectionsServiceAsync;


/**
 * The project list shows a list of projects of a specific user.
 *
 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
 */
public class ProjectList
extends      VLayout
implements   CollectionChangeHandler
{
    /** The interface that provides i18n messages. */
    private FLYSConstants messages = GWT.create(FLYSConstants.class);

    /** The UserService used to retrieve information about the current user. */
    protected UserCollectionsServiceAsync userCollectionsService =
        GWT.create(UserCollectionsService.class);

    /** The user whose projects should be displayed.*/
    protected User user;

    /** The grid that contains the project rows.*/
    protected ListGrid grid;

    /**
     * The default constructor that creates a new ProjectList for a specific
     * user.
     *
     * @param user The user.
     */
    public ProjectList(User user) {
        this.user = user;

        grid = new CollectionGrid();
        initGrid();
        init();

        updateUserCollections();
    }


    protected void initGrid() {
        grid.setEmptyMessage(messages.no_projects());
        grid.setLoadingDataMessage(messages.load_projects());
        grid.setShowRecordComponents(true);
        grid.setShowRecordComponentsByCell(true);
        grid.setCanRemoveRecords(false);
        grid.setShowHeader(false);
        grid.setWidth100();
        grid.setHeight100();

        ListGridField date = new ListGridField("date", "date");
        ListGridField name = new ListGridField("name", "name");

        date.setWidth(100);
        name.setWidth(195);

        grid.setFields(date, name);

        grid.addRowContextClickHandler(new RowContextClickHandler() {
            public void onRowContextClick(RowContextClickEvent event) {
                CollectionRecord record = (CollectionRecord) event.getRecord();

                Menu menu = createContextMenu(record);
                grid.setContextMenu(menu);
                menu.showContextMenu();

                event.cancel();
            }
        });
    }


    /**
     * Creates a new context menu that interacts with a CollectionRecord.
     *
     * @param record The selected record.
     *
     * @return the context menu with operations that interact with
     * <i>record</i>.
     */
    protected Menu createContextMenu(final CollectionRecord record) {
        Menu menu = new Menu();

        MenuItem open = new MenuItem(messages.open_project());
        open.addClickHandler(new ClickHandler() {
            public void onClick(MenuItemClickEvent evt) {
                SC.say("Open project: " + record.getName());
            }
        });

        MenuItem del = new MenuItem(messages.delete_project());
        del.addClickHandler(new ClickHandler() {
            public void onClick(MenuItemClickEvent evt) {
                SC.warn("Removing projects is not implemented.");
            }
        });

        menu.addItem(open);
        menu.addItem(del);

        return menu;
    }


    /**
     * The init() method handles the layout stuff for this widget.
     */
    protected void init() {
        setWidth(300);
        setHeight100();
        setShowResizeBar(true);
        setShowEdges(false);
        setLayoutMargin(0);
        setLayoutAlign(VerticalAlignment.TOP);

        Label title = new Label(messages.projects());
        title.setHeight("20");
        title.setMargin(5);
        title.setWidth100();
        title.setStyleName("fontLightSmall");

        Canvas titleWrapper = new Canvas();
        titleWrapper.setStyleName("bgBlueDark");
        titleWrapper.setWidth100();
        titleWrapper.setHeight("20px");
        titleWrapper.addChild(title);

        Canvas gridWrapper = new Canvas();
        gridWrapper.setPadding(0);
        titleWrapper.setWidth100();
        gridWrapper.addChild(grid);

        addMember(titleWrapper);
        addMember(gridWrapper);
    }


    public void onCollectionChange(CollectionChangeEvent event) {
        GWT.log("ProjectList.onCollectionChange");

        updateUserCollections();
    }


    protected void updateUserCollections() {
        Config config = Config.getInstance();
        String url    = config.getServerUrl();

        userCollectionsService.getUserCollections(url, user.identifier(),
            new AsyncCallback<Collection[]>() {
                public void onFailure(Throwable caught) {
                    GWT.log("Could not recieve a list of user collections.");
                    GWT.log(caught.getMessage());
                }

                public void onSuccess(Collection[] collections) {
                    int num = collections != null ? collections.length : 0;

                    GWT.log("Received " + num + " user collections.");

                    if (num == 0) {
                        return;
                    }

                    updateGrid(collections);
                }
            }
        );
    }


    protected void clearGrid() {
        ListGridRecord[] records = grid.getRecords();

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


    protected void updateGrid(Collection[] collections) {
        clearGrid();

        for (Collection c: collections) {
            grid.addData(new CollectionRecord(c));
        }
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org