/*****************************************************************************
* Copyright (c) 2009 CEA LIST & LIFL
*
*
* 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:
* Cedric Dumoulin Cedric.dumoulin@lifl.fr - Initial API and implementation
*
*****************************************************************************/
package org.eclipse.papyrus.infra.core.sasheditor.internal;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import org.eclipse.papyrus.infra.core.sasheditor.editor.IPageChangedListener;
/**
* Instance of this class track the active Page.
* When the active Page change, the tracker receive an event on {@link #setActiveEditor(PagePart)}, and perform following tasks:
* <ul>
* <li>- call {@link #fireEditorChangeEvent(PagePart, PagePart)}</li>
* <li>- fire events to all registered listeners.</li>
* </ul>
*
* This class allows tow kind of listeners:
*
* <ul>
* <li> {@link IActiveEditorChangedListener} for internal use (ex: {@link ActiveEditorServicesSwitcher})</li>
* <li> {@link IPageChangedListener} for public API use.</li>
* </ul>
* This class allows to set externally the active editor.
*
* @author dumoulin
*
*/
public class ActivePageTracker {
/** Log object */
Logger log = Logger.getLogger(getClass().getName());
/** List of listeners */
private List<IActiveEditorChangedListener> activeEditorChangedListeners = new ArrayList<IActiveEditorChangedListener>();
/** List of public listeners */
private List<IPageChangedListener> publicPageChangedListeners;
/** The currently active editor */
protected PagePart activeEditor;
/**
* Interface that must be implemented by listeners on activeEditorChange event.
*
* @author dumoulin
*
*/
public interface IActiveEditorChangedListener {
/**
* This method is called whenever the active editor is changed.
*
* @param oldEditor
* @param newEditor
*/
public void activeEditorChanged(PagePart oldEditor, PagePart newEditor);
}
/**
* Constructor.
* The activeEditor will be set by the first TabFolder that will call TabFolderPart.setPage().
*
* @param multiPartEditor
*/
public ActivePageTracker() {
}
/**
* Get the activeEditor.
*
* @return The active editor or null if there is none.
*/
public PagePart getActiveEditor() {
return activeEditor;
}
/**
* Set the active editor with the specified editor.
* This will notify all registered listeners
*
* @param editor
*/
public void setActiveEditor(PagePart editor) {
// Skip if there is no change
if(activeEditor == editor)
return;
PagePart oldEditor = activeEditor;
activeEditor = editor;
fireEditorChangeEvent(oldEditor, editor);
}
/**
* Add a listener on the activeEditorChange event.
*
* @param listener
*/
public void addActiveEditorChangedListener(IActiveEditorChangedListener listener) {
// no duplicate
if(activeEditorChangedListeners.contains(listener))
return;
activeEditorChangedListeners.add(listener);
}
/**
* Add a listener on the activeEditorChange event.
*
* @param listener
*/
public void removeActiveEditorChangedListener(IActiveEditorChangedListener listener) {
activeEditorChangedListeners.remove(listener);
}
/**
* Add a listener on the activeEditorChange event.
*
* @param listener
*/
public void addPageChangedListener(IPageChangedListener listener) {
// no duplicate
if(publicPageChangedListeners == null)
publicPageChangedListeners = new ArrayList<IPageChangedListener>();
if(publicPageChangedListeners.contains(listener))
return;
publicPageChangedListeners.add(listener);
}
/**
* Add a listener on the activeEditorChange event.
*
* @param listener
*/
public void removePageChangedListener(IPageChangedListener listener) {
if(publicPageChangedListeners == null)
return;
publicPageChangedListeners.remove(listener);
}
/**
* Notify all listener with event.
*
* @param oldEditor
* @param newEditor
*/
private void fireEditorChangeEvent(PagePart oldEditor, PagePart newEditor) {
// Fire only if really change
// if(oldEditor == newEditor)
// return;
// Fire events to internal listeners
for(IActiveEditorChangedListener listener : activeEditorChangedListeners) {
listener.activeEditorChanged(oldEditor, newEditor);
}
// Fire event to public listeners
if(publicPageChangedListeners != null) {
for(IPageChangedListener listener : publicPageChangedListeners) {
listener.pageChanged(newEditor);
}
}
}
}