package org.nightlabs.jfire.issuetracking.dashboard.ui.internal;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.swt.SWT;
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.jdo.query.QueryCollection;
import org.nightlabs.jfire.base.dashboard.ui.AbstractDashboardGadget;
import org.nightlabs.jfire.base.dashboard.ui.action.DashboardTableActionManager;
import org.nightlabs.jfire.dashboard.DashboardGadgetLayoutEntry;
import org.nightlabs.jfire.issue.Issue;
import org.nightlabs.jfire.issue.dao.IssueDAO;
import org.nightlabs.jfire.issue.dashboard.IssueDashboardGadgetConfig;
import org.nightlabs.jfire.issue.query.IssueQuery;
import org.nightlabs.jfire.issuetracking.ui.issue.IssueTable;
import org.nightlabs.jfire.query.store.BaseQueryStore;
import org.nightlabs.jfire.query.store.QueryStore;
import org.nightlabs.jfire.query.store.dao.QueryStoreDAO;
import org.nightlabs.progress.ProgressMonitor;
import org.nightlabs.progress.SubProgressMonitor;
/**
* @author Daniel Mazurek - daniel [at] nightlabs [dot] de
*
*/
public class IssueDashboardGadget extends AbstractDashboardGadget
{
private IssueTable issueTable;
private DashboardTableActionManager<Issue> actionManager;
public IssueDashboardGadget() {}
@Override
public Composite createControl(Composite parent) {
XComposite invoiceGadget = createDefaultWrapper(parent);
issueTable = new IssueTable(invoiceGadget, SWT.NONE);
actionManager = new DashboardTableActionManager<Issue>(issueTable);
return invoiceGadget;
}
@Override
public void refresh() {
getGadgetContainer().setTitle(getGadgetContainer().getLayoutEntry().getName());
Job refreshJob = new RefreshGadgetJob("Loading Issues");
refreshJob.schedule();
}
class RefreshGadgetJob extends Job {
private RefreshGadgetJob(String name) {
super(name);
}
@Override
protected IStatus run(ProgressMonitor monitor) {
monitor.beginTask("Loading Issues", 100);
try {
displayLoadingMessage();
DashboardGadgetLayoutEntry<?> layoutEntry = getGadgetContainer().getLayoutEntry();
IssueDashboardGadgetConfig config = getConfig(layoutEntry);
QueryCollection<? extends IssueQuery> queryCollection = getConfiguredQueryCollection(config, new SubProgressMonitor(monitor, 50));
final Collection<Issue> issues = getIssuesForQueryCollection(queryCollection, new SubProgressMonitor(monitor, 50));
if (!issueTable.getDisplay().isDisposed()) {
issueTable.getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
issueTable.setInput(issues);
}
});
}
} finally {
monitor.done();
}
return Status.OK_STATUS;
}
private IssueDashboardGadgetConfig getConfig(
DashboardGadgetLayoutEntry<?> layoutEntry) {
return (IssueDashboardGadgetConfig) (layoutEntry.getConfig() != null ? layoutEntry.getConfig() : new IssueDashboardGadgetConfig());
}
@SuppressWarnings("unchecked")
private QueryCollection<? extends IssueQuery> getConfiguredQueryCollection(IssueDashboardGadgetConfig config, ProgressMonitor monitor) {
monitor.beginTask("Loading Issues", 1);
try {
QueryCollection<IssueQuery> queryCollection = null;
if (config.getIssueQueryItemId() != null) {
QueryStore queryStore = QueryStoreDAO.sharedInstance().getQueryStore(
config.getIssueQueryItemId(),
new String[] { BaseQueryStore.FETCH_GROUP_SERIALISED_QUERIES },
NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT,
monitor);
queryCollection = (QueryCollection<IssueQuery>) queryStore.getQueryCollection();
} else {
queryCollection = new QueryCollection(Issue.class);
queryCollection.add(new IssueQuery());
}
queryCollection.setFromInclude(0);
queryCollection.setToExclude(config.getAmountOfIssues());
return queryCollection;
} finally {
monitor.done();
}
}
private Collection<Issue> getIssuesForQueryCollection(
QueryCollection<? extends IssueQuery> queryCollection,
ProgressMonitor monitor) {
Collection<Issue> issues = IssueDAO.sharedInstance().getIssuesForQueries(
queryCollection,
issueTable.getIssueTableFetchGroups(),
NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT,
new SubProgressMonitor(monitor, 50));
List<Issue> invoiceList = new LinkedList<Issue>(issues);
monitor.done();
return invoiceList;
}
private void displayLoadingMessage() {
issueTable.getDisplay().syncExec(new Runnable() {
@Override
public void run() {
issueTable.setLoadingMessage("Loading Issues");
}
});
}
}
}