Author: echatellier Date: 2012-03-09 15:52:09 +0100 (Fri, 09 Mar 2012) New Revision: 2814 Url: http://chorem.org/repositories/revision/jtimer/2814 Log: #78 : Renaming a task break tasks tree rendering Modified: trunk/src/main/java/org/chorem/jtimer/data/DataEventListener.java trunk/src/main/java/org/chorem/jtimer/data/TimerDataManager.java trunk/src/main/java/org/chorem/jtimer/entities/TimerObject.java trunk/src/main/java/org/chorem/jtimer/entities/TimerTask.java trunk/src/main/java/org/chorem/jtimer/entities/TimerTaskHelper.java trunk/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java trunk/src/main/java/org/chorem/jtimer/ui/StatusBar.java trunk/src/main/java/org/chorem/jtimer/ui/report/tree/CheckBoxTreeModel.java trunk/src/main/java/org/chorem/jtimer/ui/systray/SystrayManager.java trunk/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksCellRenderer.java trunk/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksModel.java trunk/src/main/java/org/chorem/jtimer/ws/xmlrpc/ChoremXMLRPCClient.java Modified: trunk/src/main/java/org/chorem/jtimer/data/DataEventListener.java =================================================================== --- trunk/src/main/java/org/chorem/jtimer/data/DataEventListener.java 2012-03-09 14:46:31 UTC (rev 2813) +++ trunk/src/main/java/org/chorem/jtimer/data/DataEventListener.java 2012-03-09 14:52:09 UTC (rev 2814) @@ -70,26 +70,8 @@ * @param task modified task */ public void modifyTask(TimerTask task); - - /** - * Before delete project. - * - * TODO only usefull for UI (can't known on to delete if already deleted) - * - * @param project deleted project - */ - public void preDeleteProject(TimerProject project); /** - * Before delete task. - * - * TODO only usefull for UI (can't known on to delete if already deleted) - * - * @param task deleted task - */ - public void preDeleteTask(TimerTask task); - - /** * Delete project. * * @param project deleted project Modified: trunk/src/main/java/org/chorem/jtimer/data/TimerDataManager.java =================================================================== --- trunk/src/main/java/org/chorem/jtimer/data/TimerDataManager.java 2012-03-09 14:46:31 UTC (rev 2813) +++ trunk/src/main/java/org/chorem/jtimer/data/TimerDataManager.java 2012-03-09 14:52:09 UTC (rev 2814) @@ -243,18 +243,11 @@ vetoableDataEventListener.checkDeleteTask(task); } - // send notification (before) - Iterator<DataEventListener> itDataEventListener = dataEventListeners - .iterator(); - while (itDataEventListener.hasNext()) { - itDataEventListener.next().preDeleteTask(task); - } - // task deletion task.getParent().getSubTasks().remove(task); // send notification - itDataEventListener = dataEventListeners.iterator(); + Iterator<DataEventListener> itDataEventListener = dataEventListeners.iterator(); while (itDataEventListener.hasNext()) { itDataEventListener.next().deleteTask(task); } @@ -272,17 +265,10 @@ vetoableDataEventListener.checkDeleteProject(project); } - // send notification (before) - Iterator<DataEventListener> itDataEventListener = dataEventListeners - .iterator(); - while (itDataEventListener.hasNext()) { - itDataEventListener.next().preDeleteProject(project); - } - projectList.remove(project); // send notification - itDataEventListener = dataEventListeners.iterator(); + Iterator<DataEventListener> itDataEventListener = dataEventListeners.iterator(); while (itDataEventListener.hasNext()) { itDataEventListener.next().deleteProject(project); } Modified: trunk/src/main/java/org/chorem/jtimer/entities/TimerObject.java =================================================================== --- trunk/src/main/java/org/chorem/jtimer/entities/TimerObject.java 2012-03-09 14:46:31 UTC (rev 2813) +++ trunk/src/main/java/org/chorem/jtimer/entities/TimerObject.java 2012-03-09 14:52:09 UTC (rev 2814) @@ -3,7 +3,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2011 Codelutin, Chatellier Eric + * Copyright (C) 2011 - 2012 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 Modified: trunk/src/main/java/org/chorem/jtimer/entities/TimerTask.java =================================================================== --- trunk/src/main/java/org/chorem/jtimer/entities/TimerTask.java 2012-03-09 14:46:31 UTC (rev 2813) +++ trunk/src/main/java/org/chorem/jtimer/entities/TimerTask.java 2012-03-09 14:52:09 UTC (rev 2814) @@ -31,6 +31,7 @@ import java.util.List; import java.util.SortedMap; import java.util.TreeMap; +import java.util.UUID; import org.apache.commons.lang3.SerializationUtils; import org.chorem.jtimer.utils.DailySortedMap; @@ -64,6 +65,9 @@ public static final String PROPERTY_SUB_TASKS = "subTasks"; public static final String PROPERTY_ALERTS = "alerts"; + /** Task uuid used to managed task equality. */ + protected String uuid = UUID.randomUUID().toString(); + /** Task number. */ protected int number; @@ -369,23 +373,12 @@ /* * @see java.lang.Object#hashCode() - * - * TODO must be added, but cause some errors on tree cell renderer. - * + */ @Override public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((alerts == null) ? 0 : alerts.hashCode()); - result = prime * result + ((allDaysAndTimes == null) ? 0 : allDaysAndTimes.hashCode()); - result = prime * result + ((allDaysAnnotations == null) ? 0 : allDaysAnnotations.hashCode()); - result = prime * result + (closed ? 1231 : 1237); - result = prime * result + ((creationDate == null) ? 0 : creationDate.hashCode()); - result = prime * result + ((name == null) ? 0 : name.hashCode()); - result = prime * result + number; - result = prime * result + ((subTasks == null) ? 0 : subTasks.hashCode()); + int result = uuid.hashCode(); return result; - }*/ + } /* * @see java.lang.Object#equals(java.lang.Object) @@ -397,21 +390,7 @@ return false; } - TimerTask otherTask = (TimerTask) o; - - // name equals - boolean equals = name != null && name.equals(otherTask.name); - // creation date equals - equals &= creationDate == null - || creationDate.equals(otherTask.creationDate); - // subtask equals - equals &= subTasks.equals(otherTask.subTasks); - // compare times - equals &= allDaysTimes.equals(otherTask.allDaysTimes); - // compare times - equals &= allDaysAnnotations.equals(otherTask.allDaysAnnotations); - - return equals; + return uuid.equals(((TimerTask)o).uuid); } /** Modified: trunk/src/main/java/org/chorem/jtimer/entities/TimerTaskHelper.java =================================================================== --- trunk/src/main/java/org/chorem/jtimer/entities/TimerTaskHelper.java 2012-03-09 14:46:31 UTC (rev 2813) +++ trunk/src/main/java/org/chorem/jtimer/entities/TimerTaskHelper.java 2012-03-09 14:52:09 UTC (rev 2814) @@ -55,33 +55,47 @@ } /** + * Timer task comparator. + */ + protected static Comparator<TimerTask> timerTaskComparator = new Comparator<TimerTask>() { + public int compare(TimerTask o1, TimerTask o2) { + if (o1 == null && o2 == null) { + return 0; + } + if (o1 == null) { + return 1; + } + if (o2 == null) { + return -1; + } + return o1.getName().compareTo(o2.getName()); + } + }; + + /** * Get task's subtasks ordered alphabetically. * * @param task task * @return the subTasks ordered + * @deprecated since 1.4.0 use {@link #sortTask(task.getSubTasks())} */ public static List<TimerTask> getSubTasksOrderedByName(TimerTask task) { List<TimerTask> taksToSort = task.getSubTasks(); - List<TimerTask> subTasksCopy = new ArrayList<TimerTask>(taksToSort); - Comparator<TimerTask> c = new Comparator<TimerTask>() { - public int compare(TimerTask o1, TimerTask o2) { - if (o1 == null && o2 == null) { - return 0; - } - if (o1 == null) { - return 1; - } - if (o2 == null) { - return -1; - } - return o1.getName().compareTo(o2.getName()); - } - }; - Collections.sort(subTasksCopy, c); - return subTasksCopy; + return sortTask(taksToSort); } /** + * Get tasks ordered alphabetically. + * + * @param tasks tasks + * @return {@code tasks} + */ + public static List<TimerTask> sortTask(List<TimerTask> tasks) { + Collections.sort(tasks, timerTaskComparator); + return tasks; + } + + /** * Get total task time without subtasks time. * * @param task task to get time Modified: trunk/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java =================================================================== --- trunk/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java 2012-03-09 14:46:31 UTC (rev 2813) +++ trunk/src/main/java/org/chorem/jtimer/io/GTimerIncrementalSaver.java 2012-03-09 14:52:09 UTC (rev 2814) @@ -1214,22 +1214,6 @@ } /* - * @see org.chorem.jtimer.data.DataEventListener#preDeleteProject(org.chorem.jtimer.entities.TimerProject) - */ - @Override - public void preDeleteProject(TimerProject project) { - - } - - /* - * @see org.chorem.jtimer.data.DataEventListener#preDeleteTask(org.chorem.jtimer.entities.TimerTask) - */ - @Override - public void preDeleteTask(TimerTask task) { - - } - - /* * @see org.chorem.jtimer.data.event.DataEventListener#deleteProject(org.chorem.jtimer.entities.TimerProject) */ @Override Modified: trunk/src/main/java/org/chorem/jtimer/ui/StatusBar.java =================================================================== --- trunk/src/main/java/org/chorem/jtimer/ui/StatusBar.java 2012-03-09 14:46:31 UTC (rev 2813) +++ trunk/src/main/java/org/chorem/jtimer/ui/StatusBar.java 2012-03-09 14:52:09 UTC (rev 2814) @@ -151,22 +151,6 @@ } /* - * @see org.chorem.jtimer.data.DataEventListener#preDeleteProject(org.chorem.jtimer.entities.TimerProject) - */ - @Override - public void preDeleteProject(TimerProject project) { - - } - - /* - * @see org.chorem.jtimer.data.DataEventListener#preDeleteTask(org.chorem.jtimer.entities.TimerTask) - */ - @Override - public void preDeleteTask(TimerTask task) { - - } - - /* * @see org.chorem.jtimer.data.event.DataEventListener#deleteProject(org.chorem.jtimer.entities.TimerProject) */ @Override Modified: trunk/src/main/java/org/chorem/jtimer/ui/report/tree/CheckBoxTreeModel.java =================================================================== --- trunk/src/main/java/org/chorem/jtimer/ui/report/tree/CheckBoxTreeModel.java 2012-03-09 14:46:31 UTC (rev 2813) +++ trunk/src/main/java/org/chorem/jtimer/ui/report/tree/CheckBoxTreeModel.java 2012-03-09 14:52:09 UTC (rev 2814) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2009 - 2011 CodeLutin, Chatellier Eric + * Copyright (C) 2009 - 2012 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 @@ -126,16 +126,12 @@ result.addAll(core.getData().getProjectsList()); } else { // not root node TimerTask task = (TimerTask) parent; - - // Since sort is not supported by the table, do a manual sorting. - //result.addAll(t.getSubTasks()); - result.addAll(TimerTaskHelper.getSubTasksOrderedByName(task)); + result.addAll(task.getSubTasks()); } // filter list, if only show closed if (!showClosed) { CollectionUtils.filter(result, new Predicate() { - @Override public boolean evaluate(Object object) { @@ -146,10 +142,12 @@ } return result; } - }); } + // Since sort is not supported by the table, do a manual sorting. + result = TimerTaskHelper.sortTask(result); + return result; } Modified: trunk/src/main/java/org/chorem/jtimer/ui/systray/SystrayManager.java =================================================================== --- trunk/src/main/java/org/chorem/jtimer/ui/systray/SystrayManager.java 2012-03-09 14:46:31 UTC (rev 2813) +++ trunk/src/main/java/org/chorem/jtimer/ui/systray/SystrayManager.java 2012-03-09 14:52:09 UTC (rev 2814) @@ -222,22 +222,6 @@ } /* - * @see org.chorem.jtimer.data.DataEventListener#preDeleteProject(org.chorem.jtimer.entities.TimerProject) - */ - @Override - public void preDeleteProject(TimerProject project) { - - } - - /* - * @see org.chorem.jtimer.data.DataEventListener#preDeleteTask(org.chorem.jtimer.entities.TimerTask) - */ - @Override - public void preDeleteTask(TimerTask task) { - - } - - /* * @see org.chorem.jtimer.data.event.DataEventListener#deleteProject(org.chorem.jtimer.entities.TimerProject) */ @Override Modified: trunk/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksCellRenderer.java =================================================================== --- trunk/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksCellRenderer.java 2012-03-09 14:46:31 UTC (rev 2813) +++ trunk/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksCellRenderer.java 2012-03-09 14:52:09 UTC (rev 2814) @@ -202,22 +202,6 @@ } /* - * @see org.chorem.jtimer.data.DataEventListener#preDeleteProject(org.chorem.jtimer.entities.TimerProject) - */ - @Override - public void preDeleteProject(TimerProject project) { - - } - - /* - * @see org.chorem.jtimer.data.DataEventListener#preDeleteTask(org.chorem.jtimer.entities.TimerTask) - */ - @Override - public void preDeleteTask(TimerTask task) { - - } - - /* * @see org.chorem.jtimer.data.event.DataEventListener#deleteProject(org.chorem.jtimer.entities.TimerProject) */ @Override Modified: trunk/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksModel.java =================================================================== --- trunk/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksModel.java 2012-03-09 14:46:31 UTC (rev 2813) +++ trunk/src/main/java/org/chorem/jtimer/ui/treetable/ProjectsAndTasksModel.java 2012-03-09 14:52:09 UTC (rev 2814) @@ -28,7 +28,9 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.swing.SwingUtilities; import javax.swing.table.TableColumn; @@ -45,7 +47,6 @@ import org.chorem.jtimer.entities.TimerProject; import org.chorem.jtimer.entities.TimerTask; import org.chorem.jtimer.entities.TimerTaskHelper; -import org.jdesktop.swingx.tree.TreeModelSupport; import org.jdesktop.swingx.treetable.AbstractTreeTableModel; /** @@ -54,6 +55,18 @@ * Cela permet au programme principal de manipuler la liste et d'oublier la * gestion de l'arbre... * + * Le modele de cet arbre utilise directement des TimerTask au lieu des TreeTableNode + * qui ne servent a rien et qui complique tout. Par contre, les tâches étant + * les mêmes instances que celle manipulées par le programme, il doit mettre + * en cache certains infos pour un rafraichissement correct: + * <ul> + * <li>Nom : cas de renommage avec changement d'ordre + * <li>Sous tache : pour supprimer une tache qui disparaitrait directement du modèle + * </ul> + * + * Voir cet article pour la non utilisation des TreeNode : + * http://www.javalobby.org/forums/thread.jspa?threadID=16052&tstart=0 + * * @author chatellier * @version $Revision$ * @@ -66,14 +79,14 @@ /** log */ private static Log log = LogFactory.getLog(ProjectsAndTasksModel.class); - /** Add node operation */ + /** Add node operation. */ public static final int OPERATION_ADD = 0; - /** Modify node operation */ + /** Modify node operation. */ public static final int OPERATION_MODIFY = 1; - /** Delete Node operation */ + /** Delete Node operation. */ public static final int OPERATION_DELETE = 2; - /** Tree managed by this model */ + /** Tree managed by this model. */ protected ProjectsAndTasksTable projectsAndTaskTable; /** Data. */ @@ -81,10 +94,13 @@ /** Tree column identifiers. */ protected List<String> columnIdentifiers; - + /** Show closed task property. Default to false. */ protected boolean showClosedTask; + protected Map<TimerTask, String> taskNameCache; + protected Map<Object, List<TimerTask>> subTasksCache; + /** * Constructor. * @@ -94,24 +110,17 @@ */ public ProjectsAndTasksModel(ProjectsAndTasksTable projectsAndTaskTable, TimerCore core, List<String> columnIdentifiers) { - // super with root node super(new TimerProject("root")); // remember this.projectsAndTaskTable = projectsAndTaskTable; this.dataManager = core.getData(); this.columnIdentifiers = columnIdentifiers; + + taskNameCache = new HashMap<TimerTask, String>(); + subTasksCache = new HashMap<Object, List<TimerTask>>(); } - /** - * Accessor to tree model support. - * - * @return tree model support - */ - protected TreeModelSupport getModelSupport() { - return modelSupport; - } - /* * @see org.jdesktop.swingx.treetable.TreeTableModel#getColumnCount() */ @@ -178,8 +187,8 @@ */ @Override public Object getChild(Object parent, int index) { + TimerTask t = getFiteredSubListFor(parent).get(index); - return t; } @@ -190,48 +199,69 @@ public int getChildCount(Object parent) { int childCount = getFiteredSubListFor(parent).size(); - return childCount; } /** * Recupere la sous liste: data.getProjectsList() si parent = root - * getSubTasks() sinon + * getSubTasks() sinon (cache results). * * @param parent parent to task sublist * @return filtered list */ protected List<TimerTask> getFiteredSubListFor(Object parent) { + return getFiteredSubListFor(parent, false); + } - List<TimerTask> result = new ArrayList<TimerTask>(); + /** + * Recupere la sous liste: data.getProjectsList() si parent = root + * getSubTasks() sinon. + * + * @param parent parent to task sublist + * @param noCache disable use of cached result and result caching + * @return filtered list + */ + protected List<TimerTask> getFiteredSubListFor(Object parent, boolean noCache) { - // get correct list - if (parent == root) { // case root node - result.addAll(dataManager.getProjectsList()); - } else { // not root node - TimerTask task = (TimerTask) parent; + List<TimerTask> result = subTasksCache.get(parent); + if (result == null || noCache) { + result = new ArrayList<TimerTask>(); - // Since sort is not supported by the table, do a manual sorting. - //result.addAll(t.getSubTasks()); - result.addAll(TimerTaskHelper.getSubTasksOrderedByName(task)); - } + // get correct list + if (parent == root) { // case root node + List<TimerProject> projects = dataManager.getProjectsList(); + result.addAll(projects); + } else { // not root node + TimerTask task = (TimerTask) parent; + result.addAll(task.getSubTasks()); + } - // filter list, if only show closed - if (!showClosedTask) { - CollectionUtils.filter(result, new Predicate() { + // filter list, if only show closed + if (!showClosedTask) { + CollectionUtils.filter(result, new Predicate() { + @Override + public boolean evaluate(Object object) { + boolean result = false; + if (object instanceof TimerTask) { + TimerTask task = (TimerTask) object; + result = !task.isClosed(); + } + return result; + } + }); + } - @Override - public boolean evaluate(Object object) { - - boolean result = false; - if (object instanceof TimerTask) { - TimerTask task = (TimerTask) object; - result = !task.isClosed(); - } - return result; + // Since sort is not supported by the table, do a manual sorting. + result = TimerTaskHelper.sortTask(result); + + if (!noCache) { + // cache tasks name + for (TimerTask task : result) { + taskNameCache.put(task, task.getName()); } - - }); + + subTasksCache.put(parent, result); + } } return result; @@ -244,7 +274,6 @@ public int getIndexOfChild(Object parent, Object child) { int childIndex = getFiteredSubListFor(parent).indexOf(child); - return childIndex; } @@ -265,7 +294,6 @@ protected void notifyTaskChanged(TimerTask task, int operation) { // this.modelSupport. TreePath path = new TreePath(root); - updateChildren(task, path, operation); } @@ -277,56 +305,66 @@ * @param operation operation (add, modify, delete) * @return <tt>true</tt> if children have been found and updated in current recursion */ - protected boolean updateChildren(TimerTask task, TreePath path, + protected synchronized boolean updateChildren(TimerTask task, TreePath path, int operation) { TimerTask pathLastComponent = (TimerTask) path.getLastPathComponent(); - // pour ses enfants boolean updated = false; - int childCount = getChildCount(pathLastComponent); + // get childreen without cache in case of add operation + // delete operation MUST use cached result + List<TimerTask> subTask = getFiteredSubListFor(pathLastComponent, operation == OPERATION_ADD); + int childCount = subTask.size(); for (int childIndex = 0; !updated && childIndex < childCount; ++childIndex) { - TimerTask taskUO = (TimerTask) getChild(pathLastComponent, - childIndex); + TimerTask taskUO = (TimerTask) subTask.get(childIndex); - TreePath childTreePath = path.pathByAddingChild(taskUO); - if (task.equals(taskUO)) { // this update only node, not all path... switch (operation) { - case OPERATION_ADD: - getModelSupport().fireChildAdded(path, childIndex, taskUO); + case OPERATION_ADD: { + subTasksCache.remove(pathLastComponent); // force child recache + int newIndex = getIndexOfChild(pathLastComponent, taskUO); + modelSupport.fireChildAdded(path, newIndex, taskUO); // expand path projectsAndTaskTable.expandPath(path); break; - - case OPERATION_DELETE: - getModelSupport() - .fireChildRemoved(path, childIndex, taskUO); + } + case OPERATION_DELETE: { + subTasksCache.remove(pathLastComponent); // invalidate cache + subTasksCache.remove(taskUO); // no in cache anymore + taskNameCache.remove(taskUO); // no in cache anymore + modelSupport.fireChildRemoved(path, childIndex, taskUO); break; - - case OPERATION_MODIFY: - getModelSupport() - .fireChildChanged(path, childIndex, taskUO); + } + case OPERATION_MODIFY: { + String cacheName = taskNameCache.get(taskUO); + if (cacheName.equals(task.getName())) { + // not name modification (time...) + modelSupport.fireChildChanged(path, childIndex, taskUO); + } else { + // name modification (order can change) + modelSupport.fireChildRemoved(path, childIndex, taskUO); + subTasksCache.remove(pathLastComponent); // force child recache + int newIndex = getIndexOfChild(pathLastComponent, taskUO); + modelSupport.fireChildAdded(path, newIndex, taskUO); + } break; - + } default: if (log.isErrorEnabled()) { log.error("Unknow operation : " + operation); } } - if (log.isTraceEnabled()) { - log.trace(" updated : " + childTreePath); - } updated = true; } else { + TreePath childTreePath = path.pathByAddingChild(taskUO); updated = updateChildren(task, childTreePath, operation); if (updated) { // ...and by recursion update all path - getModelSupport().firePathChanged(path); + modelSupport.firePathChanged(path); } } } @@ -362,9 +400,12 @@ tcs.add(tc); } + taskNameCache.clear(); + subTasksCache.clear(); + // works but it's not beautiful // and header are resized - getModelSupport().fireNewRoot(); + modelSupport.fireNewRoot(); // hack, restore size after SwingUtilities.invokeLater(new Runnable() { @@ -377,29 +418,12 @@ }); } - /* - * @see org.chorem.jtimer.data.DataEventListener#preDeleteProject(org.chorem.jtimer.entities.TimerProject) - */ - @Override - public void preDeleteProject(TimerProject project) { - notifyTaskChanged(project, OPERATION_DELETE); - } - - /* - * @see org.chorem.jtimer.data.DataEventListener#preDeleteTask(org.chorem.jtimer.entities.TimerTask) - */ - @Override - public void preDeleteTask(TimerTask task) { - notifyTaskChanged(task, OPERATION_DELETE); - } - - /* * @see org.chorem.jtimer.data.event.DataEventListener#deleteProject(org.chorem.jtimer.entities.TimerProject) */ @Override public void deleteProject(TimerProject project) { - + notifyTaskChanged(project, OPERATION_DELETE); } /* @@ -407,7 +431,7 @@ */ @Override public void deleteTask(TimerTask task) { - + notifyTaskChanged(task, OPERATION_DELETE); } /* @@ -501,8 +525,8 @@ */ public void setShowClosed(boolean showClosedTask) { this.showClosedTask = showClosedTask; - // TODO add better diff code - getModelSupport().fireNewRoot(); + // TODO echatellier 20120309 add better diff code + dataLoaded(null); } /* Modified: trunk/src/main/java/org/chorem/jtimer/ws/xmlrpc/ChoremXMLRPCClient.java =================================================================== --- trunk/src/main/java/org/chorem/jtimer/ws/xmlrpc/ChoremXMLRPCClient.java 2012-03-09 14:46:31 UTC (rev 2813) +++ trunk/src/main/java/org/chorem/jtimer/ws/xmlrpc/ChoremXMLRPCClient.java 2012-03-09 14:52:09 UTC (rev 2814) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2007 - 2011 CodeLutin, Chatellier Eric + * Copyright (C) 2007 - 2012 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 @@ -735,22 +735,6 @@ } /* - * @see org.chorem.jtimer.data.DataEventListener#preDeleteProject(org.chorem.jtimer.entities.TimerProject) - */ - @Override - public void preDeleteProject(TimerProject project) { - - } - - /* - * @see org.chorem.jtimer.data.DataEventListener#preDeleteTask(org.chorem.jtimer.entities.TimerTask) - */ - @Override - public void preDeleteTask(TimerTask task) { - - } - - /* * @see org.chorem.jtimer.event.DataEventListener#deleteProject(org.chorem.jtimer.entities.TimerProject) */ @Override