001 // License: GPL. For details, see LICENSE file.
002 package org.openstreetmap.josm.gui.io;
003
004 import static org.openstreetmap.josm.tools.I18n.tr;
005 import static org.openstreetmap.josm.tools.I18n.trn;
006
007 import java.awt.BorderLayout;
008 import java.awt.Font;
009 import java.beans.PropertyChangeEvent;
010 import java.beans.PropertyChangeListener;
011 import java.text.MessageFormat;
012
013 import javax.swing.BorderFactory;
014 import javax.swing.JEditorPane;
015 import javax.swing.JLabel;
016 import javax.swing.JPanel;
017 import javax.swing.UIManager;
018 import javax.swing.event.HyperlinkEvent;
019 import javax.swing.event.HyperlinkListener;
020 import javax.swing.text.html.HTMLEditorKit;
021 import javax.swing.text.html.StyleSheet;
022
023 import org.openstreetmap.josm.data.osm.Changeset;
024 import org.openstreetmap.josm.io.OsmApi;
025 import org.openstreetmap.josm.tools.ImageProvider;
026
027 public class UploadParameterSummaryPanel extends JPanel implements HyperlinkListener, PropertyChangeListener{
028 private UploadStrategySpecification spec = new UploadStrategySpecification();
029 private int numObjects;
030 private JEditorPane jepMessage;
031 private JLabel lblWarning;
032
033 private Changeset selectedChangeset;
034 private boolean closeChangesetAfterNextUpload;
035 private ConfigurationParameterRequestHandler configHandler;
036
037 protected String buildChangesetSummary() {
038 StringBuffer msg = new StringBuffer();
039 if (selectedChangeset == null || selectedChangeset.isNew()) {
040 msg.append(tr("Objects are uploaded to a <strong>new changeset</strong>."));
041 } else {
042 String uploadComment = selectedChangeset.get("comment") == null ?
043 "" : selectedChangeset.get("comment");
044 msg.append(tr("Objects are uploaded to the <strong>open changeset</strong> {0} with upload comment ''{1}''.",
045 selectedChangeset.getId(),
046 uploadComment
047 ));
048 }
049 msg.append(" ");
050 if (closeChangesetAfterNextUpload) {
051 msg.append(tr("The changeset is going to be <strong>closed</strong> after this upload"));
052 } else {
053 msg.append(tr("The changeset is <strong>left open</strong> after this upload"));
054 }
055 msg.append(" (<a href=\"urn:changeset-configuration\">" + tr("configure changeset") + "</a>)");
056 return msg.toString();
057 }
058
059 protected String buildStrategySummary() {
060 if (spec == null)
061 return "";
062 // check whether we can use one changeset only or whether we have to use
063 // multiple changesets
064 //
065 boolean useOneChangeset = true;
066 int maxChunkSize = OsmApi.getOsmApi().getCapabilities().getMaxChangesetSize();
067 if (maxChunkSize > 0 && numObjects > maxChunkSize) {
068 useOneChangeset = false;
069 }
070
071 int numRequests = spec.getNumRequests(numObjects);
072 String msg = null;
073 if (useOneChangeset) {
074 lblWarning.setVisible(false);
075 if (numRequests == 0) {
076 msg = trn(
077 "Uploading <strong>{0} object</strong> to <strong>1 changeset</strong>",
078 "Uploading <strong>{0} objects</strong> to <strong>1 changeset</strong>",
079 numObjects, numObjects
080 );
081 } else if (numRequests == 1) {
082 msg = trn(
083 "Uploading <strong>{0} object</strong> to <strong>1 changeset</strong> using <strong>1 request</strong>",
084 "Uploading <strong>{0} objects</strong> to <strong>1 changeset</strong> using <strong>1 request</strong>",
085 numObjects, numObjects
086 );
087 } else if (numRequests > 1){
088 msg = tr("Uploading <strong>{0} objects</strong> to <strong>1 changeset</strong> using <strong>{1} requests</strong>", numObjects, numRequests);
089 }
090 msg = msg + " (<a href=\"urn:advanced-configuration\">" + tr("advanced configuration") + "</a>)";
091 } else {
092 lblWarning.setVisible(true);
093 if (numRequests == 0) {
094 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>",
095 numObjects, maxChunkSize, OsmApi.getOsmApi().getBaseUrl());
096 } else if (numRequests > 1){
097 msg = tr("Uploading <strong>{0} objects</strong> to <strong>multiple changesets</strong> using <strong>{1} requests</strong>", numObjects, numRequests);
098 msg = msg + " (<a href=\"urn:advanced-configuration\">" + tr("advanced configuration") + "</a>)";
099 }
100 }
101 return msg;
102 }
103
104 protected void build() {
105 jepMessage = new JEditorPane("text/html", "");
106 jepMessage.setOpaque(false);
107 jepMessage.setEditable(false);
108 jepMessage.addHyperlinkListener(this);
109 Font f = UIManager.getFont("Label.font");
110 StyleSheet ss = new StyleSheet();
111 String rule = MessageFormat.format(
112 "font-family: ''{0}'';font-size: {1,number}pt; font-weight: {2}; font-style: {3}",
113 f.getName(),
114 f.getSize(),
115 f.isBold() ? "bold" : "normal",
116 f.isItalic() ? "italic" : "normal"
117 );
118 rule = "body {" + rule + "}";
119 rule = MessageFormat.format(
120 "font-family: ''{0}'';font-size: {1,number}pt; font-weight: {2}; font-style: {3}",
121 f.getName(),
122 f.getSize(),
123 "bold",
124 f.isItalic() ? "italic" : "normal"
125 );
126 rule = "strong {" + rule + "}";
127 ss.addRule(rule);
128 ss.addRule("a {text-decoration: underline; color: blue}");
129 HTMLEditorKit kit = new HTMLEditorKit();
130 kit.setStyleSheet(ss);
131 jepMessage.setEditorKit(kit);
132
133 setLayout(new BorderLayout());
134 add(jepMessage, BorderLayout.CENTER);
135 lblWarning = new JLabel("");
136 lblWarning.setVisible(false);
137 lblWarning.setIcon(ImageProvider.get("warning-small.png"));
138 lblWarning.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
139 JPanel pnl = new JPanel(new BorderLayout());
140 pnl.add(lblWarning, BorderLayout.NORTH);
141 add(pnl, BorderLayout.WEST);
142 }
143
144 public UploadParameterSummaryPanel() {
145 build();
146 updateSummary();
147 }
148
149 public void setConfigurationParameterRequestListener(ConfigurationParameterRequestHandler handler) {
150 this.configHandler = handler;
151 }
152
153 public void setUploadStrategySpecification(UploadStrategySpecification spec) {
154 this.spec = spec;
155 updateSummary();
156 }
157
158 public void setNumObjects(int numObjects) {
159 this.numObjects = numObjects;
160 updateSummary();
161 }
162
163 public void setCloseChangesetAfterNextUpload(boolean value) {
164 this.closeChangesetAfterNextUpload = value;
165 updateSummary();
166 }
167
168 protected void updateSummary() {
169 StringBuffer sb = new StringBuffer();
170 sb.append("<html>");
171 sb.append(buildStrategySummary());
172 sb.append("<br><br>");
173 sb.append(buildChangesetSummary());
174 sb.append("</html>");
175 jepMessage.setText(sb.toString());
176 }
177
178 /* --------------------------------------------------------------------- */
179 /* Interface HyperlinkListener
180 /* --------------------------------------------------------------------- */
181 public void hyperlinkUpdate(HyperlinkEvent e) {
182 if (HyperlinkEvent.EventType.ACTIVATED.equals(e.getEventType())) {
183 if (e.getDescription() == null || configHandler == null)
184 return;
185 if (e.getDescription().equals("urn:changeset-configuration")) {
186 configHandler.handleChangesetConfigurationRequest();
187 } else if (e.getDescription().equals("urn:advanced-configuration")) {
188 configHandler.handleUploadStrategyConfigurationRequest();
189 }
190 }
191 }
192
193 /* --------------------------------------------------------------------- */
194 /* Interface PropertyChangeListener
195 /* --------------------------------------------------------------------- */
196 public void propertyChange(PropertyChangeEvent evt) {
197 if (evt.getPropertyName().equals(ChangesetManagementPanel.SELECTED_CHANGESET_PROP)) {
198 selectedChangeset = (Changeset)evt.getNewValue();
199 updateSummary();
200 } else if (evt.getPropertyName().equals(ChangesetManagementPanel.CLOSE_CHANGESET_AFTER_UPLOAD)) {
201 closeChangesetAfterNextUpload = (Boolean)evt.getNewValue();
202 updateSummary();
203 } else if (evt.getPropertyName().equals(UploadedObjectsSummaryPanel.NUM_OBJECTS_TO_UPLOAD_PROP)) {
204 numObjects = (Integer)evt.getNewValue();
205 updateSummary();
206 } else if (evt.getPropertyName().equals(UploadStrategySelectionPanel.UPLOAD_STRATEGY_SPECIFICATION_PROP)) {
207 this.spec = (UploadStrategySpecification)evt.getNewValue();
208 updateSummary();
209 }
210 }
211 }