001/**
002 */
003package org.nasdanika.html.model.bootstrap.impl;
004
005import java.lang.reflect.InvocationTargetException;
006import java.util.Collection;
007
008import org.eclipse.emf.common.notify.NotificationChain;
009
010import org.eclipse.emf.common.util.EList;
011
012import org.eclipse.emf.common.util.EMap;
013import org.eclipse.emf.ecore.EClass;
014import org.eclipse.emf.ecore.EObject;
015import org.eclipse.emf.ecore.EStructuralFeature;
016import org.eclipse.emf.ecore.InternalEObject;
017
018import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
019import org.eclipse.emf.ecore.util.EcoreUtil;
020import org.eclipse.emf.ecore.util.InternalEList;
021import org.nasdanika.common.Util;
022import org.nasdanika.html.bootstrap.Color;
023import org.nasdanika.html.model.bootstrap.Appearance;
024import org.nasdanika.html.model.bootstrap.BootstrapPackage;
025import org.nasdanika.html.model.bootstrap.Border;
026import org.nasdanika.html.model.bootstrap.Spacing;
027import org.nasdanika.html.model.bootstrap.Text;
028
029/**
030 * <!-- begin-user-doc -->
031 * An implementation of the model object '<em><b>Appearance</b></em>'.
032 * <!-- end-user-doc -->
033 * <p>
034 * The following features are implemented:
035 * </p>
036 * <ul>
037 *   <li>{@link org.nasdanika.html.model.bootstrap.impl.AppearanceImpl#getBackground <em>Background</em>}</li>
038 *   <li>{@link org.nasdanika.html.model.bootstrap.impl.AppearanceImpl#getAttributes <em>Attributes</em>}</li>
039 *   <li>{@link org.nasdanika.html.model.bootstrap.impl.AppearanceImpl#getBorder <em>Border</em>}</li>
040 *   <li>{@link org.nasdanika.html.model.bootstrap.impl.AppearanceImpl#getMargin <em>Margin</em>}</li>
041 *   <li>{@link org.nasdanika.html.model.bootstrap.impl.AppearanceImpl#getPadding <em>Padding</em>}</li>
042 *   <li>{@link org.nasdanika.html.model.bootstrap.impl.AppearanceImpl#getText <em>Text</em>}</li>
043 *   <li>{@link org.nasdanika.html.model.bootstrap.impl.AppearanceImpl#getFloat <em>Float</em>}</li>
044 *   <li>{@link org.nasdanika.html.model.bootstrap.impl.AppearanceImpl#getChildren <em>Children</em>}</li>
045 * </ul>
046 *
047 * @generated
048 */
049public class AppearanceImpl extends MinimalEObjectImpl.Container implements Appearance {
050        /**
051         * The default value of the '{@link #getBackground() <em>Background</em>}' attribute.
052         * <!-- begin-user-doc -->
053         * <!-- end-user-doc -->
054         * @see #getBackground()
055         * @generated
056         * @ordered
057         */
058        protected static final Color BACKGROUND_EDEFAULT = null;
059
060        /**
061         * <!-- begin-user-doc -->
062         * <!-- end-user-doc -->
063         * @generated
064         */
065        protected AppearanceImpl() {
066                super();
067        }
068
069        /**
070         * <!-- begin-user-doc -->
071         * <!-- end-user-doc -->
072         * @generated
073         */
074        @Override
075        protected EClass eStaticClass() {
076                return BootstrapPackage.Literals.APPEARANCE;
077        }
078
079        /**
080         * <!-- begin-user-doc -->
081         * <!-- end-user-doc -->
082         * @generated
083         */
084        @Override
085        protected int eStaticFeatureCount() {
086                return 0;
087        }
088
089        /**
090         * <!-- begin-user-doc -->
091         * <!-- end-user-doc -->
092         * @generated
093         */
094        @Override
095        public Color getBackground() {
096                return (Color)eDynamicGet(BootstrapPackage.APPEARANCE__BACKGROUND, BootstrapPackage.Literals.APPEARANCE__BACKGROUND, true, true);
097        }
098
099        /**
100         * <!-- begin-user-doc -->
101         * <!-- end-user-doc -->
102         * @generated
103         */
104        @Override
105        public void setBackground(Color newBackground) {
106                eDynamicSet(BootstrapPackage.APPEARANCE__BACKGROUND, BootstrapPackage.Literals.APPEARANCE__BACKGROUND, newBackground);
107        }
108
109        /**
110         * <!-- begin-user-doc -->
111         * <!-- end-user-doc -->
112         * @generated
113         */
114        @SuppressWarnings("unchecked")
115        @Override
116        public EMap<String, EObject> getAttributes() {
117                return (EMap<String, EObject>)eDynamicGet(BootstrapPackage.APPEARANCE__ATTRIBUTES, BootstrapPackage.Literals.APPEARANCE__ATTRIBUTES, true, true);
118        }
119
120        /**
121         * <!-- begin-user-doc -->
122         * <!-- end-user-doc -->
123         * @generated
124         */
125        @SuppressWarnings("unchecked")
126        @Override
127        public EList<Border> getBorder() {
128                return (EList<Border>)eDynamicGet(BootstrapPackage.APPEARANCE__BORDER, BootstrapPackage.Literals.APPEARANCE__BORDER, true, true);
129        }
130
131        /**
132         * <!-- begin-user-doc -->
133         * <!-- end-user-doc -->
134         * @generated
135         */
136        @SuppressWarnings("unchecked")
137        @Override
138        public EList<Spacing> getMargin() {
139                return (EList<Spacing>)eDynamicGet(BootstrapPackage.APPEARANCE__MARGIN, BootstrapPackage.Literals.APPEARANCE__MARGIN, true, true);
140        }
141
142        /**
143         * <!-- begin-user-doc -->
144         * <!-- end-user-doc -->
145         * @generated
146         */
147        @SuppressWarnings("unchecked")
148        @Override
149        public EList<Spacing> getPadding() {
150                return (EList<Spacing>)eDynamicGet(BootstrapPackage.APPEARANCE__PADDING, BootstrapPackage.Literals.APPEARANCE__PADDING, true, true);
151        }
152
153        /**
154         * <!-- begin-user-doc -->
155         * <!-- end-user-doc -->
156         * @generated
157         */
158        @Override
159        public Text getText() {
160                return (Text)eDynamicGet(BootstrapPackage.APPEARANCE__TEXT, BootstrapPackage.Literals.APPEARANCE__TEXT, true, true);
161        }
162
163        /**
164         * <!-- begin-user-doc -->
165         * <!-- end-user-doc -->
166         * @generated
167         */
168        public NotificationChain basicSetText(Text newText, NotificationChain msgs) {
169                msgs = eDynamicInverseAdd((InternalEObject)newText, BootstrapPackage.APPEARANCE__TEXT, msgs);
170                return msgs;
171        }
172
173        /**
174         * <!-- begin-user-doc -->
175         * <!-- end-user-doc -->
176         * @generated
177         */
178        @Override
179        public void setText(Text newText) {
180                eDynamicSet(BootstrapPackage.APPEARANCE__TEXT, BootstrapPackage.Literals.APPEARANCE__TEXT, newText);
181        }
182
183        /**
184         * <!-- begin-user-doc -->
185         * <!-- end-user-doc -->
186         * @generated
187         */
188        @SuppressWarnings("unchecked")
189        @Override
190        public EList<org.nasdanika.html.model.bootstrap.Float> getFloat() {
191                return (EList<org.nasdanika.html.model.bootstrap.Float>)eDynamicGet(BootstrapPackage.APPEARANCE__FLOAT, BootstrapPackage.Literals.APPEARANCE__FLOAT, true, true);
192        }
193
194        /**
195         * <!-- begin-user-doc -->
196         * <!-- end-user-doc -->
197         * @generated
198         */
199        @SuppressWarnings("unchecked")
200        @Override
201        public EMap<String, Appearance> getChildren() {
202                return (EMap<String, Appearance>)eDynamicGet(BootstrapPackage.APPEARANCE__CHILDREN, BootstrapPackage.Literals.APPEARANCE__CHILDREN, true, true);
203        }
204
205        /**
206         * <!-- begin-user-doc -->
207         * <!-- end-user-doc -->
208         * @generated NOT
209         */
210        @Override
211        public Appearance effectiveAppearance(String path) {
212                if (Util.isBlank(path)) {
213                        return EcoreUtil.copy(this);
214                }
215                int idx = path.indexOf("/");
216                String childKey = idx == -1 ? path : path.substring(0, idx);
217                Appearance child = getChildren().get(childKey);
218                if (child == null) {
219                        return EcoreUtil.copy(this);
220                }
221                Appearance ret = child.effectiveAppearance(idx == -1 ? null : path.substring(idx + 1));         
222                merge(ret);
223                return ret;
224        }
225
226        private void merge(Appearance effectiveAppearance) {
227                // TODO - put attribute keys if not present, set unset features such as color. Add to list features.
228                throw new UnsupportedOperationException("Appearance merging is not supported yet");
229        }
230
231        /**
232         * <!-- begin-user-doc -->
233         * <!-- end-user-doc -->
234         * @generated
235         */
236        @Override
237        public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
238                switch (featureID) {
239                        case BootstrapPackage.APPEARANCE__ATTRIBUTES:
240                                return ((InternalEList<?>)getAttributes()).basicRemove(otherEnd, msgs);
241                        case BootstrapPackage.APPEARANCE__BORDER:
242                                return ((InternalEList<?>)getBorder()).basicRemove(otherEnd, msgs);
243                        case BootstrapPackage.APPEARANCE__MARGIN:
244                                return ((InternalEList<?>)getMargin()).basicRemove(otherEnd, msgs);
245                        case BootstrapPackage.APPEARANCE__PADDING:
246                                return ((InternalEList<?>)getPadding()).basicRemove(otherEnd, msgs);
247                        case BootstrapPackage.APPEARANCE__TEXT:
248                                return basicSetText(null, msgs);
249                        case BootstrapPackage.APPEARANCE__FLOAT:
250                                return ((InternalEList<?>)getFloat()).basicRemove(otherEnd, msgs);
251                        case BootstrapPackage.APPEARANCE__CHILDREN:
252                                return ((InternalEList<?>)getChildren()).basicRemove(otherEnd, msgs);
253                }
254                return super.eInverseRemove(otherEnd, featureID, msgs);
255        }
256
257        /**
258         * <!-- begin-user-doc -->
259         * <!-- end-user-doc -->
260         * @generated
261         */
262        @Override
263        public Object eGet(int featureID, boolean resolve, boolean coreType) {
264                switch (featureID) {
265                        case BootstrapPackage.APPEARANCE__BACKGROUND:
266                                return getBackground();
267                        case BootstrapPackage.APPEARANCE__ATTRIBUTES:
268                                if (coreType) return getAttributes();
269                                else return getAttributes().map();
270                        case BootstrapPackage.APPEARANCE__BORDER:
271                                return getBorder();
272                        case BootstrapPackage.APPEARANCE__MARGIN:
273                                return getMargin();
274                        case BootstrapPackage.APPEARANCE__PADDING:
275                                return getPadding();
276                        case BootstrapPackage.APPEARANCE__TEXT:
277                                return getText();
278                        case BootstrapPackage.APPEARANCE__FLOAT:
279                                return getFloat();
280                        case BootstrapPackage.APPEARANCE__CHILDREN:
281                                if (coreType) return getChildren();
282                                else return getChildren().map();
283                }
284                return super.eGet(featureID, resolve, coreType);
285        }
286
287        /**
288         * <!-- begin-user-doc -->
289         * <!-- end-user-doc -->
290         * @generated
291         */
292        @SuppressWarnings("unchecked")
293        @Override
294        public void eSet(int featureID, Object newValue) {
295                switch (featureID) {
296                        case BootstrapPackage.APPEARANCE__BACKGROUND:
297                                setBackground((Color)newValue);
298                                return;
299                        case BootstrapPackage.APPEARANCE__ATTRIBUTES:
300                                ((EStructuralFeature.Setting)getAttributes()).set(newValue);
301                                return;
302                        case BootstrapPackage.APPEARANCE__BORDER:
303                                getBorder().clear();
304                                getBorder().addAll((Collection<? extends Border>)newValue);
305                                return;
306                        case BootstrapPackage.APPEARANCE__MARGIN:
307                                getMargin().clear();
308                                getMargin().addAll((Collection<? extends Spacing>)newValue);
309                                return;
310                        case BootstrapPackage.APPEARANCE__PADDING:
311                                getPadding().clear();
312                                getPadding().addAll((Collection<? extends Spacing>)newValue);
313                                return;
314                        case BootstrapPackage.APPEARANCE__TEXT:
315                                setText((Text)newValue);
316                                return;
317                        case BootstrapPackage.APPEARANCE__FLOAT:
318                                getFloat().clear();
319                                getFloat().addAll((Collection<? extends org.nasdanika.html.model.bootstrap.Float>)newValue);
320                                return;
321                        case BootstrapPackage.APPEARANCE__CHILDREN:
322                                ((EStructuralFeature.Setting)getChildren()).set(newValue);
323                                return;
324                }
325                super.eSet(featureID, newValue);
326        }
327
328        /**
329         * <!-- begin-user-doc -->
330         * <!-- end-user-doc -->
331         * @generated
332         */
333        @Override
334        public void eUnset(int featureID) {
335                switch (featureID) {
336                        case BootstrapPackage.APPEARANCE__BACKGROUND:
337                                setBackground(BACKGROUND_EDEFAULT);
338                                return;
339                        case BootstrapPackage.APPEARANCE__ATTRIBUTES:
340                                getAttributes().clear();
341                                return;
342                        case BootstrapPackage.APPEARANCE__BORDER:
343                                getBorder().clear();
344                                return;
345                        case BootstrapPackage.APPEARANCE__MARGIN:
346                                getMargin().clear();
347                                return;
348                        case BootstrapPackage.APPEARANCE__PADDING:
349                                getPadding().clear();
350                                return;
351                        case BootstrapPackage.APPEARANCE__TEXT:
352                                setText((Text)null);
353                                return;
354                        case BootstrapPackage.APPEARANCE__FLOAT:
355                                getFloat().clear();
356                                return;
357                        case BootstrapPackage.APPEARANCE__CHILDREN:
358                                getChildren().clear();
359                                return;
360                }
361                super.eUnset(featureID);
362        }
363
364        /**
365         * <!-- begin-user-doc -->
366         * <!-- end-user-doc -->
367         * @generated
368         */
369        @Override
370        public boolean eIsSet(int featureID) {
371                switch (featureID) {
372                        case BootstrapPackage.APPEARANCE__BACKGROUND:
373                                return BACKGROUND_EDEFAULT == null ? getBackground() != null : !BACKGROUND_EDEFAULT.equals(getBackground());
374                        case BootstrapPackage.APPEARANCE__ATTRIBUTES:
375                                return !getAttributes().isEmpty();
376                        case BootstrapPackage.APPEARANCE__BORDER:
377                                return !getBorder().isEmpty();
378                        case BootstrapPackage.APPEARANCE__MARGIN:
379                                return !getMargin().isEmpty();
380                        case BootstrapPackage.APPEARANCE__PADDING:
381                                return !getPadding().isEmpty();
382                        case BootstrapPackage.APPEARANCE__TEXT:
383                                return getText() != null;
384                        case BootstrapPackage.APPEARANCE__FLOAT:
385                                return !getFloat().isEmpty();
386                        case BootstrapPackage.APPEARANCE__CHILDREN:
387                                return !getChildren().isEmpty();
388                }
389                return super.eIsSet(featureID);
390        }
391
392        /**
393         * <!-- begin-user-doc -->
394         * <!-- end-user-doc -->
395         * @generated
396         */
397        @Override
398        public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException {
399                switch (operationID) {
400                        case BootstrapPackage.APPEARANCE___EFFECTIVE_APPEARANCE__STRING:
401                                return effectiveAppearance((String)arguments.get(0));
402                }
403                return super.eInvoke(operationID, arguments);
404        }
405
406} //AppearanceImpl