GoogleChart.

Dependents:   GoogleChart_TestProgram

GoogleChart.cpp

Committer:
shintamainjp
Date:
2010-08-17
Revision:
0:ded8a44ff71f

File content as of revision 0:ded8a44ff71f:

/**
 * GoogleChart API interface driver. (Version 0.0.1)
 *
 * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
 * http://shinta.main.jp/
 */

#include "GoogleChart.h"

const std::string GoogleChart::baseURL = "http://chart.apis.google.com/chart";

GoogleChart::GoogleChart() : title(""), width(300), height(225) {
    for (int i = 0; i < MAX_AXIS; i++) {
        axislist[i] = 0;
    }
    for (int i = 0; i < MAX_DATA; i++) {
        datalist[i] = 0;
    }
}

GoogleChart::~GoogleChart() {}

int GoogleChart::addNewAxis(Axis::Type type) {
    /*
     * Search maximum number of axis.
     */
    int max = 0;
    for (int i = 0; i < MAX_AXIS; i++) {
        if (0 != axislist[i]) {
            if (axislist[i]->getNumber() > max) {
                max = axislist[i]->getNumber();
            }
        }
    }

    /*
     * Create a new axis.
     */
    for (int i = 0; i < MAX_AXIS; i++) {
        if (0 == axislist[i]) {
            axislist[i] = new Axis(max + 1, type);
            return max + 1;
        }
    }
    return -1;
}

int GoogleChart::setAxisType(const int number, Axis::Type type) {
    for (int i = 0; i < MAX_AXIS; i++) {
        if (0 != axislist[i]) {
            if (axislist[i]->getNumber() == number) {
                axislist[i]->setType(type);
                return number;
            }
        }
    }
    return -1;
}

int GoogleChart::setAxisRange(const int number, int rangeStart, int rangeEnd) {
    for (int i = 0; i < MAX_AXIS; i++) {
        if (0 != axislist[i]) {
            if (axislist[i]->getNumber() == number) {
                axislist[i]->setRangeStart(rangeStart);
                axislist[i]->setRangeEnd(rangeEnd);
                return number;
            }
        }
    }
    return -1;
}

int GoogleChart::removeAxis(const int number) {
    for (int i = 0; i < MAX_AXIS; i++) {
        if (0 != axislist[i]) {
            if (axislist[i]->getNumber() == number) {
                delete axislist[i];
                axislist[i] = 0;
                return number;
            }
        }
    }
    return -1;
}

int GoogleChart::addNewDataSet(std::string label, const int size) {
    /*
     * Search maximum number of data set.
     */
    int max = 0;
    for (int i = 0; i < MAX_DATA; i++) {
        if (0 != datalist[i]) {
            if (datalist[i]->getNumber() > max) {
                max = datalist[i]->getNumber();
            }
        }
    }

    /*
     * Create a new data set.
     */
    for (int i = 0; i < MAX_DATA; i++) {
        if (0 == datalist[i]) {
            datalist[i] = new DataSet(label, max + 1, size);
            return max + 1;
        }
    }
    return -1;
}

int GoogleChart::removeDataSet(const int number) {
    for (int i = 0; i < MAX_DATA; i++) {
        if (0 != datalist[i]) {
            if (datalist[i]->getNumber() == number) {
                delete datalist[i];
                datalist[i] = 0;
                return number;
            }
        }
    }
    return -1;
}

int GoogleChart::addData(const int number, double data) {
    for (int i = 0; i < MAX_DATA; i++) {
        if (0 != datalist[i]) {
            if (datalist[i]->getNumber() == number) {
                datalist[i]->addData(data);
                return i;
            }
        }
    }
    return -1;
}

int GoogleChart::clearAllData(const int number) {
    for (int i = 0; i < MAX_DATA; i++) {
        if (0 != datalist[i]) {
            if (datalist[i]->getNumber() == number) {
                datalist[i]->clearAllData();
                return i;
            }
        }
    }
    return -1;
}

    int GoogleChart::setDataScale(const int number, int min, int max) {
    for (int i = 0; i < MAX_DATA; i++) {
        if (0 != datalist[i]) {
            if (datalist[i]->getNumber() == number) {
                datalist[i]->setScale(min, max);
                return i;
            }
        }
    }
    return -1;
    }

