/* * Copyright 2016 JBoss, by Red Hat, 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.uberfire.ext.widgets.table.client; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.logical.shared.CloseEvent; import com.google.gwt.event.logical.shared.CloseHandler; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.VerticalPanel; import org.gwtbootstrap3.client.ui.Button; import org.gwtbootstrap3.client.ui.CheckBox; import org.gwtbootstrap3.client.ui.constants.IconType; import org.gwtbootstrap3.client.ui.constants.Toggle; import org.gwtbootstrap3.client.ui.gwt.DataGrid; import org.uberfire.ext.widgets.table.client.resources.UFTableResources; import org.uberfire.ext.widgets.table.client.resources.i18n.CommonConstants; public class UberfireColumnPicker<T> { protected final DataGrid<T> dataGrid; protected final List<ColumnMeta<T>> columnMetaList = new ArrayList<>(); protected final PopupPanel popup = GWT.create(PopupPanel.class); protected List<ColumnChangedHandler> columnChangedHandler = new ArrayList<>(); public UberfireColumnPicker(DataGrid<T> dataGrid) { this.dataGrid = dataGrid; setupPopup(); } private void setupPopup() { popup.setAutoHideEnabled(true); popup.setAutoHideOnHistoryEventsEnabled(true); } public void addColumnChangedHandler(ColumnChangedHandler handler) { columnChangedHandler.add(handler); } public Collection<ColumnMeta<T>> getColumnMetaList() { return columnMetaList; } protected String getColumnStoreName(ColumnMeta columnMeta) { if (columnMeta != null) { if (columnMeta.getColumn() != null) { String colStoreName = columnMeta.getColumn().getDataStoreName(); if (colStoreName != null && !colStoreName.isEmpty()) { return colStoreName; } } return columnMeta.getCaption(); } return ""; } public void columnMoved(final int visibleFromIndex, final int visibleBeforeIndex) { int visibleColumnFromIndex = 0; ColumnMeta<T> columnMetaToMove = null; for (int i = 0; i < columnMetaList.size(); i++) { final ColumnMeta<T> columnMeta = columnMetaList.get(i); if (columnMeta.isVisible()) { if (visibleFromIndex == visibleColumnFromIndex) { columnMetaToMove = columnMeta; break; } visibleColumnFromIndex++; } } if (columnMetaToMove == null) { return; } columnMetaList.remove(columnMetaToMove); boolean columnInserted = false; int visibleColumnBeforeIndex = 0; for (int i = 0; i < columnMetaList.size(); i++) { final ColumnMeta<T> columnMeta = columnMetaList.get(i); if (columnMeta.isVisible()) { if (visibleBeforeIndex == visibleColumnBeforeIndex) { columnMetaList.add(i, columnMetaToMove); columnInserted = true; break; } visibleColumnBeforeIndex++; } } if (!columnInserted) { columnMetaList.add(columnMetaToMove); } } protected int getVisibleColumnIndex(final ColumnMeta<T> columnMeta) { int index = 0; for (final ColumnMeta<T> cm : columnMetaList) { if (cm.equals(columnMeta)) { return index; } if (cm.isVisible()) { index++; } } return index; } public void addColumn(ColumnMeta<T> columnMeta) { if (columnMeta == null) { return; } if (!columnMetaList.contains(columnMeta)) { columnMetaList.add(columnMeta); } if (columnMeta.isVisible()) { dataGrid.addColumn(columnMeta.getColumn(), columnMeta.getHeader()); } } protected void sortAndAddColumns(List<ColumnMeta<T>> columnMetas) { // Sort based on preferences applied Collections.sort(columnMetas); //Add the columns based on the preferences for (ColumnMeta meta : columnMetas) { addColumn(meta); } } public void adjustColumnWidths() { for (ColumnChangedHandler handler : columnChangedHandler) { handler.afterColumnChanged(); } } public void addColumns(List<ColumnMeta<T>> columnMetas) { columnMetaList.addAll(columnMetas); sortAndAddColumns(columnMetas); adjustColumnWidths(); } public void removeColumn(ColumnMeta<T> columnMeta) { columnMetaList.remove(columnMeta); int count = dataGrid.getColumnCount(); for (int i = 0; i < count; i++) { dataGrid.removeColumn(0); } sortAndAddColumns(columnMetaList); adjustColumnWidths(); } protected void configureColorPickerPopup(int left, int top, VerticalPanel popupContent) { popup.setWidget(popupContent); popup.show(); int finalLeft = left - popup.getOffsetWidth(); popup.setPopupPosition(finalLeft, top); } protected boolean addThisColumnToPopup(ColumnMeta<T> columnMeta) { return (columnMeta.getHeader().getValue() instanceof String); } protected void addResetButtom(final int left, final int top, VerticalPanel popupContent) { //there is no reset buttom } protected void showColumnPickerPopup(final int left, final int top) { VerticalPanel popupContent = GWT.create(VerticalPanel.class); for (final ColumnMeta<T> columnMeta : columnMetaList) { if (addThisColumnToPopup(columnMeta)) { final CheckBox checkBox = GWT.create(CheckBox.class); checkBox.setText((String) columnMeta.getHeader().getValue()); checkBox.setValue(columnMeta.isVisible()); checkBox.addValueChangeHandler(new ValueChangeHandler<Boolean>() { public void onValueChange(ValueChangeEvent<Boolean> booleanValueChangeEvent) { boolean visible = booleanValueChangeEvent.getValue(); if (visible) { dataGrid.insertColumn(getVisibleColumnIndex(columnMeta), columnMeta.getColumn(), columnMeta.getHeader()); } else { dataGrid.removeColumn(columnMeta.getColumn()); } columnMeta.setVisible(visible); adjustColumnWidths(); } }); popupContent.add(checkBox); } } addResetButtom(left, top, popupContent); configureColorPickerPopup(left, top, popupContent); } public Button createToggleButton() { final Button button = GWT.create(Button.class); button.addStyleName(UFTableResources.INSTANCE.CSS().columnPickerButton()); button.setDataToggle(Toggle.BUTTON); button.setIcon(IconType.LIST_UL); button.setTitle(CommonConstants.INSTANCE.ColumnPickerButtonTooltip()); popup.addStyleName(UFTableResources.INSTANCE.CSS().columnPickerPopup()); popup.addAutoHidePartner(button.getElement()); popup.addCloseHandler(new CloseHandler<PopupPanel>() { public void onClose(CloseEvent<PopupPanel> popupPanelCloseEvent) { if (popupPanelCloseEvent.isAutoClosed()) { button.setActive(false); } } }); button.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { if (!button.isActive()) { showColumnPickerPopup(button.getAbsoluteLeft() + button.getOffsetWidth(), button.getAbsoluteTop() + button.getOffsetHeight()); } else { popup.hide(false); } } }); return button; } protected void resetTableColumns(int left, int top) { int count = dataGrid.getColumnCount(); for (int i = 0; i < count; i++) { dataGrid.removeColumn(0); } loadGlobalGridPreferences(); sortAndAddColumns(new ArrayList<ColumnMeta<T>>(columnMetaList)); adjustColumnWidths(); showColumnPickerPopup(left, top); } protected void loadGlobalGridPreferences() { } }