/*
* $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.properties;
import java.io.File;
import net.sourceforge.texlipse.TexlipsePlugin;
import net.sourceforge.texlipse.builder.BuilderRegistry;
import net.sourceforge.texlipse.builder.ProgramRunner;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.resource.JFaceResources;
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.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.help.WorkbenchHelp;
/**
* Builder preferences.
*
* @author Kimmo Karlsson
*/
public class BuilderSettingsPreferencePage extends PreferencePage
implements IWorkbenchPreferencePage {
// list of builders to configure
private List builderList;
// checkbox for enabling console output
private Button consoleOutputCheckBox;
// checkbox for enabling console output
private Button auxParserCheckBox;
// field for browsing to tex distribution install dir
private Text texDirField;
// last path opened with texDirField
protected File lastPath;
// button that opens an editor dialog
private Button editButton;
/**
* Construct a new page.
*/
public BuilderSettingsPreferencePage() {
super();
setPreferenceStore(TexlipsePlugin.getDefault().getPreferenceStore());
//setDescription(TexlipsePlugin.getResourceString("preferenceBuilderPageDescription"));
lastPath = new File(resolveTexDir());
}
/**
* @return the supposed directory of the tex distribution binaries
*/
private String resolveTexDir() {
ProgramRunner runner = BuilderRegistry.getRunner(0);
if (runner == null) {
return File.separator;
}
String dir = runner.getProgramPath();
if (dir == null || dir.length() == 0) {
return File.separator;
}
int index = dir.lastIndexOf(File.separatorChar);
if (index < 0) {
return dir;
}
return dir.substring(0, index);
}
/**
* Creates the page components.
*/
protected Control createContents(Composite parent) {
Composite contents = new Composite(parent, SWT.NULL);
GridLayout gl = new GridLayout();
gl.numColumns = 2;
contents.setLayout(gl);
addBuilderList(contents);
TexlipsePreferencePage.addSpacer(2, false, contents);
addTexInstallDir(contents);
TexlipsePreferencePage.addSpacer(2, false, contents);
addConsoleCheckBox(contents);
//TexlipsePreferencePage.addSpacer(1, true, contents);
addAuxParserCheckBox(contents);
return contents;
}
/**
* @param contents parent component
*/
private void addTexInstallDir(Composite contents) {
Composite parent = new Composite(contents, SWT.NULL);
GridLayout layout = new GridLayout();
layout.numColumns = 3;
parent.setLayout(layout);
GridData pgd = new GridData(GridData.FILL_HORIZONTAL);
pgd.horizontalSpan = 2;
parent.setLayoutData(pgd);
TexlipsePreferencePage.addLabelField(3, TexlipsePlugin.getResourceString("preferenceBuilderTexDirDescription"), parent);
Label label = new Label(parent, SWT.LEFT);
label.setText(TexlipsePlugin.getResourceString("preferenceBuilderTexDirLabel"));
label.setLayoutData(new GridData());
texDirField = new Text(parent, SWT.SINGLE | SWT.BORDER);
texDirField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
texDirField.setText("");
WorkbenchHelp.setHelp(texDirField, TexlipseHelpIds.BUILDER_TEX_DIR);
Button button = new Button(parent, SWT.PUSH);
button.setText(JFaceResources.getString("openBrowse"));
button.setLayoutData(new GridData());
button.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
DirectoryDialog dialog = new DirectoryDialog(getShell());
if (lastPath != null) {
if (lastPath.exists())
dialog.setFilterPath(lastPath.getAbsolutePath());
}
String dir = dialog.open();
if (dir != null) {
lastPath = new File(dir.trim());
if (lastPath.exists()) {
texDirField.setText(lastPath.getAbsolutePath());
} else {
lastPath = null;
}
}
}});
}
/**
* Add list of builders with an edit button.
* @param contents parent component
*/
private void addBuilderList(Composite contents) {
Composite leftPart = new Composite(contents, SWT.NULL);
leftPart.setLayout(new GridLayout());
leftPart.setLayoutData(new GridData(GridData.FILL_BOTH));
Label label = new Label(leftPart, SWT.LEFT);
label.setText(TexlipsePlugin.getResourceString("preferenceBuilderListLabel"));
label.setLayoutData(new GridData());
builderList = new List(leftPart, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
builderList.setItems(getBuilderItems());
builderList.setLayoutData(new GridData(GridData.FILL_BOTH));
builderList.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
int index = builderList.getSelectionIndex();
editButton.setEnabled(index >= 0);
}});
WorkbenchHelp.setHelp(builderList, TexlipseHelpIds.BUILDER_LIST);
Composite rightPart = new Composite(contents, SWT.NULL);
rightPart.setLayout(new GridLayout());
rightPart.setLayoutData(new GridData(GridData.FILL_BOTH));
Label empty = new Label(rightPart, SWT.LEFT);
empty.setLayoutData(new GridData());
editButton = new Button(rightPart, SWT.PUSH);
editButton.setEnabled(false);
editButton.setText(TexlipsePlugin.getResourceString("openEdit"));
editButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
editButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
int index = builderList.getSelectionIndex();
if (index >= 0) {
openEditorDialog(index);
}
}});
Label filler = new Label(rightPart, SWT.LEFT);
filler.setLayoutData(new GridData(GridData.FILL_VERTICAL));
}
/**
* Add "output to console" -checkbox.
* @param contents parent component
*/
private void addConsoleCheckBox(Composite contents) {
Composite checkField = new Composite(contents, SWT.NULL);
GridData checkData = new GridData(GridData.FILL_HORIZONTAL);
checkData.horizontalSpan = 2;
checkField.setLayoutData(checkData);
GridLayout checkLay = new GridLayout();
checkLay.numColumns = 2;
checkField.setLayout(checkLay);
consoleOutputCheckBox = new Button(checkField, SWT.CHECK);
consoleOutputCheckBox.setLayoutData(new GridData());
consoleOutputCheckBox.setText(TexlipsePlugin.getResourceString("preferenceBuilderConsoleOutput"));
consoleOutputCheckBox.setSelection(getPreferenceStore().getBoolean(TexlipseProperties.BUILDER_CONSOLE_OUTPUT));
// checkboxes don't show their help ids (at least on linux)
//WorkbenchHelp.setHelp(consoleOutputCheckBox, TexlipseHelpIds.BUILDER_CONSOLE);
}
/**
* Add "Parse .aux files" -checkbox.
* @param contents parent component
*/
private void addAuxParserCheckBox(Composite contents) {
Composite checkField = new Composite(contents, SWT.NULL);
GridData checkData = new GridData(GridData.FILL_HORIZONTAL);
checkData.horizontalSpan = 2;
checkField.setLayoutData(checkData);
GridLayout checkLay = new GridLayout();
checkLay.numColumns = 2;
checkField.setLayout(checkLay);
auxParserCheckBox = new Button(checkField, SWT.CHECK);
auxParserCheckBox.setLayoutData(new GridData());
auxParserCheckBox.setText(TexlipsePlugin.getResourceString("preferenceBuilderAuxParser"));
auxParserCheckBox.setSelection(getPreferenceStore().getBoolean(TexlipseProperties.BUILDER_PARSE_AUX_FILES));
}
/**
* Called when ok-button (or apply-button) is pressed.
* Saves all the field editor values to preferences.
* @return true
*/
public boolean performOk() {
boolean ok = super.performOk();
getPreferenceStore().setValue(TexlipseProperties.BUILDER_CONSOLE_OUTPUT, consoleOutputCheckBox.getSelection());
getPreferenceStore().setValue(TexlipseProperties.BUILDER_PARSE_AUX_FILES, auxParserCheckBox.getSelection());
changeTexDistribution();
texDirField.setText("");
builderList.setItems(getBuilderItems());
return ok;
}
/**
* Called when defaults-button is pressed.
* Sets all field values to defaults.
* Currently does nothing to builder paths.
*/
public void performDefaults() {
super.performDefaults();
consoleOutputCheckBox.setSelection(getPreferenceStore().getDefaultBoolean(TexlipseProperties.BUILDER_CONSOLE_OUTPUT));
auxParserCheckBox.setSelection(getPreferenceStore().getDefaultBoolean(TexlipseProperties.BUILDER_PARSE_AUX_FILES));
}
/**
* Change the tex distribution of all program runners.
*/
private void changeTexDistribution() {
String texDir = texDirField.getText();
if (texDir != null && texDir.length() > 0) {
File dir = new File(texDir);
if (dir != null && dir.exists() && dir.isDirectory()) {
int size = BuilderRegistry.getNumberOfRunners();
for (int i = 0; i < size; i++) {
ProgramRunner prog = BuilderRegistry.getRunner(i);
File file = new File(dir, prog.getProgramName());
if (file != null && file.exists() && file.isFile()) {
prog.setProgramPath(file.getAbsolutePath());
}
}
}
}
}
/**
* @return list of labels for configurable builders
*/
private String[] getBuilderItems() {
int number = BuilderRegistry.getNumberOfRunners();
String[] array = new String[number];
for (int i = 0; i < number; i++) {
array[i] = getRunnerLabel(i);
}
return array;
}
/**
* @param runner index
* @return label for configurable builder
*/
private String getRunnerLabel(int i) {
ProgramRunner runner = BuilderRegistry.getRunner(i);
return runner.getDescription() + " (" + runner.getProgramPath() + ')';
}
/**
* Opens the BuilderConfigDialog.
* @param index index of the configurable builder
*/
private void openEditorDialog(int index) {
BuilderConfigDialog dialog = new BuilderConfigDialog(getShell(),
BuilderRegistry.getRunner(index));
int code = dialog.open();
if (code == BuilderConfigDialog.OK) {
builderList.setItem(index, getRunnerLabel(index));
}
}
/**
* Page initialization. Does nothing.
*/
public void init(IWorkbench workbench) {
}
}