Java tutorial
/* * Copyright (c) 2012, the Dart project authors. * * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.eclipse.org/legal/epl-v10.html * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.dart.tools.ui.internal.filesview; import com.google.dart.tools.core.internal.model.DartModelManager; import com.google.dart.tools.core.model.DartIgnoreListener; import com.google.dart.tools.ui.DartToolsPlugin; import com.google.dart.tools.ui.ProblemsLabelDecorator; import com.google.dart.tools.ui.actions.CopyFilePathAction; import com.google.dart.tools.ui.actions.DeleteAction; import com.google.dart.tools.ui.actions.OpenAsTextAction; import com.google.dart.tools.ui.actions.OpenNewFileWizardAction; import com.google.dart.tools.ui.actions.OpenNewFolderWizardAction; import com.google.dart.tools.ui.internal.actions.CleanUpAction; import com.google.dart.tools.ui.internal.actions.CollapseAllAction; import com.google.dart.tools.ui.internal.handlers.OpenFolderHandler; import com.google.dart.tools.ui.internal.preferences.FontPreferencePage; import com.google.dart.tools.ui.internal.projects.HideProjectAction; import com.google.dart.tools.ui.internal.projects.OpenNewApplicationWizardAction; import com.google.dart.tools.ui.internal.util.SWTUtil; import org.eclipse.core.commands.operations.IUndoContext; import org.eclipse.core.filesystem.IFileInfo; import org.eclipse.core.filesystem.IFileStore; 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.ResourcesPlugin; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.dnd.Clipboard; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.FileTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IMemento; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.IViewSite; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.actions.ActionFactory; import org.eclipse.ui.actions.MoveResourceAction; import org.eclipse.ui.actions.RenameResourceAction; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.operations.UndoRedoActionGroup; import org.eclipse.ui.part.ISetSelectionTarget; import org.eclipse.ui.part.PluginTransfer; import org.eclipse.ui.part.ResourceTransfer; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.views.navigator.LocalSelectionTransfer; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * File-oriented view for navigating Dart projects. */ @SuppressWarnings("deprecation") public class FilesView extends ViewPart implements ISetSelectionTarget { private class FontPropertyChangeListener implements IPropertyChangeListener { @Override public void propertyChange(PropertyChangeEvent event) { if (treeViewer != null) { if (FontPreferencePage.BASE_FONT_KEY.equals(event.getProperty())) { updateTreeFont(); treeViewer.refresh(); } } } } public static final String VIEW_ID = "com.google.dart.tools.ui.FileExplorer"; // from plugin.xml /** * A constant for the Link with Editor memento. */ private static final String LINK_WITH_EDITOR_ID = "linkWithEditor"; private static boolean allElementsAreProjects(IStructuredSelection selection) { for (Iterator<?> iterator = selection.iterator(); iterator.hasNext();) { Object selectedElement = iterator.next(); if (!(selectedElement instanceof IProject)) { return false; } } return true; } private static boolean allElementsAreResources(IStructuredSelection selection) { for (Iterator<?> iterator = selection.iterator(); iterator.hasNext();) { Object selectedElement = iterator.next(); if (!(selectedElement instanceof IResource)) { return false; } } return true; } private TreeViewer treeViewer; private IMemento memento; private LinkWithEditorAction linkWithEditorAction; private MoveResourceAction moveAction; private RenameResourceAction renameAction; private CleanUpAction cleanUpAction; private DeleteAction deleteAction; private OpenNewFileWizardAction createFileAction; private OpenNewFolderWizardAction createFolderAction; private OpenNewApplicationWizardAction createApplicationAction; private IgnoreResourceAction ignoreResourceAction; private EnableDartBuilderAction enableBuilderAction; private CopyFilePathAction copyFilePathAction; private HideProjectAction hideContainerAction; private UndoRedoActionGroup undoRedoActionGroup; private IPropertyChangeListener fontPropertyChangeListener = new FontPropertyChangeListener(); //persistence tags private static final String TAG_ELEMENT = "element"; //$NON-NLS-1$ private static final String TAG_EXPANDED = "expanded"; //$NON-NLS-1$ private static final String TAG_PATH = "path"; //$NON-NLS-1$ private static final String TAG_SELECTION = "selection"; //$NON-NLS-1$ private RefreshAction refreshAction; private CopyAction copyAction; private PasteAction pasteAction; private Clipboard clipboard; private ResourceLabelProvider resourceLabelProvider; /** * Used to refresh view content when ignores are updated. */ private DartIgnoreListener dartIgnoreListener; private OpenAsTextAction openAsTextAction; @Override public void createPartControl(Composite parent) { treeViewer = new TreeViewer(parent); treeViewer.setContentProvider(new ResourceContentProvider()); resourceLabelProvider = new ResourceLabelProvider(); treeViewer.setLabelProvider( new DecoratingStyledCellLabelProvider(resourceLabelProvider, new ProblemsLabelDecorator(), null)); treeViewer.setComparator(new FilesViewerComparator()); treeViewer.addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { handleDoubleClick(event); } }); treeViewer.setInput(ResourcesPlugin.getWorkspace().getRoot()); initDragAndDrop(); getSite().setSelectionProvider(treeViewer); makeActions(); fillInToolbar(getViewSite().getActionBars().getToolBarManager()); fillInActionBars(); // Create the TreeViewer's context menu. createContextMenu(); parent.getDisplay().asyncExec(new Runnable() { @Override public void run() { linkWithEditorAction.syncSelectionToEditor(); } }); JFaceResources.getFontRegistry().addListener(fontPropertyChangeListener); updateTreeFont(); restoreState(); } @Override public void dispose() { if (linkWithEditorAction != null) { linkWithEditorAction.dispose(); } if (undoRedoActionGroup != null) { undoRedoActionGroup.dispose(); } if (copyFilePathAction != null) { treeViewer.removeSelectionChangedListener(copyFilePathAction); } if (clipboard != null) { clipboard.dispose(); } if (dartIgnoreListener != null) { DartModelManager.getInstance().removeIgnoreListener(dartIgnoreListener); } super.dispose(); } @Override public void init(IViewSite site, IMemento memento) throws PartInitException { super.init(site, memento); this.memento = memento; dartIgnoreListener = new DartIgnoreListener() { @Override public void ignoresChanged() { treeViewer.refresh(); } }; DartModelManager.getInstance().addIgnoreListener(dartIgnoreListener); } @Override public void saveState(IMemento memento) { memento.putBoolean(LINK_WITH_EDITOR_ID, linkWithEditorAction.getLinkWithEditor()); //save expanded elements Object expandedElements[] = treeViewer.getVisibleExpandedElements(); if (expandedElements.length > 0) { IMemento expandedMem = memento.createChild(TAG_EXPANDED); for (Object element : expandedElements) { if (element instanceof IResource) { IMemento elementMem = expandedMem.createChild(TAG_ELEMENT); elementMem.putString(TAG_PATH, ((IResource) element).getFullPath().toString()); } } } //save selection Object elements[] = ((IStructuredSelection) treeViewer.getSelection()).toArray(); if (elements.length > 0) { IMemento selectionMem = memento.createChild(TAG_SELECTION); for (Object element : elements) { if (element instanceof IResource) { IMemento elementMem = selectionMem.createChild(TAG_ELEMENT); elementMem.putString(TAG_PATH, ((IResource) element).getFullPath().toString()); } } } } @Override public void selectReveal(ISelection selection) { treeViewer.setSelection(selection, true); } @Override public void setFocus() { treeViewer.getTree().setFocus(); } protected void createContextMenu() { MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$ menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(new IMenuListener() { @Override public void menuAboutToShow(IMenuManager manager) { fillContextMenu(manager); } }); Menu menu = menuMgr.createContextMenu(treeViewer.getTree()); treeViewer.getTree().setMenu(menu); getSite().registerContextMenu(menuMgr, treeViewer); } protected void fillContextMenu(IMenuManager manager) { IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection(); // New File/ New Folder if (allElementsAreResources(selection)) { manager.add(createFileAction); } if (selection.size() == 1 && selection.getFirstElement() instanceof IContainer) { manager.add(createFolderAction); } manager.add(createApplicationAction); // OPEN GROUP if (manager.getItems().length > 0) { manager.add(new Separator()); } manager.add(OpenFolderHandler.createCommandAction(getSite().getWorkbenchWindow())); // Close folder action (aka Remove from Editor) if (!selection.isEmpty() && allElementsAreResources(selection)) { // Remove, iff non-empty selection, all elements are IResources if (allElementsAreProjects(selection)) { manager.add(hideContainerAction); } } // EDIT GROUP if (!selection.isEmpty() && allElementsAreResources(selection)) { manager.add(new Separator()); manager.add(copyAction); // Copy File Path iff single element and is an IResource if (selection.size() == 1) { manager.add(copyFilePathAction); } manager.add(pasteAction); if (selection.size() == 1 && selection.getFirstElement() instanceof IFile) { manager.add(openAsTextAction); } manager.add(new Separator()); manager.add(refreshAction); } // REFACTOR GROUP // Refactor iff all elements are IResources if (!selection.isEmpty() && allElementsAreResources(selection)) { manager.add(new Separator()); if (selection.size() == 1) { manager.add(renameAction); manager.add(moveAction); } manager.add(cleanUpAction); manager.add(new Separator()); ignoreResourceAction.updateLabel(); manager.add(ignoreResourceAction); if (enableBuilderAction.shouldBeEnabled()) { enableBuilderAction.updateLabel(); manager.add(enableBuilderAction); } manager.add(new Separator()); manager.add(deleteAction); manager.add(new Separator()); } } protected void fillInToolbar(IToolBarManager toolbar) { // Link with Editor linkWithEditorAction = new LinkWithEditorAction(getViewSite().getPage(), treeViewer); if (memento != null && memento.getBoolean(LINK_WITH_EDITOR_ID) != null) { linkWithEditorAction.setLinkWithEditor(memento.getBoolean(LINK_WITH_EDITOR_ID).booleanValue()); } else { linkWithEditorAction.setLinkWithEditor(true); } // Collapse All toolbar.add(new CollapseAllAction(treeViewer)); toolbar.add(linkWithEditorAction); } protected void handleDoubleClick(DoubleClickEvent event) { IStructuredSelection selection = (IStructuredSelection) event.getSelection(); Object element = selection.getFirstElement(); if (treeViewer.isExpandable(element)) { treeViewer.setExpandedState(element, !treeViewer.getExpandedState(element)); } if (element instanceof IFile) { try { IDE.openEditor(getViewSite().getPage(), (IFile) element); } catch (PartInitException e) { DartToolsPlugin.log(e); } } else if (element instanceof IFileStore) { try { IFileInfo info = ((IFileStore) element).fetchInfo(); if (!info.isDirectory()) { IDE.openEditorOnFileStore(getViewSite().getPage(), (IFileStore) element); } } catch (PartInitException e) { DartToolsPlugin.log(e); } } } protected void restoreState() { if (memento == null) { return; } IContainer container = ResourcesPlugin.getWorkspace().getRoot(); //restore expansion IMemento childMem = memento.getChild(TAG_EXPANDED); if (childMem != null) { List<Object> elements = new ArrayList<Object>(); for (IMemento mem : childMem.getChildren(TAG_ELEMENT)) { Object element = container.findMember(mem.getString(TAG_PATH)); if (element != null) { elements.add(element); } } treeViewer.setExpandedElements(elements.toArray()); } //restore selection childMem = memento.getChild(TAG_SELECTION); if (childMem != null) { ArrayList<Object> list = new ArrayList<Object>(); for (IMemento mem : childMem.getChildren(TAG_ELEMENT)) { Object element = container.findMember(mem.getString(TAG_PATH)); if (element != null) { list.add(element); } } treeViewer.setSelection(new StructuredSelection(list)); } } protected void updateTreeFont() { Font newFont = JFaceResources.getFont(FontPreferencePage.BASE_FONT_KEY); Font oldFont = treeViewer.getTree().getFont(); Font font = SWTUtil.changeFontSize(oldFont, newFont); treeViewer.getTree().setFont(font); } Shell getShell() { return getSite().getShell(); } TreeViewer getViewer() { return treeViewer; } private void fillInActionBars() { IActionBars actionBars = getViewSite().getActionBars(); IUndoContext workspaceContext = (IUndoContext) ResourcesPlugin.getWorkspace() .getAdapter(IUndoContext.class); undoRedoActionGroup = new UndoRedoActionGroup(getViewSite(), workspaceContext, true); undoRedoActionGroup.fillActionBars(actionBars); actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), copyAction); actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(), pasteAction); actionBars.setGlobalActionHandler(ActionFactory.REFRESH.getId(), refreshAction); } private void initDragAndDrop() { int ops = DND.DROP_COPY | DND.DROP_MOVE;// | DND.DROP_LINK; Transfer[] transfers = new Transfer[] { LocalSelectionTransfer.getInstance(), ResourceTransfer.getInstance(), FileTransfer.getInstance(), PluginTransfer.getInstance() }; treeViewer.addDragSupport(ops, transfers, new FilesViewDragAdapter(treeViewer)); FilesViewDropAdapter adapter = new FilesViewDropAdapter(treeViewer); adapter.setFeedbackEnabled(true); treeViewer.addDropSupport(ops | DND.DROP_DEFAULT, transfers, adapter); } private void makeActions() { createFileAction = new OpenNewFileWizardAction(getSite().getWorkbenchWindow()); treeViewer.addSelectionChangedListener(createFileAction); createFolderAction = new OpenNewFolderWizardAction(getSite().getWorkbenchWindow()); treeViewer.addSelectionChangedListener(createFolderAction); createApplicationAction = new OpenNewApplicationWizardAction(); renameAction = new RenameResourceAction(getShell(), treeViewer.getTree()); treeViewer.addSelectionChangedListener(renameAction); cleanUpAction = new CleanUpAction(getViewSite()); treeViewer.addSelectionChangedListener(cleanUpAction); moveAction = new MoveResourceAction(getShell()); treeViewer.addSelectionChangedListener(moveAction); ignoreResourceAction = new IgnoreResourceAction(getShell()); treeViewer.addSelectionChangedListener(ignoreResourceAction); enableBuilderAction = new EnableDartBuilderAction(getShell()); treeViewer.addSelectionChangedListener(enableBuilderAction); clipboard = new Clipboard(getShell().getDisplay()); pasteAction = new PasteAction(getShell(), clipboard); treeViewer.addSelectionChangedListener(pasteAction); copyAction = new CopyAction(getShell(), clipboard, pasteAction); treeViewer.addSelectionChangedListener(copyAction); refreshAction = new RefreshAction(this); treeViewer.addSelectionChangedListener(refreshAction); deleteAction = new DeleteAction(getSite()); deleteAction.setImageDescriptor( PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_DELETE)); treeViewer.addSelectionChangedListener(deleteAction); hideContainerAction = new HideProjectAction(getSite()); treeViewer.addSelectionChangedListener(hideContainerAction); copyFilePathAction = new CopyFilePathAction(getSite()); treeViewer.addSelectionChangedListener(copyFilePathAction); openAsTextAction = new OpenAsTextAction(getSite().getPage()); treeViewer.addSelectionChangedListener(openAsTextAction); } }