⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 virtualfilesystemview.java

📁 eclise rcp 项目,是非常好的学习源码
💻 JAVA
字号:
/*******************************************************************************
 * Copyright (c) 2007 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 T鰀ter - 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 IAdapterFactory adapterFactory = new AdapterFactory();

	public VirtualFileSystemView() {
		super();
	}

	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);
	}

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

	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) {
			System.out.println("TreeLabelProvider.getText()");
			return ((Mp3File) element).getName();
		}

	}


	class TreeContentProvider implements ILazyTreeContentProvider {
		
		class PrefetchModelJob extends Job {
			
			private Mp3Directory mp3Dir;
			private Mp3Directory parent;
			int index;
			int count;
			
			private 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;
			}
			
			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;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -