/*******************************************************************************
* Copyright (c) 2001, 2010 Mathew A. Nelson and Robocode contributors
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://robocode.sourceforge.net/license/epl-v10.html
*
* Contributors:
* Pavel Savara
* - Initial implementation
*******************************************************************************/
package net.sf.robocode.ui.dialog;
import net.sf.robocode.ui.IWindowManager;
import net.sf.robocode.ui.IWindowManagerExt;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;
import java.awt.*;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
/**
* @author Pavel Savara (original)
*/
@SuppressWarnings("serial")
public abstract class BaseScoreDialog extends JDialog {
protected final IWindowManagerExt windowManager;
private final EventHandler eventHandler = new EventHandler();
protected JPanel contentPane;
protected JScrollPane scrollPane;
protected JTable table;
protected Dimension tableSize;
public BaseScoreDialog(IWindowManager windowManager, boolean modal) {
// In order to prevent the dialog from hiding, null must be given as 'owner' parameter
super(windowManager != null ? windowManager.getRobocodeFrame() : null, modal);
this.windowManager = (IWindowManagerExt) windowManager;
}
protected void initialize() {
addComponentListener(eventHandler);
setContentPane(getDialogContentPane());
}
/**
* Return the content pane.
*
* @return JPanel
*/
protected JPanel getDialogContentPane() {
if (contentPane == null) {
contentPane = new JPanel();
contentPane.setLayout(new BorderLayout());
contentPane.add(getScrollPane(), "Center");
}
return contentPane;
}
/**
* Return the scroll pane
*
* @return JScrollPane
*/
protected JScrollPane getScrollPane() {
if (scrollPane == null) {
scrollPane = new JScrollPane();
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrollPane.getViewport().setScrollMode(JViewport.BLIT_SCROLL_MODE);
scrollPane.setViewportView(getTable());
scrollPane.setColumnHeaderView(table.getTableHeader());
scrollPane.addComponentListener(eventHandler);
tableSize = new Dimension(getTable().getColumnModel().getTotalColumnWidth(),
getTable().getModel().getRowCount() * (getTable().getRowHeight()));
table.setPreferredScrollableViewportSize(tableSize);
table.setPreferredSize(tableSize);
table.setMinimumSize(tableSize);
}
return scrollPane;
}
/**
* Return the table.
*
* @return JTable
*/
protected JTable getTable() {
if (table == null) {
table = new JTable();
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.setColumnSelectionAllowed(true);
table.setRowSelectionAllowed(true);
table.getTableHeader().setReorderingAllowed(false);
}
return table;
}
private class EventHandler implements ComponentListener {
public void componentShown(ComponentEvent e) {
onDialogShown();
}
public void componentHidden(ComponentEvent e) {
onDialogHidden();
}
public void componentResized(ComponentEvent e) {
if (e.getSource() == BaseScoreDialog.this.getScrollPane()) {
scrollPaneComponentResized();
}
}
public void componentMoved(ComponentEvent e) {}
}
protected abstract AbstractTableModel getTableModel();
protected void onDialogShown() {}
protected void onDialogHidden() {
dispose();
}
protected void scrollPaneComponentResized() {
// This code is not working...
Dimension scrollPaneExtent = getScrollPane().getViewport().getExtentSize();
if (tableSize != null && (tableSize.width < scrollPaneExtent.width)) {
getTable().setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
getTable().setSize(scrollPaneExtent);
getTable().sizeColumnsToFit(-1);
} else {
if (tableSize != null) {
getTable().setSize(tableSize);
getTable().sizeColumnsToFit(-1);
}
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
}
validate();
repaint();
}
protected void setResultsData() {
getTable().setModel(getTableModel());
int maxScoreColWidth = 0;
for (int x = 0; x < getTableModel().getColumnCount(); x++) {
if (x != 1) {
getTable().getColumnModel().getColumn(x).setCellRenderer(new ResultsTableCellRenderer(false));
}
TableColumn column = getTable().getColumnModel().getColumn(x);
Component comp;
column.setHeaderRenderer(new ResultsTableCellRenderer(true));
comp = column.getHeaderRenderer().getTableCellRendererComponent(null, column.getHeaderValue(), false, false,
0, 0);
int width = comp.getPreferredSize().width;
for (int y = 0; y < getTableModel().getRowCount(); y++) {
comp = getTable().getDefaultRenderer(getTableModel().getColumnClass(x)).getTableCellRendererComponent(
getTable(), getTableModel().getValueAt(y, x), false, false, 0, x);
if (comp.getPreferredSize().width > width) {
width = comp.getPreferredSize().width;
}
}
TableColumn col = getTable().getColumnModel().getColumn(x);
col.setPreferredWidth(width);
col.setMinWidth(width);
col.setWidth(width);
if (x >= 3 && width > maxScoreColWidth) {
maxScoreColWidth = width;
}
}
}
}