/* * 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.deploy; import com.google.dart.tools.core.DartCore; import com.google.dart.tools.core.DartCoreDebug; import com.google.dart.tools.core.MessageConsole.MessageStream; import com.google.dart.tools.core.internal.util.ResourceUtil; import com.google.dart.tools.ui.PreferenceConstants; import com.google.dart.tools.ui.actions.DeployConsolePatternMatcher; import com.google.dart.tools.ui.actions.OpenIntroEditorAction; import com.google.dart.tools.ui.internal.preferences.DartKeyBindingPersistence; import com.google.dart.tools.ui.internal.text.editor.EditorUtility; import com.google.dart.tools.ui.theme.preferences.TemporaryProject; import com.google.dart.tools.ui.watchdog.MonitoringUtil; import org.eclipse.core.filesystem.IFileStore; import org.eclipse.core.filesystem.IFileTree; import org.eclipse.core.internal.localstore.UnifiedTree; import org.eclipse.core.internal.resources.Resource; import org.eclipse.core.internal.resources.ResourceException; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Preferences; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferenceConstants; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.activities.IActivityManager; import org.eclipse.ui.application.IWorkbenchConfigurer; import org.eclipse.ui.application.IWorkbenchWindowConfigurer; import org.eclipse.ui.application.WorkbenchAdvisor; import org.eclipse.ui.application.WorkbenchWindowAdvisor; import org.eclipse.ui.commands.ICommandService; import org.eclipse.ui.console.ConsolePlugin; import org.eclipse.ui.console.IConsole; import org.eclipse.ui.console.MessageConsole; import org.eclipse.ui.console.MessageConsoleStream; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.internal.ide.IDEInternalPreferences; import org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages; import org.eclipse.ui.internal.ide.IDEWorkbenchActivityHelper; import org.eclipse.ui.internal.ide.IDEWorkbenchMessages; import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin; import org.eclipse.ui.internal.ide.undo.WorkspaceUndoMonitor; import org.eclipse.ui.keys.IBindingService; import org.eclipse.ui.statushandlers.AbstractStatusHandler; import org.osgi.framework.Bundle; import java.net.URL; /** * IDE-specified workbench advisor which configures the workbench for use as an IDE. * <p> * Much of this code was copied out the Eclipses version of this class: * <code>IDEWorkbenchAdvistor</code> in <code>org.eclipse.ui.ide.application</code>. * </p> * <p> * Note: This class replaces <code>org.eclipse.ui.internal.Workbench</code>. * </p> */ @SuppressWarnings({"restriction", "deprecation"}) public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor { private class FontPropertyChangeListener implements IPropertyChangeListener { @Override public void propertyChange(PropertyChangeEvent event) { updateConsoleFont(event.getProperty()); } } private static final String PERSPECTIVE_ID = "com.google.dart.tools.ui.DartPerspective"; //$NON-NLS-1$ private static ApplicationWorkbenchAdvisor workbenchAdvisor = null; /** * Helper for managing activities in response to workspace changes. */ private IDEWorkbenchActivityHelper activityHelper = null; /** * Helper for managing work that is performed when the system is otherwise idle. */ private DartIdleHelper idleHelper; /** * Support class for monitoring workspace changes and periodically validating the undo history */ private WorkspaceUndoMonitor workspaceUndoMonitor; /** * Helper class used to process delayed events. */ private DelayedEventsProcessor delayedEventsProcessor; /** * The workbench error handler. */ private AbstractStatusHandler workbenchErrorHandler; private IPropertyChangeListener fontPropertyChangeListener = new FontPropertyChangeListener(); private MessageConsole console; private boolean uiMonitorStarted; /** * Creates a new workbench advisor instance. */ public ApplicationWorkbenchAdvisor(DelayedEventsProcessor processor) { super(); if (workbenchAdvisor != null) { throw new IllegalStateException(); } workbenchAdvisor = this; this.delayedEventsProcessor = processor; } @Override public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) { return new ApplicationWorkbenchWindowAdvisor(workbenchAdvisor, configurer); } @Override public void eventLoopIdle(Display display) { if (delayedEventsProcessor != null) { delayedEventsProcessor.catchUp(display); } if (!uiMonitorStarted) { uiMonitorStarted = true; MonitoringUtil.start(); } MonitoringUtil.idle(); super.eventLoopIdle(display); } @Override public IAdaptable getDefaultPageInput() { // use workspace root return ResourcesPlugin.getWorkspace().getRoot(); } @Override public String getInitialWindowPerspectiveId() { return PERSPECTIVE_ID; } @Override public synchronized AbstractStatusHandler getWorkbenchErrorHandler() { if (workbenchErrorHandler == null) { workbenchErrorHandler = new DartWorkbenchErrorHandler(); } return workbenchErrorHandler; } @Override public void initialize(IWorkbenchConfigurer configurer) { // make sure we always save and restore workspace state configurer.setSaveAndRestore(true); // check to see if a UI code change requires workbench reset checkForWorkbenchStateReset(configurer); // register workspace adapters IDE.registerAdapters(); // set our preferred preference settings initializePreferenceSettings(); // register shared images declareWorkbenchImages(); // initialize the activity helper activityHelper = IDEWorkbenchActivityHelper.getInstance(); // initialize idle handler idleHelper = new DartIdleHelper(configurer); // initialize the workspace undo monitor workspaceUndoMonitor = WorkspaceUndoMonitor.getInstance(); } @Override public void postShutdown() { if (activityHelper != null) { activityHelper.shutdown(); activityHelper = null; } if (idleHelper != null) { idleHelper.shutdown(); idleHelper = null; } if (workspaceUndoMonitor != null) { workspaceUndoMonitor.shutdown(); workspaceUndoMonitor = null; } if (IDEWorkbenchPlugin.getPluginWorkspace() != null) { disconnectFromWorkspace(); } } @Override public void postStartup() { try { refreshFromLocal(); // close all editors whose file contents have been deleted EditorUtility.closeOrphanedEditors(); // TODO remove or comment in the following code: activate a proxy service? //activateProxyService(); //((Workbench) PlatformUI.getWorkbench()).registerService(ISelectionConversionService.class, // new IDESelectionConversionService()); // TODO remove or comment in the following code: prompt user when certain settings are changed? //initializeSettingsChangeListener(); //Display.getCurrent().addListener(SWT.Settings, settingsChangeListener); console = new MessageConsole("", null); // empty string hides title bar console.addPatternMatchListener(new DeployConsolePatternMatcher()); ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[] {console}); final MessageConsoleStream stream = console.newMessageStream(); stream.setActivateOnWrite(false); JFaceResources.getFontRegistry().addListener(fontPropertyChangeListener); updateConsoleFont(PreferenceConstants.EDITOR_TEXT_FONT); DartCore.getConsole().addStream(new MessageStream() { @Override public void clear() { console.clearConsole(); } @Override public void print(String s) { stream.print(s); } @Override public void println() { stream.println(); } @Override public void println(String s) { stream.println(s); } }); Display.getDefault().asyncExec(new Runnable() { @Override public void run() { if (shouldShowWelcome()) { new OpenIntroEditorAction().run(); } } }); IWorkbench workbench = PlatformUI.getWorkbench(); IActivityManager act = workbench.getActivitySupport().getActivityManager(); IBindingService bind = (IBindingService) workbench.getService(IBindingService.class); ICommandService cmd = (ICommandService) workbench.getService(ICommandService.class); DartKeyBindingPersistence persist = new DartKeyBindingPersistence(act, bind, cmd); persist.restoreBindingPreferences(); optionallyEnableSWTResourceProfiling(); } finally {// Resume background jobs after we startup Job.getJobManager().resume(); } } @Override public boolean preShutdown() { //Display.getCurrent().removeListener(SWT.Settings, settingsChangeListener); return super.preShutdown(); } @Override public void preStartup() { // since there's no support for closed projects, we remove any that exist // and harvest any deleted projects along the way cleanupClosedOrNonExistentProjects(); // Suspend background jobs while we startup Job.getJobManager().suspend(); // Register the build actions // IProgressService service = PlatformUI.getWorkbench().getProgressService(); // ImageDescriptor newImage = DartWorkbenchImages.getImageDescriptor(DartWorkbenchImages.IMG_ETOOL_BUILD_EXEC); // service.registerIconForFamily(newImage, ResourcesPlugin.FAMILY_MANUAL_BUILD); // service.registerIconForFamily(newImage, ResourcesPlugin.FAMILY_AUTO_BUILD); } protected boolean shouldShowWelcome() { if (DartCoreDebug.ENABLE_ANALYSIS_SERVER) { return ResourcesPlugin.getWorkspace().getRoot().getProjects().length == 0; } else { return DartCore.getProjectManager().getProjects().length == 0; } } //checks to see if a flag has been set noting that workspace layout needs to be reset private void checkForWorkbenchStateReset(IWorkbenchConfigurer workbenchConfigurer) { //this particular reset is necessitated by a move of plugin control contributions final String NEEDS_RESET = "needsReset"; //$NON-NLS-1$ if (!Activator.getDefault().getPreferenceStore().contains(NEEDS_RESET)) { Activator.getDefault().getPreferenceStore().putValue(NEEDS_RESET, IPreferenceStore.FALSE); //set to false to ensure old state does not get re-loaded; this will be reset to true in //ApplicationWorkbenchWindowAdvisor.preWindowOpen() workbenchConfigurer.setSaveAndRestore(false); } } private void cleanupClosedOrNonExistentProjects() { IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects(); for (IProject project : projects) { if (!ResourceUtil.isExistingProject(project)) { try { boolean remove = MessageDialog.openConfirm( Display.getDefault().getActiveShell(), "Remove Project", "Removing closed or non-existent project '" + project.getName() + "'."); if (remove) { Activator.log("removing closed or non-existent project '" + project.getName() + "' pre startup"); project.delete(false /* don't delete content */, true /* force */, null /* no monitor */); } } catch (CoreException e) { Activator.logError(e); } } else if (project.isHidden() && project.getName().equals(TemporaryProject.DEFAULT_NAME)) { try { project.delete(true /* delete content */, true /* force */, null /* no monitor */); } catch (CoreException e) { Activator.logError(e); } } } } /** * Code originally copied over from IDEWorkbenchAdvisor.declareWorkbenchImage(..) in * <code>org.eclipse.ui.ide.application</code>. * <p> * Declares an IDE-specific workbench image. * </p> * * @param symbolicName the symbolic name of the image * @param path the path of the image file; this path is relative to the base of the IDE plug-in * @param shared <code>true</code> if this is a shared image, and <code>false</code> if this is * not a shared image * @see IWorkbenchConfigurer#declareImage */ private void declareWorkbenchImage(Bundle ideBundle, String symbolicName, String path, boolean shared) { URL url = FileLocator.find(ideBundle, new Path(path), null); ImageDescriptor desc = ImageDescriptor.createFromURL(url); getWorkbenchConfigurer().declareImage(symbolicName, desc, shared); } /** * Code originally copied over from IDEWorkbenchAdvisor.declareWorkbenchImages() in * <code>org.eclipse.ui.ide.application</code>. * <p> * Declares all IDE-specific workbench images. This includes both "shared" images (named in * {@link IDE.SharedImages}) and internal images (named in * {@link org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages}). * * @see IWorkbenchConfigurer#declareImage */ private void declareWorkbenchImages() { final String ICONS_PATH = "$nl$/icons/full/";//$NON-NLS-1$ final String PATH_ELOCALTOOL = ICONS_PATH + "elcl16/"; // Enabled //$NON-NLS-1$ // toolbar // icons. final String PATH_DLOCALTOOL = ICONS_PATH + "dlcl16/"; // Disabled //$NON-NLS-1$ // //$NON-NLS-1$ // toolbar // icons. final String PATH_ETOOL = ICONS_PATH + "etool16/"; // Enabled toolbar //$NON-NLS-1$ // //$NON-NLS-1$ // icons. final String PATH_DTOOL = ICONS_PATH + "dtool16/"; // Disabled toolbar //$NON-NLS-1$ // //$NON-NLS-1$ // icons. final String PATH_OBJECT = ICONS_PATH + "obj16/"; // Model object //$NON-NLS-1$ // //$NON-NLS-1$ // icons final String PATH_WIZBAN = ICONS_PATH + "wizban/"; // Wizard //$NON-NLS-1$ // //$NON-NLS-1$ // icons // View icons // Introduced in 3.7 final String PATH_EVIEW = ICONS_PATH + "eview16/"; //$NON-NLS-1$ Bundle ideBundle = Platform.getBundle(Activator.PLUGIN_ID);//(IDEWorkbenchPlugin.IDE_WORKBENCH); declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_ETOOL_BUILD_EXEC, PATH_ETOOL + "build_exec.gif", false); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_ETOOL_BUILD_EXEC_HOVER, PATH_ETOOL + "build_exec.gif", false); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_ETOOL_BUILD_EXEC_DISABLED, PATH_DTOOL + "build_exec.gif", false); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_ETOOL_SEARCH_SRC, PATH_ETOOL + "search_src.gif", false); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_ETOOL_SEARCH_SRC_HOVER, PATH_ETOOL + "search_src.gif", false); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_ETOOL_SEARCH_SRC_DISABLED, PATH_DTOOL + "search_src.gif", false); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_ETOOL_NEXT_NAV, PATH_ETOOL + "next_nav.gif", false); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_ETOOL_PREVIOUS_NAV, PATH_ETOOL + "prev_nav.gif", false); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_WIZBAN_NEWPRJ_WIZ, PATH_WIZBAN + "newprj_wiz.png", false); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_WIZBAN_NEWFOLDER_WIZ, PATH_WIZBAN + "newfolder_wiz.png", false); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_WIZBAN_NEWFILE_WIZ, PATH_WIZBAN + "newfile_wiz.png", false); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_WIZBAN_IMPORTDIR_WIZ, PATH_WIZBAN + "importdir_wiz.png", false); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_WIZBAN_IMPORTZIP_WIZ, PATH_WIZBAN + "importzip_wiz.png", false); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_WIZBAN_EXPORTDIR_WIZ, PATH_WIZBAN + "exportdir_wiz.png", false); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_WIZBAN_EXPORTZIP_WIZ, PATH_WIZBAN + "exportzip_wiz.png", false); //$NON-NLS-1$ declareWorkbenchImage( ideBundle, DartWorkbenchImages.IMG_WIZBAN_RESOURCEWORKINGSET_WIZ, PATH_WIZBAN + "workset_wiz.png", false); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_DLGBAN_SAVEAS_DLG, PATH_WIZBAN + "saveas_wiz.png", false); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_DLGBAN_QUICKFIX_DLG, PATH_WIZBAN + "quick_fix.png", false); //$NON-NLS-1$ declareWorkbenchImage( ideBundle, IDE.SharedImages.IMG_OBJ_PROJECT, PATH_OBJECT + "prj_obj.gif", true); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OBJ_PROJECT_CLOSED, PATH_OBJECT + "cprj_obj.gif", true); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OPEN_MARKER, PATH_ELOCALTOOL + "gotoobj_tsk.gif", true); //$NON-NLS-1$ // Quick fix icons declareWorkbenchImage( ideBundle, DartWorkbenchImages.IMG_ELCL_QUICK_FIX_ENABLED, PATH_ELOCALTOOL + "smartmode_co.gif", true); //$NON-NLS-1$ declareWorkbenchImage( ideBundle, DartWorkbenchImages.IMG_DLCL_QUICK_FIX_DISABLED, PATH_DLOCALTOOL + "smartmode_co.gif", true); //$NON-NLS-1$ // Introduced in 3.7 declareWorkbenchImage( ideBundle, IDEInternalWorkbenchImages.IMG_OBJS_FIXABLE_WARNING, PATH_OBJECT + "quickfix_warning_obj.gif", true); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_OBJS_FIXABLE_ERROR, PATH_OBJECT + "quickfix_error_obj.gif", true); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OBJS_TASK_TSK, PATH_OBJECT + "taskmrk_tsk.gif", true); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OBJS_BKMRK_TSK, PATH_OBJECT + "bkmrk_tsk.gif", true); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_OBJS_COMPLETE_TSK, PATH_OBJECT + "complete_tsk.gif", true); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_OBJS_INCOMPLETE_TSK, PATH_OBJECT + "incomplete_tsk.gif", true); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_OBJS_WELCOME_ITEM, PATH_OBJECT + "welcome_item.gif", true); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_OBJS_WELCOME_BANNER, PATH_OBJECT + "welcome_banner.gif", true); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_OBJS_ERROR_PATH, PATH_OBJECT + "error_tsk.gif", true); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_OBJS_WARNING_PATH, PATH_OBJECT + "warn_tsk.gif", true); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_OBJS_INFO_PATH, PATH_OBJECT + "info_tsk.gif", true); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_LCL_FLAT_LAYOUT, PATH_ELOCALTOOL + "flatLayout.gif", true); //$NON-NLS-1$ declareWorkbenchImage( ideBundle, DartWorkbenchImages.IMG_LCL_HIERARCHICAL_LAYOUT, PATH_ELOCALTOOL + "hierarchicalLayout.gif", true); //$NON-NLS-1$ declareWorkbenchImage(ideBundle, DartWorkbenchImages.IMG_ETOOL_PROBLEM_CATEGORY, PATH_ETOOL + "problem_category.gif", true); //$NON-NLS-1$ // Introduced in 3.7 declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_ETOOL_PROBLEMS_VIEW, PATH_EVIEW + "problems_view.gif", true); //$NON-NLS-1$ declareWorkbenchImage( ideBundle, IDEInternalWorkbenchImages.IMG_ETOOL_PROBLEMS_VIEW_ERROR, PATH_EVIEW + "problems_view_error.gif", true); //$NON-NLS-1$ declareWorkbenchImage( ideBundle, IDEInternalWorkbenchImages.IMG_ETOOL_PROBLEMS_VIEW_WARNING, PATH_EVIEW + "problems_view_warning.gif", true); //$NON-NLS-1$ } /** * Disconnect from the core workspace. */ private void disconnectFromWorkspace() { IStatus status; try { // Save the workspace. status = ResourcesPlugin.getWorkspace().save(true, new NullProgressMonitor()); } catch (CoreException e) { status = e.getStatus(); } if (status != null && !status.isOK()) { ErrorDialog.openError( null, IDEWorkbenchMessages.ProblemsSavingWorkspace, null, status, IStatus.ERROR | IStatus.WARNING); IDEWorkbenchPlugin.log(IDEWorkbenchMessages.ProblemsSavingWorkspace, status); } } private void initializePreferenceSettings() { // tab style setting PlatformUI.getPreferenceStore().setValue( IWorkbenchPreferenceConstants.SHOW_TRADITIONAL_STYLE_TABS, false); // auto-refresh setting Preferences preferences = ResourcesPlugin.getPlugin().getPluginPreferences(); preferences.setValue(ResourcesPlugin.PREF_AUTO_REFRESH, true); } private void optionallyEnableSWTResourceProfiling() { // Optionally enable SWT resource leak debugging // // requires: // * the swt tools plugin (http://www.eclipse.org/swt/updates/3.6), and // * the following tracing options: // org.eclipse.ui/debug=true // org.eclipse.ui/trace/graphics=true if (DartCoreDebug.PERF_OS_RESOURCES) { try { String debugFlag = Platform.getDebugOption("org.eclipse.ui/debug"); if (!"true".equals(debugFlag)) { System.err.println("the \"org.eclipse.ui/debug\" trace option must be set to true for resource profiling"); return; } String graphicsTracingFlag = Platform.getDebugOption("org.eclipse.ui/trace/graphics"); if (!"true".equals(graphicsTracingFlag)) { System.err.println("the \"org.eclipse.ui/trace/graphics\" trace option must be set to true for resource profiling"); return; } PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView( "org.eclipse.swt.tools.views.SleakView"); } catch (PartInitException e) { System.err.println("OS resource profiling requires SWT tools to be installed"); e.printStackTrace(); } } } private void refreshFromLocal() { String[] commandLineArgs = Platform.getCommandLineArgs(); IPreferenceStore store = IDEWorkbenchPlugin.getDefault().getPreferenceStore(); boolean refresh = store.getBoolean(IDEInternalPreferences.REFRESH_WORKSPACE_ON_STARTUP); if (!refresh) { return; } // Do not refresh if it was already done by core on startup. for (int i = 0; i < commandLineArgs.length; i++) { if (commandLineArgs[i].equalsIgnoreCase("-refresh")) { //$NON-NLS-1$ return; } } final IContainer root = ResourcesPlugin.getWorkspace().getRoot(); Job job = new WorkspaceJob(IDEWorkbenchMessages.Workspace_refreshing) { @Override public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException { refreshResources((IWorkspaceRoot) root, monitor); return Status.OK_STATUS; } }; job.setRule(root); job.schedule(); } private void refreshResources(IWorkspaceRoot root, IProgressMonitor monitor) throws CoreException { IProject[] projects = root.getProjects(); for (IProject target : projects) { if (!target.isAccessible()) { continue; } RefreshLinkedVisitor visitor = new RefreshLinkedVisitor(monitor); IFileStore fileStore = ((Resource) target).getStore(); //try to get all info in one shot, if file system supports it IFileTree fileTree = fileStore.getFileSystem().fetchFileTree( fileStore, new SubProgressMonitor(monitor, 0)); UnifiedTree tree = fileTree == null ? new UnifiedTree(target) : new UnifiedTree( target, fileTree); tree.accept(visitor, IResource.DEPTH_INFINITE); IStatus result = visitor.getErrorStatus(); if (!result.isOK()) { Activator.logError(new ResourceException(result)); } } } private void updateConsoleFont(String name) { if (console != null) { if (name.equals(PreferenceConstants.EDITOR_TEXT_FONT)) { console.setFont(JFaceResources.getFont(name)); } } } }