/***************************************************************************** * 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.contentprovider.singlefolder; import java.util.ArrayList; import java.util.List; import org.eclipse.papyrus.infra.core.sasheditor.contentprovider.IAbstractPanelModel; import org.eclipse.papyrus.infra.core.sasheditor.contentprovider.IContentChangedListener; import org.eclipse.papyrus.infra.core.sasheditor.contentprovider.IContentChangedProvider; import org.eclipse.papyrus.infra.core.sasheditor.contentprovider.IPageModel; import org.eclipse.papyrus.infra.core.sasheditor.contentprovider.ISashWindowsContentProvider; import org.eclipse.papyrus.infra.core.sasheditor.contentprovider.ITabFolderModel; import org.eclipse.papyrus.infra.core.sasheditor.contentprovider.IContentChangedListener.ContentEvent; /** * A simple implementation of providers allowing only one single folder containing tabs. * The tabs can be added and removed. * * @author dumoulin */ public class SingleFolderContentProvider implements ISashWindowsContentProvider, IContentChangedProvider { /** The currently selected tab folder */ private SingleFolderModel currentTabFolder; /** */ private ContentChangeListenerManager contentChangedListenerManager = new ContentChangeListenerManager(); /** * Constructor. */ public SingleFolderContentProvider() { currentTabFolder = new SingleFolderModel(this); } /** * Add a listener listening on content changed. This listener will be * notified each time the content change. * * @param listener */ public void addListener(IContentChangedListener listener) { contentChangedListenerManager.addContentChangedListener(listener); } /** * Add a listener listening on content changed. This listener will be * notified each time the content change. * * @param listener */ public void removeListener(IContentChangedListener listener) { contentChangedListenerManager.removeContentChangedListener(listener); } /** * Add a listener listening on content changed. This listener will be * notified each time the content change. * * @param listener */ protected void firePropertyChanged(ContentEvent event) { contentChangedListenerManager.fireContentChanged(event); } /** * Add the page which should be an IPageModel instance. {@inheritDoc} */ public void addPage(Object newModel) { addPage((IPageModel)newModel); } /** * Add the page which should be an IPageModel instance. {@inheritDoc} */ public void addPage(Object newModel, int index) { addPage((IPageModel)newModel, index); } /** * * {@inheritDoc} */ public void addPage(IPageModel newModel) { currentTabFolder.addItem(newModel); } /** * * {@inheritDoc} */ public void addPage(int index, IPageModel newModel) { currentTabFolder.addItem(index, newModel); } /** * Do nothing because this implementation doesn't allows folders. {@inheritDoc} */ public void createFolder(ITabFolderModel tabFolder, int tabIndex, ITabFolderModel targetFolder, int side) { // TODO Auto-generated method stub } /** * Get the root used as root to be shown in the editor. {@inheritDoc} */ public SingleFolderModel getRootModel() { return currentTabFolder; } /** * Create the interface used to access the rootModel. {@inheritDoc} */ public IAbstractPanelModel createChildSashModel(Object root) { // The root object should be of type IAbstractPanelModel. // This is normally the object returned by getRootPanel return (IAbstractPanelModel)root; } /** * Remove the specified page which should be an instance of IPageModel. {@inheritDoc} */ public void removePage(Object page) { removePage((IPageModel)page); } /** * * {@inheritDoc} */ public void removePage(int index) { currentTabFolder.removeTab(index); } /** * * {@inheritDoc} */ public void removePage(IPageModel tabItem) { currentTabFolder.removeTab(tabItem); } /** * Remove the specified tab. As we have only one folder, this should be from the currentFolder {@inheritDoc} */ public void removePage(ITabFolderModel parentFolder, int tabIndex) { removePage(tabIndex); } /** * Return the currently selected TabFolder. * * @return */ public ITabFolderModel getCurrentTabFolder() { return currentTabFolder; } /** * Do nothing as we can't have other folders. * * @see org.eclipse.papyrus.infra.core.sasheditor.contentprovider.ISashWindowsContentProvider#setCurrentFolder(java.lang.Object) * * @param rawModel */ public void setCurrentFolder(Object rawModel) { } /** * A class managing a list of listeners. * * @author dumoulin */ protected class ContentChangeListenerManager { private List<IContentChangedListener> listeners; /** * Add a listener listening on content changed. This listener will be * notified each time the content change. * * @param listener */ public void addContentChangedListener(IContentChangedListener listener) { if(listeners == null) createListeners(); // Check if already exists. if(listeners.contains(listener)) return; listeners.add(listener); } /** * Add a listener listening on content changed. This listener will be * notified each time the content change. * * @param listener */ public void removeContentChangedListener(IContentChangedListener listener) { if(listeners == null) return; listeners.remove(listener); } /** * Create the list of listeners. */ private void createListeners() { if(listeners == null) listeners = new ArrayList<IContentChangedListener>(); } /** * Fire the changed event. * * @param event */ public void fireContentChanged(ContentEvent event) { if(listeners == null) return; for(IContentChangedListener listener : listeners) { listener.contentChanged(event); } } } /** * Move a tab inside the folder. {@inheritDoc} */ public void movePage(ITabFolderModel folderModel, int oldIndex, int newIndex) { currentTabFolder.moveTab(oldIndex, newIndex); } /** * Move a tab from folder to folder. * As this implementation has only one folder, this can't happen. Do nothing. {@inheritDoc} */ public void movePage(ITabFolderModel srcFolderModel, int sourceIndex, ITabFolderModel targetFolderModel, int targetIndex) { return; } }