OpenConcerto

Dépôt officiel du code source de l'ERP OpenConcerto
sonarqube

svn://code.openconcerto.org/openconcerto

Rev

Rev 144 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 144 Rev 180
1
/*
1
/*
2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3
 * 
3
 * 
4
 * Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
4
 * Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
5
 * 
5
 * 
6
 * The contents of this file are subject to the terms of the GNU General Public License Version 3
6
 * The contents of this file are subject to the terms of the GNU General Public License Version 3
7
 * only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
7
 * only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
8
 * copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
8
 * copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
9
 * language governing permissions and limitations under the License.
9
 * language governing permissions and limitations under the License.
10
 * 
10
 * 
11
 * When distributing the software, include this License Header Notice in each file.
11
 * When distributing the software, include this License Header Notice in each file.
12
 */
12
 */
13
 
13
 
14
 package org.openconcerto.task;
14
 package org.openconcerto.task;
15
 
15
 
16
import static org.openconcerto.task.TM.getTM;
16
import static org.openconcerto.task.TM.getTM;
17
 
17
 
18
import org.openconcerto.sql.model.SQLRow;
18
import org.openconcerto.sql.model.SQLRow;
19
import org.openconcerto.sql.model.SQLRowListRSH;
19
import org.openconcerto.sql.model.SQLRowListRSH;
20
import org.openconcerto.sql.model.SQLRowValues;
20
import org.openconcerto.sql.model.SQLRowValues;
21
import org.openconcerto.sql.model.SQLSelect;
21
import org.openconcerto.sql.model.SQLSelect;
22
import org.openconcerto.sql.model.SQLTable;
22
import org.openconcerto.sql.model.SQLTable;
23
import org.openconcerto.sql.model.Where;
23
import org.openconcerto.sql.model.Where;
24
import org.openconcerto.sql.users.User;
24
import org.openconcerto.sql.users.User;
25
import org.openconcerto.sql.users.UserManager;
25
import org.openconcerto.sql.users.UserManager;
26
import org.openconcerto.sql.users.UserTableCellRenderer;
26
import org.openconcerto.sql.users.UserTableCellRenderer;
27
import org.openconcerto.task.ui.UserComboBox;
27
import org.openconcerto.task.ui.UserComboBox;
28
import org.openconcerto.task.ui.UserTableCellEditor;
28
import org.openconcerto.task.ui.UserTableCellEditor;
29
import org.openconcerto.ui.JMultiLineToolTip;
29
import org.openconcerto.ui.JMultiLineToolTip;
30
import org.openconcerto.ui.LightEventJTable;
30
import org.openconcerto.ui.LightEventJTable;
31
import org.openconcerto.ui.ReloadPanel;
31
import org.openconcerto.ui.ReloadPanel;
32
import org.openconcerto.ui.TitledSeparator;
32
import org.openconcerto.ui.TitledSeparator;
33
import org.openconcerto.ui.table.AlternateTableCellRenderer;
33
import org.openconcerto.ui.table.AlternateTableCellRenderer;
34
import org.openconcerto.ui.table.IconTableCellRenderer;
34
import org.openconcerto.ui.table.IconTableCellRenderer;
35
import org.openconcerto.ui.table.JCheckBoxTableCellRender;
35
import org.openconcerto.ui.table.JCheckBoxTableCellRender;
36
import org.openconcerto.ui.table.TablePopupMouseListener;
36
import org.openconcerto.ui.table.TablePopupMouseListener;
37
import org.openconcerto.ui.table.TimestampTableCellEditor;
37
import org.openconcerto.ui.table.TimestampTableCellEditor;
38
import org.openconcerto.ui.table.TimestampTableCellRenderer;
38
import org.openconcerto.ui.table.TimestampTableCellRenderer;
39
import org.openconcerto.utils.ExceptionHandler;
39
import org.openconcerto.utils.ExceptionHandler;
40
import org.openconcerto.utils.TableSorter;
40
import org.openconcerto.utils.TableSorter;
41
import org.openconcerto.utils.cc.ITransformer;
41
import org.openconcerto.utils.cc.ITransformer;
42
 
42
 
43
import java.awt.Color;
43
import java.awt.Color;
44
import java.awt.Component;
44
import java.awt.Component;
45
import java.awt.Graphics;
45
import java.awt.Graphics;
46
import java.awt.GridBagConstraints;
46
import java.awt.GridBagConstraints;
47
import java.awt.GridBagLayout;
47
import java.awt.GridBagLayout;
48
import java.awt.Insets;
48
import java.awt.Insets;
49
import java.awt.Point;
49
import java.awt.Point;
50
import java.awt.event.ActionEvent;
50
import java.awt.event.ActionEvent;
51
import java.awt.event.ActionListener;
51
import java.awt.event.ActionListener;
52
import java.awt.event.ItemEvent;
52
import java.awt.event.ItemEvent;
53
import java.awt.event.ItemListener;
53
import java.awt.event.ItemListener;
54
import java.awt.event.MouseEvent;
54
import java.awt.event.MouseEvent;
55
import java.awt.event.MouseListener;
55
import java.awt.event.MouseListener;
56
import java.net.URL;
56
import java.net.URL;
57
import java.util.ArrayList;
57
import java.util.ArrayList;
58
import java.util.Calendar;
58
import java.util.Calendar;
59
import java.util.Date;
59
import java.util.Date;
60
import java.util.List;
60
import java.util.List;
61
import java.util.Vector;
61
import java.util.Vector;
62
 
62
 
63
import javax.swing.AbstractAction;
63
import javax.swing.AbstractAction;
64
import javax.swing.Action;
64
import javax.swing.Action;
65
import javax.swing.BorderFactory;
65
import javax.swing.BorderFactory;
66
import javax.swing.DefaultCellEditor;
66
import javax.swing.DefaultCellEditor;
67
import javax.swing.Icon;
67
import javax.swing.Icon;
68
import javax.swing.ImageIcon;
68
import javax.swing.ImageIcon;
69
import javax.swing.JButton;
69
import javax.swing.JButton;
70
import javax.swing.JCheckBox;
70
import javax.swing.JCheckBox;
71
import javax.swing.JCheckBoxMenuItem;
71
import javax.swing.JCheckBoxMenuItem;
72
import javax.swing.JFrame;
72
import javax.swing.JFrame;
73
import javax.swing.JLabel;
73
import javax.swing.JLabel;
74
import javax.swing.JMenu;
74
import javax.swing.JMenu;
75
import javax.swing.JMenuBar;
75
import javax.swing.JMenuBar;
76
import javax.swing.JPanel;
76
import javax.swing.JPanel;
77
import javax.swing.JPopupMenu;
77
import javax.swing.JPopupMenu;
78
import javax.swing.JScrollPane;
78
import javax.swing.JScrollPane;
79
import javax.swing.JTable;
79
import javax.swing.JTable;
80
import javax.swing.JTextField;
80
import javax.swing.JTextField;
81
import javax.swing.JToolTip;
81
import javax.swing.JToolTip;
82
import javax.swing.SwingConstants;
82
import javax.swing.SwingConstants;
83
import javax.swing.SwingUtilities;
83
import javax.swing.SwingUtilities;
84
import javax.swing.SwingWorker;
84
import javax.swing.SwingWorker;
85
import javax.swing.event.AncestorEvent;
85
import javax.swing.event.AncestorEvent;
86
import javax.swing.event.AncestorListener;
86
import javax.swing.event.AncestorListener;
87
import javax.swing.event.ChangeEvent;
87
import javax.swing.event.ChangeEvent;
88
import javax.swing.event.ListSelectionEvent;
88
import javax.swing.event.ListSelectionEvent;
89
import javax.swing.event.ListSelectionListener;
89
import javax.swing.event.ListSelectionListener;
90
import javax.swing.table.DefaultTableCellRenderer;
90
import javax.swing.table.DefaultTableCellRenderer;
91
import javax.swing.table.JTableHeader;
91
import javax.swing.table.JTableHeader;
92
import javax.swing.table.TableCellRenderer;
92
import javax.swing.table.TableCellRenderer;
93
import javax.swing.table.TableColumn;
93
import javax.swing.table.TableColumn;
94
import javax.swing.table.TableColumnModel;
94
import javax.swing.table.TableColumnModel;
95
 
