001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.io;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.awt.Component;
007import java.awt.Dimension;
008import java.awt.GridBagLayout;
009
010import javax.swing.JLabel;
011import javax.swing.JPanel;
012import javax.swing.JTable;
013import javax.swing.table.DefaultTableColumnModel;
014import javax.swing.table.TableCellRenderer;
015import javax.swing.table.TableColumn;
016
017import org.openstreetmap.josm.tools.GBC;
018
019class SaveLayersTableColumnModel extends DefaultTableColumnModel {
020    /** small renderer class that handles the "should be uploaded/saved" texts. */
021    private static class RecommendedActionsTableCell implements TableCellRenderer {
022        private final JPanel pnlEmpty = new JPanel();
023        private final JLabel needsUpload = new JLabel(tr("should be uploaded"));
024        private final JLabel needsSave = new JLabel(tr("should be saved"));
025        private static final GBC defaultCellStyle = GBC.eol().fill(GBC.HORIZONTAL).insets(2, 0, 2, 0);
026
027        /**
028         * Constructs a new {@code RecommendedActionsTableCell}.
029         */
030        RecommendedActionsTableCell() {
031            pnlEmpty.setPreferredSize(new Dimension(1, 19));
032            needsUpload.setPreferredSize(new Dimension(needsUpload.getPreferredSize().width, 19));
033            needsSave.setPreferredSize(new Dimension(needsSave.getPreferredSize().width, 19));
034        }
035
036        @Override
037        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
038                boolean hasFocus, int row, int column) {
039            JPanel panel = new JPanel(new GridBagLayout());
040            SaveLayerInfo info = (SaveLayerInfo) value;
041            StringBuilder sb = new StringBuilder(24);
042            sb.append("<html>");
043            if (info != null) {
044                if (info.getLayer().requiresUploadToServer() && !info.getLayer().isUploadDiscouraged()) {
045                    panel.add(needsUpload, defaultCellStyle);
046                    sb.append(tr("Layer ''{0}'' has modifications which should be uploaded to the server.", info.getName()));
047
048                } else {
049                    if (info.isUploadable()) {
050                        panel.add(pnlEmpty, defaultCellStyle);
051                    }
052                    if (info.getLayer().requiresUploadToServer()) {
053                        sb.append(tr("Layer ''{0}'' has modifications which are discouraged to be uploaded.", info.getName()));
054                    } else {
055                        sb.append(tr("Layer ''{0}'' has no modifications to be uploaded.", info.getName()));
056                    }
057                }
058                sb.append("<br/>");
059
060                if (info.getLayer().requiresSaveToFile()) {
061                    panel.add(needsSave, defaultCellStyle);
062                    sb.append(tr("Layer ''{0}'' has modifications which should be saved to its associated file ''{1}''.",
063                            info.getName(), info.getFile().toString()));
064                } else {
065                    if (info.isSavable()) {
066                        panel.add(pnlEmpty, defaultCellStyle);
067                    }
068                    sb.append(tr("Layer ''{0}'' has no modifications to be saved.", info.getName()));
069                }
070            }
071            sb.append("</html>");
072            panel.setToolTipText(sb.toString());
073            return panel;
074        }
075    }
076
077    /**
078     * Constructs a new {@code SaveLayersTableColumnModel}.
079     */
080    SaveLayersTableColumnModel() {
081        build();
082    }
083
084    protected void build() {
085        TableColumn col = null;
086
087        // column 0 - layer name, save path editor
088        LayerNameAndFilePathTableCell lnfpRenderer = new LayerNameAndFilePathTableCell();
089        LayerNameAndFilePathTableCell lnfpEditor = new LayerNameAndFilePathTableCell();
090        col = new TableColumn(0); // keep in sync with SaveLayersModel#columnFilename
091        col.setHeaderValue(tr("Layer Name and File Path"));
092        col.setResizable(true);
093        col.setCellRenderer(lnfpRenderer);
094        col.setCellEditor(lnfpEditor);
095        col.setPreferredWidth(324);
096        addColumn(col);
097
098        // column 1 - actions required
099        col = new TableColumn(1);
100        col.setHeaderValue(tr("Recommended Actions"));
101        col.setResizable(true);
102        col.setCellRenderer(new RecommendedActionsTableCell());
103        col.setPreferredWidth(150);
104        addColumn(col);
105
106        // column 2- actions to take
107        ActionFlagsTableCell aftc = new ActionFlagsTableCell();
108        col = new TableColumn(2); // keep in sync with SaveLayersModel#columnActions
109        col.setHeaderValue(tr("Actions To Take"));
110        col.setResizable(true);
111        col.setCellRenderer(aftc);
112        col.setCellEditor(aftc);
113        col.setPreferredWidth(100);
114
115        addColumn(col);
116    }
117}