blob: a4ddd5c147052f8586b8d55485dd78b9eea3165a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2015 Tasktop Technologies and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.context.ui.state;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.WorkbenchPage;
/**
* Provides access to E4 API using reflection to avoid compile time dependencies.
*
* @author Steffen Pingel
*/
// TODO e4.2 remove reflection
public class E4EditorReflector {
private static final String MODEL_ELEMENT_ID = "org.eclipse.e4.ui.compatibility.editor"; //$NON-NLS-1$
Class<?> eModelServiceClazz;
Class<?> mUiElementClazz;
Class<?> mPartClazz;
private Class<?> ePartServiceClazz;
private Class<?> partStateClazz;
private Class<?> mApplicationElementClazz;
public E4EditorReflector() {
try {
eModelServiceClazz = Class.forName("org.eclipse.e4.ui.workbench.modeling.EModelService"); //$NON-NLS-1$
ePartServiceClazz = Class.forName("org.eclipse.e4.ui.workbench.modeling.EPartService"); //$NON-NLS-1$
partStateClazz = Class.forName("org.eclipse.e4.ui.workbench.modeling.EPartService$PartState"); //$NON-NLS-1$
mUiElementClazz = Class.forName("org.eclipse.e4.ui.model.application.ui.MUIElement"); //$NON-NLS-1$
mPartClazz = Class.forName("org.eclipse.e4.ui.model.application.ui.basic.MPart"); //$NON-NLS-1$
mApplicationElementClazz = Class.forName("org.eclipse.e4.ui.model.application.MApplicationElement"); //$NON-NLS-1$
} catch (Exception e) {
throw handleException(e);
}
}
private RuntimeException handleException(Exception e) {
return new RuntimeException(e);
}
public List<?> findElements(IWorkbenchPage page) {
try {
// page.getWindowModel()
Method getWindowModel = page.getClass().getDeclaredMethod("getWindowModel"); //$NON-NLS-1$
Object windowModel = getWindowModel.invoke(page);
// EModelService modelService = PlatformUI.getWorkbench().getService(EModelService.class);
Object modelService = getModelService();
Method findElements = eModelServiceClazz.getDeclaredMethod("findElements", mUiElementClazz, String.class, //$NON-NLS-1$
Class.class, List.class, int.class);
//List<MPart> editors = modelService.findElements(page.getWindowModel(), CompatibilityEditor.MODEL_ELEMENT_ID, MPart.class, null, EModelService.IN_SHARED_AREA);
List<?> editors = (List<?>) findElements.invoke(modelService, windowModel, MODEL_ELEMENT_ID, mPartClazz,
null, 0x08);
return editors;
} catch (Exception e) {
throw handleException(e);
}
}
private Object getModelService() {
return PlatformUI.getWorkbench().getService(eModelServiceClazz);
}
private Object getPartService(IWorkbenchWindow window) {
return window.getService(ePartServiceClazz);
}
public Map<String, String> getPersistedState(Object editor) {
try {
//String state = editor.getPersistedState().get("memento");
Method getPersistedStateMethod = mApplicationElementClazz.getDeclaredMethod("getPersistedState"); //$NON-NLS-1$
Map<String, String> persistedState = (Map<String, String>) getPersistedStateMethod.invoke(editor);
return persistedState;
} catch (Exception e) {
throw handleException(e);
}
}
public Object createPart(IWorkbenchWindow window) {
try {
Object partService = getPartService(window);
// MPart editor = partService.createPart(CompatibilityEditor.MODEL_ELEMENT_ID);
Method method = ePartServiceClazz.getDeclaredMethod("createPart", String.class); //$NON-NLS-1$
return method.invoke(partService, MODEL_ELEMENT_ID);
} catch (Exception e) {
throw handleException(e);
}
}
public IEditorReference showPart(WorkbenchPage page, Object editorPart) {
try {
//EditorReference reference = page.createEditorReferenceForPart(editor, null, editor.getElementId(), null);
Method method = mApplicationElementClazz.getDeclaredMethod("getElementId"); //$NON-NLS-1$
String elementId = (String) method.invoke(editorPart);
method = WorkbenchPage.class.getDeclaredMethod("createEditorReferenceForPart", mPartClazz, //$NON-NLS-1$
IEditorInput.class, String.class, IMemento.class);
Object editorReference = method.invoke(page, editorPart, null, elementId, null);
Object partService = getPartService(page.getWorkbenchWindow());
// PartState.ACTIVATE
Object partStateActivate = partStateClazz.getEnumConstants()[0];
//partService.showPart(editor, PartState.ACTIVATE);
method = ePartServiceClazz.getDeclaredMethod("showPart", mPartClazz, partStateClazz); //$NON-NLS-1$
method.invoke(partService, editorPart, partStateActivate);
return (IEditorReference) editorReference;
} catch (Exception e) {
throw handleException(e);
}
}
}