blob: 1740e8d68c829b33b03b43eb379d559ab08d8f6c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2010 IBM Corporation 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
*
*******************************************************************************/
package org.eclipse.jdt.internal.ui.callhierarchy;
import java.util.Iterator;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.PlatformUI;
import org.eclipse.jdt.internal.corext.callhierarchy.CallerMethodWrapper;
import org.eclipse.jdt.internal.corext.callhierarchy.RealCallers;
import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
/**
* The action to expand the selected member hierarchy with constructor calls.
*
* @since 3.5
*/
class ExpandWithConstructorsAction extends Action {
/**
* The call hierarchy view part.
*/
private CallHierarchyViewPart fPart;
/**
* The call hierarchy viewer.
*/
private CallHierarchyViewer fCallHierarchyViewer;
/**
* Creates the action for expanding the hierarchy with constructor calls.
*
* @param callHierarchyViewPart the call hierarchy view part
* @param callHierarchyViewer the call hierarchy viewer
*/
public ExpandWithConstructorsAction(CallHierarchyViewPart callHierarchyViewPart, CallHierarchyViewer callHierarchyViewer) {
super(CallHierarchyMessages.ExpandWithConstructorsAction_expandWithConstructors_text, AS_CHECK_BOX);
fPart= callHierarchyViewPart;
fCallHierarchyViewer= callHierarchyViewer;
setDescription(CallHierarchyMessages.ExpandWithConstructorsAction_expandWithConstructors_description);
setToolTipText(CallHierarchyMessages.ExpandWithConstructorsAction_expandWithConstructors_tooltip);
PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IJavaHelpContextIds.CALL_HIERARCHY_EXPAND_WITH_CONSTRUCTORS_ACTION);
}
/*
* @see Action#run
*/
@Override
public void run() {
boolean isChecked= isChecked();
fCallHierarchyViewer.cancelJobs();
IStructuredSelection selection= (IStructuredSelection)getSelection();
for (Iterator<?> iter= selection.iterator(); iter.hasNext();) {
CallerMethodWrapper member= (CallerMethodWrapper)iter.next();
member.setExpandWithConstructors(isChecked);
if (!isChecked) { // must collapse before refresh
fCallHierarchyViewer.setExpandedState(member, false);
}
fCallHierarchyViewer.refresh(member);
if (isChecked) { // expand only after refresh
fCallHierarchyViewer.setExpandedState(member, true);
fCallHierarchyViewer.expandConstructorNode();
}
}
}
/**
* Gets the selection from the call hierarchy view part.
*
* @return the current selection
*/
private ISelection getSelection() {
return fPart.getSelection();
}
/**
* Checks whether this action can be added for the selected element in the call hierarchy.
*
* @return <code> true</code> if the action can be added, <code>false</code> otherwise
*/
public boolean canActionBeAdded() {
if (fPart.getCallMode() == CallHierarchyViewPart.CALL_MODE_CALLEES)
return false;
ISelection selection= getSelection();
if (selection.isEmpty())
return false;
boolean allElementsChecked= true;
IStructuredSelection structuredSelection= (IStructuredSelection)selection;
CallerMethodWrapper[] wrappers= new CallerMethodWrapper[structuredSelection.size()];
int i= 0;
for (Iterator<?> iter= structuredSelection.iterator(); iter.hasNext(); i++) {
Object element= iter.next();
if (!(element instanceof CallerMethodWrapper) || element instanceof RealCallers)
return false;
wrappers[i]= (CallerMethodWrapper)element;
if (!CallHierarchyContentProvider.canExpandWithConstructors(wrappers[i]))
return false;
for (int j= 0; j < i; j++) {
CallerMethodWrapper parent= (CallerMethodWrapper)wrappers[j].getParent();
while (parent != null) {
if (wrappers[i] == parent) {
return false;// disable if element is a parent of other selected elements
}
parent= (CallerMethodWrapper)parent.getParent();
}
CallerMethodWrapper parentElement= (CallerMethodWrapper)wrappers[i].getParent();
while (parentElement != null) {
if (parentElement == wrappers[j]) {
return false;// disable if element is a child of other selected elements
}
parentElement= (CallerMethodWrapper)parentElement.getParent();
}
}
CallHierarchyContentProvider.ensureDefaultExpandWithConstructors(wrappers[i]);
if (!wrappers[i].getExpandWithConstructors()) {
allElementsChecked= false;
}
}
if (allElementsChecked) {
setChecked(true);
} else {
setChecked(false);
}
return true;
}
}