ingo@4: package de.intevation.flys.client.client.ui; ingo@4: ingo@226: import java.util.Date; ingo@226: ingo@4: import com.google.gwt.core.client.GWT; ingo@226: import com.google.gwt.i18n.client.DateTimeFormat; ingo@97: import com.google.gwt.user.client.rpc.AsyncCallback; ingo@4: ingo@226: import com.smartgwt.client.types.Alignment; ingo@226: import com.smartgwt.client.types.ListGridFieldType; ingo@226: import com.smartgwt.client.types.SortDirection; 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@226: import com.smartgwt.client.widgets.grid.CellFormatter; 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@225: import de.intevation.flys.client.client.FLYS; 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@225: /** A pointer to the FLYS instance.*/ ingo@225: protected FLYS flys; ingo@225: 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@225: public ProjectList(FLYS flys, User user) { ingo@225: this.flys = flys; ingo@4: this.user = user; ingo@4: ingo@226: grid = new ListGrid(); 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@226: grid.setSortDirection(SortDirection.DESCENDING); ingo@226: grid.setSortField(0); ingo@4: ingo@226: ListGridField date = buildDateField(); ingo@226: ListGridField name = buildNameField(); 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@225: public FLYS getFlys() { ingo@225: return flys; ingo@225: } ingo@225: ingo@225: 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@225: getFlys().openProject(record.getCollection().identifier()); 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@229: String locale = config.getLocale(); ingo@97: ingo@229: userCollectionsService.getUserCollections(url, locale, 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@226: ingo@226: ingo@226: /** ingo@226: * Builds the field in the grid that displays the creation time of a ingo@226: * project. ingo@226: * ingo@226: * @return the grid field. ingo@226: */ ingo@226: protected ListGridField buildDateField() { ingo@226: ListGridField date = new ListGridField("creationTime", "creationTime"); ingo@226: date.setType(ListGridFieldType.DATE); ingo@226: ingo@226: date.setCellFormatter(new CellFormatter() { ingo@226: public String format(Object value, ListGridRecord rec, int r, int c) { ingo@226: if (value == null) { ingo@226: return null; ingo@226: } ingo@226: ingo@226: DateTimeFormat dtf = DateTimeFormat.getFormat( ingo@226: messages.datetime_format()); ingo@226: ingo@226: return dtf.format((Date)value); ingo@226: } ingo@226: }); ingo@226: ingo@226: date.setWidth(105); ingo@226: date.setAlign(Alignment.LEFT); ingo@226: ingo@226: return date; ingo@226: } ingo@226: ingo@226: ingo@226: /** ingo@226: * Builds the field in the grid that displays the name of a project. ingo@226: * ingo@226: * @return the grid field. ingo@226: */ ingo@226: protected ListGridField buildNameField() { ingo@226: ListGridField name = new ListGridField("name", "name"); ingo@226: name.setType(ListGridFieldType.TEXT); ingo@226: ingo@226: name.setCellFormatter(new CellFormatter() { ingo@226: public String format(Object value, ListGridRecord record, int row, int col) { ingo@226: String n = (String) value; ingo@226: int len = n.length(); ingo@226: int sec = len - 15; ingo@226: return n.substring(0, 14) + "..." + n.substring(sec, len-1); ingo@226: } ingo@226: }); ingo@226: ingo@226: name.setWidth(195); ingo@226: name.setAlign(Alignment.LEFT); ingo@226: ingo@226: return name; ingo@226: } ingo@4: } ingo@4: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :