001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.gui.history; 003 004 import java.awt.BorderLayout; 005 import java.awt.GridBagConstraints; 006 import java.awt.GridBagLayout; 007 import java.awt.GridLayout; 008 009 import static org.openstreetmap.josm.tools.I18n.tr; 010 011 import java.io.UnsupportedEncodingException; 012 import java.net.URLEncoder; 013 import java.text.DateFormat; 014 import java.util.Observable; 015 import java.util.Observer; 016 017 import javax.swing.JLabel; 018 import javax.swing.JPanel; 019 020 import org.openstreetmap.josm.Main; 021 import org.openstreetmap.josm.actions.AbstractInfoAction; 022 import org.openstreetmap.josm.data.osm.OsmPrimitive; 023 import org.openstreetmap.josm.data.osm.User; 024 import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive; 025 import org.openstreetmap.josm.gui.JMultilineLabel; 026 import org.openstreetmap.josm.gui.JosmUserIdentityManager; 027 import org.openstreetmap.josm.gui.layer.OsmDataLayer; 028 import org.openstreetmap.josm.tools.CheckParameterUtil; 029 import org.openstreetmap.josm.tools.UrlLabel; 030 031 /** 032 * VersionInfoPanel is an UI component which displays the basic properties of a version 033 * of a {@link OsmPrimitive}. 034 * 035 */ 036 public class VersionInfoPanel extends JPanel implements Observer{ 037 private PointInTimeType pointInTimeType; 038 private HistoryBrowserModel model; 039 private JMultilineLabel lblInfo; 040 private UrlLabel lblUser; 041 private UrlLabel lblChangeset; 042 private JPanel pnlUserAndChangeset; 043 044 protected void build() { 045 JPanel pnl1 = new JPanel(); 046 pnl1.setLayout(new BorderLayout()); 047 lblInfo = new JMultilineLabel(""); 048 //lblInfo.setHorizontalAlignment(JLabel.LEFT); 049 pnl1.add(lblInfo, BorderLayout.CENTER); 050 051 pnlUserAndChangeset = new JPanel(); 052 pnlUserAndChangeset.setLayout(new GridLayout(2,2)); 053 lblUser = new UrlLabel("", 2); 054 pnlUserAndChangeset.add(new JLabel(tr("User:"))); 055 pnlUserAndChangeset.add(lblUser); 056 pnlUserAndChangeset.add(new JLabel(tr("Changeset:"))); 057 lblChangeset = new UrlLabel("", 2); 058 pnlUserAndChangeset.add(lblChangeset); 059 060 setLayout(new GridBagLayout()); 061 GridBagConstraints gc = new GridBagConstraints(); 062 gc.anchor = GridBagConstraints.NORTHWEST; 063 gc.fill = GridBagConstraints.HORIZONTAL; 064 gc.weightx = 1.0; 065 gc.weighty = 1.0; 066 add(pnl1, gc); 067 gc.gridy = 1; 068 gc.weighty = 0.0; 069 add(pnlUserAndChangeset, gc); 070 } 071 072 protected HistoryOsmPrimitive getPrimitive() { 073 if (model == null || pointInTimeType == null) 074 return null; 075 return model.getPointInTime(pointInTimeType); 076 } 077 078 protected OsmDataLayer getEditLayer() { 079 try { 080 return Main.map.mapView.getEditLayer(); 081 } catch(NullPointerException e) { 082 return null; 083 } 084 } 085 086 protected String getInfoText() { 087 HistoryOsmPrimitive primitive = getPrimitive(); 088 if (primitive == null) 089 return ""; 090 String text; 091 if (model.isLatest(primitive)) { 092 text = tr("<html>Version <strong>{0}</strong> currently edited in layer ''{1}''</html>", 093 Long.toString(primitive.getVersion()), 094 getEditLayer() == null ? tr("unknown") : getEditLayer().getName() 095 ); 096 } else { 097 text = tr( 098 "<html>Version <strong>{0}</strong> created on <strong>{1}</strong></html>", 099 Long.toString(primitive.getVersion()), 100 DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(primitive.getTimestamp()) 101 ); 102 } 103 return text; 104 } 105 106 public VersionInfoPanel() { 107 pointInTimeType = null; 108 model = null; 109 build(); 110 } 111 112 /** 113 * constructor 114 * 115 * @param model the model (must not be null) 116 * @param pointInTimeType the point in time this panel visualizes (must not be null) 117 * @exception IllegalArgumentException thrown, if model is null 118 * @exception IllegalArgumentException thrown, if pointInTimeType is null 119 * 120 */ 121 public VersionInfoPanel(HistoryBrowserModel model, PointInTimeType pointInTimeType) throws IllegalArgumentException { 122 CheckParameterUtil.ensureParameterNotNull(pointInTimeType, "pointInTimeType"); 123 CheckParameterUtil.ensureParameterNotNull(model, "model"); 124 125 this.model = model; 126 this.pointInTimeType = pointInTimeType; 127 model.addObserver(this); 128 build(); 129 } 130 131 public void update(Observable o, Object arg) { 132 lblInfo.setText(getInfoText()); 133 134 if (!model.isLatest(getPrimitive())) { 135 String url = AbstractInfoAction.getBaseBrowseUrl() + "/changeset/" + getPrimitive().getChangesetId(); 136 lblChangeset.setUrl(url); 137 lblChangeset.setDescription(Long.toString(getPrimitive().getChangesetId())); 138 139 try { 140 if (getPrimitive().getUser() != null && getPrimitive().getUser() != User.getAnonymous()) { 141 url = AbstractInfoAction.getBaseUserUrl() + "/" + URLEncoder.encode(getPrimitive().getUser().getName(), "UTF-8").replaceAll("\\+", "%20"); 142 lblUser.setUrl(url); 143 } else { 144 lblUser.setUrl(null); 145 } 146 } catch(UnsupportedEncodingException e) { 147 e.printStackTrace(); 148 lblUser.setUrl(null); 149 } 150 String username = ""; 151 if (getPrimitive().getUser() != null) { 152 username = getPrimitive().getUser().getName(); 153 } 154 lblUser.setDescription(username); 155 } else { 156 String user = JosmUserIdentityManager.getInstance().getUserName(); 157 if (user == null) { 158 lblUser.setDescription(tr("anonymous")); 159 lblUser.setUrl(null); 160 } else { 161 try { 162 String url = AbstractInfoAction.getBaseUserUrl() + "/" + URLEncoder.encode(user, "UTF-8").replaceAll("\\+", "%20"); 163 lblUser.setUrl(url); 164 } catch(UnsupportedEncodingException e) { 165 e.printStackTrace(); 166 lblUser.setUrl(null); 167 } 168 lblUser.setDescription(user); 169 } 170 lblChangeset.setDescription(tr("none")); 171 lblChangeset.setUrl(null); 172 } 173 } 174 }