001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.gui.io;
003    
004    import java.awt.BorderLayout;
005    import java.util.HashMap;
006    import java.util.Map;
007    import java.util.Observable;
008    import java.util.Observer;
009    
010    import javax.swing.JPanel;
011    import javax.swing.event.TableModelEvent;
012    import javax.swing.event.TableModelListener;
013    
014    import org.openstreetmap.josm.Main;
015    import org.openstreetmap.josm.data.osm.Changeset;
016    import org.openstreetmap.josm.gui.tagging.TagEditorPanel;
017    import org.openstreetmap.josm.gui.tagging.TagModel;
018    import org.openstreetmap.josm.tools.CheckParameterUtil;
019    
020    public class TagSettingsPanel extends JPanel implements TableModelListener {
021    
022        /** checkbox for selecting whether an atomic upload is to be used  */
023        private TagEditorPanel pnlTagEditor;
024        /** the model for the changeset comment */
025        private ChangesetCommentModel changesetCommentModel;
026        /** tags that applied to uploaded changesets by default*/
027        private Map<String, String> defaultTags = new HashMap<String, String>();
028    
029        protected void build() {
030            setLayout(new BorderLayout());
031            add(pnlTagEditor = new TagEditorPanel(null), BorderLayout.CENTER);
032        }
033    
034        /**
035         * Creates a new panel
036         *
037         * @param changesetCommentModel the changeset comment model. Must not be null.
038         * @throws IllegalArgumentException thrown if {@code changesetCommentModel} is null
039         */
040        public TagSettingsPanel(ChangesetCommentModel changesetCommentModel) throws IllegalArgumentException{
041            CheckParameterUtil.ensureParameterNotNull(changesetCommentModel, "changesetCommentModel");
042            this.changesetCommentModel = changesetCommentModel;
043            this.changesetCommentModel.addObserver(new ChangesetCommentObserver());
044            build();
045            pnlTagEditor.getModel().addTableModelListener(this);
046        }
047    
048        /**
049         * Replies the default value for "created_by"
050         *
051         * @return the default value for "created_by"
052         */
053        public static String getDefaultCreatedBy() {
054            Object ua = System.getProperties().get("http.agent");
055            return(ua == null) ? "JOSM" : ua.toString();
056        }
057    
058        protected void setUploadComment(String comment) {
059            if (comment == null) {
060                comment = "";
061            }
062            comment  = comment.trim();
063            String commentInTag = getUploadComment();
064            if (comment.equals(commentInTag))
065                return;
066    
067            if (comment.equals("")) {
068                pnlTagEditor.getModel().delete("comment");
069                return;
070            }
071            TagModel tag = pnlTagEditor.getModel().get("comment");
072            if (tag == null) {
073                tag = new TagModel("comment", comment);
074                pnlTagEditor.getModel().add(tag);
075            } else {
076                pnlTagEditor.getModel().updateTagValue(tag, comment);
077            }
078        }
079    
080        protected String getUploadComment() {
081            TagModel tag = pnlTagEditor.getModel().get("comment");
082            if (tag == null) return null;
083            return tag.getValue();
084        }
085    
086        public void initFromChangeset(Changeset cs) {
087            String currentComment = getUploadComment();
088            Map<String,String> tags = getDefaultTags();
089            if (cs != null) {
090                tags.putAll(cs.getKeys());
091            }
092            if (tags.get("comment") == null) {
093                tags.put("comment", currentComment);
094            }
095            String created_by = tags.get("created_by");
096            if (created_by == null || "".equals(created_by)) {
097                tags.put("created_by", getDefaultCreatedBy());
098            } else if (!created_by.contains(getDefaultCreatedBy())) {
099                tags.put("created_by", created_by + ";" + getDefaultCreatedBy());
100            }
101            pnlTagEditor.getModel().initFromTags(tags);
102        }
103    
104        /**
105         * Replies the map with the current tags in the tag editor model.
106         *
107         * @return the map with the current tags in the tag editor model.
108         */
109        public Map<String,String> getTags() {
110            return pnlTagEditor.getModel().getTags();
111        }
112    
113        public Map<String,String> getDefaultTags() {
114            Map<String,String> tags = new HashMap<String, String>();
115            tags.putAll(defaultTags);
116            return tags;
117        }
118    
119        public void setDefaultTags(Map<String, String> tags) {
120            defaultTags.clear();
121            defaultTags.putAll(tags);
122        }
123    
124        public void startUserInput() {
125            pnlTagEditor.initAutoCompletion(Main.main.getEditLayer());
126        }
127    
128        /* -------------------------------------------------------------------------- */
129        /* Interface TableChangeListener                                              */
130        /* -------------------------------------------------------------------------- */
131        public void tableChanged(TableModelEvent e) {
132            String uploadComment = getUploadComment();
133            changesetCommentModel.setComment(uploadComment);
134        }
135    
136        /**
137         * Observes the changeset comment model and keeps the tag editor in sync
138         * with the current changeset comment
139         *
140         */
141        class ChangesetCommentObserver implements Observer {
142            public void update(Observable o, Object arg) {
143                if (!(o instanceof ChangesetCommentModel)) return;
144                String newValue = (String)arg;
145                String oldValue = getUploadComment();
146                if (oldValue == null) {
147                    oldValue = "";
148                }
149                if (!oldValue.equals(newValue)) {
150                    setUploadComment((String)arg);
151                }
152            }
153        }
154    }