Search in sources :

Example 1 with BlockLink

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();
}
Also used : WorkspaceEvent(edu.mit.blocks.workspace.WorkspaceEvent) BlockLink(edu.mit.blocks.codeblocks.BlockLink) MiniMap(edu.mit.blocks.workspace.MiniMap) WorkspaceWidget(edu.mit.blocks.workspace.WorkspaceWidget) PopupMenu(java.awt.PopupMenu)

Example 2 with BlockLink

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;
    }
}
Also used : Container(java.awt.Container) WorkspaceEvent(edu.mit.blocks.workspace.WorkspaceEvent) RenderableBlock(edu.mit.blocks.renderable.RenderableBlock) Block(edu.mit.blocks.codeblocks.Block) RenderableBlock(edu.mit.blocks.renderable.RenderableBlock) TextualFactoryBlock(edu.mit.blocks.renderable.TextualFactoryBlock) BlockLink(edu.mit.blocks.codeblocks.BlockLink) BlockConnector(edu.mit.blocks.codeblocks.BlockConnector) Point(java.awt.Point) WorkspaceWidget(edu.mit.blocks.workspace.WorkspaceWidget)

Example 3 with BlockLink

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));
    }
}
Also used : WorkspaceEvent(edu.mit.blocks.workspace.WorkspaceEvent) BlockLink(edu.mit.blocks.codeblocks.BlockLink)

Example 4 with BlockLink

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));
}
Also used : WorkspaceEvent(edu.mit.blocks.workspace.WorkspaceEvent) RenderableBlock(edu.mit.blocks.renderable.RenderableBlock) Block(edu.mit.blocks.codeblocks.Block) RenderableBlock(edu.mit.blocks.renderable.RenderableBlock) TextualFactoryBlock(edu.mit.blocks.renderable.TextualFactoryBlock) BlockLink(edu.mit.blocks.codeblocks.BlockLink) BlockConnector(edu.mit.blocks.codeblocks.BlockConnector)

Example 5 with BlockLink

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();
        }
    }
}
Also used : WorkspaceEvent(edu.mit.blocks.workspace.WorkspaceEvent) Block(edu.mit.blocks.codeblocks.Block) BlockLink(edu.mit.blocks.codeblocks.BlockLink) BlockConnector(edu.mit.blocks.codeblocks.BlockConnector) Point(java.awt.Point) WorkspaceWidget(edu.mit.blocks.workspace.WorkspaceWidget)

Aggregations

BlockLink (edu.mit.blocks.codeblocks.BlockLink)6 WorkspaceEvent (edu.mit.blocks.workspace.WorkspaceEvent)6 Block (edu.mit.blocks.codeblocks.Block)4 BlockConnector (edu.mit.blocks.codeblocks.BlockConnector)4 WorkspaceWidget (edu.mit.blocks.workspace.WorkspaceWidget)3 RenderableBlock (edu.mit.blocks.renderable.RenderableBlock)2 TextualFactoryBlock (edu.mit.blocks.renderable.TextualFactoryBlock)2 Point (java.awt.Point)2 MiniMap (edu.mit.blocks.workspace.MiniMap)1 Container (java.awt.Container)1 PopupMenu (java.awt.PopupMenu)1