95
 
96
public class TodoListPanel extends JPanel implements ModelStateListener {
96
public class TodoListPanel extends JPanel implements ModelStateListener {
97
 
97
 
98
    private final UserManager uMngr;
98
    private final UserManager uMngr;
99
    // Actions
99
    // Actions
100
    private final JCheckBox detailCheckBox;
100
    private final JCheckBox detailCheckBox;
101
    private final JCheckBox hideOldCheckBox;
101
    private final JCheckBox hideOldCheckBox;
102
    private JMenu comboUser;
102
    private JMenu comboUser;
103
    private final JButton addButton, removeButton;
103
    private final JButton addButton, removeButton;
104
 
104
 
105
    // Table
105
    // Table
106
    private final LightEventJTable t;
106
    private final LightEventJTable t;
107
    private final TodoListModel model;
107
    private final TodoListModel model;
108
    private final TimestampTableCellRenderer timestampTableCellRendererCreated;
108
    private final TimestampTableCellRenderer timestampTableCellRendererCreated;
109
    private final TimestampTableCellRenderer timestampTableCellRendererDone;
109
    private final TimestampTableCellRenderer timestampTableCellRendererDone;
110
    private final TimestampTableCellRenderer timestampTableCellRendererDeadLine;
110
    private final TimestampTableCellRenderer timestampTableCellRendererDeadLine;
111
    private final IconTableCellRenderer iconEditor, iconRenderer;
111
    private final IconTableCellRenderer iconEditor, iconRenderer;
112
    private final UserTableCellRenderer userTableCellRenderer;
112
    private final UserTableCellRenderer userTableCellRenderer;
113
    private final JCheckBoxTableCellRender a = new JCheckBoxTableCellRender();
113
    private final JCheckBoxTableCellRender a = new JCheckBoxTableCellRender();
114
    private final ImageIcon iconTache, iconPriorite;
114
    private final ImageIcon iconTache, iconPriorite;
115
    private TimestampTableCellEditor timestampTableCellEditorDeadLine;
115
    private TimestampTableCellEditor timestampTableCellEditorDeadLine;
116
    private TimestampTableCellEditor timestampTableCellEditorCreated;
116
    private TimestampTableCellEditor timestampTableCellEditorCreated;
117
    private TimestampTableCellEditor timestampTableCellEditorDone;
117
    private TimestampTableCellEditor timestampTableCellEditorDone;
118
    private final Vector<User> users = new Vector<User>();
118
    private final Vector<User> users = new Vector<User>();
119
    final ReloadPanel reloadPanel = new ReloadPanel();
119
    final ReloadPanel reloadPanel = new ReloadPanel();
120
    TableSorter sorter;
120
    TableSorter sorter;
121
 
121
 
122
    public TodoListPanel(final UserManager uMngr) {
122
    public TodoListPanel(final UserManager uMngr) {
123
        this.uMngr = uMngr;
123
        this.uMngr = uMngr;
124
        this.setOpaque(false);
124
        this.setOpaque(false);
125
        this.iconTache = new ImageIcon(TodoListPanel.class.getResource("tache.png"));
125
        this.iconTache = new ImageIcon(TodoListPanel.class.getResource("tache.png"));
126
        this.iconPriorite = new ImageIcon(TodoListPanel.class.getResource("priorite.png"));
126
        this.iconPriorite = new ImageIcon(TodoListPanel.class.getResource("priorite.png"));
127
        this.userTableCellRenderer = new UserTableCellRenderer(uMngr);
127
        this.userTableCellRenderer = new UserTableCellRenderer(uMngr);
128
        this.timestampTableCellRendererCreated = new TimestampTableCellRenderer();
128
        this.timestampTableCellRendererCreated = new TimestampTableCellRenderer();
129
        this.timestampTableCellRendererDone = new TimestampTableCellRenderer();
129
        this.timestampTableCellRendererDone = new TimestampTableCellRenderer();
130
        this.timestampTableCellRendererDeadLine = new TimestampTableCellRenderer(true);
130
        this.timestampTableCellRendererDeadLine = new TimestampTableCellRenderer(true);
131
        this.timestampTableCellEditorCreated = new TimestampTableCellEditor();
131
        this.timestampTableCellEditorCreated = new TimestampTableCellEditor();
132
        this.timestampTableCellEditorDone = new TimestampTableCellEditor();
132
        this.timestampTableCellEditorDone = new TimestampTableCellEditor();
133
        this.timestampTableCellEditorDeadLine = new TimestampTableCellEditor();
133
        this.timestampTableCellEditorDeadLine = new TimestampTableCellEditor();
134
        // Icon renderer
134
        // Icon renderer
135
        List<URL> l = new Vector<URL>();
135
        List<URL> l = new Vector<URL>();
136
        l.add(TodoListPanel.class.getResource("empty.png"));
136
        l.add(TodoListPanel.class.getResource("empty.png"));
137
        l.add(TodoListPanel.class.getResource("high.png"));
137
        l.add(TodoListPanel.class.getResource("high.png"));
138
        l.add(TodoListPanel.class.getResource("normal.png"));
138
        l.add(TodoListPanel.class.getResource("normal.png"));
139
        l.add(TodoListPanel.class.getResource("low.png"));
139
        l.add(TodoListPanel.class.getResource("low.png"));
140
        this.iconEditor = new IconTableCellRenderer(l);
140
        this.iconEditor = new IconTableCellRenderer(l);
141
        this.iconRenderer = new IconTableCellRenderer(l);
141
        this.iconRenderer = new IconTableCellRenderer(l);
142
 
142
 
143
        final User currentUser = uMngr.getCurrentUser();
143
        final User currentUser = uMngr.getCurrentUser();
144
        this.model = new TodoListModel(uMngr);
144
        this.model = new TodoListModel(uMngr);
145
        this.sorter = new TableSorter(this.model);
145
        this.sorter = new TableSorter(this.model);
146
        this.t = new LightEventJTable(this.sorter) {
146
        this.t = new LightEventJTable(this.sorter) {
147
            public JToolTip createToolTip() {
147
            public JToolTip createToolTip() {
148
                return new JMultiLineToolTip();
148
                return new JMultiLineToolTip();
149
            }
149
            }
150
 
150
 
151
            @Override
151
            @Override
152
            public String getToolTipText(MouseEvent event) {
152
            public String getToolTipText(MouseEvent event) {
153
                String r = null;
153
                String r = null;
154
                TodoListElement task = getTaskAt(event.getPoint());
154
                TodoListElement task = getTaskAt(event.getPoint());
155
 
155
 
156
                if (task != null && task.getCreatorId() > 1) {
156
                if (task != null && task.getCreatorId() > 1) {
157
                    final String comment = task.getComment();
157
                    final String comment = task.getComment();
158
                    if (comment != null) {
158
                    if (comment != null) {
159
                        r = comment;
159
                        r = comment;
160
                        r += "\n\n";
160
                        r += "\n\n";
161
                    } else {
161
                    } else {
162
                        r = "";
162
                        r = "";
163
                    }
163
                    }
164
                    r += getTM().trM("assignedBy", "user", uMngr.getUser(task.getCreatorId()).getFullName(), "date", task.getDate());
164
                    r += getTM().trM("assignedBy", "user", uMngr.getUser(task.getCreatorId()).getFullName(), "date", task.getDate());
165
                }
165
                }
166
 
166
 
167
                return r;
167
                return r;
168
            }
168
            }
169
 
169
 
170
        };
170
        };
171
        this.sorter.setTableHeader(this.t.getTableHeader());
171
        this.sorter.setTableHeader(this.t.getTableHeader());
172
 
172
 
173
        this.model.setTable(this.t);
173
        this.model.setTable(this.t);
174
 
174
 
175
        this.comboUser = new JMenu(TM.tr("showTaskAssignedTo"));
175
        this.comboUser = new JMenu(TM.tr("showTaskAssignedTo"));
176
        initViewableUsers(currentUser);
176
        initViewableUsers(currentUser);
177
 
177
 
178
        // L'utilisateur courant doit voir ses taches + toutes les taches dont il a les droits
178
        // L'utilisateur courant doit voir ses taches + toutes les taches dont il a les droits
179
        this.model.addIdListenerSilently(Integer.valueOf(currentUser.getId()));
179
        this.model.addIdListenerSilently(Integer.valueOf(currentUser.getId()));
180
 
180
 
181
        final int size = this.users.size();
181
        final int size = this.users.size();
182
        for (int i = 0; i < size; i++) {
182
        for (int i = 0; i < size; i++) {
183
            Integer id = Integer.valueOf((this.users.get(i)).getId());
183
            Integer id = Integer.valueOf((this.users.get(i)).getId());
184
            if (this.model.listenToId(id)) {
184
            if (this.model.listenToId(id)) {
185
                ((JCheckBoxMenuItem) this.comboUser.getMenuComponent(i)).setState(true);
185
                ((JCheckBoxMenuItem) this.comboUser.getMenuComponent(i)).setState(true);
186
            } else {
186
            } else {
187
                ((JCheckBoxMenuItem) this.comboUser.getMenuComponent(i)).setState(false);
187
                ((JCheckBoxMenuItem) this.comboUser.getMenuComponent(i)).setState(false);
188
            }
188
            }
189
        }
189
        }
190
 
190
 
191
        this.addButton = new JButton(TM.tr("addTask"));
191
        this.addButton = new JButton(TM.tr("addTask"));
192
        this.removeButton = new JButton();
192
        this.removeButton = new JButton();
193
        this.removeButton.setOpaque(false);
193
        this.removeButton.setOpaque(false);
194
        updateDeleteBtn();
194
        updateDeleteBtn();
195
        this.setLayout(new GridBagLayout());
195
        this.setLayout(new GridBagLayout());
196
        GridBagConstraints c = new GridBagConstraints();
196
        GridBagConstraints c = new GridBagConstraints();
197
        c.insets = new Insets(2, 2, 1, 2);
197
        c.insets = new Insets(2, 2, 1, 2);
198
        c.fill = GridBagConstraints.HORIZONTAL;
198
        c.fill = GridBagConstraints.HORIZONTAL;
199
        c.gridx = 0;
199
        c.gridx = 0;
200
        c.gridy = 0;
200
        c.gridy = 0;
201
        c.weightx = 1;
201
        c.weightx = 1;
202
        c.weighty = 0;
202
        c.weighty = 0;
203
        c.gridwidth = 6;
203
        c.gridwidth = 6;
204
        // SEP
204
        // SEP
205
        TitledSeparator sep = new TitledSeparator(currentUser.getFirstName() + " " + currentUser.getName().toUpperCase());
205
        TitledSeparator sep = new TitledSeparator(currentUser.getFirstName() + " " + currentUser.getName().toUpperCase());
206
        this.add(sep, c);
206
        this.add(sep, c);
207
 
207
 
208
        c.gridwidth = 1;
208
        c.gridwidth = 1;
209
        c.gridx = 0;
209
        c.gridx = 0;
210
        c.gridy++;
210
        c.gridy++;
211
        c.weightx = 0;
211
        c.weightx = 0;
212
        this.add(this.addButton, c);
212
        this.add(this.addButton, c);
213
        c.gridx++;
213
        c.gridx++;
214
        this.add(this.removeButton, c);
214
        this.add(this.removeButton, c);
215
 
215
 
216
        c.anchor = GridBagConstraints.EAST;
216
        c.anchor = GridBagConstraints.EAST;
217
        c.gridx++;
217
        c.gridx++;
218
        final JMenuBar b = new JMenuBar();
218
        final JMenuBar b = new JMenuBar();
219
        b.setOpaque(false);
219
        b.setOpaque(false);
220
        b.setBorderPainted(false);
220
        b.setBorderPainted(false);
221
        b.add(this.comboUser);
221
        b.add(this.comboUser);
222
        // Pour que le menu ne disparaisse pas quand on rapetisse trop la fenetre en bas
222
        // Pour que le menu ne disparaisse pas quand on rapetisse trop la fenetre en bas
223
        b.setMinimumSize(b.getPreferredSize());
223
        b.setMinimumSize(b.getPreferredSize());
224
        this.add(b, c);
224
        this.add(b, c);
225
 
225
 
226
        c.gridx++;
226
        c.gridx++;
227
        c.weightx = 1;
227
        c.weightx = 1;
228
        this.detailCheckBox = new JCheckBox(TM.tr("showDetails"));
228
        this.detailCheckBox = new JCheckBox(TM.tr("showDetails"));
229
        this.detailCheckBox.setOpaque(false);
229
        this.detailCheckBox.setOpaque(false);
230
        this.detailCheckBox.setSelected(false);
230
        this.detailCheckBox.setSelected(false);
231
        this.add(this.detailCheckBox, c);
231
        this.add(this.detailCheckBox, c);
232
 
232
 
233
        //
233
        //
234
        c.gridx++;
234
        c.gridx++;
235
        this.hideOldCheckBox = new JCheckBox(TM.tr("hideHistory"));
235
        this.hideOldCheckBox = new JCheckBox(TM.tr("hideHistory"));
236
        this.hideOldCheckBox.setOpaque(false);
236
        this.hideOldCheckBox.setOpaque(false);
237
        this.hideOldCheckBox.setSelected(true);
237
        this.hideOldCheckBox.setSelected(true);
238
        this.add(this.hideOldCheckBox, c);
238
        this.add(this.hideOldCheckBox, c);
239
 
239
 
240
        c.gridx++;
240
        c.gridx++;
241
 
241
 
242
        c.weightx = 0;
242
        c.weightx = 0;
243
        c.anchor = GridBagConstraints.EAST;
243
        c.anchor = GridBagConstraints.EAST;
244
        this.reloadPanel.setOpaque(false);
244
        this.reloadPanel.setOpaque(false);
245
        this.add(this.reloadPanel, c);
245
        this.add(this.reloadPanel, c);
246
 
246
 
247
        // Table
247
        // Table
248
        c.gridwidth = 6;
248
        c.gridwidth = 6;
249
        c.gridx = 0;
249
        c.gridx = 0;
250
        c.gridy++;
250
        c.gridy++;
251
        c.fill = GridBagConstraints.BOTH;
251
        c.fill = GridBagConstraints.BOTH;
252
        c.weighty = 1;
252
        c.weighty = 1;
253
        c.weightx = 1;
253
        c.weightx = 1;
254
        initPopUp();
254
        initPopUp();
255
        initTable(TodoListModel.SIMPLE_MODE);
255
        initTable(TodoListModel.SIMPLE_MODE);
256
        this.add(new JScrollPane(this.t), c);
256
        this.add(new JScrollPane(this.t), c);
257
 
257
 
258
        initListeners();
258
        initListeners();
259
 
259
 
260
        this.model.asynchronousFill();
260
        this.model.asynchronousFill();
261
    }
261
    }
262
 
262
 
263
    public final UserManager getUserManager() {
263
    public final UserManager getUserManager() {
264
        return this.uMngr;
264
        return this.uMngr;
265
    }
265
    }
266
 
266
 
267
    private void initViewableUsers(final User currentUser) {
267
    private void initViewableUsers(final User currentUser) {
268
        final SwingWorker<List<User>, Object> worker = new SwingWorker<List<User>, Object>() {
268
        final SwingWorker<List<User>, Object> worker = new SwingWorker<List<User>, Object>() {
269
 
269
 
270
            @Override
270
            @Override
271
            protected List<User> doInBackground() throws Exception {
271
            protected List<User> doInBackground() throws Exception {
272
                final List<Integer> canViewUsers = new ArrayList<Integer>();
272
                final List<Integer> canViewUsers = new ArrayList<Integer>();
273
                for (final UserTaskRight right : UserTaskRight.getUserTaskRight(currentUser)) {
273
                for (final UserTaskRight right : UserTaskRight.getUserTaskRight(currentUser)) {
274
                    if (right.canRead())
274
                    if (right.canRead())
275
                        canViewUsers.add(right.getIdToUser());
275
                        canViewUsers.add(right.getIdToUser());
276
                }
276
                }
277
                // final Vector users = new Vector();
277
                // final Vector users = new Vector();
278
                final SQLTable userT = getUserManager().getTable();
278
                final SQLTable userT = getUserManager().getTable();
279
                final SQLSelect select1 = new SQLSelect(false);
279
                final SQLSelect select1 = new SQLSelect(false);
280
                select1.addSelectStar(userT);
280
                select1.addSelectStar(userT);
281
                final Where meWhere = new Where(userT.getKey(), "=", currentUser.getId());
281
                final Where meWhere = new Where(userT.getKey(), "=", currentUser.getId());
282
                final Where canViewWhere = new Where(userT.getKey(), canViewUsers);
282
                final Where canViewWhere = new Where(userT.getKey(), canViewUsers);
283
                select1.setWhere(meWhere.or(canViewWhere));
283
                select1.setWhere(meWhere.or(canViewWhere));
284
 
284
 
285
                final List<User> result = new ArrayList<User>();
285
                final List<User> result = new ArrayList<User>();
286
                for (final SQLRow r : SQLRowListRSH.execute(select1)) {
286
                for (final SQLRow r : SQLRowListRSH.execute(select1)) {
287
                    result.add(new User(r));
287
                    result.add(new User(r));
288
                }
288
                }
289
                return result;
289
                return result;
290
            }
290
            }
291
 
291
 
292
            @Override
292
            @Override
293
            protected void done() {
293
            protected void done() {
294
                try {
294
                try {
295
                    final List<User> tuples = get();
295
                    final List<User> tuples = get();
296
                    for (final User user : tuples) {
296
                    for (final User user : tuples) {
297
                        String displayName = user.getNickName();
297
                        String displayName = user.getNickName();
298
                        if (displayName.length() == 0) {
298
                        if (displayName.length() == 0) {
299
                            displayName = user.getFirstName() + " " + user.getName().toUpperCase();
299
                            displayName = user.getFirstName() + " " + user.getName().toUpperCase();
300
                        }
300
                        }
301
                        final JCheckBoxMenuItem checkBoxMenuItem = new JCheckBoxMenuItem(displayName);
301
                        final JCheckBoxMenuItem checkBoxMenuItem = new JCheckBoxMenuItem(displayName);
302
                        TodoListPanel.this.comboUser.add(checkBoxMenuItem);
302
                        TodoListPanel.this.comboUser.add(checkBoxMenuItem);
303
 
303
 
304
                        final int uId = user.getId();
304
                        final int uId = user.getId();
305
 
305
 
306
                        TodoListPanel.this.users.add(user);
306
                        TodoListPanel.this.users.add(user);
307
                        checkBoxMenuItem.addActionListener(new ActionListener() {
307
                        checkBoxMenuItem.addActionListener(new ActionListener() {
308
 
308
 
309
                            public void actionPerformed(ActionEvent e) {
309
                            public void actionPerformed(ActionEvent e) {
310
                                if (checkBoxMenuItem.isSelected())
310
                                if (checkBoxMenuItem.isSelected())
311
                                    addUserListenerId(uId);
311
                                    addUserListenerId(uId);
312
                                else
312
                                else
313
                                    removeUserListenerId(uId);
313
                                    removeUserListenerId(uId);
314
                            }
314
                            }
315
 
315
 
316
                        });
316
                        });
317
                    }
317
                    }
318
 
318
 
319
                } catch (Exception e) {
319
                } catch (Exception e) {
320
                    ExceptionHandler.handle("Unable to get tasks users", e);
320
                    ExceptionHandler.handle("Unable to get tasks users", e);
321
                }
321
                }
322
 
322
 
323
            }
323
            }
324
        };
324
        };
325
 
325
 
326
        worker.execute();
326
        worker.execute();
327
 
327
 
328
    }
328
    }
329
 
329
 
330
    /**
330
    /**
331
     * @param addButton
331
     * @param addButton
332
     * @param removeButton
332
     * @param removeButton
333
     */
333
     */
334
    private void initListeners() {
334
    private void initListeners() {
335
        this.t.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
335
        this.t.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
336
            @Override
336
            @Override
337
            public void valueChanged(ListSelectionEvent e) {
337
            public void valueChanged(ListSelectionEvent e) {
338
                updateDeleteBtn();
338
                updateDeleteBtn();
339
            }
339
            }
340
        });
340
        });
