/*
* Copyright 2003-2010 Tufts University Licensed under the
* Educational Community License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may
* obtain a copy of the License at
*
* http://www.osedu.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an "AS IS"
* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package edu.tufts.vue.metadata.ui;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import tufts.vue.*;
import tufts.vue.gui.Widget;
import edu.tufts.vue.metadata.*;
import edu.tufts.vue.ontology.*;
import edu.tufts.vue.ontology.ui.*;
/*
* OntologicalMembershipPane.java
*
* Created on October 18, 2007, 8:45 PM
*
* @author dhelle01
*/
public class OntologicalMembershipPane extends javax.swing.JPanel implements ActiveListener,OntologySelectionListener {
private static OntologicalMembershipPane global;
private LWComponent current;
private javax.swing.JList list;
private JButton addSelectedTerm;
public static OntologicalMembershipPane getGlobal()
{
return global;
}
public OntologicalMembershipPane()
{
setLayout(new BorderLayout());
//todo: adjust font (html handles the text wrapping)
//JLabel label = new JLabel("<html>Ontological Terms associated with this node:</html>");
JLabel label = new JLabel(VueResources.getString("ontologicalmembership.association"),JLabel.LEFT);
label.setFont(tufts.vue.gui.GUI.LabelFace);
label.setBorder(javax.swing.BorderFactory.createEmptyBorder(5,5,5,5));
JPanel listPanel = new JPanel(new BorderLayout());
listPanel.add(label,BorderLayout.NORTH);
list = new javax.swing.JList(new OntologyTypeListModel());
list.setCellRenderer(new OntologyTypeListRenderer());
list.setOpaque(true);
list.setBackground(getBackground());
listPanel.add(list);//,java.awt.BorderLayout.SOUTH);
//setPreferredSize(new Dimension(200,100));
list.addMouseListener(new java.awt.event.MouseAdapter() {
int selected = 0;
public void mousePressed(java.awt.event.MouseEvent e)
{
//System.out.println(e);
int selected = list.locationToIndex(e.getPoint());
if(list.getSelectedIndex() < 0 || !current.getMetadataList().hasOntologicalMetadata())
{
return;
}
if(e.getPoint().x < OntologicalMembershipPane.this.getWidth() - 40)
return;
int categoryIndex = ((edu.tufts.vue.metadata.MetadataList.CategoryFirstList)current.getMetadataList().getMetadata()).getCategoryEndIndex();
//System.out.println("Mouse Pressed: getCategoryIndex() " + categoryIndex);
current.getMetadataList().getMetadata().remove(categoryIndex + selected);
//OntologicalMembershipPane.this.validate();
//OntologicalMembershipPane.this.repaint();
((OntologyTypeListModel)list.getModel()).refresh();
}
});
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
addSelectedTerm = new JButton(VueResources.getString("ontologicalmembership.selectedterm"));
addSelectedTerm.setFont(tufts.vue.gui.GUI.LabelFace);
addSelectedTerm.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
TypeList selectedList = OntologyBrowser.getBrowser().getSelectedList();
if(selectedList !=null)
{
Object type = selectedList.getSelectedValue();
if(type != null)
{
VueMetadataElement vme = new VueMetadataElement();
vme.setObject(type);
current.getMetadataList().getMetadata().add(vme);
refresh();
repaint();
}
}
}
});
// OntologyBrowser not yet initialized at startup, todo:
// should consider tying OntologyBrowser intitialization to getBrowser() method
//if(OntologyBrowser.getBrowser().getSelectedOntology() == null)
//{
addSelectedTerm.setEnabled(false);
//}
buttonPanel.add(addSelectedTerm);
buttonPanel.setBorder(BorderFactory.createEmptyBorder(15,0,10,0));
add(listPanel);
add(buttonPanel,BorderLayout.SOUTH);
VUE.addActiveListener(LWComponent.class,this);
if(global == null)
{
global = this;
}
OntologyBrowser.getBrowser().addOntologySelectionListener(this);
}
public void disableOrEnableAddButton(boolean disable)
{
addSelectedTerm.setEnabled(disable);
repaint();
}
public void ontologySelected(OntologySelectionEvent ose)
{
if(OntologyBrowser.getBrowser().getSelectedOntology() == null)
{
addSelectedTerm.setEnabled(false);
}
else
{
addSelectedTerm.setEnabled(true);
}
}
public LWComponent getCurrent()
{
return current;
}
public void activeChanged(ActiveEvent e)
{
if(e != null)
{
current = (LWComponent)e.active;
if(current == null)
return;
((OntologyTypeListModel)list.getModel()).refresh();
//adjustVisibility();
}
}
public void refresh()
{
((OntologyTypeListModel)list.getModel()).refresh();
current.layout();
adjustVisibility();
}
static public void adjustVisibility()
{
if(getGlobal().getCurrent().getMetadataList().hasOntologicalMetadata())
{
Widget.setHidden(getGlobal(),false);
}
else
{
Widget.setHidden(getGlobal(),true);
}
}
class OntologyTypeListRenderer extends javax.swing.DefaultListCellRenderer
{
private javax.swing.JPanel panel = new javax.swing.JPanel(new java.awt.BorderLayout());
private javax.swing.JLabel deleteButton = new JLabel(); //= new javax.swing.JButton("-");
public OntologyTypeListRenderer()
{
setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT));
javax.swing.border.Border lineBorder = javax.swing.BorderFactory.createLineBorder(java.awt.Color.LIGHT_GRAY);
javax.swing.border.Border emptyBorder = javax.swing.BorderFactory.createEmptyBorder(5,5,5,5);
javax.swing.border.Border emptyBorder2 = javax.swing.BorderFactory.createEmptyBorder(5,5,5,5);
javax.swing.border.Border innerCompoundBorder = javax.swing.BorderFactory.createCompoundBorder(emptyBorder,lineBorder);
javax.swing.border.Border outerCompoundBorder = javax.swing.BorderFactory.createCompoundBorder(innerCompoundBorder,emptyBorder);
panel.setBorder(outerCompoundBorder);
deleteButton.setIcon(tufts.vue.VueResources.getImageIcon("ontologicalmembership.delete.up"));
setFont(tufts.vue.gui.GUI.LabelFace);
}
public java.awt.Component getListCellRendererComponent(javax.swing.JList list,Object value,int index,boolean isSelected,boolean cellHasFocus)
{
String ontValue = ((edu.tufts.vue.metadata.VueMetadataElement)value).getValue();
if(ontValue == null)
return panel;
String label = ontValue.substring(ontValue.indexOf("#")+1,ontValue.length());
setText(label);
panel.add(this);
panel.add(deleteButton,java.awt.BorderLayout.EAST);
return panel;
}
}
class OntologyTypeListModel extends javax.swing.DefaultListModel
{
public Object getElementAt(int i)
{
return (current.getMetadataList().getOntologyListElement(i));
}
public int getSize()
{
if(current !=null)
return current.getMetadataList().getOntologyListSize();
else
return 0;
}
public void refresh()
{
fireContentsChanged(this,0,getSize());
}
}
}