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 @ 1733

History | View | Annotate | Download (8.4 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 org.gvsig.raster.swing.pagedtable.PagedTable;
31
import org.gvsig.raster.swing.pagedtable.PagedTableEvent;
32
import org.gvsig.raster.swing.pagedtable.PagedTableListener;
33

    
34

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