package org.freeplane.uispec4j.framework;
import java.awt.Component;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import junit.framework.Assert;
import org.freeplane.view.swing.map.MainView;
import org.freeplane.view.swing.map.NodeView;
import org.uispec4j.AbstractUIComponent;
import org.uispec4j.ComponentAmbiguityException;
import org.uispec4j.ItemNotFoundException;
import org.uispec4j.Key;
import org.uispec4j.Mouse;
import org.uispec4j.Table;
import org.uispec4j.TextBox;
import org.uispec4j.Trigger;
import org.uispec4j.assertion.Assertion;
import org.uispec4j.finder.ComponentFinder;
public class Node extends TextBox {
public static final String TYPE_NAME = "node";
@SuppressWarnings("rawtypes")
public static final Class[] SWING_CLASSES = { MainView.class };
private final static AttributeTableMatcher attributeTableMatcher = new AttributeTableMatcher();
private ComponentFinder finder;
private MainView nodeMainView = null;
private Table table;
public Node(MainView nodeMainView) {
super(nodeMainView);
this.nodeMainView = nodeMainView;
}
public String getDescriptionTypeName() {
return TYPE_NAME;
}
public String getName() {
return nodeMainView.getText();
}
public JComponent getAwtComponent() {
return nodeMainView;
}
public MainView getMainView() {
return nodeMainView;
}
public NodeView getNodeView() {
return nodeMainView.getNodeView();
}
public Table getAttributeTable() throws ComponentAmbiguityException, ItemNotFoundException {
if (table == null) {
final Component jtable = getFinder().getComponent(attributeTableMatcher);
table = new Table((JTable) jtable);
}
return table;
}
public Table findAttributeTable() throws ComponentAmbiguityException, ItemNotFoundException {
if (table == null) {
final Component jtable = getFinder().findComponent(attributeTableMatcher);
if(jtable != null){
table = new Table((JTable) jtable);
}
}
return table;
}
public Assertion containsAttributeTable() {
return new Assertion() {
public void check() {
Assert.assertTrue(findAttributeTable() != null);
}
};
}
private ComponentFinder getFinder() {
if (finder == null) {
finder = new ComponentFinder(getNodeView());
}
return finder;
}
public void click(int row, int column, Key.Modifier modifier) {
Rectangle rect = new Rectangle(0, 0, nodeMainView.getWidth(), nodeMainView.getHeight());
Mouse.doClickInRectangle(this, rect, false, modifier);
}
public void rightClick(int row, int column) {
Rectangle rect = new Rectangle(0, 0, nodeMainView.getWidth(), nodeMainView.getHeight());
Mouse.doClickInRectangle(this, rect, true, Key.Modifier.NONE);
}
public void doubleClick(int row, int column) {
Rectangle rect = new Rectangle(0, 0, nodeMainView.getWidth(), nodeMainView.getHeight());
Mouse.doClickInRectangle(this, rect, false, Key.Modifier.NONE);
Mouse.doDoubleClickInRectangle(getAwtComponent(), rect);
}
public Trigger triggerClick(final int row, final int column, final Key.Modifier modifier) {
return new Trigger() {
public void run() throws Exception {
click(row, column, modifier);
}
};
}
public Trigger triggerRightClick(final int row, final int column) {
return new Trigger() {
public void run() throws Exception {
rightClick(row, column);
}
};
}
public Trigger triggerDoubleClick(final int row, final int column) {
return new Trigger() {
public void run() throws Exception {
doubleClick(row, column);
}
};
}
public void selectAsTheOnlyOneSelected(){
final NodeView node = getNodeView();
node.getMap().selectAsTheOnlyOneSelected(node);
}
public void toggleSelected(){
final NodeView node = getNodeView();
node.getModel().setFolded(!node.getModel().isFolded());
}
public Node getSelected(){
final NodeView node = getNodeView();
return new Node(node.getMap().getSelected().getMainView());
}
public AbstractUIComponent pressKey(Key key) {
pressKey(nodeMainView, key);
return this;
}
private static void pressKey(final Component component, final Key key) {
int keyCode = key.getCode();
int modifier = key.getModifier().getCode();
KeyEvent event = new KeyEvent(component, KeyEvent.KEY_PRESSED, 0, modifier, keyCode, (char)keyCode);
if (component.getKeyListeners().length > 0) {
for (int i = 0; i < component.getKeyListeners().length; i++) {
KeyListener keyListener = component.getKeyListeners()[i];
keyListener.keyPressed(event);
}
}
SwingUtilities.processKeyBindings(event);
}
}