/* * Copyright 2008-2017 by Emeric Vernat * * This file is part of Java Melody. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.bull.javamelody; import java.awt.Component; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JPanel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import net.bull.javamelody.swing.MButton; import net.bull.javamelody.swing.Utilities; import net.bull.javamelody.swing.table.MTable; /** * Panel parent de CounterRequestDetailTablePanel et CounterRequestUsagesPanel. * @author Emeric Vernat */ abstract class CounterRequestAbstractPanel extends MelodyPanel { private static final long serialVersionUID = 1L; private static final Map<String, ImageIcon> ICON_BY_NAME = new HashMap<>(); @SuppressWarnings("all") private final List<Counter> counters; private final MTable<CounterRequest> table; CounterRequestAbstractPanel(RemoteCollector remoteCollector) { this(remoteCollector, new CounterRequestTable(remoteCollector)); } CounterRequestAbstractPanel(RemoteCollector remoteCollector, CounterRequestTable table) { super(remoteCollector); // comme dans ScrollingPanel, on ne peut utiliser collector.getRangeCountersToBeDisplayed(range), // en revanche collector.getCounters() contient ici les bonnes données this.counters = getCollector().getCounters(); this.table = table; } protected JPanel createButtonsPanel(boolean includeUsagesButton) { final MButton openButton = new MButton(getString("Ouvrir"), ImageIconCache.getImageIcon("action_open.png")); openButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { final CounterRequest counterRequest = getTable().getSelectedObject(); try { showRequestDetail(counterRequest); } catch (final IOException ex) { showException(ex); } } }); table.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { openButton.doClick(); } } }); table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { final CounterRequest counterRequest = getTable().getSelectedObject(); openButton.setEnabled(counterRequest != null); } }); openButton.setEnabled(false); if (includeUsagesButton) { final MButton usagesButton = new MButton(getString("Chercher_utilisations"), ImageIconCache.getImageIcon("find.png")); usagesButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { final CounterRequest counterRequest = getTable().getSelectedObject(); showRequestUsages(counterRequest); } }); table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { final CounterRequest counterRequest = getTable().getSelectedObject(); usagesButton.setEnabled( counterRequest != null && doesRequestDisplayUsages(counterRequest)); } }); usagesButton.setEnabled(false); return Utilities.createButtonsPanel(openButton, usagesButton); } return Utilities.createButtonsPanel(openButton); } final Counter getCounterByRequestId(CounterRequest counterRequest) { if (counterRequest == null) { return null; } return getCollector().getCounterByRequestId(counterRequest); } final boolean doesRequestDisplayUsages(CounterRequest counterRequest) { final Counter parentCounter = getCounterByRequestId(counterRequest); return parentCounter != null && !parentCounter.isErrorCounter() && !Counter.HTTP_COUNTER_NAME.equals(parentCounter.getName()); } final MTable<CounterRequest> getTable() { return table; } final List<Counter> getCounters() { return counters; } final void showRequestDetail(CounterRequest counterRequest) throws IOException { final CounterRequestDetailPanel panel = new CounterRequestDetailPanel(getRemoteCollector(), counterRequest); MainPanel.addOngletFromChild(this, panel); } final void showRequestUsages(CounterRequest counterRequest) { final CounterRequestUsagesPanel panel = new CounterRequestUsagesPanel(getRemoteCollector(), counterRequest); MainPanel.addOngletFromChild(this, panel); } static Icon getCounterIcon(Counter counter, final int margin) { if (counter == null || counter.getIconName() == null) { return null; } final String iconName = counter.getIconName(); ImageIcon iconWithoutMargin = ICON_BY_NAME.get(iconName); if (iconWithoutMargin == null) { iconWithoutMargin = ImageIconCache.getScaledImageIcon(iconName, 16, 16); ICON_BY_NAME.put(iconName, iconWithoutMargin); } final ImageIcon counterIcon = iconWithoutMargin; final Icon icon; if (margin == 0) { icon = counterIcon; } else { // ajoute une marge à gauche de l'icône icon = new Icon() { @Override public void paintIcon(Component c, Graphics g, int x, int y) { g.drawImage(counterIcon.getImage(), margin + x, y, null); } @Override public int getIconWidth() { return counterIcon.getIconWidth() + margin; } @Override public int getIconHeight() { return counterIcon.getIconHeight(); } }; } return icon; } }