package Window;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
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.events.MouseMoveListener;
import org.eclipse.swt.events.MouseTrackListener;
import org.eclipse.swt.events.MouseWheelListener;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.TreeItem;
import BrickControlGuide.BrickMovementGuideRenderer;
import BrickControlGuide.IGuideRenderer;
import BrickControlGuide.RotationGuide;
import Builder.BrickGroupForTransform;
import Builder.BrickSelectionManager;
import Builder.BuilderConfigurationManager;
import Builder.CameraMoveShortCutManager;
import Builder.CopyNPasteManager;
import Builder.MainCamera;
import Builder.ShortcutKeyManager;
import Builder.ShortcutKeyManager.ShortcutKeyT;
import Command.LDrawColor;
import Command.LDrawPart;
import Command.PartTypeT;
import Common.Box2;
import Common.Matrix4;
import Common.Vector2f;
import Common.Vector3f;
import Connectivity.BrickFinder;
import Connectivity.ConnectivityTestResult;
import Connectivity.ConnectivityTestResultT;
import Connectivity.Direction6T;
import Connectivity.GlobalConnectivityManager;
import Connectivity.IConnectivity;
import Connectivity.MatrixItem;
import ConnectivityEditor.Window.ConnectivityEditorUI;
import Grouping.GroupingManager;
import LDraw.Files.LDrawStep;
import LDraw.Support.ColorLibrary;
import LDraw.Support.LDrawDirective;
import LDraw.Support.MatrixMath;
import Notification.LDrawColorSelected;
import Notification.LDrawDirectiveModified;
import Notification.LDrawPartSelect;
import Notification.NotificationCenter;
import Notification.NotificationMessageT;
import OtherTools.PartReplaceDlg;
import OtherTools.Syringe;
import Resource.SoundEffectManager;
import Resource.SoundEffectT;
import UndoRedo.ColorChangeAction;
import UndoRedo.DirectiveAction;
import UndoRedo.LDrawUndoRedoManager;
public class BuilderEventHandler implements MouseListener, MouseTrackListener,
MouseMoveListener, MouseWheelListener, KeyListener {
@Override
public void mouseScrolled(MouseEvent e) {
camera.zoom(e);
brickSelectionManager.updateScreenProjectionVerticesMapAll();
NotificationCenter.getInstance().postNotification(
NotificationMessageT.NeedReDraw);
}
@Override
public void mouseMove(MouseEvent e) {
GlobalMousePosition.getInstance().setPos(e.x, e.y);
if (isLeftPressed) {
isLeftDragged = true;
}
if (isRightPressed) {
isRightDragged = true;
}
handleMouseDragged(e);
NotificationCenter.getInstance().postNotification(
NotificationMessageT.NeedReDraw);
}
@Override
public void mouseDoubleClick(MouseEvent e) {
}
private void handleMouseWheelButtonClick(MouseEvent e) {
LDrawPart selectedPart = builder.getHittedPart(e.x, e.y, false);
if (selectedPart != null) {
if ((e.stateMask & SWT.SHIFT) == 0)
brickSelectionManager.clearSelection();
for (LDrawPart part : GlobalConnectivityManager.getInstance()
.getConnectedPart(selectedPart, null, null, true))
brickSelectionManager.addPartToSelection(part);
}
}
@Override
public void mouseDown(MouseEvent e) {
if (e.button == 1) { // left button pressed
isLeftPressed = true;
handleMouseLeftButtonPressed(e);
} else if (e.button == 3) { // right button
// pressed
isRightPressed = true;
handleMouseRightButtonPressed(e);
}
}
@Override
public void mouseUp(MouseEvent e) {
if (e.button == 1) { // left button released
isLeftPressed = false;
if (isLeftDragged == false) {// mouse clicked.
if ((e.stateMask & SWT.ALT) != 0)
handleMouseWheelButtonClick(e);
else
handleMouseLeftButtonClicked(e);
} else {
handleMouseLeftButtonReleased(e);
isLeftDragged = false;
}
} else if (e.button == 2) {
handleMouseWheelButtonClick(e);
} else if (e.button == 3) { // Right Button
// released
isRightPressed = false;
if (isRightDragged == false) {// mouse clicked.
handleMouseRightButtonClicked(e);
} else {
handleMouseRightButtonReleased(e);
isRightDragged = false;
}
}
brickMovementGuideRenderer.axisSelectedType(null);
NotificationCenter.getInstance().postNotification(
NotificationMessageT.NeedReDraw);
}
@Override
public void mouseEnter(MouseEvent e) {
// GLCanvas canvas = ((GLCanvas) e.widget);
// canvas.setFocus();
}
@Override
public void mouseExit(MouseEvent e) {
GlobalMousePosition.getInstance().setPos(400, 400);
}
@Override
public void mouseHover(MouseEvent e) {
}
private MOCBuilder builder = null;
private MainCamera camera = null;
private BrickSelectionManager brickSelectionManager = null;
private BuilderConfigurationManager configurationManager = null;
private BrickMovementGuideRenderer brickMovementGuideRenderer;
private Vector2f startMoveMousePos = null;
private Vector2f startMoveMousePosForCameraPanning = null;
private Vector3f startMoveCameraPosForPanning = null;
private Vector3f startMoveWorldPos = null;
private Vector3f startMovePartPos = null;
private LDrawPart startMovePart = null;
private boolean isLeftPressed = false;
private boolean isLeftDragged = false;
private boolean isRightPressed = false;
private boolean isRightDragged = false;
public BuilderEventHandler(MOCBuilder builder) {
this.builder = builder;
brickSelectionManager = BrickSelectionManager.getInstance();
camera = builder.getCamera();
configurationManager = BuilderConfigurationManager.getInstance();
brickMovementGuideRenderer = builder.getBrickMovementGuideRenderer();
}
private void handleMouseDragged(MouseEvent e) {
// System.out.println("handleMouseDragged");
// Right button pressed
if (isLeftDragged
&& (e.stateMask & (SWT.SHIFT | SWT.ALT | SWT.CTRL)) != 0) {
if (startMoveMousePosForCameraPanning == null)
return;
Vector2f directionForX = null;
Vector2f directionForZ = null;
Vector2f temp = camera.getWorldToScreenPos(
new Vector3f(camera.getLookAtPos()), false);
Vector2f tempX = camera.getWorldToScreenPos(camera.getLookAtPos()
.add(1, 0, 0), false);
Vector2f tempZ = camera.getWorldToScreenPos(camera.getLookAtPos()
.add(0, 0, 1), false);
if (temp != null && tempX != null) {
directionForX = temp.sub(tempX);
directionForX.scale(1 / directionForX.length());
}
if (temp != null && tempZ != null) {
directionForZ = temp.sub(tempZ);
directionForZ.scale(1 / directionForZ.length());
}
// System.out.println(directionForX+" :: "+directionForZ);
// System.out.println(movedByY);
if (startMoveMousePosForCameraPanning == null)
startMoveMousePosForCameraPanning = new Vector2f(e.x, e.y);
Vector3f moveByInWorld = new Vector3f();
moveByInWorld.y = 0;
moveByInWorld.x = (directionForX.getX()
* (startMoveMousePosForCameraPanning.getX() - e.x) - directionForX
.getY() * (startMoveMousePosForCameraPanning.getY() - e.y)) / 2;
moveByInWorld.z = (directionForZ.getX()
* (startMoveMousePosForCameraPanning.getX() - e.x) - directionForZ
.getY() * (startMoveMousePosForCameraPanning.getY() - e.y)) / 2;
moveByInWorld.x *= -1.5f;
moveByInWorld.z *= -1.5f;
camera.moveTo(startMoveCameraPosForPanning.add(moveByInWorld));
brickSelectionManager.updateScreenProjectionVerticesMapAll();
return;
}
if (isRightPressed) {
camera.rotate(e.x, e.y);
}
if (isRightPressed == false && isLeftPressed == false) {
LDrawPart selectedPart = builder.getHittedPart(e.x, e.y, false);
GlobalBoundingBoxRenderer.getInstance().setPointingPart(
selectedPart);
} else {
GlobalBoundingBoxRenderer.getInstance().setPointingPart(null);
}
if (Syringe.getInstance().isActivated()) {
return;
}
if (isLeftPressed) {
switch (BrickControlModeT.currentControlMode) {
case None:
BrickControlModeT.currentControlMode = BrickControlModeT.BrickSelectingDrag;
case BrickSelectingDrag:
builder.getBrickSelectionInfoRenderer().setEnd(
new Vector2f(e.x, e.y));
Box2 bounds = builder.getBrickSelectionInfoRenderer()
.getBounds();
brickSelectionManager.selectByDragging(bounds);
break;
case BrickControl_Direct: {
if (startMoveWorldPos == null || startMovePart == null) {
BrickControlModeT.currentControlMode = BrickControlModeT.BrickSelectingDrag;
return;
}
if (brickSelectionManager.containsInSelection(startMovePart) == false) {
brickSelectionManager.clearSelection();
brickSelectionManager.addPartToSelection(startMovePart);
}
if (builder.getHittedPos(e.x, e.y, true) == null)
return;
Vector3f currentMoveWorldPos = new Vector3f(
builder.getHittedPos(e.x, e.y, true));
if (MatrixMath.compareFloat(currentMoveWorldPos.y, 0) == 0) {
Vector3f veye = new Vector3f(0, 0,
camera.getDistanceBetweenObjectToCamera());
veye = camera.getModelViewMatrix().multiply(veye);
veye = camera.getLookAtPos().add(veye);
float y_hitted = startMovePartPos.y - startMoveWorldPos.y;
Float offsetY = null;
if (BuilderConfigurationManager.getInstance()
.isUseConnectivity()
&& BuilderConfigurationManager.getInstance()
.isUseDefaultBaseplate()) {
MatrixItem minItem = brickSelectionManager
.getMatrixItemHavingMinY();
if (minItem != null) {
LDrawPart minPart = minItem.getParent().getParent();
offsetY = minPart.position().sub(
startMovePart.position()).y;
offsetY += minItem.getCurrentPos(minPart
.getRotationMatrix()).y;
}
}
if (offsetY == null) {
LDrawPart minPart = brickSelectionManager
.getPartHavingMinY();
offsetY = minPart.boundingBox3(
minPart.getRotationMatrix()).getMax().y
+ minPart.position().sub(
startMovePart.position()).y;
}
y_hitted += offsetY;
y_hitted *= -1.0f;
double tanThetaX = veye.y
/ (veye.x - currentMoveWorldPos.x);
double tanThetaZ = veye.y
/ (veye.z - currentMoveWorldPos.z);
double offsetX = y_hitted / tanThetaX;
double offsetZ = y_hitted / tanThetaZ;
currentMoveWorldPos.y = y_hitted;
currentMoveWorldPos.x += offsetX;
currentMoveWorldPos.z += offsetZ;
}
Vector3f moveByInWorld = currentMoveWorldPos
.sub(startMoveWorldPos);
builder.moveDirectiveTo(startMovePart,
startMovePartPos.add(moveByInWorld));
moveByInWorld = startMovePart.position().sub(startMovePartPos);
moveByInWorld.round();
brickSelectionManager.moveSelectedPartBy(startMovePart);
}
break;
case BrickControl_Guide: {
if (startMoveWorldPos == null)
return;
Vector3f currentMoveWorldPos = camera.screenToWorldXZ(e.x, e.y,
0);
if (currentMoveWorldPos == null)
return;
Vector2f directionForX = null;
Vector2f directionForZ = null;
Vector2f directionForY = null;
Vector2f temp = camera.getWorldToScreenPos(new Vector3f(),
false);
Vector2f tempY = camera.getWorldToScreenPos(new Vector3f(0, -1,
0), false);
Vector2f tempX = camera.getWorldToScreenPos(new Vector3f(1, 0,
0), false);
Vector2f tempZ = camera.getWorldToScreenPos(new Vector3f(0, 0,
1), false);
if (temp != null && tempX != null) {
directionForX = temp.sub(tempX);
directionForX.scale(1 / directionForX.length());
}
if (temp != null && tempY != null) {
directionForY = temp.sub(tempY);
directionForY.scale(1 / directionForY.length());
}
if (temp != null && tempZ != null) {
directionForZ = temp.sub(tempZ);
directionForZ.scale(1 / directionForZ.length());
}
// System.out.println(movedByY);
Vector3f moveByInWorld = new Vector3f();
float scale = camera.getScreenToWorldDistance(1);
moveByInWorld.y = (directionForY.getY() * (startMoveMousePos
.getY() - e.y)) / 2;
moveByInWorld.x = (directionForX.getX()
* (startMoveMousePos.getX() - e.x) - directionForX
.getY() * (startMoveMousePos.getY() - e.y)) / 2;
moveByInWorld.z = (directionForZ.getX()
* (startMoveMousePos.getX() - e.x) - directionForZ
.getY() * (startMoveMousePos.getY() - e.y)) / 2;
moveByInWorld = moveByInWorld.scale(scale);
// System.out.println(moveByInWorld.y);
IGuideRenderer selectedGuide = brickMovementGuideRenderer
.getSelectedGuide();
boolean isAllMovable_New = true;
boolean isAllMovable_Current = true;
if (selectedGuide != null) {
boolean isRotation = false;
if (selectedGuide instanceof RotationGuide)
isRotation = true;
Vector3f guideDirection = new Vector3f(
selectedGuide.getAxisDirectionVector());
float projectedDistance = moveByInWorld.dot(guideDirection);
moveByInWorld = guideDirection.scale(projectedDistance);
moveByInWorld.round();
LDrawPart pointingPart = BrickMovementGuideRenderer
.getInstance().getLDrawPart();
Vector3f center = selectedGuide.getCenterPos();
if (center == null)
center = brickMovementGuideRenderer.getLDrawPart()
.position();
Matrix4 newTransform = null;
if (isRotation == false) {
newTransform = builder
.getResultTransformMatrixOfMoveDirectiveBy(
pointingPart, moveByInWorld, false);
} else {
projectedDistance = new Vector2f(e.x, e.y).sub(
startMoveMousePos).length();
if ((e.stateMask & SWT.CTRL) != 0)
projectedDistance = 90;
else if ((e.stateMask & SWT.SHIFT) != 0)
projectedDistance = 45;
newTransform = builder
.getResultTransformMatrixOfRotateDirectiveByFromCenter(
pointingPart,
Math.abs(projectedDistance),
moveByInWorld, center);
if (Float.isNaN(newTransform.getDet())) {
newTransform = pointingPart.transformationMatrix();
}
}
BrickGroupForTransform transformGroup = brickSelectionManager
.getBrickGroupForTransform();
isAllMovable_New = transformGroup.isAllMovable(
pointingPart, newTransform);
isAllMovable_Current = transformGroup.isAllMovable(
pointingPart, brickSelectionManager
.getStartMoveTransformMatrix(pointingPart));
// System.out.println("Current: "+isAllMovable_Current+", New: "+isAllMovable_New);
if (isAllMovable_New == true
|| isAllMovable_Current == false) {
transformGroup.applyTransform(pointingPart,
newTransform);
brickSelectionManager
.updateStartMoveTransformMatrixMap();
startMoveWorldPos = currentMoveWorldPos;
startMoveMousePos = new Vector2f(e.x, e.y);
}
}
}
break;
default:
break;
}
}
}
private void handleMouseRightButtonPressed(MouseEvent e) {
// System.out.println("handleMouseRightButtonPressed");
camera.startRotate(e.x, e.y);
}
private void handleMouseLeftButtonPressed(MouseEvent e) {
if ((e.stateMask & SWT.SHIFT) != 0 && (e.stateMask & SWT.CTRL) == 0
&& (e.stateMask & SWT.ALT) == 0) {
startMoveMousePosForCameraPanning = new Vector2f(e.x, e.y);
startMoveCameraPosForPanning = camera.getLookAtPos();
return;
}
LDrawPart pointingBrick = builder.getHittedPart(e.x, e.y, false);
IGuideRenderer selectedAxisGuide = brickMovementGuideRenderer
.getHittedAxisArrow(e.x, e.y);
if (Syringe.getInstance().isActivated()) {
if (pointingBrick != null
&& Syringe.getInstance().getColorCode() == null)
NotificationCenter.getInstance().postNotification(
NotificationMessageT.LDrawPartSelected,
new LDrawPartSelect(pointingBrick));
return;
}
// System.out.println("handleMouseLeftButtonPressed");
if (pointingBrick == null && selectedAxisGuide == null) {
builder.getBrickSelectionInfoRenderer().setOrigin(
new Vector2f(e.x, e.y));
builder.getBrickSelectionInfoRenderer().isVisible(true);
}
switch (BrickControlModeT.currentControlMode) {
case None:
case BrickControl:
case BrickControl_Direct:
case BrickControl_Guide:
// is Pointing a brick
startMovePart = pointingBrick;
// isPointing a guide mark
if (selectedAxisGuide != null
&& (pointingBrick == null || selectedAxisGuide
.getLastHittedDistance() < builder
.getLastHittedDistance())) {// guiding mark is
// pressed
brickMovementGuideRenderer.axisSelectedType(selectedAxisGuide);
startMoveMousePos = new Vector2f(e.x, e.y);
startMoveWorldPos = camera.screenToWorldXZ(e.x, e.y, 0);
startMoveWorldPos.y = camera.screenToWorldXY(e.x, e.y, 0).y;
BrickControlModeT.currentControlMode = BrickControlModeT.BrickControl_Guide;
boolean isRotationGuide = false;
LDrawPart centerPart = BrickMovementGuideRenderer.getInstance()
.getLDrawPart();
if (selectedAxisGuide instanceof RotationGuide)
isRotationGuide = true;
for (LDrawPart part : GlobalConnectivityManager.getInstance()
.getConnectedPart(centerPart,
selectedAxisGuide.getCenterConnectivity(),
selectedAxisGuide.getAxisDirectionVector(),
isRotationGuide))
brickSelectionManager.addPartToSelection(part);
} else if (pointingBrick != null) {// a brick is pointing
if (brickSelectionManager.containsInSelection(startMovePart) == false) {
startMovePart.setSelected(true);
startMovePart.isDraggingPart(true);
}
if (pointingBrick.getConnectivityMatrixItemList() == null)
builder.getMetaInfoRenderer().setShowBaseplate(false);
// init startPos to Move Brick
BrickControlModeT.currentControlMode = BrickControlModeT.BrickControl_Direct;
startMoveWorldPos = builder.getHittedPos(e.x, e.y, false);
startMovePartPos = startMovePart.position();
} else if (pointingBrick == null) {
BrickControlModeT.currentControlMode = BrickControlModeT.None;
}
IGuideRenderer selectedGuide = brickMovementGuideRenderer
.getSelectedGuide();
if (selectedGuide != null) {
IConnectivity conn = selectedGuide.getCenterConnectivity();
if (conn == null) {
ArrayList<LDrawPart> tempPartList = new ArrayList<LDrawPart>();
for (LDrawPart part : brickSelectionManager
.getSelectedPartList()) {
for (LDrawPart subPart : GlobalConnectivityManager
.getInstance().getConnectedPart(
part,
conn,
selectedAxisGuide
.getAxisDirectionVector(),
selectedGuide instanceof RotationGuide)) {
if (tempPartList.contains(subPart) == false
&& brickSelectionManager
.containsInSelection(part) == false)
tempPartList.add(subPart);
}
}
for (LDrawPart part : tempPartList)
brickSelectionManager.addPartToSelection(part);
} else {
if (brickSelectionManager.isEmpty() == false) {
LDrawPart selectedPart = brickSelectionManager
.getSelectedPartList().get(0);
for (LDrawPart part : GlobalConnectivityManager
.getInstance().getConnectedPart(
selectedPart,
conn,
selectedAxisGuide
.getAxisDirectionVector(),
selectedGuide instanceof RotationGuide)) {
if (brickSelectionManager.containsInSelection(part) == false) {
brickSelectionManager.addPartToSelection(part);
}
}
}
}
}
break;
default:
break;
}
if (pointingBrick != null) {
brickSelectionManager.updateStartMoveTransformMatrixMap();
}
}
private void handleMouseLeftButtonClicked(MouseEvent e) {
// System.out.println("Mouse Left Button Clicked " + e.x + " "
// + e.y);
LDrawPart selectedPart = builder.getHittedPart(e.x, e.y, false);
if (Syringe.getInstance().isActivated() == true) {
Syringe syringe = Syringe.getInstance();
if (selectedPart == null)
return;
if (syringe.getColorCode() == null) {
syringe.setColorCode(selectedPart.getLDrawColor()
.getColorCode());
NotificationCenter.getInstance().postNotification(
NotificationMessageT.LDrawColorSelected,
new LDrawColorSelected(syringe.getColorCode()));
} else {
LDrawColor newColor = ColorLibrary.sharedColorLibrary()
.colorForCode(syringe.getColorCode());
ColorChangeAction colorChangeAction = new ColorChangeAction();
colorChangeAction.addColorChangePart(selectedPart,
selectedPart.getLDrawColor(), newColor);
selectedPart.setLDrawColor(newColor);
LDrawUndoRedoManager.getInstance().pushUndoAction(
colorChangeAction);
NotificationCenter.getInstance().postNotification(
NotificationMessageT.LDrawDirectiveDidChange,
new LDrawDirectiveModified(selectedPart));
}
} else {
if (brickMovementGuideRenderer.getSelectedGuide() == null) {
if (selectedPart != null) {
System.out.println("Clicked Brick: "
+ selectedPart.displayName() + ", Pos: "
+ selectedPart.position());
System.out.print("Connectible other Bricks: ");
// for (String partName : BrickFinder.getInstance()
// .findConnectibleBrick(selectedPart))
// System.out.print(partName + ", ");
// System.out.println("");
if (brickSelectionManager.containsInSelection(selectedPart) == false) {
// add to selecting list
brickSelectionManager.addPartToSelection(selectedPart);
BrickControlModeT.currentControlMode = BrickControlModeT.BrickControl;
} else {
ConnectivityTestResult testResult = GlobalConnectivityManager
.getInstance().isConnectable(selectedPart);
if (configurationManager.isUseConnectivity() == false
|| testResult.getResultType() != ConnectivityTestResultT.False) {
brickSelectionManager
.removePartFromSelection(selectedPart);
if (configurationManager.isTurnOffSound() == false)
if (testResult.getResultType() != ConnectivityTestResultT.False)
SoundEffectManager
.getInstance()
.playSoundEffect(
SoundEffectT.ConnectingSuccess);
}
if (configurationManager.isTurnOffSound() == false)
if (testResult.getResultType() == ConnectivityTestResultT.False) {
SoundEffectManager.getInstance()
.playSoundEffect(
SoundEffectT.ConnectingFail);
System.out.println(testResult.getMsg());
}
}
handleBrickControlGuideDisplay(false);
} else {
if (brickSelectionManager.isEmpty() == false) {
if (brickSelectionManager
.isAllSelectedPartConnectible()) {
brickSelectionManager.clearSelection(true);
if (configurationManager.isTurnOffSound() == false)
SoundEffectManager.getInstance()
.playSoundEffect(
SoundEffectT.ConnectingSuccess);
} else {
if (configurationManager.isTurnOffSound() == false)
SoundEffectManager.getInstance()
.playSoundEffect(
SoundEffectT.ConnectingFail);
}
}
}
}
if (brickSelectionManager.isEmpty())
BrickControlModeT.currentControlMode = BrickControlModeT.None;
if (brickSelectionManager.isEmpty() == true)
builder.getMetaInfoRenderer().setShowBaseplate(
BuilderConfigurationManager.getInstance()
.isUseDefaultBaseplate());
// if(brickSelectionManager.getNumOfSelectedParts()==1)
// handleBrickControlGuideDisplay(false);
// else
// handleBrickControlGuideDisplay(true);
}
}
private void handleMouseRightButtonReleased(MouseEvent e) {
brickSelectionManager.updateScreenProjectionVerticesMapAll();
}
private void handleMouseLeftButtonReleased(MouseEvent e) {
// System.out.println("hansdleMouseLeftButtonReleased");
switch (BrickControlModeT.currentControlMode) {
case BrickSelectingDrag:
if (brickSelectionManager.isEmpty())
BrickControlModeT.currentControlMode = BrickControlModeT.None;
else
BrickControlModeT.currentControlMode = BrickControlModeT.BrickControl;
builder.getBrickSelectionInfoRenderer().isVisible(false);
handleBrickControlGuideDisplay(true);
break;
case BrickControl_Direct:
handleChangePartsTransform();
brickSelectionManager.updateStartMoveTransformMatrixMap();
if (brickSelectionManager.isTheOnlySelectedPart(startMovePart)) {
ConnectivityTestResult testResult = GlobalConnectivityManager
.getInstance().isConnectable(startMovePart);
if (testResult.getResultType() != ConnectivityTestResultT.False) {
// brickSelectionManager
// .removePartFromSelection(startMovePart);
BrickControlModeT.currentControlMode = BrickControlModeT.None;
if (configurationManager.isTurnOffSound() == false)
if (testResult.getResultType() != ConnectivityTestResultT.False)
SoundEffectManager.getInstance().playSoundEffect(
SoundEffectT.ConnectingSuccess);
} else {
System.out.println(testResult.getMsg());
if (configurationManager.isTurnOffSound() == false)
SoundEffectManager.getInstance().playSoundEffect(
SoundEffectT.ConnectingFail);
}
} else {
if (brickSelectionManager.isAllSelectedPartConnectible()) {
// brickSelectionManager.clearSelection();
if (configurationManager.isTurnOffSound() == false)
SoundEffectManager.getInstance().playSoundEffect(
SoundEffectT.ConnectingSuccess);
} else {
if (configurationManager.isTurnOffSound() == false)
SoundEffectManager.getInstance().playSoundEffect(
SoundEffectT.ConnectingFail);
}
}
break;
case BrickControl_Guide:
handleChangePartsTransform();
if (brickMovementGuideRenderer.getSelectedGuide() != null)
if (brickMovementGuideRenderer.getSelectedGuide()
.getCenterConnectivity() != null) {
LDrawPart part = brickMovementGuideRenderer
.getSelectedGuide().getCenterConnectivity()
.getConnectivity().getParent();
brickSelectionManager.clearSelection();
brickSelectionManager.addPartToSelection(part);
handleBrickControlGuideDisplay(false);
}
break;
default:
break;
}
if (brickSelectionManager.isEmpty() == true)
builder.getMetaInfoRenderer().setShowBaseplate(
BuilderConfigurationManager.getInstance()
.isUseDefaultBaseplate());
}
private void handleBrickControlGuideDisplay(boolean showGroupControlGuide) {
LDrawPart lastSelectedPart = null;
if (brickSelectionManager.isEmpty())
lastSelectedPart = null;
else
lastSelectedPart = brickSelectionManager.getLastPart();
if (showGroupControlGuide)
brickMovementGuideRenderer.setLDrawPart(lastSelectedPart, true);
else
brickMovementGuideRenderer.setLDrawPart(lastSelectedPart, false);
}
private void handleChangePartsTransform() {
builder.handleTransformChanged_SelectedDirective();
}
private void handleMouseRightButtonClicked(MouseEvent e) {
// System.out.println("Mouse Right Button Clicked ");
LDrawPart selectedPart = builder.getHittedPart(e.x, e.y, false);
if (selectedPart != null) {// pointing a brick
camera.moveTo(selectedPart.position());
brickSelectionManager.updateScreenProjectionVerticesMapAll();
brickSelectionManager.removePartFromSelection(selectedPart);
brickSelectionManager.addPartToSelection(selectedPart);
}
handleBrickControlGuideDisplay(true);
}
int indexForTest = 0;
@Override
public void keyPressed(KeyEvent event) {
LinkedHashMap<ShortcutKeyT, String> keyMap = ShortcutKeyManager
.getInstance().getKeyMap();
String keyCodeString = KeyCodeStringUtil.getKeyCodeString(event);
// System.out.println(keyCodeString);
ShortcutKeyT function = null;
for (Entry<ShortcutKeyT, String> entry : keyMap.entrySet()) {
if (entry.getValue().toLowerCase()
.equals(keyCodeString.toLowerCase())) {
function = entry.getKey();
break;
}
}
if (function == null)
return;
switch (function) {
case CancelSelection:
if (BrickSelectionManager.getInstance().isEmpty() == false) {
BrickSelectionManager.getInstance().clearSelection();
BrickControlModeT.currentControlMode = BrickControlModeT.None;
}
builder.getMetaInfoRenderer().setShowBaseplate(
BuilderConfigurationManager.getInstance()
.isUseDefaultBaseplate());
break;
case Save:
if (builder.getWorkingLDrawFile() != null)
builder.saveFile();
break;
case MemorizeCameraPos1:
case MemorizeCameraPos2:
case MemorizeCameraPos3:
case MemorizeCameraPos4:
CameraMoveShortCutManager.getInstance().regPos("" + event.keyCode,
camera.getLookAtPos());
break;
case MoveCameraToPos1:
case MoveCameraToPos2:
case MoveCameraToPos3:
case MoveCameraToPos4:
Vector3f pos = CameraMoveShortCutManager.getInstance().getPos(
"" + event.keyCode);
if (pos != null) {
camera.moveTo(pos);
brickSelectionManager.updateScreenProjectionVerticesMapAll();
}
break;
case HideSelectedParts:
builder.hideSelectedParts();
break;
case ShowAll:
indexForTest = 0;
builder.showAllStep();
break;
case HideAll:
indexForTest = 0;
builder.hideAllStep();
break;
case ShowSequencially:
ArrayList<LDrawPart> partList = MOCBuilder.getInstance()
.getAllPartInActiveModel();
indexForTest %= partList.size();
partList.get(indexForTest).setHidden(false);
indexForTest++;
break;
case Cut:
CopyNPasteManager.getInstance().setCutList(
brickSelectionManager.getSelectedPartList());
break;
case Undo:
LDrawUndoRedoManager.getInstance().undo();
break;
case Redo:
LDrawUndoRedoManager.getInstance().redo();
break;
case Copy:
CopyNPasteManager.getInstance().setCopyList(
brickSelectionManager.getSelectedPartList());
break;
case Paste:
Vector2f mousePos = GlobalMousePosition.getInstance().getPos();
CopyNPasteManager.getInstance().paste(
builder.getHittedPos(mousePos.getX(), mousePos.getY(),
false));
break;
case Delete: {
DirectiveAction action = new DirectiveAction();
for (LDrawPart part : BrickSelectionManager.getInstance()
.getSelectedPartList())
action.removeDirective(part);
LDrawUndoRedoManager.getInstance().pushUndoAction(action);
builder.removeSelectedDirective();
GlobalFocusManager.getInstance().forceFocusToMainView();
}
break;
case RotateX90C:
handleRotateSelectedBrick(new Vector3f(90, 0, 0));
break;
case RotateX45C:
handleRotateSelectedBrick(new Vector3f(45, 0, 0));
break;
case RotateX15C:
handleRotateSelectedBrick(new Vector3f(15, 0, 0));
break;
case RotateX5C:
handleRotateSelectedBrick(new Vector3f(5, 0, 0));
break;
case RotateX90CC:
handleRotateSelectedBrick(new Vector3f(-90, 0, 0));
break;
case RotateX45CC:
handleRotateSelectedBrick(new Vector3f(-45, 0, 0));
break;
case RotateX15CC:
handleRotateSelectedBrick(new Vector3f(-15, 0, 0));
break;
case RotateX5CC:
handleRotateSelectedBrick(new Vector3f(-5, 0, 0));
break;
case RotateY90C:
handleRotateSelectedBrick(new Vector3f(0, -90, 0));
break;
case RotateY45C:
handleRotateSelectedBrick(new Vector3f(0, -45, 0));
break;
case RotateY15C:
handleRotateSelectedBrick(new Vector3f(0, -15, 0));
break;
case RotateY5C:
handleRotateSelectedBrick(new Vector3f(0, -5, 0));
break;
case RotateY90CC:
handleRotateSelectedBrick(new Vector3f(0, 90, 0));
break;
case RotateY45CC:
handleRotateSelectedBrick(new Vector3f(0, 45, 0));
break;
case RotateY15CC:
handleRotateSelectedBrick(new Vector3f(0, 15, 0));
break;
case RotateY5CC:
handleRotateSelectedBrick(new Vector3f(0, 5, 0));
break;
case RotateZ90C:
handleRotateSelectedBrick(new Vector3f(0, 0, 90));
break;
case RotateZ45C:
handleRotateSelectedBrick(new Vector3f(0, 0, 45));
break;
case RotateZ15C:
handleRotateSelectedBrick(new Vector3f(0, 0, 15));
break;
case RotateZ5C:
handleRotateSelectedBrick(new Vector3f(0, 0, 5));
break;
case RotateZ90CC:
handleRotateSelectedBrick(new Vector3f(0, 0, -90));
break;
case RotateZ45CC:
handleRotateSelectedBrick(new Vector3f(0, 0, -45));
break;
case RotateZ15CC:
handleRotateSelectedBrick(new Vector3f(0, 0, -15));
break;
case RotateZ5CC:
handleRotateSelectedBrick(new Vector3f(0, 0, -5));
break;
case MoveXF:
handleMoveSelectedBrick(Direction6T.X_Plus);
break;
case MoveXB:
handleMoveSelectedBrick(Direction6T.X_Minus);
break;
case MoveYF:
handleMoveSelectedBrick(Direction6T.Y_Minus);
break;
case MoveYB:
handleMoveSelectedBrick(Direction6T.Y_Plus);
break;
case MoveZF:
handleMoveSelectedBrick(Direction6T.Z_Plus);
break;
case MoveZB:
handleMoveSelectedBrick(Direction6T.Z_Minus);
break;
case MoveCamera:
Vector2f currentMousePos = GlobalMousePosition.getInstance()
.getPos();
pos = builder.getHittedPos(currentMousePos.getX(),
currentMousePos.getY(), true);
builder.getCamera().moveTo(pos);
BrickSelectionManager.getInstance()
.updateScreenProjectionVerticesMapAll();
break;
case FindNReplace:
new PartReplaceDlg(Display.getCurrent().getActiveShell(),
SWT.DIALOG_TRIM | SWT.ON_TOP).open();
break;
case OpenConnectivityEditor:
if (brickSelectionManager.getNumOfSelectedParts() == 1) {
LDrawPart part = brickSelectionManager.getSelectedPartList()
.get(0);
ConnectivityEditorUI.getInstance(part.getDisplayName());
} else
ConnectivityEditorUI.getInstance(null);
break;
case NewGroup: {
builder.addStepToWorkingFile();
DirectiveAction action = new DirectiveAction();
LDrawDirective directive;
directive = builder.getCurrentStep();
action.addDirective(directive);
LDrawUndoRedoManager.getInstance().pushUndoAction(action);
}
break;
case RemoveGroup:{
DirectiveAction action = new DirectiveAction();
LDrawDirective directive;
directive = builder.getCurrentStep();
action.removeDirective(directive);
LDrawUndoRedoManager.getInstance().pushUndoAction(action);
builder.removeDirectiveFromWorkingFile(builder.getCurrentStep());
}
break;
case GroupSelectedParts:
builder.makeNewStepFromSeletion();
break;
case GenerateGropusBastedOnConnection:
GroupingManager.getInstance().doGrouping(builder.getCurrentStep());
break;
case PutAllPartsIntoASingleGroup:
GroupingManager.getInstance().mergeAll();
break;
case RemoveEmptyGroups:
builder.removeEmptyStep();
break;
case NewSubmodel:
builder.makeASubmodel();
break;
case RemoveSubmodel:
builder.removeModel(builder.getActiveModel());
break;
case MakeSelectedPartsIntoSubmodel:
builder.makeASubmodelFromSelection();
break;
case ExtractSubmodel:
if (BrickSelectionManager.getInstance().isEmpty())
return;
LDrawPart part = BrickSelectionManager.getInstance().getFirstPart();
if (BrickSelectionManager.getInstance().isTheOnlySelectedPart(part) == false)
return;
if (part.getCacheType() != PartTypeT.PartTypeSubmodel)
return;
builder.extractPartsFromASubmodel(part);
break;
default:
System.out.println("Error!!");
}
// switch (event.keyCode) {
// case SWT.F5:
// if (brickSelectionManager.getNumOfSelectedParts() == 1) {
// LDrawPart part = brickSelectionManager.getSelectedPartList()
// .get(0);
// ConnectivityLibrary.getInstance().getConnectivity(
// part.displayName(), true, false);
// part.getConnectivityList(true, false);
//
// }
// break;
// case SWT.TAB:
// if (isAltKeyPressed) {
// isAltKeyPressed = isShiftKeyPressed = isCtrlKeyPressed = false;
// }
// }
NotificationCenter.getInstance().postNotification(
NotificationMessageT.NeedReDraw);
}
private void handleMoveSelectedBrick(Direction6T direction) {
if (brickSelectionManager.isEmpty())
return;
LDrawPart part = brickSelectionManager.getSelectedPartList().get(0);
Vector3f moveByInWorld = null;
switch (direction) {
case X_Minus:
moveByInWorld = new Vector3f(-1, 0, 0)
.scale(BuilderConfigurationManager.getInstance()
.getGridUnit().getXZValue());
break;
case X_Plus:
moveByInWorld = new Vector3f(1, 0, 0)
.scale(BuilderConfigurationManager.getInstance()
.getGridUnit().getXZValue());
break;
case Y_Minus:
moveByInWorld = new Vector3f(0, -1, 0)
.scale(BuilderConfigurationManager.getInstance()
.getGridUnit().getYValue());
break;
case Y_Plus:
moveByInWorld = new Vector3f(0, 1, 0)
.scale(BuilderConfigurationManager.getInstance()
.getGridUnit().getYValue());
break;
case Z_Minus:
moveByInWorld = new Vector3f(0, 0, -1)
.scale(BuilderConfigurationManager.getInstance()
.getGridUnit().getXZValue());
break;
case Z_Plus:
moveByInWorld = new Vector3f(0, 0, 1)
.scale(BuilderConfigurationManager.getInstance()
.getGridUnit().getXZValue());
break;
}
Matrix4 newTransform = null;
newTransform = builder.getResultTransformMatrixOfMoveDirectiveBy(part,
moveByInWorld, false);
brickSelectionManager.getBrickGroupForTransform().applyTransform(part,
newTransform);
handleChangePartsTransform();
}
private void handleRotateSelectedBrick(Vector3f rotationVector) {
ArrayList<LDrawPart> partList = BrickSelectionManager.getInstance()
.getSelectedPartList();
if (partList.size() == 0)
return;
builder.rotateSelectedDirectiveBy(rotationVector);
}
private void handleFindConnectibleBricks() {
if (BrickSelectionManager.getInstance().isEmpty() == false) {
LDrawPart part = BrickSelectionManager.getInstance()
.getSelectedPartList().get(0);
if (BrickSelectionManager.getInstance().isTheOnlySelectedPart(part)) {
for (String partName : BrickFinder.getInstance()
.findConnectibleBrick(part))
System.out.println(partName);
}
}
}
@Override
public void keyReleased(KeyEvent event) {
}
}