This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository jtimer. See https://gitlab.nuiton.org/chorem/jtimer.git commit 5bf7e8156caad2aefca6254e68b1279ddb32fe54 Author: Eric Chatellier <chatellier@codelutin.com> Date: Tue Mar 29 15:06:35 2016 +0200 fixes #880: Select running task in popup --- .../chorem/jtimer/entities/TimerTaskHelper.java | 20 ++++++++ .../org/chorem/jtimer/ui/tasks/IdleDialog.java | 15 ++++-- .../jtimer/ui/tree/ProjectsAndTasksTree.java | 60 ++++++++++++++++++++++ .../jtimer/ui/treetable/ProjectsAndTasksTable.java | 16 ++---- .../jtimer/entities/TimerTaskHelperTest.java | 52 +++++++++++++++++++ 5 files changed, 147 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/chorem/jtimer/entities/TimerTaskHelper.java b/src/main/java/org/chorem/jtimer/entities/TimerTaskHelper.java index ec03a86..ded3a96 100644 --- a/src/main/java/org/chorem/jtimer/entities/TimerTaskHelper.java +++ b/src/main/java/org/chorem/jtimer/entities/TimerTaskHelper.java @@ -311,4 +311,24 @@ public class TimerTaskHelper { return present; } + + /** + * Get list of all task parent with current task. + * + * @param task current task + * @return of task parent (ordered) including current task + */ + public static List<TimerTask> getPathFromParent(TimerTask task) { + // compute task tree path + List<TimerTask> components = new ArrayList<>(); + TimerTask current = task; + while (current != null) { + components.add(current); + current = current.getParent(); + } + + Collections.reverse(components); + + return components; + } } diff --git a/src/main/java/org/chorem/jtimer/ui/tasks/IdleDialog.java b/src/main/java/org/chorem/jtimer/ui/tasks/IdleDialog.java index d863592..85671df 100644 --- a/src/main/java/org/chorem/jtimer/ui/tasks/IdleDialog.java +++ b/src/main/java/org/chorem/jtimer/ui/tasks/IdleDialog.java @@ -49,6 +49,7 @@ import org.apache.commons.logging.LogFactory; import org.chorem.jtimer.JTimer; import org.chorem.jtimer.data.TimerCore; import org.chorem.jtimer.entities.TimerTask; +import org.chorem.jtimer.ui.tree.ProjectsAndTasksTree; import org.chorem.jtimer.ui.tree.TaskTreeModel; import org.chorem.jtimer.ui.treetable.ProjectsAndTasksCellRenderer; import org.jdesktop.application.Action; @@ -121,6 +122,9 @@ public class IdleDialog extends JDialog { /** Timestamp when idle starts. */ protected long idleStartTimestamp; + /** Current running task. */ + protected TimerTask currentRunningTask; + /** Task label. */ protected JLabel taskNameLabel; @@ -134,7 +138,7 @@ public class IdleDialog extends JDialog { protected JPanel assignPanel; /** Assign project tree. */ - protected JTree projectsTree; + protected ProjectsAndTasksTree projectsTree; /** Task selected in tree. */ protected boolean selectedTask; @@ -279,7 +283,7 @@ public class IdleDialog extends JDialog { GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(3, 0, 0, 5), 0, 0)); // Tree - projectsTree = new JTree(); + projectsTree = new ProjectsAndTasksTree(); projectsTree.setRootVisible(false); projectsTree.setShowsRootHandles(true); projectsTree.setModel(new TaskTreeModel(core, null)); @@ -292,7 +296,8 @@ public class IdleDialog extends JDialog { } else { assignSelectedTask = null; } - setSelectedTask(assignSelectedTask != null); + // must select a task and a different one from one running + setSelectedTask(assignSelectedTask != null && !assignSelectedTask.equals(currentRunningTask)); }); panel.add(new JScrollPane(projectsTree), new GridBagConstraints(0, 2, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 3, 5), 0, 0)); @@ -404,8 +409,10 @@ public class IdleDialog extends JDialog { Task<?, ?> t = tm.getTasks().get(0); TimerTask currentTask = ((RunTaskJob) t).getTask(); - // update message + // update selected task related + this.currentRunningTask = currentTask; taskNameLabel.setText(resourceMap.getString("currentTask", currentTask.getName())); + projectsTree.setSelectedTask(currentTask); // schedule timer updateIdleTime = new UpdateIdleTime(); diff --git a/src/main/java/org/chorem/jtimer/ui/tree/ProjectsAndTasksTree.java b/src/main/java/org/chorem/jtimer/ui/tree/ProjectsAndTasksTree.java new file mode 100644 index 0000000..d81f057 --- /dev/null +++ b/src/main/java/org/chorem/jtimer/ui/tree/ProjectsAndTasksTree.java @@ -0,0 +1,60 @@ +/* + * #%L + * jTimer + * %% + * Copyright (C) 2016 CodeLutin, Chatellier Eric + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +package org.chorem.jtimer.ui.tree; + +import org.chorem.jtimer.entities.TimerTask; +import org.chorem.jtimer.entities.TimerTaskHelper; + +import javax.swing.JTree; +import javax.swing.tree.TreePath; +import java.util.List; + +/** + * ProjectAndTaskTree. + * + * @author chatellier + * @version $Revision$ + * + * Last update : $Date$ + * By : $Author$ + */ +public class ProjectsAndTasksTree extends JTree { + + /** serialVersionUID. */ + private static final long serialVersionUID = -6909972377431117193L; + + /** + * Set selected task in tree. + * + * @param task task + */ + public void setSelectedTask(TimerTask task) { + // compute task tree path + List<TimerTask> components = TimerTaskHelper.getPathFromParent(task); + components.add(0, (TimerTask)getModel().getRoot()); + + // select tree path in reverse order (from root to leaf) + TreePath path = new TreePath(components.toArray()); + getSelectionModel().setSelectionPath(path); + } +} diff --git a/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksTable.java b/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksTable.java index b087b51..1245a7b 100644 --- a/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksTable.java +++ b/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksTable.java @@ -38,6 +38,7 @@ import javax.swing.tree.TreePath; import org.chorem.jtimer.data.TimerCore; import org.chorem.jtimer.entities.TimerProject; import org.chorem.jtimer.entities.TimerTask; +import org.chorem.jtimer.entities.TimerTaskHelper; import org.chorem.jtimer.ui.treetable.dnd.TimerTaskTransferHandler; import org.jdesktop.application.Application; import org.jdesktop.application.ApplicationContext; @@ -255,24 +256,15 @@ public class ProjectsAndTasksTable extends JXTreeTable { /** * Set selected task in tree. - * + * * @param task task */ public void setSelectedTask(TimerTask task) { // compute task tree path - List<TimerTask> components = new ArrayList<>(); - TimerTask current = task; - while (current != null) { - components.add(current); - current = current.getParent(); - } - - // add model root - components.add((TimerTask)treeTableModel.getRoot()); + List<TimerTask> components = TimerTaskHelper.getPathFromParent(task); + components.add(0, (TimerTask)treeTableModel.getRoot()); // select tree path in reverse order (from root to leaf) - Collections.reverse(components); - System.out.println("path " + components); TreePath path = new TreePath(components.toArray()); int row = getRowForPath(path); getSelectionModel().setSelectionInterval(row, row); diff --git a/src/test/java/org/chorem/jtimer/entities/TimerTaskHelperTest.java b/src/test/java/org/chorem/jtimer/entities/TimerTaskHelperTest.java new file mode 100644 index 0000000..7d8e6da --- /dev/null +++ b/src/test/java/org/chorem/jtimer/entities/TimerTaskHelperTest.java @@ -0,0 +1,52 @@ +/* + * #%L + * jTimer + * %% + * Copyright (C) 2016 CodeLutin, Chatellier Eric + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ +package org.chorem.jtimer.entities; + +import org.chorem.jtimer.AbstractJTimerTest; +import org.testng.Assert; +import org.testng.annotations.Test; + +import java.util.List; + +/** + * Test related to TimerTaskHelper. + */ +public class TimerTaskHelperTest extends AbstractJTimerTest { + + /** + * Test get path from parent. + */ + @Test + public void getPathFromParentTest() { + TimerProject project = new TimerProject(); + TimerTask task1 = new TimerTask(); + TimerTask task2 = new TimerTask(); + + project.addTask(task1); + task1.addTask(task2); + + List<TimerTask> components = TimerTaskHelper.getPathFromParent(task2); + Assert.assertEquals(components.get(0), project); + Assert.assertEquals(components.get(1), task1); + Assert.assertEquals(components.get(2), task2); + } +} -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.