/* * $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.wizards; import net.sourceforge.texlipse.TexlipsePlugin; import org.eclipse.core.runtime.IStatus; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusAdapter; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.ISharedImages; /** * Filename settings -page on the project creation wizard. * * @author Kimmo Karlsson */ public class TexlipseProjectFilesWizardPage extends TexlipseWizardPage { // textfield for output dir name private Text outputDirNameField; // textfield for output file name private Text outputFileNameField; // textfield for source dir name private Text sourceDirNameField; // textfield for main source file name private Text sourceFileNameField; // textfield for temp dir name private Text tempDirNameField; // tree view of directories private Tree dirTree; // tree view's items private TreeItem projectDirItem; private TreeItem outputDirItem; private TreeItem outputFileItem; private TreeItem sourceDirItem; private TreeItem sourceFileItem; private TreeItem tempDirItem; private TreeItem tempFileItem; // image registry private ISharedImages images; /** * This is the second page on the wizard. Here you set the filenames. * @param attributes project attributes */ public TexlipseProjectFilesWizardPage(TexlipseProjectAttributes attributes) { super(1, attributes); images = TexlipsePlugin.getDefault().getWorkbench().getSharedImages(); } /** * Called when this page is made visible. * This method updates the project name and output format to the * directory tree component. */ public void setVisible(boolean visible) { super.setVisible(visible); projectDirItem.setText(attributes.getProjectName()); outputFileNameField.setText(attributes.getOutputFile()); outputFileItem.setText(attributes.getOutputFile()); } /** * Create the layout of the page. * @param parent parent component in the UI * @return number of components using a status message */ public void createComponents(Composite parent) { addSpacer(parent, 2); Label label = new Label(parent, SWT.LEFT); label.setText(TexlipsePlugin.getResourceString("projectWizardDirTreeLabel")); label.setLayoutData(new GridData()); addSpacer(parent, 1); createTreeControl(parent); Composite right = new Composite(parent, SWT.FILL); right.setLayoutData(new GridData(GridData.FILL_BOTH)); GridLayout gl = new GridLayout(); gl.numColumns = 2; right.setLayout(gl); createOutputDirControl(right); createOutputFileControl(right); createMainDirControl(right); createMainFileControl(right); createTempDirControl(right); } /** * Create a directory tree settings box. * @param parent the parent container */ private void createTreeControl(Composite parent) { dirTree = new Tree(parent, SWT.SINGLE | SWT.BORDER); dirTree.setToolTipText(TexlipsePlugin.getResourceString("projectWizardDirTreeTooltip")); dirTree.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL)); recreateSubTree(); } /** * Rebuild the whole directory tree component. */ private void recreateSubTree() { dirTree.removeAll(); projectDirItem = new TreeItem(dirTree, SWT.LEFT); projectDirItem.setText(attributes.getProjectName()); projectDirItem.setImage(images.getImage(ISharedImages.IMG_OBJ_FOLDER)); String dir = attributes.getOutputDir(); if (dir != null && dir.length() > 0) { outputDirItem = new TreeItem(projectDirItem, SWT.LEFT); outputDirItem.setText(dir); outputDirItem.setImage(images.getImage(ISharedImages.IMG_OBJ_FOLDER)); outputFileItem = new TreeItem(outputDirItem, SWT.LEFT); } else { outputDirItem = null; outputFileItem = new TreeItem(projectDirItem, SWT.LEFT); } outputFileItem.setText(attributes.getOutputFile()); outputFileItem.setImage(images.getImage(ISharedImages.IMG_OBJ_FILE)); dir = attributes.getSourceDir(); if (dir != null && dir.length() > 0) { sourceDirItem = new TreeItem(projectDirItem, SWT.LEFT); sourceDirItem.setText(dir); sourceDirItem.setImage(images.getImage(ISharedImages.IMG_OBJ_FOLDER)); sourceFileItem = new TreeItem(sourceDirItem, SWT.LEFT); } else { sourceDirItem = null; sourceFileItem = new TreeItem(projectDirItem, SWT.LEFT); } sourceFileItem.setText(attributes.getSourceFile()); sourceFileItem.setImage(images.getImage(ISharedImages.IMG_OBJ_FILE)); dir = attributes.getTempDir(); if (dir != null && dir.length() > 0) { tempDirItem = new TreeItem(projectDirItem, SWT.LEFT); tempDirItem.setText(dir); tempDirItem.setImage(images.getImage(ISharedImages.IMG_OBJ_FOLDER)); tempFileItem = new TreeItem(tempDirItem, SWT.LEFT); } else { tempDirItem = null; tempFileItem = new TreeItem(projectDirItem, SWT.LEFT); } tempFileItem.setText(attributes.getTempFile()); tempFileItem.setImage(images.getImage(ISharedImages.IMG_OBJ_FILE)); dirTree.showItem(outputFileItem); dirTree.showItem(sourceFileItem); dirTree.showItem(tempFileItem); } /** * Create the output file name field. * @param composite the parent container */ private void createOutputDirControl(Composite composite) { // add label Label mainLabel = new Label(composite, SWT.LEFT); mainLabel.setText(TexlipsePlugin.getResourceString("projectWizardOutputDirLabel")); mainLabel.setToolTipText(TexlipsePlugin.getResourceString("projectWizardOutputDirTooltip")); mainLabel.setLayoutData(new GridData()); // add text field outputDirNameField = new Text(composite, SWT.SINGLE | SWT.BORDER); outputDirNameField.setText(attributes.getOutputDir()); outputDirNameField.setToolTipText(TexlipsePlugin.getResourceString("projectWizardOutputDirTooltip")); outputDirNameField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); outputDirNameField.addFocusListener(new FocusAdapter() { public void focusGained(FocusEvent event) { if (outputDirItem != null) { dirTree.setSelection(new TreeItem[] { outputDirItem }); } }}); outputDirNameField.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { if (!outputDirNameField.isDisposed()) { String t = outputDirNameField.getText(); attributes.setOutputDir(t); validateDirName(outputDirNameField, t); if (t == null || t.length() == 0) { recreateSubTree(); } else if (outputDirItem == null) { recreateSubTree(); } if (outputDirItem != null) { outputDirItem.setText(t); } } }}); } /** * Create the output file name field. * @param composite the parent container */ private void createOutputFileControl(Composite composite) { // add label Label mainLabel = new Label(composite, SWT.LEFT); mainLabel.setText(TexlipsePlugin.getResourceString("projectWizardOutputFileLabel")); mainLabel.setToolTipText(TexlipsePlugin.getResourceString("projectWizardOutputFileTooltip")); mainLabel.setLayoutData(new GridData()); // add text field outputFileNameField = new Text(composite, SWT.SINGLE | SWT.BORDER); outputFileNameField.setText(attributes.getOutputFile()); outputFileNameField.setToolTipText(TexlipsePlugin.getResourceString("projectWizardOutputFileTooltip")); outputFileNameField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); outputFileNameField.addFocusListener(new FocusAdapter() { public void focusGained(FocusEvent event) { dirTree.setSelection(new TreeItem[] { outputFileItem }); }}); outputFileNameField.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { if (!outputFileNameField.isDisposed()) { String t = outputFileNameField.getText(); outputFileItem.setText(t); validateOutputFileName(t); } }}); } /** * Create the output file name field. * @param composite the parent container */ private void createMainDirControl(Composite composite) { // add label Label mainLabel = new Label(composite, SWT.LEFT); mainLabel.setText(TexlipsePlugin.getResourceString("projectWizardMainDirLabel")); mainLabel.setToolTipText(TexlipsePlugin.getResourceString("projectWizardMainDirTooltip")); mainLabel.setLayoutData(new GridData()); // add text field sourceDirNameField = new Text(composite, SWT.SINGLE | SWT.BORDER); sourceDirNameField.setText(attributes.getSourceDir()); sourceDirNameField.setToolTipText(TexlipsePlugin.getResourceString("projectWizardMainDirTooltip")); sourceDirNameField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); sourceDirNameField.addFocusListener(new FocusAdapter() { public void focusGained(FocusEvent event) { if (sourceDirItem != null) { dirTree.setSelection(new TreeItem[] { sourceDirItem }); } }}); sourceDirNameField.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { if (!sourceDirNameField.isDisposed()) { String t = sourceDirNameField.getText(); attributes.setSourceDir(t); validateDirName(sourceDirNameField, t); if (t == null || t.length() == 0) { recreateSubTree(); } else if (sourceDirItem == null) { recreateSubTree(); } if (sourceDirItem != null) { sourceDirItem.setText(t); } } }}); } /** * Create main file settings box. * @param composite the parent container */ private void createMainFileControl(Composite composite) { // add label Label mainLabel = new Label(composite, SWT.LEFT); mainLabel.setText(TexlipsePlugin.getResourceString("projectWizardMainFileLabel")); mainLabel.setToolTipText(TexlipsePlugin.getResourceString("projectWizardMainFileTooltip")); mainLabel.setLayoutData(new GridData()); // add text field sourceFileNameField = new Text(composite, SWT.SINGLE | SWT.BORDER); sourceFileNameField.setText(attributes.getSourceFile()); sourceFileNameField.setToolTipText(TexlipsePlugin.getResourceString("projectWizardMainFileTooltip")); sourceFileNameField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); sourceFileNameField.addFocusListener(new FocusAdapter() { public void focusGained(FocusEvent event) { dirTree.setSelection(new TreeItem[] { sourceFileItem }); }}); sourceFileNameField.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { if (!sourceFileNameField.isDisposed()) { String t = sourceFileNameField.getText(); sourceFileItem.setText(t); tempFileItem.setText(t.substring(0, t.lastIndexOf('.')+1) + "aux"); validateMainFileName(t); } }}); } /** * Create the output file name field. * @param composite the parent container */ private void createTempDirControl(Composite composite) { // add label Label mainLabel = new Label(composite, SWT.LEFT); mainLabel.setText(TexlipsePlugin.getResourceString("projectWizardTempDirLabel")); mainLabel.setToolTipText(TexlipsePlugin.getResourceString("projectWizardTempDirTooltip")); mainLabel.setLayoutData(new GridData()); // add text field tempDirNameField = new Text(composite, SWT.SINGLE | SWT.BORDER); tempDirNameField.setText(attributes.getTempDir()); tempDirNameField.setToolTipText(TexlipsePlugin.getResourceString("projectWizardTempDirTooltip")); tempDirNameField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); tempDirNameField.addFocusListener(new FocusAdapter() { public void focusGained(FocusEvent event) { if (tempDirItem != null) { dirTree.setSelection(new TreeItem[] { tempDirItem }); } }}); tempDirNameField.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { if (!tempDirNameField.isDisposed()) { String t = tempDirNameField.getText(); attributes.setTempDir(t); validateDirName(tempDirNameField, t); if (t == null || t.length() == 0) { recreateSubTree(); } else if (tempDirItem == null) { recreateSubTree(); } if (tempDirItem != null) { tempDirItem.setText(t); } } }}); } /** * Check that the given name corresponds to a valid directory. * @param text the directory name */ private void validateDirName(Text field, String text) { IStatus status = null; if (text.indexOf('/') >= 0 || text.indexOf('\\') >= 0) { status = createStatus(IStatus.ERROR, TexlipsePlugin.getResourceString("projectWizardDirNameError")); } else { status = createStatus(IStatus.OK, TexlipsePlugin.getResourceString("projectWizardOutputFileNameOk")); } updateStatus(status, field); } /** * Check that the given name corresponds to the current output format. * @param text the file name */ private void validateOutputFileName(String text) { String out = attributes.getOutputFormat(); IStatus status = null; if (!text.toLowerCase().endsWith('.' + out)) { status = createStatus(IStatus.ERROR, TexlipsePlugin.getResourceString("projectWizardOutputFileNameError").replaceFirst("%s", out)); } else { status = createStatus(IStatus.OK, TexlipsePlugin.getResourceString("projectWizardOutputFileNameOk")); attributes.setOutputFile(text); } updateStatus(status, outputFileNameField); } /** * Check if the given name is a ".tex" file name. * @param text */ private void validateMainFileName(String text) { IStatus status = null; if (!text.toLowerCase().endsWith(".tex") && !text.toLowerCase().endsWith(".ltx")) { status = createStatus(IStatus.ERROR, TexlipsePlugin.getResourceString("projectWizardFileNameError")); } else { status = createStatus(IStatus.OK, TexlipsePlugin.getResourceString("projectWizardFileNameOk")); attributes.setSourceFile(text); } updateStatus(status, sourceFileNameField); } }