/* ******************************************************************************
* Copyright (c) 2006-2012 XMind Ltd. and others.
*
* This file is a part of XMind 3. XMind releases 3 and
* above are dual-licensed under the Eclipse Public License (EPL),
* which is available at http://www.eclipse.org/legal/epl-v10.html
* and the GNU Lesser General Public License (LGPL),
* which is available at http://www.gnu.org/licenses/lgpl.html
* See http://www.xmind.net/license.html for details.
*
* Contributors:
* XMind Ltd. - initial API and implementation
*******************************************************************************/
package org.xmind.ui.internal.wizards;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.xmind.ui.internal.WorkbookFactory;
import org.xmind.ui.internal.editor.MME;
import org.xmind.ui.mindmap.MindMapUI;
public class ChooseLocationInWorkspaceWizardPage extends
AbstractChooseLocationWizardPage {
private static class ContainerContentProvider implements
ITreeContentProvider {
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof IWorkspace) {
// check if closed projects should be shown
IProject[] allProjects = ((IWorkspace) parentElement).getRoot()
.getProjects();
return allProjects;
} else if (parentElement instanceof IContainer) {
IContainer container = (IContainer) parentElement;
if (container.isAccessible()) {
try {
List<Object> children = new ArrayList<Object>();
IResource[] members = container.members();
for (int i = 0; i < members.length; i++) {
if (members[i].getType() != IResource.FILE) {
children.add(members[i]);
}
}
return children.toArray();
} catch (CoreException ignore) {
}
}
}
return new Object[0];
}
public Object getParent(Object element) {
if (element instanceof IResource) {
return ((IResource) element).getParent();
}
return null;
}
public boolean hasChildren(Object element) {
return getChildren(element).length > 0;
}
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
private IContainer selectedContainer;
public ChooseLocationInWorkspaceWizardPage() {
super();
setDescription(WizardMessages.NewPage_description);
}
public void createControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
GridLayout gridLayout = new GridLayout(1, false);
gridLayout.marginWidth = 5;
gridLayout.marginHeight = 5;
gridLayout.verticalSpacing = 5;
gridLayout.horizontalSpacing = 5;
composite.setLayout(gridLayout);
setControl(composite);
createContainerViewer(composite);
createFileNameControl(composite);
createSaveLaterButton(composite);
updateAll();
}
private void createContainerViewer(Composite parent) {
Label label = new Label(parent, SWT.NONE);
label.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false,
false));
label.setText(WizardMessages.NewPage_SelectParent_label);
final TreeViewer containerViewer = new TreeViewer(parent, SWT.BORDER
| SWT.SINGLE);
containerViewer.getControl().setLayoutData(
new GridData(SWT.FILL, SWT.FILL, true, true));
containerViewer.setContentProvider(new ContainerContentProvider());
containerViewer.setLabelProvider(WorkbenchLabelProvider
.getDecoratingWorkbenchLabelProvider());
containerViewer.setComparator(new ViewerComparator());
containerViewer.setUseHashlookup(true);
containerViewer
.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection = (IStructuredSelection) event
.getSelection();
containerSelectionChanged((IContainer) selection
.getFirstElement()); // allow null
}
});
containerViewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
ISelection selection = event.getSelection();
if (selection instanceof IStructuredSelection) {
Object item = ((IStructuredSelection) selection)
.getFirstElement();
if (item == null) {
return;
}
if (containerViewer.getExpandedState(item)) {
containerViewer.collapseToLevel(item, 1);
} else {
containerViewer.expandToLevel(item, 1);
}
}
}
});
addInputControl(containerViewer.getTree());
parent.getDisplay().asyncExec(new Runnable() {
public void run() {
containerViewer.setInput(ResourcesPlugin.getWorkspace());
if (selectedContainer != null) {
containerViewer.setSelection(new StructuredSelection(
selectedContainer), true);
}
updateButtonStates();
}
});
}
public void containerSelectionChanged(IContainer container) {
selectedContainer = container;
updateAll();
}
protected boolean isSavePathAvailable() {
return super.isSavePathAvailable() && selectedContainer != null;
}
public void setWorkbenchSelection(IStructuredSelection selection) {
Object element = selection.getFirstElement();
if (element instanceof IContainer) {
containerSelectionChanged((IContainer) element);
} else if (element instanceof IAdaptable) {
IResource resource = (IResource) ((IAdaptable) element)
.getAdapter(IResource.class);
if (resource instanceof IContainer) {
containerSelectionChanged((IContainer) resource);
} else if (resource != null) {
containerSelectionChanged(resource.getParent());
}
}
}
public IEditorInput createEditorInput(InputStream templateStream)
throws CoreException {
if (!isSavePathAvailable())
return null;
String name = getFileName();
if (!name.endsWith(MindMapUI.FILE_EXT_XMIND)) {
name += MindMapUI.FILE_EXT_XMIND;
}
IPath fullPath = selectedContainer.getFullPath().append(name);
IFile file = createFile(fullPath);
return MME.createFileEditorInput(file);
// IWorkbook workbook = WorkbookFactory.createEmptyWorkbook(file
// .getLocation().toOSString());
// return new WorkbookEditorInput(workbook, file);
}
private IFile createFile(IPath fullPath) {
IFile file = selectedContainer.getWorkspace().getRoot()
.getFile(fullPath);
try {
file.create(WorkbookFactory.createEmptyWorkbookStream(), false,
new NullProgressMonitor());
} catch (CoreException e) {
}
return file;
}
public String getParentPath() {
return null;
}
}