upload tizen1.0 source
[sdk/ide/product.git] / org.eclipse.cdt.ui / src / org / eclipse / cdt / internal / ui / wizards / settingswizards / MacroSettingsProcessor.java
1 /*******************************************************************************
2  * Copyright (c) 2008 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  *     IBM Corporation - initial API and implementation
10  *******************************************************************************/
11 package org.eclipse.cdt.internal.ui.wizards.settingswizards;
12
13
14 import java.util.ArrayList;
15 import java.util.List;
16
17 import org.eclipse.swt.graphics.Image;
18 import org.w3c.dom.Element;
19 import org.w3c.dom.Node;
20 import org.w3c.dom.NodeList;
21 import org.w3c.dom.Text;
22 import org.xml.sax.ContentHandler;
23 import org.xml.sax.SAXException;
24
25 import org.eclipse.cdt.core.settings.model.CMacroEntry;
26 import org.eclipse.cdt.core.settings.model.ICLanguageSetting;
27 import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry;
28 import org.eclipse.cdt.core.settings.model.ICSettingEntry;
29 import org.eclipse.cdt.ui.CDTSharedImages;
30 import org.eclipse.cdt.ui.CUIPlugin;
31
32 /**
33  * A settings processor that imports and exports symbols.
34  * 
35  * @author Mike Kucera
36  * @since 5.1
37  * 
38  */
39 public class MacroSettingsProcessor extends SettingsProcessor {
40
41         public static final String SECTION_NAME = "org.eclipse.cdt.internal.ui.wizards.settingswizards.Macros"; //$NON-NLS-1$
42         
43         private static final String MACRO_ELEMENT = "macro"; //$NON-NLS-1$
44         private static final String NAME_ELEMENT = "name";   //$NON-NLS-1$
45         private static final String VALUE_ELEMENT = "value"; //$NON-NLS-1$
46         
47         
48         public Image getIcon() {
49                 return CUIPlugin.getImageDescriptorRegistry().get(CDTSharedImages.getImageDescriptor(CDTSharedImages.IMG_OBJS_MACRO));
50         }
51
52         public String getDisplayName() {
53                 return Messages.ProjectSettingsWizardPage_Processor_Macros;
54         }
55
56         public String getSectionName() {
57                 return SECTION_NAME;
58         }
59
60         @Override
61         protected int getSettingsType() {
62                 return ICSettingEntry.MACRO;
63         }
64         
65         @Override
66         protected void writeSettings(ContentHandler content, ICLanguageSettingEntry setting) throws SettingsImportExportException {
67                 char[] name = setting.getName().toCharArray();
68                 char[] value = setting.getValue().toCharArray();
69                 
70                 try {
71                         content.startElement(NONE, NONE, MACRO_ELEMENT, null);
72                         newline(content);
73                         
74                         content.startElement(NONE, NONE, NAME_ELEMENT, null);
75                         content.characters(name, 0, name.length);
76                         content.endElement(NONE, NONE, NAME_ELEMENT);
77                         
78                         content.startElement(NONE, NONE, VALUE_ELEMENT, null);
79                         content.characters(value, 0, value.length);
80                         content.endElement(NONE, NONE, VALUE_ELEMENT);
81                         newline(content);
82                         
83                         content.endElement(NONE, NONE, MACRO_ELEMENT);
84                         newline(content);
85                         
86                 } catch(SAXException e) {
87                         throw new SettingsImportExportException(e);
88                 }
89         }
90         
91         
92         @Override
93         protected void readSettings(ICLanguageSetting setting, Element language) throws SettingsImportExportException {
94                 List<ICLanguageSettingEntry> macros = new ArrayList<ICLanguageSettingEntry>();
95                 
96                 List<Element> macrosNodes = XMLUtils.extractChildElements(language, MACRO_ELEMENT);
97                 
98                 for(Element macroElement : macrosNodes) {
99                         String name = null;
100                         String value = null;
101                         
102                         NodeList nodeList = macroElement.getChildNodes();
103                         for(int i = 0; i < nodeList.getLength(); i++) {
104                                 Node node = nodeList.item(i);
105                                 switch(node.getNodeType()) {
106                                 case Node.TEXT_NODE:
107                                         Text text = (Text)node;
108                                         if(XMLUtils.isWhitespace(text.getData()))
109                                                 break;
110                                         throw new SettingsImportExportException("Unknown text: '" + text.getData() + "'"); //$NON-NLS-1$ //$NON-NLS-2$
111                                 case Node.ELEMENT_NODE:
112                                         Element element = (Element)node;
113                                         String tagName = element.getTagName();
114                                         if(name == null && tagName.equals(NAME_ELEMENT))
115                                                 name = element.getTextContent();
116                                         else if(value == null && tagName.equals(VALUE_ELEMENT))
117                                                 value = element.getTextContent();
118                                         else
119                                                 throw new SettingsImportExportException("Unknown or extra tag: " + tagName); //$NON-NLS-1$
120                                         break;
121                                 default:
122                                         throw new SettingsImportExportException("Unknown node: " + node.getNodeName()); //$NON-NLS-1$
123                                 }
124                         }
125                         
126                         if(name == null)
127                                 throw new SettingsImportExportException("There must be one <name> element"); //$NON-NLS-1$
128                         if(value == null)
129                                 throw new SettingsImportExportException("There must be one <value> element"); //$NON-NLS-1$
130                         
131                         macros.add(new CMacroEntry(name, value, 0));
132                 }
133                 
134                 if(macros.isEmpty())
135                         return;
136                 
137                 // need to do this or existing settings will disappear
138                 macros.addAll(setting.getSettingEntriesList(ICLanguageSettingEntry.MACRO));
139                 setting.setSettingEntries(ICSettingEntry.MACRO, macros);
140         }
141         
142 }