/*******************************************************************************
* Copyright (c) 2008, 2011 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
*******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring.gettersandsetters;
import java.util.Set;
import java.util.SortedSet;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Link;
import org.eclipse.ui.dialogs.ContainerCheckedTreeViewer;
import org.eclipse.ui.dialogs.PreferencesUtil;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.ui.preferences.NameStylePreferencePage;
import org.eclipse.cdt.internal.ui.refactoring.gettersandsetters.GetterSetterContext.FieldWrapper;
import org.eclipse.cdt.internal.ui.refactoring.gettersandsetters.GetterSetterInsertEditProvider.AccessorKind;
public class GenerateGettersAndSettersInputPage extends UserInputWizardPage implements IPreferenceChangeListener {
private GetterSetterContext context;
private ContainerCheckedTreeViewer variableSelectionView;
private GetterSetterLabelProvider labelProvider;
public GenerateGettersAndSettersInputPage(GetterSetterContext context) {
super(Messages.GettersAndSetters_Name);
this.context = context;
IEclipsePreferences node = InstanceScope.INSTANCE.getNode(CUIPlugin.PLUGIN_ID);
// We are listening for changes in the Name Style preferences
node.addPreferenceChangeListener(this);
}
public void createControl(Composite parent) {
Composite comp = new Composite(parent, SWT.NONE);
setTitle(Messages.GettersAndSetters_Name);
setMessage(Messages.GenerateGettersAndSettersInputPage_header);
comp.setLayout(new GridLayout(2, false));
createTree(comp);
GridData gd = new GridData(GridData.FILL_BOTH);
variableSelectionView.getTree().setLayoutData(gd);
Composite btComp = createButtonComposite(comp);
gd = new GridData();
gd.verticalAlignment = SWT.TOP;
btComp.setLayoutData(gd);
final Button placeImplemetation = new Button(comp, SWT.CHECK);
placeImplemetation.setText(Messages.GenerateGettersAndSettersInputPage_PlaceImplHeader);
gd = new GridData();
gd.horizontalSpan = 2;
gd.heightHint = 40;
placeImplemetation.setLayoutData(gd);
placeImplemetation.setSelection(context.isImplementationInHeader());
placeImplemetation.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
context.setImplementationInHeader(placeImplemetation.getSelection());
}
});
Link link= new Link(comp, SWT.WRAP);
link.setText(Messages.GenerateGettersAndSettersInputPage_LinkDescription);
link.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
String id = NameStylePreferencePage.PREF_ID;
PreferencesUtil.createPreferenceDialogOn(getShell(), id, new String [] { id }, null).open();
}
});
link.setToolTipText(Messages.GenerateGettersAndSettersInputPage_LinkTooltip);
gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
gd.grabExcessHorizontalSpace = true;
link.setLayoutData(gd);
setControl(comp);
}
private Composite createButtonComposite(Composite comp) {
Composite btComp = new Composite(comp, SWT.NONE);
FillLayout layout = new FillLayout(SWT.VERTICAL);
layout.spacing = 4;
btComp.setLayout(layout);
Button selectAll = new Button(btComp, SWT.PUSH);
selectAll.setText(Messages.GenerateGettersAndSettersInputPage_SelectAll);
selectAll.addSelectionListener(new SelectionAdapter(){
@Override
public void widgetSelected(SelectionEvent e) {
Object[] items = context.getElements(null);
SortedSet<GetterSetterInsertEditProvider> checkedFunctions = context.selectedFunctions;
for (Object treeItem : items) {
variableSelectionView.setChecked(treeItem, true);
Object[] childs = context.getChildren(treeItem);
for(Object currentElement : childs){
if (currentElement instanceof GetterSetterInsertEditProvider) {
GetterSetterInsertEditProvider editProvider = (GetterSetterInsertEditProvider) currentElement;
checkedFunctions.add(editProvider);
}
}
}
}
});
Button deselectAll = new Button(btComp, SWT.PUSH);
deselectAll.setText(Messages.GenerateGettersAndSettersInputPage_DeselectAll);
deselectAll.addSelectionListener(new SelectionAdapter(){
@Override
public void widgetSelected(SelectionEvent e) {
Object[] items = context.getElements(null);
for (Object treeItem : items) {
variableSelectionView.setChecked(treeItem, false);
}
context.selectedFunctions.clear();
}
});
Button selectGetter = new Button(btComp, SWT.PUSH);
selectGetter.setText(Messages.GenerateGettersAndSettersInputPage_SelectGetters);
selectGetter.addSelectionListener(new SelectionAdapter(){
@Override
public void widgetSelected(SelectionEvent e) {
selectMethods(AccessorKind.GETTER);
}
});
Button selectSetter = new Button(btComp, SWT.PUSH);
selectSetter.setText(Messages.GenerateGettersAndSettersInputPage_SelectSetters);
selectSetter.addSelectionListener(new SelectionAdapter(){
@Override
public void widgetSelected(SelectionEvent e) {
selectMethods(AccessorKind.SETTER);
}
});
return btComp;
}
private void selectMethods(AccessorKind type) {
Object[] items = context.getElements(null);
Set<GetterSetterInsertEditProvider> checked = context.selectedFunctions;
for (Object treeItem : items) {
if (treeItem instanceof FieldWrapper) {
FieldWrapper field = (FieldWrapper) treeItem;
Object[] funtions = context.getChildren(field);
for (Object funct : funtions) {
if (funct instanceof GetterSetterInsertEditProvider) {
GetterSetterInsertEditProvider getSet = (GetterSetterInsertEditProvider) funct;
if(getSet.getType() == type) {
checked.add(getSet);
variableSelectionView.setChecked(getSet, true);
}
}
}
}
}
}
private void createTree(Composite comp) {
variableSelectionView = new ContainerCheckedTreeViewer(comp, SWT.BORDER);
labelProvider = new GetterSetterLabelProvider();
variableSelectionView.setContentProvider(context);
variableSelectionView.setLabelProvider(labelProvider);
variableSelectionView.setAutoExpandLevel(3);
variableSelectionView.setInput(""); //$NON-NLS-1$
if (context.selectedName != null) {
String rawSignature = context.selectedName.getRawSignature();
for (Object obj : variableSelectionView.getVisibleExpandedElements()) {
if (obj instanceof FieldWrapper) {
if (obj.toString().contains(rawSignature)) {
variableSelectionView.setSubtreeChecked(obj, true);
}
}
}
}
Set<GetterSetterInsertEditProvider> checkedFunctions = context.selectedFunctions;
for (Object currentElement : variableSelectionView.getCheckedElements()) {
if (currentElement instanceof GetterSetterInsertEditProvider) {
GetterSetterInsertEditProvider editProvider = (GetterSetterInsertEditProvider) currentElement;
checkedFunctions.add(editProvider);
}
}
variableSelectionView.addCheckStateListener(new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent event) {
Set<GetterSetterInsertEditProvider> checkedFunctions = context.selectedFunctions;
for (Object currentElement : variableSelectionView.getCheckedElements()) {
if (currentElement instanceof GetterSetterInsertEditProvider) {
GetterSetterInsertEditProvider editProvider = (GetterSetterInsertEditProvider) currentElement;
checkedFunctions.add(editProvider);
}
}
}
});
}
public void preferenceChange(PreferenceChangeEvent event) {
if (variableSelectionView.getTree().isDisposed()) {
return;
}
if (GetterSetterNameGenerator.getGenerateGetterSettersPreferenceKeys().contains(event.getKey())) {
context.refresh();
variableSelectionView.refresh();
}
}
}