/* ****************************************************************************** * 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.File; import java.io.FileOutputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.CoreException; 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.LabelProvider; 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.graphics.Image; 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.xmind.core.IWorkbook; import org.xmind.core.util.FileUtils; import org.xmind.ui.internal.WorkbookFactory; import org.xmind.ui.internal.editor.MME; import org.xmind.ui.mindmap.IMindMapImages; import org.xmind.ui.mindmap.MindMapUI; public class ChooseLocationInFileSystemWizardPage extends AbstractChooseLocationWizardPage { private static class FolderContentProvider implements ITreeContentProvider { private Object input; public Object[] getChildren(Object parentElement) { if (parentElement instanceof File) { File parent = (File) parentElement; if (parent.isDirectory()) { File[] subFiles = parent.listFiles(); if (subFiles != null) { List<Object> list = new ArrayList<Object>( subFiles.length); for (File child : subFiles) { if (child.isDirectory() && !child.isHidden() && child.canRead()) { list.add(child); } } return list.toArray(); } } } else if (parentElement instanceof File[]) { return (File[]) parentElement; } return new Object[0]; } public Object getParent(Object element) { if (element instanceof File) { File parent = ((File) element).getParentFile(); if (parent == null) return input; return parent; } return null; } public boolean hasChildren(Object element) { return true;//getChildren(element).length > 0; } public Object[] getElements(Object inputElement) { return getChildren(inputElement); } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { this.input = newInput; } } private static class FolderLabelProvider extends LabelProvider { private Image folderImage; public String getText(Object element) { if (element instanceof File) { File file = (File) element; if (file.getParentFile() == null) return file.getAbsolutePath(); return file.getName(); } return super.getText(element); } public Image getImage(Object element) { if (folderImage == null) { folderImage = MindMapUI.getImages() .get(IMindMapImages.OPEN, true).createImage(false); } return folderImage; } public void dispose() { if (folderImage != null) { folderImage.dispose(); folderImage = null; } super.dispose(); } } private File selectedFolder; public ChooseLocationInFileSystemWizardPage() { super(); setDescription(WizardMessages.NewPage2_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); createFolderViewer(composite); createFileNameControl(composite); createSaveLaterButton(composite); updateAll(); } private void createFolderViewer(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 folderViewer = new TreeViewer(parent, SWT.BORDER | SWT.SINGLE); folderViewer.getControl().setLayoutData( new GridData(SWT.FILL, SWT.FILL, true, true)); folderViewer.setContentProvider(new FolderContentProvider()); folderViewer.setLabelProvider(new FolderLabelProvider()); folderViewer.setComparator(new ViewerComparator()); folderViewer.setUseHashlookup(true); folderViewer .addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection selection = (IStructuredSelection) event .getSelection(); folderSelectionChanged((File) selection .getFirstElement()); } }); folderViewer.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 (folderViewer.getExpandedState(item)) { folderViewer.collapseToLevel(item, 1); } else { folderViewer.expandToLevel(item, 1); } } } }); addInputControl(folderViewer.getTree()); parent.getDisplay().asyncExec(new Runnable() { public void run() { if (folderViewer.getControl().isDisposed()) return; folderViewer.setInput(File.listRoots()); File homeDir = new File(System.getProperty("user.home")); //$NON-NLS-1$ folderViewer.setSelection(new StructuredSelection(homeDir), true); folderViewer.setExpandedState(homeDir, true); updateButtonStates(); } }); } private void folderSelectionChanged(File folder) { this.selectedFolder = folder; updateAll(); } @Override protected boolean isSavePathAvailable() { return super.isSavePathAvailable() && selectedFolder != null; } 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; File file = new File(selectedFolder, name); FileUtils.ensureFileParent(file); IWorkbook workbook = WorkbookFactory.createEmptyWorkbook(); try { workbook.save(new FileOutputStream(file)); } catch (Exception e) { } return MME.createFileEditorInput(file); //return new WorkbookEditorInput(workbook, path); } public void setWorkbenchSelection(IStructuredSelection selection) { Object element = selection.getFirstElement(); if (element instanceof File) { folderSelectionChanged((File) element); } } public String getParentPath() { return selectedFolder == null ? null : selectedFolder.getAbsolutePath(); } }