net.zorgblub.typhon.dto.PageOffsets.java Source code

Java tutorial

Introduction

Here is the source code for net.zorgblub.typhon.dto.PageOffsets.java

Source

/*
 * 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.zorgblub.typhon.dto;

import net.zorgblub.typhon.Configuration;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

/**
 * 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 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;
    }

}