/*
* Copyright 2015 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.plugin.client.editor;
import javax.annotation.PostConstruct;
import javax.enterprise.context.Dependent;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.core.client.GWT;
import com.google.gwt.editor.client.Editor;
import com.google.gwt.editor.client.SimpleBeanEditorDriver;
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.AbstractCellTable;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.DefaultSelectionEventManager;
import com.google.gwt.view.client.ProvidesKey;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.google.gwt.view.client.SingleSelectionModel;
import org.gwtbootstrap3.client.ui.Button;
import org.gwtbootstrap3.client.ui.FormGroup;
import org.gwtbootstrap3.client.ui.HelpBlock;
import org.gwtbootstrap3.client.ui.Label;
import org.gwtbootstrap3.client.ui.TextBox;
import org.gwtbootstrap3.client.ui.constants.ButtonSize;
import org.gwtbootstrap3.client.ui.constants.ButtonType;
import org.gwtbootstrap3.client.ui.constants.IconType;
import org.gwtbootstrap3.client.ui.constants.ValidationState;
import org.gwtbootstrap3.client.ui.gwt.ButtonCell;
import org.gwtbootstrap3.client.ui.gwt.CellTable;
import org.uberfire.ext.editor.commons.client.BaseEditorViewImpl;
import org.uberfire.ext.plugin.client.resources.i18n.CommonConstants;
import org.uberfire.ext.plugin.client.widget.cell.IconCell;
import org.uberfire.ext.plugin.model.DynamicMenuItem;
@Dependent
public class DynamicMenuEditorView
extends BaseEditorViewImpl
implements DynamicMenuEditorPresenter.View,
Editor<DynamicMenuItem> {
private static final ViewBinder uiBinder = GWT.create(ViewBinder.class);
private final Driver driver = GWT.create(Driver.class);
//SelectionModel works better with a KeyProvider
private final ProvidesKey<DynamicMenuItem> keyProvider = new ProvidesKey<DynamicMenuItem>() {
@Override
public Object getKey(final DynamicMenuItem item) {
return item.getActivityId() + item.getMenuLabel();
}
};
private final SingleSelectionModel<DynamicMenuItem> selectionModel = new SingleSelectionModel<DynamicMenuItem>(keyProvider);
@UiField
TextBox activityId;
@UiField
FormGroup activityIdControlGroup;
@UiField
@Ignore
HelpBlock activityIdHelpInline;
@UiField
TextBox menuLabel;
@UiField
FormGroup menuLabelControlGroup;
@UiField
@Ignore
HelpBlock menuLabelHelpInline;
@UiField(provided = true)
CellTable<DynamicMenuItem> menuItems = new CellTable<DynamicMenuItem>(500,
GWT.<CellTable.Resources>create(CellTable.Resources.class),
keyProvider,
null);
@UiField
Button okButton;
@UiField
Button cancelButton;
private DynamicMenuEditorPresenter presenter;
private DynamicMenuItem editedItem;
@PostConstruct
public void init() {
initWidget(uiBinder.createAndBindUi(this));
this.editedItem = null;
}
@Override
public void init(final DynamicMenuEditorPresenter presenter) {
this.presenter = presenter;
driver.initialize(this);
setMenuItem(new DynamicMenuItem());
initTable(menuItems);
}
private void initTable(final AbstractCellTable<DynamicMenuItem> dynamicMenuTable) {
dynamicMenuTable.setEmptyTableWidget(new Label(CommonConstants.INSTANCE.MenusNoMenuItems()));
//We need to inform the SelectionModel that the ButtonCell (i.e. Delete) column is excluded from selecting a row
final DefaultSelectionEventManager<DynamicMenuItem> manager = DefaultSelectionEventManager.createBlacklistManager(4);
dynamicMenuTable.setSelectionModel(selectionModel,
manager);
//Furthermore we cannot have a KeyboardSelectionPolicy with a ButtonCell and a SelectionModel
dynamicMenuTable.setKeyboardSelectionPolicy(HasKeyboardSelectionPolicy.KeyboardSelectionPolicy.DISABLED);
{
final IconCell iCell = new IconCell(IconType.ARROW_UP);
iCell.setTooltip(CommonConstants.INSTANCE.MenusMoveUpHint());
final Column<DynamicMenuItem, String> iconColumn = new Column<DynamicMenuItem, String>(iCell) {
public String getValue(DynamicMenuItem object) {
return "";
}
};
iconColumn.setFieldUpdater(new FieldUpdater<DynamicMenuItem, String>() {
@Override
public void update(final int index,
final DynamicMenuItem object,
final String value) {
presenter.updateIndex(object,
index,
DynamicMenuEditorPresenter.UpdateIndexOperation.UP);
}
});
dynamicMenuTable.addColumn(iconColumn);
dynamicMenuTable.setColumnWidth(iconColumn,
"25px");
}
{
final IconCell iCell = new IconCell(IconType.ARROW_DOWN);
iCell.setTooltip(CommonConstants.INSTANCE.MenusMoveDownHint());
final Column<DynamicMenuItem, String> iconColumn = new Column<DynamicMenuItem, String>(iCell) {
public String getValue(DynamicMenuItem object) {
return "";
}
};
iconColumn.setFieldUpdater(new FieldUpdater<DynamicMenuItem, String>() {
@Override
public void update(final int index,
final DynamicMenuItem object,
final String value) {
presenter.updateIndex(object,
index,
DynamicMenuEditorPresenter.UpdateIndexOperation.DOWN);
}
});
dynamicMenuTable.addColumn(iconColumn);
dynamicMenuTable.setColumnWidth(iconColumn,
"25px");
}
{
final TextColumn<DynamicMenuItem> activityCol = new TextColumn<DynamicMenuItem>() {
@Override
public String getValue(DynamicMenuItem object) {
return String.valueOf(object.getActivityId());
}
};
dynamicMenuTable.addColumn(activityCol,
CommonConstants.INSTANCE.MenusActivityID());
}
{
final TextColumn<DynamicMenuItem> labelCol = new TextColumn<DynamicMenuItem>() {
@Override
public String getValue(DynamicMenuItem object) {
return object.getMenuLabel();
}
};
dynamicMenuTable.addColumn(labelCol,
CommonConstants.INSTANCE.MenusLabel());
}
{
final ButtonCell buttonCell = new ButtonCell(IconType.REMOVE,
ButtonType.DANGER,
ButtonSize.EXTRA_SMALL);
final Column<DynamicMenuItem, String> buttonCol = new Column<DynamicMenuItem, String>(buttonCell) {
@Override
public String getValue(DynamicMenuItem object) {
return CommonConstants.INSTANCE.MenusDelete();
}
};
buttonCol.setFieldUpdater(new FieldUpdater<DynamicMenuItem, String>() {
@Override
public void update(final int index,
final DynamicMenuItem object,
final String value) {
if (selectionModel.isSelected(object)) {
selectionModel.clear();
}
presenter.removeObject(object);
}
});
dynamicMenuTable.addColumn(buttonCol);
dynamicMenuTable.setColumnWidth(buttonCol,
"80px");
}
selectionModel.addSelectionChangeHandler(new Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
//ListDataProvider raises this event with a null item when a item is removed
if (selectionModel.getSelectedObject() == null) {
editedItem = null;
setMenuItem(new DynamicMenuItem());
} else {
editedItem = selectionModel.getSelectedObject();
setMenuItem(new DynamicMenuItem(selectionModel.getSelectedObject().getActivityId(),
selectionModel.getSelectedObject().getMenuLabel()));
}
}
});
presenter.setDataDisplay(dynamicMenuTable);
}
@UiHandler("okButton")
public void onClick(ClickEvent e) {
DynamicMenuItem menuItem = driver.flush();
if (isMenuItemValid(menuItem)) {
if (editedItem != null) {
editedItem.setActivityId(menuItem.getActivityId());
editedItem.setMenuLabel(menuItem.getMenuLabel());
menuItem = editedItem;
}
presenter.addMenuItem(menuItem);
setMenuItem(new DynamicMenuItem());
selectionModel.clear();
}
}
@UiHandler("cancelButton")
public void onCancel(ClickEvent e) {
setMenuItem(new DynamicMenuItem());
selectionModel.clear();
}
private boolean isMenuItemValid(final DynamicMenuItem menuItem) {
boolean activityIdValidatorResult = presenter.getMenuItemActivityIdValidator().validateFieldInline(menuItem.getActivityId(),
activityIdControlGroup,
activityIdHelpInline);
boolean menuLabelValidatorResult = presenter.getMenuItemLabelValidator(menuItem,
editedItem).validateFieldInline(menuItem.getMenuLabel(),
menuLabelControlGroup,
menuLabelHelpInline);
return activityIdValidatorResult && menuLabelValidatorResult;
}
public void setMenuItem(final DynamicMenuItem menuItem) {
driver.edit(menuItem);
activityIdControlGroup.setValidationState(ValidationState.NONE);
activityIdHelpInline.setText("");
menuLabelControlGroup.setValidationState(ValidationState.NONE);
menuLabelHelpInline.setText("");
}
public String emptyActivityID() {
return CommonConstants.INSTANCE.EmptyActivityID();
}
public String invalidActivityID() {
return CommonConstants.INSTANCE.InvalidActivityID();
}
public String emptyMenuLabel() {
return CommonConstants.INSTANCE.EmptyMenuLabel();
}
public String invalidMenuLabel() {
return CommonConstants.INSTANCE.InvalidMenuLabel();
}
public String duplicatedMenuLabel() {
return CommonConstants.INSTANCE.DuplicatedMenuLabel();
}
interface ViewBinder
extends
UiBinder<Widget, DynamicMenuEditorView> {
}
interface Driver extends SimpleBeanEditorDriver<DynamicMenuItem, DynamicMenuEditorView> {
}
}