/* * 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.ArrayList; import java.util.logging.Logger; import javax.annotation.PostConstruct; import javax.enterprise.context.Dependent; import javax.enterprise.event.Event; import javax.inject.Inject; import com.google.gwt.user.client.ui.IsWidget; import org.gwtbootstrap3.client.ui.Button; import org.gwtbootstrap3.client.ui.constants.ButtonSize; import org.gwtbootstrap3.client.ui.constants.IconType; import org.kie.workbench.common.stunner.client.widgets.menu.MenuUtils; import org.kie.workbench.common.stunner.client.widgets.presenters.session.SessionPresenterFactory; import org.kie.workbench.common.stunner.client.widgets.presenters.session.SessionPreview; import org.kie.workbench.common.stunner.client.widgets.presenters.session.SessionViewer; 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.service.ClientRuntimeError; import org.kie.workbench.common.stunner.core.client.session.ClientSession; import org.kie.workbench.common.stunner.core.client.session.impl.AbstractClientFullSession; import org.kie.workbench.common.stunner.core.client.session.impl.AbstractClientReadOnlySession; import org.kie.workbench.common.stunner.core.client.session.impl.AbstractClientSession; 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.client.workbench.events.ChangeTitleWidgetEvent; import org.uberfire.lifecycle.OnClose; import org.uberfire.lifecycle.OnOpen; import org.uberfire.lifecycle.OnStartup; import org.uberfire.mvp.Command; import org.uberfire.mvp.PlaceRequest; import org.uberfire.workbench.model.menu.MenuFactory; import org.uberfire.workbench.model.menu.MenuItem; import org.uberfire.workbench.model.menu.Menus; import static java.util.logging.Level.FINE; import static java.util.logging.Level.SEVERE; import static java.util.logging.Level.WARNING; /** * This screen provides a preview for a diagram. * It is session aware - It shows the preview for the current session's diagram. */ // TODO: i18n. @Dependent @WorkbenchScreen(identifier = SessionDiagramPreviewScreen.SCREEN_ID) public class SessionDiagramPreviewScreen extends AbstractSessionScreen { private static Logger LOGGER = Logger.getLogger(SessionDiagramPreviewScreen.class.getName()); public static final String SCREEN_ID = "SessionDiagramPreviewScreen"; public static final String TITLE = "Preview"; public static final int WIDTH = 420; public static final int HEIGHT = 280; @Inject SessionPresenterFactory<Diagram, AbstractClientReadOnlySession, AbstractClientFullSession> sessionPresenterFactory; @Inject SessionScreenView view; @Inject Event<ChangeTitleWidgetEvent> changeTitleNotificationEvent; private SessionPreview<AbstractClientSession, Diagram> sessionPreview; private PlaceRequest placeRequest; private String title = TITLE; private Menus menu = null; @PostConstruct public void init() { view.showEmptySession(); } @OnStartup public void onStartup(final PlaceRequest placeRequest) { this.placeRequest = placeRequest; this.menu = makeMenuBar(); } @OnOpen public void onOpen() { } @OnClose public void onClose() { close(); } @WorkbenchMenu public Menus getMenu() { return menu; } @WorkbenchPartTitle public String getTitle() { return title; } @WorkbenchPartView public IsWidget getWidget() { return view; } @WorkbenchContextId public String getMyContextRef() { return "sessionDiagramPreviewScreenContext"; } @Override protected void doOpenSession() { // No need to initialize state or views if no diagram is present. } @Override protected void doOpenDiagram() { final AbstractClientSession session = getSession(); if (null != session) { newPreview(() -> { sessionPreview.open(session, WIDTH, HEIGHT, new SessionViewer.SessionViewerCallback<AbstractClientSession, Diagram>() { @Override public void afterCanvasInitialized() { } @Override public void onSuccess() { LOGGER.log(FINE, "Session's preview completed for [" + session + "]"); view.showScreenView(sessionPreview.getView()); } @Override public void onError(final ClientRuntimeError error) { LOGGER.log(SEVERE, "Error while showing session preview for [" + session + "]. " + "Error=[" + error + "]"); } }); }); } else { LOGGER.log(WARNING, "Trying to open a null session!"); } } @Override protected void doCloseSession() { destroyPreview(); view.showEmptySession(); } private void newPreview(final Command callback) { destroyPreview(); sessionPreview = sessionPresenterFactory.newPreview(); callback.execute(); } private void destroyPreview() { // Clear the session's preview presenter if it has been initialized before. if (null != sessionPreview) { sessionPreview.destroy(); sessionPreview = null; } } @Override protected void doUpdateTitle(final String title) { // Change screen title. SessionDiagramPreviewScreen.this.title = title; changeTitleNotificationEvent.fire(new ChangeTitleWidgetEvent(placeRequest, this.title)); } private void refresh() { final ClientSession<AbstractCanvas, AbstractCanvasHandler> session = getSession(); open(session); } private Menus makeMenuBar() { return MenuFactory .newTopLevelMenu("Refresh") .withItems(new ArrayList<MenuItem>(1) {{ add(buildRefreshMenuItem()); }}) .endMenu() .build(); } private MenuItem buildRefreshMenuItem() { return MenuUtils.buildItem(new Button() {{ setIcon(IconType.REFRESH); setSize(ButtonSize.SMALL); setTitle("Refresh"); addClickHandler(e -> SessionDiagramPreviewScreen.this.refresh()); }}); } }