/*=============================================================================# # Copyright (c) 2007-2016 Stephan Wahlbrink (WalWare.de) 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: # Stephan Wahlbrink - initial API and implementation #=============================================================================*/ package de.walware.statet.r.internal.ui.graphics; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.UpdateValueStrategy; import org.eclipse.core.databinding.observable.Realm; import org.eclipse.core.databinding.observable.value.WritableValue; import org.eclipse.core.filesystem.EFS; import org.eclipse.core.filesystem.IFileStore; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.databinding.swt.SWTObservables; import org.eclipse.jface.databinding.wizard.WizardPageSupport; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.wizard.Wizard; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; 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.Group; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.statushandlers.StatusManager; import de.walware.ecommons.io.FileValidator; import de.walware.ecommons.ui.util.DialogUtil; import de.walware.ecommons.ui.util.LayoutUtil; import de.walware.ecommons.ui.util.UIAccess; import de.walware.ecommons.ui.workbench.ResourceInputComposite; import de.walware.ecommons.variables.core.StaticVariable; import de.walware.statet.nico.core.runtime.ToolProcess; import de.walware.statet.nico.ui.util.ToolInfoGroup; import de.walware.rj.eclient.IRToolService; import de.walware.rj.eclient.graphics.IERGraphic; import de.walware.rj.eclient.graphics.utils.CopyToDevRunnable; import de.walware.statet.r.console.core.IRBasicAdapter; import de.walware.statet.r.core.RUtil; import de.walware.statet.r.internal.ui.RUIPlugin; import de.walware.statet.r.ui.RUI; /** * Wizard to save R graphic to file. */ public class StatetRGraphicCopyToDevWizard extends Wizard { private class ConfigPage extends WizardPage { private static final String SETTINGS_HISTORY = "todev.file-"; //$NON-NLS-1$ private static final String SETTINGS_OPEN = "open.file-"; //$NON-NLS-1$ private final String fSettingType; private final WritableValue fNewLocationString; private final WritableValue fOpenFileValue; private ResourceInputComposite fLocationGroup; private Button fOpenFileControl; private DataBindingContext fDbc; public ConfigPage() { super("Config"); //$NON-NLS-1$ fSettingType = fDevAbbr.toLowerCase(); setTitle(NLS.bind("Save Graphic as {0} using R", fDevAbbr.toUpperCase())); setDescription("Select the file to save the graphic to."); final Realm realm= Realm.getDefault(); this.fNewLocationString= new WritableValue(realm, "", String.class); this.fOpenFileValue= new WritableValue(realm, Boolean.FALSE, Boolean.class); } @Override public void createControl(final Composite parent) { initializeDialogUnits(parent); final Composite container = new Composite(parent, SWT.NONE); container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); container.setLayout(new GridLayout()); setControl(container); createContents(container); LayoutUtil.addSmallFiller(container, true); final ToolInfoGroup info = new ToolInfoGroup(container, fTool); info.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); Dialog.applyDialogFont(container); // initFields(); // validate(); setErrorMessage(null); setMessage(null); } protected void createContents(final Composite container) { fLocationGroup = new ResourceInputComposite(container, ResourceInputComposite.STYLE_COMBO, ResourceInputComposite.MODE_FILE | ResourceInputComposite.MODE_SAVE, "Graphic File"); final IFileStore wd = fTool.getWorkspaceData().getWorkspaceDir(); if (wd != null) { fLocationGroup.getValidator().setRelative( new StaticVariable("wd", null, wd.toString()), //$NON-NLS-1$ IStatus.WARNING); } else { fLocationGroup.getValidator().setIgnoreRelative(true); } fLocationGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); fLocationGroup.setHistory(getDialogSettings().getArray(SETTINGS_HISTORY+fSettingType)); { final Group group = new Group(container, SWT.DEFAULT); group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); group.setLayout(LayoutUtil.applyGroupDefaults(new GridLayout(), 1)); fOpenFileControl = new Button(group, SWT.CHECK); fOpenFileControl.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); fOpenFileControl.setText("&Open file when finished"); } final Realm realm = Realm.getDefault(); fDbc = new DataBindingContext(realm); fDbc.bindValue(fLocationGroup.getObservable(), fNewLocationString, new UpdateValueStrategy().setAfterGetValidator(fLocationGroup.getValidator()), null); fDbc.bindValue(fOpenFileValue, SWTObservables.observeSelection(fOpenFileControl)); fOpenFileValue.setValue(getDialogSettings().getBoolean(SETTINGS_OPEN+fSettingType)); WizardPageSupport.create(this, fDbc); } public void saveSettings() { final IDialogSettings settings = getDialogSettings(); DialogUtil.saveHistorySettings(settings, SETTINGS_HISTORY+fSettingType, (String) fNewLocationString.getValue()); settings.put(SETTINGS_OPEN+fSettingType, ((Boolean) fOpenFileValue.getValue()).booleanValue()); } public FileValidator getValidator() throws CoreException { return fLocationGroup.getValidator(); } public boolean getOpen() { return ((Boolean) fOpenFileValue.getValue()).booleanValue(); } @Override public void dispose() { if (fDbc != null) { fDbc.dispose(); fDbc = null; } super.dispose(); } } private final ToolProcess fTool; private final IERGraphic fGraphic; private final String fDevCmd; private final String fDevAbbr; private ConfigPage fPage; public StatetRGraphicCopyToDevWizard(final ToolProcess tool, final IERGraphic graphic, final String devCmd, final String devAbbr) { fTool = tool; fGraphic = graphic; fDevCmd = devCmd; fDevAbbr = devAbbr; setDialogSettings(DialogUtil.getDialogSettings(RUIPlugin.getDefault(), "GraphicCopyToDev-Wizard")); //$NON-NLS-1$ setWindowTitle("Save Graphic using R"); setNeedsProgressMonitor(false); } @Override public void addPages() { fPage = new ConfigPage(); addPage(fPage); } @Override public boolean performFinish() { if (!fTool.isTerminated()) { try { final FileValidator validator = fPage.getValidator(); final IPath relative = (validator.isRelativeFile()) ? validator.getRelativeFile() : null; final IFileStore absolute = (relative == null) ? validator.getFileStore() : null; final String path = (relative != null) ? relative.toString() : fTool.getWorkspaceData().toToolPath(absolute); final boolean open = fPage.getOpen(); final IWorkbenchPage workbenchPage = UIAccess.getActiveWorkbenchPage(true); fGraphic.getRHandle().getQueue().add(new CopyToDevRunnable( fGraphic, fDevCmd, RUtil.escapeCompletely(path), "onefile= TRUE, paper= \"special\"") { @Override public void run(final IRToolService r, final IProgressMonitor monitor) throws CoreException { super.run(r, monitor); if (open) { final IFileStore fileName; if (relative != null) { ((IRBasicAdapter) r).refreshWorkspaceData(0, monitor); final IFileStore wd = fTool.getWorkspaceData().getWorkspaceDir(); if (wd == null) { return; } fileName = wd.getFileStore(relative); } else { fileName = absolute; } if (fileName != null && fileName.fetchInfo(EFS.NONE, monitor).exists()) { UIAccess.getDisplay().asyncExec(new Runnable() { @Override public void run() { try { IWorkbenchPage page = workbenchPage; if (page == null || page.getWorkbenchWindow().getShell() == null) { page = UIAccess.getActiveWorkbenchPage(true); } if (page == null) { return; } IDE.openEditorOnFileStore(page, fileName); } catch (final CoreException e) { StatusManager.getManager().handle(new Status(IStatus.ERROR, RUI.PLUGIN_ID, -1, "An error occurred when opening the exported R graphic.", e)); } } }); } } } }); } catch (final CoreException e) { StatusManager.getManager().handle(new Status(IStatus.ERROR, RUI.PLUGIN_ID, -1, NLS.bind("An error occurred when exporting the R graphic (Device {0}).", fGraphic.getDevId()+1), e)); return false; } } fPage.saveSettings(); return true; } }