341
        this.removeButton.addActionListener(new ActionListener() {
341
        this.removeButton.addActionListener(new ActionListener() {
342
            public void actionPerformed(ActionEvent e) {
342
            public void actionPerformed(ActionEvent e) {
343
                removeSelectedTask();
343
                removeSelectedTask();
344
            }
344
            }
345
        });
345
        });
346
        this.addButton.addActionListener(new ActionListener() {
346
        this.addButton.addActionListener(new ActionListener() {
347
            public void actionPerformed(ActionEvent e) {
347
            public void actionPerformed(ActionEvent e) {
348
                addTask();
348
                addTask();
349
            }
349
            }
350
        });
350
        });
351
        this.detailCheckBox.addItemListener(new ItemListener() {
351
        this.detailCheckBox.addItemListener(new ItemListener() {
352
            @Override
352
            @Override
353
            public void itemStateChanged(ItemEvent e) {
353
            public void itemStateChanged(ItemEvent e) {
354
                // masque les colonnes "fait le" et "le"
354
                // masque les colonnes "fait le" et "le"
355
                detailCheckBoxClicked();
355
                detailCheckBoxClicked();
356
            }
356
            }
357
        });
357
        });
358
        this.hideOldCheckBox.addItemListener(new ItemListener() {
358
        this.hideOldCheckBox.addItemListener(new ItemListener() {
359
            @Override
359
            @Override
360
            public void itemStateChanged(ItemEvent e) {
360
            public void itemStateChanged(ItemEvent e) {
361
                TodoListPanel.this.model.setHistoryVisible(e.getStateChange() == ItemEvent.DESELECTED);
361
                TodoListPanel.this.model.setHistoryVisible(e.getStateChange() == ItemEvent.DESELECTED);
362
                TodoListPanel.this.model.asynchronousFill();
362
                TodoListPanel.this.model.asynchronousFill();
363
            }
363
            }
364
        });
364
        });
