public static RenderableBlock makeRenderable( Workspace workspace, BlockNode node, WorkspaceWidget widget) { String genusName = node.getGenusName(); // genusName may not be null RenderableBlock renderable = BlockUtilities.getBlock(workspace, genusName, node.getLabel()); if (renderable == null) { throw new RuntimeException("No children block exists for this genus: " + genusName); } Block block = Block.getBlock(renderable.getBlockID()); // assume not null widget.blockDropped(renderable); for (int i = 0; i < node.getChildren().size(); i++) { BlockConnector socket = block.getSocketAt(i); BlockNode child = node.getChildren().get(i); RenderableBlock childRenderable = makeRenderable(workspace, child, widget); Block childBlock = Block.getBlock(childRenderable.getBlockID()); // link blocks BlockLink link; if (childBlock.hasPlug()) { link = BlockLinkChecker.canLink(workspace, block, childBlock, socket, childBlock.getPlug()); } else if (childBlock.hasBeforeConnector()) { link = BlockLinkChecker.canLink( workspace, block, childBlock, socket, childBlock.getBeforeConnector()); } else { link = null; } // assume link is not null link.connect(); workspace.notifyListeners( new WorkspaceEvent( workspace, RenderableBlock.getRenderableBlock(link.getPlugBlockID()).getParentWidget(), link, WorkspaceEvent.BLOCKS_CONNECTED)); } if (node.getAfterNode() != null) { BlockConnector socket = block.getAfterConnector(); // assume has after connector BlockNode child = node.getAfterNode(); RenderableBlock childRenderable = makeRenderable(workspace, child, widget); Block childBlock = Block.getBlock(childRenderable.getBlockID()); // link blocks BlockLink link; if (childBlock.hasPlug()) { link = BlockLinkChecker.canLink(workspace, block, childBlock, socket, childBlock.getPlug()); } else if (childBlock.hasBeforeConnector()) { link = BlockLinkChecker.canLink( workspace, block, childBlock, socket, childBlock.getBeforeConnector()); } else { link = null; } // assume link is not null link.connect(); workspace.notifyListeners( new WorkspaceEvent( workspace, RenderableBlock.getRenderableBlock(link.getPlugBlockID()).getParentWidget(), link, WorkspaceEvent.BLOCKS_CONNECTED)); } return renderable; }
/** * @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() { // ====================>>>>>>>>>>>>>>>>>>>>>>>>> // ====================focus coming in>>>>>>>>>>TODO // ====================>>>>>>>>>>>>>>>>>>>>>>>>> // 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); // <<<<<<<<<<<<<<<<<<<<<<<<<<========================== // <<<<<<<<<<<<<<<<<<<<<<<<<<focus changing, coming out TODO // <<<<<<<<<<<<<<<<<<<<<<<<<<========================== // If the deleted block had a parent, give the parent the focus, // 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; } }