de.innot.avreclipse.ui.dialogs.ChangeMCUDialog.java Source code

Java tutorial

Introduction

Here is the source code for de.innot.avreclipse.ui.dialogs.ChangeMCUDialog.java

Source

/*******************************************************************************
 * 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.dialogs;

import java.text.MessageFormat;
import java.util.Arrays;
import java.util.Set;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;

import de.innot.avreclipse.core.toolinfo.fuses.ByteValues;
import de.innot.avreclipse.core.toolinfo.fuses.Fuses;
import de.innot.avreclipse.core.util.AVRMCUidConverter;

/**
 * Dialog to select a MCU.
 * <p>
 * The dialog offers the list of MCUs to the user. If the MCU selected by the user is not compatible
 * with the MCU given to the dialog at instantiation time then a warning is shown and the OK button
 * changes to "Convert".
 * </p>
 * 
 * @author Thomas Holland
 * @since 2.3
 * 
 */
public class ChangeMCUDialog extends TitleAreaDialog {

    /** The current ByteValues to check the compatibility with the selected MCU. */
    private final ByteValues fSourceValues;

    /** The name of the file for the dialog title. */
    private final String fFileName;

    /** Stores the id of the selected MCU. */
    private String fNewMCU;

    // The GUI elements
    private Combo fMCUCombo;
    private Button fOKButton;

    private final static int OK_ID = IDialogConstants.OK_ID;
    private final static int CANCEL_ID = IDialogConstants.CANCEL_ID;

    private final static String TEXT_OK = IDialogConstants.OK_LABEL;
    private final static String TEXT_CONVERT = "Convert";

    /**
     * Create a new MCU change dialog.
     * <p>
     * The dialog is not shown until {@link #open()} is called.
     * </p>
     * 
     * @param shell
     *            <code>Shell</code> to associate this Dialog with, so that it always stays on top
     *            of the given Shell.
     * @param sourcevalues
     *            A source <code>ByteValues</code> object. Used to preselect the current MCU and
     *            to test the compatibility with the selected MCU.
     * @param filename
     *            The name of the source file which will appear in the dialog title.
     */
    public ChangeMCUDialog(Shell shell, ByteValues sourcevalues, String filename) {
        super(shell);

        fSourceValues = sourcevalues;
        fNewMCU = sourcevalues.getMCUId();
        fFileName = filename;

    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
     */
    @Override
    protected Control createDialogArea(Composite parent) {

        String title = MessageFormat.format("Change MCU for file {0}", fFileName);
        setTitle(title);

        // create the top level composite for the dialog area
        Composite composite = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        layout.verticalSpacing = 0;
        layout.horizontalSpacing = 0;
        composite.setLayout(layout);
        composite.setLayoutData(new GridData(GridData.FILL_BOTH));
        composite.setFont(parent.getFont());

        // Build a separator line. This is just eye candy.
        Label titleBarSeparator = new Label(composite, SWT.HORIZONTAL | SWT.SEPARATOR);
        titleBarSeparator.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));

        // The real content
        Composite body = new Composite(composite, SWT.NONE);
        body.setLayout(new GridLayout(2, false));

        Label label = new Label(body, SWT.NONE);
        label.setText("Select new MCU:");

        Set<String> allmcusset = getMCUList();
        final String[] allmcuids = allmcusset.toArray(new String[allmcusset.size()]);
        Arrays.sort(allmcuids);

        final String[] allmcunames = new String[allmcuids.length];

        int oldmcuindex = -1;
        for (int i = 0; i < allmcuids.length; i++) {
            allmcunames[i] = AVRMCUidConverter.id2name(allmcuids[i]);
            if (fSourceValues.getMCUId().equals(allmcuids[i])) {
                oldmcuindex = i;
            }
        }

        fMCUCombo = new Combo(body, SWT.READ_ONLY);
        fMCUCombo.setItems(allmcunames);
        fMCUCombo.setVisibleItemCount(Math.min(allmcunames.length, 25));
        fMCUCombo.select(oldmcuindex);
        fMCUCombo.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                fNewMCU = allmcuids[fMCUCombo.getSelectionIndex()];
                boolean isCompatible = fSourceValues.isCompatibleWith(fNewMCU);
                fOKButton.setText(isCompatible ? TEXT_OK : TEXT_CONVERT);
                if (!isCompatible) {
                    setMessage("Selected MCU is not compatible with current MCU.", IMessageProvider.WARNING);
                } else {
                    setMessage(null);
                }
            }
        });

        return composite;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
     */
    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        // create OK and Cancel buttons by default
        fOKButton = createButton(parent, OK_ID, IDialogConstants.OK_LABEL, true);
        createButton(parent, CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
    }

    /**
     * @return The MCU selected by the user.
     */
    public String getResult() {
        return fNewMCU;
    }

    /**
     * Get a set with all supported MCU id values.
     * <p>
     * The default implementation will get the list from the <code>Fuses</code> class. Subclasses
     * may use a different supplier.
     * </p>
     * 
     * @return <code>Set</code> with all MCUs that should be shown to the user.
     */
    protected Set<String> getMCUList() {
        return Fuses.getDefault().getMCUList();
    }
}