001: package desktop;
002:
003: import org.wings.*;
004: import org.wings.dnd.DragSource;
005: import org.wings.dnd.DropTarget;
006: import org.wings.event.*;
007: import org.wings.session.SessionManager;
008:
009: import java.util.ArrayList;
010: import java.util.List;
011: import java.util.prefs.Preferences;
012:
013: public class InternalDesktopFrame extends SInternalFrame implements
014: SInternalFrameListener, DragSource, DropTarget, ItemContainer {
015:
016: private ArrayList<SComponentDropListener> componentDropListeners = new ArrayList<SComponentDropListener>();
017: private boolean dragEnabled = true;
018: private DesktopItem item;
019: private Preferences pref;
020:
021: private static org.wings.util.SessionLocal<Integer> frameNo = new org.wings.util.SessionLocal<Integer>() {
022: @Override
023: protected Integer initialValue() {
024: return 0;
025: }
026: };
027:
028: public InternalDesktopFrame() {
029: super ();
030: pref = Preferences.userRoot().node("desktopitems");
031:
032: this .setName("frame" + frameNo.get().toString());
033: frameNo.set(frameNo.get() + 1);
034: addInternalFrameListener(this );
035:
036: this .setDragEnabled(true);
037: componentDropListeners = new ArrayList<SComponentDropListener>();
038:
039: addComponentDropListener(new SComponentDropListener() {
040: public boolean handleDrop(SComponent dragSource) {
041:
042: SContainer sourceContainer = dragSource.getParent();
043:
044: //different panes
045: if (InternalDesktopFrame.this .getParent() != sourceContainer) {
046: if (sourceContainer instanceof DesktopPane) {
047:
048: //EditorPanel.this.setMaximized(false);
049: if (dragSource instanceof SInternalFrame)
050: ((SInternalFrame) dragSource)
051: .setMaximized(false);
052:
053: DesktopPane targetPane = (DesktopPane) InternalDesktopFrame.this
054: .getParent();
055: DesktopPane sourcePane = (DesktopPane) sourceContainer;
056: int sIndex = sourcePane.getIndexOf(dragSource);
057: int tIndex = targetPane
058: .getIndexOf(InternalDesktopFrame.this );
059:
060: DesktopItem dtItem = ((InternalDesktopFrame) dragSource)
061: .getItem();
062:
063: sourcePane.remove(sIndex);
064: targetPane.add(dragSource, tIndex);
065: pref.node(
066: (String) dtItem
067: .getValue(DesktopItem.KEY))
068: .put(DesktopItem.DESKTOPPANE,
069: targetPane.getName());
070: for (int i = sIndex; i < sourcePane
071: .getComponentCount() - 1; i++) {
072: DesktopItem it = ((InternalDesktopFrame) sourcePane
073: .getComponent(i)).getItem();
074: pref
075: .node(
076: (String) it
077: .getValue(DesktopItem.KEY))
078: .putInt(
079: DesktopItem.POSITION_ON_PANE,
080: i);
081: }
082:
083: for (int i = tIndex; i < targetPane
084: .getComponentCount() - 1; i++) {
085: DesktopItem it = ((InternalDesktopFrame) targetPane
086: .getComponent(i)).getItem();
087: pref
088: .node(
089: (String) it
090: .getValue(DesktopItem.KEY))
091: .putInt(
092: DesktopItem.POSITION_ON_PANE,
093: i);
094: }
095:
096: return true;
097: }
098: }
099: //same pane
100: else if (sourceContainer instanceof DesktopPane) {
101: DesktopPane pane = (DesktopPane) sourceContainer;
102: int tindex = pane
103: .getIndexOf(InternalDesktopFrame.this );
104: int sindex = pane.getIndexOf(dragSource);
105:
106: //do nothing if drag on itself..
107: if (sindex == tindex)
108: return false;
109:
110: //EditorPanel.this.setMaximized(false);
111: if (dragSource instanceof SInternalFrame)
112: ((SInternalFrame) dragSource)
113: .setMaximized(false);
114:
115: DesktopItem dtItem = ((InternalDesktopFrame) dragSource)
116: .getItem();
117:
118: pane.remove(sindex);
119:
120: if (tindex > sindex)
121: pane.add(dragSource, tindex - 1);
122: else
123: pane.add(dragSource, tindex);
124:
125: for (int i = java.lang.Math.min(sindex, tindex); i < pane
126: .getComponentCount() - 1; i++) {
127: DesktopItem it = ((InternalDesktopFrame) pane
128: .getComponent(i)).getItem();
129: pref
130: .node(
131: (String) it
132: .getValue(DesktopItem.KEY))
133: .putInt(DesktopItem.POSITION_ON_PANE, i);
134: }
135:
136: return true;
137: }
138: return false;
139: }
140: });
141: }
142:
143: public void destroy() {
144: item.destroyed();
145: dispose();
146:
147: }
148:
149: public void setIcon(SURLIcon icon) {
150: super .setIcon(icon);
151:
152: }
153:
154: public void setTitle(String title) {
155: super .setTitle(title);
156: }
157:
158: public DesktopItem getItem() {
159: return item;
160: }
161:
162: public void setItem(DesktopItem item) {
163: this .item = item;
164: getContentPane().addComponent(item.getComponent());
165: setTitle((String) item.getValue(DesktopItem.NAME));
166: setIcon((SURLIcon) item.getValue(DesktopItem.ICON));
167: item.activated();
168: }
169:
170: public void addComponentDropListener(SComponentDropListener listener) {
171: componentDropListeners.add(listener);
172: SessionManager.getSession().getDragAndDropManager()
173: .registerDropTarget(this );
174: }
175:
176: public List<SComponentDropListener> getComponentDropListeners() {
177: return this .componentDropListeners;
178: }
179:
180: public boolean isDragEnabled() {
181: return this .dragEnabled;
182: }
183:
184: public void setDragEnabled(boolean dragEnabled) {
185: this .dragEnabled = dragEnabled;
186: if (dragEnabled) {
187: SessionManager.getSession().getDragAndDropManager()
188: .registerDragSource(this );
189: } else {
190: SessionManager.getSession().getDragAndDropManager()
191: .deregisterDragSource(this );
192: }
193: }
194:
195: public void internalFrameClosed(SInternalFrameEvent e) {
196: destroy();
197: }
198:
199: public void internalFrameOpened(SInternalFrameEvent e) {
200: }
201:
202: public void internalFrameIconified(SInternalFrameEvent e) {
203: }
204:
205: public void internalFrameDeiconified(SInternalFrameEvent e) {
206: }
207:
208: public void internalFrameMaximized(SInternalFrameEvent e) {
209: }
210:
211: public void internalFrameUnmaximized(SInternalFrameEvent e) {
212: }
213:
214: }
|