/*
* Copyright 2015 JBoss, by Red Hat, Inc
*
* 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.docks.view;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.Dependent;
import javax.enterprise.event.Event;
import javax.inject.Inject;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.user.client.ui.Widget;
import org.uberfire.client.docks.view.bars.DocksCollapsedBar;
import org.uberfire.client.docks.view.bars.DocksExpandedBar;
import org.uberfire.client.docks.view.menu.MenuBuilder;
import org.uberfire.client.mvp.AbstractWorkbenchScreenActivity;
import org.uberfire.client.mvp.Activity;
import org.uberfire.client.mvp.PlaceManager;
import org.uberfire.client.workbench.docks.UberfireDock;
import org.uberfire.client.workbench.docks.UberfireDockPosition;
import org.uberfire.client.workbench.docks.UberfireDocksContainer;
import org.uberfire.client.workbench.docks.UberfireDocksInteractionEvent;
import org.uberfire.mvp.ParameterizedCommand;
import org.uberfire.mvp.PlaceRequest;
@Dependent
public class DocksBars {
private PlaceManager placeManager;
private MenuBuilder menuBuilder;
private Event<UberfireDocksInteractionEvent> dockInteractionEvent;
private UberfireDocksContainer uberfireDocksContainer;
private List<DocksBar> docks = new ArrayList<>();
@Inject
public DocksBars(PlaceManager placeManager,
MenuBuilder menuBuilder,
Event<UberfireDocksInteractionEvent> dockInteractionEvent,
UberfireDocksContainer uberfireDocksContainer) {
this.placeManager = placeManager;
this.menuBuilder = menuBuilder;
this.dockInteractionEvent = dockInteractionEvent;
this.uberfireDocksContainer = uberfireDocksContainer;
}
public void setup() {
for (UberfireDockPosition uberfireDockPosition : UberfireDockPosition.values()) {
createDock(uberfireDockPosition);
}
}
private void createDock(UberfireDockPosition position) {
DocksBar docksBar = createDockBar(position);
uberfireDocksContainer.add(position,
docksBar.getCollapsedBar(),
docksBar.getCollapsedBarSize());
uberfireDocksContainer.add(position,
docksBar.getExpandedBar(),
docksBar.getExpandedBarSize());
uberfireDocksContainer.add(position,
docksBar.getDockResizeBar(),
docksBar.getDockResizeBarDefaultSize());
docksBar.configureResizeBar(createResizeCommand(docksBar));
docks.add(docksBar);
}
private DocksBar createDockBar(UberfireDockPosition position) {
DocksBar docksBar = new DocksBar(position);
return docksBar;
}
public void addDock(UberfireDock dock) {
DocksBar docksBar = getDockBar(dock);
docksBar.addDock(dock,
createDockSelectCommand(dock,
docksBar),
createDockDeselectCommand(dock,
docksBar));
}
DocksBar getDockBar(UberfireDock dock) {
for (DocksBar candidate : docks) {
if (candidate.getPosition().equals(dock.getDockPosition())) {
return candidate;
}
}
return null;
}
DocksBar getDockBar(UberfireDockPosition position) {
for (DocksBar candidate : docks) {
if (candidate.getPosition().equals(position)) {
return candidate;
}
}
return null;
}
ParameterizedCommand<Double> createResizeCommand(final DocksBar docksBar) {
return new ParameterizedCommand<Double>() {
@Override
public void execute(Double size) {
if (sizeIsValid(size,
docksBar)) {
docksBar.setExpandedSize(size);
uberfireDocksContainer.setWidgetSize(docksBar.getExpandedBar(),
docksBar.getExpandedBarSize());
docksBar.getExpandedBar().setupDockContentSize();
uberfireDocksContainer.resize();
dockInteractionEvent.fire(new UberfireDocksInteractionEvent(docksBar.getPosition(),
UberfireDocksInteractionEvent.InteractionType.RESIZED));
}
}
};
}
boolean sizeIsValid(Double size,
DocksBar docksBar) {
int max = calculateMaxSize(docksBar);
int minVisibleSize = 1;
return size > minVisibleSize && size < max;
}
private int calculateMaxSize(DocksBar docksBar) {
UberfireDockPosition position = docksBar.getPosition();
int collapsedSize = new Double(docksBar.getCollapsedBarSize()).intValue();
int max = 0;
if (position == UberfireDockPosition.SOUTH) {
max = uberfireDocksContainer.getOffsetHeight() - collapsedSize;
} else {
max = uberfireDocksContainer.getOffsetWidth() - 2 * collapsedSize;
}
return max;
}
public void clearAndCollapseAllDocks() {
collapseAll();
clearAll();
}
private void clearAll() {
for (DocksBar docksBar : getDocksBars()) {
docksBar.clearAll();
}
}
private void collapseAll() {
for (DocksBar docksBar : getDocksBars()) {
collapse(docksBar);
}
}
private void collapse(DocksBar docksBar) {
uberfireDocksContainer.hide(docksBar.getCollapsedBar());
uberfireDocksContainer.hide(docksBar.getExpandedBar());
uberfireDocksContainer.hide(docksBar.getDockResizeBar());
}
void collapse(Widget bar) {
uberfireDocksContainer.hide(bar);
}
public void clearAndCollapse(UberfireDockPosition position) {
DocksBar dockBar = getDockBar(position);
dockBar.clearAll();
collapse(dockBar);
resizeDeferred();
}
void resizeDeferred() {
Scheduler.get().scheduleDeferred(() -> uberfireDocksContainer.resize());
}
ParameterizedCommand<String> createDockSelectCommand(final UberfireDock targetDock,
final DocksBar docksBar) {
return clickDockName -> {
if (targetDock != null) {
selectDock(targetDock,
docksBar);
if (docksBar.isCollapsedBarInSingleMode()) {
collapse(docksBar.getCollapsedBar());
}
uberfireDocksContainer.resize();
dockInteractionEvent.fire(new UberfireDocksInteractionEvent(targetDock,
UberfireDocksInteractionEvent.InteractionType.SELECTED));
}
};
}
void selectDock(UberfireDock targetDock,
DocksBar docksBar) {
DocksCollapsedBar collapsedBar = docksBar.getCollapsedBar();
DocksExpandedBar expandedBar = docksBar.getExpandedBar();
PlaceRequest placeRequest = targetDock.getPlaceRequest();
setupCollapsedBar(targetDock,
collapsedBar);
setupExpandedBar(targetDock,
docksBar,
expandedBar);
expand(docksBar.getDockResizeBar());
placeManager.goTo(placeRequest,
expandedBar.targetPanel());
lookUpContextMenus(placeRequest,
docksBar.getExpandedBar());
}
private void lookUpContextMenus(PlaceRequest placeRequest,
DocksExpandedBar expandedBar) {
Activity activity = placeManager.getActivity(placeRequest);
if (activity instanceof AbstractWorkbenchScreenActivity) {
AbstractWorkbenchScreenActivity screen = (AbstractWorkbenchScreenActivity) activity;
if (screen.getMenus() != null) {
expandedBar.addMenus(screen.getMenus(),
menuBuilder);
}
}
}
private void setupCollapsedBar(UberfireDock targetDock,
DocksCollapsedBar collapsedBar) {
collapsedBar.setDockSelected(targetDock);
}
private void setupExpandedBar(UberfireDock targetDock,
DocksBar docksBar,
DocksExpandedBar expandedBar) {
expandedBar.clear();
expand(expandedBar);
setupExpandedBarSize(targetDock,
docksBar);
expandedBar.setup(targetDock.getLabel(),
createDockDeselectCommand(targetDock,
docksBar));
}
ParameterizedCommand<String> createDockDeselectCommand(final UberfireDock targetDock,
final DocksBar docksBar) {
return new ParameterizedCommand<String>() {
@Override
public void execute(String clickDockName) {
if (targetDock != null) {
deselectDock(docksBar);
if (docksBar.isCollapsedBarInSingleMode()) {
expand(docksBar.getCollapsedBar());
}
uberfireDocksContainer.resize();
;
dockInteractionEvent.fire(new UberfireDocksInteractionEvent(targetDock,
UberfireDocksInteractionEvent.InteractionType.DESELECTED));
}
}
};
}
void deselectDock(DocksBar docksBar) {
DocksCollapsedBar collapsedBar = docksBar.getCollapsedBar();
DocksExpandedBar dockExpandedBar = docksBar.getExpandedBar();
collapsedBar.deselectAllDocks();
dockExpandedBar.clear();
collapse(dockExpandedBar);
collapse(docksBar.getDockResizeBar());
}
private void setupExpandedBarSize(UberfireDock targetDock,
DocksBar docksBar) {
DocksExpandedBar expandedBar = docksBar.getExpandedBar();
if (thereIsASpecificSize(targetDock)) {
expandedBar.setPanelSize(targetDock.getSize().intValue(),
targetDock.getSize().intValue());
uberfireDocksContainer.setWidgetSize(expandedBar,
targetDock.getSize());
} else {
int width = uberfireDocksContainer.getClientWidth();
Double height = new Double(docksBar.getExpandedBarSize());
expandedBar.setPanelSize(width,
height.intValue());
uberfireDocksContainer.setWidgetSize(expandedBar,
docksBar.getExpandedBarSize());
}
}
private boolean thereIsASpecificSize(UberfireDock targetDock) {
return targetDock.getSize() != null;
}
public void expand(DocksBar docksBar) {
if (docksBar.hasDocksItems()) {
expand(docksBar.getCollapsedBar());
}
}
public void expand(UberfireDockPosition position) {
DocksBar dockBar = getDockBar(position);
if (dockBar.hasDocksItems()) {
expand(dockBar.getCollapsedBar());
}
}
public boolean isReady() {
return uberfireDocksContainer.isReady();
}
void expand(Widget widget) {
uberfireDocksContainer.show(widget);
}
private void collapse(DocksExpandedBar dock) {
dock.clear();
uberfireDocksContainer.hide(dock);
}
public List<DocksBar> getDocksBars() {
return docks;
}
public void setIDEdock(Boolean IDEdock) {
for (DocksBar dock : getDocksBars()) {
dock.setupDnD();
}
}
public void expand(UberfireDock dock) {
DocksBar dockBar = getDockBar(dock);
if (dockBar != null) {
dockBar.expand(dock);
}
}
}