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 | /**
|
---|
30 | *
|
---|
31 | * Class for displaying WMTS layer selection panel
|
---|
32 | *
|
---|
33 | */
|
---|
34 | public class WMTSLayerSelection extends JPanel {
|
---|
35 | private List<Entry<String, List<Layer>>> layers;
|
---|
36 | private JTable list;
|
---|
37 |
|
---|
38 | /**
|
---|
39 | *
|
---|
40 | * @param layers list of grouped layers (by tileMatrixSet and name)
|
---|
41 | */
|
---|
42 | public WMTSLayerSelection(List<Entry<String, List<Layer>>> layers) {
|
---|
43 | super(new GridBagLayout());
|
---|
44 | this.layers = layers;
|
---|
45 | list = new JTable(
|
---|
46 | new AbstractTableModel() {
|
---|
47 | @Override
|
---|
48 | public Object getValueAt(int rowIndex, int columnIndex) {
|
---|
49 | switch (columnIndex) {
|
---|
50 | case 0:
|
---|
51 | return layers.get(rowIndex).getValue()
|
---|
52 | .stream()
|
---|
53 | .map(Layer::getUserTitle)
|
---|
54 | .collect(Collectors.joining(", ")); //this should be only one
|
---|
55 | case 1:
|
---|
56 | return layers.get(rowIndex).getValue()
|
---|
57 | .stream()
|
---|
58 | .map(x -> x.getTileMatrixSet().getCrs())
|
---|
59 | .collect(Collectors.joining(", "));
|
---|
60 | case 2:
|
---|
61 | return layers.get(rowIndex).getValue()
|
---|
62 | .stream()
|
---|
63 | .map(x -> x.getTileMatrixSet().getIdentifier())
|
---|
64 | .collect(Collectors.joining(", ")); //this should be only one
|
---|
65 | default:
|
---|
66 | throw new IllegalArgumentException();
|
---|
67 | }
|
---|
68 | }
|
---|
69 |
|
---|
70 | @Override
|
---|
71 | public int getRowCount() {
|
---|
72 | return layers.size();
|
---|
73 | }
|
---|
74 |
|
---|
75 | @Override
|
---|
76 | public int getColumnCount() {
|
---|
77 | return 3;
|
---|
78 | }
|
---|
79 |
|
---|
80 | @Override
|
---|
81 | public String getColumnName(int column) {
|
---|
82 | switch (column) {
|
---|
83 | case 0: return tr("Layer name");
|
---|
84 | case 1: return tr("Projection");
|
---|
85 | case 2: return tr("Matrix set identifier");
|
---|
86 | default:
|
---|
87 | throw new IllegalArgumentException();
|
---|
88 | }
|
---|
89 | }
|
---|
90 | });
|
---|
91 | list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
---|
92 | list.setAutoCreateRowSorter(true);
|
---|
93 | list.setRowSelectionAllowed(true);
|
---|
94 | list.setColumnSelectionAllowed(false);
|
---|
95 | updateColumnPreferredWidth(list.getColumnModel().getColumn(0));
|
---|
96 | updateColumnPreferredWidth(list.getColumnModel().getColumn(1));
|
---|
97 | updateColumnPreferredWidth(list.getColumnModel().getColumn(2));
|
---|
98 |
|
---|
99 | add(new JLabel(tr("Filter layers:")), GBC.eol().fill(GBC.HORIZONTAL));
|
---|
100 | final JosmTextArea filter = new JosmTextArea();
|
---|
101 | filter.getDocument().addDocumentListener(new DocumentListener() {
|
---|
102 | @Override
|
---|
103 | public void insertUpdate(DocumentEvent e) {
|
---|
104 | update();
|
---|
105 | }
|
---|
106 |
|
---|
107 | @Override
|
---|
108 | public void removeUpdate(DocumentEvent e) {
|
---|
109 | update();
|
---|
110 | }
|
---|
111 |
|
---|
112 | @Override
|
---|
113 | public void changedUpdate(DocumentEvent e) {
|
---|
114 | update();
|
---|
115 | }
|
---|
116 |
|
---|
117 | @SuppressWarnings({ "unchecked", "rawtypes" })
|
---|
118 | private void update() {
|
---|
119 | ((TableRowSorter) list.getRowSorter()).setRowFilter(RowFilter.regexFilter("(?i)" + filter.getText()));
|
---|
120 | }
|
---|
121 |
|
---|
122 | });
|
---|
123 | add(filter, GBC.eop().fill(GBC.HORIZONTAL));
|
---|
124 | add(new JScrollPane(this.list), GBC.eol().fill());
|
---|
125 | }
|
---|
126 |
|
---|
127 | /**
|
---|
128 | * @return selected layer
|
---|
129 | */
|
---|
130 | public Layer getSelectedLayer() {
|
---|
131 | int index = list.getSelectedRow();
|
---|
132 | if (index < 0) {
|
---|
133 | return null; //nothing selected
|
---|
134 | }
|
---|
135 | return layers.get(list.convertRowIndexToModel(index)).getValue().get(0);
|
---|
136 | }
|
---|
137 |
|
---|
138 | private void updateColumnPreferredWidth(TableColumn column) {
|
---|
139 | TableCellRenderer renderer = column.getHeaderRenderer();
|
---|
140 | if (renderer == null) {
|
---|
141 | renderer = list.getTableHeader().getDefaultRenderer();
|
---|
142 | }
|
---|
143 | Component comp = renderer.getTableCellRendererComponent(list, column.getHeaderValue(), false, false, 0, 0);
|
---|
144 | int ret = comp.getPreferredSize().width;
|
---|
145 |
|
---|
146 | for (int row = 0; row < list.getRowCount(); row++) {
|
---|
147 | renderer = list.getCellRenderer(row, column.getModelIndex());
|
---|
148 | comp = list.prepareRenderer(renderer, row, column.getModelIndex());
|
---|
149 | ret = Math.max (comp.getPreferredSize().width, ret);
|
---|
150 | }
|
---|
151 | column.setPreferredWidth(ret + 10);
|
---|
152 | }
|
---|
153 | }
|
---|