/******************************************************************************* * Copyright (c) 2004, 2016 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.CheckedListDialogField; import org.eclipse.cdt.internal.ui.wizards.dialogfields.IListAdapter; import org.eclipse.cdt.internal.ui.wizards.dialogfields.ListDialogField; public class MethodStubsListDialogField extends CheckedListDialogField<IMethodStub> { // 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$ private static final String CP_INLINE = "inline"; //$NON-NLS-1$ static final Integer INDEX_YES = 0; static final Integer INDEX_NO = 1; static final Integer INDEX_PUBLIC = 0; static final Integer INDEX_PROTECTED = 1; static final Integer INDEX_PRIVATE = 2; private final class CellHandler implements ICellModifier { @Override public boolean canModify(Object element, String property) { if (element instanceof IMethodStub) { IMethodStub stub = (IMethodStub) element; if (property.equals(CP_ACCESS)) { return stub.canModifyAccess(); } else if (property.equals(CP_VIRTUAL)) { return stub.canModifyVirtual(); } else if (property.equals(CP_INLINE)) { return stub.canModifyInline(); } } return false; } @Override public Object getValue(Object element, String property) { if (!(element instanceof IMethodStub)) return null; IMethodStub stub = (IMethodStub) element; if (property.equals(CP_ACCESS)) { if (stub.getAccess() == ASTAccessVisibility.PRIVATE) { return INDEX_PRIVATE; } else if (stub.getAccess() == ASTAccessVisibility.PROTECTED) { return INDEX_PROTECTED; } else { return INDEX_PUBLIC; } } else if (property.equals(CP_VIRTUAL)) { if (stub.isVirtual()) return INDEX_YES; return INDEX_NO; } else if (property.equals(CP_INLINE)) { if (stub.isInline()) return INDEX_YES; return INDEX_NO; } return null; } @Override public void modify(Object element, String property, Object value) { IMethodStub stub = null; if (element instanceof IMethodStub) { stub = (IMethodStub)element; } else if (element instanceof Item) { Object data = ((Item)element).getData(); if (data instanceof IMethodStub) stub = (IMethodStub)data; } if (stub != null) { if (property.equals(CP_ACCESS) && value instanceof Integer) { Integer access = (Integer) value; if (access.equals(INDEX_PRIVATE)) { stub.setAccess(ASTAccessVisibility.PRIVATE); } else if (access.equals(INDEX_PROTECTED)) { stub.setAccess(ASTAccessVisibility.PROTECTED); } else { stub.setAccess(ASTAccessVisibility.PUBLIC); } refresh(); } else if (property.equals(CP_VIRTUAL) && value instanceof Integer) { Integer yesno = (Integer) value; stub.setVirtual(yesno.equals(INDEX_YES)); refresh(); } else if (property.equals(CP_INLINE) && value instanceof Integer) { Integer yesno = (Integer) value; stub.setInline(yesno.equals(INDEX_YES)); refresh(); } } } } public MethodStubsListDialogField(String title, IListAdapter<IMethodStub> listAdapter) { super(listAdapter, null, new MethodStubsLabelProvider()); setLabelText(title); String[] headers = new String[] { NewClassWizardMessages.MethodStubsDialogField_headings_name, NewClassWizardMessages.MethodStubsDialogField_headings_access, NewClassWizardMessages.MethodStubsDialogField_headings_virtual, NewClassWizardMessages.MethodStubsDialogField_headings_inline }; ColumnLayoutData[] columns = new ColumnLayoutData[] { new ColumnWeightData(70, 30), new ColumnWeightData(40, 30), new ColumnWeightData(30, 25), new ColumnWeightData(30, 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_methodStubs_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, virtualCellEditor }); viewer.setColumnProperties(new String[] { CP_NAME, CP_ACCESS, CP_VIRTUAL, CP_INLINE }); viewer.setCellModifier(new CellHandler()); return viewer; } public void addMethodStub(IMethodStub methodStub, boolean checked) { addElement(methodStub); setChecked(methodStub, checked); } public IMethodStub[] getMethodStubs() { List<IMethodStub> allStubs = getElements(); return allStubs.toArray(new IMethodStub[allStubs.size()]); } public IMethodStub[] getCheckedMethodStubs() { List<IMethodStub> checkedStubs = getCheckedElements(); return checkedStubs.toArray(new IMethodStub[checkedStubs.size()]); } }