/* * 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.core.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.enterprise.inject.Default; import javax.inject.Inject; import org.jboss.errai.ioc.client.api.ManagedInstance; 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.drag.DragControl; import org.kie.workbench.common.stunner.core.client.canvas.controls.pan.PanControl; import org.kie.workbench.common.stunner.core.client.canvas.controls.resize.ResizeControl; import org.kie.workbench.common.stunner.core.client.canvas.controls.select.SelectionControl; import org.kie.workbench.common.stunner.core.client.canvas.controls.toolbox.ToolboxControl; import org.kie.workbench.common.stunner.core.client.canvas.controls.zoom.ZoomControl; /** * The Stunner's @Default Canvas Factory implementation. * It produces: * - the @Default canvas type resolved for <code>AbstractCanvas</code> * - the @Default canvas handler type resolved for <code>AbstractCanvasHandler</code> * - the @Default canvas control types resolved for the types specified in the * singleton <code>CONTROL_TYPES</code> internal map. */ @ApplicationScoped public class CanvasFactoryImpl implements CanvasFactory<AbstractCanvas, AbstractCanvasHandler> { private static Logger LOGGER = Logger.getLogger(CanvasFactoryImpl.class.getName()); private final ManagedInstance<ResizeControl> resizeControls; 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<DragControl> dragControls; private final ManagedInstance<ToolboxControl> toolboxControls; 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 Map<Class<? extends CanvasControl>, ManagedInstance> controls = new HashMap<>(15); protected CanvasFactoryImpl() { this(null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); } @Inject public CanvasFactoryImpl(final ManagedInstance<ResizeControl> resizeControls, final ManagedInstance<ConnectionAcceptorControl> connectionAcceptorControls, final ManagedInstance<ContainmentAcceptorControl> containmentAcceptorControls, final ManagedInstance<DockingAcceptorControl> dockingAcceptorControls, final ManagedInstance<CanvasNameEditionControl> nameEditionControls, final ManagedInstance<SelectionControl> selectionControls, final ManagedInstance<DragControl> dragControls, final ManagedInstance<ToolboxControl> toolboxControls, final @Default @Observer ManagedInstance<ElementBuilderControl> elementBuilderControls, final ManagedInstance<NodeBuilderControl> nodeBuilderControls, final ManagedInstance<EdgeBuilderControl> edgeBuilderControls, final ManagedInstance<ZoomControl> zoomControls, final ManagedInstance<PanControl> panControls, final @Default ManagedInstance<AbstractCanvas> canvasInstances, final @Default ManagedInstance<AbstractCanvasHandler> canvasHandlerInstances) { this.resizeControls = resizeControls; this.connectionAcceptorControls = connectionAcceptorControls; this.containmentAcceptorControls = containmentAcceptorControls; this.dockingAcceptorControls = dockingAcceptorControls; this.nameEditionControls = nameEditionControls; this.selectionControls = selectionControls; this.dragControls = dragControls; this.toolboxControls = toolboxControls; this.elementBuilderControls = elementBuilderControls; this.nodeBuilderControls = nodeBuilderControls; this.edgeBuilderControls = edgeBuilderControls; this.zoomControls = zoomControls; this.panControls = panControls; this.canvasInstances = canvasInstances; this.canvasHandlerInstances = canvasHandlerInstances; } @PostConstruct public void init() { controls.put(ResizeControl.class, resizeControls); 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(DragControl.class, dragControls); controls.put(ToolboxControl.class, toolboxControls); 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() { return canvasInstances.get(); } @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); if (!mi.isUnsatisfied()) { return mi.get(); } else { LOGGER.log(Level.SEVERE, "Canvas Control for type [" + type.getName() + "] is cannot be resolved by " + "this canvas factory [" + this.getClass().getName() + "]"); } } else { LOGGER.log(Level.WARNING, "Canvas Control for type [" + type.getName() + "] is not supported by " + "this canvas factory [" + this.getClass().getName() + "]"); } return null; } }