use of edu.mit.blocks.codeblocks.BlockLink in project openblocks by mikaelhg.
the class RenderableBlock method mouseReleased.
public void mouseReleased(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
if (pickedUp) {
dragHandler.mouseReleased(e);
// if the block was dragged before...then
if (dragging) {
// look for nearby link opportunities
BlockLink link = getNearbyLink();
WorkspaceWidget widget = null;
// if a suitable link wasn't found, just drop the block
if (link == null) {
widget = lastDragWidget;
stopDragging(this, widget);
} else // otherwise, if a link WAS found...
{
/* Make sure that no matter who's connecting to whom, the block
* that's being dragged gets dropped on the parent widget of the
* block that's already on the canvas.
*/
if (blockID.equals(link.getSocketBlockID())) {
// dragged block is the socket block, so take plug's parent.
widget = workspace.getEnv().getRenderableBlock(link.getPlugBlockID()).getParentWidget();
} else {
// dragged block is the plug block, so take the socket block's parent.
widget = workspace.getEnv().getRenderableBlock(link.getSocketBlockID()).getParentWidget();
}
// drop the block and connect its link
stopDragging(this, widget);
link.connect();
workspace.notifyListeners(new WorkspaceEvent(workspace, widget, link, WorkspaceEvent.BLOCKS_CONNECTED));
workspace.getEnv().getRenderableBlock(link.getSocketBlockID()).moveConnectedBlocks();
}
// set the locations for X and Y based on zoom at 1.0
this.unzoomedX = this.calculateUnzoomedX(this.getX());
this.unzoomedY = this.calculateUnzoomedY(this.getY());
workspace.notifyListeners(new WorkspaceEvent(workspace, widget, link, WorkspaceEvent.BLOCK_MOVED, true));
if (widget instanceof MiniMap) {
workspace.getMiniMap().animateAutoCenter(this);
}
}
}
}
pickedUp = false;
if (e.isPopupTrigger() || SwingUtilities.isRightMouseButton(e) || e.isControlDown()) {
// add context menu at right click location to provide functionality
// for adding new comments and removing comments
PopupMenu popup = ContextMenu.getContextMenuFor(this);
add(popup);
popup.show(this, e.getX(), e.getY());
}
workspace.getMiniMap().repaint();
}
use of edu.mit.blocks.codeblocks.BlockLink in project openblocks by mikaelhg.
the class TypeBlockManager method deleteBlockAndChildren.
/**
* @requires the current block with focus must exist with non-null
* ID in a non-null widget with a non-null parent
* @modifies the current block with focus
* @effects removes the current block with focus and children
* from the GUI and destroys the link
* between the block with focus and it's parent
* block if one exist and children blocks
* if it has childrens.
*/
private void deleteBlockAndChildren() {
// Do not delete null block references. Otherwise, get Block and RenderableBlock instances.
if (isNullBlockInstance(focusManager.getFocusBlockID())) {
throw new RuntimeException("TypeBlockManager: deleting a null block references.");
}
Block block = workspace.getEnv().getBlock(focusManager.getFocusBlockID());
RenderableBlock renderable = workspace.getEnv().getRenderableBlock(block.getBlockID());
// get workspace widget associated with current focus
WorkspaceWidget widget = renderable.getParentWidget();
// do not delete block instances in null widgets
if (widget == null) {
throw new RuntimeException("TypeBlockManager: do not delete blocks with no parent widget.");
// return;
}
// get parent container of this graphical representation
Container container = renderable.getParent();
// do not delete block instances in null parents
if (container == null) {
throw new RuntimeException("TypeBlockManager: do not delete blocks with no parent container.");
// return;
}
// get the Block's location on the canvas
Point location = SwingUtilities.convertPoint(renderable, new Point(0, 0), this.blockCanvas.getCanvas());
// for every valid and active connection, disconnect it.
Long parentID = null;
if (validConnection(block.getPlug())) {
parentID = block.getPlugBlockID();
this.disconnectBlock(block, widget);
if (validConnection(block.getAfterConnector())) {
disconnectBlock(workspace.getEnv().getBlock(block.getAfterBlockID()), widget);
}
} else if (validConnection(block.getBeforeConnector())) {
parentID = block.getBeforeBlockID();
BlockConnector parentConnectorToBlock = workspace.getEnv().getBlock(parentID).getConnectorTo(block.getBlockID());
this.disconnectBlock(block, widget);
if (validConnection(block.getAfterConnector())) {
Long afterBlockID = block.getAfterBlockID();
disconnectBlock(workspace.getEnv().getBlock(afterBlockID), widget);
if (parentID != null) {
BlockLink link = BlockLinkChecker.canLink(workspace, workspace.getEnv().getBlock(parentID), workspace.getEnv().getBlock(afterBlockID), parentConnectorToBlock, workspace.getEnv().getBlock(afterBlockID).getBeforeConnector());
if (link != null) {
link.connect();
workspace.notifyListeners(new WorkspaceEvent(workspace, workspace.getEnv().getRenderableBlock(link.getPlugBlockID()).getParentWidget(), link, WorkspaceEvent.BLOCKS_CONNECTED));
workspace.getEnv().getRenderableBlock(link.getPlugBlockID()).repaintBlock();
workspace.getEnv().getRenderableBlock(link.getPlugBlockID()).repaint();
workspace.getEnv().getRenderableBlock(link.getPlugBlockID()).moveConnectedBlocks();
workspace.getEnv().getRenderableBlock(link.getSocketBlockID()).repaintBlock();
workspace.getEnv().getRenderableBlock(link.getSocketBlockID()).repaint();
}
}
}
} else if (validConnection(block.getAfterConnector())) {
parentID = block.getAfterBlockID();
}
// remove form widget and container
this.removeChildrenBlock(renderable, widget, container);
// Otherwise, give the focus to the canvas (NOT BLOCK CANVAS)
if (invalidBlockID(parentID)) {
this.focusManager.setFocus(location, Block.NULL);
this.blockCanvas.getCanvas().requestFocus();
return;
} else {
this.focusManager.setFocus(parentID);
this.blockCanvas.getCanvas().requestFocus();
return;
}
}
use of edu.mit.blocks.codeblocks.BlockLink in project openblocks by mikaelhg.
the class BlockDropAnimator method actionPerformed.
// Keep moving the block until it reaches it's destination
public void actionPerformed(ActionEvent e) {
if (childBlock.getLocation().distance(focusPoint) < 75) {
// if parent block exist, then preform automatic linking
childBlock.setLocation(focusPoint);
if (parentBlock != null && parentBlock.getBlockID() != null && !parentBlock.getBlockID().equals(Block.NULL)) {
BlockLink link = LinkFinderUtil.connectBlocks(workspace, workspace.getEnv().getBlock(childBlock.getBlockID()), workspace.getEnv().getBlock(parentBlock.getBlockID()));
if (link == null) {
dropBlock(childBlock);
childBlock.repaintBlock();
childBlock.repaint();
} else {
// drop and link the new block
link.connect();
dropBlock(childBlock);
workspace.notifyListeners(new WorkspaceEvent(workspace, workspace.getEnv().getRenderableBlock(link.getPlugBlockID()).getParentWidget(), link, WorkspaceEvent.BLOCKS_CONNECTED));
workspace.getEnv().getRenderableBlock(link.getSocketBlockID()).moveConnectedBlocks();
workspace.getEnv().getRenderableBlock(link.getSocketBlockID()).repaintBlock();
workspace.getEnv().getRenderableBlock(link.getSocketBlockID()).repaint();
}
} else {
dropBlock(childBlock);
childBlock.repaintBlock();
childBlock.repaint();
}
// stop the timer
timer.stop();
if (workspace.getEnv().getBlock(childBlock.getBlockID()).getGenusName().equals("number")) {
childBlock.switchToLabelEditingMode(false);
} else {
childBlock.switchToLabelEditingMode(true);
}
// TODO: check if focumanager's before parent is same as
// the parent we have here and check if new focusblock is child block
PageChangeEventManager.notifyListeners();
} else {
// childBlock.setLocation(focusPoint);
// TODO: This needs to change if the parent block doesn't have any more sockets for children
// Need to adjust focusPoint somehow.
childBlock.setLocation((int) (focusPoint.getX() * 0.67) + (int) (childBlock.getX() * 0.34), (int) (focusPoint.getY() * 0.67) + (int) (childBlock.getY() * 0.34));
}
}
use of edu.mit.blocks.codeblocks.BlockLink in project openblocks by mikaelhg.
the class TypeBlockManager method disconnectBlock.
/**
* @param childBlock
* @param widget
*
* @requires widget != null
* @modifies
* @effects Does nothing if: childBlock is invalid (null)
* Otherwise, remove childBlock from it's parent block
* if the childBlock has a parent. If it does not have
* a parent, do nothing.
*/
private void disconnectBlock(Block childBlock, WorkspaceWidget widget) {
if (childBlock == null || invalidBlockID(childBlock.getBlockID())) {
return;
}
BlockConnector childPlug = BlockLinkChecker.getPlugEquivalent(childBlock);
if (childPlug == null || !childPlug.hasBlock() || isNullBlockInstance(childPlug.getBlockID())) {
return;
}
Block parentBlock = workspace.getEnv().getBlock(childPlug.getBlockID());
BlockConnector parentSocket = parentBlock.getConnectorTo(childBlock.getBlockID());
if (parentSocket == null) {
return;
}
// disconector if child connector exists and has a block connected to it
BlockLink link = BlockLink.getBlockLink(workspace, childBlock, parentBlock, childPlug, parentSocket);
if (link == null) {
return;
}
link.disconnect();
RenderableBlock parentRenderable = workspace.getEnv().getRenderableBlock(parentBlock.getBlockID());
if (parentRenderable == null) {
throw new RuntimeException("INCONSISTANCY VIOLATION: " + "parent block was valid, non-null, and existed.\n\tBut yet, when we get it's renderable" + "representation, we recieve a null instance.\n\tIf the Block instance of an ID is non-null" + "then its graphical RenderableBlock should be non-null as well");
}
parentRenderable.blockDisconnected(parentSocket);
workspace.notifyListeners(new WorkspaceEvent(workspace, widget, link, WorkspaceEvent.BLOCKS_DISCONNECTED));
}
use of edu.mit.blocks.codeblocks.BlockLink in project openblocks by mikaelhg.
the class RenderableBlock method mouseDragged.
public void mouseDragged(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
if (pickedUp) {
Point pp = SwingUtilities.convertPoint(this, e.getPoint(), workspace.getMiniMap());
if (workspace.getMiniMap().contains(pp)) {
workspace.getMiniMap().blockDragged(this, e.getPoint());
lastDragWidget = workspace.getMiniMap();
return;
}
// drag this block if appropriate (checks bounds first)
dragHandler.mouseDragged(e);
// Find the widget under the mouse
dragHandler.myLoc.move(getX() + dragHandler.mPressedX, getY() + dragHandler.mPressedY);
Point p = SwingUtilities.convertPoint(this.getParent(), dragHandler.myLoc, workspace);
WorkspaceWidget widget = workspace.getWidgetAt(p);
if (widget == null) {
// not on a workspace widget, cancel dragging
return;
}
// if this is the first call to mouseDragged
if (!dragging) {
Block block = getBlock();
BlockConnector plug = BlockLinkChecker.getPlugEquivalent(block);
if (plug != null && plug.hasBlock()) {
Block parent = workspace.getEnv().getBlock(plug.getBlockID());
BlockConnector socket = parent.getConnectorTo(blockID);
BlockLink link = BlockLink.getBlockLink(workspace, block, parent, plug, socket);
link.disconnect();
// socket is removed internally from block's socket list if socket is expandable
workspace.getEnv().getRenderableBlock(parent.getBlockID()).blockDisconnected(socket);
// NOTIFY WORKSPACE LISTENERS OF DISCONNECTION
workspace.notifyListeners(new WorkspaceEvent(workspace, widget, link, WorkspaceEvent.BLOCKS_DISCONNECTED));
}
startDragging(this, widget);
}
// drag this block and all attached to it
drag(this, dragHandler.dragDX, dragHandler.dragDY, widget, true);
workspace.getMiniMap().repaint();
}
}
}
Aggregations