Java tutorial
/* * Copyright 2011 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package org.drools.guvnor.client.widgets.tables; import com.google.gwt.cell.client.ButtonCell; import com.google.gwt.cell.client.FieldUpdater; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.cellview.client.CellTable; import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.cellview.client.TextColumn; import com.google.gwt.user.cellview.client.TextHeader; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.view.client.AsyncDataProvider; import com.google.gwt.view.client.MultiSelectionModel; import com.google.gwt.view.client.ProvidesKey; import org.drools.guvnor.client.asseteditor.MultiViewRow; import org.drools.guvnor.client.common.GenericCallback; import org.drools.guvnor.client.explorer.AssetEditorPlace; import org.drools.guvnor.client.explorer.ClientFactory; import org.drools.guvnor.client.explorer.MultiAssetPlace; import org.drools.guvnor.client.messages.ConstantsCore; import org.drools.guvnor.client.rpc.AbstractAssetPageRow; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * Widget that shows rows of paged data where columns "uuid", "name" and * "format" are common. A "checkbox" and "open" button column are added by * default. Additional columns can be inserted inbetween these columns by * overriding <code>addAncillaryColumns()</code>. A "RSS Feed" button can also * be included if required. * <p/> * Based upon work by Geoffrey de Smet. */ public abstract class AbstractAssetPagedTable<T extends AbstractAssetPageRow> extends AbstractPagedTable<T> { // UI @SuppressWarnings("rawtypes") interface AssetPagedTableBinder extends UiBinder<Widget, AbstractAssetPagedTable> { } protected static final ConstantsCore constants = GWT.create(ConstantsCore.class); private static AssetPagedTableBinder uiBinder = GWT.create(AssetPagedTableBinder.class); @UiField() protected Image feedImage; protected Set<Command> unloadListenerSet = new HashSet<Command>(); protected MultiSelectionModel<T> selectionModel; protected String feedURL; private final ClientFactory clientFactory; public AbstractAssetPagedTable(int pageSize, ClientFactory clientFactory) { this(pageSize, null, clientFactory); } public AbstractAssetPagedTable(int pageSize, String feedURL, ClientFactory clientFactory) { super(pageSize); this.feedURL = feedURL; if (this.feedURL == null || "".equals(feedURL)) { this.feedImage.setVisible(false); } this.clientFactory = clientFactory; } /** * Register an UnloadListener used to remove "RSS Feed Listeners" when the * table is unloaded * * @param unloadListener */ public void addUnloadListener(Command unloadListener) { unloadListenerSet.add(unloadListener); } /** * Return an array of selected UUIDs. API is maintained for backwards * compatibility of legacy code with AssetItemGrid's implementation * * @return */ public String[] getSelectedRowUUIDs() { Set<T> selectedRows = selectionModel.getSelectedSet(); // Compatibility with existing API if (selectedRows.size() == 0) { return null; } // Create the array of UUIDs String[] uuids = new String[selectedRows.size()]; int rowCount = 0; for (T row : selectedRows) { uuids[rowCount++] = row.getUuid(); } return uuids; } @UiHandler("archiveSelectedButton") public void archiveSelectedAssets(ClickEvent e) { if (getSelectedRowUUIDs() == null) { Window.alert(constants.PleaseSelectAnItemToArchive()); return; } if (!Window.confirm(constants.AreYouSureYouWantToArchiveTheseItems())) { return; } assetService.archiveAssets(getSelectedRowUUIDs(), true, new GenericCallback<Void>() { public void onSuccess(Void arg0) { Window.alert(constants.ArchivedAssets()); refresh(); } }); } /** * Open selected item(s) to a single tab * * @param e */ @UiHandler("openSelectedToSingleTabButton") public void openSelectedToSingleTab(ClickEvent e) { Set<T> selectedSet = selectionModel.getSelectedSet(); List<MultiViewRow> multiViewRowList = new ArrayList<MultiViewRow>(selectedSet.size()); for (T selected : selectedSet) { multiViewRowList.add(new MultiViewRow(selected.getUuid(), selected.getName(), selected.getFormat())); } clientFactory.getPlaceController().goTo(new MultiAssetPlace(multiViewRowList)); } /** * Refresh table programmatically */ public void refresh() { selectionModel.clear(); cellTable.setVisibleRangeAndClearData(cellTable.getVisibleRange(), true); } /** * Set up table and common columns. Additional columns can be appended * between the "checkbox" and "open" columns by overriding * <code>addAncillaryColumns()</code> */ @Override protected void doCellTable() { ProvidesKey<T> providesKey = new ProvidesKey<T>() { public Object getKey(T row) { return row.getUuid(); } }; cellTable = new CellTable<T>(providesKey); selectionModel = new MultiSelectionModel<T>(providesKey); cellTable.setSelectionModel(selectionModel); SelectionColumn.createAndAddSelectionColumn(cellTable); ColumnPicker<T> columnPicker = new ColumnPicker<T>(cellTable); SortableHeaderGroup<T> sortableHeaderGroup = new SortableHeaderGroup<T>(cellTable); final TextColumn<T> uuidNumberColumn = new TextColumn<T>() { public String getValue(T row) { return row.getUuid(); } }; columnPicker.addColumn(uuidNumberColumn, new SortableHeader<T, String>(sortableHeaderGroup, constants.uuid(), uuidNumberColumn), false); // Add any additional columns addAncillaryColumns(columnPicker, sortableHeaderGroup); // Add "Open" button column Column<T, String> openColumn = new Column<T, String>(new ButtonCell()) { public String getValue(T row) { return constants.Open(); } }; openColumn.setFieldUpdater(new FieldUpdater<T, String>() { public void update(int index, T row, String value) { clientFactory.getPlaceController().goTo(new AssetEditorPlace(row.getUuid())); } }); columnPicker.addColumn(openColumn, new TextHeader(constants.Open()), true); cellTable.setWidth("100%"); columnPickerButton = columnPicker.createToggleButton(); } /** * Disconnect all listening consumers */ @Override protected void onUnload() { super.onUnload(); for (Command unloadListener : unloadListenerSet) { unloadListener.execute(); } } /** * Link a data provider to the table * * @param dataProvider */ public void setDataProvider(AsyncDataProvider<T> dataProvider) { this.dataProvider = dataProvider; this.dataProvider.addDataDisplay(cellTable); } /** * Construct a widget representing the table */ @Override protected Widget makeWidget() { return uiBinder.createAndBindUi(this); } @UiHandler("feedImage") void openFeed(ClickEvent e) { if (!feedImage.isVisible() || feedURL == null || "".equals(feedURL)) { return; } Window.open(feedURL, "_blank", null); } /** * Open selected item(s) to separate tabs * * @param e */ @UiHandler("openSelectedButton") void openSelected(ClickEvent e) { Set<T> selectedSet = selectionModel.getSelectedSet(); for (T selected : selectedSet) { clientFactory.getPlaceController().goTo(new AssetEditorPlace(selected.getUuid())); } } /** * Refresh table in response to ClickEvent * * @param e */ @UiHandler("refreshButton") void refresh(ClickEvent e) { refresh(); } }