summaryrefslogtreecommitdiff
path: root/sources/client/CalendarTableModel.java
blob: 20e796752cb61b623ed858b6762fa03b950b6011 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
/* NetCalendar 2006, 2009 (c) Dipl.-Inform. (FH) Paul C. Buetow
 * http://netcalendar.buetow.org - netcalendar@dev.buetow.org
 */

package client;

import javax.swing.table.*;
import javax.swing.*;
import java.util.*;
import shared.*;
import shared.remotecall.*;

/**
 * This class defined the table model of the JTable of the main calendar client window. All table
 * data and most of the table actions, like sorting or updating the content, go trough this class.
 * @author buetow
 *
 */
public final class CalendarTableModel extends AbstractTableModel {
    public static final String NUM_HEADER = "#";
    public static final String DATE_HEADER = "Date";
    public static final String CATEGORY_HEADER = "Category";
    public static final String DESCRIPTION_HEADER = "Description";
    public static final String PLACE_HEADER = "Place";

    private static final int iEnumLength = Config.getStringValue("client_max_events").length();
    private static final long serialVersionUID = 1L;
    private static final int iCols = 5; // Num of columns never changes!
    private int iRows = 0;
    private Vector vecEvents;
    private Comparator lastSortComparator = null;
    private JTable jTable;

    /**
     * Simple constructor, creates a calendar table model to be used with the JTable of the netcalendar client main window.
     * @param jTable Specifies the JTable object of this table model.
     */
    public CalendarTableModel(JTable jTable) {
        this.jTable = jTable;
    }

    /**
     * This method returns the number of columns of the JTable.
     * @return Returns the number of columns of the JTable.
     */
    public int getColumnCount() {
        return iCols;
    }

    /**
     * This method retuns the number of rows of the JTable.
     * @return Returns the number of rows of the JTable.
     */
    public int getRowCount() {
        return iRows;
    }

    /**
     * This method sets the number of rows of the JTable.
     * @param iRows Specifies the number of rows of the JTable.
     */
    public void setRowCount(int iRows) {
        this.iRows = iRows;
    }

    /**
     * This method checks if a cell is editable or not.
     * @param iRow Specifies the tables row.
     * @param iCol Specifies the tables column.
     * @return Returns true if the cell is editable. Else, false will be returned.
     */
    public boolean isCellEditable(int iRow, int iCol) {
        if (iCol > 1)
            return true;

        return false;
    }

    /**
     * Gets a specific table value
     * @param iRow Specifies the tables row
     * @param iCol Specifies the tables column
     * @return Returns the object at (row,column)
     */
    public Object getValueAt(int iRow, int iCol) {
        CalendarEvent calendarEvent = (CalendarEvent) vecEvents.get(iRow);

        switch (iCol) {
        case 0:
            String sEnum = "" + (iRow + 1);
            while (sEnum.length() < iEnumLength)
                sEnum = "0" + sEnum;
            return sEnum;
        case 1:
            return calendarEvent.getDate();
        case 2:
            return calendarEvent.getDescription();
        case 3:
            return calendarEvent.getCategoryName();
        case 4:
            return calendarEvent.getPlace();
        }

        return "N/A";
    }

    /**
     * This function updates the data of the JTable.
     * @param object Specifies the new value.
     * @param iRow Specifies the row of the cell to be updated.
     * @param iCol Specifies the column of the cell to be updated.
     */
    public void setValueAt(Object object, int iRow, int iCol) {
        CalendarEvent calendarEvent = (CalendarEvent) vecEvents.get(iRow);

        switch (iCol) {
        case 2:
            calendarEvent.setDescription((String) object);
            break;
        case 3:
            calendarEvent.setCategoryName((String) object);
            break;
        case 4:
            calendarEvent.setPlace((String) object);
            break;
        default:
            return;
        }

        runLastSorter();
        jTable.updateUI();

        ClientRequest clientRequest = new ClientRequest(ClientRequest.MODIFY_EVENT);
        clientRequest.setEvent(calendarEvent);
        ServerRequester.sendClientRequest(clientRequest);
    }

    /**
     * This method returns the class types of a specific table column.
     * @param iCol Specifies the column index to get the class type for.
     * @return Returns the class type of the specified column.
     */
    public Class getColumnClass(int iCol) {
        switch (iCol) {
        case 0:
            return String.class;
        case 1:
            return MyDate.class;
        case 2:
            return String.class;
        case 3:
            return String.class;
        case 4:
            return String.class;
        }

        return String.class;
    }

