package bayesGame.viewcontrollers;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import bayesGame.bayesbayes.BayesNet;
import bayesGame.bayesbayes.BayesNode;
import bayesGame.bayesbayes.OptionNodeOption;
import bayesGame.levelcontrollers.ChoiceMenu;
import bayesGame.levelcontrollers.Controller;
import bayesGame.levelcontrollers.LevelController;
import bayesGame.levelcontrollers.MiniScript;
import bayesGame.minigame.DiscussionNet;
import bayesGame.minigame.MinigameController;
import bayesGame.ui.MinigameMenu;
import bayesGame.ui.GameInterface;
import bayesGame.ui.GraphPanel;
import bayesGame.ui.verbs.InteractingVerb;
import bayesGame.ui.verbs.Verb;
import bayesGame.world.TutorialMessages;
import bayesGame.world.World;
public class MinigameViewController implements Controller, ViewController {
private final MinigameController owner;
private final DiscussionNet gameNet;
private GameInterface gameInterface;
private GraphPanel graphPanel;
private JTextArea infoPanel;
private JPanel buttonPanel;
private JLabel statusText;
private boolean lectureMode;
private String helpReference;
public MinigameViewController(MinigameController minigameController,
DiscussionNet gameNet) {
this.owner = minigameController;
this.gameNet = gameNet;
this.gameInterface = new GameInterface();
this.lectureMode = false;
}
public void setLectureMode(boolean bool){
lectureMode = bool;
}
public void display(){
initializeView();
gameInterface.display();
gameInterface.refreshScrollbar();
}
private void initializeView(){
graphPanel = new GraphPanel(gameNet);
Verb interactingVerb = new InteractingVerb(this, Verb.returnCall.MouseMessage, MouseEvent.BUTTON1);
Verb textVerb = new InteractingVerb(this, Verb.returnCall.KeyMessage, MouseEvent.BUTTON3);
graphPanel.addVerb(interactingVerb);
graphPanel.addVerb(textVerb);
gameInterface.setBigPanel(graphPanel);
infoPanel = new JTextArea();
gameInterface.setSmallPanel(infoPanel);
buttonPanel = new JPanel();
if (helpReference != null){
buttonPanel.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.gridwidth = GridBagConstraints.REMAINDER;
c.ipady = 0;
c.weightx = 1;
c.weighty = 1;
c.fill = GridBagConstraints.BOTH;
statusText = new JLabel("<html><center>" + World.getStatusText() + "</center></html>");
// statusText.setFont(statusText.getFont().deriveFont(16f));
buttonPanel.add(statusText, c);
JButton helpButton = new JButton("Show help");
helpButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String helpText = TutorialMessages.get(helpReference);
gameInterface.addText(helpText);
gameInterface.processEventQueue();
}
});
c.gridy = 1;
c.gridwidth = 1;
buttonPanel.add(helpButton, c);
}
if (lectureMode){
GridBagConstraints c = new GridBagConstraints();
c.gridx = 1;
c.gridy = 1;
c.gridwidth = GridBagConstraints.REMAINDER;
c.ipady = 0;
c.weightx = 1;
c.weighty = 1;
c.fill = GridBagConstraints.BOTH;
final JButton doneButton = new JButton("Done");
doneButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
owner.genericMessageReceived();
doneButton.setEnabled(false);
}
});
buttonPanel.add(doneButton, c);
}
gameInterface.setButtonPanel(buttonPanel);
}
public void addText(String text){
gameInterface.addText(text);
}
public void showText(String text){
this.addText(text);
this.processEventQueue();
}
public void addRefreshDisplay(){
gameInterface.addRefreshDisplay();
}
public void updateGraph(){
graphPanel.updateGraph();
}
public void processEventQueue(){
gameInterface.processEventQueue();
}
public void dispose() {
gameInterface.dispose();
}
@Override
public void keyMessage(Object o) {
BayesNode node = (BayesNode)o;
String text = gameNet.getCPTDescription(node.type);
if (node.hasProperty("hidden")){
text = text + "\n\nIt is a hidden variable, meaning that you cannot observe it directly. You need to discover its value through the other variables it is connected to.";
} else if (node.isObserved()) {
text = text + "\n\nIt is an observed variable, meaning that you know its value for certain.";
} else {
text = text + "\n\nIt is an observable variable, meaning that you can discover its value by left-clicking on it.";
}
int nodeProbability = (int)(100 * node.getProbability().doubleValue());
text = text + "\n\nIt has a " + nodeProbability + "% chance of being true.";
infoPanel.setText(text);
infoPanel.revalidate();
infoPanel.repaint();
gameInterface.getFrame().revalidate();
// gameInterface.getFrame().pack();
}
@Override
public void mouseMessage(Object o) {
if (o != null){
BayesNode node = (BayesNode)o;
Object type = node.type;
owner.chooseNode(type);
updateStatusText();
}
}
@Override
public void genericMessage() {
owner.genericMessageReceived();
updateStatusText();
}
@Override
public void genericMessage(Object o) {
Object[] message = (Object[])o;
Object type = message[0];
OptionNodeOption option = (OptionNodeOption)message[1];
owner.observeNode(type, option);
}
public void displayOptions(Object node) {
if (gameNet.getOptions(node) != null){
MinigameMenu menu = new MinigameMenu(this, gameInterface.getFrame(), node, gameNet.getOptions(node));
menu.setVisible(true);
} else {
owner.observeNode(node, null);
}
}
public void displayPopup(String description, String response) {
String message = description + "\n\n" + response;
JOptionPane.showMessageDialog(gameInterface.getFrame(), message, "", JOptionPane.PLAIN_MESSAGE);
}
@Override
public void giveControlTo(ViewController viewController) {
viewController.receiveControl(gameInterface);
}
@Override
public void receiveControl(Object control){
gameInterface = (GameInterface)control;
gameInterface.setOwner(this);
}
@Override
public void setOwner(LevelController owner) {
// TODO Auto-generated method stub
}
@Override
public void processingDone() {
// TODO Auto-generated method stub
}
@Override
public void showMenu(ChoiceMenu choice, LevelController levelController) {
// TODO Auto-generated method stub
}
public void setHelpReference(String helpReference) {
this.helpReference = helpReference;
}
@Override
public void addDialog(String title, String[] options) {
// TODO Auto-generated method stub
}
@Override
public void addDialog(String string, MiniScript[] scripts) {
// TODO Auto-generated method stub
}
@Override
public void showOptionsMenu() {
// TODO Auto-generated method stub
}
public void clearText() {
gameInterface.clearText();
}
@Override
public void showEndMessage(String string) {
// TODO Auto-generated method stub
}
@Override
public void showMessage(String string) {
// TODO Auto-generated method stub
}
public void updateStatusText(){
if (statusText != null){
statusText.setText("<html><center>" + World.getStatusText() + "</center></html>");
}
}
@Override
public void showResolutionMenu() {
// TODO Auto-generated method stub
}
}