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

History | View | Annotate | Download (9.32 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 FeatureTable table = null;
73
    private JScrollPane jScrollPane = null;
74
    private JPanel selectionPanel;
75
    private JLabel selectionLabel;
76

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

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

    
88
        table.setRowSelectionAllowed(true);
89
        table.setColumnSelectionAllowed(false);
90

    
91
        jScrollPane = new JScrollPane();
92
        jScrollPane.setViewportView(table);
93
        createTheRowHeader();
94

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

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

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

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

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

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

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

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

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

    
211
    @Override
212
    public JComponent asJComponent() {
213
        return this;
214
    }
215

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

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

    
245
    }
246

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

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

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