package fna.beans;
import java.util.ArrayList;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import com.swtdesigner.SWTResourceManager;
import fna.parsing.ApplicationUtilities;
import fna.parsing.MainForm;
import fna.parsing.Registry;
import fna.parsing.character.GraphNode;
import fna.parsing.character.ManipulateGraphML;
/** This bean will hold a term and the delete button
* It has the additional capability of shuffling between deleted terms
* and parent terms group
* @author Partha Pratim Sanyal
*
*/
public class TermBean {
private Text termText;
private Label delete;
private boolean togglePosition;
private Group termGroup;
private Group parentGroup;
private Group deletedGroup;
/* Coordinates for the Text inside any Terms group */
private static Rectangle textCood = new Rectangle(10, 10, 100, 20);
/* Coordinates of the Cross Label inside the Term group*/
private static Rectangle delCood = new Rectangle(110, 10, 20, 20);
private static Color color = new Color(Display.getCurrent(), 184,244,166);
public TermBean(Group termGroup, Group deletedGroup, boolean toggleGroup, String text) {
termText = new Text(termGroup, SWT.BORDER);
termText.setBackground(color);
termText.setBounds(textCood);
termText.setEditable(false);
termText.setText(text);
termText.setToolTipText(text);
delete = new Label(termGroup, SWT.NONE);
delete.setImage(SWTResourceManager.getImage(TermBean.class, "/fna/parsing/remove.jpg"));
delete.setBounds(delCood);
delete.setToolTipText("Click to delete this term");
delete.addMouseListener(new MouseListener() {
public void mouseDown(MouseEvent me){
changeParentGroup();
}
public void mouseUp(MouseEvent me){ }
public void mouseDoubleClick(MouseEvent me){ }
});
this.togglePosition = toggleGroup;
this.termGroup = termGroup;
this.parentGroup = (Group)termGroup.getParent();
this.deletedGroup = deletedGroup;
}
private void changeParentGroup() {
if(togglePosition) {
boolean canDelete = isCooccurredTermPresent();
//if (canDelete) {
togglePosition = false;
Rectangle rect = termGroup.getBounds();
if (rect.x == 40) {
rect.x = 10;
} else {
rect.x = 160;
}
termGroup.setParent(deletedGroup);
termGroup.setBounds(rect);
((ScrolledComposite)deletedGroup.getParent()).setMinSize(deletedGroup.computeSize(SWT.DEFAULT, SWT.DEFAULT));
/* Delete the edge between the term nodes from the graph*/
CharacterGroupBean characterBean = MainForm.getGroupInfo().get(MainForm.groupsCombo.getText());
ArrayList <CoOccurrenceBean> cooccurrences = characterBean.getCooccurrences();
for (CoOccurrenceBean cbean : cooccurrences) {
if (cbean.getTerm1() != null && cbean.getTerm2() != null) {
String term1 = cbean.getTerm1().getTermText().getText();
String term2 = cbean.getTerm2().getTermText().getText();
if (termText.equals(cbean.getTerm1().getTermText()) || termText.equals(cbean.getTerm2().getTermText())) {
String groupPath = Registry.TargetDirectory+System.getProperty("file.separator")+
ApplicationUtilities.getProperty("CHARACTER-STATES")+ System.getProperty("file.separator")+
characterBean.getGroupName() + ".xml";
ManipulateGraphML.removeEdge(new GraphNode(term1), new GraphNode(term2), groupPath, characterBean.getGroupName());
if(!canDelete) {
/* If the terms paired is not present in the group then
* make the context and frequency label invisible*/
cbean.getFrequency().setVisible(false);
cbean.getContextButton().setVisible(false);
if(cbean.getText()!=null) cbean.getText().setVisible(false);
}
break;
}
}
/* Visibility problem for remaining terms - radio and frequency label shouldn't be visible*/
if(cbean.getTerm1() == null
&& cbean.getTerm2().termGroup.getParent() != parentGroup
&& cbean.getTerm2().getTermText().equals(termText)){
cbean.getFrequency().setVisible(false);
cbean.getContextButton().setVisible(false);
if(cbean.getText()!=null) cbean.getText().setVisible(false);
break;
} else if (cbean.getTerm2() == null
&& cbean.getTerm1().termGroup.getParent() != parentGroup
&& cbean.getTerm1().getTermText().equals(termText)){
cbean.getFrequency().setVisible(false);
cbean.getContextButton().setVisible(false);
if(cbean.getText()!=null) cbean.getText().setVisible(false);
break;
}
}
/* } else {
ApplicationUtilities.showPopUpWindow(
"One of the terms in the pair was already deleted. " +
"Hence, it is not possible to delete the term you have clicked.",
"Deletion not possible!",SWT.ICON_ERROR);
}*/
} else {
togglePosition = true;
Rectangle rect = termGroup.getBounds();
if (rect.x == 10) {
rect.x = 40;
} else {
rect.x = 210;
}
termGroup.setParent(parentGroup);
termGroup.setBounds(rect);
((ScrolledComposite)parentGroup.getParent()).setMinSize(parentGroup.computeSize(SWT.DEFAULT, SWT.DEFAULT));
/* Restore the edge between the term nodes in the graph*/
CharacterGroupBean characterBean = MainForm.getGroupInfo().get(MainForm.groupsCombo.getText());
ArrayList <CoOccurrenceBean> cooccurrences = characterBean.getCooccurrences();
for (CoOccurrenceBean cbean : cooccurrences) {
if(cbean.getTerm1() != null && cbean.getTerm2() != null) {
String term1 = cbean.getTerm1().getTermText().getText();
String term2 = cbean.getTerm2().getTermText().getText();
if (termText.equals(cbean.getTerm1().getTermText()) || termText.equals(cbean.getTerm2().getTermText())) {
/* Need to check if the two terms are in the same parent group before restoring a link between them*/
if (isCooccurredTermPresent()) {
String groupName = Registry.TargetDirectory+
ApplicationUtilities.getProperty("CHARACTER-STATES")+ "\\"
+ characterBean.getGroupName() + ".xml";
ManipulateGraphML.insertEdge(new GraphNode(term1), new GraphNode(term2), groupName);
}
/* Make the context button and the frequency label visible again*/
cbean.getContextButton().setVisible(true);
cbean.getFrequency().setVisible(true);
if(cbean.getText()!=null) cbean.getText().setVisible(true);
break;
}
}
/* Visibility problem for remaining terms - radio and frequency label shouldn't be visible*/
if(cbean.getTerm1() == null
&& cbean.getTerm2().termGroup.getParent() == parentGroup
&& cbean.getTerm2().getTermText().equals(termText)){
cbean.getFrequency().setVisible(true);
cbean.getContextButton().setVisible(true);
if(cbean.getText()!=null) cbean.getText().setVisible(true);
break;
} else if (cbean.getTerm2() == null
&& cbean.getTerm1().termGroup.getParent() == parentGroup
&& cbean.getTerm1().getTermText().equals(termText)) {
cbean.getFrequency().setVisible(true);
cbean.getContextButton().setVisible(true);
if(cbean.getText()!=null) cbean.getText().setVisible(true);
break;
}
}
}
}
private boolean isCooccurredTermPresent(){
/* Checking whether the term and its co-occurred term are present in the same parent group */
Control [] controls = parentGroup.getChildren();
Point point = null;
boolean canDelete = false;
for (Control control : controls) {
point = control.getLocation();
if (!point.equals(termGroup.getLocation())) {
if (point.y == termGroup.getLocation().y) {
canDelete = true ;
break;
}
}
}
return canDelete;
}
/**
* @return the termGroup
*/
public Group getTermGroup() {
return termGroup;
}
/**
* @param termGroup the termGroup to set
*/
public void setTermGroup(Group termGroup) {
this.termGroup = termGroup;
}
/**
* @return the togglePosition
*/
public boolean isTogglePosition() {
return togglePosition;
}
/**
* @param togglePosition the togglePosition to set
*/
public void setTogglePosition(boolean togglePosition) {
this.togglePosition = togglePosition;
}
/**
* @return the parentGroup
*/
public Group getParentGroup() {
return parentGroup;
}
/**
* @param parentGroup the parentGroup to set
*/
public void setParentGroup(Group parentGroup) {
this.parentGroup = parentGroup;
}
/**
* @return the deletedGroup
*/
public Group getDeletedGroup() {
return deletedGroup;
}
/**
* @param deletedGroup the deletedGroup to set
*/
public void setDeletedGroup(Group deletedGroup) {
this.deletedGroup = deletedGroup;
}
/**
* @return the termText
*/
public Text getTermText() {
return termText;
}
/**
* @param termText the termText to set
*/
public void setTermText(Text termText) {
this.termText = termText;
}
}