001: package org.romaframework.module.designer.view.domain.dnd.component;
002:
003: import java.util.LinkedHashMap;
004: import java.util.Map;
005:
006: import nextapp.echo2.app.Alignment;
007: import nextapp.echo2.app.Column;
008: import nextapp.echo2.app.Component;
009: import nextapp.echo2.app.IllegalChildException;
010: import nextapp.echo2.app.Row;
011: import nextapp.echo2.app.event.ActionEvent;
012: import nextapp.echo2.app.event.ActionListener;
013: import nextapp.echo2.app.layout.ColumnLayoutData;
014: import nextapp.echo2.app.layout.RowLayoutData;
015: import nextapp.echo2.contrib.app.dnd.DropTarget;
016: import nextapp.echo2.contrib.app.dnd.DropTargetListener;
017:
018: import org.romaframework.aspect.view.echo2.look.LookAndFeelManager;
019: import org.romaframework.core.flow.ObjectContext;
020: import org.romaframework.module.designer.view.domain.dnd.FieldPair;
021: import org.romaframework.module.designer.view.domain.dnd.util.AreaWrapperFactory;
022: import org.romaframework.module.designer.view.domain.dnd.util.DnDConstants;
023: import org.romaframework.module.designer.view.domain.radpage.aspect.FormAreaEditingPage;
024:
025: import echopointng.ButtonEx;
026: import echopointng.LabelEx;
027: import echopointng.TextFieldEx;
028:
029: public abstract class DnDAreaComponent extends Column implements
030: ActionListener, DropTargetListener {
031: protected String areaName;
032: protected int areaSize;
033: protected Component innerComponent;
034: protected LabelEx button;
035: protected Map<String, FieldPair> fields;
036: protected DropTarget dropper;
037: protected FormAreaEditingPage caller;
038: private Component bar;
039:
040: protected static final String NAME_FIELD_TYPE = "areaName";
041:
042: public DnDAreaComponent(FormAreaEditingPage iCaller) {
043: caller = iCaller;
044: caller.getController().registerComponentToTrash(this );
045: bar = createBar();
046: add(bar);
047: createInnerComponent();
048: if (innerComponent != null) {
049: ColumnLayoutData layout = new ColumnLayoutData();
050: layout.setAlignment(Alignment.ALIGN_CENTER);
051: innerComponent.setLayoutData(layout);
052: }
053: setInsets(DnDConstants.getComponentPadding());
054: setBorder(DnDConstants.getComponentBorder());
055: disposeDropTarget();
056: }
057:
058: public FieldPair[] getGUIFields() {
059: FieldPair[] guiField = new FieldPair[fields.size()];
060: return (FieldPair[]) fields.values().toArray(guiField);
061: }
062:
063: public void actionPerformed(ActionEvent arg0) {
064: createGUIFields();
065: caller.getUtils().getPopupWindow(this );
066: }
067:
068: public String processFields() {
069: String value = fields.get(NAME_FIELD_TYPE).getFieldInput()
070: .getText();
071: String result = renameArea(value);
072: if (result == null) {
073: result = processExtraFields();
074: }
075: return result;
076: }
077:
078: public DropTarget getDropTarget() {
079: return dropper;
080: }
081:
082: public void disposeDropTarget() {
083: dropper = null;
084: dropper = new DropTarget(bar, this );
085: }
086:
087: public void drop(ActionEvent arg0) {
088: if (isDroppedMine((Component) arg0.getSource())) {
089: if (arg0.getSource() instanceof LabelEx) {
090: DnDAreaComponent wrappedArea = AreaWrapperFactory
091: .getComponentArea(arg0.getSource(), caller);
092: if (wrappedArea != null) {
093: caller.getController().unRegisterComponent(this );
094: caller.getUtils().removeAreaName(areaName);
095: Component parent = getParent();
096: int index = parent.indexOf(this );
097: parent.remove(this );
098: parent.add(wrappedArea, index);
099: caller.getController().registerComponentAsTarget(
100: wrappedArea);
101: }
102: } else if (arg0.getSource() instanceof DnDAreaComponent) {
103: swap((DnDAreaComponent) arg0.getSource());
104: }
105: }
106: }
107:
108: public void resize(int size) {
109: if (size > areaSize) {
110: for (int x = areaSize; x < size; x++) {
111: addFiller(x);
112: }
113: } else if (size < areaSize) {
114: for (int x = areaSize; x > size; x--) {
115: Component c = innerComponent.getComponent(x - 1);
116: caller.getController().unRegisterComponent(
117: (DnDAreaComponent) c);
118: caller.getUtils().removeAreaName(
119: ((DnDAreaComponent) c).getAreaName());
120: innerComponent.remove(c);
121: }
122: } else {
123: // Nothing to do because size aren't changed
124: }
125: areaSize = size;
126: }
127:
128: public void setAreaName(String iAreaName) {
129: if (iAreaName == null || iAreaName.trim().equals(""))
130: areaName = caller.getUtils().getFakeAreaName();
131: areaName = iAreaName;
132: button.setText(areaName);
133: caller.getUtils().checkAreaName(areaName, null);
134: }
135:
136: public String renameArea(String iAreaName) {
137: if (caller.getUtils().checkAreaName(iAreaName, areaName)) {
138: button.setText(iAreaName);
139: areaName = iAreaName;
140: return null;
141: } else {
142: return "!!!! Area name is not valid. Area name must be unique !!!!";
143: }
144: }
145:
146: public String getAreaName() {
147: return areaName;
148: }
149:
150: public int getAreaSize() {
151: return areaSize;
152: }
153:
154: public void addInnerComponent(DnDAreaComponent c, int n)
155: throws IllegalChildException {
156: if (innerComponent.getComponentCount() <= n) {
157: innerComponent.add(c);
158: } else {
159: Component remove = innerComponent.getComponent(n);
160: caller.getController().unRegisterComponent(
161: (DnDAreaComponent) remove);
162: caller.getUtils().removeAreaName(
163: ((DnDAreaComponent) remove).getAreaName());
164: innerComponent.remove(remove);
165: innerComponent.add(c, n);
166: }
167: caller.getController().registerComponentAsTarget(c);
168: }
169:
170: protected void createGUIFields() {
171: fields = new LinkedHashMap<String, FieldPair>();
172: LabelEx areaNameLabel = new LabelEx("Area name :");
173: TextFieldEx areaNameField = new TextFieldEx(areaName);
174: FieldPair pair = new FieldPair();
175: pair.setFieldLabel(areaNameLabel);
176: pair.setFieldInput(areaNameField);
177: fields.put(NAME_FIELD_TYPE, pair);
178: getExtraFields();
179: }
180:
181: protected void fill() {
182: for (int x = 0; x < areaSize; x++) {
183: addFiller(x);
184: }
185: }
186:
187: protected boolean isDroppedMine(Component dropped) {
188: return dropper.getAllDragSources().contains(dropped);
189: }
190:
191: protected void swap(DnDAreaComponent swapComponent) {
192: Component swapParent = swapComponent.getParent();
193: Component myParent = getParent();
194: int swapIndex = swapParent.indexOf(swapComponent);
195: int myIndex = myParent.indexOf(this );
196: swapParent.add(this , swapIndex);
197: myParent.add(swapComponent, myIndex);
198: caller.getController().swapTarget(swapComponent);
199: caller.getController().swapTarget(this );
200: }
201:
202: private Component createBar() {
203: Row bar = new Row();
204: button = new LabelEx(areaName);
205: RowLayoutData layout = new RowLayoutData();
206: layout.setAlignment(Alignment.ALIGN_CENTER);
207: layout.setWidth(DnDConstants.getBarButtonWidth());
208: button.setLayoutData(layout);
209: button.setHeight(DnDConstants.getBarButtonHeight());
210: button.setBackground(DnDConstants.getButtonColor());
211: bar.add(button);
212: ButtonEx editButton = new ButtonEx();
213: editButton.setIcon(ObjectContext.getInstance().getComponent(
214: LookAndFeelManager.class).getImage("edit.gif"));
215: editButton.setWidth(editButton.getIcon().getWidth());
216: editButton.setHeight(editButton.getIcon().getHeight());
217: editButton.addActionListener(this );
218: bar.add(editButton);
219: return bar;
220: }
221:
222: private void addFiller(int position) {
223: DnDAreaComponent filler = new PlaceholderArea(caller);
224: addInnerComponent(filler, position);
225: }
226:
227: public abstract void createInnerComponent();
228:
229: public abstract String getAreaType();
230:
231: protected abstract String processExtraFields();
232:
233: protected abstract void getExtraFields();
234: }
|