package nanolog; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.Rectangle; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import javax.swing.AbstractListModel; import javax.swing.JList; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.gui.dialogs.ToggleDialog; import org.openstreetmap.josm.gui.layer.Layer; import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent; import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener; import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent; import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent; import nanolog.NanoLogLayer.NanoLogLayerListener; /** * NanoLog Panel. Displays the selected log item, along with surrounding 30-50 lines. * * @author zverik */ public class NanoLogPanel extends ToggleDialog implements LayerChangeListener, NanoLogLayerListener { private JList<String> logPanel; private LogListModel listModel; public NanoLogPanel() { super(tr("NanoLog"), "nanolog", tr("Open NanoLog panel"), null, 150, false); listModel = new LogListModel(); logPanel = new JList<>(listModel); createLayout(logPanel, true, null); } public void updateMarkers() { List<NanoLogEntry> entries = new ArrayList<>(); for (NanoLogLayer l : Main.getLayerManager().getLayersOfType(NanoLogLayer.class)) { entries.addAll(l.getEntries()); } listModel.setEntries(entries); } @Override public void layerOrderChanged(LayerOrderChangeEvent e) { } @Override public void layerAdded(LayerAddEvent e) { Layer newLayer = e.getAddedLayer(); if (newLayer instanceof NanoLogLayer) ((NanoLogLayer) newLayer).addListener(this); updateMarkers(); } @Override public void layerRemoving(LayerRemoveEvent e) { updateMarkers(); } @Override public void markersUpdated(NanoLogLayer layer) { updateMarkers(); } @Override public void markerActivated(NanoLogLayer layer, NanoLogEntry entry) { int idx = entry == null ? -1 : listModel.find(entry); if (idx >= 0) { logPanel.setSelectedIndex(idx); Rectangle rect = logPanel.getCellBounds(Math.max(0, idx-2), Math.min(idx+4, listModel.getSize())); logPanel.scrollRectToVisible(rect); } } private class LogListModel extends AbstractListModel<String> { private List<NanoLogEntry> entries; private final SimpleDateFormat TIME_FORMAT = new SimpleDateFormat("HH:mm:ss"); @Override public int getSize() { return entries.size(); } @Override public String getElementAt(int index) { return TIME_FORMAT.format(entries.get(index).getTime()) + " " + entries.get(index).getMessage(); } public void setEntries(List<NanoLogEntry> entries) { this.entries = entries; fireContentsChanged(this, 0, entries.size()); } public int find(NanoLogEntry entry) { return entries.indexOf(entry); } } }