/*******************************************************************************
* Copyright (c) 2004, 2008 QNX Software Systems 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:
* QNX Software Systems - initial API and implementation
* IBM Corporation
*******************************************************************************/
package org.eclipse.cdt.internal.ui.wizards.classwizard;
import java.util.List;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnLayoutData;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.accessibility.AccessibleAdapter;
import org.eclipse.swt.accessibility.AccessibleEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.Table;
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.IListAdapter;
import org.eclipse.cdt.internal.ui.wizards.dialogfields.ListDialogField;
public class BaseClassesListDialogField extends ListDialogField<IBaseClassInfo> {
// column properties
private static final String CP_NAME = "name"; //$NON-NLS-1$
private static final String CP_ACCESS = "access"; //$NON-NLS-1$
private static final String CP_VIRTUAL = "virtual"; //$NON-NLS-1$
static final Integer INDEX_YES = new Integer(0);
static final Integer INDEX_NO = new Integer(1);
static final Integer INDEX_PUBLIC = new Integer(0);
static final Integer INDEX_PROTECTED = new Integer(1);
static final Integer INDEX_PRIVATE = new Integer(2);
private final class CellHandler implements ICellModifier {
public boolean canModify(Object element, String property) {
return (element instanceof IBaseClassInfo)
&& (property.equals(CP_ACCESS) || property.equals(CP_VIRTUAL));
}
public Object getValue(Object element, String property) {
if (!(element instanceof IBaseClassInfo))
return null;
IBaseClassInfo baseClass = (IBaseClassInfo) element;
if (property.equals(CP_ACCESS)) {
if (baseClass.getAccess() == ASTAccessVisibility.PRIVATE) {
return INDEX_PRIVATE;
} else if (baseClass.getAccess() == ASTAccessVisibility.PROTECTED) {
return INDEX_PROTECTED;
} else {
return INDEX_PUBLIC;
}
} else if (property.equals(CP_VIRTUAL)) {
if (baseClass.isVirtual())
return INDEX_YES;
return INDEX_NO;
}
return null;
}
public void modify(Object element, String property, Object value) {
IBaseClassInfo baseClass = null;
if (element instanceof IBaseClassInfo) {
baseClass = (IBaseClassInfo) element;
} else if (element instanceof Item) {
Object data = ((Item)element).getData();
if (data instanceof IBaseClassInfo)
baseClass = (IBaseClassInfo) data;
}
if (baseClass != null) {
if (property.equals(CP_ACCESS) && value instanceof Integer) {
Integer access = (Integer)value;
if (access.equals(INDEX_PRIVATE)) {
baseClass.setAccess(ASTAccessVisibility.PRIVATE);
} else if (access.equals(INDEX_PROTECTED)) {
baseClass.setAccess(ASTAccessVisibility.PROTECTED);
} else {
baseClass.setAccess(ASTAccessVisibility.PUBLIC);
}
refresh();
} else if (property.equals(CP_VIRTUAL) && value instanceof Integer) {
Integer yesno = (Integer)value;
baseClass.setVirtual(yesno.equals(INDEX_YES));
refresh();
}
}
}
}
public BaseClassesListDialogField(String title, IListAdapter<IBaseClassInfo> listAdapter) {
super(listAdapter,
new String[] {
NewClassWizardMessages.BaseClassesListDialogField_buttons_add,
NewClassWizardMessages.BaseClassesListDialogField_buttons_remove,
NewClassWizardMessages.BaseClassesListDialogField_buttons_up,
NewClassWizardMessages.BaseClassesListDialogField_buttons_down
}, new BaseClassesLabelProvider());
setRemoveButtonIndex(1);
setUpButtonIndex(2);
setDownButtonIndex(3);
setLabelText(title);
String[] headers = new String[] {
NewClassWizardMessages.BaseClassesListDialogField_headings_name,
NewClassWizardMessages.BaseClassesListDialogField_headings_access,
NewClassWizardMessages.BaseClassesListDialogField_headings_virtual
};
ColumnLayoutData[] columns = new ColumnLayoutData[] {
new ColumnWeightData(70, 30),
new ColumnWeightData(30, 30),
new ColumnWeightData(25, 25),
};
setTableColumns(new ListDialogField.ColumnsDescription(columns, headers, true));
}
@Override
protected boolean managedButtonPressed(int index) {
super.managedButtonPressed(index);
return false;
}
@Override
protected TableViewer createTableViewer(Composite parent) {
TableViewer viewer = super.createTableViewer(parent);
Table table = viewer.getTable();
table.getAccessible().addAccessibleListener(
new AccessibleAdapter() {
@Override
public void getName(AccessibleEvent e) {
e.result = NewClassWizardMessages.NewClassCreationWizardPage_baseClasses_label;
}
}
);
CellEditor virtualCellEditor = new ComboBoxCellEditor(table,
new String[] {
/* INDEX_YES */BaseClassesLabelProvider.getYesNoText(true),
/* INDEX_NO */BaseClassesLabelProvider.getYesNoText(false)
}, SWT.READ_ONLY);
CellEditor accessCellEditor = new ComboBoxCellEditor(table,
new String[] {
/* INDEX_PUBLIC */BaseClassesLabelProvider.getAccessText(ASTAccessVisibility.PUBLIC),
/* INDEX_PROTECTED */BaseClassesLabelProvider.getAccessText(ASTAccessVisibility.PROTECTED),
/* INDEX_PRIVATE */BaseClassesLabelProvider.getAccessText(ASTAccessVisibility.PRIVATE)
}, SWT.READ_ONLY);
viewer.setCellEditors(new CellEditor[] {
null,
accessCellEditor,
virtualCellEditor
});
viewer.setColumnProperties(new String[] {
CP_NAME,
CP_ACCESS,
CP_VIRTUAL
});
viewer.setCellModifier(new CellHandler());
return viewer;
}
public void addBaseClass(IBaseClassInfo baseClass) {
addElement(baseClass);
}
public IBaseClassInfo[] getBaseClasses() {
List<IBaseClassInfo> baseClasses = getElements();
return baseClasses.toArray(new IBaseClassInfo[baseClasses.size()]);
}
}