/* * 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.client.widgets.explorer.navigator.diagrams; import java.util.LinkedList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.enterprise.context.Dependent; import javax.enterprise.event.Event; import javax.inject.Inject; import com.google.gwt.logging.client.LogConfiguration; import com.google.gwt.user.client.ui.Widget; import org.jboss.errai.ioc.client.api.ManagedInstance; import org.kie.workbench.common.stunner.client.widgets.event.LoadDiagramEvent; import org.kie.workbench.common.stunner.client.widgets.explorer.navigator.Navigator; import org.kie.workbench.common.stunner.client.widgets.explorer.navigator.NavigatorItem; import org.kie.workbench.common.stunner.client.widgets.explorer.navigator.NavigatorItemView; import org.kie.workbench.common.stunner.client.widgets.explorer.navigator.NavigatorView; import org.kie.workbench.common.stunner.core.client.service.ClientDiagramService; import org.kie.workbench.common.stunner.core.client.service.ClientRuntimeError; import org.kie.workbench.common.stunner.core.client.service.ServiceCallback; import org.kie.workbench.common.stunner.core.client.util.StunnerClientLogger; import org.kie.workbench.common.stunner.core.lookup.LookupManager; import org.kie.workbench.common.stunner.core.lookup.diagram.DiagramLookupRequest; import org.kie.workbench.common.stunner.core.lookup.diagram.DiagramLookupRequestImpl; import org.kie.workbench.common.stunner.core.lookup.diagram.DiagramRepresentation; @Dependent public class DiagramsNavigatorImpl implements DiagramsNavigator { private static Logger LOGGER = Logger.getLogger(DiagramsNavigatorImpl.class.getName()); ClientDiagramService clientDiagramServices; ManagedInstance<DiagramNavigatorItem> navigatorItemInstances; Event<LoadDiagramEvent> loadDiagramEventEvent; NavigatorView<?> view; private final List<NavigatorItem<DiagramRepresentation>> items = new LinkedList<>(); private int width; private int height; @Inject public DiagramsNavigatorImpl(final ClientDiagramService clientDiagramServices, final ManagedInstance<DiagramNavigatorItem> navigatorItemInstances, final Event<LoadDiagramEvent> loadDiagramEventEvent, final NavigatorView<?> view) { this.clientDiagramServices = clientDiagramServices; this.navigatorItemInstances = navigatorItemInstances; this.loadDiagramEventEvent = loadDiagramEventEvent; this.view = view; this.width = 140; this.height = 140; } @Override public Widget asWidget() { return view.asWidget(); } @Override public Navigator<DiagramRepresentation> setItemPxSize(int width, int height) { this.width = width; this.height = height; return this; } public DiagramsNavigatorImpl show() { // Notify some processing starts. fireProcessingStarted(); clear(); final DiagramLookupRequest request = new DiagramLookupRequestImpl.Builder().build(); clientDiagramServices.lookup(request, new ServiceCallback<LookupManager.LookupResponse<DiagramRepresentation>>() { @Override public void onSuccess(final LookupManager.LookupResponse<DiagramRepresentation> response) { final List<DiagramRepresentation> items = response.getResults(); if (null != items && !items.isEmpty()) { for (final DiagramRepresentation diagram : items) { addEntry(diagram); } } // Notify some processing ends. fireProcessingCompleted(); } @Override public void onError(final ClientRuntimeError error) { showError(error); } }); return this; } public DiagramsNavigatorImpl clear() { items.clear(); view.clear(); return this; } @Override public List<NavigatorItem<DiagramRepresentation>> getItems() { return items; } @Override public NavigatorView<?> getView() { return view; } private void addEntry(final DiagramRepresentation diagramRepresentation) { final DiagramNavigatorItem item = navigatorItemInstances.get(); view.add(item.getView()); items.add(item); item.show(diagramRepresentation, width, height, () -> { onItemSelected(item, diagramRepresentation); }); } private void onItemSelected(final DiagramNavigatorItem item, final DiagramRepresentation diagramRepresentation) { items.stream().forEach(i -> { final NavigatorItemView iv = i.getView(); if (i.equals(item)) { iv.select(); } else { iv.deselect(); } }); fireLoadDiagram(diagramRepresentation); } private void fireLoadDiagram(final DiagramRepresentation diagramRepresentation) { final String name = diagramRepresentation.getName(); final String path = diagramRepresentation.getPath().toURI(); loadDiagramEventEvent.fire(new LoadDiagramEvent(path, name)); } private void fireProcessingStarted() { view.setLoading(true); } private void fireProcessingCompleted() { view.setLoading(false); } private void showError(final ClientRuntimeError error) { final String message = StunnerClientLogger.getErrorMessage(error); showError(message); } private void showError(final String error) { fireProcessingCompleted(); log(Level.SEVERE, error); } private void log(final Level level, final String message) { if (LogConfiguration.loggingIsEnabled()) { LOGGER.log(level, message); } } }