com.siemens.ct.mp3m.ui.views.physical.VirtualFileSystemView.java Source code

Java tutorial

Introduction

Here is the source code for com.siemens.ct.mp3m.ui.views.physical.VirtualFileSystemView.java

Source

/*******************************************************************************
 * Copyright (c) 2009 Siemens AG
 * 
 * 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:
 *    Kai Tdter - initial API and implementation
 *******************************************************************************/

package com.siemens.ct.mp3m.ui.views.physical;

import java.io.File;

import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILazyTreeContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.progress.UIJob;

import com.siemens.ct.mp3m.model.physical.Mp3Directory;
import com.siemens.ct.mp3m.model.physical.Mp3File;
import com.siemens.ct.mp3m.ui.views.AdapterFactory;
import com.siemens.ct.mp3m.ui.views.EditorFactory;
import com.siemens.ct.mp3m.ui.views.PathEditorInput;
import com.siemens.ct.mp3m.utilities.LogUtil;

public class VirtualFileSystemView extends ViewPart {

    public static final String ID = "com.siemens.ct.mp3m.ui.views.physical.VirtualFileSystemView";

    private TreeViewer treeViewer;

    private final IAdapterFactory adapterFactory = new AdapterFactory();

    public VirtualFileSystemView() {
        super();
    }

    @Override
    public void createPartControl(Composite parent) {

        treeViewer = new TreeViewer(parent, SWT.VIRTUAL);

        getSite().setSelectionProvider(treeViewer);
        Platform.getAdapterManager().registerAdapters(adapterFactory, Mp3File.class);
        treeViewer.setLabelProvider(new WorkbenchLabelProvider());
        treeViewer.setContentProvider(new TreeContentProvider(treeViewer));
        treeViewer.setUseHashlookup(true);

        Mp3Directory root = new Mp3Directory("root");
        File[] roots = File.listRoots();
        for (File fileRoot : roots) {
            Mp3Directory mp3Root = new Mp3Directory(fileRoot.getAbsolutePath());
            mp3Root.setFullPath(fileRoot.getAbsolutePath());
            root.addMp3File(mp3Root);
        }
        treeViewer.setInput(root);
        treeViewer.setChildCount(root, roots.length);

        Mp3DoubleclickListener listener = new Mp3DoubleclickListener();
        treeViewer.addDoubleClickListener(listener);
    }

    @Override
    public void dispose() {
        Platform.getAdapterManager().unregisterAdapters(adapterFactory);
        super.dispose();
    }

    @Override
    public void setFocus() {
        treeViewer.getControl().setFocus();
    }

    class Mp3DoubleclickListener implements IDoubleClickListener {
        public void doubleClick(DoubleClickEvent event) {
            IStructuredSelection selection = (IStructuredSelection) event.getSelection();
            Mp3File source = ((Mp3File) selection.getFirstElement());
            final String fullPath = source.getFullPath();
            if (fullPath != null) {
                PathEditorInput pathEditorInput = new PathEditorInput(fullPath);
                String editorId = EditorFactory.getDefaultMp3EditorId();
                try {
                    getViewSite().getWorkbenchWindow().getActivePage().openEditor(pathEditorInput, editorId);
                } catch (Exception e) {
                    LogUtil.logError("com.siemens.ct.mp3m.ui.views.physical",
                            "cannot open editor with id: " + editorId);
                }
            }
        }
    }

    class TreeLabelProvider extends LabelProvider {

        @Override
        public String getText(Object element) {
            return ((Mp3File) element).getName();
        }

    }

    class TreeContentProvider implements ILazyTreeContentProvider {

        class PrefetchModelJob extends Job {

            private final Mp3Directory mp3Dir;
            private final Mp3Directory parent;
            int index;
            int count;

            private final UIJob uiJob = new UIJob("Update UI") {

                @Override
                public IStatus runInUIThread(IProgressMonitor monitor) {
                    if (treeViewer.getControl().isDisposed()) {
                        return Status.CANCEL_STATUS;
                    }

                    // System.out.println("PrefetchModelUIJob: start: " + parent
                    // + ":" + index);
                    treeViewer.replace(parent, index, mp3Dir);
                    treeViewer.setChildCount(mp3Dir, count);
                    // System.out.println("PrefetchModelUIJob: end:  " + parent
                    // + ":" + index);
                    return Status.OK_STATUS;
                }

            };

            public PrefetchModelJob(String name, Mp3Directory parent, int index, Mp3Directory mp3Dir) {
                super(name);
                this.parent = parent;
                this.mp3Dir = mp3Dir;
                this.index = index;
            }

            @Override
            public IStatus run(IProgressMonitor monitor) {
                if (treeViewer.getControl().isDisposed()) {
                    return Status.CANCEL_STATUS;
                }
                // System.out.println("PrefetchModelJob.run(): START: " + parent
                // + ":" + index);
                count = prefetchModel(mp3Dir);

                // Simulate long running operation
                /*
                 * try { Thread.sleep(1000); } catch (InterruptedException e) {
                 * // TODO Auto-generated catch block e.printStackTrace(); }
                 */

                uiJob.schedule();
                // System.out.println("PrefetchModelJob.run(): END: "+ parent +
                // ":" + index);
                return Status.OK_STATUS;
            }
        };

        private final TreeViewer treeViewer;

        public TreeContentProvider(TreeViewer treeViewer) {
            this.treeViewer = treeViewer;
        }

        public void updateChildCount(Object element, int currentChildCount) {
        }

        public int prefetchModel(Mp3Directory mp3Dir) {
            File dir = new File(mp3Dir.getFullPath());
            File[] files = dir.listFiles();
            int count = 0;
            if (files != null) {
                for (File file : files) {
                    if (file.isDirectory() || file.getName().endsWith(".mp3")) {
                        count += 1;
                        Mp3File entry;
                        if (file.isDirectory()) {
                            entry = new Mp3Directory(file.getName());
                        } else {
                            entry = new Mp3File(file.getName());
                        }
                        entry.setFullPath(file.getAbsolutePath());
                        mp3Dir.addMp3File(entry);
                    }
                }
            }
            mp3Dir.setContentsInitialized(true);
            return count;
        }

        public void updateElement(Object parent, int index) {
            Mp3Directory parentDir = (Mp3Directory) parent;
            Mp3File mp3File = parentDir.getMp3Files()[index];
            int count = 0;

            if (mp3File instanceof Mp3Directory) {
                // count = prefetchModel((Mp3Directory) mp3File);
                PrefetchModelJob job = new PrefetchModelJob("Update Model", parentDir, index,
                        (Mp3Directory) mp3File);
                job.schedule();
            }
            treeViewer.replace(parent, index, mp3File);
            treeViewer.setChildCount(mp3File, count);
        }

        public void dispose() {
        }

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            treeViewer.getTree().setItemCount(0);
        }

        public Object getParent(Object element) {
            return null;
        }
    }
}