Java tutorial
/******************************************************************************* * Copyright (c) 2000, 2008 IBM Corporation 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.photran.internal.ui.properties; import java.util.Map; import java.util.TreeMap; import org.eclipse.jface.preference.FieldEditor; import org.eclipse.photran.internal.core.sourceform.SourceForm; import org.eclipse.photran.internal.core.sourceform.SourceFormProperties; 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.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; /** * A field editor to edit which file types to send to the C Preprocessor. * * @author Jeff Overbey, Kurt Hendle * * @see org.eclipse.jface.preference.ListEditor */ public class FortranSourceFormEditor extends FieldEditor { /** Width of the content types combo box in pixels */ private static final int COMBO_WIDTH = 250; /** Minimum height of a combo box */ private static final int DEFAULT_COMBO_HEIGHT = 17; /** Total number of pixels of vertical padding surrounding * a combo box in a table */ private static final int COMBO_VERTICAL_PADDING = 5; private Table table; private Listener measureItemListener = null; /** * Creates a Fortran Source Form field editor. * * @param propertyName the name of the preference this field editor works on * @param labelText the label text of the field editor * @param parent the parent of the field editor's control */ public FortranSourceFormEditor(String propertyName, String labelText, Composite parent) { init(propertyName, labelText); createControl(parent); } /* (non-Javadoc) * Method declared on FieldEditor. */ @Override protected void doFillIntoGrid(Composite parent, int numColumns) { Control control = getLabelControl(parent); GridData gd = new GridData(); gd.horizontalSpan = numColumns; control.setLayoutData(gd); createTableControl(parent); gd = new GridData(); gd.horizontalAlignment = GridData.HORIZONTAL_ALIGN_CENTER; gd.verticalAlignment = GridData.FILL; gd.horizontalSpan = numColumns; gd.grabExcessHorizontalSpace = true; gd.grabExcessVerticalSpace = true; table.setLayoutData(gd); } private void createTableControl(Composite parent) { table = new Table(parent, SWT.BORDER | SWT.V_SCROLL); table.setHeaderVisible(true); table.setLinesVisible(true); for (int i = 0; i < 2; i++) { new TableColumn(table, SWT.NONE); } table.getColumn(0).setText(UIMessages.FortranSourceFormEditor_FileNameOrExtensionColumnLabel); table.getColumn(1).setText(UIMessages.FortranSourceFormEditor_SourceFormColumnLabel); } /* (non-Javadoc) * Method declared on FieldEditor. */ @Override protected void adjustForNumColumns(int numColumns) { Control control = getLabelControl(); ((GridData) control.getLayoutData()).horizontalSpan = numColumns; ((GridData) table.getLayoutData()).horizontalSpan = numColumns; } /* (non-Javadoc) * Method declared on FieldEditor. */ @Override protected void doLoad() { if (table != null) populateTable(SourceFormProperties.parseValue(getPreferenceStore().getString(getPreferenceName()))); } /* (non-Javadoc) * Method declared on FieldEditor. */ @Override protected void doLoadDefault() { if (table != null) populateTable( SourceFormProperties.parseValue(getPreferenceStore().getDefaultString(getPreferenceName()))); } private void populateTable(Map<String, String> prefValue) { table.removeAll(); for (Control c : table.getChildren()) if (c instanceof Combo) c.dispose(); Combo combo = null; for (String spec : prefValue.keySet()) combo = addItem(spec, prefValue.get(spec)); table.getColumn(0).pack(); table.getColumn(1).setWidth(COMBO_WIDTH); if (measureItemListener == null) table.addListener(SWT.MeasureItem, createMeasureItemListener(combo)); } private Listener createMeasureItemListener(Combo combo) { final int comboHeight = combo == null ? DEFAULT_COMBO_HEIGHT : Math.max(combo.getSize().y, DEFAULT_COMBO_HEIGHT); /* NOTE: This callback must be efficient: It is called frequently */ return measureItemListener = new Listener() { public void handleEvent(Event event) { event.height = Math.max(event.height, comboHeight + COMBO_VERTICAL_PADDING); } }; } private Combo addItem(String spec, String sourceFormDescription) { final TableItem item = new TableItem(table, SWT.NONE); item.setText(new String[] { spec, sourceFormDescription }); final Combo combo = new Combo(table, SWT.FLAT | SWT.BORDER); for (String sourceForm : SourceForm.allSourceForms()) combo.add(sourceForm); combo.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { item.setText(1, combo.getText()); } public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } }); combo.setText(sourceFormDescription); int index = combo.indexOf(sourceFormDescription); if (index >= 0) combo.select(index); TableEditor editor = new TableEditor(table); editor.grabHorizontal = editor.grabVertical = true; editor.minimumWidth = COMBO_WIDTH; editor.setEditor(combo, item, 1); return combo; } /* (non-Javadoc) * Method declared on FieldEditor. */ @Override protected void doStore() { Map<String, String> prefValue = new TreeMap<String, String>(); for (TableItem item : table.getItems()) prefValue.put(item.getText(0), item.getText(1)); getPreferenceStore().setValue(getPreferenceName(), SourceFormProperties.unparseValue(prefValue)); } /* (non-Javadoc) * Method declared on FieldEditor. */ @Override public int getNumberOfControls() { return 2; } /* (non-Javadoc) * Method declared on FieldEditor. */ @Override public void setFocus() { if (table != null) table.setFocus(); } }