blob: ccec7441ba3d348741aa8f6bf1d07a6f9fc89ec4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013, 2019 IBM Corporation and others.
*
* 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:
* IBM Corporation - initial API and implementation
******************************************************************************/
package org.eclipse.e4.ui.workbench.addons.splitteraddon;
import java.lang.annotation.Annotation;
import java.util.List;
import javax.inject.Inject;
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
import org.eclipse.e4.core.di.annotations.Optional;
import org.eclipse.e4.ui.di.Focus;
import org.eclipse.e4.ui.di.Persist;
import org.eclipse.e4.ui.di.PersistState;
import org.eclipse.e4.ui.di.UIEventTopic;
import org.eclipse.e4.ui.internal.workbench.swt.Policy;
import org.eclipse.e4.ui.internal.workbench.swt.WorkbenchSWTActivator;
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.basic.MCompositePart;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.e4.ui.workbench.UIEvents;
import org.eclipse.e4.ui.workbench.modeling.EModelService;
import org.eclipse.e4.ui.workbench.modeling.EPartService;
import org.eclipse.swt.widgets.Control;
import org.osgi.service.event.Event;
/**
* Support containment of split internal parts.
*/
public class SplitHost {
@Inject
EModelService ms;
@Inject
EPartService ps;
@Inject
MCompositePart myPart;
/**
* The Contributing URI value that is set for the MCompositePart associated with this SplitHost.
*/
public static String SPLIT_HOST_CONTRIBUTOR_URI = "bundleclass://org.eclipse.e4.ui.workbench.addons.swt/org.eclipse.e4.ui.workbench.addons.splitteraddon.SplitHost"; //$NON-NLS-1$
List<MPart> getSubParts() {
return ms.findElements(myPart, null, MPart.class);
}
MPart findInnerActive(MCompositePart outer) {
MPart innerActive = null;
MUIElement curParent = outer;
while (innerActive == null && curParent != null) {
if (curParent instanceof MElementContainer<?>) {
MElementContainer<?> container = (MElementContainer<?>) curParent;
if (container.getSelectedElement() instanceof MPart) {
innerActive = (MPart) container.getSelectedElement();
} else if (container.getSelectedElement() instanceof MElementContainer<?>) {
curParent = container.getSelectedElement();
} else {
curParent = null;
}
}
}
return innerActive;
}
@Inject
@Optional
void tbrHandler(@UIEventTopic(UIEvents.Dirtyable.TOPIC_DIRTY) Event eventData) {
MUIElement changedElement = (MUIElement) eventData.getProperty(UIEvents.EventTags.ELEMENT);
if (!isOneOfMyParts(changedElement)) {
return;
}
boolean isDirty = false;
List<MPart> kids = getSubParts();
kids.remove(0);
for (MPart subPart : kids) {
isDirty |= subPart.isDirty();
}
myPart.setDirty(isDirty);
}
private boolean isOneOfMyParts(MUIElement changedElement) {
MElementContainer<MUIElement> parent = changedElement.getParent();
Object parentObj = parent;
while (parent != null && parentObj != myPart) {
parent = parent.getParent();
parentObj = parent;
}
return parentObj == myPart;
}
void callingAllParts(Class<? extends Annotation> clz) {
List<MPart> parts = ms.findElements(myPart, null, MPart.class);
for (MPart part : parts) {
if (part == myPart) {
continue;
}
Control ctrl = (Control) part.getWidget();
if (part.getObject() != null && ctrl != null && !ctrl.isDisposed()) {
ContextInjectionFactory.invoke(part.getObject(), clz, part.getContext(), null);
}
}
}
@Persist
void persist() {
callingAllParts(Persist.class);
}
@PersistState
void persistState() {
callingAllParts(PersistState.class);
}
@Focus
void setFocus() {
MPart ap = findInnerActive(myPart);
if (ap == null) {
if (Policy.DEBUG_FOCUS) {
WorkbenchSWTActivator.trace(Policy.DEBUG_FOCUS_FLAG, "Focus not set, no selected element in: " + myPart, //$NON-NLS-1$
new IllegalStateException());
}
return;
}
Control ctrl = (Control) ap.getWidget();
Object object = ap.getObject();
if (object != null && ctrl != null && !ctrl.isDisposed()) {
ContextInjectionFactory.invoke(object, Focus.class, ap.getContext(), null);
} else {
if (Policy.DEBUG_FOCUS) {
WorkbenchSWTActivator.trace(Policy.DEBUG_FOCUS_FLAG,
"Focus not set, object is null or widget is disposed: " + object, new IllegalStateException()); //$NON-NLS-1$
}
}
}
// @PostConstruct
// void createWidget(Composite parent) {
// System.out.println("New Split Host");
// Composite newComp = new Composite(parent, SWT.NONE);
// newComp.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_DARK_GREEN));
// newComp.setLayout(new FillLayout());
// }
}