/* This file is part of the Joshua Machine Translation System.
*
* Joshua is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package joshua.ui.tree_visualizer.browser;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import joshua.ui.tree_visualizer.DerivationTree;
import joshua.ui.tree_visualizer.DerivationTreeEdge;
import joshua.ui.tree_visualizer.DerivationTreeTransformer;
import joshua.ui.tree_visualizer.DerivationViewer;
import joshua.ui.tree_visualizer.Node;
import edu.uci.ics.jung.algorithms.layout.StaticLayout;
/**
* A frame that displays a derivation tree.
*
* @author jonny
*
*/
class DerivationTreeFrame extends JFrame {
/**
* Eclipse seems to think serialVersionUID is important. I don't know why.
*/
private static final long serialVersionUID = -3173826443907629130L;
/**
* A button to move to the next source-side sentence in the file.
*/
JButton nextSource;
/**
* A button to move to the previous source-side sentence in the file.
*/
JButton previousSource;
/**
* A button to show or hide extra information about the derivation.
*/
private JButton informationButton;
/**
* A panel holding the extra information about the derivation.
*/
private JPanel informationPanel;
/**
* A label holding the current source sentence.
*/
private JLabel sourceLabel;
/**
* A label holding the reference translation of the current source sentence.
*/
private JLabel referenceLabel;
/**
* A label holding the one-best translation of the current source sentence.
*/
private JLabel oneBestLabel;
/**
* A panel that holds the buttons, as well as labels to show which derivation is currently
* being displayed.
*/
private JPanel controlPanel;
/**
* A panel used to display the derivation tree itself.
*/
private JPanel viewPanel;
/**
* This component displays the derivation tree's JUNG graph.
*/
private DerivationViewer dv;
/**
* Index to determine which data set (which n-best file) this frame brings its graphs from.
*/
private int dataSetIndex;
private static final int DEFAULT_WIDTH = 640;
private static final int DEFAULT_HEIGHT = 480;
/**
* Color to use to render target-side trees.
*/
private Color targetColor;
/**
* The default constructor.
*/
public DerivationTreeFrame(int index)
{
super("Joshua Derivation Tree");
setLayout(new BorderLayout());
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
controlPanel = new JPanel(new BorderLayout());
informationPanel = new JPanel(new GridLayout(3, 1));
sourceLabel = new JLabel("source sentence");
referenceLabel = new JLabel("reference translation");
oneBestLabel = new JLabel("one best translation");
informationPanel.add(sourceLabel);
informationPanel.add(referenceLabel);
informationPanel.add(oneBestLabel);
informationPanel.setVisible(false);
controlPanel.add(informationPanel, BorderLayout.SOUTH);
initializeButtons();
layoutControl();
viewPanel = new JPanel(new BorderLayout());
dv = null;
dataSetIndex = index;
targetColor = Browser.dataSetColors[dataSetIndex % Browser.dataSetColors.length];
getContentPane().add(viewPanel, BorderLayout.CENTER);
getContentPane().add(controlPanel, BorderLayout.SOUTH);
// drawGraph();
setVisible(true);
}
/**
* Lays out the control buttons of this frame.
*/
private void layoutControl()
{
/* JPanel ctlLeft = new JPanel(new GridLayout(2, 1));
JPanel ctlCenter = new JPanel(new GridLayout(2, 1));
JPanel ctlRight = new JPanel(new GridLayout(2, 1));
controlPanel.add(ctlLeft, BorderLayout.WEST);
controlPanel.add(ctlCenter, BorderLayout.CENTER);
controlPanel.add(ctlRight, BorderLayout.EAST);
ctlLeft.add(previousSource);
ctlRight.add(nextSource);*/
controlPanel.add(previousSource, BorderLayout.WEST);
controlPanel.add(nextSource, BorderLayout.EAST);
controlPanel.add(informationButton, BorderLayout.CENTER);
return;
}
/**
* Initializes the control buttons of this frame.
*/
private void initializeButtons()
{
nextSource = new JButton(">");
previousSource = new JButton("<");
informationButton = new JButton("More Information");
nextSource.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
Browser.incrementCurrentSourceIndex();
return;
}
});
previousSource.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
Browser.decrementCurrentSourceIndex();
return;
}
});
informationButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
JButton source = (JButton) e.getSource();
if (informationPanel.isVisible()) {
source.setText("More Information");
informationPanel.setVisible(false);
}
else {
source.setText("Less Information");
informationPanel.setVisible(true);
}
return;
}
});
return;
}
/**
* Displays the derivation tree for the current candidate translation. The current candidate
* translation is whichever translation is currently highlighted in the Derivation Browser's
* chooser frame.
*/
public void drawGraph()
{
viewPanel.removeAll();
String src = Browser.getCurrentSourceSentence();
String tgt = Browser.getCurrentCandidateTranslations().get(dataSetIndex);
sourceLabel.setText(Browser.getCurrentSourceSentence());
referenceLabel.setText(Browser.getCurrentReferenceTranslation());
oneBestLabel.setText(Browser.getCurrentOneBests().get(dataSetIndex));
if ((src == null) || (tgt == null)) {
return;
}
DerivationTree tree = new DerivationTree(tgt.split(DerivationTree.DELIMITER)[1], src);
if (dv == null) {
dv = new DerivationViewer(tree, viewPanel.getSize(), targetColor, DerivationViewer.AnchorType.ANCHOR_LEFTMOST_LEAF);
}
else {
dv.setGraph(tree);
tree.addCorrespondences();
}
viewPanel.add(dv, BorderLayout.CENTER);
dv.revalidate();
repaint();
getContentPane().repaint();
return;
}
/**
* Makes this frame unmodifiable, so that the tree it displays cannot be changed. In fact,
* all that happens is the title is update and the navigation buttons are disabled. This
* method is intended to prevent the user from modifying the frame, not to prevent other code
* from modifying it.
*/
public void disableNavigationButtons()
{
setTitle(getTitle() + " (fixed)");
nextSource.setEnabled(false);
previousSource.setEnabled(false);
return;
}
}