package org.nightlabs.jfire.issuetracking.ui.issuelink.person;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import javax.jdo.FetchPlan;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.nightlabs.base.ui.composite.XComposite;
import org.nightlabs.base.ui.job.Job;
import org.nightlabs.jdo.NLJDOHelper;
import org.nightlabs.jfire.base.ui.config.ConfigUtil;
import org.nightlabs.jfire.issue.Issue;
import org.nightlabs.jfire.issue.IssueLink;
import org.nightlabs.jfire.issue.config.PersonIssueLinkTableConfigModule;
import org.nightlabs.jfire.issue.dao.IssueLinkDAO;
import org.nightlabs.jfire.issuetracking.ui.issue.IssueTable;
import org.nightlabs.jfire.prop.id.PropertySetID;
import org.nightlabs.jfire.table.config.ColumnDescriptor;
import org.nightlabs.jfire.table.config.IColumnConfiguration;
import org.nightlabs.progress.ProgressMonitor;
/**
* @author Daniel Mazurek - daniel [at] nightlabs [dot] de
*
*/
public class PersonIssueLinkTableComposite
extends XComposite
{
private static final String[] ISSUE_LINK_FETCH_GROUPS = new String[] {FetchPlan.DEFAULT, IssueLink.FETCH_GROUP_ISSUE};
private static final Logger logger = Logger.getLogger(PersonIssueLinkTableComposite.class);
private IssueTable issueTable;
private IColumnConfiguration columnConfiguration;
private String[] fetchGroups;
private Map<Issue, IssueLink> issue2IssueLink;
public PersonIssueLinkTableComposite(Composite parent, int style) {
super(parent, style);
issue2IssueLink = new HashMap<Issue, IssueLink>();
createPartContents(this);
}
/* (non-Javadoc)
* @see org.nightlabs.base.ui.part.ControllablePart#createPartContents(org.eclipse.swt.widgets.Composite)
*/
protected void createPartContents(final Composite parent)
{
issueTable = new IssueTable(parent, SWT.NONE, false);
issueTable.setLayoutData(new GridData(GridData.FILL_BOTH));
issueTable.getTableViewer().getTable().setLinesVisible(false);
Job loadColumnConfiguration = new Job("Load Column Configuration") {
@Override
protected IStatus run(ProgressMonitor monitor) throws Exception {
columnConfiguration = createColumnConfiguration(monitor);
if (!parent.isDisposed()) {
parent.getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
issueTable.setIssueTableConfigurations(columnConfiguration);
issueTable.layout(true, true);
}
});
}
return Status.OK_STATUS;
}
};
loadColumnConfiguration.schedule();
}
// protected IColumnConfiguration createColumnConfiguration(ProgressMonitor monitor)
// {
// IssueTableConfigModule issueTableCfMod = ConfigUtil.getUserCfMod(
// IssueTableConfigModule.class,
// new String[] {FetchPlan.DEFAULT,
// IssueTableConfigModule.FETCH_GROUP_COLUMNDESCRIPTORS,
// ColumnDescriptor.FETCH_GROUP_COL_FIELD_NAMES,
// ColumnDescriptor.FETCH_GROUP_COL_NAME,
// ColumnDescriptor.FETCH_GROUP_COL_TOOLTIP_DESCRIPTION,
// ColumnDescriptor.FETCH_GROUP_COL_FETCH_GROUPS},
// NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT,
// monitor);
// monitor.done();
// return issueTableCfMod;
// }
protected IColumnConfiguration createColumnConfiguration(ProgressMonitor monitor)
{
PersonIssueLinkTableConfigModule issueTableCfMod = ConfigUtil.getUserCfMod(
PersonIssueLinkTableConfigModule.class,
new String[] {FetchPlan.DEFAULT,
PersonIssueLinkTableConfigModule.FETCH_GROUP_COLUMNDESCRIPTORS,
ColumnDescriptor.FETCH_GROUP_COL_FIELD_NAMES,
ColumnDescriptor.FETCH_GROUP_COL_NAME,
ColumnDescriptor.FETCH_GROUP_COL_TOOLTIP_DESCRIPTION,
ColumnDescriptor.FETCH_GROUP_COL_FETCH_GROUPS},
NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT,
monitor);
monitor.done();
return issueTableCfMod;
}
protected String[] getFetchGroups()
{
if (fetchGroups == null && columnConfiguration != null) {
String[] columnFetchGroups = columnConfiguration.getAllColumnFetchGroups();
fetchGroups = new String[columnFetchGroups.length + ISSUE_LINK_FETCH_GROUPS.length];
for (int i = 0; i < columnFetchGroups.length; i++) {
fetchGroups[i] = columnFetchGroups[i];
}
for (int i = 0; i < ISSUE_LINK_FETCH_GROUPS.length; i++) {
fetchGroups[i + columnFetchGroups.length] = ISSUE_LINK_FETCH_GROUPS[i];
}
}
return fetchGroups;
}
public void setSelectedPersonID(final PropertySetID personID)
{
if (issueTable != null && !issueTable.isDisposed() && columnConfiguration != null)
{
if (personID == null) {
if (issueTable.getTableViewer().getContentProvider() != null)
issueTable.setInput(null);
return;
}
// issueTable.setLoadingMessage("Loading...");
Job job = new Job("Load Issues for Person") {
@Override
protected IStatus run(ProgressMonitor monitor) throws Exception
{
issue2IssueLink.clear();
Collection<IssueLink> issueLinks = IssueLinkDAO.sharedInstance().getIssueLinks(
personID, getFetchGroups(), NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, monitor);
final Collection<Issue> personIssues = new HashSet<Issue>(issueLinks.size());
// logger.info("getFetchGroups() = "+getFetchGroups());
for (IssueLink issueLink : issueLinks) {
personIssues.add(issueLink.getIssue());
issue2IssueLink.put(issueLink.getIssue(), issueLink);
}
if (!issueTable.isDisposed()) {
issueTable.getDisplay().asyncExec(new Runnable() {
@Override
public void run()
{
if (issueTable.getTableViewer().getContentProvider() != null)
issueTable.setInput(personIssues);
}
});
}
return Status.OK_STATUS;
}
};
job.schedule();
}
}
public IssueTable getIssueTable() {
return issueTable;
}
public IssueLink getSelectedIssueLink()
{
if (issueTable != null && !issueTable.isDisposed())
{
if (issueTable.getFirstSelectedElement() instanceof Issue) {
Issue issue = issueTable.getFirstSelectedElement();
return issue2IssueLink.get(issue);
}
}
return null;
}
}