void GoogleChart::setTitle(std::string title) {
    GoogleChart::title = title;
}

std::string GoogleChart::getTitle() const {
    return title;
}

void GoogleChart::setWidth(int width) {
    GoogleChart::width = width;
}

int GoogleChart::getWidth() const {
    return width;
}

void GoogleChart::setHeight(int height) {
    GoogleChart::height = height;
}

int GoogleChart::getHeight() const {
    return height;
}

std::string GoogleChart::toURL(std::string text) {
    static const char *unsafe_characters = " \"<>#%{}|\\^~[]`";
    std::string s = "";
    for (int i = 0; i < text.length(); i++) {
        char c = text.at(i);
        if (strchr(unsafe_characters, c) == NULL) {
            s = s + c;
        } else {
            char buf[8];
            snprintf(buf, sizeof(buf), "%%%02X", c & 0xff);
            s = s + std::string(buf);
        }
    }
    return s;
}

std::string GoogleChart::paramChartType(ChartType chartType) {
    /*
     * Chart Type.
     */
    std::string s = "cht=";
    switch (chartType) {
        case LineChart:
            s = s + "lc";
            break;
        default:
            s = s + "unknown";
            break;
    }
    return s;
}

std::string GoogleChart::paramAxis(Axis **list, int size) {

    char buf[64];
    /*
     * Axis type and range.
     */
    int cnt = 0;
    std::string sType = "chxt=";
    std::string sRange = "chxr=";
    for (int i = 0; i < size; i++) {
        Axis *p = list[i];
        if (0 != p) {
            /*
             * Type.
             */
            if (0 < cnt) {
                sType = sType + ",";
            }
            switch (p->getType()) {
                case Axis::Bottom:
                    sType = sType + "x";
                    break;
                case Axis::Left:
                    sType = sType + "y";
                    break;
                case Axis::Right:
                    sType = sType + "r";
                    break;
                case Axis::Top:
                    sType = sType + "t";
                    break;
                default:
                    sType = sType + "?";
                    break;
            }
            /*
             * Range.
             */
            if (0 < cnt) {
                sRange = sRange + "|";
            }
            snprintf(buf, sizeof(buf), "%d,%d,%d", cnt, p->getRangeStart(), p->getRangeEnd());
            sRange = sRange + std::string(buf);
            /*
             * Next.
             */
            cnt++;
        }
    }

    return sRange + "&" + sType;
}

std::string GoogleChart::paramDataSet(DataSet **list, int size) {
    char buf[64];
    int cnt = 0;
    std::string sData = "chd=t:";
    std::string sScale = "chds=";
    std::string sLabel = "chdl=";
    for (int i = 0; i < size; i++) {
        DataSet *p = list[i];
        if (0 != p) {
            /*
             * Data.
             */
            if (0 < cnt) {
                sData = sData + "|";
            }
            for (int i = 0; i < p->getDataCount(); i++) {
                double d = p->getData(i);
                snprintf(buf, sizeof(buf), "%.3f", d);
                if (0 < i) {
                    sData = sData + ",";
                }
                sData = sData + std::string(buf);
            }
            /*
             * Range.
             */
            if (0 < cnt) {
                sScale = sScale + ",";
            }
            snprintf(buf, sizeof(buf), "%.3f,%.3f", p->getMin(), p->getMax());
            sScale = sScale + std::string(buf);
            /*
             * Label.
             */
            if (0 < cnt) {
                sLabel = sLabel + "|";
            }
            sLabel = sLabel + p->getLabel();
            /*
             * Next.
             */
            cnt++;
        }
    }

    return sScale + "&" + sData + "&" + sLabel;
}

std::string GoogleChart::paramTitle(std::string title, int color, double fontSize) {
    char buf[64];
    std::string s = "";
    /*
     * Chart Title Text.
     */
    s = s + "chtt=" + title;
    /*
     * Chart Title Specification.
     */
    snprintf(buf, sizeof(buf), "&chts=%06X,%.1f", color, fontSize);
    s = s + std::string(buf);
    return s;
}

std::string GoogleChart::paramSize(int width, int height) {
    char buf[64];
    /*
     * Chart Size.
     */
    snprintf(buf, sizeof(buf), "chs=%dx%d", width, height);
    return std::string(buf);
}