365
        try {
365
        try {
366
 
366
 
367
        } catch (Exception e) {
367
        } catch (Exception e) {
368
            throw new RuntimeException();
368
            throw new RuntimeException();
369
        }
369
        }
370
        this.model.addModelStateListener(TodoListPanel.this);
370
        this.model.addModelStateListener(TodoListPanel.this);
371
        this.addAncestorListener(new AncestorListener() {
371
        this.addAncestorListener(new AncestorListener() {
372
 
372
 
373
            public void ancestorAdded(AncestorEvent event) {
373
            public void ancestorAdded(AncestorEvent event) {
-
 
374
                if (!TodoListPanel.this.model.isAutoRefreshing()) {
-
 
375
                    TodoListPanel.this.model.addModelStateListener(TodoListPanel.this);
-
 
376
                    TodoListPanel.this.model.enableUpdate();
-
 
377
                }
374
            }
378
            }
375
 
379
 
376
            public void ancestorMoved(AncestorEvent event) {
380
            public void ancestorMoved(AncestorEvent event) {
377
            }
381
            }
378
 
382
 
379
            public void ancestorRemoved(AncestorEvent event) {
383
            public void ancestorRemoved(AncestorEvent event) {
380
                TodoListPanel.this.model.removeModelStateListener(TodoListPanel.this);
384
                TodoListPanel.this.model.removeModelStateListener(TodoListPanel.this);
381
                TodoListPanel.this.model.stopUpdate();
385
                TodoListPanel.this.model.stopUpdate();
382
            }
386
            }
383
        });
387
        });
