/*
* 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.standalone.client.screens;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import com.google.gwt.logging.client.LogConfiguration;
import com.google.gwt.user.client.ui.IsWidget;
import org.kie.workbench.common.stunner.client.widgets.presenters.Viewer;
import org.kie.workbench.common.stunner.client.widgets.presenters.diagram.DiagramEditor;
import org.kie.workbench.common.stunner.client.widgets.presenters.diagram.DiagramPresenterFactory;
import org.kie.workbench.common.stunner.client.widgets.presenters.diagram.DiagramViewer;
import org.kie.workbench.common.stunner.client.widgets.views.session.ScreenErrorView;
import org.kie.workbench.common.stunner.client.widgets.views.session.ScreenPanelView;
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.diagram.Diagram;
import org.uberfire.client.annotations.WorkbenchContextId;
import org.uberfire.client.annotations.WorkbenchMenu;
import org.uberfire.client.annotations.WorkbenchPartTitle;
import org.uberfire.client.annotations.WorkbenchPartView;
import org.uberfire.client.annotations.WorkbenchScreen;
import org.uberfire.ext.widgets.common.client.common.BusyPopup;
import org.uberfire.lifecycle.OnClose;
import org.uberfire.lifecycle.OnOpen;
import org.uberfire.lifecycle.OnStartup;
import org.uberfire.mvp.PlaceRequest;
import org.uberfire.workbench.model.menu.MenuFactory;
import org.uberfire.workbench.model.menu.Menus;
/**
* This screen wraps the diagram viewer & editor widgets
* and provides the menu items for both loading or editing a diagram.
*/
@Dependent
@WorkbenchScreen(identifier = DiagramPresenterScreen.SCREEN_ID)
public class DiagramPresenterScreen {
private static Logger LOGGER = Logger.getLogger(DiagramPresenterScreen.class.getName());
public static final String SCREEN_ID = "DiagramPresenterScreen";
public static final String DIAGRAM_NAME = "evaluation2";
/**
* A loader helper instance for loading the diagram that will be used by <code>diagramViewer</code>
*/
@Inject
ShowcaseDiagramService diagramLoader;
/**
* The diagram presenter factory instance.
*/
@Inject
DiagramPresenterFactory<Diagram> diagramPresenterFactory;
@Inject
ScreenPanelView screenPanelView;
@Inject
ScreenErrorView screenErrorView;
private Menus menu = null;
private Viewer<Diagram, ?, ?, ?> presenter;
@PostConstruct
public void init() {
}
@OnStartup
public void onStartup(final PlaceRequest placeRequest) {
this.menu = makeMenuBar();
}
private Menus makeMenuBar() {
return MenuFactory
.newTopLevelMenu("View " + DIAGRAM_NAME)
.respondsWith(this::show)
.endMenu()
.newTopLevelMenu("Edit " + DIAGRAM_NAME)
.respondsWith(this::edit)
.endMenu()
.build();
}
private void show() {
Logger.getLogger("org.kie.workbench.common.stunner").setLevel(Level.FINE);
BusyPopup.showMessage("Loading");
destroy();
diagramLoader.loadByName(DIAGRAM_NAME,
new ServiceCallback<Diagram>() {
@Override
public void onSuccess(final Diagram diagram) {
final DiagramViewer<Diagram, ?> diagramViewer =
diagramPresenterFactory.newViewer(diagram);
screenPanelView.setWidget(diagramViewer.getView());
DiagramPresenterScreen.this.presenter = diagramViewer;
diagramViewer.open(diagram,
new ScreenViewerCallback());
}
@Override
public void onError(final ClientRuntimeError error) {
showError(error);
}
});
}
private void edit() {
Logger.getLogger("org.kie.workbench.common.stunner").setLevel(Level.FINE);
BusyPopup.showMessage("Loading");
destroy();
diagramLoader.loadByName(DIAGRAM_NAME,
new ServiceCallback<Diagram>() {
@Override
public void onSuccess(final Diagram diagram) {
final DiagramEditor<Diagram, ?> diagramEditor =
diagramPresenterFactory.newEditor(diagram);
screenPanelView.setWidget(diagramEditor.getView());
DiagramPresenterScreen.this.presenter = diagramEditor;
diagramEditor.open(diagram,
new ScreenViewerCallback());
}
@Override
public void onError(ClientRuntimeError error) {
showError(error);
}
});
}
@OnOpen
public void onOpen() {
}
@OnClose
public void onClose() {
clear();
}
@WorkbenchMenu
public Menus getMenu() {
return menu;
}
@WorkbenchPartTitle
public String getTitle() {
return "Diagram Presenter";
}
@WorkbenchPartView
public IsWidget getWidget() {
return screenPanelView;
}
@WorkbenchContextId
public String getMyContextRef() {
return "diagramPresenterScreenContext";
}
private final class ScreenViewerCallback implements DiagramViewer.DiagramViewerCallback<Diagram> {
@Override
public void afterCanvasInitialized() {
}
@Override
public void onSuccess() {
LOGGER.log(Level.FINE,
DIAGRAM_NAME + " loaded!.");
BusyPopup.close();
}
@Override
public void onError(final ClientRuntimeError error) {
showError(error);
}
}
private void clear() {
if (null != presenter) {
presenter.clear();
}
}
private void destroy() {
if (null != presenter) {
presenter.destroy();
}
}
private void showError(final ClientRuntimeError error) {
screenErrorView.showError(error);
screenPanelView.setWidget(screenErrorView.asWidget());
log(Level.SEVERE,
DIAGRAM_NAME + " cannot be loaded! [Error=" + error + "]");
BusyPopup.close();
}
private void log(final Level level,
final String message) {
if (LogConfiguration.loggingIsEnabled()) {
LOGGER.log(level,
message);
}
}
}