package org.argeo.suite.workbench.parts;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.argeo.activities.ActivitiesNames;
import org.argeo.activities.ActivitiesService;
import org.argeo.cms.auth.CurrentUser;
import org.argeo.cms.util.CmsUtils;
import org.argeo.connect.workbench.Refreshable;
import org.argeo.eclipse.ui.EclipseUiUtils;
import org.argeo.jcr.JcrUtils;
import org.argeo.node.NodeUtils;
import org.argeo.suite.workbench.AsUiPlugin;
import org.argeo.tracker.TrackerNames;
import org.argeo.tracker.TrackerService;
import org.argeo.tracker.ui.TaskListLabelProvider;
import org.argeo.tracker.ui.TaskVirtualListComposite;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
/** Argeo Suite Default Dashboard */
public class DefaultDashboardEditor extends AbstractSuiteDashboard implements Refreshable {
final static Log log = LogFactory.getLog(DefaultDashboardEditor.class);
public final static String ID = AsUiPlugin.PLUGIN_ID + ".defaultDashboardEditor";
private ActivitiesService activitiesService;
private TrackerService trackerService;
private Composite headerCmp;
private Composite taskListCmp;
private TaskVirtualListComposite tvlc;
@Override
public void createPartControl(Composite parent) {
super.createPartControl(parent);
parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
Composite bodyCmp = new Composite(parent, SWT.NO_FOCUS);
bodyCmp.setLayoutData(EclipseUiUtils.fillAll());
bodyCmp.setLayout(new GridLayout());
// Header
try {
// Control overviewCmp =
createUi(bodyCmp, NodeUtils.getUserHome(getSession()));
} catch (RepositoryException e) {
e.printStackTrace();
}
taskListCmp = new Composite(bodyCmp, SWT.NO_FOCUS);
taskListCmp.setLayoutData(EclipseUiUtils.fillAll());
populateTaskListCmp();
}
private void populateTaskListCmp() {
CmsUtils.clear(taskListCmp);
taskListCmp.setLayout(EclipseUiUtils.noSpaceGridLayout());
// Composite innerCmp = new Composite(taskListCmp, SWT.NO_FOCUS);
// innerCmp.setLayoutData(EclipseUiUtils.fillAll());
TaskListLabelProvider labelProvider = new TaskListLabelProvider(trackerService);
tvlc = new TaskVirtualListComposite(taskListCmp, SWT.NO_FOCUS, labelProvider, 54);
tvlc.setLayoutData(EclipseUiUtils.fillAll());
forceRefresh(null);
}
@Override
public void forceRefresh(Object object) {
NodeIterator nit = activitiesService.getMyTasks(getSession(), true);
tvlc.getTableViewer().setInput(JcrUtils.nodeIteratorToList(nit).toArray());
}
private Control createUi(Composite parent, Node context) throws RepositoryException {
Composite bodyCmp = new Composite(parent, SWT.NO_FOCUS);
bodyCmp.setLayout(new GridLayout());
// Title
Label titleLbl = new Label(bodyCmp, SWT.WRAP | SWT.LEAD);
CmsUtils.markup(titleLbl);
String titleStr = " Hello " + CurrentUser.getDisplayName() + " ";
titleLbl.setText(titleStr);
GridData gd = new GridData(SWT.CENTER, SWT.BOTTOM, false, false);
gd.verticalIndent = 5;
gd.horizontalIndent = 10;
titleLbl.setLayoutData(gd);
Calendar now = GregorianCalendar.getInstance();
NodeIterator nit = activitiesService.getMyTasks(getSession(), true);
if (nit.hasNext()) {
List overdueTasks = new ArrayList<>();
while (nit.hasNext()) {
Node currNode = nit.nextNode();
if (currNode.hasProperty(ActivitiesNames.ACTIVITIES_DUE_DATE)
&& currNode.getProperty(ActivitiesNames.ACTIVITIES_DUE_DATE).getDate().before(now))
overdueTasks.add(currNode);
}
if (!overdueTasks.isEmpty()) {
Label overdueLbl = new Label(bodyCmp, SWT.WRAP | SWT.LEAD);
CmsUtils.markup(overdueLbl);
long size = overdueTasks.size();
String overdueStr = "You have " + size + " overdue task" + (size > 1 ? "s" : "") + ".";
overdueLbl.setText(overdueStr);
}
}
nit = trackerService.getMyMilestones(getSession(), true);
if (nit.hasNext()) {
List overdueMilestones = new ArrayList<>();
while (nit.hasNext()) {
Node currNode = nit.nextNode();
if (currNode.hasProperty(TrackerNames.TRACKER_TARGET_DATE)
&& currNode.getProperty(TrackerNames.TRACKER_TARGET_DATE).getDate().before(now))
overdueMilestones.add(currNode);
}
if (!overdueMilestones.isEmpty()) {
Label overdueLbl = new Label(bodyCmp, SWT.WRAP | SWT.LEAD);
CmsUtils.markup(overdueLbl);
long size = overdueMilestones.size();
String overdueStr = "You have " + size + " overdue milestone" + (size > 1 ? "s" : "") + ".";
overdueLbl.setText(overdueStr);
}
}
return bodyCmp;
}
@Override
public void setFocus() {
// refreshDocListGadget();
}
public void setActivitiesService(ActivitiesService activitiesService) {
this.activitiesService = activitiesService;
}
public void setTrackerService(TrackerService trackerService) {
this.trackerService = trackerService;
}
}