/* draw7: link item movements */ import java.awt.*; public class Draw7 extends Draw6 { Item newItem() { return (Item)(new Item7()); } Item7 item7(int i) { return (Item7)item[i]; } int iLink = -1; int linkKey = -1; boolean isRight = false, isClick = false; Color linkBgColor = new Color(140,140,140); // RE-INITIALIZING ALSO CLEARS THE CURRENT LINK ITEM public void clear() { iLink = -1; linkKey = -1; super.clear(); } // INDICATE LINKING MODE WITH A DARK BACKGROUND COLOR public Color bgColor() { bgColorData = iLink >= 0 ? linkBgColor : Color.white; return super.bgColor(); } // SHADOW OF A LINK ITEM IS THICKER THAN USUAL public void renderShadow() { if (iLink >= 0) { if (iSelected >= 0) { setShadow(iSelected); int r = item2(iSelected).r + (item7(iSelected).thicken ? 2 : 0); item7(iSelected).draw(g, 10, 10, iSelected==iLink ? 5*r/2 : r); } } else super.renderShadow(); } // BEFORE RENDERING BACKGROUND: HIGHLIGHT THE LINK ITEM, IF ANY, // AND LET EACH ITEM KNOW WHETHER THE APP. IS IN LINKING MODE public void renderBg() { for (int i = 0 ; i < nItems ; i++) { item7(i).setHighlighted(i == iLink); item7(i).setLinkingMode(iLink >= 0); } super.renderBg(); } // RIGHT-DRAG AN ITEM TO START OR CONTINUE USING IT AS THE LINK ITEM // RIGHT-CLICK TO TOGGLE LINK MODE int mdx = 0, mdy = 0; public boolean mouseDown(Event e, int x, int y) { isClick = true; isRight = isRightButton(e); mdx = x; mdy = y; return super.mouseDown(e, x, y); } public boolean mouseDrag(Event e, int x, int y) { isClick = false; return super.mouseDrag(e, x, y); } // IN LINK MODE, CHANGES TO OTHER ITEMS ARE RECORDED WITHIN THE LINK ITEM. public boolean mouseUp(Event e, int x, int y) { damage = true; if (iLink >= 0) { if (isClick && iLink == iSelected) setLinkItem(-1); else if (isRight && iLink == iSelected) item7(iLink).setKey(++linkKey); else if (isRight && isClick) setLinkItem(iSelected); else if (iLink == iSelected) item7(iLink).setKey(++linkKey); else if (isRight && iSelected >= 0) startLinkDrag(x, y); else if (iSelected >= 0) item7(iLink).linkAtKey(linkKey, item7(iSelected)); else super.mouseUp(e, x, y); } else if (isRight && isClick) { setLinkItem(iSelected); } else if (isRight && iSelected >= 0) { startLinkDrag(x, y); } else super.mouseUp(e, x, y); isRight = false; iSelected = -1; return true; } void startLinkDrag(int x, int y) { Item7 it = item7(iSelected); it.x0 += mdx - x; it.y0 += mdy - y; setLinkItem(iSelected); it.x0 -= mdx - x; it.y0 -= mdy - y; it.setKey(++linkKey); } public void setColor(int i) { super.setColor(i); if (iLink >= 0) item7(iLink).linkAtKey(linkKey, item7(i)); } // START A NEW LINK SEQUENCE, AND SET THE LINK ITEM'S LINK-KEY TO 0. void setLinkItem(int i) { iLink = i; if (iLink >= 0) item7(iLink).setKey(linkKey = 0); } // IF USER DELETES THE LINK ITEM, MAKE SURE TO SET ILINK TO UNDEFINED (-1) public void deleteItem(int i) { if (i == iLink) iLink = -1; super.deleteItem(i); } }