/*
* Created on Mar 9, 2007 Copyright (C) 2001-5, Anthony Harrison anh23@pitt.edu
* (jactr.org) This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of the License,
* or (at your option) any later version. This library is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
* the GNU Lesser General Public License for more details. You should have
* received a copy of the GNU Lesser General Public License along with this
* library; if not, write to the Free Software Foundation, Inc., 59 Temple
* Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.jactr.eclipse.ui.generic.view;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;
import org.jactr.eclipse.ui.UIPlugin;
public abstract class AbstractModelViewPart extends ViewPart
{
/**
* Logger definition
*/
static private final transient Log LOGGER = LogFactory
.getLog(AbstractModelViewPart.class);
private CTabFolder _modelViewsFolder;
private Set<Object> _deferredAdds = new HashSet<Object>();
public AbstractModelViewPart()
{
}
@Override
public void createPartControl(Composite parent)
{
createModelViewsFolder(parent);
partControlCreated();
}
protected void createModelViewsFolder(Composite parent)
{
_modelViewsFolder = new CTabFolder(parent, SWT.SINGLE | SWT.BORDER);
_modelViewsFolder.setMRUVisible(true);
_modelViewsFolder.setSingle(false);
_modelViewsFolder.setSimple(false);
}
protected void partControlCreated()
{
}
@Override
public void dispose()
{
super.dispose();
}
@Override
public void setFocus()
{
if (!_modelViewsFolder.isDisposed())
{
CTabItem item = _modelViewsFolder.getSelection();
if (item != null && !item.isDisposed()) item.getControl().setFocus();
}
}
protected CTabFolder getTabFolder()
{
return _modelViewsFolder;
}
public CTabItem getSelectedTab()
{
if (_modelViewsFolder.isDisposed()) return null;
CTabItem item = _modelViewsFolder.getSelection();
return item;
}
public void setSelectedTab(CTabItem item)
{
_modelViewsFolder.setSelection(item);
}
public CTabItem getModelTab(String modelName)
{
for (CTabItem tab : _modelViewsFolder.getItems())
if (tab.getText().equals(modelName)) return tab;
return null;
}
protected boolean wasDeferred(Object modelData)
{
return _deferredAdds.contains(modelData);
}
protected void removeDeferred(Object modelData)
{
_deferredAdds.remove(modelData);
}
/**
* create a new tab
*
* @param modelName
* @return
*/
protected CTabItem addModelTab(String modelName, Composite modelComposite)
{
CTabItem item = new CTabItem(_modelViewsFolder, SWT.NONE);
item.setText(modelName);
item.setControl(modelComposite);
item.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e)
{
CTabItem item = (CTabItem) e.widget;
Object modelData = item.getData();
disposeModelComposite(item.getText(), modelData,
(Composite) item.getControl());
tabClosed(modelData);
modelDataRemoved(modelData);
}
});
setSelectedTab(item);
return item;
}
private void removeModelTab(CTabItem item)
{
Object modelData = item.getData();
disposeModelComposite(item.getText(), item.getData(),
(Composite) item.getControl());
item.dispose();
modelDataRemoved(modelData);
}
protected void tabClosed(Object modelData)
{
}
/**
* add a new tab for modelName that will contain the composite returned by
* {@link #createModelComposite(String, Object, Composite)} the modelData is
* provided by the extending class, this will be passed on to the composite
* creator.
*
* @param modelName
* @param modelData
* @return the actual name of the tab, which will allow you to access the tab
*/
public String addModelData(String modelName, Object modelData)
{
String rtnName = modelName;
Composite modelComposite = createModelComposite(rtnName, modelData,
_modelViewsFolder);
if (modelComposite != null)
{
CTabItem tab = addModelTab(rtnName, modelComposite);
tab.setData(modelData);
if (wasDeferred(modelData)) removeDeferred(modelData);
modelDataAdded(modelData);
}
else if (LOGGER.isDebugEnabled())
LOGGER.debug(String.format("(%s) Add of %s returned null, ignoring",
getClass().getName(), modelName));
return rtnName;
}
protected void modelDataAdded(Object modelData)
{
}
protected void modelDataRemoved(Object modelData)
{
}
protected void deferAdd(final String modelName, final Object modelData,
final int tryAgainInMS)
{
_deferredAdds.add(modelData);
final Runnable adder = new Runnable() {
public void run()
{
if (LOGGER.isDebugEnabled())
LOGGER.debug(String.format("(%s) Deferred add of %s",
AbstractModelViewPart.this.getClass().getName(), modelName));
addModelData(modelName, modelData);
}
};
UIPlugin.getStandardDisplay().asyncExec(new Runnable() {
public void run()
{
/*
* to get around the SWT thread constraint for timed runs
*/
UIPlugin.getStandardDisplay().timerExec(tryAgainInMS, adder);
}
});
}
abstract protected Composite createModelComposite(String modelName,
Object modelData, Composite parent);
abstract protected void disposeModelComposite(String modelName,
Object modelData, Composite content);
public void removeModelData(Object modelData)
{
for (CTabItem tab : _modelViewsFolder.getItems())
if (!tab.isDisposed() && modelData == tab.getData()) removeModelTab(tab);
}
public Collection<Object> getModelData()
{
Collection<Object> rtn = new ArrayList<Object>();
for (CTabItem tab : _modelViewsFolder.getItems())
rtn.add(tab.getData());
return rtn;
}
public CTabItem[] getItems()
{
return _modelViewsFolder.getItems();
}
}