/*
* Copyright 2015 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.uberfire.client.mvp;
import java.util.Set;
import org.uberfire.client.annotations.WorkbenchPerspective;
import org.uberfire.client.workbench.PanelManager;
import org.uberfire.client.workbench.WorkbenchServicesProxy;
import org.uberfire.mvp.Command;
import org.uberfire.mvp.Commands;
import org.uberfire.mvp.ParameterizedCommand;
import org.uberfire.mvp.PlaceRequest;
import org.uberfire.workbench.model.PerspectiveDefinition;
/**
* The PerspectiveManager is responsible for the process of starting up a perspective, shutting down the current
* perspective, and switching between perspectives. This includes a sequence of asynchronous operations such as fetching
* any stored definition the current user has for the new perspective, and saving the definition when the user has
* modified it (for example, by dragging and dropping components, launching new activities, and so on).
* <p>
* Structurally, the PerspectiveManager performs actions at the request of the {@link PlaceManager}, and it accomplishes
* these actions by delegating to the {@link PanelManager} and {@link WorkbenchServicesProxy}.
*/
public interface PerspectiveManager {
/**
* Returns the current perspective's {@link PerspectiveActivity}. When the app first starts, this will be null. Once
* the workbench has bootstrapped, the return value will not be null again.
*/
PerspectiveActivity getCurrentPerspective();
/**
* Returns a description of the current perspective which reflects the current visible state of the user interface.
*/
PerspectiveDefinition getLivePerspectiveDefinition();
/**
* Saves the current live perspective definition to the server. Saved perspective definitions override the default
* definition produced by the {@link PerspectiveActivity#getDefaultPerspectiveLayout()} when switching to a new
* perspective. This method has no effect if the current perspective is transient.
* @param doWhenFinished action to execute after the save is complete (or immediately in the case of a transient perspective).
* Must not be null. To do nothing, use {@link Commands#DO_NOTHING}.
* @see WorkbenchPerspective#isTransient()
* @see PerspectiveActivity#isTransient()
*/
void savePerspectiveState(final Command doWhenFinished);
/**
* This method should only be invoked by PlaceManager. To launch a perspective within an UberFire app, pass a
* PlaceRequest for that perspective to {@link PlaceManager#goTo(org.uberfire.mvp.PlaceRequest)}.
* <p>
* Closes all current panels in the PanelManager (they must have already had their parts removed), then builds up
* the new panel arrangement based on the {@link PerspectiveDefinition} associated with the given perspective
* activity. If the given perspective is transient, its default perspective definition will always be used.
* Otherwise, the PerspectiveManager will first attempt to retrieve the current user's saved PerspectiveDefinition
* from the server, falling back on the default if none is found.
* @param placeRequest the placeRequest that originated the perspective to switch to. Must not be null.
* @param perspective the perspective to switch to. Must not be null.
* @param doWhenFinished The command to execute once the new perspective's panels have been created. Must not be null.
* <p>
* When the callback is invoked, the panels will be set up in their correct positions, but no parts will
* have been added.
*/
void switchToPerspective(final PlaceRequest placeRequest,
final PerspectiveActivity perspective,
final ParameterizedCommand<PerspectiveDefinition> doWhenFinished);
/**
* Retrieves the definitions of all the persisted perspectives.
* @param doWhenFinished The command to execute once the perspective definitions are retrieved.
*/
void loadPerspectiveStates(final ParameterizedCommand<Set<PerspectiveDefinition>> doWhenFinished);
/**
* This method removes any persisted definition for the given perspective. Subsequent requests for a previously
* persisted perspective should load the Perspective definition from the applicable object.
* @param doWhenFinished The command to execute once the perspective state have been removed. Must not be null.
*/
void removePerspectiveState(final String perspectiveId,
final Command doWhenFinished);
/**
* This method removes all persisted Perspective definitions. Subsequent requests for previously persisted
* perspectives should load the Perspective definition from the applicable object.
* @param doWhenFinished The command to execute once the perspective states have been removed. Must not be null.
*/
void removePerspectiveStates(final Command doWhenFinished);
}