/*******************************************************************************
* Copyright (c) 2011, 2015 Wind River Systems, Inc. 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:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.tcf.te.tcf.filesystem.ui.internal.wizards;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.tcf.protocol.Protocol;
import org.eclipse.tcf.te.tcf.filesystem.core.interfaces.IResultOperation;
import org.eclipse.tcf.te.tcf.filesystem.core.interfaces.runtime.IFSTreeNode;
import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNode;
import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNodeProperties;
import org.eclipse.tcf.te.ui.views.editor.pages.AbstractTreeViewerExplorerEditorPage;
import org.eclipse.tcf.te.ui.wizards.AbstractWizard;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.editor.IFormPage;
import org.eclipse.ui.navigator.CommonNavigator;
/**
* The base wizard class to create a new file/folder in the file system of Target Explorer.
*/
public abstract class NewNodeWizard extends AbstractWizard implements INewWizard {
// The folder in which the new node is created.
private IFSTreeNode folder;
// The target peer where the new node is created.
private IPeerNode peer;
// The wizard page used to create the new node.
private NewNodeWizardPage newPage;
/**
* Create an instance.
*/
public NewNodeWizard() {
setNeedsProgressMonitor(true);
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
*/
@Override
public void init(IWorkbench workbench, IStructuredSelection selection) {
super.init(workbench, selection);
// Set the window title
setWindowTitle(getTitle());
if (!selection.isEmpty()) {
Object element = selection.getFirstElement();
if (element instanceof IFSTreeNode) {
folder = (IFSTreeNode) element;
if (folder.isFile()) {
// If the selected is a file, then create the node in the parent folder.
folder = folder.getParent();
}
peer = folder.getPeerNode();
}
else if (element instanceof IPeerNode) {
if(hasFileSystem((IPeerNode) element)) {
peer = (IPeerNode) element;
}
}
}
}
/**
* Test if the specified target peer has a file system service.
*
* @param peer The target peer.
* @return true if it has a file system service.
*/
public boolean hasFileSystem(final IPeerNode peer) {
if(Protocol.isDispatchThread()) {
String services = null;
services = peer.getStringProperty(IPeerNodeProperties.PROPERTY_REMOTE_SERVICES);
if (services != null) {
// Lookup each service individually
for (String service : services.split(",")) { //$NON-NLS-1$
if (service != null && service.trim().equals("FileSystem")) { //$NON-NLS-1$
return true;
}
}
}
return false;
}
final boolean[] result = new boolean[1];
Protocol.invokeAndWait(new Runnable(){
@Override
public void run() {
result[0] = hasFileSystem(peer);
}});
return result[0];
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.wizard.Wizard#addPages()
*/
@Override
public void addPages() {
if (peer == null) {
addPage(new TargetSelectionPage());
}
addPage(newPage = createWizardPage());
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.wizard.Wizard#performFinish()
*/
@Override
public boolean performFinish() {
if (newPage != null) {
// Save the value so that next time it is used as the default input.
newPage.saveWidgetValues();
// Get the new name and create the node.
String name = newPage.getNodeName();
IFSTreeNode dest = newPage.getInputDir();
final IResultOperation<? extends IFSTreeNode> create = getCreateOp(dest, name);
final IStatus[] status = {Status.CANCEL_STATUS};
IRunnableWithProgress runnable = new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor) {
status[0] = create.run(monitor);
}
};
try {
getContainer().run(false, false, runnable);
if (status[0].isOK()) {
final IFSTreeNode newNode = create.getResult();
getShell().getDisplay().asyncExec(new Runnable(){
@Override
public void run() {
selectNewNode(newNode);
}});
return true;
}
newPage.setErrorMessage(status[0].getMessage());
} catch (InvocationTargetException e) {
newPage.setErrorMessage(e.getMessage());
} catch (InterruptedException e) {
}
}
return false;
}
/**
* Select the specified node in the selection provider.
*
* @param node The node to be selected.
*/
void selectNewNode(IFSTreeNode node) {
TreeViewer viewer = getFocusedViewer();
if(viewer != null) {
viewer.refresh(folder);
ISelection selection = new StructuredSelection(node);
viewer.setSelection(selection, true);
}
}
/**
* Get currently focused tree viewer.
*
* @return currently focused tree viewer or null.
*/
TreeViewer getFocusedViewer() {
IWorkbenchWindow window = getWorkbench() != null ? getWorkbench().getActiveWorkbenchWindow() : null;
if (window != null) {
IWorkbenchPage page = window.getActivePage();
if (page != null) {
IWorkbenchPart part = page.getActivePart();
if (part instanceof FormEditor) {
FormEditor formEditor = (FormEditor) part;
IFormPage formPage = formEditor.getActivePageInstance();
if (formPage instanceof AbstractTreeViewerExplorerEditorPage) {
AbstractTreeViewerExplorerEditorPage viewerPage = (AbstractTreeViewerExplorerEditorPage) formPage;
return (TreeViewer) viewerPage.getTreeControl().getViewer();
}
} else if (part instanceof CommonNavigator) {
CommonNavigator navigator = (CommonNavigator) part;
return navigator.getCommonViewer();
}
}
}
return null;
}
/**
* Create a wizard page to create a new node.
*
* @return The new wizard page.
*/
protected abstract NewNodeWizardPage createWizardPage();
/**
* Create a Create operation instance using the specified folder and the new name.
*
* @param folder The folder in which the new node is created.
* @param name The name of the new node.
* @return a FSCreate instance to do the creation.
*/
protected abstract IResultOperation<? extends IFSTreeNode> getCreateOp(IFSTreeNode folder, String name);
/**
* The wizard's title to be used.
*
* @return The wizard's title to be used.
*/
protected abstract String getTitle();
/**
* Get the current target peer selected.
*
* @return The target peer selected.
*/
public IPeerNode getPeer(){
return peer;
}
/**
* Set the currently selected target peer.
*
* @param peer The newly selected target peer.
*/
public void setPeer(IPeerNode peer) {
this.peer = peer;
newPage.setPeer(peer);
}
/**
* Get the current selected folder.
*
* @return the current selected folder.
*/
public IFSTreeNode getFolder() {
return folder;
}
}