/******************************************************************************* * Copyright (c) 2008, 2011 Thomas Holland (thomas@innot.de) 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: * Thomas Holland - initial API and implementation *******************************************************************************/ package de.innot.avreclipse.ui.views.supportedmcu; import java.io.IOException; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.swt.SWT; import de.innot.avreclipse.core.IMCUProvider; import de.innot.avreclipse.core.avrdude.AVRDudeException; import de.innot.avreclipse.core.toolinfo.AVRDude; import de.innot.avreclipse.core.toolinfo.Datasheets; import de.innot.avreclipse.core.toolinfo.GCC; import de.innot.avreclipse.core.toolinfo.MCUNames; import de.innot.avreclipse.core.toolinfo.Signatures; import de.innot.avreclipse.core.toolinfo.fuses.Fuses; import de.innot.avreclipse.devicedescription.avrio.AVRiohDeviceDescriptionProvider; /** * This enum contains all columns to be shown in the MCUListView. * <p> * This is the interface between the GUI and the IMCUProviders. Each column in this enum knows how * to get a IMCUProvider ({@link #getMCUProvider()}), knows how to set up a given * TableViewerColumn for display ({@link #initColumn()}) and has a User visible column name. * </p> * * @author Thomas Holland * @since 2.2 * */ public enum MCUListColumn { /** * The names column represents the {@link MCUNames} and the {@link Datasheets} IMCUProviders. * <p> * It will show all known MCU names and also shows those with a datasheet URL available as * clickable links. * </p> */ NAMES(MCUNames.getDefault()) { @Override protected String getName() { return "MCU Name"; } @Override protected ColumnWeightData initColumn(TableViewerColumn column) { URLColumnLabelProvider labelprovider = new URLColumnLabelProvider(fMCUProvider, Datasheets.getDefault()); fLabelProvider = labelprovider; column.setLabelProvider(fLabelProvider); return new ColumnWeightData(20, 60); } @Override protected void internalUpdate(TableViewer tableviewer, TableViewerColumn viewercolumn) { ((URLColumnLabelProvider) fLabelProvider).updateColumn(tableviewer, viewercolumn); } }, /** * Column with all MCUs supported by avr-gcc, shown as Yes/No images. */ AVRGCC(GCC.getDefault()) { @Override protected String getName() { try { return GCC.getDefault().getNameAndVersion(); } catch (IOException e) { // avr-gcc could not be startedk return "avr-gcc not found"; } } @Override protected ColumnWeightData initColumn(TableViewerColumn column) { column.setLabelProvider(new BooleanColumnLabelProvider(fMCUProvider)); column.getColumn().setAlignment(SWT.CENTER); return new ColumnWeightData(8, 60); } }, /** * Column with all MCUs supported in the <avr/io.h> header file, shown as Yes/No images. */ AVRINCLUDE(AVRiohDeviceDescriptionProvider.getDefault()) { @Override protected String getName() { return "<avr/io.h>"; } @Override protected ColumnWeightData initColumn(TableViewerColumn column) { column.setLabelProvider(new BooleanColumnLabelProvider(fMCUProvider)); column.getColumn().setAlignment(SWT.CENTER); return new ColumnWeightData(5, 60); } }, /** * Column with all MCUs supported by avr-gcc, shown as Yes/No images. */ AVRDUDE(AVRDude.getDefault()) { @Override protected String getName() { try { return AVRDude.getDefault().getNameAndVersion(); } catch (AVRDudeException e) { return "AVRDude not found"; } } @Override protected ColumnWeightData initColumn(TableViewerColumn column) { column.setLabelProvider(new BooleanColumnLabelProvider(fMCUProvider)); column.getColumn().setAlignment(SWT.CENTER); return new ColumnWeightData(5, 60); } }, /** * Column with all MCU which have Fuse Descriptions, shown as Yes/No images. */ FUSES(Fuses.getDefault()) { @Override protected String getName() { return "Fuses"; } @Override protected ColumnWeightData initColumn(TableViewerColumn column) { column.setLabelProvider(new BooleanColumnLabelProvider(fMCUProvider)); column.getColumn().setAlignment(SWT.CENTER); return new ColumnWeightData(5, 60); } }, /** * Column with all MCUs supported by AVR Studio (which have a Part Description File). * <p> * This currently uses the {@link Signatures} provider, so it has the same info as the * {@link #SIGNATURE} column, just a different graphical pesentation (Yes/No images). * </p> */ AVRSTUDIO(Signatures.getDefault()) { @Override protected String getName() { return "AVR Studio"; } @Override protected ColumnWeightData initColumn(TableViewerColumn column) { column.setLabelProvider(new BooleanColumnLabelProvider(fMCUProvider)); column.getColumn().setAlignment(SWT.CENTER); return new ColumnWeightData(5, 60); } }, /** * Column with all known Signatures. */ SIGNATURE(Signatures.getDefault()) { @Override protected String getName() { return "Signature"; } @Override protected ColumnWeightData initColumn(TableViewerColumn column) { column.setLabelProvider(new StringColumnLabelProvider(fMCUProvider)); return new ColumnWeightData(15, 60); } }, /** * the filler column is here, so that the other columns do not get stretched out over the the * whole width, but kept together. */ FILLER(null) { @Override protected String getName() { return ""; } @Override protected ColumnWeightData initColumn(TableViewerColumn column) { column.setLabelProvider(new NullColumnLabelProvider()); return new ColumnWeightData(50, 5); } }; /** * TableViewer this MCU column is associated with. Required for the URLColumnLabelProvider to * hook its TableEditors to the table. */ protected TableViewer fTableViewer; /** * TableViewerColumn this MCU column is associated with. Required for the URLColumnLabelProvider * to hook its TableEditors to the table. */ protected TableViewerColumn fViewerColumn; /** The ColumnLabelProvider of this MCU column */ protected ColumnLabelProvider fLabelProvider; /** The referenced IMCUProvider of the MCU column */ protected IMCUProvider fMCUProvider; /** * The constructor is called from the enum values and sets the user visible column name and the * underlying provider. * * @param name * @param provider */ private MCUListColumn(IMCUProvider provider) { fMCUProvider = provider; } /** * Add this MCU column to the given TableViewer. * <p> * A new <code>TableViewerColumn</code> is created, initialized and added to the TableViewer. * Also a <code>ColumnWeightData</code> for the new column is added to the given * <code>TableColumnLayout</code>. * </p> * * @param tableviewer * The <code>TableViewer</code> for which to create the column. * * @param layout * The <code>TableColumnLayout</code> for the TableViewer. */ public void addColumn(TableViewer tableviewer, TableColumnLayout layout) { fTableViewer = tableviewer; fViewerColumn = new TableViewerColumn(tableviewer, SWT.NONE); fViewerColumn.getColumn().setText(getName()); // Do the column type specific stuff ColumnWeightData cwd = initColumn(fViewerColumn); layout.setColumnData(fViewerColumn.getColumn(), cwd); } /** * Gets the underlying IMCUProvider for the MCU column. * * @return <code>IMCUProvider</code> */ public IMCUProvider getMCUProvider() { return fMCUProvider; } /** * Update the Column. * <p> * This needs to be called after the table has been filled with data (after the * <code>TableViewer.setInput()</code>) method, and after each content change. * </p> * <p> * This method is required to do some magic stuff with a TableViewer, like showing Hyperlinks. * </p> */ public void updateColumn() { internalUpdate(fTableViewer, fViewerColumn); } /** * Update the given columnn as required. Used by the {@link #NAMES} column to hook the URLs to * the table. * * @param tableviewer * @param column */ protected void internalUpdate(TableViewer tableviewer, TableViewerColumn column) { // Enums that have something to update will override // this method }; /** * Initialize the given column as required. * <p> * This includes setting a ColumnLabelProvider for the Column and returning a * {@link ColumnWeightData} object with the desired dimensions of the column. * </p> * * @param column * <code>TableViewerColumn</code> to adjust * @return <code>ColumnWeightData</code> with the desired weight and minimum pixel size. */ protected abstract ColumnWeightData initColumn(TableViewerColumn column); /** * Gets the column name for the UI * * @return String with the name */ protected abstract String getName(); /** * A ColumnLabelProvider that always returns empty Strings as Labels. Used by the * {@ MCUListColumn#FILLER} column. */ private static class NullColumnLabelProvider extends ColumnLabelProvider { @Override public String getText(Object element) { return ""; } } }