// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.io; import static org.openstreetmap.josm.tools.I18n.tr; import static org.openstreetmap.josm.tools.I18n.trn; import java.awt.BorderLayout; import java.awt.Font; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.text.MessageFormat; import java.util.logging.Logger; import javax.swing.BorderFactory; import javax.swing.JEditorPane; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import javax.swing.text.html.HTMLEditorKit; import javax.swing.text.html.StyleSheet; import org.openstreetmap.josm.data.osm.Changeset; import org.openstreetmap.josm.io.OsmApi; import org.openstreetmap.josm.tools.ImageProvider; public class UploadParameterSummaryPanel extends JPanel implements HyperlinkListener, PropertyChangeListener{ @SuppressWarnings("unused") static private final Logger logger = Logger.getLogger(UploadParameterSummaryPanel.class.getName()); private UploadStrategySpecification spec = new UploadStrategySpecification(); private int numObjects; private JEditorPane jepMessage; private JLabel lblWarning; private Changeset selectedChangeset; private boolean closeChangesetAfterNextUpload; private ConfigurationParameterRequestHandler configHandler; protected String buildChangesetSummary() { StringBuffer msg = new StringBuffer(); if (selectedChangeset == null || selectedChangeset.isNew()) { msg.append(tr("Objects are uploaded to a <strong>new changeset</strong>.")); } else { String uploadComment = selectedChangeset.get("comment") == null ? "" : selectedChangeset.get("comment"); msg.append(tr("Objects are uploaded to the <strong>open changeset</strong> {0} with upload comment ''{1}''.", selectedChangeset.getId(), uploadComment )); } msg.append(" "); if (closeChangesetAfterNextUpload) { msg.append(tr("The changeset is going to be <strong>closed</strong> after this upload")); } else { msg.append(tr("The changeset is <strong>left open</strong> after this upload")); } msg.append(" (<a href=\"urn:changeset-configuration\">" + tr("configure changeset") + "</a>)"); return msg.toString(); } protected String buildStrategySummary() { if (spec == null) return ""; // check whether we can use one changeset only or whether we have to use // multiple changesets // boolean useOneChangeset = true; int maxChunkSize = OsmApi.getOsmApi().getCapabilities().getMaxChangesetSize(); if (maxChunkSize > 0 && numObjects > maxChunkSize) { useOneChangeset = false; } int numRequests = spec.getNumRequests(numObjects); String msg = null; if (useOneChangeset) { lblWarning.setVisible(false); if (numRequests == 0) { msg = trn( "Uploading <strong>{0} object</strong> to <strong>1 changeset</strong>", "Uploading <strong>{0} objects</strong> to <strong>1 changeset</strong>", numObjects, numObjects ); } else if (numRequests == 1) { msg = trn( "Uploading <strong>{0} object</strong> to <strong>1 changeset</strong> using <strong>1 request</strong>", "Uploading <strong>{0} objects</strong> to <strong>1 changeset</strong> using <strong>1 request</strong>", numObjects, numObjects ); } else if (numRequests > 1){ msg = tr("Uploading <strong>{0} objects</strong> to <strong>1 changeset</strong> using <strong>{1} requests</strong>", numObjects, numRequests); } msg = msg + " (<a href=\"urn:advanced-configuration\">" + tr("advanced configuration") + "</a>)"; } else { lblWarning.setVisible(true); if (numRequests == 0) { msg = tr("{0} objects exceed the max. allowed {1} objects in a changeset on the server ''{2}''. Please <a href=\"urn:advanced-configuration\">configure</a> how to proceed with <strong>multiple changesets</strong>", numObjects, maxChunkSize, OsmApi.getOsmApi().getBaseUrl()); } else if (numRequests > 1){ msg = tr("Uploading <strong>{0} objects</strong> to <strong>multiple changesets</strong> using <strong>{1} requests</strong>", numObjects, numRequests); msg = msg + " (<a href=\"urn:advanced-configuration\">" + tr("advanced configuration") + "</a>)"; } } return msg; } protected void build() { jepMessage = new JEditorPane("text/html", ""); jepMessage.setOpaque(false); jepMessage.setEditable(false); jepMessage.addHyperlinkListener(this); Font f = UIManager.getFont("Label.font"); StyleSheet ss = new StyleSheet(); String rule = MessageFormat.format( "font-family: ''{0}'';font-size: {1,number}pt; font-weight: {2}; font-style: {3}", f.getName(), f.getSize(), f.isBold() ? "bold" : "normal", f.isItalic() ? "italic" : "normal" ); rule = "body {" + rule + "}"; rule = MessageFormat.format( "font-family: ''{0}'';font-size: {1,number}pt; font-weight: {2}; font-style: {3}", f.getName(), f.getSize(), "bold", f.isItalic() ? "italic" : "normal" ); rule = "strong {" + rule + "}"; ss.addRule(rule); ss.addRule("a {text-decoration: underline; color: blue}"); HTMLEditorKit kit = new HTMLEditorKit(); kit.setStyleSheet(ss); jepMessage.setEditorKit(kit); setLayout(new BorderLayout()); add(jepMessage, BorderLayout.CENTER); lblWarning = new JLabel(""); lblWarning.setVisible(false); lblWarning.setIcon(ImageProvider.get("warning-small.png")); lblWarning.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); JPanel pnl = new JPanel(new BorderLayout()); pnl.add(lblWarning, BorderLayout.NORTH); add(pnl, BorderLayout.WEST); } public UploadParameterSummaryPanel() { build(); updateSummary(); } public void setConfigurationParameterRequestListener(ConfigurationParameterRequestHandler handler) { this.configHandler = handler; } public void setUploadStrategySpecification(UploadStrategySpecification spec) { this.spec = spec; updateSummary(); } public void setNumObjects(int numObjects) { this.numObjects = numObjects; updateSummary(); } public void setCloseChangesetAfterNextUpload(boolean value) { this.closeChangesetAfterNextUpload = value; updateSummary(); } protected void updateSummary() { StringBuffer sb = new StringBuffer(); sb.append("<html>"); sb.append(buildStrategySummary()); sb.append("<br><br>"); sb.append(buildChangesetSummary()); sb.append("</html>"); jepMessage.setText(sb.toString()); } /* --------------------------------------------------------------------- */ /* Interface HyperlinkListener /* --------------------------------------------------------------------- */ public void hyperlinkUpdate(HyperlinkEvent e) { if (HyperlinkEvent.EventType.ACTIVATED.equals(e.getEventType())) { if (e.getDescription() == null || configHandler == null) return; if (e.getDescription().equals("urn:changeset-configuration")) { configHandler.handleChangesetConfigurationRequest(); } else if (e.getDescription().equals("urn:advanced-configuration")) { configHandler.handleUploadStrategyConfigurationRequest(); } } } /* --------------------------------------------------------------------- */ /* Interface PropertyChangeListener /* --------------------------------------------------------------------- */ public void propertyChange(PropertyChangeEvent evt) { if (evt.getPropertyName().equals(ChangesetManagementPanel.SELECTED_CHANGESET_PROP)) { selectedChangeset = (Changeset)evt.getNewValue(); updateSummary(); } else if (evt.getPropertyName().equals(ChangesetManagementPanel.CLOSE_CHANGESET_AFTER_UPLOAD)) { closeChangesetAfterNextUpload = (Boolean)evt.getNewValue(); updateSummary(); } else if (evt.getPropertyName().equals(UploadedObjectsSummaryPanel.NUM_OBJECTS_TO_UPLOAD_PROP)) { numObjects = (Integer)evt.getNewValue(); updateSummary(); } else if (evt.getPropertyName().equals(UploadStrategySelectionPanel.UPLOAD_STRATEGY_SPECIFICATION_PROP)) { this.spec = (UploadStrategySpecification)evt.getNewValue(); updateSummary(); } } }