blob: fe83b6d52f71f49f8d706ceb66d09adaed78bfb9 [file] [log] [blame]
/**********************************************************************
* This file is part of "Object Teams Development Tooling"-Software
*
* Copyright 2006, 2007 Technical University Berlin, Germany.
*
* 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
* $Id: OutlineAdaptor.java 23438 2010-02-04 20:05:24Z stephan $
*
* Please visit http://www.eclipse.org/objectteams for updates and contact.
*
* Contributors:
* Technical University Berlin - Initial API and implementation
**********************************************************************/
package org.eclipse.objectteams.otdt.internal.ui.text;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.core.CompilationUnit;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.objectteams.otdt.core.IOTType;
import org.eclipse.objectteams.otdt.core.OTModelManager;
import org.eclipse.objectteams.otdt.internal.ui.Messages;
import org.eclipse.objectteams.otdt.ui.Util;
import base org.eclipse.jdt.internal.ui.text.JavaOutlineInformationControl;
import base org.eclipse.jdt.internal.ui.text.JavaOutlineInformationControl.OutlineContentProvider;
/**
* This team adapts the quick outline (Ctrl-O and Ctrl-O+Ctrl-O)
* - add method mappings
* - add role files (only when also showing inherited members)
* - hide generated methods/fields.
*
* @author stephan
* @since 0.9.18
*/
@SuppressWarnings({"restriction","decapsulation"})
public team class OutlineAdaptor
{
private static boolean activated = false;
public static void doActivate() {
if (!activated)
new OutlineAdaptor().activate(ALL_THREADS);
activated = true;
}
protected class OutlineContentProvider playedBy OutlineContentProvider
{
callin Object[] getChildren(TreePath path)
{
boolean processingTeam = false;
IOTType otElement = null;
// start with result from base call:
Object[] children = base.getChildren(path);
// inspect element
Object element = path.getFirstSegment();
if (element instanceof IType) {
IType type = (IType)element;
processingTeam = OTModelManager.isTeam(type);
otElement = OTModelManager.getOTElement(type);
// note: base.getChildren(otElement) can not answer inherited members!
}
if (otElement == null)
return children;
// filter out generated members:
children = Util.filterOTGenerated(children);
if (processingTeam && showRoleFiles()) {
// add role files:
try {
IType[] roleFiles = otElement.getRoleTypes(IOTType.ROLEFILE);
if (roleFiles != null)
return concatArrays(roleFiles, children);
} catch (JavaModelException e) {
// nop, did not improve
}
}
return children;
}
Object[] getChildren(TreePath element) <- replace Object[] getChildren(TreePath element);
boolean showRoleFiles() -> boolean isShowingInheritedMembers();
private Object[] concatArrays(Object[] array1, Object[] array2) {
int length1 = array1.length;
int length2 = array2.length;
if (length1 == 0)
return array2;
if (length2 == 0)
return array1;
Object[] result = new Object[length1+length2];
System.arraycopy(array1, 0, result, 0, length1);
System.arraycopy(array2, 0, result, length1, length2);
return result;
}
}
/** Adapt the control as to display an adapted help text if needed. */
protected class JavaOutlineInformationControl playedBy JavaOutlineInformationControl
{
/** Compute the info text possibly appending a note on role files. */
callin String getStatusFieldText() {
String msg = base.getStatusFieldText();
IJavaElement element = getInput();
if (element != null) {
if (element.getElementType() == IJavaElement.COMPILATION_UNIT) {
// find main type:
try {
IType[] types = ((CompilationUnit)element).getTypes();
if (types != null && types.length > 0)
element = types[0];
} catch (JavaModelException e) {
return msg;// simply won't update text upon exception
}
}
// update the info text only for teams:
if (element.getElementType() == IJavaElement.TYPE && OTModelManager.isTeam((IType)element))
msg += Messages.QuickOutline__and_role_files;
}
return msg;
}
getStatusFieldText <- replace getStatusFieldText;
/** Trigger re-computing the info text once the input element is set. */
void updateInfoText() {
updateStatusFieldText();
}
updateInfoText <- after setInput;
// Callouts:
IJavaElement getInput() -> get IJavaElement fInput;
void updateStatusFieldText() -> void updateStatusFieldText();
}
}