package context.arch.intelligibility.presenters;
import java.awt.BorderLayout;
import java.awt.Component;
import java.io.IOException;
import java.net.URL;
import javax.swing.JComponent;
import javax.swing.JEditorPane;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import context.arch.enactor.Enactor;
import context.arch.intelligibility.Explanation;
import context.arch.intelligibility.expression.DNF;
import context.arch.intelligibility.expression.Expression;
import context.arch.intelligibility.expression.Parameter;
import context.arch.intelligibility.expression.Reason;
import context.arch.intelligibility.query.AltQuery;
import context.arch.intelligibility.query.Query;
import context.arch.intelligibility.query.WhatIfQuery;
/**
* Extends TablePanelPresenter by considering explanation by question type.
* @author Brian Y. Lim
*
*/
public class TypePanelPresenter extends TablePanelPresenter {
public TypePanelPresenter(Enactor enactor) {
super(enactor);
}
@Override
public JPanel render(Explanation explanation) {
JComponent contentComponent = renderContent(explanation);
panel.removeAll();
panel.add(contentComponent);
panel.revalidate();
return panel;
}
/**
* Can be extended by subclass to support more questions.
* @param question
* @param context
* @param expression
* @return
*/
protected JComponent renderContent(Explanation explanation) {
query = explanation.getQuery();
String question = query.getQuestion();
// String context = query.getContext();
DNF expression = explanation.getContent();
if (question == null) {
return new JPanel(); // empty
}
if (question.equals(Query.QUESTION_DEFINITION)) {
return renderDefinition(expression);
}
else if (question.equals(Query.QUESTION_INPUTS)) {
return renderInputs(expression.get(0));
}
else if (question.equals(Query.QUESTION_OUTPUTS)) {
return renderOutputs(expression);
}
else if (question.equals(Query.QUESTION_WHAT)) {
return renderWhat(expression.getFirstLiteral());
}
else if (question.equals(Query.QUESTION_WHEN)) {
return renderWhen(expression.getFirstLiteral());
}
else if (question.equals(AltQuery.QUESTION_WHEN_LAST)) {
return renderWhenLast(expression);
}
else if (question.equals(Query.QUESTION_CERTAINTY)) {
return renderCertainty(expression);
}
else if (question.equals(Query.QUESTION_WHY)) {
return renderWhy(expression);
}
else if (question.equals(WhatIfQuery.QUESTION_WHAT_IF)) {
return renderWhatIf(expression.getFirstLiteral());
}
else if (question.equals(AltQuery.QUESTION_WHY_NOT)) {
String altValue = ((AltQuery)query).getAltOutcomeValue();
return renderWhyNot(altValue, expression);
}
else if (question.equals(AltQuery.QUESTION_HOW_TO)) {
String altValue = ((AltQuery)query).getAltOutcomeValue();
return renderHowTo(altValue, expression);
}
else {
return super.renderReasons(expression);
}
}
/* ------------------------------------------------------
* Rendering for specific question types
* ------------------------------------------------------ */
@SuppressWarnings("unchecked")
protected JComponent renderDefinition(Expression expression) {
String definition = ((Parameter<String>)expression).getValue();
final JEditorPane definitionPane = new JEditorPane();
definitionPane.setContentType("text/html");
definitionPane.setEditable(false);
definitionPane.setText(definition);
final JScrollPane scrollpane = new JScrollPane(definitionPane);
definitionPane.addHyperlinkListener(new HyperlinkListener() {
@Override
public void hyperlinkUpdate(HyperlinkEvent evt) {
if (evt.getEventType() != HyperlinkEvent.EventType.ACTIVATED) { return; }
URL url = evt.getURL();
try {
definitionPane.setPage(url);
scrollpane.validate();
} catch (IOException e) {
e.printStackTrace();
}
}
});
definitionPane.setCaretPosition(0); // scroll to top
return scrollpane;
}
protected JComponent renderInputs(Reason reason) {
return renderReason(reason);
}
protected JComponent renderOutputs(DNF reasons) {
return renderReasons(reasons);
}
protected JComponent renderWhat(Parameter<?> literal) {
return renderTerminal(literal);
}
protected JComponent renderWhen(Parameter<?> literal) {
return renderTerminal(literal);
}
protected JComponent renderWhenLast(Expression expression) {
// TODO Auto-generated method stub
return null;
}
protected JComponent renderCertainty(DNF expression) {
return renderReasons(expression);
}
protected JComponent renderWhy(DNF expression) {
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
JLabel label = new JLabel("Because");
label.setAlignmentX(Component.CENTER_ALIGNMENT);
panel.add(label, BorderLayout.NORTH);
JComponent c = renderReasons(expression);
panel.add(c, BorderLayout.CENTER);
return panel;
}
protected JComponent renderWhatIf(Parameter<?> literal) {
return renderWhat(literal);
}
protected JComponent renderWhyNot(String altOutcomeValue, DNF expression) {
JPanel disjPanel = new JPanel();
disjPanel.setLayout(new BorderLayout());
// descriptive label
// JLabel descLabel = new JLabel("<html>Because of any one of the following conditions was <font color=red>not</font> satisfied:</html>");
JLabel descLabel = new JLabel("<html>Because:</html>");
disjPanel.add(descLabel, BorderLayout.NORTH);
JComponent c = renderReasons(expression);
disjPanel.add(c, BorderLayout.CENTER);
return disjPanel;
}
protected JComponent renderHowTo(String altOutcomeValue, DNF expression) {
JPanel disjPanel = new JPanel();
disjPanel.setLayout(new BorderLayout());
// descriptive label
// JLabel descLabel = new JLabel("<html>If:</html>");
// disjPanel.add(descLabel, BorderLayout.NORTH);
JComponent c = renderReasons(expression);
disjPanel.add(c, BorderLayout.CENTER);
return disjPanel;
}
}