/*
* 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.workbench.client.docks;
import javax.enterprise.context.Dependent;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import org.kie.workbench.common.screens.datamodeller.client.DataModelerContext;
import org.kie.workbench.common.screens.datamodeller.client.context.DataModelerWorkbenchContext;
import org.kie.workbench.common.screens.datamodeller.client.context.DataModelerWorkbenchContextChangeEvent;
import org.kie.workbench.common.screens.datamodeller.client.context.DataModelerWorkbenchFocusEvent;
import org.kie.workbench.common.screens.library.api.preferences.LibraryInternalPreferences;
import org.kie.workbench.common.workbench.client.authz.WorkbenchFeatures;
import org.kie.workbench.common.workbench.client.resources.i18n.DefaultWorkbenchConstants;
import org.kie.workbench.common.workbench.client.resources.images.WorkbenchImageResources;
import org.uberfire.client.workbench.docks.UberfireDock;
import org.uberfire.client.workbench.docks.UberfireDockPosition;
import org.uberfire.client.workbench.docks.UberfireDockReadyEvent;
import org.uberfire.client.workbench.docks.UberfireDocks;
import org.uberfire.client.workbench.docks.UberfireDocksInteractionEvent;
import org.uberfire.mvp.PlaceRequest;
import org.uberfire.mvp.impl.DefaultPlaceRequest;
import org.uberfire.rpc.SessionInfo;
import org.uberfire.security.authz.AuthorizationManager;
@Dependent
public class AuthoringWorkbenchDocks {
protected DefaultWorkbenchConstants constants = DefaultWorkbenchConstants.INSTANCE;
protected UberfireDocks uberfireDocks;
protected DataModelerWorkbenchContext dataModelerWBContext;
protected SessionInfo sessionInfo;
protected LibraryInternalPreferences libraryInternalPreferences;
protected AuthorizationManager authorizationManager;
protected String authoringPerspectiveIdentifier;
protected UberfireDock projectExplorerDock;
protected boolean dataModelerIsHidden;
protected DataModelerContext lastActiveContext;
protected UberfireDock plannerDock = null;
protected String currentPerspectiveIdentifier = null;
protected boolean dataModelerDocksEnabled = true;
protected boolean projectExplorerEnabled = true;
@Inject
public AuthoringWorkbenchDocks(final UberfireDocks uberfireDocks,
final DataModelerWorkbenchContext dataModelerWBContext,
final AuthorizationManager authorizationManager,
final SessionInfo sessionInfo,
final LibraryInternalPreferences libraryInternalPreferences) {
this.uberfireDocks = uberfireDocks;
this.dataModelerWBContext = dataModelerWBContext;
this.authorizationManager = authorizationManager;
this.sessionInfo = sessionInfo;
this.libraryInternalPreferences = libraryInternalPreferences;
}
public void perspectiveChangeEvent(@Observes UberfireDockReadyEvent dockReadyEvent) {
currentPerspectiveIdentifier = dockReadyEvent.getCurrentPerspective();
if (authoringPerspectiveIdentifier != null && dockReadyEvent.getCurrentPerspective().equals(authoringPerspectiveIdentifier)) {
updatePlannerDock(authoringPerspectiveIdentifier);
if (projectExplorerEnabled) {
expandProjectExplorer();
}
}
}
private void updatePlannerDock(String perspectiveIdentifier) {
if (authorizationManager.authorize(WorkbenchFeatures.PLANNER_AVAILABLE,
sessionInfo.getIdentity())) {
if (plannerDock == null) {
plannerDock = new UberfireDock(UberfireDockPosition.EAST,
WorkbenchImageResources.INSTANCE.optaPlannerDisabledIcon(),
WorkbenchImageResources.INSTANCE.optaPlannerEnabledIcon(),
new DefaultPlaceRequest("PlannerDomainScreen"),
perspectiveIdentifier)
.withSize(450).withLabel(constants.DocksOptaPlannerTitle());
} else {
//avoid duplications
uberfireDocks.remove(plannerDock);
}
uberfireDocks.add(plannerDock);
} else if (plannerDock != null) {
uberfireDocks.remove(plannerDock);
}
}
public void setup(String authoringPerspectiveIdentifier,
PlaceRequest projectExplorerPlaceRequest) {
this.authoringPerspectiveIdentifier = authoringPerspectiveIdentifier;
projectExplorerDock = new UberfireDock(UberfireDockPosition.WEST,
"ADJUST",
projectExplorerPlaceRequest,
authoringPerspectiveIdentifier).withSize(400).withLabel(constants.DocksProjectExplorerTitle());
uberfireDocks.add(
projectExplorerDock,
new UberfireDock(UberfireDockPosition.EAST,
"RANDOM",
new DefaultPlaceRequest("DroolsDomainScreen"),
authoringPerspectiveIdentifier).withSize(450).withLabel(constants.DocksDroolsJBPMTitle()),
new UberfireDock(UberfireDockPosition.EAST,
"BRIEFCASE",
new DefaultPlaceRequest("JPADomainScreen"),
authoringPerspectiveIdentifier).withSize(450).withLabel(constants.DocksPersistenceTitle()),
new UberfireDock(UberfireDockPosition.EAST,
"COG",
new DefaultPlaceRequest("AdvancedDomainScreen"),
authoringPerspectiveIdentifier).withSize(450).withLabel(constants.DocksAdvancedTitle()),
new UberfireDock(UberfireDockPosition.EAST,
"PENCIL_SQUARE_O",
new DefaultPlaceRequest("ProjectDiagramPropertiesScreen"),
authoringPerspectiveIdentifier).withSize(450).withLabel(constants.DocksStunnerPropertiesTitle()),
new UberfireDock(UberfireDockPosition.EAST,
"EYE",
new DefaultPlaceRequest("ProjectDiagramExplorerScreen"),
authoringPerspectiveIdentifier).withSize(450).withLabel(constants.DocksStunnerExplorerTitle())
);
updatePlannerDock(authoringPerspectiveIdentifier);
uberfireDocks.disable(UberfireDockPosition.EAST,
authoringPerspectiveIdentifier);
dataModelerDocksEnabled = false;
}
public void onContextChange(@Observes DataModelerWorkbenchContextChangeEvent contextEvent) {
if (isAuthoringActive()) {
handleDocks();
}
}
public void onDataModelerWorkbenchFocusEvent(@Observes DataModelerWorkbenchFocusEvent event) {
if (isAuthoringActive()) {
if (!event.isFocused()) {
this.dataModelerIsHidden = true;
enableDocks(false);
} else {
this.dataModelerIsHidden = false;
handleDocks();
}
}
}
public boolean isAuthoringActive() {
return authoringPerspectiveIdentifier != null &&
authoringPerspectiveIdentifier.equals(currentPerspectiveIdentifier);
}
private void enableDocks(boolean enabled) {
if (enabled != dataModelerDocksEnabled) {
dataModelerDocksEnabled = enabled;
if (enabled) {
uberfireDocks.enable(UberfireDockPosition.EAST,
authoringPerspectiveIdentifier);
} else {
uberfireDocks.disable(UberfireDockPosition.EAST,
authoringPerspectiveIdentifier);
}
}
}
private void handleDocks() {
DataModelerContext context = dataModelerWBContext.getActiveContext();
if (!dataModelerIsHidden && shouldDisplayWestDocks(context) && lastActiveContext != context) {
enableDocks(true);
lastActiveContext = context;
} else if (dataModelerIsHidden || !shouldDisplayWestDocks(context)) {
enableDocks(false);
lastActiveContext = null;
}
}
private boolean shouldDisplayWestDocks(DataModelerContext context) {
return context != null && context.getEditionMode() == DataModelerContext.EditionMode.GRAPHICAL_MODE;
}
public void hide() {
uberfireDocks.disable(UberfireDockPosition.WEST,
authoringPerspectiveIdentifier);
enableDocks(false);
projectExplorerEnabled = false;
}
public void show() {
uberfireDocks.enable(UberfireDockPosition.WEST,
authoringPerspectiveIdentifier);
handleDocks();
projectExplorerEnabled = true;
libraryInternalPreferences.load(loadedLibraryInternalPreferences -> {
if (loadedLibraryInternalPreferences.isProjectExplorerExpanded()) {
expandProjectExplorer();
}
},
parameter -> {
});
}
public void expandProjectExplorer() {
if (projectExplorerDock != null) {
uberfireDocks.expand(projectExplorerDock);
}
}
public void projectExplorerExpandedEvent(@Observes final UberfireDocksInteractionEvent uberfireDocksInteractionEvent) {
final UberfireDock targetDock = uberfireDocksInteractionEvent.getTargetDock();
if (targetDock == null) {
return;
}
if (targetDock.equals(projectExplorerDock)) {
final UberfireDocksInteractionEvent.InteractionType interactionType = uberfireDocksInteractionEvent.getType();
if (interactionType.equals(UberfireDocksInteractionEvent.InteractionType.SELECTED)) {
setProjectExplorerExpandedPreference(true);
} else if (interactionType.equals(UberfireDocksInteractionEvent.InteractionType.DESELECTED)) {
setProjectExplorerExpandedPreference(false);
}
}
}
void setProjectExplorerExpandedPreference(final boolean expand) {
libraryInternalPreferences.load(loadedLibraryInternalPreferences -> {
if (expand != loadedLibraryInternalPreferences.isProjectExplorerExpanded()) {
loadedLibraryInternalPreferences.setProjectExplorerExpanded(expand);
loadedLibraryInternalPreferences.save();
}
},
error -> {
});
}
}