/* * This is part of Geomajas, a GIS framework, http://www.geomajas.org/. * * Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium. * * The program is available in open source according to the GNU Affero * General Public License. All contributions in this program are covered * by the Geomajas Contributors License Agreement. For full licensing * details, see LICENSE.txt in the project root. */ package org.geomajas.widget.layer.client.view; import com.google.gwt.core.client.GWT; import com.smartgwt.client.types.Alignment; import com.smartgwt.client.types.DragDataAction; import com.smartgwt.client.types.ListGridEditEvent; import com.smartgwt.client.types.ListGridFieldType; import com.smartgwt.client.types.SelectionStyle; import com.smartgwt.client.widgets.events.DropCompleteEvent; import com.smartgwt.client.widgets.events.DropCompleteHandler; 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.CellClickEvent; import com.smartgwt.client.widgets.grid.events.CellClickHandler; import org.geomajas.gwt.client.map.layer.Layer; import org.geomajas.gwt.client.util.WidgetLayout; import org.geomajas.widget.layer.client.i18n.LayerMessages; import org.geomajas.widget.layer.client.presenter.LayerListPresenter; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; /** * A grid that displays a list of layers. * This default implementation has two columns: visibility and layer name. * * @author Jan Venstermans * */ public class LayerListGrid extends ListGrid implements LayerListPresenter.View { protected static final LayerMessages MESSAGES = GWT.create(LayerMessages.class); private LayerListPresenter.Handler handler; public static final String FLD_VISIBILITY = "fldVisibility"; private static final int FLD_VISIBILITY_WIDTH = 50; public static final String FLD_LABEL = "fldLabel"; private static final int FLD_LABEL_WIDTH = 200; public static final String FLD_OBJECT = "object"; public LayerListGrid() { super(); /*grid config*/ setEditEvent(ListGridEditEvent.CLICK); setEditByCell(true); setAllowFilterExpressions(false); setCanSort(false); setCanMultiSort(false); setWidth100(); setHeight100(); setAlternateRecordStyles(true); setSelectionType(SelectionStyle.SINGLE); setShowRollOverCanvas(true); setShowAllRecords(true); setShowRecordComponents(true); setShowRecordComponentsByCell(true); setShowHeader(false); setDragDataAction(DragDataAction.MOVE); setCanDragRecordsOut(false); /*columns*/ List<ListGridField> fields = createAndGetListGridFields(); setFields(fields.toArray(new ListGridField[fields.size()])); } /** * Extensible method to create a list of {@link com.smartgwt.client.widgets.grid.ListGridField} objects. * The order in which the fields are provided will be the order of the columns. * * @return */ protected List<ListGridField> createAndGetListGridFields() { List<ListGridField> fields = new ArrayList<ListGridField>(); ListGridField labelFld = new ListGridField(FLD_LABEL, MESSAGES.layerListGridColumnLayerName(), FLD_LABEL_WIDTH); ListGridField visibilityFld = new ListGridField(FLD_VISIBILITY, MESSAGES.layerListGridColumnVisibilityName(), FLD_VISIBILITY_WIDTH); visibilityFld.setType(ListGridFieldType.IMAGE); visibilityFld.setAlign(Alignment.CENTER); addCellClickHandler(new CellClickHandler() { @Override public void onCellClick(CellClickEvent cellClickEvent) { if (cellClickEvent.getColNum() == getFieldNum(FLD_VISIBILITY)) { handler.onToggleVisibility((Layer) cellClickEvent.getRecord().getAttributeAsObject(FLD_OBJECT)); } } }); fields.add(visibilityFld); fields.add(labelFld); return fields; } public void fillGrid(List<Layer<?>> layers) { deselectAllRecords(); setData(new ListGridRecord[]{}); ListIterator layersIterator = layers.listIterator(layers.size()); // fill while (layersIterator.hasPrevious()) { addRow((Layer) layersIterator.previous()); } } public void addRow(Layer layer) { addData(createAndFillListGridRecord(layer)); } /** * Extensible method to fill a {@link com.smartgwt.client.widgets.grid.ListGridRecord} * based on the Layer information. * * @param layer * @return */ protected ListGridRecord createAndFillListGridRecord(Layer layer) { ListGridRecord record = new ListGridRecord(); record.setAttribute(FLD_LABEL, layer.getLayerInfo().getLabel()); record.setAttribute(FLD_VISIBILITY, layer.isShowing() ? WidgetLayout.iconLayerShow : WidgetLayout.iconLayerHide); record.setAttribute(FLD_OBJECT, layer); return record; } @Override public void setDragDropEnabled(boolean dragDropEnabled) { /* drag drop*/ setCanAcceptDroppedRecords(dragDropEnabled); setCanReorderRecords(dragDropEnabled); addDropCompleteHandler(new DropCompleteHandler() { @Override public void onDropComplete(DropCompleteEvent dropCompleteEvent) { if (dropCompleteEvent.getTransferredRecords().length == 1) { ListGridRecord record = (ListGridRecord) dropCompleteEvent.getTransferredRecords()[0]; int index = getRecordIndex(record); if (index >= 0) { // for some reason dropComplete is done twice, second time index = -1 Layer layer = (Layer) record.getAttributeAsObject(FLD_OBJECT); int recordsAmount = getTotalRows(); // return the index of the rendered list, not the inverse list as presented in the view handler.onMoveLayer(layer, recordsAmount - 1 - index); } } } }); } @Override public void setHandler(LayerListPresenter.Handler handler) { this.handler = handler; } @Override public void updateView(List<Layer<?>> layers) { fillGrid(layers); } @Override public ListGrid getWidget() { return this; } }