X-Git-Url: http://git.argeo.org/?p=gpl%2Fargeo-suite.git;a=blobdiff_plain;f=org.argeo.suite.e4%2Fsrc%2Forg%2Fargeo%2Fsuite%2Fe4%2Fparts%2FDefaultDashboardEditor.java;fp=org.argeo.suite.e4%2Fsrc%2Forg%2Fargeo%2Fsuite%2Fe4%2Fparts%2FDefaultDashboardEditor.java;h=0000000000000000000000000000000000000000;hp=dd1c2b084732003422bc110d68220a7f92c9d0af;hb=30f7e4a5a1bdb27156511eb9ea88d2ec492d7e01;hpb=a55bb0dc7e9fbcefb645d34ce24b326d1506a623 diff --git a/org.argeo.suite.e4/src/org/argeo/suite/e4/parts/DefaultDashboardEditor.java b/org.argeo.suite.e4/src/org/argeo/suite/e4/parts/DefaultDashboardEditor.java deleted file mode 100644 index dd1c2b0..0000000 --- a/org.argeo.suite.e4/src/org/argeo/suite/e4/parts/DefaultDashboardEditor.java +++ /dev/null @@ -1,420 +0,0 @@ -package org.argeo.suite.e4.parts; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.GregorianCalendar; -import java.util.List; - -import javax.annotation.PostConstruct; -import javax.inject.Inject; -import javax.jcr.Node; -import javax.jcr.NodeIterator; -import javax.jcr.Property; -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.activities.ActivitiesTypes; -import org.argeo.activities.ui.TaskViewerContextMenu; -import org.argeo.api.NodeUtils; -import org.argeo.cms.auth.CurrentUser; -import org.argeo.cms.ui.util.CmsUiUtils; -import org.argeo.connect.ConnectException; -import org.argeo.connect.ConnectNames; -import org.argeo.connect.ui.ConnectWorkbenchUtils; -import org.argeo.connect.ui.Refreshable; -import org.argeo.connect.util.ConnectJcrUtils; -import org.argeo.eclipse.ui.EclipseUiUtils; -import org.argeo.jcr.JcrUtils; -import org.argeo.suite.e4.SuiteMsg; -import org.argeo.tracker.TrackerNames; -import org.argeo.tracker.TrackerService; -import org.argeo.tracker.core.TrackerUtils; -import org.argeo.tracker.ui.TaskListLabelProvider; -import org.argeo.tracker.ui.TaskVirtualListComposite; -import org.eclipse.e4.core.di.annotations.Optional; -import org.eclipse.jface.viewers.ColumnLabelProvider; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; -import org.eclipse.jface.viewers.ILabelProvider; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.MouseAdapter; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.layout.RowLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Link; - -/** 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"; - - @Inject - private ActivitiesService activitiesService; - - @Inject - @Optional - private TrackerService trackerService; - - private String datePattern = "dd MMM yyyy"; - - private Composite headerCmp; - private Composite taskListCmp; - private TaskVirtualListComposite tvlc; - - @PostConstruct - 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()); - - headerCmp = new Composite(bodyCmp, SWT.NO_FOCUS); - headerCmp.setLayoutData(EclipseUiUtils.fillWidth()); - - taskListCmp = new Composite(bodyCmp, SWT.NO_FOCUS); - taskListCmp.setLayoutData(EclipseUiUtils.fillAll()); - forceRefresh(null); - } - - @Override - public void forceRefresh(Object object) { - CmsUiUtils.clear(headerCmp); - populateHeaderPart(headerCmp, NodeUtils.getUserHome(getHomeSession())); - - CmsUiUtils.clear(taskListCmp); - populateTaskListCmp(taskListCmp); - - headerCmp.getParent().layout(true, true); - } - - private void populateTaskListCmp(Composite parent) { - parent.setLayout(EclipseUiUtils.noSpaceGridLayout()); - NodeIterator nit = activitiesService.getMyTasks(getMainSession(), true); - if (!nit.hasNext()) { - Composite noTaskCmp = new Composite(parent, SWT.NO_FOCUS); - noTaskCmp.setLayoutData(EclipseUiUtils.fillAll()); - noTaskCmp.setLayout(new GridLayout()); - - // Label noTaskLbl = new Label(noTaskCmp, SWT.CENTER); - // noTaskLbl.setText(" You have no pending Task. "); - // CmsUiUtils.markup(noTaskLbl); - // noTaskLbl.setLayoutData(new GridData(SWT.CENTER, SWT.BOTTOM, true, true)); - - } else { - TaskListLabelProvider labelProvider = new TaskListLabelProvider(getSystemAppService()); - tvlc = new TaskVirtualListComposite(parent, SWT.NO_FOCUS, (ILabelProvider) labelProvider, 54); - tvlc.setLayoutData(EclipseUiUtils.fillAll()); - final TableViewer viewer = tvlc.getTableViewer(); - viewer.setInput(JcrUtils.nodeIteratorToList(nit).toArray()); - final TaskViewerContextMenu contextMenu = new TaskViewerContextMenu(viewer, getHomeSession(), - activitiesService) { - @Override - public boolean performAction(String actionId) { - boolean hasChanged = super.performAction(actionId); - if (hasChanged) { - viewer.getTable().setFocus(); - forceRefresh(null); - // NodeIterator nit = - // activitiesService.getMyTasks(getSession(), true); - // viewer.setInput(JcrUtils.nodeIteratorToList(nit).toArray()); - } - return hasChanged; - } - }; - viewer.getTable().addMouseListener(new MouseAdapter() { - private static final long serialVersionUID = 6737579410648595940L; - - @Override - public void mouseDown(MouseEvent e) { - if (e.button == 3) { - // contextMenu.setCurrFolderPath(currDisplayedFolder); - contextMenu.show(viewer.getTable(), new Point(e.x, e.y), - (IStructuredSelection) viewer.getSelection()); - } - } - }); - viewer.addDoubleClickListener(new IDoubleClickListener() { - - @Override - public void doubleClick(DoubleClickEvent event) { - IStructuredSelection sel = (IStructuredSelection) viewer.getSelection(); - Node task = (Node) sel.getFirstElement(); - getSystemWorkbenchService().openEntityEditor(task); - } - }); - } - } - - private boolean isOverdue(Node node, String propName) { - try { - Calendar now = GregorianCalendar.getInstance(); - return node.hasProperty(propName) && node.getProperty(propName).getDate().before(now); - } catch (RepositoryException e) { - throw new ConnectException("Cannot check overdue status with property " + propName + " on " + node, e); - } - } - - private void populateHeaderPart(Composite bodyCmp, Node context) { - bodyCmp.setLayout(EclipseUiUtils.noSpaceGridLayout(new GridLayout(2, true))); - - Composite leftCmp = new Composite(bodyCmp, SWT.NO_FOCUS); - leftCmp.setLayout(new GridLayout()); - leftCmp.setLayoutData(EclipseUiUtils.fillWidth()); - Composite rightCmp = new Composite(bodyCmp, SWT.NO_FOCUS); - rightCmp.setLayout(new GridLayout()); - rightCmp.setLayoutData(EclipseUiUtils.fillWidth()); - - // Title - Label titleLbl = new Label(leftCmp, SWT.WRAP | SWT.LEAD); - CmsUiUtils.markup(titleLbl); - String titleStr = "" + CurrentUser.getDisplayName() + ""; - titleLbl.setText(titleStr); - GridData gd = new GridData(SWT.BEGINNING, SWT.TOP, false, false); - // gd.verticalIndent = 5; - // gd.horizontalIndent = 10; - titleLbl.setLayoutData(gd); - - final Link createTaskLk = new Link(leftCmp, SWT.CENTER); - // createTaskLk.setText("Create a task"); - createTaskLk.setText("" + SuiteMsg.newTodo.lead() + ""); - gd = new GridData(SWT.BEGINNING, SWT.TOP, false, false); - // gd.verticalIndent = 5; - gd.horizontalIndent = 10; - createTaskLk.setLayoutData(gd); - - createTaskLk.addSelectionListener(new SelectionAdapter() { - private static final long serialVersionUID = -9028457805156989935L; - - @Override - public void widgetSelected(SelectionEvent e) { - // String mainMixin = TrackerTypes.TRACKER_TASK; - String mainMixin = ActivitiesTypes.ACTIVITIES_TASK; - String pathCreated = ConnectWorkbenchUtils.createAndConfigureEntity(createTaskLk.getShell(), - getHomeSession(), getSystemAppService(), getSystemWorkbenchService(), mainMixin); - if (EclipseUiUtils.notEmpty(pathCreated)) - forceRefresh(null); - } - }); - - NodeIterator nit = activitiesService.getMyTasks(getHomeSession(), true); - if (nit.hasNext()) { - List overdueTasks = new ArrayList<>(); - while (nit.hasNext()) { - Node currNode = nit.nextNode(); - if (isOverdue(currNode, ActivitiesNames.ACTIVITIES_DUE_DATE)) - overdueTasks.add(currNode); - } - if (!overdueTasks.isEmpty()) { - Composite overdueCmp = new Composite(leftCmp, SWT.NO_FOCUS); - long size = overdueTasks.size(); - String overdueStr = "You have " + size + " overdue task" + (size > 1 ? "s" : "") + ": "; - populateMuliValueClickableList(overdueCmp, overdueTasks.toArray(new Node[0]), new TaskLp(), overdueStr); - } - } - - if (trackerService != null) { - nit = trackerService.getMyMilestones(getHomeSession(), true); - List openMilestones = new ArrayList<>(); - - if (nit.hasNext()) { - List overdueMilestones = new ArrayList<>(); - while (nit.hasNext()) { - Node currNode = nit.nextNode(); - openMilestones.add(currNode); - if (isOverdue(currNode, TrackerNames.TRACKER_TARGET_DATE)) - overdueMilestones.add(currNode); - } - if (!overdueMilestones.isEmpty()) { - Composite overdueCmp = new Composite(leftCmp, SWT.NO_FOCUS); - long size = overdueMilestones.size(); - String overdueStr = "You have " + size + " overdue milestone" + (size > 1 ? "s" : "") + ": "; - populateMuliValueClickableList(overdueCmp, overdueMilestones.toArray(new Node[0]), - new MilestoneLp(), overdueStr); - } - } - - // My projects - List openProjects = JcrUtils.nodeIteratorToList(trackerService.getMyProjects(getHomeSession(), true)); - if (!openProjects.isEmpty()) { - Group myProjectsGp = new Group(rightCmp, SWT.NO_FOCUS); - myProjectsGp.setText("My open projects"); - myProjectsGp.setLayoutData(EclipseUiUtils.fillWidth()); - populateMuliValueClickableList(myProjectsGp, openProjects.toArray(new Node[0]), new ProjectLp(), null); - } - - // My Milestones - if (!openMilestones.isEmpty()) { - Group myMilestoneGp = new Group(rightCmp, SWT.NO_FOCUS); - myMilestoneGp.setText("My open milestones"); - myMilestoneGp.setLayoutData(EclipseUiUtils.fillWidth()); - populateMuliValueClickableList(myMilestoneGp, openMilestones.toArray(new Node[0]), new MilestoneLp(), - null); - } - } - } - - private class ProjectLp extends ColumnLabelProvider { - private static final long serialVersionUID = 7231233932794865555L; - - @Override - public String getText(Object element) { - Node project = (Node) element; - - String percent; - NodeIterator nit = TrackerUtils.getIssues(project, null, null, null, true); - long openNb = nit.getSize(); - - nit = TrackerUtils.getIssues(project, null, null, null, false); - long allNb = nit.getSize(); - - if (allNb < 1) - percent = "empty"; - else { - double num = allNb - openNb; - double result = num / allNb * 100; - percent = String.format("%.1f", result) + "% done"; - } - StringBuilder builder = new StringBuilder(); - builder.append("").append(ConnectJcrUtils.get(project, Property.JCR_TITLE)).append(""); - builder.append(" (").append(percent).append(")"); - - return builder.toString(); - } - } - - private class MilestoneLp extends ColumnLabelProvider { - private static final long serialVersionUID = 7231233932794865555L; - - @Override - public String getText(Object element) { - Node milestone = (Node) element; - Node project = TrackerUtils.getRelatedProject(trackerService, milestone); - String dueDate = ConnectJcrUtils.getDateFormattedAsString(milestone, TrackerNames.TRACKER_TARGET_DATE, - datePattern); - - String percent; - String propName = TrackerNames.TRACKER_MILESTONE_UID; - String muid = ConnectJcrUtils.get(milestone, ConnectNames.CONNECT_UID); - NodeIterator nit = TrackerUtils.getIssues(project, null, propName, muid, true); - long openNb = nit.getSize(); - - nit = TrackerUtils.getIssues(project, null, propName, muid, false); - long allNb = nit.getSize(); - - if (allNb < 1) - percent = "empty"; - else { - double num = allNb - openNb; - double result = num / allNb * 100; - percent = String.format("%.1f", result) + "% done"; - } - StringBuilder builder = new StringBuilder(); - builder.append("").append(ConnectJcrUtils.get(milestone, Property.JCR_TITLE)).append(""); - builder.append(" ("); - if (EclipseUiUtils.notEmpty(dueDate)) - builder.append("due to ").append(dueDate).append(", "); - - builder.append(percent).append(")"); - return builder.toString(); - } - - @Override - public Color getForeground(Object element) { - Node milestone = (Node) element; - Calendar dueDate = ConnectJcrUtils.getDateValue(milestone, TrackerNames.TRACKER_TARGET_DATE); - if (dueDate != null && dueDate.before(Calendar.getInstance())) - return Display.getCurrent().getSystemColor(SWT.COLOR_RED); - return null; - } - } - - private class TaskLp extends ColumnLabelProvider { - private static final long serialVersionUID = 7231233932794865555L; - - @Override - public String getText(Object element) { - Node task = (Node) element; - String dueDate = ConnectJcrUtils.getDateFormattedAsString(task, ActivitiesNames.ACTIVITIES_DUE_DATE, - datePattern); - - StringBuilder builder = new StringBuilder(); - builder.append("").append(ConnectJcrUtils.get(task, Property.JCR_TITLE)).append(""); - if (EclipseUiUtils.notEmpty(dueDate)) - builder.append(" (").append("due to ").append(dueDate).append(")"); - return builder.toString(); - } - - @Override - public Color getForeground(Object element) { - Node milestone = (Node) element; - Calendar dueDate = ConnectJcrUtils.getDateValue(milestone, TrackerNames.TRACKER_TARGET_DATE); - if (dueDate != null && dueDate.before(Calendar.getInstance())) - return Display.getCurrent().getSystemColor(SWT.COLOR_RED); - return null; - } - } - - // public void setActivitiesService(ActivitiesService activitiesService) { - // this.activitiesService = activitiesService; - // } - // - // public void setTrackerService(TrackerService trackerService) { - // this.trackerService = trackerService; - // } - - // LOCAL HELPERS - private void populateMuliValueClickableList(Composite parent, Node[] nodes, ColumnLabelProvider lp, - String listLabel) { - CmsUiUtils.clear(parent); - RowLayout rl = new RowLayout(SWT.HORIZONTAL | SWT.WRAP); - rl.wrap = true; - rl.marginLeft = rl.marginTop = rl.marginBottom = 0; - rl.marginRight = 8; - parent.setLayout(rl); - - if (EclipseUiUtils.notEmpty(listLabel)) { - Link link = new Link(parent, SWT.NONE); - link.setText(listLabel); - link.setFont(EclipseUiUtils.getBoldFont(parent)); - } - - int i = 1; - for (Node node : nodes) { - Link link = new Link(parent, SWT.NONE); - CmsUiUtils.markup(link); - link.setText(lp.getText(node) + (i != nodes.length ? ", " : "")); - i++; - // Color fc = lp.getForeground(node); - // if (fc != null) - // link.setForeground(fc); - - link.addSelectionListener(new SelectionAdapter() { - private static final long serialVersionUID = 1L; - - @Override - public void widgetSelected(final SelectionEvent event) { - // CommandUtils.callCommand(getSystemWorkbenchService().getOpenEntityEditorCmdId(), - // ConnectEditor.PARAM_JCR_ID, ConnectJcrUtils.getIdentifier(node)); - getSystemWorkbenchService().openEntityEditor(node); - } - }); - } - } - -}