// OO jDREW - An Object Oriented extension of the Java Deductive Reasoning Engine for the Web
// Copyright (C) 2008 Ben Craig
//
// This library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
package org.ruleml.oojdrew.GUI;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ButtonGroup;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTree;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import javax.swing.table.TableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;
import org.ruleml.oojdrew.SyntaxFormat;
import org.ruleml.oojdrew.TopDown.TopDownApp;
public class TopDownUI implements UI {
private final JFrame frmOoJdrew = new JFrame();
private final DefaultReasonerMenu menuBar = new DefaultReasonerMenu();
private final ButtonGroup typeDefinitionButtonGroup = new ButtonGroup();
private final ButtonGroup knowledgeBaseButtonGroup = new ButtonGroup();
private final ButtonGroup queryButtonGroup = new ButtonGroup();
private JTable variableBindingsTable;
private UndoRedoTextArea typeDefinitionTextArea;
private UndoRedoTextArea knowledgeBaseTextArea;
private UndoRedoTextArea queryTextArea;
private JPanel typeDefinitonTab;
private JPanel knowledgeBaseTab;
private JSplitPane queryTab;
private JTabbedPane tabbedPane;
private JRadioButton typeDefinitionFormatRDFS;
private JButton btnNextSolution;
private JRadioButton knowledgeBaseInputFormatRuleML;
private JRadioButton queryFormatRuleML;
private JCheckBox typeQueryCheckbox;
private JTree solutionTree;
private UndoRedoTextArea solutionTextArea;
private JScrollPane solutionTreeScrollPane;
// UI controller class
private TopDownApp controller;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
TopDownUI window = new TopDownUI();
window.frmOoJdrew.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public TopDownUI() {
initialize();
updateUI();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frmOoJdrew.setTitle("OO jDREW");
frmOoJdrew.setBounds(100, 100, 700, 650);
frmOoJdrew.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frmOoJdrew.setJMenuBar(menuBar);
frmOoJdrew.getContentPane().setLayout(new BorderLayout(0, 0));
tabbedPane = new JTabbedPane(JTabbedPane.TOP);
tabbedPane.setBorder(new EmptyBorder(5, 5, 5, 5));
frmOoJdrew.getContentPane().add(tabbedPane, BorderLayout.CENTER);
typeDefinitonTab = new JPanel();
tabbedPane.addTab("Type definition", null, typeDefinitonTab, null);
JButton btnLoadTypeInformation = new JButton("Load type information");
btnLoadTypeInformation.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
controller.parseTypeInformation();
}
});
JLabel typeDefinitionFormatLabel = new JLabel("Input format:");
typeDefinitionFormatRDFS = new JRadioButton("RDFS");
typeDefinitionButtonGroup.add(typeDefinitionFormatRDFS);
JRadioButton typeDefinitionFormatPOSL = new JRadioButton("POSL");
typeDefinitionFormatPOSL.setSelected(true);
typeDefinitionButtonGroup.add(typeDefinitionFormatPOSL);
JScrollPane typeDefinitionScrollPane = new JScrollPane();
GroupLayout gl_typeDefinitonTab = new GroupLayout(typeDefinitonTab);
gl_typeDefinitonTab.setHorizontalGroup(
gl_typeDefinitonTab.createParallelGroup(Alignment.LEADING)
.addGroup(gl_typeDefinitonTab.createSequentialGroup()
.addContainerGap()
.addGroup(gl_typeDefinitonTab.createParallelGroup(Alignment.LEADING)
.addComponent(typeDefinitionScrollPane, GroupLayout.DEFAULT_SIZE, 599, Short.MAX_VALUE)
.addGroup(gl_typeDefinitonTab.createSequentialGroup()
.addComponent(typeDefinitionFormatLabel)
.addPreferredGap(ComponentPlacement.UNRELATED)
.addComponent(typeDefinitionFormatRDFS)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(typeDefinitionFormatPOSL)
.addPreferredGap(ComponentPlacement.RELATED, 231, Short.MAX_VALUE)
.addComponent(btnLoadTypeInformation)))
.addContainerGap())
);
gl_typeDefinitonTab.setVerticalGroup(
gl_typeDefinitonTab.createParallelGroup(Alignment.LEADING)
.addGroup(Alignment.TRAILING, gl_typeDefinitonTab.createSequentialGroup()
.addContainerGap()
.addComponent(typeDefinitionScrollPane, GroupLayout.DEFAULT_SIZE, 552, Short.MAX_VALUE)
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(gl_typeDefinitonTab.createParallelGroup(Alignment.BASELINE)
.addComponent(btnLoadTypeInformation)
.addComponent(typeDefinitionFormatLabel)
.addComponent(typeDefinitionFormatRDFS)
.addComponent(typeDefinitionFormatPOSL))
.addContainerGap())
);
typeDefinitionTextArea = new UndoRedoTextArea("");
typeDefinitionScrollPane.setViewportView(typeDefinitionTextArea);
typeDefinitonTab.setLayout(gl_typeDefinitonTab);
knowledgeBaseTab = new JPanel();
tabbedPane.addTab("Knowledge base", null, knowledgeBaseTab, null);
JButton btnParseKnowledgeBase = new JButton("Parse knowledge base");
btnParseKnowledgeBase.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
controller.parseKnowledgeBase();
}
});
JLabel knowledgeBaseInputFormatLabel = new JLabel("Input format:");
knowledgeBaseInputFormatRuleML = new JRadioButton("RuleML");
knowledgeBaseButtonGroup.add(knowledgeBaseInputFormatRuleML);
JRadioButton knowledgeBaseInputFormatPOSL = new JRadioButton("POSL");
knowledgeBaseInputFormatPOSL.setSelected(true);
knowledgeBaseButtonGroup.add(knowledgeBaseInputFormatPOSL);
JScrollPane knowledgeBaseScrollPane = new JScrollPane();
GroupLayout gl_knowledgeBaseTab = new GroupLayout(knowledgeBaseTab);
gl_knowledgeBaseTab.setHorizontalGroup(
gl_knowledgeBaseTab.createParallelGroup(Alignment.LEADING)
.addGroup(gl_knowledgeBaseTab.createSequentialGroup()
.addContainerGap()
.addGroup(gl_knowledgeBaseTab.createParallelGroup(Alignment.LEADING)
.addComponent(knowledgeBaseScrollPane, GroupLayout.DEFAULT_SIZE, 599, Short.MAX_VALUE)
.addGroup(gl_knowledgeBaseTab.createSequentialGroup()
.addComponent(knowledgeBaseInputFormatLabel)
.addPreferredGap(ComponentPlacement.UNRELATED)
.addComponent(knowledgeBaseInputFormatRuleML)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(knowledgeBaseInputFormatPOSL)
.addPreferredGap(ComponentPlacement.RELATED, 221, Short.MAX_VALUE)
.addComponent(btnParseKnowledgeBase)))
.addContainerGap())
);
gl_knowledgeBaseTab.setVerticalGroup(
gl_knowledgeBaseTab.createParallelGroup(Alignment.LEADING)
.addGroup(Alignment.TRAILING, gl_knowledgeBaseTab.createSequentialGroup()
.addContainerGap()
.addComponent(knowledgeBaseScrollPane, GroupLayout.DEFAULT_SIZE, 552, Short.MAX_VALUE)
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(gl_knowledgeBaseTab.createParallelGroup(Alignment.BASELINE)
.addComponent(btnParseKnowledgeBase)
.addComponent(knowledgeBaseInputFormatLabel)
.addComponent(knowledgeBaseInputFormatRuleML)
.addComponent(knowledgeBaseInputFormatPOSL))
.addContainerGap())
);
knowledgeBaseTextArea = new UndoRedoTextArea("");
knowledgeBaseScrollPane.setViewportView(knowledgeBaseTextArea);
knowledgeBaseTab.setLayout(gl_knowledgeBaseTab);
queryTab = new JSplitPane();
queryTab.setOrientation(JSplitPane.VERTICAL_SPLIT);
tabbedPane.addTab("Query", null, queryTab, null);
JPanel queryTopPanel = new JPanel();
queryTopPanel.setPreferredSize(new Dimension(10, 150));
queryTopPanel.setBorder(null);
queryTab.setLeftComponent(queryTopPanel);
JScrollPane queryScrollPane = new JScrollPane();
btnNextSolution = new JButton("Next solution");
btnNextSolution.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
controller.nextSolution();
}
});
btnNextSolution.setEnabled(false);
JButton btnIssueQuery = new JButton("Issue query");
btnIssueQuery.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
controller.issueQuery();
}
});
JLabel queryLabel = new JLabel("Query:");
JLabel queryInputFormatLabel = new JLabel("Input format:");
queryFormatRuleML = new JRadioButton("RuleML");
queryButtonGroup.add(queryFormatRuleML);
JRadioButton queryFormatPOSL = new JRadioButton("POSL");
queryFormatPOSL.setSelected(true);
queryButtonGroup.add(queryFormatPOSL);
typeQueryCheckbox = new JCheckBox("Type query");
typeQueryCheckbox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(getTypeQueryCheckboxSelected())
{
getSolutionTreeScrollPane().setViewportView(solutionTextArea);
}
else
{
getSolutionTreeScrollPane().setViewportView(solutionTree);
}
}
});
GroupLayout gl_queryTopPanel = new GroupLayout(queryTopPanel);
gl_queryTopPanel.setHorizontalGroup(
gl_queryTopPanel.createParallelGroup(Alignment.TRAILING)
.addGroup(gl_queryTopPanel.createSequentialGroup()
.addContainerGap()
.addGroup(gl_queryTopPanel.createParallelGroup(Alignment.LEADING)
.addComponent(queryLabel)
.addComponent(queryInputFormatLabel))
.addPreferredGap(ComponentPlacement.UNRELATED)
.addGroup(gl_queryTopPanel.createParallelGroup(Alignment.TRAILING)
.addGroup(gl_queryTopPanel.createSequentialGroup()
.addComponent(queryFormatRuleML)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(queryFormatPOSL)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(typeQueryCheckbox)
.addPreferredGap(ComponentPlacement.RELATED, 129, Short.MAX_VALUE)
.addComponent(btnIssueQuery)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(btnNextSolution))
.addComponent(queryScrollPane, GroupLayout.DEFAULT_SIZE, 526, Short.MAX_VALUE))
.addContainerGap())
);
gl_queryTopPanel.setVerticalGroup(
gl_queryTopPanel.createParallelGroup(Alignment.TRAILING)
.addGroup(gl_queryTopPanel.createSequentialGroup()
.addContainerGap()
.addGroup(gl_queryTopPanel.createParallelGroup(Alignment.BASELINE)
.addComponent(queryScrollPane)
.addComponent(queryLabel))
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(gl_queryTopPanel.createParallelGroup(Alignment.BASELINE)
.addComponent(btnNextSolution)
.addComponent(btnIssueQuery)
.addComponent(queryInputFormatLabel)
.addComponent(queryFormatRuleML)
.addComponent(queryFormatPOSL)
.addComponent(typeQueryCheckbox))
.addContainerGap())
);
queryTextArea = new UndoRedoTextArea("");
queryScrollPane.setViewportView(queryTextArea);
queryTopPanel.setLayout(gl_queryTopPanel);
MySplitPane queryBottomPanel = new MySplitPane();
queryBottomPanel.setResizeWeight(0.5);
queryTab.setRightComponent(queryBottomPanel);
JPanel queryLeftPanel = new JPanel();
queryLeftPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
queryBottomPanel.setLeftComponent(queryLeftPanel);
queryLeftPanel.setLayout(new BorderLayout(5, 5));
JLabel lblSolution = new JLabel("Solution:");
queryLeftPanel.add(lblSolution, BorderLayout.NORTH);
solutionTreeScrollPane = new JScrollPane();
queryLeftPanel.add(solutionTreeScrollPane, BorderLayout.CENTER);
solutionTree = new JTree();
solutionTree.setModel(new DefaultTreeModel(
new DefaultMutableTreeNode("unknown") {
}
));
solutionTextArea = new UndoRedoTextArea("");
solutionTextArea.setEditable(false);
solutionTreeScrollPane.setViewportView(solutionTree);
JPanel queryRightPanel = new JPanel();
queryRightPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
queryBottomPanel.setRightComponent(queryRightPanel);
queryRightPanel.setLayout(new BorderLayout(5, 5));
JLabel lblVariableBindings = new JLabel("Variable bindings:");
queryRightPanel.add(lblVariableBindings, BorderLayout.NORTH);
JScrollPane variableBindingsScrollPane = new JScrollPane();
queryRightPanel.add(variableBindingsScrollPane, BorderLayout.CENTER);
variableBindingsTable = new JTable();
variableBindingsScrollPane.setViewportView(variableBindingsTable);
tabbedPane.setSelectedIndex(1);
}
public boolean getFrameVisible() {
return frmOoJdrew.isVisible();
}
public void setFrameVisible(boolean visible) {
frmOoJdrew.setVisible(visible);
}
public void setController(AbstractUIApp controller)
{
menuBar.setController(controller);
this.controller = (TopDownApp) controller;
this.controller.syncUIWithSettings();
}
public void updateUI() {
knowledgeBaseTextArea.updateUI();
queryTextArea.updateUI();
typeDefinitionTextArea.updateUI();
solutionTextArea.updateUI();
SwingUtilities.updateComponentTreeUI(getFrmOoJdrew());
getFrmOoJdrew().pack();
}
public JFrame getFrmOoJdrew() {
return frmOoJdrew;
}
private EditingTab currentEditingTab()
{
switch(getTabbedPaneSelectedIndex())
{
case 0:
return EditingTab.EditingTabTypeDefinition;
case 1:
return EditingTab.EditingTabKnowledgeBase;
case 2:
return EditingTab.EditingTabQuery;
default:
throw new RuntimeException("Unknown tab selected.");
}
}
private void clearCurrentEditingTab()
{
switch(currentEditingTab())
{
case EditingTabTypeDefinition:
setTypeDefinitionTextAreaText("");
break;
case EditingTabKnowledgeBase:
setKnowledgeBaseTextAreaText("");
break;
case EditingTabQuery:
setQueryTextAreaText("");
break;
}
}
public void appendToCurrentEditingTab(String content)
{
StringBuilder stringBuilder = new StringBuilder();
switch(currentEditingTab())
{
case EditingTabTypeDefinition:
stringBuilder.append(getTypeDefinitionTextAreaText());
stringBuilder.append(content);
setTypeDefinitionTextAreaText(stringBuilder.toString());
break;
case EditingTabKnowledgeBase:
stringBuilder.append(getKnowledgeBaseTextAreaText());
stringBuilder.append(content);
setKnowledgeBaseTextAreaText(stringBuilder.toString());
break;
case EditingTabQuery:
stringBuilder.append(getQueryTextAreaText());
stringBuilder.append(content);
setQueryTextAreaText(stringBuilder.toString());
break;
}
}
public void setTextForCurrentEditingTab(String content)
{
clearCurrentEditingTab();
appendToCurrentEditingTab(content);
}
public String getTextForCurrentEditingTab()
{
String text = "";
switch(currentEditingTab())
{
case EditingTabTypeDefinition:
text = getTypeDefinitionTextAreaText();
break;
case EditingTabKnowledgeBase:
text = getKnowledgeBaseTextAreaText();
break;
case EditingTabQuery:
text = getQueryTextAreaText();
break;
}
return text;
}
public String getTypeDefinitionTextAreaText() {
return typeDefinitionTextArea.getText();
}
private void setTypeDefinitionTextAreaText(String text) {
typeDefinitionTextArea.setText(text);
}
public String getKnowledgeBaseTextAreaText() {
return knowledgeBaseTextArea.getText();
}
private void setKnowledgeBaseTextAreaText(String text_1) {
knowledgeBaseTextArea.setText(text_1);
}
public String getQueryTextAreaText() {
return queryTextArea.getText();
}
private void setQueryTextAreaText(String text_2) {
queryTextArea.setText(text_2);
}
public void setSolutionTextAreaText(String text)
{
solutionTextArea.setText(text);
}
private int getTabbedPaneSelectedIndex() {
return tabbedPane.getSelectedIndex();
}
public SyntaxFormat getTypeInformationInputFormat()
{
if(getTypeDefinitionFormatRDFSSelected())
{
return SyntaxFormat.RDFS;
}
return SyntaxFormat.POSL;
}
private boolean getTypeDefinitionFormatRDFSSelected() {
return typeDefinitionFormatRDFS.isSelected();
}
public void setBtnNextSolutionEnabled(boolean enabled) {
btnNextSolution.setEnabled(enabled);
}
private boolean getKnowledgeBaseInputFormatRuleMLSelected() {
return knowledgeBaseInputFormatRuleML.isSelected();
}
public SyntaxFormat getKnowledgeBaseInputFormat()
{
if(getKnowledgeBaseInputFormatRuleMLSelected())
{
return SyntaxFormat.RULEML;
}
return SyntaxFormat.POSL;
}
private boolean getQueryFormatRuleMLSelected() {
return queryFormatRuleML.isSelected();
}
public SyntaxFormat getQueryInputFormat()
{
if(getQueryFormatRuleMLSelected())
{
return SyntaxFormat.RULEML;
}
return SyntaxFormat.POSL;
}
public boolean getTypeQueryCheckboxSelected() {
return typeQueryCheckbox.isSelected();
}
public TreeModel getSolutionTreeModel() {
return solutionTree.getModel();
}
public void setSolutionTreeModel(TreeModel model) {
solutionTree.setModel(model);
solutionTree.updateUI();
}
public TableModel getVariableBindingsTableModel() {
return variableBindingsTable.getModel();
}
public void setVariableBindingsTableModel(TableModel model_1) {
variableBindingsTable.setModel(model_1);
variableBindingsTable.updateUI();
}
private JScrollPane getSolutionTreeScrollPane() {
return solutionTreeScrollPane;
}
}