/*
* $Id$
*
* Copyright (c) 2004-2005 by the TeXlapse Team.
* 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
*/
package net.sourceforge.texlipse.builder;
import java.util.ArrayList;
import java.util.HashMap;
import net.sourceforge.texlipse.TexlipsePlugin;
import net.sourceforge.texlipse.properties.TexlipseProperties;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.ui.dialogs.PreferencesUtil;
/**
* An UI component for choosing the builder.
* Consists of two Combo components and a Label.
*
* @author Kimmo Karlsson
*/
public class BuilderChooser {
// container region
private Group formatGroup;
// list of output formats to choose from
private Combo formatChooser;
// list of possible sequences to choose from
private Combo sequenceChooser;
// mapping of output format indexes to possible sequences
private String[][] mapping;
// mapping of sequences to builder ids
private HashMap<String, Integer> idMap;
// list of (format-) selection listeners
private ArrayList<SelectionListener> selectionListeners;
/**
*
*/
public BuilderChooser(Composite parent) {
selectionListeners = new ArrayList<SelectionListener>();
createMappings();
formatGroup = new Group(parent, SWT.NONE);
GridLayout gl = new GridLayout();
gl.numColumns = 4;
formatGroup.setLayout(gl);
formatGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// descriptive label
Label label = new Label(formatGroup, SWT.LEFT);
label.setText(TexlipsePlugin.getResourceString("propertiesOutputFormatLabel"));
label.setLayoutData(new GridData());
// create output format chooser
formatChooser = new Combo(formatGroup, SWT.DROP_DOWN | SWT.READ_ONLY);
formatChooser.setLayoutData(new GridData());
formatChooser.setToolTipText(TexlipsePlugin.getResourceString("propertiesOutputFormatTooltip"));
formatChooser.setItems(new String[] { TexlipseProperties.OUTPUT_FORMAT_DVI, TexlipseProperties.OUTPUT_FORMAT_PS, TexlipseProperties.OUTPUT_FORMAT_PDF });
formatChooser.select(0);
formatChooser.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
int index = formatChooser.getSelectionIndex();
if (index >= 0) {
sequenceChooser.setItems(mapping[index]);
sequenceChooser.select(0);
fireSelectionEvent(event);
}
}
});
// descriptive label
Label slabel = new Label(formatGroup, SWT.LEFT);
slabel.setText(TexlipsePlugin.getResourceString("propertiesOutputSequenceLabel"));
slabel.setLayoutData(new GridData());
// create sequence chooser
sequenceChooser = new Combo(formatGroup, SWT.DROP_DOWN | SWT.READ_ONLY);
sequenceChooser.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
sequenceChooser.setToolTipText(TexlipsePlugin.getResourceString("propertiesOutputSequenceTooltip"));
sequenceChooser.setItems(mapping[0]);
sequenceChooser.select(0);
sequenceChooser.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
int index = sequenceChooser.getSelectionIndex();
if (index >= 0) {
fireSelectionEvent(event);
}
}
});
final Link prefLink = new Link(formatGroup, SWT.NONE);
prefLink.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 4, 1));
prefLink.setText(TexlipsePlugin.getResourceString("propertiesOutputLinkToPrefs"));
prefLink.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
PreferencesUtil.createPreferenceDialogOn(formatGroup.getShell(), "TexlipseBuilderPreferencePage", new String[] {
"TexlipseBuilderPreferencePage",
"net.sourceforge.texlipse.properties.BuilderEnvPreferencePage"
}, null).open();
}
});
}
/**
* Creates the Sequence to Id mappings
*/
private void createMappings() {
idMap = new HashMap<String, Integer>();
Builder[] dvis = BuilderRegistry.getAll(TexlipseProperties.OUTPUT_FORMAT_DVI);
Builder[] pses = BuilderRegistry.getAll(TexlipseProperties.OUTPUT_FORMAT_PS);
Builder[] pdfs = BuilderRegistry.getAll(TexlipseProperties.OUTPUT_FORMAT_PDF);
mapping = new String[3][];
mapping[0] = new String[dvis.length];
for (int i = 0; i < dvis.length; i++) {
mapping[0][i] = dvis[i].getSequence();
idMap.put(mapping[0][i], new Integer(dvis[i].getId()));
}
mapping[1] = new String[pses.length];
for (int i = 0; i < pses.length; i++) {
mapping[1][i] = pses[i].getSequence();
idMap.put(mapping[1][i], new Integer(pses[i].getId()));
}
mapping[2] = new String[pdfs.length];
for (int i = 0; i < pdfs.length; i++) {
mapping[2][i] = pdfs[i].getSequence();
idMap.put(mapping[2][i], new Integer(pdfs[i].getId()));
}
}
/**
* Forward the event forward.
* @param event event
*/
private void fireSelectionEvent(SelectionEvent event) {
for (int i = 0; i < selectionListeners.size(); i++) {
SelectionListener lis = (SelectionListener) selectionListeners.get(i);
lis.widgetSelected(event);
}
}
/**
* Add a selection listener to this component.
*/
public void addSelectionListener(SelectionListener listener) {
selectionListeners.add(listener);
}
/**
* @return the output format that is currently selected
*/
public String getSelectedFormat() {
int index = formatChooser.getSelectionIndex();
if (index < 0) {
return null;
}
return formatChooser.getItem(index);
}
/**
* @return the id of the currently selected builder
*/
public int getSelectedBuilder() {
int index = sequenceChooser.getSelectionIndex();
if (index >= 0) {
String seq = sequenceChooser.getItem(index);
Integer num = (Integer) idMap.get(seq);
index = -1;
if (num != null) {
index = num.intValue();
}
}
return index;
}
/**
* Selects the correct values from combo components.
* @param num the builder id to select
*/
public void setSelectedBuilder(int num) {
Builder b = BuilderRegistry.get(num);
if (b != null) {
String sequence = b.getSequence();
int index = formatChooser.indexOf(b.getOutputFormat());
if (index < 0) {
index = 0;
}
formatChooser.select(index);
sequenceChooser.setItems(mapping[index]);
index = sequenceChooser.indexOf(sequence);
if (index < 0) {
index = 0;
}
sequenceChooser.select(index);
}
}
/**
* Access to the SWT control to set layout data, disable group etc.
*/
public Composite getControl() {
return formatGroup;
}
}