/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* 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.workbench.screens.guided.dtable.client.editor.menu;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.enterprise.context.Dependent;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import org.drools.workbench.screens.guided.dtable.client.resources.i18n.GuidedDecisionTableErraiConstants;
import org.drools.workbench.screens.guided.dtable.client.widget.table.GuidedDecisionTableModellerView;
import org.drools.workbench.screens.guided.dtable.client.widget.table.events.cdi.DecisionTableSelectedEvent;
import org.drools.workbench.screens.guided.dtable.client.widget.table.events.cdi.DecisionTableSelectionsChangedEvent;
import org.jboss.errai.ui.client.local.spi.TranslationService;
import org.uberfire.ext.widgets.common.client.menu.MenuItemFactory;
import org.uberfire.ext.widgets.common.client.menu.MenuItemFactory.MenuItemViewHolder;
import org.uberfire.ext.widgets.common.client.menu.MenuItemWithIconView;
import org.uberfire.ext.wires.core.grids.client.model.GridData;
import org.uberfire.workbench.model.menu.MenuFactory;
import org.uberfire.workbench.model.menu.MenuItem;
@Dependent
public class InsertMenuBuilder extends BaseMenu implements MenuFactory.CustomMenuBuilder {
public interface SupportsAppendRow {
void onAppendRow();
}
public interface SupportsInsertRowAbove {
void onInsertRowAbove();
}
public interface SupportsInsertRowBelow {
void onInsertRowBelow();
}
public interface SupportsInsertColumn {
void onInsertColumn();
}
private TranslationService ts;
private MenuItemFactory menuItemFactory;
private GuidedDecisionTableModellerView.Presenter modeller;
MenuItemViewHolder<MenuItemWithIconView> miAppendRow;
MenuItemViewHolder<MenuItemWithIconView> miInsertRowAbove;
MenuItemViewHolder<MenuItemWithIconView> miInsertRowBelow;
MenuItemViewHolder<MenuItemWithIconView> miInsertColumn;
@Inject
public InsertMenuBuilder(final TranslationService ts,
final MenuItemFactory menuItemFactory) {
this.ts = ts;
this.menuItemFactory = menuItemFactory;
}
@PostConstruct
public void setup() {
miAppendRow = menuItemFactory.makeMenuItemWithIcon(ts.getTranslation(GuidedDecisionTableErraiConstants.InsertMenu_appendRow),
this::onAppendRow);
miInsertRowAbove = menuItemFactory.makeMenuItemWithIcon(ts.getTranslation(GuidedDecisionTableErraiConstants.InsertMenu_insertRowAbove),
this::onInsertRowAbove);
miInsertRowBelow = menuItemFactory.makeMenuItemWithIcon(ts.getTranslation(GuidedDecisionTableErraiConstants.InsertMenu_insertRowBelow),
this::onInsertRowBelow);
miInsertColumn = menuItemFactory.makeMenuItemWithIcon(ts.getTranslation(GuidedDecisionTableErraiConstants.InsertMenu_insertColumn),
this::onAppendColumn);
}
public void setModeller(final GuidedDecisionTableModellerView.Presenter modeller) {
this.modeller = modeller;
}
@Override
public void push(final MenuFactory.CustomMenuBuilder element) {
}
@Override
public MenuItem build() {
return MenuFactory.newTopLevelMenu(ts.getTranslation(GuidedDecisionTableErraiConstants.InsertMenu_title))
.withItems(getEditMenuItems())
.endMenu()
.build()
.getItems()
.get(0);
}
List<MenuItem> getEditMenuItems() {
final ArrayList<MenuItem> menuItems = new ArrayList<>();
menuItems.add(miAppendRow.getMenuItem());
menuItems.add(miInsertRowAbove.getMenuItem());
menuItems.add(miInsertRowBelow.getMenuItem());
menuItems.add(miInsertColumn.getMenuItem());
return menuItems;
}
@Override
public void onDecisionTableSelectedEvent(final @Observes DecisionTableSelectedEvent event) {
super.onDecisionTableSelectedEvent(event);
}
@Override
public void onDecisionTableSelectionsChangedEvent(final @Observes DecisionTableSelectionsChangedEvent event) {
super.onDecisionTableSelectionsChangedEvent(event);
}
@Override
public void initialise() {
if (activeDecisionTable == null || !activeDecisionTable.getAccess().isEditable()) {
enableMenuItemsForAppending(false);
enableMenuItemsForInsertingRows(false);
return;
}
final List<GridData.SelectedCell> selections = activeDecisionTable.getView().getModel().getSelectedCells();
if (selections == null || selections.isEmpty()) {
enableMenuItemsForAppending(true);
enableMenuItemsForInsertingRows(false);
return;
}
final Map<Integer, Boolean> rowUsage = new HashMap<>();
for (GridData.SelectedCell sc : selections) {
rowUsage.put(sc.getRowIndex(),
true);
}
enableMenuItemsForAppending(true);
enableMenuItemsForInsertingRows(rowUsage.keySet().size() == 1);
}
void onAppendRow() {
if (activeDecisionTable != null) {
activeDecisionTable.onAppendRow();
}
}
void onInsertRowAbove() {
if (activeDecisionTable != null) {
activeDecisionTable.onInsertRowAbove();
}
}
void onInsertRowBelow() {
if (activeDecisionTable != null) {
activeDecisionTable.onInsertRowBelow();
}
}
void onAppendColumn() {
if (modeller != null) {
modeller.onInsertColumn();
}
}
private void enableMenuItemsForAppending(final boolean enabled) {
miAppendRow.getMenuItem().setEnabled(enabled);
miInsertColumn.getMenuItem().setEnabled(enabled);
}
private void enableMenuItemsForInsertingRows(final boolean enabled) {
miInsertRowAbove.getMenuItem().setEnabled(enabled);
miInsertRowBelow.getMenuItem().setEnabled(enabled);
}
}