    /**
     * This method returns the column header of a specific table column.
     * @param iCol Specifies the column index to get the column header for.
     * @return Returns the header string of the specified column.
     */
    public String getColumnName(int iCol) {
        switch (iCol) {
        case 0:
            return NUM_HEADER;
        case 1:
            return DATE_HEADER;
        case 2:
            return DESCRIPTION_HEADER;
        case 3:
            return CATEGORY_HEADER;
        case 4:
            return PLACE_HEADER;
        }

        return "N/A";
    }

    /**
     * This method returns the calendar event which belongs to a specific table row
     * @param iRow Specifies the table row index
     * @return Returns the calendar event
     */
    public CalendarEvent getEvent(int iRow) {
        return (CalendarEvent) vecEvents.get(iRow);
    }

    /**
     * This method updates all the value objects (calendar events) of the table.
     * @param vecEvents Specifies the vector of the events to be used.
     */
    public void setEvents(Vector vecEvents) {
        if (vecEvents == null)
            return;

        this.vecEvents = vecEvents;
        setRowCount(vecEvents.size());

        runLastSorter();
    }

    /**
     * This method sorts the data again using the last sorting method being used.
     */
    private void runLastSorter() {
        if (lastSortComparator == null) {
            sortByDate();

        } else {
            Collections.sort(vecEvents, lastSortComparator);
            jTable.updateUI();
        }
    }

    /**
     * Sorts the table content by a specified table column.
     * @param iCol Specifies the table column to sort against.
     */
    public void sortByCol(int iCol) {
        switch (iCol) {
        case 0:
        case 1:
            sortByDate();
            break;
        case 2:
            sortByDescription();
            break;
        case 3:
            sortByCategory();
            break;
        case 4:
            sortByPlace();
            break;
        }
    }

    /**
     * Reverse sorts the table content by a specified table column.
     * @param iCol Specifies the table column to reverse sort against.
     */
    public void reverseSortByCol(int iCol) {
        switch (iCol) {
        case 0:
        case 1:
            reverseSortByDate();
            break;
        case 2:
            reverseSortByDescription();
            break;
        case 3:
            reverseSortByCategory();
            break;
        case 4:
            reverseSortByPlace();
            break;
        }
    }

    /**
     * Sorts the table content by their IDs.
     */
    public void sortByID() {
        Main.statusMessage("Sorting by ID...");

        lastSortComparator = new Comparator() {
            public int compare(Object objectA, Object objectB) {
                int i = ((CalendarEvent) objectA).getID();
                int j = ((CalendarEvent) objectB).getID();
                if (i == j)
                    return 0;
                else if (i < j)
                    return -1;
                else
                    return 1;
            }
            public boolean equals(Object object) {
                return false;
            }
        };
        Collections.sort(vecEvents, lastSortComparator);
        jTable.updateUI();

        Main.statusMessage("Sorting by date done");
    }

    /**
     * Sorts the table content by their dates.
     */
    public void sortByDate() {
        Main.statusMessage("Sorting by date...");

        lastSortComparator = new Comparator() {
            public int compare(Object objectA, Object objectB) {
                long l = ((CalendarEvent) objectA).getDate().getTime();
                long m = ((CalendarEvent) objectB).getDate().getTime();
                if (l == m)
                    return 0;
                else if (l < m)
                    return -1;
                else
                    return 1;
            }
            public boolean equals(Object object) {
                return false;
            }
        };
        Collections.sort(vecEvents, lastSortComparator);
        jTable.updateUI();

        Main.statusMessage("Sorting by date done");
    }

    /**
     * Sorts the table content by their category names.
     */
    public void sortByCategory() {
        Main.statusMessage("Sorting by category...");
        lastSortComparator = new Comparator() {
            public int compare(Object objectA, Object objectB) {
                CalendarEvent eventA = (CalendarEvent) objectA;
                CalendarEvent eventB = (CalendarEvent) objectB;
                return eventA.getCategoryName().compareTo(eventB.getCategoryName());
            }
            public boolean equals(Object object) {
                return false;
            }
        };
        Collections.sort(vecEvents, lastSortComparator);
        jTable.updateUI();
        Main.statusMessage("Sorting by category done");
    }

