org.xmind.ui.internal.wizards.ChooseLocationInFileSystemWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for org.xmind.ui.internal.wizards.ChooseLocationInFileSystemWizardPage.java

Source

/* ******************************************************************************
 * 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 {
            FileOutputStream fout = new FileOutputStream(file);
            try {
                workbook.save(fout);
            } finally {
                fout.close();
            }
        } 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();
    }
}