blob: be5c7a85c92910f9429290b34e973556598ae5b5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 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:
* Rushan R. Gilmullin - initial API and implementation
*******************************************************************************/
package org.eclipse.osbp.vaaclipse.behaviour;
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.SideValue;
import org.eclipse.e4.ui.model.application.ui.basic.MPartSashContainer;
import org.eclipse.e4.ui.model.application.ui.basic.MPartStack;
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
/**
* @author rushan
*
*/
class HierarchyUtils {
private static class TabSheetMatchPredicate implements Predicate {
MUIElement tabSheet;
public TabSheetMatchPredicate(MUIElement tabSheet) {
this.tabSheet = tabSheet;
}
public boolean predicate(MUIElement component) {
return component == tabSheet;
}
}
private static class HorizontalSplitPaneMatchPredicate implements Predicate {
MUIElement tabSheet;
public HorizontalSplitPaneMatchPredicate(MUIElement tabSheet) {
this.tabSheet = tabSheet;
}
public boolean predicate(MUIElement component) {
return component == tabSheet
|| (component instanceof MPartSashContainer && ((MPartSashContainer) component)
.isHorizontal());
}
}
private static class VerticalSplitPaneMatchPredicate implements Predicate {
MUIElement tabSheet;
public VerticalSplitPaneMatchPredicate(MUIElement tabSheet) {
this.tabSheet = tabSheet;
}
public boolean predicate(MUIElement component) {
return component == tabSheet
|| (component instanceof MPartSashContainer && !((MPartSashContainer) component)
.isHorizontal());
}
}
public static SideValue findNearestSide(MWindow pageComponent,
MUIElement component) {
if (pageComponent.getChildren().isEmpty()
|| !(pageComponent.getChildren().get(0) instanceof MElementContainer<?>))
return SideValue.LEFT;
MElementContainer<?> rootComponent = (MElementContainer<?>) pageComponent
.getChildren().get(0);
if (rootComponent instanceof MPartSashContainer
&& ((MPartSashContainer) rootComponent).isHorizontal()) {
MPartSashContainer hsp = (MPartSashContainer) rootComponent;
if (findInTree(hsp.getChildren().get(0),
new TabSheetMatchPredicate(component)) != null)
return SideValue.LEFT;
else {
MUIElement comp = findInTree(hsp.getChildren().get(1),
new VerticalSplitPaneMatchPredicate(component));
if (comp instanceof MPartStack)
return SideValue.RIGHT;
else if (comp instanceof MPartSashContainer
&& !((MPartSashContainer) comp).isHorizontal()) {
if (findInTree(((MPartSashContainer) comp).getChildren()
.get(0), new TabSheetMatchPredicate(component)) != null)
return SideValue.RIGHT;
else if (findInTree(((MPartSashContainer) comp)
.getChildren().get(1), new TabSheetMatchPredicate(
component)) != null)
return SideValue.BOTTOM;
}
}
} else if (rootComponent instanceof MPartSashContainer
&& !((MPartSashContainer) rootComponent).isHorizontal()) {
MPartSashContainer vsp = (MPartSashContainer) rootComponent;
if (findInTree(vsp.getChildren().get(1),
new TabSheetMatchPredicate(component)) != null) {
return SideValue.BOTTOM;
} else {
MUIElement comp = findInTree(vsp.getChildren().get(0),
new HorizontalSplitPaneMatchPredicate(component));
if (comp instanceof MPartStack)
return SideValue.RIGHT;
else if (comp instanceof MPartSashContainer
&& ((MPartSashContainer) comp).isHorizontal()) {
if (findInTree(((MPartSashContainer) comp).getChildren()
.get(0), new TabSheetMatchPredicate(component)) != null)
return SideValue.LEFT;
else if (findInTree(((MPartSashContainer) comp)
.getChildren().get(1), new TabSheetMatchPredicate(
component)) != null)
return SideValue.RIGHT;
}
}
} else if (rootComponent == component)
return SideValue.RIGHT;
return null;
}
private static MUIElement findInTree(MUIElement parent, Predicate predicate) {
if (parent instanceof MPartSashContainer) {
if (predicate.predicate(parent))
return parent;
else {
MPartSashContainer splitPanel = (MPartSashContainer) parent;
MUIElement findedComponent = findInTree(
(MElementContainer<MUIElement>) splitPanel
.getChildren().get(0), predicate);
if (findedComponent != null)
return findedComponent;
else
return findInTree(
(MElementContainer<MUIElement>) splitPanel
.getChildren().get(1), predicate);
}
} else if (parent instanceof MElementContainer<?>) {
if (predicate.predicate(parent))
return parent;
else
return null;
}
return null;
}
private static interface Predicate {
boolean predicate(MUIElement component);
}
}