package de.mprengemann.intellij.plugin.androidicons.controllers.settings; import com.intellij.ide.util.PropertiesComponent; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.StreamUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.util.Base64; import de.mprengemann.intellij.plugin.androidicons.images.ResizeAlgorithm; import de.mprengemann.intellij.plugin.androidicons.model.Format; import de.mprengemann.intellij.plugin.androidicons.model.ImageAsset; import de.mprengemann.intellij.plugin.androidicons.model.Resolution; import de.mprengemann.intellij.plugin.androidicons.util.TextUtils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class SettingsController implements ISettingsController { private static final String RES_ROOT = "resourcesRoot"; private static final String LAST_FOLDER_ROOT = "lastFolderRoot"; private static final String RESOLUTIONS = "resolutions"; private static final String SOURCE_RESOLUTION = "sourceResolution"; private static final String ALGORITHM = "algorithm"; private static final String METHOD = "method"; private static final String COLOR = "color"; private static final String SIZE = "size"; private static final String ASSET = "asset"; private static final String FORMAT = "format"; private Set<SettingsObserver> observerSet; private Project project; public SettingsController() { observerSet = new HashSet<SettingsObserver>(); } @Override public void addObserver(SettingsObserver observer) { observerSet.add(observer); } @Override public void removeObserver(SettingsObserver observer) { observerSet.remove(observer); } @Override public void saveResRootForProject(String fileUrl) { PropertiesComponent propertiesComponent = PropertiesComponent.getInstance(project); propertiesComponent.setValue(RES_ROOT, fileUrl); } @Override public VirtualFile getResourceRoot() { String persistedFile = getResourceRootPath(); if (persistedFile != null) { return VirtualFileManager.getInstance().findFileByUrl(persistedFile); } else { return null; } } @Override public String getResourceRootPath() { PropertiesComponent propertiesComponent = PropertiesComponent.getInstance(project); return propertiesComponent.getValue(RES_ROOT); } @Override public String getLastImageFolder() { PropertiesComponent propertiesComponent = PropertiesComponent.getInstance(project); return propertiesComponent.getValue(LAST_FOLDER_ROOT); } @Override public void saveLastImageFolder(String fileUrl) { PropertiesComponent propertiesComponent = PropertiesComponent.getInstance(project); propertiesComponent.setValue(LAST_FOLDER_ROOT, fileUrl); } @Override public void setProject(Project project) { this.project = project; } @Override public void saveResolutions(Set<Resolution> resolutions) { String[] tmp = new String[resolutions.size()]; int i=0; for (Iterator<Resolution> iterator = resolutions.iterator(); iterator.hasNext(); i++) { Resolution resolution = iterator.next(); tmp[i] = resolution.toString(); } PropertiesComponent propertiesComponent = PropertiesComponent.getInstance(project); propertiesComponent.setValues(RESOLUTIONS, tmp); } @Override public Set<Resolution> getResolutions(Set<Resolution> defaultResolutions) { PropertiesComponent propertiesComponent = PropertiesComponent.getInstance(project); String[] values = propertiesComponent.getValues(RESOLUTIONS); if (values == null) { return defaultResolutions; } Set<Resolution> resolutions = new HashSet<Resolution>(); for (String value : values) { if (TextUtils.isEmpty(value)) { return defaultResolutions; } final Resolution resolution = Resolution.from(value); if (resolution == null) { return defaultResolutions; } resolutions.add(resolution); } return resolutions; } @Override public void saveSourceResolution(Resolution sourceResolution) { updateOrDelete(SOURCE_RESOLUTION, sourceResolution); } @Override public Resolution getSourceResolution(Resolution defaultResolution) { return Resolution.from(getOrDefault(SOURCE_RESOLUTION, defaultResolution.toString())); } @Override public void saveAlgorithm(ResizeAlgorithm algorithm) { updateOrDelete(ALGORITHM, algorithm); } @Override public ResizeAlgorithm getAlgorithm(ResizeAlgorithm defaultAlgorithm) { return ResizeAlgorithm.from(getOrDefault(ALGORITHM, defaultAlgorithm.toString())); } @Override public void saveMethod(String method) { updateOrDelete(METHOD, method); } @Override public String getMethod(String defaultMethod) { return getOrDefault(METHOD, defaultMethod); } @Override public void saveColor(String color) { updateOrDelete(COLOR, color); } @Override public String getColor() { return getOrDefault(COLOR, null); } @Override public void saveSize(String size) { updateOrDelete(SIZE, size); } @Override public String getSize() { return getOrDefault(SIZE, null); } @Override public void saveImageAsset(ImageAsset imageAsset) { PropertiesComponent propertiesComponent = PropertiesComponent.getInstance(project); if (imageAsset == null) { propertiesComponent.unsetValue(ASSET); return; } String serializedImageAsset = null; ByteArrayOutputStream bo = null; ObjectOutputStream so = null; try { bo = new ByteArrayOutputStream(); so = new ObjectOutputStream(bo); so.writeObject(imageAsset); so.flush(); serializedImageAsset = Base64.encode(bo.toByteArray()); } catch (IOException e) { e.printStackTrace(); } finally { StreamUtil.closeStream(so); StreamUtil.closeStream(bo); } if (serializedImageAsset == null) { propertiesComponent.unsetValue(ASSET); return; } propertiesComponent.setValue(ASSET, serializedImageAsset); } @Override public ImageAsset getImageAsset() { final String serializedImageAsset = getOrDefault(ASSET, null); if (serializedImageAsset == null) { return null; } ByteArrayInputStream bi = null; ObjectInputStream si = null; try { byte b[] = Base64.decode(serializedImageAsset); bi = new ByteArrayInputStream(b); si = new ObjectInputStream(bi); return (ImageAsset) si.readObject(); } catch (Exception e) { e.printStackTrace(); } finally { StreamUtil.closeStream(si); StreamUtil.closeStream(bi); } return null; } @Override public void saveFormat(Format format) { updateOrDelete(FORMAT, format); } @Override public Format getFormat(Format defaultFormat) { return Format.from(getOrDefault(FORMAT, defaultFormat.toString())); } private String getOrDefault(String key, String defaultValue) { PropertiesComponent propertiesComponent = PropertiesComponent.getInstance(project); if (!propertiesComponent.isValueSet(key)) { return defaultValue; } return propertiesComponent.getValue(key); } private void updateOrDelete(String key, Object value) { PropertiesComponent propertiesComponent = PropertiesComponent.getInstance(project); if (value != null) { propertiesComponent.setValue(key, value.toString()); } else { propertiesComponent.unsetValue(key); } } @Override public void tearDown() { project = null; observerSet.clear(); observerSet = null; } }