Statistics
| Revision:

gvsig-raster / org.gvsig.raster / trunk / org.gvsig.raster / org.gvsig.raster.swing / org.gvsig.raster.swing.impl / src / main / java / org / gvsig / raster / swing / impl / pagedtable / Pager.java @ 1802

History | View | Annotate | Download (10.1 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.raster.swing.impl.pagedtable;
25

    
26
import java.util.ArrayList;
27
import java.util.List;
28
import java.util.Observable;
29

    
30
import javax.swing.JOptionPane;
31

    
32
import org.gvsig.andami.PluginServices;
33
import org.gvsig.i18n.Messages;
34
import org.gvsig.raster.swing.pagedtable.PagedTable;
35
import org.gvsig.raster.swing.pagedtable.PagedTableEvent;
36
import org.gvsig.raster.swing.pagedtable.PagedTableListener;
37

    
38

    
39
/**
40
 * @author Nacho Brodin (nachobrodin@gmail.com)
41
 */
42
public class Pager extends Observable {
43
        private List<Object>             entries                  = null;
44
        private int                      entriesPerPage           = 0;
45
        private int                      selectedPage             = 0;
46
        private int[]                    selectedRows             = null;
47
        private List<PagedTableListener> listeners                = null;
48
        private PagedTable               table                    = null;
49
        private String                   deleteOneEntryMessage    = null;
50
        private String                   deleteAllEntriesMessage  = null;
51
        
52
        public Pager(int entriesPerPage, PagedTable table) {
53
                this.entriesPerPage = entriesPerPage;
54
                entries = new ArrayList<Object>();
55
                listeners = new ArrayList<PagedTableListener>();
56
                this.table = table;
57
        }
58
        
59
        public void throwEvent(int event, int[] rows) {
60
                setChanged();
61
                notifyObservers(event);
62
                for (int i = 0; i < listeners.size(); i++) {
63
                        listeners.get(i).tableChanged(new PagedTableEvent(table, event, rows));
64
                }
65
        }
66
        
67
        public void setConfirmationMessageDeleteAllEntries(String message) {
68
                deleteAllEntriesMessage = message;
69
        }
70
        
71
        public void setConfirmationMessageDeleteOneEntry(String message) {
72
                deleteOneEntryMessage = message;
73
        }
74
        
75
        //*************ROWS**********************
76
        
77
        public void setSelectedRows(int[] rows) {
78
                selectedRows = rows;
79
                throwEvent(PagedTableEvent.EVENT_SELECTED_ROWS, rows);
80
        }
81
        
82
        public void increaseSelectedRows() {
83
                boolean change = false;
84
                for (int i = 0; i < selectedRows.length; i++) {
85
                        if(selectedRows[i] < getEntriesCount()) {
86
                                selectedRows[i] ++;
87
                                change = true;
88
                        }
89
                }
90
                if(change) {
91
                        throwEvent(PagedTableEvent.EVENT_SELECTED_ROWS, selectedRows);
92
                }
93
        }
94
        
95
        public void decreaseSelectedRows() {
96
                boolean change = false;
97
                for (int i = 0; i < selectedRows.length; i++) {
98
                        if(selectedRows[i] > 0) {
99
                                selectedRows[i] --;
100
                                change = true;
101
                        }
102
                }
103
                if(change) {
104
                        throwEvent(PagedTableEvent.EVENT_SELECTED_ROWS, selectedRows);
105
                }
106
        }
107
        
108
        public void addSelectedRow(int row) {
109
                int[] newSelected = new int[selectedRows.length + 1];
110
                for (int i = 0; i < selectedRows.length; i++) {
111
                        newSelected[i] = selectedRows[i];
112
                }
113
                newSelected[newSelected.length - 1] = row;
114
                selectedRows = newSelected;
115
                throwEvent(PagedTableEvent.EVENT_SELECTED_ROWS, selectedRows);
116
        }
117
        
118
        public int[] getSelectedRows() {
119
                return selectedRows;
120
        }
121
        
122
        /**
123
         * Adds a new entry. In the first place, if it is necessary 
124
         * changes the selected page and throws the event to actualize the
125
         * table and controls. Next it will notify the "add entry" event 
126
         * 
127
         * @param entry
128
         */
129
        public void addEntry(Object entry) {
130
                int newSelectedRow = entries.size();
131
                
132
                if(!isInCurrentPage(newSelectedRow)) {
133
                        setSelectedPage(getPageFromRow(newSelectedRow));
134
                        throwEvent(PagedTableEvent.EVENT_SELECTED_PAGE, new int[]{newSelectedRow});
135
                }
136
                
137
                entries.add(entry);
138
                throwEvent(PagedTableEvent.EVENT_ADD_ENTRY, new int[]{newSelectedRow});
139
            setSelectedRows(new int[]{newSelectedRow});
140
        }
141
        
142
        public Object[] getEntry(int row) {
143
                if(row >= 0 && row < entries.size())
144
                        return (Object[])entries.get(row);
145
                return null;
146
        }
147
        
148
        public void removeEntry(int pos) {
149
                if(deleteOneEntryMessage != null) {
150
                        if (!messageBoxYesOrNot(deleteOneEntryMessage, null))
151
                                return;
152
                }
153
                
154
                if(pos >= 0 && pos < entries.size()) {
155
                        int oldSelectedPageInRow = getPageFromRow(pos);
156
                        int oldSelectedPage = getSelectedPageNumber();
157
                        
158
                        Object removedEntry = entries.get(pos);
159
                        entries.remove(pos);
160
                        
161
                        if(isSelectedRow(pos)) {
162
                                //La p?gina donde est? la entrada a borrar est? en la p?gina seleccionada
163
                                if(oldSelectedPageInRow == oldSelectedPage) { 
164
                                        int newRowSelected = selectAlternativeRow(pos);
165
                                        int newPageSelected = getPageFromRow(newRowSelected);
166
                                        if(newPageSelected != oldSelectedPage) {
167
                                                setSelectedPage(newPageSelected);
168
                                                throwEvent(PagedTableEvent.EVENT_SELECTED_PAGE, new int[]{pos});
169
                                            return;
170
                                        }
171
                                }
172
                        } 
173
                        setChanged();
174
                        notifyObservers(PagedTableEvent.EVENT_REMOVE_ENTRY);
175
                        for (int i = 0; i < listeners.size(); i++) {
176
                                listeners.get(i).tableChanged(new PagedTableEvent(table, PagedTableEvent.EVENT_REMOVE_ENTRY, removedEntry));
177
                        }
178
                }
179
        }
180
        
181
        private int selectAlternativeRow(int row) {
182
                for (int i = 0; i < selectedRows.length; i++) {
183
                        if(selectedRows[i] == row && selectedRows[i] != 0) {
184
                                selectedRows[i] --;
185
                                return selectedRows[i];
186
                        }
187
                }
188
                return row;
189
        }
190
        
191
        public void swapRow(int i, int j) {
192
                if(i == j)
193
                        return;
194
                if(j < i) {
195
                        int aux = i;
196
                        i = j;
197
                        j = aux;
198
                }
199
                        
200
                Object a = entries.get(i);
201
                Object b = entries.get(j);
202
                entries.add(i, b);
203
                entries.remove(i + 1);
204
                entries.add(j, a);
205
                entries.remove(j + 1);
206
                
207
                if(!isSelectedRow(j) || !isSelectedRow(i)) { //Si hay solo una seleccionada se intercambia la selecci?n
208
                        for (int k = 0; k < selectedRows.length; k++) {
209
                                if(selectedRows[k] == j) {
210
                                        selectedRows[k] = i;
211
                                        throwEvent(PagedTableEvent.EVENT_SELECTED_ROWS, new int[]{i, j});
212
                                    break;
213
                                }
214
                                if(selectedRows[k] == i) {
215
                                        selectedRows[k] = j;
216
                                        throwEvent(PagedTableEvent.EVENT_SELECTED_ROWS, new int[]{i, j});
217
                                    break;
218
                                }
219
                        }                        
220
                }
221
                throwEvent(PagedTableEvent.EVENT_SWAP_ENTRIES, new int[]{i, j});
222
        }
223
        
224
        public boolean isSelectedRow(int row) {
225
                if(selectedRows == null)
226
                        return false;
227
                for (int i = 0; i < selectedRows.length; i++) {
228
                        if(selectedRows[i] == row)
229
                                return true;
230
                }
231
                return false;
232
        }
233
        
234
        /**
235
         * Gets the number of entries in this pager
236
         * @return
237
         */
238
        public int getEntriesCount() {
239
                return entries.size();
240
        }
241
        
242
        /**
243
         * Gets the number of row from the row in the current page
244
         * @param pageRow
245
         * @return
246
         */
247
        public int getRowFromPageRow(int pageRow) {
248
                return getSelectedPageNumber() * getEntriesPerPage() + pageRow;
249
        }
250
        
251
        public Object[] getLastEntry() {
252
                return (Object[])entries.get(entries.size() - 1);
253
        }
254
        
255
        public void removeAllEntries() {
256
                if(deleteAllEntriesMessage != null) {
257
                        if (!messageBoxYesOrNot(deleteAllEntriesMessage, null))
258
                                return;
259
                }
260
                entries.clear();
261
                throwEvent(PagedTableEvent.EVENT_REMOVE_ALL, null);
262
        }
263
        
264
        public void removeAllEntriesWithoutAsk() {
265
                entries.clear();
266
                throwEvent(PagedTableEvent.EVENT_REMOVE_ALL, null);
267
        }
268
        
269
        //*************PAGE**********************
270
        
271
        public void setEntriesPerPage(int n) {
272
                this.entriesPerPage = n;
273
                setChanged();
274
            notifyObservers(PagedTableEvent.EVENT_SELECTED_PAGE);
275
        }
276
        
277
        public void increaseSelectedPage() {
278
                if(selectedPage < getPageCount() - 1) {
279
                        selectedPage ++;
280
                        throwEvent(PagedTableEvent.EVENT_SELECTED_PAGE, null);
281
                }
282
        }
283
        
284
        public void decreaseSelectedPage() {
285
                if (selectedPage > 0) {
286
                        selectedPage --;
287
                        throwEvent(PagedTableEvent.EVENT_SELECTED_PAGE, null);
288
                }
289
        }
290
        
291
        public void setSelectedPage(int page) {
292
                if(page >= 0 && page < getPageCount()) {
293
                        selectedPage = page;
294
                        throwEvent(PagedTableEvent.EVENT_SELECTED_PAGE, null);
295
                }
296
        }
297
        
298
        public int getPageFromRow(int row) {
299
                if(getEntriesPerPage() > 0)
300
                        return (int)(row / getEntriesPerPage());
301
                return 0;
302
        }
303
        
304
        public List<Object> getSelectedPage() {
305
                return getPage(getSelectedPageNumber());
306
        }
307
        
308
        public void removePage(int page) {
309
                if(page >= 0 && page < getPageCount()) {
310
                        int init = entriesPerPage * page;
311
                        int end = init + entriesPerPage;
312
                        for (int i = end - 1; i >= init; i--) {
313
                                entries.remove(i);
314
                        }
315
                }
316
        }
317
        
318
        public int getPageCount() {
319
                return (int)Math.ceil(entries.size() / (double)entriesPerPage);
320
        }
321
        
322
        public boolean isInCurrentPage(int row) {
323
                int init = selectedPage * getEntriesPerPage();
324
                int end = init + getEntriesPerPage() - 1;
325
                if(row >= init && row <= end)
326
                        return true;
327
                return false;
328
        }
329
        
330
        public List<Object> getPage(int page) {
331
                if(page >= 0 && page < getPageCount()) {
332
                        int init = entriesPerPage * page;
333
                        int end = init + entriesPerPage;
334
                        end = end >= entries.size() ? entries.size() : end;
335
                        return entries.subList(init, end);
336
                }
337
                return null;
338
        }
339
        
340
        public int getEntriesPerPage() {
341
                return entriesPerPage;
342
        }
343
        
344
        public int getSelectedPageNumber() {
345
                if(selectedPage >= getPageCount()) {
346
                        selectedPage = getPageCount() - 1;
347
                        if(selectedPage < 0)
348
                                selectedPage = 0;
349
                }
350
                return selectedPage;
351
        }
352
        
353
        public void addListener(PagedTableListener listener) {
354
                this.listeners.add(listener);
355
        }
356
        
357
        public boolean messageBoxYesOrNot(String msg, Object parentWindow){
358
                String string1 = Messages.getText("yes");
359
                String string2 = Messages.getText( "no");
360
                Object[] options = {string1, string2};
361
                int n = JOptionPane.showOptionDialog(table.getJTable(),
362
                                        "<html>" + msg.replaceAll("\n", "<br>") + "</html>",
363
                                        PluginServices.getText(parentWindow, "confirmacion"),
364
                                        JOptionPane.YES_NO_OPTION,
365
                                        JOptionPane.QUESTION_MESSAGE,
366
                                        null,
367
                                        options,
368
                                        string1);
369
                if (n == JOptionPane.YES_OPTION)
370
                        return true;
371
                else
372
                        return false;
373
        }
374
        
375
}