001: /**
002: *
003: */package org.romaframework.module.designer.view.domain.dnd.controller;
004:
005: import java.util.ArrayList;
006: import java.util.List;
007:
008: import nextapp.echo2.app.Component;
009: import nextapp.echo2.app.Grid;
010: import nextapp.echo2.contrib.app.dnd.DropTarget;
011:
012: import org.romaframework.module.designer.view.domain.dnd.component.DnDAreaComponent;
013: import org.romaframework.module.designer.view.domain.dnd.component.TrashComponent;
014:
015: import echopointng.ContainerEx;
016:
017: /**
018: * @author Raf
019: */
020: public class DnDController {
021: protected List<DnDAreaComponent> targets;
022: protected DropTarget trashDropTarget;
023: private Component dropContainer;
024:
025: public DnDController(ContainerEx mainContainer) {
026: dropContainer = mainContainer;
027: targets = new ArrayList<DnDAreaComponent>();
028: }
029:
030: public void registerComponentAsTarget(DnDAreaComponent owner) {
031: if (!targets.contains(owner)) {
032: addSource(owner);
033: targets.add(owner);
034: dropContainer.add(owner.getDropTarget());
035: }
036: }
037:
038: public void registerTrashComponentTarget(TrashComponent iTrashTarget) {
039: trashDropTarget = new DropTarget(iTrashTarget, iTrashTarget);
040: dropContainer.add(trashDropTarget);
041: }
042:
043: public void registerComponentToTrash(DnDAreaComponent iComponent) {
044: trashDropTarget.addDragSource(iComponent);
045: refreshDropTarget(trashDropTarget);
046: }
047:
048: protected void addSource(DnDAreaComponent iComponent) {
049: for (DnDAreaComponent source : targets) {
050: if (!isNestedComponent(source, iComponent)
051: && !isNestedComponent(iComponent, source)) {
052: if (!source.getDropTarget().getAllDragSources()
053: .contains(iComponent)) {
054: source.getDropTarget().addDragSource(iComponent);
055: refreshDropTarget(source.getDropTarget());
056: }
057: if (!iComponent.getDropTarget().getAllDragSources()
058: .contains(source)) {
059: iComponent.getDropTarget().addDragSource(source);
060: }
061: }
062: }
063: refreshDropTarget(iComponent.getDropTarget());
064: }
065:
066: protected boolean isNestedComponent(Component componentToCheck,
067: Component iComponent) {
068: boolean result = false;
069: Component parent = componentToCheck;
070: while (parent != null && !result) {
071: result = parent.equals(iComponent);
072: parent = parent.getParent();
073: }
074: return result;
075: }
076:
077: private void refreshDropTarget(DropTarget dropper) {
078: dropContainer.remove(dropper);
079: dropContainer.add(dropper);
080: }
081:
082: private void unRegisterSource(DnDAreaComponent iComponent) {
083: trashDropTarget.removeDragSource(iComponent);
084: trashDropTarget.getRemovedDragSources().clear();
085: refreshDropTarget(trashDropTarget);
086: for (DnDAreaComponent target : targets) {
087: target.getDropTarget().removeDragSource(iComponent);
088: target.getDropTarget().getRemovedDragSources().clear();
089: refreshDropTarget(target.getDropTarget());
090: }
091: }
092:
093: public void unRegisterComponent(DnDAreaComponent iComponent) {
094: manageComponent(iComponent, false);
095: }
096:
097: private void manageComponent(DnDAreaComponent iComponent,
098: boolean isSwap) {
099: findNestedArea(iComponent, isSwap);
100: unRegisterSource(iComponent);
101: DropTarget dropper = iComponent.getDropTarget();
102: if (dropper != null) {
103: dropContainer.remove(dropper);
104: }
105: targets.remove(iComponent);
106: if (isSwap) {
107: iComponent.disposeDropTarget();
108: registerComponentAsTarget(iComponent);
109: }
110: }
111:
112: private void findNestedArea(Component iComponent, boolean isSwap) {
113: Component[] children = iComponent.getComponents();
114: for (Component element : children) {
115: findNestedArea(element, isSwap);
116: if (element instanceof DnDAreaComponent) {
117: manageComponent((DnDAreaComponent) element, isSwap);
118: }
119: }
120: }
121:
122: public void swapTarget(DnDAreaComponent iComponent) {
123: manageComponent(iComponent, true);
124: }
125:
126: // The method's aim is only test
127: public List<DnDAreaComponent> getTargets() {
128: return targets;
129: }
130:
131: // The method's aim is only test
132: public List<DropTarget> getContainerTargets() {
133: List<DropTarget> result = new ArrayList<DropTarget>();
134: for (Component c : dropContainer.getComponents()) {
135: if (c instanceof DropTarget && !c.equals(trashDropTarget))
136: result.add((DropTarget) c);
137: }
138: return result;
139: }
140: }
|