/*
* 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.workbench.widgets.toolbar;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import com.google.gwt.user.client.ui.IsWidget;
import org.uberfire.client.mvp.Activity;
import org.uberfire.client.mvp.PlaceManager;
import org.uberfire.client.mvp.WorkbenchActivity;
import org.uberfire.client.workbench.events.ClosePlaceEvent;
import org.uberfire.client.workbench.events.PlaceGainFocusEvent;
import org.uberfire.mvp.PlaceRequest;
import org.uberfire.workbench.model.toolbar.ToolBar;
/**
* Presenter for WorkbenchToolBar that mediates changes to the Workbench ToolBar
* in response to changes to the selected WorkbenchPart. This implementation is
* specific to GWT. An alternative implementation should be considered for use
* within Eclipse.
*/
@ApplicationScoped
public class WorkbenchToolBarPresenter {
//Items relating to the Workbench as a whole
private final List<ToolBar> workbenchItems = new ArrayList<ToolBar>();
//Transient items relating to the current Workbench Perspective
private final List<ToolBar> workbenchPerspectiveItems = new ArrayList<ToolBar>();
//Transient items relating to the current WorkbenchPart context
private final Multimap<PlaceRequest, ToolBar> workbenchContextItems = ArrayListMultimap.create();
@Inject
private View view;
@Inject
private PlaceManager placeManager;
public IsWidget getView() {
return this.view;
}
public int getHeight() {
return this.view.getHeight();
}
public void hide() {
this.view.hide();
}
public void show() {
this.view.show();
}
/**
* Removes all the ToolBar items that were previously added for the given place, if any.
*/
private void removeItemsFor(final PlaceRequest place) {
Collection<ToolBar> removed = workbenchContextItems.removeAll(place);
for (final ToolBar toolBar : removed) {
view.removeToolBar(toolBar);
}
}
/**
* Adds all the ToolBar items associated with the given place to this
* toolbar. The exact list of items added is remembered, and can be removed
* later by a call to {@link #removeItemsFor(PlaceRequest)}.
* <p>
* The toolbar items are filtered for the current user subject to their
* security requirements.
* <p>
* This method becomes a no-op when any of the following is true:
* <ul>
* <li>The place doesn't have an associated {@link Activity}
* <li>The place's Activity is not a {@link WorkbenchActivity}
* <li>The place's WorkbenchActivity doesn't have a {@link ToolBar}
* </ul>
*/
public void addItemsFor(final PlaceRequest place) {
final Activity activity = placeManager.getActivity(place);
if (activity == null) {
return;
}
if (!(activity instanceof WorkbenchActivity)) {
return;
}
final WorkbenchActivity wbActivity = (WorkbenchActivity) activity;
final ToolBar toolBar = wbActivity.getToolBar();
if (toolBar == null) {
return;
}
final ToolBar filteredToolBar = filterToolBarItemsByPermission(toolBar);
if (!filteredToolBar.getItems().isEmpty()) {
workbenchContextItems.put(place,
filteredToolBar);
view.addToolBar(filteredToolBar);
}
}
/**
* Removes the toolbar items of a WorkbenchPart when that part is closed.
*/
@SuppressWarnings("unused")
private void onWorkbenchPartClose(@Observes ClosePlaceEvent event) {
removeItemsFor(event.getPlace());
}
/**
* Adds the toolbar items of a WorkbenchPart when that part is created.
* <p>
* TODO(UF-6): change this to observe PlaceOpenedEvent when such an event exists.
*/
@SuppressWarnings("unused")
private void onWorkbenchPartOnFocus(@Observes PlaceGainFocusEvent event) {
if (!workbenchContextItems.containsKey(event.getPlace())) {
addItemsFor(event.getPlace());
}
}
public void addWorkbenchItem(final ToolBar toolBar) {
final ToolBar filteredToolBar = filterToolBarItemsByPermission(toolBar);
if (!filteredToolBar.getItems().isEmpty()) {
workbenchItems.add(filteredToolBar);
view.addToolBar(filteredToolBar);
}
}
public void addWorkbenchPerspective(final ToolBar toolBar) {
final ToolBar filteredToolBar = filterToolBarItemsByPermission(toolBar);
if (!filteredToolBar.getItems().isEmpty()) {
workbenchPerspectiveItems.add(filteredToolBar);
view.addToolBar(filteredToolBar);
}
}
private ToolBar filterToolBarItemsByPermission(ToolBar toolBar) {
return toolBar; // TODO (UF-2)
}
public void clearWorkbenchItems() {
if (workbenchItems.isEmpty()) {
return;
}
for (ToolBar item : workbenchItems) {
view.removeToolBar(item);
}
workbenchItems.clear();
}
public void clearWorkbenchPerspectiveItems() {
if (workbenchPerspectiveItems.isEmpty()) {
return;
}
for (ToolBar item : workbenchPerspectiveItems) {
view.removeToolBar(item);
}
workbenchPerspectiveItems.clear();
}
/**
* View contract for an UberFire toolbar view.
*/
public interface View
extends
IsWidget {
/**
* Adds a set of Tool Bar items to the view. The Presenter has already verified that the user has permission to
* see the items in the given toolbar.
*/
void addToolBar(final ToolBar toolBar);
/**
* Removes a set of Tool Bar items from the view. Has no effect if the items were not already in this view.
*/
void removeToolBar(final ToolBar toolBar);
/**
* Returns the pixel height of this toolbar.
*/
int getHeight();
/**
* Makes this toolbar invisible.
*/
void hide();
/**
* Makes this toolbar visible.
*/
void show();
}
}