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.jbpm.formbuilder.client.effect.view; import java.util.ArrayList; import java.util.List; import org.jbpm.formapi.client.validation.FBValidationItem; import org.jbpm.formbuilder.client.FormBuilderGlobals; import org.jbpm.formbuilder.client.messages.I18NConstants; import org.jbpm.formbuilder.client.resources.FormBuilderResources; import com.google.gwt.dom.client.Style.Cursor; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.logical.shared.HasSelectionHandlers; import com.google.gwt.event.logical.shared.SelectionEvent; import com.google.gwt.event.logical.shared.SelectionHandler; import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.ui.Grid; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; public class ValidationTablePanel extends VerticalPanel implements HasSelectionHandlers<FBValidationItem> { private List<SelectionHandler<FBValidationItem>> tableHandlers = new ArrayList<SelectionHandler<FBValidationItem>>(); private final I18NConstants i18n = FormBuilderGlobals.getInstance().getI18n(); private final Grid validationsTable = new Grid(1, 4); private final List<FBValidationItem> currentValidations = new ArrayList<FBValidationItem>(); private FBValidationItem selectedValidation = null; public ValidationTablePanel() { validationsTable.setWidget(0, 0, new HTML("<strong>" + i18n.CurrentValidations() + "</strong>")); validationsTable.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { for (Widget widget : validationsTable) { widget.removeStyleName("selectedValidationRow"); } int row = getSelectedRow(event); if (row > 0) { Widget selectedWidget = validationsTable.getWidget(row, 0); if (selectedWidget.getStyleName().contains("selectedValidationRow")) { selectedWidget.removeStyleName("selectedValidationRow"); setCurrentValidation(null); fireSelectedValidation(); } else { selectedWidget.addStyleName("selectedValidationRow"); setCurrentValidation(currentValidations.get(row - 1)); fireSelectedValidation(); } } } }); add(validationsTable); } public void setCurrentValidation(FBValidationItem validation) { this.selectedValidation = validation; } @Override public HandlerRegistration addSelectionHandler(final SelectionHandler<FBValidationItem> handler) { HandlerRegistration handlerRegistration = new HandlerRegistration() { @Override public void removeHandler() { if (tableHandlers.contains(handler)) { tableHandlers.remove(handler); } } }; if (!tableHandlers.contains(handler)) { tableHandlers.add(handler); } return handlerRegistration; } @Override @SuppressWarnings("unchecked") public void fireEvent(GwtEvent<?> event) { for (SelectionHandler<FBValidationItem> handler : tableHandlers) { handler.onSelection((SelectionEvent<FBValidationItem>) event); } } protected void fireSelectedValidation() { SelectionEvent.fire(this, this.selectedValidation); } public void addValidation(final FBValidationItem validation) { if (!currentValidations.contains(validation)) { int rowCount = validationsTable.getRowCount(); validationsTable.resizeRows(rowCount + 1); validationsTable.setWidget(rowCount, 0, new Label(validation.getName())); final Image upLink = new Image(FormBuilderResources.INSTANCE.arrowUp()); upLink.getElement().getStyle().setCursor(Cursor.POINTER); final Image downLink = new Image(FormBuilderResources.INSTANCE.arrowDown()); downLink.getElement().getStyle().setCursor(Cursor.POINTER); final Image removeLink = new Image(FormBuilderResources.INSTANCE.removeSmallIcon()); removeLink.getElement().getStyle().setCursor(Cursor.POINTER); removeLink.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { int row = currentValidations.indexOf(validation) + 1; removeValidation(validation, row); } }); upLink.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { moveSelectedValidation(true); downLink.setVisible(currentValidations.indexOf(validation) > 0); upLink.setVisible(currentValidations.indexOf(validation) < currentValidations.size()); } }); downLink.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { moveSelectedValidation(false); downLink.setVisible(currentValidations.indexOf(validation) > 0); upLink.setVisible(currentValidations.indexOf(validation) < currentValidations.size()); } }); validationsTable.setWidget(rowCount, 1, upLink); validationsTable.setWidget(rowCount, 2, downLink); validationsTable.setWidget(rowCount, 3, removeLink); currentValidations.add(validation); if (!isVisible()) { setVisible(true); } } } public int getSelectedRow(ClickEvent event) { return validationsTable.getCellForEvent(event).getRowIndex(); } public void removeValidation(FBValidationItem validation, int row) { if (row >= 0) { currentValidations.remove(validation); validationsTable.removeRow(row); } } public void moveSelectedValidation(boolean up) { int index = currentValidations.indexOf(selectedValidation); if (index >= 0) { if (up && index + 1 < currentValidations.size()) { FBValidationItem supValidation = currentValidations.get(index + 1); currentValidations.set(index + 1, selectedValidation); currentValidations.set(index, supValidation); } else if (!up && index - 1 > 0) { FBValidationItem subValidation = currentValidations.get(index - 1); currentValidations.set(index - 1, selectedValidation); currentValidations.set(index, subValidation); } moveValidationOnTable(index, up); } } private void moveValidationOnTable(int index, boolean up) { if (up && index + 2 < validationsTable.getRowCount()) { for (int i = 0; i < validationsTable.getColumnCount(); i++) { Widget move = validationsTable.getWidget(index + 1, i); Widget res = validationsTable.getWidget(index + 2, i); validationsTable.remove(move); validationsTable.remove(res); validationsTable.setWidget(index + 1, i, res); validationsTable.setWidget(index + 2, i, move); } } else if (!up && index > 0) { for (int i = 0; i < validationsTable.getColumnCount(); i++) { Widget move = validationsTable.getWidget(index + 1, i); Widget res = validationsTable.getWidget(index, i); validationsTable.remove(move); validationsTable.remove(res); validationsTable.setWidget(index + 1, i, res); validationsTable.setWidget(index, i, move); } } } public List<FBValidationItem> getCurrentValidations() { return currentValidations; } }