/*
* Created on Jun 8, 2005
*/
package org.mindswap.swoop.popup;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.ComponentOrientation;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.net.URI;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.Vector;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.SpringLayout;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.mindswap.swoop.SwoopModel;
import org.mindswap.swoop.renderer.SwoopCellRenderer;
import org.mindswap.swoop.utils.ui.SpringUtilities;
import org.semanticweb.owl.impl.model.OWLConnectionImpl;
import org.semanticweb.owl.impl.model.OWLDataFactoryImpl;
import org.semanticweb.owl.impl.rules.OWLRuleDataFactoryImpl;
import org.semanticweb.owl.model.OWLClass;
import org.semanticweb.owl.model.OWLDataProperty;
import org.semanticweb.owl.model.OWLEntity;
import org.semanticweb.owl.model.OWLException;
import org.semanticweb.owl.model.OWLIndividual;
import org.semanticweb.owl.model.OWLObjectProperty;
import org.semanticweb.owl.model.OWLOntology;
import org.semanticweb.owl.rules.OWLRule;
import org.semanticweb.owl.rules.OWLRuleAtom;
import org.semanticweb.owl.rules.OWLRuleIVariable;
import org.semanticweb.owl.rules.OWLRuleIndividual;
/**
* @author Daniel Hewlett
*
*/
public class PopupEditAtom extends JFrame implements ActionListener, ItemListener, ChangeListener
{
class OWLEntityAlphaComparator implements Comparator
{
public int compare(Object arg0, Object arg1)
{
OWLEntity ent1 = (OWLEntity)arg0;
OWLEntity ent2 = (OWLEntity)arg1;
try
{
String ent1str = ent1.getURI().toString();
String ent2str = ent2.getURI().toString();
return ent1str.compareTo( ent2str );
}
catch( Exception e )
{ e.printStackTrace(); }
return -1;
}
public boolean equals( Object obj )
{ return (this.compare( this, obj ) == 0 ); }
}
String[] types = {"Class Atom", "Object Property Atom", "Datatype Property Atom", "Individual Identity Atom"}; // built-ins not supported yet
String swrlURI = "http://www.w3.org/2003/11/swrl#";
//boolean fresh;
boolean containsVars = false; // true if the currOnt contains SWRL variables
SwoopModel model;
int itemType = 0; // 0 = classes, 1 = objprops, 2 = dprops, 3 = sameAs/differentFrom, 4 = builtIn
final int CLASS_ATOM_TYPE = 0;
final int OBJECT_PROPERTY_ATOM_TYPE = 1;
final int DATATYPE_PROPERTY_ATOM_TYPE = 2;
final int SAME_AS_DIFFERENT_FROM_ATOM_TYPE = 3;
final int BUILT_IN_ATOM_TYPE = 4;
JPanel formPanel = new JPanel();
JComboBox atomTypeBox;
JComboBox ontBox;
JComboBox itemBox;
// JComboBox var1Box;
JComboBox ind1Box;
// JComboBox var2Box;
JComboBox ind2Box;
JRadioButton varButton1;
JRadioButton indButton1;
JRadioButton varButton2;
JRadioButton indButton2;
ButtonGroup buttons1;
ButtonGroup buttons2;
JButton addButton;
JButton addCloseButton;
JButton cancelButton;
JTextField var1TextField;
JTextField var2TextField;
JLabel itemLabel;
JLabel atomLabel;
JComboBox freeFormCombo = new JComboBox();
JCheckBox freeFormBox = new JCheckBox();
OWLOntology currOnt;
Set variableSet = null;
DefaultComboBoxModel classMod;
DefaultComboBoxModel propMod;
PopupAddRule parent;
OWLRule rule = null;
OWLRuleAtom targetAtom;
public PopupEditAtom( SwoopModel mod, OWLRule rule, PopupAddRule parent ) {
model = mod;
this.parent = parent;
this.rule = rule;
targetAtom = null;
currOnt = model.getSelectedOntology();
setupUI();
fillValues();
this.setSize( 400, 300 );
}
public PopupEditAtom( SwoopModel mod, OWLRule rule, PopupAddRule parent, OWLRuleAtom targetAtom ) {
this.targetAtom = targetAtom; // TODO make this do something
model = mod;
this.parent = parent;
this.rule = rule;
currOnt = model.getSelectedOntology();
setupUI();
fillValues();
this.setSize( 400, 300 );
}
private void setupUI() {
this.setSize( 400, 300 );
atomTypeBox = new JComboBox( types );
atomTypeBox.addItemListener( this );
ontBox = new JComboBox();
//ontBox.setRenderer( new CellRenderer() );
ontBox.addItemListener( this );
itemBox = new JComboBox();
itemBox.setRenderer( new SwoopCellRenderer( model ) );
JLabel typeLabel = new JLabel( "Atom Type:" );
JLabel ontLabel = new JLabel( "Ontology:" );
itemLabel = new JLabel( "Class:" );
freeFormCombo.setEditable( true );
freeFormCombo.setSelectedItem( "" );
formPanel.setLayout( new SpringLayout() );
formPanel.add( typeLabel );
formPanel.add( atomTypeBox );
formPanel.add( ontLabel );
formPanel.add( ontBox );
freeFormBox.addActionListener( this );
formPanel.add( new JLabel("Freeform:") );
formPanel.add( freeFormBox );
formPanel.add( itemLabel );
formPanel.add( itemBox );
SpringUtilities.makeCompactGrid(formPanel, //parent
4, 2,
5, 5, //initX, initY
5, 5); //xPad, yPad
JPanel vPan1 = new JPanel();
vPan1.setLayout( new SpringLayout() );
vPan1.setBorder( new LineBorder( Color.BLACK, 1 ) );
// var1Box = new JComboBox();
//var1Box.setEditable( true );
// var1Box.setRenderer( new VariableRenderer( model ) );
ind1Box = new JComboBox();
ind1Box.setRenderer( new SwoopCellRenderer( model ) );
varButton1 = new JRadioButton( "Variable" );
indButton1 = new JRadioButton( "Individual" );
vPan1.add( varButton1 );
// vPan1.add( var1Box );
var1TextField = new JTextField();
vPan1.add(var1TextField);
vPan1.add( indButton1 );
vPan1.add( ind1Box );
buttons1 = new ButtonGroup();
buttons1.add( varButton1 );
buttons1.add( indButton1 );
buttons1.setSelected( varButton1.getModel(), true );
JPanel vPan2 = new JPanel();
vPan2.setLayout( new SpringLayout() );
vPan2.setBorder( new LineBorder( Color.BLACK, 1 ) );
// var2Box = new JComboBox();
//var2Box.setRenderer( new VariableRenderer( model ) );
ind2Box = new JComboBox();
ind2Box.setRenderer( new SwoopCellRenderer( model ) );
varButton2 = new JRadioButton( "Variable" );
indButton2 = new JRadioButton( "Individual" );
vPan2.add( varButton2 );
//vPan2.add( var2Box );
var2TextField = new JTextField();
vPan2.add(var2TextField);
vPan2.add( indButton2 );
vPan2.add( ind2Box );
buttons2 = new ButtonGroup();
buttons2.add( varButton2 );
buttons2.add( indButton2 );
buttons2.setSelected( varButton2.getModel(), true );
addButton = new JButton( "Add" );
addButton.addActionListener( this );
addCloseButton = new JButton( "Add & Close" );
addCloseButton.addActionListener( this );
cancelButton = new JButton( "Cancel" );
cancelButton.addActionListener( this );
JPanel bottom = new JPanel();
//bottom.setLayout( new BoxLayout( bottom, BoxLayout.X_AXIS ) );
//bottom.setComponentOrientation( ComponentOrientation.RIGHT_TO_LEFT );
bottom.setBorder( new EmptyBorder( 5, 5, 5, 5 ) );
bottom.add( addCloseButton );
bottom.add( addButton );
bottom.add( cancelButton );
JPanel main = new JPanel();
main.setLayout( new BoxLayout( main, BoxLayout.Y_AXIS ) );
main.add( formPanel );
main.add( vPan1 );
main.add( vPan2 );
SpringUtilities.makeCompactGrid(vPan1, //parent
2, 2,
5, 5, //initX, initY
5, 5); //xPad, yPad
SpringUtilities.makeCompactGrid(vPan2, //parent
2, 2,
5, 5, //initX, initY
5, 5); //xPad, yPad
JPanel labelPane = new JPanel();
JLabel atomLabel = new JLabel( "Atom: " );
labelPane.add( atomLabel );
JLabel atomText = new JLabel();
labelPane.add( atomText );
Container pane = this.getContentPane();
pane.setLayout( new BorderLayout() );
pane.add( main, BorderLayout.NORTH );
pane.add( labelPane, BorderLayout.CENTER );
pane.add( bottom, BorderLayout.SOUTH );
this.setSecondArgumentEnabled( false );
this.setTitle( "Editing Rule Atom" );
this.pack();
}
public void refreshClassesAndProps() {
itemBox.setEnabled( true );
try {
((DefaultComboBoxModel) this.itemBox.getModel()).removeAllElements();
if ( itemType == 0 ) {
classMod = (DefaultComboBoxModel) this.itemBox.getModel();
classMod.removeAllElements();
Set classSet = currOnt.getClasses();
// create a vector for sorting
Vector vector = new Vector( classSet );
Collections.sort( vector, new OWLEntityAlphaComparator() );
for ( Iterator c = vector.iterator(); c.hasNext(); ) {
OWLClass curr = (OWLClass) c.next();
if ( !curr.getURI().toString().startsWith( swrlURI ) )
classMod.addElement( curr );
}
} else if ( itemType == 1 ) {
propMod = (DefaultComboBoxModel) this.itemBox.getModel();
propMod.removeAllElements();
Set propSet = currOnt.getObjectProperties();
// create a vector for sorting
Vector vector = new Vector( propSet );
Collections.sort( vector, new OWLEntityAlphaComparator() );
for ( Iterator p = vector.iterator(); p.hasNext(); ) {
OWLObjectProperty curr = (OWLObjectProperty) p.next();
if ( !curr.getURI().toString().startsWith( swrlURI ) )
propMod.addElement( curr );
}
} else if ( itemType == 2 ) {
propMod = (DefaultComboBoxModel) this.itemBox.getModel();
propMod.removeAllElements();
Set propSet = currOnt.getDataProperties();
// create a vector for sorting
Vector vector = new Vector( propSet );
Collections.sort( vector, new OWLEntityAlphaComparator() );
for ( Iterator p = propSet.iterator(); p.hasNext(); ) {
OWLDataProperty curr = (OWLDataProperty) p.next();
if ( !curr.getURI().toString().startsWith( swrlURI ) )
propMod.addElement( curr );
}
}
} catch ( OWLException e ) {}
if ( itemBox.getItemCount() == 0 ) {
((DefaultComboBoxModel) itemBox.getModel()).addElement( "No entities found in ontology." );
itemBox.setEnabled( false );
}
}
public void fillValues() {
DefaultComboBoxModel cbm = (DefaultComboBoxModel) ontBox.getModel();
for ( Iterator i = model.getOntologies().iterator(); i.hasNext(); ) {
try {
cbm.addElement( ((OWLOntology) i.next()).getURI() );
} catch (OWLException e) {}
}
DefaultComboBoxModel ind1 = (DefaultComboBoxModel) ind1Box.getModel();
DefaultComboBoxModel ind2 = (DefaultComboBoxModel) ind2Box.getModel();
try {
for ( Iterator i = currOnt.getIndividuals().iterator(); i.hasNext(); ) {
OWLIndividual curr = (OWLIndividual) i.next();
if ( containsVars ) {
if ( !variableSet.contains( curr ) && !curr.isAnonymous() ) {
ind1.addElement( curr );
ind2.addElement( curr );
}
} else if ( !curr.isAnonymous() ) {
ind1.addElement( curr );
ind2.addElement( curr );
}
}
} catch ( OWLException e ) {}
refreshClassesAndProps();
}
public void setSecondArgumentEnabled( boolean enabled ) {
indButton2.setEnabled( enabled );
varButton2.setEnabled( enabled );
ind2Box.setEnabled( enabled );
//var2Box.setEnabled( enabled );
var2TextField.setEnabled(enabled);
}
/* (non-Javadoc)
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
public void actionPerformed(ActionEvent arg0) {
try {
if ( arg0.getSource() == freeFormBox )
{
boolean isFree = freeFormBox.getModel().isSelected();
if ( isFree )
{
System.out.println( "adding freeFormCombo");
formPanel.remove( itemBox );
formPanel.add( freeFormCombo );
SpringUtilities.makeCompactGrid(formPanel, //parent
4, 2,
5, 5, //initX, initY
5, 5); //xPad, yPad
formPanel.repaint();
formPanel.revalidate();
}
else
{
System.out.println( "adding itemBox");
formPanel.remove( freeFormCombo );
formPanel.add( itemBox );
SpringUtilities.makeCompactGrid(formPanel, //parent
4, 2,
5, 5, //initX, initY
5, 5); //xPad, yPad
formPanel.repaint();
formPanel.revalidate();
}
return;
}
if ( arg0.getSource() == addButton || arg0.getSource() == addCloseButton ) {
int index = atomTypeBox.getSelectedIndex();
OWLDataFactoryImpl fac = OWLDataFactoryImpl.getInstance( new OWLConnectionImpl() );
boolean isFreeform = freeFormBox.getModel().isSelected();
OWLRuleDataFactoryImpl test = new OWLRuleDataFactoryImpl();
OWLRuleAtom atom = null;
OWLOntology ontology = model.getOntology( (URI) ontBox.getModel().getSelectedItem());
// make new class atom
if ( index == CLASS_ATOM_TYPE ) {
try
{
OWLRuleIVariable var1 = test.getOWLRuleIVariable( URI.create(var1TextField.getText()));
if ( buttons1.getSelection().equals( varButton1.getModel() ) ) // variable
{
if ( isFreeform )
{
URI uri = new URI((String)freeFormCombo.getSelectedItem());
atom = test.getOWLRuleClassAtom( fac.getOWLClass( uri ), var1 );
}
else
atom = test.getOWLRuleClassAtom( (OWLClass) itemBox.getSelectedItem(), var1 );
}
else // individual
{
OWLRuleIndividual ind1 = test.getOWLRuleIndividual( (OWLIndividual) this.ind1Box.getSelectedItem() );
if ( isFreeform )
{
URI uri = new URI((String)freeFormCombo.getSelectedItem());
atom = test.getOWLRuleClassAtom( fac.getOWLClass( uri ), ind1 );
}
else
atom = test.getOWLRuleClassAtom( (OWLClass) itemBox.getSelectedItem(), ind1 );
}
System.out.println( atom );
} catch ( OWLException e ) {}
}
else if ( index == OBJECT_PROPERTY_ATOM_TYPE )
{
if ( buttons1.getSelection().equals( varButton1.getModel() ) ) // first arg is var
{
OWLRuleIVariable var1 = test.getOWLRuleIVariable( URI.create(var1TextField.getText()));
if ( buttons2.getSelection().equals( varButton2.getModel() ) ) // second arg is var
{
OWLRuleIVariable var2 = test.getOWLRuleIVariable(URI.create(var2TextField.getText()) );
if ( isFreeform )
{
URI uri = new URI((String)freeFormCombo.getSelectedItem());
atom = test.getOWLRuleObjectPropertyAtom( var1, fac.getOWLObjectProperty( uri ), var2 );
}
else
atom = test.getOWLRuleObjectPropertyAtom( var1, (OWLObjectProperty) itemBox.getSelectedItem(), var2 );
}
else // second arg is ind
{
OWLRuleIndividual ind2 = test.getOWLRuleIndividual( (OWLIndividual) this.ind2Box.getSelectedItem() );
if ( isFreeform )
{
URI uri = new URI((String)freeFormCombo.getSelectedItem());
atom = test.getOWLRuleObjectPropertyAtom( var1, fac.getOWLObjectProperty( uri ), ind2 );
}
else
atom = test.getOWLRuleObjectPropertyAtom( var1, (OWLObjectProperty) itemBox.getSelectedItem(), ind2 );
}
}
else // first arg is ind
{
OWLRuleIndividual ind1 = test.getOWLRuleIndividual( (OWLIndividual) this.ind1Box.getSelectedItem() );
if ( buttons2.getSelection().equals( varButton2.getModel() ) ) // second arg is var
{
OWLRuleIVariable var2 = test.getOWLRuleIVariable( URI.create(var2TextField.getText()) );
if ( isFreeform )
{
URI uri = new URI((String)freeFormCombo.getSelectedItem());
atom = test.getOWLRuleObjectPropertyAtom( ind1, fac.getOWLObjectProperty( uri ), var2 );
}
else
atom = test.getOWLRuleObjectPropertyAtom( ind1, (OWLObjectProperty) itemBox.getSelectedItem(), var2 );
}
else // second arg is ind
{
OWLRuleIndividual ind2 = test.getOWLRuleIndividual( (OWLIndividual) this.ind2Box.getSelectedItem() );
if ( isFreeform )
{
URI uri = new URI((String)freeFormCombo.getSelectedItem());
atom = test.getOWLRuleObjectPropertyAtom( ind1, fac.getOWLObjectProperty( uri ), ind2 );
}
else
atom = test.getOWLRuleObjectPropertyAtom( ind1, (OWLObjectProperty) itemBox.getSelectedItem(), ind2 );
}
}
}
System.out.println( atom );
// adding the atom to the rule
parent.addAtom( atom );
if ( arg0.getSource() == addCloseButton ) {
this.setVisible(false);
} else {
}
} else if ( arg0.getSource() == cancelButton ) {
this.setVisible(false);
}
} catch ( Exception e ) {}
}
/* (non-Javadoc)
* @see java.awt.event.ItemListener#itemStateChanged(java.awt.event.ItemEvent)
*/
public void itemStateChanged(ItemEvent arg0) {
if ( arg0.getSource() == ontBox ) {
currOnt = model.getOntology( (URI) ontBox.getModel().getSelectedItem() );
// find variable class
containsVars = false;
variableSet = null;
try {
for ( Iterator c = currOnt.getClasses().iterator(); c.hasNext(); ) {
OWLClass curr = (OWLClass) c.next();
if ( curr.getURI().equals( URI.create( swrlURI + "Variable" ) ) ) {
System.out.println( "Variable found" );
containsVars = true;
variableSet = model.getReasoner().allInstancesOf( curr );
for ( Iterator v = variableSet.iterator(); v.hasNext(); ) {
OWLIndividual currVar = (OWLIndividual) v.next();
/*
((DefaultComboBoxModel) var1Box.getModel()).addElement( currVar );
((DefaultComboBoxModel) var2Box.getModel()).addElement( currVar );
(*/
}
break;
}
}
} catch ( Exception e ) {}
refreshClassesAndProps();
} else if ( arg0.getSource() == this.atomTypeBox ) {
int index = atomTypeBox.getSelectedIndex();
this.itemType = index;
refreshClassesAndProps();
if ( index == 0 ) {
this.itemLabel.setText( "Class:" );
this.setSecondArgumentEnabled( false );
} else {
this.itemLabel.setText( "Property:" );
this.setSecondArgumentEnabled( true );
}
}
}
/* (non-Javadoc)
* @see javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent)
*/
public void stateChanged(ChangeEvent arg0) {
}
}