/** * This file is licensed under the University of Illinois/NCSA Open Source License. See LICENSE.TXT for details. */ package edu.illinois.codingtracker.listeners; import org.eclipse.compare.internal.CompareEditor; import org.eclipse.core.resources.IFile; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IPartListener; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.texteditor.AbstractDecoratedTextEditor; import edu.illinois.codingtracker.compare.helpers.EditorHelper; /** * * @author Stas Negara * @author Mohsen Vakilian - Extracted this class from CodeChangeTracker and added the method * {@link #getActivePage()}. * */ @SuppressWarnings("restriction") public class PartListener extends BasicListener implements IPartListener { private static IWorkbenchPage getActivePage() { IWorkbenchWindow activeWorkbenchWindow= BasicListener.getActiveWorkbenchWindow(); if (activeWorkbenchWindow == null) { return null; } IWorkbenchPage activePage= activeWorkbenchWindow.getActivePage(); return activePage; } public static void register() { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { //TODO: Is it too heavy-weight? Did not notice any additional lag even on a slow machine. boolean isPartListenerRegistered= false; while (!isPartListenerRegistered) { IWorkbenchPage activePage= getActivePage(); if (activePage != null) { activePage.addPartListener(new PartListener()); isPartListenerRegistered= true; } } } }); } @Override public void partActivated(IWorkbenchPart part) { } @Override public void partBroughtToTop(IWorkbenchPart part) { } @Override public void partClosed(IWorkbenchPart part) { IFile closedFile= null; if (part instanceof CompareEditor) { closedFile= EditorHelper.getEditedJavaFile((CompareEditor)part); } else if (part instanceof AbstractDecoratedTextEditor) { closedFile= EditorHelper.getEditedJavaFile((AbstractDecoratedTextEditor)part); } if (EditorHelper.isConflictEditor(part)) { closeConflictEditor((CompareEditor)part); } else if (closedFile != null) { closeRegularEditor(part, closedFile); } } private void closeConflictEditor(CompareEditor compareEditor) { openConflictEditors.remove(compareEditor); operationRecorder.recordClosedConflictEditor(EditorHelper.getConflictEditorID(compareEditor)); } private void closeRegularEditor(IWorkbenchPart part, IFile closedFile) { //Check that this is the last editor of this file that is closed IWorkbenchPage activePage= getActivePage(); if (activePage != null) { IEditorReference[] editorReferences= activePage.getEditorReferences(); for (IEditorReference editorReference : editorReferences) { IEditorPart editor= editorReference.getEditor(false); if (editor != part && !EditorHelper.isConflictEditor(editor)) { IFile file= null; if (editor instanceof CompareEditor) { file= EditorHelper.getEditedJavaFile((CompareEditor)editor); } else if (editor instanceof AbstractDecoratedTextEditor) { file= EditorHelper.getEditedJavaFile((AbstractDecoratedTextEditor)editor); } if (closedFile.equals(file)) { return; // file is not really closed as it is opened in another editor } } } } operationRecorder.recordClosedFile(closedFile); } @Override public void partDeactivated(IWorkbenchPart part) { } @Override public void partOpened(IWorkbenchPart part) { } }