384
    }
388
    }
385
 
389
 
386
    protected void removeSelectedTask() {
390
    protected void removeSelectedTask() {
387
        SwingUtilities.invokeLater(new Runnable() {
391
        SwingUtilities.invokeLater(new Runnable() {
388
            public void run() {
392
            public void run() {
389
                TodoListPanel.this.t.editingCanceled(null);
393
                TodoListPanel.this.t.editingCanceled(null);
390
                int index = TodoListPanel.this.t.getSelectedRow();
394
                int index = TodoListPanel.this.t.getSelectedRow();
391
                while (index >= 0) {
395
                while (index >= 0) {
392
 
396
 
393
                    if (!TodoListPanel.this.model.deleteTaskAtIndex(TodoListPanel.this.sorter.modelIndex(index))) {
397
                    if (!TodoListPanel.this.model.deleteTaskAtIndex(TodoListPanel.this.sorter.modelIndex(index))) {
394
                        break;
398
                        break;
395
                    }
399
                    }
396
 
400
 
397
                    index = TodoListPanel.this.t.getSelectedRow();
401
                    index = TodoListPanel.this.t.getSelectedRow();
398
                }
402
                }
399
                TodoListPanel.this.model.asynchronousFill();
403
                TodoListPanel.this.model.asynchronousFill();
400
            }
404
            }
401
        });
405
        });
402
    }
406
    }
403
 
407
 
404
    protected void detailCheckBoxClicked() {
408
    protected void detailCheckBoxClicked() {
405
        if (this.detailCheckBox.isSelected()) {
409
        if (this.detailCheckBox.isSelected()) {
406
            initTable(TodoListModel.EXTENDED_MODE);
410
            initTable(TodoListModel.EXTENDED_MODE);
407
        } else {
411
        } else {
408
            initTable(TodoListModel.SIMPLE_MODE);
412
            initTable(TodoListModel.SIMPLE_MODE);
409
        }
413
        }
410
    }
414
    }
411
 
415
 
