// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.opendata.core.gui; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.SwingConstants; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkEvent.EventType; import javax.swing.event.HyperlinkListener; import org.openstreetmap.josm.gui.widgets.HtmlPanel; import org.openstreetmap.josm.gui.widgets.VerticallyScrollablePanel; import org.openstreetmap.josm.plugins.opendata.core.modules.ModuleInformation; import org.openstreetmap.josm.tools.OpenBrowser; /** * TODO * */ public class ModuleListPanel extends VerticallyScrollablePanel { private ModulePreferencesModel model; public ModuleListPanel() { model = new ModulePreferencesModel(); setLayout(new GridBagLayout()); } public ModuleListPanel(ModulePreferencesModel model) { this.model = model; setLayout(new GridBagLayout()); } protected String formatModuleRemoteVersion(ModuleInformation pi) { StringBuilder sb = new StringBuilder(); if (pi.version == null || pi.version.trim().equals("")) { sb.append(tr("unknown")); } else { sb.append(pi.version); } return sb.toString(); } protected String formatModuleLocalVersion(ModuleInformation pi) { if (pi == null) return tr("unknown"); if (pi.localversion == null || pi.localversion.trim().equals("")) return tr("unknown"); return pi.localversion; } protected String formatCheckboxTooltipText(ModuleInformation pi) { if (pi == null) return ""; if (pi.downloadlink == null) return tr("Module bundled with opendata plugin"); else return pi.downloadlink; } public void displayEmptyModuleListInformation() { GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.anchor = GridBagConstraints.CENTER; gbc.fill = GridBagConstraints.BOTH; gbc.insets = new Insets(40, 0, 40, 0); gbc.weightx = 1.0; gbc.weighty = 1.0; HtmlPanel hint = new HtmlPanel(); hint.setText("<html>" + tr("Please click on <strong>Download list</strong> to download and display a list of available modules.") + "</html>" ); add(hint, gbc); } public void refreshView() { List<ModuleInformation> displayedModules = model.getDisplayedModules(); removeAll(); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.anchor = GridBagConstraints.NORTHWEST; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 1.0; if (displayedModules.isEmpty()) { displayEmptyModuleListInformation(); return; } int row = -1; for (final ModuleInformation pi : displayedModules) { boolean selected = model.isSelectedModule(pi.getName()); String remoteversion = formatModuleRemoteVersion(pi); String localversion = formatModuleLocalVersion(model.getModuleInformation(pi.getName())); final JCheckBox cbModule = new JCheckBox(); cbModule.setSelected(selected); cbModule.setToolTipText(formatCheckboxTooltipText(pi)); cbModule.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { model.setModuleSelected(pi.getName(), cbModule.isSelected()); } }); JLabel lblModule = new JLabel( tr("{0}: Version {1} (local: {2})", pi.getName(), remoteversion, localversion), pi.getScaledIcon(), SwingConstants.LEFT); gbc.gridx = 0; gbc.gridy = ++row; gbc.insets = new Insets(5, 5, 0, 5); gbc.weighty = 0.0; gbc.weightx = 0.0; add(cbModule, gbc); gbc.gridx = 1; gbc.weightx = 1.0; add(lblModule, gbc); HtmlPanel description = new HtmlPanel(); description.setText(pi.getDescriptionAsHtml()); description.getEditorPane().addHyperlinkListener(new HyperlinkListener() { @Override public void hyperlinkUpdate(HyperlinkEvent e) { if (e.getEventType() == EventType.ACTIVATED) { OpenBrowser.displayUrl(e.getURL().toString()); } } }); gbc.gridx = 1; gbc.gridy = ++row; gbc.insets = new Insets(3, 25, 5, 5); gbc.weighty = 1.0; add(description, gbc); } revalidate(); repaint(); } }