8134731: Function.prototype.apply interacts incorrectly with arguments
Reviewed-by: attila, hannesw
/*
* Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package sun.tools.jconsole;
import java.awt.*;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.border.*;
@SuppressWarnings("serial")
class OverviewTab extends Tab {
JPanel gridPanel;
TimeComboBox timeComboBox;
public static String getTabName() {
return Messages.OVERVIEW;
}
public OverviewTab(VMPanel vmPanel) {
super(vmPanel, getTabName());
setBorder(new EmptyBorder(4, 4, 3, 4));
setLayout(new BorderLayout());
JPanel topPanel = new JPanel(new BorderLayout());
add(topPanel, BorderLayout.NORTH);
JPanel controlPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 20, 5));
topPanel.add(controlPanel, BorderLayout.CENTER);
timeComboBox = new TimeComboBox();
LabeledComponent lc = new LabeledComponent(Messages.TIME_RANGE_COLON,
Resources.getMnemonicInt(Messages.TIME_RANGE_COLON),
timeComboBox);
controlPanel.add(lc);
gridPanel = new JPanel(new AutoGridLayout(10, 6));
gridPanel.setBorder(null);
JScrollPane sp = new JScrollPane(gridPanel);
sp.setBorder(null);
sp.setViewportBorder(null);
add(sp, BorderLayout.CENTER);
// Note that panels are added on first update
}
public SwingWorker<?, ?> newSwingWorker() {
return new SwingWorker<Object, Object>() {
public Object doInBackground() {
return null;
}
protected void done() {
if (gridPanel.getComponentCount() == 0) {
final ArrayList<Plotter> plotters = new ArrayList<Plotter>();
for (Tab tab : vmPanel.getTabs()) {
OverviewPanel[] ops = tab.getOverviewPanels();
if (ops != null) {
for (OverviewPanel op : ops) {
gridPanel.add(op);
Plotter plotter = op.getPlotter();
if (plotter != null) {
plotters.add(plotter);
timeComboBox.addPlotter(plotter);
}
}
}
}
if (plotters.size() > 0) {
workerAdd(new Runnable() {
public void run() {
ProxyClient proxyClient = vmPanel.getProxyClient();
for (Plotter plotter : plotters) {
proxyClient.addWeakPropertyChangeListener(plotter);
}
}
});
}
if (getParent() instanceof JTabbedPane) {
Utilities.updateTransparency((JTabbedPane)getParent());
}
}
}
};
}
private class AutoGridLayout extends GridLayout {
public AutoGridLayout(int hGap, int vGap) {
super(0, 1, hGap, vGap);
}
public Dimension preferredLayoutSize(Container parent) {
return minimumLayoutSize(parent);
}
public Dimension minimumLayoutSize(Container parent) {
updateColumns(parent);
return super.minimumLayoutSize(parent);
}
private void updateColumns(Container parent) {
// Use the outer panel width, not the scrolling gridPanel
int parentWidth = OverviewTab.this.getWidth();
int columnWidth = 1;
for (Component c : parent.getComponents()) {
columnWidth = Math.max(columnWidth, c.getPreferredSize().width);
}
int n = parent.getComponentCount();
int maxCols = Math.min(n, parentWidth / columnWidth);
for (int columns = maxCols; columns >= 1; columns--) {
if (columns == 1) {
setColumns(maxCols);
} else if ((n % columns) == 0) {
setColumns(columns);
break;
}
}
}
}
}