blob: 6fad658de1afb07881fbf450b3f71a264e53fbf0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2012 Kai Toedter, Rushan R. Gilmullin and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Kai Toedter - initial API and implementation
* Rushan R. Gilmullin - completion
*******************************************************************************/
package org.eclipse.osbp.vaaclipse.behaviour;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.inject.Inject;
import org.eclipse.e4.core.commands.EHandlerService;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.services.events.IEventBroker;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.ui.MElementContainer;
import org.eclipse.e4.ui.model.application.ui.MUIElement;
import org.eclipse.e4.ui.model.application.ui.MUILabel;
import org.eclipse.e4.ui.model.application.ui.SideValue;
import org.eclipse.e4.ui.model.application.ui.advanced.MPerspective;
import org.eclipse.e4.ui.model.application.ui.advanced.MPerspectiveStack;
import org.eclipse.e4.ui.model.application.ui.advanced.MPlaceholder;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.e4.ui.model.application.ui.basic.MPartSashContainer;
import org.eclipse.e4.ui.model.application.ui.basic.MPartSashContainerElement;
import org.eclipse.e4.ui.model.application.ui.basic.MPartStack;
import org.eclipse.e4.ui.model.application.ui.basic.MTrimBar;
import org.eclipse.e4.ui.model.application.ui.basic.MTrimElement;
import org.eclipse.e4.ui.model.application.ui.basic.MTrimmedWindow;
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
import org.eclipse.e4.ui.model.application.ui.menu.MDirectToolItem;
import org.eclipse.e4.ui.model.application.ui.menu.MToolBar;
import org.eclipse.e4.ui.model.application.ui.menu.MToolItem;
import org.eclipse.e4.ui.model.application.ui.menu.impl.MenuFactoryImpl;
import org.eclipse.e4.ui.workbench.IPresentationEngine;
import org.eclipse.e4.ui.workbench.UIEvents;
import org.eclipse.e4.ui.workbench.UIEvents.EventTags;
import org.eclipse.e4.ui.workbench.modeling.EModelService;
import org.eclipse.e4.ui.workbench.modeling.EPartService;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
import org.eclipse.osbp.commons.geom.Bounds;
import org.eclipse.osbp.vaaclipse.api.Events;
import org.eclipse.osbp.vaaclipse.api.WidgetInfo;
import org.eclipse.osbp.vaaclipse.presentation.engine.PresentationEngine;
import org.eclipse.osbp.vaaclipse.presentation.renderers.GenericRenderer;
@SuppressWarnings("restriction")
public class MinMaxAddon {
public static final String ADDONS_MINMAX_TRIM_STACK_ID = "org.eclipse.osbp.vaaclipse.behaviour.trimStackId";
static final String ID_SUFFIX = "(minimized)"; //$NON-NLS-1$
// tags representing the min/max state
public static final String MINIMIZED = IPresentationEngine.MINIMIZED;
public static final String MAXIMIZED = IPresentationEngine.MAXIMIZED;
public static final String MINIMIZED_BY_ZOOM = IPresentationEngine.MINIMIZED_BY_ZOOM;
private final IEventBroker eventBroker;
private final EModelService modelService;
protected boolean ignoreTagChanges;
@Inject
private IEclipseContext context;
@Inject
EPartService partService;
@Inject
private EHandlerService handlerService;
@Inject
private WidgetInfo widgetInfo;
private Map<MToolBar, MPerspective> barPerspectiveInfo = new HashMap<MToolBar, MPerspective>();
private Set<MUIElement> minimizedElements = new HashSet<MUIElement>();
// TODO: dispose elements of this map
public Map<MToolItem, MPart> item2Element = new HashMap<MToolItem, MPart>();
public Map<MPart, MUIElement> part2element = new HashMap<MPart, MUIElement>();
@Inject
public MinMaxAddon(IEventBroker eventBroker, EModelService modelService,
MApplication application) {
this.eventBroker = eventBroker;
this.modelService = modelService;
}
private EventHandler widgetHandler = new EventHandler() {
public void handleEvent(org.osgi.service.event.Event event) {
Object changedObj = event.getProperty(UIEvents.EventTags.ELEMENT);
if (!minimizedElements.contains(changedObj))
return;
MUIElement minimizedElement = (MUIElement) changedObj;
if (minimizedElement.getWidget() != null) {
MToolBar toolBar = getToolBarForMinimizedElement(minimizedElement);
updateToolBar(minimizedElement, toolBar);
}
}
};
private EventHandler toBeRenderedHandler = new EventHandler() {
public void handleEvent(org.osgi.service.event.Event event) {
MUIElement changedElement = (MUIElement) event
.getProperty(UIEvents.EventTags.ELEMENT);
// if one of the kids changes state, re-scrape the CTF
MUIElement parentElement = changedElement.getParent();
if (minimizedElements.contains(parentElement)) {
updateToolBar(parentElement,
getToolBarForMinimizedElement(parentElement));
}
}
};
private EventHandler childrenHandler = new EventHandler() {
public void handleEvent(org.osgi.service.event.Event event) {
Object changedObj = event.getProperty(UIEvents.EventTags.ELEMENT);
// if a child has been added or removed, re-scape the CTF
if (minimizedElements.contains(changedObj)) {
updateToolBar((MUIElement) changedObj,
getToolBarForMinimizedElement((MUIElement) changedObj));
}
}
};
@PostConstruct
void postConstruct() {
eventBroker.subscribe(UIEvents.ApplicationElement.TOPIC_TAGS,
tagListener);
eventBroker.subscribe(UIEvents.ElementContainer.TOPIC_SELECTEDELEMENT,
selectPerspectiveHandler);
eventBroker.subscribe(UIEvents.UIElement.TOPIC_VISIBLE,
visibilityHandler);
eventBroker.subscribe(UIEvents.UIElement.TOPIC_WIDGET, widgetHandler);
eventBroker.subscribe(UIEvents.ElementContainer.TOPIC_CHILDREN,
childrenHandler);
eventBroker.subscribe(UIEvents.UIElement.TOPIC_TOBERENDERED,
toBeRenderedHandler);
// context.set(Behaviour.class, this);
}
@PreDestroy
void preDestroy() {
eventBroker.unsubscribe(tagListener);
eventBroker.unsubscribe(selectPerspectiveHandler);
eventBroker.unsubscribe(visibilityHandler);
eventBroker.unsubscribe(widgetHandler);
eventBroker.unsubscribe(childrenHandler);
eventBroker.unsubscribe(toBeRenderedHandler);
}
private final EventHandler tagListener = new EventHandler() {
@Override
public void handleEvent(Event event) {
if (ignoreTagChanges) {
return;
}
Object changedObj = event.getProperty(EventTags.ELEMENT);
String eventType = (String) event
.getProperty(UIEvents.EventTags.TYPE);
String tag = (String) event
.getProperty(UIEvents.EventTags.NEW_VALUE);
String oldVal = (String) event
.getProperty(UIEvents.EventTags.OLD_VALUE);
if (!(changedObj instanceof MUIElement)) {
return;
}
final MUIElement changedElement = (MUIElement) changedObj;
if (UIEvents.EventTypes.ADD.equals(eventType)) {
if (MINIMIZED.equals(tag)) {
minimize(changedElement);
} else if (MAXIMIZED.equals(tag)) {
maximize(changedElement);
}
} else if (UIEvents.EventTypes.REMOVE.equals(eventType)) {
if (MINIMIZED.equals(oldVal)) {
restore(changedElement);
} else if (MAXIMIZED.equals(oldVal)) {
unzoom(changedElement);
}
}
}
};
private EventHandler selectPerspectiveHandler = new EventHandler() {
public void handleEvent(Event event) {
Object element = event.getProperty(UIEvents.EventTags.ELEMENT);
if (!(element instanceof MPerspectiveStack))
return;
MPerspectiveStack stack = (MPerspectiveStack) element;
// Gather up the elements that are being 'hidden' by this change
MUIElement oldSel = (MUIElement) event
.getProperty(UIEvents.EventTags.OLD_VALUE);
if (oldSel != null) {
for (Map.Entry<MToolBar, MPerspective> entry : barPerspectiveInfo
.entrySet()) {
if (oldSel == entry.getValue()) {
MToolBar toolBar = entry.getKey();
if (toolBar.isVisible()) {
toolBar.setVisible(false);
}
}
}
}
if (stack.getSelectedElement() != null) {
for (Map.Entry<MToolBar, MPerspective> entry : barPerspectiveInfo
.entrySet()) {
if (stack.getSelectedElement() == entry.getValue()) {
MToolBar toolBar = entry.getKey();
if (!toolBar.isVisible()) {
toolBar.setVisible(true);
MTrimBar parentTrimBar = (MTrimBar) (MElementContainer<?>) toolBar
.getParent();
if (!parentTrimBar.isVisible())
parentTrimBar.setVisible(true);
}
}
}
}
}
};
private final EventHandler visibilityHandler = new EventHandler() {
@Override
public void handleEvent(Event event) {
MUIElement changedElement = (MUIElement) event
.getProperty(UIEvents.EventTags.ELEMENT);
if (changedElement instanceof MTrimElement) {
MTrimBar parentTrimBar = (MTrimBar) (MElementContainer<?>) changedElement
.getParent();
if (!parentTrimBar.isVisible())
return;
boolean hasVisibleChilds = false;
for (MTrimElement trimElelement : parentTrimBar.getChildren()) {
if (trimElelement.isVisible()) {
hasVisibleChilds = true;
break;
}
}
if (!hasVisibleChilds)
parentTrimBar.setVisible(false);
}
}
};
protected void minimize(MUIElement element) {
if (!element.isToBeRendered()) {
return;
}
MToolBar toolBar = createTrim(element);
element.setVisible(false);
minimizedElements.add(element);
// Activate a part other than the trimStack so that if the tool item is
// pressed
// immediately it will still open the stack.
partService.requestActivation();
// send the minimize event
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put(Events.MinMaxEvents.PARAMETER_ELEMENT, element);
parameters.put(Events.MinMaxEvents.PARAMETER_TOOLBAR, toolBar);
parameters.put(Events.MinMaxEvents.PARAMETER_TRIMBAR,
toolBar.getParent());
eventBroker
.send(Events.MinMaxEvents.EVENT_MINIMIZE_ELEMENT, parameters);
}
protected void unzoom(MUIElement element) {
MWindow win = modelService.getTopLevelWindowFor(element);
List<MPartStack> stacks = modelService.findElements(win, null,
MPartStack.class, null, EModelService.PRESENTATION);
for (MPartStack theStack : stacks) {
if (theStack.getWidget() != null
&& theStack.getTags().contains(MINIMIZED)
&& theStack.getTags().contains(MINIMIZED_BY_ZOOM)) {
theStack.getTags().remove(MINIMIZED);
}
}
List<MPlaceholder> placeholders = modelService.findElements(win, null,
MPlaceholder.class, null, EModelService.PRESENTATION);
for (MPlaceholder ph : placeholders) {
if (ph.getWidget() != null && ph.getTags().contains(MINIMIZED)
&& ph.getTags().contains(MINIMIZED_BY_ZOOM)) {
ph.getTags().remove(MINIMIZED);
}
}
}
public void resetWindows(MUIElement element) {
ignoreTagChanges = true;
MWindow window = modelService.getTopLevelWindowFor(element);
List<MPartStack> stacks = modelService.findElements(window, null,
MPartStack.class, null, EModelService.PRESENTATION);
for (MPartStack partStack : stacks) {
if (partStack.getWidget() != null) {
if (partStack.getTags().contains(MINIMIZED)) {
partStack.getTags().remove(MINIMIZED);
}
if (partStack.getTags().contains(MAXIMIZED)) {
partStack.getTags().remove(MAXIMIZED);
}
if (partStack.getTags().contains(MINIMIZED_BY_ZOOM)) {
partStack.getTags().remove(MINIMIZED_BY_ZOOM);
}
}
partStack.setVisible(true);
}
ignoreTagChanges = false;
if (window instanceof MTrimmedWindow) {
MTrimmedWindow trimmedWindow = (MTrimmedWindow) window;
List<MTrimBar> trimBars = trimmedWindow.getTrimBars();
for (MTrimBar trimBar : trimBars) {
if (trimBar.getSide() == SideValue.LEFT
|| trimBar.getSide() == SideValue.RIGHT) {
trimBar.getChildren().clear();
trimBar.setVisible(false);
}
}
}
}
protected void restore(MUIElement element) {
// if the element is minimized, then the widget of this element maybe
// (but not fact) detached from its real parent
// and attached to popup window and the widget's visible property is
// true. We must undo this changes
// before start the restore operation
Object currentParent = widgetInfo.getParent(element.getWidget());
Object realParent = element.getParent().getWidget();
if (currentParent != realParent) // if the current parent is not equal
// (or null) the real parent,
{// then reattach the widget to real parent
((GenericRenderer) element.getParent().getRenderer())
.processContents(element.getParent());
}
element.getTags().remove(MINIMIZED_BY_ZOOM);
element.getTags().remove(MINIMIZED);
element.setVisible(true);
minimizedElements.remove(element);
MTrimBar trimBar = getTrimBarForMinimizedElement(element);
MToolBar toolBar = getToolBarForMinimizedElement(element);
if (trimBar != null || toolBar != null) {
barPerspectiveInfo.remove(toolBar);
toolBar.setToBeRendered(false);
trimBar.getChildren().remove(toolBar);
if (trimBar.getChildren().size() == 0) {
trimBar.setVisible(false);
}
}
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put(Events.MinMaxEvents.PARAMETER_ELEMENT, element);
eventBroker.send(Events.MinMaxEvents.EVENT_RESTORE_ELEMENT, parameters);
}
protected void maximize(MUIElement element) {
if (!element.isToBeRendered()) {
return;
}
MWindow mWindow = getWindowFor(element);
MPerspective persp = modelService.getActivePerspective(mWindow);
List<String> maxTag = new ArrayList<String>();
maxTag.add(MAXIMIZED);
List<MUIElement> curMax = modelService
.findElements(persp == null ? mWindow : persp, null,
MUIElement.class, maxTag);
if (curMax.size() > 0) {
for (MUIElement maxElement : curMax) {
if (maxElement == element) {
continue;
}
ignoreTagChanges = true;
try {
maxElement.getTags().remove(MAXIMIZED);
} finally {
ignoreTagChanges = false;
}
}
}
// Stacks
List<MPartStack> stacks = modelService.findElements(
persp == null ? mWindow : persp, null, MPartStack.class, null,
EModelService.PRESENTATION);
for (MPartStack theStack : stacks) {
if (theStack == element || !theStack.isToBeRendered()) {
continue;
}
// Exclude stacks in DW's
// if (getWindowFor(theStack) != mWindow) {
// continue;
// }
int location = modelService.getElementLocation(theStack);
if (location != EModelService.IN_SHARED_AREA
&& theStack.getWidget() != null
&& !theStack.getTags().contains(MINIMIZED)) {
theStack.getTags().add(MINIMIZED_BY_ZOOM);
theStack.getTags().add(MINIMIZED);
}
}
// Placeholders
List<MPlaceholder> placeholders = modelService.findElements(
persp == null ? mWindow : persp, null, MPlaceholder.class,
null, EModelService.PRESENTATION);
for (MPlaceholder thePlaceholder : placeholders) {
if (thePlaceholder == element
|| !thePlaceholder.isToBeRendered()
|| !(thePlaceholder.getRef() instanceof MElementContainer<?>)) {
continue;
}
// Exclude stacks in DW's
// if (getWindowFor(thePlaceholder) != mWindow) {
// continue;
// }
int location = modelService.getElementLocation(thePlaceholder);
if (location != EModelService.IN_SHARED_AREA
&& thePlaceholder.getWidget() != null
&& !thePlaceholder.getTags().contains(MINIMIZED)) {
thePlaceholder.getTags().add(MINIMIZED_BY_ZOOM);
thePlaceholder.getTags().add(MINIMIZED);
}
}
}
private MWindow getWindowFor(MUIElement element) {
MUIElement parent = element.getParent();
// We rely here on the fact that a DW's 'getParent' will return
// null since it's not in the 'children' hierarchy
while (parent != null && !(parent instanceof MWindow)) {
parent = parent.getParent();
}
// A detached window will end up with getParent() == null
return (MWindow) parent;
}
private MToolBar createTrim(MUIElement element) {
MTrimmedWindow window = (MTrimmedWindow) getWindowFor(element);
MPerspective activePerspective = modelService
.getActivePerspective(window);
if (element.getElementId() == null)
element.setElementId(UUID.randomUUID().toString());
// Is there already a TrimControl there ?
String trimId = element.getElementId()
+ getMinimizedElementSuffix(element);
MToolBar toolBar = (MToolBar) modelService.find(trimId, window);
if (toolBar == null) {
toolBar = MenuFactoryImpl.eINSTANCE.createToolBar();
toolBar.setElementId(trimId);
// Check if we have a cached location
MTrimBar bar = getBarForElement(element, window);
bar.getChildren().add(toolBar);
bar.setVisible(true);
// get the parent trim bar, see bug 320756
PresentationEngine presentationEngine = (PresentationEngine) context
.get(IPresentationEngine.class);
updateToolBar(element, toolBar);
if (bar.getWidget() == null) {
// ask it to be rendered
bar.setToBeRendered(true);
// create the widget
presentationEngine.createGui(bar);
} else {
toolBar.setToBeRendered(true);
presentationEngine.createGui(toolBar);
}
} else {
// get the parent trim bar, see bug 320756
MUIElement parent = toolBar.getParent();
parent.setVisible(true);
if (parent.getWidget() == null) {
// ask it to be rendered
parent.setToBeRendered(true);
// create the widget
PresentationEngine presentationEngine = (PresentationEngine) context
.get(IPresentationEngine.class);
presentationEngine.createGui(parent);
}
updateToolBar(element, toolBar);
toolBar.setToBeRendered(true);
}
barPerspectiveInfo.put(toolBar, activePerspective);
return toolBar;
}
private void updateToolBar(MUIElement element, MToolBar toolBar) {
toolBar.getChildren().clear();
MDirectToolItem toolItem = MenuFactoryImpl.eINSTANCE
.createDirectToolItem();
toolItem.setIconURI("platform:/plugin/org.eclipse.osbp.vaaclipse.resources/VAADIN/themes/vaaclipse_default_theme/img/restore1.png");
toolItem.setContributionURI("bundleclass://org.eclipse.osbp.vaaclipse.behaviour/org.eclipse.osbp.vaaclipse.behaviour.RestoreHandler");
// toolItem.getTransientData().put("minimizedStack", element);
toolItem.setContainerData(element.getElementId());
toolBar.getChildren().add(toolItem);
if (element instanceof MPlaceholder) {
MDirectToolItem partItem = MenuFactoryImpl.eINSTANCE
.createDirectToolItem();
partItem.setElementId(UUID.randomUUID().toString());
partItem.setContributionURI("bundleclass://org.eclipse.osbp.vaaclipse.behaviour/org.eclipse.osbp.vaaclipse.behaviour.FastViewHandler");
MUILabel labelElement = getLabelElement(element);
if (labelElement != null) {
if (labelElement.getIconURI() != null
&& labelElement.getIconURI().trim().length() > 0)
partItem.setIconURI(labelElement.getIconURI());
else
partItem.setIconURI("platform:/plugin/org.eclipse.osbp.vaaclipse.resources/VAADIN/themes/vaaclipse_default_theme/img/editor_area.png");
toolBar.getChildren().add(partItem);
MPart part = getLeafPart(element);
item2Element.put(partItem, part);
part2element.put(part, element);
}
} else {
@SuppressWarnings("unchecked")
MElementContainer<MUIElement> partStack = (MElementContainer<MUIElement>) element;
for (MUIElement stackElement : partStack.getChildren()) {
if (!stackElement.isToBeRendered()) {
continue;
}
MUIElement el = stackElement instanceof MPlaceholder ? ((MPlaceholder) stackElement)
.getRef() : stackElement;
if (el instanceof MPart) {
MDirectToolItem partItem = MenuFactoryImpl.eINSTANCE
.createDirectToolItem();
partItem.setContributionURI("bundleclass://org.eclipse.osbp.vaaclipse.behaviour/org.eclipse.osbp.vaaclipse.behaviour.FastViewHandler");
MUILabel labelElement = getLabelElement(stackElement);
String iconURI = labelElement.getIconURI();
if (iconURI == null || iconURI.trim().isEmpty())
iconURI = "platform:/plugin/org.eclipse.osbp.vaaclipse.resources/VAADIN/themes/vaaclipse_default_theme/img/blank_part_label.png";
partItem.setIconURI(iconURI);
toolBar.getChildren().add(partItem);
item2Element.put(partItem, (MPart) el);
part2element.put((MPart) el, element);
}
}
}
}
private MPart getLeafPart(MUIElement element) {
if (element instanceof MPlaceholder)
return getLeafPart(((MPlaceholder) element).getRef());
if (element instanceof MElementContainer<?>)
return getLeafPart(((MElementContainer<?>) element)
.getSelectedElement());
if (element instanceof MPart)
return (MPart) element;
return null;
}
private MUILabel getLabelElement(MUIElement element) {
if (element instanceof MPlaceholder) {
element = ((MPlaceholder) element).getRef();
}
return (MUILabel) (element instanceof MUILabel ? element : null);
}
private MTrimBar getBarForElement(MUIElement element, MTrimmedWindow window) {
SideValue side = SideValue.LEFT;
// SideValue side = getCachedBar(element);
// if (side == null) {
Bounds winBounds = new Bounds(0, 0, 1000, 1000);
double winCenterX = winBounds.w / 2;
Bounds stackBounds = calculateBounds(element, window, winBounds);
if (stackBounds != null) {
double stackCenterX = stackBounds.x + (stackBounds.w / 2);
side = stackCenterX < winCenterX ? SideValue.LEFT : SideValue.RIGHT;
}
// }
MTrimBar bar = modelService.getTrim(window, side);
return bar;
}
private String getMinimizedElementSuffix(MUIElement element) {
String id = ID_SUFFIX;
MPerspective persp = modelService.getPerspectiveFor(element);
if (persp != null) {
id = '(' + persp.getElementId() + ')';
}
return id;
}
// @Override
public MTrimBar getTrimBarForMinimizedElement(MUIElement element) {
MToolBar toolBar = getToolBarForMinimizedElement(element);
return (MTrimBar) (MElementContainer<?>) toolBar.getParent();
}
// @Override
public MToolBar getToolBarForMinimizedElement(MUIElement element) {
MTrimmedWindow window = (MTrimmedWindow) getWindowFor(element);
String trimId = element.getElementId()
+ getMinimizedElementSuffix(element);
return (MToolBar) modelService.find(trimId, window);
}
// @Override
public MUIElement getMinimizedParentForPart(MPart part) {
return part2element.get(part);
}
private double parseContainerData(String containerData) {
if (containerData == null)
return 0.0d;
containerData = containerData.trim();
try {
return Double.parseDouble(containerData);
} catch (NumberFormatException e) {
return 0.0d;
}
}
private Bounds calculateBounds(MUIElement element, MUIElement container,
Bounds currentBounds) {
if (container == element) {
return currentBounds;
} else if (container instanceof MPartSashContainer) {
MPartSashContainer sash = (MPartSashContainer) container;
Map<MPartSashContainerElement, Double> weights = new HashMap<MPartSashContainerElement, Double>();
double total_weight = 0;
for (MPartSashContainerElement children : sash.getChildren()) {
if (children.isToBeRendered() && children.isVisible()
&& children.getWidget() != null /*
* element can be
* renderable but has no
* widget when removeGui
* called for element
*/) {
String data = children.getContainerData();
double weight = parseContainerData(data);
weights.put(children, weight);
total_weight += weight;
}
}
if (total_weight == 0.0) // all child elements has zero weight
total_weight = 1.0;
double sumWeightPrcnt = 0;
for (MPartSashContainerElement children : sash.getChildren()) {
Double w = weights.get(children);
if (w != null) {
double wPrcnt = w / total_weight;
Bounds newBounds;
if (sash.isHorizontal()) {
newBounds = new Bounds(currentBounds.x
+ currentBounds.w * sumWeightPrcnt,
currentBounds.y, currentBounds.w * wPrcnt,
currentBounds.h);
} else {
newBounds = new Bounds(currentBounds.x, currentBounds.y
+ currentBounds.h * sumWeightPrcnt,
currentBounds.w, currentBounds.h * wPrcnt);
}
sumWeightPrcnt += wPrcnt;
Bounds bounds = calculateBounds(element, children,
newBounds);
if (bounds != null)
return bounds;
}
}
} else if (container instanceof MElementContainer<?>) {
MElementContainer<MUIElement> _container = (MElementContainer<MUIElement>) container;
for (MUIElement child : _container.getChildren()) {
Bounds bounds = calculateBounds(element, child, currentBounds);
if (bounds != null)
return bounds;
}
}
return null;
}
}