// GameTreeViewer.java
package net.sf.gogui.gui;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JDialog;
import javax.swing.JScrollPane;
import javax.swing.JViewport;
import net.sf.gogui.game.ConstNode;
import net.sf.gogui.game.ConstGameTree;
import static net.sf.gogui.gui.I18n.i18n;
import net.sf.gogui.util.Platform;
/** Dialog for displaying the game tree. */
public class GameTreeViewer
extends JDialog
{
/** Callback for events generated by GameTreeViewer. */
public interface Listener
{
void actionGotoNode(ConstNode node);
}
public GameTreeViewer(Frame owner, Listener listener,
MessageDialogs messageDialogs)
{
super(owner, i18n("TIT_TREE"));
Container contentPane = getContentPane();
m_panel = new GameTreePanel(this, listener,
GameTreePanel.Label.NUMBER,
GameTreePanel.Size.NORMAL,
messageDialogs);
m_scrollPane =
new JScrollPane(m_panel,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
if (Platform.isMac())
// Default Apple L&F uses no border, but Quaqua 3.7.4 does
m_scrollPane.setBorder(null);
GuiUtil.removeKeyBinding(m_scrollPane, "control END");
KeyAdapter keyAdapter = new KeyAdapter()
{
public void keyReleased(KeyEvent e)
{
int c = e.getKeyCode();
int mod = e.getModifiers();
if ((mod & m_shortcut) == 0)
{
if (c == KeyEvent.VK_HOME)
scrollToCurrent();
return;
}
boolean shift = ((mod & ActionEvent.SHIFT_MASK) != 0);
if (c == KeyEvent.VK_ENTER && ! shift)
m_panel.showPopup();
}
private final int m_shortcut
= Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
};
m_scrollPane.addKeyListener(keyAdapter);
m_panel.setScrollPane(m_scrollPane);
m_scrollPane.setFocusable(true);
m_scrollPane.setFocusTraversalKeysEnabled(false);
JViewport viewport = m_scrollPane.getViewport();
viewport.setBackground(GameTreePanel.BACKGROUND);
contentPane.add(m_scrollPane, BorderLayout.CENTER);
viewport.setFocusTraversalKeysEnabled(false);
setFocusTraversalKeysEnabled(false);
addWindowListener(new WindowAdapter() {
public void windowActivated(WindowEvent e) {
m_scrollPane.requestFocusInWindow();
}
});
setMinimumSize(new Dimension(128, 96));
pack();
}
public void addNewSingleChild(ConstNode node)
{
m_panel.addNewSingleChild(node);
}
public void redrawCurrentNode()
{
m_panel.redrawCurrentNode();
}
public void scrollToCurrent()
{
m_panel.scrollToCurrent();
}
public void setLabelMode(GameTreePanel.Label mode)
{
m_panel.setLabelMode(mode);
}
public void setSizeMode(GameTreePanel.Size mode)
{
m_panel.setSizeMode(mode);
}
public void setShowSubtreeSizes(boolean enable)
{
m_panel.setShowSubtreeSizes(enable);
}
public void update(ConstGameTree gameTree, ConstNode currentNode)
{
Dimension size = m_scrollPane.getViewport().getSize();
m_panel.update(gameTree, currentNode, size.width, size.height);
repaint();
}
public void update(ConstNode currentNode)
{
Dimension size = m_scrollPane.getViewport().getSize();
m_panel.update(currentNode, size.width, size.height);
}
private final GameTreePanel m_panel;
private final JScrollPane m_scrollPane;
}