/*******************************************************************************
* Copyright (c) 2008, 2009 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.extractfunction;
import java.util.ArrayList;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Event;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.internal.ui.refactoring.NodeContainer.NameInformation;
public class ChooserComposite extends Composite {
private static final String COLUMN_RETURN = Messages.ChooserComposite_Return;
private static final String COLUMN_REFERENCE = Messages.ChooserComposite_CallByRef;
private static final String COLUMN_NAME = Messages.ChooserComposite_Name;
private static final String COLUMN_TYPE = Messages.ChooserComposite_Type;
private Button voidReturn;
private final ExtractFunctionInputPage ip;
public ChooserComposite(Composite parent,
final ExtractFunctionInformation info, ExtractFunctionInputPage ip) {
super(parent, SWT.NONE);
this.ip = ip;
GridLayout layout = new GridLayout();
setLayout(layout);
boolean hasNoPredefinedReturnValue = true;
if (info.getInScopeDeclaredVariable() != null) {
hasNoPredefinedReturnValue = false;
}
final ArrayList<Button> returnButtons = new ArrayList<Button>();
final ArrayList<Button> referenceButtons = new ArrayList<Button>();
final Table table = new Table(parent, SWT.BORDER | SWT.MULTI | SWT.FILL);
GridData tableLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
table.setLayoutData(tableLayoutData);
table.setLinesVisible(true);
table.setHeaderVisible(true);
addColumnToTable(table, COLUMN_TYPE);
addColumnToTable(table, COLUMN_NAME);
addColumnToTable(table, COLUMN_REFERENCE);
addColumnToTable(table, Messages.ChooserComposite_const);
if(!info.isExtractExpression()) {
addColumnToTable(table, COLUMN_RETURN);
}
addColumnToTable(table, ""); //$NON-NLS-1$
for (int i = 0; i < info.getAllUsedNames().size(); i++) {
if (!info.getAllUsedNames().get(i).isDeclarationInScope()) {
TableItem item = new TableItem(table, SWT.NONE);
TableEditor editor = new TableEditor(table);
int columnIndex = 0;
final NameInformation name = info.getAllUsedNames().get(i);
// Text
item.setText(columnIndex++, name.getType());
item.setText(columnIndex++, name.getName().toString());
// Button
editor = new TableEditor(table);
final Button referenceButton = new Button(table, SWT.CHECK);
if(name.hasReferenceOperartor((IASTDeclarator) name.getDeclaration().getParent()))
{
referenceButton.setSelection(true);
referenceButton.setEnabled(false);
}else {
referenceButton.setSelection(name.isReference());
}
referenceButton.setBackground(table.getBackground());
referenceButton.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
name.setUserSetIsReference(referenceButton
.getSelection());
onVisibilityOrReturnChange(info.getAllUsedNames());
}
public void widgetSelected(SelectionEvent e) {
widgetDefaultSelected(e);
}
});
referenceButton.pack();
editor.minimumWidth = referenceButton.getSize().x;
editor.horizontalAlignment = SWT.CENTER;
referenceButtons.add(referenceButton);
editor.setEditor(referenceButton, item, columnIndex++);
// Cosnt Button
editor = new TableEditor(table);
final Button constButton = new Button(table, SWT.CHECK);
constButton.setSelection(name.isConst());
constButton.setEnabled(!name.isWriteAccess());
constButton.setBackground(table.getBackground());
constButton.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
name.setConst(constButton
.getSelection());
onVisibilityOrReturnChange(info.getAllUsedNames());
}
public void widgetSelected(SelectionEvent e) {
widgetDefaultSelected(e);
}
});
constButton.pack();
editor.minimumWidth = constButton.getSize().x;
editor.horizontalAlignment = SWT.CENTER;
// referenceButtons.add(referenceButton);
editor.setEditor(constButton, item, columnIndex++);
if(info.isExtractExpression())
continue; // Skip the return radiobutton
// Button
editor = new TableEditor(table);
final Button returnButton = new Button(table, SWT.RADIO);
returnButton.setSelection(name.isReturnValue());
name.setUserSetIsReference(name.isReference());
returnButton.setEnabled(hasNoPredefinedReturnValue);
returnButton.setBackground(table.getBackground());
returnButton.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
name.setUserSetIsReturnValue(returnButton
.getSelection());
if (returnButton.getSelection()) {
referenceButton.setSelection(false);
referenceButton.notifyListeners(SWT.Selection,
new Event());
} else {
if (name.isReference()) {
referenceButton.setSelection(true);
referenceButton.notifyListeners(SWT.Selection,
new Event());
}
}
onVisibilityOrReturnChange(info.getAllUsedNames());
}
public void widgetSelected(SelectionEvent e) {
widgetDefaultSelected(e);
}
});
returnButton.pack();
editor.minimumWidth = returnButton.getSize().x;
editor.horizontalAlignment = SWT.CENTER;
returnButtons.add(returnButton);
editor.setEditor(returnButton, item, columnIndex++);
}
}
if(!info.isExtractExpression()) {
voidReturn = new Button(parent, SWT.CHECK | SWT.LEFT);
voidReturn.setText(Messages.ChooserComposite_NoReturnValue);
voidReturn.setEnabled(hasNoPredefinedReturnValue);
voidReturn.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
info.setReturnVariable(null);
for (Button button : returnButtons) {
if (voidReturn.getSelection()) {
button.setSelection(false);
button.notifyListeners(SWT.Selection, new Event());
}
button.setEnabled(!voidReturn.getSelection());
}
}
public void widgetSelected(SelectionEvent e) {
widgetDefaultSelected(e);
}
});
}
layout();
}
private void addColumnToTable(final Table table, String string) {
TableColumn column = new TableColumn(table, SWT.NONE);
column.setText(string);
column.setWidth(100);
}
void onVisibilityOrReturnChange(ArrayList<NameInformation> name){
String variableUsedAfterBlock = null;
for (NameInformation information : name) {
if(information.isUsedAfterReferences()
&& !(information.isUserSetIsReference() || information.isUserSetIsReturnValue())){
variableUsedAfterBlock = information.getName().toString();
}
}
ip.errorWithAfterUsedVariable(variableUsedAfterBlock);
}
}