412
    private void initTable(int mode) {
416
    private void initTable(int mode) {
413
        this.t.setBlockRepaint(true);
417
        this.t.setBlockRepaint(true);
414
 
418
 
415
        this.t.setBlockEventOnColumn(true);
419
        this.t.setBlockEventOnColumn(true);
416
        this.model.setMode(mode);
420
        this.model.setMode(mode);
417
 
421
 
418
        this.t.getColumnModel().getColumn(0).setCellRenderer(this.a);
422
        this.t.getColumnModel().getColumn(0).setCellRenderer(this.a);
419
        this.t.getColumnModel().getColumn(0).setCellEditor(this.a);
423
        this.t.getColumnModel().getColumn(0).setCellEditor(this.a);
420
        this.t.setBlockEventOnColumn(true);
424
        this.t.setBlockEventOnColumn(true);
421
        setIconForColumn(0, this.iconTache);
425
        setIconForColumn(0, this.iconTache);
422
        setIconForColumn(1, this.iconPriorite);
426
        setIconForColumn(1, this.iconPriorite);
423
        this.t.setBlockEventOnColumn(true);
427
        this.t.setBlockEventOnColumn(true);
424
 
428
 
425
        this.t.getColumnModel().getColumn(1).setCellEditor(this.iconEditor);
429
        this.t.getColumnModel().getColumn(1).setCellEditor(this.iconEditor);
426
        final JTextField textField = new JTextField() {
430
        final JTextField textField = new JTextField() {
427
            @Override
431
            @Override
428
            public void paint(Graphics g) {
432
            public void paint(Graphics g) {
429
                super.paint(g);
433
                super.paint(g);
430
                g.setColor(TodoListPanel.this.t.getGridColor());
434
                g.setColor(TodoListPanel.this.t.getGridColor());
431
                g.fillRect(getWidth() - 19, 0, 1, getHeight());
435
                g.fillRect(getWidth() - 19, 0, 1, getHeight());
432
                g.setColor(new Color(250, 250, 250));
436
                g.setColor(new Color(250, 250, 250));
433
                g.fillRect(getWidth() - 18, 0, 18, getHeight());
437
                g.fillRect(getWidth() - 18, 0, 18, getHeight());
434
                g.setColor(Color.BLACK);
438
                g.setColor(Color.BLACK);
435
                for (int i = 0; i < 3; i++) {
439
                for (int i = 0; i < 3; i++) {
436
                    int x = getWidth() - 14 + i * 4;
440
                    int x = getWidth() - 14 + i * 4;
437
                    int y = getHeight() - 5;
441
                    int y = getHeight() - 5;
438
                    g.fillRect(x, y, 1, 2);
442
                    g.fillRect(x, y, 1, 2);
439
                }
443
                }
440
            }
444
            }
441
        };
445
        };
442
        textField.setBorder(BorderFactory.createEmptyBorder());
446
        textField.setBorder(BorderFactory.createEmptyBorder());
443
        final DefaultCellEditor defaultCellEditor = new DefaultCellEditor(textField);
447
        final DefaultCellEditor defaultCellEditor = new DefaultCellEditor(textField);
444
        textField.addMouseListener(new MouseListener() {
448
        textField.addMouseListener(new MouseListener() {
445
 
449
 
446
            public void mouseClicked(MouseEvent e) {
450
            public void mouseClicked(MouseEvent e) {
447
 
451
 
448
            }
452
            }
449
 
453
 
450
            public void mouseEntered(MouseEvent e) {
454
            public void mouseEntered(MouseEvent e) {
451
                // TODO Auto-generated method stub
455
                // TODO Auto-generated method stub
452
 
456
 
453
            }
457
            }
454
 
458
 
455
            public void mouseExited(MouseEvent e) {
459
            public void mouseExited(MouseEvent e) {
456
                // TODO Auto-generated method stub
460
                // TODO Auto-generated method stub
457
 
461
 
458
            }
462
            }
459
 
463
 
460
            public void mousePressed(MouseEvent e) {
464
            public void mousePressed(MouseEvent e) {
461
 
465
 
462
            }
466
            }
463
 
467
 
464
            public void mouseReleased(MouseEvent e) {
468
            public void mouseReleased(MouseEvent e) {
465
                if (e.getX() > textField.getWidth() - 19) {
469
                if (e.getX() > textField.getWidth() - 19) {
466
                    TodoListElement l = getTaskAt(SwingUtilities.convertPoint(e.getComponent(), e.getPoint(), TodoListPanel.this.t));
470
                    TodoListElement l = getTaskAt(SwingUtilities.convertPoint(e.getComponent(), e.getPoint(), TodoListPanel.this.t));
467
                    TodoListPanel.this.t.editingCanceled(new ChangeEvent(this));
471
                    TodoListPanel.this.t.editingCanceled(new ChangeEvent(this));
468
                    JFrame f = new JFrame(TM.tr("details"));
472
                    JFrame f = new JFrame(TM.tr("details"));
469
                    f.setContentPane(new TodoListElementEditorPanel(l));
473
                    f.setContentPane(new TodoListElementEditorPanel(l));
470
                    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
474
                    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
471
                    f.setSize(500, 200);
475
                    f.setSize(500, 200);
472
                    f.setLocation(50, e.getYOnScreen() + TodoListPanel.this.t.getRowHeight());
476
                    f.setLocation(50, e.getYOnScreen() + TodoListPanel.this.t.getRowHeight());
473
                    f.setVisible(true);
477
                    f.setVisible(true);
474
                }
478
                }
475
 
479
 
476
            }
480
            }
477
        });
481
        });
478
        this.t.getColumnModel().getColumn(2).setCellEditor(defaultCellEditor);
482
        this.t.getColumnModel().getColumn(2).setCellEditor(defaultCellEditor);
479
        this.t.getColumnModel().getColumn(3).setMaxWidth(300);
483
        this.t.getColumnModel().getColumn(3).setMaxWidth(300);
480
        this.t.getColumnModel().getColumn(3).setMinWidth(100);
484
        this.t.getColumnModel().getColumn(3).setMinWidth(100);
481
 
485
 
482
        this.timestampTableCellEditorCreated.stopCellEditing();
486
        this.timestampTableCellEditorCreated.stopCellEditing();
483
        this.timestampTableCellEditorDone.stopCellEditing();
487
        this.timestampTableCellEditorDone.stopCellEditing();
484
        this.timestampTableCellEditorDeadLine.stopCellEditing();
488
        this.timestampTableCellEditorDeadLine.stopCellEditing();
485
 
489
 
486
        if (this.model.getMode() == TodoListModel.EXTENDED_MODE) {
490
        if (this.model.getMode() == TodoListModel.EXTENDED_MODE) {
487
            this.t.getColumnModel().getColumn(3).setCellRenderer(this.timestampTableCellRendererCreated);
491
            this.t.getColumnModel().getColumn(3).setCellRenderer(this.timestampTableCellRendererCreated);
488
            this.t.getColumnModel().getColumn(3).setCellEditor(this.timestampTableCellEditorCreated);
492
            this.t.getColumnModel().getColumn(3).setCellEditor(this.timestampTableCellEditorCreated);
489
 
493
 
490
            this.t.getColumnModel().getColumn(4).setCellRenderer(this.timestampTableCellRendererDone);
494
            this.t.getColumnModel().getColumn(4).setCellRenderer(this.timestampTableCellRendererDone);
491
            this.t.getColumnModel().getColumn(4).setCellEditor(this.timestampTableCellEditorDone);
495
            this.t.getColumnModel().getColumn(4).setCellEditor(this.timestampTableCellEditorDone);
492
 
496
 
493
            this.t.getColumnModel().getColumn(5).setCellRenderer(this.timestampTableCellRendererDeadLine);
497
            this.t.getColumnModel().getColumn(5).setCellRenderer(this.timestampTableCellRendererDeadLine);
494
            this.t.getColumnModel().getColumn(5).setCellEditor(this.timestampTableCellEditorDeadLine);
498
            this.t.getColumnModel().getColumn(5).setCellEditor(this.timestampTableCellEditorDeadLine);
495
        } else {
499
        } else {
496
            this.t.getColumnModel().getColumn(3).setCellRenderer(this.timestampTableCellRendererDeadLine);
500
            this.t.getColumnModel().getColumn(3).setCellRenderer(this.timestampTableCellRendererDeadLine);
497
            this.t.getColumnModel().getColumn(3).setCellEditor(this.timestampTableCellEditorDeadLine);
501
            this.t.getColumnModel().getColumn(3).setCellEditor(this.timestampTableCellEditorDeadLine);
498
        }
502
        }
499
 
503
 
500
        final TableColumn userColumn = this.t.getColumnModel().getColumn(this.t.getColumnModel().getColumnCount() - 1);
504
        final TableColumn userColumn = this.t.getColumnModel().getColumn(this.t.getColumnModel().getColumnCount() - 1);
501
        userColumn.setCellRenderer(this.userTableCellRenderer);
505
        userColumn.setCellRenderer(this.userTableCellRenderer);
502
        userColumn.setMaxWidth(150);
506
        userColumn.setMaxWidth(150);
503
        userColumn.setMinWidth(100);
507
        userColumn.setMinWidth(100);
504
        t.setEnabled(false);
508
        t.setEnabled(false);
505
        initUserCellEditor(userColumn);
509
        initUserCellEditor(userColumn);
506
 
510
 
507
        this.t.setBlockEventOnColumn(false);
511
        this.t.setBlockEventOnColumn(false);
508
        this.t.setBlockRepaint(false);
512
        this.t.setBlockRepaint(false);
509
        this.t.getColumnModel().getColumn(1).setCellRenderer(this.iconRenderer);
513
        this.t.getColumnModel().getColumn(1).setCellRenderer(this.iconRenderer);
510
        // Better look
514
        // Better look
511
        this.t.setShowHorizontalLines(false);
515
        this.t.setShowHorizontalLines(false);
512
        this.t.setGridColor(new Color(230, 230, 230));
516
        this.t.setGridColor(new Color(230, 230, 230));
513
        this.t.setRowHeight(new JTextField(" ").getPreferredSize().height + 4);
517
        this.t.setRowHeight(new JTextField(" ").getPreferredSize().height + 4);
514
        AlternateTableCellRenderer.UTILS.setAllColumns(this.t);
518
        AlternateTableCellRenderer.UTILS.setAllColumns(this.t);
515
        this.t.repaint();
519
        this.t.repaint();
516
 
520
 
517
    }
521
    }
