package ConnectivityEditor.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import Connectivity.Axle;
import Connectivity.Ball;
import Connectivity.CollisionBox;
import Connectivity.Connectivity;
import Connectivity.Fixed;
import Connectivity.Gear;
import Connectivity.Hinge;
import Connectivity.Hole;
import Connectivity.ICustom2DField;
import Connectivity.MatrixItem;
import Connectivity.Rail;
import Connectivity.Slider;
import ConnectivityEditor.Connectivity.AxleT;
import ConnectivityEditor.Connectivity.FixedT;
import ConnectivityEditor.ConnectivityControlGuide.ConnectivityMovementGuideRenderer;
public class FileInfoTreeViewForConnectivityEditor implements Runnable {
private Tree fileInfoTreeComponent = null;
private ConnectivityEditor connectivityEditor = null;
private boolean isTerminate = false;
public FileInfoTreeViewForConnectivityEditor(ConnectivityEditor builder) {
this.connectivityEditor = builder;
startUpdateViewThread();
}
public void terminate() {
this.isTerminate = true;
}
private void startUpdateViewThread() {
new Thread(this).start();
}
private void drawInfo() {
fileInfoTreeComponent.setRedraw(false);
fileInfoTreeComponent.setVisible(false);
fileInfoTreeComponent.removeAll();
// connectivity
TreeItem treeItem_Connectivity = new TreeItem(fileInfoTreeComponent,
SWT.NONE);
treeItem_Connectivity.setText("Connectivity");
TreeItem treeItem;
if (connectivityEditor.getWorkingPart() != null
&& connectivityEditor.getWorkingPart().getConnectivityList() != null)
for (Connectivity conn : connectivityEditor.getWorkingPart()
.getConnectivityList()) {
treeItem = new TreeItem(treeItem_Connectivity, SWT.NONE);
treeItem.setText(getDescription(conn));
treeItem.setData(conn);
}
// Collision
TreeItem treeItem_Collision = new TreeItem(fileInfoTreeComponent,
SWT.NONE);
treeItem_Collision.setText("Collision");
if (connectivityEditor.getWorkingPart() != null
&& connectivityEditor.getWorkingPart().getCollisionBoxList() != null)
for (CollisionBox collisionBox : connectivityEditor
.getWorkingPart().getCollisionBoxList()) {
treeItem = new TreeItem(treeItem_Collision, SWT.NONE);
treeItem.setText(collisionBox.toString());
treeItem.setData(collisionBox);
}
treeItem_Connectivity.setExpanded(true);
treeItem_Collision.setExpanded(true);
fileInfoTreeComponent.setRedraw(true);
fileInfoTreeComponent.setVisible(true);
}
private void setBold(TreeItem selectedItem) {
Display display = fileInfoTreeComponent.getDisplay();
FontData datas[] = fileInfoTreeComponent.getFont().getFontData();
for (FontData data : datas) {
data.setStyle(SWT.NORMAL);
}
Font normalFont = new Font(display, datas);
for (FontData data : datas) {
data.setStyle(SWT.BOLD);
}
Font boldFont = new Font(display, datas);
for (TreeItem item : fileInfoTreeComponent.getItems()) {
if (item.equals(selectedItem)) {
item.setFont(boldFont);
} else {
item.setFont(normalFont);
}
}
}
public void generateView(final Composite parent) {
fileInfoTreeComponent = new Tree(parent, SWT.MULTI);
fileInfoTreeComponent.setLayout(new GridLayout());
fileInfoTreeComponent.setLayoutData(new GridData(SWT.FILL, SWT.FILL,
true, true));
fileInfoTreeComponent.addMouseListener(new MouseListener() {
@Override
public void mouseUp(MouseEvent e) {
}
@Override
public void mouseDown(MouseEvent e) {
TreeItem item = fileInfoTreeComponent.getItem(new Point(e.x,
e.y));
if (item == null) {
fileInfoTreeComponent.setSelection(new TreeItem[0]);
} else
setBold(item);
handleItemSelection(item);
}
@Override
public void mouseDoubleClick(MouseEvent e) {
}
});
fileInfoTreeComponent.addKeyListener(new KeyListener() {
@Override
public void keyPressed(KeyEvent arg0) {
System.out.println(arg0.keyCode);
switch (arg0.keyCode) {
case SWT.DEL:
for (TreeItem item : fileInfoTreeComponent.getSelection()) {
if (item.getData() instanceof CollisionBox) {
connectivityEditor.getWorkingPart()
.getCollisionBoxList()
.remove(item.getData());
} else {
connectivityEditor.getWorkingPart()
.getConnectivityList()
.remove(item.getData());
}
}
break;
case SWT.F5:
drawInfo();
break;
}
}
@Override
public void keyReleased(KeyEvent arg0) {
}
});
}
protected void handleItemSelection(TreeItem item) {
if (item == null)
return;
ConnectivitySelectionManager.getInstance().clearSelection();
if (item.getData() instanceof Connectivity) {
Connectivity conn = (Connectivity) item.getData();
ConnectivityMovementGuideRenderer.getInstance().setConn(conn);
ConnectivitySelectionManager.getInstance().clearSelection();
ConnectivitySelectionManager.getInstance()
.addConnectivityToSelection(conn);
}
GlobalFocusManagerForConnectivityEditor.getInstance()
.forceFocusToMainView();
}
@Override
public void run() {
boolean needRedraw = false;
String prevContents = "";
String currentContents = "";
while (isTerminate == false) {
currentContents = "";
if (connectivityEditor.getWorkingPart() != null
&& connectivityEditor.getWorkingPart()
.getConnectivityList() != null)
for (Connectivity conn : connectivityEditor.getWorkingPart()
.getConnectivityList()) {
currentContents += conn.toString();
}
// Collision
try{
if (connectivityEditor.getWorkingPart() != null
&& connectivityEditor.getWorkingPart()
.getCollisionBoxList() != null)
for (CollisionBox collisionBox : connectivityEditor
.getWorkingPart().getCollisionBoxList()) {
currentContents += collisionBox.toString();
}
}catch(Exception e){
e.printStackTrace();
}
if (prevContents.equals(currentContents) == false)
needRedraw = true;
if (needRedraw == true) {
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
drawInfo();
}
});
needRedraw = false;
prevContents = currentContents;
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private String getDescription(Connectivity conn) {
StringBuilder strBuilder = new StringBuilder();
if (conn instanceof ICustom2DField) {
ICustom2DField custom2d = (ICustom2DField) conn;
if (custom2d instanceof Hole)
strBuilder.append("Hole: ");
else
strBuilder.append("Stud: ");
strBuilder.append(" Size: ");
strBuilder.append(custom2d.getheight()/2);
strBuilder.append(",");
strBuilder.append(custom2d.getwidth()/2);
strBuilder.append(" MatrixInfo: ");
MatrixItem[][] matrixItem = custom2d.getMatrixItem();
for (int column = 0; column < custom2d.getheight() + 1; column++) {
for (int row = 0; row < custom2d.getwidth() + 1; row++) {
strBuilder.append(matrixItem[column][row].getAltitude() + ":"
+ matrixItem[column][row].getOccupiedArea() + ":"
+ matrixItem[column][row].getShape() + ",");
}
strBuilder.append(" ");
}
} else if (conn instanceof Axle) {
strBuilder.append("Axle");
strBuilder.append(" Type: ");
strBuilder.append(AxleT.byValue(conn.gettype()));
strBuilder.append(" Length: ");
strBuilder.append("" + ((Axle) conn).getlength());
strBuilder.append(" StartCapped: ");
strBuilder.append("" + ((Axle) conn).getstartCapped());
strBuilder.append(" EndCapped: ");
strBuilder.append("" + ((Axle) conn).getendCapped());
strBuilder.append(" Grabbing: ");
strBuilder.append("" + ((Axle) conn).getgrabbing());
strBuilder.append(" RequireGrabbing: ");
strBuilder.append("" + ((Axle) conn).getrequireGrabbing());
} else if (conn instanceof Hinge) {
strBuilder.append("Hinge");
strBuilder.append(" Type: ");
strBuilder.append("Hinge_" + (conn.gettype() % 2 == 0 ? "f" : "m")
+ "_" + conn.gettype() / 2);
} else if (conn instanceof Fixed) {
strBuilder.append("Fixed");
strBuilder.append(" Type: ");
strBuilder.append(FixedT.byValue(conn.gettype()));
} else if (conn instanceof Slider) {
strBuilder.append("Slider");
strBuilder.append(" Type: ");
strBuilder.append("Slider_" + (conn.gettype() % 2 == 0 ? "f" : "m")
+ "_" + conn.gettype() / 2);
strBuilder.append(" StartCapped: ");
strBuilder.append("" + ((Slider) conn).getstartCapped());
strBuilder.append(" EndCapped: ");
strBuilder.append("" + ((Slider) conn).getendCapped());
strBuilder.append(" Cylindrial: ");
strBuilder.append("" + ((Slider) conn).getcylindrical());
}else if(conn instanceof Ball){
strBuilder.append("Ball");
strBuilder.append(" Type: ");
strBuilder.append("Ball_" + (conn.gettype() % 2 == 0 ? "f" : "m")
+ "_" + conn.gettype() / 2);
}else {
strBuilder.append(conn.getName());
strBuilder.append(" ");
strBuilder.append(conn.toString());
}
return strBuilder.toString();
}
}