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@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@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 :