package org.xmind.ui.internal.views;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.osgi.framework.Bundle;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xmind.core.style.IStyle;
import org.xmind.core.style.IStyleSheet;
import org.xmind.ui.internal.MindMapMessages;
import org.xmind.ui.mindmap.IResourceManager;
import org.xmind.ui.mindmap.MindMapUI;
import org.xmind.ui.util.Logger;
import org.xml.sax.SAXException;
public class ThemeGroupCore {
private ThemeGroupCore() {
};
private static ThemeGroupCore instance = null;
public class CategorizedThemeGroup {
List<IStyle> items = new ArrayList<IStyle>();
private String name;
private String id;
public CategorizedThemeGroup(String id, String name,
List<IStyle> items) {
this.id = id;
this.name = name;
this.items = items;
}
public String getName() {
return name;
}
public List<IStyle> getItems() {
// List<IStyle> list = new ArrayList<IStyle>(items);
// for (IStyle style : items) {
// if (!this.equals(defaultThemeGroup)
// && style.getId().equals(getDefaultThemeId())) {
//// list.remove(style);
// return list;
// }
// }
return items;
}
public String getId() {
return id;
}
public int hashCode() {
return id.hashCode();
}
public boolean equals(Object obj) {
if (obj == this)
return true;
if (obj == null || !(obj instanceof CategorizedThemeGroup))
return false;
if (((CategorizedThemeGroup) obj).id.equals(this.id))
return true;
return false;
}
}
private static final String GROUP_ID = "id"; //$NON-NLS-1$
private static final String GROUP_NAME = "name"; //$NON-NLS-1$
private static final String THEME_ID = "id"; //$NON-NLS-1$
private static final String THEME_GROUP = "theme-group"; //$NON-NLS-1$
private static final String THEME_ELEMENT = "theme"; //$NON-NLS-1$
private static final String DEFAULT_GROUP_ID = "default"; //$NON-NLS-1$
private static final String USER_GROUP_ID = "user";//$NON-NLS-1$
private static final String PATH_STYLES = "styles/"; //$NON-NLS-1$
private static final String THEME_GROUP_XML = "themeGroups.xml"; //$NON-NLS-1$
private static final String THEME_PROPERTIES = "themeGroups.properties"; //$NON-NLS-1$
private List<CategorizedThemeGroup> systemGroups = null;
private Properties properties = null;
private CategorizedThemeGroup defaultThemeGroup = null;
public List<CategorizedThemeGroup> getThemeGroups() {
ArrayList<CategorizedThemeGroup> list = new ArrayList<CategorizedThemeGroup>();
list.add(getDefaultGroup());
list.addAll(getSystemGroups());
CategorizedThemeGroup group = getUserGroup();
if (group.getItems() != null && !group.getItems().isEmpty())
list.add(group);
return list;
}
private CategorizedThemeGroup getUserGroup() {
IResourceManager rm = MindMapUI.getResourceManager();
Set<IStyle> userThemeSets = rm.getUserThemeSheet()
.getStyles(IStyleSheet.MASTER_STYLES);
List<IStyle> userThemeList = new ArrayList<IStyle>();
Iterator<IStyle> iterUserTheme = userThemeSets.iterator();
while (iterUserTheme.hasNext()) {
IStyle userStyle = iterUserTheme.next();
// if (!userStyle.getId().equals(getDefaultThemeId())) {
userThemeList.add(userStyle);
// }
}
CategorizedThemeGroup userGroup = new CategorizedThemeGroup(
USER_GROUP_ID, MindMapMessages.ThemeGroupCore_UserGroup_name,
userThemeList);
return userGroup;
}
private List<CategorizedThemeGroup> getSystemGroups() {
if (systemGroups == null)
systemGroups = createSystemGroups();
return systemGroups;
}
private List<CategorizedThemeGroup> createSystemGroups() {
IResourceManager rm = MindMapUI.getResourceManager();
Set<IStyle> systemThemeSets = rm.getSystemThemeSheet()
.getStyles(IStyleSheet.MASTER_STYLES);
Bundle bundle = Platform.getBundle(MindMapUI.PLUGIN_ID);
String path = PATH_STYLES + THEME_GROUP_XML;
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
.newInstance();
DocumentBuilder documentBuilder = null;
List<CategorizedThemeGroup> systemGroups = new ArrayList<CategorizedThemeGroup>();
try {
documentBuilder = documentBuilderFactory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
try {
URL url = FileLocator.find(bundle, new Path(path), null);
Document doc = documentBuilder.parse(url.openStream());
NodeList nodeList = doc.getElementsByTagName(THEME_GROUP);
for (int i = 0; i < nodeList.getLength(); i++) {
Element ele = (Element) nodeList.item(i);
String groupId = ele.getAttribute(GROUP_ID);
String groupName = ele.getAttribute(GROUP_NAME).substring(1);
groupName = getProperties().getProperty(groupName);
NodeList themeList = ele.getElementsByTagName(THEME_ELEMENT);
List<IStyle> themeGroupList = new ArrayList<IStyle>();
for (int j = 0; j < themeList.getLength(); j++) {
Element theme = (Element) themeList.item(j);
String themeId = theme.getAttribute(THEME_ID);
Iterator<IStyle> iterSystemTheme = systemThemeSets
.iterator();
while (iterSystemTheme.hasNext()) {
IStyle themeStyle = iterSystemTheme.next();
if (themeId.equals(themeStyle.getId())) {
themeGroupList.add(themeStyle);
systemThemeSets.remove(themeStyle);
break;
}
}
}
CategorizedThemeGroup themeGroup = new CategorizedThemeGroup(
groupId, groupName, themeGroupList);
systemGroups.add(themeGroup);
}
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return systemGroups;
}
private CategorizedThemeGroup getDefaultGroup() {
IResourceManager rm = MindMapUI.getResourceManager();
IStyle defaultTheme = rm.getDefaultTheme();
List<IStyle> defaultThemeList = new ArrayList<IStyle>();
defaultThemeList.add(defaultTheme);
defaultThemeGroup = new CategorizedThemeGroup(DEFAULT_GROUP_ID,
MindMapMessages.ThemeGroupCore_DefaultGroup_name,
defaultThemeList);
return defaultThemeGroup;
}
public Properties getProperties() {
if (properties == null) {
properties = loadProperties();
}
return properties;
}
private Properties loadProperties() {
Bundle bundle = Platform.getBundle(MindMapUI.PLUGIN_ID);
URL propertiesUrl = FileLocator.find(bundle,
new Path(PATH_STYLES + THEME_PROPERTIES), null);
Properties properties = new Properties();
InputStream stream = null;
try {
stream = propertiesUrl.openStream();
properties.load(stream);
} catch (IOException e) {
Logger.log(e, "Failed to load default properties file from: " //$NON-NLS-1$
+ THEME_PROPERTIES);
} finally {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return properties;
}
public static ThemeGroupCore getInstance() {
if (instance == null) {
instance = new ThemeGroupCore();
}
return instance;
}
}