// 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.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Optional; import javax.swing.BorderFactory; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import org.openstreetmap.josm.data.osm.Changeset; import org.openstreetmap.josm.gui.widgets.JMultilineLabel; import org.openstreetmap.josm.io.Capabilities; import org.openstreetmap.josm.io.OsmApi; import org.openstreetmap.josm.io.UploadStrategySpecification; import org.openstreetmap.josm.spi.preferences.Config; import org.openstreetmap.josm.tools.ImageProvider; /** * A panel that displays a summary of data the user is about to upload *
* FIXME this class should extend HtmlPanel instead (duplicated code in here)
*/
public class UploadParameterSummaryPanel extends JPanel implements HyperlinkListener, PropertyChangeListener {
private transient UploadStrategySpecification spec = new UploadStrategySpecification();
private int numObjects;
private JMultilineLabel jepMessage;
private JLabel lblWarning;
private transient Changeset selectedChangeset;
private boolean closeChangesetAfterNextUpload;
private transient ConfigurationParameterRequestHandler configHandler;
/**
* Constructs a new {@code UploadParameterSummaryPanel}.
*/
public UploadParameterSummaryPanel() {
build();
updateSummary();
}
protected String buildChangesetSummary() {
StringBuilder msg = new StringBuilder(96);
if (selectedChangeset == null || selectedChangeset.isNew()) {
msg.append(tr("Objects are uploaded to a new changeset."));
} else {
msg.append(tr("Objects are uploaded to the open changeset {0} with upload comment ''{1}''.",
selectedChangeset.getId(),
selectedChangeset.getComment()
));
}
msg.append(' ');
if (closeChangesetAfterNextUpload) {
msg.append(tr("The changeset is going to be closed after this upload"));
} else {
msg.append(tr("The changeset is left open after this upload"));
}
msg.append(" (").append(tr("configure changeset")).append(")");
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;
Capabilities capabilities = OsmApi.getOsmApi().getCapabilities();
int maxChunkSize = capabilities != null ? capabilities.getMaxChangesetSize() : -1;
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 {0} object to 1 changeset",
"Uploading {0} objects to 1 changeset",
numObjects, numObjects
);
} else if (numRequests == 1) {
msg = trn(
"Uploading {0} object to 1 changeset using 1 request",
"Uploading {0} objects to 1 changeset using 1 request",
numObjects, numObjects
);
} else if (numRequests > 1) {
msg = tr("Uploading {0} objects to 1 changeset using {1} requests",
numObjects, numRequests);
}
msg = msg + " (" + tr("advanced configuration") + ")";
} 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 configure how to proceed with multiple changesets",
numObjects, maxChunkSize, OsmApi.getOsmApi().getBaseUrl());
} else if (numRequests > 1) {
msg = tr("Uploading {0} objects to multiple changesets using {1} requests",
numObjects, numRequests);
msg = msg + " (" + tr("advanced configuration") + ")";
}
}
return msg;
}
protected void build() {
jepMessage = new JMultilineLabel("");
jepMessage.addHyperlinkListener(this);
setLayout(new BorderLayout());
add(jepMessage, BorderLayout.CENTER);
lblWarning = new JLabel("");
lblWarning.setVisible(false);
lblWarning.setLabelFor(jepMessage);
lblWarning.setIcon(ImageProvider.get("warning-small"));
lblWarning.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JPanel pnl = new JPanel(new BorderLayout());
pnl.add(lblWarning, BorderLayout.NORTH);
add(pnl, BorderLayout.WEST);
}
public void setConfigurationParameterRequestListener(ConfigurationParameterRequestHandler handler) {
this.configHandler = handler;
}
/**
* Sets the {@link UploadStrategySpecification} the user chose
* @param spec The specification to display
*/
public void setUploadStrategySpecification(UploadStrategySpecification spec) {
this.spec = spec;
updateSummary();
}
/**
* Sets the number of objects that will be uploaded
* @param numObjects The number to display
*/
public void setNumObjects(int numObjects) {
this.numObjects = numObjects;
updateSummary();
}
/**
* Display that the changeset will be closed after the upload
* @param value true
if it will be closed
*/
public void setCloseChangesetAfterNextUpload(boolean value) {
this.closeChangesetAfterNextUpload = value;
updateSummary();
}
protected void updateSummary() {
final String server = Optional.of(OsmApi.getOsmApi().getServerUrl())
.filter(url -> !Config.getUrls().getDefaultOsmApiUrl().equals(url))
.map(url -> tr("… to server: {0}", url))
.orElse("");
jepMessage.setText(""
+ "
"
+ buildChangesetSummary()
+ "
"
+ buildStrategySummary()
+ "
"
+ server
+ "");
validate();
}
/* --------------------------------------------------------------------- */
/* Interface HyperlinkListener
/* --------------------------------------------------------------------- */
@Override
public void hyperlinkUpdate(HyperlinkEvent e) {
if (HyperlinkEvent.EventType.ACTIVATED.equals(e.getEventType())) {
String desc = e.getDescription();
if (desc == null || configHandler == null)
return;
if ("urn:changeset-configuration".equals(desc)) {
configHandler.handleChangesetConfigurationRequest();
} else if ("urn:advanced-configuration".equals(desc)) {
configHandler.handleUploadStrategyConfigurationRequest();
}
}
}
/* --------------------------------------------------------------------- */
/* Interface PropertyChangeListener
/* --------------------------------------------------------------------- */
@Override
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();
}
}
}