518
 
522
 
519
    private void initUserCellEditor(final TableColumn userColumn) {
523
    private void initUserCellEditor(final TableColumn userColumn) {
520
        new SwingWorker<List<UserTaskRight>, Object>() {
524
        new SwingWorker<List<UserTaskRight>, Object>() {
521
            @Override
525
            @Override
522
            protected List<UserTaskRight> doInBackground() throws Exception {
526
            protected List<UserTaskRight> doInBackground() throws Exception {
523
                return UserTaskRight.getUserTaskRight(getUserManager().getCurrentUser());
527
                return UserTaskRight.getUserTaskRight(getUserManager().getCurrentUser());
524
            }
528
            }
525
 
529
 
526
            @Override
530
            @Override
527
            protected void done() {
531
            protected void done() {
528
                // only display allowed recipients
532
                // only display allowed recipients
529
                try {
533
                try {
530
                    final List<UserTaskRight> rights = get();
534
                    final List<UserTaskRight> rights = get();
531
                    final List<User> canAddUsers = new ArrayList<User>();
535
                    final List<User> canAddUsers = new ArrayList<User>();
532
                    for (final UserTaskRight right : rights) {
536
                    for (final UserTaskRight right : rights) {
533
                        assert right.getIdUser() == getUserManager().getCurrentUser().getId();
537
                        assert right.getIdUser() == getUserManager().getCurrentUser().getId();
534
                        if (right.canAdd()) {
538
                        if (right.canAdd()) {
535
                            canAddUsers.add(getUserManager().getUser(right.getIdToUser()));
539
                            canAddUsers.add(getUserManager().getUser(right.getIdToUser()));
536
                        }
540
                        }
537
                    }
541
                    }
538
                    userColumn.setCellEditor(new UserTableCellEditor(getUserManager(), new UserComboBox(canAddUsers)));
542
                    userColumn.setCellEditor(new UserTableCellEditor(getUserManager(), new UserComboBox(canAddUsers)));
539
                    t.setEnabled(true);
543
                    t.setEnabled(true);
540
                } catch (Exception e) {
544
                } catch (Exception e) {
541
                    ExceptionHandler.handle("Unable to get user task rights", e);
545
                    ExceptionHandler.handle("Unable to get user task rights", e);
542
                }
546
                }
543
 
547
 
544
                super.done();
548
                super.done();
545
            }
549
            }
546
        }.execute();
550
        }.execute();
547
    }
551
    }
548
 
552
 
549
    void initPopUp() {
553
    void initPopUp() {
550
        TablePopupMouseListener.add(this.t, new ITransformer<MouseEvent, JPopupMenu>() {
554
        TablePopupMouseListener.add(this.t, new ITransformer<MouseEvent, JPopupMenu>() {
551
 
555
 
552
            @Override
556
            @Override
553
            public JPopupMenu transformChecked(MouseEvent evt) {
557
            public JPopupMenu transformChecked(MouseEvent evt) {
554
                final JTable table = (JTable) evt.getSource();
558
                final JTable table = (JTable) evt.getSource();
555
                final int modelIndex = TodoListPanel.this.sorter.modelIndex(table.getSelectedRow());
559
                final int modelIndex = TodoListPanel.this.sorter.modelIndex(table.getSelectedRow());
556
                final JPopupMenu res = new JPopupMenu();
560
                final JPopupMenu res = new JPopupMenu();
557
 
561
 
558
                // Avancer d'un jour
562
                // Avancer d'un jour
559
                Action act = new AbstractAction() {
563
                Action act = new AbstractAction() {
560
                    public void actionPerformed(ActionEvent e) {
564
                    public void actionPerformed(ActionEvent e) {
561
                        final TodoListElement element = TodoListPanel.this.model.getTaskAtRow(modelIndex);
565
                        final TodoListElement element = TodoListPanel.this.model.getTaskAtRow(modelIndex);
562
                        if (element != null) {
566
                        if (element != null) {
563
                            final Date ts = element.getExpectedDate();
567
                            final Date ts = element.getExpectedDate();
564
                            final Calendar cal = Calendar.getInstance();
568
                            final Calendar cal = Calendar.getInstance();
565
                            cal.setTimeInMillis(ts.getTime());
569
                            cal.setTimeInMillis(ts.getTime());
566
                            cal.add(Calendar.DAY_OF_YEAR, 1);
570
                            cal.add(Calendar.DAY_OF_YEAR, 1);
567
                            SwingUtilities.invokeLater(new Runnable() {
571
                            SwingUtilities.invokeLater(new Runnable() {
568
                                public void run() {
572
                                public void run() {
569
                                    ts.setTime(cal.getTimeInMillis());
573
                                    ts.setTime(cal.getTimeInMillis());
570
                                    element.setExpectedDate(ts);
574
                                    element.setExpectedDate(ts);
571
                                    element.commitChangesAndWait();
575
                                    element.commitChangesAndWait();
572
                                    table.repaint();
576
                                    table.repaint();
573
                                }
577
                                }
574
                            });
578
                            });
575
                        }
579
                        }
576
                    }
580
                    }
577
                };
581
                };
578
                act.putValue(Action.NAME, TM.tr("moveOneDay"));
582
                act.putValue(Action.NAME, TM.tr("moveOneDay"));
579
                res.add(act);
583
                res.add(act);
580
 
584
 
581
                // Marquer comme réalisé
585
                // Marquer comme réalisé
582
                act = new AbstractAction() {
586
                act = new AbstractAction() {
583
                    public void actionPerformed(ActionEvent e) {
587
                    public void actionPerformed(ActionEvent e) {
584
                        TodoListElement element = TodoListPanel.this.model.getTaskAtRow(modelIndex);
588
                        TodoListElement element = TodoListPanel.this.model.getTaskAtRow(modelIndex);
585
                        if (element != null) {
589
                        if (element != null) {
586
                            element.setDone(true);
590
                            element.setDone(true);
587
                            element.commitChangesAndWait();
591
                            element.commitChangesAndWait();
588
                            table.repaint();
592
                            table.repaint();
589
                        }
593
                        }
590
                    }
594
                    }
591
                };
595
                };
592
                act.putValue(Action.NAME, TM.tr("markDone"));
596
                act.putValue(Action.NAME, TM.tr("markDone"));
593
                res.add(act);
597
                res.add(act);
594
 
598
 
595
                // Suppression
599
                // Suppression
596
                act = new AbstractAction() {
600
                act = new AbstractAction() {
597
                    public void actionPerformed(ActionEvent e) {
601
                    public void actionPerformed(ActionEvent e) {
598
                        TodoListPanel.this.model.deleteTaskAtIndex(modelIndex);
602
                        TodoListPanel.this.model.deleteTaskAtIndex(modelIndex);
599
                        table.repaint();
603
                        table.repaint();
600
                    }
604
                    }
601
                };
605
                };
602
                act.putValue(Action.NAME, TM.tr("delete"));
606
                act.putValue(Action.NAME, TM.tr("delete"));
603
                res.add(act);
607
                res.add(act);
604
 
608
 
605
                final TodoListElement element = TodoListPanel.this.model.getTaskAtRow(modelIndex);
609
                final TodoListElement element = TodoListPanel.this.model.getTaskAtRow(modelIndex);
606
                SQLRowValues rowTache = element.getRowValues();
610
                SQLRowValues rowTache = element.getRowValues();
607
 
611
 
608
                List<AbstractAction> actions = TacheActionManager.getInstance().getActionsForTaskRow(rowTache);
612
                List<AbstractAction> actions = TacheActionManager.getInstance().getActionsForTaskRow(rowTache);
609
 
613
 
610
                for (AbstractAction abstractAction : actions) {
614
                for (AbstractAction abstractAction : actions) {
611
                    res.add(abstractAction);
615
                    res.add(abstractAction);
612
                }
616
                }
613
 
617
 
614
                return res;
618
                return res;
615
            }
619
            }
616
        });
620
        });
617
    }
621
    }
