/*
* Copyright 2016 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.project.client.screens;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.enterprise.context.Dependent;
import javax.enterprise.event.Event;
import javax.enterprise.event.Observes;
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.core.client.api.AbstractClientSessionManager;
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.forms.client.event.FormPropertiesOpened;
import org.kie.workbench.common.stunner.forms.client.widgets.FormPropertiesWidget;
import org.kie.workbench.common.stunner.project.client.view.ProjectScreenView;
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.PlaceRequest;
import org.uberfire.workbench.model.menu.Menus;
/**
* The screen for the project context (includes the kie workbenches) which is included in a docked area
* and displays the formulary/ies for the selected element on the canvas.
* TODO: I18n.
*/
@Dependent
@WorkbenchScreen(identifier = ProjectDiagramPropertiesScreen.SCREEN_ID)
public class ProjectDiagramPropertiesScreen {
private static Logger LOGGER = Logger.getLogger(ProjectDiagramPropertiesScreen.class.getName());
public static final String SCREEN_ID = "ProjectDiagramPropertiesScreen";
private final FormPropertiesWidget formPropertiesWidget;
private final AbstractClientSessionManager clientSessionManager;
private final Event<ChangeTitleWidgetEvent> changeTitleNotificationEvent;
private final ProjectScreenView view;
private PlaceRequest placeRequest;
private ClientSession session;
private String title = "Properties";
protected ProjectDiagramPropertiesScreen() {
this(null,
null,
null,
null);
}
@Inject
public ProjectDiagramPropertiesScreen(final FormPropertiesWidget formPropertiesWidget,
final AbstractClientSessionManager clientSessionManager,
final Event<ChangeTitleWidgetEvent> changeTitleNotification,
final ProjectScreenView view) {
this.formPropertiesWidget = formPropertiesWidget;
this.clientSessionManager = clientSessionManager;
this.changeTitleNotificationEvent = changeTitleNotification;
this.view = view;
}
@PostConstruct
public void init() {
view.setWidget(formPropertiesWidget.asWidget());
}
@OnStartup
public void onStartup(final PlaceRequest placeRequest) {
this.placeRequest = placeRequest;
}
@OnOpen
public void onOpen() {
log(Level.INFO,
"Opening ProjectDiagramPropertiesScreen.");
final ClientSession current = clientSessionManager.getCurrentSession();
handleSession(current);
}
@OnClose
public void onClose() {
log(Level.INFO,
"Closing ProjectDiagramPropertiesScreen.");
handleSession(null);
}
@SuppressWarnings("unchecked")
private void handleSession(final ClientSession session) {
boolean done = false;
view.showLoading();
if (null != session) {
this.session = session;
try {
final AbstractClientFullSession fullSession = (AbstractClientFullSession) session;
// Show the loading view.
view.showLoading();
// Open the forms properties widget for the current session.
formPropertiesWidget
.bind(fullSession)
.show(() -> view.hideLoading());
done = true;
} catch (ClassCastException e) {
// No writteable session. Do not show properties until read mode available.
log(Level.INFO,
"Session discarded for opening as not instance of full session.");
}
}
if (!done) {
formPropertiesWidget.unbind();
view.hideLoading();
this.session = null;
}
}
@WorkbenchMenu
public Menus getMenu() {
return null;
}
@WorkbenchPartTitle
public String getTitle() {
return title;
}
@WorkbenchPartView
public IsWidget getWidget() {
// TODO: return view.asWidget() - See ProjectScreenViewImpl TODO;
return formPropertiesWidget.asWidget();
}
@WorkbenchContextId
public String getMyContextRef() {
return "projectDiagramPropertiesScreenContext";
}
void onFormPropertiesOpened(final @Observes FormPropertiesOpened propertiesOpened) {
if (null != session && session.equals(propertiesOpened.getSession())) {
updateTitle(propertiesOpened.getName());
}
}
private void updateTitle(final String title) {
// Change screen title.
ProjectDiagramPropertiesScreen.this.title = title;
changeTitleNotificationEvent.fire(new ChangeTitleWidgetEvent(placeRequest,
this.title));
}
private void log(final Level level,
final String message) {
if (LogConfiguration.loggingIsEnabled()) {
LOGGER.log(level,
message);
}
}
}