/******************************************************************************* * Copyright (c) 2004, 2012 Tasktop Technologies and others. * 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: * Tasktop Technologies - initial API and implementation *******************************************************************************/ package org.eclipse.mylyn.internal.tasks.ui; import java.util.ArrayList; import java.util.List; import org.eclipse.mylyn.tasks.ui.editors.TaskEditor; import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; /** * @author Mik Kersten * @author Steffen Pingel */ public class TaskEditorBloatMonitor { private final static int MAX_EDITORS = 12; public static void editorOpened(IEditorPart editorPartOpened) { IWorkbenchPage page = editorPartOpened.getSite().getPage(); List<IEditorReference> toClose = new ArrayList<IEditorReference>(); int totalTaskEditors = 0; for (IEditorReference editorReference : page.getEditorReferences()) { if (TaskEditor.ID_EDITOR.equals(editorReference.getId())) { totalTaskEditors++; } } if (totalTaskEditors > MAX_EDITORS) { for (IEditorReference editorReference : page.getEditorReferences()) { try { if (editorPartOpened != editorReference.getPart(false) && TaskEditor.ID_EDITOR.equals(editorReference.getId())) { TaskEditorInput taskEditorInput = (TaskEditorInput) editorReference.getEditorInput(); TaskEditor taskEditor = (TaskEditor) editorReference.getEditor(false); if (taskEditor == null) { toClose.add(editorReference); } else if (!taskEditor.equals(editorPartOpened) && !taskEditor.isDirty() && taskEditorInput.getTask() != null && taskEditorInput.getTask().getSynchronizationState().isSynchronized()) { toClose.add(editorReference); } } if ((totalTaskEditors - toClose.size()) <= MAX_EDITORS) { break; } } catch (PartInitException e) { // ignore } } } if (toClose.size() > 0) { page.closeEditors(toClose.toArray(new IEditorReference[toClose.size()]), true); } } }