/*****************************************************************************
* 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.di.contentprovider.internal;
import org.eclipse.papyrus.infra.core.sasheditor.contentprovider.IAbstractPanelModel;
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;
import org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.IPageModelFactory;
import org.eclipse.papyrus.infra.core.sashwindows.di.DiFactory;
import org.eclipse.papyrus.infra.core.sashwindows.di.SashModel;
import org.eclipse.papyrus.infra.core.sashwindows.di.SashPanel;
import org.eclipse.papyrus.infra.core.sashwindows.di.TabFolder;
/**
* EMF implementation of the {@link ISashWindowsContentProvider}.
*
* @author dumoulin
*/
public class DiContentProvider implements ISashWindowsContentProvider {
/** Internal EMF model */
private SashModel diSashModel;
/** Factory used to create SWT Editor or Component from Page Identifiers. */
private IPageModelFactory pageModelFactory;
/** Object delivering event to listeners. Used to control how the events are triggered */
private ContentChangedEventProvider contentChangedEventProvider;
/**
* Create a ContentProvider
*
* @param diSashModel
* @param pageModelFactory The factory that will be used when a page will be created.
* @throws IllegalArgumentException
* If the factory is null.
*/
public DiContentProvider(SashModel diSashModel, IPageModelFactory pageModelFactory) throws IllegalArgumentException {
this(diSashModel, pageModelFactory, new ContentChangedEventProvider(diSashModel));
}
/**
* Create a ContentProvider
*
* @param diSashModel
* @param pageModelFactory The factory that will be used when a page will be created.
* @throws IllegalArgumentException
* If the factory is null.
*/
public DiContentProvider(SashModel diSashModel, IPageModelFactory pageModelFactory, ContentChangedEventProvider contentChangedEventProvider) throws IllegalArgumentException {
if(pageModelFactory == null)
throw new IllegalArgumentException("A IPageModelFactory should be provided.");
this.diSashModel = diSashModel;
this.pageModelFactory = pageModelFactory;
this.contentChangedEventProvider = contentChangedEventProvider;
}
/**
* Access to internal structure for tests.
* This method is not intended to be used for other purpose.
*
* @return the diSashModel
*/
protected SashModel getDiSashModel() {
return diSashModel;
}
/**
* @return the contentChangedEventProvider
*/
protected ContentChangedEventProvider getContentChangedEventProvider() {
return contentChangedEventProvider;
}
/**
* Add a page identifier to the SashModel. This page identifier will be added as "child" of the current
* TabFolder.
*
* @param pageIdentifier
*/
public void addPage(Object pageIdentifier) {
diSashModel.addPage(pageIdentifier);
}
/**
* Add a page to the current folder.
* Create the Page (Editor or Component) with the help of the factory.
*
* @see org.eclipse.papyrus.infra.core.sasheditor.contentprovider.ISashWindowsContentProvider#addPage(int,
* org.eclipse.papyrus.infra.core.sasheditor.contentprovider.IPageModel)
*
* @param index
* @param tabItem
*/
public void addPage(Object page, int index) {
throw new UnsupportedOperationException("Not yet implemented.");
}
/**
* @see org.eclipse.papyrus.infra.core.sasheditor.contentprovider.ISashWindowsContentProvider#createFolder(org.eclipse.papyrus.infra.core.sasheditor.contentprovider.ITabFolderModel,
* int, org.eclipse.papyrus.infra.core.sasheditor.contentprovider.ITabFolderModel, int)
*
* @param tabFolder
* @param tabIndex
* @param targetFolder
* @param side
* @return
*/
public void createFolder(ITabFolderModel tabFolder, int tabIndex, ITabFolderModel targetFolder, int side) {
// disable fired events
contentChangedEventProvider.setDeliver(false);
// Create new folder. Parent will be set when inserted.
TabFolder newFolder = DiFactory.eINSTANCE.createTabFolder();
TabFolder refFolder = ((TabFolderModel)targetFolder).getTabFolder();
TabFolder pageSrcFolder = ((TabFolderModel)tabFolder).getTabFolder();
// Insert folder
diSashModel.insertFolder(newFolder, refFolder, side);
// Move tab from folder to folder
diSashModel.movePage(pageSrcFolder, tabIndex, newFolder);
// Remove unused folder if necessary
diSashModel.removeEmptyFolder(pageSrcFolder);
diSashModel.setCurrentSelection(newFolder);
// Reenable events, and fire the last one
contentChangedEventProvider.setDeliver(true);
}
/**
* Set the current folder.
*
* @see org.eclipse.papyrus.infra.core.sasheditor.contentprovider.ISashWindowsContentProvider#setCurrentFolder(java.lang.Object)
*
* @param rawModel
* The object identifying the folder.
*/
public void setCurrentFolder(Object rawModel) {
if(!(rawModel instanceof TabFolder)) {
return;
}
diSashModel.setCurrentSelection((TabFolder)rawModel);
}
/**
* Get the node used as root of the SashWindows.
* For now, this is the first window.
*
* @see org.eclipse.papyrus.infra.core.sasheditor.contentprovider.ISashWindowsContentProvider#getRootModel()
*
* @return
*/
public Object getRootModel() {
// Get the first window.
return diSashModel.getWindows().get(0).getPanel();
}
/**
* Create the IPanelModel for the rootModel returned by {@link DiContentProvider#getRootModel()}.
*
* @see org.eclipse.papyrus.infra.core.sasheditor.contentprovider.ISashWindowsContentProvider#createChildSashModel(java.lang.Object)
*
* @param root
* @return
*/
public IAbstractPanelModel createChildSashModel(Object root) {
if(root instanceof SashPanel)
return new SashPanelModel((SashPanel)root, pageModelFactory);
else if(root instanceof TabFolder)
return new TabFolderModel((TabFolder)root, pageModelFactory);
else
throw new IllegalArgumentException("Can't create IPanelModel from raw model '" + root + "'.");
}
/**
* @see org.eclipse.papyrus.infra.core.sasheditor.contentprovider.ISashWindowsContentProvider#movePage(org.eclipse.papyrus.infra.core.sasheditor.contentprovider.ITabFolderModel,
* int, int)
*
* @param folderModel
* @param oldIndex
* @param newIndex
*/
public void movePage(ITabFolderModel folderModel, int oldIndex, int newIndex) {
TabFolder folder = ((TabFolderModel)folderModel).getTabFolder();
contentChangedEventProvider.setDeliver(false);
folder.movePage(oldIndex, newIndex);
diSashModel.setCurrentSelection(folder);
contentChangedEventProvider.setDeliver(true);
}
/**
* @see org.eclipse.papyrus.infra.core.sasheditor.contentprovider.ISashWindowsContentProvider#movePage(org.eclipse.papyrus.infra.core.sasheditor.contentprovider.ITabFolderModel,
* int, org.eclipse.papyrus.infra.core.sasheditor.contentprovider.ITabFolderModel, int)
*
* @param srcFolderModel
* @param sourceIndex
* @param targetFolderModel
* @param targetIndex
*/
public void movePage(ITabFolderModel srcFolderModel, int sourceIndex, ITabFolderModel targetFolderModel, int targetIndex) {
TabFolder srcFolder = ((TabFolderModel)srcFolderModel).getTabFolder();
TabFolder targetFolder = ((TabFolderModel)targetFolderModel).getTabFolder();
contentChangedEventProvider.setDeliver(false);
diSashModel.movePage(srcFolder, sourceIndex, targetFolder, targetIndex);
diSashModel.removeEmptyFolder(srcFolder);
diSashModel.setCurrentSelection(targetFolder);
contentChangedEventProvider.setDeliver(true);
}
/**
* Remove specified page from the current folder.
*
* @see org.eclipse.papyrus.infra.core.sasheditor.contentprovider.ISashWindowsContentProvider#removePage(int)
*
* @param index
*/
public void removePage(int index) {
diSashModel.removePage(index);
}
/**
* @see org.eclipse.papyrus.infra.core.sasheditor.contentprovider.ISashWindowsContentProvider#removePage(org.eclipse.papyrus.infra.core.sasheditor.contentprovider.IPageModel)
*
* @param tabItem
*/
public void removePage(Object page) {
throw new UnsupportedOperationException("Not yet implemented.");
}
/**
* @see org.eclipse.papyrus.infra.core.sasheditor.contentprovider.ISashWindowsContentProvider#removePage(org.eclipse.papyrus.infra.core.sasheditor.contentprovider.ITabFolderModel,
* int)
*
* @param parentFolder
* @param tabIndex
*/
public void removePage(ITabFolderModel parentFolder, int tabIndex) {
TabFolder folder = ((TabFolderModel)parentFolder).getTabFolder();
contentChangedEventProvider.setDeliver(false);
folder.removePage(tabIndex);
diSashModel.removeEmptyFolder(folder);
contentChangedEventProvider.setDeliver(true);
}
/**
* Add a listener listening on content changed. This listener will be
* notified each time the content change.
*
* @param listener
*/
protected void firePropertyChanged(ContentEvent event) {
contentChangedEventProvider.fireContentChanged(event);
}
}