/*
* Copyright 2015 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.widget.table;
import java.util.Set;
import javax.enterprise.event.Event;
import com.ait.lienzo.client.core.event.INodeXYEvent;
import com.ait.lienzo.client.core.shape.BoundingBoxPathClipper;
import com.ait.lienzo.client.core.shape.Group;
import com.ait.lienzo.client.core.shape.IPathClipper;
import com.ait.lienzo.client.core.shape.MultiPath;
import com.ait.lienzo.client.core.shape.Rectangle;
import com.ait.lienzo.client.core.shape.Text;
import com.ait.lienzo.client.core.types.BoundingBox;
import com.ait.lienzo.client.core.types.Point2D;
import com.google.gwt.event.shared.EventBus;
import org.drools.workbench.models.datamodel.workitems.PortableWorkDefinition;
import org.drools.workbench.models.guided.dtable.shared.model.ActionCol52;
import org.drools.workbench.models.guided.dtable.shared.model.ActionInsertFactCol52;
import org.drools.workbench.models.guided.dtable.shared.model.ActionRetractFactCol52;
import org.drools.workbench.models.guided.dtable.shared.model.ActionSetFieldCol52;
import org.drools.workbench.models.guided.dtable.shared.model.ActionWorkItemCol52;
import org.drools.workbench.models.guided.dtable.shared.model.ActionWorkItemInsertFactCol52;
import org.drools.workbench.models.guided.dtable.shared.model.ActionWorkItemSetFieldCol52;
import org.drools.workbench.models.guided.dtable.shared.model.BRLActionColumn;
import org.drools.workbench.models.guided.dtable.shared.model.BRLConditionColumn;
import org.drools.workbench.models.guided.dtable.shared.model.ConditionCol52;
import org.drools.workbench.models.guided.dtable.shared.model.DTCellValue52;
import org.drools.workbench.models.guided.dtable.shared.model.GuidedDecisionTable52;
import org.drools.workbench.models.guided.dtable.shared.model.LimitedEntryActionInsertFactCol52;
import org.drools.workbench.models.guided.dtable.shared.model.LimitedEntryActionRetractFactCol52;
import org.drools.workbench.models.guided.dtable.shared.model.LimitedEntryActionSetFieldCol52;
import org.drools.workbench.models.guided.dtable.shared.model.LimitedEntryBRLActionColumn;
import org.drools.workbench.models.guided.dtable.shared.model.LimitedEntryBRLConditionColumn;
import org.drools.workbench.models.guided.dtable.shared.model.LimitedEntryConditionCol52;
import org.drools.workbench.models.guided.dtable.shared.model.Pattern52;
import org.drools.workbench.screens.guided.dtable.client.resources.i18n.GuidedDecisionTableConstants;
import org.drools.workbench.screens.guided.dtable.client.widget.ActionColumnCommand;
import org.drools.workbench.screens.guided.dtable.client.widget.ActionInsertFactPopup;
import org.drools.workbench.screens.guided.dtable.client.widget.ActionRetractFactPopup;
import org.drools.workbench.screens.guided.dtable.client.widget.ActionSetFieldPopup;
import org.drools.workbench.screens.guided.dtable.client.widget.ActionWorkItemInsertFactPopup;
import org.drools.workbench.screens.guided.dtable.client.widget.ActionWorkItemPopup;
import org.drools.workbench.screens.guided.dtable.client.widget.ActionWorkItemSetFieldPopup;
import org.drools.workbench.screens.guided.dtable.client.widget.BRLActionColumnViewImpl;
import org.drools.workbench.screens.guided.dtable.client.widget.BRLConditionColumnViewImpl;
import org.drools.workbench.screens.guided.dtable.client.widget.ConditionColumnCommand;
import org.drools.workbench.screens.guided.dtable.client.widget.ConditionPopup;
import org.drools.workbench.screens.guided.dtable.client.widget.LimitedEntryBRLActionColumnViewImpl;
import org.drools.workbench.screens.guided.dtable.client.widget.LimitedEntryBRLConditionColumnViewImpl;
import org.drools.workbench.screens.guided.dtable.client.widget.table.themes.GuidedDecisionTableTheme;
import org.kie.workbench.common.widgets.client.datamodel.AsyncPackageDataModelOracle;
import org.uberfire.ext.widgets.common.client.common.BusyPopup;
import org.uberfire.ext.wires.core.grids.client.model.GridData;
import org.uberfire.ext.wires.core.grids.client.util.CoordinateUtilities;
import org.uberfire.ext.wires.core.grids.client.widget.grid.impl.BaseGridWidget;
import org.uberfire.ext.wires.core.grids.client.widget.grid.renderers.grids.GridRenderer;
import org.uberfire.ext.wires.core.grids.client.widget.grid.renderers.grids.impl.BaseGridRendererHelper;
import org.uberfire.workbench.events.NotificationEvent;
public class GuidedDecisionTableViewImpl extends BaseGridWidget implements GuidedDecisionTableView {
public static final int HEADER_CAPTION_WIDTH = 200;
public static final int HEADER_CAPTION_HEIGHT = 32;
private final GuidedDecisionTableView.Presenter presenter;
private final GuidedDecisionTable52 model;
private final AsyncPackageDataModelOracle oracle;
private final Set<PortableWorkDefinition> workItemDefinitions;
private final Event<NotificationEvent> notificationEvent;
private final EventBus eventBus;
private final GuidedDecisionTablePresenter.Access access;
private Group headerCaption;
public GuidedDecisionTableViewImpl(final GridData uiModel,
final GridRenderer renderer,
final GuidedDecisionTableView.Presenter presenter,
final GuidedDecisionTable52 model,
final AsyncPackageDataModelOracle oracle,
final Set<PortableWorkDefinition> workItemDefinitions,
final Event<NotificationEvent> notificationEvent,
final EventBus eventBus,
final GuidedDecisionTablePresenter.Access access) {
super(uiModel,
presenter,
presenter,
renderer);
this.presenter = presenter;
this.model = model;
this.oracle = oracle;
this.workItemDefinitions = workItemDefinitions;
this.notificationEvent = notificationEvent;
this.eventBus = eventBus;
this.access = access;
this.headerCaption = makeHeaderCaption();
addNodeDragMoveHandler((event) -> presenter.getModellerPresenter().updateRadar());
}
private Group makeHeaderCaption() {
final Group g = new Group();
final double captionWidth = getHeaderCaptionWidth();
final GuidedDecisionTableTheme theme = (GuidedDecisionTableTheme) renderer.getTheme();
final Rectangle r = theme.getBaseRectangle(GuidedDecisionTableTheme.ModelColumnType.CAPTION)
.setWidth(captionWidth)
.setHeight(HEADER_CAPTION_HEIGHT);
final MultiPath border = theme.getBodyGridLine();
border.M(0.5,
HEADER_CAPTION_HEIGHT + 0.5)
.L(0.5,
0.5)
.L(captionWidth + 0.5,
0.5)
.L(captionWidth + 0.5,
HEADER_CAPTION_HEIGHT + 0.5)
.L(0.5,
HEADER_CAPTION_HEIGHT + 0.5);
final Text caption = theme.getHeaderText()
.setText(model.getTableName())
.setX(captionWidth / 2)
.setY(HEADER_CAPTION_HEIGHT / 2);
//Clip Caption Group
final BoundingBox bb = new BoundingBox(0,
0,
captionWidth,
HEADER_CAPTION_HEIGHT);
final IPathClipper clipper = new BoundingBoxPathClipper(bb);
g.setPathClipper(clipper);
clipper.setActive(true);
g.add(r);
g.add(caption);
g.add(border);
//Add handler to enter/exit "pinned" mode
addNodeMouseDoubleClickHandler((event) -> {
if (isNodeMouseEventOverCaption(event)) {
if (presenter.isGridPinned()) {
presenter.exitPinnedMode(() -> {/*Nothing*/});
} else {
presenter.enterPinnedMode(GuidedDecisionTableViewImpl.this,
() -> {/*Nothing*/});
}
}
});
return g;
}
private double getHeaderCaptionWidth() {
return Math.max(HEADER_CAPTION_WIDTH,
model.getRowNumberCol().getWidth() + model.getDescriptionCol().getWidth());
}
@Override
public boolean onDragHandle(final INodeXYEvent event) {
return isNodeMouseEventOverCaption(event);
}
private boolean isNodeMouseEventOverCaption(final INodeXYEvent event) {
final Point2D ap = CoordinateUtilities.convertDOMToGridCoordinate(this,
new Point2D(event.getX(),
event.getY()));
final double cx = ap.getX();
final double cy = ap.getY();
if (cx > headerCaption.getX() && cx < headerCaption.getX() + getHeaderCaptionWidth()) {
if (cy > headerCaption.getY() && cy < headerCaption.getY() + HEADER_CAPTION_HEIGHT) {
return true;
}
}
return false;
}
@Override
public void setLocation(final double x,
final double y) {
setLocation(new Point2D(x,
y));
}
@Override
protected void drawHeader(final BaseGridRendererHelper.RenderingInformation renderingInformation,
final boolean isSelectionLayer) {
super.drawHeader(renderingInformation,
isSelectionLayer);
headerCaption = makeHeaderCaption();
headerCaption.setY(header == null ? 0.0 : header.getY());
final BaseGridRendererHelper.RenderingBlockInformation floatingBlockInformation = renderingInformation.getFloatingBlockInformation();
if (!floatingBlockInformation.getColumns().isEmpty()) {
headerCaption.setX(floatingBlockInformation.getX());
} else {
headerCaption.setX(0.0);
}
add(headerCaption);
}
@Override
public void newAttributeOrMetaDataColumn(final Set<String> reservedAttributeNames) {
new GuidedDecisionTableAttributeSelectorPopup(reservedAttributeNames.toArray(new String[0]),
presenter).show();
}
@Override
public void newExtendedEntryConditionColumn() {
final ConditionCol52 column = new ConditionCol52();
doNewConditionColumn(column);
}
@Override
public void newLimitedEntryConditionColumn() {
final ConditionCol52 column = new LimitedEntryConditionCol52();
doNewConditionColumn(column);
}
private void doNewConditionColumn(final ConditionCol52 column) {
final ConditionPopup popup = new ConditionPopup(model,
oracle,
presenter,
new ConditionColumnCommand() {
public void execute(final Pattern52 pattern,
final ConditionCol52 column) {
presenter.appendColumn(pattern,
column);
}
},
column,
true,
!access.isEditable());
popup.show();
}
@Override
public void newExtendedEntryConditionBRLFragment() {
final BRLConditionColumn column = new BRLConditionColumn();
final BRLConditionColumnViewImpl popup = new BRLConditionColumnViewImpl(model,
oracle,
presenter,
eventBus,
column,
true,
!access.isEditable());
popup.show();
}
@Override
public void newLimitedEntryConditionBRLFragment() {
final LimitedEntryBRLConditionColumn column = new LimitedEntryBRLConditionColumn();
final LimitedEntryBRLConditionColumnViewImpl popup = new LimitedEntryBRLConditionColumnViewImpl(model,
oracle,
presenter,
eventBus,
column,
true,
!access.isEditable());
popup.show();
}
@Override
public void newExtendedEntryActionInsertColumn() {
final ActionInsertFactCol52 column = new ActionInsertFactCol52();
doNewActionInsertColumn(column);
}
@Override
public void newLimitedEntryActionInsertColumn() {
final LimitedEntryActionInsertFactCol52 column = new LimitedEntryActionInsertFactCol52();
doNewActionInsertColumn(column);
}
private void doNewActionInsertColumn(final ActionInsertFactCol52 column) {
final ActionInsertFactPopup popup = new ActionInsertFactPopup(model,
oracle,
presenter,
new ActionColumnCommand() {
public void execute(final ActionCol52 column) {
presenter.appendColumn(column);
}
},
column,
true,
!access.isEditable());
popup.show();
}
@Override
public void newExtendedEntryActionSetColumn() {
final ActionSetFieldCol52 column = new ActionSetFieldCol52();
doNewActionSetColumn(column);
}
@Override
public void newLimitedEntryActionSetColumn() {
final LimitedEntryActionSetFieldCol52 column = new LimitedEntryActionSetFieldCol52();
doNewActionSetColumn(column);
}
private void doNewActionSetColumn(final ActionSetFieldCol52 column) {
final ActionSetFieldPopup popup = new ActionSetFieldPopup(model,
oracle,
presenter,
new ActionColumnCommand() {
public void execute(final ActionCol52 column) {
presenter.appendColumn(column);
}
},
column,
true,
!access.isEditable());
popup.show();
}
@Override
public void newExtendedEntryActionRetractFact() {
final ActionRetractFactCol52 column = new ActionRetractFactCol52();
doNewActionRetractFactColumn(column);
}
@Override
public void newLimitedEntryActionRetractFact() {
final LimitedEntryActionRetractFactCol52 column = new LimitedEntryActionRetractFactCol52();
column.setValue(new DTCellValue52(""));
doNewActionRetractFactColumn(column);
}
private void doNewActionRetractFactColumn(final ActionRetractFactCol52 column) {
final ActionRetractFactPopup popup = new ActionRetractFactPopup(model,
presenter,
new ActionColumnCommand() {
public void execute(final ActionCol52 column) {
presenter.appendColumn(column);
}
},
column,
true,
!access.isEditable());
popup.show();
}
@Override
public void newActionWorkItem() {
//WorkItems are defined within the column and always boolean (i.e. Limited Entry) in the table
final ActionWorkItemCol52 column = new ActionWorkItemCol52();
final ActionWorkItemPopup popup = new ActionWorkItemPopup(model,
presenter,
new ActionColumnCommand() {
public void execute(final ActionCol52 column) {
presenter.appendColumn(column);
}
},
column,
workItemDefinitions,
true,
!access.isEditable());
popup.show();
}
@Override
public void newActionWorkItemSetField() {
//Actions setting Field Values from Work Item Result Parameters are always boolean (i.e. Limited Entry) in the table
final ActionWorkItemSetFieldCol52 column = new ActionWorkItemSetFieldCol52();
final ActionWorkItemSetFieldPopup popup = new ActionWorkItemSetFieldPopup(model,
oracle,
presenter,
new ActionColumnCommand() {
public void execute(final ActionCol52 column) {
presenter.appendColumn(column);
}
},
column,
true,
!access.isEditable());
popup.show();
}
@Override
public void newActionWorkItemInsertFact() {
//Actions setting Field Values from Work Item Result Parameters are always boolean (i.e. Limited Entry) in the table
final ActionWorkItemInsertFactCol52 column = new ActionWorkItemInsertFactCol52();
final ActionWorkItemInsertFactPopup popup = new ActionWorkItemInsertFactPopup(model,
oracle,
presenter,
new ActionColumnCommand() {
public void execute(final ActionCol52 column) {
presenter.appendColumn(column);
}
},
column,
true,
!access.isEditable());
popup.show();
}
@Override
public void newExtendedEntryActionBRLFragment() {
final BRLActionColumn column = new BRLActionColumn();
final BRLActionColumnViewImpl popup = new BRLActionColumnViewImpl(model,
oracle,
presenter,
eventBus,
column,
true,
!access.isEditable());
popup.show();
}
@Override
public void newLimitedEntryActionBRLFragment() {
final LimitedEntryBRLActionColumn column = new LimitedEntryBRLActionColumn();
final LimitedEntryBRLActionColumnViewImpl popup = new LimitedEntryBRLActionColumnViewImpl(model,
oracle,
presenter,
eventBus,
column,
true,
!access.isEditable());
popup.show();
}
public void editCondition(final Pattern52 pattern,
final ConditionCol52 column) {
final ConditionPopup popup = new ConditionPopup(model,
oracle,
presenter,
new ConditionColumnCommand() {
public void execute(final Pattern52 newPattern,
final ConditionCol52 newColumn) {
if (!access.isEditable()) {
return;
}
presenter.updateColumn(pattern,
column,
newPattern,
newColumn);
}
},
pattern,
column,
false,
!access.isEditable());
popup.show();
}
@Override
public void editExtendedEntryConditionBRLFragment(final BRLConditionColumn column) {
final BRLConditionColumnViewImpl popup = new BRLConditionColumnViewImpl(model,
oracle,
presenter,
eventBus,
column,
false,
!access.isEditable());
popup.show();
}
@Override
public void editLimitedEntryConditionBRLFragment(final LimitedEntryBRLConditionColumn column) {
final LimitedEntryBRLConditionColumnViewImpl popup = new LimitedEntryBRLConditionColumnViewImpl(model,
oracle,
presenter,
eventBus,
column,
false,
!access.isEditable());
popup.show();
}
@Override
public void editActionInsertFact(final ActionInsertFactCol52 column) {
final ActionInsertFactPopup ed = new ActionInsertFactPopup(model,
oracle,
presenter,
new ActionColumnCommand() {
public void execute(final ActionCol52 newColumn) {
if (!access.isEditable()) {
return;
}
presenter.updateColumn(column,
(ActionInsertFactCol52) newColumn);
}
},
column,
false,
!access.isEditable());
ed.show();
}
@Override
public void editActionSetField(final ActionSetFieldCol52 column) {
final ActionSetFieldPopup ed = new ActionSetFieldPopup(model,
oracle,
presenter,
new ActionColumnCommand() {
public void execute(final ActionCol52 newColumn) {
if (!access.isEditable()) {
return;
}
presenter.updateColumn(column,
(ActionSetFieldCol52) newColumn);
}
},
column,
false,
!access.isEditable());
ed.show();
}
@Override
public void editActionRetractFact(final ActionRetractFactCol52 column) {
final ActionRetractFactPopup ed = new ActionRetractFactPopup(model,
presenter,
new ActionColumnCommand() {
public void execute(final ActionCol52 newColumn) {
if (!access.isEditable()) {
return;
}
presenter.updateColumn(column,
(ActionRetractFactCol52) newColumn);
}
},
column,
false,
!access.isEditable());
ed.show();
}
@Override
public void editActionWorkItemInsertFact(final ActionWorkItemInsertFactCol52 column) {
final ActionWorkItemInsertFactPopup ed = new ActionWorkItemInsertFactPopup(model,
oracle,
presenter,
new ActionColumnCommand() {
public void execute(final ActionCol52 newColumn) {
if (!access.isEditable()) {
return;
}
presenter.updateColumn(column,
(ActionWorkItemInsertFactCol52) newColumn);
}
},
column,
false,
!access.isEditable());
ed.show();
}
@Override
public void editActionWorkItemSetField(final ActionWorkItemSetFieldCol52 column) {
final ActionWorkItemSetFieldPopup ed = new ActionWorkItemSetFieldPopup(model,
oracle,
presenter,
new ActionColumnCommand() {
public void execute(final ActionCol52 newColumn) {
if (!access.isEditable()) {
return;
}
presenter.updateColumn(column,
(ActionWorkItemSetFieldCol52) newColumn);
}
},
column,
false,
!access.isEditable());
ed.show();
}
@Override
public void editActionWorkItem(final ActionWorkItemCol52 column) {
final ActionWorkItemPopup popup = new ActionWorkItemPopup(model,
presenter,
new ActionColumnCommand() {
public void execute(final ActionCol52 newColumn) {
if (!access.isEditable()) {
return;
}
presenter.updateColumn(column,
(ActionWorkItemCol52) newColumn);
}
},
column,
workItemDefinitions,
false,
!access.isEditable());
popup.show();
}
@Override
public void editExtendedEntryActionBRLFragment(final BRLActionColumn column) {
final BRLActionColumnViewImpl popup = new BRLActionColumnViewImpl(model,
oracle,
presenter,
eventBus,
column,
false,
!access.isEditable());
popup.show();
}
@Override
public void editLimitedEntryActionBRLFragment(final LimitedEntryBRLActionColumn column) {
final LimitedEntryBRLActionColumnViewImpl popup = new LimitedEntryBRLActionColumnViewImpl(model,
oracle,
presenter,
eventBus,
column,
false,
!access.isEditable());
popup.show();
}
@Override
public void showDataCutNotificationEvent() {
notificationEvent.fire(new NotificationEvent(GuidedDecisionTableConstants.INSTANCE.DataCutToClipboardMessage()));
}
@Override
public void showDataCopiedNotificationEvent() {
notificationEvent.fire(new NotificationEvent(GuidedDecisionTableConstants.INSTANCE.DataCopiedToClipboardMessage()));
}
@Override
public void showBusyIndicator(final String message) {
BusyPopup.showMessage(message);
}
@Override
public void hideBusyIndicator() {
BusyPopup.close();
}
}