Search in sources :

Example 1 with SaveAsValidator

use of org.knime.workbench.explorer.dialogs.SaveAsValidator in project knime-core by knime.

the class WorkflowEditor method getNewLocation.

/**
 * For SaveAs...
 * @param currentLocation
 * @param allowRemoteLocation local and remote mount points are added to the selection dialog
 * @return new (different!) URI or null if user canceled. Caller should create a snapshot if told so.
 */
private OverwriteAndMergeInfo getNewLocation(final URI currentLocation, final boolean allowRemoteLocation) {
    final AbstractExplorerFileStore currentStore = getFileStore(currentLocation);
    AbstractExplorerFileStore currentParent = null;
    if (currentStore != null) {
        currentParent = currentStore.getParent();
    }
    String currentName = new Path(currentLocation.getPath()).lastSegment();
    List<String> selIDs = new LinkedList<String>();
    for (String id : ExplorerMountTable.getAllVisibleMountIDs()) {
        AbstractContentProvider provider = ExplorerMountTable.getMountPoint(id).getProvider();
        if (!provider.isRemote() || (allowRemoteLocation && provider.isWritable())) {
            selIDs.add(id);
        }
    }
    ContentObject preSel = ContentObject.forFile(currentParent);
    if (isTempRemoteWorkflowEditor()) {
        AbstractExplorerFileStore remoteStore = null;
        try {
            remoteStore = ExplorerFileSystem.INSTANCE.getStore(m_origRemoteLocation);
        } catch (IllegalArgumentException e) {
        /* don't preselect on unknown original location */
        }
        if (remoteStore != null) {
            preSel = ContentObject.forFile(remoteStore);
        } else {
            preSel = null;
        }
    }
    OverwriteAndMergeInfo result = null;
    while (result == null) {
        // keep the selection dialog open until we get a useful result
        final SpaceResourceSelectionDialog dialog = new SpaceResourceSelectionDialog(getSite().getShell(), selIDs.toArray(new String[selIDs.size()]), preSel);
        SaveAsValidator validator = new SaveAsValidator(dialog, currentStore);
        String defName = currentName + " - Copy";
        if (!isTempRemoteWorkflowEditor()) {
            if (currentParent != null) {
                try {
                    Set<String> childs = new HashSet<String>(Arrays.asList(currentParent.childNames(EFS.NONE, null)));
                    defName = guessNewWorkflowNameOnSaveAs(childs, currentName);
                } catch (CoreException e1) {
                // keep the simple default
                }
            }
        } else {
            defName = currentName;
            if (defName.endsWith("." + KNIMEConstants.KNIME_WORKFLOW_FILE_EXTENSION)) {
                defName = defName.substring(0, defName.length() - KNIMEConstants.KNIME_WORKFLOW_FILE_EXTENSION.length() - 1);
            }
        }
        dialog.setTitle("Save to new Location");
        dialog.setDescription("Select the new destination workflow group for the workflow.");
        dialog.setValidator(validator);
        // Setup the name field of the dialog
        dialog.setNameFieldEnabled(true);
        dialog.setNameFieldDefaultValue(defName);
        final AtomicBoolean proceed = new AtomicBoolean(false);
        Display.getDefault().syncExec(new Runnable() {

            @Override
            public void run() {
                proceed.set(dialog.open() == Window.OK);
            }
        });
        if (!proceed.get()) {
            return null;
        }
        AbstractExplorerFileStore newLocation = dialog.getSelection();
        if (newLocation.fetchInfo().isWorkflowGroup()) {
            newLocation = newLocation.getChild(dialog.getNameFieldValue());
        } else {
            // in case they have selected a flow but changed the name in the name field afterwards
            newLocation = newLocation.getParent().getChild(dialog.getNameFieldValue());
        }
        assert !newLocation.fetchInfo().exists() || newLocation.fetchInfo().isWorkflow();
        if (newLocation.fetchInfo().exists()) {
            // confirm overwrite (with snapshot?)
            final AtomicBoolean snapshotSupported = new AtomicBoolean(false);
            final AtomicReference<SnapshotPanel> snapshotPanel = new AtomicReference<SnapshotPanel>(null);
            if (newLocation.getContentProvider().supportsSnapshots() && (newLocation instanceof RemoteExplorerFileStore)) {
                snapshotSupported.set(true);
            }
            MessageDialog dlg = new MessageDialog(getSite().getShell(), "Confirm SaveAs Overwrite", null, "The selected destination\n\n\t" + newLocation.getMountIDWithFullPath() + "\n\nalready exists. Do you want to overwrite?\n", MessageDialog.QUESTION, new String[] { IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL, IDialogConstants.CANCEL_LABEL }, 1) {

                /**
                 * {@inheritDoc}
                 */
                @Override
                protected Control createCustomArea(final Composite parent) {
                    if (snapshotSupported.get()) {
                        snapshotPanel.set(new SnapshotPanel(parent, SWT.NONE));
                        snapshotPanel.get().setEnabled(true);
                        return snapshotPanel.get();
                    } else {
                        return null;
                    }
                }
            };
            int dlgResult = dlg.open();
            if (dlgResult == 2) /* CANCEL */
            {
                return null;
            }
            if (dlgResult == 0) {
                /* YES (= please overwrite) */
                if (snapshotPanel.get() != null) {
                    SnapshotPanel snapPanel = snapshotPanel.get();
                    result = new OverwriteAndMergeInfo(newLocation.toURI().toASCIIString(), false, true, snapPanel.createSnapshot(), snapPanel.getComment());
                } else {
                    result = new OverwriteAndMergeInfo(newLocation.toURI().toASCIIString(), false, true, false, "");
                }
            } else {
                /* NO, don't overwrite: continue while loop asking for a different location */
                preSel = ContentObject.forFile(newLocation);
                currentName = newLocation.getName();
            }
        } else {
            result = new OverwriteAndMergeInfo(newLocation.toURI().toASCIIString(), false, false, false, "");
        }
    }
    /* end of while (result != null) keep the target selection dialog open */
    return result;
}
Also used : Path(org.eclipse.core.runtime.Path) SaveAsValidator(org.knime.workbench.explorer.dialogs.SaveAsValidator) Composite(org.eclipse.swt.widgets.Composite) AtomicReference(java.util.concurrent.atomic.AtomicReference) SnapshotPanel(org.knime.workbench.explorer.view.dialogs.SnapshotPanel) LinkedList(java.util.LinkedList) ContentObject(org.knime.workbench.explorer.view.ContentObject) Point(org.eclipse.draw2d.geometry.Point) PrecisionPoint(org.eclipse.draw2d.geometry.PrecisionPoint) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) OverwriteAndMergeInfo(org.knime.workbench.explorer.view.dialogs.OverwriteAndMergeInfo) SpaceResourceSelectionDialog(org.knime.workbench.explorer.dialogs.SpaceResourceSelectionDialog) CoreException(org.eclipse.core.runtime.CoreException) AbstractExplorerFileStore(org.knime.workbench.explorer.filesystem.AbstractExplorerFileStore) AbstractContentProvider(org.knime.workbench.explorer.view.AbstractContentProvider) RemoteExplorerFileStore(org.knime.workbench.explorer.filesystem.RemoteExplorerFileStore) MessageDialog(org.eclipse.jface.dialogs.MessageDialog) HashSet(java.util.HashSet)

