Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.swing / org.gvsig.fmap.dal.swing.impl / src / main / java / org / gvsig / fmap / dal / swing / impl / featuretable / FeatureTablePanel.java @ 42775

History | View | Annotate | Download (9.36 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 3
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

    
25
package org.gvsig.fmap.dal.swing.impl.featuretable;
26

    
27
import java.awt.BorderLayout;
28
import java.awt.Component;
29
import java.awt.Dimension;
30
import java.awt.event.ActionEvent;
31
import java.awt.event.ActionListener;
32
import java.beans.PropertyChangeEvent;
33
import java.beans.PropertyChangeListener;
34
import javax.swing.AbstractListModel;
35
import javax.swing.JButton;
36
import javax.swing.JComponent;
37

    
38
import javax.swing.JLabel;
39
import javax.swing.JList;
40
import javax.swing.JPanel;
41
import javax.swing.JScrollPane;
42
import javax.swing.JTable;
43
import javax.swing.ListCellRenderer;
44
import javax.swing.ListModel;
45
import javax.swing.SwingUtilities;
46
import javax.swing.UIManager;
47
import javax.swing.event.TableModelEvent;
48
import javax.swing.event.TableModelListener;
49
import javax.swing.table.JTableHeader;
50
import javax.swing.table.TableModel;
51

    
52
import org.gvsig.fmap.dal.DataStoreNotification;
53
import org.gvsig.fmap.dal.swing.FeatureTableModel;
54
import org.gvsig.fmap.dal.swing.JFeatureTable;
55
import org.gvsig.i18n.Messages;
56
import org.gvsig.tools.observer.Observable;
57
import org.gvsig.tools.observer.Observer;
58
import org.slf4j.Logger;
59
import org.slf4j.LoggerFactory;
60

    
61
/**
62
 * Panel to show a table of Feature data.
63
 *
64
 * @author <a href="mailto:cordin@disid.com">C?sar Ordi?ana</a>
65
 */
66
public class FeatureTablePanel extends JPanel implements Observer,JFeatureTable {
67

    
68
    private static final Logger logger = LoggerFactory.getLogger(FeatureTablePanel.class);
69

    
70
    private static final long serialVersionUID = -9199073063283531216L;
71

    
72
    private final FeatureTableModel tableModel;
73
    private FeatureTable table = null;
74
    private JScrollPane jScrollPane = null;
75
    private JPanel selectionPanel;
76
    private JLabel selectionLabel;
77

    
78
    public FeatureTablePanel(FeatureTableModel tableModel,
79
            boolean isDoubleBuffered)  {
80
        super(isDoubleBuffered);
81
        this.tableModel = tableModel;       
82
        this.initComonents();
83
        tableModel.getFeatureStore().addObserver(this);
84
    }
85

    
86
    private void initComonents() {
87
        this.setLayout(new BorderLayout());
88

    
89
        table = new FeatureTable(tableModel);
90
        table.setRowSelectionAllowed(true);
91
        table.setColumnSelectionAllowed(false);
92

    
93
        jScrollPane = new JScrollPane();
94
        jScrollPane.setViewportView(table);
95
        createTheRowHeader();
96

    
97
        table.addPropertyChangeListener(new PropertyChangeListener() {
98
            @Override
99
            public void propertyChange(PropertyChangeEvent pce) {
100
                if( "RowHeight".equalsIgnoreCase(pce.getPropertyName())) {
101
                    // No he averigado como cambiar el ancho de las lineas
102
                    // ya creadas de la cabezera de lineas, asi que la
103
                    // reconstruyo entera cuando algo cambia.
104
                    createTheRowHeader();
105
                }
106
            }
107
        });
108

    
109
        tableModel.addTableModelListener(new TableModelListener() {
110
            @Override
111
            public void tableChanged(TableModelEvent tme) {
112
                // No he averigado como cambiar el ancho de las lineas
113
                // ya creadas de la cabezera de lineas, asi que la
114
                // reconstruyo entera cuando algo cambia.
115
                createTheRowHeader();
116
            }
117
        });
118
        selectionLabel = new JLabel();
119
        selectionLabel.setText( this.getSelectionLabel() );
120
        selectionPanel = new JPanel();
121
        selectionPanel.add(selectionLabel, BorderLayout.EAST);
122
 
123
        this.add(jScrollPane, BorderLayout.CENTER);
124
        this.add(selectionPanel, BorderLayout.SOUTH);
125
    }
126
    
127
    public void addColumnSelectionListener(ActionListener listener) {
128
       this.table.addColumnSelectionListener(listener);
129
    }
130
    
131
    public void fireColumnSelection(ActionEvent e) {
132
        this.table.fireColumnSelection(e);
133
    }    
134

    
135
    @Override
136
    public void setModel(TableModel dataModel) {
137
        this.table.setModel(dataModel);
138
    }
139

    
140
    @Override
141
    public TableModel getModel() {
142
        return this.table.getModel();
143
    }    
144

    
145
    @Override
146
    public FeatureTableModel getFeatureTableModel() {
147
        return this.tableModel;
148
    }    
149
    
150
    @Override
151
    public int getSelectedColumnCount() {
152
        return this.table.getSelectedColumnCount();
153
    }
154

    
155
    @Override
156
    public int[] getSelectedColumns() {
157
        return this.table.getSelectedColumns();
158
    }
159
    
160
    private String getSelectionLabel() {
161
        String label =
162
            tableModel.getSelectionCount() + 
163
            " / " +
164
            tableModel.getRowCount() + 
165
            " " +
166
            Messages.getText("registros_seleccionados_total") + 
167
            ".";
168
        return label;
169
    }
170
    
171
    private void createTheRowHeader() {
172
        // No se si ha sido paranoia o que, pero parece que si la recreo sin mas
173
        // a veces parece como si no la cambiase, asi que he probado a encolarlo 
174
        // en la cola de eventos de swing y parece que siempre funciona.
175
        //
176
        // Cuando se estan mostrando las geometrias, que cada linea tiene un ancho
177
        // distinto, se le llama muchisimas veces;
178
        // habria que evaluar retenerlas por ejemplo durante un segundo y solo 
179
        // recrearlo entonces.
180
        SwingUtilities.invokeLater(new Runnable() {
181

    
182
            @Override
183
            public void run() {
184
                if( table.getRowCount()<1 ) {
185
                    jScrollPane.setRowHeaderView(null);
186
                    return;
187
                }
188
                ListModel lm = new AbstractListModel() {
189
                    private static final long serialVersionUID = -310252331647118271L;
190
                    @Override
191
                    public int getSize() {
192
                        return table.getRowCount();
193
                    }
194

    
195
                    @Override
196
                    public Object getElementAt(int index) {
197
                        return String.valueOf(index + 1);
198
                    }
199
                };
200
                final JList rowHeader = new JList(lm);
201
                rowHeader.setBackground(table.getTableHeader().getBackground());
202
                rowHeader.setCellRenderer(new RowHeaderRenderer(table,rowHeader));
203
                jScrollPane.setRowHeaderView(rowHeader);
204
            }
205
        });
206
    }
207

    
208
    @Override
209
    public JTable getJTable() {
210
        return this.table;
211
    }
212

    
213
    @Override
214
    public JComponent asJComponent() {
215
        return this;
216
    }
217

    
218
    private static class RowHeaderRenderer extends JButton implements ListCellRenderer {
219
        private static final long serialVersionUID = -3811876981965840126L;
220
        private JTable table = null;
221
        private final Dimension dimension = new Dimension();
222
        private final JList rowHeader;
223
        
224
        RowHeaderRenderer(JTable table,JList rowHeader) {
225
            JTableHeader header = table.getTableHeader();
226
            setOpaque(true);
227
            setBorder(UIManager.getBorder("TableHeader.cellBorder"));
228
            setHorizontalAlignment(CENTER);
229
            setForeground(header.getForeground());
230
            setBackground(header.getBackground());
231
            setFont(header.getFont());
232
            this.table = table;
233
            this.rowHeader = rowHeader;
234
        }
235

    
236
        @Override
237
        public Component getListCellRendererComponent(JList list, Object value,
238
                int index, boolean isSelected, boolean cellHasFocus) {
239
            setText((value == null) ? "" : value.toString());
240
            this.setPreferredSize(null); // Fuerza recalcular el tama?o del boton
241
            this.dimension.height = this.table.getRowHeight(index);
242
            this.dimension.width = this.getPreferredSize().width+10;
243
            this.setPreferredSize(this.dimension);
244
            return this;
245
        }
246

    
247
    }
248

    
249
    @Override
250
    public void update(Observable observable, Object notification) {
251
        // If selection changes from nothing selected to anything selected
252
        // or the reverse, update selection info
253
        if ( notification instanceof DataStoreNotification ) {
254
            String type = ((DataStoreNotification) notification).getType();
255
            if ( DataStoreNotification.SELECTION_CHANGE.equals(type) ) {
256
                selectionLabel.setText( this.getSelectionLabel() );
257
            }
258
        }
259
    }
260

    
261
    @Override
262
    public void setCurrent(int index) {
263
        logger.warn("setCurrent not implemented !!!!!!!!!!!!!!!!!!!!!!!!");
264
    }
265

    
266
    public void setVisibleStatusbar(boolean visible) {
267
        this.selectionPanel.setVisible(visible);
268
    }
269
    
270
    public boolean isVisibleStatusbar() {
271
        return this.selectionPanel.isVisible();
272
    }
273
}