/*******************************************************************************
* Copyright (c) 2008, 2012 Institute for Software, HSR Hochschule fuer Technik
* Rapperswil, University of applied sciences 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:
* Institute for Software - initial API and implementation
* Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring.gettersandsetters;
import java.util.ArrayList;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.internal.ui.refactoring.gettersandsetters.AccessorDescriptor.AccessorKind;
public class GetterSetterContext implements ITreeContentProvider {
final List<IASTDeclarator> existingFields = new ArrayList<IASTDeclarator>();
final List<IASTFunctionDefinition> existingFunctionDefinitions = new ArrayList<IASTFunctionDefinition>();
final List<IASTSimpleDeclaration> existingFunctionDeclarations = new ArrayList<IASTSimpleDeclaration>();
final SortedSet<AccessorDescriptor> selectedAccessors = new TreeSet<AccessorDescriptor>();
IASTName selectedName;
private List<FieldDescriptor> fieldDescriptors;
private boolean definitionSeparate;
private static final Object[] NO_CHILDREN = {};
@Override
public Object[] getChildren(Object parentElement) {
if (!(parentElement instanceof FieldDescriptor))
return NO_CHILDREN;
return ((FieldDescriptor) parentElement).getChildNodes();
}
@Override
public Object getParent(Object element) {
return null;
}
@Override
public boolean hasChildren(Object element) {
if (element instanceof FieldDescriptor) {
FieldDescriptor descriptor = (FieldDescriptor) element;
return descriptor.missingGetterOrSetter();
}
return false;
}
@Override
public Object[] getElements(Object inputElement) {
return getFieldDescriptors().toArray();
}
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
public void recreateFieldDescriptors() {
// Delete field descriptors so that they are recreated by the next getFieldDescriptors call.
fieldDescriptors = null;
SortedSet<AccessorDescriptor> oldSelected = new TreeSet<AccessorDescriptor>(selectedAccessors);
selectedAccessors.clear();
for (FieldDescriptor descriptor : getFieldDescriptors()) {
for (AccessorDescriptor accessor : descriptor.getChildNodes()) {
if (oldSelected.contains(accessor)) {
selectedAccessors.add(accessor);
}
}
}
}
public void selectAccessorForField(String name, AccessorKind kind) {
for (FieldDescriptor descriptor : getFieldDescriptors()) {
if (name.equals(String.valueOf(descriptor.getFieldName().getSimpleID()))) {
for (Object child : descriptor.getChildNodes()) {
AccessorDescriptor accessor = (AccessorDescriptor) child;
if (accessor.getKind() == kind) {
selectedAccessors.add(accessor);
break;
}
}
}
}
}
public boolean isDefinitionSeparate() {
return definitionSeparate;
}
public void setDefinitionSeparate(boolean definitionSeparate) {
this.definitionSeparate = definitionSeparate;
}
private List<FieldDescriptor> getFieldDescriptors() {
if (fieldDescriptors == null) {
fieldDescriptors = new ArrayList<FieldDescriptor>();
for (IASTDeclarator field : existingFields) {
FieldDescriptor descriptor = new FieldDescriptor(field, this);
if (descriptor.missingGetterOrSetter()) {
fieldDescriptors.add(descriptor);
}
}
}
return fieldDescriptors;
}
static IASTName getDeclaratorName(IASTDeclarator declarator) {
while (declarator.getNestedDeclarator() != null) {
declarator = declarator.getNestedDeclarator();
}
return declarator.getName();
}
static IASTName getDeclarationName(IASTSimpleDeclaration declaration) {
return getDeclaratorName(declaration.getDeclarators()[0]);
}
}