// GraphTea Project: http://github.com/graphtheorysoftware/GraphTea
// Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com
// Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology
// Distributed under the terms of the GNU General Public License (GPL): http://www.gnu.org/licenses/
package graphtea.graph.old;

import graphtea.platform.StaticUtils;
import graphtea.platform.lang.FromStringProvider;

import java.awt.*;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import static java.awt.BasicStroke.CAP_BUTT;
import static java.awt.BasicStroke.JOIN_MITER;

/**
 * User: root
 */
public class GStroke implements Serializable,  FromStringProvider<GStroke> {
    static {
        StaticUtils.setFromStringProvider(GStroke.class.getName(), new GStroke());
    }

    private static final
    long serialVersionUID = 1699990527314740484L;
    static List<GStroke> strokes = new ArrayList<>();
    public static GStroke empty = new GStroke("Empty", 0, new float[]{0, 100000000f});
    public static GStroke simple = new GStroke("simple", 1, new float[]{1, 0});
    public static GStroke solid = new GStroke("solid", new float[]{1, 0});
    public static GStroke strong = new GStroke("strong", 3, new float[]{1, 0});
    public static GStroke dashed = new GStroke("dashed", new float[]{6, 2});
    public static GStroke dotted = new GStroke("dotted", new float[]{2, 4});
    public static GStroke dashed_dotted = new GStroke("dashed-dotted", new float[]{6, 2, 2, 6});
    public static GStroke dashed_dotted_dotted = new GStroke("dashed-dotted-dotted", new float[]{6, 2, 2, 6, 2, 6});
    public static GStroke dashed_dashed_dotted = new GStroke("dashed-dashed-dotted", 3, new float[]{6, 2, 6, 2, 2, 4});

    public String name;
    public BasicStroke stroke;
    int w = 2;
    public static final String STROKE = "stroke";

    public GStroke(String name, float[] dashInfo) {
        init(name, w, dashInfo);
    }

    public GStroke(String name, int w, float[] dashInfo) {
        init(name, w, dashInfo);
    }

    private void init(String name, int w, float[] dashInfo) {
        this.name = name;
        this.stroke = new BasicStroke(w, CAP_BUTT, JOIN_MITER, 1, dashInfo, 2);
        if (name.equals("solid") || name.equals("simple"))
            stroke = new BasicStroke(w);
        strokes.add(this);
    }

    public GStroke() {
    }

    public GStroke fromString(String data) {
        for (GStroke stroke : strokes)
            if (stroke.name.equals(data)) {
                return stroke;
            }
        return null;
    }

    public String toString() {
        return name;
    }

    private void writeObject(java.io.ObjectOutputStream stream)
            throws IOException {
        stream.writeObject(name);
    }

    private void readObject(java.io.ObjectInputStream stream)
            throws IOException, ClassNotFoundException {
        name = (String) stream.readObject();
        GStroke target = fromString(name);
        stroke = target.stroke;
        w = target.w;
    }
}