    /**
     * Sorts the table content by their description texts.
     */
    public void sortByDescription() {
        Main.statusMessage("Sorting by description...");
        lastSortComparator = new Comparator() {
            public int compare(Object objectA, Object objectB) {
                CalendarEvent eventA = (CalendarEvent) objectA;
                CalendarEvent eventB = (CalendarEvent) objectB;
                return eventA.getDescription().compareTo(eventB.getDescription());
            }
            public boolean equals(Object object) {
                return false;
            }
        };
        Collections.sort(vecEvents, lastSortComparator);
        jTable.updateUI();
        Main.statusMessage("Sorting by description done");
    }

    /**
     * Sorts the table content by their places.
     */
    public void sortByPlace() {
        Main.statusMessage("Sorting by place...");
        lastSortComparator = new Comparator() {
            public int compare(Object objectA, Object objectB) {
                CalendarEvent eventA = (CalendarEvent) objectA;
                CalendarEvent eventB = (CalendarEvent) objectB;
                return eventA.getPlace().compareTo(eventB.getPlace());
            }
            public boolean equals(Object object) {
                return false;
            }
        };
        Collections.sort(vecEvents, lastSortComparator);
        jTable.updateUI();
        Main.statusMessage("Sorting by place done");
    }

    /**
     * Reverse sorts the table content by their IDs.
     */
    public void reverseSortByID() {
        Main.statusMessage("Reverse sorting by date...");
        lastSortComparator = new Comparator() {
            public int compare(Object objectA, Object objectB) {
                long i = ((CalendarEvent) objectA).getID();
                long j = ((CalendarEvent) objectB).getID();
                if (i == j)
                    return 0;
                else if (i > j)
                    return -1;
                else
                    return 1;
            }
            public boolean equals(Object object) {
                return false;
            }
        };
        Collections.sort(vecEvents, lastSortComparator);
        jTable.updateUI();
        Main.statusMessage("Reverse sorting by date done");
    }

    /**
     * Reverse sorts the table content by their dates.
     */
    public void reverseSortByDate() {
        Main.statusMessage("Reverse sorting by date...");
        lastSortComparator = new Comparator() {
            public int compare(Object objectA, Object objectB) {
                long l = ((CalendarEvent) objectA).getDate().getTime();
                long m = ((CalendarEvent) objectB).getDate().getTime();
                if (l == m)
                    return 0;
                else if (l > m)
                    return -1;
                else
                    return 1;
            }
            public boolean equals(Object object) {
                return false;
            }
        };
        Collections.sort(vecEvents, lastSortComparator);
        jTable.updateUI();
        Main.statusMessage("Reverse sorting by date done");
    }

    /**
     * Reverse sorts the table content by their category names.
     */
    public void reverseSortByCategory() {
        Main.statusMessage("Reverse sorting by category...");
        lastSortComparator = new Comparator() {
            public int compare(Object objectA, Object objectB) {
                CalendarEvent eventA = (CalendarEvent) objectA;
                CalendarEvent eventB = (CalendarEvent) objectB;
                return eventB.getCategoryName().compareTo(eventA.getCategoryName());
            }
            public boolean equals(Object object) {
                return false;
            }
        };
        Collections.sort(vecEvents, lastSortComparator);
        jTable.updateUI();
        Main.statusMessage("Reverse sorting by category done");
    }

    /**
     * Reverse sorts the table content by their description texts.
     */
    public void reverseSortByDescription() {
        Main.statusMessage("Reverse sorting by description...");
        lastSortComparator = new Comparator() {
            public int compare(Object objectA, Object objectB) {
                CalendarEvent eventA = (CalendarEvent) objectA;
                CalendarEvent eventB = (CalendarEvent) objectB;
                return eventB.getDescription().compareTo(eventA.getDescription());
            }
            public boolean equals(Object object) {
                return false;
            }
        };
        Collections.sort(vecEvents, lastSortComparator);
        jTable.updateUI();
        Main.statusMessage("Reverse sorting by description done!");
    }

    /**
     * Reverse sorts the table content by their places.
     */
    public void reverseSortByPlace() {
        Main.statusMessage("Reverse sorting by place...");
        lastSortComparator = new Comparator() {
            public int compare(Object objectA, Object objectB) {
                CalendarEvent eventA = (CalendarEvent) objectA;
                CalendarEvent eventB = (CalendarEvent) objectB;
                return eventB.getPlace().compareTo(eventA.getPlace());
            }
            public boolean equals(Object object) {
                return false;
            }
        };
        Collections.sort(vecEvents, lastSortComparator);
        jTable.updateUI();
        Main.statusMessage("Reverse sorting by place done");
    }
}