/*
* Copyright (C) 2012 Alex Kuiper
*
* This file is part of PageTurner
*
* PageTurner is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PageTurner is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PageTurner. If not, see <http://www.gnu.org/licenses/>.*
*/
package net.nightwhistler.pageturner.dto;
import jedi.option.Option;
import net.nightwhistler.pageturner.Configuration;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import static jedi.option.Options.none;
import static jedi.option.Options.option;
/**
* This class allows page-offsets to be read from and stored as JSON.
*
* Page-offsets are only valid under the circumstances they were
* calculated with: if text-size, page-margins, etc. change, they
* must be re-calculated. This class allows checks for this.
*
* @author Alex Kuiper
*
*/
public class PageOffsets {
public static int ALGORITHM_VERSION = 3;
private int fontSize;
private String fontFamily;
private int vMargin;
private int hMargin;
private int lineSpacing;
private boolean fullScreen;
private boolean allowStyling;
private int algorithmVersion;
private List<List<Integer>> offsets;
private static enum Fields { fontSize, fontFamily, vMargin, hMargin, lineSpacing, fullScreen, offsets,
allowStyling, algorithmVersion };
private PageOffsets() {}
public boolean isValid( Configuration config ) {
return
this.fontFamily.equals( config.getDefaultFontFamily().getName() )
&& this.fontSize == config.getTextSize()
&& this.vMargin == config.getVerticalMargin()
&& this.hMargin == config.getHorizontalMargin()
&& this.lineSpacing == config.getLineSpacing()
&& this.fullScreen == config.isFullScreenEnabled()
&& this.allowStyling == config.isAllowStyling()
&& this.algorithmVersion == ALGORITHM_VERSION;
}
public List<List<Integer>> getOffsets() {
return offsets;
}
public static PageOffsets fromValues( Configuration config, List<List<Integer>> offsets ) {
PageOffsets result = new PageOffsets();
result.fontFamily = config.getDefaultFontFamily().getName();
result.fontSize = config.getTextSize();
result.hMargin = config.getHorizontalMargin();
result.vMargin = config.getVerticalMargin();
result.lineSpacing = config.getLineSpacing();
result.fullScreen = config.isFullScreenEnabled();
result.allowStyling = config.isAllowStyling();
result.algorithmVersion = ALGORITHM_VERSION;
result.offsets = offsets;
return result;
}
public static PageOffsets fromJSON( String json ) throws JSONException {
JSONObject offsetsObject = new JSONObject( json );
PageOffsets result = new PageOffsets();
result.fontFamily = offsetsObject.getString(Fields.fontFamily.name());
result.fontSize = offsetsObject.getInt(Fields.fontSize.name());
result.vMargin = offsetsObject.getInt(Fields.vMargin.name());
result.hMargin = offsetsObject.getInt(Fields.hMargin.name());
result.lineSpacing = offsetsObject.getInt(Fields.lineSpacing.name());
result.fullScreen = offsetsObject.getBoolean(Fields.fullScreen.name() );
result.algorithmVersion = offsetsObject.optInt(Fields.algorithmVersion.name(), -1);
result.allowStyling = offsetsObject.optBoolean(Fields.allowStyling.name(), true);
result.offsets = readOffsets(offsetsObject.getJSONArray(Fields.offsets.name()));
return result;
}
public String toJSON() throws JSONException {
JSONObject jsonObject = new JSONObject();
jsonObject.put(Fields.fontFamily.name(), this.fontFamily );
jsonObject.put(Fields.fontSize.name(), this.fontSize );
jsonObject.put(Fields.vMargin.name(), this.vMargin );
jsonObject.put(Fields.hMargin.name(), this.hMargin );
jsonObject.put(Fields.lineSpacing.name(), this.lineSpacing );
jsonObject.put(Fields.fullScreen.name(), this.fullScreen );
jsonObject.put(Fields.allowStyling.name(), this.allowStyling );
jsonObject.put(Fields.algorithmVersion.name(), this.algorithmVersion );
jsonObject.put(Fields.offsets.name(), new JSONArray( this.offsets ) );
return jsonObject.toString();
}
private static List<List<Integer>> readOffsets( JSONArray jsonArray ) throws JSONException {
List<List<Integer>> result = new ArrayList<List<Integer>>();
for (int i = 0; i < jsonArray.length(); i++) {
List<Integer> sublist = new ArrayList<>();
JSONArray subArray = new JSONArray(jsonArray.getString(i));
for (int j = 0; j < subArray.length(); j++) {
int val = subArray.getInt(j);
sublist.add(val);
}
result.add(sublist);
}
return result;
}
}