package org.topicquests.topicmap.ui;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import javax.swing.border.TitledBorder;
import javax.swing.border.Border;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;
import org.topicquests.common.api.IResult;
import org.topicquests.common.api.ITopicQuestsOntology;
import org.topicquests.model.api.node.INode;
import org.topicquests.model.api.node.INodeModel;
import org.topicquests.model.api.ITicket;
import org.topicquests.topicmap.json.model.JSONTopicmapEnvironment;
import org.topicquests.topicmap.json.model.api.IJSONTopicDataProvider;
import org.topicquests.topicmap.json.model.api.ITreeNode;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
/**
* <p>Title: </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2013</p>
*
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
public class DoubleTreeTab
extends JPanel implements IEditorDialogListener {
private JSONTopicmapEnvironment environment;
private IJSONTopicDataProvider database;
private INodeModel model;
private ITicket credentials;
private TreeModel leftModel;
private TreeModel rightModel;
private final int leftDepth = 2;
private final int pageSize = 30;
private TextEditorDialog editor = new TextEditorDialog();
private String selectedNodeLocator = null;
private String rightTreeRootLocator = null;
private int rightTreeOffset = 0;
private Stack<String>previousLocatorStack;
private Stack<Integer>previousOffsetStack;
public DoubleTreeTab() {
try {
jbInit();
previousLocatorStack = new Stack<String>();
previousOffsetStack = new Stack<Integer>();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
public void setEnvironment(JSONTopicmapEnvironment env) {
environment = env;
database = (IJSONTopicDataProvider)environment.getDataProvider();
model = database.getNodeModel();
populateLeftTree();
}
private void populateLeftTree() {
TopicTreeNode waiting = new TopicTreeNode("Loading...");
leftModel = new DefaultTreeModel(waiting);
leftTree.setModel(leftModel);
TopicTreeNode blank = new TopicTreeNode("Await selection from left tree");
rightModel = new DefaultTreeModel(blank);
rightTree.setModel(rightModel);
new PopulateWorker().start();
}
class PopulateWorker extends Thread {
public void run() {
IResult r = database.loadTree(ITopicQuestsOntology.TYPE_TYPE, leftDepth,0, pageSize, credentials);
ITreeNode root = (ITreeNode)r.getResultObject();
TopicTreeNode rt = nodeToTreeNode(root);
expandTree(rt,root);
leftModel = new DefaultTreeModel(rt);
leftTree.setModel(leftModel);
TopicTreeNode blank = new TopicTreeNode("Await selection from left tree");
rightModel = new DefaultTreeModel(blank);
rightTree.setModel(rightModel);
rightTreeOffset = 0;
nextButton.setEnabled(false);
previousButton.setEnabled(false);
previousLocatorStack.clear();
previousOffsetStack.clear();
}
}
private void expandTree(TopicTreeNode root, ITreeNode rootNode) {
java.util.List<ITreeNode>kids = rootNode.listSubclassChildNodes();
Iterator<ITreeNode>itr;
ITreeNode snapper;
TopicTreeNode child;
if (kids != null) {
itr=kids.iterator();
while (itr.hasNext()) {
snapper = itr.next();
child = nodeToTreeNode(snapper);
root.add(child);
//now recurse
expandTree(child,snapper);
}
}
kids = rootNode.listInstanceChildNodes();
if (kids != null) {
itr=kids.iterator();
while (itr.hasNext()) {
snapper = itr.next();
child = nodeToTreeNode(snapper);
root.add(child);
//now recurse
expandTree(child,snapper);
}
}
}
private TopicTreeNode nodeToTreeNode(ITreeNode n) {
String s = n.getNodeLabel()+" | "+n.getNodeLocator();
TopicTreeNode result = new TopicTreeNode(s);
result.setLocator(n.getNodeLocator());
return result;
}
private void jbInit() throws Exception {
this.setLayout(borderLayout1);
topPanel.setLayout(flowLayout1);
leftTree.addMouseListener(new DoubleTreeTab_leftTree_mouseAdapter(this));
rightTree.addMouseListener(new DoubleTreeTab_rightTree_mouseAdapter(this));
jScrollPane1.setBorder(border2);
newSubclassButton.setEnabled(false);
newSubclassButton.setToolTipText(
"Add a new Subclass to the selected topic");
newSubclassButton.setText("New Subclass Topic");
newSubclassButton.addActionListener(new DoubleTreeTab_newButton_actionAdapter(this));
editButton.setEnabled(false);
editButton.setToolTipText("Edit selected topic");
editButton.setText("Edit");
editButton.addActionListener(new DoubleTreeTab_editButton_actionAdapter(this));
removeButton.setEnabled(false);
removeButton.setToolTipText("Remove selected topic");
removeButton.setText("Remove");
removeButton.addActionListener(new DoubleTreeTab_removeButton_actionAdapter(this));
newInstanceButton.setToolTipText("Add an instance to the selected topic");
newInstanceButton.setText("New Instance Topic");
newInstanceButton.addActionListener(new
DoubleTreeTab_newInstanceButton_actionAdapter(this));
languageCombo.setToolTipText("Select Language");
refreshButton.setToolTipText("Refresh the Display");
refreshButton.setText("Refresh");
refreshButton.addActionListener(new
DoubleTreeTab_refreshButton_actionAdapter(this));
previousButton.setEnabled(false);
previousButton.setBorder(BorderFactory.createEtchedBorder());
previousButton.setToolTipText("Page to previous selections");
previousButton.setText("Previous");
previousButton.addActionListener(new
DoubleTreeTab_previousButton_actionAdapter(this));
nextButton.setBorder(BorderFactory.createEtchedBorder());
nextButton.setToolTipText("Page to next available selections");
nextButton.setText("Next");
nextButton.setEnabled(false);
nextButton.addActionListener(new DoubleTreeTab_nextButton_actionAdapter(this));
this.add(topPanel, java.awt.BorderLayout.NORTH);
topPanel.add(refreshButton);
topPanel.add(languageCombo);
topPanel.add(newSubclassButton);
topPanel.add(newInstanceButton);
topPanel.add(editButton);
topPanel.add(removeButton);
this.add(jSplitPane1, java.awt.BorderLayout.CENTER);
jSplitPane1.add(jScrollPane1, JSplitPane.LEFT);
jScrollPane1.getViewport().add(leftTree);
JPanel rightPanel = new JPanel(new BorderLayout());
rightPanel.add(jScrollPane2, BorderLayout.CENTER);
rightPanel.add(xPanel, BorderLayout.NORTH);
xPanel.add(previousButton);
xPanel.add(nextButton);
jSplitPane1.add(rightPanel, JSplitPane.RIGHT);
jScrollPane2.getViewport().add(rightTree);
removeButton.setEnabled(false);
enableButtons(false);
}
JPanel xPanel = new JPanel(new FlowLayout());
BorderLayout borderLayout1 = new BorderLayout();
JPanel topPanel = new JPanel();
FlowLayout flowLayout1 = new FlowLayout();
JSplitPane jSplitPane1 = new JSplitPane();
JScrollPane jScrollPane1 = new JScrollPane();
JScrollPane jScrollPane2 = new JScrollPane();
JTree leftTree = new JTree();
JTree rightTree = new JTree();
TitledBorder titledBorder1 = new TitledBorder("");
Border border1 = BorderFactory.createLineBorder(new Color(127, 157, 185), 2);
Border border2 = new TitledBorder(border1, "UpperTypology");
JButton newSubclassButton = new JButton();
JButton editButton = new JButton();
JButton removeButton = new JButton();
JButton newInstanceButton = new JButton();
JComboBox languageCombo = new JComboBox();
JButton refreshButton = new JButton();
JButton previousButton = new JButton();
JButton nextButton = new JButton();
void enableButtons(boolean t) {
newSubclassButton.setEnabled(t);
newInstanceButton.setEnabled(t);
editButton.setEnabled(t);
// removeButton.setEnabled(t);
}
public void leftTree_mouseClicked(MouseEvent e) {
int ct = e.getClickCount();
if (ct > 1) {
enableButtons(false);
if (leftTree.getSelectionPath() != null) {
Object o = leftTree.getSelectionPath().getLastPathComponent();
System.out.println("SEL "+o);
if (o != null) {
TopicTreeNode rt = (TopicTreeNode)o;
rightTreeRootLocator = rt.getLocator();
rightTreeOffset = 0;
IResult r = database.loadTree(rightTreeRootLocator, this.leftDepth,0, pageSize, credentials);
ITreeNode root = (ITreeNode)r.getResultObject();
rt = nodeToTreeNode(root);
expandTree(rt,root);
rightModel = new DefaultTreeModel(rt);
rightTree.setModel(rightModel);
this.selectedNodeLocator = null;
rightTreeOffset = rt.getChildCount();
nextButton.setEnabled((rightTreeOffset >= pageSize));
}
}
}
}
public void rightTree_mouseClicked(MouseEvent e) {
int ct = e.getClickCount();
if (ct > 1) {
enableButtons(false);
Object o = rightTree.getSelectionPath().getLastPathComponent();
System.out.println("SEL "+o);
if (o != null) {
this.previousLocatorStack.push(rightTreeRootLocator);
this.previousOffsetStack.push(rightTreeOffset);
System.out.println("SSSS "+rightTreeRootLocator+" "+rightTreeOffset);
previousButton.setEnabled(true);
TopicTreeNode rt = (TopicTreeNode)o;
rightTreeRootLocator = rt.getLocator();
System.out.println("XXXX "+rightTreeRootLocator);
rightTreeOffset = 0;
IResult r = database.loadTree(rightTreeRootLocator, this.leftDepth,0, pageSize, credentials);
ITreeNode root = (ITreeNode)r.getResultObject();
rt = nodeToTreeNode(root);
expandTree(rt,root);
rightModel = new DefaultTreeModel(rt);
rightTree.setModel(rightModel);
this.selectedNodeLocator = null;
rightTreeOffset = rt.getChildCount();
nextButton.setEnabled((rightTreeOffset >= pageSize));
}
} else {
System.out.println("DOUBLETREE "+rightTree.getSelectionPath());
if (rightTree.getSelectionPath() != null) {
enableButtons(true);
//can be null, not sure why, something about clicking to expand
//a node
Object o = rightTree.getSelectionPath().getLastPathComponent();
System.out.println("SEL "+o);
if (o != null) {
TopicTreeNode n = (TopicTreeNode)o;
selectedNodeLocator = n.getLocator();
}
}
}
}
public void newButton_actionPerformed(ActionEvent e) {
INode n = model.newSubclassNode(selectedNodeLocator, "CHANGE ME", "CHANGE ME", "en", ITopicQuestsOntology.SYSTEM_USER, "CHANGE OR REMOVE ME", "CHANGE OR REMOVE ME", false);
editor.setTextToEdit(n.toXML());
}
public void editButton_actionPerformed(ActionEvent e) {
IResult r = database.getNode(selectedNodeLocator, credentials);
INode nn = (INode)r.getResultObject();
String xml = nn.toXML();
editor.setTextToEdit(xml);
}
public void removeButton_actionPerformed(ActionEvent e) {
}
public void newInstanceButton_actionPerformed(ActionEvent e) {
INode n = model.newInstanceNode(selectedNodeLocator, "CHANGE ME", "CHANGE ME", "en", ITopicQuestsOntology.SYSTEM_USER, "CHANGE OR REMOVE ME", "CHANGE OR REMOVE ME", false);
editor.setTextToEdit(n.toXML());
}
public void refreshButton_actionPerformed(ActionEvent e) {
this.enableButtons(false);
this.nextButton.setEnabled(false);
this.previousButton.setEnabled(false);
this.populateLeftTree();
}
public void nextButton_actionPerformed(ActionEvent e) {
IResult r = database.loadTree(rightTreeRootLocator, this.leftDepth,0, pageSize, credentials);
ITreeNode root = (ITreeNode)r.getResultObject();
TopicTreeNode rt = nodeToTreeNode(root);
expandTree(rt,root);
int count = rt.getChildCount();
if ( count > 0) {
rightModel = new DefaultTreeModel(rt);
rightTree.setModel(rightModel);
this.selectedNodeLocator = null;
rightTreeOffset = rt.getChildCount();
nextButton.setEnabled((rightTreeOffset >= pageSize));
previousLocatorStack.push(rightTreeRootLocator);
previousOffsetStack.push(leftDepth);
previousButton.setEnabled(true);
nextButton.setEnabled((count >= pageSize));
} else
nextButton.setEnabled(false);
}
public void previousButton_actionPerformed(ActionEvent e) {
if (previousLocatorStack.isEmpty()) {
previousButton.setEnabled(false);
return;
}
String lox = this.previousLocatorStack.pop();
Integer offset = this.previousOffsetStack.pop();
if (previousLocatorStack.isEmpty()) {
previousButton.setEnabled(false);
}
System.out.println("PREVIOUS "+lox+" "+offset);
IResult r = database.loadTree(lox, this.leftDepth,0, pageSize, credentials);
ITreeNode root = (ITreeNode)r.getResultObject();
TopicTreeNode rt = nodeToTreeNode(root);
expandTree(rt,root);
int count = rt.getChildCount();
System.out.println("AAAA "+count+" "+root.getNodeLocator());
if ( count > 0) {
rightModel = new DefaultTreeModel(rt);
rightTree.setModel(rightModel);
this.selectedNodeLocator = null;
rightTreeOffset = rt.getChildCount();
nextButton.setEnabled((rightTreeOffset >= pageSize));
// previousLocatorStack.push(rightTreeRootLocator);
// previousOffsetStack.push(leftDepth);
if (offset > 0)
previousButton.setEnabled(true);
nextButton.setEnabled((count >= pageSize));
} else
nextButton.setEnabled(false);
}
/**
* Callback from TextEditorDialog
* @param text
*/
@Override
public void acceptText(String text) {
System.out.println(text);
database.updateNodeFromXML(text);
}
}
class DoubleTreeTab_previousButton_actionAdapter
implements ActionListener {
private DoubleTreeTab adaptee;
DoubleTreeTab_previousButton_actionAdapter(DoubleTreeTab adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.previousButton_actionPerformed(e);
}
}
class DoubleTreeTab_nextButton_actionAdapter
implements ActionListener {
private DoubleTreeTab adaptee;
DoubleTreeTab_nextButton_actionAdapter(DoubleTreeTab adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.nextButton_actionPerformed(e);
}
}
class DoubleTreeTab_refreshButton_actionAdapter
implements ActionListener {
private DoubleTreeTab adaptee;
DoubleTreeTab_refreshButton_actionAdapter(DoubleTreeTab adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.refreshButton_actionPerformed(e);
}
}
class DoubleTreeTab_newInstanceButton_actionAdapter
implements ActionListener {
private DoubleTreeTab adaptee;
DoubleTreeTab_newInstanceButton_actionAdapter(DoubleTreeTab adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.newInstanceButton_actionPerformed(e);
}
}
class DoubleTreeTab_removeButton_actionAdapter
implements ActionListener {
private DoubleTreeTab adaptee;
DoubleTreeTab_removeButton_actionAdapter(DoubleTreeTab adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.removeButton_actionPerformed(e);
}
}
class DoubleTreeTab_editButton_actionAdapter
implements ActionListener {
private DoubleTreeTab adaptee;
DoubleTreeTab_editButton_actionAdapter(DoubleTreeTab adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.editButton_actionPerformed(e);
}
}
class DoubleTreeTab_newButton_actionAdapter
implements ActionListener {
private DoubleTreeTab adaptee;
DoubleTreeTab_newButton_actionAdapter(DoubleTreeTab adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.newButton_actionPerformed(e);
}
}
class DoubleTreeTab_rightTree_mouseAdapter
extends MouseAdapter {
private DoubleTreeTab adaptee;
DoubleTreeTab_rightTree_mouseAdapter(DoubleTreeTab adaptee) {
this.adaptee = adaptee;
}
public void mouseClicked(MouseEvent e) {
adaptee.rightTree_mouseClicked(e);
}
}
class DoubleTreeTab_leftTree_mouseAdapter
extends MouseAdapter {
private DoubleTreeTab adaptee;
DoubleTreeTab_leftTree_mouseAdapter(DoubleTreeTab adaptee) {
this.adaptee = adaptee;
}
public void mouseClicked(MouseEvent e) {
adaptee.leftTree_mouseClicked(e);
}
}