// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.io;
import java.awt.BorderLayout;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JPanel;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.osm.Changeset;
import org.openstreetmap.josm.gui.tagging.TagEditorPanel;
import org.openstreetmap.josm.gui.tagging.TagModel;
import org.openstreetmap.josm.tools.CheckParameterUtil;
public class TagSettingsPanel extends JPanel implements TableModelListener {
/** checkbox for selecting whether an atomic upload is to be used */
private TagEditorPanel pnlTagEditor;
/** the model for the changeset comment */
private ChangesetCommentModel changesetCommentModel;
protected void build() {
setLayout(new BorderLayout());
add(pnlTagEditor = new TagEditorPanel(), BorderLayout.CENTER);
}
/**
* Creates a new panel
*
* @param changesetCommentModel the changeset comment model. Must not be null.
* @throws IllegalArgumentException thrown if {@code changesetCommentModel} is null
*/
public TagSettingsPanel(ChangesetCommentModel changesetCommentModel) throws IllegalArgumentException{
CheckParameterUtil.ensureParameterNotNull(changesetCommentModel, "changesetCommentModel");
this.changesetCommentModel = changesetCommentModel;
this.changesetCommentModel.addObserver(new ChangesetCommentObserver());
build();
pnlTagEditor.getModel().addTableModelListener(this);
}
/**
* Replies the default value for "created_by"
*
* @return the default value for "created_by"
*/
protected String getDefaultCreatedBy() {
Object ua = System.getProperties().get("http.agent");
return(ua == null) ? "JOSM" : ua.toString();
}
protected void setUploadComment(String comment) {
if (comment == null) {
comment = "";
}
comment = comment.trim();
String commentInTag = getUploadComment();
if (comment.equals(commentInTag))
return;
if (comment.equals("")) {
pnlTagEditor.getModel().delete("comment");
return;
}
TagModel tag = pnlTagEditor.getModel().get("comment");
if (tag == null) {
tag = new TagModel("comment", comment);
pnlTagEditor.getModel().add(tag);
} else {
pnlTagEditor.getModel().updateTagValue(tag, comment);
}
}
protected String getUploadComment() {
TagModel tag = pnlTagEditor.getModel().get("comment");
if (tag == null) return null;
return tag.getValue();
}
protected void initNewChangeset() {
String currentComment = getUploadComment();
pnlTagEditor.getModel().clear();
if (currentComment != null) {
pnlTagEditor.getModel().add("comment", currentComment);
}
pnlTagEditor.getModel().add("created_by", getDefaultCreatedBy());
}
protected void initFromExistingChangeset(Changeset cs) {
String currentComment = getUploadComment();
Map<String,String> tags = cs.getKeys();
if (tags.get("comment") == null) {
tags.put("comment", currentComment);
}
tags.put("created_by", getDefaultCreatedBy());
pnlTagEditor.getModel().initFromTags(tags);
}
public void initFromChangeset(Changeset cs) {
if (cs == null) {
initNewChangeset();
} else {
initFromExistingChangeset(cs);
}
}
/**
* Replies the map with the current tags in the tag editor model.
*
* @return the map with the current tags in the tag editor model.
*/
public Map<String,String> getTags() {
return pnlTagEditor.getModel().getTags();
}
public void startUserInput() {
pnlTagEditor.initAutoCompletion(Main.main.getEditLayer());
}
/* -------------------------------------------------------------------------- */
/* Interface TableChangeListener */
/* -------------------------------------------------------------------------- */
public void tableChanged(TableModelEvent e) {
String uploadComment = getUploadComment();
changesetCommentModel.setComment(uploadComment);
}
/**
* Observes the changeset comment model and keeps the tag editor in sync
* with the current changeset comment
*
*/
class ChangesetCommentObserver implements Observer {
public void update(Observable o, Object arg) {
if (!(o instanceof ChangesetCommentModel)) return;
String newValue = (String)arg;
String oldValue = getUploadComment();
if (oldValue == null) {
oldValue = "";
}
if (!oldValue.equals(newValue)) {
setUploadComment((String)arg);
}
}
}
}