/* * $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.viewer; import java.io.File; import net.sourceforge.texlipse.TexlipsePlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Platform; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.ui.AbstractLaunchConfigurationTab; import org.eclipse.jface.resource.JFaceResources; 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.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; 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.FileDialog; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; /** * The tab containing Latex previewer configuration. * * @author Kimmo Karlsson * @author Tor Arne Vestb� */ public class TexLaunchConfigurationTab extends AbstractLaunchConfigurationTab { // list of viewers private Combo choiceCombo; // the viewer command private Text commandField; // the viewer arguments private Text argumentField; // button to launch the file browser private Button commandBrowserButton; // a copy of the viewer attributes private ViewerAttributeRegistry registry; private DDEGroup ddeCloseGroup; private DDEGroup ddeViewGroup; // true if we are populating the whole tab with new information private boolean isUpdatingFields = false; /** * Construct a new ConfigurationTab. */ public TexLaunchConfigurationTab() { registry = new ViewerAttributeRegistry(); } /** * Creates the top level control for this launch configuration * tab under the given parent composite. This method is called once on * tab creation, after <code>setLaunchConfigurationDialog</code> * is called. * <p> * Implementors are responsible for ensuring that * the created control can be accessed via <code>getControl</code> * </p> * * @param parent the parent composite */ public void createControl(Composite parent) { Composite composite = new Composite(parent, SWT.FILL); GridLayout layout = new GridLayout(); layout.numColumns = 3; composite.setLayout(layout); composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); createVerticalSpacer(composite, 3); Label choiceLabel = new Label(composite, SWT.LEFT); choiceLabel.setText(TexlipsePlugin.getResourceString("launchTabChoiceLabel")); choiceLabel.setToolTipText(TexlipsePlugin.getResourceString("launchTabChoiceTooltip")); choiceLabel.setLayoutData(new GridData()); choiceCombo = new Combo(composite, SWT.DROP_DOWN); choiceCombo.setToolTipText(TexlipsePlugin.getResourceString("launchTabChoiceTooltip")); GridData cgd = new GridData(); cgd.horizontalSpan = 2; choiceCombo.setLayoutData(cgd); String[] viewers = registry.getViewerList(); choiceCombo.setItems(viewers); choiceCombo.select(registry.getActiveViewerIndex(viewers)); choiceCombo.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { updateFields(choiceCombo.getSelectionIndex()); }}); createVerticalSpacer(composite, 3); Label commandLabel = new Label(composite, SWT.LEFT); commandLabel.setText(TexlipsePlugin.getResourceString("launchTabCommandLabel")); commandLabel.setToolTipText(TexlipsePlugin.getResourceString("launchTabCommandTooltip")); commandLabel.setLayoutData(new GridData()); commandField = new Text(composite, SWT.SINGLE | SWT.WRAP | SWT.BORDER); commandField.setToolTipText(TexlipsePlugin.getResourceString("launchTabCommandTooltip")); commandField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL)); commandField.addFocusListener(new FocusAdapter() { public void focusLost(FocusEvent e) { File f = new File(commandField.getText()); if (!f.exists()) { setErrorMessage(TexlipsePlugin.getResourceString("launchTabCommandError")); } }}); commandField.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { updateLaunchConfigurationDialog(); } }); commandBrowserButton = new Button(composite, SWT.PUSH); commandBrowserButton.setText(JFaceResources.getString("openChange")); commandBrowserButton.setToolTipText(TexlipsePlugin.getResourceString("launchTabCommandTooltip")); commandBrowserButton.setLayoutData(new GridData()); commandBrowserButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { FileDialog dialog = new FileDialog(commandBrowserButton.getShell(), SWT.OPEN); String file = dialog.open(); if (file != null && file.length() > 0) { File f = new File(file); if (f.exists()) { commandField.setText(file); } } }}); createVerticalSpacer(composite, 3); Label argumentLabel = new Label(composite, SWT.LEFT); argumentLabel.setText(TexlipsePlugin.getResourceString("launchTabArgumentsLabel")); argumentLabel.setToolTipText(TexlipsePlugin.getResourceString("launchTabArgumentsTooltip")); argumentLabel.setLayoutData(new GridData()); argumentField = new Text(composite, SWT.SINGLE | SWT.WRAP | SWT.BORDER); argumentField.setToolTipText(TexlipsePlugin.getResourceString("launchTabArgumentsTooltip")); argumentField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL)); argumentField.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { updateLaunchConfigurationDialog(); } }); addDDEGroups(composite); setControl(composite); } /** * Handle the change of selected item in the viewer list. * @param selectionIndex currently selected item */ private void updateFields(int selectionIndex) { isUpdatingFields = true; registry.setCommand(commandField.getText()); registry.setArguments(argumentField.getText()); registry.setDDEViewCommand(ddeViewGroup.command.getText()); registry.setDDEViewServer(ddeViewGroup.server.getText()); registry.setDDEViewTopic(ddeViewGroup.topic.getText()); registry.setDDECloseCommand(ddeCloseGroup.command.getText()); registry.setDDECloseServer(ddeCloseGroup.server.getText()); registry.setDDECloseTopic(ddeCloseGroup.topic.getText()); String viewer = choiceCombo.getItem(selectionIndex); registry.setActiveViewer(viewer); String command = registry.getCommand(); if (command == null) { command = ""; } commandField.setText(command); String arguments = registry.getArguments(); if (arguments == null) { arguments = ""; } argumentField.setText(arguments); ddeViewGroup.command.setText(registry.getDDEViewCommand()); ddeViewGroup.server.setText(registry.getDDEViewServer()); ddeViewGroup.topic.setText(registry.getDDEViewTopic()); ddeCloseGroup.command.setText(registry.getDDECloseCommand()); ddeCloseGroup.server.setText(registry.getDDECloseServer()); ddeCloseGroup.topic.setText(registry.getDDECloseTopic()); updateLaunchConfigurationDialog(); isUpdatingFields = false; } /** * Initializes the given launch configuration with * default values for this tab. This method * is called when a new launch configuration is created * such that the configuration can be initialized with * meaningful values. This method may be called before this * tab's control is created. * * If the configuration parameter contains an attribute named * 'viewerCurrent', the tab is initialized with the default values * for the given viewer. The given viewer is expected to exist. * * @param configuration launch configuration */ public void setDefaults(ILaunchConfigurationWorkingCopy configuration) { try { String viewer = configuration.getAttribute("viewerCurrent", registry.getActiveViewer()); registry.setActiveViewer(viewer); configuration.setAttribute(ViewerAttributeRegistry.VIEWER_CURRENT, viewer); configuration.setAttribute(viewer + ViewerAttributeRegistry.ATTRIBUTE_COMMAND, registry.getCommand()); configuration.setAttribute(viewer + ViewerAttributeRegistry.ATTRIBUTE_ARGUMENTS, registry.getArguments()); configuration.setAttribute(viewer + ViewerAttributeRegistry.ATTRIBUTE_DDE_VIEW_COMMAND, registry.getDDEViewCommand()); configuration.setAttribute(viewer + ViewerAttributeRegistry.ATTRIBUTE_DDE_VIEW_SERVER, registry.getDDEViewServer()); configuration.setAttribute(viewer + ViewerAttributeRegistry.ATTRIBUTE_DDE_VIEW_TOPIC, registry.getDDEViewTopic()); configuration.setAttribute(viewer + ViewerAttributeRegistry.ATTRIBUTE_DDE_CLOSE_COMMAND, registry.getDDECloseCommand()); configuration.setAttribute(viewer + ViewerAttributeRegistry.ATTRIBUTE_DDE_CLOSE_SERVER, registry.getDDECloseServer()); configuration.setAttribute(viewer + ViewerAttributeRegistry.ATTRIBUTE_DDE_CLOSE_TOPIC, registry.getDDECloseTopic()); } catch (CoreException e) { TexlipsePlugin.log("Initializing launch configuration", e); } } /** * Initializes this tab's controls with values from the given * launch configuration. This method is called when * a configuration is selected to view or edit, after this * tab's control has been created. * * @param configuration launch configuration */ public void initializeFrom(ILaunchConfiguration configuration) { try { registry.setValues(configuration.getAttributes()); String[] viewers = registry.getViewerList(); choiceCombo.setItems(viewers); choiceCombo.select(registry.getActiveViewerIndex(viewers)); commandField.setText(registry.getCommand()); argumentField.setText(registry.getArguments()); ddeViewGroup.command.setText(registry.getDDEViewCommand()); ddeViewGroup.server.setText(registry.getDDEViewServer()); ddeViewGroup.topic.setText(registry.getDDEViewTopic()); ddeCloseGroup.command.setText(registry.getDDECloseCommand()); ddeCloseGroup.server.setText(registry.getDDECloseServer()); ddeCloseGroup.topic.setText(registry.getDDECloseTopic()); } catch (CoreException e) { TexlipsePlugin.log("Reading launch configuration", e); } } /** * Copies values from this tab into the given * launch configuration. * * @param configuration launch configuration */ public void performApply(ILaunchConfigurationWorkingCopy configuration) { registry.setActiveViewer(choiceCombo.getItem(choiceCombo.getSelectionIndex())); registry.setCommand(commandField.getText()); registry.setArguments(argumentField.getText()); registry.setDDEViewCommand(ddeViewGroup.command.getText()); registry.setDDEViewServer(ddeViewGroup.server.getText()); registry.setDDEViewTopic(ddeViewGroup.topic.getText()); registry.setDDECloseCommand(ddeCloseGroup.command.getText()); registry.setDDECloseServer(ddeCloseGroup.server.getText()); registry.setDDECloseTopic(ddeCloseGroup.topic.getText()); configuration.setAttributes(registry.asMap()); } /** * Returns the image of this tab. * @return the image of this tab */ public Image getImage() { return TexlipsePlugin.getImage("sample"); } /** * Returns the name of this tab. * * @return the name of this tab */ public String getName() { return TexlipsePlugin.getResourceString("launchTabTitle"); } /** * Only update the fields if we are done filling them in */ protected void updateLaunchConfigurationDialog() { if (!isUpdatingFields) super.updateLaunchConfigurationDialog(); } /** * Creates the two groups for DDE view and close * * @param composite * parent component */ private void addDDEGroups(Composite composite) { ddeViewGroup = new DDEGroup(composite, TexlipsePlugin.getResourceString("preferenceViewerDDEViewLabel"), TexlipsePlugin.getResourceString("preferenceViewerDDEViewTooltip")); ddeCloseGroup = new DDEGroup(composite, TexlipsePlugin.getResourceString("preferenceViewerDDECloseLabel"), TexlipsePlugin.getResourceString("preferenceViewerDDECloseTooltip")); // Only show DDE configuration if on Win32 if (Platform.getOS().equals(Platform.OS_WIN32)) { ddeViewGroup.setVisible(true); ddeCloseGroup.setVisible(true); } } private class DDEGroup extends Composite { // Public members since the class is private to the dialog public Text command; public Text server; public Text topic; public DDEGroup(Composite parent, String name, String toolTip) { super(parent, SWT.NONE); setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); ((GridData)getLayoutData()).horizontalSpan = 2; setLayout( new GridLayout()); Group group = new Group(this, SWT.SHADOW_IN); group.setText(name); group.setToolTipText(toolTip); group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); group.setLayout(new GridLayout(4, false)); Label ddeCommandLabel = new Label(group, SWT.LEFT); ddeCommandLabel.setText(TexlipsePlugin.getResourceString("preferenceViewerDDECommandLabel")); ddeCommandLabel.setToolTipText(TexlipsePlugin.getResourceString("preferenceViewerDDECommandTooltip")); ddeCommandLabel.setLayoutData(new GridData()); command = new Text(group, SWT.SINGLE | SWT.BORDER); command.setToolTipText(TexlipsePlugin.getResourceString("preferenceViewerDDECommandTooltip")); command.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); command.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { updateLaunchConfigurationDialog(); } }); ((GridData) command.getLayoutData()).horizontalSpan = 3; Label ddeServerLabel = new Label(group, SWT.LEFT); ddeServerLabel.setText(TexlipsePlugin.getResourceString("preferenceViewerDDEServerLabel")); ddeServerLabel.setToolTipText(TexlipsePlugin.getResourceString("preferenceViewerDDEServerTooltip")); ddeServerLabel.setLayoutData(new GridData()); server = new Text(group, SWT.SINGLE | SWT.BORDER); server.setToolTipText(TexlipsePlugin.getResourceString("preferenceViewerDDEServerTooltip")); server.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); server.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { updateLaunchConfigurationDialog(); } }); Label ddeTopicLabel = new Label(group, SWT.LEFT); ddeTopicLabel.setText(TexlipsePlugin.getResourceString("preferenceViewerDDETopicLabel")); ddeTopicLabel.setToolTipText(TexlipsePlugin.getResourceString("preferenceViewerDDETopicTooltip")); ddeTopicLabel.setLayoutData(new GridData()); topic = new Text(group, SWT.SINGLE | SWT.BORDER); topic.setToolTipText(TexlipsePlugin.getResourceString("preferenceViewerDDETopicTooltip")); topic.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); topic.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { updateLaunchConfigurationDialog(); } }); setVisible(false); } } }