#ifndef __TEMPLATEPIXMAP_H
#define __TEMPLATEPIXMAP_H

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <sstream>

#include "globals.h"
#include "templateloopfunction.h"

using namespace std;

// --- cTemplatePixmap -------------------------------------------------------------

class cTemplatePixmap {
protected:
    bool scrolling;
    bool background;
    cTemplateFunction *parameters;
    vector<cTemplateFunction*> functions;
    vector<cTemplateFunction*>::iterator funcIt;
    int containerX;
    int containerY;
    int containerWidth;
    int containerHeight;
    cGlobals *globals;
    //functions replacing {width(label)} and {height(label)} tokens
    bool ReplaceWidthFunctions(void);
    bool ReplaceHeightFunctions(void);
    //functions replacing {posx(label)} and {posy(label)} tokens
    bool ReplacePosXFunctions(void);
    bool ReplacePosYFunctions(void);
    //Get Scrolling Function
    cTemplateFunction *GetScrollFunction(void);
public:
    cTemplatePixmap(void);
    virtual ~cTemplatePixmap(void);
    //Setter Functions
    void SetScrolling(void) { scrolling = true; };
    void SetParameters(vector<pair<string, string> > &params);
    void SetWidth(int width);
    void SetHeight(int height);
    void SetX(int x);
    void SetY(int y);
    void SetWidthPercent(double width);
    void SetHeightPercent(double height);
    void SetXPercent(double x);
    void SetYPercent(double y);
    void SetContainer(int x, int y, int w, int h);
    void SetGlobals(cGlobals *globals) { this->globals = globals; };
    void AddFunction(string name, vector<pair<string, string> > &params);
    void AddLoopFunction(cTemplateLoopFunction *lf);
    //PreCache Parameters
    bool CalculateParameters(void);
    //clear dynamically set function parameters
    void ClearDynamicFunctionParameters(void);
    //Clear dynamically set pixmap parameters
    void ClearDynamicParameters(void);
    //Parse pixmap parameters with dynamically set Tokens
    void ParseDynamicParameters(map <string,int> *intTokens, bool initFuncs);
    //Parse all function parameters with dynamically set Tokens
    void ParseDynamicFunctionParameters(map <string,string> *stringTokens, map <string,int> *intTokens);
    //Calculate size of drawport in case area scrolls
    bool CalculateDrawPortSize(cSize &size, map < string, vector< map< string, string > > > *loopTokens = NULL);
    //Set max width for text in scrollarea
    void SetScrollingTextWidth(void);
    //Getter Functions
    cRect GetPixmapSize(void);
    int GetNumericParameter(eParamType type);
    bool Scrolling(void) { return scrolling; };
    bool DoExecute(void) { return parameters->DoExecute(); };
    bool DoDebug(void) { return parameters->DoDebug(); };
    bool Ready(void);
    bool BackgroundArea(void) { return background; };
    //Traverse Functions
    void InitIterator(void);
    cTemplateFunction *GetNextFunction(void);
    //Debug
    void Debug(void);
};

#endif //__TEMPLATEPIXMAP_H