/******************************************************************************* * Copyright (c) 2001, 2005 IBM Corporation 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: * IBM Corporation - initial API and implementation * Jens Lukowski/Innoopract - initial renaming/restructuring * *******************************************************************************/ package org.eclipse.wst.sse.ui.internal.selection; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.jface.action.IAction; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.util.Assert; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.ui.texteditor.ITextEditor; public class SelectionHistory { private ITextEditor fEditor; private List fHistory; private List fHistoryActions; private int fSelectionChangeListenerCounter; private ISelectionChangedListener fSelectionListener; public SelectionHistory(ITextEditor editor) { Assert.isNotNull(editor); fEditor = editor; fHistory = new ArrayList(3); fSelectionListener = new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { if (fSelectionChangeListenerCounter == 0) flush(); } }; fEditor.getSelectionProvider().addSelectionChangedListener(fSelectionListener); } public void dispose() { fEditor.getSelectionProvider().removeSelectionChangedListener(fSelectionListener); fEditor = null; if (fHistory != null && !fHistory.isEmpty()) { fHistory.clear(); } if (fHistoryActions != null && !fHistoryActions.isEmpty()) { fHistoryActions.clear(); } } public void flush() { if (fHistory.isEmpty()) return; fHistory.clear(); updateHistoryAction(); } public IRegion getLast() { if (isEmpty()) return null; int size = fHistory.size(); IRegion result = (IRegion) fHistory.remove(size - 1); updateHistoryAction(); return result; } public void ignoreSelectionChanges() { fSelectionChangeListenerCounter++; } public boolean isEmpty() { return fHistory.isEmpty(); } public void listenToSelectionChanges() { fSelectionChangeListenerCounter--; } public void remember(IRegion region) { fHistory.add(region); updateHistoryAction(); } public void setHistoryAction(IAction action) { Assert.isNotNull(action); if (fHistoryActions == null) fHistoryActions = new ArrayList(); if (!fHistoryActions.contains(action)) fHistoryActions.add(action); // update action if (fHistory != null && !fHistory.isEmpty()) action.setEnabled(true); else action.setEnabled(false); } private void updateHistoryAction() { if (fHistoryActions != null && !fHistoryActions.isEmpty()) { boolean enabled = false; if (fHistory != null && !fHistory.isEmpty()) enabled = true; Iterator iter = fHistoryActions.iterator(); while (iter.hasNext()) { ((IAction)iter.next()).setEnabled(enabled); } } } }