| /******************************************************************************* |
| * Copyright (c) 2005, 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.BufferedInputStream; |
| import java.io.ByteArrayInputStream; |
| import java.io.File; |
| import java.io.FileInputStream; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.UnsupportedEncodingException; |
| import java.net.URI; |
| |
| import org.eclipse.core.runtime.Assert; |
| import org.eclipse.core.runtime.CoreException; |
| |
| import org.eclipse.ltk.core.refactoring.RefactoringCore; |
| import org.eclipse.ltk.core.refactoring.RefactoringDescriptor; |
| |
| import org.eclipse.ltk.internal.core.refactoring.IRefactoringSerializationConstants; |
| import org.eclipse.ltk.internal.ui.refactoring.IRefactoringHelpContextIds; |
| import org.eclipse.ltk.internal.ui.refactoring.RefactoringUIPlugin; |
| |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.dnd.Clipboard; |
| import org.eclipse.swt.dnd.TextTransfer; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Group; |
| |
| import org.eclipse.jface.dialogs.Dialog; |
| import org.eclipse.jface.wizard.WizardPage; |
| |
| import org.eclipse.ui.PlatformUI; |
| |
| /** |
| * First page of the apply refactoring script wizard. |
| * |
| * @since 3.2 |
| */ |
| public final class ApplyRefactoringScriptWizardPage extends WizardPage { |
| |
| /** The apply refactoring script wizard page name */ |
| private static final String PAGE_NAME= "ApplyRefactoringScriptWizardPage"; //$NON-NLS-1$ |
| |
| /** Is the wizard page displayed for the first time? */ |
| private boolean fFirstTime= true; |
| |
| /** The refactoring script location control */ |
| private RefactoringScriptLocationControl fLocationControl= null; |
| |
| /** The apply script wizard */ |
| private final ApplyRefactoringScriptWizard fWizard; |
| |
| /** |
| * Creates a new apply refactoring script wizard page. |
| * |
| * @param wizard |
| * the associated wizard |
| */ |
| public ApplyRefactoringScriptWizardPage(final ApplyRefactoringScriptWizard wizard) { |
| super(PAGE_NAME); |
| Assert.isNotNull(wizard); |
| fWizard= wizard; |
| setTitle(ScriptingMessages.ApplyRefactoringScriptWizard_title); |
| setDescription(ScriptingMessages.ApplyRefactoringScriptWizard_description); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| public boolean canFlipToNextPage() { |
| return super.canFlipToNextPage(); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| public void createControl(final Composite parent) { |
| initializeDialogUnits(parent); |
| final Composite composite= new Composite(parent, SWT.NONE); |
| composite.setLayout(new GridLayout()); |
| composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL)); |
| |
| final Group group= new Group(composite, SWT.NONE); |
| group.setText(ScriptingMessages.ApplyRefactoringScriptWizardPage_location_caption); |
| final GridLayout layout= new GridLayout(); |
| layout.marginWidth= 0; |
| group.setLayout(layout); |
| group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| |
| fLocationControl= new RefactoringScriptLocationControl(fWizard, group) { |
| |
| protected final void handleClipboardScriptChanged() { |
| super.handleClipboardScriptChanged(); |
| ApplyRefactoringScriptWizardPage.this.fWizard.setRefactoringHistory(null); |
| setErrorMessage(null); |
| setPageComplete(true); |
| handleClipboardChanged(); |
| } |
| |
| protected final void handleExternalLocationChanged() { |
| super.handleExternalLocationChanged(); |
| ApplyRefactoringScriptWizardPage.this.fWizard.setRefactoringHistory(null); |
| setErrorMessage(null); |
| setPageComplete(true); |
| handleLocationChanged(); |
| } |
| }; |
| setPageComplete(false); |
| fLocationControl.loadHistory(); |
| fFirstTime= false; |
| setControl(composite); |
| Dialog.applyDialogFont(composite); |
| PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IRefactoringHelpContextIds.REFACTORING_APPLY_SCRIPT_PAGE); |
| } |
| |
| /** |
| * Handles the clipboard changed event. |
| */ |
| private void handleClipboardChanged() { |
| Clipboard clipboard= null; |
| try { |
| clipboard= new Clipboard(fLocationControl.getDisplay()); |
| final Object contents= clipboard.getContents(TextTransfer.getInstance()); |
| if (contents == null) { |
| setErrorMessage(ScriptingMessages.ApplyRefactoringScriptWizardPage_empty_clipboard); |
| setPageComplete(false); |
| return; |
| } |
| if (contents instanceof String) { |
| final String script= (String) contents; |
| try { |
| final ByteArrayInputStream stream= new ByteArrayInputStream(script.getBytes(IRefactoringSerializationConstants.OUTPUT_ENCODING)); |
| fWizard.setRefactoringHistory(RefactoringCore.getHistoryService().readRefactoringHistory(stream, RefactoringDescriptor.NONE)); |
| } catch (UnsupportedEncodingException exception) { |
| // Does not happen |
| } catch (CoreException exception) { |
| setErrorMessage(ScriptingMessages.ApplyRefactoringScriptWizardPage_no_script_clipboard); |
| setPageComplete(false); |
| return; |
| } |
| } else { |
| setErrorMessage(ScriptingMessages.ApplyRefactoringScriptWizardPage_no_text_clipboard); |
| setPageComplete(false); |
| } |
| } finally { |
| if (clipboard != null) |
| clipboard.dispose(); |
| } |
| } |
| |
| /** |
| * Handles the location changed event. |
| */ |
| private void handleLocationChanged() { |
| final URI uri= fLocationControl.getRefactoringScript(); |
| if (uri == null) { |
| setErrorMessage(ScriptingMessages.ApplyRefactoringScriptWizardPage_invalid_location); |
| setPageComplete(false); |
| return; |
| } |
| final File file= new File(uri); |
| if (!file.exists()) { |
| setErrorMessage(ScriptingMessages.ApplyRefactoringScriptWizardPage_invalid_script_file); |
| setPageComplete(false); |
| return; |
| } |
| InputStream stream= null; |
| try { |
| stream= new BufferedInputStream(new FileInputStream(file)); |
| fWizard.setRefactoringHistory(RefactoringCore.getHistoryService().readRefactoringHistory(stream, RefactoringDescriptor.NONE)); |
| } catch (IOException exception) { |
| setErrorMessage(ScriptingMessages.ApplyRefactoringScriptWizardPage_error_cannot_read); |
| setPageComplete(false); |
| return; |
| } catch (CoreException exception) { |
| setErrorMessage(ScriptingMessages.ApplyRefactoringScriptWizardPage_invalid_format); |
| setPageComplete(false); |
| return; |
| } finally { |
| if (stream != null) { |
| try { |
| stream.close(); |
| } catch (IOException exception) { |
| // Do nothing |
| } |
| } |
| } |
| } |
| |
| /** |
| * Gets called if the wizard is finished. |
| */ |
| public void performFinish() { |
| fLocationControl.saveHistory(); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| public void setErrorMessage(final String message) { |
| if (!fFirstTime) |
| super.setErrorMessage(message); |
| else |
| setMessage(message, NONE); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| public void setVisible(final boolean visible) { |
| if (visible) { |
| final URI uri= fWizard.getRefactoringScript(); |
| if (uri != null) { |
| fWizard.setRefactoringScript(null); |
| try { |
| fLocationControl.setRefactoringScript(uri); |
| handleLocationChanged(); |
| } catch (IllegalArgumentException exception) { |
| RefactoringUIPlugin.log(exception); |
| } |
| } |
| } |
| super.setVisible(visible); |
| } |
| } |