package advancedsystemsmanager.registry;
import advancedsystemsmanager.client.gui.theme.HexValue;
import advancedsystemsmanager.client.gui.theme.Theme;
import advancedsystemsmanager.client.gui.theme.ThemeAdapters;
import advancedsystemsmanager.client.gui.theme.ThemeCommand;
import advancedsystemsmanager.helpers.FileHelper;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import com.google.gson.stream.JsonReader;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
public class ThemeHandler
{
public static final Gson GSON = getGson();
private static final Pattern JSON = Pattern.compile(".*\\.json", Pattern.CASE_INSENSITIVE);
private static final FileFilter JSON_FILTER = new FileFilter()
{
@Override
public boolean accept(File pathname)
{
return JSON.matcher(pathname.getName()).find();
}
};
public static Theme theme = new Theme();
private final String backupLocation;
private final File themeDir;
private File themeFile;
public ThemeHandler(File directory, String backupLocation)
{
this.themeDir = directory;
this.backupLocation = backupLocation;
}
public boolean setTheme(String name)
{
if (!name.endsWith(".json")) name += ".json";
File theme = new File(themeDir.getAbsoluteFile() + File.separator + name);
if (!theme.isFile())
{
if (FileHelper.doesFileExistInJar(getClass(), backupLocation + name))
{
FileHelper.copyFromJar(getClass(), backupLocation + name, themeDir.getAbsolutePath() + File.separator + name);
} else
{
if (name.equals("default.json"))
{
ThemeHandler.theme = new Theme();
saveTheme(name);
return true;
}
return false;
}
if (!theme.isFile()) return false;
}
this.themeFile = theme;
loadTheme();
return true;
}
public void saveTheme(String name)
{
if (!name.endsWith(".json")) name += ".json";
File theme = new File(themeDir.getAbsoluteFile() + File.separator + name);
if (theme.isFile())
{
//warn user?
}
if (!theme.exists()) try
{
theme.createNewFile();
} catch (IOException ignored)
{
}
try
{
FileWriter fileWriter = new FileWriter(theme);
GSON.toJson(ThemeHandler.theme, Theme.class, fileWriter);
fileWriter.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
public void loadTheme()
{
try
{
JsonReader reader = new JsonReader(new FileReader(this.themeFile));
theme = GSON.fromJson(reader, Theme.class);
reader.close();
} catch (IOException e)
{
//TODO: log?
theme = new Theme();
}
}
public List<String> getThemes()
{
File[] files = themeDir.listFiles(JSON_FILTER);
List<String> result = new ArrayList<String>();
if (files != null)
{
for (File file : files)
{
result.add(file.getName().replace(".json", ""));
}
}
return result;
}
public static Gson getGson()
{
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(HexValue.class, ThemeAdapters.HEX_ADAPTER);
builder.registerTypeAdapter(ThemeCommand.CommandSet.class, ThemeAdapters.COMMAND_ADAPTER);
builder.setPrettyPrinting();
builder.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE_WITH_SPACES);
return builder.create();
}
}