/*
* Copyright 2017 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.kie.workbench.common.stunner.cm.client.canvas;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import com.ait.lienzo.client.core.shape.wires.handlers.WiresControlFactory;
import org.jboss.errai.ioc.client.api.ManagedInstance;
import org.kie.workbench.common.stunner.client.lienzo.canvas.wires.WiresCanvas;
import org.kie.workbench.common.stunner.cm.qualifiers.CaseManagementEditor;
import org.kie.workbench.common.stunner.core.client.canvas.AbstractCanvas;
import org.kie.workbench.common.stunner.core.client.canvas.AbstractCanvasHandler;
import org.kie.workbench.common.stunner.core.client.canvas.CanvasFactory;
import org.kie.workbench.common.stunner.core.client.canvas.controls.CanvasControl;
import org.kie.workbench.common.stunner.core.client.canvas.controls.actions.CanvasNameEditionControl;
import org.kie.workbench.common.stunner.core.client.canvas.controls.builder.EdgeBuilderControl;
import org.kie.workbench.common.stunner.core.client.canvas.controls.builder.ElementBuilderControl;
import org.kie.workbench.common.stunner.core.client.canvas.controls.builder.NodeBuilderControl;
import org.kie.workbench.common.stunner.core.client.canvas.controls.builder.impl.Observer;
import org.kie.workbench.common.stunner.core.client.canvas.controls.connection.ConnectionAcceptorControl;
import org.kie.workbench.common.stunner.core.client.canvas.controls.containment.ContainmentAcceptorControl;
import org.kie.workbench.common.stunner.core.client.canvas.controls.docking.DockingAcceptorControl;
import org.kie.workbench.common.stunner.core.client.canvas.controls.pan.PanControl;
import org.kie.workbench.common.stunner.core.client.canvas.controls.select.SelectionControl;
import org.kie.workbench.common.stunner.core.client.canvas.controls.zoom.ZoomControl;
/**
* The CM factory for canvas, canvas handler and controls.
*/
@CaseManagementEditor
@ApplicationScoped
public class CaseManagementCanvasFactory implements CanvasFactory<AbstractCanvas, AbstractCanvasHandler> {
private static Logger LOGGER = Logger.getLogger(CaseManagementCanvasFactory.class.getName());
private final ManagedInstance<ConnectionAcceptorControl> connectionAcceptorControls;
private final ManagedInstance<ContainmentAcceptorControl> containmentAcceptorControls;
private final ManagedInstance<DockingAcceptorControl> dockingAcceptorControls;
private final ManagedInstance<CanvasNameEditionControl> nameEditionControls;
private final ManagedInstance<SelectionControl> selectionControls;
private final ManagedInstance<ElementBuilderControl> elementBuilderControls;
private final ManagedInstance<NodeBuilderControl> nodeBuilderControls;
private final ManagedInstance<EdgeBuilderControl> edgeBuilderControls;
private final ManagedInstance<ZoomControl> zoomControls;
private final ManagedInstance<PanControl> panControls;
private final ManagedInstance<AbstractCanvas> canvasInstances;
private final ManagedInstance<AbstractCanvasHandler> canvasHandlerInstances;
private final WiresControlFactory caseManagementControlFactory;
private final Map<Class<? extends CanvasControl>, ManagedInstance> controls = new HashMap<>(15);
protected CaseManagementCanvasFactory() {
this(null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null);
}
@Inject
public CaseManagementCanvasFactory(final ManagedInstance<ConnectionAcceptorControl> connectionAcceptorControls,
final @CaseManagementEditor ManagedInstance<ContainmentAcceptorControl> containmentAcceptorControls,
final ManagedInstance<DockingAcceptorControl> dockingAcceptorControls,
final ManagedInstance<CanvasNameEditionControl> nameEditionControls,
final ManagedInstance<SelectionControl> selectionControls,
final @CaseManagementEditor @Observer ManagedInstance<ElementBuilderControl> elementBuilderControls,
final @CaseManagementEditor ManagedInstance<NodeBuilderControl> nodeBuilderControls,
final ManagedInstance<EdgeBuilderControl> edgeBuilderControls,
final ManagedInstance<ZoomControl> zoomControls,
final ManagedInstance<PanControl> panControls,
final @CaseManagementEditor ManagedInstance<AbstractCanvas> canvasInstances,
final @CaseManagementEditor ManagedInstance<AbstractCanvasHandler> canvasHandlerInstances,
final @CaseManagementEditor WiresControlFactory caseManagementControlFactory) {
this.connectionAcceptorControls = connectionAcceptorControls;
this.containmentAcceptorControls = containmentAcceptorControls;
this.dockingAcceptorControls = dockingAcceptorControls;
this.nameEditionControls = nameEditionControls;
this.selectionControls = selectionControls;
this.elementBuilderControls = elementBuilderControls;
this.nodeBuilderControls = nodeBuilderControls;
this.edgeBuilderControls = edgeBuilderControls;
this.zoomControls = zoomControls;
this.panControls = panControls;
this.canvasInstances = canvasInstances;
this.canvasHandlerInstances = canvasHandlerInstances;
this.caseManagementControlFactory = caseManagementControlFactory;
}
@PostConstruct
public void init() {
controls.put(ConnectionAcceptorControl.class,
connectionAcceptorControls);
controls.put(ContainmentAcceptorControl.class,
containmentAcceptorControls);
controls.put(DockingAcceptorControl.class,
dockingAcceptorControls);
controls.put(CanvasNameEditionControl.class,
nameEditionControls);
controls.put(SelectionControl.class,
selectionControls);
controls.put(ElementBuilderControl.class,
elementBuilderControls);
controls.put(NodeBuilderControl.class,
nodeBuilderControls);
controls.put(EdgeBuilderControl.class,
edgeBuilderControls);
controls.put(ZoomControl.class,
zoomControls);
controls.put(PanControl.class,
panControls);
}
@Override
public AbstractCanvas newCanvas() {
final AbstractCanvas canvas = canvasInstances.get();
((WiresCanvas) canvas).getWiresManager().setWiresControlFactory(caseManagementControlFactory);
return canvas;
}
@Override
public AbstractCanvasHandler newCanvasHandler() {
return canvasHandlerInstances.get();
}
@Override
@SuppressWarnings("unchecked")
public <A extends CanvasControl> A newControl(final Class<A> type) {
if (controls.containsKey(type)) {
final ManagedInstance<A> mi = controls.get(type);
return mi.get();
} else {
LOGGER.log(Level.WARNING,
"Canvas Control for type [" + type.getName() + "] is not supported by " +
"this canvas factory [" + this.getClass().getName() + "]");
}
return null;
}
}