618
 
622
 
619
    private void setIconForColumn(int i, ImageIcon icon) {
623
    private void setIconForColumn(int i, ImageIcon icon) {
620
 
624
 
621
        TableCellRenderer renderer = new JComponentTableCellRenderer(icon);
625
        TableCellRenderer renderer = new JComponentTableCellRenderer(icon);
622
        TableColumnModel columnModel = this.t.getColumnModel();
626
        TableColumnModel columnModel = this.t.getColumnModel();
623
        TableColumn column = columnModel.getColumn(i);
627
        TableColumn column = columnModel.getColumn(i);
624
        column.setHeaderRenderer(renderer);
628
        column.setHeaderRenderer(renderer);
625
        column.setMaxWidth(icon.getIconWidth() + 16);
629
        column.setMaxWidth(icon.getIconWidth() + 16);
626
        column.setMinWidth(icon.getIconWidth() + 8);
630
        column.setMinWidth(icon.getIconWidth() + 8);
627
    }
631
    }
628
 
632
 
629
    private void addTask() {
633
    private void addTask() {
630
        this.model.addNewTask();
634
        this.model.addNewTask();
631
 
635
 
632
    }
636
    }
633
 
637
 
634
    public void addUserListenerId(int id) {
638
    public void addUserListenerId(int id) {
635
        // Selection de l'utilisateur dans la combo
639
        // Selection de l'utilisateur dans la combo
636
        for (int i = 0; i < this.users.size(); i++) {
640
        for (int i = 0; i < this.users.size(); i++) {
637
            Integer idUser = Integer.valueOf((this.users.get(i)).getId());
641
            Integer idUser = Integer.valueOf((this.users.get(i)).getId());
638
            if (idUser.intValue() == id) {
642
            if (idUser.intValue() == id) {
639
                ((JCheckBoxMenuItem) this.comboUser.getMenuComponent(i)).setState(true);
643
                ((JCheckBoxMenuItem) this.comboUser.getMenuComponent(i)).setState(true);
640
            }
644
            }
641
        }
645
        }
642
        this.model.addIdListener(Integer.valueOf(id));
646
        this.model.addIdListener(Integer.valueOf(id));
643
    }
647
    }
644
 
648
 
645
    private void removeUserListenerId(int id) {
649
    private void removeUserListenerId(int id) {
646
        this.t.editingCanceled(new ChangeEvent(this));
650
        this.t.editingCanceled(new ChangeEvent(this));
647
        this.model.removeIdListener(Integer.valueOf(id));
651
        this.model.removeIdListener(Integer.valueOf(id));
648
    }
652
    }
649
 
653
 
650
    public void stopUpdate() {
654
    public void stopUpdate() {
651
        this.model.stopUpdate();
655
        this.model.stopUpdate();
652
    }
656
    }
653
 
657
 
654
    public void stateChanged(int state) {
658
    public void stateChanged(int state) {
655
        if (state == ModelStateListener.STATE_OK) {
659
        if (state == ModelStateListener.STATE_OK) {
656
            this.reloadPanel.setMode(ReloadPanel.MODE_EMPTY);
660
            this.reloadPanel.setMode(ReloadPanel.MODE_EMPTY);
657
        }
661
        }
658
        if (state == ModelStateListener.STATE_DEAD) {
662
        if (state == ModelStateListener.STATE_DEAD) {
659
            this.reloadPanel.setMode(ReloadPanel.MODE_BLINK);
663
            this.reloadPanel.setMode(ReloadPanel.MODE_BLINK);
660
        }
664
        }
661
        if (state == ModelStateListener.STATE_RELOADING) {
665
        if (state == ModelStateListener.STATE_RELOADING) {
662
            this.reloadPanel.setMode(ReloadPanel.MODE_ROTATE);
666
            this.reloadPanel.setMode(ReloadPanel.MODE_ROTATE);
663
        }
667
        }
664
    }
668
    }
665
 
669
 
666
    public void addModelStateListener(ModelStateListener l) {
670
    public void addModelStateListener(ModelStateListener l) {
667
        this.model.addModelStateListener(l);
671
        this.model.addModelStateListener(l);
668
    }
672
    }
669
 
673
 
670
    /**
674
    /**
671
     * @param event
675
     * @param event
672
     * @return
676
     * @return
673
     */
677
     */
674
    private TodoListElement getTaskAt(Point p) {
678
    private TodoListElement getTaskAt(Point p) {
675
        int row = this.t.rowAtPoint(p);
679
        int row = this.t.rowAtPoint(p);
676
        TodoListElement task = this.model.getTaskAtRow(TodoListPanel.this.sorter.modelIndex(row));
680
        TodoListElement task = this.model.getTaskAtRow(TodoListPanel.this.sorter.modelIndex(row));
677
        return task;
681
        return task;
678
    }
682
    }
679
 
683
 
680
    protected void updateDeleteBtn() {
684
    protected void updateDeleteBtn() {
681
        final int nbRows = this.t.getSelectedRows().length;
685
        final int nbRows = this.t.getSelectedRows().length;
682
        this.removeButton.setEnabled(nbRows > 0);
686
        this.removeButton.setEnabled(nbRows > 0);
683
        this.removeButton.setText(getTM().trM("deleteSelectedTasks", "count", nbRows));
687
        this.removeButton.setText(getTM().trM("deleteSelectedTasks", "count", nbRows));
684
    }
688
    }
685
}
689
}
686
 
690
 
687
class JComponentTableCellRenderer extends DefaultTableCellRenderer {
691
class JComponentTableCellRenderer extends DefaultTableCellRenderer {
688
    Icon icon;
692
    Icon icon;
689
    TableCellRenderer renderer;
693
    TableCellRenderer renderer;
690
 
694
 
691
    public JComponentTableCellRenderer(Icon icon) {
695
    public JComponentTableCellRenderer(Icon icon) {
692
        super();
696
        super();
693
        this.icon = icon;
697
        this.icon = icon;
694
        this.renderer = new JTableHeader().getDefaultRenderer();
698
        this.renderer = new JTableHeader().getDefaultRenderer();
695
    }
699
    }
696
 
700
 
697
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
701
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
698
        JLabel label = (JLabel) this.renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
702
        JLabel label = (JLabel) this.renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
699
        label.setIcon(this.icon);
703
        label.setIcon(this.icon);
700
        label.setBorder(BorderFactory.createEmptyBorder());
704
        label.setBorder(BorderFactory.createEmptyBorder());
701
        label.setIconTextGap(0);
705
        label.setIconTextGap(0);
702
        label.setHorizontalTextPosition(0);
706
        label.setHorizontalTextPosition(0);
703
        label.setHorizontalAlignment(SwingConstants.CENTER);
707
        label.setHorizontalAlignment(SwingConstants.CENTER);
704
        return label;
708
        return label;
705
    }
709
    }
706
}
710
}