package net.jeeeyul.eclipse.themes.ui.preference.preset.internal; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import net.jeeeyul.eclipse.themes.JThemesCore; import net.jeeeyul.eclipse.themes.ui.preference.preset.IJTPreset; import net.jeeeyul.eclipse.themes.ui.preference.preset.IJTPresetCategory; import net.jeeeyul.eclipse.themes.ui.preference.preset.IJTPresetManager; import net.jeeeyul.eclipse.themes.ui.preference.preset.IJTPresetManagerListener; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Platform; @SuppressWarnings("javadoc") public class JTPresetManager implements IJTPresetManager { private HashSet<IJTPresetManagerListener> listeners = new HashSet<IJTPresetManagerListener>(); private Map<String, IJTPresetCategory> categories; private IJTPresetCategory defaultCategory; private IJTPresetCategory userCategory; private boolean isLoaded = false; private boolean needToLoadUserCategory = true; public JTPresetManager() { categories = new HashMap<String, IJTPresetCategory>(); defaultCategory = new PresetCategoryImpl("Default Presets", IJTPresetCategory.DEFAULT_CATEGORY_ID); userCategory = new PresetCategoryImpl("User Presets", IJTPresetCategory.USER_CATEGORY_ID); categories.put(defaultCategory.getID(), defaultCategory); categories.put(userCategory.getID(), userCategory); } public void addListener(IJTPresetManagerListener listener) { listeners.add(listener); } public IJTPresetCategory getDefaultCategory() { if (!isLoaded) { loadPresetExtensions(); } return defaultCategory; } public IJTPreset getDefaultPreset() { if (!isLoaded) { loadPresetExtensions(); } for (IJTPreset each : getDefaultCategory().getPresets()) { if (DEFAULT_PRESET_ID.equals(each.getId())) { return each; } } return null; } private Comparator<IJTPreset> getPresetComparator() { return new Comparator<IJTPreset>() { @Override public int compare(IJTPreset o1, IJTPreset o2) { return o1.getName().toLowerCase().compareTo(o2.getName().toLowerCase()); } }; } public IJTPresetCategory getUserCategory() { if (needToLoadUserCategory) { loadUserPresets(); } return userCategory; } /* * (non-Javadoc) * * @see net.jeeeyul.eclipse.themes.ui.preference.preset.IJTPresetManager# * getUserPresetFolder() */ @Override public File getUserPresetFolder() { IPath path = JThemesCore.getDefault().getStateLocation(); File stateFolder = path.toFile(); File presetFolder = new File(stateFolder, "user-presets"); if (presetFolder.exists() && !presetFolder.isDirectory()) { presetFolder.delete(); } if (!presetFolder.exists()) { presetFolder.mkdir(); } return presetFolder; } @Override public void invalidateUserPreset() { if (userCategory.getPresets() != null) { userCategory.getPresets().clear(); needToLoadUserCategory = true; } for (IJTPresetManagerListener each : listeners) { try { each.userPresetModified(); } catch (Exception e) { e.printStackTrace(); } } } private void loadPresetExtensions() { if (isLoaded) { return; } IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(ContributedPreset.EXTENSION_POINT); IConfigurationElement[] elements = extensionPoint.getConfigurationElements(); for (IConfigurationElement each : elements) { if (each.getName().equals(PresetCategoryImpl.ELEMENT_PRESET_CATEGORY)) { PresetCategoryImpl category = new PresetCategoryImpl(each); categories.put(category.getID(), category); } } for (IConfigurationElement each : elements) { if (each.getName().equals(ContributedPreset.ELEMENT_PRESET)) { ContributedPreset preset = new ContributedPreset(each); IJTPresetCategory category = categories.get(preset.getCategoryID()); category.getPresets().add(preset); } } isLoaded = true; for (IJTPresetCategory eachCategory : categories.values()) { Collections.sort(eachCategory.getPresets(), getPresetComparator()); } IJTPreset defaultPreset = getDefaultPreset(); if (defaultPreset != null) { defaultCategory.getPresets().remove(defaultPreset); defaultCategory.getPresets().add(0, defaultPreset); } } public IJTPresetCategory getCategory(String id) { if (id.equals(IJTPresetCategory.USER_CATEGORY_ID)) { return getUserCategory(); } if (!isLoaded) { loadPresetExtensions(); } return categories.get(id); } private void loadUserPresets() { File[] files = getUserPresetFolder().listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String filename) { return filename.endsWith(".epf"); } }); for (File each : files) { try { userCategory.getPresets().add(new UserPreset(each)); } catch (IOException e) { e.printStackTrace(); } } Collections.sort(userCategory.getPresets(), getPresetComparator()); needToLoadUserCategory = false; } public void removeListener(IJTPresetManagerListener listener) { listeners.remove(listener); } @Override public IJTPresetCategory[] getCategories() { if (!isLoaded) { loadPresetExtensions(); } if (needToLoadUserCategory) { loadUserPresets(); } ArrayList<IJTPresetCategory> values = new ArrayList<IJTPresetCategory>(categories.values()); Collections.sort(values, new Comparator<IJTPresetCategory>() { @Override public int compare(IJTPresetCategory o1, IJTPresetCategory o2) { return o1.getName().compareTo(o2.getName()); } }); values.remove(userCategory); values.remove(defaultCategory); values.add(0, defaultCategory); values.add(0, userCategory); IJTPresetCategory[] result = values.toArray(new IJTPresetCategory[categories.size()]); return result; } }