/*
* Copyright 2008-2014 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 static net.bull.javamelody.HttpParameters.PERIOD_PARAMETER;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingUtilities;
import net.bull.javamelody.swing.util.MSwingUtilities;
/**
* Panel principal.
* @author Emeric Vernat
*/
class MainPanel extends MelodyPanel {
private static final Color BACKGROUND = Color.decode("#E6E6E6");
private static final long serialVersionUID = 1L;
private final TabbedPane tabbedPane = new TabbedPane();
private final URL monitoringUrl;
@SuppressWarnings("all")
private final List<URL> initialURLs;
private final JScrollPane scrollPane;
private Range selectedRange;
private final boolean collectorServer;
MainPanel(RemoteCollector remoteCollector, Range selectedRange, boolean collectorServer)
throws IOException {
super(remoteCollector);
this.collectorServer = collectorServer;
// initialURLs avant setSelectedRange
this.initialURLs = remoteCollector.getURLs();
final String collectorUrl = initialURLs.get(0).toExternalForm();
this.monitoringUrl = new URL(collectorUrl.substring(0, collectorUrl.indexOf('?')));
setSelectedRange(selectedRange);
CounterStorage.disableStorage();
remoteCollector.disableAggregation();
remoteCollector.collectDataIncludingCurrentRequests();
scrollPane = new JScrollPane();
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.getVerticalScrollBar().setUnitIncrement(20);
final JPanel mainTabPanel = new JPanel(new BorderLayout());
mainTabPanel.setOpaque(false);
final MainButtonsPanel mainButtonsPanel = new MainButtonsPanel(remoteCollector,
getSelectedRange(), monitoringUrl, collectorServer);
mainTabPanel.add(mainButtonsPanel, BorderLayout.NORTH);
mainTabPanel.add(scrollPane, BorderLayout.CENTER);
tabbedPane.addTab(getString("Tableau_de_bord"), mainTabPanel);
tabbedPane.setTabComponentAt(0, null);
add(tabbedPane, BorderLayout.CENTER);
refreshMainTab();
}
private void refreshMainTab() {
final int position = scrollPane.getVerticalScrollBar().getValue();
final ScrollingPanel scrollingPanel = new ScrollingPanel(getRemoteCollector(),
getSelectedRange(), monitoringUrl, collectorServer);
final TabbedPane finalTabbedPane = tabbedPane;
final JScrollPane finalScrollPane = scrollPane;
// le clique droit sur le panel principal fonctionne comme sur les autres panels du TabbedPane
// (malgré le scrollPane du panel principal)
scrollingPanel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent event) {
// we only look at the right button
if (SwingUtilities.isRightMouseButton(event)) {
final Point viewPosition = finalScrollPane.getViewport().getViewPosition();
final int x = event.getX() - viewPosition.x + finalScrollPane.getX()
+ finalScrollPane.getParent().getX() + 3;
final int y = event.getY() - viewPosition.y + finalScrollPane.getY()
+ finalScrollPane.getParent().getY() + 3;
final MouseEvent newEvent = new MouseEvent(finalTabbedPane, event.getID(),
event.getWhen(), event.getModifiersEx(), x, y, event.getXOnScreen(),
event.getYOnScreen(), event.getClickCount(), event.isPopupTrigger(),
event.getButton());
finalTabbedPane.processMouseEvent(newEvent);
}
}
});
scrollPane.setViewportView(scrollingPanel);
scrollPane.getVerticalScrollBar().setValue(position);
// cette récupération du focus dans le panel du scrollPane permet d'utiliser les flèches hauts et bas
// pour scroller dès l'affichage du panel
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
scrollingPanel.requestFocus();
}
});
}
private void addOnglet(JPanel panel) {
tabbedPane.addTab(panel.getName(), panel);
tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1);
}
final Range getSelectedRange() {
return selectedRange;
}
final void setSelectedRange(Range selectedRange) throws IOException {
this.selectedRange = selectedRange;
final List<URL> newUrls = new ArrayList<>(initialURLs.size());
for (final URL url : initialURLs) {
final URL newUrl = new URL(url.toString() + '&' + PERIOD_PARAMETER + '='
+ selectedRange.getValue());
newUrls.add(newUrl);
}
getRemoteCollector().setURLs(newUrls);
}
void changeRange(Range newRange) {
final Range currentRange = getSelectedRange();
try {
setSelectedRange(newRange);
getRemoteCollector().collectDataIncludingCurrentRequests();
refreshMainTab();
} catch (final IOException e) {
showException(e);
// si le changement de période n'a pas abouti, alors on remet l'ancienne période
try {
setSelectedRange(currentRange);
} catch (final IOException e2) {
showException(e2);
}
}
}
static MainPanel getParentMainPanelFromChild(Component child) {
return MSwingUtilities.getAncestorOfClass(MainPanel.class, child);
}
static void refreshMainTabFromChild(Component child) {
final MainPanel mainPanel = getParentMainPanelFromChild(child);
mainPanel.refreshMainTab();
}
static void addOngletFromChild(Component child, JPanel panel) {
panel.setOpaque(true);
panel.setBackground(BACKGROUND);
panel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
final MainPanel mainPanel = getParentMainPanelFromChild(child);
mainPanel.addOnglet(panel);
}
}