1 | // License: GPL. For details, see LICENSE file.
|
---|
2 | package org.openstreetmap.josm.gui.layer.imagery;
|
---|
3 |
|
---|
4 | import static org.openstreetmap.josm.tools.I18n.tr;
|
---|
5 |
|
---|
6 | import java.awt.Component;
|
---|
7 | import java.awt.GridBagLayout;
|
---|
8 | import java.util.List;
|
---|
9 | import java.util.Map.Entry;
|
---|
10 | import java.util.stream.Collectors;
|
---|
11 |
|
---|
12 | import javax.swing.JLabel;
|
---|
13 | import javax.swing.JPanel;
|
---|
14 | import javax.swing.JScrollPane;
|
---|
15 | import javax.swing.JTable;
|
---|
16 | import javax.swing.ListSelectionModel;
|
---|
17 | import javax.swing.RowFilter;
|
---|
18 | import javax.swing.event.DocumentEvent;
|
---|
19 | import javax.swing.event.DocumentListener;
|
---|
20 | import javax.swing.table.AbstractTableModel;
|
---|
21 | import javax.swing.table.TableCellRenderer;
|
---|
22 | import javax.swing.table.TableColumn;
|
---|
23 | import javax.swing.table.TableRowSorter;
|
---|
24 |
|
---|
25 | import org.openstreetmap.josm.data.imagery.WMTSTileSource.Layer;
|
---|
26 | import org.openstreetmap.josm.gui.widgets.JosmTextArea;
|
---|
27 | import org.openstreetmap.josm.tools.GBC;
|
---|
28 |
|
---|
29 | public class WMTSLayerSelection extends JPanel {
|
---|
30 | private List<Entry<String, List<Layer>>> layers;
|
---|
31 | private JTable list;
|
---|
32 |
|
---|
33 | public WMTSLayerSelection(List<Entry<String, List<Layer>>> layers) {
|
---|
34 | super(new GridBagLayout());
|
---|
35 | this.layers = layers;
|
---|
36 | list = new JTable(
|
---|
37 | new AbstractTableModel() {
|
---|
38 | @Override
|
---|
39 | public Object getValueAt(int rowIndex, int columnIndex) {
|
---|
40 | switch (columnIndex) {
|
---|
41 | case 0:
|
---|
42 | return layers.get(rowIndex).getValue()
|
---|
43 | .stream()
|
---|
44 | .map(Layer::getUserTitle)
|
---|
45 | .collect(Collectors.joining(", ")); //this should be only one
|
---|
46 | case 1:
|
---|
47 | return layers.get(rowIndex).getValue()
|
---|
48 | .stream()
|
---|
49 | .map(x -> x.getTileMatrixSet().getCrs())
|
---|
50 | .collect(Collectors.joining(", "));
|
---|
51 | case 2:
|
---|
52 | return layers.get(rowIndex).getValue()
|
---|
53 | .stream()
|
---|
54 | .map(x -> x.getTileMatrixSet().getIdentifier())
|
---|
55 | .collect(Collectors.joining(", ")); //this should be only one
|
---|
56 | default:
|
---|
57 | throw new IllegalArgumentException();
|
---|
58 | }
|
---|
59 | }
|
---|
60 |
|
---|
61 | @Override
|
---|
62 | public int getRowCount() {
|
---|
63 | return layers.size();
|
---|
64 | }
|
---|
65 |
|
---|
66 | @Override
|
---|
67 | public int getColumnCount() {
|
---|
68 | return 3;
|
---|
69 | }
|
---|
70 |
|
---|
71 | @Override
|
---|
72 | public String getColumnName(int column) {
|
---|
73 | switch (column) {
|
---|
74 | case 0: return tr("Layer name");
|
---|
75 | case 1: return tr("Projection");
|
---|
76 | case 2: return tr("Matrix set identifier");
|
---|
77 | default:
|
---|
78 | throw new IllegalArgumentException();
|
---|
79 | }
|
---|
80 | }
|
---|
81 | });
|
---|
82 | list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
---|
83 | // list.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
|
---|
84 | list.setAutoCreateRowSorter(true);
|
---|
85 | list.setRowSelectionAllowed(true);
|
---|
86 | list.setColumnSelectionAllowed(false);
|
---|
87 | updateColumnPreferredWidth(list.getColumnModel().getColumn(0));
|
---|
88 | updateColumnPreferredWidth(list.getColumnModel().getColumn(1));
|
---|
89 | updateColumnPreferredWidth(list.getColumnModel().getColumn(2));
|
---|
90 |
|
---|
91 | add(new JLabel(tr("Filter layers:")), GBC.eol().fill(GBC.HORIZONTAL));
|
---|
92 | final JosmTextArea filter = new JosmTextArea();
|
---|
93 | filter.getDocument().addDocumentListener(new DocumentListener() {
|
---|
94 | @Override
|
---|
95 | public void insertUpdate(DocumentEvent e) {
|
---|
96 | update();
|
---|
97 | }
|
---|
98 |
|
---|
99 | @Override
|
---|
100 | public void removeUpdate(DocumentEvent e) {
|
---|
101 | update();
|
---|
102 | }
|
---|
103 |
|
---|
104 | @Override
|
---|
105 | public void changedUpdate(DocumentEvent e) {
|
---|
106 | update();
|
---|
107 | }
|
---|
108 |
|
---|
109 | @SuppressWarnings({ "unchecked", "rawtypes" })
|
---|
110 | private void update() {
|
---|
111 | ((TableRowSorter) list.getRowSorter()).setRowFilter(RowFilter.regexFilter("(?i)" + filter.getText()));
|
---|
112 | }
|
---|
113 |
|
---|
114 | });
|
---|
115 | add(filter, GBC.eop().fill(GBC.HORIZONTAL));
|
---|
116 | add(new JScrollPane(this.list), GBC.eol().fill());
|
---|
117 | }
|
---|
118 |
|
---|
119 | /**
|
---|
120 | * @return selected layer
|
---|
121 | */
|
---|
122 | public Layer getSelectedLayer() {
|
---|
123 | int index = list.getSelectedRow();
|
---|
124 | if (index < 0) {
|
---|
125 | return null; //nothing selected
|
---|
126 | }
|
---|
127 | return layers.get(list.convertRowIndexToModel(index)).getValue().get(0);
|
---|
128 | }
|
---|
129 |
|
---|
130 | private void updateColumnPreferredWidth(TableColumn column) {
|
---|
131 | TableCellRenderer renderer = column.getHeaderRenderer();
|
---|
132 | if (renderer == null) {
|
---|
133 | renderer = list.getTableHeader().getDefaultRenderer();
|
---|
134 | }
|
---|
135 | Component comp = renderer.getTableCellRendererComponent(list, column.getHeaderValue(), false, false, 0, 0);
|
---|
136 | int ret = comp.getPreferredSize().width;
|
---|
137 |
|
---|
138 | for (int row = 0; row < list.getRowCount(); row++) {
|
---|
139 | renderer = list.getCellRenderer(row, column.getModelIndex());
|
---|
140 | comp = list.prepareRenderer(renderer, row, column.getModelIndex());
|
---|
141 | ret = Math.max (comp.getPreferredSize().width, ret);
|
---|
142 | }
|
---|
143 | column.setPreferredWidth(ret + 10);
|
---|
144 | }
|
---|
145 | }
|
---|