001    /******************************************************************************
002     * Copyright (C) MActor Developers. All rights reserved.                        *
003     * ---------------------------------------------------------------------------*
004     * This file is part of MActor.                                               *
005     *                                                                            *
006     * MActor is free software; you can redistribute it and/or modify             *
007     * it under the terms of the GNU General Public License as published by       *
008     * the Free Software Foundation; either version 2 of the License, or          *
009     * (at your option) any later version.                                        *
010     *                                                                            *
011     * MActor is distributed in the hope that it will be useful,                  *
012     * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
013     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *
014     * GNU General Public License for more details.                               *
015     *                                                                            *
016     * You should have received a copy of the GNU General Public License          *
017     * along with MActor; if not, write to the Free Software                      *
018     * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA *
019     ******************************************************************************/
020    package org.mactor.ui.gui.project;
021    
022    import java.util.Iterator;
023    import java.util.LinkedList;
024    import java.util.List;
025    import java.util.Map;
026    
027    import org.dom4j.Attribute;
028    import org.dom4j.Element;
029    import org.mactor.framework.MactorException;
030    
031    public class XmlProjectTreeNode extends ProjectTreeNode {
032            protected Map<String, ProjectNodeType> nodeTypeDictionary;
033            public XmlProjectTreeNode(ProjectNodeType nodeType, Element modelElement, Map<String, ProjectNodeType> nodeTypeDictionary) {
034                    super(nodeType, modelElement);
035                    this.nodeTypeDictionary = nodeTypeDictionary;
036                    Iterator it = modelElement.elementIterator();
037                    while (it.hasNext()) {
038                            Element el = (Element) it.next();
039                            ProjectNodeType elType = nodeTypeDictionary.get(el.getName());
040                            if (elType == null)
041                                    continue;
042                            XmlProjectTreeNode child = new XmlProjectTreeNode(elType, el, nodeTypeDictionary);
043                            if (child != null) {
044                                    child.parentNode = this;
045                                    childNodes.add(child);
046                            }
047                    }
048            }
049            protected Element getModelElement() {
050                    return (Element) super.getModelObject();
051            }
052            @Override
053            protected ProjectTreeNode copy() throws MactorException {
054                    return new XmlProjectTreeNode(getNodeType(), (getModelElement().createCopy()), nodeTypeDictionary);
055            }
056            @Override
057            protected void model_delete() throws MactorException {
058                    getModelElement().detach();
059            }
060            @Override
061            protected void model_detatch() throws MactorException {
062                    getModelElement().detach();
063            }
064            @Override
065            protected String model_getName() {
066                    return getModelElement().attributeValue("name");
067            }
068            @Override
069            protected void model_insert_child(int index, Object modelObject) {
070                    if (index == getModelElement().elements().size()) {
071                            getModelElement().add((Element) modelObject);
072                    } else {
073                            List elemements = getModelElement().elements();
074                            List newElements = new LinkedList();
075                            Iterator it = elemements.iterator();
076                            while (it.hasNext()) {
077                                    newElements.add(((Element) it.next()).detach());
078                            }
079                            newElements.add(index, modelObject);
080                            it = newElements.iterator();
081                            while (it.hasNext()) {
082                                    getModelElement().add((Element) it.next());
083                            }
084                    }
085            }
086            @Override
087            protected void model_remove_child(int index) {
088                    Iterator it = getModelElement().elementIterator();
089                    Element el = (Element) it.next();
090                    for (int i = 0; i < index; i++)
091                            el = (Element) it.next();
092                    el.detach();
093            }
094            @Override
095            protected boolean model_rename(String newName) throws MactorException {
096                    Attribute a = getModelElement().attribute("name");
097                    if (a == null)
098                            return false;
099                    a.setValue(newName);
100                    return true;
101            }
102            @Override
103            protected void model_save() throws MactorException {
104                    parentNode.model_save();
105            }
106    }