ingo@4: package de.intevation.flys.client.client.ui;
ingo@4:
ingo@4: import com.google.gwt.core.client.GWT;
ingo@97: import com.google.gwt.user.client.rpc.AsyncCallback;
ingo@4:
ingo@220: import com.smartgwt.client.util.SC;
ingo@4: import com.smartgwt.client.widgets.Canvas;
ingo@4: import com.smartgwt.client.widgets.Label;
ingo@4: import com.smartgwt.client.widgets.grid.ListGrid;
ingo@4: import com.smartgwt.client.widgets.grid.ListGridField;
ingo@97: import com.smartgwt.client.widgets.grid.ListGridRecord;
ingo@220: import com.smartgwt.client.widgets.grid.events.RowContextClickEvent;
ingo@220: import com.smartgwt.client.widgets.grid.events.RowContextClickHandler;
ingo@4: import com.smartgwt.client.widgets.layout.VLayout;
ingo@220: import com.smartgwt.client.widgets.menu.Menu;
ingo@220: import com.smartgwt.client.widgets.menu.MenuItem;
ingo@220: import com.smartgwt.client.widgets.menu.events.MenuItemClickEvent;
ingo@220: import com.smartgwt.client.widgets.menu.events.ClickHandler;
raimund@79: import com.smartgwt.client.types.VerticalAlignment;
ingo@4:
ingo@4: import de.intevation.flys.client.shared.model.Collection;
ingo@4: import de.intevation.flys.client.shared.model.CollectionRecord;
ingo@97: import de.intevation.flys.client.shared.model.User;
ingo@4:
ingo@97: import de.intevation.flys.client.client.Config;
ingo@211: import de.intevation.flys.client.client.FLYSConstants;
ingo@97: import de.intevation.flys.client.client.event.CollectionChangeEvent;
ingo@97: import de.intevation.flys.client.client.event.CollectionChangeHandler;
ingo@97: import de.intevation.flys.client.client.services.UserCollectionsService;
ingo@97: import de.intevation.flys.client.client.services.UserCollectionsServiceAsync;
ingo@4:
ingo@4:
ingo@4: /**
ingo@4: * The project list shows a list of projects of a specific user.
ingo@4: *
ingo@4: * @author Ingo Weinzierl
ingo@4: */
ingo@97: public class ProjectList
ingo@97: extends VLayout
ingo@97: implements CollectionChangeHandler
ingo@97: {
ingo@4: /** The interface that provides i18n messages. */
ingo@211: private FLYSConstants messages = GWT.create(FLYSConstants.class);
ingo@4:
ingo@97: /** The UserService used to retrieve information about the current user. */
ingo@97: protected UserCollectionsServiceAsync userCollectionsService =
ingo@97: GWT.create(UserCollectionsService.class);
ingo@97:
ingo@4: /** The user whose projects should be displayed.*/
ingo@4: protected User user;
ingo@4:
ingo@4: /** The grid that contains the project rows.*/
ingo@4: protected ListGrid grid;
ingo@4:
ingo@4: /**
ingo@4: * The default constructor that creates a new ProjectList for a specific
ingo@4: * user.
ingo@4: *
ingo@4: * @param user The user.
ingo@4: */
ingo@4: public ProjectList(User user) {
ingo@4: this.user = user;
ingo@4:
ingo@4: grid = new CollectionGrid();
ingo@4: initGrid();
ingo@97: init();
ingo@4:
ingo@97: updateUserCollections();
ingo@4: }
ingo@4:
ingo@4:
ingo@4: protected void initGrid() {
ingo@4: grid.setEmptyMessage(messages.no_projects());
ingo@4: grid.setLoadingDataMessage(messages.load_projects());
ingo@4: grid.setShowRecordComponents(true);
ingo@4: grid.setShowRecordComponentsByCell(true);
ingo@4: grid.setCanRemoveRecords(false);
ingo@4: grid.setShowHeader(false);
ingo@4: grid.setWidth100();
ingo@97: grid.setHeight100();
ingo@4:
ingo@4: ListGridField date = new ListGridField("date", "date");
ingo@4: ListGridField name = new ListGridField("name", "name");
ingo@4:
ingo@97: date.setWidth(100);
ingo@97: name.setWidth(195);
ingo@4:
ingo@97: grid.setFields(date, name);
ingo@220:
ingo@220: grid.addRowContextClickHandler(new RowContextClickHandler() {
ingo@220: public void onRowContextClick(RowContextClickEvent event) {
ingo@220: CollectionRecord record = (CollectionRecord) event.getRecord();
ingo@220:
ingo@220: Menu menu = createContextMenu(record);
ingo@220: grid.setContextMenu(menu);
ingo@220: menu.showContextMenu();
ingo@220:
ingo@220: event.cancel();
ingo@220: }
ingo@220: });
ingo@220: }
ingo@220:
ingo@220:
ingo@220: /**
ingo@220: * Creates a new context menu that interacts with a CollectionRecord.
ingo@220: *
ingo@220: * @param record The selected record.
ingo@220: *
ingo@220: * @return the context menu with operations that interact with
ingo@220: * record.
ingo@220: */
ingo@220: protected Menu createContextMenu(final CollectionRecord record) {
ingo@220: Menu menu = new Menu();
ingo@220:
ingo@220: MenuItem open = new MenuItem(messages.open_project());
ingo@220: open.addClickHandler(new ClickHandler() {
ingo@220: public void onClick(MenuItemClickEvent evt) {
ingo@220: SC.say("Open project: " + record.getName());
ingo@220: }
ingo@220: });
ingo@220:
ingo@220: MenuItem del = new MenuItem(messages.delete_project());
ingo@220: del.addClickHandler(new ClickHandler() {
ingo@220: public void onClick(MenuItemClickEvent evt) {
ingo@220: SC.warn("Removing projects is not implemented.");
ingo@220: }
ingo@220: });
ingo@220:
ingo@220: menu.addItem(open);
ingo@220: menu.addItem(del);
ingo@220:
ingo@220: return menu;
ingo@4: }
ingo@4:
ingo@4:
ingo@4: /**
ingo@4: * The init() method handles the layout stuff for this widget.
ingo@4: */
ingo@4: protected void init() {
ingo@4: setWidth(300);
ingo@4: setHeight100();
ingo@4: setShowResizeBar(true);
ingo@4: setShowEdges(false);
ingo@4: setLayoutMargin(0);
raimund@79: setLayoutAlign(VerticalAlignment.TOP);
ingo@4:
ingo@4: Label title = new Label(messages.projects());
ingo@4: title.setHeight("20");
ingo@4: title.setMargin(5);
ingo@4: title.setWidth100();
raimund@79: title.setStyleName("fontLightSmall");
ingo@4:
ingo@4: Canvas titleWrapper = new Canvas();
raimund@79: titleWrapper.setStyleName("bgBlueDark");
ingo@4: titleWrapper.setWidth100();
raimund@79: titleWrapper.setHeight("20px");
ingo@4: titleWrapper.addChild(title);
ingo@4:
ingo@4: Canvas gridWrapper = new Canvas();
ingo@4: gridWrapper.setPadding(0);
ingo@4: titleWrapper.setWidth100();
ingo@4: gridWrapper.addChild(grid);
ingo@4:
ingo@4: addMember(titleWrapper);
ingo@4: addMember(gridWrapper);
ingo@4: }
ingo@97:
ingo@97:
ingo@97: public void onCollectionChange(CollectionChangeEvent event) {
ingo@97: GWT.log("ProjectList.onCollectionChange");
ingo@97:
ingo@97: updateUserCollections();
ingo@97: }
ingo@97:
ingo@97:
ingo@97: protected void updateUserCollections() {
ingo@97: Config config = Config.getInstance();
ingo@97: String url = config.getServerUrl();
ingo@97:
ingo@97: userCollectionsService.getUserCollections(url, user.identifier(),
ingo@97: new AsyncCallback() {
ingo@97: public void onFailure(Throwable caught) {
ingo@97: GWT.log("Could not recieve a list of user collections.");
ingo@97: GWT.log(caught.getMessage());
ingo@97: }
ingo@97:
ingo@97: public void onSuccess(Collection[] collections) {
ingo@97: int num = collections != null ? collections.length : 0;
ingo@97:
ingo@97: GWT.log("Received " + num + " user collections.");
ingo@97:
ingo@97: if (num == 0) {
ingo@97: return;
ingo@97: }
ingo@97:
ingo@97: updateGrid(collections);
ingo@97: }
ingo@97: }
ingo@97: );
ingo@97: }
ingo@97:
ingo@97:
ingo@97: protected void clearGrid() {
ingo@97: ListGridRecord[] records = grid.getRecords();
ingo@97:
ingo@97: for (ListGridRecord record: records) {
ingo@97: grid.removeData(record);
ingo@97: }
ingo@97: }
ingo@97:
ingo@97:
ingo@97: protected void updateGrid(Collection[] collections) {
ingo@97: clearGrid();
ingo@97:
ingo@97: for (Collection c: collections) {
ingo@97: grid.addData(new CollectionRecord(c));
ingo@97: }
ingo@97: }
ingo@4: }
ingo@4: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :