blob: 9a20346d13fb0e9a9693d2307d2f377fb9777b9a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ltk.internal.ui.refactoring.scripting;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import org.eclipse.core.runtime.Assert;
import org.eclipse.ltk.internal.ui.refactoring.RefactoringLocationControl;
import org.eclipse.ltk.internal.ui.refactoring.RefactoringUIPlugin;
import org.eclipse.ltk.internal.ui.refactoring.util.SWTUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
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.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.FileDialog;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.wizard.IWizard;
/**
* Control to specify the location of a refactoring script.
*
* @since 3.2
*/
public class RefactoringScriptLocationControl extends Composite {
/** The clipboard dialog setting */
protected static final String SETTING_CLIPBOARD= "org.eclipse.ltk.ui.refactoring.useClipboard"; //$NON-NLS-1$
/** The history dialog setting */
protected static final String SETTING_HISTORY= "org.eclipse.ltk.ui.refactoring.scriptHistory"; //$NON-NLS-1$
/** The external browse button */
protected Button fExternalBrowseButton= null;
/** The location control */
protected RefactoringLocationControl fExternalLocationControl= null;
/** The from clipboard button */
protected Button fFromClipboardButton= null;
/** The from external location button */
protected Button fFromExternalLocationButton= null;
/** The script location, or <code>null</code> */
protected URI fScriptLocation= null;
/** The parent wizard */
protected final IWizard fWizard;
/**
* Creates a new refactoring script location control.
*
* @param wizard
* the parent wizard
* @param parent
* the parent control
*/
public RefactoringScriptLocationControl(final IWizard wizard, final Composite parent) {
super(parent, SWT.NONE);
Assert.isNotNull(wizard);
fWizard= wizard;
setLayoutData(createGridData(GridData.FILL_HORIZONTAL, 6, 0));
setLayout(new GridLayout(3, false));
boolean clipboard= false;
final IDialogSettings settings= fWizard.getDialogSettings();
if (settings != null)
clipboard= settings.getBoolean(SETTING_CLIPBOARD);
fFromClipboardButton= new Button(this, SWT.RADIO);
fFromClipboardButton.setText(ScriptingMessages.ScriptLocationControl_clipboard_label);
fFromClipboardButton.setLayoutData(createGridData(GridData.HORIZONTAL_ALIGN_BEGINNING, 3, 0));
fFromClipboardButton.setSelection(clipboard);
fFromClipboardButton.addSelectionListener(new SelectionAdapter() {
public final void widgetSelected(final SelectionEvent event) {
final boolean selection= fFromClipboardButton.getSelection();
fExternalLocationControl.setEnabled(!selection);
fExternalBrowseButton.setEnabled(!selection);
handleClipboardScriptChanged();
}
});
fFromExternalLocationButton= new Button(this, SWT.RADIO);
fFromExternalLocationButton.setText(ScriptingMessages.ScriptLocationControl_location_label);
fFromExternalLocationButton.setLayoutData(createGridData(GridData.HORIZONTAL_ALIGN_BEGINNING, 1, 0));
fFromExternalLocationButton.setSelection(!clipboard);
fFromExternalLocationButton.addSelectionListener(new SelectionAdapter() {
public final void widgetSelected(final SelectionEvent event) {
handleExternalLocationChanged();
}
});
fExternalLocationControl= new RefactoringLocationControl(fWizard, this, SETTING_HISTORY);
fExternalLocationControl.setLayoutData(createGridData(GridData.FILL_HORIZONTAL, 1, 0));
fExternalLocationControl.setEnabled(!clipboard);
fExternalLocationControl.getControl().addModifyListener(new ModifyListener() {
public final void modifyText(final ModifyEvent event) {
handleExternalLocationChanged();
}
});
fExternalLocationControl.getControl().addSelectionListener(new SelectionAdapter() {
public void widgetSelected(final SelectionEvent event) {
handleExternalLocationChanged();
}
});
if (!clipboard)
fExternalLocationControl.setFocus();
fExternalBrowseButton= new Button(this, SWT.PUSH);
fExternalBrowseButton.setText(ScriptingMessages.ScriptLocationControl_browse_label);
fExternalBrowseButton.setEnabled(!clipboard);
fExternalBrowseButton.setLayoutData(createGridData(GridData.HORIZONTAL_ALIGN_FILL, 1, 0));
SWTUtil.setButtonDimensionHint(fExternalBrowseButton);
fExternalBrowseButton.addSelectionListener(new SelectionAdapter() {
public final void widgetSelected(final SelectionEvent event) {
handleBrowseExternalLocation();
}
});
addDisposeListener(new DisposeListener() {
public final void widgetDisposed(final DisposeEvent event) {
if (settings != null)
settings.put(SETTING_CLIPBOARD, fFromClipboardButton.getSelection());
}
});
}
/**
* Creates a new grid data.
*
* @param flag
* the flags to use
* @param hspan
* the horizontal span
* @param indent
* the indent
* @return the grid data
*/
protected GridData createGridData(final int flag, final int hspan, final int indent) {
final GridData data= new GridData(flag);
data.horizontalIndent= indent;
data.horizontalSpan= hspan;
return data;
}
/**
* Returns the chosen refactoring script location.
*
* @return the refactoring script location, or <code>null</code> if no
* refactoring script has been chosen, or the refactoring script
* should be taken from the clipboard
*/
public URI getRefactoringScript() {
return fScriptLocation;
}
/**
* Handles the browse external location event.
*/
protected void handleBrowseExternalLocation() {
final FileDialog file= new FileDialog(getShell(), SWT.OPEN);
file.setText(ScriptingMessages.ScriptLocationControl_browse_caption);
file.setFilterNames(new String[] { ScriptingMessages.ScriptLocationControl_filter_name_script, ScriptingMessages.ScriptLocationControl_filter_name_wildcard});
file.setFilterExtensions(new String[] { ScriptingMessages.ScriptLocationControl_filter_extension_script, ScriptingMessages.ScriptLocationControl_filter_extension_wildcard});
final String path= file.open();
if (path != null)
fExternalLocationControl.setText(path);
}
/**
* Handles the clipboard script changed event.
*/
protected void handleClipboardScriptChanged() {
// Do nothing
}
/**
* Handles the external location changed event.
*/
protected void handleExternalLocationChanged() {
final String text= fExternalLocationControl.getText();
if (text != null && !"".equals(text)) //$NON-NLS-1$
fScriptLocation= new File(text).toURI();
else
fScriptLocation= null;
}
/**
* Loads the history of this control.
*/
public void loadHistory() {
fExternalLocationControl.loadHistory();
}
/**
* Saves the history of this control.
*/
public void saveHistory() {
fExternalLocationControl.saveHistory();
}
/**
* Sets the refactoring script location to choose.
*
* @param uri
* the refactoring script location, or <code>null</code> if no
* refactoring script has been chosen, or the refactoring script
* should be taken from the clipboard
*/
public void setRefactoringScript(final URI uri) {
if (fExternalLocationControl != null)
fExternalLocationControl.setEnabled(true);
if (fExternalBrowseButton != null)
fExternalBrowseButton.setEnabled(true);
if (uri == null)
fExternalLocationControl.setText(""); //$NON-NLS-1$
else {
try {
final String path= new File(uri).getCanonicalPath();
if (path != null && !"".equals(path)) //$NON-NLS-1$
fExternalLocationControl.setText(path);
handleExternalLocationChanged();
} catch (IOException exception) {
RefactoringUIPlugin.log(exception);
}
}
}
}