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.editors; 021 022 import java.util.Collection; 023 import java.util.Iterator; 024 import java.util.LinkedList; 025 import java.util.List; 026 import java.util.Map; 027 import java.util.Set; 028 import java.util.TreeMap; 029 import java.util.TreeSet; 030 031 import org.dom4j.Element; 032 import org.mactor.framework.MactorException; 033 import org.mactor.ui.gui.project.ProjectNodeType; 034 035 public class NodeEditorConfig { 036 private String editor; 037 private ProjectNodeType nodeType; 038 private Map<String, CommandType> commandTypesMap = new TreeMap<String, CommandType>(); 039 private String tip; 040 public NodeEditorConfig(ProjectNodeType nodeType) { 041 this.nodeType = nodeType; 042 } 043 public Collection<CommandType> getCommandTypes() { 044 return commandTypesMap.values(); 045 } 046 public void load(Element element) { 047 if (editor == null) 048 editor = element.attributeValue("editor"); 049 if (tip == null) 050 tip = element.attributeValue("tip"); 051 loadCommandTypes(element); 052 } 053 public NodeEditor createEditor() throws MactorException { 054 if (editor == null) 055 throw new MactorException("Editor not specified in config"); 056 try { 057 NodeEditor ne = (NodeEditor) Class.forName(editor).newInstance(); 058 ne.setConfig(this); 059 return ne; 060 } catch (Exception e) { 061 throw new MactorException("Unable to initiate editor '" + editor + "'", e); 062 } 063 } 064 public void loadCommandTypes(Element nodeTypeElement) { 065 Iterator typeIt = nodeTypeElement.elementIterator("command_type"); 066 while (typeIt.hasNext()) { 067 Element e = (Element) typeIt.next(); 068 String name = e.attributeValue("name"); 069 CommandType config = commandTypesMap.get(name); 070 if (config == null) { 071 config = new CommandType(); 072 commandTypesMap.put(name, config); 073 } 074 config.load(e); 075 } 076 } 077 public static class CommandType { 078 private String name; 079 private String tip; 080 private boolean acceptParameters = true; 081 private Set<CommandPrototype> prototypes = new TreeSet<CommandPrototype>(); 082 public void load(Element element) { 083 name = element.attributeValue("name"); 084 tip = element.attributeValue("tip"); 085 if (element.attributeValue("accept_paramters") != null) 086 acceptParameters = Boolean.parseBoolean(element.attributeValue("accept_paramters")); 087 Iterator typeIt = element.elementIterator("command_prototype"); 088 while (typeIt.hasNext()) { 089 prototypes.add(CommandPrototype.loadConfig((Element) typeIt.next())); 090 } 091 } 092 public String getName() { 093 return name; 094 } 095 public String getTip() { 096 return tip; 097 } 098 @Override 099 public String toString() { 100 return getName(); 101 } 102 public Set<CommandPrototype> getPrototypes() { 103 return prototypes; 104 } 105 public boolean isAcceptParameters() { 106 return acceptParameters; 107 } 108 } 109 public static class CommandPrototype implements Comparable<CommandPrototype> { 110 private String name; 111 private String tip; 112 private boolean acceptParameters; 113 private List<String> params = new LinkedList<String>(); 114 public static CommandPrototype loadConfig(Element element) { 115 CommandPrototype cp = new CommandPrototype(); 116 cp.name = element.attributeValue("name"); 117 cp.tip = element.attributeValue("tip"); 118 cp.acceptParameters = Boolean.parseBoolean(element.attributeValue("accept_paramters")); 119 Iterator<Element> it = element.elementIterator("param"); 120 while (it.hasNext()) 121 cp.params.add(it.next().getText()); 122 return cp; 123 } 124 public int compareTo(CommandPrototype other) { 125 if (this == other) 126 return 0; 127 return name.compareTo(other.name); 128 } 129 public String getName() { 130 return name; 131 } 132 public String getTip() { 133 return tip; 134 } 135 @Override 136 public String toString() { 137 return getName(); 138 } 139 public List<String> getParams() { 140 return params; 141 } 142 } 143 public String getEditor() { 144 return editor; 145 } 146 public ProjectNodeType getNodeType() { 147 return nodeType; 148 } 149 public String getTip() { 150 return tip; 151 } 152 }