source: ComponentRegistry/trunk/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ComponentEdit.as @ 238

Last change on this file since 238 was 238, checked in by patdui, 14 years ago
File size: 7.4 KB
Line 
1package clarin.cmdi.componentregistry.editor {
2        import clarin.cmdi.componentregistry.browser.XMLBrowser;
3        import clarin.cmdi.componentregistry.common.ItemDescription;
4        import clarin.cmdi.componentregistry.common.StyleConstants;
5        import clarin.cmdi.componentregistry.common.components.ExpandingComponentLabel;
6        import clarin.cmdi.componentregistry.editor.model.CMDComponent;
7        import clarin.cmdi.componentregistry.editor.model.CMDComponentElement;
8       
9        import flash.display.DisplayObject;
10        import flash.events.Event;
11        import flash.events.MouseEvent;
12       
13        import mx.collections.ArrayCollection;
14        import mx.containers.Form;
15        import mx.containers.FormItem;
16        import mx.containers.HBox;
17        import mx.controls.Button;
18        import mx.controls.HRule;
19        import mx.core.Container;
20        import mx.core.UIComponent;
21        import mx.events.DragEvent;
22        import mx.managers.DragManager;
23
24        [Event(name="removeComponent", type="flash.events.Event")]
25        public class ComponentEdit extends Form {
26                public static const REMOVE_COMPONENT_EVENT:String = "removeComponent";
27
28                private var _parent:UIComponent;
29                private var _component:CMDComponent;
30                private var currentElementIndex:int = -1;
31
32                public function ComponentEdit(component:CMDComponent, parent:UIComponent) {
33                        super();
34                        _component = component;
35                        _parent = parent;
36                        styleName = StyleConstants.XMLBROWSER;
37                        if (component.componentId == null) { // new empty component, otherwise it would be an already existed component which cannot be edited.
38                                addEventListener(DragEvent.DRAG_ENTER, dragEnterHandler);
39                                addEventListener(DragEvent.DRAG_OVER, dragOverHandler);
40                                addEventListener(DragEvent.DRAG_DROP, dragDropHandler);
41                        }
42                }
43
44                public function get component():CMDComponent {
45                        return _component;
46                }
47
48                private function dragEnterHandler(event:DragEvent):void {
49                        DragManager.acceptDragDrop(event.currentTarget as UIComponent);
50                        UIComponent(event.currentTarget).drawFocus(true);
51                }
52
53
54                private function dragOverHandler(event:DragEvent):void {
55                        if (event.dragSource.hasFormat("items")) {
56                                DragManager.showFeedback(DragManager.COPY);
57                        } else if (event.dragSource.hasFormat(CMDComponentXMLEditor.DRAG_NEW_COMPONENT)) {
58                                DragManager.showFeedback(DragManager.COPY);
59                        } else if (event.dragSource.hasFormat(CMDComponentXMLEditor.DRAG_NEW_ELEMENT)) {
60                                DragManager.showFeedback(DragManager.COPY);
61                        } else {
62                                DragManager.showFeedback(DragManager.NONE);
63                        }
64                }
65
66                private function dragDropHandler(event:DragEvent):void {
67                        if (event.dragSource.hasFormat("items")) {
68                                var items:Array = event.dragSource.dataForFormat("items") as Array;
69                                for each (var item:ItemDescription in items) {
70                                        var comp:CMDComponent = new CMDComponent();
71                                        comp.componentId = item.id;
72                                        _component.cmdComponents.addItem(comp);
73                                        addComponent(comp);
74                                }
75                        } else if (event.dragSource.hasFormat(CMDComponentXMLEditor.DRAG_NEW_COMPONENT)) {
76                                var emptyComp:CMDComponent = event.dragSource.dataForFormat(CMDComponentXMLEditor.DRAG_NEW_COMPONENT) as CMDComponent;
77                                _component.cmdComponents.addItem(emptyComp);
78                                addComponent(emptyComp);
79                        } else if (event.dragSource.hasFormat(CMDComponentXMLEditor.DRAG_NEW_ELEMENT)) {
80                                var element:CMDComponentElement = event.dragSource.dataForFormat(CMDComponentXMLEditor.DRAG_NEW_ELEMENT) as CMDComponentElement;
81                                _component.cmdElements.addItem(element);
82                                addElement(element, currentElementIndex);
83                        }
84                }
85
86                private function fireRemoveComponent(mouseEvent:MouseEvent):void {
87                        drawFocus(false);
88                        var event:Event = new Event(REMOVE_COMPONENT_EVENT);
89                        dispatchEvent(event);
90                }
91
92                protected override function createChildren():void {
93                        super.createChildren();
94                        var ruler:HRule = new HRule();
95                        ruler.percentWidth = 80;
96                        addChild(ruler);
97                        addChild(createComponentEditBar());
98
99                        var componentLink:FormItem = createComponentLink(_component);
100                        if (componentLink != null) {
101                                addChild(componentLink);
102                        } else {
103                                addChild(new FormItemInputLine("Name", _component.name, function(val:String):void {
104                                                _component.name = val;
105                                        }));
106                                addChild(new ConceptLinkInput(XMLBrowser.CONCEPTLINK, _component.conceptLink, function(val:String):void {
107                                                _component.conceptLink = val;
108                                        }));
109                                addChild(new FormItemInputLine("CardinalityMin", _component.cardinalityMin, function(val:String):void {
110                                                _component.cardinalityMin = val;
111                                        }));
112                                addChild(new FormItemInputLine("CardinalityMax", _component.cardinalityMax, function(val:String):void {
113                                                _component.cardinalityMax = val;
114                                        }));
115                                handleCMDAttributeList();
116                                handleElements(_component.cmdElements);
117                                handleComponents(_component.cmdComponents); //recursion
118                        }
119                }
120
121                private function createComponentEditBar():HBox {
122                        var editBar:HBox = new HBox();
123                        editBar.addChild(createHeading());
124                        var removeButton:Button = new Button();
125                        removeButton.height = 20;
126                        removeButton.label = "X";
127                        removeButton.addEventListener(MouseEvent.CLICK, fireRemoveComponent);
128                        removeButton.addEventListener(MouseEvent.MOUSE_OVER, function(event:MouseEvent):void {
129                                        drawFocus(true);
130                                });
131                        removeButton.addEventListener(MouseEvent.MOUSE_OUT, function(event:MouseEvent):void {
132                                        drawFocus(false);
133                                });
134
135                        editBar.addChild(removeButton);
136                        return editBar;
137                }
138
139                private function createComponentLink(component:CMDComponent):FormItem {
140                        if (component.componentId != "" && component.componentId != null) {
141                                var result:FormItem = new FormItem();
142                                result.styleName = StyleConstants.XMLBROWSER_FIELD;
143                                result.label = XMLBrowser.COMPONENT_ID;
144                                result.addChild(new ExpandingComponentLabel(component.componentId, false));
145                                return result;
146                        }
147                        return null;
148                }
149
150                private function handleCMDAttributeList():void {
151                        if (_component.attributeList.length > 0)
152                                addChild(new AttributeListEdit(_component.attributeList, this));
153                }
154
155                private function handleComponents(components:ArrayCollection):void {
156                        for each (var component:CMDComponent in components) {
157                                addComponent(component);
158                        }
159                }
160
161                public function addComponent(component:CMDComponent, index:int = -1):void {
162                        var comp:Container = new ComponentEdit(component, this);
163                        comp.addEventListener(ComponentEdit.REMOVE_COMPONENT_EVENT, removeComponent);
164                        comp.setStyle("paddingLeft", "50");
165                        if (index == -1) {
166                                addChild(comp);
167                        } else {
168                                addChildAt(comp, index);
169                        }
170                }
171
172                private function removeComponent(event:Event):void {
173                        var comp:CMDComponent = ComponentEdit(event.currentTarget).component;
174                        _component.removeComponent(comp);
175                        removeChild(event.currentTarget as DisplayObject);
176                }
177
178                private function handleElements(elements:ArrayCollection):void {
179                        for each (var element:CMDComponentElement in elements) {
180                                addElement(element);
181                        }
182                }
183
184                public function addElement(element:CMDComponentElement, index:int = -1):void {
185                        var elem:Container = new ElementEdit(element, this);
186                        elem.setStyle("paddingLeft", "50");
187                        elem.addEventListener(ElementEdit.REMOVE_ELEMENT_EVENT, removeElement);
188                        if (index == -1) {
189                                addChild(elem);
190                        } else {
191                                addChildAt(elem, index);
192                        }
193                        currentElementIndex = getChildIndex(elem) + 1;
194                }
195
196                private function removeElement(event:Event):void {
197                        var elem:CMDComponentElement = ElementEdit(event.currentTarget).element;
198                        _component.removeElement(elem);
199                        removeChild(event.currentTarget as DisplayObject);
200                        currentElementIndex--;
201                }
202
203                private function createHeading():FormItem {
204                        var heading:FormItem = new FormItem();
205                        heading.label = XMLBrowser.COMPONENT;
206                        heading.styleName = StyleConstants.XMLBROWSER_HEADER;
207                        return heading;
208                }
209
210
211        }
212}
Note: See TracBrowser for help on using the repository browser.