package org.jactr.eclipse.runtime.ui.misc;
/*
* default logging
*/
import java.text.DateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.ControlContribution;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.jactr.eclipse.runtime.RuntimePlugin;
import org.jactr.eclipse.runtime.session.ISession;
import org.jactr.eclipse.runtime.session.manager.ISessionManager;
import org.jactr.eclipse.runtime.session.manager.ISessionManagerListener;
import org.jactr.eclipse.ui.concurrent.QueueingUIJob;
import org.jactr.eclipse.ui.concurrent.SWTExecutor;
/**
* contribution item that provides a combobox from which any session can be
* selected.
*
* @author harrison
*/
public class SelectSessionAction extends ControlContribution implements
ISessionSelectionListener
{
/**
* Logger definition
*/
static private final transient Log LOGGER = LogFactory
.getLog(SelectSessionAction.class);
static public final String NO_SELECTION = "No session";
private final ISessionManagerListener _sessionManagerListener;
private final Map<String, ISession> _labelToSession;
private final ISessionSelectionProvider _sessionSelectionProvider;
private CCombo _combo;
private QueueingUIJob _updateJob;
public SelectSessionAction(ISessionSelectionProvider selectionProvider)
{
super("selectSession");
_sessionSelectionProvider = selectionProvider;
_labelToSession = new TreeMap<String, ISession>();
_sessionManagerListener = new ISessionManagerListener() {
public void sessionRemoved(ISession session)
{
updateContents();
}
public void sessionAdded(ISession session)
{
updateContents();
}
};
_updateJob = new QueueingUIJob("session update") {
@Override
public IStatus runInUIThread(IProgressMonitor monitor)
{
populateCombo();
return Status.OK_STATUS;
}
};
RuntimePlugin.getDefault().getSessionManager()
.addListener(_sessionManagerListener, null);
_sessionSelectionProvider.addListener(this, new SWTExecutor());
}
@Override
public void dispose()
{
RuntimePlugin.getDefault().getSessionManager()
.removeListener(_sessionManagerListener);
super.dispose();
}
protected void updateContents()
{
_updateJob.queue(250);
}
protected void populateCombo()
{
if (_combo.isDisposed()) return;
ISessionManager manager = RuntimePlugin.getDefault().getSessionManager();
Set<ISession> allSessions = manager.getSessions(new HashSet<ISession>());
_combo.removeAll();
_labelToSession.clear();
boolean anyOpen = false;
for (ISession session : allSessions)
if (session.isOpen())
{
anyOpen = true;
String labelName = generateLabel(session);
_labelToSession.put(labelName, session);
_combo.add(labelName);
}
// add the no selection
if (!anyOpen) _combo.add(NO_SELECTION);
_combo.pack(true);
_combo.setEnabled(anyOpen);
// this is a problem..
if (!_combo.isEnabled()) _combo.select(0);
}
@Override
protected Control createControl(Composite parent)
{
_combo = new CCombo(parent, SWT.READ_ONLY | SWT.FLAT);
_combo.setTextLimit(15);
_combo.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e)
{
//
String selection = _combo.getItem(_combo.getSelectionIndex());
ISession session = _labelToSession.get(selection);
if (session != null) _sessionSelectionProvider.select(session);
}
public void widgetDefaultSelected(SelectionEvent e)
{
}
});
populateCombo();
return _combo;
}
private String generateLabel(ISession session)
{
Date startOfSession = session.getTimeOfExecution();
Calendar now = Calendar.getInstance();
now.setTimeInMillis(System.currentTimeMillis());
Calendar then = Calendar.getInstance();
then.setTime(startOfSession);
DateFormat instance = null;
if (now.get(Calendar.DAY_OF_YEAR) > then.get(Calendar.DAY_OF_YEAR))
instance = DateFormat.getDateTimeInstance(DateFormat.SHORT,
DateFormat.SHORT);
else
instance = DateFormat.getTimeInstance(DateFormat.SHORT);
return instance.format(startOfSession);
}
/**
* runs in SWT thread
*/
public void sessionSelected(ISession session)
{
if (_combo == null || _combo.isDisposed()) return;
if (session == null)
_combo.select(_combo.getItemCount() - 1);
else
{
int index = _combo.indexOf(generateLabel(session));
if (index == -1)
{
populateCombo();
index = _combo.indexOf(generateLabel(session));
}
if (index >= 0) _combo.select(index);
}
}
}