Aggregations

HashSet (java.util.HashSet)1 LinkedList (java.util.LinkedList)1 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)1 AtomicReference (java.util.concurrent.atomic.AtomicReference)1 CoreException (org.eclipse.core.runtime.CoreException)1 Path (org.eclipse.core.runtime.Path)1 Point (org.eclipse.draw2d.geometry.Point)1 PrecisionPoint (org.eclipse.draw2d.geometry.PrecisionPoint)1 MessageDialog (org.eclipse.jface.dialogs.MessageDialog)1 Composite (org.eclipse.swt.widgets.Composite)1 SaveAsValidator (org.knime.workbench.explorer.dialogs.SaveAsValidator)1 SpaceResourceSelectionDialog (org.knime.workbench.explorer.dialogs.SpaceResourceSelectionDialog)1 AbstractExplorerFileStore (org.knime.workbench.explorer.filesystem.AbstractExplorerFileStore)1 RemoteExplorerFileStore (org.knime.workbench.explorer.filesystem.RemoteExplorerFileStore)1 AbstractContentProvider (org.knime.workbench.explorer.view.AbstractContentProvider)1 ContentObject (org.knime.workbench.explorer.view.ContentObject)1 OverwriteAndMergeInfo (org.knime.workbench.explorer.view.dialogs.OverwriteAndMergeInfo)1 SnapshotPanel (org.knime.workbench.explorer.view.dialogs.SnapshotPanel)1